Skip to content

Commit 08cdd66

Browse files
committed
p2p/enr: avoid using btcec directly
1 parent dd97fb7 commit 08cdd66

File tree

3 files changed

+26
-48
lines changed

3 files changed

+26
-48
lines changed

p2p/enr/enr.go

Lines changed: 19 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,8 @@ import (
3333
"errors"
3434
"fmt"
3535
"io"
36-
"math/big"
3736
"sort"
3837

39-
"github.com/btcsuite/btcd/btcec"
40-
"github.com/ethereum/go-ethereum/common/math"
4138
"github.com/ethereum/go-ethereum/crypto"
4239
"github.com/ethereum/go-ethereum/crypto/sha3"
4340
"github.com/ethereum/go-ethereum/rlp"
@@ -206,25 +203,27 @@ func (r *Record) DecodeRLP(s *rlp.Stream) error {
206203
return nil
207204
}
208205

206+
type s256raw []byte
207+
208+
func (s256raw) ENRKey() string { return "secp256k1" }
209+
209210
// NodeAddr returns the node address. The return value will be nil if the record is
210211
// unsigned.
211212
func (r *Record) NodeAddr() []byte {
212-
var secp256k1 Secp256k1
213-
if r.Load(&secp256k1) != nil {
213+
var key s256raw
214+
if r.Load(&key) != nil {
214215
return nil
215216
}
216-
pk := btcec.PublicKey(secp256k1)
217-
return crypto.Keccak256(pk.SerializeCompressed())
217+
return crypto.Keccak256(key)
218218
}
219219

220220
// Sign signs the record with the given private key. It updates the record's identity
221221
// scheme, public key and increments the sequence number. Sign returns an error if the
222222
// encoded record is larger than the size limit.
223223
func (r *Record) Sign(privkey *ecdsa.PrivateKey) error {
224-
pk := (*btcec.PublicKey)(&privkey.PublicKey)
225224
r.seq = r.seq + 1
226225
r.Set(ID_SECP256k1_KECCAK)
227-
r.Set(Secp256k1(*pk))
226+
r.Set(Secp256k1(privkey.PublicKey))
228227
return r.signAndEncode(privkey)
229228
}
230229

@@ -244,14 +243,14 @@ func (r *Record) signAndEncode(privkey *ecdsa.PrivateKey) error {
244243
// Sign the tail of the list.
245244
h := sha3.NewKeccak256()
246245
rlp.Encode(h, list[1:])
247-
sig, err := (*btcec.PrivateKey)(privkey).Sign(h.Sum(nil))
246+
sig, err := crypto.Sign(h.Sum(nil), privkey)
248247
if err != nil {
249248
return err
250249
}
250+
sig = sig[:len(sig)-1] // remove v
251251

252252
// Put signature in front.
253-
r.signature = encodeCompactSignature(sig)
254-
list[0] = r.signature
253+
r.signature, list[0] = sig, sig
255254
r.raw, err = rlp.EncodeToBytes(list)
256255
if err != nil {
257256
return err
@@ -265,41 +264,28 @@ func (r *Record) signAndEncode(privkey *ecdsa.PrivateKey) error {
265264
func (r *Record) verifySignature() error {
266265
// Get identity scheme, public key, signature.
267266
var id ID
268-
var secp256k1 Secp256k1
267+
var key s256raw
269268
if err := r.Load(&id); err != nil {
270269
return err
271270
} else if id != ID_SECP256k1_KECCAK {
272271
return errNoID
273272
}
274-
if err := r.Load(&secp256k1); err != nil {
275-
return err
276-
}
277-
sig, err := parseCompactSignature(r.signature)
278-
if err != nil {
273+
if err := r.Load(&key); err != nil {
279274
return err
275+
} else if len(key) != 33 {
276+
return fmt.Errorf("invalid public key")
280277
}
281278

282279
// Verify the signature.
283280
list := make([]interface{}, 0, len(r.pairs)*2+1)
284281
list = r.appendPairs(list)
285282
h := sha3.NewKeccak256()
286283
rlp.Encode(h, list)
287-
if !sig.Verify(h.Sum(nil), (*btcec.PublicKey)(&secp256k1)) {
284+
fmt.Printf("sig: %x\n", r.signature)
285+
fmt.Printf("key: %x\n", key)
286+
fmt.Printf("hash: %x\n", h.Sum(nil))
287+
if !crypto.VerifySignature(key, h.Sum(nil), r.signature) {
288288
return errInvalidSig
289289
}
290290
return nil
291291
}
292-
293-
func encodeCompactSignature(sig *btcec.Signature) []byte {
294-
b := make([]byte, 64)
295-
math.ReadBits(sig.R, b[:32])
296-
math.ReadBits(sig.S, b[32:])
297-
return b
298-
}
299-
300-
func parseCompactSignature(sig []byte) (*btcec.Signature, error) {
301-
if len(sig) != 64 {
302-
return nil, errInvalidSigsize
303-
}
304-
return &btcec.Signature{R: new(big.Int).SetBytes(sig[:32]), S: new(big.Int).SetBytes(sig[32:])}, nil
305-
}

p2p/enr/enr_test.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,15 @@ import (
2424
"testing"
2525
"time"
2626

27-
"github.com/btcsuite/btcd/btcec"
2827
"github.com/ethereum/go-ethereum/crypto"
2928
"github.com/ethereum/go-ethereum/rlp"
3029
"github.com/stretchr/testify/assert"
3130
"github.com/stretchr/testify/require"
3231
)
3332

3433
var (
35-
privkeyHex = "b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291"
36-
privkey, _ = crypto.HexToECDSA(privkeyHex)
37-
pubkeyBytes, _ = hex.DecodeString("03ca634cae0d49acb401d8a4c6b6fe8c55b70d115bf400769cc1400f3258cd3138")
38-
pubkey, _ = btcec.ParsePubKey(pubkeyBytes, btcec.S256())
34+
privkey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
35+
pubkey = &privkey.PublicKey
3936
)
4037

4138
var rnd = rand.New(rand.NewSource(time.Now().UnixNano()))

p2p/enr/keys.go

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import (
2222
"io"
2323
"net"
2424

25-
"github.com/btcsuite/btcd/btcec"
25+
"github.com/ethereum/go-ethereum/crypto"
2626
"github.com/ethereum/go-ethereum/rlp"
2727
)
2828

@@ -121,25 +121,20 @@ func (v Secp256k1) ENRKey() string { return "secp256k1" }
121121

122122
// EncodeRLP implements rlp.Encoder.
123123
func (v Secp256k1) EncodeRLP(w io.Writer) error {
124-
pk := btcec.PublicKey(v)
125-
126-
return rlp.Encode(w, pk.SerializeCompressed())
124+
return rlp.Encode(w, crypto.CompressPubkey((*ecdsa.PublicKey)(&v)))
127125
}
128126

129127
// DecodeRLP implements rlp.Decoder.
130128
func (v *Secp256k1) DecodeRLP(s *rlp.Stream) error {
131-
buf := make([]byte, 33)
132-
if err := s.Decode(&buf); err != nil {
129+
buf, err := s.Bytes()
130+
if err != nil {
133131
return err
134132
}
135-
136-
pk, err := btcec.ParsePubKey(buf, btcec.S256())
133+
pk, err := crypto.DecompressPubkey(buf)
137134
if err != nil {
138135
return err
139136
}
140-
141137
*v = (Secp256k1)(*pk)
142-
143138
return nil
144139
}
145140

0 commit comments

Comments
 (0)