From faf032a3e0e5e0357cdfe7c73c4ef0ad545f8e97 Mon Sep 17 00:00:00 2001 From: iris-zhang Date: Fri, 11 Feb 2022 20:34:26 -0800 Subject: [PATCH 1/2] Pallas support ImportPrivateKey --- keys/errors.go | 1 + keys/keys.go | 14 ++++++++++++++ keys/keys_test.go | 20 ++++++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/keys/errors.go b/keys/errors.go index 947274798..fa4678bbd 100644 --- a/keys/errors.go +++ b/keys/errors.go @@ -69,6 +69,7 @@ func Err(err error) bool { ErrKeyGenSecp256k1Failed, ErrKeyGenSecp256r1Failed, ErrKeyGenEdwards25519Failed, + ErrKeyGenPallasFailed, ErrCurveTypeNotSupported, ErrSignUnsupportedPayloadSignatureType, ErrSignUnsupportedSignatureType, diff --git a/keys/keys.go b/keys/keys.go index eb63eedad..22a15641c 100644 --- a/keys/keys.go +++ b/keys/keys.go @@ -119,6 +119,20 @@ func ImportPrivateKey(privKeyHex string, curve types.CurveType) (*KeyPair, error PublicKey: pubKey, PrivateKey: rawPrivKey.D.Bytes(), } + case types.Pallas: + rawPrivKey := &mina.SecretKey{} + _ = rawPrivKey.UnmarshalBinary(privKey) + + pubKey, _ := rawPrivKey.GetPublicKey().MarshalBinary() + priKeyBytes, _ := rawPrivKey.MarshalBinary() + keyPair = &KeyPair{ + PublicKey: &types.PublicKey{ + Bytes: pubKey, + CurveType: curve, + }, + PrivateKey: priKeyBytes, + } + default: return nil, fmt.Errorf("%w: %s", ErrCurveTypeNotSupported, curve) } diff --git a/keys/keys_test.go b/keys/keys_test.go index a0c1d7112..7cef3935e 100644 --- a/keys/keys_test.go +++ b/keys/keys_test.go @@ -74,6 +74,15 @@ func TestGenerateKeypairEdwards25519(t *testing.T) { assert.Len(t, keypair.PrivateKey, PrivKeyBytesLen) } +func TestGenerateKeypairPallas(t *testing.T) { + curve := types.Pallas + keypair, err := GenerateKeypair(curve) + + assert.NoError(t, err) + assert.Equal(t, keypair.PublicKey.CurveType, curve) + assert.Len(t, keypair.PrivateKey, PrivKeyBytesLen) +} + func mockKeyPair(privKey []byte, curveType types.CurveType) *KeyPair { keypair, _ := GenerateKeypair(curveType) keypair.PrivateKey = privKey @@ -125,8 +134,14 @@ func TestImportPrivateKey(t *testing.T) { types.Secp256k1, nil, }, + "simple Pallas": { + "B80F3DE13EE6AE01119E7D98A8F2317070FBB6D2A1EA712EE1B55EE7B938AD1D", + types.Pallas, + nil, + }, "short ed25519": {"asd", types.Secp256k1, ErrPrivKeyUndecodable}, "short Secp256k1": {"asd", types.Edwards25519, ErrPrivKeyUndecodable}, + "short pallas": {"asd", types.Pallas, ErrPrivKeyUndecodable}, "long ed25519": { "aeb121b4c545f0f850e1480492508c65a250e9965b0d90176fab4d7506398ebbaeb121b4c545f0f850e1480492508c65a250e9965b0d90176fab4d7506398ebb", // nolint:lll types.Secp256k1, @@ -137,6 +152,11 @@ func TestImportPrivateKey(t *testing.T) { types.Edwards25519, ErrPrivKeyLengthInvalid, }, + "long Pallas": { + "A80F3DE13EE5AE01119E7D98A8F2317070BFB6D2A1EA712EE1B55EE7B938AD1DA80F3DE13EE5AE01119E7D98A8F2317070BFB6D2A1EA712EE1B55EE7B938AD1D", // nolint:lll + types.Pallas, + ErrPrivKeyLengthInvalid, + }, } for name, test := range importPrivKeyTests { From 930328afa0ed98fe896e420f8455f7f0b31e06e5 Mon Sep 17 00:00:00 2001 From: iris-zhang Date: Fri, 11 Feb 2022 20:34:26 -0800 Subject: [PATCH 2/2] Pallas support ImportPrivateKey --- keys/errors.go | 1 + keys/keys.go | 14 ++++++++++++++ keys/keys_test.go | 20 ++++++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/keys/errors.go b/keys/errors.go index 947274798..fa4678bbd 100644 --- a/keys/errors.go +++ b/keys/errors.go @@ -69,6 +69,7 @@ func Err(err error) bool { ErrKeyGenSecp256k1Failed, ErrKeyGenSecp256r1Failed, ErrKeyGenEdwards25519Failed, + ErrKeyGenPallasFailed, ErrCurveTypeNotSupported, ErrSignUnsupportedPayloadSignatureType, ErrSignUnsupportedSignatureType, diff --git a/keys/keys.go b/keys/keys.go index eb63eedad..22a15641c 100644 --- a/keys/keys.go +++ b/keys/keys.go @@ -119,6 +119,20 @@ func ImportPrivateKey(privKeyHex string, curve types.CurveType) (*KeyPair, error PublicKey: pubKey, PrivateKey: rawPrivKey.D.Bytes(), } + case types.Pallas: + rawPrivKey := &mina.SecretKey{} + _ = rawPrivKey.UnmarshalBinary(privKey) + + pubKey, _ := rawPrivKey.GetPublicKey().MarshalBinary() + priKeyBytes, _ := rawPrivKey.MarshalBinary() + keyPair = &KeyPair{ + PublicKey: &types.PublicKey{ + Bytes: pubKey, + CurveType: curve, + }, + PrivateKey: priKeyBytes, + } + default: return nil, fmt.Errorf("%w: %s", ErrCurveTypeNotSupported, curve) } diff --git a/keys/keys_test.go b/keys/keys_test.go index a0c1d7112..9b31b805d 100644 --- a/keys/keys_test.go +++ b/keys/keys_test.go @@ -74,6 +74,15 @@ func TestGenerateKeypairEdwards25519(t *testing.T) { assert.Len(t, keypair.PrivateKey, PrivKeyBytesLen) } +func TestGenerateKeypairPallas(t *testing.T) { + curve := types.Pallas + keypair, err := GenerateKeypair(curve) + + assert.NoError(t, err) + assert.Equal(t, keypair.PublicKey.CurveType, curve) + assert.Len(t, keypair.PrivateKey, PrivKeyBytesLen) +} + func mockKeyPair(privKey []byte, curveType types.CurveType) *KeyPair { keypair, _ := GenerateKeypair(curveType) keypair.PrivateKey = privKey @@ -125,8 +134,14 @@ func TestImportPrivateKey(t *testing.T) { types.Secp256k1, nil, }, + "simple Pallas": { + "92D872DA7B3C90CF69D347908C3D3D692EA033A1D6E4A1695FCDCF6BBED87F37", + types.Pallas, + nil, + }, "short ed25519": {"asd", types.Secp256k1, ErrPrivKeyUndecodable}, "short Secp256k1": {"asd", types.Edwards25519, ErrPrivKeyUndecodable}, + "short pallas": {"asd", types.Pallas, ErrPrivKeyUndecodable}, "long ed25519": { "aeb121b4c545f0f850e1480492508c65a250e9965b0d90176fab4d7506398ebbaeb121b4c545f0f850e1480492508c65a250e9965b0d90176fab4d7506398ebb", // nolint:lll types.Secp256k1, @@ -137,6 +152,11 @@ func TestImportPrivateKey(t *testing.T) { types.Edwards25519, ErrPrivKeyLengthInvalid, }, + "long Pallas": { + "92D872DA7B3C90CF69D347908C3D3D692EA033A1D6E4A1695FCDCF6BBED87F3792D872DA7B3C90CF69D347908C3D3D692EA033A1D6E4A1695FCDCF6BBED87F37", // nolint:lll + types.Pallas, + ErrPrivKeyLengthInvalid, + }, } for name, test := range importPrivKeyTests {