github.com/piotrnar/gocoin@v0.0.0-20240512203912-faa0448c5e96/lib/secp256k1/sig_test.go (about) 1 package secp256k1 2 3 import ( 4 "crypto/rand" 5 "encoding/hex" 6 "strconv" 7 "testing" 8 ) 9 10 func TestPrintArch(t *testing.T) { 11 println("Using field", FieldArch) 12 } 13 14 func TestSigRecover(t *testing.T) { 15 var vs = [][6]string{ 16 { 17 "6028b9e3a31c9e725fcbd7d5d16736aaaafcc9bf157dfb4be62bcbcf0969d488", 18 "036d4a36fa235b8f9f815aa6f5457a607f956a71a035bf0970d8578bf218bb5a", 19 "9cff3da1a4f86caf3683f865232c64992b5ed002af42b321b8d8a48420680487", 20 "0", 21 "56dc5df245955302893d8dda0677cc9865d8011bc678c7803a18b5f6faafec08", 22 "54b5fbdcd8fac6468dac2de88fadce6414f5f3afbb103753e25161bef77705a6", 23 }, 24 { 25 "b470e02f834a3aaafa27bd2b49e07269e962a51410f364e9e195c31351a05e50", 26 "560978aed76de9d5d781f87ed2068832ed545f2b21bf040654a2daff694c8b09", 27 "9ce428d58e8e4caf619dc6fc7b2c2c28f0561654d1f80f322c038ad5e67ff8a6", 28 "1", 29 "15b7e7d00f024bffcd2e47524bb7b7d3a6b251e23a3a43191ed7f0a418d9a578", 30 "bf29a25e2d1f32c5afb18b41ae60112723278a8af31275965a6ec1d95334e840", 31 }, 32 } 33 34 var sig Signature 35 var pubkey, exp XY 36 var msg Number 37 38 for i := range vs { 39 sig.R.set_hex(vs[i][0]) 40 sig.S.set_hex(vs[i][1]) 41 msg.set_hex(vs[i][2]) 42 rid, _ := strconv.ParseInt(vs[i][3], 10, 32) 43 exp.X.SetHex(vs[i][4]) 44 exp.Y.SetHex(vs[i][5]) 45 46 if sig.recover(&pubkey, &msg, int(rid)) { 47 if !exp.X.Equals(&pubkey.X) { 48 t.Error("X mismatch at vector", i) 49 } 50 if !exp.Y.Equals(&pubkey.Y) { 51 t.Error("Y mismatch at vector", i) 52 } 53 } else { 54 t.Error("sig.recover fialed") 55 } 56 } 57 } 58 59 func TestSigVerify(t *testing.T) { 60 var msg Number 61 var sig Signature 62 var key XY 63 64 msg.set_hex("3382219555ddbb5b00e0090f469e590ba1eae03c7f28ab937de330aa60294ed6") 65 sig.R.set_hex("fe00e013c244062847045ae7eb73b03fca583e9aa5dbd030a8fd1c6dfcf11b10") 66 sig.S.set_hex("7d0d04fed8fa1e93007468d5a9e134b0a7023b6d31db4e50942d43a250f4d07c") 67 xy, _ := hex.DecodeString("040eaebcd1df2df853d66ce0e1b0fda07f67d1cabefde98514aad795b86a6ea66dbeb26b67d7a00e2447baeccc8a4cef7cd3cad67376ac1c5785aeebb4f6441c16") 68 key.ParsePubkey(xy) 69 if !sig.Verify(&key, &msg) { 70 t.Error("sig.Verify 0") 71 } 72 73 msg.set_hex("D474CBF2203C1A55A411EEC4404AF2AFB2FE942C434B23EFE46E9F04DA8433CA") 74 sig.R.set_hex("98F9D784BA6C5C77BB7323D044C0FC9F2B27BAA0A5B0718FE88596CC56681980") 75 sig.S.set_hex("E3599D551029336A745B9FB01566624D870780F363356CEE1425ED67D1294480") 76 key.X.SetHex("7d709f85a331813f9ae6046c56b3a42737abf4eb918b2e7afee285070e968b93") 77 key.Y.SetHex("26150d1a63b342986c373977b00131950cb5fc194643cad6ea36b5157eba4602") 78 if !sig.Verify(&key, &msg) { 79 t.Error("sig.Verify 1") 80 } 81 82 msg.set_hex("2c43a883f4edc2b66c67a7a355b9312a565bb3d33bb854af36a06669e2028377") 83 sig.R.set_hex("6b2fa9344462c958d4a674c2a42fbedf7d6159a5276eb658887e2e1b3915329b") 84 sig.S.set_hex("eddc6ea7f190c14a0aa74e41519d88d2681314f011d253665f301425caf86b86") 85 xy, _ = hex.DecodeString("02a60d70cfba37177d8239d018185d864b2bdd0caf5e175fd4454cc006fd2d75ac") 86 key.ParsePubkey(xy) 87 if !sig.Verify(&key, &msg) { 88 t.Error("sig.Verify 2") 89 } 90 } 91 92 func TestSigSign(t *testing.T) { 93 var sec, msg, non Number 94 var sig Signature 95 var recid int 96 sec.set_hex("73641C99F7719F57D8F4BEB11A303AFCD190243A51CED8782CA6D3DBE014D146") 97 msg.set_hex("D474CBF2203C1A55A411EEC4404AF2AFB2FE942C434B23EFE46E9F04DA8433CA") 98 non.set_hex("9E3CD9AB0F32911BFDE39AD155F527192CE5ED1F51447D63C4F154C118DA598E") 99 res := sig.Sign(&sec, &msg, &non, &recid) 100 if res != 1 { 101 t.Error("res failed", res) 102 } 103 if FORCE_LOW_S { 104 if recid != 0 { 105 t.Error("recid failed", recid) 106 } 107 } else { 108 if recid != 1 { 109 t.Error("recid failed", recid) 110 } 111 } 112 non.set_hex("98f9d784ba6c5c77bb7323d044c0fc9f2b27baa0a5b0718fe88596cc56681980") 113 if sig.R.Cmp(&non.Int) != 0 { 114 t.Error("R failed", sig.R.String()) 115 } 116 if FORCE_LOW_S { 117 non.set_hex("1ca662aaefd6cc958ba4604fea999db133a75bf34c13334dabac7124ff0cfcc1") 118 } else { 119 non.set_hex("E3599D551029336A745B9FB01566624D870780F363356CEE1425ED67D1294480") 120 } 121 if sig.S.Cmp(&non.Int) != 0 { 122 t.Error("S failed", sig.S.String()) 123 } 124 } 125 126 func BenchmarkVerify(b *testing.B) { 127 var msg Number 128 var sig Signature 129 var key XY 130 msg.set_hex("D474CBF2203C1A55A411EEC4404AF2AFB2FE942C434B23EFE46E9F04DA8433CA") 131 sig.R.set_hex("98F9D784BA6C5C77BB7323D044C0FC9F2B27BAA0A5B0718FE88596CC56681980") 132 sig.S.set_hex("E3599D551029336A745B9FB01566624D870780F363356CEE1425ED67D1294480") 133 key.X.SetHex("7d709f85a331813f9ae6046c56b3a42737abf4eb918b2e7afee285070e968b93") 134 key.Y.SetHex("26150d1a63b342986c373977b00131950cb5fc194643cad6ea36b5157eba4602") 135 b.ResetTimer() 136 for i := 0; i < b.N; i++ { 137 if !sig.Verify(&key, &msg) { 138 b.Fatal("sig_verify failed") 139 } 140 } 141 } 142 143 func BenchmarkPrv2Pub(b *testing.B) { 144 var prv [32]byte 145 var pub [33]byte 146 rand.Read(prv[:]) 147 b.ResetTimer() 148 for i := 0; i < b.N; i++ { 149 BaseMultiply(prv[:], pub[:]) 150 } 151 } 152 153 func BenchmarkSign(b *testing.B) { 154 var sec, msg, non Number 155 var sig Signature 156 var recid int 157 sec.set_hex("73641C99F7719F57D8F4BEB11A303AFCD190243A51CED8782CA6D3DBE014D146") 158 msg.set_hex("D474CBF2203C1A55A411EEC4404AF2AFB2FE942C434B23EFE46E9F04DA8433CA") 159 non.set_hex("9E3CD9AB0F32911BFDE39AD155F527192CE5ED1F51447D63C4F154C118DA598E") 160 b.ResetTimer() 161 for i := 0; i < b.N; i++ { 162 sig.Sign(&sec, &msg, &non, &recid) 163 } 164 }