github.com/incognitochain/go-incognito-sdk@v1.0.1/privacy/curve25519/edwards25519_test.go (about) 1 // Copyright 2017-2018 DERO Project. All rights reserved. 2 // Use of this source code in any form is governed by RESEARCH license. 3 // license can be found in the LICENSE file. 4 // GPG: 0F39 E425 8C65 3947 702A 8234 08B2 0360 A03A 9DE8 5 // 6 // 7 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 8 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 9 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 10 // THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 11 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 12 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 13 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 14 // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 15 // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 16 17 package curve25519 18 19 import ( 20 "crypto/subtle" 21 "os" 22 ) 23 import "runtime/pprof" 24 import "crypto/rand" 25 import "testing" 26 27 func TestScMulSub(t *testing.T) { 28 tests := []struct { 29 name string 30 aHex string 31 bHex string 32 cHex string 33 wantHex string 34 }{ 35 { 36 name: "simple", 37 aHex: "0100000000000000000000000000000000000000000000000000000000000000", 38 bHex: "0100000000000000000000000000000000000000000000000000000000000000", 39 cHex: "0200000000000000000000000000000000000000000000000000000000000000", 40 wantHex: "0100000000000000000000000000000000000000000000000000000000000000", 41 }, 42 { 43 name: "more complex", 44 aHex: "1000000000000000000000000000000000000000000000000000000000000000", 45 bHex: "1000000000000000000000000000000000000000000000000000000000000000", 46 cHex: "0002000000000000000000000000000000000000000000000000000000000000", 47 wantHex: "0001000000000000000000000000000000000000000000000000000000000000", 48 }, 49 { 50 name: "more complex", 51 aHex: "0000000000000000000000000000000000000000000000000000000000000010", 52 bHex: "0000000000000000000000000000000000000000000000000000000000000010", 53 cHex: "0000000000000000000000000000000000000000000000000000000000000000", 54 wantHex: "844ae3b1946c2475b8f95e806867dbac410ae82d8c1331c265cf83e4be664c0e", 55 }, 56 } 57 for _, test := range tests { 58 a := HexToKey(test.aHex) 59 b := HexToKey(test.bHex) 60 c := HexToKey(test.cHex) 61 want := HexToKey(test.wantHex) 62 var got Key 63 ScMulSub(&got, &a, &b, &c) 64 if want != got { 65 t.Errorf("%s: want %x, got %x", test.name, want, got) 66 } 67 } 68 } 69 70 func TestScalarMult(t *testing.T) { 71 tests := []struct { 72 name string 73 scalarHex string 74 pointHex string 75 wantHex string 76 }{ 77 { 78 name: "zero", 79 scalarHex: "0000000000000000000000000000000000000000000000000000000000000000", 80 pointHex: "0100000000000000000000000000000000000000000000000000000000000000", 81 wantHex: "0100000000000000000000000000000000000000000000000000000000000000", 82 }, 83 { 84 name: "basepoint * 1", 85 scalarHex: "0100000000000000000000000000000000000000000000000000000000000000", 86 pointHex: "5866666666666666666666666666666666666666666666666666666666666666", 87 wantHex: "5866666666666666666666666666666666666666666666666666666666666666", 88 }, 89 { 90 name: "basepoint * 8", 91 scalarHex: "0800000000000000000000000000000000000000000000000000000000000000", 92 pointHex: "5866666666666666666666666666666666666666666666666666666666666666", 93 wantHex: "b4b937fca95b2f1e93e41e62fc3c78818ff38a66096fad6e7973e5c90006d321", 94 }, 95 { 96 name: "basepoint * 2", 97 scalarHex: "0200000000000000000000000000000000000000000000000000000000000000", 98 pointHex: "2f1132ca61ab38dff00f2fea3228f24c6c71d58085b80e47e19515cb27e8d047", 99 wantHex: "b4b937fca95b2f1e93e41e62fc3c78818ff38a66096fad6e7973e5c90006d321", 100 }, 101 } 102 for _, test := range tests { 103 scalarBytes := HexToKey(test.scalarHex) 104 pointBytes := HexToKey(test.pointHex) 105 want := HexToKey(test.wantHex) 106 point := new(ExtendedGroupElement) 107 point.FromBytes(&pointBytes) 108 result := new(ProjectiveGroupElement) 109 GeScalarMult(result, &scalarBytes, point) 110 var got Key 111 point.ToBytes(&got) 112 113 if got != pointBytes { 114 t.Fatalf("%s: want %s, got %s point testing failed", test.name, pointBytes, got) 115 } 116 117 result.ToBytes(&got) 118 119 if want != got { 120 t.Fatalf("%s: want %s, got %s", test.name, want, got) 121 } 122 } 123 } 124 125 func TestMultiScalarMultKey(t *testing.T) { 126 for i := 0; i < 100; i++ { 127 len := 64 128 scalarLs := make([]*Key, len) 129 pointLs := make([]*Key, len) 130 131 for j:=0; j <len; j++ { 132 scalarLs[j] = RandomScalar() 133 pointLs[j] = RandomPubKey() 134 135 } 136 137 res := ScalarMultKey(pointLs[0],scalarLs[0]) 138 139 for j:= 1; j < len; j++ { 140 tmp := ScalarMultKey(pointLs[j],scalarLs[j]) 141 AddKeys(res, res, tmp) 142 } 143 144 resultPrime := MultiScalarMultKey(pointLs, scalarLs) 145 ok := subtle.ConstantTimeCompare(res.MarshalText(), resultPrime.MarshalText()) == 1 146 if !ok { 147 t.Fatalf("expected Multi Scalar Mul correct !") 148 } 149 } 150 } 151 152 func BenchmarkMultiScalarMultKey(b *testing.B) { 153 len := 64 154 scalarLs := make([]*Key, len) 155 pointLs := make([]*Key, len) 156 157 for j:=0; j <len; j++ { 158 scalarLs[j] = RandomScalar() 159 pointLs[j] = RandomPubKey() 160 161 } 162 163 b.ResetTimer() 164 165 for i:=0; i< b.N; i++ { 166 167 MultiScalarMultKey(pointLs, scalarLs) 168 } 169 } 170 // 171 //func TestMultiScalarMultKey(t *testing.T) { 172 // len := 64 173 // scalarLs := make([]*Key, len) 174 // pointLs := make([]*ExtendedGroupElement, len) 175 // resultProjLs := make([]*ProjectiveGroupElement, len) 176 // resultKeyLs := make([]*Key, len) 177 // result := new(Key) 178 // 179 // scalarLs[0] = RandomScalar() 180 // pointLs[0] = new(ExtendedGroupElement) 181 // GeScalarMultBase(pointLs[0],scalarLs[0]) 182 // resultProjLs[0] = new(ProjectiveGroupElement) 183 // GeScalarMult(resultProjLs[0],scalarLs[0], pointLs[0]) 184 // resultProjLs[0].ToBytes(result) 185 // 186 // for i := 1; i< len; i ++ { 187 // scalarLs[i] = RandomScalar() 188 // pointLs[i] = new(ExtendedGroupElement) 189 // GeScalarMultBase(pointLs[i],scalarLs[i]) 190 // resultProjLs[i] = new(ProjectiveGroupElement) 191 // GeScalarMult(resultProjLs[i],scalarLs[i], pointLs[i]) 192 // resultKeyLs[i] = new(Key) 193 // resultProjLs[i].ToBytes(resultKeyLs[i]) 194 // AddKeys(result, result, resultKeyLs[i]) 195 // } 196 // 197 // fmt.Println(result) 198 // 199 // resultPrime := new(ProjectiveGroupElement) 200 // GeMultiScalarMult(resultPrime, scalarLs, pointLs) 201 // 202 // resultPrimeKey := new(Key) 203 // resultPrime.ToBytes(resultPrimeKey) 204 // fmt.Println(resultPrimeKey) 205 //} 206 207 func TestGeMul8(t *testing.T) { 208 tests := []struct { 209 name string 210 pointHex string 211 wantHex string 212 }{ 213 { 214 name: "zero", 215 pointHex: "0100000000000000000000000000000000000000000000000000000000000000", 216 wantHex: "0100000000000000000000000000000000000000000000000000000000000000", 217 }, 218 { 219 name: "basepoint", 220 pointHex: "5866666666666666666666666666666666666666666666666666666666666666", 221 wantHex: "b4b937fca95b2f1e93e41e62fc3c78818ff38a66096fad6e7973e5c90006d321", 222 }, 223 } 224 for _, test := range tests { 225 pointBytes := HexToKey(test.pointHex) 226 want := HexToKey(test.wantHex) 227 tmp := new(ExtendedGroupElement) 228 tmp.FromBytes(&pointBytes) 229 point := new(ProjectiveGroupElement) 230 tmp.ToProjective(point) 231 tmp2 := new(CompletedGroupElement) 232 result := new(ExtendedGroupElement) 233 var got Key 234 GeMul8(tmp2, point) 235 tmp2.ToExtended(result) 236 result.ToBytes(&got) 237 if want != got { 238 t.Errorf("%s: want %x, got %x", test.name, want, got) 239 } 240 } 241 } 242 243 func TestGeDoubleScalarMultVartime(t *testing.T) { 244 tests := []struct { 245 name string 246 pointHex string 247 scalar1Hex string 248 scalar2Hex string 249 wantHex string 250 }{ 251 { 252 name: "zero", 253 pointHex: "0100000000000000000000000000000000000000000000000000000000000000", 254 scalar1Hex: "0000000000000000000000000000000000000000000000000000000000000000", 255 scalar2Hex: "0000000000000000000000000000000000000000000000000000000000000000", 256 wantHex: "0100000000000000000000000000000000000000000000000000000000000000", 257 }, 258 { 259 name: "8 times base point only", 260 pointHex: "0100000000000000000000000000000000000000000000000000000000000000", 261 scalar1Hex: "0000000000000000000000000000000000000000000000000000000000000000", 262 scalar2Hex: "0800000000000000000000000000000000000000000000000000000000000000", 263 wantHex: "b4b937fca95b2f1e93e41e62fc3c78818ff38a66096fad6e7973e5c90006d321", 264 }, 265 { 266 name: "2 times non-base-point", 267 pointHex: "2f1132ca61ab38dff00f2fea3228f24c6c71d58085b80e47e19515cb27e8d047", 268 scalar1Hex: "0200000000000000000000000000000000000000000000000000000000000000", 269 scalar2Hex: "0000000000000000000000000000000000000000000000000000000000000000", 270 wantHex: "b4b937fca95b2f1e93e41e62fc3c78818ff38a66096fad6e7973e5c90006d321", 271 }, 272 { 273 name: "Combination", 274 pointHex: "2f1132ca61ab38dff00f2fea3228f24c6c71d58085b80e47e19515cb27e8d047", 275 scalar1Hex: "0100000000000000000000000000000000000000000000000000000000000000", 276 scalar2Hex: "0400000000000000000000000000000000000000000000000000000000000000", 277 wantHex: "b4b937fca95b2f1e93e41e62fc3c78818ff38a66096fad6e7973e5c90006d321", 278 }, 279 } 280 for _, test := range tests { 281 pointBytes := HexToKey(test.pointHex) 282 a := HexToKey(test.scalar1Hex) 283 b := HexToKey(test.scalar2Hex) 284 want := HexToKey(test.wantHex) 285 point := new(ExtendedGroupElement) 286 point.FromBytes(&pointBytes) 287 result := new(ProjectiveGroupElement) 288 GeDoubleScalarMultVartime(result, &a, point, &b) 289 var got Key 290 result.ToBytes(&got) 291 if want != got { 292 t.Errorf("%s: want %x, got %x", test.name, want, got) 293 } 294 } 295 } 296 297 func TestGeDoubleScalarMultPrecompVartime(t *testing.T) { 298 tests := []struct { 299 name string 300 point1Hex string 301 point2Hex string 302 scalar1Hex string 303 scalar2Hex string 304 wantHex string 305 }{ 306 { 307 name: "zero", 308 point1Hex: "0100000000000000000000000000000000000000000000000000000000000000", 309 point2Hex: "0100000000000000000000000000000000000000000000000000000000000000", 310 scalar1Hex: "0000000000000000000000000000000000000000000000000000000000000000", 311 scalar2Hex: "0000000000000000000000000000000000000000000000000000000000000000", 312 wantHex: "0100000000000000000000000000000000000000000000000000000000000000", 313 }, 314 { 315 name: "scalar 1 only", 316 point1Hex: "5866666666666666666666666666666666666666666666666666666666666666", 317 point2Hex: "0100000000000000000000000000000000000000000000000000000000000000", 318 scalar1Hex: "0800000000000000000000000000000000000000000000000000000000000000", 319 scalar2Hex: "0000000000000000000000000000000000000000000000000000000000000000", 320 wantHex: "b4b937fca95b2f1e93e41e62fc3c78818ff38a66096fad6e7973e5c90006d321", 321 }, 322 { 323 name: "scalar 2 only", 324 point1Hex: "0100000000000000000000000000000000000000000000000000000000000000", 325 point2Hex: "5866666666666666666666666666666666666666666666666666666666666666", 326 scalar1Hex: "0000000000000000000000000000000000000000000000000000000000000000", 327 scalar2Hex: "0800000000000000000000000000000000000000000000000000000000000000", 328 wantHex: "b4b937fca95b2f1e93e41e62fc3c78818ff38a66096fad6e7973e5c90006d321", 329 }, 330 { 331 name: "Combination", 332 point1Hex: "2f1132ca61ab38dff00f2fea3228f24c6c71d58085b80e47e19515cb27e8d047", 333 point2Hex: "5866666666666666666666666666666666666666666666666666666666666666", 334 scalar1Hex: "0100000000000000000000000000000000000000000000000000000000000000", 335 scalar2Hex: "0400000000000000000000000000000000000000000000000000000000000000", 336 wantHex: "b4b937fca95b2f1e93e41e62fc3c78818ff38a66096fad6e7973e5c90006d321", 337 }, 338 } 339 for _, test := range tests { 340 point1Bytes := HexToKey(test.point1Hex) 341 point2Bytes := HexToKey(test.point2Hex) 342 a := HexToKey(test.scalar1Hex) 343 b := HexToKey(test.scalar2Hex) 344 want := HexToKey(test.wantHex) 345 point1 := new(ExtendedGroupElement) 346 point1.FromBytes(&point1Bytes) 347 point2 := new(ExtendedGroupElement) 348 point2.FromBytes(&point2Bytes) 349 var point2Precomp [8]CachedGroupElement 350 GePrecompute(&point2Precomp, point2) 351 result := new(ProjectiveGroupElement) 352 GeDoubleScalarMultPrecompVartime(result, &a, point1, &b, &point2Precomp) 353 var got Key 354 result.ToBytes(&got) 355 if want != got { 356 t.Errorf("%s: want %x, got %x", test.name, want, got) 357 } 358 } 359 } 360 361 func TestScValid(t *testing.T) { 362 // All tests from github.com/monero-project/monero/tests/crypto/tests.txt 363 tests := []struct { 364 scalarHex string 365 valid bool 366 }{ 367 { 368 scalarHex: "ac10e070c8574ef374bdd1c5dbe9bacfd927f9ae0705cf08018ff865f6092d0f", 369 valid: true, 370 }, 371 { 372 scalarHex: "fa939388e8cb0ffc5c776cc517edc2a9457c11a89820a7bee91654ce2e2fb300", 373 valid: true, 374 }, 375 { 376 scalarHex: "6d728f89e567522dffe81cf641c2e483e2cee7051c1b3cd9cd38cba09d2dc900", 377 valid: true, 378 }, 379 { 380 scalarHex: "18fd66f7a0874de792f12a1b2add7d294100ea454537ae5794d0abc91dbf098a", 381 valid: false, 382 }, 383 { 384 scalarHex: "fdb4cee00230c448aeaa4790dd12e855eca6223d81dab6bfe3fe99ce5e702325", 385 valid: false, 386 }, 387 { 388 scalarHex: "f3ab5c4a64f9afbd48c75ad25700996a69504d31c75a6aa8beb24d178cfc32ba", 389 valid: false, 390 }, 391 { 392 scalarHex: "167e88e9298926ecd66d32a890148a9adcfb80a7ecc69396edc5f5ee8848ce91", 393 valid: false, 394 }, 395 { 396 scalarHex: "a9172ced17605ab2ba82caec382f1176fe6a1e0b92a9c95679978b3999d22605", 397 valid: true, 398 }, 399 { 400 scalarHex: "44f65ce00e64cf29e07bf3843e8e43e83b8b26d3dfcd83160d9a3fedda3fc908", 401 valid: true, 402 }, 403 { 404 scalarHex: "69951c807647f4dea33f8a40b0ddef999a9e8efd1b1b176f45fb92aae6287000", 405 valid: true, 406 }, 407 { 408 scalarHex: "dcb6f94312b4b815101af10775d189301d063816b0aa9b9ac028c0eb9b17dd0e", 409 valid: true, 410 }, 411 { 412 scalarHex: "a1a9574a90bed7f58bfd4c3295e181e152a4a39f9ad56520947e94fea40dfe2e", 413 valid: false, 414 }, 415 { 416 scalarHex: "757ebb27b14433f3ed696cd291825eba555af0863862216a98cf3080432bda01", 417 valid: true, 418 }, 419 { 420 scalarHex: "a7401d68c7956d41a05d8c6c1a3cc692cc269ad8a5837f93ac2c7654abaebf0e", 421 valid: true, 422 }, 423 { 424 scalarHex: "7c84ef4d9627529723f5e171a88bba91118192e6e19929204a6d23f5a541850b", 425 valid: true, 426 }, 427 { 428 scalarHex: "ebe4b2f9eadd52271e1115aa3b89b7bb3f68d58bf74d75486b77e6ae8216f609", 429 valid: true, 430 }, 431 { 432 scalarHex: "6221caf5dfd623587ca7aac45f5312faf1c2847d7bfbc5c46f88fd933970c866", 433 valid: false, 434 }, 435 { 436 scalarHex: "b38334b41f0b829bf3a2ea73b58c16afb56ccba5144668e78257ed4aa9a33a5e", 437 valid: false, 438 }, 439 { 440 scalarHex: "92e5df37f5412d9e9910cd28d27138ba46bdd4dee5dab1125f200f0a4e66f01c", 441 valid: false, 442 }, 443 { 444 scalarHex: "2d1717fe2965133009bdcf0c13b02ca85df4dc23d969d7b16fdab94341c2b90e", 445 valid: true, 446 }, 447 { 448 scalarHex: "82d771565024cf4b5c9add6d10a4114a2fbdbf7626f03749c8bddcf6c6feee03", 449 valid: true, 450 }, 451 { 452 scalarHex: "2db0f3d9bf47666bb40ae25ef7508296af2ef665a5333efff92c9daee5ecd986", 453 valid: false, 454 }, 455 { 456 scalarHex: "47883a3f0b0e624512887f3dae6f401b2f02eb8950eb8e741f07347108fbea14", 457 valid: false, 458 }, 459 { 460 scalarHex: "dae25f27f2756b8270f78015b1beafbd03a8d67a4dd940ee9550cecae9f3560f", 461 valid: true, 462 }, 463 { 464 scalarHex: "bab79d355572361259484ca77308943b7c71f5831be5dde11b3c7a26ac6e9a01", 465 valid: true, 466 }, 467 { 468 scalarHex: "f0bf30a9862d51fd8d1ca3a4e5a0e4330a5beab751af075b2e46f3e2d0297101", 469 valid: true, 470 }, 471 { 472 scalarHex: "a94270659333c985ab1461e9820f219416ad76f551a34f4c983ca967aa6b618c", 473 valid: false, 474 }, 475 { 476 scalarHex: "98e582e9d0e485e6b756e44b1cb187e9f2d4e16c02d2713a41dcee6d7fac0205", 477 valid: true, 478 }, 479 { 480 scalarHex: "62b57869238e72f05992e01f07c7a26c71ef9e3078ee7390cd4fc6406d3b37e3", 481 valid: false, 482 }, 483 { 484 scalarHex: "c751566f5420232cd626d2bd8073debedf219a0a28a7390200a2df9df8981647", 485 valid: false, 486 }, 487 { 488 scalarHex: "cfafede7d76def164bf15047a388365d712a600f1369bf692cb2dcb249f66508", 489 valid: true, 490 }, 491 { 492 scalarHex: "c0eb03c2c46a77b0cf67bea7d547b9b4d02116f70702790398bdabbfa775100a", 493 valid: true, 494 }, 495 { 496 scalarHex: "58c5afbb7b334e921bb46eeee1dfebadfbbc3a77c420b0b325b9470eff94cc0e", 497 valid: true, 498 }, 499 { 500 scalarHex: "b31b178b4dc8f7a7c24f6eb0987e32b8a9446ce8207186259074cc3d925c530d", 501 valid: true, 502 }, 503 { 504 scalarHex: "467b2c5f63120744b5aee7ec255d170aba83babdec9e76c2690300540eb17483", 505 valid: false, 506 }, 507 { 508 scalarHex: "9bc3be487bea81da020af0353660878e7deca693ac81278fac343b8b1809bd9c", 509 valid: false, 510 }, 511 { 512 scalarHex: "162cdb42f9d9147118537cc4d5eadb8f589f6de3929188f6c41428bdab2c650e", 513 valid: true, 514 }, 515 { 516 scalarHex: "6eeb88f685d1b5c99f8c27dcadf95f5bea9082e2735a4f8aafc3c3a35f749002", 517 valid: true, 518 }, 519 { 520 scalarHex: "e03bb5c9bedc41d324ca6d988e50b7e7c6cd6d2b1e471b752a00a10a19c9a604", 521 valid: true, 522 }, 523 { 524 scalarHex: "4fa064dcef2f14fc453c30865583468ad35af81c460a643b11285c15f2babb04", 525 valid: true, 526 }, 527 { 528 scalarHex: "bf067a7b53dab7fcd6a1f5a2c8b9b54c262e9be5ea5892dba5e4ad25585be702", 529 valid: true, 530 }, 531 { 532 scalarHex: "14d8d255c2156bb12133d5ee792061a21d3fbda2f14310753f3a90c2ad4ccbc8", 533 valid: false, 534 }, 535 { 536 scalarHex: "81e78a37b7e2dfed35ad8228a6c4a6f0aa34cc1de43da23895c5c86790804e01", 537 valid: true, 538 }, 539 { 540 scalarHex: "62366805970fb07b877bf1705d9c10517c6667ab7586d9afa82c30236a72f50f", 541 valid: true, 542 }, 543 { 544 scalarHex: "bb3b0e27b7c57052e5ac20bc6390229f57c6dbc8213dbc4ee1cbb9e174e389f9", 545 valid: false, 546 }, 547 { 548 scalarHex: "5c4039f162531ce9129667ed424446ef375a18da246a72c0dab00321fa04e929", 549 valid: false, 550 }, 551 { 552 scalarHex: "8d41a450d98a6f354266e36510921649e5229412976f8f318a3090d390a46807", 553 valid: true, 554 }, 555 { 556 scalarHex: "2fbce4441723379b8b6ef417803eb9220c8fee42f72da7e36e2c64b51628a10c", 557 valid: true, 558 }, 559 { 560 scalarHex: "5bbf0e5b58e3df89a5f4c607e3033fff8b9643fc900813f4ea50b889260bb004", 561 valid: true, 562 }, 563 { 564 scalarHex: "e5acfcb2ecb7175f90aa24db107cea1be7a45bc471c4c65b9f46535768545de5", 565 valid: false, 566 }, 567 { 568 scalarHex: "fae6e8d7226e6dc25faafdd8b5c63b68587980f6e76ea59b8595f18f64a96bd5", 569 valid: false, 570 }, 571 { 572 scalarHex: "6736f7939157ccee066a40056c13d96230ca5ffd014b0ebb0a454e3d8ea6830f", 573 valid: true, 574 }, 575 { 576 scalarHex: "b2b490d52f6e4d9ef14fc1ab3e1e97160693ba5d1220e4d63956eca316693504", 577 valid: true, 578 }, 579 { 580 scalarHex: "dca490cb4e21589e045150e8c0876871f08e6b3886c6393c6348bfb432799079", 581 valid: false, 582 }, 583 { 584 scalarHex: "ca2663d84aa7d7581ac4f0a270a685019178f5288013d163028d321e92b04901", 585 valid: true, 586 }, 587 { 588 scalarHex: "7dd277472249a53620d6b21c1ab0424024581b5ae3e6ecb9a46af8511b55a408", 589 valid: true, 590 }, 591 { 592 scalarHex: "30f07adb405de73987d81fcba3d523d420d130fe753afbf3dd19d5f08e8a1356", 593 valid: false, 594 }, 595 { 596 scalarHex: "cc31de9889440c695df43a9c621a7156bc064b161be2fdef35dd8ae0e1017fe2", 597 valid: false, 598 }, 599 { 600 scalarHex: "962ac1be6677cf0d298dd1244501e6a164a915df61b83c2837f80a84541e2e03", 601 valid: true, 602 }, 603 { 604 scalarHex: "e0a1e1c48f5dfb7c0faddd9186214ec2f81fb0bc3aca423ccf0e538cf43a2bd5", 605 valid: false, 606 }, 607 { 608 scalarHex: "8ed93780cbd46092acce856a8c691edbb8419deec5acfb26fcf82419b4a964b9", 609 valid: false, 610 }, 611 { 612 scalarHex: "f62cf00cac227d2b96e7f96268f0d606ad5924b0efb64e623e25584f993c93a8", 613 valid: false, 614 }, 615 { 616 scalarHex: "e49eacd6858efad9f3bedba8b9edff5ff3d5bd622926d5e96e6e8c8752a43d25", 617 valid: false, 618 }, 619 { 620 scalarHex: "ed424965b9a79c2f6611d7d4bcbe5bae4dbf2c8130141c714acc95c492061411", 621 valid: false, 622 }, 623 { 624 scalarHex: "7ea2bb2a4dab662c3adf71eb959314208ff9dbf50b3cb1a7940e4a4d6d797e0e", 625 valid: true, 626 }, 627 { 628 scalarHex: "96fc939742b8ed518bb7aa4bb6c9bbe3fddded6b9441d9ea27712c377e0bdff1", 629 valid: false, 630 }, 631 { 632 scalarHex: "c5122ad5575b54ebce3f1d1d97c3bb0cfeb9e5ea3bb223ab63189ced40579cf4", 633 valid: false, 634 }, 635 { 636 scalarHex: "c9147f1b42890b089ae2dfdc27f69b4a29c67b8bc0264259fcf71c39e31b893c", 637 valid: false, 638 }, 639 { 640 scalarHex: "9292516356f70e84852c3a563970bff369dfc39325c64432610baa0f31f2320e", 641 valid: true, 642 }, 643 { 644 scalarHex: "85f8b6251f177701b319c5db4bc372a5cf05cb07d86b2b2d5c938b0faf6d670f", 645 valid: true, 646 }, 647 { 648 scalarHex: "de88df59b4e8e3fe2beab575b4c6ffccbd24cf294f890fa61cbc231b0c976f0d", 649 valid: true, 650 }, 651 { 652 scalarHex: "2922bd9b50e09fe75a3745c62afd5bd1813dcffcf4503668e71d8f5d37c0090d", 653 valid: true, 654 }, 655 { 656 scalarHex: "f090b3ed9355221e4fb40397c367fb31a2c7ce308ba96b9c4fc9610c14cbe305", 657 valid: true, 658 }, 659 { 660 scalarHex: "1c545854bd134a995f2138d6d088032c33a9a23a30748615652e6675d56e670f", 661 valid: true, 662 }, 663 { 664 scalarHex: "588050d78a3079a12bc88d6bcaf34a95bc6928c9233f14056277bf36bb355d26", 665 valid: false, 666 }, 667 { 668 scalarHex: "3956481800462e5c34aa2178dde33d5096c23185d61a5839c212d11e61adc901", 669 valid: true, 670 }, 671 { 672 scalarHex: "d0d61e471d5d503a6efcd549694b61851a58b0c8f8fb400227e2a48c1cbe4a0d", 673 valid: true, 674 }, 675 { 676 scalarHex: "1eed64f825d3f1bba4a226425dbef91f102ec01bcf4a0ac0a00baef8de20c405", 677 valid: true, 678 }, 679 { 680 scalarHex: "86764f74c855d580581ff17416a2c394de55bb3cb6e676756e86f3893ee61a09", 681 valid: true, 682 }, 683 { 684 scalarHex: "a1cc5ecb2a528ab8fe3efac17a2859c2ef1b81b51d18643bb3ee3fcc8794eb80", 685 valid: false, 686 }, 687 { 688 scalarHex: "740464b60e54da6a3541057742d327330ae5ac190e2b86708f5af7a1ff89fd0a", 689 valid: true, 690 }, 691 { 692 scalarHex: "ada63ca80e15912177b738c7c7618917827893b57ad20688a0a9c93c6c7c4e0a", 693 valid: true, 694 }, 695 { 696 scalarHex: "a55a6f1f2cab41704b251d3c64f3123f1635e3ee24fcce7e88cdaaf148636500", 697 valid: true, 698 }, 699 { 700 scalarHex: "515bfea540021ffb6d8f2324952a1ffa02f40adb860cff143ff0d797bd63fb09", 701 valid: true, 702 }, 703 { 704 scalarHex: "2784fbff1cad8d63b47359691caf8c7972219d7f9a64ee25fdbfe970981b2e87", 705 valid: false, 706 }, 707 { 708 scalarHex: "596071a52ac2e1b55001170c7ae5ee8a66a52e4b14db270a66c4828eccfca8a5", 709 valid: false, 710 }, 711 { 712 scalarHex: "afee887ccf82dd3406988f4afafd0d779e43d1f0f1b5107b1c3aed15d4ab57ed", 713 valid: false, 714 }, 715 { 716 scalarHex: "fb38ec6e693ee2aed1364c29dc7a60a2a7cb10601582a0ca4f4a0ca2c0499e08", 717 valid: true, 718 }, 719 { 720 scalarHex: "7f890e7539b8b3e6510a3f523a764f582f9e2c791400678eee85bd5842978c06", 721 valid: true, 722 }, 723 { 724 scalarHex: "26efbf6e436e974860ee3b6c197afa55c29b115e68b488ba46c1e865fe37f894", 725 valid: false, 726 }, 727 { 728 scalarHex: "6f6d9f15f262dde42c60af6880e8c6b6f07cab7cad785c19866f9a5c37419240", 729 valid: false, 730 }, 731 { 732 scalarHex: "f90673b823b480de9e560948307e1ada8ff1f4380e74e89ee45aa7fecae1d308", 733 valid: true, 734 }, 735 { 736 scalarHex: "269abc577fd32b1625895a1117dbc367822f9849441d4dbf7f56ca633fbf50b8", 737 valid: false, 738 }, 739 { 740 scalarHex: "26fcbe1690ff0bc306a9ec3cef75bee1a5e39710d5c02d46334fb7d89e75dc0c", 741 valid: true, 742 }, 743 { 744 scalarHex: "48c827ac48cda0f2ccd29a37884a14fa9cebe2ddf76bcc4fdf827245835d1daa", 745 valid: false, 746 }, 747 { 748 scalarHex: "9c82c6403ec29e60ad812c1762610e00c05891c6eb0fbf2393b886f298397e1a", 749 valid: false, 750 }, 751 { 752 scalarHex: "260fb700bf36504bfc5bea76c115929746f4aa709ba831fddb64b59af9bfd704", 753 valid: true, 754 }, 755 { 756 scalarHex: "aaff292106a5dd831c507603f72fb7e0b9aa5ad990575a7a3dbe83744668c552", 757 valid: false, 758 }, 759 { 760 scalarHex: "aca3f81877ac78519ce2944063fd7c50530d0ba7de2fa20ebdb1107872b6f302", 761 valid: true, 762 }, 763 { 764 scalarHex: "1086efacf20320ba25eedd1cf8d3b28348b0bf3e2191b7585e16dc9e4f7f5803", 765 valid: true, 766 }, 767 { 768 scalarHex: "66905a80d3d06c38faa5212c7455e5f48cdd5f15d816025b6466c085ef6f2d51", 769 valid: false, 770 }, 771 { 772 scalarHex: "a9fb08088371cc78c2b514608cee6b43c534e657d4e1f7d0cfd9fd4173aca769", 773 valid: false, 774 }, 775 { 776 scalarHex: "590e0a35ac44640ecf0f1f89eba200c6d98245b87360496ef408297af0011673", 777 valid: false, 778 }, 779 { 780 scalarHex: "9a83a1ab418d8d9e92e0ecde0cb1246e4b25f407c5421a3997cda43ede83930b", 781 valid: true, 782 }, 783 { 784 scalarHex: "bd3b91b68594291e859ace170fedcc64adfff013ed9f066bc625326e452ebc54", 785 valid: false, 786 }, 787 { 788 scalarHex: "ef68e423644b94c8549a9a8ca49e396d642ef0fc28448b77b2bdee1487787a0f", 789 valid: true, 790 }, 791 { 792 scalarHex: "6a6fe13345ffd78567560c8dfb511f20edfc15067212aaee69bddb77d5b4860e", 793 valid: true, 794 }, 795 { 796 scalarHex: "a1fb1f4e3e88997e4e4017a8346d37671cad86cd5d795d2550b1b9c805dfdb0f", 797 valid: true, 798 }, 799 { 800 scalarHex: "99e61e19a4c6c94354a5b7a6e206663f677223a6d3fc78659d9eaec21ef38402", 801 valid: true, 802 }, 803 { 804 scalarHex: "d4bf37268f05041950d82420a78753d168b8b808628b48d6ce7b0ed330701d02", 805 valid: true, 806 }, 807 { 808 scalarHex: "fee112a3e2de6313bc8809aba4466720c552d3615538b0523163fb01cbd1258a", 809 valid: false, 810 }, 811 { 812 scalarHex: "b9692112ef467088d7f32a873719c7f2179be1445aef71eab73f218e6d6336b9", 813 valid: false, 814 }, 815 { 816 scalarHex: "9aa00cad08702566bc88d11a2e8a99b188efd0d5fb164a1b4f3fc7378b962800", 817 valid: true, 818 }, 819 { 820 scalarHex: "b4301f1630b288b9d6a8afed5c72c10c3c3ce8c935a7aed218e8ff3f70b4a539", 821 valid: false, 822 }, 823 { 824 scalarHex: "f7f4d3bd2a84cf95d8793bd5e792510d5e95b8ce833775572e901795b5e1bd01", 825 valid: true, 826 }, 827 { 828 scalarHex: "3b7d10a8b1a2695dc00c7f12fc12c0876b27509b1ffa452c8b80643f3cd26315", 829 valid: false, 830 }, 831 { 832 scalarHex: "be2fa0a79bfa9fad3d7e9be1e5961c4849a38a1f4243a0c55d65d019a4fc5c0b", 833 valid: true, 834 }, 835 { 836 scalarHex: "a03687639bb3d2e8506fcf8d062fbc342b499dfc26d36baea80edc87674d6b0f", 837 valid: true, 838 }, 839 { 840 scalarHex: "c995ca23c04d581d52f7e550a4531b837f185ef58362b13f237964c0663f0139", 841 valid: false, 842 }, 843 { 844 scalarHex: "32865bf3762338c5e13fba1ffcc08629498a31af695813f221ebfba72ff7714b", 845 valid: false, 846 }, 847 { 848 scalarHex: "a8f37b565fe66aa2e851a74904e98c3059f92a037979da3bd4a52a10f719bf09", 849 valid: true, 850 }, 851 { 852 scalarHex: "f7474c236309d9888f0d8a53ab5a22bb4d600f3687a4e1d2815b89f866523202", 853 valid: true, 854 }, 855 { 856 scalarHex: "090d4f638d250e4588d1a25888c0b9ac6c207e4a98a9ef5a69ad0b6b1ed7ce1f", 857 valid: false, 858 }, 859 { 860 scalarHex: "6b6daf404e2b6f4e2e0398baf8627fed108d0a0bc38a364e1b5d55bfd63f6d21", 861 valid: false, 862 }, 863 { 864 scalarHex: "7e83a7bbf587be0694738f36bf52b24577a3489d72f7426ec0886a37ece4f10d", 865 valid: true, 866 }, 867 { 868 scalarHex: "5f7abc23dcf726378db619bc2ce1e86ae209daa6d1909117ce7270829c4d3da3", 869 valid: false, 870 }, 871 { 872 scalarHex: "f9ffc537ad782ce9f00f80be30e8b822c901bf62b2433c365a2f856e65f88706", 873 valid: true, 874 }, 875 { 876 scalarHex: "9d3374f71e9ad3dbad360d8a80bc8b5c0d814eb09cade0c62bc094b858849004", 877 valid: true, 878 }, 879 { 880 scalarHex: "f97097fe5d46b78e030a5207f1db92df9c8efcb0051b6e3b65cb1a58dfab660d", 881 valid: true, 882 }, 883 { 884 scalarHex: "ead8314b9663a10344eaad550137ffb0906500057efd4a28b69def67bed8a10f", 885 valid: true, 886 }, 887 { 888 scalarHex: "38ca4c5eefa2a159c05eac5e05466db588c8fbbac7df6717e1c2fc1cd15e0956", 889 valid: false, 890 }, 891 { 892 scalarHex: "9b43159b9077fb2a049aa067e1d5c1a0d16da8515934b7588f4670483050ad0e", 893 valid: true, 894 }, 895 { 896 scalarHex: "a43c8bb23b53fcd288d71d301e9cdd225bdf88e5d58ef3b485d8318c19fb9b9d", 897 valid: false, 898 }, 899 { 900 scalarHex: "2278fffc9472031130714cd01599f4a476fe5b94cd092fdc5568917fb7a479f9", 901 valid: false, 902 }, 903 { 904 scalarHex: "b78718c39d1c90448ef8787350c8baaec08de36ecde9ac234eb570397761a703", 905 valid: true, 906 }, 907 { 908 scalarHex: "48a8506dd388eb99eab0d587bf4a7bd34e68f001eb88999a76f1878c32b8e478", 909 valid: false, 910 }, 911 { 912 scalarHex: "659eb800501cccb504ae9bdcf5779ba8b2d24e4f63824c84124c453a34dd3540", 913 valid: false, 914 }, 915 { 916 scalarHex: "1ce40f32aee47060a0dadf34ce04f81c48af3218051770fb86976785f981b05e", 917 valid: false, 918 }, 919 { 920 scalarHex: "e7360d88d6dbbf3c352b80811110235a213aa5a3ea182d36c8c670ba9610a00f", 921 valid: true, 922 }, 923 { 924 scalarHex: "82934fcaed4804020e1ce4ff798c30312aff862b1371f7f74d71b4316b413806", 925 valid: true, 926 }, 927 { 928 scalarHex: "5bb1383ae3547b8caeba767eaa73a8fc08ac5972f982c736568424f8665770ac", 929 valid: false, 930 }, 931 { 932 scalarHex: "533b7c9bde705efe0c08a8a0605ea2d4c3ec21919aeca99b40e10e29ca7dc255", 933 valid: false, 934 }, 935 { 936 scalarHex: "93c1411f47251750b1b95c481d0ce55b401722273932914e2d1e78924e08fb06", 937 valid: true, 938 }, 939 { 940 scalarHex: "5b90a4fd7d50881168802f7a8da19437305e38203b6bb6ac68b114b59dfbfa0e", 941 valid: true, 942 }, 943 { 944 scalarHex: "e98125b5ad8262054c811f92d0596863ef876cb86c7f6b5783aee2e8cd6a5300", 945 valid: true, 946 }, 947 { 948 scalarHex: "3b47eac89bc19bc46dde8fb091bb1128ddfb070cbac09b65d37416d62b1d9d3a", 949 valid: false, 950 }, 951 { 952 scalarHex: "4710f6af3f144eaa2a8f1f2af329bebe752d3594c73008bad237e5e0be0cf07f", 953 valid: false, 954 }, 955 { 956 scalarHex: "a6a654a6e2d2ecd7b1daea341897658b01ab34f7e84d9fc1b3ebf8214b39a840", 957 valid: false, 958 }, 959 { 960 scalarHex: "006ba25fa6dc45938b6ab7bf6fe7096bb0eee2fc17688995a3a01567739503d2", 961 valid: false, 962 }, 963 { 964 scalarHex: "ec2a2a700045b57c85c73770fbca5896aba8941ae39035a29641891ddb309a08", 965 valid: true, 966 }, 967 { 968 scalarHex: "a6ea18e936f99d7f284553e83545cf324784e5a263f47cdcd78cfc4da10cf80b", 969 valid: true, 970 }, 971 { 972 scalarHex: "86853a4044faaa87e2a949d9623d523eae1022467816a713488ef18de5db590a", 973 valid: true, 974 }, 975 { 976 scalarHex: "0f79400a90af899e64dc6c718cb2df4f8426cc77e1745e64af2dfc4743f4ef08", 977 valid: true, 978 }, 979 { 980 scalarHex: "4b9727146720b7b9fc2bb00b7b65b18909b53558fc5c4777e2efcb336ce9f103", 981 valid: true, 982 }, 983 { 984 scalarHex: "4a71e9840fb19d79255f06456bceda85029950a9d7aebd80f19da16672ea2e4f", 985 valid: false, 986 }, 987 { 988 scalarHex: "a76d81141e740c48642aeecb93f87edbe74c94d7795c35938979913f62355350", 989 valid: false, 990 }, 991 { 992 scalarHex: "fe82ea864b773ba785ae30742142fc95a6311f1caeacba19ed019a11b3ddee06", 993 valid: true, 994 }, 995 { 996 scalarHex: "c43a927dd10a6fc47bd3888aa9d9613ba258ad838832b923251a2863691c0600", 997 valid: true, 998 }, 999 { 1000 scalarHex: "55d66194e087988015066ddc0237d061163797305034f8b54524e935f832ed08", 1001 valid: true, 1002 }, 1003 { 1004 scalarHex: "650c717392bdf31373dbeda48d99fd10b76080f0319b6039f48eedc8de8daa01", 1005 valid: true, 1006 }, 1007 { 1008 scalarHex: "ef8a542e46802078598d8f41489c0d618cc19ac897719f3b298ea22cca35030c", 1009 valid: true, 1010 }, 1011 { 1012 scalarHex: "6f8be2599f25b3645571a0d3edda8d354218f1bac4e22fed861fb472ff615a04", 1013 valid: true, 1014 }, 1015 { 1016 scalarHex: "78b99806f01c239ea3e717e15a509ffc2f3c7481b5eceb365f7eb8e2ab13d907", 1017 valid: true, 1018 }, 1019 { 1020 scalarHex: "2bae1ebc0fb83cade154f1daaed5d1f03581f350e733f2f0d56a73fa3c97cf2c", 1021 valid: false, 1022 }, 1023 { 1024 scalarHex: "4c9f5a53e544ae46926b1504af11a7500f57487e62836c3f37b445c2b701dc0e", 1025 valid: true, 1026 }, 1027 { 1028 scalarHex: "162003195972b318297a38632d9859bc86f1677154f94996970a320e0d23aa05", 1029 valid: true, 1030 }, 1031 { 1032 scalarHex: "9563b33d7a9a751d3c8ae2b4536bc2ed7cf5231051191653d7c08d502357ed0b", 1033 valid: true, 1034 }, 1035 { 1036 scalarHex: "2ffc2e41884b11129e1cc83aa95cd0b44dacb040a9ff1809a353597af8af0736", 1037 valid: false, 1038 }, 1039 { 1040 scalarHex: "ebfb376fb3a20871f35a54ecc2bf0003a2f2d00838196f0860e229c1db21e90c", 1041 valid: true, 1042 }, 1043 { 1044 scalarHex: "3da00eff81fd6771a23481fa8719fbe674c0dffa8db583e5fc0da7c9a0713006", 1045 valid: true, 1046 }, 1047 { 1048 scalarHex: "2d492ad9915f6274a6b62cdc245204527a1216b4ef0e7e1e1d3aa6d81f0c3905", 1049 valid: true, 1050 }, 1051 { 1052 scalarHex: "1a6d227bc48af4cff57ab11dc7ba3b7da21a9998b05dbeea4c05ca8bcffe2277", 1053 valid: false, 1054 }, 1055 { 1056 scalarHex: "8db67435b9e243dfbb58f252061ca3a005d197b941fa1f9cbbd29fbeafd507d4", 1057 valid: false, 1058 }, 1059 { 1060 scalarHex: "b2f744640c89049ebbbf94bd3013d3103ccf0e750a810543b39601116dc3300d", 1061 valid: true, 1062 }, 1063 { 1064 scalarHex: "8177e87433900f41dbdc22db054c79995f6f610647bcee7527f51091f5198274", 1065 valid: false, 1066 }, 1067 { 1068 scalarHex: "2c7cbaa6142473cecdb1c10bf9fc2430984a4b6cd34afc607668c6d88bf24f06", 1069 valid: true, 1070 }, 1071 { 1072 scalarHex: "a0a2ccb60bcbd0eda5dd11540e3517462bd841d58d4aed185beb5cfbda9e5f34", 1073 valid: false, 1074 }, 1075 { 1076 scalarHex: "767219f2581c07b1bbccd62fe4af10b4e202538fe918cedefbba3297bc89b604", 1077 valid: true, 1078 }, 1079 { 1080 scalarHex: "ed8828a708c013d80fe558be718b1e738063c4eca7528c06067b73d9dd2adccc", 1081 valid: false, 1082 }, 1083 { 1084 scalarHex: "4e81f8c4a0166a40db4063b31a5a4e511648b0f094d8930d956f74a7bec44f03", 1085 valid: true, 1086 }, 1087 { 1088 scalarHex: "09d5a71ca33bbc186f06b5ece548f25b0d008ad71c04e55d3d4c5fe0ef960b19", 1089 valid: false, 1090 }, 1091 { 1092 scalarHex: "51aa0d12359bc5819055618be5955824d81bd6e5ef52d51ee7e75aa9ca09edc4", 1093 valid: false, 1094 }, 1095 { 1096 scalarHex: "94927b83b0f167631a5c8eae13a9290c027f795dbd0c3d0f2d1a270b65db05e4", 1097 valid: false, 1098 }, 1099 { 1100 scalarHex: "e30c00666b11f332690267f3a2b8caa93a9a6e3961522a4ef886f3768f4c4166", 1101 valid: false, 1102 }, 1103 { 1104 scalarHex: "6ec7e22c9921501879a85c89c2833e04526538c6cbdecd8a040fe6c57c881c06", 1105 valid: true, 1106 }, 1107 { 1108 scalarHex: "54a4299c9d8572857247843d38842926fc88064905d8041974a1d9d407313a0f", 1109 valid: true, 1110 }, 1111 { 1112 scalarHex: "d4604b16400e77f37e8f6f5cc4ced1ef0da8f2a832bf6a0f51321d221111ce83", 1113 valid: false, 1114 }, 1115 { 1116 scalarHex: "a545d4cb99de9fc8f976356996351009628be30201dd42a11f7b379a5099c40b", 1117 valid: true, 1118 }, 1119 { 1120 scalarHex: "7db6f2c324cda1f3c9b39d659e5b5e39ad8e4b65e31e3afc10e91f890d6c0b9f", 1121 valid: false, 1122 }, 1123 { 1124 scalarHex: "afee4fe9a50c0d0aba669ca7f866ac4eb16e83afd843f142caf1132b9c5bcd11", 1125 valid: false, 1126 }, 1127 { 1128 scalarHex: "03cf1b6414acc2990bf4df95a9afa40aefcbc55946f8f40298cec7b45e942b09", 1129 valid: true, 1130 }, 1131 { 1132 scalarHex: "82c67f0cc06d1f5d878e710dc3734dc9b698fbd43b9cfaa50bc0734240631eee", 1133 valid: false, 1134 }, 1135 { 1136 scalarHex: "ef10fc4f79bdfade5af636fd41a7e5c48e966b5562693fd7a95568f52d472d06", 1137 valid: true, 1138 }, 1139 { 1140 scalarHex: "0ce4ab8a2f342f7ff2fd10b1b734d5333c7f8240075b2ae8522313d192d8a01d", 1141 valid: false, 1142 }, 1143 { 1144 scalarHex: "745a1228beb514bac4521c342b345f301fb28e7bfebb85d3c22497d4474fe904", 1145 valid: true, 1146 }, 1147 { 1148 scalarHex: "684cfecbb321a4236354e94fd8bc74c22a28f1a3ee7e21193b0cf264204fce51", 1149 valid: false, 1150 }, 1151 { 1152 scalarHex: "14a31b0cf4630e8e74730979d661c1902ab2f47823244ff7809be751b273b00c", 1153 valid: true, 1154 }, 1155 { 1156 scalarHex: "6c0c31a9e40faf4ead079582dae043bee80f27fbb8b76ffa5c960083d578ac0f", 1157 valid: true, 1158 }, 1159 { 1160 scalarHex: "ef49cd4030926ad3dbc08425fedfed7de48a1ca119259abec5600be5b60deb0f", 1161 valid: true, 1162 }, 1163 { 1164 scalarHex: "b432db4174848e42b9a680c74d66e746a48cb397b4008815064178cf7acec91c", 1165 valid: false, 1166 }, 1167 { 1168 scalarHex: "8c041643a91de5b9a652c3edb1b2512656daf33521197f7ab01056aa04d33708", 1169 valid: true, 1170 }, 1171 { 1172 scalarHex: "d683e2784298e070cd686eddc848e1ce3205c42822650cf9bc2301fb9a330564", 1173 valid: false, 1174 }, 1175 { 1176 scalarHex: "48ad5703dbf88a809d1bde1d295c4e51e3cf24215a3136c251c165505f80e84e", 1177 valid: false, 1178 }, 1179 { 1180 scalarHex: "19d22f694db4b90b5500af61b7d6a26d5568b4a3048ddef5709698ed6df8820b", 1181 valid: true, 1182 }, 1183 { 1184 scalarHex: "f8d5164c397f22c6b8cf3ae26ebfa4a9fe893afc2d7aec1f7c4f1e46c9eca306", 1185 valid: true, 1186 }, 1187 { 1188 scalarHex: "64a5a328e130e416cf1b3fb3accd3bd032f66df404f5364e0ec9d18d652196c2", 1189 valid: false, 1190 }, 1191 { 1192 scalarHex: "300931fb2c3670af36168883af39e10e1593945114e11c4eee9547d253f4f504", 1193 valid: true, 1194 }, 1195 { 1196 scalarHex: "0bbe9316029ea6d59883574d39d1fcd3af3344d73033e2b615f0883361a11602", 1197 valid: true, 1198 }, 1199 { 1200 scalarHex: "75609b2f7a8c04053ba7c1dbfc1b7c2a8f00720817d1abd2dc1db11645bbaaa1", 1201 valid: false, 1202 }, 1203 { 1204 scalarHex: "fa98e50dd3e3fa8308ffe861194920ec6b4f431eb34c67d7332a92830a7cb20d", 1205 valid: true, 1206 }, 1207 { 1208 scalarHex: "50b48576275008950b552a94e32d25c0835cb6dd44e146519848c9a7ee003707", 1209 valid: true, 1210 }, 1211 { 1212 scalarHex: "032487e8b30ddec54b5cf90cbc38dde71104169e48228c2336916f1575c1c005", 1213 valid: true, 1214 }, 1215 { 1216 scalarHex: "574fe8ee31b42bcb9224c34c34ddca2908db4b5f4f630ce76244d1257f81e504", 1217 valid: true, 1218 }, 1219 { 1220 scalarHex: "a4bba7f4765850dd77a67e56cf89e3c8967ba8f3c72ba14c7ea014202f81780b", 1221 valid: true, 1222 }, 1223 { 1224 scalarHex: "90eca818a69f6b8c52bddee273f37eaa96c58f2322fa5f09de36d606edc2ef04", 1225 valid: true, 1226 }, 1227 { 1228 scalarHex: "ac689dc28cb94239b78e6dd66249feec0519686e0a3f974ef8d4760d320de842", 1229 valid: false, 1230 }, 1231 { 1232 scalarHex: "a578412ffcd608f1fc4d77b954b5650d5016a24747e08664373a6c1c8d61c71a", 1233 valid: false, 1234 }, 1235 { 1236 scalarHex: "d5b2f9a4b3ae8dcfc1a2ade16b320d7d00180ad72e9ba500cfeceb4e45335c00", 1237 valid: true, 1238 }, 1239 { 1240 scalarHex: "ba26b0105b5d74df01e27ac128303cf4f139b2d164772ce56a31b5787b5d2207", 1241 valid: true, 1242 }, 1243 { 1244 scalarHex: "fb9e9e404f5901ffc02ba848ed33c98a88365ff161b4d484f67f8d4d2bc9fe85", 1245 valid: false, 1246 }, 1247 { 1248 scalarHex: "e326865f9ee2b68fdff8c36d39672f897669d9efb52bd4b4d037f4e219f72887", 1249 valid: false, 1250 }, 1251 { 1252 scalarHex: "8d911a2a666472a69614bbdd887169936e4e4384992cffac6f5c8ad3f81da708", 1253 valid: true, 1254 }, 1255 { 1256 scalarHex: "a9c04591640432f35dcdcdbe5027080c31613253f01a8e4fb1c2ed04f3e8c2a1", 1257 valid: false, 1258 }, 1259 { 1260 scalarHex: "e5e18376596aa363f1de26fb318eadaee85792bb7e51af164ba80da6e358ac03", 1261 valid: true, 1262 }, 1263 { 1264 scalarHex: "2632ef6ab45b46f2a48b5691c3e82e54e50ba74f23751aa602ec77a39596a10d", 1265 valid: true, 1266 }, 1267 { 1268 scalarHex: "f110202b14458789eb17321f757032e3515012143e8dd156a401d0b48ebb6287", 1269 valid: false, 1270 }, 1271 { 1272 scalarHex: "82d4274f7518f0cf92637657c69407a5fccb685ce9de8fa617a6f6f6b86c290d", 1273 valid: true, 1274 }, 1275 { 1276 scalarHex: "e1d9512e60b4dab6b55f14f56c320ad8eda6b8e378c5f873ce5d89c622c76c0c", 1277 valid: true, 1278 }, 1279 { 1280 scalarHex: "adf9a384148ff31f52f4e2365c5234b93edd574df1b5b664650859a764130f07", 1281 valid: true, 1282 }, 1283 { 1284 scalarHex: "f5c8043c4b5a3a1ded6d02af7e048d298872e8fedbdfdb544b881215313956f9", 1285 valid: false, 1286 }, 1287 { 1288 scalarHex: "cd7d1bd7c2bf26b7060d2407dbd88a5ba4add8044436bcbf6e00e690eae29699", 1289 valid: false, 1290 }, 1291 { 1292 scalarHex: "af5b7ede9808e45e80f427d27e660443851ee2063d53c23dacb487b6b375807f", 1293 valid: false, 1294 }, 1295 { 1296 scalarHex: "3a854a6125fbae08eeaf8f29177b83cec19f8f23f82e1c0213acfda03a19a057", 1297 valid: false, 1298 }, 1299 { 1300 scalarHex: "307e8bc876b71a1ad7da7e3f8687d3173a6605184b912d80b34cec7abd09fd05", 1301 valid: true, 1302 }, 1303 { 1304 scalarHex: "5936e762cfe201af05d2e7082a10e5f58cb71cee179406eb026b05437211f5a0", 1305 valid: false, 1306 }, 1307 { 1308 scalarHex: "c02d9bb9b3ce61da67d7eb839ad6135b28485be17b6749a5d07a3a442e33890a", 1309 valid: true, 1310 }, 1311 { 1312 scalarHex: "766459f999aa16992ec9639aed4e1ecdd7b78c6ab7cc63400f2f2dbad02796e7", 1313 valid: false, 1314 }, 1315 { 1316 scalarHex: "39be058fddfed6dee0840cd03f7c407c3a30b0a0e87cc8ada9772b4150fd9a07", 1317 valid: true, 1318 }, 1319 { 1320 scalarHex: "18c994dad23375e3860e21ce5d430ef2b876820bd0fe9e84a3b3a5ba45c790c5", 1321 valid: false, 1322 }, 1323 { 1324 scalarHex: "0583e64db042f0e22e7abd759ef1b51ab5155314caf362de34781e8da9b4a20b", 1325 valid: true, 1326 }, 1327 { 1328 scalarHex: "8d71c7122df856668387356a704a0bcd1865493b65ab254b24c9bd06c5414386", 1329 valid: false, 1330 }, 1331 { 1332 scalarHex: "ca94f5f35fe069a057e9a9431e7ea3b99c7efd9700c0f838d3b99ab82648d343", 1333 valid: false, 1334 }, 1335 { 1336 scalarHex: "850d3c5acb9103049e0ce06fcd64a543a38bf20fb31ce3a47e275d1e043c5506", 1337 valid: true, 1338 }, 1339 { 1340 scalarHex: "06580accc5c48aa72ce261547614b8629c10e2ee8d62971f8453b2007f91a60f", 1341 valid: true, 1342 }, 1343 { 1344 scalarHex: "bef7fb38fcb2d6a5c22f1db03c4c26a0f61eaaa1e7f846b2bb46ff06aa9ca407", 1345 valid: true, 1346 }, 1347 { 1348 scalarHex: "fc7956e14919bb2f531c6cba13e0bf3568db3927b24a2f9131e0c42aac0cbbb1", 1349 valid: false, 1350 }, 1351 { 1352 scalarHex: "bf2ed7b0fdd8cc1222db5ae9e699de5d54abee91a3f8bd988d248ab041738aa3", 1353 valid: false, 1354 }, 1355 { 1356 scalarHex: "126213a8e3de2ab1fc862ad8bb27d3b13de5ba55657bf6e04efcf4015dd70895", 1357 valid: false, 1358 }, 1359 { 1360 scalarHex: "d1729b969a9395788931713933c587ef3748c96976a488f6a1e2f1e1ed6973d0", 1361 valid: false, 1362 }, 1363 { 1364 scalarHex: "2448345de229bb4c2695f9653653301c4562ff4a60c568a3f483474b6800875c", 1365 valid: false, 1366 }, 1367 { 1368 scalarHex: "e72284802f2737c293838a6357251398101ec60ba6e8458304bbd25de570010b", 1369 valid: true, 1370 }, 1371 { 1372 scalarHex: "87c0898c4c283f24b7164fa8aaab9fc3b06ad5237b389d9735d58c54dd989186", 1373 valid: false, 1374 }, 1375 { 1376 scalarHex: "4cceb19c61263feaffeedc984280a6f5ecc1eeebeed05a407359661d61bdf8a6", 1377 valid: false, 1378 }, 1379 { 1380 scalarHex: "2e286296d5300eb4ae7200036acbd47a319d3f9a8eb66a986a36683b85b26002", 1381 valid: true, 1382 }, 1383 { 1384 scalarHex: "1b7140ff3a09a82554d4219425c2213abd16d9f342e30e2f7c05f2a5188432a4", 1385 valid: false, 1386 }, 1387 { 1388 scalarHex: "c0cdfe0ac8dd014bc1fb4c5d3f22d74f30623054f3008c0d1e34af4f2eafdec4", 1389 valid: false, 1390 }, 1391 { 1392 scalarHex: "0000000000000000000000000000000000000000000000000000000000000000", 1393 valid: true, 1394 }, 1395 { 1396 scalarHex: "0100000000000000000000000000000000000000000000000000000000000000", 1397 valid: true, 1398 }, 1399 { 1400 scalarHex: "0200000000000000000000000000000000000000000000000000000000000000", 1401 valid: true, 1402 }, 1403 { 1404 scalarHex: "0300000000000000000000000000000000000000000000000000000000000000", 1405 valid: true, 1406 }, 1407 { 1408 scalarHex: "0400000000000000000000000000000000000000000000000000000000000000", 1409 valid: true, 1410 }, 1411 { 1412 scalarHex: "0500000000000000000000000000000000000000000000000000000000000000", 1413 valid: true, 1414 }, 1415 { 1416 scalarHex: "0600000000000000000000000000000000000000000000000000000000000000", 1417 valid: true, 1418 }, 1419 { 1420 scalarHex: "0700000000000000000000000000000000000000000000000000000000000000", 1421 valid: true, 1422 }, 1423 { 1424 scalarHex: "0800000000000000000000000000000000000000000000000000000000000000", 1425 valid: true, 1426 }, 1427 { 1428 scalarHex: "0900000000000000000000000000000000000000000000000000000000000000", 1429 valid: true, 1430 }, 1431 { 1432 scalarHex: "0a00000000000000000000000000000000000000000000000000000000000000", 1433 valid: true, 1434 }, 1435 { 1436 scalarHex: "0b00000000000000000000000000000000000000000000000000000000000000", 1437 valid: true, 1438 }, 1439 { 1440 scalarHex: "0c00000000000000000000000000000000000000000000000000000000000000", 1441 valid: true, 1442 }, 1443 { 1444 scalarHex: "0d00000000000000000000000000000000000000000000000000000000000000", 1445 valid: true, 1446 }, 1447 { 1448 scalarHex: "0e00000000000000000000000000000000000000000000000000000000000000", 1449 valid: true, 1450 }, 1451 { 1452 scalarHex: "0f00000000000000000000000000000000000000000000000000000000000000", 1453 valid: true, 1454 }, 1455 { 1456 scalarHex: "1000000000000000000000000000000000000000000000000000000000000000", 1457 valid: true, 1458 }, 1459 { 1460 scalarHex: "1100000000000000000000000000000000000000000000000000000000000000", 1461 valid: true, 1462 }, 1463 { 1464 scalarHex: "1200000000000000000000000000000000000000000000000000000000000000", 1465 valid: true, 1466 }, 1467 { 1468 scalarHex: "1300000000000000000000000000000000000000000000000000000000000000", 1469 valid: true, 1470 }, 1471 { 1472 scalarHex: "d9d3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1473 valid: true, 1474 }, 1475 { 1476 scalarHex: "dad3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1477 valid: true, 1478 }, 1479 { 1480 scalarHex: "dbd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1481 valid: true, 1482 }, 1483 { 1484 scalarHex: "dcd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1485 valid: true, 1486 }, 1487 { 1488 scalarHex: "ddd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1489 valid: true, 1490 }, 1491 { 1492 scalarHex: "ded3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1493 valid: true, 1494 }, 1495 { 1496 scalarHex: "dfd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1497 valid: true, 1498 }, 1499 { 1500 scalarHex: "e0d3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1501 valid: true, 1502 }, 1503 { 1504 scalarHex: "e1d3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1505 valid: true, 1506 }, 1507 { 1508 scalarHex: "e2d3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1509 valid: true, 1510 }, 1511 { 1512 scalarHex: "e3d3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1513 valid: true, 1514 }, 1515 { 1516 scalarHex: "e4d3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1517 valid: true, 1518 }, 1519 { 1520 scalarHex: "e5d3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1521 valid: true, 1522 }, 1523 { 1524 scalarHex: "e6d3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1525 valid: true, 1526 }, 1527 { 1528 scalarHex: "e7d3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1529 valid: true, 1530 }, 1531 { 1532 scalarHex: "e8d3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1533 valid: true, 1534 }, 1535 { 1536 scalarHex: "e9d3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1537 valid: true, 1538 }, 1539 { 1540 scalarHex: "ead3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1541 valid: true, 1542 }, 1543 { 1544 scalarHex: "ebd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1545 valid: true, 1546 }, 1547 { 1548 scalarHex: "ecd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1549 valid: true, 1550 }, 1551 { 1552 scalarHex: "edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1553 valid: false, 1554 }, 1555 { 1556 scalarHex: "eed3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1557 valid: false, 1558 }, 1559 { 1560 scalarHex: "efd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1561 valid: false, 1562 }, 1563 { 1564 scalarHex: "f0d3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1565 valid: false, 1566 }, 1567 { 1568 scalarHex: "f1d3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1569 valid: false, 1570 }, 1571 { 1572 scalarHex: "f2d3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1573 valid: false, 1574 }, 1575 { 1576 scalarHex: "f3d3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1577 valid: false, 1578 }, 1579 { 1580 scalarHex: "f4d3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1581 valid: false, 1582 }, 1583 { 1584 scalarHex: "f5d3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1585 valid: false, 1586 }, 1587 { 1588 scalarHex: "f6d3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1589 valid: false, 1590 }, 1591 { 1592 scalarHex: "f7d3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1593 valid: false, 1594 }, 1595 { 1596 scalarHex: "f8d3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1597 valid: false, 1598 }, 1599 { 1600 scalarHex: "f9d3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1601 valid: false, 1602 }, 1603 { 1604 scalarHex: "fad3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1605 valid: false, 1606 }, 1607 { 1608 scalarHex: "fbd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1609 valid: false, 1610 }, 1611 { 1612 scalarHex: "fcd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1613 valid: false, 1614 }, 1615 { 1616 scalarHex: "fdd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1617 valid: false, 1618 }, 1619 { 1620 scalarHex: "fed3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1621 valid: false, 1622 }, 1623 { 1624 scalarHex: "ffd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1625 valid: false, 1626 }, 1627 { 1628 scalarHex: "00d4f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1629 valid: false, 1630 }, 1631 { 1632 scalarHex: "01d4f55c1a631258d69cf7a2def9de1400000000000000000000000000000010", 1633 valid: false, 1634 }, 1635 { 1636 scalarHex: "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 1637 valid: false, 1638 }, 1639 { 1640 scalarHex: "edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 1641 valid: false, 1642 }, 1643 { 1644 scalarHex: "eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 1645 valid: false, 1646 }, 1647 { 1648 scalarHex: "efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 1649 valid: false, 1650 }, 1651 { 1652 scalarHex: "f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 1653 valid: false, 1654 }, 1655 { 1656 scalarHex: "f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 1657 valid: false, 1658 }, 1659 { 1660 scalarHex: "f2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 1661 valid: false, 1662 }, 1663 { 1664 scalarHex: "f3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 1665 valid: false, 1666 }, 1667 { 1668 scalarHex: "f4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 1669 valid: false, 1670 }, 1671 { 1672 scalarHex: "f5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 1673 valid: false, 1674 }, 1675 { 1676 scalarHex: "f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 1677 valid: false, 1678 }, 1679 { 1680 scalarHex: "f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 1681 valid: false, 1682 }, 1683 { 1684 scalarHex: "f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 1685 valid: false, 1686 }, 1687 { 1688 scalarHex: "f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 1689 valid: false, 1690 }, 1691 { 1692 scalarHex: "faffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 1693 valid: false, 1694 }, 1695 { 1696 scalarHex: "fbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 1697 valid: false, 1698 }, 1699 { 1700 scalarHex: "fcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 1701 valid: false, 1702 }, 1703 { 1704 scalarHex: "fdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 1705 valid: false, 1706 }, 1707 { 1708 scalarHex: "feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 1709 valid: false, 1710 }, 1711 { 1712 scalarHex: "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 1713 valid: false, 1714 }, 1715 } 1716 for _, test := range tests { 1717 scalar := HexToKey(test.scalarHex) 1718 got := ScValid(&scalar) 1719 if test.valid != got { 1720 t.Errorf("%x: want %t, got %t", scalar, test.valid, got) 1721 } 1722 } 1723 } 1724 1725 func TestAddKeys3_3(t *testing.T) { 1726 1727 for i := 0; i < 1000; i++ { 1728 s1 := *(RandomScalar()) 1729 s2 := *(RandomScalar()) //*(identity()) // *(RandomScalar()) 1730 1731 p1 := s1.PublicKey() 1732 p2 := s2.PublicKey() 1733 1734 first_part := ScalarMultKey(p1, &s1) 1735 second_part := ScalarMultKey(p2, &s2) 1736 1737 // do it traditional way 1738 var sum_result Key 1739 AddKeys(&sum_result, first_part, second_part) 1740 1741 // lets do it optimal way, pre compute 1742 var p1_extended, p2_extended ExtendedGroupElement 1743 var p1_precomputed, p2_precomputed [8]CachedGroupElement 1744 1745 p1_extended.FromBytes(p1) 1746 p2_extended.FromBytes(p2) 1747 1748 GePrecompute(&p1_precomputed, &p1_extended) 1749 GePrecompute(&p2_precomputed, &p2_extended) 1750 1751 var fast_result Key 1752 AddKeys3_3(&fast_result, &s1, &p1_precomputed, &s2, &p2_precomputed) 1753 1754 if sum_result != fast_result { 1755 t.Fatalf("AddKeys3_3 Failed Expected %s Actual %s", sum_result, fast_result) 1756 } 1757 } 1758 1759 } 1760 1761 func TestElements(t *testing.T) { 1762 1763 for i := 0; i < 100; i++ { 1764 p1 := *(RandomScalar()).PublicKey() 1765 p2 := *(RandomScalar()).PublicKey() 1766 1767 var exp1, exp2 ExtendedGroupElement 1768 var cached CachedGroupElement 1769 var precomputed PreComputedGroupElement 1770 var actual, naive, fast Key 1771 var tmpe ExtendedGroupElement 1772 1773 exp1.FromBytes(&p1) 1774 exp2.FromBytes(&p2) 1775 1776 //original 1777 AddKeys(&actual, &p1, &p2) 1778 1779 // naive 1780 var r CompletedGroupElement 1781 exp2.ToCached(&cached) 1782 geAdd(&r, &exp1, &cached) 1783 r.ToExtended(&tmpe) 1784 tmpe.ToBytes(&naive) 1785 1786 if actual != naive { 1787 t.Fatalf("Naive addition failed") 1788 } 1789 1790 exp2.ToPreComputed(&precomputed) 1791 geMixedAdd(&r, &exp1, &precomputed) 1792 r.ToExtended(&tmpe) 1793 tmpe.ToBytes(&fast) 1794 1795 if actual != fast { 1796 t.Fatalf("Fast addition failed") 1797 } 1798 } 1799 } 1800 1801 func TestPrecompute(t *testing.T) { 1802 1803 var table PRECOMPUTE_TABLE 1804 1805 s1 := *(RandomScalar()) 1806 //p1 := &GBASE //identity() // s1.PublicKey() 1807 p1 := s1.PublicKey() 1808 1809 GenPrecompute(&table, *p1) 1810 1811 //s1[1]=29 1812 1813 expected := ScalarMultKey(p1, &s1) 1814 1815 var actual Key 1816 1817 var result_extended ExtendedGroupElement 1818 ScalarMultPrecompute(&result_extended, &s1, &table) 1819 1820 result_extended.ToBytes(&actual) 1821 1822 //t.Logf("Super compute Expected %s actual %s", expected,actual) 1823 1824 if actual != *expected { 1825 t.Logf("Super compute failed Expected %s actual %s", expected, actual) 1826 } 1827 1828 } 1829 1830 func TestSuperPrecompute(t *testing.T) { 1831 var table PRECOMPUTE_TABLE 1832 var stable SUPER_PRECOMPUTE_TABLE 1833 1834 s1 := *(RandomScalar()) 1835 p1 := s1.PublicKey() 1836 1837 GenPrecompute(&table, *p1) 1838 GenSuperPrecompute(&stable, &table) 1839 1840 //s1[1]=29 1841 1842 expected := ScalarMultKey(p1, &s1) 1843 1844 var actual Key 1845 1846 var result_extended ExtendedGroupElement 1847 ScalarMultSuperPrecompute(&result_extended, &s1, &stable) 1848 1849 result_extended.ToBytes(&actual) 1850 1851 //t.Logf("Super compute Expected %s actual %s", expected,actual) 1852 1853 if actual != *expected { 1854 t.Logf("Super compute failed Expected %s actual %s", expected, actual) 1855 } 1856 1857 } 1858 1859 func Test_DoubleScalarDoubleBaseMulPrecomputed(t *testing.T) { 1860 1861 var ex ExtendedGroupElement 1862 1863 s1 := *(RandomScalar()) 1864 s2 := *(RandomScalar()) //*(RandomScalar()) //*(identity()) // *(RandomScalar()) 1865 1866 p1 := s1.PublicKey() 1867 p2 := s2.PublicKey() 1868 1869 first_part := ScalarMultKey(p1, &s1) 1870 second_part := ScalarMultKey(p2, &s2) 1871 1872 // do it traditional way 1873 var sum_result Key 1874 var actual Key 1875 AddKeys(&sum_result, first_part, second_part) 1876 1877 // lets do it using precomputed tables 1878 var table PRECOMPUTE_TABLE 1879 1880 GenDoublePrecompute(&table, *p1, *p2) 1881 1882 /* 1883 multprecompscalar(&ex,&s1) 1884 1885 1886 ex.ToBytes(&actual) 1887 1888 if *first_part != actual{ 1889 1890 //t.Logf("%+v table ", table) 1891 t.Fatalf("simple scalar precompyed failed expected %s actual %s", sum_result,actual) 1892 } 1893 */ 1894 1895 DoubleScalarDoubleBaseMulPrecomputed(&ex, &s1, &s2, &table) 1896 ex.ToBytes(&actual) 1897 1898 // t.Logf("first part %s", first_part) 1899 // t.Logf("second_part part %s", second_part) 1900 // t.Logf("actual %s expected %s", actual,sum_result) 1901 1902 if sum_result != actual { 1903 1904 //t.Logf("%+v table ", table) 1905 t.Fatalf("Double scalar precompyed failed %s %s", sum_result, actual) 1906 } 1907 1908 } 1909 1910 func BenchmarkDoublePrecompute(b *testing.B) { 1911 var table PRECOMPUTE_TABLE 1912 1913 s1 := *(identity()) // *(RandomScalar()) 1914 s2 := *(identity()) //*(RandomScalar()) //*(identity()) // *(RandomScalar()) 1915 1916 p1 := identity() //s1.PublicKey() 1917 p2 := s2.PublicKey() 1918 1919 GenDoublePrecompute(&table, *p1, *p2) 1920 1921 cpufile, err := os.Create("/tmp/dprecompute_cpuprofile.prof") 1922 if err != nil { 1923 1924 } 1925 if err := pprof.StartCPUProfile(cpufile); err != nil { 1926 } 1927 defer pprof.StopCPUProfile() 1928 1929 var result_extended ExtendedGroupElement 1930 result_extended.Zero() // make it identity 1931 1932 b.ResetTimer() 1933 1934 for i := 0; i < b.N; i++ { 1935 DoubleScalarDoubleBaseMulPrecomputed(&result_extended, &s1, &s2, &table) 1936 1937 } 1938 } 1939 1940 // test 64 bit version used for bulletproofs 1941 func Test_DoubleScalarDoubleBaseMulPrecomputed64(t *testing.T) { 1942 1943 var s1, s2 [64]Key 1944 var p1, p2 [64]Key 1945 1946 for i := 0; i < 64; i++ { 1947 s1[i] = *(RandomScalar()) 1948 s2[i] = *(RandomScalar()) //*(RandomScalar()) //*(identity()) // *(RandomScalar()) 1949 1950 p1[i] = *(s1[i].PublicKey()) 1951 p2[i] = *(s2[i].PublicKey()) 1952 1953 } 1954 1955 // compute actual result using naive method 1956 naive_result := Identity 1957 for i := 0; i < 64; i++ { 1958 1959 first_part := ScalarMultKey(&p1[i], &s1[i]) 1960 second_part := ScalarMultKey(&p2[i], &s2[i]) 1961 1962 // do it traditional way 1963 var sum_result Key 1964 AddKeys(&sum_result, first_part, second_part) 1965 AddKeys(&naive_result, &naive_result, &sum_result) 1966 1967 } 1968 1969 // lets do it using precomputed tables 1970 var table [64]PRECOMPUTE_TABLE 1971 for i := 0; i < 64; i++ { 1972 GenDoublePrecompute(&table[i], p1[i], p2[i]) 1973 } 1974 1975 var ex ExtendedGroupElement 1976 var actual Key 1977 DoubleScalarDoubleBaseMulPrecomputed64(&ex, s1[:], s2[:], table[:]) 1978 1979 ex.ToBytes(&actual) 1980 1981 // t.Logf("first part %s", first_part) 1982 // t.Logf("second_part part %s", second_part) 1983 // t.Logf("actual %s expected %s", actual,sum_result) 1984 1985 if naive_result != actual { 1986 1987 //t.Logf("%+v table ", table) 1988 t.Fatalf("Double scalar precomputed 64 failed expected %s actual %s", naive_result, actual) 1989 } 1990 1991 } 1992 1993 // test 64 bit version used for bulletproofs 1994 func Benchmark_DoubleScalarDoubleBaseMulPrecomputed64(b *testing.B) { 1995 1996 var s1, s2 [64]Key 1997 var p1, p2 [64]Key 1998 1999 for i := 0; i < 64; i++ { 2000 s1[i] = *(RandomScalar()) 2001 s2[i] = *(RandomScalar()) //*(RandomScalar()) //*(identity()) // *(RandomScalar()) 2002 2003 p1[i] = *(s1[i].PublicKey()) 2004 p2[i] = *(s2[i].PublicKey()) 2005 2006 } 2007 2008 // compute actual result using naive method 2009 naive_result := Identity 2010 for i := 0; i < 64; i++ { 2011 2012 first_part := ScalarMultKey(&p1[i], &s1[i]) 2013 second_part := ScalarMultKey(&p2[i], &s2[i]) 2014 2015 // do it traditional way 2016 var sum_result Key 2017 AddKeys(&sum_result, first_part, second_part) 2018 AddKeys(&naive_result, &naive_result, &sum_result) 2019 2020 } 2021 2022 // lets do it using precomputed tables 2023 var table [64]PRECOMPUTE_TABLE 2024 for i := 0; i < 64; i++ { 2025 GenDoublePrecompute(&table[i], p1[i], p2[i]) 2026 } 2027 2028 var ex ExtendedGroupElement 2029 var actual Key 2030 2031 b.ResetTimer() 2032 2033 for i := 0; i < b.N; i++ { 2034 DoubleScalarDoubleBaseMulPrecomputed64(&ex, s1[:], s2[:], table[:]) 2035 2036 ex.ToBytes(&actual) 2037 2038 // t.Logf("first part %s", first_part) 2039 // t.Logf("second_part part %s", second_part) 2040 // t.Logf("actual %s expected %s", actual,sum_result) 2041 2042 if naive_result != actual { 2043 2044 //t.Logf("%+v table ", table) 2045 b.Fatalf("Double scalar precomputed 64 failed expected %s actual %s", naive_result, actual) 2046 } 2047 } 2048 2049 } 2050 2051 func BenchmarkPrecompute(b *testing.B) { 2052 var table PRECOMPUTE_TABLE 2053 2054 GenPrecompute(&table, GBASE) 2055 2056 s1 := *(RandomScalar()) 2057 //s1[1]=29 2058 2059 /* 2060 cpufile,err := os.Create("/tmp/precompute_cpuprofile.prof") 2061 if err != nil{ 2062 2063 } 2064 if err := pprof.StartCPUProfile(cpufile); err != nil { 2065 } 2066 defer pprof.StopCPUProfile() 2067 2068 */ 2069 2070 var result_extended ExtendedGroupElement 2071 result_extended.Zero() // make it identity 2072 2073 b.ResetTimer() 2074 2075 for i := 0; i < b.N; i++ { 2076 result_extended.Zero() // make it identity 2077 2078 ScalarMultPrecompute(&result_extended, &s1, &table) 2079 2080 } 2081 } 2082 2083 func BenchmarkSuperPrecompute(b *testing.B) { 2084 var table PRECOMPUTE_TABLE 2085 var stable SUPER_PRECOMPUTE_TABLE 2086 2087 GenPrecompute(&table, GBASE) 2088 GenSuperPrecompute(&stable, &table) 2089 2090 s1 := *(RandomScalar()) 2091 //s1[1]=29 2092 2093 /* 2094 cpufile,err := os.Create("/tmp/superprecompute_cpuprofile.prof") 2095 if err != nil{ 2096 2097 } 2098 if err := pprof.StartCPUProfile(cpufile); err != nil { 2099 } 2100 defer pprof.StopCPUProfile() 2101 2102 */ 2103 2104 var result_extended ExtendedGroupElement 2105 result_extended.Zero() // make it identity 2106 2107 b.ResetTimer() 2108 2109 for i := 0; i < b.N; i++ { 2110 result_extended.Zero() // make it identity 2111 2112 ScalarMultSuperPrecompute(&result_extended, &s1, &stable) 2113 2114 } 2115 } 2116 2117 func BenchmarkGeScalarMultBase(b *testing.B) { 2118 var s Key 2119 rand.Reader.Read(s[:]) 2120 var P ExtendedGroupElement 2121 2122 b.ResetTimer() 2123 for i := 0; i < b.N; i++ { 2124 GeScalarMultBase(&P, &s) 2125 } 2126 } 2127 2128 func BenchmarkGeScalarMult(b *testing.B) { 2129 var s Key 2130 rand.Reader.Read(s[:]) 2131 2132 var P ExtendedGroupElement 2133 var E ProjectiveGroupElement 2134 s[31] &= 127 2135 GeScalarMultBase(&P, &s) 2136 2137 b.ResetTimer() 2138 for i := 0; i < b.N; i++ { 2139 GeScalarMult(&E, &s, &P) 2140 } 2141 } 2142 2143 func BenchmarkGeDoubleScalarMultVartime(b *testing.B) { 2144 var s Key 2145 rand.Reader.Read(s[:]) 2146 2147 var P, Pout ExtendedGroupElement 2148 s[31] &= 127 2149 GeScalarMultBase(&P, &s) 2150 _ = Pout 2151 2152 var out ProjectiveGroupElement 2153 2154 b.ResetTimer() 2155 var x Key 2156 for i := 0; i < b.N; i++ { 2157 GeDoubleScalarMultVartime(&out, &s, &P, &x) 2158 //out.ToExtended(&Pout) 2159 } 2160 } 2161 2162 /* 2163 func BenchmarkGeAdd(b *testing.B) { 2164 var s Key 2165 rand.Reader.Read(s[:]) 2166 2167 var R, P ExtendedGroupElement 2168 s[31] &= 127 2169 GeScalarMultBase(&P, &s) 2170 R = P 2171 2172 b.ResetTimer() 2173 for i := 0; i < b.N; i++ { 2174 GeAdd(&R, &R, &P) 2175 } 2176 } 2177 */ 2178 2179 /* 2180 func BenchmarkGeDouble(b *testing.B) { 2181 var s [32]byte 2182 rand.Reader.Read(s[:]) 2183 2184 var R, P ExtendedGroupElement 2185 s[31] &= 127 2186 GeScalarMultBase(&P, &s) 2187 R = P 2188 2189 b.ResetTimer() 2190 for i := 0; i < b.N; i++ { 2191 GeDouble(&R, &P) 2192 } 2193 } 2194 */