github.com/piotrnar/gocoin@v0.0.0-20240512203912-faa0448c5e96/lib/secp256k1/ec_test.go (about) 1 package secp256k1 2 3 import ( 4 "encoding/hex" 5 "testing" 6 ) 7 8 var ta = [][3]string{ 9 // [0]-pubScr, [1]-sigScript, [2]-unsignedTx 10 { 11 "040eaebcd1df2df853d66ce0e1b0fda07f67d1cabefde98514aad795b86a6ea66dbeb26b67d7a00e2447baeccc8a4cef7cd3cad67376ac1c5785aeebb4f6441c16", 12 "3045022100fe00e013c244062847045ae7eb73b03fca583e9aa5dbd030a8fd1c6dfcf11b1002207d0d04fed8fa1e93007468d5a9e134b0a7023b6d31db4e50942d43a250f4d07c01", 13 "3382219555ddbb5b00e0090f469e590ba1eae03c7f28ab937de330aa60294ed6", 14 }, 15 { 16 "020eaebcd1df2df853d66ce0e1b0fda07f67d1cabefde98514aad795b86a6ea66d", 17 "3045022100fe00e013c244062847045ae7eb73b03fca583e9aa5dbd030a8fd1c6dfcf11b1002207d0d04fed8fa1e93007468d5a9e134b0a7023b6d31db4e50942d43a250f4d07c01", 18 "3382219555ddbb5b00e0090f469e590ba1eae03c7f28ab937de330aa60294ed6", 19 }, 20 { 21 "0411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3", 22 "304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901", 23 "7a05c6145f10101e9d6325494245adf1297d80f8f38d4d576d57cdba220bcb19", 24 }, 25 { 26 "0311db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5c", 27 "304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901", 28 "7a05c6145f10101e9d6325494245adf1297d80f8f38d4d576d57cdba220bcb19", 29 }, 30 { 31 "0428f42723f81c70664e200088437282d0e11ae0d4ae139f88bdeef1550471271692970342db8e3f9c6f0123fab9414f7865d2db90c24824da775f00e228b791fd", 32 "3045022100d557da5d9bf886e0c3f98fd6d5d337487cd01d5b887498679a57e3d32bd5d0af0220153217b63a75c3145b14f58c64901675fe28dba2352c2fa9f2a1579c74a2de1701", 33 "c22de395adbb0720941e009e8a4e488791b2e428af775432ed94d2c7ec8e421a", 34 }, 35 { 36 "0328f42723f81c70664e200088437282d0e11ae0d4ae139f88bdeef15504712716", 37 "3045022100d557da5d9bf886e0c3f98fd6d5d337487cd01d5b887498679a57e3d32bd5d0af0220153217b63a75c3145b14f58c64901675fe28dba2352c2fa9f2a1579c74a2de1701", 38 "c22de395adbb0720941e009e8a4e488791b2e428af775432ed94d2c7ec8e421a", 39 }, 40 { 41 "041f2a00036b3cbd1abe71dca54d406a1e9dd5d376bf125bb109726ff8f2662edcd848bd2c44a86a7772442095c7003248cc619bfec3ddb65130b0937f8311c787", 42 "3045022100ec6eb6b2aa0580c8e75e8e316a78942c70f46dd175b23b704c0330ab34a86a34022067a73509df89072095a16dbf350cc5f1ca5906404a9275ebed8a4ba219627d6701", 43 "7c8e7c2cb887682ed04dc82c9121e16f6d669ea3d57a2756785c5863d05d2e6a", 44 }, 45 { 46 "031f2a00036b3cbd1abe71dca54d406a1e9dd5d376bf125bb109726ff8f2662edc", 47 "3045022100ec6eb6b2aa0580c8e75e8e316a78942c70f46dd175b23b704c0330ab34a86a34022067a73509df89072095a16dbf350cc5f1ca5906404a9275ebed8a4ba219627d6701", 48 "7c8e7c2cb887682ed04dc82c9121e16f6d669ea3d57a2756785c5863d05d2e6a", 49 }, 50 { 51 "04ee90bfdd4e07eb1cfe9c6342479ca26c0827f84bfe1ab39e32fc3e94a0fe00e6f7d8cd895704e974978766dd0f9fad3c97b1a0f23684e93b400cc9022b7ae532", 52 "3045022100fe1f6e2c2c2cbc916f9f9d16497df2f66a4834e5582d6da0ee0474731c4a27580220682bad9359cd946dc97bb07ea8fad48a36f9b61186d47c6798ccce7ba20cc22701", 53 "baff983e6dfb1052918f982090aa932f56d9301d1de9a726d2e85d5f6bb75464", 54 }, 55 } 56 57 func TestVerify1(t *testing.T) { 58 for i := range ta { 59 pkey, _ := hex.DecodeString(ta[i][0]) 60 sign, _ := hex.DecodeString(ta[i][1]) 61 hasz, _ := hex.DecodeString(ta[i][2]) 62 63 res := ecdsa_verify(pkey, sign, hasz) 64 if res != 1 { 65 t.Fatal("Verify failed at", i) 66 } 67 68 hasz[0]++ 69 res = ecdsa_verify(pkey, sign, hasz) 70 if res != 0 { 71 t.Error("Verify not failed while it should", i) 72 } 73 res = ecdsa_verify(pkey[:1], sign, hasz) 74 if res >= 0 { 75 t.Error("Negative result expected", res, i) 76 } 77 res = ecdsa_verify(pkey, sign[:1], hasz) 78 if res >= 0 { 79 t.Error("Yet negative result expected", res, i) 80 } 81 res = ecdsa_verify(pkey, sign, hasz[:1]) 82 if res != 0 { 83 t.Error("Zero expected", res, i) 84 } 85 } 86 } 87 88 func BenchmarkVerifyUncompressed(b *testing.B) { 89 key, _ := hex.DecodeString("040eaebcd1df2df853d66ce0e1b0fda07f67d1cabefde98514aad795b86a6ea66dbeb26b67d7a00e2447baeccc8a4cef7cd3cad67376ac1c5785aeebb4f6441c16") 90 sig, _ := hex.DecodeString("3045022100fe00e013c244062847045ae7eb73b03fca583e9aa5dbd030a8fd1c6dfcf11b1002207d0d04fed8fa1e93007468d5a9e134b0a7023b6d31db4e50942d43a250f4d07c01") 91 msg, _ := hex.DecodeString("3382219555ddbb5b00e0090f469e590ba1eae03c7f28ab937de330aa60294ed6") 92 b.ResetTimer() 93 for i := 0; i < b.N; i++ { 94 ecdsa_verify(key, sig, msg) 95 } 96 } 97 98 func BenchmarkVerifyCompressed(b *testing.B) { 99 key_compr, _ := hex.DecodeString("020eaebcd1df2df853d66ce0e1b0fda07f67d1cabefde98514aad795b86a6ea66d") 100 sig, _ := hex.DecodeString("3045022100fe00e013c244062847045ae7eb73b03fca583e9aa5dbd030a8fd1c6dfcf11b1002207d0d04fed8fa1e93007468d5a9e134b0a7023b6d31db4e50942d43a250f4d07c01") 101 msg, _ := hex.DecodeString("3382219555ddbb5b00e0090f469e590ba1eae03c7f28ab937de330aa60294ed6") 102 b.ResetTimer() 103 for i := 0; i < b.N; i++ { 104 ecdsa_verify(key_compr, sig, msg) 105 } 106 } 107 108 func TestECmult(t *testing.T) { 109 var u1, u2 Number 110 var pubkeyj, expres, pr XYZ 111 112 pubkeyj.X.SetHex("0EAEBCD1DF2DF853D66CE0E1B0FDA07F67D1CABEFDE98514AAD795B86A6EA66D") 113 pubkeyj.Y.SetHex("BEB26B67D7A00E2447BAECCC8A4CEF7CD3CAD67376AC1C5785AEEBB4F6441C16") 114 pubkeyj.Z.SetHex("0000000000000000000000000000000000000000000000000000000000000001") 115 116 u1.set_hex("B618EBA71EC03638693405C75FC1C9ABB1A74471BAAF1A3A8B9005821491C4B4") 117 u2.set_hex("8554470195DE4678B06EDE9F9286545B51FF2D9AA756CE35A39011783563EA60") 118 119 expres.X.SetHex("EB6752420B6BDB40A760AC26ADD7E7BBD080BF1DF6C0B009A0D310E4511BDF49") 120 expres.Y.SetHex("8E8CEB84E1502FC536FFE67967BC44314270A0B38C79865FFED5A85D138DCA6B") 121 expres.Z.SetHex("813925AF112AAB8243F8CCBADE4CC7F63DF387263028DE6E679232A73A7F3C31") 122 123 pubkeyj.ECmult(&pr, &u2, &u1) 124 if !pr.Equals(&expres) { 125 t.Error("ECmult failed") 126 pr.Print("got") 127 expres.Print("exp") 128 } 129 } 130 131 type wnafvec struct { 132 inp string 133 w uint 134 exp []int 135 } 136 137 func TestWNAF(t *testing.T) { 138 var wnaf [129]int 139 var testvcs = []wnafvec{ 140 { 141 "3271156f58b59bd7aa542ca6972c1910", WINDOW_A, 142 []int{0, 0, 0, 0, -15, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, -9, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, -11, 0, 0, 0, 0, 13, 0, 0, 0, 0, 1, 0, 0, 0, 0, -11, 0, 0, 0, 0, -11, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 11, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 15, 0, 0, 0, 0, 11, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, -15, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 3}, 143 }, 144 { 145 "0a8a5afcb465a43b8277801311860430", WINDOW_A, 146 []int{0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, -15, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -9, 0, 0, 0, 0, 0, 0, -15, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, -13, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -5, 0, 0, 0, 0, -13, 0, 0, 0, 0, 3, 0, 0, 0, 0, -11, 0, 0, 0, 0, 1}, 147 }, 148 { 149 "b1a74471baaf1a3a8b9005821491c4b4", WINDOW_G, 150 []int{0, 0, -3795, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2633, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5959, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1679, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11}, 151 }, 152 { 153 "b618eba71ec03638693405c75fc1c9ab", WINDOW_G, 154 []int{2475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6369, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1457}, 155 }, 156 } 157 for idx := range testvcs { 158 var xxx Number 159 xxx.set_hex(testvcs[idx].inp) 160 bits := ecmult_wnaf(wnaf[:], &xxx, testvcs[idx].w) 161 if bits != len(testvcs[idx].exp) { 162 t.Error("Bad bits at idx", idx) 163 } 164 for i := range testvcs[idx].exp { 165 if wnaf[i] != testvcs[idx].exp[i] { 166 t.Error("Bad val at idx", idx, i) 167 } 168 } 169 } 170 } 171 172 func TestPrecompileGej(t *testing.T) { 173 var exp, a XYZ 174 175 a.X.SetHex("0eaebcd1df2df853d66ce0e1b0fda07f67d1cabefde98514aad795b86a6ea66d") 176 a.Y.SetHex("beb26b67d7a00e2447baeccc8a4cef7cd3cad67376ac1c5785aeebb4f6441c16") 177 a.Z.SetHex("01") 178 exp.X.SetHex("ce5dcac5e26ab63868ead1440f359aff29d7ffade62abe801bca97b471bcd416") 179 exp.Y.SetHex("0cc6f63793a207751d507aa4be629f0776441e4873548095bd6d39d34ce8a9d7") 180 exp.Z.SetHex("122927e4908740d51df1f03dc921c00fef68c542e7f28aa270862619cf971815") 181 pre := a.precomp(WINDOW_A) 182 if len(pre) != 8 { 183 t.Error("Bad result length") 184 } 185 if !pre[7].Equals(&exp) { 186 t.Error("Unexpcted value") 187 } 188 189 a.X.SetHex("a45720c272cfa1f77f64be8a404a7d3149bd5410f9a173353f6eb75a5085ba98") 190 a.Y.SetHex("beb26b67d7a00e2447baeccc8a4cef7cd3cad67376ac1c5785aeebb4f6441c16") 191 a.Z.SetHex("01") 192 exp.X.SetHex("ce5dcac5e26ab63868ead1440f359aff29d7ffade62abe801bca97b471bcd416") 193 exp.Y.SetHex("0cc6f63793a207751d507aa4be629f0776441e4873548095bd6d39d34ce8a9d7") 194 exp.Z.SetHex("49f0fb9f1840e7a58d485c6cc394e597e521bf7d4598be2b367c27326949e507") 195 pre = a.precomp(WINDOW_A) 196 if len(pre) != 8 { 197 t.Error("Bad result length") 198 } 199 if !pre[7].Equals(&exp) { 200 t.Error("Unexpcted value") 201 } 202 } 203 204 func TestMultGen(t *testing.T) { 205 var nonce Number 206 var ex, ey, ez Field 207 var r XYZ 208 nonce.set_hex("9E3CD9AB0F32911BFDE39AD155F527192CE5ED1F51447D63C4F154C118DA598E") 209 ECmultGen(&r, &nonce) 210 ex.SetHex("02D1BF36D37ACD68E4DD00DB3A707FD176A37E42F81AEF9386924032D3428FF0") 211 ey.SetHex("FD52E285D33EC835230EA69F89D9C38673BD5B995716A4063C893AF02F938454") 212 ez.SetHex("4C6ACE7C8C062A1E046F66FD8E3981DC4E8E844ED856B5415C62047129268C1B") 213 r.X.Normalize() 214 r.Y.Normalize() 215 r.Z.Normalize() 216 if !ex.Equals(&r.X) { 217 t.Error("Bad X") 218 } 219 if !ey.Equals(&r.Y) { 220 t.Error("Bad Y") 221 } 222 if !ez.Equals(&r.Z) { 223 t.Error("Bad Y") 224 } 225 }