From 74eda001aaf571ea3524ff050dac39527be289d9 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Fri, 1 Dec 2017 19:20:51 +0100 Subject: [PATCH] p2p/enr: update r.raw on DecodeRLP --- p2p/enr/enr.go | 32 ++++++++++++++++++++------------ p2p/enr/enr_test.go | 11 ++++++++++- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/p2p/enr/enr.go b/p2p/enr/enr.go index 3cd99a0a47..daaa316a87 100644 --- a/p2p/enr/enr.go +++ b/p2p/enr/enr.go @@ -135,7 +135,20 @@ func (r *Record) DecodeRLP(s *rlp.Stream) error { return err } - err = r.verifySignature() + sigcontent, err := r.serialisedContent() + if err != nil { + return err + } + + // update r.raw + blob, err := rlp.EncodeToBytes(r.signature) + if err != nil { + return err + } + + r.raw = append(blob, sigcontent...) + + err = r.verifySignature(sigcontent) if err != nil { return err } @@ -161,11 +174,11 @@ func (r Record) Equal(o Record) (bool, error) { return false, nil } - if err := r.verifySignature(); err != nil { + if err := r.verifySignature(rr); err != nil { return false, err } - if err := o.verifySignature(); err != nil { + if err := o.verifySignature(oo); err != nil { return false, err } @@ -241,7 +254,7 @@ func (r *Record) signAndEncode(privkey *ecdsa.PrivateKey) error { return nil } -func (r *Record) verifySignature() error { +func (r Record) verifySignature(sigcontent []byte) error { var id ID _, err := r.Load(&id) if err != nil { @@ -254,18 +267,13 @@ func (r *Record) verifySignature() error { } // get publickey from record - var blob Secp256k1 - _, err = r.Load(&blob) + var secp256k1 Secp256k1 + _, err = r.Load(&secp256k1) if err != nil { return err } - pk, err := btcec.ParsePubKey(blob, btcec.S256()) - if err != nil { - return err - } - - sigcontent, err := r.serialisedContent() + pk, err := btcec.ParsePubKey(secp256k1, btcec.S256()) if err != nil { return err } diff --git a/p2p/enr/enr_test.go b/p2p/enr/enr_test.go index 4c1df03f67..82ef9c5143 100644 --- a/p2p/enr/enr_test.go +++ b/p2p/enr/enr_test.go @@ -20,6 +20,7 @@ import ( "bytes" "encoding/hex" "net" + "reflect" "testing" "github.com/btcsuite/btcd/btcec" @@ -182,10 +183,18 @@ func TestSignEncodeAndDecode(t *testing.T) { t.Errorf("records not equal ; got\n%#v, expected\n%#v", r2, r) } - _, err = rlp.EncodeToBytes(r2) + if !reflect.DeepEqual(r, r2) { + t.Errorf("records not deep equal ; got\n%#v, expected\n%#v", r2, r) + } + + blob2, err := rlp.EncodeToBytes(r2) if err != nil { t.Fatal(err) } + + if bytes.Compare(blob, blob2) != 0 { + t.Errorf("serialised records not equal ; got\n%#v, expected\n%#v", blob2, blob) + } } func TestNodeAddress(t *testing.T) {