Skip to content

Commit

Permalink
p2p/discover: fix handling of distance 256 in lookupDistances (ethere…
Browse files Browse the repository at this point in the history
…um#26087)

Noticed that lookupDistances for FINDNODE requests didn't consider 256 a valid
distance. This is actually part of the example in the comment above the
function, surprised that wasn't tested before.
  • Loading branch information
jtraglia authored and lightclient committed Nov 8, 2022
1 parent 61a2b52 commit cb2ace8
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 3 deletions.
2 changes: 1 addition & 1 deletion p2p/discover/v5_udp.go
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,7 @@ func lookupDistances(target, dest enode.ID) (dists []uint) {
td := enode.LogDist(target, dest)
dists = append(dists, uint(td))
for i := 1; len(dists) < lookupRequestLimit; i++ {
if td+i < 256 {
if td+i <= 256 {
dists = append(dists, uint(td+i))
}
if td-i > 0 {
Expand Down
37 changes: 37 additions & 0 deletions p2p/discover/v5_udp_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import (
"github.com/ethereum/go-ethereum/p2p/enode"
"github.com/ethereum/go-ethereum/p2p/enr"
"github.com/ethereum/go-ethereum/rlp"
"github.com/stretchr/testify/require"
)

// Real sockets, real crypto: this test checks end-to-end connectivity for UDPv5.
Expand Down Expand Up @@ -519,6 +520,42 @@ func TestUDPv5_talkRequest(t *testing.T) {
}
}

// This test checks that lookupDistances works.
func TestUDPv5_lookupDistances(t *testing.T) {
test := newUDPV5Test(t)
lnID := test.table.self().ID()

t.Run("target distance of 1", func(t *testing.T) {
node := nodeAtDistance(lnID, 1, intIP(0))
dists := lookupDistances(lnID, node.ID())
require.Equal(t, []uint{1, 2, 3}, dists)
})

t.Run("target distance of 2", func(t *testing.T) {
node := nodeAtDistance(lnID, 2, intIP(0))
dists := lookupDistances(lnID, node.ID())
require.Equal(t, []uint{2, 3, 1}, dists)
})

t.Run("target distance of 128", func(t *testing.T) {
node := nodeAtDistance(lnID, 128, intIP(0))
dists := lookupDistances(lnID, node.ID())
require.Equal(t, []uint{128, 129, 127}, dists)
})

t.Run("target distance of 255", func(t *testing.T) {
node := nodeAtDistance(lnID, 255, intIP(0))
dists := lookupDistances(lnID, node.ID())
require.Equal(t, []uint{255, 256, 254}, dists)
})

t.Run("target distance of 256", func(t *testing.T) {
node := nodeAtDistance(lnID, 256, intIP(0))
dists := lookupDistances(lnID, node.ID())
require.Equal(t, []uint{256, 255, 254}, dists)
})
}

// This test checks that lookup works.
func TestUDPv5_lookup(t *testing.T) {
t.Parallel()
Expand Down
4 changes: 2 additions & 2 deletions p2p/discover/v5wire/encoding.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ type (
handshakeAuthData struct {
h struct {
SrcID enode.ID
SigSize byte // ignature data
SigSize byte // signature data
PubkeySize byte // offset of
}
// Trailing variable-size data.
Expand Down Expand Up @@ -529,7 +529,7 @@ func (c *Codec) decodeHandshake(fromAddr string, head *Header) (n *enode.Node, a
if err != nil {
return nil, auth, nil, errInvalidAuthKey
}
// Derive sesssion keys.
// Derive session keys.
session := deriveKeys(sha256.New, c.privkey, ephkey, auth.h.SrcID, c.localnode.ID(), cdata)
session = session.keysFlipped()
return n, auth, session, nil
Expand Down

0 comments on commit cb2ace8

Please sign in to comment.