p2p/discover: add NodeID.Pubkey
This commit is contained in:
parent
d344054e5a
commit
2c505efd1e
@ -7,6 +7,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"math/big"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"net"
|
"net"
|
||||||
"net/url"
|
"net/url"
|
||||||
@ -14,6 +15,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
"github.com/ethereum/go-ethereum/crypto/secp256k1"
|
"github.com/ethereum/go-ethereum/crypto/secp256k1"
|
||||||
"github.com/ethereum/go-ethereum/rlp"
|
"github.com/ethereum/go-ethereum/rlp"
|
||||||
)
|
)
|
||||||
@ -187,6 +189,19 @@ func PubkeyID(pub *ecdsa.PublicKey) NodeID {
|
|||||||
return id
|
return id
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Pubkey returns the public key represented by the node ID.
|
||||||
|
// It returns an error if the ID is not a point on the curve.
|
||||||
|
func (id NodeID) Pubkey() (*ecdsa.PublicKey, error) {
|
||||||
|
p := &ecdsa.PublicKey{Curve: crypto.S256(), X: new(big.Int), Y: new(big.Int)}
|
||||||
|
half := len(id) / 2
|
||||||
|
p.X.SetBytes(id[:half])
|
||||||
|
p.Y.SetBytes(id[half:])
|
||||||
|
if !p.Curve.IsOnCurve(p.X, p.Y) {
|
||||||
|
return nil, errors.New("not a point on the S256 curve")
|
||||||
|
}
|
||||||
|
return p, nil
|
||||||
|
}
|
||||||
|
|
||||||
// recoverNodeID computes the public key used to sign the
|
// recoverNodeID computes the public key used to sign the
|
||||||
// given hash from the signature.
|
// given hash from the signature.
|
||||||
func recoverNodeID(hash, sig []byte) (id NodeID, err error) {
|
func recoverNodeID(hash, sig []byte) (id NodeID, err error) {
|
||||||
|
@ -133,6 +133,24 @@ func TestNodeID_recover(t *testing.T) {
|
|||||||
if pub != recpub {
|
if pub != recpub {
|
||||||
t.Errorf("recovered wrong pubkey:\ngot: %v\nwant: %v", recpub, pub)
|
t.Errorf("recovered wrong pubkey:\ngot: %v\nwant: %v", recpub, pub)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ecdsa, err := pub.Pubkey()
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Pubkey error: %v", err)
|
||||||
|
}
|
||||||
|
if !reflect.DeepEqual(ecdsa, &prv.PublicKey) {
|
||||||
|
t.Errorf("Pubkey mismatch:\n got: %#v\n want: %#v", ecdsa, &prv.PublicKey)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNodeID_pubkeyBad(t *testing.T) {
|
||||||
|
ecdsa, err := NodeID{}.Pubkey()
|
||||||
|
if err == nil {
|
||||||
|
t.Error("expected error for zero ID")
|
||||||
|
}
|
||||||
|
if ecdsa != nil {
|
||||||
|
t.Error("expected nil result")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestNodeID_distcmp(t *testing.T) {
|
func TestNodeID_distcmp(t *testing.T) {
|
||||||
|
Loading…
Reference in New Issue
Block a user