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 }