7 #if defined HAVE_CONFIG_H
8 #include "libsecp256k1-config.h"
21 #ifdef ENABLE_OPENSSL_TESTS
22 #include "openssl/bn.h"
23 #include "openssl/ec.h"
24 #include "openssl/ecdsa.h"
25 #include "openssl/obj_mac.h"
26 # if OPENSSL_VERSION_NUMBER < 0x10100000L
27 void ECDSA_SIG_get0(
const ECDSA_SIG *sig,
const BIGNUM **pr,
const BIGNUM **ps) {*pr = sig->r; *ps = sig->s;}
34 #if !defined(VG_CHECK)
35 # if defined(VALGRIND)
36 # include <valgrind/memcheck.h>
37 # define VG_UNDEF(x,y) VALGRIND_MAKE_MEM_UNDEFINED((x),(y))
38 # define VG_CHECK(x,y) VALGRIND_CHECK_MEM_IS_DEFINED((x),(y))
40 # define VG_UNDEF(x,y)
41 # define VG_CHECK(x,y)
45 static int count = 64;
48 static void counting_illegal_callback_fn(
const char* str,
void* data) {
56 static void uncounting_illegal_callback_fn(
const char* str,
void* data) {
66 unsigned char b32[32];
67 secp256k1_rand256_test(b32);
68 if (secp256k1_fe_set_b32(fe, b32)) {
76 int n = secp256k1_rand_int(9);
77 secp256k1_fe_normalize(fe);
81 secp256k1_fe_clear(&zero);
82 secp256k1_fe_negate(&zero, &zero, 0);
83 secp256k1_fe_mul_int(&zero, n - 1);
84 secp256k1_fe_add(fe, &zero);
92 if (secp256k1_ge_set_xo_var(ge, &fe, secp256k1_rand_bits(1))) {
93 secp256k1_fe_normalize(&ge->
y);
103 if (!secp256k1_fe_is_zero(&gej->
z)) {
107 secp256k1_fe_sqr(&z2, &gej->
z);
108 secp256k1_fe_mul(&z3, &z2, &gej->
z);
109 secp256k1_fe_mul(&gej->
x, &ge->
x, &z2);
110 secp256k1_fe_mul(&gej->
y, &ge->
y, &z3);
116 unsigned char b32[32];
118 secp256k1_rand256_test(b32);
119 secp256k1_scalar_set_b32(num, b32, &overflow);
120 if (overflow || secp256k1_scalar_is_zero(num)) {
129 unsigned char b32[32];
131 secp256k1_rand256(b32);
132 secp256k1_scalar_set_b32(num, b32, &overflow);
133 if (overflow || secp256k1_scalar_is_zero(num)) {
146 CHECK(secp256k1_clz64_var(0) == 64);
147 CHECK(secp256k1_clz64_var(1) == 63);
148 CHECK(secp256k1_clz64_var(2) == 62);
149 CHECK(secp256k1_clz64_var(3) == 62);
150 CHECK(secp256k1_clz64_var(~0ULL) == 0);
151 CHECK(secp256k1_clz64_var((~0ULL) - 1) == 0);
152 CHECK(secp256k1_clz64_var((~0ULL) >> 1) == 1);
153 CHECK(secp256k1_clz64_var((~0ULL) >> 2) == 2);
154 CHECK(secp256k1_sign_and_abs64(&
r, INT64_MAX) == 0);
156 CHECK(secp256k1_sign_and_abs64(&
r, INT64_MAX - 1) == 0);
157 CHECK(
r == INT64_MAX - 1);
158 CHECK(secp256k1_sign_and_abs64(&
r, INT64_MIN) == 1);
159 CHECK(
r == (uint64_t)INT64_MAX + 1);
160 CHECK(secp256k1_sign_and_abs64(&
r, INT64_MIN + 1) == 1);
161 CHECK(
r == (uint64_t)INT64_MAX);
162 CHECK(secp256k1_sign_and_abs64(&
r, 0) == 0);
164 CHECK(secp256k1_sign_and_abs64(&
r, 1) == 0);
166 CHECK(secp256k1_sign_and_abs64(&
r, -1) == 1);
168 CHECK(secp256k1_sign_and_abs64(&
r, 2) == 0);
170 CHECK(secp256k1_sign_and_abs64(&
r, -2) == 1);
172 for (i = 0; i < 10; i++) {
173 CHECK(secp256k1_clz64_var((~0ULL) - secp256k1_rand32()) == 0);
174 r = ((uint64_t)secp256k1_rand32() << 32) | secp256k1_rand32();
175 r2 = secp256k1_rands64(0,
r);
177 r3 = secp256k1_rands64(r2,
r);
178 CHECK((r3 >= r2) && (r3 <=
r));
179 r = secp256k1_rands64(0, INT64_MAX);
180 s = (int64_t)
r * (secp256k1_rand32()&1?-1:1);
181 CHECK(secp256k1_sign_and_abs64(&r2, s) == (s < 0));
190 unsigned char ctmp[32];
203 memset(&zero_pubkey, 0,
sizeof(zero_pubkey));
232 secp256k1_ge_set_gej(&pub, &pubj);
246 CHECK(ecount2 == 10);
248 CHECK(ecount2 == 11);
252 CHECK(ecount2 == 12);
256 CHECK(ecount2 == 13);
262 CHECK(ecount2 == 14);
270 CHECK(ecount2 == 14);
276 secp256k1_ecmult_context_build(&vrfy->
ecmult_ctx, NULL);
281 }
while(!secp256k1_ecdsa_sig_sign(&both->
ecmult_gen_ctx, &sigr, &sigs, &
key, &msg, &nonce, NULL));
288 CHECK(secp256k1_ecdsa_sig_verify(&vrfy->
ecmult_ctx, &sigr, &sigs, &pub, &msg));
289 CHECK(secp256k1_ecdsa_sig_verify(&both->
ecmult_ctx, &sigr, &sigs, &pub, &msg));
309 CHECK(scratch != NULL);
313 CHECK(secp256k1_scratch_max_allocation(scratch, 0) == 1000);
314 CHECK(secp256k1_scratch_max_allocation(scratch, 1) < 1000);
317 CHECK(secp256k1_scratch_alloc(scratch, 500) == NULL);
318 CHECK(secp256k1_scratch_max_allocation(scratch, 0) == 1000);
321 CHECK(secp256k1_scratch_allocate_frame(scratch, 500, 1 == 1));
322 CHECK(secp256k1_scratch_max_allocation(scratch, 1) < 500);
323 CHECK(secp256k1_scratch_alloc(scratch, 500) != NULL);
324 CHECK(secp256k1_scratch_alloc(scratch, 500) == NULL);
326 CHECK(secp256k1_scratch_allocate_frame(scratch, 500, 1) == 0);
329 secp256k1_scratch_deallocate_frame(scratch);
330 CHECK(secp256k1_scratch_max_allocation(scratch, 0) == 1000);
331 CHECK(secp256k1_scratch_alloc(scratch, 500) == NULL);
341 static const char *inputs[8] = {
342 "",
"abc",
"message digest",
"secure hash algorithm",
"SHA256 is considered to be safe",
343 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
344 "For this sample, this 63-byte string will be used as input data",
345 "This is exactly 64 bytes long, not counting the terminating byte"
347 static const unsigned char outputs[8][32] = {
348 {0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55},
349 {0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23, 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c, 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad},
350 {0xf7, 0x84, 0x6f, 0x55, 0xcf, 0x23, 0xe1, 0x4e, 0xeb, 0xea, 0xb5, 0xb4, 0xe1, 0x55, 0x0c, 0xad, 0x5b, 0x50, 0x9e, 0x33, 0x48, 0xfb, 0xc4, 0xef, 0xa3, 0xa1, 0x41, 0x3d, 0x39, 0x3c, 0xb6, 0x50},
351 {0xf3, 0x0c, 0xeb, 0x2b, 0xb2, 0x82, 0x9e, 0x79, 0xe4, 0xca, 0x97, 0x53, 0xd3, 0x5a, 0x8e, 0xcc, 0x00, 0x26, 0x2d, 0x16, 0x4c, 0xc0, 0x77, 0x08, 0x02, 0x95, 0x38, 0x1c, 0xbd, 0x64, 0x3f, 0x0d},
352 {0x68, 0x19, 0xd9, 0x15, 0xc7, 0x3f, 0x4d, 0x1e, 0x77, 0xe4, 0xe1, 0xb5, 0x2d, 0x1f, 0xa0, 0xf9, 0xcf, 0x9b, 0xea, 0xea, 0xd3, 0x93, 0x9f, 0x15, 0x87, 0x4b, 0xd9, 0x88, 0xe2, 0xa2, 0x36, 0x30},
353 {0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8, 0xe5, 0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39, 0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67, 0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1},
354 {0xf0, 0x8a, 0x78, 0xcb, 0xba, 0xee, 0x08, 0x2b, 0x05, 0x2a, 0xe0, 0x70, 0x8f, 0x32, 0xfa, 0x1e, 0x50, 0xc5, 0xc4, 0x21, 0xaa, 0x77, 0x2b, 0xa5, 0xdb, 0xb4, 0x06, 0xa2, 0xea, 0x6b, 0xe3, 0x42},
355 {0xab, 0x64, 0xef, 0xf7, 0xe8, 0x8e, 0x2e, 0x46, 0x16, 0x5e, 0x29, 0xf2, 0xbc, 0xe4, 0x18, 0x26, 0xbd, 0x4c, 0x7b, 0x35, 0x52, 0xf6, 0xb3, 0x82, 0xa9, 0xe7, 0xd3, 0xaf, 0x47, 0xc2, 0x45, 0xf8}
358 for (i = 0; i < 8; i++) {
359 unsigned char out[32];
361 secp256k1_sha256_initialize(&hasher);
362 secp256k1_sha256_write(&hasher, (
const unsigned char*)(inputs[i]), strlen(inputs[i]));
363 secp256k1_sha256_finalize(&hasher, out);
364 CHECK(memcmp(out, outputs[i], 32) == 0);
365 if (strlen(inputs[i]) > 0) {
366 int split = secp256k1_rand_int(strlen(inputs[i]));
367 secp256k1_sha256_initialize(&hasher);
368 secp256k1_sha256_write(&hasher, (
const unsigned char*)(inputs[i]), split);
369 secp256k1_sha256_write(&hasher, (
const unsigned char*)(inputs[i] + split), strlen(inputs[i]) - split);
370 secp256k1_sha256_finalize(&hasher, out);
371 CHECK(memcmp(out, outputs[i], 32) == 0);
377 static const char *keys[6] = {
378 "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
380 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
381 "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19",
382 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
383 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
385 static const char *inputs[6] = {
386 "\x48\x69\x20\x54\x68\x65\x72\x65",
387 "\x77\x68\x61\x74\x20\x64\x6f\x20\x79\x61\x20\x77\x61\x6e\x74\x20\x66\x6f\x72\x20\x6e\x6f\x74\x68\x69\x6e\x67\x3f",
388 "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd",
389 "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd",
390 "\x54\x65\x73\x74\x20\x55\x73\x69\x6e\x67\x20\x4c\x61\x72\x67\x65\x72\x20\x54\x68\x61\x6e\x20\x42\x6c\x6f\x63\x6b\x2d\x53\x69\x7a\x65\x20\x4b\x65\x79\x20\x2d\x20\x48\x61\x73\x68\x20\x4b\x65\x79\x20\x46\x69\x72\x73\x74",
391 "\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x74\x65\x73\x74\x20\x75\x73\x69\x6e\x67\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b\x2d\x73\x69\x7a\x65\x20\x6b\x65\x79\x20\x61\x6e\x64\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b\x2d\x73\x69\x7a\x65\x20\x64\x61\x74\x61\x2e\x20\x54\x68\x65\x20\x6b\x65\x79\x20\x6e\x65\x65\x64\x73\x20\x74\x6f\x20\x62\x65\x20\x68\x61\x73\x68\x65\x64\x20\x62\x65\x66\x6f\x72\x65\x20\x62\x65\x69\x6e\x67\x20\x75\x73\x65\x64\x20\x62\x79\x20\x74\x68\x65\x20\x48\x4d\x41\x43\x20\x61\x6c\x67\x6f\x72\x69\x74\x68\x6d\x2e"
393 static const unsigned char outputs[6][32] = {
394 {0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf, 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83, 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7},
395 {0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27, 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43},
396 {0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8, 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8, 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe},
397 {0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81, 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78, 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b},
398 {0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26, 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28, 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54},
399 {0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f, 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07, 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2}
402 for (i = 0; i < 6; i++) {
404 unsigned char out[32];
405 secp256k1_hmac_sha256_initialize(&hasher, (
const unsigned char*)(keys[i]), strlen(keys[i]));
406 secp256k1_hmac_sha256_write(&hasher, (
const unsigned char*)(inputs[i]), strlen(inputs[i]));
407 secp256k1_hmac_sha256_finalize(&hasher, out);
408 CHECK(memcmp(out, outputs[i], 32) == 0);
409 if (strlen(inputs[i]) > 0) {
410 int split = secp256k1_rand_int(strlen(inputs[i]));
411 secp256k1_hmac_sha256_initialize(&hasher, (
const unsigned char*)(keys[i]), strlen(keys[i]));
412 secp256k1_hmac_sha256_write(&hasher, (
const unsigned char*)(inputs[i]), split);
413 secp256k1_hmac_sha256_write(&hasher, (
const unsigned char*)(inputs[i] + split), strlen(inputs[i]) - split);
414 secp256k1_hmac_sha256_finalize(&hasher, out);
415 CHECK(memcmp(out, outputs[i], 32) == 0);
421 static const unsigned char key1[65] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x00, 0x4b, 0xf5, 0x12, 0x2f, 0x34, 0x45, 0x54, 0xc5, 0x3b, 0xde, 0x2e, 0xbb, 0x8c, 0xd2, 0xb7, 0xe3, 0xd1, 0x60, 0x0a, 0xd6, 0x31, 0xc3, 0x85, 0xa5, 0xd7, 0xcc, 0xe2, 0x3c, 0x77, 0x85, 0x45, 0x9a, 0};
422 static const unsigned char out1[3][32] = {
423 {0x4f, 0xe2, 0x95, 0x25, 0xb2, 0x08, 0x68, 0x09, 0x15, 0x9a, 0xcd, 0xf0, 0x50, 0x6e, 0xfb, 0x86, 0xb0, 0xec, 0x93, 0x2c, 0x7b, 0xa4, 0x42, 0x56, 0xab, 0x32, 0x1e, 0x42, 0x1e, 0x67, 0xe9, 0xfb},
424 {0x2b, 0xf0, 0xff, 0xf1, 0xd3, 0xc3, 0x78, 0xa2, 0x2d, 0xc5, 0xde, 0x1d, 0x85, 0x65, 0x22, 0x32, 0x5c, 0x65, 0xb5, 0x04, 0x49, 0x1a, 0x0c, 0xbd, 0x01, 0xcb, 0x8f, 0x3a, 0xa6, 0x7f, 0xfd, 0x4a},
425 {0xf5, 0x28, 0xb4, 0x10, 0xcb, 0x54, 0x1f, 0x77, 0x00, 0x0d, 0x7a, 0xfb, 0x6c, 0x5b, 0x53, 0xc5, 0xc4, 0x71, 0xea, 0xb4, 0x3e, 0x46, 0x6d, 0x9a, 0xc5, 0x19, 0x0c, 0x39, 0xc8, 0x2f, 0xd8, 0x2e}
428 static const unsigned char key2[64] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55};
429 static const unsigned char out2[3][32] = {
430 {0x9c, 0x23, 0x6c, 0x16, 0x5b, 0x82, 0xae, 0x0c, 0xd5, 0x90, 0x65, 0x9e, 0x10, 0x0b, 0x6b, 0xab, 0x30, 0x36, 0xe7, 0xba, 0x8b, 0x06, 0x74, 0x9b, 0xaf, 0x69, 0x81, 0xe1, 0x6f, 0x1a, 0x2b, 0x95},
431 {0xdf, 0x47, 0x10, 0x61, 0x62, 0x5b, 0xc0, 0xea, 0x14, 0xb6, 0x82, 0xfe, 0xee, 0x2c, 0x9c, 0x02, 0xf2, 0x35, 0xda, 0x04, 0x20, 0x4c, 0x1d, 0x62, 0xa1, 0x53, 0x6c, 0x6e, 0x17, 0xae, 0xd7, 0xa9},
432 {0x75, 0x97, 0x88, 0x7c, 0xbd, 0x76, 0x32, 0x1f, 0x32, 0xe3, 0x04, 0x40, 0x67, 0x9a, 0x22, 0xcf, 0x7f, 0x8d, 0x9d, 0x2e, 0xac, 0x39, 0x0e, 0x58, 0x1f, 0xea, 0x09, 0x1c, 0xe2, 0x02, 0xba, 0x94}
436 unsigned char out[32];
439 secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 64);
440 for (i = 0; i < 3; i++) {
441 secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32);
442 CHECK(memcmp(out, out1[i], 32) == 0);
444 secp256k1_rfc6979_hmac_sha256_finalize(&rng);
446 secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 65);
447 for (i = 0; i < 3; i++) {
448 secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32);
449 CHECK(memcmp(out, out1[i], 32) != 0);
451 secp256k1_rfc6979_hmac_sha256_finalize(&rng);
453 secp256k1_rfc6979_hmac_sha256_initialize(&rng, key2, 64);
454 for (i = 0; i < 3; i++) {
455 secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32);
456 CHECK(memcmp(out, out2[i], 32) == 0);
458 secp256k1_rfc6979_hmac_sha256_finalize(&rng);
466 static const unsigned int rounds[7] = {1, 30, 73, 156, 322, 653, 1316};
469 static const uint32_t mults[6] = {1, 3, 21, 289, 0x9999, 0x80402011};
471 unsigned int usebits = bits > 6 ? 6 : bits;
472 unsigned int maxshift = bits - usebits;
475 uint64_t x[6][27] = {{0}};
476 unsigned int i, shift, m;
479 for (i = 0; i < rounds[usebits]; i++) {
480 uint32_t
r = (rand32 ? secp256k1_rand32() : secp256k1_rand_bits(bits));
481 CHECK((((uint64_t)
r) >> bits) == 0);
482 for (m = 0; m <
sizeof(mults) /
sizeof(mults[0]); m++) {
483 uint32_t rm =
r * mults[m];
484 for (shift = 0; shift <= maxshift; shift++) {
485 x[m][shift] |= (((uint64_t)1) << ((rm >> shift) & ((1 << usebits) - 1)));
489 for (m = 0; m <
sizeof(mults) /
sizeof(mults[0]); m++) {
490 for (shift = 0; shift <= maxshift; shift++) {
492 CHECK(((~x[m][shift]) << (64 - (1 << usebits))) == 0);
500 int rounds = (subrange * 2073) / 100;
503 CHECK((range % subrange) == 0);
504 for (i = 0; i < rounds; i++) {
505 uint32_t
r = secp256k1_rand_int(range);
508 x |= (((uint64_t)1) <<
r);
511 CHECK(((~x) << (64 - subrange)) == 0);
517 for (
b = 1;
b <= 32;
b++) {
523 static const uint32_t ms[] = {1, 3, 17, 1000, 13771, 999999, 33554432};
524 static const uint32_t ss[] = {1, 3, 6, 9, 13, 31, 64};
526 for (m = 0; m <
sizeof(ms) /
sizeof(ms[0]); m++) {
527 for (s = 0; s <
sizeof(ss) /
sizeof(ss[0]); s++) {
537 if (secp256k1_rand_bits(1)) {
538 secp256k1_num_negate(num);
545 secp256k1_scalar_get_num(num, &sc);
551 secp256k1_scalar_get_num(num, &sc);
559 secp256k1_num_copy(&n2, &n1);
560 secp256k1_num_sub(&n1, &n2, &n1);
561 CHECK(secp256k1_num_is_zero(&n1));
562 secp256k1_num_copy(&n1, &n2);
563 secp256k1_num_negate(&n1);
564 CHECK(!secp256k1_num_is_zero(&n1));
565 secp256k1_num_add(&n1, &n2, &n1);
566 CHECK(secp256k1_num_is_zero(&n1));
567 secp256k1_num_copy(&n1, &n2);
568 secp256k1_num_negate(&n1);
569 CHECK(secp256k1_num_is_neg(&n1) != secp256k1_num_is_neg(&n2));
570 secp256k1_num_negate(&n1);
571 CHECK(secp256k1_num_eq(&n1, &n2));
581 if (secp256k1_rand_bits(1)) {
585 if (secp256k1_rand_bits(1)) {
588 secp256k1_num_add(&n1p2, &n1, &n2);
589 secp256k1_num_add(&n2p1, &n2, &n1);
590 secp256k1_num_sub(&n1m2, &n1, &n2);
591 secp256k1_num_sub(&n2m1, &n2, &n1);
592 CHECK(secp256k1_num_eq(&n1p2, &n2p1));
593 CHECK(!secp256k1_num_eq(&n1p2, &n1m2));
594 secp256k1_num_negate(&n2m1);
595 CHECK(secp256k1_num_eq(&n2m1, &n1m2));
596 CHECK(!secp256k1_num_eq(&n2m1, &n1));
597 secp256k1_num_add(&n2m1, &n2m1, &n2);
598 CHECK(secp256k1_num_eq(&n2m1, &n1));
599 CHECK(!secp256k1_num_eq(&n2p1, &n1));
600 secp256k1_num_sub(&n2p1, &n2p1, &n2);
601 CHECK(secp256k1_num_eq(&n2p1, &n1));
604 secp256k1_scalar_set_int(&s, 1);
605 secp256k1_scalar_get_num(&n1, &s);
606 CHECK(secp256k1_num_is_one(&n1));
608 secp256k1_scalar_get_num(&n2, &s);
609 for (i = 0; i < 250; ++i) {
610 secp256k1_num_add(&n1, &n1, &n1);
611 secp256k1_num_add(&n1p2, &n1, &n2);
612 CHECK(!secp256k1_num_is_one(&n1p2));
623 secp256k1_scalar_get_num(&order, &s);
624 secp256k1_scalar_set_int(&s, 0);
625 secp256k1_scalar_get_num(&n, &s);
626 secp256k1_num_mod(&n, &order);
627 CHECK(secp256k1_num_is_zero(&n));
630 secp256k1_scalar_set_int(&s, 1);
631 secp256k1_scalar_get_num(&order, &s);
632 secp256k1_scalar_get_num(&n, &s);
633 secp256k1_num_mod(&n, &order);
634 CHECK(secp256k1_num_is_zero(&n));
638 secp256k1_scalar_get_num(&n, &s);
640 for (i = 0; i < 8; ++i) {
641 secp256k1_num_add(&n, &n, &n);
643 secp256k1_num_mod(&n, &order);
644 CHECK(secp256k1_num_is_zero(&n));
654 const int jacobi5[10] = { 0, 1, -1, -1, 1, 0, 1, -1, -1, 1 };
657 secp256k1_scalar_set_int(&five, 5);
658 secp256k1_scalar_get_num(&order, &five);
659 for (i = 0; i < 10; ++i) {
660 secp256k1_scalar_set_int(&small, i);
661 secp256k1_scalar_get_num(&n, &small);
662 CHECK(secp256k1_num_jacobi(&n, &order) == jacobi5[i]);
666 secp256k1_scalar_get_num(&order, &five);
671 secp256k1_scalar_get_num(&fiven, &five);
672 secp256k1_scalar_get_num(&n, &sqr);
673 secp256k1_num_mod(&n, &fiven);
674 }
while (secp256k1_num_is_zero(&n));
677 if (secp256k1_num_jacobi(&n, &order) == -1) {
678 secp256k1_num_add(&n, &n, &n);
682 CHECK(secp256k1_num_jacobi(&n, &order) == 1);
684 secp256k1_num_add(&n, &n, &n);
685 CHECK(secp256k1_num_jacobi(&n, &order) == -1);
688 secp256k1_scalar_order_get_num(&order);
690 secp256k1_scalar_sqr(&sqr, &sqr);
692 secp256k1_scalar_get_num(&n, &sqr);
693 CHECK(secp256k1_num_jacobi(&n, &order) == 1);
695 secp256k1_scalar_mul(&sqr, &sqr, &five);
696 secp256k1_scalar_get_num(&n, &sqr);
697 CHECK(secp256k1_num_jacobi(&n, &order) == -1);
699 CHECK(secp256k1_num_jacobi(&order, &order) == 0);
702 secp256k1_scalar_set_int(&small, 1);
703 secp256k1_scalar_get_num(&n, &small);
704 secp256k1_num_sub(&n, &order, &n);
705 CHECK(secp256k1_num_jacobi(&n, &order) == 1);
710 for (i = 0; i < 100*count; i++) {
739 secp256k1_scalar_get_b32(c, &s2);
742 secp256k1_scalar_get_num(&snum, &s);
743 secp256k1_scalar_get_num(&s1num, &s1);
744 secp256k1_scalar_get_num(&s2num, &s2);
746 secp256k1_scalar_order_get_num(&order);
748 secp256k1_num_shift(&half_order, 1);
755 secp256k1_scalar_set_int(&n, 0);
756 for (i = 0; i < 256; i += 4) {
759 secp256k1_scalar_set_int(&t, secp256k1_scalar_get_bits(&s, 256 - 4 - i, 4));
760 for (j = 0; j < 4; j++) {
761 secp256k1_scalar_add(&n, &n, &n);
763 secp256k1_scalar_add(&n, &n, &t);
765 CHECK(secp256k1_scalar_eq(&n, &s));
772 secp256k1_scalar_set_int(&n, 0);
776 int now = secp256k1_rand_int(15) + 1;
780 secp256k1_scalar_set_int(&t, secp256k1_scalar_get_bits_var(&s, 256 - now - i, now));
781 for (j = 0; j < now; j++) {
782 secp256k1_scalar_add(&n, &n, &n);
784 secp256k1_scalar_add(&n, &n, &t);
787 CHECK(secp256k1_scalar_eq(&n, &s));
796 secp256k1_num_add(&rnum, &snum, &s2num);
797 secp256k1_num_mod(&rnum, &order);
798 secp256k1_scalar_add(&
r, &s, &s2);
799 secp256k1_scalar_get_num(&r2num, &
r);
800 CHECK(secp256k1_num_eq(&rnum, &r2num));
808 secp256k1_num_mul(&rnum, &snum, &s2num);
809 secp256k1_num_mod(&rnum, &order);
810 secp256k1_scalar_mul(&
r, &s, &s2);
811 secp256k1_scalar_get_num(&r2num, &
r);
812 CHECK(secp256k1_num_eq(&rnum, &r2num));
814 CHECK(secp256k1_scalar_is_zero(&
r) == (secp256k1_scalar_is_zero(&s) || secp256k1_scalar_is_zero(&s2)));
816 CHECK(secp256k1_num_eq(&rnum, &snum) == (secp256k1_scalar_is_zero(&s) || secp256k1_scalar_is_one(&s2)));
817 CHECK(secp256k1_num_eq(&rnum, &s2num) == (secp256k1_scalar_is_zero(&s2) || secp256k1_scalar_is_one(&s)));
825 CHECK(secp256k1_num_is_zero(&snum) == secp256k1_scalar_is_zero(&s));
827 CHECK(secp256k1_scalar_is_high(&s) == (secp256k1_num_cmp(&snum, &half_order) > 0));
828 secp256k1_scalar_negate(&neg, &s);
829 secp256k1_num_sub(&negnum, &order, &snum);
830 secp256k1_num_mod(&negnum, &order);
832 CHECK(secp256k1_scalar_is_high(&neg) == (secp256k1_num_cmp(&negnum, &half_order) > 0));
834 CHECK((secp256k1_scalar_is_high(&s) == secp256k1_scalar_is_high(&neg)) == secp256k1_scalar_is_zero(&s));
835 secp256k1_scalar_get_num(&negnum2, &neg);
837 CHECK(secp256k1_num_eq(&negnum, &negnum2));
838 secp256k1_scalar_add(&neg, &neg, &s);
840 CHECK(secp256k1_scalar_is_zero(&neg));
841 secp256k1_scalar_negate(&neg, &neg);
843 CHECK(secp256k1_scalar_is_zero(&neg));
852 unsigned char cone[1] = {0x01};
853 unsigned int shift = 256 + secp256k1_rand_int(257);
854 secp256k1_scalar_mul_shift_var(&
r, &s1, &s2, shift);
855 secp256k1_num_mul(&rnum, &s1num, &s2num);
856 secp256k1_num_shift(&rnum, shift - 1);
857 secp256k1_num_set_bin(&one, cone, 1);
858 secp256k1_num_add(&rnum, &rnum, &one);
859 secp256k1_num_shift(&rnum, 1);
860 secp256k1_scalar_get_num(&rnum2, &
r);
861 CHECK(secp256k1_num_eq(&rnum, &rnum2));
869 for (i = 0; i < 100; ++i) {
871 int shift = 1 + secp256k1_rand_int(15);
872 int expected =
r.d[0] % (1 << shift);
873 low = secp256k1_scalar_shr_int(&
r, shift);
881 if (!secp256k1_scalar_is_zero(&s)) {
887 secp256k1_scalar_inverse(&inv, &s);
889 secp256k1_num_mod_inverse(&invnum, &snum, &order);
890 secp256k1_scalar_get_num(&invnum2, &inv);
891 CHECK(secp256k1_num_eq(&invnum, &invnum2));
893 secp256k1_scalar_mul(&inv, &inv, &s);
895 CHECK(secp256k1_scalar_is_one(&inv));
896 secp256k1_scalar_inverse(&inv, &inv);
898 CHECK(secp256k1_scalar_is_one(&inv));
900 secp256k1_scalar_get_num(&invnum, &inv);
901 CHECK(secp256k1_num_is_one(&invnum));
909 secp256k1_scalar_add(&r1, &s1, &s2);
910 secp256k1_scalar_add(&r2, &s2, &s1);
911 CHECK(secp256k1_scalar_eq(&r1, &r2));
919 int bit = secp256k1_rand_bits(8);
920 secp256k1_scalar_set_int(&
b, 1);
921 CHECK(secp256k1_scalar_is_one(&
b));
922 for (i = 0; i < bit; i++) {
923 secp256k1_scalar_add(&
b, &
b, &
b);
927 if (!secp256k1_scalar_add(&r1, &r1, &
b)) {
929 secp256k1_scalar_cadd_bit(&r2, bit, 1);
930 CHECK(secp256k1_scalar_eq(&r1, &r2));
932 secp256k1_scalar_cadd_bit(&r2, bit, 0);
933 CHECK(secp256k1_scalar_eq(&r1, &r2));
940 secp256k1_scalar_mul(&r1, &s1, &s2);
941 secp256k1_scalar_mul(&r2, &s2, &s1);
942 CHECK(secp256k1_scalar_eq(&r1, &r2));
948 secp256k1_scalar_add(&r1, &s1, &s2);
949 secp256k1_scalar_add(&r1, &r1, &s);
950 secp256k1_scalar_add(&r2, &s2, &s);
951 secp256k1_scalar_add(&r2, &s1, &r2);
952 CHECK(secp256k1_scalar_eq(&r1, &r2));
958 secp256k1_scalar_mul(&r1, &s1, &s2);
959 secp256k1_scalar_mul(&r1, &r1, &s);
960 secp256k1_scalar_mul(&r2, &s2, &s);
961 secp256k1_scalar_mul(&r2, &s1, &r2);
962 CHECK(secp256k1_scalar_eq(&r1, &r2));
968 secp256k1_scalar_add(&r1, &s1, &s2);
969 secp256k1_scalar_mul(&r1, &r1, &s);
970 secp256k1_scalar_mul(&r2, &s1, &s);
971 secp256k1_scalar_mul(&t, &s2, &s);
972 secp256k1_scalar_add(&r2, &r2, &t);
973 CHECK(secp256k1_scalar_eq(&r1, &r2));
979 secp256k1_scalar_sqr(&r1, &s1);
980 secp256k1_scalar_mul(&r2, &s1, &s1);
981 CHECK(secp256k1_scalar_eq(&r1, &r2));
987 secp256k1_scalar_set_int(&v1,1);
988 secp256k1_scalar_mul(&r1, &s1, &v1);
989 CHECK(secp256k1_scalar_eq(&r1, &s1));
995 secp256k1_scalar_set_int(&v0,0);
996 secp256k1_scalar_add(&r1, &s1, &v0);
997 CHECK(secp256k1_scalar_eq(&r1, &s1));
1003 secp256k1_scalar_set_int(&v0,0);
1004 secp256k1_scalar_mul(&r1, &s1, &v0);
1005 CHECK(secp256k1_scalar_eq(&r1, &v0));
1011 unsigned char expected1[64] = {
1012 0x76, 0xb8, 0xe0, 0xad, 0xa0, 0xf1, 0x3d, 0x90,
1013 0x40, 0x5d, 0x6a, 0xe5, 0x53, 0x86, 0xbd, 0x28,
1014 0xbd, 0xd2, 0x19, 0xb8, 0xa0, 0x8d, 0xed, 0x1a,
1015 0xa8, 0x36, 0xef, 0xcc, 0x8b, 0x77, 0x0d, 0xc7,
1016 0xda, 0x41, 0x59, 0x7c, 0x51, 0x57, 0x48, 0x8d,
1017 0x77, 0x24, 0xe0, 0x3f, 0xb8, 0xd8, 0x4a, 0x37,
1018 0x6a, 0x43, 0xb8, 0xf4, 0x15, 0x18, 0xa1, 0x1c,
1019 0xc3, 0x87, 0xb6, 0x69, 0xb2, 0xee, 0x65, 0x86
1021 unsigned char expected2[64] = {
1022 0x45, 0x40, 0xf0, 0x5a, 0x9f, 0x1f, 0xb2, 0x96,
1023 0xd7, 0x73, 0x6e, 0x7b, 0x20, 0x8e, 0x3c, 0x96,
1024 0xeb, 0x4f, 0xe1, 0x83, 0x46, 0x88, 0xd2, 0x60,
1025 0x4f, 0x45, 0x09, 0x52, 0xed, 0x43, 0x2d, 0x41,
1026 0xbb, 0xe2, 0xa0, 0xb6, 0xea, 0x75, 0x66, 0xd2,
1027 0xa5, 0xd1, 0xe7, 0xe2, 0x0d, 0x42, 0xaf, 0x2c,
1028 0x53, 0xd7, 0x92, 0xb1, 0xc4, 0x3f, 0xea, 0x81,
1029 0x7e, 0x9a, 0xd2, 0x75, 0xae, 0x54, 0x69, 0x63
1031 unsigned char expected3[64] = {
1032 0x47, 0x4a, 0x4f, 0x35, 0x4f, 0xee, 0x93, 0x59,
1033 0xbb, 0x65, 0x81, 0xe5, 0xd9, 0x15, 0xa6, 0x01,
1034 0xb6, 0x8c, 0x68, 0x03, 0x38, 0xff, 0x65, 0xe6,
1035 0x56, 0x4a, 0x3e, 0x65, 0x59, 0xfc, 0x12, 0x3f,
1036 0xa9, 0xb2, 0xf9, 0x3e, 0x57, 0xc3, 0xa5, 0xcb,
1037 0xe0, 0x72, 0x74, 0x27, 0x88, 0x1c, 0x23, 0xdf,
1038 0xe2, 0xb6, 0xcc, 0xfb, 0x93, 0xed, 0xcb, 0x02,
1039 0xd7, 0x50, 0x52, 0x45, 0x84, 0x88, 0xbb, 0xea
1044 unsigned char seed1[32] = { 0 };
1046 secp256k1_scalar_chacha20(&r1, &r2, seed1, 0);
1047 secp256k1_scalar_set_b32(&exp_r1, &expected1[0], NULL);
1048 secp256k1_scalar_set_b32(&exp_r2, &expected1[32], NULL);
1049 CHECK(secp256k1_scalar_eq(&exp_r1, &r1));
1050 CHECK(secp256k1_scalar_eq(&exp_r2, &r2));
1053 secp256k1_scalar_chacha20(&r1, &r2, seed1, 0);
1054 secp256k1_scalar_set_b32(&exp_r1, &expected2[0], NULL);
1055 secp256k1_scalar_set_b32(&exp_r2, &expected2[32], NULL);
1056 CHECK(secp256k1_scalar_eq(&exp_r1, &r1));
1057 CHECK(secp256k1_scalar_eq(&exp_r2, &r2));
1059 secp256k1_scalar_chacha20(&r1, &r2, seed1, 100);
1060 secp256k1_scalar_set_b32(&exp_r1, &expected3[0], NULL);
1061 secp256k1_scalar_set_b32(&exp_r2, &expected3[32], NULL);
1062 CHECK(secp256k1_scalar_eq(&exp_r1, &r1));
1063 CHECK(secp256k1_scalar_eq(&exp_r2, &r2));
1068 for (i = 0; i < 128 * count; i++) {
1077 secp256k1_scalar_set_int(&s, 1);
1078 CHECK(secp256k1_scalar_is_one(&s));
1079 secp256k1_scalar_negate(&o, &s);
1080 secp256k1_scalar_add(&o, &o, &s);
1081 CHECK(secp256k1_scalar_is_zero(&o));
1082 secp256k1_scalar_negate(&o, &o);
1083 CHECK(secp256k1_scalar_is_zero(&o));
1086 #ifndef USE_NUM_NONE
1091 unsigned char bin[32];
1093 secp256k1_scalar_order_get_num(&order);
1094 secp256k1_num_get_bin(bin, 32, &order);
1095 secp256k1_scalar_set_b32(&zero, bin, &overflow);
1096 CHECK(overflow == 1);
1097 CHECK(secp256k1_scalar_is_zero(&zero));
1104 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
1105 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL
1107 CHECK(secp256k1_scalar_check_overflow(&overflowed));
1123 #if defined(USE_SCALAR_INV_NUM)
1127 unsigned char chal[33][2][32] = {
1128 {{0xff, 0xff, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00,
1129 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03,
1130 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff,
1131 0xff, 0xff, 0x03, 0x00, 0xc0, 0xff, 0xff, 0xff},
1132 {0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00,
1133 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8,
1134 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1135 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff}},
1136 {{0xef, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
1137 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00,
1138 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1139 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
1140 {0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
1141 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0,
1142 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff,
1143 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x80, 0xff}},
1144 {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
1145 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
1146 0x80, 0x00, 0x00, 0x80, 0xff, 0x3f, 0x00, 0x00,
1147 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x00},
1148 {0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x80,
1149 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xe0,
1150 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00,
1151 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff}},
1152 {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
1153 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
1154 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1155 0x00, 0x1e, 0xf8, 0xff, 0xff, 0xff, 0xfd, 0xff},
1156 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f,
1157 0x00, 0x00, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xe0,
1158 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff,
1159 0xf3, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}},
1160 {{0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00,
1161 0x00, 0x1c, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1162 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0x00,
1163 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff},
1164 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00,
1165 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1166 0xff, 0x1f, 0x00, 0x00, 0x80, 0xff, 0xff, 0x3f,
1167 0x00, 0xfe, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff}},
1168 {{0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xfc, 0x9f,
1169 0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x80,
1170 0xff, 0x0f, 0xfc, 0xff, 0x7f, 0x00, 0x00, 0x00,
1171 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},
1172 {0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1173 0x00, 0x00, 0xf8, 0xff, 0x0f, 0xc0, 0xff, 0xff,
1174 0xff, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff,
1175 0xff, 0xff, 0xff, 0x07, 0x80, 0xff, 0xff, 0xff}},
1176 {{0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00,
1177 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
1178 0xf7, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x00,
1179 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xf0},
1180 {0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff,
1181 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,
1182 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff,
1183 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
1184 {{0x00, 0xf8, 0xff, 0x03, 0xff, 0xff, 0xff, 0x00,
1185 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1186 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
1187 0xff, 0xff, 0x03, 0xc0, 0xff, 0x0f, 0xfc, 0xff},
1188 {0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff,
1189 0xff, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x00, 0xc0,
1190 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1191 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
1192 {{0x8f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1193 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff,
1194 0xff, 0x7f, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
1195 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},
1196 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1197 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1198 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1199 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
1200 {{0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff,
1201 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1202 0xff, 0xff, 0x03, 0x00, 0x80, 0x00, 0x00, 0x80,
1203 0xff, 0xff, 0xff, 0x00, 0x00, 0x80, 0xff, 0x7f},
1204 {0xff, 0xcf, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,
1205 0x00, 0xc0, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff,
1206 0xbf, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00,
1207 0x80, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00}},
1208 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff,
1209 0xff, 0xff, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff,
1210 0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x80,
1211 0xff, 0x01, 0xfc, 0xff, 0x01, 0x00, 0xfe, 0xff},
1212 {0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00,
1213 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
1215 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00}},
1216 {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
1217 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1218 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1219 0x7f, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80},
1220 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1221 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf0, 0xff, 0xff,
1222 0xe0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
1223 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
1224 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1225 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1226 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1227 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x00},
1228 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
1229 0xfc, 0xff, 0xff, 0x3f, 0xf0, 0xff, 0xff, 0x3f,
1230 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x00, 0xff,
1231 0xff, 0xff, 0xff, 0xff, 0x0f, 0x7e, 0x00, 0x00}},
1232 {{0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1233 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
1234 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1235 0xff, 0xff, 0x1f, 0x00, 0x00, 0xfe, 0x07, 0x00},
1236 {0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff,
1237 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1238 0xff, 0xfb, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00,
1239 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60}},
1240 {{0xff, 0x01, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00,
1241 0x80, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x03,
1242 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1243 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
1244 {0xff, 0xff, 0x1f, 0x00, 0xf0, 0xff, 0xff, 0xff,
1245 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1246 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1247 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00}},
1248 {{0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
1249 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1250 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1251 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
1252 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1253 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff,
1254 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03,
1255 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff}},
1256 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1257 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1258 0xc0, 0xff, 0xff, 0xcf, 0xff, 0x1f, 0x00, 0x00,
1259 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80},
1260 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1261 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
1262 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x7e,
1263 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
1264 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1265 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff,
1266 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
1267 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00},
1268 {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1269 0xff, 0xff, 0x7f, 0x00, 0x80, 0x00, 0x00, 0x00,
1270 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1271 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff}},
1272 {{0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x80,
1273 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1274 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1275 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},
1276 {0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1277 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x80,
1278 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
1279 0xff, 0x7f, 0xf8, 0xff, 0xff, 0x1f, 0x00, 0xfe}},
1280 {{0xff, 0xff, 0xff, 0x3f, 0xf8, 0xff, 0xff, 0xff,
1281 0xff, 0x03, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00,
1282 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1283 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07},
1284 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1285 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1286 0xff, 0xff, 0xff, 0xff, 0x01, 0x80, 0xff, 0xff,
1287 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}},
1288 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1289 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1290 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1291 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
1292 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1293 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
1294 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
1295 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40}},
1296 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1297 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1298 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1299 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
1300 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1301 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1302 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1303 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
1304 {{0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1305 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1306 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1307 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
1308 {0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1309 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1310 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1311 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
1312 {{0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xc0,
1313 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1314 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff,
1315 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f},
1316 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00,
1317 0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00,
1318 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff,
1319 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff}},
1320 {{0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1321 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1322 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1323 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
1324 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1325 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1326 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1327 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}},
1328 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1329 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
1330 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
1331 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40},
1332 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1333 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1334 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1335 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}},
1336 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1337 0x7e, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x07, 0x00,
1338 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
1339 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
1340 {0xff, 0x01, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
1341 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x80,
1342 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00,
1343 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
1344 {{0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x00,
1345 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1346 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
1347 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff},
1348 {0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
1349 0xff, 0xff, 0x3f, 0x00, 0xf8, 0xff, 0xff, 0xff,
1350 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1351 0xff, 0x3f, 0x00, 0x00, 0xc0, 0xf1, 0x7f, 0x00}},
1352 {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
1353 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff,
1354 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
1355 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00},
1356 {0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
1357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff,
1358 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f,
1359 0x00, 0x00, 0xfc, 0xff, 0xff, 0x01, 0xff, 0xff}},
1360 {{0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1361 0x80, 0x00, 0x00, 0x80, 0xff, 0x03, 0xe0, 0x01,
1362 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfc, 0xff,
1363 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},
1364 {0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
1365 0xfe, 0xff, 0xff, 0xf0, 0x07, 0x00, 0x3c, 0x80,
1366 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff,
1367 0xff, 0xff, 0x07, 0xe0, 0xff, 0x00, 0x00, 0x00}},
1368 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1369 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1370 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf8,
1371 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80},
1372 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1373 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x80, 0x00,
1374 0x00, 0x00, 0x00, 0xc0, 0x7f, 0xfe, 0xff, 0x1f,
1375 0x00, 0xfe, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff}},
1376 {{0xff, 0xff, 0x81, 0xff, 0xff, 0xff, 0xff, 0x00,
1377 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83,
1378 0xff, 0xff, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
1379 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xf0},
1380 {0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff,
1381 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00,
1382 0xf8, 0x07, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
1383 0xff, 0xc7, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff}},
1384 {{0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
1385 0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
1386 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x03, 0xfb,
1387 0xfa, 0x8a, 0x7d, 0xdf, 0x13, 0x86, 0xe2, 0x03},
1388 {0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
1389 0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
1390 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x03, 0xfb,
1391 0xfa, 0x8a, 0x7d, 0xdf, 0x13, 0x86, 0xe2, 0x03}}
1393 unsigned char res[33][2][32] = {
1394 {{0x0c, 0x3b, 0x0a, 0xca, 0x8d, 0x1a, 0x2f, 0xb9,
1395 0x8a, 0x7b, 0x53, 0x5a, 0x1f, 0xc5, 0x22, 0xa1,
1396 0x07, 0x2a, 0x48, 0xea, 0x02, 0xeb, 0xb3, 0xd6,
1397 0x20, 0x1e, 0x86, 0xd0, 0x95, 0xf6, 0x92, 0x35},
1398 {0xdc, 0x90, 0x7a, 0x07, 0x2e, 0x1e, 0x44, 0x6d,
1399 0xf8, 0x15, 0x24, 0x5b, 0x5a, 0x96, 0x37, 0x9c,
1400 0x37, 0x7b, 0x0d, 0xac, 0x1b, 0x65, 0x58, 0x49,
1401 0x43, 0xb7, 0x31, 0xbb, 0xa7, 0xf4, 0x97, 0x15}},
1402 {{0xf1, 0xf7, 0x3a, 0x50, 0xe6, 0x10, 0xba, 0x22,
1403 0x43, 0x4d, 0x1f, 0x1f, 0x7c, 0x27, 0xca, 0x9c,
1404 0xb8, 0xb6, 0xa0, 0xfc, 0xd8, 0xc0, 0x05, 0x2f,
1405 0xf7, 0x08, 0xe1, 0x76, 0xdd, 0xd0, 0x80, 0xc8},
1406 {0xe3, 0x80, 0x80, 0xb8, 0xdb, 0xe3, 0xa9, 0x77,
1407 0x00, 0xb0, 0xf5, 0x2e, 0x27, 0xe2, 0x68, 0xc4,
1408 0x88, 0xe8, 0x04, 0xc1, 0x12, 0xbf, 0x78, 0x59,
1409 0xe6, 0xa9, 0x7c, 0xe1, 0x81, 0xdd, 0xb9, 0xd5}},
1410 {{0x96, 0xe2, 0xee, 0x01, 0xa6, 0x80, 0x31, 0xef,
1411 0x5c, 0xd0, 0x19, 0xb4, 0x7d, 0x5f, 0x79, 0xab,
1412 0xa1, 0x97, 0xd3, 0x7e, 0x33, 0xbb, 0x86, 0x55,
1413 0x60, 0x20, 0x10, 0x0d, 0x94, 0x2d, 0x11, 0x7c},
1414 {0xcc, 0xab, 0xe0, 0xe8, 0x98, 0x65, 0x12, 0x96,
1415 0x38, 0x5a, 0x1a, 0xf2, 0x85, 0x23, 0x59, 0x5f,
1416 0xf9, 0xf3, 0xc2, 0x81, 0x70, 0x92, 0x65, 0x12,
1417 0x9c, 0x65, 0x1e, 0x96, 0x00, 0xef, 0xe7, 0x63}},
1418 {{0xac, 0x1e, 0x62, 0xc2, 0x59, 0xfc, 0x4e, 0x5c,
1419 0x83, 0xb0, 0xd0, 0x6f, 0xce, 0x19, 0xf6, 0xbf,
1420 0xa4, 0xb0, 0xe0, 0x53, 0x66, 0x1f, 0xbf, 0xc9,
1421 0x33, 0x47, 0x37, 0xa9, 0x3d, 0x5d, 0xb0, 0x48},
1422 {0x86, 0xb9, 0x2a, 0x7f, 0x8e, 0xa8, 0x60, 0x42,
1423 0x26, 0x6d, 0x6e, 0x1c, 0xa2, 0xec, 0xe0, 0xe5,
1424 0x3e, 0x0a, 0x33, 0xbb, 0x61, 0x4c, 0x9f, 0x3c,
1425 0xd1, 0xdf, 0x49, 0x33, 0xcd, 0x72, 0x78, 0x18}},
1426 {{0xf7, 0xd3, 0xcd, 0x49, 0x5c, 0x13, 0x22, 0xfb,
1427 0x2e, 0xb2, 0x2f, 0x27, 0xf5, 0x8a, 0x5d, 0x74,
1428 0xc1, 0x58, 0xc5, 0xc2, 0x2d, 0x9f, 0x52, 0xc6,
1429 0x63, 0x9f, 0xba, 0x05, 0x76, 0x45, 0x7a, 0x63},
1430 {0x8a, 0xfa, 0x55, 0x4d, 0xdd, 0xa3, 0xb2, 0xc3,
1431 0x44, 0xfd, 0xec, 0x72, 0xde, 0xef, 0xc0, 0x99,
1432 0xf5, 0x9f, 0xe2, 0x52, 0xb4, 0x05, 0x32, 0x58,
1433 0x57, 0xc1, 0x8f, 0xea, 0xc3, 0x24, 0x5b, 0x94}},
1434 {{0x05, 0x83, 0xee, 0xdd, 0x64, 0xf0, 0x14, 0x3b,
1435 0xa0, 0x14, 0x4a, 0x3a, 0x41, 0x82, 0x7c, 0xa7,
1436 0x2c, 0xaa, 0xb1, 0x76, 0xbb, 0x59, 0x64, 0x5f,
1437 0x52, 0xad, 0x25, 0x29, 0x9d, 0x8f, 0x0b, 0xb0},
1438 {0x7e, 0xe3, 0x7c, 0xca, 0xcd, 0x4f, 0xb0, 0x6d,
1439 0x7a, 0xb2, 0x3e, 0xa0, 0x08, 0xb9, 0xa8, 0x2d,
1440 0xc2, 0xf4, 0x99, 0x66, 0xcc, 0xac, 0xd8, 0xb9,
1441 0x72, 0x2a, 0x4a, 0x3e, 0x0f, 0x7b, 0xbf, 0xf4}},
1442 {{0x8c, 0x9c, 0x78, 0x2b, 0x39, 0x61, 0x7e, 0xf7,
1443 0x65, 0x37, 0x66, 0x09, 0x38, 0xb9, 0x6f, 0x70,
1444 0x78, 0x87, 0xff, 0xcf, 0x93, 0xca, 0x85, 0x06,
1445 0x44, 0x84, 0xa7, 0xfe, 0xd3, 0xa4, 0xe3, 0x7e},
1446 {0xa2, 0x56, 0x49, 0x23, 0x54, 0xa5, 0x50, 0xe9,
1447 0x5f, 0xf0, 0x4d, 0xe7, 0xdc, 0x38, 0x32, 0x79,
1448 0x4f, 0x1c, 0xb7, 0xe4, 0xbb, 0xf8, 0xbb, 0x2e,
1449 0x40, 0x41, 0x4b, 0xcc, 0xe3, 0x1e, 0x16, 0x36}},
1450 {{0x0c, 0x1e, 0xd7, 0x09, 0x25, 0x40, 0x97, 0xcb,
1451 0x5c, 0x46, 0xa8, 0xda, 0xef, 0x25, 0xd5, 0xe5,
1452 0x92, 0x4d, 0xcf, 0xa3, 0xc4, 0x5d, 0x35, 0x4a,
1453 0xe4, 0x61, 0x92, 0xf3, 0xbf, 0x0e, 0xcd, 0xbe},
1454 {0xe4, 0xaf, 0x0a, 0xb3, 0x30, 0x8b, 0x9b, 0x48,
1455 0x49, 0x43, 0xc7, 0x64, 0x60, 0x4a, 0x2b, 0x9e,
1456 0x95, 0x5f, 0x56, 0xe8, 0x35, 0xdc, 0xeb, 0xdc,
1457 0xc7, 0xc4, 0xfe, 0x30, 0x40, 0xc7, 0xbf, 0xa4}},
1458 {{0xd4, 0xa0, 0xf5, 0x81, 0x49, 0x6b, 0xb6, 0x8b,
1459 0x0a, 0x69, 0xf9, 0xfe, 0xa8, 0x32, 0xe5, 0xe0,
1460 0xa5, 0xcd, 0x02, 0x53, 0xf9, 0x2c, 0xe3, 0x53,
1461 0x83, 0x36, 0xc6, 0x02, 0xb5, 0xeb, 0x64, 0xb8},
1462 {0x1d, 0x42, 0xb9, 0xf9, 0xe9, 0xe3, 0x93, 0x2c,
1463 0x4c, 0xee, 0x6c, 0x5a, 0x47, 0x9e, 0x62, 0x01,
1464 0x6b, 0x04, 0xfe, 0xa4, 0x30, 0x2b, 0x0d, 0x4f,
1465 0x71, 0x10, 0xd3, 0x55, 0xca, 0xf3, 0x5e, 0x80}},
1466 {{0x77, 0x05, 0xf6, 0x0c, 0x15, 0x9b, 0x45, 0xe7,
1467 0xb9, 0x11, 0xb8, 0xf5, 0xd6, 0xda, 0x73, 0x0c,
1468 0xda, 0x92, 0xea, 0xd0, 0x9d, 0xd0, 0x18, 0x92,
1469 0xce, 0x9a, 0xaa, 0xee, 0x0f, 0xef, 0xde, 0x30},
1470 {0xf1, 0xf1, 0xd6, 0x9b, 0x51, 0xd7, 0x77, 0x62,
1471 0x52, 0x10, 0xb8, 0x7a, 0x84, 0x9d, 0x15, 0x4e,
1472 0x07, 0xdc, 0x1e, 0x75, 0x0d, 0x0c, 0x3b, 0xdb,
1473 0x74, 0x58, 0x62, 0x02, 0x90, 0x54, 0x8b, 0x43}},
1474 {{0xa6, 0xfe, 0x0b, 0x87, 0x80, 0x43, 0x67, 0x25,
1475 0x57, 0x5d, 0xec, 0x40, 0x50, 0x08, 0xd5, 0x5d,
1476 0x43, 0xd7, 0xe0, 0xaa, 0xe0, 0x13, 0xb6, 0xb0,
1477 0xc0, 0xd4, 0xe5, 0x0d, 0x45, 0x83, 0xd6, 0x13},
1478 {0x40, 0x45, 0x0a, 0x92, 0x31, 0xea, 0x8c, 0x60,
1479 0x8c, 0x1f, 0xd8, 0x76, 0x45, 0xb9, 0x29, 0x00,
1480 0x26, 0x32, 0xd8, 0xa6, 0x96, 0x88, 0xe2, 0xc4,
1481 0x8b, 0xdb, 0x7f, 0x17, 0x87, 0xcc, 0xc8, 0xf2}},
1482 {{0xc2, 0x56, 0xe2, 0xb6, 0x1a, 0x81, 0xe7, 0x31,
1483 0x63, 0x2e, 0xbb, 0x0d, 0x2f, 0x81, 0x67, 0xd4,
1484 0x22, 0xe2, 0x38, 0x02, 0x25, 0x97, 0xc7, 0x88,
1485 0x6e, 0xdf, 0xbe, 0x2a, 0xa5, 0x73, 0x63, 0xaa},
1486 {0x50, 0x45, 0xe2, 0xc3, 0xbd, 0x89, 0xfc, 0x57,
1487 0xbd, 0x3c, 0xa3, 0x98, 0x7e, 0x7f, 0x36, 0x38,
1488 0x92, 0x39, 0x1f, 0x0f, 0x81, 0x1a, 0x06, 0x51,
1489 0x1f, 0x8d, 0x6a, 0xff, 0x47, 0x16, 0x06, 0x9c}},
1490 {{0x33, 0x95, 0xa2, 0x6f, 0x27, 0x5f, 0x9c, 0x9c,
1491 0x64, 0x45, 0xcb, 0xd1, 0x3c, 0xee, 0x5e, 0x5f,
1492 0x48, 0xa6, 0xaf, 0xe3, 0x79, 0xcf, 0xb1, 0xe2,
1493 0xbf, 0x55, 0x0e, 0xa2, 0x3b, 0x62, 0xf0, 0xe4},
1494 {0x14, 0xe8, 0x06, 0xe3, 0xbe, 0x7e, 0x67, 0x01,
1495 0xc5, 0x21, 0x67, 0xd8, 0x54, 0xb5, 0x7f, 0xa4,
1496 0xf9, 0x75, 0x70, 0x1c, 0xfd, 0x79, 0xdb, 0x86,
1497 0xad, 0x37, 0x85, 0x83, 0x56, 0x4e, 0xf0, 0xbf}},
1498 {{0xbc, 0xa6, 0xe0, 0x56, 0x4e, 0xef, 0xfa, 0xf5,
1499 0x1d, 0x5d, 0x3f, 0x2a, 0x5b, 0x19, 0xab, 0x51,
1500 0xc5, 0x8b, 0xdd, 0x98, 0x28, 0x35, 0x2f, 0xc3,
1501 0x81, 0x4f, 0x5c, 0xe5, 0x70, 0xb9, 0xeb, 0x62},
1502 {0xc4, 0x6d, 0x26, 0xb0, 0x17, 0x6b, 0xfe, 0x6c,
1503 0x12, 0xf8, 0xe7, 0xc1, 0xf5, 0x2f, 0xfa, 0x91,
1504 0x13, 0x27, 0xbd, 0x73, 0xcc, 0x33, 0x31, 0x1c,
1505 0x39, 0xe3, 0x27, 0x6a, 0x95, 0xcf, 0xc5, 0xfb}},
1506 {{0x30, 0xb2, 0x99, 0x84, 0xf0, 0x18, 0x2a, 0x6e,
1507 0x1e, 0x27, 0xed, 0xa2, 0x29, 0x99, 0x41, 0x56,
1508 0xe8, 0xd4, 0x0d, 0xef, 0x99, 0x9c, 0xf3, 0x58,
1509 0x29, 0x55, 0x1a, 0xc0, 0x68, 0xd6, 0x74, 0xa4},
1510 {0x07, 0x9c, 0xe7, 0xec, 0xf5, 0x36, 0x73, 0x41,
1511 0xa3, 0x1c, 0xe5, 0x93, 0x97, 0x6a, 0xfd, 0xf7,
1512 0x53, 0x18, 0xab, 0xaf, 0xeb, 0x85, 0xbd, 0x92,
1513 0x90, 0xab, 0x3c, 0xbf, 0x30, 0x82, 0xad, 0xf6}},
1514 {{0xc6, 0x87, 0x8a, 0x2a, 0xea, 0xc0, 0xa9, 0xec,
1515 0x6d, 0xd3, 0xdc, 0x32, 0x23, 0xce, 0x62, 0x19,
1516 0xa4, 0x7e, 0xa8, 0xdd, 0x1c, 0x33, 0xae, 0xd3,
1517 0x4f, 0x62, 0x9f, 0x52, 0xe7, 0x65, 0x46, 0xf4},
1518 {0x97, 0x51, 0x27, 0x67, 0x2d, 0xa2, 0x82, 0x87,
1519 0x98, 0xd3, 0xb6, 0x14, 0x7f, 0x51, 0xd3, 0x9a,
1520 0x0b, 0xd0, 0x76, 0x81, 0xb2, 0x4f, 0x58, 0x92,
1521 0xa4, 0x86, 0xa1, 0xa7, 0x09, 0x1d, 0xef, 0x9b}},
1522 {{0xb3, 0x0f, 0x2b, 0x69, 0x0d, 0x06, 0x90, 0x64,
1523 0xbd, 0x43, 0x4c, 0x10, 0xe8, 0x98, 0x1c, 0xa3,
1524 0xe1, 0x68, 0xe9, 0x79, 0x6c, 0x29, 0x51, 0x3f,
1525 0x41, 0xdc, 0xdf, 0x1f, 0xf3, 0x60, 0xbe, 0x33},
1526 {0xa1, 0x5f, 0xf7, 0x1d, 0xb4, 0x3e, 0x9b, 0x3c,
1527 0xe7, 0xbd, 0xb6, 0x06, 0xd5, 0x60, 0x06, 0x6d,
1528 0x50, 0xd2, 0xf4, 0x1a, 0x31, 0x08, 0xf2, 0xea,
1529 0x8e, 0xef, 0x5f, 0x7d, 0xb6, 0xd0, 0xc0, 0x27}},
1530 {{0x62, 0x9a, 0xd9, 0xbb, 0x38, 0x36, 0xce, 0xf7,
1531 0x5d, 0x2f, 0x13, 0xec, 0xc8, 0x2d, 0x02, 0x8a,
1532 0x2e, 0x72, 0xf0, 0xe5, 0x15, 0x9d, 0x72, 0xae,
1533 0xfc, 0xb3, 0x4f, 0x02, 0xea, 0xe1, 0x09, 0xfe},
1534 {0x00, 0x00, 0x00, 0x00, 0xfa, 0x0a, 0x3d, 0xbc,
1535 0xad, 0x16, 0x0c, 0xb6, 0xe7, 0x7c, 0x8b, 0x39,
1536 0x9a, 0x43, 0xbb, 0xe3, 0xc2, 0x55, 0x15, 0x14,
1537 0x75, 0xac, 0x90, 0x9b, 0x7f, 0x9a, 0x92, 0x00}},
1538 {{0x8b, 0xac, 0x70, 0x86, 0x29, 0x8f, 0x00, 0x23,
1539 0x7b, 0x45, 0x30, 0xaa, 0xb8, 0x4c, 0xc7, 0x8d,
1540 0x4e, 0x47, 0x85, 0xc6, 0x19, 0xe3, 0x96, 0xc2,
1541 0x9a, 0xa0, 0x12, 0xed, 0x6f, 0xd7, 0x76, 0x16},
1542 {0x45, 0xaf, 0x7e, 0x33, 0xc7, 0x7f, 0x10, 0x6c,
1543 0x7c, 0x9f, 0x29, 0xc1, 0xa8, 0x7e, 0x15, 0x84,
1544 0xe7, 0x7d, 0xc0, 0x6d, 0xab, 0x71, 0x5d, 0xd0,
1545 0x6b, 0x9f, 0x97, 0xab, 0xcb, 0x51, 0x0c, 0x9f}},
1546 {{0x9e, 0xc3, 0x92, 0xb4, 0x04, 0x9f, 0xc8, 0xbb,
1547 0xdd, 0x9e, 0xc6, 0x05, 0xfd, 0x65, 0xec, 0x94,
1548 0x7f, 0x2c, 0x16, 0xc4, 0x40, 0xac, 0x63, 0x7b,
1549 0x7d, 0xb8, 0x0c, 0xe4, 0x5b, 0xe3, 0xa7, 0x0e},
1550 {0x43, 0xf4, 0x44, 0xe8, 0xcc, 0xc8, 0xd4, 0x54,
1551 0x33, 0x37, 0x50, 0xf2, 0x87, 0x42, 0x2e, 0x00,
1552 0x49, 0x60, 0x62, 0x02, 0xfd, 0x1a, 0x7c, 0xdb,
1553 0x29, 0x6c, 0x6d, 0x54, 0x53, 0x08, 0xd1, 0xc8}},
1554 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1555 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1556 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1557 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
1558 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1559 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1560 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1561 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
1562 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1563 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1564 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1565 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
1566 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1567 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1568 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1569 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}},
1570 {{0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1,
1571 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0,
1572 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59,
1573 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92},
1574 {0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1,
1575 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0,
1576 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59,
1577 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}},
1578 {{0x28, 0x56, 0xac, 0x0e, 0x4f, 0x98, 0x09, 0xf0,
1579 0x49, 0xfa, 0x7f, 0x84, 0xac, 0x7e, 0x50, 0x5b,
1580 0x17, 0x43, 0x14, 0x89, 0x9c, 0x53, 0xa8, 0x94,
1581 0x30, 0xf2, 0x11, 0x4d, 0x92, 0x14, 0x27, 0xe8},
1582 {0x39, 0x7a, 0x84, 0x56, 0x79, 0x9d, 0xec, 0x26,
1583 0x2c, 0x53, 0xc1, 0x94, 0xc9, 0x8d, 0x9e, 0x9d,
1584 0x32, 0x1f, 0xdd, 0x84, 0x04, 0xe8, 0xe2, 0x0a,
1585 0x6b, 0xbe, 0xbb, 0x42, 0x40, 0x67, 0x30, 0x6c}},
1586 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1587 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1588 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4,
1589 0x40, 0x2d, 0xa1, 0x73, 0x2f, 0xc9, 0xbe, 0xbd},
1590 {0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1,
1591 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0,
1592 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59,
1593 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}},
1594 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1595 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
1596 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
1597 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40},
1598 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1599 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1600 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1601 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}},
1602 {{0x1c, 0xc4, 0xf7, 0xda, 0x0f, 0x65, 0xca, 0x39,
1603 0x70, 0x52, 0x92, 0x8e, 0xc3, 0xc8, 0x15, 0xea,
1604 0x7f, 0x10, 0x9e, 0x77, 0x4b, 0x6e, 0x2d, 0xdf,
1605 0xe8, 0x30, 0x9d, 0xda, 0xe8, 0x9a, 0x65, 0xae},
1606 {0x02, 0xb0, 0x16, 0xb1, 0x1d, 0xc8, 0x57, 0x7b,
1607 0xa2, 0x3a, 0xa2, 0xa3, 0x38, 0x5c, 0x8f, 0xeb,
1608 0x66, 0x37, 0x91, 0xa8, 0x5f, 0xef, 0x04, 0xf6,
1609 0x59, 0x75, 0xe1, 0xee, 0x92, 0xf6, 0x0e, 0x30}},
1610 {{0x8d, 0x76, 0x14, 0xa4, 0x14, 0x06, 0x9f, 0x9a,
1611 0xdf, 0x4a, 0x85, 0xa7, 0x6b, 0xbf, 0x29, 0x6f,
1612 0xbc, 0x34, 0x87, 0x5d, 0xeb, 0xbb, 0x2e, 0xa9,
1613 0xc9, 0x1f, 0x58, 0xd6, 0x9a, 0x82, 0xa0, 0x56},
1614 {0xd4, 0xb9, 0xdb, 0x88, 0x1d, 0x04, 0xe9, 0x93,
1615 0x8d, 0x3f, 0x20, 0xd5, 0x86, 0xa8, 0x83, 0x07,
1616 0xdb, 0x09, 0xd8, 0x22, 0x1f, 0x7f, 0xf1, 0x71,
1617 0xc8, 0xe7, 0x5d, 0x47, 0xaf, 0x8b, 0x72, 0xe9}},
1618 {{0x83, 0xb9, 0x39, 0xb2, 0xa4, 0xdf, 0x46, 0x87,
1619 0xc2, 0xb8, 0xf1, 0xe6, 0x4c, 0xd1, 0xe2, 0xa9,
1620 0xe4, 0x70, 0x30, 0x34, 0xbc, 0x52, 0x7c, 0x55,
1621 0xa6, 0xec, 0x80, 0xa4, 0xe5, 0xd2, 0xdc, 0x73},
1622 {0x08, 0xf1, 0x03, 0xcf, 0x16, 0x73, 0xe8, 0x7d,
1623 0xb6, 0x7e, 0x9b, 0xc0, 0xb4, 0xc2, 0xa5, 0x86,
1624 0x02, 0x77, 0xd5, 0x27, 0x86, 0xa5, 0x15, 0xfb,
1625 0xae, 0x9b, 0x8c, 0xa9, 0xf9, 0xf8, 0xa8, 0x4a}},
1626 {{0x8b, 0x00, 0x49, 0xdb, 0xfa, 0xf0, 0x1b, 0xa2,
1627 0xed, 0x8a, 0x9a, 0x7a, 0x36, 0x78, 0x4a, 0xc7,
1628 0xf7, 0xad, 0x39, 0xd0, 0x6c, 0x65, 0x7a, 0x41,
1629 0xce, 0xd6, 0xd6, 0x4c, 0x20, 0x21, 0x6b, 0xc7},
1630 {0xc6, 0xca, 0x78, 0x1d, 0x32, 0x6c, 0x6c, 0x06,
1631 0x91, 0xf2, 0x1a, 0xe8, 0x43, 0x16, 0xea, 0x04,
1632 0x3c, 0x1f, 0x07, 0x85, 0xf7, 0x09, 0x22, 0x08,
1633 0xba, 0x13, 0xfd, 0x78, 0x1e, 0x3f, 0x6f, 0x62}},
1634 {{0x25, 0x9b, 0x7c, 0xb0, 0xac, 0x72, 0x6f, 0xb2,
1635 0xe3, 0x53, 0x84, 0x7a, 0x1a, 0x9a, 0x98, 0x9b,
1636 0x44, 0xd3, 0x59, 0xd0, 0x8e, 0x57, 0x41, 0x40,
1637 0x78, 0xa7, 0x30, 0x2f, 0x4c, 0x9c, 0xb9, 0x68},
1638 {0xb7, 0x75, 0x03, 0x63, 0x61, 0xc2, 0x48, 0x6e,
1639 0x12, 0x3d, 0xbf, 0x4b, 0x27, 0xdf, 0xb1, 0x7a,
1640 0xff, 0x4e, 0x31, 0x07, 0x83, 0xf4, 0x62, 0x5b,
1641 0x19, 0xa5, 0xac, 0xa0, 0x32, 0x58, 0x0d, 0xa7}},
1642 {{0x43, 0x4f, 0x10, 0xa4, 0xca, 0xdb, 0x38, 0x67,
1643 0xfa, 0xae, 0x96, 0xb5, 0x6d, 0x97, 0xff, 0x1f,
1644 0xb6, 0x83, 0x43, 0xd3, 0xa0, 0x2d, 0x70, 0x7a,
1645 0x64, 0x05, 0x4c, 0xa7, 0xc1, 0xa5, 0x21, 0x51},
1646 {0xe4, 0xf1, 0x23, 0x84, 0xe1, 0xb5, 0x9d, 0xf2,
1647 0xb8, 0x73, 0x8b, 0x45, 0x2b, 0x35, 0x46, 0x38,
1648 0x10, 0x2b, 0x50, 0xf8, 0x8b, 0x35, 0xcd, 0x34,
1649 0xc8, 0x0e, 0xf6, 0xdb, 0x09, 0x35, 0xf0, 0xda}},
1650 {{0xdb, 0x21, 0x5c, 0x8d, 0x83, 0x1d, 0xb3, 0x34,
1651 0xc7, 0x0e, 0x43, 0xa1, 0x58, 0x79, 0x67, 0x13,
1652 0x1e, 0x86, 0x5d, 0x89, 0x63, 0xe6, 0x0a, 0x46,
1653 0x5c, 0x02, 0x97, 0x1b, 0x62, 0x43, 0x86, 0xf5},
1654 {0xdb, 0x21, 0x5c, 0x8d, 0x83, 0x1d, 0xb3, 0x34,
1655 0xc7, 0x0e, 0x43, 0xa1, 0x58, 0x79, 0x67, 0x13,
1656 0x1e, 0x86, 0x5d, 0x89, 0x63, 0xe6, 0x0a, 0x46,
1657 0x5c, 0x02, 0x97, 0x1b, 0x62, 0x43, 0x86, 0xf5}}
1659 secp256k1_scalar_set_int(&one, 1);
1660 for (i = 0; i < 33; i++) {
1661 secp256k1_scalar_set_b32(&x, chal[i][0], &overflow);
1663 secp256k1_scalar_set_b32(&y, chal[i][1], &overflow);
1665 secp256k1_scalar_set_b32(&r1, res[i][0], &overflow);
1667 secp256k1_scalar_set_b32(&r2, res[i][1], &overflow);
1669 secp256k1_scalar_mul(&z, &x, &y);
1670 CHECK(!secp256k1_scalar_check_overflow(&z));
1671 CHECK(secp256k1_scalar_eq(&r1, &z));
1672 if (!secp256k1_scalar_is_zero(&y)) {
1673 secp256k1_scalar_inverse(&zz, &y);
1674 CHECK(!secp256k1_scalar_check_overflow(&zz));
1675 #if defined(USE_SCALAR_INV_NUM)
1676 secp256k1_scalar_inverse_var(&zzv, &y);
1677 CHECK(secp256k1_scalar_eq(&zzv, &zz));
1679 secp256k1_scalar_mul(&z, &z, &zz);
1680 CHECK(!secp256k1_scalar_check_overflow(&z));
1681 CHECK(secp256k1_scalar_eq(&x, &z));
1682 secp256k1_scalar_mul(&zz, &zz, &y);
1683 CHECK(!secp256k1_scalar_check_overflow(&zz));
1684 CHECK(secp256k1_scalar_eq(&one, &zz));
1686 secp256k1_scalar_mul(&z, &x, &x);
1687 CHECK(!secp256k1_scalar_check_overflow(&z));
1688 secp256k1_scalar_sqr(&zz, &x);
1689 CHECK(!secp256k1_scalar_check_overflow(&zz));
1690 CHECK(secp256k1_scalar_eq(&zz, &z));
1691 CHECK(secp256k1_scalar_eq(&r2, &zz));
1699 unsigned char bin[32];
1701 secp256k1_rand256(bin);
1702 if (secp256k1_fe_set_b32(x, bin)) {
1709 unsigned char bin[32];
1711 secp256k1_rand256_test(bin);
1712 if (secp256k1_fe_set_b32(x, bin)) {
1720 while (--tries >= 0) {
1722 secp256k1_fe_normalize(nz);
1723 if (!secp256k1_fe_is_zero(nz)) {
1734 if (secp256k1_fe_sqrt(&
r, ns)) {
1735 secp256k1_fe_negate(ns, ns, 1);
1742 secp256k1_fe_normalize_weak(&an);
1743 secp256k1_fe_normalize_var(&bn);
1744 return secp256k1_fe_equal_var(&an, &bn);
1750 secp256k1_fe_mul(&x, a, ai);
1755 static const unsigned char b32[32] = {
1756 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1757 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
1758 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,
1759 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x40
1762 0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL,
1763 0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL
1766 0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL,
1767 0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL
1770 unsigned char b322[32];
1773 CHECK(secp256k1_fe_set_b32(&fe2, b32));
1774 CHECK(secp256k1_fe_equal_var(&fe, &fe2));
1775 secp256k1_fe_from_storage(&fe2, &fes);
1776 CHECK(secp256k1_fe_equal_var(&fe, &fe2));
1778 secp256k1_fe_get_b32(b322, &fe);
1779 CHECK(memcmp(b322, b32, 32) == 0);
1780 secp256k1_fe_to_storage(&fes2, &fe);
1781 CHECK(memcmp(&fes2, &fes,
sizeof(fes)) == 0);
1787 t.magnitude = a->magnitude;
1788 t.normalized = a->normalized;
1800 for (i = 0; i < 5*count; i++) {
1805 CHECK(secp256k1_fe_cmp_var(&x, &x) == 0);
1806 CHECK(secp256k1_fe_equal_var(&x, &x));
1808 secp256k1_fe_add(&z,&y);
1811 secp256k1_fe_cmov(&x, &z, 0);
1812 VERIFY_CHECK(!x.normalized && x.magnitude == z.magnitude);
1813 secp256k1_fe_cmov(&x, &x, 1);
1816 secp256k1_fe_cmov(&q, &z, 1);
1817 VERIFY_CHECK(!q.normalized && q.magnitude == z.magnitude);
1819 secp256k1_fe_normalize_var(&x);
1820 secp256k1_fe_normalize_var(&z);
1821 CHECK(!secp256k1_fe_equal_var(&x, &z));
1822 secp256k1_fe_normalize_var(&q);
1823 secp256k1_fe_cmov(&q, &z, (i&1));
1825 for (j = 0; j < 6; j++) {
1826 secp256k1_fe_negate(&z, &z, j+1);
1827 secp256k1_fe_normalize_var(&q);
1828 secp256k1_fe_cmov(&q, &z, (j&1));
1831 secp256k1_fe_normalize_var(&z);
1833 secp256k1_fe_to_storage(&xs, &x);
1834 secp256k1_fe_to_storage(&ys, &y);
1835 secp256k1_fe_to_storage(&zs, &z);
1836 secp256k1_fe_storage_cmov(&zs, &xs, 0);
1837 secp256k1_fe_storage_cmov(&zs, &zs, 1);
1838 CHECK(memcmp(&xs, &zs,
sizeof(xs)) != 0);
1839 secp256k1_fe_storage_cmov(&ys, &xs, 1);
1840 CHECK(memcmp(&xs, &ys,
sizeof(xs)) == 0);
1841 secp256k1_fe_from_storage(&x, &xs);
1842 secp256k1_fe_from_storage(&y, &ys);
1843 secp256k1_fe_from_storage(&z, &zs);
1845 secp256k1_fe_add(&y, &x);
1846 secp256k1_fe_add(&y, &x);
1848 secp256k1_fe_mul_int(&z, 3);
1850 secp256k1_fe_add(&y, &x);
1851 secp256k1_fe_add(&z, &x);
1854 secp256k1_fe_mul_int(&z, 5);
1855 secp256k1_fe_mul(&q, &x, &fe5);
1857 secp256k1_fe_negate(&x, &x, 1);
1858 secp256k1_fe_add(&z, &x);
1859 secp256k1_fe_add(&q, &x);
1868 for (i = 0; i < 10*count; i++) {
1870 secp256k1_fe_inv(&xi, &x);
1872 secp256k1_fe_inv(&xii, &xi);
1880 for (i = 0; i < 10*count; i++) {
1882 secp256k1_fe_inv_var(&xi, &x);
1884 secp256k1_fe_inv_var(&xii, &xi);
1893 secp256k1_fe_inv_all_var(xi, x, 0);
1894 for (i = 0; i < count; i++) {
1896 size_t len = secp256k1_rand_int(15) + 1;
1897 for (j = 0; j < len; j++) {
1900 secp256k1_fe_inv_all_var(xi, x, len);
1901 for (j = 0; j < len; j++) {
1904 secp256k1_fe_inv_all_var(xii, xi, len);
1905 for (j = 0; j < len; j++) {
1916 secp256k1_fe_set_int(&x, 1);
1917 secp256k1_fe_negate(&x, &x, 1);
1919 for (i = 1; i <= 512; ++i) {
1920 secp256k1_fe_mul_int(&x, 2);
1921 secp256k1_fe_normalize(&x);
1922 secp256k1_fe_sqr(&s, &x);
1929 int v = secp256k1_fe_sqrt(&r1, a);
1930 CHECK((v == 0) == (k == NULL));
1934 secp256k1_fe_negate(&r2, &r1, 1);
1935 secp256k1_fe_add(&r1, k); secp256k1_fe_add(&r2, k);
1936 secp256k1_fe_normalize(&r1); secp256k1_fe_normalize(&r2);
1937 CHECK(secp256k1_fe_is_zero(&r1) || secp256k1_fe_is_zero(&r2));
1946 secp256k1_fe_set_int(&x, 0);
1947 secp256k1_fe_sqr(&s, &x);
1951 for (i = 1; i <= 100; i++) {
1952 secp256k1_fe_set_int(&x, i);
1953 secp256k1_fe_sqr(&s, &x);
1955 secp256k1_fe_negate(&t, &s, 1);
1960 for (i = 0; i < 10; i++) {
1963 for (j = 0; j < count; j++) {
1965 secp256k1_fe_sqr(&s, &x);
1967 secp256k1_fe_negate(&t, &s, 1);
1969 secp256k1_fe_mul(&t, &s, &ns);
1982 CHECK(secp256k1_fe_equal_var(&a->
x, &
b->x));
1983 CHECK(secp256k1_fe_equal_var(&a->
y, &
b->y));
1995 secp256k1_fe_normalize(&a2.
x);
1996 secp256k1_fe_normalize(&a2.
y);
1997 secp256k1_fe_normalize(&a2.
z);
1998 secp256k1_fe_normalize(&b2.
x);
1999 secp256k1_fe_normalize(&b2.
y);
2000 secp256k1_fe_normalize(&b2.
z);
2001 ret &= secp256k1_fe_cmp_var(&a2.
x, &b2.
x) == 0;
2002 ret &= secp256k1_fe_cmp_var(&a2.
y, &b2.
y) == 0;
2003 ret &= secp256k1_fe_cmp_var(&a2.
z, &b2.
z) == 0;
2016 secp256k1_fe_sqr(&z2s, &
b->z);
2017 secp256k1_fe_mul(&u1, &a->
x, &z2s);
2018 u2 =
b->x; secp256k1_fe_normalize_weak(&u2);
2019 secp256k1_fe_mul(&s1, &a->
y, &z2s); secp256k1_fe_mul(&s1, &s1, &
b->z);
2020 s2 =
b->y; secp256k1_fe_normalize_weak(&s2);
2021 CHECK(secp256k1_fe_equal_var(&u1, &u2));
2022 CHECK(secp256k1_fe_equal_var(&s1, &s2));
2027 #ifdef USE_ENDOMORPHISM
2045 secp256k1_gej_set_infinity(&gej[0]);
2046 secp256k1_ge_clear(&ge[0]);
2047 secp256k1_ge_set_gej_var(&ge[0], &gej[0]);
2048 for (i = 0; i < runs; i++) {
2052 #ifdef USE_ENDOMORPHISM
2053 if (i >= runs - 2) {
2054 secp256k1_ge_mul_lambda(&g, &ge[1]);
2056 if (i >= runs - 1) {
2057 secp256k1_ge_mul_lambda(&g, &g);
2062 secp256k1_ge_neg(&ge[3 + 4 * i], &g);
2063 secp256k1_ge_neg(&ge[4 + 4 * i], &g);
2064 secp256k1_gej_set_ge(&gej[1 + 4 * i], &ge[1 + 4 * i]);
2066 secp256k1_gej_set_ge(&gej[3 + 4 * i], &ge[3 + 4 * i]);
2068 for (j = 0; j < 4; j++) {
2080 for (i = 0; i < 4 * runs + 1; i++) {
2085 }
while(secp256k1_fe_is_zero(&zs[i]));
2090 secp256k1_fe_inv_all_var(zinv, zs, 4 * runs + 1);
2097 }
while(secp256k1_fe_is_zero(&zf));
2099 secp256k1_fe_inv_var(&zfi3, &zf);
2100 secp256k1_fe_sqr(&zfi2, &zfi3);
2101 secp256k1_fe_mul(&zfi3, &zfi3, &zfi2);
2103 for (i1 = 0; i1 < 1 + 4 * runs; i1++) {
2105 for (i2 = 0; i2 < 1 + 4 * runs; i2++) {
2110 secp256k1_gej_add_var(&refj, &gej[i1], &gej[i2], secp256k1_gej_is_infinity(&gej[i1]) ? NULL : &zr);
2112 if (!secp256k1_gej_is_infinity(&gej[i1]) && !secp256k1_gej_is_infinity(&refj)) {
2113 secp256k1_fe zrz; secp256k1_fe_mul(&zrz, &zr, &gej[i1].z);
2114 CHECK(secp256k1_fe_equal_var(&zrz, &refj.
z));
2116 secp256k1_ge_set_gej_var(&ref, &refj);
2119 secp256k1_gej_add_ge_var(&resj, &gej[i1], &ge[i2], secp256k1_gej_is_infinity(&gej[i1]) ? NULL : &zr);
2121 if (!secp256k1_gej_is_infinity(&gej[i1]) && !secp256k1_gej_is_infinity(&resj)) {
2122 secp256k1_fe zrz; secp256k1_fe_mul(&zrz, &zr, &gej[i1].z);
2123 CHECK(secp256k1_fe_equal_var(&zrz, &resj.
z));
2129 secp256k1_fe_mul(&ge2_zfi.
x, &ge2_zfi.
x, &zfi2);
2130 secp256k1_fe_mul(&ge2_zfi.
y, &ge2_zfi.
y, &zfi3);
2133 secp256k1_gej_add_zinv_var(&resj, &gej[i1], &ge2_zfi, &zf);
2140 secp256k1_gej_add_ge(&resj, &gej[i1], &ge[i2]);
2145 if ((i1 == 0 && i2 == 0) || ((i1 + 3)/4 == (i2 + 3)/4 && ((i1 + 3)%4)/2 == ((i2 + 3)%4)/2)) {
2148 secp256k1_gej_double_var(&resj, &gej[i1], &zr2);
2151 secp256k1_fe_mul(&zr2, &zr2, &gej[i1].z);
2152 CHECK(secp256k1_fe_equal_var(&zr2, &resj.
z));
2154 secp256k1_gej_double_var(&resj, &gej[i2], NULL);
2159 if ((i1 == 0 && i2 == 0) || ((i1 + 3)/4 == (i2 + 3)/4 && ((i1 + 3)%4)/2 != ((i2 + 3)%4)/2)) {
2160 CHECK(secp256k1_ge_is_infinity(&ref));
2165 CHECK(secp256k1_ge_is_infinity(&ge[i1]));
2166 CHECK(secp256k1_gej_is_infinity(&gej[i1]));
2170 CHECK(secp256k1_ge_is_infinity(&ge[i2]));
2171 CHECK(secp256k1_gej_is_infinity(&gej[i2]));
2181 for (i = 0; i < 4 * runs + 1; i++) {
2182 gej_shuffled[i] = gej[i];
2184 for (i = 0; i < 4 * runs + 1; i++) {
2185 int swap = i + secp256k1_rand_int(4 * runs + 1 - i);
2188 gej_shuffled[i] = gej_shuffled[swap];
2189 gej_shuffled[swap] = t;
2192 for (i = 0; i < 4 * runs + 1; i++) {
2193 secp256k1_gej_add_var(&sum, &sum, &gej_shuffled[i], NULL);
2195 CHECK(secp256k1_gej_is_infinity(&sum));
2204 for (i = 0; i < 4 * runs + 1; i++) {
2207 secp256k1_fe_mul(&zr[i + 1], &zinv[i], &gej[i + 1].z);
2210 secp256k1_ge_set_table_gej_var(ge_set_table, gej, zr, 4 * runs + 1);
2211 secp256k1_ge_set_all_gej_var(ge_set_all, gej, 4 * runs + 1, &ctx->
error_callback);
2212 for (i = 0; i < 4 * runs + 1; i++) {
2215 secp256k1_gej_rescale(&gej[i], &s);
2261 0x8d24cd95, 0x0a355af1, 0x3c543505, 0x44238d30,
2262 0x0643d79f, 0x05a59614, 0x2f8ec030, 0xd58977cb,
2263 0x001e337a, 0x38093dcd, 0x6c0f386d, 0x0b1293a8,
2264 0x4d72c879, 0xd7681924, 0x44e6d2f3, 0x9190117d
2267 0xc7b74206, 0x1f788cd9, 0xabd0937d, 0x164a0d86,
2268 0x95f6ff75, 0xf19a4ce9, 0xd013bd7b, 0xbf92d2a7,
2269 0xffe1cc85, 0xc7f6c232, 0x93f0c792, 0xf4ed6c57,
2270 0xb28d3786, 0x2897e6db, 0xbb192d0b, 0x6e6feab2
2273 0x671a63c0, 0x3efdad4c, 0x389a7798, 0x24356027,
2274 0xb3d69010, 0x278625c3, 0x5c86d390, 0x184a8f7a,
2275 0x5f6409c2, 0x2ce01f2b, 0x511fd375, 0x25071d08,
2276 0xda651801, 0x70e95caf, 0x8f0d893c, 0xbed8fbbe
2281 secp256k1_ge_set_gej(&
b, &bj);
2283 secp256k1_gej_add_var(&resj, &aj, &bj, NULL);
2284 secp256k1_ge_set_gej(&res, &resj);
2287 secp256k1_gej_add_ge(&resj, &aj, &
b);
2288 secp256k1_ge_set_gej(&res, &resj);
2291 secp256k1_gej_add_ge_var(&resj, &aj, &
b, NULL);
2292 secp256k1_ge_set_gej(&res, &resj);
2298 for (i = 0; i < count * 32; i++) {
2313 for (i = 1; i <= 6; i++) {
2316 secp256k1_scalar_add(&sum, &sum, &s);
2318 secp256k1_ge_set_gej(&Q, &Qj);
2319 secp256k1_pubkey2_save(&data[i - 1], &Q);
2320 d[i - 1] = &data[i - 1];
2322 secp256k1_ge_set_gej(&Q, &Qj);
2323 secp256k1_pubkey2_save(&sd, &Q);
2325 CHECK(memcmp(&sd, &sd2,
sizeof(sd)) == 0);
2331 for (i = 0; i < count * 8; i++) {
2344 int res_quad, res_even, res_odd;
2346 secp256k1_fe_normalize_var(&fex);
2348 res_quad = secp256k1_ge_set_xquad(&ge_quad, &fex);
2349 res_even = secp256k1_ge_set_xo_var(&ge_even, &fex, 0);
2350 res_odd = secp256k1_ge_set_xo_var(&ge_odd, &fex, 1);
2352 CHECK(res_quad == res_even);
2353 CHECK(res_quad == res_odd);
2356 secp256k1_fe_normalize_var(&ge_quad.
x);
2357 secp256k1_fe_normalize_var(&ge_odd.
x);
2358 secp256k1_fe_normalize_var(&ge_even.
x);
2359 secp256k1_fe_normalize_var(&ge_quad.
y);
2360 secp256k1_fe_normalize_var(&ge_odd.
y);
2361 secp256k1_fe_normalize_var(&ge_even.
y);
2369 CHECK(secp256k1_fe_equal_var(&ge_quad.
x, x));
2370 CHECK(secp256k1_fe_equal_var(&ge_even.
x, x));
2371 CHECK(secp256k1_fe_equal_var(&ge_odd.
x, x));
2374 CHECK(secp256k1_fe_is_quad_var(&ge_quad.
y));
2377 CHECK(secp256k1_fe_is_odd(&ge_odd.
y));
2378 CHECK(!secp256k1_fe_is_odd(&ge_even.
y));
2381 secp256k1_gej_set_ge(&gej_quad, &ge_quad);
2382 CHECK(secp256k1_gej_has_quad_y_var(&gej_quad));
2385 }
while (secp256k1_fe_is_zero(&fez));
2386 secp256k1_gej_rescale(&gej_quad, &fez);
2387 CHECK(secp256k1_gej_has_quad_y_var(&gej_quad));
2388 secp256k1_gej_neg(&gej_quad, &gej_quad);
2389 CHECK(!secp256k1_gej_has_quad_y_var(&gej_quad));
2392 }
while (secp256k1_fe_is_zero(&fez));
2393 secp256k1_gej_rescale(&gej_quad, &fez);
2394 CHECK(!secp256k1_gej_has_quad_y_var(&gej_quad));
2395 secp256k1_gej_neg(&gej_quad, &gej_quad);
2396 CHECK(secp256k1_gej_has_quad_y_var(&gej_quad));
2402 for (i = 0; i < count * 4; i++) {
2414 0x8b30bbe9, 0xae2a9906, 0x96b22f67, 0x0709dff3,
2415 0x727fd8bc, 0x04d3362c, 0x6c7bf458, 0xe2846004,
2416 0xa357ae91, 0x5c4a6528, 0x1309edf2, 0x0504740f,
2417 0x0eb33439, 0x90216b4f, 0x81063cb6, 0x5f2f7e0f
2421 0x84cc5452, 0xf7fde1ed, 0xb4d38a8c, 0xe9b1b84c,
2422 0xcef31f14, 0x6e569be9, 0x705d357a, 0x42985407
2425 0xa1e58d22, 0x553dcd42, 0xb2398062, 0x5d4c57a9,
2426 0x6e9323d4, 0x2b3152e5, 0xca2c3990, 0xedc7c9de
2441 for (i = 0; i < 200*count; i++) {
2443 secp256k1_ecmult(&ctx->
ecmult_ctx, &x, &x, &xn, &gn);
2446 secp256k1_scalar_mul(&ae, &ae, &xn);
2447 secp256k1_scalar_mul(&ge, &ge, &xn);
2448 secp256k1_scalar_add(&ge, &ge, &gn);
2450 secp256k1_scalar_mul(&xn, &xn, &xf);
2451 secp256k1_scalar_mul(&gn, &gn, &gf);
2457 0xD6E96687, 0xF9B10D09, 0x2A6F3543, 0x9D86CEBE,
2458 0xA4535D0D, 0x409F5358, 0x6440BD74, 0xB933E830,
2459 0xB95CBCA2, 0xC77DA786, 0x539BE8FD, 0x53354D2D,
2460 0x3B4F566A, 0xE6580454, 0x07ED6015, 0xEE1B2A88
2463 secp256k1_gej_neg(&rp, &rp);
2464 secp256k1_gej_add_var(&rp, &rp, &x, NULL);
2465 CHECK(secp256k1_gej_is_infinity(&rp));
2469 secp256k1_ecmult(&ctx->
ecmult_ctx, &x2, &a, &ae, &ge);
2470 secp256k1_gej_neg(&x2, &x2);
2471 secp256k1_gej_add_var(&x2, &x2, &x, NULL);
2472 CHECK(secp256k1_gej_is_infinity(&x2));
2483 unsigned char pub[65];
2486 secp256k1_scalar_negate(&nx, &x);
2487 secp256k1_ecmult(&ctx->
ecmult_ctx, &res1, point, &x, &x);
2488 secp256k1_ecmult(&ctx->
ecmult_ctx, &res2, point, &nx, &nx);
2489 secp256k1_gej_add_var(&res1, &res1, &res2, NULL);
2490 CHECK(secp256k1_gej_is_infinity(&res1));
2491 CHECK(secp256k1_gej_is_valid_var(&res1) == 0);
2492 secp256k1_ge_set_gej(&res3, &res1);
2493 CHECK(secp256k1_ge_is_infinity(&res3));
2494 CHECK(secp256k1_ge_is_valid_var(&res3) == 0);
2495 CHECK(secp256k1_eckey_pubkey_serialize(&res3, pub, &psize, 0) == 0);
2497 CHECK(secp256k1_eckey_pubkey_serialize(&res3, pub, &psize, 1) == 0);
2499 secp256k1_ecmult(&ctx->
ecmult_ctx, &res1, point, &zero, &zero);
2500 secp256k1_ge_set_gej(&res3, &res1);
2501 CHECK(secp256k1_ge_is_infinity(&res3));
2502 secp256k1_ecmult(&ctx->
ecmult_ctx, &res1, point, &one, &zero);
2503 secp256k1_ge_set_gej(&res3, &res1);
2505 secp256k1_ecmult(&ctx->
ecmult_ctx, &res1, point, &zero, &one);
2506 secp256k1_ge_set_gej(&res3, &res1);
2514 0x7603CB59, 0xB0EF6C63, 0xFE608479, 0x2A0C378C,
2515 0xDB3233A8, 0x0F8A9A09, 0xA877DEAD, 0x31B38C45
2517 for (i = 0; i < 500; i++) {
2519 if (secp256k1_ge_set_xo_var(&p, &x, 1)) {
2521 CHECK(secp256k1_ge_is_valid_var(&p));
2522 secp256k1_gej_set_ge(&j, &p);
2523 CHECK(secp256k1_gej_is_valid_var(&j));
2526 secp256k1_fe_sqr(&x, &x);
2528 secp256k1_fe_normalize_var(&x);
2529 CHECK(secp256k1_fe_equal_var(&x, &xr));
2535 0x6d986544, 0x57ff52b8, 0xcf1b8126, 0x5b802a5b,
2536 0xa97f9263, 0xb1e88044, 0x93351325, 0x91bc450a,
2537 0x535c59f7, 0x325e5d2b, 0xc391fbe8, 0x3c12787c,
2538 0x337e4a98, 0xe82a9011, 0x0123ba37, 0xdd769c7d
2542 0x649d4f77, 0xc4242df7, 0x7f2079c9, 0x14530327,
2543 0xa31b876a, 0xd2d8ce2a, 0x2236d5c6, 0xd7b2029b
2547 0x23773684, 0x4d209dc7, 0x098a786f, 0x20d06fcd,
2548 0x070a38bf, 0xc11ac651, 0x03004319, 0x1e2a8786,
2549 0xed8c3b8e, 0xc06dd57b, 0xd06ea66e, 0x45492b0f,
2550 0xb84e4e1b, 0xfb77e21f, 0x96baae2a, 0x63dec956
2553 secp256k1_ecmult_const(&
b, &a, &xn, 256);
2555 CHECK(secp256k1_ge_is_valid_var(&a));
2569 secp256k1_ecmult_const(&res1, &secp256k1_ge_const_g, &a, 256);
2570 secp256k1_ecmult_const(&res2, &secp256k1_ge_const_g, &
b, 256);
2571 secp256k1_ge_set_gej(&mid1, &res1);
2572 secp256k1_ge_set_gej(&mid2, &res2);
2573 secp256k1_ecmult_const(&res1, &mid1, &
b, 256);
2574 secp256k1_ecmult_const(&res2, &mid2, &a, 256);
2575 secp256k1_ge_set_gej(&mid1, &res1);
2576 secp256k1_ge_set_gej(&mid2, &res2);
2587 secp256k1_scalar_negate(&negone, &one);
2590 secp256k1_ecmult_const(&res1, &point, &zero, 3);
2591 secp256k1_ge_set_gej(&res2, &res1);
2592 CHECK(secp256k1_ge_is_infinity(&res2));
2593 secp256k1_ecmult_const(&res1, &point, &one, 2);
2594 secp256k1_ge_set_gej(&res2, &res1);
2596 secp256k1_ecmult_const(&res1, &point, &negone, 256);
2597 secp256k1_gej_neg(&res1, &res1);
2598 secp256k1_ge_set_gej(&res2, &res1);
2605 0x4968d524, 0x2abf9b7a, 0x466abbcf, 0x34b11b6d,
2606 0xcd83d307, 0x827bed62, 0x05fad0ce, 0x18fae63b
2609 0x5494c15d, 0x32099706, 0xc2395f94, 0x348745fd,
2610 0x757ce30e, 0x4e8c90fb, 0xa2bad184, 0xf883c69f,
2611 0x5d195d20, 0xe191bf7f, 0x1be3e55f, 0x56a80196,
2612 0x6071ad01, 0xf1462f66, 0xc997fa94, 0xdb858435
2618 secp256k1_gej_set_ge(&point, &secp256k1_ge_const_g);
2619 for (i = 0; i < 100; ++i) {
2621 secp256k1_ge_set_gej(&tmp, &point);
2622 secp256k1_ecmult_const(&point, &tmp, &scalar, 256);
2624 secp256k1_ge_set_gej(&res, &point);
2642 *sc = data->
sc[idx];
2643 *pt = data->
pt[idx];
2667 secp256k1_scalar_set_int(&szero, 0);
2670 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &
r, NULL, ecmult_multi_callback, &data, 0));
2673 for (ncount = 0; ncount < count; ncount++) {
2680 secp256k1_gej_set_ge(&ptgj, &ptg);
2682 pt[1] = secp256k1_ge_const_g;
2685 secp256k1_ecmult(&ctx->
ecmult_ctx, &r2, &ptgj, &szero, &sc[0]);
2686 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &
r, &sc[0], ecmult_multi_callback, &data, 0));
2687 secp256k1_gej_neg(&r2, &r2);
2688 secp256k1_gej_add_var(&
r, &
r, &r2, NULL);
2689 CHECK(secp256k1_gej_is_infinity(&
r));
2692 secp256k1_ecmult(&ctx->
ecmult_ctx, &r2, &ptgj, &sc[0], &szero);
2693 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &
r, &szero, ecmult_multi_callback, &data, 1));
2694 secp256k1_gej_neg(&r2, &r2);
2695 secp256k1_gej_add_var(&
r, &
r, &r2, NULL);
2696 CHECK(secp256k1_gej_is_infinity(&
r));
2699 scratch_empty = secp256k1_scratch_create(&ctx->
error_callback, 0);
2700 CHECK(!ecmult_multi(&ctx->
ecmult_ctx, scratch_empty, &
r, &szero, ecmult_multi_callback, &data, 1));
2701 secp256k1_scratch_destroy(scratch_empty);
2704 CHECK(!ecmult_multi(&ctx->
ecmult_ctx, scratch, &
r, &szero, ecmult_multi_false_callback, &data, 1));
2707 secp256k1_ecmult(&ctx->
ecmult_ctx, &r2, &ptgj, &sc[0], &sc[1]);
2708 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &
r, &szero, ecmult_multi_callback, &data, 2));
2709 secp256k1_gej_neg(&r2, &r2);
2710 secp256k1_gej_add_var(&
r, &
r, &r2, NULL);
2711 CHECK(secp256k1_gej_is_infinity(&
r));
2714 secp256k1_ecmult(&ctx->
ecmult_ctx, &r2, &ptgj, &sc[0], &sc[1]);
2715 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &
r, &sc[1], ecmult_multi_callback, &data, 1));
2716 secp256k1_gej_neg(&r2, &r2);
2717 secp256k1_gej_add_var(&
r, &
r, &r2, NULL);
2718 CHECK(secp256k1_gej_is_infinity(&
r));
2722 for (ncount = 0; ncount < count; ncount++) {
2725 size_t sizes[] = { 2, 10, 32 };
2727 for (j = 0; j < 3; j++) {
2728 for (i = 0; i < 32; i++) {
2730 secp256k1_ge_set_infinity(&pt[i]);
2732 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &
r, &szero, ecmult_multi_callback, &data, sizes[j]));
2733 CHECK(secp256k1_gej_is_infinity(&
r));
2736 for (j = 0; j < 3; j++) {
2737 for (i = 0; i < 32; i++) {
2740 secp256k1_scalar_set_int(&sc[i], 0);
2742 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &
r, &szero, ecmult_multi_callback, &data, sizes[j]));
2743 CHECK(secp256k1_gej_is_infinity(&
r));
2746 for (j = 0; j < 3; j++) {
2748 for (i = 0; i < 16; i++) {
2750 secp256k1_scalar_negate(&sc[2*i + 1], &sc[2*i]);
2752 pt[2 * i + 1] = ptg;
2755 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &
r, &szero, ecmult_multi_callback, &data, sizes[j]));
2756 CHECK(secp256k1_gej_is_infinity(&
r));
2759 for (i = 0; i < 16; i++) {
2765 secp256k1_ge_neg(&pt[2*i+1], &pt[2*i]);
2768 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &
r, &szero, ecmult_multi_callback, &data, sizes[j]));
2769 CHECK(secp256k1_gej_is_infinity(&
r));
2773 secp256k1_scalar_set_int(&sc[0], 0);
2775 for (i = 1; i < 32; i++) {
2779 secp256k1_scalar_add(&sc[0], &sc[0], &sc[i]);
2780 secp256k1_scalar_negate(&sc[i], &sc[i]);
2783 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &
r, &szero, ecmult_multi_callback, &data, 32));
2784 CHECK(secp256k1_gej_is_infinity(&
r));
2788 for (ncount = 0; ncount < count; ncount++) {
2790 secp256k1_gej_set_infinity(&
r);
2793 for (i = 0; i < 20; i++) {
2798 secp256k1_gej_add_ge_var(&
r, &
r, &pt[i], NULL);
2801 secp256k1_ecmult(&ctx->
ecmult_ctx, &r2, &
r, &sc[0], &szero);
2802 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &
r, &szero, ecmult_multi_callback, &data, 20));
2803 secp256k1_gej_neg(&r2, &r2);
2804 secp256k1_gej_add_var(&
r, &
r, &r2, NULL);
2805 CHECK(secp256k1_gej_is_infinity(&
r));
2809 for (ncount = 0; ncount < count; ncount++) {
2814 secp256k1_scalar_set_int(&rs, 0);
2817 for (i = 0; i < 20; i++) {
2820 secp256k1_scalar_add(&rs, &rs, &sc[i]);
2823 secp256k1_gej_set_ge(&p0j, &pt[0]);
2824 secp256k1_ecmult(&ctx->
ecmult_ctx, &r2, &p0j, &rs, &szero);
2825 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &
r, &szero, ecmult_multi_callback, &data, 20));
2826 secp256k1_gej_neg(&r2, &r2);
2827 secp256k1_gej_add_var(&
r, &
r, &r2, NULL);
2828 CHECK(secp256k1_gej_is_infinity(&
r));
2832 secp256k1_scalar_clear(&sc[0]);
2833 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &
r, &szero, ecmult_multi_callback, &data, 20));
2834 secp256k1_scalar_clear(&sc[1]);
2835 secp256k1_scalar_clear(&sc[2]);
2836 secp256k1_scalar_clear(&sc[3]);
2837 secp256k1_scalar_clear(&sc[4]);
2838 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &
r, &szero, ecmult_multi_callback, &data, 6));
2839 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &
r, &szero, ecmult_multi_callback, &data, 5));
2840 CHECK(secp256k1_gej_is_infinity(&
r));
2844 const size_t TOP = 8;
2851 secp256k1_gej_set_ge(&ptgj, &ptg);
2853 for(t0i = 0; t0i < TOP; t0i++) {
2854 for(t1i = 0; t1i < TOP; t1i++) {
2858 secp256k1_scalar_set_int(&t0, (t0i + 1) / 2);
2859 secp256k1_scalar_cond_negate(&t0, t0i & 1);
2860 secp256k1_scalar_set_int(&t1, (t1i + 1) / 2);
2861 secp256k1_scalar_cond_negate(&t1, t1i & 1);
2863 secp256k1_ecmult(&ctx->
ecmult_ctx, &t0p, &ptgj, &t0, &szero);
2864 secp256k1_ecmult(&ctx->
ecmult_ctx, &t1p, &ptgj, &t1, &szero);
2866 for(s0i = 0; s0i < TOP; s0i++) {
2867 for(s1i = 0; s1i < TOP; s1i++) {
2871 secp256k1_ge_set_gej(&pt[0], &t0p);
2872 secp256k1_ge_set_gej(&pt[1], &t1p);
2874 secp256k1_scalar_set_int(&sc[0], (s0i + 1) / 2);
2875 secp256k1_scalar_cond_negate(&sc[0], s0i & 1);
2876 secp256k1_scalar_set_int(&sc[1], (s1i + 1) / 2);
2877 secp256k1_scalar_cond_negate(&sc[1], s1i & 1);
2879 secp256k1_scalar_mul(&tmp1, &t0, &sc[0]);
2880 secp256k1_scalar_mul(&tmp2, &t1, &sc[1]);
2881 secp256k1_scalar_add(&tmp1, &tmp1, &tmp2);
2883 secp256k1_ecmult(&ctx->
ecmult_ctx, &expected, &ptgj, &tmp1, &szero);
2884 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &actual, &szero, ecmult_multi_callback, &data, 2));
2885 secp256k1_gej_neg(&expected, &expected);
2886 secp256k1_gej_add_var(&actual, &actual, &expected, NULL);
2887 CHECK(secp256k1_gej_is_infinity(&actual));
2898 CHECK(secp256k1_pippenger_bucket_window_inv(0) == 0);
2900 #ifdef USE_ENDOMORPHISM
2906 CHECK(secp256k1_pippenger_bucket_window(secp256k1_pippenger_bucket_window_inv(i)) == i);
2908 CHECK(secp256k1_pippenger_bucket_window(secp256k1_pippenger_bucket_window_inv(i)+1) > i);
2918 size_t scratch_size = secp256k1_rand_int(256);
2921 size_t n_points_supported;
2922 int bucket_window = 0;
2924 for(; scratch_size < max_size; scratch_size+=256) {
2925 scratch = secp256k1_scratch_create(&ctx->
error_callback, scratch_size);
2926 CHECK(scratch != NULL);
2927 n_points_supported = secp256k1_pippenger_max_points(scratch);
2928 if (n_points_supported == 0) {
2929 secp256k1_scratch_destroy(scratch);
2932 bucket_window = secp256k1_pippenger_bucket_window(n_points_supported);
2933 CHECK(secp256k1_scratch_allocate_frame(scratch, secp256k1_pippenger_scratch_size(n_points_supported, bucket_window),
PIPPENGER_SCRATCH_OBJECTS));
2934 secp256k1_scratch_deallocate_frame(scratch);
2935 secp256k1_scratch_destroy(scratch);
2956 secp256k1_gej_set_infinity(&r2);
2957 secp256k1_scalar_set_int(&szero, 0);
2961 secp256k1_ecmult(&ctx->
ecmult_ctx, &r2, &r2, &szero, &scG);
2962 for(i = 0; i < n_points; i++) {
2966 secp256k1_gej_set_ge(&ptgj, &ptg);
2969 secp256k1_ecmult(&ctx->
ecmult_ctx, &ptgj, &ptgj, &sc[i], NULL);
2970 secp256k1_gej_add_var(&r2, &r2, &ptgj, NULL);
2977 CHECK(!secp256k1_ecmult_multi_var(&ctx->
ecmult_ctx, scratch, &
r, &scG, ecmult_multi_callback, &data, 1));
2978 secp256k1_scratch_destroy(scratch);
2983 CHECK(!secp256k1_ecmult_multi_var(&ctx->
ecmult_ctx, scratch, &
r, &scG, ecmult_multi_callback, &data, 1));
2984 secp256k1_scratch_destroy(scratch);
2986 secp256k1_gej_neg(&r2, &r2);
2987 for(i = 1; i <= n_points; i++) {
2989 int bucket_window = secp256k1_pippenger_bucket_window(i);
2990 size_t scratch_size = secp256k1_pippenger_scratch_size(i, bucket_window);
2993 size_t scratch_size = secp256k1_strauss_scratch_size(i);
2996 CHECK(secp256k1_ecmult_multi_var(&ctx->
ecmult_ctx, scratch, &
r, &scG, ecmult_multi_callback, &data, n_points));
2997 secp256k1_gej_add_var(&
r, &
r, &r2, NULL);
2998 CHECK(secp256k1_gej_is_infinity(&
r));
2999 secp256k1_scratch_destroy(scratch);
3010 scratch = secp256k1_scratch_create(&ctx->
error_callback, 819200);
3014 secp256k1_scratch_destroy(scratch);
3019 secp256k1_scratch_destroy(scratch);
3030 secp256k1_scalar_set_int(&x, 0);
3031 secp256k1_scalar_set_int(&two, 2);
3032 bits = secp256k1_ecmult_wnaf(wnaf, 256, number, w);
3034 for (i = bits-1; i >= 0; i--) {
3036 secp256k1_scalar_mul(&x, &x, &two);
3038 CHECK(zeroes == -1 || zeroes >= w-1);
3040 CHECK((v & 1) == 1);
3041 CHECK(v <= (1 << (w-1)) - 1);
3042 CHECK(v >= -(1 << (w-1)) - 1);
3044 CHECK(zeroes != -1);
3048 secp256k1_scalar_set_int(&t, v);
3050 secp256k1_scalar_set_int(&t, -v);
3051 secp256k1_scalar_negate(&t, &t);
3053 secp256k1_scalar_add(&x, &x, &t);
3055 CHECK(secp256k1_scalar_eq(&x, number));
3064 if (!secp256k1_scalar_get_bits(&neg1, 0, 1)) {
3065 secp256k1_scalar_negate(&neg1, &neg1);
3068 sign2 = secp256k1_scalar_cond_negate(&neg2, secp256k1_scalar_is_even(&neg2));
3069 CHECK(sign1 == sign2);
3070 CHECK(secp256k1_scalar_eq(&neg1, &neg2));
3075 int wnaf[256] = {0};
3081 secp256k1_scalar_set_int(&x, 0);
3082 secp256k1_scalar_set_int(&shift, 1 << w);
3084 #ifdef USE_ENDOMORPHISM
3085 for (i = 0; i < 16; ++i) {
3086 secp256k1_scalar_shr_int(&num, 8);
3090 skew = secp256k1_wnaf_const(wnaf, num, w, bits);
3097 CHECK(v > -(1 << w));
3098 CHECK(v < (1 << w));
3100 secp256k1_scalar_mul(&x, &x, &shift);
3102 secp256k1_scalar_set_int(&t, v);
3104 secp256k1_scalar_set_int(&t, -v);
3105 secp256k1_scalar_negate(&t, &t);
3107 secp256k1_scalar_add(&x, &x, &t);
3110 secp256k1_scalar_cadd_bit(&num, skew == 2, 1);
3111 CHECK(secp256k1_scalar_eq(&x, &num));
3116 int wnaf[256] = {0};
3121 secp256k1_scalar_set_int(&x, 0);
3122 secp256k1_scalar_set_int(&shift, 1 << w);
3124 #ifdef USE_ENDOMORPHISM
3125 for (i = 0; i < 16; ++i) {
3126 secp256k1_scalar_shr_int(&num, 8);
3129 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
3134 CHECK(v == 0 || v & 1);
3135 CHECK(v > -(1 << w));
3136 CHECK(v < (1 << w));
3138 secp256k1_scalar_mul(&x, &x, &shift);
3140 secp256k1_scalar_set_int(&t, v);
3142 secp256k1_scalar_set_int(&t, -v);
3143 secp256k1_scalar_negate(&t, &t);
3145 secp256k1_scalar_add(&x, &x, &t);
3148 secp256k1_scalar_cadd_bit(&num, 0, skew == 1);
3149 CHECK(secp256k1_scalar_eq(&x, &num));
3157 CHECK(wnaf[i] == 0);
3159 for (i = 7; i >= 0; --i) {
3160 CHECK(wnaf[i] == wnaf_expected[i]);
3166 int wnaf[256] = {0};
3171 secp256k1_scalar_set_int(&num, 0);
3172 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
3179 secp256k1_scalar_set_int(&num, 1);
3180 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
3185 CHECK(wnaf[0] == 1);
3189 int wnaf_expected[8] = { 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf };
3190 secp256k1_scalar_set_int(&num, 0xffffffff);
3191 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
3196 int wnaf_expected[8] = { -1, -1, -1, -1, -1, -1, -1, 0xf };
3197 secp256k1_scalar_set_int(&num, 0xeeeeeeee);
3198 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
3203 int wnaf_expected[8] = { 1, 0, 1, 0, 1, 0, 1, 0 };
3204 secp256k1_scalar_set_int(&num, 0x01010101);
3205 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
3210 int wnaf_expected[8] = { -0xf, 0, 0xf, -0xf, 0, 0xf, 1, 0 };
3211 secp256k1_scalar_set_int(&num, 0x01ef1ef1);
3212 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
3231 for (i = 0; i < count; i++) {
3238 secp256k1_scalar_set_int(&n, 0);
3239 CHECK(secp256k1_scalar_cond_negate(&n, 1) == -1);
3240 CHECK(secp256k1_scalar_is_zero(&n));
3241 CHECK(secp256k1_scalar_cond_negate(&n, 0) == 1);
3242 CHECK(secp256k1_scalar_is_zero(&n));
3252 secp256k1_ge_neg(&ng, &secp256k1_ge_const_g);
3253 for (i = 0; i < 36; i++ ) {
3254 secp256k1_scalar_set_int(&x, i);
3256 for (j = 0; j < i; j++) {
3260 secp256k1_gej_add_ge(&
r, &
r, &ng);
3262 CHECK(secp256k1_gej_is_infinity(&
r));
3264 for (i = 1; i <= 36; i++ ) {
3265 secp256k1_scalar_set_int(&x, i);
3266 secp256k1_scalar_negate(&x, &x);
3268 for (j = 0; j < i; j++) {
3272 secp256k1_gej_add_ge(&
r, &
r, &secp256k1_ge_const_g);
3274 CHECK(secp256k1_gej_is_infinity(&
r));
3286 unsigned char seed32[32];
3293 secp256k1_rand256(seed32);
3301 secp256k1_ge_set_gej(&pge, &pgej);
3320 for (i = 0; i < 10; i++) {
3325 #ifdef USE_ENDOMORPHISM
3327 void test_scalar_split(
void) {
3330 const unsigned char zero[32] = {0};
3331 unsigned char tmp[32];
3334 secp256k1_scalar_split_lambda(&s1, &slam, &full);
3337 if (secp256k1_scalar_is_high(&s1)) {
3338 secp256k1_scalar_negate(&s1, &s1);
3340 if (secp256k1_scalar_is_high(&slam)) {
3341 secp256k1_scalar_negate(&slam, &slam);
3344 secp256k1_scalar_get_b32(tmp, &s1);
3345 CHECK(memcmp(zero, tmp, 16) == 0);
3346 secp256k1_scalar_get_b32(tmp, &slam);
3347 CHECK(memcmp(zero, tmp, 16) == 0);
3350 void run_endomorphism_tests(
void) {
3351 test_scalar_split();
3356 unsigned char pubkeyc[65];
3363 for (pubkeyclen = 3; pubkeyclen <= 65; pubkeyclen++) {
3366 memcpy(&pubkeyc[1], input, 64);
3367 VG_UNDEF(&pubkeyc[pubkeyclen], 65 - pubkeyclen);
3368 for (i = 0; i < 256; i++) {
3375 ysign = (input[63] & 1) + 2;
3377 xpass = xvalid && (pubkeyclen == 33) && ((i & 254) == 2);
3379 ypass = xvalid && yvalid && ((i & 4) == ((pubkeyclen == 65) << 2)) &&
3380 ((i == 4) || ((i & 251) == ysign)) && ((pubkeyclen == 33) || (pubkeyclen == 65));
3381 if (xpass || ypass) {
3383 unsigned char pubkeyo[65];
3385 memset(&pubkey, 0,
sizeof(pubkey));
3395 CHECK(memcmp(&pubkeyo[1], &pubkeyc[1], 32) == 0);
3396 CHECK((pubkeyclen != 33) || (pubkeyo[0] == pubkeyc[0]));
3399 CHECK(pubkeyo[0] == ysign);
3400 CHECK(secp256k1_pubkey2_load(ctx, &ge, &pubkey) == 1);
3401 memset(&pubkey, 0,
sizeof(pubkey));
3403 secp256k1_pubkey2_save(&pubkey, &ge);
3410 CHECK(pubkeyo[0] == 4);
3411 CHECK(memcmp(&pubkeyo[1], input, 64) == 0);
3416 memset(&pubkey, 0xfe,
sizeof(pubkey));
3422 CHECK(secp256k1_pubkey2_load(ctx, &ge, &pubkey) == 0);
3431 #define SECP256K1_EC_PARSE_TEST_NVALID (12)
3435 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x52,
3436 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3437 0x00, 0x00, 0x64, 0xef, 0xa1, 0x7b, 0x77, 0x61, 0xe1, 0xe4, 0x27, 0x06, 0x98, 0x9f, 0xb4, 0x83,
3438 0xb8, 0xd2, 0xd4, 0x9b, 0xf7, 0x8f, 0xae, 0x98, 0x03, 0xf0, 0x99, 0xb8, 0x34, 0xed, 0xeb, 0x00
3442 0x7a, 0xe9, 0x6a, 0x2b, 0x65, 0x7c, 0x07, 0x10, 0x6e, 0x64, 0x47, 0x9e, 0xac, 0x34, 0x34, 0xe9,
3443 0x9c, 0xf0, 0x49, 0x75, 0x12, 0xf5, 0x89, 0x95, 0xc1, 0x39, 0x6c, 0x28, 0x71, 0x95, 0x01, 0xee,
3444 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14,
3445 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee,
3449 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3450 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2c,
3451 0x0e, 0x99, 0x4b, 0x14, 0xea, 0x72, 0xf8, 0xc3, 0xeb, 0x95, 0xc7, 0x1e, 0xf6, 0x92, 0x57, 0x5e,
3452 0x77, 0x50, 0x58, 0x33, 0x2d, 0x7e, 0x52, 0xd0, 0x99, 0x5c, 0xf8, 0x03, 0x88, 0x71, 0xb6, 0x7d,
3456 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3457 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2c,
3458 0xf1, 0x66, 0xb4, 0xeb, 0x15, 0x8d, 0x07, 0x3c, 0x14, 0x6a, 0x38, 0xe1, 0x09, 0x6d, 0xa8, 0xa1,
3459 0x88, 0xaf, 0xa7, 0xcc, 0xd2, 0x81, 0xad, 0x2f, 0x66, 0xa3, 0x07, 0xfb, 0x77, 0x8e, 0x45, 0xb2,
3463 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3464 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
3465 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14,
3466 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee,
3470 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3471 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
3472 0xbd, 0xe7, 0x0d, 0xf5, 0x19, 0x39, 0xb9, 0x4c, 0x9c, 0x24, 0x97, 0x9f, 0xa7, 0xdd, 0x04, 0xeb,
3473 0xd9, 0xb3, 0x57, 0x2d, 0xa7, 0x80, 0x22, 0x90, 0x43, 0x8a, 0xf2, 0xa6, 0x81, 0x89, 0x54, 0x41,
3477 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6,
3478 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07,
3479 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3480 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
3484 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c,
3485 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73,
3486 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3487 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
3491 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc,
3492 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5,
3493 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3494 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
3498 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6,
3499 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07,
3500 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3501 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
3505 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c,
3506 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73,
3507 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3508 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
3512 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc,
3513 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5,
3514 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3515 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01
3518 #define SECP256K1_EC_PARSE_TEST_NXVALID (4)
3522 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6,
3523 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07,
3524 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3525 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
3529 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c,
3530 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73,
3531 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3532 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
3536 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc,
3537 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5,
3538 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3539 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
3543 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3544 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
3545 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3546 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03
3549 #define SECP256K1_EC_PARSE_TEST_NINVALID (7)
3553 0x0a, 0x2d, 0x2b, 0xa9, 0x35, 0x07, 0xf1, 0xdf, 0x23, 0x37, 0x70, 0xc2, 0xa7, 0x97, 0x96, 0x2c,
3554 0xc6, 0x1f, 0x6d, 0x15, 0xda, 0x14, 0xec, 0xd4, 0x7d, 0x8d, 0x27, 0xae, 0x1c, 0xd5, 0xf8, 0x53,
3555 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3556 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
3560 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3561 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
3562 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14,
3563 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee,
3567 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3568 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
3569 0xbd, 0xe7, 0x0d, 0xf5, 0x19, 0x39, 0xb9, 0x4c, 0x9c, 0x24, 0x97, 0x9f, 0xa7, 0xdd, 0x04, 0xeb,
3570 0xd9, 0xb3, 0x57, 0x2d, 0xa7, 0x80, 0x22, 0x90, 0x43, 0x8a, 0xf2, 0xa6, 0x81, 0x89, 0x54, 0x41,
3574 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3575 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
3576 0xf4, 0x84, 0x14, 0x5c, 0xb0, 0x14, 0x9b, 0x82, 0x5d, 0xff, 0x41, 0x2f, 0xa0, 0x52, 0xa8, 0x3f,
3577 0xcb, 0x72, 0xdb, 0x61, 0xd5, 0x6f, 0x37, 0x70, 0xce, 0x06, 0x6b, 0x73, 0x49, 0xa2, 0xaa, 0x28,
3581 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3582 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
3583 0x0b, 0x7b, 0xeb, 0xa3, 0x4f, 0xeb, 0x64, 0x7d, 0xa2, 0x00, 0xbe, 0xd0, 0x5f, 0xad, 0x57, 0xc0,
3584 0x34, 0x8d, 0x24, 0x9e, 0x2a, 0x90, 0xc8, 0x8f, 0x31, 0xf9, 0x94, 0x8b, 0xb6, 0x5d, 0x52, 0x07,
3588 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3589 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3590 0x8f, 0x53, 0x7e, 0xef, 0xdf, 0xc1, 0x60, 0x6a, 0x07, 0x27, 0xcd, 0x69, 0xb4, 0xa7, 0x33, 0x3d,
3591 0x38, 0xed, 0x44, 0xe3, 0x93, 0x2a, 0x71, 0x79, 0xee, 0xcb, 0x4b, 0x6f, 0xba, 0x93, 0x60, 0xdc,
3595 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3596 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3597 0x70, 0xac, 0x81, 0x10, 0x20, 0x3e, 0x9f, 0x95, 0xf8, 0xd8, 0x32, 0x96, 0x4b, 0x58, 0xcc, 0xc2,
3598 0xc7, 0x12, 0xbb, 0x1c, 0x6c, 0xd5, 0x8e, 0x86, 0x11, 0x34, 0xb4, 0x8f, 0x45, 0x6c, 0x9b, 0x53
3601 const unsigned char pubkeyc[66] = {
3603 0x04, 0x79, 0xBE, 0x66, 0x7E, 0xF9, 0xDC, 0xBB, 0xAC, 0x55, 0xA0, 0x62, 0x95, 0xCE, 0x87, 0x0B,
3604 0x07, 0x02, 0x9B, 0xFC, 0xDB, 0x2D, 0xCE, 0x28, 0xD9, 0x59, 0xF2, 0x81, 0x5B, 0x16, 0xF8, 0x17,
3605 0x98, 0x48, 0x3A, 0xDA, 0x77, 0x26, 0xA3, 0xC4, 0x65, 0x5D, 0xA4, 0xFB, 0xFC, 0x0E, 0x11, 0x08,
3606 0xA8, 0xFD, 0x17, 0xB4, 0x48, 0xA6, 0x85, 0x54, 0x19, 0x9C, 0x47, 0xD0, 0x8F, 0xFB, 0x10, 0xD4,
3609 unsigned char sout[65];
3610 unsigned char shortkey[2];
3622 memset(&pubkey, 0xfe,
sizeof(pubkey));
3629 CHECK(secp256k1_pubkey2_load(ctx, &ge, &pubkey) == 0);
3632 for (i = 0; i < 256 ; i++) {
3633 memset(&pubkey, 0xfe,
sizeof(pubkey));
3641 CHECK(secp256k1_pubkey2_load(ctx, &ge, &pubkey) == 0);
3645 for (i = 0; i < 65536 ; i++) {
3646 memset(&pubkey, 0xfe,
sizeof(pubkey));
3648 shortkey[0] = i & 255;
3649 shortkey[1] = i >> 8;
3654 CHECK(secp256k1_pubkey2_load(ctx, &ge, &pubkey) == 0);
3657 memset(&pubkey, 0xfe,
sizeof(pubkey));
3664 CHECK(secp256k1_pubkey2_load(ctx, &ge, &pubkey) == 0);
3670 memset(&pubkey, 0xfe,
sizeof(pubkey));
3676 CHECK(secp256k1_pubkey2_load(ctx, &ge, &pubkey) == 0);
3679 memset(&pubkey, 0xfe,
sizeof(pubkey));
3685 CHECK(secp256k1_pubkey2_load(ctx, &ge, &pubkey) == 0);
3688 memset(&pubkey, 0xfe,
sizeof(pubkey));
3694 CHECK(secp256k1_pubkey2_load(ctx, &ge, &pubkey) == 0);
3697 memset(&pubkey, 0,
sizeof(pubkey));
3704 CHECK(secp256k1_pubkey2_load(ctx, &ge, &pubkey) == 1);
3743 CHECK(ecount2 == 10);
3758 const unsigned char orderc[32] = {
3759 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3760 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
3761 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
3762 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41
3765 unsigned char ctmp[33];
3766 unsigned char ctmp2[33];
3781 memset(ctmp, 255, 32);
3783 memset(&pubkey, 1,
sizeof(pubkey));
3789 memset(ctmp, 0, 32);
3791 memset(&pubkey, 1,
sizeof(pubkey));
3799 memset(&pubkey, 0,
sizeof(pubkey));
3804 pubkey_one = pubkey;
3806 memcpy(ctmp, orderc, 32);
3809 memset(&pubkey, 1,
sizeof(pubkey));
3817 memset(&pubkey, 0,
sizeof(pubkey));
3822 pubkey_negone = pubkey;
3824 memset(ctmp2, 0, 32);
3826 CHECK(memcmp(orderc, ctmp, 31) == 0 && ctmp[31] == 0x40);
3827 memcpy(&pubkey2, &pubkey,
sizeof(pubkey));
3829 CHECK(memcmp(&pubkey, &pubkey2,
sizeof(pubkey)) == 0);
3832 CHECK(memcmp(zeros, ctmp, 32) == 0);
3834 CHECK(memcmp(&pubkey, zeros,
sizeof(pubkey)) == 0);
3835 memcpy(&pubkey, &pubkey2,
sizeof(pubkey));
3837 memcpy(ctmp, orderc, 32);
3840 CHECK(memcmp(zeros, ctmp, 32) == 0);
3841 memcpy(ctmp, orderc, 32);
3844 CHECK(memcmp(zeros, ctmp, 32) == 0);
3845 memcpy(ctmp, orderc, 32);
3848 CHECK(memcmp(&pubkey, zeros,
sizeof(pubkey)) == 0);
3849 memcpy(&pubkey, &pubkey2,
sizeof(pubkey));
3851 CHECK(memcmp(&pubkey, zeros,
sizeof(pubkey)) == 0);
3852 memcpy(&pubkey, &pubkey2,
sizeof(pubkey));
3856 CHECK(memcmp(zeros, ctmp2, 32) == 0);
3859 CHECK(memcmp(&pubkey, zeros,
sizeof(pubkey)) == 0);
3860 memcpy(&pubkey, &pubkey2,
sizeof(pubkey));
3864 CHECK(memcmp(ctmp2, zeros, 31) == 0 && ctmp2[31] == 1);
3869 CHECK(memcmp(&pubkey, &pubkey2,
sizeof(pubkey)) == 0);
3874 CHECK(memcmp(&pubkey, &pubkey2,
sizeof(pubkey)) == 0);
3880 memset(&pubkey, 0, 32);
3883 CHECK(memcmp(&pubkey, zeros,
sizeof(pubkey)) == 0);
3884 memcpy(&pubkey, &pubkey2,
sizeof(pubkey));
3885 memset(&pubkey2, 0, 32);
3888 CHECK(memcmp(&pubkey2, zeros,
sizeof(pubkey2)) == 0);
3896 memset(ctmp2, 0, 32);
3903 memset(ctmp2, 0, 32);
3910 memset(ctmp2, 0, 32);
3916 memset(ctmp2, 0, 32);
3925 memset(&pubkey, 1,
sizeof(pubkey));
3931 pubkeys[0] = &pubkey_one;
3950 pubkeys[0] = &pubkey_negone;
3960 CHECK(memcmp(ctmp, ctmp2, 33) == 0);
3962 pubkeys[0] = &pubkey_one;
3963 pubkeys[1] = &pubkey_negone;
3971 pubkeys[2] = &pubkey_one;
3981 CHECK(memcmp(ctmp, ctmp2, 33) == 0);
3983 pubkeys[1] = &pubkey_one;
3997 }
while(!secp256k1_ecdsa_sig_sign(&ctx->
ecmult_gen_ctx, sigr, sigs,
key, msg, &nonce, recid));
4011 secp256k1_ge_set_gej(&pub, &pubj);
4012 getrec = secp256k1_rand_bits(1);
4015 CHECK(recid >= 0 && recid < 4);
4017 CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sigr, &sigs, &pub, &msg));
4018 secp256k1_scalar_set_int(&one, 1);
4019 secp256k1_scalar_add(&msg, &msg, &one);
4020 CHECK(!secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sigr, &sigs, &pub, &msg));
4025 for (i = 0; i < 10*count; i++) {
4031 static int precomputed_nonce_function(
unsigned char *nonce32,
const unsigned char *msg32,
const unsigned char *key32,
const unsigned char *algo16,
void *data,
unsigned int counter) {
4035 memcpy(nonce32, data, 32);
4036 return (counter == 0);
4039 static int nonce_function_test_fail(
unsigned char *nonce32,
const unsigned char *msg32,
const unsigned char *key32,
const unsigned char *algo16,
void *data,
unsigned int counter) {
4044 return nonce_function_rfc6979(nonce32, msg32, key32, algo16, data, counter - 1);
4047 static int nonce_function_test_retry(
unsigned char *nonce32,
const unsigned char *msg32,
const unsigned char *key32,
const unsigned char *algo16,
void *data,
unsigned int counter) {
4050 memset(nonce32, counter==0 ? 0 : 255, 32);
4057 static const unsigned char order[] = {
4058 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
4059 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
4060 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,
4061 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x41
4063 memcpy(nonce32, order, 32);
4074 return nonce_function_rfc6979(nonce32, msg32, key32, algo16, data, counter - 5);
4083 unsigned char extra[32] = {0x00};
4084 unsigned char privkey[32];
4085 unsigned char message[32];
4086 unsigned char privkey2[32];
4089 unsigned char sig[74];
4091 unsigned char pubkeyc[65];
4092 size_t pubkeyclen = 65;
4095 unsigned char seckey[300];
4096 size_t seckeylen = 300;
4103 secp256k1_scalar_get_b32(privkey, &
key);
4104 secp256k1_scalar_get_b32(message, &msg);
4113 memset(&pubkey, 0,
sizeof(pubkey));
4117 memcpy(&pubkey_tmp, &pubkey,
sizeof(pubkey));
4119 CHECK(memcmp(&pubkey_tmp, &pubkey,
sizeof(pubkey)) != 0);
4121 CHECK(memcmp(&pubkey_tmp, &pubkey,
sizeof(pubkey)) == 0);
4126 CHECK(memcmp(privkey, privkey2, 32) == 0);
4129 if (secp256k1_rand_int(3) == 0) {
4132 unsigned char rnd[32];
4134 secp256k1_rand256_test(rnd);
4137 CHECK(ret1 == ret2);
4142 CHECK(memcmp(&pubkey, &pubkey2,
sizeof(pubkey)) == 0);
4146 if (secp256k1_rand_int(3) == 0) {
4149 unsigned char rnd[32];
4151 secp256k1_rand256_test(rnd);
4154 CHECK(ret1 == ret2);
4159 CHECK(memcmp(&pubkey, &pubkey2,
sizeof(pubkey)) == 0);
4171 CHECK(memcmp(&signature[0], &signature[4],
sizeof(signature[0])) == 0);
4172 CHECK(memcmp(&signature[0], &signature[1],
sizeof(signature[0])) != 0);
4173 CHECK(memcmp(&signature[0], &signature[2],
sizeof(signature[0])) != 0);
4174 CHECK(memcmp(&signature[0], &signature[3],
sizeof(signature[0])) != 0);
4175 CHECK(memcmp(&signature[1], &signature[2],
sizeof(signature[0])) != 0);
4176 CHECK(memcmp(&signature[1], &signature[3],
sizeof(signature[0])) != 0);
4177 CHECK(memcmp(&signature[2], &signature[3],
sizeof(signature[0])) != 0);
4185 secp256k1_ecdsa_sign2ature2_load(ctx, &
r, &s, &signature[0]);
4186 secp256k1_scalar_negate(&s, &s);
4187 secp256k1_ecdsa_sign2ature2_save(&signature[5], &
r, &s);
4194 secp256k1_scalar_negate(&s, &s);
4195 secp256k1_ecdsa_sign2ature2_save(&signature[5], &
r, &s);
4198 CHECK(memcmp(&signature[5], &signature[0], 64) == 0);
4202 memset(&signature[0], 0,
sizeof(signature[0]));
4208 sig[secp256k1_rand_int(siglen)] += 1 + secp256k1_rand_int(255);
4216 unsigned char in[65];
4218 size_t len = secp256k1_rand_bits(2) == 0 ? 65 : 33;
4219 if (secp256k1_rand_bits(2) == 0) {
4220 len = secp256k1_rand_bits(6);
4223 in[0] = secp256k1_rand_bits(1) ? 4 : (secp256k1_rand_bits(1) ? 6 : 7);
4225 in[0] = secp256k1_rand_bits(1) ? 2 : 3;
4227 if (secp256k1_rand_bits(3) == 0) {
4228 in[0] = secp256k1_rand_bits(8);
4231 secp256k1_rand256(&in[1]);
4234 secp256k1_rand256(&in[33]);
4236 if (secp256k1_eckey_pubkey_parse(&elem, in, len)) {
4237 unsigned char out[65];
4238 unsigned char firstb;
4243 CHECK(secp256k1_eckey_pubkey_serialize(&elem, out, &size, len == 33));
4245 CHECK(memcmp(&in[1], &out[1], len-1) == 0);
4247 if ((in[0] != 6) && (in[0] != 7)) {
4248 CHECK(in[0] == out[0]);
4251 CHECK(secp256k1_eckey_pubkey_serialize(&elem, in, &size, 0));
4253 CHECK(secp256k1_eckey_pubkey_parse(&elem2, in, size));
4256 in[0] = secp256k1_rand_bits(1) ? 6 : 7;
4257 res = secp256k1_eckey_pubkey_parse(&elem2, in, size);
4258 if (firstb == 2 || firstb == 3) {
4259 if (in[0] == firstb + 4) {
4267 CHECK(secp256k1_eckey_pubkey_serialize(&elem, out, &size, 0));
4268 CHECK(memcmp(&in[1], &out[1], 64) == 0);
4275 for (i = 0; i < 10*count; i++) {
4282 for (i = 0; i < 64*count; i++) {
4288 static const unsigned char zeroes[32] = {0};
4289 #ifdef ENABLE_OPENSSL_TESTS
4290 static const unsigned char max_scalar[32] = {
4291 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
4292 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
4293 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
4294 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40
4301 unsigned char roundtrip_der[2048];
4302 unsigned char compact_der[64];
4303 size_t len_der = 2048;
4304 int parsed_der = 0, valid_der = 0, roundtrips_der = 0;
4307 unsigned char roundtrip_der_lax[2048];
4308 unsigned char compact_der_lax[64];
4309 size_t len_der_lax = 2048;
4310 int parsed_der_lax = 0, valid_der_lax = 0, roundtrips_der_lax = 0;
4312 #ifdef ENABLE_OPENSSL_TESTS
4313 ECDSA_SIG *sig_openssl;
4314 const BIGNUM *
r = NULL, *s = NULL;
4315 const unsigned char *sigptr;
4316 unsigned char roundtrip_openssl[2048];
4317 int len_openssl = 2048;
4318 int parsed_openssl, valid_openssl = 0, roundtrips_openssl = 0;
4324 valid_der = (memcmp(compact_der, zeroes, 32) != 0) && (memcmp(compact_der + 32, zeroes, 32) != 0);
4328 roundtrips_der = (len_der == siglen) && memcmp(roundtrip_der, sig, siglen) == 0;
4332 if (parsed_der_lax) {
4334 valid_der_lax = (memcmp(compact_der_lax, zeroes, 32) != 0) && (memcmp(compact_der_lax + 32, zeroes, 32) != 0);
4336 if (valid_der_lax) {
4338 roundtrips_der_lax = (len_der_lax == siglen) && memcmp(roundtrip_der_lax, sig, siglen) == 0;
4341 if (certainly_der) {
4342 ret |= (!parsed_der) << 2;
4344 if (certainly_not_der) {
4345 ret |= (parsed_der) << 17;
4348 ret |= (!roundtrips_der) << 3;
4352 ret |= (!roundtrips_der_lax) << 12;
4353 ret |= (len_der != len_der_lax) << 13;
4354 ret |= (memcmp(roundtrip_der_lax, roundtrip_der, len_der) != 0) << 14;
4356 ret |= (roundtrips_der != roundtrips_der_lax) << 15;
4358 ret |= (!parsed_der_lax) << 16;
4361 #ifdef ENABLE_OPENSSL_TESTS
4362 sig_openssl = ECDSA_SIG_new();
4364 parsed_openssl = (d2i_ECDSA_SIG(&sig_openssl, &sigptr, siglen) != NULL);
4365 if (parsed_openssl) {
4366 ECDSA_SIG_get0(sig_openssl, &
r, &s);
4367 valid_openssl = !BN_is_negative(
r) && !BN_is_negative(s) && BN_num_bits(
r) > 0 && BN_num_bits(
r) <= 256 && BN_num_bits(s) > 0 && BN_num_bits(s) <= 256;
4368 if (valid_openssl) {
4369 unsigned char tmp[32] = {0};
4370 BN_bn2bin(
r, tmp + 32 - BN_num_bytes(
r));
4371 valid_openssl = memcmp(tmp, max_scalar, 32) < 0;
4373 if (valid_openssl) {
4374 unsigned char tmp[32] = {0};
4375 BN_bn2bin(s, tmp + 32 - BN_num_bytes(s));
4376 valid_openssl = memcmp(tmp, max_scalar, 32) < 0;
4379 len_openssl = i2d_ECDSA_SIG(sig_openssl, NULL);
4380 if (len_openssl <= 2048) {
4381 unsigned char *ptr = roundtrip_openssl;
4382 CHECK(i2d_ECDSA_SIG(sig_openssl, &ptr) == len_openssl);
4383 roundtrips_openssl = valid_openssl && ((size_t)len_openssl == siglen) && (memcmp(roundtrip_openssl, sig, siglen) == 0);
4387 ECDSA_SIG_free(sig_openssl);
4389 ret |= (parsed_der && !parsed_openssl) << 4;
4390 ret |= (valid_der && !valid_openssl) << 5;
4391 ret |= (roundtrips_openssl && !parsed_der) << 6;
4392 ret |= (roundtrips_der != roundtrips_openssl) << 7;
4393 if (roundtrips_openssl) {
4394 ret |= (len_der != (size_t)len_openssl) << 8;
4395 ret |= (memcmp(roundtrip_der, roundtrip_openssl, len_der) != 0) << 9;
4401 static void assign_big_endian(
unsigned char *ptr,
size_t ptrlen, uint32_t val) {
4403 for (i = 0; i < ptrlen; i++) {
4404 int shift = ptrlen - 1 - i;
4408 ptr[i] = (val >> shift) & 0xFF;
4413 static void damage_array(
unsigned char *sig,
size_t *len) {
4415 int action = secp256k1_rand_bits(3);
4416 if (action < 1 && *len > 3) {
4418 pos = secp256k1_rand_int(*len);
4419 memmove(sig + pos, sig + pos + 1, *len - pos - 1);
4422 }
else if (action < 2 && *len < 2048) {
4424 pos = secp256k1_rand_int(1 + *len);
4425 memmove(sig + pos + 1, sig + pos, *len - pos);
4426 sig[pos] = secp256k1_rand_bits(8);
4429 }
else if (action < 4) {
4431 sig[secp256k1_rand_int(*len)] += 1 + secp256k1_rand_int(255);
4435 sig[secp256k1_rand_int(*len)] ^= 1 << secp256k1_rand_bits(3);
4440 static void random_ber_signature(
unsigned char *sig,
size_t *len,
int* certainly_der,
int* certainly_not_der) {
4442 int nlow[2], nlen[2], nlenlen[2], nhbit[2], nhbyte[2], nzlen[2];
4443 size_t tlen, elen, glen;
4448 der = secp256k1_rand_bits(2) == 0;
4449 *certainly_der = der;
4450 *certainly_not_der = 0;
4451 indet = der ? 0 : secp256k1_rand_int(10) == 0;
4453 for (n = 0; n < 2; n++) {
4455 nlow[n] = der ? 1 : (secp256k1_rand_bits(3) != 0);
4457 nlen[n] = nlow[n] ? secp256k1_rand_int(33) : 32 + secp256k1_rand_int(200) * secp256k1_rand_int(8) / 8;
4458 CHECK(nlen[n] <= 232);
4460 nhbit[n] = (nlow[n] == 0 && nlen[n] == 32) ? 1 : (nlen[n] == 0 ? 0 : secp256k1_rand_bits(1));
4462 nhbyte[n] = nlen[n] == 0 ? 0 : (nhbit[n] ? 128 + secp256k1_rand_bits(7) : 1 + secp256k1_rand_int(127));
4464 nzlen[n] = der ? ((nlen[n] == 0 || nhbit[n]) ? 1 : 0) : (nlow[n] ? secp256k1_rand_int(3) : secp256k1_rand_int(300 - nlen[n]) * secp256k1_rand_int(8) / 8);
4465 if (nzlen[n] > ((nlen[n] == 0 || nhbit[n]) ? 1 : 0)) {
4466 *certainly_not_der = 1;
4468 CHECK(nlen[n] + nzlen[n] <= 300);
4470 nlenlen[n] = nlen[n] + nzlen[n] < 128 ? 0 : (nlen[n] + nzlen[n] < 256 ? 1 : 2);
4473 int add = secp256k1_rand_int(127 - nlenlen[n]) * secp256k1_rand_int(16) * secp256k1_rand_int(16) / 256;
4476 *certainly_not_der = 1;
4479 CHECK(nlen[n] + nzlen[n] + nlenlen[n] <= 427);
4483 tlen = 2 + nlenlen[0] + nlen[0] + nzlen[0] + 2 + nlenlen[1] + nlen[1] + nzlen[1];
4487 elen = (der || indet) ? 0 : secp256k1_rand_int(980 - tlen) * secp256k1_rand_int(8) / 8;
4489 *certainly_not_der = 1;
4495 glen = der ? 0 : secp256k1_rand_int(990 - tlen) * secp256k1_rand_int(8) / 8;
4497 *certainly_not_der = 1;
4499 CHECK(tlen + glen <= 990);
4502 sig[(*len)++] = 0x30;
4505 sig[(*len)++] = 0x80;
4506 *certainly_not_der = 1;
4508 int tlenlen = tlen < 128 ? 0 : (tlen < 256 ? 1 : 2);
4510 int add = secp256k1_rand_int(127 - tlenlen) * secp256k1_rand_int(16) * secp256k1_rand_int(16) / 256;
4513 *certainly_not_der = 1;
4518 sig[(*len)++] = tlen;
4521 sig[(*len)++] = 128 + tlenlen;
4522 assign_big_endian(sig + *len, tlenlen, tlen);
4528 CHECK(tlen + glen <= 1119);
4530 for (n = 0; n < 2; n++) {
4532 sig[(*len)++] = 0x02;
4533 if (nlenlen[n] == 0) {
4535 sig[(*len)++] = nlen[n] + nzlen[n];
4538 sig[(*len)++] = 128 + nlenlen[n];
4539 assign_big_endian(sig + *len, nlenlen[n], nlen[n] + nzlen[n]);
4543 while (nzlen[n] > 0) {
4544 sig[(*len)++] = 0x00;
4547 if (nlen[n] == 32 && !nlow[n]) {
4550 for (i = 0; i < 16; i++) {
4551 sig[(*len)++] = 0xFF;
4557 sig[(*len)++] = nhbyte[n];
4561 secp256k1_rand_bytes_test(sig + *len, nlen[n]);
4567 secp256k1_rand_bytes_test(sig + *len, elen);
4576 CHECK(tlen + glen <= 1121);
4579 secp256k1_rand_bytes_test(sig + *len, glen);
4582 CHECK(tlen <= 1121);
4583 CHECK(tlen == *len);
4588 for (i = 0; i < 200 * count; i++) {
4589 unsigned char buffer[2048];
4591 int certainly_der = 0;
4592 int certainly_not_der = 0;
4593 random_ber_signature(buffer, &buflen, &certainly_der, &certainly_not_der);
4594 CHECK(buflen <= 2048);
4595 for (j = 0; j < 16; j++) {
4598 damage_array(buffer, &buflen);
4601 certainly_not_der = 0;
4606 fprintf(stderr,
"Failure %x on ", ret);
4607 for (k = 0; k < buflen; k++) {
4608 fprintf(stderr,
"%02x ", buffer[k]);
4610 fprintf(stderr,
"\n");
4628 secp256k1_scalar_set_int(&ss, 1);
4629 secp256k1_scalar_negate(&ss, &ss);
4630 secp256k1_scalar_inverse(&ss, &ss);
4631 secp256k1_scalar_set_int(&sr, 1);
4633 secp256k1_ge_set_gej(&
key, &keyj);
4640 const unsigned char pubkey_mods_zero[33] = {
4641 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
4642 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
4643 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0,
4644 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41,
4650 secp256k1_scalar_set_int(&ss, 1);
4651 secp256k1_scalar_set_int(&msg, 0);
4652 secp256k1_scalar_set_int(&sr, 0);
4653 CHECK(secp256k1_eckey_pubkey_parse(&
key, pubkey_mods_zero, 33));
4659 const unsigned char pubkey[33] = {
4660 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4661 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4662 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4663 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4669 secp256k1_scalar_set_int(&ss, 0);
4670 secp256k1_scalar_set_int(&msg, 0);
4671 secp256k1_scalar_set_int(&sr, 1);
4672 CHECK(secp256k1_eckey_pubkey_parse(&
key, pubkey, 33));
4678 const unsigned char pubkey[33] = {
4679 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4680 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4681 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4682 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4685 const unsigned char pubkey2[33] = {
4686 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
4687 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
4688 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0,
4689 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41,
4696 secp256k1_scalar_set_int(&ss, 2);
4697 secp256k1_scalar_set_int(&msg, 0);
4698 secp256k1_scalar_set_int(&sr, 2);
4699 CHECK(secp256k1_eckey_pubkey_parse(&
key, pubkey, 33));
4700 CHECK(secp256k1_eckey_pubkey_parse(&key2, pubkey2, 33));
4702 CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key2, &msg) == 1);
4703 secp256k1_scalar_negate(&ss, &ss);
4705 CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key2, &msg) == 1);
4706 secp256k1_scalar_set_int(&ss, 1);
4708 CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key2, &msg) == 0);
4713 const unsigned char pubkey[33] = {
4714 0x02, 0x14, 0x4e, 0x5a, 0x58, 0xef, 0x5b, 0x22,
4715 0x6f, 0xd2, 0xe2, 0x07, 0x6a, 0x77, 0xcf, 0x05,
4716 0xb4, 0x1d, 0xe7, 0x4a, 0x30, 0x98, 0x27, 0x8c,
4717 0x93, 0xe6, 0xe6, 0x3c, 0x0b, 0xc4, 0x73, 0x76,
4720 const unsigned char pubkey2[33] = {
4721 0x02, 0x8a, 0xd5, 0x37, 0xed, 0x73, 0xd9, 0x40,
4722 0x1d, 0xa0, 0x33, 0xd2, 0xdc, 0xf0, 0xaf, 0xae,
4723 0x34, 0xcf, 0x5f, 0x96, 0x4c, 0x73, 0x28, 0x0f,
4724 0x92, 0xc0, 0xf6, 0x9d, 0xd9, 0xb2, 0x09, 0x10,
4727 const unsigned char csr[32] = {
4728 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4729 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
4730 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4,
4731 0x40, 0x2d, 0xa1, 0x72, 0x2f, 0xc9, 0xba, 0xeb
4737 secp256k1_scalar_set_int(&ss, 1);
4738 secp256k1_scalar_set_int(&msg, 1);
4739 secp256k1_scalar_set_b32(&sr, csr, NULL);
4740 CHECK(secp256k1_eckey_pubkey_parse(&
key, pubkey, 33));
4741 CHECK(secp256k1_eckey_pubkey_parse(&key2, pubkey2, 33));
4743 CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key2, &msg) == 1);
4744 secp256k1_scalar_negate(&ss, &ss);
4746 CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key2, &msg) == 1);
4747 secp256k1_scalar_set_int(&ss, 2);
4748 secp256k1_scalar_inverse_var(&ss, &ss);
4750 CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key2, &msg) == 0);
4755 const unsigned char pubkey[33] = {
4756 0x03, 0xaf, 0x97, 0xff, 0x7d, 0x3a, 0xf6, 0xa0,
4757 0x02, 0x94, 0xbd, 0x9f, 0x4b, 0x2e, 0xd7, 0x52,
4758 0x28, 0xdb, 0x49, 0x2a, 0x65, 0xcb, 0x1e, 0x27,
4759 0x57, 0x9c, 0xba, 0x74, 0x20, 0xd5, 0x1d, 0x20,
4762 const unsigned char csr[32] = {
4763 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4764 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
4765 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4,
4766 0x40, 0x2d, 0xa1, 0x72, 0x2f, 0xc9, 0xba, 0xee
4771 secp256k1_scalar_set_int(&ss, 1);
4772 secp256k1_scalar_set_int(&msg, 1);
4773 secp256k1_scalar_negate(&msg, &msg);
4774 secp256k1_scalar_set_b32(&sr, csr, NULL);
4775 CHECK(secp256k1_eckey_pubkey_parse(&
key, pubkey, 33));
4777 secp256k1_scalar_negate(&ss, &ss);
4779 secp256k1_scalar_set_int(&ss, 3);
4780 secp256k1_scalar_inverse_var(&ss, &ss);
4789 unsigned char signature[72];
4790 static const unsigned char nonce[32] = {
4791 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4792 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4793 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4794 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
4796 static const unsigned char nonce2[32] = {
4797 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
4798 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
4799 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,
4800 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x40
4802 const unsigned char key[32] = {
4803 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4804 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4805 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4806 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
4808 unsigned char msg[32] = {
4809 0x86, 0x41, 0x99, 0x81, 0x06, 0x23, 0x44, 0x53,
4810 0xaa, 0x5f, 0x9d, 0x6a, 0x31, 0x78, 0xf4, 0xf7,
4811 0xb8, 0x12, 0xe0, 0x0b, 0x81, 0x7a, 0x77, 0x62,
4812 0x65, 0xdf, 0xdd, 0x31, 0xb9, 0x3e, 0x29, 0xa9,
4846 CHECK(ecount == 10);
4848 CHECK(ecount == 11);
4850 CHECK(ecount == 11);
4852 CHECK(ecount == 12);
4854 CHECK(ecount == 13);
4856 CHECK(ecount == 13);
4860 CHECK(ecount == 13);
4876 memset(signature, 255, 64);
4883 for (t = 0; t < 2; t++) {
4884 static const unsigned char zero[32] = {0x00};
4886 unsigned char key[32];
4887 unsigned char msg[32];
4890 const unsigned char *extra;
4891 extra = t == 0 ? NULL : zero;
4895 memset(
key, 0xFF, 32);
4911 CHECK(memcmp(&sig, &sig2,
sizeof(sig)) == 0);
4915 CHECK(memcmp(&sig, &sig2,
sizeof(sig)) == 0);
4917 for(i = 0; i < 256; i++) {
4922 secp256k1_ecdsa_sign2ature2_load(ctx, &sr[i], &ss, &sig2);
4923 for (j = 0; j < i; j++) {
4924 CHECK(!secp256k1_scalar_eq(&sr[i], &sr[j]));
4930 for(i = 256; i < 512; i++) {
4935 secp256k1_ecdsa_sign2ature2_load(ctx, &sr[i], &ss, &sig2);
4936 for (j = 0; j < i; j++) {
4937 CHECK(!secp256k1_scalar_eq(&sr[i], &sr[j]));
4945 const unsigned char zeros[32] = {0};
4946 unsigned char nonce[32];
4947 unsigned char nonce2[32];
4948 unsigned char nonce3[32];
4949 unsigned char nonce4[32];
4954 CHECK(nonce_function_rfc6979(nonce, zeros, zeros, NULL, NULL, 0) == 1);
4956 CHECK(nonce_function_rfc6979(nonce2, zeros, zeros, zeros, NULL, 0) == 1);
4958 CHECK(nonce_function_rfc6979(nonce3, zeros, zeros, NULL, (
void *)zeros, 0) == 1);
4960 CHECK(nonce_function_rfc6979(nonce4, zeros, zeros, zeros, (
void *)zeros, 0) == 1);
4962 CHECK(memcmp(nonce, nonce2, 32) != 0);
4963 CHECK(memcmp(nonce, nonce3, 32) != 0);
4964 CHECK(memcmp(nonce, nonce4, 32) != 0);
4965 CHECK(memcmp(nonce2, nonce3, 32) != 0);
4966 CHECK(memcmp(nonce2, nonce4, 32) != 0);
4967 CHECK(memcmp(nonce3, nonce4, 32) != 0);
4973 unsigned char privkey[300];
4974 unsigned char seckey[32] = {
4975 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
4976 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
4977 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
4978 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41,
4980 size_t outlen = 300;
4991 #ifdef ENABLE_OPENSSL_TESTS
4992 EC_KEY *get_openssl_key(
const unsigned char *key32) {
4993 unsigned char privkey[300];
4995 const unsigned char* pbegin = privkey;
4996 int compr = secp256k1_rand_bits(1);
4997 EC_KEY *ec_key = EC_KEY_new_by_curve_name(NID_secp256k1);
4999 CHECK(d2i_ECPrivateKey(&ec_key, &pbegin, privkeylen));
5000 CHECK(EC_KEY_check_key(ec_key));
5004 void test_ecdsa_openssl(
void) {
5012 unsigned int sigsize = 80;
5013 size_t secp_sigsize = 80;
5014 unsigned char message[32];
5015 unsigned char signature[80];
5016 unsigned char key32[32];
5017 secp256k1_rand256_test(message);
5018 secp256k1_scalar_set_b32(&msg, message, NULL);
5020 secp256k1_scalar_get_b32(key32, &
key);
5022 secp256k1_ge_set_gej(&q, &qj);
5023 ec_key = get_openssl_key(key32);
5024 CHECK(ec_key != NULL);
5025 CHECK(ECDSA_sign(0, message,
sizeof(message), signature, &sigsize, ec_key));
5026 CHECK(secp256k1_ecdsa_sig_parse(&sigr, &sigs, signature, sigsize));
5027 CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sigr, &sigs, &q, &msg));
5028 secp256k1_scalar_set_int(&one, 1);
5029 secp256k1_scalar_add(&msg2, &msg, &one);
5030 CHECK(!secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sigr, &sigs, &q, &msg2));
5033 CHECK(secp256k1_ecdsa_sig_serialize(signature, &secp_sigsize, &sigr, &sigs));
5034 CHECK(ECDSA_verify(0, message,
sizeof(message), signature, secp_sigsize, ec_key) == 1);
5036 EC_KEY_free(ec_key);
5039 void run_ecdsa_openssl(
void) {
5041 for (i = 0; i < 10*count; i++) {
5042 test_ecdsa_openssl();
5047 #define ENABLE_MODULE_BULLETPROOF 1
5049 #ifdef ENABLE_MODULE_ECDH
5053 #ifdef ENABLE_MODULE_RECOVERY
5057 #ifdef ENABLE_MODULE_GENERATOR
5061 #ifdef ENABLE_MODULE_COMMITMENT
5065 #ifdef ENABLE_MODULE_RANGEPROOF
5069 #ifdef ENABLE_MODULE_BULLETPROOF
5073 #ifdef ENABLE_MODULE_WHITELIST
5077 #ifdef ENABLE_MODULE_SURJECTIONPROOF
5082 unsigned char seed16[16] = {0};
5083 unsigned char run32[32] = {0};
5086 count = strtol(argv[1], NULL, 0);
5092 const char* ch = argv[2];
5093 while (pos < 16 && ch[0] != 0 && ch[1] != 0) {
5095 if (sscanf(ch,
"%2hx", &sh)) {
5104 FILE *frand =
fopen(
"/dev/urandom",
"r");
5105 if ((frand == NULL) || fread(&seed16,
sizeof(seed16), 1, frand) !=
sizeof(seed16)) {
5106 uint64_t t = time(NULL) * (uint64_t)1337;
5108 seed16[1] ^= t >> 8;
5109 seed16[2] ^= t >> 16;
5110 seed16[3] ^= t >> 24;
5111 seed16[4] ^= t >> 32;
5112 seed16[5] ^= t >> 40;
5113 seed16[6] ^= t >> 48;
5114 seed16[7] ^= t >> 56;
5120 secp256k1_rand_seed(seed16);
5122 printf(
"test count = %i\n", count);
5123 printf(
"random seed = %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", seed16[0], seed16[1], seed16[2], seed16[3], seed16[4], seed16[5], seed16[6], seed16[7], seed16[8], seed16[9], seed16[10], seed16[11], seed16[12], seed16[13], seed16[14], seed16[15]);
5129 if (secp256k1_rand_bits(1)) {
5130 secp256k1_rand256(run32);
5142 #ifndef USE_NUM_NONE
5174 #ifdef USE_ENDOMORPHISM
5175 run_endomorphism_tests();
5184 #ifdef ENABLE_MODULE_ECDH
5195 #ifdef ENABLE_OPENSSL_TESTS
5196 run_ecdsa_openssl();
5199 #ifdef ENABLE_MODULE_RECOVERY
5204 #ifdef ENABLE_MODULE_GENERATOR
5208 #ifdef ENABLE_MODULE_RANGEPROOF
5212 #ifdef ENABLE_MODULE_BULLETPROOF
5213 printf(
"Running bulletproofs");
5217 #ifdef ENABLE_MODULE_WHITELIST
5222 #ifdef ENABLE_MODULE_SURJECTIONPROOF
5226 secp256k1_rand256(run32);
5227 printf(
"random run = %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", run32[0], run32[1], run32[2], run32[3], run32[4], run32[5], run32[6], run32[7], run32[8], run32[9], run32[10], run32[11], run32[12], run32[13], run32[14], run32[15]);
5232 printf(
"no problems found\n");