github.com/piotrnar/gocoin@v0.0.0-20240512203912-faa0448c5e96/lib/btc/key_test.go (about) 1 package btc 2 3 import ( 4 // "math/big" 5 "encoding/hex" 6 "testing" 7 ) 8 9 func TestPbkyues(t *testing.T) { 10 var tstvcs = []string { 11 "04CEB28DE33FBC5ED8B343DE5B00E68A53B73653C204D236694BE2C2DD6A959AEB450163075FAE68D21D5EA9E2D07FE8742229AFAF02983034E84C614D16CF7107", 12 "03CEB28DE33FBC5ED8B343DE5B00E68A53B73653C204D236694BE2C2DD6A959AEB", 13 14 "0476232786465DE7FD05B68DB84A3C1D84AAEF2928E907D99969196383E71717A9F73B5631781A152BDBF3037AB605573A8D18E7628339EB8C4A8280E5D2E161EA", 15 "0276232786465DE7FD05B68DB84A3C1D84AAEF2928E907D99969196383E71717A9", 16 17 "04672E9066C6A7980359514621D1FE787CCD5B6539B67614B940929723BDF5623C1216E7F69AAE46FED4621DE63CA6EE1251BCC584C2362B7040DEF99F668C810B", 18 "03672E9066C6A7980359514621D1FE787CCD5B6539B67614B940929723BDF5623C", 19 20 "04B0B9D37E47380CB037C422365779C169723E4D05C300B7A8BD4A48A9B4E60F0647DEA3378908B133D69BB3E0943CCCF6872C0A94678166D819FEA558B96A812D", 21 "03B0B9D37E47380CB037C422365779C169723E4D05C300B7A8BD4A48A9B4E60F06", 22 23 "0491643DB1E5096E72FAF027D65A79085320186734BC4A5416B5F747F8761551566AD3B3EC7AA0360DEE4EBCCDBCB6FC5260881B9C747E10C671519D8713FFA4F5", 24 "0391643DB1E5096E72FAF027D65A79085320186734BC4A5416B5F747F876155156", 25 26 "04BD22E9E7AE9238EBD7937DCAF2887535B13DEB2EF9E95D5FB9225D29BDCD450FC99915A84D69CBA5E1EA1A11D6E9C49C039B949EE135B0133FEFCE156064A708", 27 "02BD22E9E7AE9238EBD7937DCAF2887535B13DEB2EF9E95D5FB9225D29BDCD450F", 28 29 "04FC0C0989BF1EC12C483AB65A63792DF96F74059DE1CB1B6599F3217A6E4957C2A9051A5FB9C15D13BBCC2FAEFF50F1BDE56BC692760A5D92DBFD52D2764BF723", 30 "03FC0C0989BF1EC12C483AB65A63792DF96F74059DE1CB1B6599F3217A6E4957C2", 31 32 "04259EB3B0BE2E1A92958F353450FD499E158E16C526C582F4016A2F05E2A5D78FEB2B208DDF07239278922A286E97672841EFE4C23C434D44472DAF777D50F145", 33 "03259EB3B0BE2E1A92958F353450FD499E158E16C526C582F4016A2F05E2A5D78F", 34 35 "046950778CC3F5B35FB74280770FE038C292C92705887F90FC1B2E184F578EFBC554DF9356EA840217D26E7E557C9D07F29C1BF8406C7DFA2BCA15891FCB8F8173", 36 "036950778CC3F5B35FB74280770FE038C292C92705887F90FC1B2E184F578EFBC5", 37 38 "04BF528DCFBAD67F851EE9B378590EDD42A585FD2D4BFD3E70B9DAD822CE4B2BBDDDDECD0FBD948013A29CBECD19FB96A23C8AAF741F85FF12505588AD106CFB24", 39 "02BF528DCFBAD67F851EE9B378590EDD42A585FD2D4BFD3E70B9DAD822CE4B2BBD", 40 41 "049F2F10A61354C2ADF5C5A9B82E2CFC4A209F8C5BA9B29B7DC8B56574105E4B80D484D98F6FD138B0DA7915B6E343D1E67DFA4A96FE4AD1B6AC52E0DAD3C01E66", 42 "029F2F10A61354C2ADF5C5A9B82E2CFC4A209F8C5BA9B29B7DC8B56574105E4B80", 43 44 "0458C19BD334283CD9935E14A10028B8B836685260E69F5AFA3FED459953A1FCBB55AC2CF10CCE64B372361A97D8C1D3A900838978C508C67B6B12BD376F705EEF", 45 "0358C19BD334283CD9935E14A10028B8B836685260E69F5AFA3FED459953A1FCBB", 46 47 "04C92EF93E2B187248460BDEDD1E340B198BD19B800AF5FBEDC3B0010A42E5B28641F4B7964B1AF6987BAAC2DAD2C6A3C0F1FBADD1ACF652721077A4DF5F502F3A", 48 "02C92EF93E2B187248460BDEDD1E340B198BD19B800AF5FBEDC3B0010A42E5B286", 49 } 50 for i:=0; i<len(tstvcs); i+=2 { 51 xy, _ := hex.DecodeString(tstvcs[i]) 52 x, _ := hex.DecodeString(tstvcs[i+1]) 53 k1, e := NewPublicKey(xy) 54 if e != nil { 55 t.Error("error new k1") 56 return 57 } 58 k2, e := NewPublicKey(x) 59 if e != nil { 60 t.Error("error new k2") 61 return 62 } 63 if !k1.X.Equals(&k2.X) { 64 t.Error("X error", i) 65 return 66 } 67 if !k1.Y.Equals(&k2.Y) { 68 t.Error("Y error", i) 69 return 70 } 71 } 72 } 73 74 75 /* 76 If it was up to me, this test should not pass, but we need to follow the original 77 implementation, because such an inconsistent signatures have been mined alredy. 78 See more comments about it at the end of NewSignature() in key.go 79 */ 80 func TestSignature(t *testing.T) { 81 raw, _ := hex.DecodeString("3045022034e4786cf22cd00b45faff8afc3b8789c924378176d934adee0d3b3f4a8bf0dc022100b658dd07beeede1f792d238c3ee29c25200f3b834662f9c900bb4d065526dac90001") 82 s, e := NewSignature(raw) 83 if e != nil { 84 t.Error(e.Error()) 85 return 86 } 87 if s.HashType!=1 { 88 t.Error("HashType", s.HashType) 89 return 90 } 91 } 92 93 94 func BenchmarkKey02swap(b *testing.B) { 95 xy, _ := hex.DecodeString("02BD22E9E7AE9238EBD7937DCAF2887535B13DEB2EF9E95D5FB9225D29BDCD450F") 96 for i := 0; i < b.N; i++ { 97 NewPublicKey(xy) 98 } 99 } 100 101 func BenchmarkKey02nswa(b *testing.B) { 102 xy, _ := hex.DecodeString("0276232786465DE7FD05B68DB84A3C1D84AAEF2928E907D99969196383E71717A9") 103 for i := 0; i < b.N; i++ { 104 NewPublicKey(xy) 105 } 106 } 107 108 func BenchmarkKey03swap(b *testing.B) { 109 xy, _ := hex.DecodeString("03672E9066C6A7980359514621D1FE787CCD5B6539B67614B940929723BDF5623C") 110 for i := 0; i < b.N; i++ { 111 NewPublicKey(xy) 112 } 113 } 114 115 func BenchmarkKey03nswa(b *testing.B) { 116 xy, _ := hex.DecodeString("03CEB28DE33FBC5ED8B343DE5B00E68A53B73653C204D236694BE2C2DD6A959AEB") 117 for i := 0; i < b.N; i++ { 118 NewPublicKey(xy) 119 } 120 } 121 122 func BenchmarkKey04full(b *testing.B) { 123 xy, _ := hex.DecodeString("049F2F10A61354C2ADF5C5A9B82E2CFC4A209F8C5BA9B29B7DC8B56574105E4B80D484D98F6FD138B0DA7915B6E343D1E67DFA4A96FE4AD1B6AC52E0DAD3C01E66") 124 for i := 0; i < b.N; i++ { 125 NewPublicKey(xy) 126 } 127 } 128 129 130 type vervec struct { 131 addr string 132 signature string 133 message string 134 expected bool 135 } 136 137 func TestVerifyMessage(t *testing.T) { 138 var testvcs = []vervec { 139 { 140 "13XSgyGGJcUso5f1EK8LZ7j194FtEvTfkn", 141 "H2AoueOjHJ5yX8vX1dFnNqqq/Mm/FX37S+Yry88JadSIA21KNvojW4+fgVqm9UV6YH+VanGgNb8JcNhXi/IYu1o=", 142 "rel net msg", 143 true, 144 }, 145 { 146 "mqMmY5Uc6AgWoemdbRsvkpTes5hF6p5d8w", 147 "H+HUh1GiTw22BMhqRwbSET/4aYCFIuivSgTyU/A+qH7xZp5gz61zp//WMFTbpNDbiMYoYz7pD88NYg/0DekcMpY=", 148 "test", 149 true, 150 }, 151 { 152 "muTPoTTXbVWdurzw4aqTh7DLQ82RRE8hXz", 153 "H5iQmSJeZKrDcvKJrkAIOubFfajrxuPiSO0/xMorz+C31EyDF/bmkE+XLAihfkt3EQTEjxSgPURkdKxqJpxTw8Y=", 154 "This is some test message", 155 true, 156 }, 157 { 158 "mmS8FqnakrybtSzXSHXcGjeMfHUQqojx6Q", 159 "H0m1/OUAc1amV02c/bMF2Rdv2pJIPYfdSv5To3rax5O0eauXuexvafATfdLN1VFh/71SvpayMm3qoq2/9y+QQBA=", 160 "test", 161 true, 162 }, 163 { 164 "mpu4t3bSgcWneVDKdjB8JHcGu2RgXT6QhJ", 165 "H3PJeR3oSKwYfbiCFhzIpSbLjS3aZge2qMEi+gnB1ay+nNENnJo6uaejoVvo7+gBI3M7eU+jk5Jv91tj8DjOIxQ=", 166 "test", 167 true, 168 }, 169 { 170 "mwajpkz1ZthoAN3fvG8bCRvgoEf3BRraSP", 171 "H+TE9nhNgZXizuEySs8npLojQMAEhE0r1TpJCC3QxV4dd4l8AEN3smJH5ryw4IcHApJf6Z5m5hxz8Q0vnPd5aVw=", 172 "dlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibmwajpkz1ZthoAN3fvG8bCRvgoEf3BRraSPdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibmwajpkz1ZthoAN3fvG8bCRvgoEf3BRraSPdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoei", 173 true, 174 }, 175 { 176 "mmS8FqnakrybtSzXSHXcGjeMfHUQqojx6Q", 177 "H3PJeR3oSKwYfbiCFhzIpSbLjS3aZge2qMEi+gnB1ay+nNENnJo6uaejoVvo7+gBI3M7eU+jk5Jv91tj8DjOIxQ=", 178 "test", 179 false, 180 }, 181 { 182 "mqMmY5Uc6AgWoemdbRsvkpTes5hF6p5d8w", 183 "H+hUh1GiTw22BMhqRwbSET/4aYCFIuivSgTyU/A+qH7xZp5gz61zp//WMFTbpNDbiMYoYz7pD88NYg/0DekcMpY=", 184 "test", 185 false, 186 }, 187 { 188 "momBPYuZ42xGVBNC1DxQBKM3WT3fa8MLMn", 189 "ILRw4C+DSjqq+ie9K0ngcmnpYqUUEPNk6eGVwxNRoF5QVgl4rtdt6dXXgfh+0gaIMu1UXyshvwQGVKLa/2lMiwk=", 190 "test", 191 true, 192 }, 193 } 194 195 var hash [32]byte 196 for i := range testvcs { 197 ad, er := NewAddrFromString(testvcs[i].addr) 198 if er != nil { 199 t.Error(er.Error()) 200 } 201 202 nv, sig, er := ParseMessageSignature(testvcs[i].signature) 203 if er != nil { 204 t.Error(er.Error()) 205 } 206 207 HashFromMessage([]byte(testvcs[i].message), hash[:]) 208 209 compressed := nv>=31 210 if compressed { 211 nv -= 4 212 } 213 214 var verified_ok bool 215 pub := sig.RecoverPublicKey(hash[:], int(nv-27)) 216 if pub != nil { 217 sa := NewAddrFromPubkey(pub.Bytes(compressed), ad.Version) 218 if sa != nil { 219 verified_ok = ad.Hash160==sa.Hash160 220 } else { 221 t.Error("NewAddrFromPubkey failed") 222 } 223 } 224 if verified_ok != testvcs[i].expected { 225 t.Error("Result different than expected at index", i, verified_ok, testvcs[i].expected) 226 } 227 } 228 } 229 230 func BenchmarkRecoverKey(b *testing.B) { 231 var hash [32]byte 232 HashFromMessage([]byte("rel net msg"), hash[:]) 233 nv, sig, _ := ParseMessageSignature("H2AoueOjHJ5yX8vX1dFnNqqq/Mm/FX37S+Yry88JadSIA21KNvojW4+fgVqm9UV6YH+VanGgNb8JcNhXi/IYu1o=") 234 for i := 0; i < b.N; i++ { 235 sig.RecoverPublicKey(hash[:], int(nv-27)) 236 } 237 }