github.com/mavryk-network/mvgo@v1.19.9/mavryk/key_test.go (about)

     1  // Copyright (c) 2020-2022 Blockwatch Data Inc.
     2  // Author: alex@blockwatch.cc
     3  
     4  package mavryk
     5  
     6  import (
     7  	"testing"
     8  )
     9  
    10  func TestKey(t *testing.T) {
    11  	type testcase struct {
    12  		Address Address
    13  		Priv    string
    14  		Pub     string
    15  		Pass    string
    16  	}
    17  
    18  	cases := []testcase{
    19  		// ed25519 unencrypted
    20  		{
    21  			Priv:    "edsk4FTF78Qf1m2rykGpHqostAiq5gYW4YZEoGUSWBTJr2njsDHSnd",
    22  			Pub:     "edpkv45regue1bWtuHnCgLU8xWKLwa9qRqv4gimgJKro4LSc3C5VjV",
    23  			Address: MustParseAddress("mv1949pcbqwGsHfUCaVmNVRu21Cd4SnbpvpP"),
    24  		},
    25  		// secp256k1 unencrypted
    26  		{
    27  			Priv:    "spsk2oTAhiaSywh9ctt8yZLRxL3bo8Mayd3hKFi5iBaoqj2R8bx7ow",
    28  			Pub:     "sppk7auhfZa5wAcR8hk3WCw47kHgG3Pp8zaP3ctdAqdDd2dBAeZBof1",
    29  			Address: MustParseAddress("mv2h5E4ioj7VJVaQZcKxx4jZGH8wK45EEUxc"),
    30  		},
    31  		// p256 unencrypted
    32  		{
    33  			Priv:    "p2sk35q9MJHLN1SBHNhKq7oho1vnZL28bYfsSKDUrDn2e4XVcp6ohZ",
    34  			Pub:     "p2pk64zMPtYav6yiaHV2DhSQ65gbKMr3gkLQtK7TTQCpJEVUhxxEnxo",
    35  			Address: MustParseAddress("mv3HZmYPLDjLYmRxv99GyRNHcAmCeVNVMgDR"),
    36  		},
    37  		// bls12_381 unencrypted
    38  		// {
    39  		//     Priv:    "BLsk1eGhiPQXKtvvkBeXzmtVVJs6KPhEF45drF7MLjoCDcSnTGuyjL",
    40  		//     Pub:     "BLpk1ur5XXicWYMMzCVZZWyLZhybtyX8Zot2uCzDCZW8KcC5BdZiLVXRZvZzi4GuZYL9SarUvKpE",
    41  		//     Address: MustParseAddress("tz4TFJdv9Jd44FtBMAxi3KQT7AtazhVyaPa6"),
    42  		// },
    43  		// ed25519 encrypted
    44  		{
    45  			Priv:    "edesk1uiM6BaysskGto8pRtzKQqFqsy1sea1QRjTzaQYuBxYNhuN6eqEU78TGRXZocsVRJYcN7AaU9JDykwUd8KW",
    46  			Pub:     "edpkttVn1coEZNjcjjAF36jDXDB377imNiKCHqjdXSt85eVN779jfX",
    47  			Address: MustParseAddress("mv19gsGLshxzWJnZUSZZJuGaPpqFhbqZb755"),
    48  			Pass:    "foo",
    49  		},
    50  		// secp256k1 encrypted
    51  		{
    52  			Priv:    "spesk246GnDVaqGoYZvKbjrWM1g6xUXnyETXtwZgEYFnP8BQXcaS4rfQQco7C94D1yBmcL1v46Sqy8fXrhBSM7TW",
    53  			Pub:     "sppk7aSJpAzeXNTaobig65si221WTqgPh8mJsCJSAiZU7asJkWBVGyx",
    54  			Address: MustParseAddress("mv2M7pzvxfyC5mJEr8gVJUG44Aq5HtG6mUQV"),
    55  			Pass:    "foo",
    56  		},
    57  		// p256 encrypted
    58  		{
    59  			Priv:    "p2esk27ocLPLp1JkTWfxByXysGyB7MBDURYJAzAGJLR3XSEV9Nq8wFFdDVXVTwvCwR7Ne2dcUveamjXbvZf3on6T",
    60  			Pub:     "p2pk66vAYU7rN1ckJMp38Z9pXCrkiZCVyi6KyeMwhY69h5WDPHdMecH",
    61  			Address: MustParseAddress("mv3CwX4KpwPXcoU9hw4VFtNUpkcadtynsrxB"),
    62  			Pass:    "foo",
    63  		},
    64  	}
    65  
    66  	for i, c := range cases {
    67  		if !IsPrivateKey(c.Priv) {
    68  			t.Errorf("Case %d - Expected private key", i)
    69  		}
    70  		if !IsPublicKey(c.Pub) {
    71  			t.Errorf("Case %d - Expected public key", i)
    72  		}
    73  		if c.Pass != "" && !IsEncryptedKey(c.Priv) {
    74  			t.Errorf("Case %d - Expected encrypted key", i)
    75  		}
    76  
    77  		sk, err := ParseEncryptedPrivateKey(c.Priv, func() ([]byte, error) { return []byte(c.Pass), nil })
    78  		if err != nil {
    79  			t.Errorf("Case %d - Parsing key %s: %v", i, c.Priv, err)
    80  		}
    81  		if !sk.IsValid() {
    82  			t.Errorf("Case %d - Expected valid key %s", i, c.Priv)
    83  		}
    84  
    85  		pk, err := ParseKey(c.Pub)
    86  		if err != nil {
    87  			t.Errorf("Case %d - Parsing pubkey %s: %v", i, c.Pub, err)
    88  		}
    89  		if !pk.IsValid() {
    90  			t.Errorf("Case %d - Expected valid pubkey %s", i, c.Priv)
    91  		}
    92  
    93  		// generate pk from sk
    94  		if check := sk.Public(); !check.IsEqual(pk) {
    95  			t.Errorf("Case %d - Mismatch pk have=%s want=%s", i, check, pk)
    96  		}
    97  
    98  		// address from pk
    99  		if got, want := pk.Address(), c.Address; !got.Equal(want) {
   100  			t.Errorf("Case %d - Mismatch address got=%s want=%s", i, got, want)
   101  		}
   102  	}
   103  }
   104  
   105  func TestSign(t *testing.T) {
   106  	type testcase struct {
   107  		Priv    string
   108  		Pub     string
   109  		Msg     string
   110  		Digest  string
   111  		Sig     string
   112  		Generic string
   113  	}
   114  
   115  	cases := []testcase{
   116  		// ed25519 unencrypted
   117  		{
   118  			Priv: "edsk4FTF78Qf1m2rykGpHqostAiq5gYW4YZEoGUSWBTJr2njsDHSnd",
   119  			Pub:  "edpkv45regue1bWtuHnCgLU8xWKLwa9qRqv4gimgJKro4LSc3C5VjV",
   120  			Msg:  "hello",
   121  		},
   122  		// secp256k1 unencrypted
   123  		{
   124  			Priv: "spsk2oTAhiaSywh9ctt8yZLRxL3bo8Mayd3hKFi5iBaoqj2R8bx7ow",
   125  			Pub:  "sppk7auhfZa5wAcR8hk3WCw47kHgG3Pp8zaP3ctdAqdDd2dBAeZBof1",
   126  			Msg:  "hello",
   127  		},
   128  		// p256 unencrypted
   129  		{
   130  			Priv: "p2sk35q9MJHLN1SBHNhKq7oho1vnZL28bYfsSKDUrDn2e4XVcp6ohZ",
   131  			Pub:  "p2pk64zMPtYav6yiaHV2DhSQ65gbKMr3gkLQtK7TTQCpJEVUhxxEnxo",
   132  			Msg:  "hello",
   133  		},
   134  	}
   135  
   136  	for i, c := range cases {
   137  		digest := Digest([]byte(c.Msg))
   138  		sk := MustParsePrivateKey(c.Priv)
   139  		pk := sk.Public()
   140  		sig, err := sk.Sign(digest[:])
   141  		if err != nil {
   142  			t.Errorf("Case %d - Signing failed: %v", i, err)
   143  		}
   144  		if !sig.IsValid() {
   145  			t.Errorf("Case %d - Invalid signature %s", i, sig)
   146  		}
   147  		if err := pk.Verify(digest[:], sig); err != nil {
   148  			t.Errorf("Case %d - Verify failed %v", i, err)
   149  		}
   150  		if err := pk.Verify(digest[:], MustParseSignature(sig.Generic())); err != nil {
   151  			t.Errorf("Case %d - Verify generic failed %v", i, err)
   152  		}
   153  	}
   154  }