diff options
author | Felix Lange <fjl@twurst.com> | 2015-03-02 22:26:24 +0800 |
---|---|---|
committer | Felix Lange <fjl@twurst.com> | 2015-03-04 19:27:24 +0800 |
commit | 2c505efd1ec03dc28ebabbb54253f3eb9e719be5 (patch) | |
tree | 3390823a5bb64fe4cc3a4184f0875d4d95de0745 /p2p/discover/node.go | |
parent | d344054e5a2844241bf0e4f64ccfc4d2ad259718 (diff) | |
download | dexon-2c505efd1ec03dc28ebabbb54253f3eb9e719be5.tar.gz dexon-2c505efd1ec03dc28ebabbb54253f3eb9e719be5.tar.zst dexon-2c505efd1ec03dc28ebabbb54253f3eb9e719be5.zip |
p2p/discover: add NodeID.Pubkey
Diffstat (limited to 'p2p/discover/node.go')
-rw-r--r-- | p2p/discover/node.go | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/p2p/discover/node.go b/p2p/discover/node.go index c6d2e9766..de2588258 100644 --- a/p2p/discover/node.go +++ b/p2p/discover/node.go @@ -7,6 +7,7 @@ import ( "errors" "fmt" "io" + "math/big" "math/rand" "net" "net/url" @@ -14,6 +15,7 @@ import ( "strings" "time" + "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto/secp256k1" "github.com/ethereum/go-ethereum/rlp" ) @@ -187,6 +189,19 @@ func PubkeyID(pub *ecdsa.PublicKey) NodeID { 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 // given hash from the signature. func recoverNodeID(hash, sig []byte) (id NodeID, err error) { |