diff --git a/p2p/enr/enr.go b/p2p/enr/enr.go index 5cbd99629b..1127a1847d 100644 --- a/p2p/enr/enr.go +++ b/p2p/enr/enr.go @@ -193,7 +193,9 @@ func (r *Record) NodeAddr() ([]byte, error) { return nil, err } - digest := crypto.Keccak256Hash(secp256k1) + pk := btcec.PublicKey(secp256k1) + + digest := crypto.Keccak256Hash(pk.SerializeCompressed()) return digest.Bytes(), nil } @@ -203,8 +205,8 @@ func (r *Record) Sign(privkey *ecdsa.PrivateKey) error { r.Set(ID(ID_SECP256k1_KECCAK)) - pk := (*btcec.PublicKey)(&privkey.PublicKey).SerializeCompressed() - secp256k1 := Secp256k1(pk) + pk := (*btcec.PublicKey)(&privkey.PublicKey) + secp256k1 := Secp256k1(*pk) r.Set(secp256k1) return r.signAndEncode(privkey) @@ -271,11 +273,6 @@ func (r Record) verifySignature(sigcontent []byte) error { return err } - pk, err := btcec.ParsePubKey(secp256k1, btcec.S256()) - if err != nil { - return err - } - digest := crypto.Keccak256Hash(sigcontent) sign, err := btcec.ParseSignature(r.signature, btcec.S256()) @@ -283,7 +280,7 @@ func (r Record) verifySignature(sigcontent []byte) error { return err } - if !sign.Verify(digest.Bytes(), pk) { + if !sign.Verify(digest.Bytes(), (*btcec.PublicKey)(&secp256k1)) { return errors.New("signature is not valid") } diff --git a/p2p/enr/enr_test.go b/p2p/enr/enr_test.go index 43c9220193..d452af3662 100644 --- a/p2p/enr/enr_test.go +++ b/p2p/enr/enr_test.go @@ -120,9 +120,10 @@ func TestGetSetSecp256k1(t *testing.T) { t.Fatal(err) } + got := (*btcec.PublicKey)(&pk).SerializeCompressed() expected := (*btcec.PublicKey)(&privkey.PublicKey).SerializeCompressed() - if bytes.Compare(pk, expected) != 0 { - t.Fatalf("got %#v, expected %#v", pk, expected) + if bytes.Compare(got, expected) != 0 { + t.Fatalf("got %#v, expected %#v", got, expected) } } diff --git a/p2p/enr/secp256k1.go b/p2p/enr/secp256k1.go index b5e1ff029a..1f694f968d 100644 --- a/p2p/enr/secp256k1.go +++ b/p2p/enr/secp256k1.go @@ -17,25 +17,37 @@ package enr import ( + "crypto/ecdsa" "io" + "github.com/btcsuite/btcd/btcec" "github.com/ethereum/go-ethereum/rlp" ) -type Secp256k1 []byte +type Secp256k1 ecdsa.PublicKey func (Secp256k1) ENRKey() string { return "secp256k1" } func (v Secp256k1) EncodeRLP(w io.Writer) error { - blob := []byte(v) - return rlp.Encode(w, blob) + pk := btcec.PublicKey(v) + + return rlp.Encode(w, pk.SerializeCompressed()) } func (v *Secp256k1) DecodeRLP(s *rlp.Stream) error { - if err := s.Decode((*[]byte)(v)); err != nil { + buf := make([]byte, 33) + if err := s.Decode(&buf); err != nil { return err } + + pk, err := btcec.ParsePubKey(buf, btcec.S256()) + if err != nil { + return err + } + + *v = (Secp256k1)(*pk) + return nil }