Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

multi: Add getaddrv2 and addrv2. #2627

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 18 additions & 2 deletions addrmgr/addrmanager.go
Original file line number Diff line number Diff line change
Expand Up @@ -770,6 +770,17 @@ func ParseHost(host string) (NetAddressType, []byte, error) {
addrBytes := append(prefix, data...)
return TORv2Address, addrBytes, nil
}
// Check if this is a valid TORv3 address.
if len(host) == 62 {
torAddressBytes, err := base32.StdEncoding.DecodeString(
strings.ToUpper(host[:56]))
if err != nil {
return UnknownAddressType, nil, err
}
if pubkey, valid := isTORv3(torAddressBytes); valid {
return TORv3Address, pubkey, nil
}
}
}

if ip := net.ParseIP(host); ip != nil {
Expand Down Expand Up @@ -1126,8 +1137,13 @@ func getReachabilityFrom(localAddr, remoteAddr *NetAddress) NetAddressReach {
return Unreachable
}

if remoteAddr.Type == TORv2Address {
if localAddr.Type == TORv2Address {
isRemoteAddrTOR := remoteAddr.Type == TORv2Address ||
remoteAddr.Type == TORv3Address
isLocalAddrTOR := localAddr.Type == TORv2Address ||
localAddr.Type == TORv3Address

if isRemoteAddrTOR {
if isLocalAddrTOR {
return Private
}

Expand Down
1 change: 1 addition & 0 deletions addrmgr/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@ require (
github.com/decred/dcrd/chaincfg/chainhash v1.0.3
github.com/decred/dcrd/wire v1.5.0
github.com/decred/slog v1.2.0
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2
)
8 changes: 8 additions & 0 deletions addrmgr/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,11 @@ github.com/decred/dcrd/wire v1.5.0 h1:3SgcEzSjqAMQvOugP0a8iX7yQSpiVT1yNi9bc4iOXV
github.com/decred/dcrd/wire v1.5.0/go.mod h1:fzAjVqw32LkbAZIt5mnrvBR751GTa3e0rRQdOIhPY3w=
github.com/decred/slog v1.2.0 h1:soHAxV52B54Di3WtKLfPum9OFfWqwtf/ygf9njdfnPM=
github.com/decred/slog v1.2.0/go.mod h1:kVXlGnt6DHy2fV5OjSeuvCJ0OmlmTF6LFpEPMu/fOY0=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
15 changes: 12 additions & 3 deletions addrmgr/netaddress.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,13 @@ func (netAddr *NetAddress) ipString() string {
case TORv2Address:
base32 := base32.StdEncoding.EncodeToString(netIP[6:])
return strings.ToLower(base32) + ".onion"
case TORv3Address:
addrBytes := netIP
checksum := calcTORv3Checksum(addrBytes)
addrBytes = append(addrBytes, checksum[:]...)
addrBytes = append(addrBytes, torV3VersionByte)
base32 := base32.StdEncoding.EncodeToString(addrBytes)
return strings.ToLower(base32) + ".onion"
}
return net.IP(netIP).String()
}
Expand Down Expand Up @@ -104,7 +111,7 @@ func canonicalizeIP(addrType NetAddressType, addrBytes []byte) []byte {
// deriveNetAddressType attempts to determine the network address type from
// the address' raw bytes. If the type cannot be determined, an error is
// returned.
func deriveNetAddressType(addrBytes []byte) (NetAddressType, error) {
func deriveNetAddressType(claimedType NetAddressType, addrBytes []byte) (NetAddressType, error) {
len := len(addrBytes)
switch {
case isIPv4(addrBytes):
Expand All @@ -113,6 +120,8 @@ func deriveNetAddressType(addrBytes []byte) (NetAddressType, error) {
return TORv2Address, nil
case len == 16:
return IPv6Address, nil
case len == 32 && claimedType == TORv3Address:
return TORv3Address, nil
}
strErr := fmt.Sprintf("unable to determine address type from raw network "+
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Everything else in the code base tends to use str for these name here. Not a big deal, but would be better for consistency.

Suggested change
strErr := fmt.Sprintf("unable to determine address type from raw network "+
str := fmt.Sprintf("unable to determine address type from raw network "+

"address bytes: %v", addrBytes)
Expand All @@ -122,7 +131,7 @@ func deriveNetAddressType(addrBytes []byte) (NetAddressType, error) {
// assertNetAddressTypeValid returns an error if the suggested address type does
// not appear to match the provided address.
func assertNetAddressTypeValid(netAddressType NetAddressType, addrBytes []byte) error {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would suggest calling this checkNetAddressType. The term assert tends to imply it will panic if it's not correct, which isn't the case. Also, it's more consistent with the rest of the code base which tends to use checkX for these types of funcs.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, perhaps these should all be consistent with the param name. canonicalizeIP uses addrType while this one is netAddressType. I personally prefer addrType since I find it to be perfectly descriptive and it's shorter.

Either one is fine, but I would prefer they are all consistent.

derivedAddressType, err := deriveNetAddressType(addrBytes)
derivedAddressType, err := deriveNetAddressType(netAddressType, addrBytes)
if err != nil {
return err
}
Expand Down Expand Up @@ -184,7 +193,7 @@ func (a *AddrManager) newAddressFromString(addr string) (*NetAddress, error) {
// MUST be an IPv4, IPv6, or TORv2 address since this method does not perform
// error checking on the derived network address type.
func NewNetAddressIPPort(ip net.IP, port uint16, services wire.ServiceFlag) *NetAddress {
netAddressType, _ := deriveNetAddressType(ip)
netAddressType, _ := deriveNetAddressType(UnknownAddressType, ip)
timestamp := time.Unix(time.Now().Unix(), 0)
canonicalizedIP := canonicalizeIP(netAddressType, ip)
return &NetAddress{
Expand Down
7 changes: 7 additions & 0 deletions addrmgr/netaddress_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,13 @@ func TestKey(t *testing.T) {
port: 8334,
want: "aaaaaaaaaaaaaaaa.onion:8334",
},

// TORv3
{
host: "xa4r2iadxm55fbnqgwwi5mymqdcofiu3w6rpbtqn7b2dyn7mgwj64jyd.onion",
port: 8333,
want: "xa4r2iadxm55fbnqgwwi5mymqdcofiu3w6rpbtqn7b2dyn7mgwj64jyd.onion:8333",
},
}

timeNow := time.Now()
Expand Down
50 changes: 47 additions & 3 deletions addrmgr/network.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,17 @@
package addrmgr

import (
"bytes"
"fmt"
"net"

"golang.org/x/crypto/sha3"
)

// torV3VersionByte represents the version byte used when encoding and decoding
// a torv3 host name.
const torV3VersionByte = byte(3)

var (
// rfc1918Nets specifies the IPv4 private address blocks as defined by
// by RFC1918 (10.0.0.0/8, 172.16.0.0/12, and 192.168.0.0/16).
Expand Down Expand Up @@ -125,6 +132,7 @@ const (
IPv4Address
IPv6Address
TORv2Address
TORv3Address
)

// NetAddressTypeFilter represents a function that returns whether a particular
Expand Down Expand Up @@ -224,6 +232,39 @@ func isRFC6598(netIP net.IP) bool {
return rfc6598Net.Contains(netIP)
}

// calcTORv3Checksum returns the checksum bytes given a 32 byte
// TORv3 public key.
func calcTORv3Checksum(publicKey []byte) []byte {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd suggest using fixed-size and stack allocated code here to make it allocation free since it appears like this code will be called quite frequently. e.g.:

func calcTORv3Checksum(publicKey [32]byte) [2]byte {
	const (
		prefix    = ".onion checksum"
		prefixLen = len(prefix)
		inputLen  = prefixLen + len(publicKey) + 1
	)
	var input [inputLen]byte
	copy(input[:], prefix)
	copy(input[prefixLen:], publicKey[:])
	input[inputLen-1] = torV3VersionByte
	digest := sha3.Sum256(input[:])

	var result [2]byte
	copy(result[:], digest[:])
	return result
}

Naturally the calling code needs to be updated to copy instead of sending in byte slices too. The result will end up being faster and avoid churning the GC.

checkSumInput := []byte(".onion checksum")
checkSumInput = append(checkSumInput, publicKey...)
checkSumInput = append(checkSumInput, torV3VersionByte)
digest := sha3.Sum256(checkSumInput)
return digest[:2]
}

// isTORv3 returns whether or not the passed address is a valid TORv3 address
// with the checksum and version bytes. If it is valid, it also returns the
// public key of the tor v3 address.
func isTORv3(addressBytes []byte) ([]byte, bool) {
if len(addressBytes) != 35 {
return nil, false
}

version := addressBytes[34]
if version != torV3VersionByte {
return nil, false
}

publicKey := addressBytes[:32]
computedChecksum := calcTORv3Checksum(publicKey)
checksum := addressBytes[32:34]
if !bytes.Equal(computedChecksum, checksum) {
return nil, false
}

return publicKey, true
}

// isValid returns whether or not the passed address is valid. The address is
// considered invalid under the following circumstances:
// IPv4: It is either a zero or all bits set address.
Expand Down Expand Up @@ -266,7 +307,6 @@ func (na *NetAddress) GroupKey() string {
newIP := netIP[12:16]
return newIP.Mask(net.CIDRMask(16, 32)).String()
}

if isRFC3964(netIP) {
newIP := netIP[2:6]
return newIP.Mask(net.CIDRMask(16, 32)).String()
Expand All @@ -281,8 +321,12 @@ func (na *NetAddress) GroupKey() string {
return newIP.Mask(net.CIDRMask(16, 32)).String()
}
if na.Type == TORv2Address {
// group is keyed off the first 4 bits of the actual onion key.
return fmt.Sprintf("tor:%d", netIP[6]&((1<<4)-1))
// Group is keyed off the first 4 bits of the actual onion key.
return fmt.Sprintf("torv2:%d", netIP[6]&((1<<4)-1))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Won't changing this mess up all of the existing entries?

}
if na.Type == TORv3Address {
// Group is keyed off the first 4 bits of the public key.
return fmt.Sprintf("torv3:%d", netIP[0]&((1<<4)-1))
}

// OK, so now we know ourselves to be a IPv6 address.
Expand Down
83 changes: 47 additions & 36 deletions addrmgr/network_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"testing"

"github.com/decred/dcrd/wire"
"time"
)

// TestIPTypes ensures the various functions which determine the type of an IP
Expand Down Expand Up @@ -146,55 +147,65 @@ func TestIPTypes(t *testing.T) {
func TestGroupKey(t *testing.T) {
tests := []struct {
name string
ip string
host string
expected string
}{
// Local addresses.
{name: "ipv4 localhost", ip: "127.0.0.1", expected: "local"},
{name: "ipv6 localhost", ip: "::1", expected: "local"},
{name: "ipv4 zero", ip: "0.0.0.0", expected: "local"},
{name: "ipv4 first octet zero", ip: "0.1.2.3", expected: "local"},
{name: "ipv4 localhost", host: "127.0.0.1", expected: "local"},
{name: "ipv6 localhost", host: "::1", expected: "local"},
{name: "ipv4 zero", host: "0.0.0.0", expected: "local"},
{name: "ipv4 first octet zero", host: "0.1.2.3", expected: "local"},

// Unroutable addresses.
{name: "ipv4 invalid bcast", ip: "255.255.255.255", expected: "unroutable"},
{name: "ipv4 rfc1918 10/8", ip: "10.1.2.3", expected: "unroutable"},
{name: "ipv4 rfc1918 172.16/12", ip: "172.16.1.2", expected: "unroutable"},
{name: "ipv4 rfc1918 192.168/16", ip: "192.168.1.2", expected: "unroutable"},
{name: "ipv6 rfc3849 2001:db8::/32", ip: "2001:db8::1234", expected: "unroutable"},
{name: "ipv4 rfc3927 169.254/16", ip: "169.254.1.2", expected: "unroutable"},
{name: "ipv6 rfc4193 fc00::/7", ip: "fc00::1234", expected: "unroutable"},
{name: "ipv6 rfc4843 2001:10::/28", ip: "2001:10::1234", expected: "unroutable"},
{name: "ipv6 rfc4862 fe80::/64", ip: "fe80::1234", expected: "unroutable"},
{name: "ipv4 invalid bcast", host: "255.255.255.255", expected: "unroutable"},
{name: "ipv4 rfc1918 10/8", host: "10.1.2.3", expected: "unroutable"},
{name: "ipv4 rfc1918 172.16/12", host: "172.16.1.2", expected: "unroutable"},
{name: "ipv4 rfc1918 192.168/16", host: "192.168.1.2", expected: "unroutable"},
{name: "ipv6 rfc3849 2001:db8::/32", host: "2001:db8::1234", expected: "unroutable"},
{name: "ipv4 rfc3927 169.254/16", host: "169.254.1.2", expected: "unroutable"},
{name: "ipv6 rfc4193 fc00::/7", host: "fc00::1234", expected: "unroutable"},
{name: "ipv6 rfc4843 2001:10::/28", host: "2001:10::1234", expected: "unroutable"},
{name: "ipv6 rfc4862 fe80::/64", host: "fe80::1234", expected: "unroutable"},

// IPv4 normal.
{name: "ipv4 normal class a", ip: "12.1.2.3", expected: "12.1.0.0"},
{name: "ipv4 normal class b", ip: "173.1.2.3", expected: "173.1.0.0"},
{name: "ipv4 normal class c", ip: "196.1.2.3", expected: "196.1.0.0"},
{name: "ipv4 normal class a", host: "12.1.2.3", expected: "12.1.0.0"},
{name: "ipv4 normal class b", host: "173.1.2.3", expected: "173.1.0.0"},
{name: "ipv4 normal class c", host: "196.1.2.3", expected: "196.1.0.0"},

// IPv6/IPv4 translations.
{name: "ipv6 rfc3964 with ipv4 encap", ip: "2002:0c01:0203::", expected: "12.1.0.0"},
{name: "ipv6 rfc4380 toredo ipv4", ip: "2001:0:1234::f3fe:fdfc", expected: "12.1.0.0"},
{name: "ipv6 rfc6052 well-known prefix with ipv4", ip: "64:ff9b::0c01:0203", expected: "12.1.0.0"},
{name: "ipv6 rfc6145 translated ipv4", ip: "::ffff:0:0c01:0203", expected: "12.1.0.0"},

// Tor.
{name: "ipv6 tor onioncat", ip: "fd87:d87e:eb43:1234::5678", expected: "tor:2"},
{name: "ipv6 tor onioncat 2", ip: "fd87:d87e:eb43:1245::6789", expected: "tor:2"},
{name: "ipv6 tor onioncat 3", ip: "fd87:d87e:eb43:1345::6789", expected: "tor:3"},
{name: "ipv6 rfc3964 with ipv4 encap", host: "2002:0c01:0203::", expected: "12.1.0.0"},
{name: "ipv6 rfc4380 toredo ipv4", host: "2001:0:1234::f3fe:fdfc", expected: "12.1.0.0"},
{name: "ipv6 rfc6052 well-known prefix with ipv4", host: "64:ff9b::0c01:0203", expected: "12.1.0.0"},
{name: "ipv6 rfc6145 translated ipv4", host: "::ffff:0:0c01:0203", expected: "12.1.0.0"},

// TORv2
{name: "ipv6 tor onioncat", host: "fd87:d87e:eb43:1234::5678", expected: "torv2:2"},
{name: "ipv6 tor onioncat 2", host: "fd87:d87e:eb43:1245::6789", expected: "torv2:2"},
{name: "ipv6 tor onioncat 3", host: "fd87:d87e:eb43:1345::6789", expected: "torv2:3"},

// TORv3
{
name: "torv3",
host: "xa4r2iadxm55fbnqgwwi5mymqdcofiu3w6rpbtqn7b2dyn7mgwj64jyd.onion",
expected: "torv3:8",
},

// IPv6 normal.
{name: "ipv6 normal", ip: "2602:100::1", expected: "2602:100::"},
{name: "ipv6 normal 2", ip: "2602:0100::1234", expected: "2602:100::"},
{name: "ipv6 hurricane electric", ip: "2001:470:1f10:a1::2", expected: "2001:470:1000::"},
{name: "ipv6 hurricane electric 2", ip: "2001:0470:1f10:a1::2", expected: "2001:470:1000::"},
{name: "ipv6 normal", host: "2602:100::1", expected: "2602:100::"},
{name: "ipv6 normal 2", host: "2602:0100::1234", expected: "2602:100::"},
{name: "ipv6 hurricane electric", host: "2001:470:1f10:a1::2", expected: "2001:470:1000::"},
{name: "ipv6 hurricane electric 2", host: "2001:0470:1f10:a1::2", expected: "2001:470:1000::"},
}

for i, test := range tests {
nip := net.ParseIP(test.ip)
na := NewNetAddressIPPort(nip, 8333, wire.SFNodeNetwork)
if key := na.GroupKey(); key != test.expected {
t.Errorf("TestGroupKey #%d (%s): unexpected group key "+
"- got '%s', want '%s'", i, test.name, key, test.expected)
ts := time.Now()
for _, test := range tests {
addrType, addrBytes, _ := ParseHost(test.host)
na, _ := NewNetAddressByType(addrType, addrBytes, 8333, ts,
wire.SFNodeNetwork)
actualKey := na.GroupKey()
if actualKey != test.expected {
t.Errorf("%q: unexpected group key - got %s, want %s",
test.name, actualKey, test.expected)
}
}
}
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ require (
github.com/jrick/bitset v1.0.0
github.com/jrick/logrotate v1.0.0
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e
)

Expand Down
10 changes: 7 additions & 3 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,14 @@ github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM=
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc h1:zK/HqS5bZxDptfPJNq8v7vJfXtkU7r9TLIoSr1bXaP4=
golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
Expand All @@ -67,9 +68,12 @@ golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
Expand Down
8 changes: 8 additions & 0 deletions peer/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,11 @@ github.com/decred/go-socks v1.1.0 h1:dnENcc0KIqQo3HSXdgboXAHgqsCIutkqq6ntQjYtm2U
github.com/decred/go-socks v1.1.0/go.mod h1:sDhHqkZH0X4JjSa02oYOGhcGHYp12FsY1jQ/meV8md0=
github.com/decred/slog v1.2.0 h1:soHAxV52B54Di3WtKLfPum9OFfWqwtf/ygf9njdfnPM=
github.com/decred/slog v1.2.0/go.mod h1:kVXlGnt6DHy2fV5OjSeuvCJ0OmlmTF6LFpEPMu/fOY0=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
Loading