p2p/enr: Secp256k1 to ecdsa.PublicKey

This commit is contained in:
Anton Evangelatov 2017-12-04 13:43:44 +01:00 committed by Felix Lange
parent a2572e399a
commit d960c08a24
3 changed files with 25 additions and 15 deletions

View file

@ -193,7 +193,9 @@ func (r *Record) NodeAddr() ([]byte, error) {
return nil, err return nil, err
} }
digest := crypto.Keccak256Hash(secp256k1) pk := btcec.PublicKey(secp256k1)
digest := crypto.Keccak256Hash(pk.SerializeCompressed())
return digest.Bytes(), nil return digest.Bytes(), nil
} }
@ -203,8 +205,8 @@ func (r *Record) Sign(privkey *ecdsa.PrivateKey) error {
r.Set(ID(ID_SECP256k1_KECCAK)) r.Set(ID(ID_SECP256k1_KECCAK))
pk := (*btcec.PublicKey)(&privkey.PublicKey).SerializeCompressed() pk := (*btcec.PublicKey)(&privkey.PublicKey)
secp256k1 := Secp256k1(pk) secp256k1 := Secp256k1(*pk)
r.Set(secp256k1) r.Set(secp256k1)
return r.signAndEncode(privkey) return r.signAndEncode(privkey)
@ -271,11 +273,6 @@ func (r Record) verifySignature(sigcontent []byte) error {
return err return err
} }
pk, err := btcec.ParsePubKey(secp256k1, btcec.S256())
if err != nil {
return err
}
digest := crypto.Keccak256Hash(sigcontent) digest := crypto.Keccak256Hash(sigcontent)
sign, err := btcec.ParseSignature(r.signature, btcec.S256()) sign, err := btcec.ParseSignature(r.signature, btcec.S256())
@ -283,7 +280,7 @@ func (r Record) verifySignature(sigcontent []byte) error {
return err return err
} }
if !sign.Verify(digest.Bytes(), pk) { if !sign.Verify(digest.Bytes(), (*btcec.PublicKey)(&secp256k1)) {
return errors.New("signature is not valid") return errors.New("signature is not valid")
} }

View file

@ -120,9 +120,10 @@ func TestGetSetSecp256k1(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
got := (*btcec.PublicKey)(&pk).SerializeCompressed()
expected := (*btcec.PublicKey)(&privkey.PublicKey).SerializeCompressed() expected := (*btcec.PublicKey)(&privkey.PublicKey).SerializeCompressed()
if bytes.Compare(pk, expected) != 0 { if bytes.Compare(got, expected) != 0 {
t.Fatalf("got %#v, expected %#v", pk, expected) t.Fatalf("got %#v, expected %#v", got, expected)
} }
} }

View file

@ -17,25 +17,37 @@
package enr package enr
import ( import (
"crypto/ecdsa"
"io" "io"
"github.com/btcsuite/btcd/btcec"
"github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/rlp"
) )
type Secp256k1 []byte type Secp256k1 ecdsa.PublicKey
func (Secp256k1) ENRKey() string { func (Secp256k1) ENRKey() string {
return "secp256k1" return "secp256k1"
} }
func (v Secp256k1) EncodeRLP(w io.Writer) error { func (v Secp256k1) EncodeRLP(w io.Writer) error {
blob := []byte(v) pk := btcec.PublicKey(v)
return rlp.Encode(w, blob)
return rlp.Encode(w, pk.SerializeCompressed())
} }
func (v *Secp256k1) DecodeRLP(s *rlp.Stream) error { 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 return err
} }
pk, err := btcec.ParsePubKey(buf, btcec.S256())
if err != nil {
return err
}
*v = (Secp256k1)(*pk)
return nil return nil
} }