7 #if defined HAVE_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)) {
144 unsigned char ctmp[32];
157 memset(&zero_pubkey, 0,
sizeof(zero_pubkey));
186 secp256k1_ge_set_gej(&pub, &pubj);
200 CHECK(ecount2 == 10);
202 CHECK(ecount2 == 11);
206 CHECK(ecount2 == 12);
210 CHECK(ecount2 == 13);
216 CHECK(ecount2 == 14);
224 CHECK(ecount2 == 14);
230 secp256k1_ecmult_context_build(&vrfy->
ecmult_ctx, NULL);
235 }
while(!secp256k1_ecdsa_sig_sign(&both->
ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &
nonce, NULL));
242 CHECK(secp256k1_ecdsa_sig_verify(&vrfy->
ecmult_ctx, &sigr, &sigs, &pub, &msg));
243 CHECK(secp256k1_ecdsa_sig_verify(&both->
ecmult_ctx, &sigr, &sigs, &pub, &msg));
263 CHECK(scratch != NULL);
267 CHECK(secp256k1_scratch_max_allocation(scratch, 0) == 1000);
268 CHECK(secp256k1_scratch_max_allocation(scratch, 1) < 1000);
271 CHECK(secp256k1_scratch_alloc(scratch, 500) == NULL);
272 CHECK(secp256k1_scratch_max_allocation(scratch, 0) == 1000);
275 CHECK(secp256k1_scratch_allocate_frame(scratch, 500, 1 == 1));
276 CHECK(secp256k1_scratch_max_allocation(scratch, 1) < 500);
277 CHECK(secp256k1_scratch_alloc(scratch, 500) != NULL);
278 CHECK(secp256k1_scratch_alloc(scratch, 500) == NULL);
280 CHECK(secp256k1_scratch_allocate_frame(scratch, 500, 1) == 0);
283 secp256k1_scratch_deallocate_frame(scratch);
284 CHECK(secp256k1_scratch_max_allocation(scratch, 0) == 1000);
285 CHECK(secp256k1_scratch_alloc(scratch, 500) == NULL);
295 static const char *inputs[8] = {
296 "",
"abc",
"message digest",
"secure hash algorithm",
"SHA256 is considered to be safe",
297 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
298 "For this sample, this 63-byte string will be used as input data",
299 "This is exactly 64 bytes long, not counting the terminating byte"
301 static const unsigned char outputs[8][32] = {
302 {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},
303 {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},
304 {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},
305 {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},
306 {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},
307 {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},
308 {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},
309 {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}
312 for (i = 0; i < 8; i++) {
313 unsigned char out[32];
315 secp256k1_sha256_initialize(&hasher);
316 secp256k1_sha256_write(&hasher, (
const unsigned char*)(inputs[i]), strlen(inputs[i]));
317 secp256k1_sha256_finalize(&hasher, out);
318 CHECK(memcmp(out, outputs[i], 32) == 0);
319 if (strlen(inputs[i]) > 0) {
320 int split = secp256k1_rand_int(strlen(inputs[i]));
321 secp256k1_sha256_initialize(&hasher);
322 secp256k1_sha256_write(&hasher, (
const unsigned char*)(inputs[i]), split);
323 secp256k1_sha256_write(&hasher, (
const unsigned char*)(inputs[i] + split), strlen(inputs[i]) - split);
324 secp256k1_sha256_finalize(&hasher, out);
325 CHECK(memcmp(out, outputs[i], 32) == 0);
331 static const char *keys[6] = {
332 "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
334 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
335 "\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",
336 "\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",
337 "\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"
339 static const char *inputs[6] = {
340 "\x48\x69\x20\x54\x68\x65\x72\x65",
341 "\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",
342 "\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",
343 "\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",
344 "\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",
345 "\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"
347 static const unsigned char outputs[6][32] = {
348 {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},
349 {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},
350 {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},
351 {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},
352 {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},
353 {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}
356 for (i = 0; i < 6; i++) {
358 unsigned char out[32];
359 secp256k1_hmac_sha256_initialize(&hasher, (
const unsigned char*)(keys[i]), strlen(keys[i]));
360 secp256k1_hmac_sha256_write(&hasher, (
const unsigned char*)(inputs[i]), strlen(inputs[i]));
361 secp256k1_hmac_sha256_finalize(&hasher, out);
362 CHECK(memcmp(out, outputs[i], 32) == 0);
363 if (strlen(inputs[i]) > 0) {
364 int split = secp256k1_rand_int(strlen(inputs[i]));
365 secp256k1_hmac_sha256_initialize(&hasher, (
const unsigned char*)(keys[i]), strlen(keys[i]));
366 secp256k1_hmac_sha256_write(&hasher, (
const unsigned char*)(inputs[i]), split);
367 secp256k1_hmac_sha256_write(&hasher, (
const unsigned char*)(inputs[i] + split), strlen(inputs[i]) - split);
368 secp256k1_hmac_sha256_finalize(&hasher, out);
369 CHECK(memcmp(out, outputs[i], 32) == 0);
375 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};
376 static const unsigned char out1[3][32] = {
377 {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},
378 {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},
379 {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}
382 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};
383 static const unsigned char out2[3][32] = {
384 {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},
385 {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},
386 {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}
390 unsigned char out[32];
393 secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 64);
394 for (i = 0; i < 3; i++) {
395 secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32);
396 CHECK(memcmp(out, out1[i], 32) == 0);
398 secp256k1_rfc6979_hmac_sha256_finalize(&rng);
400 secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 65);
401 for (i = 0; i < 3; i++) {
402 secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32);
403 CHECK(memcmp(out, out1[i], 32) != 0);
405 secp256k1_rfc6979_hmac_sha256_finalize(&rng);
407 secp256k1_rfc6979_hmac_sha256_initialize(&rng, key2, 64);
408 for (i = 0; i < 3; i++) {
409 secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32);
410 CHECK(memcmp(out, out2[i], 32) == 0);
412 secp256k1_rfc6979_hmac_sha256_finalize(&rng);
420 static const unsigned int rounds[7] = {1, 30, 73, 156, 322, 653, 1316};
423 static const uint32_t mults[6] = {1, 3, 21, 289, 0x9999, 0x80402011};
425 unsigned int usebits = bits > 6 ? 6 : bits;
426 unsigned int maxshift = bits - usebits;
429 uint64_t x[6][27] = {{0}};
430 unsigned int i, shift, m;
433 for (i = 0; i < rounds[usebits]; i++) {
434 uint32_t r = (rand32 ? secp256k1_rand32() : secp256k1_rand_bits(bits));
435 CHECK((((uint64_t)r) >> bits) == 0);
436 for (m = 0; m <
sizeof(mults) /
sizeof(mults[0]); m++) {
437 uint32_t rm = r * mults[m];
438 for (shift = 0; shift <= maxshift; shift++) {
439 x[m][shift] |= (((uint64_t)1) << ((rm >> shift) & ((1 << usebits) - 1)));
443 for (m = 0; m <
sizeof(mults) /
sizeof(mults[0]); m++) {
444 for (shift = 0; shift <= maxshift; shift++) {
446 CHECK(((~x[m][shift]) << (64 - (1 << usebits))) == 0);
454 int rounds = (subrange * 2073) / 100;
457 CHECK((range % subrange) == 0);
458 for (i = 0; i < rounds; i++) {
459 uint32_t r = secp256k1_rand_int(range);
462 x |= (((uint64_t)1) << r);
465 CHECK(((~x) << (64 - subrange)) == 0);
471 for (b = 1; b <= 32; b++) {
477 static const uint32_t ms[] = {1, 3, 17, 1000, 13771, 999999, 33554432};
478 static const uint32_t ss[] = {1, 3, 6, 9, 13, 31, 64};
480 for (m = 0; m <
sizeof(ms) /
sizeof(ms[0]); m++) {
481 for (s = 0; s <
sizeof(ss) /
sizeof(ss[0]); s++) {
491 if (secp256k1_rand_bits(1)) {
492 secp256k1_num_negate(num);
499 secp256k1_scalar_get_num(num, &sc);
505 secp256k1_scalar_get_num(num, &sc);
513 secp256k1_num_copy(&n2, &n1);
514 secp256k1_num_sub(&n1, &n2, &n1);
515 CHECK(secp256k1_num_is_zero(&n1));
516 secp256k1_num_copy(&n1, &n2);
517 secp256k1_num_negate(&n1);
518 CHECK(!secp256k1_num_is_zero(&n1));
519 secp256k1_num_add(&n1, &n2, &n1);
520 CHECK(secp256k1_num_is_zero(&n1));
521 secp256k1_num_copy(&n1, &n2);
522 secp256k1_num_negate(&n1);
523 CHECK(secp256k1_num_is_neg(&n1) != secp256k1_num_is_neg(&n2));
524 secp256k1_num_negate(&n1);
525 CHECK(secp256k1_num_eq(&n1, &n2));
535 if (secp256k1_rand_bits(1)) {
539 if (secp256k1_rand_bits(1)) {
542 secp256k1_num_add(&n1p2, &n1, &n2);
543 secp256k1_num_add(&n2p1, &n2, &n1);
544 secp256k1_num_sub(&n1m2, &n1, &n2);
545 secp256k1_num_sub(&n2m1, &n2, &n1);
546 CHECK(secp256k1_num_eq(&n1p2, &n2p1));
547 CHECK(!secp256k1_num_eq(&n1p2, &n1m2));
548 secp256k1_num_negate(&n2m1);
549 CHECK(secp256k1_num_eq(&n2m1, &n1m2));
550 CHECK(!secp256k1_num_eq(&n2m1, &n1));
551 secp256k1_num_add(&n2m1, &n2m1, &n2);
552 CHECK(secp256k1_num_eq(&n2m1, &n1));
553 CHECK(!secp256k1_num_eq(&n2p1, &n1));
554 secp256k1_num_sub(&n2p1, &n2p1, &n2);
555 CHECK(secp256k1_num_eq(&n2p1, &n1));
558 secp256k1_scalar_set_int(&s, 1);
559 secp256k1_scalar_get_num(&n1, &s);
560 CHECK(secp256k1_num_is_one(&n1));
562 secp256k1_scalar_get_num(&n2, &s);
563 for (i = 0; i < 250; ++i) {
564 secp256k1_num_add(&n1, &n1, &n1);
565 secp256k1_num_add(&n1p2, &n1, &n2);
566 CHECK(!secp256k1_num_is_one(&n1p2));
577 secp256k1_scalar_get_num(&order, &s);
578 secp256k1_scalar_set_int(&s, 0);
579 secp256k1_scalar_get_num(&n, &s);
580 secp256k1_num_mod(&n, &order);
581 CHECK(secp256k1_num_is_zero(&n));
584 secp256k1_scalar_set_int(&s, 1);
585 secp256k1_scalar_get_num(&order, &s);
586 secp256k1_scalar_get_num(&n, &s);
587 secp256k1_num_mod(&n, &order);
588 CHECK(secp256k1_num_is_zero(&n));
592 secp256k1_scalar_get_num(&n, &s);
594 for (i = 0; i < 8; ++i) {
595 secp256k1_num_add(&n, &n, &n);
597 secp256k1_num_mod(&n, &order);
598 CHECK(secp256k1_num_is_zero(&n));
608 const int jacobi5[10] = { 0, 1, -1, -1, 1, 0, 1, -1, -1, 1 };
611 secp256k1_scalar_set_int(&five, 5);
612 secp256k1_scalar_get_num(&order, &five);
613 for (i = 0; i < 10; ++i) {
614 secp256k1_scalar_set_int(&small, i);
615 secp256k1_scalar_get_num(&n, &small);
616 CHECK(secp256k1_num_jacobi(&n, &order) == jacobi5[i]);
620 secp256k1_scalar_get_num(&order, &five);
625 secp256k1_scalar_get_num(&fiven, &five);
626 secp256k1_scalar_get_num(&n, &sqr);
627 secp256k1_num_mod(&n, &fiven);
628 }
while (secp256k1_num_is_zero(&n));
631 if (secp256k1_num_jacobi(&n, &order) == -1) {
632 secp256k1_num_add(&n, &n, &n);
636 CHECK(secp256k1_num_jacobi(&n, &order) == 1);
638 secp256k1_num_add(&n, &n, &n);
639 CHECK(secp256k1_num_jacobi(&n, &order) == -1);
642 secp256k1_scalar_order_get_num(&order);
644 secp256k1_scalar_sqr(&sqr, &sqr);
646 secp256k1_scalar_get_num(&n, &sqr);
647 CHECK(secp256k1_num_jacobi(&n, &order) == 1);
649 secp256k1_scalar_mul(&sqr, &sqr, &five);
650 secp256k1_scalar_get_num(&n, &sqr);
651 CHECK(secp256k1_num_jacobi(&n, &order) == -1);
653 CHECK(secp256k1_num_jacobi(&order, &order) == 0);
656 secp256k1_scalar_set_int(&small, 1);
657 secp256k1_scalar_get_num(&n, &small);
658 secp256k1_num_sub(&n, &order, &n);
659 CHECK(secp256k1_num_jacobi(&n, &order) == 1);
664 for (i = 0; i < 100*count; i++) {
693 secp256k1_scalar_get_b32(c, &s2);
696 secp256k1_scalar_get_num(&snum, &s);
697 secp256k1_scalar_get_num(&s1num, &s1);
698 secp256k1_scalar_get_num(&s2num, &s2);
700 secp256k1_scalar_order_get_num(&order);
702 secp256k1_num_shift(&half_order, 1);
709 secp256k1_scalar_set_int(&n, 0);
710 for (i = 0; i < 256; i += 4) {
713 secp256k1_scalar_set_int(&t, secp256k1_scalar_get_bits(&s, 256 - 4 - i, 4));
714 for (j = 0; j < 4; j++) {
715 secp256k1_scalar_add(&n, &n, &n);
717 secp256k1_scalar_add(&n, &n, &t);
719 CHECK(secp256k1_scalar_eq(&n, &s));
726 secp256k1_scalar_set_int(&n, 0);
730 int now = secp256k1_rand_int(15) + 1;
734 secp256k1_scalar_set_int(&t, secp256k1_scalar_get_bits_var(&s, 256 - now - i, now));
735 for (j = 0; j < now; j++) {
736 secp256k1_scalar_add(&n, &n, &n);
738 secp256k1_scalar_add(&n, &n, &t);
741 CHECK(secp256k1_scalar_eq(&n, &s));
750 secp256k1_num_add(&rnum, &snum, &s2num);
751 secp256k1_num_mod(&rnum, &order);
752 secp256k1_scalar_add(&r, &s, &s2);
753 secp256k1_scalar_get_num(&r2num, &r);
754 CHECK(secp256k1_num_eq(&rnum, &r2num));
762 secp256k1_num_mul(&rnum, &snum, &s2num);
763 secp256k1_num_mod(&rnum, &order);
764 secp256k1_scalar_mul(&r, &s, &s2);
765 secp256k1_scalar_get_num(&r2num, &r);
766 CHECK(secp256k1_num_eq(&rnum, &r2num));
768 CHECK(secp256k1_scalar_is_zero(&r) == (secp256k1_scalar_is_zero(&s) || secp256k1_scalar_is_zero(&s2)));
770 CHECK(secp256k1_num_eq(&rnum, &snum) == (secp256k1_scalar_is_zero(&s) || secp256k1_scalar_is_one(&s2)));
771 CHECK(secp256k1_num_eq(&rnum, &s2num) == (secp256k1_scalar_is_zero(&s2) || secp256k1_scalar_is_one(&s)));
779 CHECK(secp256k1_num_is_zero(&snum) == secp256k1_scalar_is_zero(&s));
781 CHECK(secp256k1_scalar_is_high(&s) == (secp256k1_num_cmp(&snum, &half_order) > 0));
782 secp256k1_scalar_negate(&neg, &s);
783 secp256k1_num_sub(&negnum, &order, &snum);
784 secp256k1_num_mod(&negnum, &order);
786 CHECK(secp256k1_scalar_is_high(&neg) == (secp256k1_num_cmp(&negnum, &half_order) > 0));
788 CHECK((secp256k1_scalar_is_high(&s) == secp256k1_scalar_is_high(&neg)) == secp256k1_scalar_is_zero(&s));
789 secp256k1_scalar_get_num(&negnum2, &neg);
791 CHECK(secp256k1_num_eq(&negnum, &negnum2));
792 secp256k1_scalar_add(&neg, &neg, &s);
794 CHECK(secp256k1_scalar_is_zero(&neg));
795 secp256k1_scalar_negate(&neg, &neg);
797 CHECK(secp256k1_scalar_is_zero(&neg));
806 unsigned char cone[1] = {0x01};
807 unsigned int shift = 256 + secp256k1_rand_int(257);
808 secp256k1_scalar_mul_shift_var(&r, &s1, &s2, shift);
809 secp256k1_num_mul(&rnum, &s1num, &s2num);
810 secp256k1_num_shift(&rnum, shift - 1);
811 secp256k1_num_set_bin(&one, cone, 1);
812 secp256k1_num_add(&rnum, &rnum, &one);
813 secp256k1_num_shift(&rnum, 1);
814 secp256k1_scalar_get_num(&rnum2, &r);
815 CHECK(secp256k1_num_eq(&rnum, &rnum2));
823 for (i = 0; i < 100; ++i) {
825 int shift = 1 + secp256k1_rand_int(15);
826 int expected = r.
d[0] % (1 << shift);
827 low = secp256k1_scalar_shr_int(&r, shift);
835 if (!secp256k1_scalar_is_zero(&s)) {
841 secp256k1_scalar_inverse(&inv, &s);
843 secp256k1_num_mod_inverse(&invnum, &snum, &order);
844 secp256k1_scalar_get_num(&invnum2, &inv);
845 CHECK(secp256k1_num_eq(&invnum, &invnum2));
847 secp256k1_scalar_mul(&inv, &inv, &s);
849 CHECK(secp256k1_scalar_is_one(&inv));
850 secp256k1_scalar_inverse(&inv, &inv);
852 CHECK(secp256k1_scalar_is_one(&inv));
854 secp256k1_scalar_get_num(&invnum, &inv);
855 CHECK(secp256k1_num_is_one(&invnum));
863 secp256k1_scalar_add(&r1, &s1, &s2);
864 secp256k1_scalar_add(&r2, &s2, &s1);
865 CHECK(secp256k1_scalar_eq(&r1, &r2));
873 int bit = secp256k1_rand_bits(8);
874 secp256k1_scalar_set_int(&b, 1);
875 CHECK(secp256k1_scalar_is_one(&b));
876 for (i = 0; i < bit; i++) {
877 secp256k1_scalar_add(&b, &b, &b);
881 if (!secp256k1_scalar_add(&r1, &r1, &b)) {
883 secp256k1_scalar_cadd_bit(&r2, bit, 1);
884 CHECK(secp256k1_scalar_eq(&r1, &r2));
886 secp256k1_scalar_cadd_bit(&r2, bit, 0);
887 CHECK(secp256k1_scalar_eq(&r1, &r2));
894 secp256k1_scalar_mul(&r1, &s1, &s2);
895 secp256k1_scalar_mul(&r2, &s2, &s1);
896 CHECK(secp256k1_scalar_eq(&r1, &r2));
902 secp256k1_scalar_add(&r1, &s1, &s2);
903 secp256k1_scalar_add(&r1, &r1, &s);
904 secp256k1_scalar_add(&r2, &s2, &s);
905 secp256k1_scalar_add(&r2, &s1, &r2);
906 CHECK(secp256k1_scalar_eq(&r1, &r2));
912 secp256k1_scalar_mul(&r1, &s1, &s2);
913 secp256k1_scalar_mul(&r1, &r1, &s);
914 secp256k1_scalar_mul(&r2, &s2, &s);
915 secp256k1_scalar_mul(&r2, &s1, &r2);
916 CHECK(secp256k1_scalar_eq(&r1, &r2));
922 secp256k1_scalar_add(&r1, &s1, &s2);
923 secp256k1_scalar_mul(&r1, &r1, &s);
924 secp256k1_scalar_mul(&r2, &s1, &s);
925 secp256k1_scalar_mul(&t, &s2, &s);
926 secp256k1_scalar_add(&r2, &r2, &t);
927 CHECK(secp256k1_scalar_eq(&r1, &r2));
933 secp256k1_scalar_sqr(&r1, &s1);
934 secp256k1_scalar_mul(&r2, &s1, &s1);
935 CHECK(secp256k1_scalar_eq(&r1, &r2));
941 secp256k1_scalar_set_int(&v1,1);
942 secp256k1_scalar_mul(&r1, &s1, &v1);
943 CHECK(secp256k1_scalar_eq(&r1, &s1));
949 secp256k1_scalar_set_int(&v0,0);
950 secp256k1_scalar_add(&r1, &s1, &v0);
951 CHECK(secp256k1_scalar_eq(&r1, &s1));
957 secp256k1_scalar_set_int(&v0,0);
958 secp256k1_scalar_mul(&r1, &s1, &v0);
959 CHECK(secp256k1_scalar_eq(&r1, &v0));
966 for (i = 0; i < 128 * count; i++) {
973 secp256k1_scalar_set_int(&s, 1);
974 CHECK(secp256k1_scalar_is_one(&s));
975 secp256k1_scalar_negate(&o, &s);
976 secp256k1_scalar_add(&o, &o, &s);
977 CHECK(secp256k1_scalar_is_zero(&o));
978 secp256k1_scalar_negate(&o, &o);
979 CHECK(secp256k1_scalar_is_zero(&o));
987 unsigned char bin[32];
989 secp256k1_scalar_order_get_num(&order);
990 secp256k1_num_get_bin(bin, 32, &order);
991 secp256k1_scalar_set_b32(&zero, bin, &overflow);
992 CHECK(overflow == 1);
993 CHECK(secp256k1_scalar_is_zero(&zero));
1000 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
1001 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL
1003 CHECK(secp256k1_scalar_check_overflow(&overflowed));
1019 #if defined(USE_SCALAR_INV_NUM)
1023 unsigned char chal[33][2][32] = {
1024 {{0xff, 0xff, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00,
1025 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03,
1026 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff,
1027 0xff, 0xff, 0x03, 0x00, 0xc0, 0xff, 0xff, 0xff},
1028 {0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00,
1029 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8,
1030 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1031 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff}},
1032 {{0xef, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
1033 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00,
1034 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1035 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
1036 {0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
1037 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0,
1038 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff,
1039 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x80, 0xff}},
1040 {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
1041 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
1042 0x80, 0x00, 0x00, 0x80, 0xff, 0x3f, 0x00, 0x00,
1043 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x00},
1044 {0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x80,
1045 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xe0,
1046 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00,
1047 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff}},
1048 {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
1049 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
1050 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1051 0x00, 0x1e, 0xf8, 0xff, 0xff, 0xff, 0xfd, 0xff},
1052 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f,
1053 0x00, 0x00, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xe0,
1054 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff,
1055 0xf3, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}},
1056 {{0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00,
1057 0x00, 0x1c, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1058 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0x00,
1059 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff},
1060 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00,
1061 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1062 0xff, 0x1f, 0x00, 0x00, 0x80, 0xff, 0xff, 0x3f,
1063 0x00, 0xfe, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff}},
1064 {{0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xfc, 0x9f,
1065 0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x80,
1066 0xff, 0x0f, 0xfc, 0xff, 0x7f, 0x00, 0x00, 0x00,
1067 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},
1068 {0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1069 0x00, 0x00, 0xf8, 0xff, 0x0f, 0xc0, 0xff, 0xff,
1070 0xff, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff,
1071 0xff, 0xff, 0xff, 0x07, 0x80, 0xff, 0xff, 0xff}},
1072 {{0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00,
1073 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
1074 0xf7, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x00,
1075 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xf0},
1076 {0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff,
1077 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,
1078 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff,
1079 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
1080 {{0x00, 0xf8, 0xff, 0x03, 0xff, 0xff, 0xff, 0x00,
1081 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1082 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
1083 0xff, 0xff, 0x03, 0xc0, 0xff, 0x0f, 0xfc, 0xff},
1084 {0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff,
1085 0xff, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x00, 0xc0,
1086 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1087 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
1088 {{0x8f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1089 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff,
1090 0xff, 0x7f, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
1091 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},
1092 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1093 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1094 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1095 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
1096 {{0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff,
1097 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1098 0xff, 0xff, 0x03, 0x00, 0x80, 0x00, 0x00, 0x80,
1099 0xff, 0xff, 0xff, 0x00, 0x00, 0x80, 0xff, 0x7f},
1100 {0xff, 0xcf, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,
1101 0x00, 0xc0, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff,
1102 0xbf, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00,
1103 0x80, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00}},
1104 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff,
1105 0xff, 0xff, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff,
1106 0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x80,
1107 0xff, 0x01, 0xfc, 0xff, 0x01, 0x00, 0xfe, 0xff},
1108 {0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00,
1109 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
1111 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00}},
1112 {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
1113 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1114 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1115 0x7f, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80},
1116 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1117 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf0, 0xff, 0xff,
1118 0xe0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
1119 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
1120 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1121 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1122 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1123 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x00},
1124 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
1125 0xfc, 0xff, 0xff, 0x3f, 0xf0, 0xff, 0xff, 0x3f,
1126 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x00, 0xff,
1127 0xff, 0xff, 0xff, 0xff, 0x0f, 0x7e, 0x00, 0x00}},
1128 {{0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1129 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
1130 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1131 0xff, 0xff, 0x1f, 0x00, 0x00, 0xfe, 0x07, 0x00},
1132 {0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff,
1133 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1134 0xff, 0xfb, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00,
1135 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60}},
1136 {{0xff, 0x01, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00,
1137 0x80, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x03,
1138 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1139 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
1140 {0xff, 0xff, 0x1f, 0x00, 0xf0, 0xff, 0xff, 0xff,
1141 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1142 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1143 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00}},
1144 {{0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
1145 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1146 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1147 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
1148 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1149 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff,
1150 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03,
1151 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff}},
1152 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1153 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1154 0xc0, 0xff, 0xff, 0xcf, 0xff, 0x1f, 0x00, 0x00,
1155 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80},
1156 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1157 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
1158 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x7e,
1159 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
1160 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1161 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff,
1162 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
1163 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00},
1164 {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1165 0xff, 0xff, 0x7f, 0x00, 0x80, 0x00, 0x00, 0x00,
1166 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1167 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff}},
1168 {{0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x80,
1169 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1170 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1171 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},
1172 {0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1173 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x80,
1174 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
1175 0xff, 0x7f, 0xf8, 0xff, 0xff, 0x1f, 0x00, 0xfe}},
1176 {{0xff, 0xff, 0xff, 0x3f, 0xf8, 0xff, 0xff, 0xff,
1177 0xff, 0x03, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00,
1178 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1179 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07},
1180 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1181 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1182 0xff, 0xff, 0xff, 0xff, 0x01, 0x80, 0xff, 0xff,
1183 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}},
1184 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1185 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1186 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1187 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
1188 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1189 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
1190 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
1191 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40}},
1192 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1193 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1194 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1195 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
1196 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1197 0x00, 0x00, 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 {{0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1201 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1202 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1203 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
1204 {0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1205 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1206 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1207 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
1208 {{0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xc0,
1209 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1210 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff,
1211 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f},
1212 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00,
1213 0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00,
1214 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff,
1215 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff}},
1216 {{0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1217 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1218 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1219 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
1220 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1221 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1222 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1223 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}},
1224 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1225 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
1226 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
1227 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40},
1228 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1229 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1230 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1231 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}},
1232 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1233 0x7e, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x07, 0x00,
1234 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
1235 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
1236 {0xff, 0x01, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
1237 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x80,
1238 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00,
1239 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
1240 {{0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x00,
1241 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1242 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
1243 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff},
1244 {0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
1245 0xff, 0xff, 0x3f, 0x00, 0xf8, 0xff, 0xff, 0xff,
1246 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1247 0xff, 0x3f, 0x00, 0x00, 0xc0, 0xf1, 0x7f, 0x00}},
1248 {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
1249 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff,
1250 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
1251 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00},
1252 {0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
1253 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff,
1254 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f,
1255 0x00, 0x00, 0xfc, 0xff, 0xff, 0x01, 0xff, 0xff}},
1256 {{0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1257 0x80, 0x00, 0x00, 0x80, 0xff, 0x03, 0xe0, 0x01,
1258 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfc, 0xff,
1259 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},
1260 {0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
1261 0xfe, 0xff, 0xff, 0xf0, 0x07, 0x00, 0x3c, 0x80,
1262 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff,
1263 0xff, 0xff, 0x07, 0xe0, 0xff, 0x00, 0x00, 0x00}},
1264 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1265 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1266 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf8,
1267 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80},
1268 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1269 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x80, 0x00,
1270 0x00, 0x00, 0x00, 0xc0, 0x7f, 0xfe, 0xff, 0x1f,
1271 0x00, 0xfe, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff}},
1272 {{0xff, 0xff, 0x81, 0xff, 0xff, 0xff, 0xff, 0x00,
1273 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83,
1274 0xff, 0xff, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
1275 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xf0},
1276 {0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff,
1277 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00,
1278 0xf8, 0x07, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
1279 0xff, 0xc7, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff}},
1280 {{0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
1281 0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
1282 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x03, 0xfb,
1283 0xfa, 0x8a, 0x7d, 0xdf, 0x13, 0x86, 0xe2, 0x03},
1284 {0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
1285 0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
1286 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x03, 0xfb,
1287 0xfa, 0x8a, 0x7d, 0xdf, 0x13, 0x86, 0xe2, 0x03}}
1289 unsigned char res[33][2][32] = {
1290 {{0x0c, 0x3b, 0x0a, 0xca, 0x8d, 0x1a, 0x2f, 0xb9,
1291 0x8a, 0x7b, 0x53, 0x5a, 0x1f, 0xc5, 0x22, 0xa1,
1292 0x07, 0x2a, 0x48, 0xea, 0x02, 0xeb, 0xb3, 0xd6,
1293 0x20, 0x1e, 0x86, 0xd0, 0x95, 0xf6, 0x92, 0x35},
1294 {0xdc, 0x90, 0x7a, 0x07, 0x2e, 0x1e, 0x44, 0x6d,
1295 0xf8, 0x15, 0x24, 0x5b, 0x5a, 0x96, 0x37, 0x9c,
1296 0x37, 0x7b, 0x0d, 0xac, 0x1b, 0x65, 0x58, 0x49,
1297 0x43, 0xb7, 0x31, 0xbb, 0xa7, 0xf4, 0x97, 0x15}},
1298 {{0xf1, 0xf7, 0x3a, 0x50, 0xe6, 0x10, 0xba, 0x22,
1299 0x43, 0x4d, 0x1f, 0x1f, 0x7c, 0x27, 0xca, 0x9c,
1300 0xb8, 0xb6, 0xa0, 0xfc, 0xd8, 0xc0, 0x05, 0x2f,
1301 0xf7, 0x08, 0xe1, 0x76, 0xdd, 0xd0, 0x80, 0xc8},
1302 {0xe3, 0x80, 0x80, 0xb8, 0xdb, 0xe3, 0xa9, 0x77,
1303 0x00, 0xb0, 0xf5, 0x2e, 0x27, 0xe2, 0x68, 0xc4,
1304 0x88, 0xe8, 0x04, 0xc1, 0x12, 0xbf, 0x78, 0x59,
1305 0xe6, 0xa9, 0x7c, 0xe1, 0x81, 0xdd, 0xb9, 0xd5}},
1306 {{0x96, 0xe2, 0xee, 0x01, 0xa6, 0x80, 0x31, 0xef,
1307 0x5c, 0xd0, 0x19, 0xb4, 0x7d, 0x5f, 0x79, 0xab,
1308 0xa1, 0x97, 0xd3, 0x7e, 0x33, 0xbb, 0x86, 0x55,
1309 0x60, 0x20, 0x10, 0x0d, 0x94, 0x2d, 0x11, 0x7c},
1310 {0xcc, 0xab, 0xe0, 0xe8, 0x98, 0x65, 0x12, 0x96,
1311 0x38, 0x5a, 0x1a, 0xf2, 0x85, 0x23, 0x59, 0x5f,
1312 0xf9, 0xf3, 0xc2, 0x81, 0x70, 0x92, 0x65, 0x12,
1313 0x9c, 0x65, 0x1e, 0x96, 0x00, 0xef, 0xe7, 0x63}},
1314 {{0xac, 0x1e, 0x62, 0xc2, 0x59, 0xfc, 0x4e, 0x5c,
1315 0x83, 0xb0, 0xd0, 0x6f, 0xce, 0x19, 0xf6, 0xbf,
1316 0xa4, 0xb0, 0xe0, 0x53, 0x66, 0x1f, 0xbf, 0xc9,
1317 0x33, 0x47, 0x37, 0xa9, 0x3d, 0x5d, 0xb0, 0x48},
1318 {0x86, 0xb9, 0x2a, 0x7f, 0x8e, 0xa8, 0x60, 0x42,
1319 0x26, 0x6d, 0x6e, 0x1c, 0xa2, 0xec, 0xe0, 0xe5,
1320 0x3e, 0x0a, 0x33, 0xbb, 0x61, 0x4c, 0x9f, 0x3c,
1321 0xd1, 0xdf, 0x49, 0x33, 0xcd, 0x72, 0x78, 0x18}},
1322 {{0xf7, 0xd3, 0xcd, 0x49, 0x5c, 0x13, 0x22, 0xfb,
1323 0x2e, 0xb2, 0x2f, 0x27, 0xf5, 0x8a, 0x5d, 0x74,
1324 0xc1, 0x58, 0xc5, 0xc2, 0x2d, 0x9f, 0x52, 0xc6,
1325 0x63, 0x9f, 0xba, 0x05, 0x76, 0x45, 0x7a, 0x63},
1326 {0x8a, 0xfa, 0x55, 0x4d, 0xdd, 0xa3, 0xb2, 0xc3,
1327 0x44, 0xfd, 0xec, 0x72, 0xde, 0xef, 0xc0, 0x99,
1328 0xf5, 0x9f, 0xe2, 0x52, 0xb4, 0x05, 0x32, 0x58,
1329 0x57, 0xc1, 0x8f, 0xea, 0xc3, 0x24, 0x5b, 0x94}},
1330 {{0x05, 0x83, 0xee, 0xdd, 0x64, 0xf0, 0x14, 0x3b,
1331 0xa0, 0x14, 0x4a, 0x3a, 0x41, 0x82, 0x7c, 0xa7,
1332 0x2c, 0xaa, 0xb1, 0x76, 0xbb, 0x59, 0x64, 0x5f,
1333 0x52, 0xad, 0x25, 0x29, 0x9d, 0x8f, 0x0b, 0xb0},
1334 {0x7e, 0xe3, 0x7c, 0xca, 0xcd, 0x4f, 0xb0, 0x6d,
1335 0x7a, 0xb2, 0x3e, 0xa0, 0x08, 0xb9, 0xa8, 0x2d,
1336 0xc2, 0xf4, 0x99, 0x66, 0xcc, 0xac, 0xd8, 0xb9,
1337 0x72, 0x2a, 0x4a, 0x3e, 0x0f, 0x7b, 0xbf, 0xf4}},
1338 {{0x8c, 0x9c, 0x78, 0x2b, 0x39, 0x61, 0x7e, 0xf7,
1339 0x65, 0x37, 0x66, 0x09, 0x38, 0xb9, 0x6f, 0x70,
1340 0x78, 0x87, 0xff, 0xcf, 0x93, 0xca, 0x85, 0x06,
1341 0x44, 0x84, 0xa7, 0xfe, 0xd3, 0xa4, 0xe3, 0x7e},
1342 {0xa2, 0x56, 0x49, 0x23, 0x54, 0xa5, 0x50, 0xe9,
1343 0x5f, 0xf0, 0x4d, 0xe7, 0xdc, 0x38, 0x32, 0x79,
1344 0x4f, 0x1c, 0xb7, 0xe4, 0xbb, 0xf8, 0xbb, 0x2e,
1345 0x40, 0x41, 0x4b, 0xcc, 0xe3, 0x1e, 0x16, 0x36}},
1346 {{0x0c, 0x1e, 0xd7, 0x09, 0x25, 0x40, 0x97, 0xcb,
1347 0x5c, 0x46, 0xa8, 0xda, 0xef, 0x25, 0xd5, 0xe5,
1348 0x92, 0x4d, 0xcf, 0xa3, 0xc4, 0x5d, 0x35, 0x4a,
1349 0xe4, 0x61, 0x92, 0xf3, 0xbf, 0x0e, 0xcd, 0xbe},
1350 {0xe4, 0xaf, 0x0a, 0xb3, 0x30, 0x8b, 0x9b, 0x48,
1351 0x49, 0x43, 0xc7, 0x64, 0x60, 0x4a, 0x2b, 0x9e,
1352 0x95, 0x5f, 0x56, 0xe8, 0x35, 0xdc, 0xeb, 0xdc,
1353 0xc7, 0xc4, 0xfe, 0x30, 0x40, 0xc7, 0xbf, 0xa4}},
1354 {{0xd4, 0xa0, 0xf5, 0x81, 0x49, 0x6b, 0xb6, 0x8b,
1355 0x0a, 0x69, 0xf9, 0xfe, 0xa8, 0x32, 0xe5, 0xe0,
1356 0xa5, 0xcd, 0x02, 0x53, 0xf9, 0x2c, 0xe3, 0x53,
1357 0x83, 0x36, 0xc6, 0x02, 0xb5, 0xeb, 0x64, 0xb8},
1358 {0x1d, 0x42, 0xb9, 0xf9, 0xe9, 0xe3, 0x93, 0x2c,
1359 0x4c, 0xee, 0x6c, 0x5a, 0x47, 0x9e, 0x62, 0x01,
1360 0x6b, 0x04, 0xfe, 0xa4, 0x30, 0x2b, 0x0d, 0x4f,
1361 0x71, 0x10, 0xd3, 0x55, 0xca, 0xf3, 0x5e, 0x80}},
1362 {{0x77, 0x05, 0xf6, 0x0c, 0x15, 0x9b, 0x45, 0xe7,
1363 0xb9, 0x11, 0xb8, 0xf5, 0xd6, 0xda, 0x73, 0x0c,
1364 0xda, 0x92, 0xea, 0xd0, 0x9d, 0xd0, 0x18, 0x92,
1365 0xce, 0x9a, 0xaa, 0xee, 0x0f, 0xef, 0xde, 0x30},
1366 {0xf1, 0xf1, 0xd6, 0x9b, 0x51, 0xd7, 0x77, 0x62,
1367 0x52, 0x10, 0xb8, 0x7a, 0x84, 0x9d, 0x15, 0x4e,
1368 0x07, 0xdc, 0x1e, 0x75, 0x0d, 0x0c, 0x3b, 0xdb,
1369 0x74, 0x58, 0x62, 0x02, 0x90, 0x54, 0x8b, 0x43}},
1370 {{0xa6, 0xfe, 0x0b, 0x87, 0x80, 0x43, 0x67, 0x25,
1371 0x57, 0x5d, 0xec, 0x40, 0x50, 0x08, 0xd5, 0x5d,
1372 0x43, 0xd7, 0xe0, 0xaa, 0xe0, 0x13, 0xb6, 0xb0,
1373 0xc0, 0xd4, 0xe5, 0x0d, 0x45, 0x83, 0xd6, 0x13},
1374 {0x40, 0x45, 0x0a, 0x92, 0x31, 0xea, 0x8c, 0x60,
1375 0x8c, 0x1f, 0xd8, 0x76, 0x45, 0xb9, 0x29, 0x00,
1376 0x26, 0x32, 0xd8, 0xa6, 0x96, 0x88, 0xe2, 0xc4,
1377 0x8b, 0xdb, 0x7f, 0x17, 0x87, 0xcc, 0xc8, 0xf2}},
1378 {{0xc2, 0x56, 0xe2, 0xb6, 0x1a, 0x81, 0xe7, 0x31,
1379 0x63, 0x2e, 0xbb, 0x0d, 0x2f, 0x81, 0x67, 0xd4,
1380 0x22, 0xe2, 0x38, 0x02, 0x25, 0x97, 0xc7, 0x88,
1381 0x6e, 0xdf, 0xbe, 0x2a, 0xa5, 0x73, 0x63, 0xaa},
1382 {0x50, 0x45, 0xe2, 0xc3, 0xbd, 0x89, 0xfc, 0x57,
1383 0xbd, 0x3c, 0xa3, 0x98, 0x7e, 0x7f, 0x36, 0x38,
1384 0x92, 0x39, 0x1f, 0x0f, 0x81, 0x1a, 0x06, 0x51,
1385 0x1f, 0x8d, 0x6a, 0xff, 0x47, 0x16, 0x06, 0x9c}},
1386 {{0x33, 0x95, 0xa2, 0x6f, 0x27, 0x5f, 0x9c, 0x9c,
1387 0x64, 0x45, 0xcb, 0xd1, 0x3c, 0xee, 0x5e, 0x5f,
1388 0x48, 0xa6, 0xaf, 0xe3, 0x79, 0xcf, 0xb1, 0xe2,
1389 0xbf, 0x55, 0x0e, 0xa2, 0x3b, 0x62, 0xf0, 0xe4},
1390 {0x14, 0xe8, 0x06, 0xe3, 0xbe, 0x7e, 0x67, 0x01,
1391 0xc5, 0x21, 0x67, 0xd8, 0x54, 0xb5, 0x7f, 0xa4,
1392 0xf9, 0x75, 0x70, 0x1c, 0xfd, 0x79, 0xdb, 0x86,
1393 0xad, 0x37, 0x85, 0x83, 0x56, 0x4e, 0xf0, 0xbf}},
1394 {{0xbc, 0xa6, 0xe0, 0x56, 0x4e, 0xef, 0xfa, 0xf5,
1395 0x1d, 0x5d, 0x3f, 0x2a, 0x5b, 0x19, 0xab, 0x51,
1396 0xc5, 0x8b, 0xdd, 0x98, 0x28, 0x35, 0x2f, 0xc3,
1397 0x81, 0x4f, 0x5c, 0xe5, 0x70, 0xb9, 0xeb, 0x62},
1398 {0xc4, 0x6d, 0x26, 0xb0, 0x17, 0x6b, 0xfe, 0x6c,
1399 0x12, 0xf8, 0xe7, 0xc1, 0xf5, 0x2f, 0xfa, 0x91,
1400 0x13, 0x27, 0xbd, 0x73, 0xcc, 0x33, 0x31, 0x1c,
1401 0x39, 0xe3, 0x27, 0x6a, 0x95, 0xcf, 0xc5, 0xfb}},
1402 {{0x30, 0xb2, 0x99, 0x84, 0xf0, 0x18, 0x2a, 0x6e,
1403 0x1e, 0x27, 0xed, 0xa2, 0x29, 0x99, 0x41, 0x56,
1404 0xe8, 0xd4, 0x0d, 0xef, 0x99, 0x9c, 0xf3, 0x58,
1405 0x29, 0x55, 0x1a, 0xc0, 0x68, 0xd6, 0x74, 0xa4},
1406 {0x07, 0x9c, 0xe7, 0xec, 0xf5, 0x36, 0x73, 0x41,
1407 0xa3, 0x1c, 0xe5, 0x93, 0x97, 0x6a, 0xfd, 0xf7,
1408 0x53, 0x18, 0xab, 0xaf, 0xeb, 0x85, 0xbd, 0x92,
1409 0x90, 0xab, 0x3c, 0xbf, 0x30, 0x82, 0xad, 0xf6}},
1410 {{0xc6, 0x87, 0x8a, 0x2a, 0xea, 0xc0, 0xa9, 0xec,
1411 0x6d, 0xd3, 0xdc, 0x32, 0x23, 0xce, 0x62, 0x19,
1412 0xa4, 0x7e, 0xa8, 0xdd, 0x1c, 0x33, 0xae, 0xd3,
1413 0x4f, 0x62, 0x9f, 0x52, 0xe7, 0x65, 0x46, 0xf4},
1414 {0x97, 0x51, 0x27, 0x67, 0x2d, 0xa2, 0x82, 0x87,
1415 0x98, 0xd3, 0xb6, 0x14, 0x7f, 0x51, 0xd3, 0x9a,
1416 0x0b, 0xd0, 0x76, 0x81, 0xb2, 0x4f, 0x58, 0x92,
1417 0xa4, 0x86, 0xa1, 0xa7, 0x09, 0x1d, 0xef, 0x9b}},
1418 {{0xb3, 0x0f, 0x2b, 0x69, 0x0d, 0x06, 0x90, 0x64,
1419 0xbd, 0x43, 0x4c, 0x10, 0xe8, 0x98, 0x1c, 0xa3,
1420 0xe1, 0x68, 0xe9, 0x79, 0x6c, 0x29, 0x51, 0x3f,
1421 0x41, 0xdc, 0xdf, 0x1f, 0xf3, 0x60, 0xbe, 0x33},
1422 {0xa1, 0x5f, 0xf7, 0x1d, 0xb4, 0x3e, 0x9b, 0x3c,
1423 0xe7, 0xbd, 0xb6, 0x06, 0xd5, 0x60, 0x06, 0x6d,
1424 0x50, 0xd2, 0xf4, 0x1a, 0x31, 0x08, 0xf2, 0xea,
1425 0x8e, 0xef, 0x5f, 0x7d, 0xb6, 0xd0, 0xc0, 0x27}},
1426 {{0x62, 0x9a, 0xd9, 0xbb, 0x38, 0x36, 0xce, 0xf7,
1427 0x5d, 0x2f, 0x13, 0xec, 0xc8, 0x2d, 0x02, 0x8a,
1428 0x2e, 0x72, 0xf0, 0xe5, 0x15, 0x9d, 0x72, 0xae,
1429 0xfc, 0xb3, 0x4f, 0x02, 0xea, 0xe1, 0x09, 0xfe},
1430 {0x00, 0x00, 0x00, 0x00, 0xfa, 0x0a, 0x3d, 0xbc,
1431 0xad, 0x16, 0x0c, 0xb6, 0xe7, 0x7c, 0x8b, 0x39,
1432 0x9a, 0x43, 0xbb, 0xe3, 0xc2, 0x55, 0x15, 0x14,
1433 0x75, 0xac, 0x90, 0x9b, 0x7f, 0x9a, 0x92, 0x00}},
1434 {{0x8b, 0xac, 0x70, 0x86, 0x29, 0x8f, 0x00, 0x23,
1435 0x7b, 0x45, 0x30, 0xaa, 0xb8, 0x4c, 0xc7, 0x8d,
1436 0x4e, 0x47, 0x85, 0xc6, 0x19, 0xe3, 0x96, 0xc2,
1437 0x9a, 0xa0, 0x12, 0xed, 0x6f, 0xd7, 0x76, 0x16},
1438 {0x45, 0xaf, 0x7e, 0x33, 0xc7, 0x7f, 0x10, 0x6c,
1439 0x7c, 0x9f, 0x29, 0xc1, 0xa8, 0x7e, 0x15, 0x84,
1440 0xe7, 0x7d, 0xc0, 0x6d, 0xab, 0x71, 0x5d, 0xd0,
1441 0x6b, 0x9f, 0x97, 0xab, 0xcb, 0x51, 0x0c, 0x9f}},
1442 {{0x9e, 0xc3, 0x92, 0xb4, 0x04, 0x9f, 0xc8, 0xbb,
1443 0xdd, 0x9e, 0xc6, 0x05, 0xfd, 0x65, 0xec, 0x94,
1444 0x7f, 0x2c, 0x16, 0xc4, 0x40, 0xac, 0x63, 0x7b,
1445 0x7d, 0xb8, 0x0c, 0xe4, 0x5b, 0xe3, 0xa7, 0x0e},
1446 {0x43, 0xf4, 0x44, 0xe8, 0xcc, 0xc8, 0xd4, 0x54,
1447 0x33, 0x37, 0x50, 0xf2, 0x87, 0x42, 0x2e, 0x00,
1448 0x49, 0x60, 0x62, 0x02, 0xfd, 0x1a, 0x7c, 0xdb,
1449 0x29, 0x6c, 0x6d, 0x54, 0x53, 0x08, 0xd1, 0xc8}},
1450 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1451 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1452 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1453 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
1454 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1455 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1456 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1457 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
1458 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1459 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1460 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1461 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
1462 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1463 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1464 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1465 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}},
1466 {{0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1,
1467 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0,
1468 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59,
1469 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92},
1470 {0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1,
1471 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0,
1472 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59,
1473 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}},
1474 {{0x28, 0x56, 0xac, 0x0e, 0x4f, 0x98, 0x09, 0xf0,
1475 0x49, 0xfa, 0x7f, 0x84, 0xac, 0x7e, 0x50, 0x5b,
1476 0x17, 0x43, 0x14, 0x89, 0x9c, 0x53, 0xa8, 0x94,
1477 0x30, 0xf2, 0x11, 0x4d, 0x92, 0x14, 0x27, 0xe8},
1478 {0x39, 0x7a, 0x84, 0x56, 0x79, 0x9d, 0xec, 0x26,
1479 0x2c, 0x53, 0xc1, 0x94, 0xc9, 0x8d, 0x9e, 0x9d,
1480 0x32, 0x1f, 0xdd, 0x84, 0x04, 0xe8, 0xe2, 0x0a,
1481 0x6b, 0xbe, 0xbb, 0x42, 0x40, 0x67, 0x30, 0x6c}},
1482 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1483 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1484 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4,
1485 0x40, 0x2d, 0xa1, 0x73, 0x2f, 0xc9, 0xbe, 0xbd},
1486 {0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1,
1487 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0,
1488 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59,
1489 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}},
1490 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1491 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
1492 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
1493 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40},
1494 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1495 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1496 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1497 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}},
1498 {{0x1c, 0xc4, 0xf7, 0xda, 0x0f, 0x65, 0xca, 0x39,
1499 0x70, 0x52, 0x92, 0x8e, 0xc3, 0xc8, 0x15, 0xea,
1500 0x7f, 0x10, 0x9e, 0x77, 0x4b, 0x6e, 0x2d, 0xdf,
1501 0xe8, 0x30, 0x9d, 0xda, 0xe8, 0x9a, 0x65, 0xae},
1502 {0x02, 0xb0, 0x16, 0xb1, 0x1d, 0xc8, 0x57, 0x7b,
1503 0xa2, 0x3a, 0xa2, 0xa3, 0x38, 0x5c, 0x8f, 0xeb,
1504 0x66, 0x37, 0x91, 0xa8, 0x5f, 0xef, 0x04, 0xf6,
1505 0x59, 0x75, 0xe1, 0xee, 0x92, 0xf6, 0x0e, 0x30}},
1506 {{0x8d, 0x76, 0x14, 0xa4, 0x14, 0x06, 0x9f, 0x9a,
1507 0xdf, 0x4a, 0x85, 0xa7, 0x6b, 0xbf, 0x29, 0x6f,
1508 0xbc, 0x34, 0x87, 0x5d, 0xeb, 0xbb, 0x2e, 0xa9,
1509 0xc9, 0x1f, 0x58, 0xd6, 0x9a, 0x82, 0xa0, 0x56},
1510 {0xd4, 0xb9, 0xdb, 0x88, 0x1d, 0x04, 0xe9, 0x93,
1511 0x8d, 0x3f, 0x20, 0xd5, 0x86, 0xa8, 0x83, 0x07,
1512 0xdb, 0x09, 0xd8, 0x22, 0x1f, 0x7f, 0xf1, 0x71,
1513 0xc8, 0xe7, 0x5d, 0x47, 0xaf, 0x8b, 0x72, 0xe9}},
1514 {{0x83, 0xb9, 0x39, 0xb2, 0xa4, 0xdf, 0x46, 0x87,
1515 0xc2, 0xb8, 0xf1, 0xe6, 0x4c, 0xd1, 0xe2, 0xa9,
1516 0xe4, 0x70, 0x30, 0x34, 0xbc, 0x52, 0x7c, 0x55,
1517 0xa6, 0xec, 0x80, 0xa4, 0xe5, 0xd2, 0xdc, 0x73},
1518 {0x08, 0xf1, 0x03, 0xcf, 0x16, 0x73, 0xe8, 0x7d,
1519 0xb6, 0x7e, 0x9b, 0xc0, 0xb4, 0xc2, 0xa5, 0x86,
1520 0x02, 0x77, 0xd5, 0x27, 0x86, 0xa5, 0x15, 0xfb,
1521 0xae, 0x9b, 0x8c, 0xa9, 0xf9, 0xf8, 0xa8, 0x4a}},
1522 {{0x8b, 0x00, 0x49, 0xdb, 0xfa, 0xf0, 0x1b, 0xa2,
1523 0xed, 0x8a, 0x9a, 0x7a, 0x36, 0x78, 0x4a, 0xc7,
1524 0xf7, 0xad, 0x39, 0xd0, 0x6c, 0x65, 0x7a, 0x41,
1525 0xce, 0xd6, 0xd6, 0x4c, 0x20, 0x21, 0x6b, 0xc7},
1526 {0xc6, 0xca, 0x78, 0x1d, 0x32, 0x6c, 0x6c, 0x06,
1527 0x91, 0xf2, 0x1a, 0xe8, 0x43, 0x16, 0xea, 0x04,
1528 0x3c, 0x1f, 0x07, 0x85, 0xf7, 0x09, 0x22, 0x08,
1529 0xba, 0x13, 0xfd, 0x78, 0x1e, 0x3f, 0x6f, 0x62}},
1530 {{0x25, 0x9b, 0x7c, 0xb0, 0xac, 0x72, 0x6f, 0xb2,
1531 0xe3, 0x53, 0x84, 0x7a, 0x1a, 0x9a, 0x98, 0x9b,
1532 0x44, 0xd3, 0x59, 0xd0, 0x8e, 0x57, 0x41, 0x40,
1533 0x78, 0xa7, 0x30, 0x2f, 0x4c, 0x9c, 0xb9, 0x68},
1534 {0xb7, 0x75, 0x03, 0x63, 0x61, 0xc2, 0x48, 0x6e,
1535 0x12, 0x3d, 0xbf, 0x4b, 0x27, 0xdf, 0xb1, 0x7a,
1536 0xff, 0x4e, 0x31, 0x07, 0x83, 0xf4, 0x62, 0x5b,
1537 0x19, 0xa5, 0xac, 0xa0, 0x32, 0x58, 0x0d, 0xa7}},
1538 {{0x43, 0x4f, 0x10, 0xa4, 0xca, 0xdb, 0x38, 0x67,
1539 0xfa, 0xae, 0x96, 0xb5, 0x6d, 0x97, 0xff, 0x1f,
1540 0xb6, 0x83, 0x43, 0xd3, 0xa0, 0x2d, 0x70, 0x7a,
1541 0x64, 0x05, 0x4c, 0xa7, 0xc1, 0xa5, 0x21, 0x51},
1542 {0xe4, 0xf1, 0x23, 0x84, 0xe1, 0xb5, 0x9d, 0xf2,
1543 0xb8, 0x73, 0x8b, 0x45, 0x2b, 0x35, 0x46, 0x38,
1544 0x10, 0x2b, 0x50, 0xf8, 0x8b, 0x35, 0xcd, 0x34,
1545 0xc8, 0x0e, 0xf6, 0xdb, 0x09, 0x35, 0xf0, 0xda}},
1546 {{0xdb, 0x21, 0x5c, 0x8d, 0x83, 0x1d, 0xb3, 0x34,
1547 0xc7, 0x0e, 0x43, 0xa1, 0x58, 0x79, 0x67, 0x13,
1548 0x1e, 0x86, 0x5d, 0x89, 0x63, 0xe6, 0x0a, 0x46,
1549 0x5c, 0x02, 0x97, 0x1b, 0x62, 0x43, 0x86, 0xf5},
1550 {0xdb, 0x21, 0x5c, 0x8d, 0x83, 0x1d, 0xb3, 0x34,
1551 0xc7, 0x0e, 0x43, 0xa1, 0x58, 0x79, 0x67, 0x13,
1552 0x1e, 0x86, 0x5d, 0x89, 0x63, 0xe6, 0x0a, 0x46,
1553 0x5c, 0x02, 0x97, 0x1b, 0x62, 0x43, 0x86, 0xf5}}
1555 secp256k1_scalar_set_int(&one, 1);
1556 for (i = 0; i < 33; i++) {
1557 secp256k1_scalar_set_b32(&x, chal[i][0], &overflow);
1559 secp256k1_scalar_set_b32(&y, chal[i][1], &overflow);
1561 secp256k1_scalar_set_b32(&r1, res[i][0], &overflow);
1563 secp256k1_scalar_set_b32(&r2, res[i][1], &overflow);
1565 secp256k1_scalar_mul(&z, &x, &y);
1566 CHECK(!secp256k1_scalar_check_overflow(&z));
1567 CHECK(secp256k1_scalar_eq(&r1, &z));
1568 if (!secp256k1_scalar_is_zero(&y)) {
1569 secp256k1_scalar_inverse(&zz, &y);
1570 CHECK(!secp256k1_scalar_check_overflow(&zz));
1571 #if defined(USE_SCALAR_INV_NUM)
1572 secp256k1_scalar_inverse_var(&zzv, &y);
1573 CHECK(secp256k1_scalar_eq(&zzv, &zz));
1575 secp256k1_scalar_mul(&z, &z, &zz);
1576 CHECK(!secp256k1_scalar_check_overflow(&z));
1577 CHECK(secp256k1_scalar_eq(&x, &z));
1578 secp256k1_scalar_mul(&zz, &zz, &y);
1579 CHECK(!secp256k1_scalar_check_overflow(&zz));
1580 CHECK(secp256k1_scalar_eq(&one, &zz));
1582 secp256k1_scalar_mul(&z, &x, &x);
1583 CHECK(!secp256k1_scalar_check_overflow(&z));
1584 secp256k1_scalar_sqr(&zz, &x);
1585 CHECK(!secp256k1_scalar_check_overflow(&zz));
1586 CHECK(secp256k1_scalar_eq(&zz, &z));
1587 CHECK(secp256k1_scalar_eq(&r2, &zz));
1595 unsigned char bin[32];
1597 secp256k1_rand256(bin);
1598 if (secp256k1_fe_set_b32(x, bin)) {
1605 unsigned char bin[32];
1607 secp256k1_rand256_test(bin);
1608 if (secp256k1_fe_set_b32(x, bin)) {
1616 while (--tries >= 0) {
1618 secp256k1_fe_normalize(nz);
1619 if (!secp256k1_fe_is_zero(nz)) {
1630 if (secp256k1_fe_sqrt(&r, ns)) {
1631 secp256k1_fe_negate(ns, ns, 1);
1638 secp256k1_fe_normalize_weak(&an);
1639 secp256k1_fe_normalize_var(&bn);
1640 return secp256k1_fe_equal_var(&an, &bn);
1646 secp256k1_fe_mul(&x, a, ai);
1651 static const unsigned char b32[32] = {
1652 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1653 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
1654 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,
1655 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x40
1658 0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL,
1659 0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL
1662 0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL,
1663 0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL
1666 unsigned char b322[32];
1669 CHECK(secp256k1_fe_set_b32(&fe2, b32));
1670 CHECK(secp256k1_fe_equal_var(&fe, &fe2));
1671 secp256k1_fe_from_storage(&fe2, &fes);
1672 CHECK(secp256k1_fe_equal_var(&fe, &fe2));
1674 secp256k1_fe_get_b32(b322, &fe);
1675 CHECK(memcmp(b322, b32, 32) == 0);
1676 secp256k1_fe_to_storage(&fes2, &fe);
1677 CHECK(memcmp(&fes2, &fes,
sizeof(fes)) == 0);
1683 t.magnitude = a->magnitude;
1684 t.normalized = a->normalized;
1696 for (i = 0; i < 5*count; i++) {
1701 CHECK(secp256k1_fe_cmp_var(&x, &x) == 0);
1702 CHECK(secp256k1_fe_equal_var(&x, &x));
1704 secp256k1_fe_add(&z,&y);
1707 secp256k1_fe_cmov(&x, &z, 0);
1708 VERIFY_CHECK(!x.normalized && x.magnitude == z.magnitude);
1709 secp256k1_fe_cmov(&x, &x, 1);
1712 secp256k1_fe_cmov(&q, &z, 1);
1713 VERIFY_CHECK(!q.normalized && q.magnitude == z.magnitude);
1715 secp256k1_fe_normalize_var(&x);
1716 secp256k1_fe_normalize_var(&z);
1717 CHECK(!secp256k1_fe_equal_var(&x, &z));
1718 secp256k1_fe_normalize_var(&q);
1719 secp256k1_fe_cmov(&q, &z, (i&1));
1721 for (j = 0; j < 6; j++) {
1722 secp256k1_fe_negate(&z, &z, j+1);
1723 secp256k1_fe_normalize_var(&q);
1724 secp256k1_fe_cmov(&q, &z, (j&1));
1727 secp256k1_fe_normalize_var(&z);
1729 secp256k1_fe_to_storage(&xs, &x);
1730 secp256k1_fe_to_storage(&ys, &y);
1731 secp256k1_fe_to_storage(&zs, &z);
1732 secp256k1_fe_storage_cmov(&zs, &xs, 0);
1733 secp256k1_fe_storage_cmov(&zs, &zs, 1);
1734 CHECK(memcmp(&xs, &zs,
sizeof(xs)) != 0);
1735 secp256k1_fe_storage_cmov(&ys, &xs, 1);
1736 CHECK(memcmp(&xs, &ys,
sizeof(xs)) == 0);
1737 secp256k1_fe_from_storage(&x, &xs);
1738 secp256k1_fe_from_storage(&y, &ys);
1739 secp256k1_fe_from_storage(&z, &zs);
1741 secp256k1_fe_add(&y, &x);
1742 secp256k1_fe_add(&y, &x);
1744 secp256k1_fe_mul_int(&z, 3);
1746 secp256k1_fe_add(&y, &x);
1747 secp256k1_fe_add(&z, &x);
1750 secp256k1_fe_mul_int(&z, 5);
1751 secp256k1_fe_mul(&q, &x, &fe5);
1753 secp256k1_fe_negate(&x, &x, 1);
1754 secp256k1_fe_add(&z, &x);
1755 secp256k1_fe_add(&q, &x);
1764 for (i = 0; i < 10*count; i++) {
1766 secp256k1_fe_inv(&xi, &x);
1768 secp256k1_fe_inv(&xii, &xi);
1776 for (i = 0; i < 10*count; i++) {
1778 secp256k1_fe_inv_var(&xi, &x);
1780 secp256k1_fe_inv_var(&xii, &xi);
1789 secp256k1_fe_inv_all_var(xi, x, 0);
1790 for (i = 0; i < count; i++) {
1792 size_t len = secp256k1_rand_int(15) + 1;
1793 for (j = 0; j < len; j++) {
1796 secp256k1_fe_inv_all_var(xi, x, len);
1797 for (j = 0; j < len; j++) {
1800 secp256k1_fe_inv_all_var(xii, xi, len);
1801 for (j = 0; j < len; j++) {
1812 secp256k1_fe_set_int(&x, 1);
1813 secp256k1_fe_negate(&x, &x, 1);
1815 for (i = 1; i <= 512; ++i) {
1816 secp256k1_fe_mul_int(&x, 2);
1817 secp256k1_fe_normalize(&x);
1818 secp256k1_fe_sqr(&s, &x);
1825 int v = secp256k1_fe_sqrt(&r1, a);
1826 CHECK((v == 0) == (k == NULL));
1830 secp256k1_fe_negate(&r2, &r1, 1);
1831 secp256k1_fe_add(&r1, k); secp256k1_fe_add(&r2, k);
1832 secp256k1_fe_normalize(&r1); secp256k1_fe_normalize(&r2);
1833 CHECK(secp256k1_fe_is_zero(&r1) || secp256k1_fe_is_zero(&r2));
1842 secp256k1_fe_set_int(&x, 0);
1843 secp256k1_fe_sqr(&s, &x);
1847 for (i = 1; i <= 100; i++) {
1848 secp256k1_fe_set_int(&x, i);
1849 secp256k1_fe_sqr(&s, &x);
1851 secp256k1_fe_negate(&t, &s, 1);
1856 for (i = 0; i < 10; i++) {
1859 for (j = 0; j < count; j++) {
1861 secp256k1_fe_sqr(&s, &x);
1863 secp256k1_fe_negate(&t, &s, 1);
1865 secp256k1_fe_mul(&t, &s, &ns);
1878 CHECK(secp256k1_fe_equal_var(&a->
x, &b->
x));
1879 CHECK(secp256k1_fe_equal_var(&a->
y, &b->
y));
1891 secp256k1_fe_normalize(&a2.
x);
1892 secp256k1_fe_normalize(&a2.
y);
1893 secp256k1_fe_normalize(&a2.
z);
1894 secp256k1_fe_normalize(&b2.
x);
1895 secp256k1_fe_normalize(&b2.
y);
1896 secp256k1_fe_normalize(&b2.
z);
1897 ret &= secp256k1_fe_cmp_var(&a2.
x, &b2.
x) == 0;
1898 ret &= secp256k1_fe_cmp_var(&a2.
y, &b2.
y) == 0;
1899 ret &= secp256k1_fe_cmp_var(&a2.
z, &b2.
z) == 0;
1912 secp256k1_fe_sqr(&z2s, &b->
z);
1913 secp256k1_fe_mul(&u1, &a->
x, &z2s);
1914 u2 = b->
x; secp256k1_fe_normalize_weak(&u2);
1915 secp256k1_fe_mul(&s1, &a->
y, &z2s); secp256k1_fe_mul(&s1, &s1, &b->
z);
1916 s2 = b->
y; secp256k1_fe_normalize_weak(&s2);
1917 CHECK(secp256k1_fe_equal_var(&u1, &u2));
1918 CHECK(secp256k1_fe_equal_var(&s1, &s2));
1923 #ifdef USE_ENDOMORPHISM
1941 secp256k1_gej_set_infinity(&gej[0]);
1942 secp256k1_ge_clear(&ge[0]);
1943 secp256k1_ge_set_gej_var(&ge[0], &gej[0]);
1944 for (i = 0; i < runs; i++) {
1948 #ifdef USE_ENDOMORPHISM
1949 if (i >= runs - 2) {
1950 secp256k1_ge_mul_lambda(&g, &ge[1]);
1952 if (i >= runs - 1) {
1953 secp256k1_ge_mul_lambda(&g, &g);
1958 secp256k1_ge_neg(&ge[3 + 4 * i], &g);
1959 secp256k1_ge_neg(&ge[4 + 4 * i], &g);
1960 secp256k1_gej_set_ge(&gej[1 + 4 * i], &ge[1 + 4 * i]);
1962 secp256k1_gej_set_ge(&gej[3 + 4 * i], &ge[3 + 4 * i]);
1964 for (j = 0; j < 4; j++) {
1976 for (i = 0; i < 4 * runs + 1; i++) {
1981 }
while(secp256k1_fe_is_zero(&zs[i]));
1986 secp256k1_fe_inv_all_var(zinv, zs, 4 * runs + 1);
1993 }
while(secp256k1_fe_is_zero(&zf));
1995 secp256k1_fe_inv_var(&zfi3, &zf);
1996 secp256k1_fe_sqr(&zfi2, &zfi3);
1997 secp256k1_fe_mul(&zfi3, &zfi3, &zfi2);
1999 for (i1 = 0; i1 < 1 + 4 * runs; i1++) {
2001 for (i2 = 0; i2 < 1 + 4 * runs; i2++) {
2006 secp256k1_gej_add_var(&refj, &gej[i1], &gej[i2], secp256k1_gej_is_infinity(&gej[i1]) ? NULL : &zr);
2008 if (!secp256k1_gej_is_infinity(&gej[i1]) && !secp256k1_gej_is_infinity(&refj)) {
2009 secp256k1_fe zrz; secp256k1_fe_mul(&zrz, &zr, &gej[i1].z);
2010 CHECK(secp256k1_fe_equal_var(&zrz, &refj.
z));
2012 secp256k1_ge_set_gej_var(&ref, &refj);
2015 secp256k1_gej_add_ge_var(&resj, &gej[i1], &ge[i2], secp256k1_gej_is_infinity(&gej[i1]) ? NULL : &zr);
2017 if (!secp256k1_gej_is_infinity(&gej[i1]) && !secp256k1_gej_is_infinity(&resj)) {
2018 secp256k1_fe zrz; secp256k1_fe_mul(&zrz, &zr, &gej[i1].z);
2019 CHECK(secp256k1_fe_equal_var(&zrz, &resj.
z));
2025 secp256k1_fe_mul(&ge2_zfi.
x, &ge2_zfi.
x, &zfi2);
2026 secp256k1_fe_mul(&ge2_zfi.
y, &ge2_zfi.
y, &zfi3);
2029 secp256k1_gej_add_zinv_var(&resj, &gej[i1], &ge2_zfi, &zf);
2036 secp256k1_gej_add_ge(&resj, &gej[i1], &ge[i2]);
2041 if ((i1 == 0 && i2 == 0) || ((i1 + 3)/4 == (i2 + 3)/4 && ((i1 + 3)%4)/2 == ((i2 + 3)%4)/2)) {
2044 secp256k1_gej_double_var(&resj, &gej[i1], &zr2);
2047 secp256k1_fe_mul(&zr2, &zr2, &gej[i1].z);
2048 CHECK(secp256k1_fe_equal_var(&zr2, &resj.
z));
2050 secp256k1_gej_double_var(&resj, &gej[i2], NULL);
2055 if ((i1 == 0 && i2 == 0) || ((i1 + 3)/4 == (i2 + 3)/4 && ((i1 + 3)%4)/2 != ((i2 + 3)%4)/2)) {
2056 CHECK(secp256k1_ge_is_infinity(&ref));
2061 CHECK(secp256k1_ge_is_infinity(&ge[i1]));
2062 CHECK(secp256k1_gej_is_infinity(&gej[i1]));
2066 CHECK(secp256k1_ge_is_infinity(&ge[i2]));
2067 CHECK(secp256k1_gej_is_infinity(&gej[i2]));
2077 for (i = 0; i < 4 * runs + 1; i++) {
2078 gej_shuffled[i] = gej[i];
2080 for (i = 0; i < 4 * runs + 1; i++) {
2081 int swap = i + secp256k1_rand_int(4 * runs + 1 - i);
2084 gej_shuffled[i] = gej_shuffled[swap];
2085 gej_shuffled[swap] = t;
2088 for (i = 0; i < 4 * runs + 1; i++) {
2089 secp256k1_gej_add_var(&
sum, &
sum, &gej_shuffled[i], NULL);
2091 CHECK(secp256k1_gej_is_infinity(&
sum));
2100 for (i = 0; i < 4 * runs + 1; i++) {
2103 secp256k1_fe_mul(&zr[i + 1], &zinv[i], &gej[i + 1].z);
2106 secp256k1_ge_set_table_gej_var(ge_set_table, gej, zr, 4 * runs + 1);
2107 secp256k1_ge_set_all_gej_var(ge_set_all, gej, 4 * runs + 1, &ctx->
error_callback);
2108 for (i = 0; i < 4 * runs + 1; i++) {
2111 secp256k1_gej_rescale(&gej[i], &s);
2157 0x8d24cd95, 0x0a355af1, 0x3c543505, 0x44238d30,
2158 0x0643d79f, 0x05a59614, 0x2f8ec030, 0xd58977cb,
2159 0x001e337a, 0x38093dcd, 0x6c0f386d, 0x0b1293a8,
2160 0x4d72c879, 0xd7681924, 0x44e6d2f3, 0x9190117d
2163 0xc7b74206, 0x1f788cd9, 0xabd0937d, 0x164a0d86,
2164 0x95f6ff75, 0xf19a4ce9, 0xd013bd7b, 0xbf92d2a7,
2165 0xffe1cc85, 0xc7f6c232, 0x93f0c792, 0xf4ed6c57,
2166 0xb28d3786, 0x2897e6db, 0xbb192d0b, 0x6e6feab2
2169 0x671a63c0, 0x3efdad4c, 0x389a7798, 0x24356027,
2170 0xb3d69010, 0x278625c3, 0x5c86d390, 0x184a8f7a,
2171 0x5f6409c2, 0x2ce01f2b, 0x511fd375, 0x25071d08,
2172 0xda651801, 0x70e95caf, 0x8f0d893c, 0xbed8fbbe
2177 secp256k1_ge_set_gej(&b, &bj);
2179 secp256k1_gej_add_var(&resj, &aj, &bj, NULL);
2180 secp256k1_ge_set_gej(&res, &resj);
2183 secp256k1_gej_add_ge(&resj, &aj, &b);
2184 secp256k1_ge_set_gej(&res, &resj);
2187 secp256k1_gej_add_ge_var(&resj, &aj, &b, NULL);
2188 secp256k1_ge_set_gej(&res, &resj);
2194 for (i = 0; i < count * 32; i++) {
2209 for (i = 1; i <= 6; i++) {
2212 secp256k1_scalar_add(&
sum, &
sum, &s);
2214 secp256k1_ge_set_gej(&Q, &Qj);
2215 secp256k1_pubkey_save(&data[i - 1], &Q);
2216 d[i - 1] = &data[i - 1];
2218 secp256k1_ge_set_gej(&Q, &Qj);
2219 secp256k1_pubkey_save(&sd, &Q);
2221 CHECK(memcmp(&sd, &sd2,
sizeof(sd)) == 0);
2227 for (i = 0; i < count * 8; i++) {
2240 int res_quad, res_even, res_odd;
2242 secp256k1_fe_normalize_var(&fex);
2244 res_quad = secp256k1_ge_set_xquad(&ge_quad, &fex);
2245 res_even = secp256k1_ge_set_xo_var(&ge_even, &fex, 0);
2246 res_odd = secp256k1_ge_set_xo_var(&ge_odd, &fex, 1);
2248 CHECK(res_quad == res_even);
2249 CHECK(res_quad == res_odd);
2252 secp256k1_fe_normalize_var(&ge_quad.
x);
2253 secp256k1_fe_normalize_var(&ge_odd.
x);
2254 secp256k1_fe_normalize_var(&ge_even.
x);
2255 secp256k1_fe_normalize_var(&ge_quad.
y);
2256 secp256k1_fe_normalize_var(&ge_odd.
y);
2257 secp256k1_fe_normalize_var(&ge_even.
y);
2265 CHECK(secp256k1_fe_equal_var(&ge_quad.
x, x));
2266 CHECK(secp256k1_fe_equal_var(&ge_even.
x, x));
2267 CHECK(secp256k1_fe_equal_var(&ge_odd.
x, x));
2270 CHECK(secp256k1_fe_is_quad_var(&ge_quad.
y));
2273 CHECK(secp256k1_fe_is_odd(&ge_odd.
y));
2274 CHECK(!secp256k1_fe_is_odd(&ge_even.
y));
2277 secp256k1_gej_set_ge(&gej_quad, &ge_quad);
2278 CHECK(secp256k1_gej_has_quad_y_var(&gej_quad));
2281 }
while (secp256k1_fe_is_zero(&fez));
2282 secp256k1_gej_rescale(&gej_quad, &fez);
2283 CHECK(secp256k1_gej_has_quad_y_var(&gej_quad));
2284 secp256k1_gej_neg(&gej_quad, &gej_quad);
2285 CHECK(!secp256k1_gej_has_quad_y_var(&gej_quad));
2288 }
while (secp256k1_fe_is_zero(&fez));
2289 secp256k1_gej_rescale(&gej_quad, &fez);
2290 CHECK(!secp256k1_gej_has_quad_y_var(&gej_quad));
2291 secp256k1_gej_neg(&gej_quad, &gej_quad);
2292 CHECK(secp256k1_gej_has_quad_y_var(&gej_quad));
2298 for (i = 0; i < count * 4; i++) {
2310 0x8b30bbe9, 0xae2a9906, 0x96b22f67, 0x0709dff3,
2311 0x727fd8bc, 0x04d3362c, 0x6c7bf458, 0xe2846004,
2312 0xa357ae91, 0x5c4a6528, 0x1309edf2, 0x0504740f,
2313 0x0eb33439, 0x90216b4f, 0x81063cb6, 0x5f2f7e0f
2317 0x84cc5452, 0xf7fde1ed, 0xb4d38a8c, 0xe9b1b84c,
2318 0xcef31f14, 0x6e569be9, 0x705d357a, 0x42985407
2321 0xa1e58d22, 0x553dcd42, 0xb2398062, 0x5d4c57a9,
2322 0x6e9323d4, 0x2b3152e5, 0xca2c3990, 0xedc7c9de
2337 for (i = 0; i < 200*count; i++) {
2339 secp256k1_ecmult(&ctx->
ecmult_ctx, &x, &x, &xn, &gn);
2342 secp256k1_scalar_mul(&ae, &ae, &xn);
2343 secp256k1_scalar_mul(&ge, &ge, &xn);
2344 secp256k1_scalar_add(&ge, &ge, &gn);
2346 secp256k1_scalar_mul(&xn, &xn, &xf);
2347 secp256k1_scalar_mul(&gn, &gn, &gf);
2353 0xD6E96687, 0xF9B10D09, 0x2A6F3543, 0x9D86CEBE,
2354 0xA4535D0D, 0x409F5358, 0x6440BD74, 0xB933E830,
2355 0xB95CBCA2, 0xC77DA786, 0x539BE8FD, 0x53354D2D,
2356 0x3B4F566A, 0xE6580454, 0x07ED6015, 0xEE1B2A88
2359 secp256k1_gej_neg(&rp, &rp);
2360 secp256k1_gej_add_var(&rp, &rp, &x, NULL);
2361 CHECK(secp256k1_gej_is_infinity(&rp));
2365 secp256k1_ecmult(&ctx->
ecmult_ctx, &x2, &a, &ae, &ge);
2366 secp256k1_gej_neg(&x2, &x2);
2367 secp256k1_gej_add_var(&x2, &x2, &x, NULL);
2368 CHECK(secp256k1_gej_is_infinity(&x2));
2379 unsigned char pub[65];
2382 secp256k1_scalar_negate(&nx, &x);
2383 secp256k1_ecmult(&ctx->
ecmult_ctx, &res1, point, &x, &x);
2384 secp256k1_ecmult(&ctx->
ecmult_ctx, &res2, point, &nx, &nx);
2385 secp256k1_gej_add_var(&res1, &res1, &res2, NULL);
2386 CHECK(secp256k1_gej_is_infinity(&res1));
2387 CHECK(secp256k1_gej_is_valid_var(&res1) == 0);
2388 secp256k1_ge_set_gej(&res3, &res1);
2389 CHECK(secp256k1_ge_is_infinity(&res3));
2390 CHECK(secp256k1_ge_is_valid_var(&res3) == 0);
2391 CHECK(secp256k1_eckey_pubkey_serialize(&res3, pub, &psize, 0) == 0);
2393 CHECK(secp256k1_eckey_pubkey_serialize(&res3, pub, &psize, 1) == 0);
2395 secp256k1_ecmult(&ctx->
ecmult_ctx, &res1, point, &zero, &zero);
2396 secp256k1_ge_set_gej(&res3, &res1);
2397 CHECK(secp256k1_ge_is_infinity(&res3));
2398 secp256k1_ecmult(&ctx->
ecmult_ctx, &res1, point, &one, &zero);
2399 secp256k1_ge_set_gej(&res3, &res1);
2401 secp256k1_ecmult(&ctx->
ecmult_ctx, &res1, point, &zero, &one);
2402 secp256k1_ge_set_gej(&res3, &res1);
2410 0x7603CB59, 0xB0EF6C63, 0xFE608479, 0x2A0C378C,
2411 0xDB3233A8, 0x0F8A9A09, 0xA877DEAD, 0x31B38C45
2413 for (i = 0; i < 500; i++) {
2415 if (secp256k1_ge_set_xo_var(&p, &x, 1)) {
2417 CHECK(secp256k1_ge_is_valid_var(&p));
2418 secp256k1_gej_set_ge(&j, &p);
2419 CHECK(secp256k1_gej_is_valid_var(&j));
2422 secp256k1_fe_sqr(&x, &x);
2424 secp256k1_fe_normalize_var(&x);
2425 CHECK(secp256k1_fe_equal_var(&x, &xr));
2431 0x6d986544, 0x57ff52b8, 0xcf1b8126, 0x5b802a5b,
2432 0xa97f9263, 0xb1e88044, 0x93351325, 0x91bc450a,
2433 0x535c59f7, 0x325e5d2b, 0xc391fbe8, 0x3c12787c,
2434 0x337e4a98, 0xe82a9011, 0x0123ba37, 0xdd769c7d
2438 0x649d4f77, 0xc4242df7, 0x7f2079c9, 0x14530327,
2439 0xa31b876a, 0xd2d8ce2a, 0x2236d5c6, 0xd7b2029b
2443 0x23773684, 0x4d209dc7, 0x098a786f, 0x20d06fcd,
2444 0x070a38bf, 0xc11ac651, 0x03004319, 0x1e2a8786,
2445 0xed8c3b8e, 0xc06dd57b, 0xd06ea66e, 0x45492b0f,
2446 0xb84e4e1b, 0xfb77e21f, 0x96baae2a, 0x63dec956
2449 secp256k1_ecmult_const(&b, &a, &xn, 256);
2451 CHECK(secp256k1_ge_is_valid_var(&a));
2465 secp256k1_ecmult_const(&res1, &secp256k1_ge_const_g, &a, 256);
2466 secp256k1_ecmult_const(&res2, &secp256k1_ge_const_g, &b, 256);
2467 secp256k1_ge_set_gej(&mid1, &res1);
2468 secp256k1_ge_set_gej(&mid2, &res2);
2469 secp256k1_ecmult_const(&res1, &mid1, &b, 256);
2470 secp256k1_ecmult_const(&res2, &mid2, &a, 256);
2471 secp256k1_ge_set_gej(&mid1, &res1);
2472 secp256k1_ge_set_gej(&mid2, &res2);
2483 secp256k1_scalar_negate(&negone, &one);
2486 secp256k1_ecmult_const(&res1, &point, &zero, 3);
2487 secp256k1_ge_set_gej(&res2, &res1);
2488 CHECK(secp256k1_ge_is_infinity(&res2));
2489 secp256k1_ecmult_const(&res1, &point, &one, 2);
2490 secp256k1_ge_set_gej(&res2, &res1);
2492 secp256k1_ecmult_const(&res1, &point, &negone, 256);
2493 secp256k1_gej_neg(&res1, &res1);
2494 secp256k1_ge_set_gej(&res2, &res1);
2501 0x4968d524, 0x2abf9b7a, 0x466abbcf, 0x34b11b6d,
2502 0xcd83d307, 0x827bed62, 0x05fad0ce, 0x18fae63b
2505 0x5494c15d, 0x32099706, 0xc2395f94, 0x348745fd,
2506 0x757ce30e, 0x4e8c90fb, 0xa2bad184, 0xf883c69f,
2507 0x5d195d20, 0xe191bf7f, 0x1be3e55f, 0x56a80196,
2508 0x6071ad01, 0xf1462f66, 0xc997fa94, 0xdb858435
2514 secp256k1_gej_set_ge(&point, &secp256k1_ge_const_g);
2515 for (i = 0; i < 100; ++i) {
2517 secp256k1_ge_set_gej(&tmp, &point);
2518 secp256k1_ecmult_const(&point, &tmp, &scalar, 256);
2520 secp256k1_ge_set_gej(&res, &point);
2538 *sc = data->
sc[idx];
2539 *pt = data->
pt[idx];
2563 secp256k1_scalar_set_int(&szero, 0);
2566 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &r, NULL, ecmult_multi_callback, &data, 0));
2569 for (ncount = 0; ncount < count; ncount++) {
2576 secp256k1_gej_set_ge(&ptgj, &ptg);
2578 pt[1] = secp256k1_ge_const_g;
2581 secp256k1_ecmult(&ctx->
ecmult_ctx, &r2, &ptgj, &szero, &sc[0]);
2582 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &r, &sc[0], ecmult_multi_callback, &data, 0));
2583 secp256k1_gej_neg(&r2, &r2);
2584 secp256k1_gej_add_var(&r, &r, &r2, NULL);
2585 CHECK(secp256k1_gej_is_infinity(&r));
2588 secp256k1_ecmult(&ctx->
ecmult_ctx, &r2, &ptgj, &sc[0], &szero);
2589 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &r, &szero, ecmult_multi_callback, &data, 1));
2590 secp256k1_gej_neg(&r2, &r2);
2591 secp256k1_gej_add_var(&r, &r, &r2, NULL);
2592 CHECK(secp256k1_gej_is_infinity(&r));
2595 scratch_empty = secp256k1_scratch_create(&ctx->
error_callback, 0);
2596 CHECK(!ecmult_multi(&ctx->
ecmult_ctx, scratch_empty, &r, &szero, ecmult_multi_callback, &data, 1));
2597 secp256k1_scratch_destroy(scratch_empty);
2600 CHECK(!ecmult_multi(&ctx->
ecmult_ctx, scratch, &r, &szero, ecmult_multi_false_callback, &data, 1));
2603 secp256k1_ecmult(&ctx->
ecmult_ctx, &r2, &ptgj, &sc[0], &sc[1]);
2604 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &r, &szero, ecmult_multi_callback, &data, 2));
2605 secp256k1_gej_neg(&r2, &r2);
2606 secp256k1_gej_add_var(&r, &r, &r2, NULL);
2607 CHECK(secp256k1_gej_is_infinity(&r));
2610 secp256k1_ecmult(&ctx->
ecmult_ctx, &r2, &ptgj, &sc[0], &sc[1]);
2611 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &r, &sc[1], ecmult_multi_callback, &data, 1));
2612 secp256k1_gej_neg(&r2, &r2);
2613 secp256k1_gej_add_var(&r, &r, &r2, NULL);
2614 CHECK(secp256k1_gej_is_infinity(&r));
2618 for (ncount = 0; ncount < count; ncount++) {
2621 size_t sizes[] = { 2, 10, 32 };
2623 for (j = 0; j < 3; j++) {
2624 for (i = 0; i < 32; i++) {
2626 secp256k1_ge_set_infinity(&pt[i]);
2628 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &r, &szero, ecmult_multi_callback, &data, sizes[j]));
2629 CHECK(secp256k1_gej_is_infinity(&r));
2632 for (j = 0; j < 3; j++) {
2633 for (i = 0; i < 32; i++) {
2636 secp256k1_scalar_set_int(&sc[i], 0);
2638 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &r, &szero, ecmult_multi_callback, &data, sizes[j]));
2639 CHECK(secp256k1_gej_is_infinity(&r));
2642 for (j = 0; j < 3; j++) {
2644 for (i = 0; i < 16; i++) {
2646 secp256k1_scalar_negate(&sc[2*i + 1], &sc[2*i]);
2648 pt[2 * i + 1] = ptg;
2651 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &r, &szero, ecmult_multi_callback, &data, sizes[j]));
2652 CHECK(secp256k1_gej_is_infinity(&r));
2655 for (i = 0; i < 16; i++) {
2661 secp256k1_ge_neg(&pt[2*i+1], &pt[2*i]);
2664 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &r, &szero, ecmult_multi_callback, &data, sizes[j]));
2665 CHECK(secp256k1_gej_is_infinity(&r));
2669 secp256k1_scalar_set_int(&sc[0], 0);
2671 for (i = 1; i < 32; i++) {
2675 secp256k1_scalar_add(&sc[0], &sc[0], &sc[i]);
2676 secp256k1_scalar_negate(&sc[i], &sc[i]);
2679 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &r, &szero, ecmult_multi_callback, &data, 32));
2680 CHECK(secp256k1_gej_is_infinity(&r));
2684 for (ncount = 0; ncount < count; ncount++) {
2686 secp256k1_gej_set_infinity(&r);
2689 for (i = 0; i < 20; i++) {
2694 secp256k1_gej_add_ge_var(&r, &r, &pt[i], NULL);
2697 secp256k1_ecmult(&ctx->
ecmult_ctx, &r2, &r, &sc[0], &szero);
2698 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &r, &szero, ecmult_multi_callback, &data, 20));
2699 secp256k1_gej_neg(&r2, &r2);
2700 secp256k1_gej_add_var(&r, &r, &r2, NULL);
2701 CHECK(secp256k1_gej_is_infinity(&r));
2705 for (ncount = 0; ncount < count; ncount++) {
2710 secp256k1_scalar_set_int(&rs, 0);
2713 for (i = 0; i < 20; i++) {
2716 secp256k1_scalar_add(&rs, &rs, &sc[i]);
2719 secp256k1_gej_set_ge(&p0j, &pt[0]);
2720 secp256k1_ecmult(&ctx->
ecmult_ctx, &r2, &p0j, &rs, &szero);
2721 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &r, &szero, ecmult_multi_callback, &data, 20));
2722 secp256k1_gej_neg(&r2, &r2);
2723 secp256k1_gej_add_var(&r, &r, &r2, NULL);
2724 CHECK(secp256k1_gej_is_infinity(&r));
2728 for (ncount = 0; ncount < 20; ncount++) {
2733 secp256k1_scalar_clear(&sc[0]);
2734 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &r, &szero, ecmult_multi_callback, &data, 20));
2735 secp256k1_scalar_clear(&sc[1]);
2736 secp256k1_scalar_clear(&sc[2]);
2737 secp256k1_scalar_clear(&sc[3]);
2738 secp256k1_scalar_clear(&sc[4]);
2739 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &r, &szero, ecmult_multi_callback, &data, 6));
2740 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &r, &szero, ecmult_multi_callback, &data, 5));
2741 CHECK(secp256k1_gej_is_infinity(&r));
2745 const size_t TOP = 8;
2752 secp256k1_gej_set_ge(&ptgj, &ptg);
2754 for(t0i = 0; t0i < TOP; t0i++) {
2755 for(t1i = 0; t1i < TOP; t1i++) {
2759 secp256k1_scalar_set_int(&t0, (t0i + 1) / 2);
2760 secp256k1_scalar_cond_negate(&t0, t0i & 1);
2761 secp256k1_scalar_set_int(&t1, (t1i + 1) / 2);
2762 secp256k1_scalar_cond_negate(&t1, t1i & 1);
2764 secp256k1_ecmult(&ctx->
ecmult_ctx, &t0p, &ptgj, &t0, &szero);
2765 secp256k1_ecmult(&ctx->
ecmult_ctx, &t1p, &ptgj, &t1, &szero);
2767 for(s0i = 0; s0i < TOP; s0i++) {
2768 for(s1i = 0; s1i < TOP; s1i++) {
2772 secp256k1_ge_set_gej(&pt[0], &t0p);
2773 secp256k1_ge_set_gej(&pt[1], &t1p);
2775 secp256k1_scalar_set_int(&sc[0], (s0i + 1) / 2);
2776 secp256k1_scalar_cond_negate(&sc[0], s0i & 1);
2777 secp256k1_scalar_set_int(&sc[1], (s1i + 1) / 2);
2778 secp256k1_scalar_cond_negate(&sc[1], s1i & 1);
2780 secp256k1_scalar_mul(&tmp1, &t0, &sc[0]);
2781 secp256k1_scalar_mul(&tmp2, &t1, &sc[1]);
2782 secp256k1_scalar_add(&tmp1, &tmp1, &tmp2);
2784 secp256k1_ecmult(&ctx->
ecmult_ctx, &expected, &ptgj, &tmp1, &szero);
2785 CHECK(ecmult_multi(&ctx->
ecmult_ctx, scratch, &actual, &szero, ecmult_multi_callback, &data, 2));
2786 secp256k1_gej_neg(&expected, &expected);
2787 secp256k1_gej_add_var(&actual, &actual, &expected, NULL);
2788 CHECK(secp256k1_gej_is_infinity(&actual));
2799 CHECK(secp256k1_pippenger_bucket_window_inv(0) == 0);
2801 #ifdef USE_ENDOMORPHISM
2807 CHECK(secp256k1_pippenger_bucket_window(secp256k1_pippenger_bucket_window_inv(i)) == i);
2809 CHECK(secp256k1_pippenger_bucket_window(secp256k1_pippenger_bucket_window_inv(i)+1) > i);
2819 size_t scratch_size = secp256k1_rand_int(256);
2822 size_t n_points_supported;
2823 int bucket_window = 0;
2825 for(; scratch_size < max_size; scratch_size+=256) {
2826 scratch = secp256k1_scratch_create(&ctx->
error_callback, scratch_size);
2827 CHECK(scratch != NULL);
2828 n_points_supported = secp256k1_pippenger_max_points(scratch);
2829 if (n_points_supported == 0) {
2830 secp256k1_scratch_destroy(scratch);
2833 bucket_window = secp256k1_pippenger_bucket_window(n_points_supported);
2834 CHECK(secp256k1_scratch_allocate_frame(scratch, secp256k1_pippenger_scratch_size(n_points_supported, bucket_window),
PIPPENGER_SCRATCH_OBJECTS));
2835 secp256k1_scratch_deallocate_frame(scratch);
2836 secp256k1_scratch_destroy(scratch);
2857 secp256k1_gej_set_infinity(&r2);
2858 secp256k1_scalar_set_int(&szero, 0);
2862 secp256k1_ecmult(&ctx->
ecmult_ctx, &r2, &r2, &szero, &scG);
2863 for(i = 0; i < n_points; i++) {
2867 secp256k1_gej_set_ge(&ptgj, &ptg);
2870 secp256k1_ecmult(&ctx->
ecmult_ctx, &ptgj, &ptgj, &sc[i], NULL);
2871 secp256k1_gej_add_var(&r2, &r2, &ptgj, NULL);
2878 CHECK(!secp256k1_ecmult_multi_var(&ctx->
ecmult_ctx, scratch, &r, &scG, ecmult_multi_callback, &data, 1));
2879 secp256k1_scratch_destroy(scratch);
2884 CHECK(!secp256k1_ecmult_multi_var(&ctx->
ecmult_ctx, scratch, &r, &scG, ecmult_multi_callback, &data, 1));
2885 secp256k1_scratch_destroy(scratch);
2887 secp256k1_gej_neg(&r2, &r2);
2888 for(i = 1; i <= n_points; i++) {
2890 int bucket_window = secp256k1_pippenger_bucket_window(i);
2891 size_t scratch_size = secp256k1_pippenger_scratch_size(i, bucket_window);
2894 size_t scratch_size = secp256k1_strauss_scratch_size(i);
2897 CHECK(secp256k1_ecmult_multi_var(&ctx->
ecmult_ctx, scratch, &r, &scG, ecmult_multi_callback, &data, n_points));
2898 secp256k1_gej_add_var(&r, &r, &r2, NULL);
2899 CHECK(secp256k1_gej_is_infinity(&r));
2900 secp256k1_scratch_destroy(scratch);
2911 scratch = secp256k1_scratch_create(&ctx->
error_callback, 819200);
2915 secp256k1_scratch_destroy(scratch);
2920 secp256k1_scratch_destroy(scratch);
2931 secp256k1_scalar_set_int(&x, 0);
2932 secp256k1_scalar_set_int(&two, 2);
2933 bits = secp256k1_ecmult_wnaf(wnaf, 256, number, w);
2935 for (i = bits-1; i >= 0; i--) {
2937 secp256k1_scalar_mul(&x, &x, &two);
2939 CHECK(zeroes == -1 || zeroes >= w-1);
2941 CHECK((v & 1) == 1);
2942 CHECK(v <= (1 << (w-1)) - 1);
2943 CHECK(v >= -(1 << (w-1)) - 1);
2945 CHECK(zeroes != -1);
2949 secp256k1_scalar_set_int(&t, v);
2951 secp256k1_scalar_set_int(&t, -v);
2952 secp256k1_scalar_negate(&t, &t);
2954 secp256k1_scalar_add(&x, &x, &t);
2956 CHECK(secp256k1_scalar_eq(&x, number));
2965 if (!secp256k1_scalar_get_bits(&neg1, 0, 1)) {
2966 secp256k1_scalar_negate(&neg1, &neg1);
2969 sign2 = secp256k1_scalar_cond_negate(&neg2, secp256k1_scalar_is_even(&neg2));
2970 CHECK(sign1 == sign2);
2971 CHECK(secp256k1_scalar_eq(&neg1, &neg2));
2976 int wnaf[256] = {0};
2982 secp256k1_scalar_set_int(&x, 0);
2983 secp256k1_scalar_set_int(&shift, 1 << w);
2985 #ifdef USE_ENDOMORPHISM
2986 for (i = 0; i < 16; ++i) {
2987 secp256k1_scalar_shr_int(&num, 8);
2991 skew = secp256k1_wnaf_const(wnaf, num, w, bits);
2998 CHECK(v > -(1 << w));
2999 CHECK(v < (1 << w));
3001 secp256k1_scalar_mul(&x, &x, &shift);
3003 secp256k1_scalar_set_int(&t, v);
3005 secp256k1_scalar_set_int(&t, -v);
3006 secp256k1_scalar_negate(&t, &t);
3008 secp256k1_scalar_add(&x, &x, &t);
3011 secp256k1_scalar_cadd_bit(&num, skew == 2, 1);
3012 CHECK(secp256k1_scalar_eq(&x, &num));
3017 int wnaf[256] = {0};
3022 secp256k1_scalar_set_int(&x, 0);
3023 secp256k1_scalar_set_int(&shift, 1 << w);
3025 #ifdef USE_ENDOMORPHISM
3026 for (i = 0; i < 16; ++i) {
3027 secp256k1_scalar_shr_int(&num, 8);
3030 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
3035 CHECK(v == 0 || v & 1);
3036 CHECK(v > -(1 << w));
3037 CHECK(v < (1 << w));
3039 secp256k1_scalar_mul(&x, &x, &shift);
3041 secp256k1_scalar_set_int(&t, v);
3043 secp256k1_scalar_set_int(&t, -v);
3044 secp256k1_scalar_negate(&t, &t);
3046 secp256k1_scalar_add(&x, &x, &t);
3049 secp256k1_scalar_cadd_bit(&num, 0, skew == 1);
3050 CHECK(secp256k1_scalar_eq(&x, &num));
3058 CHECK(wnaf[i] == 0);
3060 for (i = 7; i >= 0; --i) {
3061 CHECK(wnaf[i] == wnaf_expected[i]);
3067 int wnaf[256] = {0};
3072 secp256k1_scalar_set_int(&num, 0);
3073 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
3080 secp256k1_scalar_set_int(&num, 1);
3081 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
3086 CHECK(wnaf[0] == 1);
3090 int wnaf_expected[8] = { 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf };
3091 secp256k1_scalar_set_int(&num, 0xffffffff);
3092 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
3097 int wnaf_expected[8] = { -1, -1, -1, -1, -1, -1, -1, 0xf };
3098 secp256k1_scalar_set_int(&num, 0xeeeeeeee);
3099 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
3104 int wnaf_expected[8] = { 1, 0, 1, 0, 1, 0, 1, 0 };
3105 secp256k1_scalar_set_int(&num, 0x01010101);
3106 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
3111 int wnaf_expected[8] = { -0xf, 0, 0xf, -0xf, 0, 0xf, 1, 0 };
3112 secp256k1_scalar_set_int(&num, 0x01ef1ef1);
3113 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
3132 for (i = 0; i < count; i++) {
3139 secp256k1_scalar_set_int(&n, 0);
3140 CHECK(secp256k1_scalar_cond_negate(&n, 1) == -1);
3141 CHECK(secp256k1_scalar_is_zero(&n));
3142 CHECK(secp256k1_scalar_cond_negate(&n, 0) == 1);
3143 CHECK(secp256k1_scalar_is_zero(&n));
3153 secp256k1_ge_neg(&ng, &secp256k1_ge_const_g);
3154 for (i = 0; i < 36; i++ ) {
3155 secp256k1_scalar_set_int(&x, i);
3157 for (j = 0; j < i; j++) {
3161 secp256k1_gej_add_ge(&r, &r, &ng);
3163 CHECK(secp256k1_gej_is_infinity(&r));
3165 for (i = 1; i <= 36; i++ ) {
3166 secp256k1_scalar_set_int(&x, i);
3167 secp256k1_scalar_negate(&x, &x);
3169 for (j = 0; j < i; j++) {
3173 secp256k1_gej_add_ge(&r, &r, &secp256k1_ge_const_g);
3175 CHECK(secp256k1_gej_is_infinity(&r));
3187 unsigned char seed32[32];
3194 secp256k1_rand256(seed32);
3202 secp256k1_ge_set_gej(&pge, &pgej);
3221 for (i = 0; i < 10; i++) {
3226 #ifdef USE_ENDOMORPHISM
3228 void test_scalar_split(
void) {
3231 const unsigned char zero[32] = {0};
3232 unsigned char tmp[32];
3235 secp256k1_scalar_split_lambda(&s1, &slam, &full);
3238 if (secp256k1_scalar_is_high(&s1)) {
3239 secp256k1_scalar_negate(&s1, &s1);
3241 if (secp256k1_scalar_is_high(&slam)) {
3242 secp256k1_scalar_negate(&slam, &slam);
3245 secp256k1_scalar_get_b32(tmp, &s1);
3246 CHECK(memcmp(zero, tmp, 16) == 0);
3247 secp256k1_scalar_get_b32(tmp, &slam);
3248 CHECK(memcmp(zero, tmp, 16) == 0);
3251 void run_endomorphism_tests(
void) {
3252 test_scalar_split();
3257 unsigned char pubkeyc[65];
3264 for (pubkeyclen = 3; pubkeyclen <= 65; pubkeyclen++) {
3267 memcpy(&pubkeyc[1], input, 64);
3268 VG_UNDEF(&pubkeyc[pubkeyclen], 65 - pubkeyclen);
3269 for (i = 0; i < 256; i++) {
3276 ysign = (input[63] & 1) + 2;
3278 xpass = xvalid && (pubkeyclen == 33) && ((i & 254) == 2);
3280 ypass = xvalid && yvalid && ((i & 4) == ((pubkeyclen == 65) << 2)) &&
3281 ((i == 4) || ((i & 251) == ysign)) && ((pubkeyclen == 33) || (pubkeyclen == 65));
3282 if (xpass || ypass) {
3284 unsigned char pubkeyo[65];
3286 memset(&pubkey, 0,
sizeof(pubkey));
3296 CHECK(memcmp(&pubkeyo[1], &pubkeyc[1], 32) == 0);
3297 CHECK((pubkeyclen != 33) || (pubkeyo[0] == pubkeyc[0]));
3300 CHECK(pubkeyo[0] == ysign);
3301 CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 1);
3302 memset(&pubkey, 0,
sizeof(pubkey));
3304 secp256k1_pubkey_save(&pubkey, &ge);
3311 CHECK(pubkeyo[0] == 4);
3312 CHECK(memcmp(&pubkeyo[1], input, 64) == 0);
3317 memset(&pubkey, 0xfe,
sizeof(pubkey));
3323 CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);
3332 #define SECP256K1_EC_PARSE_TEST_NVALID (12)
3336 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x52,
3337 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3338 0x00, 0x00, 0x64, 0xef, 0xa1, 0x7b, 0x77, 0x61, 0xe1, 0xe4, 0x27, 0x06, 0x98, 0x9f, 0xb4, 0x83,
3339 0xb8, 0xd2, 0xd4, 0x9b, 0xf7, 0x8f, 0xae, 0x98, 0x03, 0xf0, 0x99, 0xb8, 0x34, 0xed, 0xeb, 0x00
3343 0x7a, 0xe9, 0x6a, 0x2b, 0x65, 0x7c, 0x07, 0x10, 0x6e, 0x64, 0x47, 0x9e, 0xac, 0x34, 0x34, 0xe9,
3344 0x9c, 0xf0, 0x49, 0x75, 0x12, 0xf5, 0x89, 0x95, 0xc1, 0x39, 0x6c, 0x28, 0x71, 0x95, 0x01, 0xee,
3345 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14,
3346 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee,
3350 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3351 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2c,
3352 0x0e, 0x99, 0x4b, 0x14, 0xea, 0x72, 0xf8, 0xc3, 0xeb, 0x95, 0xc7, 0x1e, 0xf6, 0x92, 0x57, 0x5e,
3353 0x77, 0x50, 0x58, 0x33, 0x2d, 0x7e, 0x52, 0xd0, 0x99, 0x5c, 0xf8, 0x03, 0x88, 0x71, 0xb6, 0x7d,
3357 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3358 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2c,
3359 0xf1, 0x66, 0xb4, 0xeb, 0x15, 0x8d, 0x07, 0x3c, 0x14, 0x6a, 0x38, 0xe1, 0x09, 0x6d, 0xa8, 0xa1,
3360 0x88, 0xaf, 0xa7, 0xcc, 0xd2, 0x81, 0xad, 0x2f, 0x66, 0xa3, 0x07, 0xfb, 0x77, 0x8e, 0x45, 0xb2,
3364 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3365 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
3366 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14,
3367 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee,
3371 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3372 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
3373 0xbd, 0xe7, 0x0d, 0xf5, 0x19, 0x39, 0xb9, 0x4c, 0x9c, 0x24, 0x97, 0x9f, 0xa7, 0xdd, 0x04, 0xeb,
3374 0xd9, 0xb3, 0x57, 0x2d, 0xa7, 0x80, 0x22, 0x90, 0x43, 0x8a, 0xf2, 0xa6, 0x81, 0x89, 0x54, 0x41,
3378 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6,
3379 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07,
3380 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3381 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
3385 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c,
3386 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73,
3387 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3388 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
3392 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc,
3393 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5,
3394 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3395 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
3399 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6,
3400 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07,
3401 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3402 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
3406 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c,
3407 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73,
3408 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3409 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
3413 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc,
3414 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5,
3415 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3416 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01
3419 #define SECP256K1_EC_PARSE_TEST_NXVALID (4)
3423 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6,
3424 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07,
3425 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3426 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
3430 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c,
3431 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73,
3432 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3433 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
3437 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc,
3438 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5,
3439 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3440 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
3444 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3445 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
3446 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3447 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03
3450 #define SECP256K1_EC_PARSE_TEST_NINVALID (7)
3454 0x0a, 0x2d, 0x2b, 0xa9, 0x35, 0x07, 0xf1, 0xdf, 0x23, 0x37, 0x70, 0xc2, 0xa7, 0x97, 0x96, 0x2c,
3455 0xc6, 0x1f, 0x6d, 0x15, 0xda, 0x14, 0xec, 0xd4, 0x7d, 0x8d, 0x27, 0xae, 0x1c, 0xd5, 0xf8, 0x53,
3456 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3457 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
3461 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3462 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
3463 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14,
3464 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee,
3468 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3469 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
3470 0xbd, 0xe7, 0x0d, 0xf5, 0x19, 0x39, 0xb9, 0x4c, 0x9c, 0x24, 0x97, 0x9f, 0xa7, 0xdd, 0x04, 0xeb,
3471 0xd9, 0xb3, 0x57, 0x2d, 0xa7, 0x80, 0x22, 0x90, 0x43, 0x8a, 0xf2, 0xa6, 0x81, 0x89, 0x54, 0x41,
3475 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3476 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
3477 0xf4, 0x84, 0x14, 0x5c, 0xb0, 0x14, 0x9b, 0x82, 0x5d, 0xff, 0x41, 0x2f, 0xa0, 0x52, 0xa8, 0x3f,
3478 0xcb, 0x72, 0xdb, 0x61, 0xd5, 0x6f, 0x37, 0x70, 0xce, 0x06, 0x6b, 0x73, 0x49, 0xa2, 0xaa, 0x28,
3482 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3483 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
3484 0x0b, 0x7b, 0xeb, 0xa3, 0x4f, 0xeb, 0x64, 0x7d, 0xa2, 0x00, 0xbe, 0xd0, 0x5f, 0xad, 0x57, 0xc0,
3485 0x34, 0x8d, 0x24, 0x9e, 0x2a, 0x90, 0xc8, 0x8f, 0x31, 0xf9, 0x94, 0x8b, 0xb6, 0x5d, 0x52, 0x07,
3489 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3490 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3491 0x8f, 0x53, 0x7e, 0xef, 0xdf, 0xc1, 0x60, 0x6a, 0x07, 0x27, 0xcd, 0x69, 0xb4, 0xa7, 0x33, 0x3d,
3492 0x38, 0xed, 0x44, 0xe3, 0x93, 0x2a, 0x71, 0x79, 0xee, 0xcb, 0x4b, 0x6f, 0xba, 0x93, 0x60, 0xdc,
3496 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3497 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3498 0x70, 0xac, 0x81, 0x10, 0x20, 0x3e, 0x9f, 0x95, 0xf8, 0xd8, 0x32, 0x96, 0x4b, 0x58, 0xcc, 0xc2,
3499 0xc7, 0x12, 0xbb, 0x1c, 0x6c, 0xd5, 0x8e, 0x86, 0x11, 0x34, 0xb4, 0x8f, 0x45, 0x6c, 0x9b, 0x53
3502 const unsigned char pubkeyc[66] = {
3504 0x04, 0x79, 0xBE, 0x66, 0x7E, 0xF9, 0xDC, 0xBB, 0xAC, 0x55, 0xA0, 0x62, 0x95, 0xCE, 0x87, 0x0B,
3505 0x07, 0x02, 0x9B, 0xFC, 0xDB, 0x2D, 0xCE, 0x28, 0xD9, 0x59, 0xF2, 0x81, 0x5B, 0x16, 0xF8, 0x17,
3506 0x98, 0x48, 0x3A, 0xDA, 0x77, 0x26, 0xA3, 0xC4, 0x65, 0x5D, 0xA4, 0xFB, 0xFC, 0x0E, 0x11, 0x08,
3507 0xA8, 0xFD, 0x17, 0xB4, 0x48, 0xA6, 0x85, 0x54, 0x19, 0x9C, 0x47, 0xD0, 0x8F, 0xFB, 0x10, 0xD4,
3510 unsigned char sout[65];
3511 unsigned char shortkey[2];
3523 memset(&pubkey, 0xfe,
sizeof(pubkey));
3530 CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);
3533 for (i = 0; i < 256 ; i++) {
3534 memset(&pubkey, 0xfe,
sizeof(pubkey));
3542 CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);
3546 for (i = 0; i < 65536 ; i++) {
3547 memset(&pubkey, 0xfe,
sizeof(pubkey));
3549 shortkey[0] = i & 255;
3550 shortkey[1] = i >> 8;
3555 CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);
3558 memset(&pubkey, 0xfe,
sizeof(pubkey));
3565 CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);
3571 memset(&pubkey, 0xfe,
sizeof(pubkey));
3577 CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);
3580 memset(&pubkey, 0xfe,
sizeof(pubkey));
3586 CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);
3589 memset(&pubkey, 0xfe,
sizeof(pubkey));
3595 CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);
3598 memset(&pubkey, 0,
sizeof(pubkey));
3605 CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 1);
3644 CHECK(ecount2 == 10);
3659 const unsigned char orderc[32] = {
3660 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3661 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
3662 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
3663 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41
3666 unsigned char ctmp[33];
3667 unsigned char ctmp2[33];
3682 memset(ctmp, 255, 32);
3684 memset(&pubkey, 1,
sizeof(pubkey));
3690 memset(ctmp, 0, 32);
3692 memset(&pubkey, 1,
sizeof(pubkey));
3700 memset(&pubkey, 0,
sizeof(pubkey));
3705 pubkey_one = pubkey;
3707 memcpy(ctmp, orderc, 32);
3710 memset(&pubkey, 1,
sizeof(pubkey));
3718 memset(&pubkey, 0,
sizeof(pubkey));
3723 pubkey_negone = pubkey;
3725 memset(ctmp2, 0, 32);
3727 CHECK(memcmp(orderc, ctmp, 31) == 0 && ctmp[31] == 0x40);
3728 memcpy(&pubkey2, &pubkey,
sizeof(pubkey));
3730 CHECK(memcmp(&pubkey, &pubkey2,
sizeof(pubkey)) == 0);
3733 CHECK(memcmp(zeros, ctmp, 32) == 0);
3735 CHECK(memcmp(&pubkey, zeros,
sizeof(pubkey)) == 0);
3736 memcpy(&pubkey, &pubkey2,
sizeof(pubkey));
3738 memcpy(ctmp, orderc, 32);
3741 CHECK(memcmp(zeros, ctmp, 32) == 0);
3742 memcpy(ctmp, orderc, 32);
3745 CHECK(memcmp(zeros, ctmp, 32) == 0);
3746 memcpy(ctmp, orderc, 32);
3749 CHECK(memcmp(&pubkey, zeros,
sizeof(pubkey)) == 0);
3750 memcpy(&pubkey, &pubkey2,
sizeof(pubkey));
3752 CHECK(memcmp(&pubkey, zeros,
sizeof(pubkey)) == 0);
3753 memcpy(&pubkey, &pubkey2,
sizeof(pubkey));
3757 CHECK(memcmp(zeros, ctmp2, 32) == 0);
3760 CHECK(memcmp(&pubkey, zeros,
sizeof(pubkey)) == 0);
3761 memcpy(&pubkey, &pubkey2,
sizeof(pubkey));
3765 CHECK(memcmp(ctmp2, zeros, 31) == 0 && ctmp2[31] == 1);
3770 CHECK(memcmp(&pubkey, &pubkey2,
sizeof(pubkey)) == 0);
3775 CHECK(memcmp(&pubkey, &pubkey2,
sizeof(pubkey)) == 0);
3781 memset(&pubkey, 0, 32);
3784 CHECK(memcmp(&pubkey, zeros,
sizeof(pubkey)) == 0);
3785 memcpy(&pubkey, &pubkey2,
sizeof(pubkey));
3786 memset(&pubkey2, 0, 32);
3789 CHECK(memcmp(&pubkey2, zeros,
sizeof(pubkey2)) == 0);
3797 memset(ctmp2, 0, 32);
3804 memset(ctmp2, 0, 32);
3811 memset(ctmp2, 0, 32);
3817 memset(ctmp2, 0, 32);
3826 memset(&pubkey, 1,
sizeof(pubkey));
3832 pubkeys[0] = &pubkey_one;
3851 pubkeys[0] = &pubkey_negone;
3861 CHECK(memcmp(ctmp, ctmp2, 33) == 0);
3863 pubkeys[0] = &pubkey_one;
3864 pubkeys[1] = &pubkey_negone;
3872 pubkeys[2] = &pubkey_one;
3882 CHECK(memcmp(ctmp, ctmp2, 33) == 0);
3884 pubkeys[1] = &pubkey_one;
3898 }
while(!secp256k1_ecdsa_sig_sign(&ctx->
ecmult_gen_ctx, sigr, sigs, key, msg, &
nonce, recid));
3912 secp256k1_ge_set_gej(&pub, &pubj);
3913 getrec = secp256k1_rand_bits(1);
3914 random_sign(&sigr, &sigs, &key, &msg, getrec?&recid:NULL);
3916 CHECK(recid >= 0 && recid < 4);
3918 CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sigr, &sigs, &pub, &msg));
3919 secp256k1_scalar_set_int(&one, 1);
3920 secp256k1_scalar_add(&msg, &msg, &one);
3921 CHECK(!secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sigr, &sigs, &pub, &msg));
3926 for (i = 0; i < 10*count; i++) {
3932 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) {
3936 memcpy(nonce32, data, 32);
3937 return (counter == 0);
3940 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) {
3945 return nonce_function_rfc6979(nonce32, msg32, key32, algo16, data, counter - 1);
3948 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) {
3951 memset(nonce32, counter==0 ? 0 : 255, 32);
3958 static const unsigned char order[] = {
3959 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
3960 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
3961 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,
3962 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x41
3964 memcpy(nonce32, order, 32);
3975 return nonce_function_rfc6979(nonce32, msg32, key32, algo16, data, counter - 5);
3984 unsigned char extra[32] = {0x00};
3985 unsigned char privkey[32];
3986 unsigned char message[32];
3987 unsigned char privkey2[32];
3990 unsigned char sig[74];
3992 unsigned char pubkeyc[65];
3993 size_t pubkeyclen = 65;
3996 unsigned char seckey[300];
3997 size_t seckeylen = 300;
4004 secp256k1_scalar_get_b32(privkey, &key);
4005 secp256k1_scalar_get_b32(message, &msg);
4014 memset(&pubkey, 0,
sizeof(pubkey));
4018 memcpy(&pubkey_tmp, &pubkey,
sizeof(pubkey));
4020 CHECK(memcmp(&pubkey_tmp, &pubkey,
sizeof(pubkey)) != 0);
4022 CHECK(memcmp(&pubkey_tmp, &pubkey,
sizeof(pubkey)) == 0);
4027 CHECK(memcmp(privkey, privkey2, 32) == 0);
4030 if (secp256k1_rand_int(3) == 0) {
4033 unsigned char rnd[32];
4035 secp256k1_rand256_test(rnd);
4038 CHECK(ret1 == ret2);
4043 CHECK(memcmp(&pubkey, &pubkey2,
sizeof(pubkey)) == 0);
4047 if (secp256k1_rand_int(3) == 0) {
4050 unsigned char rnd[32];
4052 secp256k1_rand256_test(rnd);
4055 CHECK(ret1 == ret2);
4060 CHECK(memcmp(&pubkey, &pubkey2,
sizeof(pubkey)) == 0);
4072 CHECK(memcmp(&signature[0], &signature[4],
sizeof(signature[0])) == 0);
4073 CHECK(memcmp(&signature[0], &signature[1],
sizeof(signature[0])) != 0);
4074 CHECK(memcmp(&signature[0], &signature[2],
sizeof(signature[0])) != 0);
4075 CHECK(memcmp(&signature[0], &signature[3],
sizeof(signature[0])) != 0);
4076 CHECK(memcmp(&signature[1], &signature[2],
sizeof(signature[0])) != 0);
4077 CHECK(memcmp(&signature[1], &signature[3],
sizeof(signature[0])) != 0);
4078 CHECK(memcmp(&signature[2], &signature[3],
sizeof(signature[0])) != 0);
4086 secp256k1_ecdsa_signature_load(ctx, &r, &s, &signature[0]);
4087 secp256k1_scalar_negate(&s, &s);
4088 secp256k1_ecdsa_signature_save(&signature[5], &r, &s);
4095 secp256k1_scalar_negate(&s, &s);
4096 secp256k1_ecdsa_signature_save(&signature[5], &r, &s);
4099 CHECK(memcmp(&signature[5], &signature[0], 64) == 0);
4103 memset(&signature[0], 0,
sizeof(signature[0]));
4109 sig[secp256k1_rand_int(siglen)] += 1 + secp256k1_rand_int(255);
4117 unsigned char in[65];
4119 size_t len = secp256k1_rand_bits(2) == 0 ? 65 : 33;
4120 if (secp256k1_rand_bits(2) == 0) {
4121 len = secp256k1_rand_bits(6);
4124 in[0] = secp256k1_rand_bits(1) ? 4 : (secp256k1_rand_bits(1) ? 6 : 7);
4126 in[0] = secp256k1_rand_bits(1) ? 2 : 3;
4128 if (secp256k1_rand_bits(3) == 0) {
4129 in[0] = secp256k1_rand_bits(8);
4132 secp256k1_rand256(&in[1]);
4135 secp256k1_rand256(&in[33]);
4137 if (secp256k1_eckey_pubkey_parse(&elem, in, len)) {
4138 unsigned char out[65];
4139 unsigned char firstb;
4144 CHECK(secp256k1_eckey_pubkey_serialize(&elem, out, &size, len == 33));
4146 CHECK(memcmp(&in[1], &out[1], len-1) == 0);
4148 if ((in[0] != 6) && (in[0] != 7)) {
4149 CHECK(in[0] == out[0]);
4152 CHECK(secp256k1_eckey_pubkey_serialize(&elem, in, &size, 0));
4154 CHECK(secp256k1_eckey_pubkey_parse(&elem2, in, size));
4157 in[0] = secp256k1_rand_bits(1) ? 6 : 7;
4158 res = secp256k1_eckey_pubkey_parse(&elem2, in, size);
4159 if (firstb == 2 || firstb == 3) {
4160 if (in[0] == firstb + 4) {
4168 CHECK(secp256k1_eckey_pubkey_serialize(&elem, out, &size, 0));
4169 CHECK(memcmp(&in[1], &out[1], 64) == 0);
4176 for (i = 0; i < 10*count; i++) {
4183 for (i = 0; i < 64*count; i++) {
4189 static const unsigned char zeroes[32] = {0};
4190 #ifdef ENABLE_OPENSSL_TESTS
4191 static const unsigned char max_scalar[32] = {
4192 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
4193 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
4194 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
4195 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40
4202 unsigned char roundtrip_der[2048];
4203 unsigned char compact_der[64];
4204 size_t len_der = 2048;
4205 int parsed_der = 0, valid_der = 0, roundtrips_der = 0;
4208 unsigned char roundtrip_der_lax[2048];
4209 unsigned char compact_der_lax[64];
4210 size_t len_der_lax = 2048;
4211 int parsed_der_lax = 0, valid_der_lax = 0, roundtrips_der_lax = 0;
4213 #ifdef ENABLE_OPENSSL_TESTS
4214 ECDSA_SIG *sig_openssl;
4215 const BIGNUM *r = NULL, *s = NULL;
4216 const unsigned char *sigptr;
4217 unsigned char roundtrip_openssl[2048];
4218 int len_openssl = 2048;
4219 int parsed_openssl, valid_openssl = 0, roundtrips_openssl = 0;
4225 valid_der = (memcmp(compact_der, zeroes, 32) != 0) && (memcmp(compact_der + 32, zeroes, 32) != 0);
4229 roundtrips_der = (len_der == siglen) && memcmp(roundtrip_der, sig, siglen) == 0;
4233 if (parsed_der_lax) {
4235 valid_der_lax = (memcmp(compact_der_lax, zeroes, 32) != 0) && (memcmp(compact_der_lax + 32, zeroes, 32) != 0);
4237 if (valid_der_lax) {
4239 roundtrips_der_lax = (len_der_lax == siglen) && memcmp(roundtrip_der_lax, sig, siglen) == 0;
4242 if (certainly_der) {
4243 ret |= (!parsed_der) << 2;
4245 if (certainly_not_der) {
4246 ret |= (parsed_der) << 17;
4249 ret |= (!roundtrips_der) << 3;
4253 ret |= (!roundtrips_der_lax) << 12;
4254 ret |= (len_der != len_der_lax) << 13;
4255 ret |= (memcmp(roundtrip_der_lax, roundtrip_der, len_der) != 0) << 14;
4257 ret |= (roundtrips_der != roundtrips_der_lax) << 15;
4259 ret |= (!parsed_der_lax) << 16;
4262 #ifdef ENABLE_OPENSSL_TESTS
4263 sig_openssl = ECDSA_SIG_new();
4265 parsed_openssl = (d2i_ECDSA_SIG(&sig_openssl, &sigptr, siglen) != NULL);
4266 if (parsed_openssl) {
4267 ECDSA_SIG_get0(sig_openssl, &r, &s);
4268 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;
4269 if (valid_openssl) {
4270 unsigned char tmp[32] = {0};
4271 BN_bn2bin(r, tmp + 32 - BN_num_bytes(r));
4272 valid_openssl = memcmp(tmp, max_scalar, 32) < 0;
4274 if (valid_openssl) {
4275 unsigned char tmp[32] = {0};
4276 BN_bn2bin(s, tmp + 32 - BN_num_bytes(s));
4277 valid_openssl = memcmp(tmp, max_scalar, 32) < 0;
4280 len_openssl = i2d_ECDSA_SIG(sig_openssl, NULL);
4281 if (len_openssl <= 2048) {
4282 unsigned char *ptr = roundtrip_openssl;
4283 CHECK(i2d_ECDSA_SIG(sig_openssl, &ptr) == len_openssl);
4284 roundtrips_openssl = valid_openssl && ((size_t)len_openssl == siglen) && (memcmp(roundtrip_openssl, sig, siglen) == 0);
4288 ECDSA_SIG_free(sig_openssl);
4290 ret |= (parsed_der && !parsed_openssl) << 4;
4291 ret |= (valid_der && !valid_openssl) << 5;
4292 ret |= (roundtrips_openssl && !parsed_der) << 6;
4293 ret |= (roundtrips_der != roundtrips_openssl) << 7;
4294 if (roundtrips_openssl) {
4295 ret |= (len_der != (size_t)len_openssl) << 8;
4296 ret |= (memcmp(roundtrip_der, roundtrip_openssl, len_der) != 0) << 9;
4302 static void assign_big_endian(
unsigned char *ptr,
size_t ptrlen, uint32_t val) {
4304 for (i = 0; i < ptrlen; i++) {
4305 int shift = ptrlen - 1 - i;
4309 ptr[i] = (val >> shift) & 0xFF;
4314 static void damage_array(
unsigned char *sig,
size_t *len) {
4316 int action = secp256k1_rand_bits(3);
4317 if (action < 1 && *len > 3) {
4319 pos = secp256k1_rand_int(*len);
4320 memmove(sig + pos, sig + pos + 1, *len - pos - 1);
4323 }
else if (action < 2 && *len < 2048) {
4325 pos = secp256k1_rand_int(1 + *len);
4326 memmove(sig + pos + 1, sig + pos, *len - pos);
4327 sig[pos] = secp256k1_rand_bits(8);
4330 }
else if (action < 4) {
4332 sig[secp256k1_rand_int(*len)] += 1 + secp256k1_rand_int(255);
4336 sig[secp256k1_rand_int(*len)] ^= 1 << secp256k1_rand_bits(3);
4341 static void random_ber_signature(
unsigned char *sig,
size_t *len,
int* certainly_der,
int* certainly_not_der) {
4343 int nlow[2], nlen[2], nlenlen[2], nhbit[2], nhbyte[2], nzlen[2];
4344 size_t tlen, elen, glen;
4349 der = secp256k1_rand_bits(2) == 0;
4350 *certainly_der = der;
4351 *certainly_not_der = 0;
4352 indet = der ? 0 : secp256k1_rand_int(10) == 0;
4354 for (n = 0; n < 2; n++) {
4356 nlow[n] = der ? 1 : (secp256k1_rand_bits(3) != 0);
4358 nlen[n] = nlow[n] ? secp256k1_rand_int(33) : 32 + secp256k1_rand_int(200) * secp256k1_rand_int(8) / 8;
4359 CHECK(nlen[n] <= 232);
4361 nhbit[n] = (nlow[n] == 0 && nlen[n] == 32) ? 1 : (nlen[n] == 0 ? 0 : secp256k1_rand_bits(1));
4363 nhbyte[n] = nlen[n] == 0 ? 0 : (nhbit[n] ? 128 + secp256k1_rand_bits(7) : 1 + secp256k1_rand_int(127));
4365 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);
4366 if (nzlen[n] > ((nlen[n] == 0 || nhbit[n]) ? 1 : 0)) {
4367 *certainly_not_der = 1;
4369 CHECK(nlen[n] + nzlen[n] <= 300);
4371 nlenlen[n] = nlen[n] + nzlen[n] < 128 ? 0 : (nlen[n] + nzlen[n] < 256 ? 1 : 2);
4374 int add = secp256k1_rand_int(127 - nlenlen[n]) * secp256k1_rand_int(16) * secp256k1_rand_int(16) / 256;
4377 *certainly_not_der = 1;
4380 CHECK(nlen[n] + nzlen[n] + nlenlen[n] <= 427);
4384 tlen = 2 + nlenlen[0] + nlen[0] + nzlen[0] + 2 + nlenlen[1] + nlen[1] + nzlen[1];
4388 elen = (der || indet) ? 0 : secp256k1_rand_int(980 - tlen) * secp256k1_rand_int(8) / 8;
4390 *certainly_not_der = 1;
4396 glen = der ? 0 : secp256k1_rand_int(990 - tlen) * secp256k1_rand_int(8) / 8;
4398 *certainly_not_der = 1;
4400 CHECK(tlen + glen <= 990);
4403 sig[(*len)++] = 0x30;
4406 sig[(*len)++] = 0x80;
4407 *certainly_not_der = 1;
4409 int tlenlen = tlen < 128 ? 0 : (tlen < 256 ? 1 : 2);
4411 int add = secp256k1_rand_int(127 - tlenlen) * secp256k1_rand_int(16) * secp256k1_rand_int(16) / 256;
4414 *certainly_not_der = 1;
4419 sig[(*len)++] = tlen;
4422 sig[(*len)++] = 128 + tlenlen;
4423 assign_big_endian(sig + *len, tlenlen, tlen);
4429 CHECK(tlen + glen <= 1119);
4431 for (n = 0; n < 2; n++) {
4433 sig[(*len)++] = 0x02;
4434 if (nlenlen[n] == 0) {
4436 sig[(*len)++] = nlen[n] + nzlen[n];
4439 sig[(*len)++] = 128 + nlenlen[n];
4440 assign_big_endian(sig + *len, nlenlen[n], nlen[n] + nzlen[n]);
4444 while (nzlen[n] > 0) {
4445 sig[(*len)++] = 0x00;
4448 if (nlen[n] == 32 && !nlow[n]) {
4451 for (i = 0; i < 16; i++) {
4452 sig[(*len)++] = 0xFF;
4458 sig[(*len)++] = nhbyte[n];
4462 secp256k1_rand_bytes_test(sig + *len, nlen[n]);
4468 secp256k1_rand_bytes_test(sig + *len, elen);
4477 CHECK(tlen + glen <= 1121);
4480 secp256k1_rand_bytes_test(sig + *len, glen);
4483 CHECK(tlen <= 1121);
4484 CHECK(tlen == *len);
4489 for (i = 0; i < 200 * count; i++) {
4490 unsigned char buffer[2048];
4492 int certainly_der = 0;
4493 int certainly_not_der = 0;
4494 random_ber_signature(
buffer, &buflen, &certainly_der, &certainly_not_der);
4495 CHECK(buflen <= 2048);
4496 for (j = 0; j < 16; j++) {
4499 damage_array(
buffer, &buflen);
4502 certainly_not_der = 0;
4507 fprintf(stderr,
"Failure %x on ", ret);
4508 for (k = 0; k < buflen; k++) {
4509 fprintf(stderr,
"%02x ",
buffer[k]);
4511 fprintf(stderr,
"\n");
4529 secp256k1_scalar_set_int(&ss, 1);
4530 secp256k1_scalar_negate(&ss, &ss);
4531 secp256k1_scalar_inverse(&ss, &ss);
4532 secp256k1_scalar_set_int(&sr, 1);
4534 secp256k1_ge_set_gej(&key, &keyj);
4536 CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key, &msg) == 0);
4541 const unsigned char pubkey_mods_zero[33] = {
4542 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
4543 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
4544 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0,
4545 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41,
4551 secp256k1_scalar_set_int(&ss, 1);
4552 secp256k1_scalar_set_int(&msg, 0);
4553 secp256k1_scalar_set_int(&sr, 0);
4554 CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey_mods_zero, 33));
4555 CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key, &msg) == 0);
4560 const unsigned char pubkey[33] = {
4561 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4562 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4563 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4564 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4570 secp256k1_scalar_set_int(&ss, 0);
4571 secp256k1_scalar_set_int(&msg, 0);
4572 secp256k1_scalar_set_int(&sr, 1);
4573 CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33));
4574 CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key, &msg) == 0);
4579 const unsigned char pubkey[33] = {
4580 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4581 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4582 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4583 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4586 const unsigned char pubkey2[33] = {
4587 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
4588 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
4589 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0,
4590 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41,
4597 secp256k1_scalar_set_int(&ss, 2);
4598 secp256k1_scalar_set_int(&msg, 0);
4599 secp256k1_scalar_set_int(&sr, 2);
4600 CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33));
4601 CHECK(secp256k1_eckey_pubkey_parse(&key2, pubkey2, 33));
4602 CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key, &msg) == 1);
4603 CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key2, &msg) == 1);
4604 secp256k1_scalar_negate(&ss, &ss);
4605 CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key, &msg) == 1);
4606 CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key2, &msg) == 1);
4607 secp256k1_scalar_set_int(&ss, 1);
4608 CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key, &msg) == 0);
4609 CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key2, &msg) == 0);
4614 const unsigned char pubkey[33] = {
4615 0x02, 0x14, 0x4e, 0x5a, 0x58, 0xef, 0x5b, 0x22,
4616 0x6f, 0xd2, 0xe2, 0x07, 0x6a, 0x77, 0xcf, 0x05,
4617 0xb4, 0x1d, 0xe7, 0x4a, 0x30, 0x98, 0x27, 0x8c,
4618 0x93, 0xe6, 0xe6, 0x3c, 0x0b, 0xc4, 0x73, 0x76,
4621 const unsigned char pubkey2[33] = {
4622 0x02, 0x8a, 0xd5, 0x37, 0xed, 0x73, 0xd9, 0x40,
4623 0x1d, 0xa0, 0x33, 0xd2, 0xdc, 0xf0, 0xaf, 0xae,
4624 0x34, 0xcf, 0x5f, 0x96, 0x4c, 0x73, 0x28, 0x0f,
4625 0x92, 0xc0, 0xf6, 0x9d, 0xd9, 0xb2, 0x09, 0x10,
4628 const unsigned char csr[32] = {
4629 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4630 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
4631 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4,
4632 0x40, 0x2d, 0xa1, 0x72, 0x2f, 0xc9, 0xba, 0xeb
4638 secp256k1_scalar_set_int(&ss, 1);
4639 secp256k1_scalar_set_int(&msg, 1);
4640 secp256k1_scalar_set_b32(&sr, csr, NULL);
4641 CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33));
4642 CHECK(secp256k1_eckey_pubkey_parse(&key2, pubkey2, 33));
4643 CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key, &msg) == 1);
4644 CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key2, &msg) == 1);
4645 secp256k1_scalar_negate(&ss, &ss);
4646 CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key, &msg) == 1);
4647 CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key2, &msg) == 1);
4648 secp256k1_scalar_set_int(&ss, 2);
4649 secp256k1_scalar_inverse_var(&ss, &ss);
4650 CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key, &msg) == 0);
4651 CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key2, &msg) == 0);
4656 const unsigned char pubkey[33] = {
4657 0x03, 0xaf, 0x97, 0xff, 0x7d, 0x3a, 0xf6, 0xa0,
4658 0x02, 0x94, 0xbd, 0x9f, 0x4b, 0x2e, 0xd7, 0x52,
4659 0x28, 0xdb, 0x49, 0x2a, 0x65, 0xcb, 0x1e, 0x27,
4660 0x57, 0x9c, 0xba, 0x74, 0x20, 0xd5, 0x1d, 0x20,
4663 const unsigned char csr[32] = {
4664 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4665 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
4666 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4,
4667 0x40, 0x2d, 0xa1, 0x72, 0x2f, 0xc9, 0xba, 0xee
4672 secp256k1_scalar_set_int(&ss, 1);
4673 secp256k1_scalar_set_int(&msg, 1);
4674 secp256k1_scalar_negate(&msg, &msg);
4675 secp256k1_scalar_set_b32(&sr, csr, NULL);
4676 CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33));
4677 CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key, &msg) == 1);
4678 secp256k1_scalar_negate(&ss, &ss);
4679 CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key, &msg) == 1);
4680 secp256k1_scalar_set_int(&ss, 3);
4681 secp256k1_scalar_inverse_var(&ss, &ss);
4682 CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key, &msg) == 0);
4690 unsigned char signature[72];
4691 static const unsigned char nonce[32] = {
4692 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4693 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4694 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4695 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
4697 static const unsigned char nonce2[32] = {
4698 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
4699 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
4700 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,
4701 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x40
4703 const unsigned char key[32] = {
4704 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4705 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4706 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4707 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
4709 unsigned char msg[32] = {
4710 0x86, 0x41, 0x99, 0x81, 0x06, 0x23, 0x44, 0x53,
4711 0xaa, 0x5f, 0x9d, 0x6a, 0x31, 0x78, 0xf4, 0xf7,
4712 0xb8, 0x12, 0xe0, 0x0b, 0x81, 0x7a, 0x77, 0x62,
4713 0x65, 0xdf, 0xdd, 0x31, 0xb9, 0x3e, 0x29, 0xa9,
4747 CHECK(ecount == 10);
4749 CHECK(ecount == 11);
4751 CHECK(ecount == 11);
4753 CHECK(ecount == 12);
4755 CHECK(ecount == 13);
4757 CHECK(ecount == 13);
4761 CHECK(ecount == 13);
4777 memset(signature, 255, 64);
4784 for (t = 0; t < 2; t++) {
4785 static const unsigned char zero[32] = {0x00};
4787 unsigned char key[32];
4788 unsigned char msg[32];
4791 const unsigned char *extra;
4792 extra = t == 0 ? NULL : zero;
4796 memset(key, 0xFF, 32);
4812 CHECK(memcmp(&sig, &sig2,
sizeof(sig)) == 0);
4816 CHECK(memcmp(&sig, &sig2,
sizeof(sig)) == 0);
4818 for(i = 0; i < 256; i++) {
4823 secp256k1_ecdsa_signature_load(ctx, &sr[i], &ss, &sig2);
4824 for (j = 0; j < i; j++) {
4825 CHECK(!secp256k1_scalar_eq(&sr[i], &sr[j]));
4831 for(i = 256; i < 512; i++) {
4836 secp256k1_ecdsa_signature_load(ctx, &sr[i], &ss, &sig2);
4837 for (j = 0; j < i; j++) {
4838 CHECK(!secp256k1_scalar_eq(&sr[i], &sr[j]));
4846 const unsigned char zeros[32] = {0};
4847 unsigned char nonce[32];
4848 unsigned char nonce2[32];
4849 unsigned char nonce3[32];
4850 unsigned char nonce4[32];
4855 CHECK(nonce_function_rfc6979(
nonce, zeros, zeros, NULL, NULL, 0) == 1);
4857 CHECK(nonce_function_rfc6979(nonce2, zeros, zeros, zeros, NULL, 0) == 1);
4859 CHECK(nonce_function_rfc6979(nonce3, zeros, zeros, NULL, (
void *)zeros, 0) == 1);
4861 CHECK(nonce_function_rfc6979(nonce4, zeros, zeros, zeros, (
void *)zeros, 0) == 1);
4866 CHECK(memcmp(nonce2, nonce3, 32) != 0);
4867 CHECK(memcmp(nonce2, nonce4, 32) != 0);
4868 CHECK(memcmp(nonce3, nonce4, 32) != 0);
4874 unsigned char privkey[300];
4875 unsigned char seckey[32] = {
4876 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
4877 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
4878 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
4879 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41,
4881 size_t outlen = 300;
4892 #ifdef ENABLE_OPENSSL_TESTS
4893 EC_KEY *get_openssl_key(
const unsigned char *key32) {
4894 unsigned char privkey[300];
4896 const unsigned char* pbegin = privkey;
4897 int compr = secp256k1_rand_bits(1);
4898 EC_KEY *ec_key = EC_KEY_new_by_curve_name(NID_secp256k1);
4900 CHECK(d2i_ECPrivateKey(&ec_key, &pbegin, privkeylen));
4901 CHECK(EC_KEY_check_key(ec_key));
4905 void test_ecdsa_openssl(
void) {
4913 unsigned int sigsize = 80;
4914 size_t secp_sigsize = 80;
4915 unsigned char message[32];
4916 unsigned char signature[80];
4917 unsigned char key32[32];
4918 secp256k1_rand256_test(message);
4919 secp256k1_scalar_set_b32(&msg, message, NULL);
4921 secp256k1_scalar_get_b32(key32, &key);
4923 secp256k1_ge_set_gej(&q, &qj);
4924 ec_key = get_openssl_key(key32);
4925 CHECK(ec_key != NULL);
4926 CHECK(ECDSA_sign(0, message,
sizeof(message), signature, &sigsize, ec_key));
4927 CHECK(secp256k1_ecdsa_sig_parse(&sigr, &sigs, signature, sigsize));
4928 CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sigr, &sigs, &q, &msg));
4929 secp256k1_scalar_set_int(&one, 1);
4930 secp256k1_scalar_add(&msg2, &msg, &one);
4931 CHECK(!secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sigr, &sigs, &q, &msg2));
4934 CHECK(secp256k1_ecdsa_sig_serialize(signature, &secp_sigsize, &sigr, &sigs));
4935 CHECK(ECDSA_verify(0, message,
sizeof(message), signature, secp_sigsize, ec_key) == 1);
4937 EC_KEY_free(ec_key);
4940 void run_ecdsa_openssl(
void) {
4942 for (i = 0; i < 10*count; i++) {
4943 test_ecdsa_openssl();
4948 #ifdef ENABLE_MODULE_ECDH
4952 #ifdef ENABLE_MODULE_RECOVERY
4957 unsigned char seed16[16] = {0};
4958 unsigned char run32[32] = {0};
4961 count = strtol(
argv[1], NULL, 0);
4967 const char* ch =
argv[2];
4968 while (pos < 16 && ch[0] != 0 && ch[1] != 0) {
4970 if (sscanf(ch,
"%2hx", &sh)) {
4979 FILE *frand =
fopen(
"/dev/urandom",
"r");
4980 if ((frand == NULL) || fread(&seed16,
sizeof(seed16), 1, frand) !=
sizeof(seed16)) {
4981 uint64_t t = time(NULL) * (uint64_t)1337;
4983 seed16[1] ^= t >> 8;
4984 seed16[2] ^= t >> 16;
4985 seed16[3] ^= t >> 24;
4986 seed16[4] ^= t >> 32;
4987 seed16[5] ^= t >> 40;
4988 seed16[6] ^= t >> 48;
4989 seed16[7] ^= t >> 56;
4995 secp256k1_rand_seed(seed16);
4997 printf(
"test count = %i\n", count);
4998 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]);
5004 if (secp256k1_rand_bits(1)) {
5005 secp256k1_rand256(run32);
5016 #ifndef USE_NUM_NONE
5048 #ifdef USE_ENDOMORPHISM
5049 run_endomorphism_tests();
5058 #ifdef ENABLE_MODULE_ECDH
5069 #ifdef ENABLE_OPENSSL_TESTS
5070 run_ecdsa_openssl();
5073 #ifdef ENABLE_MODULE_RECOVERY
5078 secp256k1_rand256(run32);
5079 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]);
5084 printf(
"no problems found\n");
void run_ecdh_tests(void)
#define STRAUSS_SCRATCH_OBJECTS
#define ECMULT_PIPPENGER_THRESHOLD
#define PIPPENGER_MAX_BUCKET_WINDOW
#define PIPPENGER_SCRATCH_OBJECTS
int(* secp256k1_ecmult_multi_func)(const secp256k1_ecmult_context *, secp256k1_scratch *, secp256k1_gej *, const secp256k1_scalar *, secp256k1_ecmult_multi_callback cb, void *, size_t)
#define WNAF_SIZE_BITS(bits, w)
#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0)
#define SECP256K1_FE_STORAGE_CONST(d7, d6, d5, d4, d3, d2, d1, d0)
std::vector< uint8_t > buffer
void * memcpy(void *a, const void *b, size_t c)
void * memmove(void *a, const void *b, size_t c)
#define SECP256K1_GEJ_CONST_INFINITY
#define SECP256K1_GE_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)
#define SECP256K1_GEJ_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)
int ecdsa_signature_parse_der_lax(const secp256k1_context *ctx, secp256k1_ecdsa_signature *sig, const unsigned char *input, size_t inputlen)
Parse a signature in "lax DER" format.
int ec_privkey_export_der(const secp256k1_context *ctx, unsigned char *privkey, size_t *privkeylen, const unsigned char *key32, int compressed)
Export a private key in DER format.
int ec_privkey_import_der(const secp256k1_context *ctx, unsigned char *out32, const unsigned char *privkey, size_t privkeylen)
Import a private key in DER format.
FILE * fopen(const fs::path &p, const char *mode)
void run_recovery_tests(void)
#define SECP256K1_SCALAR_CONST(d7, d6, d5, d4, d3, d2, d1, d0)
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_mul(const secp256k1_context *ctx, secp256k1_pubkey *pubkey, const unsigned char *tweak) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Tweak a public key by multiplying it by a tweak value.
#define SECP256K1_CONTEXT_SIGN
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_add(const secp256k1_context *ctx, unsigned char *seckey, const unsigned char *tweak) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Tweak a private key by adding tweak to it.
SECP256K1_API void secp256k1_scratch_space_destroy(secp256k1_scratch_space *scratch)
Destroy a secp256k1 scratch space.
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT secp256k1_scratch_space * secp256k1_scratch_space_create(const secp256k1_context *ctx, size_t max_size) SECP256K1_ARG_NONNULL(1)
Create a secp256k1 scratch space object.
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_context_randomize(secp256k1_context *ctx, const unsigned char *seed32) SECP256K1_ARG_NONNULL(1)
Updates the context randomization to protect against side-channel leakage.
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_add(const secp256k1_context *ctx, secp256k1_pubkey *pubkey, const unsigned char *tweak) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Tweak a public key by adding tweak times the generator to it.
SECP256K1_API int secp256k1_ecdsa_signature_parse_compact(const secp256k1_context *ctx, secp256k1_ecdsa_signature *sig, const unsigned char *input64) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Parse an ECDSA signature in compact (64 bytes) format.
SECP256K1_API int secp256k1_ec_pubkey_serialize(const secp256k1_context *ctx, unsigned char *output, size_t *outputlen, const secp256k1_pubkey *pubkey, unsigned int flags) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4)
Serialize a pubkey object into a serialized byte sequence.
SECP256K1_API void secp256k1_context_set_error_callback(secp256k1_context *ctx, void(*fun)(const char *message, void *data), const void *data) SECP256K1_ARG_NONNULL(1)
Set a callback function to be called when an internal consistency check fails.
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_verify(const secp256k1_context *ctx, const unsigned char *seckey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2)
Verify an ECDSA secret key.
SECP256K1_API void secp256k1_context_set_illegal_callback(secp256k1_context *ctx, void(*fun)(const char *message, void *data), const void *data) SECP256K1_ARG_NONNULL(1)
Set a callback function to be called when an illegal argument is passed to an API call.
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_verify(const secp256k1_context *ctx, const secp256k1_ecdsa_signature *sig, const unsigned char *msg32, const secp256k1_pubkey *pubkey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4)
Verify an ECDSA signature.
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_combine(const secp256k1_context *ctx, secp256k1_pubkey *out, const secp256k1_pubkey *const *ins, size_t n) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Add a number of public keys together.
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_parse(const secp256k1_context *ctx, secp256k1_pubkey *pubkey, const unsigned char *input, size_t inputlen) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Parse a variable-length public key into the pubkey object.
#define SECP256K1_CONTEXT_NONE
SECP256K1_API int secp256k1_ecdsa_signature_parse_der(const secp256k1_context *ctx, secp256k1_ecdsa_signature *sig, const unsigned char *input, size_t inputlen) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Parse a DER ECDSA signature.
SECP256K1_API int secp256k1_ecdsa_sign(const secp256k1_context *ctx, secp256k1_ecdsa_signature *sig, const unsigned char *msg32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void *ndata) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4)
Create an ECDSA signature.
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_create(const secp256k1_context *ctx, secp256k1_pubkey *pubkey, const unsigned char *seckey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Compute the public key for a secret key.
SECP256K1_API secp256k1_context * secp256k1_context_clone(const secp256k1_context *ctx) SECP256K1_ARG_NONNULL(1) SECP256K1_WARN_UNUSED_RESULT
Copies a secp256k1 context object.
SECP256K1_API secp256k1_context * secp256k1_context_create(unsigned int flags) SECP256K1_WARN_UNUSED_RESULT
Create a secp256k1 context object.
#define SECP256K1_EC_COMPRESSED
Flag to pass to secp256k1_ec_pubkey_serialize and secp256k1_ec_privkey_export.
SECP256K1_API int secp256k1_ecdsa_signature_normalize(const secp256k1_context *ctx, secp256k1_ecdsa_signature *sigout, const secp256k1_ecdsa_signature *sigin) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(3)
Convert a signature to a normalized lower-S form.
#define SECP256K1_EC_UNCOMPRESSED
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_mul(const secp256k1_context *ctx, unsigned char *seckey, const unsigned char *tweak) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Tweak a private key by multiplying it by a tweak.
SECP256K1_API int secp256k1_ecdsa_signature_serialize_der(const secp256k1_context *ctx, unsigned char *output, size_t *outputlen, const secp256k1_ecdsa_signature *sig) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4)
Serialize an ECDSA signature in DER format.
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_negate(const secp256k1_context *ctx, secp256k1_pubkey *pubkey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2)
Negates a public key in place.
#define SECP256K1_CONTEXT_VERIFY
Flags to pass to secp256k1_context_create.
SECP256K1_API void secp256k1_context_destroy(secp256k1_context *ctx)
Destroy a secp256k1 context object.
SECP256K1_API int secp256k1_ecdsa_signature_serialize_compact(const secp256k1_context *ctx, unsigned char *output64, const secp256k1_ecdsa_signature *sig) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Serialize an ECDSA signature in compact (64 byte) format.
void(* fn)(const char *text, void *data)
secp256k1_callback error_callback
secp256k1_ecmult_gen_context ecmult_gen_ctx
secp256k1_ecmult_context ecmult_ctx
Opaque data structured that holds a parsed ECDSA signature.
A group element of the secp256k1 curve, in affine coordinates.
A group element of the secp256k1 curve, in jacobian coordinates.
Opaque data structure that holds a parsed and valid public key.
A scalar modulo the group order of the secp256k1 curve.
void test_ecmult_multi_batching(void)
Run secp256k1_ecmult_multi_var with num points and a scratch space restricted to 1 <= i <= num points...
void random_scalar_order(secp256k1_scalar *num)
void run_group_decompress(void)
void run_random_pubkeys(void)
void random_num_order(secp256k1_num *num)
int test_ecdsa_der_parse(const unsigned char *sig, size_t siglen, int certainly_der, int certainly_not_der)
void run_ec_pubkey_parse_test(void)
#define SECP256K1_EC_PARSE_TEST_NINVALID
void run_sha256_tests(void)
void ecmult_const_random_mult(void)
void run_context_tests(void)
void run_eckey_edge_case_test(void)
void test_ecmult_gen_blind_reset(void)
void run_ec_combine(void)
int main(int argc, char **argv)
void test_secp256k1_pippenger_bucket_window_inv(void)
void run_field_convert(void)
void test_ecdsa_end_to_end(void)
#define SECP256K1_EC_PARSE_TEST_NVALID
void run_field_misc(void)
void test_sqrt(const secp256k1_fe *a, const secp256k1_fe *k)
void random_field_element_magnitude(secp256k1_fe *fe)
void random_num_negate(secp256k1_num *num)
void random_scalar_order_test(secp256k1_scalar *num)
void test_point_times_order(const secp256k1_gej *point)
void test_ecmult_multi(secp256k1_scratch *scratch, secp256k1_ecmult_multi_func ecmult_multi)
int fe_memcmp(const secp256k1_fe *a, const secp256k1_fe *b)
void random_sign(secp256k1_scalar *sigr, secp256k1_scalar *sigs, const secp256k1_scalar *key, const secp256k1_scalar *msg, int *recid)
void ecmult_const_chain_multiply(void)
void random_group_element_test(secp256k1_ge *ge)
void run_num_smalltests(void)
void run_hmac_sha256_tests(void)
void test_num_negate(void)
void ge_equals_ge(const secp256k1_ge *a, const secp256k1_ge *b)
void test_rand_int(uint32_t range, uint32_t subrange)
void random_fe_test(secp256k1_fe *x)
void ge_equals_gej(const secp256k1_ge *a, const secp256k1_gej *b)
void test_wnaf(const secp256k1_scalar *number, int w)
int is_empty_signature(const secp256k1_ecdsa_signature *sig)
void random_fe_non_zero(secp256k1_fe *nz)
void test_add_neg_y_diff_x(void)
void run_ecdsa_sign_verify(void)
void random_group_element_jacobian_test(secp256k1_gej *gej, const secp256k1_ge *ge)
void run_ecmult_constants(void)
int gej_xyz_equals_gej(const secp256k1_gej *a, const secp256k1_gej *b)
void test_random_pubkeys(void)
void test_ecdsa_sign_verify(void)
int check_fe_inverse(const secp256k1_fe *a, const secp256k1_fe *ai)
void ecmult_const_mult_zero_one(void)
void test_ecmult_constants(void)
void run_ecdsa_end_to_end(void)
void ecmult_const_commutativity(void)
void test_constant_wnaf(const secp256k1_scalar *number, int w)
void ec_pubkey_parse_pointtest(const unsigned char *input, int xvalid, int yvalid)
void test_ecmult_gen_blind(void)
void test_fixed_wnaf(const secp256k1_scalar *number, int w)
void test_ecdsa_edge_cases(void)
void test_group_decompress(const secp256k1_fe *x)
void test_num_jacobi(void)
void test_fixed_wnaf_small_helper(int *wnaf, int *wnaf_expected, int w)
void run_ecmult_gen_blind(void)
void random_fe_non_square(secp256k1_fe *ns)
void run_point_times_order(void)
void random_fe(secp256k1_fe *x)
void test_fixed_wnaf_small(void)
void test_ecmult_multi_pippenger_max_points(void)
Probabilistically test the function returning the maximum number of possible points for a given scrat...
void run_ecmult_multi_tests(void)
void run_ecdsa_edge_cases(void)
void run_field_inv_var(void)
void test_constant_wnaf_negate(const secp256k1_scalar *number)
void run_rfc6979_hmac_sha256_tests(void)
void random_num_order_test(secp256k1_num *num)
int check_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b)
void run_ecmult_chain(void)
void run_ecdsa_der_parse(void)
void random_field_element_test(secp256k1_fe *fe)
void run_scratch_tests(void)
void test_ec_combine(void)
void run_ecmult_const_tests(void)
#define SECP256K1_EC_PARSE_TEST_NXVALID
void run_field_inv_all_var(void)
void test_rand_bits(int rand32, int bits)
void run_scalar_tests(void)
void test_num_add_sub(void)
#define VERIFY_CHECK(cond)