From 0f621d4ac868a6b5cd4ba253cc65e287f282bc9b Mon Sep 17 00:00:00 2001 From: p4u Date: Mon, 1 Feb 2021 17:40:43 +0100 Subject: [PATCH] add NewPublicKeyFromECDSA In order to easy import an ethereum like ECDSA public key into a blindsecp256k1 type public key. Signed-off-by: p4u --- parsers.go | 15 +++++++++++++++ parsers_test.go | 14 ++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/parsers.go b/parsers.go index 1b1e67a..33014fc 100644 --- a/parsers.go +++ b/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. @@ -108,6 +110,19 @@ func NewPublicKeyFromBytes(b []byte) (*PublicKey, error) { 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 func (sig Signature) MarshalJSON() ([]byte, error) { return json.Marshal(&struct { diff --git a/parsers_test.go b/parsers_test.go index 41a466a..e8e1d48 100644 --- a/parsers_test.go +++ b/parsers_test.go @@ -6,6 +6,7 @@ import ( "math/big" "testing" + "github.com/ethereum/go-ethereum/crypto" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -92,3 +93,16 @@ func TestBytes(t *testing.T) { 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()) +}