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
}
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")
}

View file

@ -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)
}
}

View file

@ -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
}