add NewPublicKeyFromECDSA In order to easy import an ethereum like ECDSA public key into a blindsecp256k1 type public key. Signed-off-by: p4u <pau@dabax.net>
p4u pau@dabax.net
Mon, 01 Feb 2021 17:40:43 +0100
2 files changed,
29 insertions(+),
0 deletions(-)
M
parsers.go
→
parsers.go
@@ -4,6 +4,8 @@ import (
"encoding/json" "fmt" "math/big" + + "github.com/ethereum/go-ethereum/crypto" ) // swapEndianness swaps the order of the bytes in the slice.@@ -106,6 +108,19 @@ return nil, err
} pk := PublicKey(*p) return &pk, nil +} + +// NewPublicKeyFromECDSA returns a *PublicKey from a serialized/marshaled array +// of bytes generated by the ethereum/standard ECDSA PubKey implementation. +func NewPublicKeyFromECDSA(b []byte) (*PublicKey, error) { + pub, err := crypto.UnmarshalPubkey(b) + if err != nil { + return nil, err + } + pk := new(PublicKey) + pk.X = pub.X + pk.Y = pub.Y + return pk, nil } // MarshalJSON implements the json marshaler for the Signature
M
parsers_test.go
→
parsers_test.go
@@ -6,6 +6,7 @@ "encoding/json"
"math/big" "testing" + "github.com/ethereum/go-ethereum/crypto" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" )@@ -92,3 +93,16 @@ sig2, err := NewSignatureFromBytes(b)
assert.Nil(t, err) assert.Equal(t, &sig, sig2) } + +func TestImportECDSApubKey(t *testing.T) { + // Generate an ECDSA key + k, err := crypto.GenerateKey() + assert.Nil(t, err) + // Import the ECDSA Public key bytes into a PublicKey type + pk, err := NewPublicKeyFromECDSA(crypto.FromECDSAPub(&k.PublicKey)) + assert.Nil(t, err) + // Set the ECDSA Private key point as a blindsecp256k1 PrivateKey type + bk := PrivateKey(*k.D) + // Compare both public keys + assert.Equal(t, bk.Public().Bytes(), pk.Bytes()) +}