github.com/dashpay/godash@v0.0.0-20160726055534-e038a21e0e3d/btcec/btcec_test.go (about) 1 // Copyright 2011 The Go Authors. All rights reserved. 2 // Copyright 2011 ThePiachu. All rights reserved. 3 // Copyright 2013-2014 The btcsuite developers 4 // Copyright (c) 2016 The Dash developers 5 // Use of this source code is governed by an ISC 6 // license that can be found in the LICENSE file. 7 8 package btcec_test 9 10 import ( 11 "crypto/rand" 12 "crypto/sha1" 13 "encoding/hex" 14 "fmt" 15 "math/big" 16 "testing" 17 18 "github.com/dashpay/godash/btcec" 19 ) 20 21 // TestAddJacobian tests addition of points projected in Jacobian coordinates. 22 func TestAddJacobian(t *testing.T) { 23 tests := []struct { 24 x1, y1, z1 string // Coordinates (in hex) of first point to add 25 x2, y2, z2 string // Coordinates (in hex) of second point to add 26 x3, y3, z3 string // Coordinates (in hex) of expected point 27 }{ 28 // Addition with a point at infinity (left hand side). 29 // ∞ + P = P 30 { 31 "0", 32 "0", 33 "0", 34 "d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575", 35 "131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d", 36 "1", 37 "d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575", 38 "131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d", 39 "1", 40 }, 41 // Addition with a point at infinity (right hand side). 42 // P + ∞ = P 43 { 44 "d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575", 45 "131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d", 46 "1", 47 "0", 48 "0", 49 "0", 50 "d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575", 51 "131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d", 52 "1", 53 }, 54 55 // Addition with z1=z2=1 different x values. 56 { 57 "34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6", 58 "0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232", 59 "1", 60 "d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575", 61 "131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d", 62 "1", 63 "0cfbc7da1e569b334460788faae0286e68b3af7379d5504efc25e4dba16e46a6", 64 "e205f79361bbe0346b037b4010985dbf4f9e1e955e7d0d14aca876bfa79aad87", 65 "44a5646b446e3877a648d6d381370d9ef55a83b666ebce9df1b1d7d65b817b2f", 66 }, 67 // Addition with z1=z2=1 same x opposite y. 68 // P(x, y, z) + P(x, -y, z) = infinity 69 { 70 "34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6", 71 "0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232", 72 "1", 73 "34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6", 74 "f48e156428cf0276dc092da5856e182288d7569f97934a56fe44be60f0d359fd", 75 "1", 76 "0", 77 "0", 78 "0", 79 }, 80 // Addition with z1=z2=1 same point. 81 // P(x, y, z) + P(x, y, z) = 2P 82 { 83 "34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6", 84 "0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232", 85 "1", 86 "34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6", 87 "0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232", 88 "1", 89 "ec9f153b13ee7bd915882859635ea9730bf0dc7611b2c7b0e37ee64f87c50c27", 90 "b082b53702c466dcf6e984a35671756c506c67c2fcb8adb408c44dd0755c8f2a", 91 "16e3d537ae61fb1247eda4b4f523cfbaee5152c0d0d96b520376833c1e594464", 92 }, 93 94 // Addition with z1=z2 (!=1) different x values. 95 { 96 "d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718", 97 "5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190", 98 "2", 99 "5d2fe112c21891d440f65a98473cb626111f8a234d2cd82f22172e369f002147", 100 "98e3386a0a622a35c4561ffb32308d8e1c6758e10ebb1b4ebd3d04b4eb0ecbe8", 101 "2", 102 "cfbc7da1e569b334460788faae0286e68b3af7379d5504efc25e4dba16e46a60", 103 "817de4d86ef80d1ac0ded00426176fd3e787a5579f43452b2a1db021e6ac3778", 104 "129591ad11b8e1de99235b4e04dc367bd56a0ed99baf3a77c6c75f5a6e05f08d", 105 }, 106 // Addition with z1=z2 (!=1) same x opposite y. 107 // P(x, y, z) + P(x, -y, z) = infinity 108 { 109 "d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718", 110 "5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190", 111 "2", 112 "d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718", 113 "a470ab21467813b6e0496d2c2b70c11446bab4fcbc9a52b7f225f30e869aea9f", 114 "2", 115 "0", 116 "0", 117 "0", 118 }, 119 // Addition with z1=z2 (!=1) same point. 120 // P(x, y, z) + P(x, y, z) = 2P 121 { 122 "d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718", 123 "5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190", 124 "2", 125 "d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718", 126 "5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190", 127 "2", 128 "9f153b13ee7bd915882859635ea9730bf0dc7611b2c7b0e37ee65073c50fabac", 129 "2b53702c466dcf6e984a35671756c506c67c2fcb8adb408c44dd125dc91cb988", 130 "6e3d537ae61fb1247eda4b4f523cfbaee5152c0d0d96b520376833c2e5944a11", 131 }, 132 133 // Addition with z1!=z2 and z2=1 different x values. 134 { 135 "d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718", 136 "5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190", 137 "2", 138 "d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575", 139 "131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d", 140 "1", 141 "3ef1f68795a6ccd1181e23eab80a1b9a2cebdcde755413bf097936eb5b91b4f3", 142 "0bef26c377c068d606f6802130bb7e9f3c3d2abcfa1a295950ed81133561cb04", 143 "252b235a2371c3bd3246b69c09b86cf7aad41db3375e74ef8d8ebeb4dc0be11a", 144 }, 145 // Addition with z1!=z2 and z2=1 same x opposite y. 146 // P(x, y, z) + P(x, -y, z) = infinity 147 { 148 "d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718", 149 "5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190", 150 "2", 151 "34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6", 152 "f48e156428cf0276dc092da5856e182288d7569f97934a56fe44be60f0d359fd", 153 "1", 154 "0", 155 "0", 156 "0", 157 }, 158 // Addition with z1!=z2 and z2=1 same point. 159 // P(x, y, z) + P(x, y, z) = 2P 160 { 161 "d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718", 162 "5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190", 163 "2", 164 "34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6", 165 "0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232", 166 "1", 167 "9f153b13ee7bd915882859635ea9730bf0dc7611b2c7b0e37ee65073c50fabac", 168 "2b53702c466dcf6e984a35671756c506c67c2fcb8adb408c44dd125dc91cb988", 169 "6e3d537ae61fb1247eda4b4f523cfbaee5152c0d0d96b520376833c2e5944a11", 170 }, 171 172 // Addition with z1!=z2 and z2!=1 different x values. 173 // P(x, y, z) + P(x, y, z) = 2P 174 { 175 "d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718", 176 "5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190", 177 "2", 178 "91abba6a34b7481d922a4bd6a04899d5a686f6cf6da4e66a0cb427fb25c04bd4", 179 "03fede65e30b4e7576a2abefc963ddbf9fdccbf791b77c29beadefe49951f7d1", 180 "3", 181 "3f07081927fd3f6dadd4476614c89a09eba7f57c1c6c3b01fa2d64eac1eef31e", 182 "949166e04ebc7fd95a9d77e5dfd88d1492ecffd189792e3944eb2b765e09e031", 183 "eb8cba81bcffa4f44d75427506737e1f045f21e6d6f65543ee0e1d163540c931", 184 }, // Addition with z1!=z2 and z2!=1 same x opposite y. 185 // P(x, y, z) + P(x, -y, z) = infinity 186 { 187 "d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718", 188 "5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190", 189 "2", 190 "dcc3768780c74a0325e2851edad0dc8a566fa61a9e7fc4a34d13dcb509f99bc7", 191 "cafc41904dd5428934f7d075129c8ba46eb622d4fc88d72cd1401452664add18", 192 "3", 193 "0", 194 "0", 195 "0", 196 }, 197 // Addition with z1!=z2 and z2!=1 same point. 198 // P(x, y, z) + P(x, y, z) = 2P 199 { 200 "d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718", 201 "5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190", 202 "2", 203 "dcc3768780c74a0325e2851edad0dc8a566fa61a9e7fc4a34d13dcb509f99bc7", 204 "3503be6fb22abd76cb082f8aed63745b9149dd2b037728d32ebfebac99b51f17", 205 "3", 206 "9f153b13ee7bd915882859635ea9730bf0dc7611b2c7b0e37ee65073c50fabac", 207 "2b53702c466dcf6e984a35671756c506c67c2fcb8adb408c44dd125dc91cb988", 208 "6e3d537ae61fb1247eda4b4f523cfbaee5152c0d0d96b520376833c2e5944a11", 209 }, 210 } 211 212 t.Logf("Running %d tests", len(tests)) 213 for i, test := range tests { 214 // Convert hex to field values. 215 x1 := btcec.NewFieldVal().SetHex(test.x1) 216 y1 := btcec.NewFieldVal().SetHex(test.y1) 217 z1 := btcec.NewFieldVal().SetHex(test.z1) 218 x2 := btcec.NewFieldVal().SetHex(test.x2) 219 y2 := btcec.NewFieldVal().SetHex(test.y2) 220 z2 := btcec.NewFieldVal().SetHex(test.z2) 221 x3 := btcec.NewFieldVal().SetHex(test.x3) 222 y3 := btcec.NewFieldVal().SetHex(test.y3) 223 z3 := btcec.NewFieldVal().SetHex(test.z3) 224 225 // Ensure the test data is using points that are actually on 226 // the curve (or the point at infinity). 227 if !z1.IsZero() && !btcec.S256().TstIsJacobianOnCurve(x1, y1, z1) { 228 t.Errorf("#%d first point is not on the curve -- "+ 229 "invalid test data", i) 230 continue 231 } 232 if !z2.IsZero() && !btcec.S256().TstIsJacobianOnCurve(x2, y2, z2) { 233 t.Errorf("#%d second point is not on the curve -- "+ 234 "invalid test data", i) 235 continue 236 } 237 if !z3.IsZero() && !btcec.S256().TstIsJacobianOnCurve(x3, y3, z3) { 238 t.Errorf("#%d expected point is not on the curve -- "+ 239 "invalid test data", i) 240 continue 241 } 242 243 // Add the two points. 244 rx, ry, rz := btcec.NewFieldVal(), btcec.NewFieldVal(), btcec.NewFieldVal() 245 btcec.S256().TstAddJacobian(x1, y1, z1, x2, y2, z2, rx, ry, rz) 246 247 // Ensure result matches expected. 248 if !rx.Equals(x3) || !ry.Equals(y3) || !rz.Equals(z3) { 249 t.Errorf("#%d wrong result\ngot: (%v, %v, %v)\n"+ 250 "want: (%v, %v, %v)", i, rx, ry, rz, x3, y3, z3) 251 continue 252 } 253 } 254 } 255 256 // TestAddAffine tests addition of points in affine coordinates. 257 func TestAddAffine(t *testing.T) { 258 tests := []struct { 259 x1, y1 string // Coordinates (in hex) of first point to add 260 x2, y2 string // Coordinates (in hex) of second point to add 261 x3, y3 string // Coordinates (in hex) of expected point 262 }{ 263 // Addition with a point at infinity (left hand side). 264 // ∞ + P = P 265 { 266 "0", 267 "0", 268 "d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575", 269 "131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d", 270 "d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575", 271 "131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d", 272 }, 273 // Addition with a point at infinity (right hand side). 274 // P + ∞ = P 275 { 276 "d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575", 277 "131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d", 278 "0", 279 "0", 280 "d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575", 281 "131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d", 282 }, 283 284 // Addition with different x values. 285 { 286 "34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6", 287 "0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232", 288 "d74bf844b0862475103d96a611cf2d898447e288d34b360bc885cb8ce7c00575", 289 "131c670d414c4546b88ac3ff664611b1c38ceb1c21d76369d7a7a0969d61d97d", 290 "fd5b88c21d3143518d522cd2796f3d726793c88b3e05636bc829448e053fed69", 291 "21cf4f6a5be5ff6380234c50424a970b1f7e718f5eb58f68198c108d642a137f", 292 }, 293 // Addition with same x opposite y. 294 // P(x, y) + P(x, -y) = infinity 295 { 296 "34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6", 297 "0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232", 298 "34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6", 299 "f48e156428cf0276dc092da5856e182288d7569f97934a56fe44be60f0d359fd", 300 "0", 301 "0", 302 }, 303 // Addition with same point. 304 // P(x, y) + P(x, y) = 2P 305 { 306 "34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6", 307 "0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232", 308 "34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6", 309 "0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232", 310 "59477d88ae64a104dbb8d31ec4ce2d91b2fe50fa628fb6a064e22582196b365b", 311 "938dc8c0f13d1e75c987cb1a220501bd614b0d3dd9eb5c639847e1240216e3b6", 312 }, 313 } 314 315 t.Logf("Running %d tests", len(tests)) 316 for i, test := range tests { 317 // Convert hex to field values. 318 x1, y1 := fromHex(test.x1), fromHex(test.y1) 319 x2, y2 := fromHex(test.x2), fromHex(test.y2) 320 x3, y3 := fromHex(test.x3), fromHex(test.y3) 321 322 // Ensure the test data is using points that are actually on 323 // the curve (or the point at infinity). 324 if !(x1.Sign() == 0 && y1.Sign() == 0) && !btcec.S256().IsOnCurve(x1, y1) { 325 t.Errorf("#%d first point is not on the curve -- "+ 326 "invalid test data", i) 327 continue 328 } 329 if !(x2.Sign() == 0 && y2.Sign() == 0) && !btcec.S256().IsOnCurve(x2, y2) { 330 t.Errorf("#%d second point is not on the curve -- "+ 331 "invalid test data", i) 332 continue 333 } 334 if !(x3.Sign() == 0 && y3.Sign() == 0) && !btcec.S256().IsOnCurve(x3, y3) { 335 t.Errorf("#%d expected point is not on the curve -- "+ 336 "invalid test data", i) 337 continue 338 } 339 340 // Add the two points. 341 rx, ry := btcec.S256().Add(x1, y1, x2, y2) 342 343 // Ensure result matches expected. 344 if rx.Cmp(x3) != 00 || ry.Cmp(y3) != 0 { 345 t.Errorf("#%d wrong result\ngot: (%x, %x)\n"+ 346 "want: (%x, %x)", i, rx, ry, x3, y3) 347 continue 348 } 349 } 350 } 351 352 // TestDoubleJacobian tests doubling of points projected in Jacobian 353 // coordinates. 354 func TestDoubleJacobian(t *testing.T) { 355 tests := []struct { 356 x1, y1, z1 string // Coordinates (in hex) of point to double 357 x3, y3, z3 string // Coordinates (in hex) of expected point 358 }{ 359 // Doubling a point at infinity is still infinity. 360 { 361 "0", 362 "0", 363 "0", 364 "0", 365 "0", 366 "0", 367 }, 368 // Doubling with z1=1. 369 { 370 "34f9460f0e4f08393d192b3c5133a6ba099aa0ad9fd54ebccfacdfa239ff49c6", 371 "0b71ea9bd730fd8923f6d25a7a91e7dd7728a960686cb5a901bb419e0f2ca232", 372 "1", 373 "ec9f153b13ee7bd915882859635ea9730bf0dc7611b2c7b0e37ee64f87c50c27", 374 "b082b53702c466dcf6e984a35671756c506c67c2fcb8adb408c44dd0755c8f2a", 375 "16e3d537ae61fb1247eda4b4f523cfbaee5152c0d0d96b520376833c1e594464", 376 }, 377 // Doubling with z1!=1. 378 { 379 "d3e5183c393c20e4f464acf144ce9ae8266a82b67f553af33eb37e88e7fd2718", 380 "5b8f54deb987ec491fb692d3d48f3eebb9454b034365ad480dda0cf079651190", 381 "2", 382 "9f153b13ee7bd915882859635ea9730bf0dc7611b2c7b0e37ee65073c50fabac", 383 "2b53702c466dcf6e984a35671756c506c67c2fcb8adb408c44dd125dc91cb988", 384 "6e3d537ae61fb1247eda4b4f523cfbaee5152c0d0d96b520376833c2e5944a11", 385 }, 386 } 387 388 t.Logf("Running %d tests", len(tests)) 389 for i, test := range tests { 390 // Convert hex to field values. 391 x1 := btcec.NewFieldVal().SetHex(test.x1) 392 y1 := btcec.NewFieldVal().SetHex(test.y1) 393 z1 := btcec.NewFieldVal().SetHex(test.z1) 394 x3 := btcec.NewFieldVal().SetHex(test.x3) 395 y3 := btcec.NewFieldVal().SetHex(test.y3) 396 z3 := btcec.NewFieldVal().SetHex(test.z3) 397 398 // Ensure the test data is using points that are actually on 399 // the curve (or the point at infinity). 400 if !z1.IsZero() && !btcec.S256().TstIsJacobianOnCurve(x1, y1, z1) { 401 t.Errorf("#%d first point is not on the curve -- "+ 402 "invalid test data", i) 403 continue 404 } 405 if !z3.IsZero() && !btcec.S256().TstIsJacobianOnCurve(x3, y3, z3) { 406 t.Errorf("#%d expected point is not on the curve -- "+ 407 "invalid test data", i) 408 continue 409 } 410 411 // Double the point. 412 rx, ry, rz := btcec.NewFieldVal(), btcec.NewFieldVal(), btcec.NewFieldVal() 413 btcec.S256().TstDoubleJacobian(x1, y1, z1, rx, ry, rz) 414 415 // Ensure result matches expected. 416 if !rx.Equals(x3) || !ry.Equals(y3) || !rz.Equals(z3) { 417 t.Errorf("#%d wrong result\ngot: (%v, %v, %v)\n"+ 418 "want: (%v, %v, %v)", i, rx, ry, rz, x3, y3, z3) 419 continue 420 } 421 } 422 } 423 424 // TestDoubleAffine tests doubling of points in affine coordinates. 425 func TestDoubleAffine(t *testing.T) { 426 tests := []struct { 427 x1, y1 string // Coordinates (in hex) of point to double 428 x3, y3 string // Coordinates (in hex) of expected point 429 }{ 430 // Doubling a point at infinity is still infinity. 431 // 2*∞ = ∞ (point at infinity) 432 433 { 434 "0", 435 "0", 436 "0", 437 "0", 438 }, 439 440 // Random points. 441 { 442 "e41387ffd8baaeeb43c2faa44e141b19790e8ac1f7ff43d480dc132230536f86", 443 "1b88191d430f559896149c86cbcb703193105e3cf3213c0c3556399836a2b899", 444 "88da47a089d333371bd798c548ef7caae76e737c1980b452d367b3cfe3082c19", 445 "3b6f659b09a362821dfcfefdbfbc2e59b935ba081b6c249eb147b3c2100b1bc1", 446 }, 447 { 448 "b3589b5d984f03ef7c80aeae444f919374799edf18d375cab10489a3009cff0c", 449 "c26cf343875b3630e15bccc61202815b5d8f1fd11308934a584a5babe69db36a", 450 "e193860172998751e527bb12563855602a227fc1f612523394da53b746bb2fb1", 451 "2bfcf13d2f5ab8bb5c611fab5ebbed3dc2f057062b39a335224c22f090c04789", 452 }, 453 { 454 "2b31a40fbebe3440d43ac28dba23eee71c62762c3fe3dbd88b4ab82dc6a82340", 455 "9ba7deb02f5c010e217607fd49d58db78ec273371ea828b49891ce2fd74959a1", 456 "2c8d5ef0d343b1a1a48aa336078eadda8481cb048d9305dc4fdf7ee5f65973a2", 457 "bb4914ac729e26d3cd8f8dc8f702f3f4bb7e0e9c5ae43335f6e94c2de6c3dc95", 458 }, 459 { 460 "61c64b760b51981fab54716d5078ab7dffc93730b1d1823477e27c51f6904c7a", 461 "ef6eb16ea1a36af69d7f66524c75a3a5e84c13be8fbc2e811e0563c5405e49bd", 462 "5f0dcdd2595f5ad83318a0f9da481039e36f135005420393e72dfca985b482f4", 463 "a01c849b0837065c1cb481b0932c441f49d1cab1b4b9f355c35173d93f110ae0", 464 }, 465 } 466 467 t.Logf("Running %d tests", len(tests)) 468 for i, test := range tests { 469 // Convert hex to field values. 470 x1, y1 := fromHex(test.x1), fromHex(test.y1) 471 x3, y3 := fromHex(test.x3), fromHex(test.y3) 472 473 // Ensure the test data is using points that are actually on 474 // the curve (or the point at infinity). 475 if !(x1.Sign() == 0 && y1.Sign() == 0) && !btcec.S256().IsOnCurve(x1, y1) { 476 t.Errorf("#%d first point is not on the curve -- "+ 477 "invalid test data", i) 478 continue 479 } 480 if !(x3.Sign() == 0 && y3.Sign() == 0) && !btcec.S256().IsOnCurve(x3, y3) { 481 t.Errorf("#%d expected point is not on the curve -- "+ 482 "invalid test data", i) 483 continue 484 } 485 486 // Double the point. 487 rx, ry := btcec.S256().Double(x1, y1) 488 489 // Ensure result matches expected. 490 if rx.Cmp(x3) != 00 || ry.Cmp(y3) != 0 { 491 t.Errorf("#%d wrong result\ngot: (%x, %x)\n"+ 492 "want: (%x, %x)", i, rx, ry, x3, y3) 493 continue 494 } 495 } 496 } 497 498 func TestOnCurve(t *testing.T) { 499 s256 := btcec.S256() 500 if !s256.IsOnCurve(s256.Params().Gx, s256.Params().Gy) { 501 t.Errorf("FAIL S256") 502 } 503 } 504 505 type baseMultTest struct { 506 k string 507 x, y string 508 } 509 510 //TODO: add more test vectors 511 var s256BaseMultTests = []baseMultTest{ 512 { 513 "AA5E28D6A97A2479A65527F7290311A3624D4CC0FA1578598EE3C2613BF99522", 514 "34F9460F0E4F08393D192B3C5133A6BA099AA0AD9FD54EBCCFACDFA239FF49C6", 515 "B71EA9BD730FD8923F6D25A7A91E7DD7728A960686CB5A901BB419E0F2CA232", 516 }, 517 { 518 "7E2B897B8CEBC6361663AD410835639826D590F393D90A9538881735256DFAE3", 519 "D74BF844B0862475103D96A611CF2D898447E288D34B360BC885CB8CE7C00575", 520 "131C670D414C4546B88AC3FF664611B1C38CEB1C21D76369D7A7A0969D61D97D", 521 }, 522 { 523 "6461E6DF0FE7DFD05329F41BF771B86578143D4DD1F7866FB4CA7E97C5FA945D", 524 "E8AECC370AEDD953483719A116711963CE201AC3EB21D3F3257BB48668C6A72F", 525 "C25CAF2F0EBA1DDB2F0F3F47866299EF907867B7D27E95B3873BF98397B24EE1", 526 }, 527 { 528 "376A3A2CDCD12581EFFF13EE4AD44C4044B8A0524C42422A7E1E181E4DEECCEC", 529 "14890E61FCD4B0BD92E5B36C81372CA6FED471EF3AA60A3E415EE4FE987DABA1", 530 "297B858D9F752AB42D3BCA67EE0EB6DCD1C2B7B0DBE23397E66ADC272263F982", 531 }, 532 { 533 "1B22644A7BE026548810C378D0B2994EEFA6D2B9881803CB02CEFF865287D1B9", 534 "F73C65EAD01C5126F28F442D087689BFA08E12763E0CEC1D35B01751FD735ED3", 535 "F449A8376906482A84ED01479BD18882B919C140D638307F0C0934BA12590BDE", 536 }, 537 } 538 539 //TODO: test different curves as well? 540 func TestBaseMult(t *testing.T) { 541 s256 := btcec.S256() 542 for i, e := range s256BaseMultTests { 543 k, ok := new(big.Int).SetString(e.k, 16) 544 if !ok { 545 t.Errorf("%d: bad value for k: %s", i, e.k) 546 } 547 x, y := s256.ScalarBaseMult(k.Bytes()) 548 if fmt.Sprintf("%X", x) != e.x || fmt.Sprintf("%X", y) != e.y { 549 t.Errorf("%d: bad output for k=%s: got (%X, %X), want (%s, %s)", i, e.k, x, y, e.x, e.y) 550 } 551 if testing.Short() && i > 5 { 552 break 553 } 554 } 555 } 556 557 func TestBaseMultVerify(t *testing.T) { 558 s256 := btcec.S256() 559 for bytes := 1; bytes < 40; bytes++ { 560 for i := 0; i < 30; i++ { 561 data := make([]byte, bytes) 562 _, err := rand.Read(data) 563 if err != nil { 564 t.Errorf("failed to read random data for %d", i) 565 continue 566 } 567 x, y := s256.ScalarBaseMult(data) 568 xWant, yWant := s256.ScalarMult(s256.Gx, s256.Gy, data) 569 if x.Cmp(xWant) != 0 || y.Cmp(yWant) != 0 { 570 t.Errorf("%d: bad output for %X: got (%X, %X), want (%X, %X)", i, data, x, y, xWant, yWant) 571 } 572 if testing.Short() && i > 2 { 573 break 574 } 575 } 576 } 577 } 578 579 func TestScalarMult(t *testing.T) { 580 // Strategy for this test: 581 // Get a random exponent from the generator point at first 582 // This creates a new point which is used in the next iteration 583 // Use another random exponent on the new point. 584 // We use BaseMult to verify by multiplying the previous exponent 585 // and the new random exponent together (mod N) 586 s256 := btcec.S256() 587 x, y := s256.Gx, s256.Gy 588 exponent := big.NewInt(1) 589 for i := 0; i < 1024; i++ { 590 data := make([]byte, 32) 591 _, err := rand.Read(data) 592 if err != nil { 593 t.Fatalf("failed to read random data at %d", i) 594 break 595 } 596 x, y = s256.ScalarMult(x, y, data) 597 exponent.Mul(exponent, new(big.Int).SetBytes(data)) 598 xWant, yWant := s256.ScalarBaseMult(exponent.Bytes()) 599 if x.Cmp(xWant) != 0 || y.Cmp(yWant) != 0 { 600 t.Fatalf("%d: bad output for %X: got (%X, %X), want (%X, %X)", i, data, x, y, xWant, yWant) 601 break 602 } 603 } 604 } 605 606 // Test this curve's usage with the ecdsa package. 607 608 func testKeyGeneration(t *testing.T, c *btcec.KoblitzCurve, tag string) { 609 priv, err := btcec.NewPrivateKey(c) 610 if err != nil { 611 t.Errorf("%s: error: %s", tag, err) 612 return 613 } 614 if !c.IsOnCurve(priv.PublicKey.X, priv.PublicKey.Y) { 615 t.Errorf("%s: public key invalid: %s", tag, err) 616 } 617 } 618 619 func TestKeyGeneration(t *testing.T) { 620 testKeyGeneration(t, btcec.S256(), "S256") 621 } 622 623 func testSignAndVerify(t *testing.T, c *btcec.KoblitzCurve, tag string) { 624 priv, _ := btcec.NewPrivateKey(c) 625 pub := priv.PubKey() 626 627 hashed := []byte("testing") 628 sig, err := priv.Sign(hashed) 629 if err != nil { 630 t.Errorf("%s: error signing: %s", tag, err) 631 return 632 } 633 634 if !sig.Verify(hashed, pub) { 635 t.Errorf("%s: Verify failed", tag) 636 } 637 638 hashed[0] ^= 0xff 639 if sig.Verify(hashed, pub) { 640 t.Errorf("%s: Verify always works!", tag) 641 } 642 } 643 644 func TestSignAndVerify(t *testing.T) { 645 testSignAndVerify(t, btcec.S256(), "S256") 646 } 647 648 func TestNAF(t *testing.T) { 649 negOne := big.NewInt(-1) 650 one := big.NewInt(1) 651 two := big.NewInt(2) 652 for i := 0; i < 1024; i++ { 653 data := make([]byte, 32) 654 _, err := rand.Read(data) 655 if err != nil { 656 t.Fatalf("failed to read random data at %d", i) 657 break 658 } 659 nafPos, nafNeg := btcec.NAF(data) 660 want := new(big.Int).SetBytes(data) 661 got := big.NewInt(0) 662 // Check that the NAF representation comes up with the right number 663 for i := 0; i < len(nafPos); i++ { 664 bytePos := nafPos[i] 665 byteNeg := nafNeg[i] 666 for j := 7; j >= 0; j-- { 667 got.Mul(got, two) 668 if bytePos&0x80 == 0x80 { 669 got.Add(got, one) 670 } else if byteNeg&0x80 == 0x80 { 671 got.Add(got, negOne) 672 } 673 bytePos <<= 1 674 byteNeg <<= 1 675 } 676 } 677 if got.Cmp(want) != 0 { 678 t.Errorf("%d: Failed NAF got %X want %X", i, got, want) 679 } 680 } 681 } 682 683 func fromHex(s string) *big.Int { 684 r, ok := new(big.Int).SetString(s, 16) 685 if !ok { 686 panic("bad hex") 687 } 688 return r 689 } 690 691 // These test vectors were taken from 692 // http://csrc.nist.gov/groups/STM/cavp/documents/dss/ecdsatestvectors.zip 693 var testVectors = []struct { 694 msg string 695 Qx, Qy string 696 r, s string 697 ok bool 698 }{ 699 /* 700 * All of these tests are disabled since they are for P224, not sec256k1. 701 * they are left here as an example of test vectors for when some *real* 702 * vectors may be found. 703 * - oga@conformal.com 704 { 705 "09626b45493672e48f3d1226a3aff3201960e577d33a7f72c7eb055302db8fe8ed61685dd036b554942a5737cd1512cdf811ee0c00e6dd2f08c69f08643be396e85dafda664801e772cdb7396868ac47b172245b41986aa2648cb77fbbfa562581be06651355a0c4b090f9d17d8f0ab6cced4e0c9d386cf465a516630f0231bd", 706 "9504b5b82d97a264d8b3735e0568decabc4b6ca275bc53cbadfc1c40", 707 "03426f80e477603b10dee670939623e3da91a94267fc4e51726009ed", 708 "81d3ac609f9575d742028dd496450a58a60eea2dcf8b9842994916e1", 709 "96a8c5f382c992e8f30ccce9af120b067ec1d74678fa8445232f75a5", 710 false, 711 }, 712 { 713 "96b2b6536f6df29be8567a72528aceeaccbaa66c66c534f3868ca9778b02faadb182e4ed34662e73b9d52ecbe9dc8e875fc05033c493108b380689ebf47e5b062e6a0cdb3dd34ce5fe347d92768d72f7b9b377c20aea927043b509c078ed2467d7113405d2ddd458811e6faf41c403a2a239240180f1430a6f4330df5d77de37", 714 "851e3100368a22478a0029353045ae40d1d8202ef4d6533cfdddafd8", 715 "205302ac69457dd345e86465afa72ee8c74ca97e2b0b999aec1f10c2", 716 "4450c2d38b697e990721aa2dbb56578d32b4f5aeb3b9072baa955ee0", 717 "e26d4b589166f7b4ba4b1c8fce823fa47aad22f8c9c396b8c6526e12", 718 false, 719 }, 720 { 721 "86778dbb4a068a01047a8d245d632f636c11d2ad350740b36fad90428b454ad0f120cb558d12ea5c8a23db595d87543d06d1ef489263d01ee529871eb68737efdb8ff85bc7787b61514bed85b7e01d6be209e0a4eb0db5c8df58a5c5bf706d76cb2bdf7800208639e05b89517155d11688236e6a47ed37d8e5a2b1e0adea338e", 722 "ad5bda09d319a717c1721acd6688d17020b31b47eef1edea57ceeffc", 723 "c8ce98e181770a7c9418c73c63d01494b8b80a41098c5ea50692c984", 724 "de5558c257ab4134e52c19d8db3b224a1899cbd08cc508ce8721d5e9", 725 "745db7af5a477e5046705c0a5eff1f52cb94a79d481f0c5a5e108ecd", 726 true, 727 }, 728 { 729 "4bc6ef1958556686dab1e39c3700054a304cbd8f5928603dcd97fafd1f29e69394679b638f71c9344ce6a535d104803d22119f57b5f9477e253817a52afa9bfbc9811d6cc8c8be6b6566c6ef48b439bbb532abe30627548c598867f3861ba0b154dc1c3deca06eb28df8efd28258554b5179883a36fbb1eecf4f93ee19d41e3d", 730 "cc5eea2edf964018bdc0504a3793e4d2145142caa09a72ac5fb8d3e8", 731 "a48d78ae5d08aa725342773975a00d4219cf7a8029bb8cf3c17c374a", 732 "67b861344b4e416d4094472faf4272f6d54a497177fbc5f9ef292836", 733 "1d54f3fcdad795bf3b23408ecbac3e1321d1d66f2e4e3d05f41f7020", 734 false, 735 }, 736 { 737 "bb658732acbf3147729959eb7318a2058308b2739ec58907dd5b11cfa3ecf69a1752b7b7d806fe00ec402d18f96039f0b78dbb90a59c4414fb33f1f4e02e4089de4122cd93df5263a95be4d7084e2126493892816e6a5b4ed123cb705bf930c8f67af0fb4514d5769232a9b008a803af225160ce63f675bd4872c4c97b146e5e", 738 "6234c936e27bf141fc7534bfc0a7eedc657f91308203f1dcbd642855", 739 "27983d87ca785ef4892c3591ef4a944b1deb125dd58bd351034a6f84", 740 "e94e05b42d01d0b965ffdd6c3a97a36a771e8ea71003de76c4ecb13f", 741 "1dc6464ffeefbd7872a081a5926e9fc3e66d123f1784340ba17737e9", 742 false, 743 }, 744 { 745 "7c00be9123bfa2c4290be1d8bc2942c7f897d9a5b7917e3aabd97ef1aab890f148400a89abd554d19bec9d8ed911ce57b22fbcf6d30ca2115f13ce0a3f569a23bad39ee645f624c49c60dcfc11e7d2be24de9c905596d8f23624d63dc46591d1f740e46f982bfae453f107e80db23545782be23ce43708245896fc54e1ee5c43", 746 "9f3f037282aaf14d4772edffff331bbdda845c3f65780498cde334f1", 747 "8308ee5a16e3bcb721b6bc30000a0419bc1aaedd761be7f658334066", 748 "6381d7804a8808e3c17901e4d283b89449096a8fba993388fa11dc54", 749 "8e858f6b5b253686a86b757bad23658cda53115ac565abca4e3d9f57", 750 false, 751 }, 752 { 753 "cffc122a44840dc705bb37130069921be313d8bde0b66201aebc48add028ca131914ef2e705d6bedd19dc6cf9459bbb0f27cdfe3c50483808ffcdaffbeaa5f062e097180f07a40ef4ab6ed03fe07ed6bcfb8afeb42c97eafa2e8a8df469de07317c5e1494c41547478eff4d8c7d9f0f484ad90fedf6e1c35ee68fa73f1691601", 754 "a03b88a10d930002c7b17ca6af2fd3e88fa000edf787dc594f8d4fd4", 755 "e0cf7acd6ddc758e64847fe4df9915ebda2f67cdd5ec979aa57421f5", 756 "387b84dcf37dc343c7d2c5beb82f0bf8bd894b395a7b894565d296c1", 757 "4adc12ce7d20a89ce3925e10491c731b15ddb3f339610857a21b53b4", 758 false, 759 }, 760 { 761 "26e0e0cafd85b43d16255908ccfd1f061c680df75aba3081246b337495783052ba06c60f4a486c1591a4048bae11b4d7fec4f161d80bdc9a7b79d23e44433ed625eab280521a37f23dd3e1bdc5c6a6cfaa026f3c45cf703e76dab57add93fe844dd4cda67dc3bddd01f9152579e49df60969b10f09ce9372fdd806b0c7301866", 762 "9a8983c42f2b5a87c37a00458b5970320d247f0c8a88536440173f7d", 763 "15e489ec6355351361900299088cfe8359f04fe0cab78dde952be80c", 764 "929a21baa173d438ec9f28d6a585a2f9abcfc0a4300898668e476dc0", 765 "59a853f046da8318de77ff43f26fe95a92ee296fa3f7e56ce086c872", 766 true, 767 }, 768 { 769 "1078eac124f48ae4f807e946971d0de3db3748dd349b14cca5c942560fb25401b2252744f18ad5e455d2d97ed5ae745f55ff509c6c8e64606afe17809affa855c4c4cdcaf6b69ab4846aa5624ed0687541aee6f2224d929685736c6a23906d974d3c257abce1a3fb8db5951b89ecb0cda92b5207d93f6618fd0f893c32cf6a6e", 770 "d6e55820bb62c2be97650302d59d667a411956138306bd566e5c3c2b", 771 "631ab0d64eaf28a71b9cbd27a7a88682a2167cee6251c44e3810894f", 772 "65af72bc7721eb71c2298a0eb4eed3cec96a737cc49125706308b129", 773 "bd5a987c78e2d51598dbd9c34a9035b0069c580edefdacee17ad892a", 774 false, 775 }, 776 { 777 "919deb1fdd831c23481dfdb2475dcbe325b04c34f82561ced3d2df0b3d749b36e255c4928973769d46de8b95f162b53cd666cad9ae145e7fcfba97919f703d864efc11eac5f260a5d920d780c52899e5d76f8fe66936ff82130761231f536e6a3d59792f784902c469aa897aabf9a0678f93446610d56d5e0981e4c8a563556b", 778 "269b455b1024eb92d860a420f143ac1286b8cce43031562ae7664574", 779 "baeb6ca274a77c44a0247e5eb12ca72bdd9a698b3f3ae69c9f1aaa57", 780 "cb4ec2160f04613eb0dfe4608486091a25eb12aa4dec1afe91cfb008", 781 "40b01d8cd06589481574f958b98ca08ade9d2a8fe31024375c01bb40", 782 false, 783 }, 784 { 785 "6e012361250dacf6166d2dd1aa7be544c3206a9d43464b3fcd90f3f8cf48d08ec099b59ba6fe7d9bdcfaf244120aed1695d8be32d1b1cd6f143982ab945d635fb48a7c76831c0460851a3d62b7209c30cd9c2abdbe3d2a5282a9fcde1a6f418dd23c409bc351896b9b34d7d3a1a63bbaf3d677e612d4a80fa14829386a64b33f", 786 "6d2d695efc6b43b13c14111f2109608f1020e3e03b5e21cfdbc82fcd", 787 "26a4859296b7e360b69cf40be7bd97ceaffa3d07743c8489fc47ca1b", 788 "9a8cb5f2fdc288b7183c5b32d8e546fc2ed1ca4285eeae00c8b572ad", 789 "8c623f357b5d0057b10cdb1a1593dab57cda7bdec9cf868157a79b97", 790 true, 791 }, 792 { 793 "bf6bd7356a52b234fe24d25557200971fc803836f6fec3cade9642b13a8e7af10ab48b749de76aada9d8927f9b12f75a2c383ca7358e2566c4bb4f156fce1fd4e87ef8c8d2b6b1bdd351460feb22cdca0437ac10ca5e0abbbce9834483af20e4835386f8b1c96daaa41554ceee56730aac04f23a5c765812efa746051f396566", 794 "14250131b2599939cf2d6bc491be80ddfe7ad9de644387ee67de2d40", 795 "b5dc473b5d014cd504022043c475d3f93c319a8bdcb7262d9e741803", 796 "4f21642f2201278a95339a80f75cc91f8321fcb3c9462562f6cbf145", 797 "452a5f816ea1f75dee4fd514fa91a0d6a43622981966c59a1b371ff8", 798 false, 799 }, 800 { 801 "0eb7f4032f90f0bd3cf9473d6d9525d264d14c031a10acd31a053443ed5fe919d5ac35e0be77813071b4062f0b5fdf58ad5f637b76b0b305aec18f82441b6e607b44cdf6e0e3c7c57f24e6fd565e39430af4a6b1d979821ed0175fa03e3125506847654d7e1ae904ce1190ae38dc5919e257bdac2db142a6e7cd4da6c2e83770", 802 "d1f342b7790a1667370a1840255ac5bbbdc66f0bc00ae977d99260ac", 803 "76416cabae2de9a1000b4646338b774baabfa3db4673790771220cdb", 804 "bc85e3fc143d19a7271b2f9e1c04b86146073f3fab4dda1c3b1f35ca", 805 "9a5c70ede3c48d5f43307a0c2a4871934424a3303b815df4bb0f128e", 806 false, 807 }, 808 { 809 "5cc25348a05d85e56d4b03cec450128727bc537c66ec3a9fb613c151033b5e86878632249cba83adcefc6c1e35dcd31702929c3b57871cda5c18d1cf8f9650a25b917efaed56032e43b6fc398509f0d2997306d8f26675f3a8683b79ce17128e006aa0903b39eeb2f1001be65de0520115e6f919de902b32c38d691a69c58c92", 810 "7e49a7abf16a792e4c7bbc4d251820a2abd22d9f2fc252a7bf59c9a6", 811 "44236a8fb4791c228c26637c28ae59503a2f450d4cfb0dc42aa843b9", 812 "084461b4050285a1a85b2113be76a17878d849e6bc489f4d84f15cd8", 813 "079b5bddcc4d45de8dbdfd39f69817c7e5afa454a894d03ee1eaaac3", 814 false, 815 }, 816 { 817 "1951533ce33afb58935e39e363d8497a8dd0442018fd96dff167b3b23d7206a3ee182a3194765df4768a3284e23b8696c199b4686e670d60c9d782f08794a4bccc05cffffbd1a12acd9eb1cfa01f7ebe124da66ecff4599ea7720c3be4bb7285daa1a86ebf53b042bd23208d468c1b3aa87381f8e1ad63e2b4c2ba5efcf05845", 818 "31945d12ebaf4d81f02be2b1768ed80784bf35cf5e2ff53438c11493", 819 "a62bebffac987e3b9d3ec451eb64c462cdf7b4aa0b1bbb131ceaa0a4", 820 "bc3c32b19e42b710bca5c6aaa128564da3ddb2726b25f33603d2af3c", 821 "ed1a719cc0c507edc5239d76fe50e2306c145ad252bd481da04180c0", 822 false, 823 }, 824 */ 825 } 826 827 func TestVectors(t *testing.T) { 828 sha := sha1.New() 829 830 for i, test := range testVectors { 831 pub := btcec.PublicKey{ 832 Curve: btcec.S256(), 833 X: fromHex(test.Qx), 834 Y: fromHex(test.Qy), 835 } 836 msg, _ := hex.DecodeString(test.msg) 837 sha.Reset() 838 sha.Write(msg) 839 hashed := sha.Sum(nil) 840 sig := btcec.Signature{R: fromHex(test.r), S: fromHex(test.s)} 841 if fuck := sig.Verify(hashed, &pub); fuck != test.ok { 842 //t.Errorf("%d: bad result %v %v", i, pub, hashed) 843 t.Errorf("%d: bad result %v instead of %v", i, fuck, 844 test.ok) 845 } 846 if testing.Short() { 847 break 848 } 849 } 850 }