7 #if defined HAVE_CONFIG_H 8 #include "libsecp256k1-config.h" 22 #ifdef ENABLE_OPENSSL_TESTS 23 #include "openssl/bn.h" 24 #include "openssl/ec.h" 25 #include "openssl/ecdsa.h" 26 #include "openssl/obj_mac.h" 27 # if OPENSSL_VERSION_NUMBER < 0x10100000L 28 void ECDSA_SIG_get0(
const ECDSA_SIG *
sig,
const BIGNUM **pr,
const BIGNUM **ps) {*pr = sig->r; *ps = sig->s;}
56 unsigned char b32[32];
76 CHECK(fe->magnitude == n);
109 unsigned char b32[32];
122 unsigned char b32[32];
143 unsigned char ctmp[32];
150 void *none_prealloc = NULL;
151 void *sign_prealloc = NULL;
152 void *vrfy_prealloc = NULL;
153 void *both_prealloc = NULL;
165 CHECK(none_prealloc != NULL);
166 CHECK(sign_prealloc != NULL);
167 CHECK(vrfy_prealloc != NULL);
168 CHECK(both_prealloc != NULL);
180 memset(&zero_pubkey, 0,
sizeof(zero_pubkey));
269 CHECK(ecount2 == 10);
271 CHECK(ecount2 == 11);
275 CHECK(ecount2 == 12);
279 CHECK(ecount2 == 13);
285 CHECK(ecount2 == 14);
295 CHECK(ecount2 == 14);
297 CHECK(ecount2 == 14);
351 CHECK(scratch != NULL);
393 memset(&local_scratch, 0,
sizeof(local_scratch));
394 scratch = &local_scratch;
422 static const char *inputs[8] = {
423 "",
"abc",
"message digest",
"secure hash algorithm",
"SHA256 is considered to be safe",
424 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
425 "For this sample, this 63-byte string will be used as input data",
426 "This is exactly 64 bytes long, not counting the terminating byte" 428 static const unsigned char outputs[8][32] = {
429 {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},
430 {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},
431 {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},
432 {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},
433 {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},
434 {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},
435 {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},
436 {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}
439 for (i = 0; i < 8; i++) {
440 unsigned char out[32];
446 if (strlen(inputs[i]) > 0) {
458 static const char *keys[6] = {
459 "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
461 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
462 "\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",
463 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
464 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa" 466 static const char *inputs[6] = {
467 "\x48\x69\x20\x54\x68\x65\x72\x65",
468 "\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",
469 "\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",
470 "\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",
471 "\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",
472 "\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" 474 static const unsigned char outputs[6][32] = {
475 {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},
476 {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},
477 {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},
478 {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},
479 {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},
480 {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}
483 for (i = 0; i < 6; i++) {
485 unsigned char out[32];
490 if (strlen(inputs[i]) > 0) {
502 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};
503 static const unsigned char out1[3][32] = {
504 {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},
505 {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},
506 {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}
509 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};
510 static const unsigned char out2[3][32] = {
511 {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},
512 {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},
513 {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}
517 unsigned char out[32];
521 for (i = 0; i < 3; i++) {
528 for (i = 0; i < 3; i++) {
535 for (i = 0; i < 3; i++) {
547 static const unsigned int rounds[7] = {1, 30, 73, 156, 322, 653, 1316};
550 static const uint32_t mults[6] = {1, 3, 21, 289, 0x9999, 0x80402011};
552 unsigned int usebits = bits > 6 ? 6 : bits;
553 unsigned int maxshift = bits - usebits;
556 uint64_t x[6][27] = {{0}};
557 unsigned int i, shift, m;
560 for (i = 0; i < rounds[usebits]; i++) {
562 CHECK((((uint64_t)r) >> bits) == 0);
563 for (m = 0; m <
sizeof(mults) /
sizeof(mults[0]); m++) {
564 uint32_t rm = r * mults[m];
565 for (shift = 0; shift <= maxshift; shift++) {
566 x[m][shift] |= (((uint64_t)1) << ((rm >> shift) & ((1 << usebits) - 1)));
570 for (m = 0; m <
sizeof(mults) /
sizeof(mults[0]); m++) {
571 for (shift = 0; shift <= maxshift; shift++) {
573 CHECK(((~x[m][shift]) << (64 - (1 << usebits))) == 0);
581 int rounds = (subrange * 2073) / 100;
584 CHECK((range % subrange) == 0);
585 for (i = 0; i < rounds; i++) {
589 x |= (((uint64_t)1) << r);
592 CHECK(((~x) << (64 - subrange)) == 0);
598 for (b = 1; b <= 32; b++) {
604 static const uint32_t ms[] = {1, 3, 17, 1000, 13771, 999999, 33554432};
605 static const uint32_t ss[] = {1, 3, 6, 9, 13, 31, 64};
607 for (m = 0; m <
sizeof(ms) /
sizeof(ms[0]); m++) {
608 for (s = 0; s <
sizeof(ss) /
sizeof(ss[0]); s++) {
690 for (i = 0; i < 250; ++i) {
721 for (i = 0; i < 8; ++i) {
735 const int jacobi5[10] = { 0, 1, -1, -1, 1, 0, 1, -1, -1, 1 };
740 for (i = 0; i < 10; ++i) {
791 for (i = 0; i < 100*
count; i++) {
837 for (i = 0; i < 256; i += 4) {
841 for (j = 0; j < 4; j++) {
862 for (j = 0; j < now; j++) {
933 unsigned char cone[1] = {0x01};
950 for (i = 0; i < 100; ++i) {
953 int expected = r.
d[0] % (1 << shift);
955 CHECK(expected == low);
1003 for (i = 0; i < bit; i++) {
1092 unsigned char b32[32];
1102 memset(b32, 0,
sizeof(b32));
1104 memset(b32, 0xFF,
sizeof(b32));
1110 for (i = 0; i < 128 *
count; i++) {
1113 for (i = 0; i <
count; i++) {
1129 #ifndef USE_NUM_NONE 1134 unsigned char bin[32];
1135 unsigned char bin_tmp[32];
1139 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000001UL,
1140 0x45512319UL, 0x50B75FC4UL, 0x402DA173UL, 0x2FC9BEBEUL
1146 CHECK(overflow == 0);
1153 CHECK(overflow == 1);
1159 CHECK(overflow == 0);
1164 memset(bin, 0xFF, 32);
1166 CHECK(overflow == 1);
1174 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
1175 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL
1193 #if defined(USE_SCALAR_INV_NUM) 1197 unsigned char chal[33][2][32] = {
1198 {{0xff, 0xff, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00,
1199 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03,
1200 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff,
1201 0xff, 0xff, 0x03, 0x00, 0xc0, 0xff, 0xff, 0xff},
1202 {0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00,
1203 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8,
1204 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1205 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff}},
1206 {{0xef, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
1207 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00,
1208 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1209 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
1210 {0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
1211 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0,
1212 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff,
1213 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x80, 0xff}},
1214 {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
1215 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
1216 0x80, 0x00, 0x00, 0x80, 0xff, 0x3f, 0x00, 0x00,
1217 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x00},
1218 {0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x80,
1219 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xe0,
1220 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00,
1221 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff}},
1222 {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
1223 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
1224 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1225 0x00, 0x1e, 0xf8, 0xff, 0xff, 0xff, 0xfd, 0xff},
1226 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f,
1227 0x00, 0x00, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xe0,
1228 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff,
1229 0xf3, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}},
1230 {{0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00,
1231 0x00, 0x1c, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1232 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0x00,
1233 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff},
1234 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00,
1235 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1236 0xff, 0x1f, 0x00, 0x00, 0x80, 0xff, 0xff, 0x3f,
1237 0x00, 0xfe, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff}},
1238 {{0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xfc, 0x9f,
1239 0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x80,
1240 0xff, 0x0f, 0xfc, 0xff, 0x7f, 0x00, 0x00, 0x00,
1241 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},
1242 {0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1243 0x00, 0x00, 0xf8, 0xff, 0x0f, 0xc0, 0xff, 0xff,
1244 0xff, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff,
1245 0xff, 0xff, 0xff, 0x07, 0x80, 0xff, 0xff, 0xff}},
1246 {{0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00,
1247 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
1248 0xf7, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x00,
1249 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xf0},
1250 {0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff,
1251 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,
1252 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff,
1253 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
1254 {{0x00, 0xf8, 0xff, 0x03, 0xff, 0xff, 0xff, 0x00,
1255 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1256 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
1257 0xff, 0xff, 0x03, 0xc0, 0xff, 0x0f, 0xfc, 0xff},
1258 {0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff,
1259 0xff, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x00, 0xc0,
1260 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1261 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
1262 {{0x8f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1263 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff,
1264 0xff, 0x7f, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
1265 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},
1266 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1267 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1268 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1269 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
1270 {{0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff,
1271 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1272 0xff, 0xff, 0x03, 0x00, 0x80, 0x00, 0x00, 0x80,
1273 0xff, 0xff, 0xff, 0x00, 0x00, 0x80, 0xff, 0x7f},
1274 {0xff, 0xcf, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,
1275 0x00, 0xc0, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff,
1276 0xbf, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00,
1277 0x80, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00}},
1278 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff,
1279 0xff, 0xff, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff,
1280 0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x80,
1281 0xff, 0x01, 0xfc, 0xff, 0x01, 0x00, 0xfe, 0xff},
1282 {0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00,
1283 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1284 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
1285 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00}},
1286 {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
1287 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1288 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1289 0x7f, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80},
1290 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1291 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf0, 0xff, 0xff,
1292 0xe0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
1293 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
1294 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1295 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1296 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1297 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x00},
1298 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
1299 0xfc, 0xff, 0xff, 0x3f, 0xf0, 0xff, 0xff, 0x3f,
1300 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x00, 0xff,
1301 0xff, 0xff, 0xff, 0xff, 0x0f, 0x7e, 0x00, 0x00}},
1302 {{0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1303 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
1304 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1305 0xff, 0xff, 0x1f, 0x00, 0x00, 0xfe, 0x07, 0x00},
1306 {0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff,
1307 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1308 0xff, 0xfb, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00,
1309 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60}},
1310 {{0xff, 0x01, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00,
1311 0x80, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x03,
1312 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1313 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
1314 {0xff, 0xff, 0x1f, 0x00, 0xf0, 0xff, 0xff, 0xff,
1315 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1316 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1317 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00}},
1318 {{0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
1319 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1320 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1321 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
1322 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1323 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff,
1324 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03,
1325 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff}},
1326 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1327 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1328 0xc0, 0xff, 0xff, 0xcf, 0xff, 0x1f, 0x00, 0x00,
1329 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80},
1330 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1331 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
1332 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x7e,
1333 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
1334 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1335 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff,
1336 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
1337 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00},
1338 {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1339 0xff, 0xff, 0x7f, 0x00, 0x80, 0x00, 0x00, 0x00,
1340 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1341 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff}},
1342 {{0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x80,
1343 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1344 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1345 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},
1346 {0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1347 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x80,
1348 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
1349 0xff, 0x7f, 0xf8, 0xff, 0xff, 0x1f, 0x00, 0xfe}},
1350 {{0xff, 0xff, 0xff, 0x3f, 0xf8, 0xff, 0xff, 0xff,
1351 0xff, 0x03, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00,
1352 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1353 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07},
1354 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1355 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1356 0xff, 0xff, 0xff, 0xff, 0x01, 0x80, 0xff, 0xff,
1357 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}},
1358 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1360 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
1362 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1363 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
1364 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
1365 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40}},
1366 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1367 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1368 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1369 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
1370 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1371 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1372 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1373 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
1374 {{0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1375 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1376 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1377 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
1378 {0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1379 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1380 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1381 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
1382 {{0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xc0,
1383 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1384 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff,
1385 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f},
1386 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00,
1387 0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00,
1388 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff,
1389 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff}},
1390 {{0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1391 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1392 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1393 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
1394 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1395 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1396 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1397 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}},
1398 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1399 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
1400 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
1401 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40},
1402 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1403 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1404 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1405 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}},
1406 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1407 0x7e, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x07, 0x00,
1408 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
1409 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
1410 {0xff, 0x01, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
1411 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x80,
1412 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00,
1413 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
1414 {{0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x00,
1415 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1416 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
1417 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff},
1418 {0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
1419 0xff, 0xff, 0x3f, 0x00, 0xf8, 0xff, 0xff, 0xff,
1420 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1421 0xff, 0x3f, 0x00, 0x00, 0xc0, 0xf1, 0x7f, 0x00}},
1422 {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
1423 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff,
1424 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
1425 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00},
1426 {0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
1427 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff,
1428 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f,
1429 0x00, 0x00, 0xfc, 0xff, 0xff, 0x01, 0xff, 0xff}},
1430 {{0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1431 0x80, 0x00, 0x00, 0x80, 0xff, 0x03, 0xe0, 0x01,
1432 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfc, 0xff,
1433 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},
1434 {0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
1435 0xfe, 0xff, 0xff, 0xf0, 0x07, 0x00, 0x3c, 0x80,
1436 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff,
1437 0xff, 0xff, 0x07, 0xe0, 0xff, 0x00, 0x00, 0x00}},
1438 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1439 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1440 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf8,
1441 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80},
1442 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1443 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x80, 0x00,
1444 0x00, 0x00, 0x00, 0xc0, 0x7f, 0xfe, 0xff, 0x1f,
1445 0x00, 0xfe, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff}},
1446 {{0xff, 0xff, 0x81, 0xff, 0xff, 0xff, 0xff, 0x00,
1447 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83,
1448 0xff, 0xff, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
1449 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xf0},
1450 {0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff,
1451 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00,
1452 0xf8, 0x07, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
1453 0xff, 0xc7, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff}},
1454 {{0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
1455 0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
1456 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x03, 0xfb,
1457 0xfa, 0x8a, 0x7d, 0xdf, 0x13, 0x86, 0xe2, 0x03},
1458 {0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
1459 0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
1460 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x03, 0xfb,
1461 0xfa, 0x8a, 0x7d, 0xdf, 0x13, 0x86, 0xe2, 0x03}}
1463 unsigned char res[33][2][32] = {
1464 {{0x0c, 0x3b, 0x0a, 0xca, 0x8d, 0x1a, 0x2f, 0xb9,
1465 0x8a, 0x7b, 0x53, 0x5a, 0x1f, 0xc5, 0x22, 0xa1,
1466 0x07, 0x2a, 0x48, 0xea, 0x02, 0xeb, 0xb3, 0xd6,
1467 0x20, 0x1e, 0x86, 0xd0, 0x95, 0xf6, 0x92, 0x35},
1468 {0xdc, 0x90, 0x7a, 0x07, 0x2e, 0x1e, 0x44, 0x6d,
1469 0xf8, 0x15, 0x24, 0x5b, 0x5a, 0x96, 0x37, 0x9c,
1470 0x37, 0x7b, 0x0d, 0xac, 0x1b, 0x65, 0x58, 0x49,
1471 0x43, 0xb7, 0x31, 0xbb, 0xa7, 0xf4, 0x97, 0x15}},
1472 {{0xf1, 0xf7, 0x3a, 0x50, 0xe6, 0x10, 0xba, 0x22,
1473 0x43, 0x4d, 0x1f, 0x1f, 0x7c, 0x27, 0xca, 0x9c,
1474 0xb8, 0xb6, 0xa0, 0xfc, 0xd8, 0xc0, 0x05, 0x2f,
1475 0xf7, 0x08, 0xe1, 0x76, 0xdd, 0xd0, 0x80, 0xc8},
1476 {0xe3, 0x80, 0x80, 0xb8, 0xdb, 0xe3, 0xa9, 0x77,
1477 0x00, 0xb0, 0xf5, 0x2e, 0x27, 0xe2, 0x68, 0xc4,
1478 0x88, 0xe8, 0x04, 0xc1, 0x12, 0xbf, 0x78, 0x59,
1479 0xe6, 0xa9, 0x7c, 0xe1, 0x81, 0xdd, 0xb9, 0xd5}},
1480 {{0x96, 0xe2, 0xee, 0x01, 0xa6, 0x80, 0x31, 0xef,
1481 0x5c, 0xd0, 0x19, 0xb4, 0x7d, 0x5f, 0x79, 0xab,
1482 0xa1, 0x97, 0xd3, 0x7e, 0x33, 0xbb, 0x86, 0x55,
1483 0x60, 0x20, 0x10, 0x0d, 0x94, 0x2d, 0x11, 0x7c},
1484 {0xcc, 0xab, 0xe0, 0xe8, 0x98, 0x65, 0x12, 0x96,
1485 0x38, 0x5a, 0x1a, 0xf2, 0x85, 0x23, 0x59, 0x5f,
1486 0xf9, 0xf3, 0xc2, 0x81, 0x70, 0x92, 0x65, 0x12,
1487 0x9c, 0x65, 0x1e, 0x96, 0x00, 0xef, 0xe7, 0x63}},
1488 {{0xac, 0x1e, 0x62, 0xc2, 0x59, 0xfc, 0x4e, 0x5c,
1489 0x83, 0xb0, 0xd0, 0x6f, 0xce, 0x19, 0xf6, 0xbf,
1490 0xa4, 0xb0, 0xe0, 0x53, 0x66, 0x1f, 0xbf, 0xc9,
1491 0x33, 0x47, 0x37, 0xa9, 0x3d, 0x5d, 0xb0, 0x48},
1492 {0x86, 0xb9, 0x2a, 0x7f, 0x8e, 0xa8, 0x60, 0x42,
1493 0x26, 0x6d, 0x6e, 0x1c, 0xa2, 0xec, 0xe0, 0xe5,
1494 0x3e, 0x0a, 0x33, 0xbb, 0x61, 0x4c, 0x9f, 0x3c,
1495 0xd1, 0xdf, 0x49, 0x33, 0xcd, 0x72, 0x78, 0x18}},
1496 {{0xf7, 0xd3, 0xcd, 0x49, 0x5c, 0x13, 0x22, 0xfb,
1497 0x2e, 0xb2, 0x2f, 0x27, 0xf5, 0x8a, 0x5d, 0x74,
1498 0xc1, 0x58, 0xc5, 0xc2, 0x2d, 0x9f, 0x52, 0xc6,
1499 0x63, 0x9f, 0xba, 0x05, 0x76, 0x45, 0x7a, 0x63},
1500 {0x8a, 0xfa, 0x55, 0x4d, 0xdd, 0xa3, 0xb2, 0xc3,
1501 0x44, 0xfd, 0xec, 0x72, 0xde, 0xef, 0xc0, 0x99,
1502 0xf5, 0x9f, 0xe2, 0x52, 0xb4, 0x05, 0x32, 0x58,
1503 0x57, 0xc1, 0x8f, 0xea, 0xc3, 0x24, 0x5b, 0x94}},
1504 {{0x05, 0x83, 0xee, 0xdd, 0x64, 0xf0, 0x14, 0x3b,
1505 0xa0, 0x14, 0x4a, 0x3a, 0x41, 0x82, 0x7c, 0xa7,
1506 0x2c, 0xaa, 0xb1, 0x76, 0xbb, 0x59, 0x64, 0x5f,
1507 0x52, 0xad, 0x25, 0x29, 0x9d, 0x8f, 0x0b, 0xb0},
1508 {0x7e, 0xe3, 0x7c, 0xca, 0xcd, 0x4f, 0xb0, 0x6d,
1509 0x7a, 0xb2, 0x3e, 0xa0, 0x08, 0xb9, 0xa8, 0x2d,
1510 0xc2, 0xf4, 0x99, 0x66, 0xcc, 0xac, 0xd8, 0xb9,
1511 0x72, 0x2a, 0x4a, 0x3e, 0x0f, 0x7b, 0xbf, 0xf4}},
1512 {{0x8c, 0x9c, 0x78, 0x2b, 0x39, 0x61, 0x7e, 0xf7,
1513 0x65, 0x37, 0x66, 0x09, 0x38, 0xb9, 0x6f, 0x70,
1514 0x78, 0x87, 0xff, 0xcf, 0x93, 0xca, 0x85, 0x06,
1515 0x44, 0x84, 0xa7, 0xfe, 0xd3, 0xa4, 0xe3, 0x7e},
1516 {0xa2, 0x56, 0x49, 0x23, 0x54, 0xa5, 0x50, 0xe9,
1517 0x5f, 0xf0, 0x4d, 0xe7, 0xdc, 0x38, 0x32, 0x79,
1518 0x4f, 0x1c, 0xb7, 0xe4, 0xbb, 0xf8, 0xbb, 0x2e,
1519 0x40, 0x41, 0x4b, 0xcc, 0xe3, 0x1e, 0x16, 0x36}},
1520 {{0x0c, 0x1e, 0xd7, 0x09, 0x25, 0x40, 0x97, 0xcb,
1521 0x5c, 0x46, 0xa8, 0xda, 0xef, 0x25, 0xd5, 0xe5,
1522 0x92, 0x4d, 0xcf, 0xa3, 0xc4, 0x5d, 0x35, 0x4a,
1523 0xe4, 0x61, 0x92, 0xf3, 0xbf, 0x0e, 0xcd, 0xbe},
1524 {0xe4, 0xaf, 0x0a, 0xb3, 0x30, 0x8b, 0x9b, 0x48,
1525 0x49, 0x43, 0xc7, 0x64, 0x60, 0x4a, 0x2b, 0x9e,
1526 0x95, 0x5f, 0x56, 0xe8, 0x35, 0xdc, 0xeb, 0xdc,
1527 0xc7, 0xc4, 0xfe, 0x30, 0x40, 0xc7, 0xbf, 0xa4}},
1528 {{0xd4, 0xa0, 0xf5, 0x81, 0x49, 0x6b, 0xb6, 0x8b,
1529 0x0a, 0x69, 0xf9, 0xfe, 0xa8, 0x32, 0xe5, 0xe0,
1530 0xa5, 0xcd, 0x02, 0x53, 0xf9, 0x2c, 0xe3, 0x53,
1531 0x83, 0x36, 0xc6, 0x02, 0xb5, 0xeb, 0x64, 0xb8},
1532 {0x1d, 0x42, 0xb9, 0xf9, 0xe9, 0xe3, 0x93, 0x2c,
1533 0x4c, 0xee, 0x6c, 0x5a, 0x47, 0x9e, 0x62, 0x01,
1534 0x6b, 0x04, 0xfe, 0xa4, 0x30, 0x2b, 0x0d, 0x4f,
1535 0x71, 0x10, 0xd3, 0x55, 0xca, 0xf3, 0x5e, 0x80}},
1536 {{0x77, 0x05, 0xf6, 0x0c, 0x15, 0x9b, 0x45, 0xe7,
1537 0xb9, 0x11, 0xb8, 0xf5, 0xd6, 0xda, 0x73, 0x0c,
1538 0xda, 0x92, 0xea, 0xd0, 0x9d, 0xd0, 0x18, 0x92,
1539 0xce, 0x9a, 0xaa, 0xee, 0x0f, 0xef, 0xde, 0x30},
1540 {0xf1, 0xf1, 0xd6, 0x9b, 0x51, 0xd7, 0x77, 0x62,
1541 0x52, 0x10, 0xb8, 0x7a, 0x84, 0x9d, 0x15, 0x4e,
1542 0x07, 0xdc, 0x1e, 0x75, 0x0d, 0x0c, 0x3b, 0xdb,
1543 0x74, 0x58, 0x62, 0x02, 0x90, 0x54, 0x8b, 0x43}},
1544 {{0xa6, 0xfe, 0x0b, 0x87, 0x80, 0x43, 0x67, 0x25,
1545 0x57, 0x5d, 0xec, 0x40, 0x50, 0x08, 0xd5, 0x5d,
1546 0x43, 0xd7, 0xe0, 0xaa, 0xe0, 0x13, 0xb6, 0xb0,
1547 0xc0, 0xd4, 0xe5, 0x0d, 0x45, 0x83, 0xd6, 0x13},
1548 {0x40, 0x45, 0x0a, 0x92, 0x31, 0xea, 0x8c, 0x60,
1549 0x8c, 0x1f, 0xd8, 0x76, 0x45, 0xb9, 0x29, 0x00,
1550 0x26, 0x32, 0xd8, 0xa6, 0x96, 0x88, 0xe2, 0xc4,
1551 0x8b, 0xdb, 0x7f, 0x17, 0x87, 0xcc, 0xc8, 0xf2}},
1552 {{0xc2, 0x56, 0xe2, 0xb6, 0x1a, 0x81, 0xe7, 0x31,
1553 0x63, 0x2e, 0xbb, 0x0d, 0x2f, 0x81, 0x67, 0xd4,
1554 0x22, 0xe2, 0x38, 0x02, 0x25, 0x97, 0xc7, 0x88,
1555 0x6e, 0xdf, 0xbe, 0x2a, 0xa5, 0x73, 0x63, 0xaa},
1556 {0x50, 0x45, 0xe2, 0xc3, 0xbd, 0x89, 0xfc, 0x57,
1557 0xbd, 0x3c, 0xa3, 0x98, 0x7e, 0x7f, 0x36, 0x38,
1558 0x92, 0x39, 0x1f, 0x0f, 0x81, 0x1a, 0x06, 0x51,
1559 0x1f, 0x8d, 0x6a, 0xff, 0x47, 0x16, 0x06, 0x9c}},
1560 {{0x33, 0x95, 0xa2, 0x6f, 0x27, 0x5f, 0x9c, 0x9c,
1561 0x64, 0x45, 0xcb, 0xd1, 0x3c, 0xee, 0x5e, 0x5f,
1562 0x48, 0xa6, 0xaf, 0xe3, 0x79, 0xcf, 0xb1, 0xe2,
1563 0xbf, 0x55, 0x0e, 0xa2, 0x3b, 0x62, 0xf0, 0xe4},
1564 {0x14, 0xe8, 0x06, 0xe3, 0xbe, 0x7e, 0x67, 0x01,
1565 0xc5, 0x21, 0x67, 0xd8, 0x54, 0xb5, 0x7f, 0xa4,
1566 0xf9, 0x75, 0x70, 0x1c, 0xfd, 0x79, 0xdb, 0x86,
1567 0xad, 0x37, 0x85, 0x83, 0x56, 0x4e, 0xf0, 0xbf}},
1568 {{0xbc, 0xa6, 0xe0, 0x56, 0x4e, 0xef, 0xfa, 0xf5,
1569 0x1d, 0x5d, 0x3f, 0x2a, 0x5b, 0x19, 0xab, 0x51,
1570 0xc5, 0x8b, 0xdd, 0x98, 0x28, 0x35, 0x2f, 0xc3,
1571 0x81, 0x4f, 0x5c, 0xe5, 0x70, 0xb9, 0xeb, 0x62},
1572 {0xc4, 0x6d, 0x26, 0xb0, 0x17, 0x6b, 0xfe, 0x6c,
1573 0x12, 0xf8, 0xe7, 0xc1, 0xf5, 0x2f, 0xfa, 0x91,
1574 0x13, 0x27, 0xbd, 0x73, 0xcc, 0x33, 0x31, 0x1c,
1575 0x39, 0xe3, 0x27, 0x6a, 0x95, 0xcf, 0xc5, 0xfb}},
1576 {{0x30, 0xb2, 0x99, 0x84, 0xf0, 0x18, 0x2a, 0x6e,
1577 0x1e, 0x27, 0xed, 0xa2, 0x29, 0x99, 0x41, 0x56,
1578 0xe8, 0xd4, 0x0d, 0xef, 0x99, 0x9c, 0xf3, 0x58,
1579 0x29, 0x55, 0x1a, 0xc0, 0x68, 0xd6, 0x74, 0xa4},
1580 {0x07, 0x9c, 0xe7, 0xec, 0xf5, 0x36, 0x73, 0x41,
1581 0xa3, 0x1c, 0xe5, 0x93, 0x97, 0x6a, 0xfd, 0xf7,
1582 0x53, 0x18, 0xab, 0xaf, 0xeb, 0x85, 0xbd, 0x92,
1583 0x90, 0xab, 0x3c, 0xbf, 0x30, 0x82, 0xad, 0xf6}},
1584 {{0xc6, 0x87, 0x8a, 0x2a, 0xea, 0xc0, 0xa9, 0xec,
1585 0x6d, 0xd3, 0xdc, 0x32, 0x23, 0xce, 0x62, 0x19,
1586 0xa4, 0x7e, 0xa8, 0xdd, 0x1c, 0x33, 0xae, 0xd3,
1587 0x4f, 0x62, 0x9f, 0x52, 0xe7, 0x65, 0x46, 0xf4},
1588 {0x97, 0x51, 0x27, 0x67, 0x2d, 0xa2, 0x82, 0x87,
1589 0x98, 0xd3, 0xb6, 0x14, 0x7f, 0x51, 0xd3, 0x9a,
1590 0x0b, 0xd0, 0x76, 0x81, 0xb2, 0x4f, 0x58, 0x92,
1591 0xa4, 0x86, 0xa1, 0xa7, 0x09, 0x1d, 0xef, 0x9b}},
1592 {{0xb3, 0x0f, 0x2b, 0x69, 0x0d, 0x06, 0x90, 0x64,
1593 0xbd, 0x43, 0x4c, 0x10, 0xe8, 0x98, 0x1c, 0xa3,
1594 0xe1, 0x68, 0xe9, 0x79, 0x6c, 0x29, 0x51, 0x3f,
1595 0x41, 0xdc, 0xdf, 0x1f, 0xf3, 0x60, 0xbe, 0x33},
1596 {0xa1, 0x5f, 0xf7, 0x1d, 0xb4, 0x3e, 0x9b, 0x3c,
1597 0xe7, 0xbd, 0xb6, 0x06, 0xd5, 0x60, 0x06, 0x6d,
1598 0x50, 0xd2, 0xf4, 0x1a, 0x31, 0x08, 0xf2, 0xea,
1599 0x8e, 0xef, 0x5f, 0x7d, 0xb6, 0xd0, 0xc0, 0x27}},
1600 {{0x62, 0x9a, 0xd9, 0xbb, 0x38, 0x36, 0xce, 0xf7,
1601 0x5d, 0x2f, 0x13, 0xec, 0xc8, 0x2d, 0x02, 0x8a,
1602 0x2e, 0x72, 0xf0, 0xe5, 0x15, 0x9d, 0x72, 0xae,
1603 0xfc, 0xb3, 0x4f, 0x02, 0xea, 0xe1, 0x09, 0xfe},
1604 {0x00, 0x00, 0x00, 0x00, 0xfa, 0x0a, 0x3d, 0xbc,
1605 0xad, 0x16, 0x0c, 0xb6, 0xe7, 0x7c, 0x8b, 0x39,
1606 0x9a, 0x43, 0xbb, 0xe3, 0xc2, 0x55, 0x15, 0x14,
1607 0x75, 0xac, 0x90, 0x9b, 0x7f, 0x9a, 0x92, 0x00}},
1608 {{0x8b, 0xac, 0x70, 0x86, 0x29, 0x8f, 0x00, 0x23,
1609 0x7b, 0x45, 0x30, 0xaa, 0xb8, 0x4c, 0xc7, 0x8d,
1610 0x4e, 0x47, 0x85, 0xc6, 0x19, 0xe3, 0x96, 0xc2,
1611 0x9a, 0xa0, 0x12, 0xed, 0x6f, 0xd7, 0x76, 0x16},
1612 {0x45, 0xaf, 0x7e, 0x33, 0xc7, 0x7f, 0x10, 0x6c,
1613 0x7c, 0x9f, 0x29, 0xc1, 0xa8, 0x7e, 0x15, 0x84,
1614 0xe7, 0x7d, 0xc0, 0x6d, 0xab, 0x71, 0x5d, 0xd0,
1615 0x6b, 0x9f, 0x97, 0xab, 0xcb, 0x51, 0x0c, 0x9f}},
1616 {{0x9e, 0xc3, 0x92, 0xb4, 0x04, 0x9f, 0xc8, 0xbb,
1617 0xdd, 0x9e, 0xc6, 0x05, 0xfd, 0x65, 0xec, 0x94,
1618 0x7f, 0x2c, 0x16, 0xc4, 0x40, 0xac, 0x63, 0x7b,
1619 0x7d, 0xb8, 0x0c, 0xe4, 0x5b, 0xe3, 0xa7, 0x0e},
1620 {0x43, 0xf4, 0x44, 0xe8, 0xcc, 0xc8, 0xd4, 0x54,
1621 0x33, 0x37, 0x50, 0xf2, 0x87, 0x42, 0x2e, 0x00,
1622 0x49, 0x60, 0x62, 0x02, 0xfd, 0x1a, 0x7c, 0xdb,
1623 0x29, 0x6c, 0x6d, 0x54, 0x53, 0x08, 0xd1, 0xc8}},
1624 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1625 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1626 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1627 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
1628 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1629 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1630 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1631 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
1632 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1633 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1634 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1635 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
1636 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1637 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1638 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1639 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}},
1640 {{0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1,
1641 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0,
1642 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59,
1643 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92},
1644 {0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1,
1645 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0,
1646 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59,
1647 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}},
1648 {{0x28, 0x56, 0xac, 0x0e, 0x4f, 0x98, 0x09, 0xf0,
1649 0x49, 0xfa, 0x7f, 0x84, 0xac, 0x7e, 0x50, 0x5b,
1650 0x17, 0x43, 0x14, 0x89, 0x9c, 0x53, 0xa8, 0x94,
1651 0x30, 0xf2, 0x11, 0x4d, 0x92, 0x14, 0x27, 0xe8},
1652 {0x39, 0x7a, 0x84, 0x56, 0x79, 0x9d, 0xec, 0x26,
1653 0x2c, 0x53, 0xc1, 0x94, 0xc9, 0x8d, 0x9e, 0x9d,
1654 0x32, 0x1f, 0xdd, 0x84, 0x04, 0xe8, 0xe2, 0x0a,
1655 0x6b, 0xbe, 0xbb, 0x42, 0x40, 0x67, 0x30, 0x6c}},
1656 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1657 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1658 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4,
1659 0x40, 0x2d, 0xa1, 0x73, 0x2f, 0xc9, 0xbe, 0xbd},
1660 {0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1,
1661 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0,
1662 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59,
1663 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}},
1664 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1665 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
1666 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
1667 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40},
1668 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1669 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1670 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1671 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}},
1672 {{0x1c, 0xc4, 0xf7, 0xda, 0x0f, 0x65, 0xca, 0x39,
1673 0x70, 0x52, 0x92, 0x8e, 0xc3, 0xc8, 0x15, 0xea,
1674 0x7f, 0x10, 0x9e, 0x77, 0x4b, 0x6e, 0x2d, 0xdf,
1675 0xe8, 0x30, 0x9d, 0xda, 0xe8, 0x9a, 0x65, 0xae},
1676 {0x02, 0xb0, 0x16, 0xb1, 0x1d, 0xc8, 0x57, 0x7b,
1677 0xa2, 0x3a, 0xa2, 0xa3, 0x38, 0x5c, 0x8f, 0xeb,
1678 0x66, 0x37, 0x91, 0xa8, 0x5f, 0xef, 0x04, 0xf6,
1679 0x59, 0x75, 0xe1, 0xee, 0x92, 0xf6, 0x0e, 0x30}},
1680 {{0x8d, 0x76, 0x14, 0xa4, 0x14, 0x06, 0x9f, 0x9a,
1681 0xdf, 0x4a, 0x85, 0xa7, 0x6b, 0xbf, 0x29, 0x6f,
1682 0xbc, 0x34, 0x87, 0x5d, 0xeb, 0xbb, 0x2e, 0xa9,
1683 0xc9, 0x1f, 0x58, 0xd6, 0x9a, 0x82, 0xa0, 0x56},
1684 {0xd4, 0xb9, 0xdb, 0x88, 0x1d, 0x04, 0xe9, 0x93,
1685 0x8d, 0x3f, 0x20, 0xd5, 0x86, 0xa8, 0x83, 0x07,
1686 0xdb, 0x09, 0xd8, 0x22, 0x1f, 0x7f, 0xf1, 0x71,
1687 0xc8, 0xe7, 0x5d, 0x47, 0xaf, 0x8b, 0x72, 0xe9}},
1688 {{0x83, 0xb9, 0x39, 0xb2, 0xa4, 0xdf, 0x46, 0x87,
1689 0xc2, 0xb8, 0xf1, 0xe6, 0x4c, 0xd1, 0xe2, 0xa9,
1690 0xe4, 0x70, 0x30, 0x34, 0xbc, 0x52, 0x7c, 0x55,
1691 0xa6, 0xec, 0x80, 0xa4, 0xe5, 0xd2, 0xdc, 0x73},
1692 {0x08, 0xf1, 0x03, 0xcf, 0x16, 0x73, 0xe8, 0x7d,
1693 0xb6, 0x7e, 0x9b, 0xc0, 0xb4, 0xc2, 0xa5, 0x86,
1694 0x02, 0x77, 0xd5, 0x27, 0x86, 0xa5, 0x15, 0xfb,
1695 0xae, 0x9b, 0x8c, 0xa9, 0xf9, 0xf8, 0xa8, 0x4a}},
1696 {{0x8b, 0x00, 0x49, 0xdb, 0xfa, 0xf0, 0x1b, 0xa2,
1697 0xed, 0x8a, 0x9a, 0x7a, 0x36, 0x78, 0x4a, 0xc7,
1698 0xf7, 0xad, 0x39, 0xd0, 0x6c, 0x65, 0x7a, 0x41,
1699 0xce, 0xd6, 0xd6, 0x4c, 0x20, 0x21, 0x6b, 0xc7},
1700 {0xc6, 0xca, 0x78, 0x1d, 0x32, 0x6c, 0x6c, 0x06,
1701 0x91, 0xf2, 0x1a, 0xe8, 0x43, 0x16, 0xea, 0x04,
1702 0x3c, 0x1f, 0x07, 0x85, 0xf7, 0x09, 0x22, 0x08,
1703 0xba, 0x13, 0xfd, 0x78, 0x1e, 0x3f, 0x6f, 0x62}},
1704 {{0x25, 0x9b, 0x7c, 0xb0, 0xac, 0x72, 0x6f, 0xb2,
1705 0xe3, 0x53, 0x84, 0x7a, 0x1a, 0x9a, 0x98, 0x9b,
1706 0x44, 0xd3, 0x59, 0xd0, 0x8e, 0x57, 0x41, 0x40,
1707 0x78, 0xa7, 0x30, 0x2f, 0x4c, 0x9c, 0xb9, 0x68},
1708 {0xb7, 0x75, 0x03, 0x63, 0x61, 0xc2, 0x48, 0x6e,
1709 0x12, 0x3d, 0xbf, 0x4b, 0x27, 0xdf, 0xb1, 0x7a,
1710 0xff, 0x4e, 0x31, 0x07, 0x83, 0xf4, 0x62, 0x5b,
1711 0x19, 0xa5, 0xac, 0xa0, 0x32, 0x58, 0x0d, 0xa7}},
1712 {{0x43, 0x4f, 0x10, 0xa4, 0xca, 0xdb, 0x38, 0x67,
1713 0xfa, 0xae, 0x96, 0xb5, 0x6d, 0x97, 0xff, 0x1f,
1714 0xb6, 0x83, 0x43, 0xd3, 0xa0, 0x2d, 0x70, 0x7a,
1715 0x64, 0x05, 0x4c, 0xa7, 0xc1, 0xa5, 0x21, 0x51},
1716 {0xe4, 0xf1, 0x23, 0x84, 0xe1, 0xb5, 0x9d, 0xf2,
1717 0xb8, 0x73, 0x8b, 0x45, 0x2b, 0x35, 0x46, 0x38,
1718 0x10, 0x2b, 0x50, 0xf8, 0x8b, 0x35, 0xcd, 0x34,
1719 0xc8, 0x0e, 0xf6, 0xdb, 0x09, 0x35, 0xf0, 0xda}},
1720 {{0xdb, 0x21, 0x5c, 0x8d, 0x83, 0x1d, 0xb3, 0x34,
1721 0xc7, 0x0e, 0x43, 0xa1, 0x58, 0x79, 0x67, 0x13,
1722 0x1e, 0x86, 0x5d, 0x89, 0x63, 0xe6, 0x0a, 0x46,
1723 0x5c, 0x02, 0x97, 0x1b, 0x62, 0x43, 0x86, 0xf5},
1724 {0xdb, 0x21, 0x5c, 0x8d, 0x83, 0x1d, 0xb3, 0x34,
1725 0xc7, 0x0e, 0x43, 0xa1, 0x58, 0x79, 0x67, 0x13,
1726 0x1e, 0x86, 0x5d, 0x89, 0x63, 0xe6, 0x0a, 0x46,
1727 0x5c, 0x02, 0x97, 0x1b, 0x62, 0x43, 0x86, 0xf5}}
1730 for (i = 0; i < 33; i++) {
1745 #if defined(USE_SCALAR_INV_NUM) 1769 unsigned char bin[32];
1779 unsigned char bin[32];
1790 while (--tries >= 0) {
1825 static const unsigned char b32[32] = {
1826 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1827 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
1828 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,
1829 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x40
1832 0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL,
1833 0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL
1836 0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL,
1837 0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL
1840 unsigned char b322[32];
1857 t.magnitude = a->magnitude;
1858 t.normalized = a->normalized;
1870 for (i = 0; i < 5*
count; i++) {
1883 CHECK(x.normalized && x.magnitude == 1);
1890 CHECK(!q.normalized && q.magnitude == z.magnitude);
1899 CHECK(q.normalized && q.magnitude == 1);
1901 for (j = 0; j < 6; j++) {
1906 CHECK((q.normalized != (j&1)) && q.magnitude == ((j&1) ? z.magnitude : 1));
1946 for (i = 0; i < 10*
count; i++) {
1958 for (i = 0; i < 10*
count; i++) {
1972 for (i = 0; i <
count; i++) {
1975 for (j = 0; j < len; j++) {
1979 for (j = 0; j < len; j++) {
1983 for (j = 0; j < len; j++) {
1997 for (i = 1; i <= 512; ++i) {
2008 CHECK((v == 0) == (k == NULL));
2029 for (i = 1; i <= 100; i++) {
2038 for (i = 0; i < 10; i++) {
2041 for (j = 0; j <
count; j++) {
2121 for (i = 0; i < runs; i++) {
2125 if (i >= runs - 2) {
2128 if (i >= runs - 1) {
2139 for (j = 0; j < 4; j++) {
2151 for (i = 0; i < 4 * runs + 1; i++) {
2174 for (i1 = 0; i1 < 1 + 4 * runs; i1++) {
2176 for (i2 = 0; i2 < 1 + 4 * runs; i2++) {
2216 if ((i1 == 0 && i2 == 0) || ((i1 + 3)/4 == (i2 + 3)/4 && ((i1 + 3)%4)/2 == ((i2 + 3)%4)/2)) {
2233 if ((i1 == 0 && i2 == 0) || ((i1 + 3)/4 == (i2 + 3)/4 && ((i1 + 3)%4)/2 != ((i2 + 3)%4)/2)) {
2255 for (i = 0; i < 4 * runs + 1; i++) {
2256 gej_shuffled[i] = gej[i];
2258 for (i = 0; i < 4 * runs + 1; i++) {
2262 gej_shuffled[i] = gej_shuffled[swap];
2263 gej_shuffled[swap] = t;
2266 for (i = 0; i < 4 * runs + 1; i++) {
2277 for (i = 0; i < 4 * runs + 1; i++) {
2284 for (i = 0; i < 4 * runs + 1; i++) {
2295 for (i = 0; i < 4 * runs + 1; i++) {
2306 for (i = 0; i < 4 * runs + 1; i++) {
2380 0x8d24cd95, 0x0a355af1, 0x3c543505, 0x44238d30,
2381 0x0643d79f, 0x05a59614, 0x2f8ec030, 0xd58977cb,
2382 0x001e337a, 0x38093dcd, 0x6c0f386d, 0x0b1293a8,
2383 0x4d72c879, 0xd7681924, 0x44e6d2f3, 0x9190117d
2386 0xc7b74206, 0x1f788cd9, 0xabd0937d, 0x164a0d86,
2387 0x95f6ff75, 0xf19a4ce9, 0xd013bd7b, 0xbf92d2a7,
2388 0xffe1cc85, 0xc7f6c232, 0x93f0c792, 0xf4ed6c57,
2389 0xb28d3786, 0x2897e6db, 0xbb192d0b, 0x6e6feab2
2392 0x671a63c0, 0x3efdad4c, 0x389a7798, 0x24356027,
2393 0xb3d69010, 0x278625c3, 0x5c86d390, 0x184a8f7a,
2394 0x5f6409c2, 0x2ce01f2b, 0x511fd375, 0x25071d08,
2395 0xda651801, 0x70e95caf, 0x8f0d893c, 0xbed8fbbe
2417 for (i = 0; i <
count * 32; i++) {
2433 for (i = 1; i <= 6; i++) {
2440 d[i - 1] = &data[i - 1];
2451 for (i = 0; i <
count * 8; i++) {
2464 int res_quad, res_even, res_odd;
2472 CHECK(res_quad == res_even);
2473 CHECK(res_quad == res_odd);
2522 for (i = 0; i <
count * 4; i++) {
2534 0x8b30bbe9, 0xae2a9906, 0x96b22f67, 0x0709dff3,
2535 0x727fd8bc, 0x04d3362c, 0x6c7bf458, 0xe2846004,
2536 0xa357ae91, 0x5c4a6528, 0x1309edf2, 0x0504740f,
2537 0x0eb33439, 0x90216b4f, 0x81063cb6, 0x5f2f7e0f
2541 0x84cc5452, 0xf7fde1ed, 0xb4d38a8c, 0xe9b1b84c,
2542 0xcef31f14, 0x6e569be9, 0x705d357a, 0x42985407
2545 0xa1e58d22, 0x553dcd42, 0xb2398062, 0x5d4c57a9,
2546 0x6e9323d4, 0x2b3152e5, 0xca2c3990, 0xedc7c9de
2561 for (i = 0; i < 200*
count; i++) {
2577 0xD6E96687, 0xF9B10D09, 0x2A6F3543, 0x9D86CEBE,
2578 0xA4535D0D, 0x409F5358, 0x6440BD74, 0xB933E830,
2579 0xB95CBCA2, 0xC77DA786, 0x539BE8FD, 0x53354D2D,
2580 0x3B4F566A, 0xE6580454, 0x07ED6015, 0xEE1B2A88
2603 unsigned char pub[65];
2637 SECP256K1_SCALAR_CONST(0xd938a566, 0x7f479e3e, 0xb5b3c7fa, 0xefdb3749, 0x3aa0585c, 0xc5ea2367, 0xe1b660db, 0x0209e6fc),
2638 SECP256K1_SCALAR_CONST(0xd938a566, 0x7f479e3e, 0xb5b3c7fa, 0xefdb3749, 0x3aa0585c, 0xc5ea2367, 0xe1b660db, 0x0209e6fd),
2639 SECP256K1_SCALAR_CONST(0xd938a566, 0x7f479e3e, 0xb5b3c7fa, 0xefdb3749, 0x3aa0585c, 0xc5ea2367, 0xe1b660db, 0x0209e6fe),
2640 SECP256K1_SCALAR_CONST(0xd938a566, 0x7f479e3e, 0xb5b3c7fa, 0xefdb3749, 0x3aa0585c, 0xc5ea2367, 0xe1b660db, 0x0209e6ff),
2641 SECP256K1_SCALAR_CONST(0x2c9c52b3, 0x3fa3cf1f, 0x5ad9e3fd, 0x77ed9ba5, 0xb294b893, 0x3722e9a5, 0x00e698ca, 0x4cf7632d),
2642 SECP256K1_SCALAR_CONST(0x2c9c52b3, 0x3fa3cf1f, 0x5ad9e3fd, 0x77ed9ba5, 0xb294b893, 0x3722e9a5, 0x00e698ca, 0x4cf7632e),
2643 SECP256K1_SCALAR_CONST(0x2c9c52b3, 0x3fa3cf1f, 0x5ad9e3fd, 0x77ed9ba5, 0xb294b893, 0x3722e9a5, 0x00e698ca, 0x4cf7632f),
2644 SECP256K1_SCALAR_CONST(0x2c9c52b3, 0x3fa3cf1f, 0x5ad9e3fd, 0x77ed9ba5, 0xb294b893, 0x3722e9a5, 0x00e698ca, 0x4cf76330),
2645 SECP256K1_SCALAR_CONST(0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xd576e735, 0x57a4501d, 0xdfe92f46, 0x681b209f),
2646 SECP256K1_SCALAR_CONST(0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xd576e735, 0x57a4501d, 0xdfe92f46, 0x681b20a0),
2647 SECP256K1_SCALAR_CONST(0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xd576e735, 0x57a4501d, 0xdfe92f46, 0x681b20a1),
2648 SECP256K1_SCALAR_CONST(0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xd576e735, 0x57a4501d, 0xdfe92f46, 0x681b20a2),
2649 SECP256K1_SCALAR_CONST(0xd363ad4c, 0xc05c30e0, 0xa5261c02, 0x88126459, 0xf85915d7, 0x7825b696, 0xbeebc5c2, 0x833ede11),
2650 SECP256K1_SCALAR_CONST(0xd363ad4c, 0xc05c30e0, 0xa5261c02, 0x88126459, 0xf85915d7, 0x7825b696, 0xbeebc5c2, 0x833ede12),
2651 SECP256K1_SCALAR_CONST(0xd363ad4c, 0xc05c30e0, 0xa5261c02, 0x88126459, 0xf85915d7, 0x7825b696, 0xbeebc5c2, 0x833ede13),
2652 SECP256K1_SCALAR_CONST(0xd363ad4c, 0xc05c30e0, 0xa5261c02, 0x88126459, 0xf85915d7, 0x7825b696, 0xbeebc5c2, 0x833ede14),
2653 SECP256K1_SCALAR_CONST(0x26c75a99, 0x80b861c1, 0x4a4c3805, 0x1024c8b4, 0x704d760e, 0xe95e7cd3, 0xde1bfdb1, 0xce2c5a42),
2654 SECP256K1_SCALAR_CONST(0x26c75a99, 0x80b861c1, 0x4a4c3805, 0x1024c8b4, 0x704d760e, 0xe95e7cd3, 0xde1bfdb1, 0xce2c5a43),
2655 SECP256K1_SCALAR_CONST(0x26c75a99, 0x80b861c1, 0x4a4c3805, 0x1024c8b4, 0x704d760e, 0xe95e7cd3, 0xde1bfdb1, 0xce2c5a44),
2656 SECP256K1_SCALAR_CONST(0x26c75a99, 0x80b861c1, 0x4a4c3805, 0x1024c8b4, 0x704d760e, 0xe95e7cd3, 0xde1bfdb1, 0xce2c5a45)
2682 }
else if (mode == 1) {
2701 for (i = 0; i < 4*
count; ++i) {
2714 0x7603CB59, 0xB0EF6C63, 0xFE608479, 0x2A0C378C,
2715 0xDB3233A8, 0x0F8A9A09, 0xA877DEAD, 0x31B38C45
2717 for (i = 0; i < 500; i++) {
2734 0x6d986544, 0x57ff52b8, 0xcf1b8126, 0x5b802a5b,
2735 0xa97f9263, 0xb1e88044, 0x93351325, 0x91bc450a,
2736 0x535c59f7, 0x325e5d2b, 0xc391fbe8, 0x3c12787c,
2737 0x337e4a98, 0xe82a9011, 0x0123ba37, 0xdd769c7d
2741 0x649d4f77, 0xc4242df7, 0x7f2079c9, 0x14530327,
2742 0xa31b876a, 0xd2d8ce2a, 0x2236d5c6, 0xd7b2029b
2746 0x23773684, 0x4d209dc7, 0x098a786f, 0x20d06fcd,
2747 0x070a38bf, 0xc11ac651, 0x03004319, 0x1e2a8786,
2748 0xed8c3b8e, 0xc06dd57b, 0xd06ea66e, 0x45492b0f,
2749 0xb84e4e1b, 0xfb77e21f, 0x96baae2a, 0x63dec956
2804 0x4968d524, 0x2abf9b7a, 0x466abbcf, 0x34b11b6d,
2805 0xcd83d307, 0x827bed62, 0x05fad0ce, 0x18fae63b
2808 0x5494c15d, 0x32099706, 0xc2395f94, 0x348745fd,
2809 0x757ce30e, 0x4e8c90fb, 0xa2bad184, 0xf883c69f,
2810 0x5d195d20, 0xe191bf7f, 0x1be3e55f, 0x56a80196,
2811 0x6071ad01, 0xf1462f66, 0xc997fa94, 0xdb858435
2818 for (i = 0; i < 100; ++i) {
2841 *sc = data->
sc[idx];
2842 *pt = data->
pt[idx];
2871 for (ncount = 0; ncount <
count; ncount++) {
2915 for (ncount = 0; ncount <
count; ncount++) {
2918 size_t sizes[] = { 2, 10, 32 };
2920 for (j = 0; j < 3; j++) {
2921 for (i = 0; i < 32; i++) {
2929 for (j = 0; j < 3; j++) {
2930 for (i = 0; i < 32; i++) {
2939 for (j = 0; j < 3; j++) {
2941 for (i = 0; i < 16; i++) {
2945 pt[2 * i + 1] = ptg;
2952 for (i = 0; i < 16; i++) {
2968 for (i = 1; i < 32; i++) {
2981 for (ncount = 0; ncount <
count; ncount++) {
2986 for (i = 0; i < 20; i++) {
3002 for (ncount = 0; ncount <
count; ncount++) {
3010 for (i = 0; i < 20; i++) {
3025 for (ncount = 0; ncount < 20; ncount++) {
3041 const size_t TOP = 8;
3050 for(t0i = 0; t0i < TOP; t0i++) {
3051 for(t1i = 0; t1i < TOP; t1i++) {
3063 for(s0i = 0; s0i < TOP; s0i++) {
3064 for(s1i = 0; s1i < TOP; s1i++) {
3136 size_t n_points_supported;
3137 int bucket_window = 0;
3139 for(; scratch_size < max_size; scratch_size+=256) {
3144 CHECK(scratch != NULL);
3147 if (n_points_supported == 0) {
3166 size_t n_batches, n_batch_points, max_n_batch_points, n;
3168 max_n_batch_points = 0;
3172 max_n_batch_points = 1;
3175 CHECK(n_batches == 0);
3176 CHECK(n_batch_points == 0);
3178 max_n_batch_points = 2;
3181 CHECK(n_batches == 3);
3182 CHECK(n_batch_points == 2);
3187 CHECK(n_batches == 1);
3193 CHECK(n_batches == 2);
3196 max_n_batch_points = 1;
3199 CHECK(n_batches == SIZE_MAX);
3200 CHECK(n_batch_points == 1);
3202 max_n_batch_points = 2;
3205 CHECK(n_batches == SIZE_MAX/2 + 1);
3206 CHECK(n_batch_points == 2);
3231 for(i = 0; i < n_points; i++) {
3262 for(i = 1; i <= n_points; i++) {
3313 for (i = bits-1; i >= 0; i--) {
3317 CHECK(zeroes == -1 || zeroes >= w-1);
3319 CHECK((v & 1) == 1);
3320 CHECK(v <= (1 << (w-1)) - 1);
3321 CHECK(v >= -(1 << (w-1)) - 1);
3323 CHECK(zeroes != -1);
3348 CHECK(sign1 == sign2);
3354 int wnaf[256] = {0};
3363 for (i = 0; i < 16; ++i) {
3374 CHECK(v > -(1 << w));
3375 CHECK(v < (1 << w));
3394 int wnaf[256] = {0};
3401 for (i = 0; i < 16; ++i) {
3409 CHECK(v == 0 || v & 1);
3410 CHECK(v > -(1 << w));
3411 CHECK(v < (1 << w));
3432 CHECK(wnaf[i] == 0);
3434 for (i = 7; i >= 0; --i) {
3435 CHECK(wnaf[i] == wnaf_expected[i]);
3441 int wnaf[256] = {0};
3460 CHECK(wnaf[0] == 1);
3464 int wnaf_expected[8] = { 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf };
3471 int wnaf_expected[8] = { -1, -1, -1, -1, -1, -1, -1, 0xf };
3478 int wnaf_expected[8] = { 1, 0, 1, 0, 1, 0, 1, 0 };
3485 int wnaf_expected[8] = { -0xf, 0, 0xf, -0xf, 0, 0xf, 1, 0 };
3525 for (i = 0; i <
count; i++) {
3547 for (i = 0; i < 36; i++ ) {
3550 for (j = 0; j < i; j++) {
3558 for (i = 1; i <= 36; i++ ) {
3562 for (j = 0; j < i; j++) {
3580 unsigned char seed32[32];
3614 for (i = 0; i < 10; i++) {
3622 const unsigned char zero[32] = {0};
3623 unsigned char tmp[32];
3658 for (i = 0; i < 100U *
count; ++i) {
3669 unsigned char pubkeyc[65];
3676 for (pubkeyclen = 3; pubkeyclen <= 65; pubkeyclen++) {
3679 memcpy(&pubkeyc[1], input, 64);
3680 VG_UNDEF(&pubkeyc[pubkeyclen], 65 - pubkeyclen);
3681 for (i = 0; i < 256; i++) {
3688 ysign = (input[63] & 1) + 2;
3690 xpass = xvalid && (pubkeyclen == 33) && ((i & 254) == 2);
3692 ypass = xvalid && yvalid && ((i & 4) == ((pubkeyclen == 65) << 2)) &&
3693 ((i == 4) || ((i & 251) == ysign)) && ((pubkeyclen == 33) || (pubkeyclen == 65));
3694 if (xpass || ypass) {
3696 unsigned char pubkeyo[65];
3698 memset(&pubkey, 0,
sizeof(pubkey));
3709 CHECK((pubkeyclen != 33) || (pubkeyo[0] == pubkeyc[0]));
3712 CHECK(pubkeyo[0] == ysign);
3714 memset(&pubkey, 0,
sizeof(pubkey));
3723 CHECK(pubkeyo[0] == 4);
3729 memset(&pubkey, 0xfe,
sizeof(pubkey));
3744 #define SECP256K1_EC_PARSE_TEST_NVALID (12) 3748 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x52,
3749 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3750 0x00, 0x00, 0x64, 0xef, 0xa1, 0x7b, 0x77, 0x61, 0xe1, 0xe4, 0x27, 0x06, 0x98, 0x9f, 0xb4, 0x83,
3751 0xb8, 0xd2, 0xd4, 0x9b, 0xf7, 0x8f, 0xae, 0x98, 0x03, 0xf0, 0x99, 0xb8, 0x34, 0xed, 0xeb, 0x00
3755 0x7a, 0xe9, 0x6a, 0x2b, 0x65, 0x7c, 0x07, 0x10, 0x6e, 0x64, 0x47, 0x9e, 0xac, 0x34, 0x34, 0xe9,
3756 0x9c, 0xf0, 0x49, 0x75, 0x12, 0xf5, 0x89, 0x95, 0xc1, 0x39, 0x6c, 0x28, 0x71, 0x95, 0x01, 0xee,
3757 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14,
3758 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee,
3762 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3763 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2c,
3764 0x0e, 0x99, 0x4b, 0x14, 0xea, 0x72, 0xf8, 0xc3, 0xeb, 0x95, 0xc7, 0x1e, 0xf6, 0x92, 0x57, 0x5e,
3765 0x77, 0x50, 0x58, 0x33, 0x2d, 0x7e, 0x52, 0xd0, 0x99, 0x5c, 0xf8, 0x03, 0x88, 0x71, 0xb6, 0x7d,
3769 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3770 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2c,
3771 0xf1, 0x66, 0xb4, 0xeb, 0x15, 0x8d, 0x07, 0x3c, 0x14, 0x6a, 0x38, 0xe1, 0x09, 0x6d, 0xa8, 0xa1,
3772 0x88, 0xaf, 0xa7, 0xcc, 0xd2, 0x81, 0xad, 0x2f, 0x66, 0xa3, 0x07, 0xfb, 0x77, 0x8e, 0x45, 0xb2,
3776 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3777 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
3778 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14,
3779 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee,
3783 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3784 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
3785 0xbd, 0xe7, 0x0d, 0xf5, 0x19, 0x39, 0xb9, 0x4c, 0x9c, 0x24, 0x97, 0x9f, 0xa7, 0xdd, 0x04, 0xeb,
3786 0xd9, 0xb3, 0x57, 0x2d, 0xa7, 0x80, 0x22, 0x90, 0x43, 0x8a, 0xf2, 0xa6, 0x81, 0x89, 0x54, 0x41,
3790 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6,
3791 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07,
3792 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3793 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
3797 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c,
3798 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73,
3799 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3800 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
3804 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc,
3805 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5,
3806 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3807 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
3811 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6,
3812 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07,
3813 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3814 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
3818 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c,
3819 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73,
3820 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3821 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
3825 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc,
3826 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5,
3827 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3828 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01
3831 #define SECP256K1_EC_PARSE_TEST_NXVALID (4) 3835 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6,
3836 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07,
3837 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3838 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
3842 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c,
3843 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73,
3844 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3845 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
3849 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc,
3850 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5,
3851 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3852 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
3856 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3857 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
3858 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3859 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03
3862 #define SECP256K1_EC_PARSE_TEST_NINVALID (7) 3866 0x0a, 0x2d, 0x2b, 0xa9, 0x35, 0x07, 0xf1, 0xdf, 0x23, 0x37, 0x70, 0xc2, 0xa7, 0x97, 0x96, 0x2c,
3867 0xc6, 0x1f, 0x6d, 0x15, 0xda, 0x14, 0xec, 0xd4, 0x7d, 0x8d, 0x27, 0xae, 0x1c, 0xd5, 0xf8, 0x53,
3868 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3869 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
3873 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3874 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
3875 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14,
3876 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee,
3880 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3881 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
3882 0xbd, 0xe7, 0x0d, 0xf5, 0x19, 0x39, 0xb9, 0x4c, 0x9c, 0x24, 0x97, 0x9f, 0xa7, 0xdd, 0x04, 0xeb,
3883 0xd9, 0xb3, 0x57, 0x2d, 0xa7, 0x80, 0x22, 0x90, 0x43, 0x8a, 0xf2, 0xa6, 0x81, 0x89, 0x54, 0x41,
3887 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3888 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
3889 0xf4, 0x84, 0x14, 0x5c, 0xb0, 0x14, 0x9b, 0x82, 0x5d, 0xff, 0x41, 0x2f, 0xa0, 0x52, 0xa8, 0x3f,
3890 0xcb, 0x72, 0xdb, 0x61, 0xd5, 0x6f, 0x37, 0x70, 0xce, 0x06, 0x6b, 0x73, 0x49, 0xa2, 0xaa, 0x28,
3894 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3895 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
3896 0x0b, 0x7b, 0xeb, 0xa3, 0x4f, 0xeb, 0x64, 0x7d, 0xa2, 0x00, 0xbe, 0xd0, 0x5f, 0xad, 0x57, 0xc0,
3897 0x34, 0x8d, 0x24, 0x9e, 0x2a, 0x90, 0xc8, 0x8f, 0x31, 0xf9, 0x94, 0x8b, 0xb6, 0x5d, 0x52, 0x07,
3901 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3902 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3903 0x8f, 0x53, 0x7e, 0xef, 0xdf, 0xc1, 0x60, 0x6a, 0x07, 0x27, 0xcd, 0x69, 0xb4, 0xa7, 0x33, 0x3d,
3904 0x38, 0xed, 0x44, 0xe3, 0x93, 0x2a, 0x71, 0x79, 0xee, 0xcb, 0x4b, 0x6f, 0xba, 0x93, 0x60, 0xdc,
3908 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3909 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3910 0x70, 0xac, 0x81, 0x10, 0x20, 0x3e, 0x9f, 0x95, 0xf8, 0xd8, 0x32, 0x96, 0x4b, 0x58, 0xcc, 0xc2,
3911 0xc7, 0x12, 0xbb, 0x1c, 0x6c, 0xd5, 0x8e, 0x86, 0x11, 0x34, 0xb4, 0x8f, 0x45, 0x6c, 0x9b, 0x53
3914 const unsigned char pubkeyc[66] = {
3916 0x04, 0x79, 0xBE, 0x66, 0x7E, 0xF9, 0xDC, 0xBB, 0xAC, 0x55, 0xA0, 0x62, 0x95, 0xCE, 0x87, 0x0B,
3917 0x07, 0x02, 0x9B, 0xFC, 0xDB, 0x2D, 0xCE, 0x28, 0xD9, 0x59, 0xF2, 0x81, 0x5B, 0x16, 0xF8, 0x17,
3918 0x98, 0x48, 0x3A, 0xDA, 0x77, 0x26, 0xA3, 0xC4, 0x65, 0x5D, 0xA4, 0xFB, 0xFC, 0x0E, 0x11, 0x08,
3919 0xA8, 0xFD, 0x17, 0xB4, 0x48, 0xA6, 0x85, 0x54, 0x19, 0x9C, 0x47, 0xD0, 0x8F, 0xFB, 0x10, 0xD4,
3922 unsigned char sout[65];
3923 unsigned char shortkey[2];
3935 memset(&pubkey, 0xfe,
sizeof(pubkey));
3945 for (i = 0; i < 256 ; i++) {
3946 memset(&pubkey, 0xfe,
sizeof(pubkey));
3958 for (i = 0; i < 65536 ; i++) {
3959 memset(&pubkey, 0xfe,
sizeof(pubkey));
3961 shortkey[0] = i & 255;
3962 shortkey[1] = i >> 8;
3970 memset(&pubkey, 0xfe,
sizeof(pubkey));
3983 memset(&pubkey, 0xfe,
sizeof(pubkey));
3992 memset(&pubkey, 0xfe,
sizeof(pubkey));
4001 memset(&pubkey, 0xfe,
sizeof(pubkey));
4010 memset(&pubkey, 0,
sizeof(pubkey));
4057 CHECK(ecount2 == 10);
4072 const unsigned char orderc[32] = {
4073 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
4074 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
4075 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
4076 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41
4079 unsigned char ctmp[33];
4080 unsigned char ctmp2[33];
4095 memset(ctmp, 255, 32);
4097 memset(&pubkey, 1,
sizeof(pubkey));
4103 memset(ctmp, 0, 32);
4105 memset(&pubkey, 1,
sizeof(pubkey));
4113 memset(&pubkey, 0,
sizeof(pubkey));
4118 pubkey_one = pubkey;
4120 memcpy(ctmp, orderc, 32);
4123 memset(&pubkey, 1,
sizeof(pubkey));
4131 memset(&pubkey, 0,
sizeof(pubkey));
4136 pubkey_negone = pubkey;
4138 memset(ctmp2, 0, 32);
4141 memcpy(&pubkey2, &pubkey,
sizeof(pubkey));
4149 memcpy(&pubkey, &pubkey2,
sizeof(pubkey));
4152 memcpy(ctmp, orderc, 32);
4153 memset(ctmp2, 0, 32);
4159 memcpy(ctmp, orderc, 32);
4164 memcpy(ctmp, orderc, 32);
4168 memcpy(ctmp, orderc, 32);
4172 memcpy(ctmp, orderc, 32);
4178 memcpy(&pubkey, &pubkey2,
sizeof(pubkey));
4181 memcpy(&pubkey, &pubkey2,
sizeof(pubkey));
4185 memcpy(ctmp, orderc, 32);
4187 memset(ctmp2, 0, 32);
4194 memcpy(&pubkey, &pubkey2,
sizeof(pubkey));
4214 memset(&pubkey, 0, 32);
4218 memcpy(&pubkey, &pubkey2,
sizeof(pubkey));
4219 memset(&pubkey2, 0, 32);
4230 memset(ctmp2, 0, 32);
4237 memset(ctmp2, 0, 32);
4244 memset(ctmp2, 0, 32);
4250 memset(ctmp2, 0, 32);
4259 memset(&pubkey, 1,
sizeof(pubkey));
4265 pubkeys[0] = &pubkey_one;
4284 pubkeys[0] = &pubkey_negone;
4296 pubkeys[0] = &pubkey_one;
4297 pubkeys[1] = &pubkey_negone;
4305 pubkeys[2] = &pubkey_one;
4317 pubkeys[1] = &pubkey_one;
4328 unsigned char seckey[32];
4329 unsigned char seckey_tmp[32];
4332 memcpy(seckey_tmp, seckey, 32);
4346 memset(seckey, 0, 32);
4347 memset(seckey_tmp, 0, 32);
4356 memset(seckey, 0xFF, 16);
4357 memset(seckey_tmp, 0, 32);
4382 random_sign(&sigr, &sigs, &key, &msg, getrec?&recid:NULL);
4384 CHECK(recid >= 0 && recid < 4);
4394 for (i = 0; i < 10*
count; i++) {
4400 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) {
4404 memcpy(nonce32, data, 32);
4405 return (counter == 0);
4408 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) {
4416 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) {
4419 memset(nonce32, counter==0 ? 0 : 255, 32);
4426 static const unsigned char order[] = {
4427 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
4428 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
4429 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,
4430 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x41
4432 memcpy(nonce32, order, 32);
4452 unsigned char extra[32] = {0x00};
4453 unsigned char privkey[32];
4454 unsigned char message[32];
4455 unsigned char privkey2[32];
4458 unsigned char sig[74];
4460 unsigned char pubkeyc[65];
4461 size_t pubkeyclen = 65;
4464 unsigned char seckey[300];
4465 size_t seckeylen = 300;
4482 memset(&pubkey, 0,
sizeof(pubkey));
4486 memcpy(&pubkey_tmp, &pubkey,
sizeof(pubkey));
4502 unsigned char rnd[32];
4503 unsigned char privkey_tmp[32];
4506 memcpy(privkey_tmp, privkey, 32);
4511 CHECK(ret1 == ret2);
4512 CHECK(ret2 == ret3);
4526 unsigned char rnd[32];
4527 unsigned char privkey_tmp[32];
4530 memcpy(privkey_tmp, privkey, 32);
4535 CHECK(ret1 == ret2);
4536 CHECK(ret2 == ret3);
4585 memset(&signature[0], 0,
sizeof(signature[0]));
4599 unsigned char in[65];
4620 unsigned char out[65];
4621 unsigned char firstb;
4630 if ((in[0] != 6) && (in[0] != 7)) {
4631 CHECK(in[0] == out[0]);
4641 if (firstb == 2 || firstb == 3) {
4642 if (in[0] == firstb + 4) {
4658 for (i = 0; i < 10*
count; i++) {
4665 for (i = 0; i < 64*
count; i++) {
4671 static const unsigned char zeroes[32] = {0};
4672 #ifdef ENABLE_OPENSSL_TESTS 4673 static const unsigned char max_scalar[32] = {
4674 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
4675 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
4676 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
4677 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40
4684 unsigned char roundtrip_der[2048];
4685 unsigned char compact_der[64];
4686 size_t len_der = 2048;
4687 int parsed_der = 0, valid_der = 0, roundtrips_der = 0;
4690 unsigned char roundtrip_der_lax[2048];
4691 unsigned char compact_der_lax[64];
4692 size_t len_der_lax = 2048;
4693 int parsed_der_lax = 0, valid_der_lax = 0, roundtrips_der_lax = 0;
4695 #ifdef ENABLE_OPENSSL_TESTS 4696 ECDSA_SIG *sig_openssl;
4697 const BIGNUM *r = NULL, *s = NULL;
4698 const unsigned char *sigptr;
4699 unsigned char roundtrip_openssl[2048];
4700 int len_openssl = 2048;
4701 int parsed_openssl, valid_openssl = 0, roundtrips_openssl = 0;
4715 if (parsed_der_lax) {
4719 if (valid_der_lax) {
4721 roundtrips_der_lax = (len_der_lax == siglen) &&
secp256k1_memcmp_var(roundtrip_der_lax, sig, siglen) == 0;
4724 if (certainly_der) {
4725 ret |= (!parsed_der) << 2;
4727 if (certainly_not_der) {
4728 ret |= (parsed_der) << 17;
4731 ret |= (!roundtrips_der) << 3;
4735 ret |= (!roundtrips_der_lax) << 12;
4736 ret |= (len_der != len_der_lax) << 13;
4737 ret |= ((len_der != len_der_lax) || (
secp256k1_memcmp_var(roundtrip_der_lax, roundtrip_der, len_der) != 0)) << 14;
4739 ret |= (roundtrips_der != roundtrips_der_lax) << 15;
4741 ret |= (!parsed_der_lax) << 16;
4744 #ifdef ENABLE_OPENSSL_TESTS 4745 sig_openssl = ECDSA_SIG_new();
4747 parsed_openssl = (d2i_ECDSA_SIG(&sig_openssl, &sigptr, siglen) != NULL);
4748 if (parsed_openssl) {
4749 ECDSA_SIG_get0(sig_openssl, &r, &s);
4750 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;
4751 if (valid_openssl) {
4752 unsigned char tmp[32] = {0};
4753 BN_bn2bin(r, tmp + 32 - BN_num_bytes(r));
4756 if (valid_openssl) {
4757 unsigned char tmp[32] = {0};
4758 BN_bn2bin(s, tmp + 32 - BN_num_bytes(s));
4762 len_openssl = i2d_ECDSA_SIG(sig_openssl, NULL);
4763 if (len_openssl <= 2048) {
4764 unsigned char *ptr = roundtrip_openssl;
4765 CHECK(i2d_ECDSA_SIG(sig_openssl, &ptr) == len_openssl);
4766 roundtrips_openssl = valid_openssl && ((size_t)len_openssl == siglen) && (
secp256k1_memcmp_var(roundtrip_openssl, sig, siglen) == 0);
4770 ECDSA_SIG_free(sig_openssl);
4772 ret |= (parsed_der && !parsed_openssl) << 4;
4773 ret |= (valid_der && !valid_openssl) << 5;
4774 ret |= (roundtrips_openssl && !parsed_der) << 6;
4775 ret |= (roundtrips_der != roundtrips_openssl) << 7;
4776 if (roundtrips_openssl) {
4777 ret |= (len_der != (size_t)len_openssl) << 8;
4778 ret |= ((len_der != (size_t)len_openssl) || (
secp256k1_memcmp_var(roundtrip_der, roundtrip_openssl, len_der) != 0)) << 9;
4786 for (i = 0; i < ptrlen; i++) {
4787 int shift = ptrlen - 1 - i;
4791 ptr[i] = (val >> shift) & 0xFF;
4799 if (action < 1 && *len > 3) {
4802 memmove(sig + pos, sig + pos + 1, *len - pos - 1);
4805 }
else if (action < 2 && *len < 2048) {
4808 memmove(sig + pos + 1, sig + pos, *len - pos);
4812 }
else if (action < 4) {
4825 int nlow[2], nlen[2], nlenlen[2], nhbit[2], nhbyte[2], nzlen[2];
4826 size_t tlen, elen, glen;
4832 *certainly_der = der;
4833 *certainly_not_der = 0;
4836 for (n = 0; n < 2; n++) {
4841 CHECK(nlen[n] <= 232);
4848 if (nzlen[n] > ((nlen[n] == 0 || nhbit[n]) ? 1 : 0)) {
4849 *certainly_not_der = 1;
4851 CHECK(nlen[n] + nzlen[n] <= 300);
4853 nlenlen[n] = nlen[n] + nzlen[n] < 128 ? 0 : (nlen[n] + nzlen[n] < 256 ? 1 : 2);
4859 *certainly_not_der = 1;
4862 CHECK(nlen[n] + nzlen[n] + nlenlen[n] <= 427);
4866 tlen = 2 + nlenlen[0] + nlen[0] + nzlen[0] + 2 + nlenlen[1] + nlen[1] + nzlen[1];
4872 *certainly_not_der = 1;
4880 *certainly_not_der = 1;
4882 CHECK(tlen + glen <= 990);
4885 sig[(*len)++] = 0x30;
4888 sig[(*len)++] = 0x80;
4889 *certainly_not_der = 1;
4891 int tlenlen = tlen < 128 ? 0 : (tlen < 256 ? 1 : 2);
4896 *certainly_not_der = 1;
4901 sig[(*len)++] = tlen;
4904 sig[(*len)++] = 128 + tlenlen;
4911 CHECK(tlen + glen <= 1119);
4913 for (n = 0; n < 2; n++) {
4915 sig[(*len)++] = 0x02;
4916 if (nlenlen[n] == 0) {
4918 sig[(*len)++] = nlen[n] + nzlen[n];
4921 sig[(*len)++] = 128 + nlenlen[n];
4926 while (nzlen[n] > 0) {
4927 sig[(*len)++] = 0x00;
4930 if (nlen[n] == 32 && !nlow[n]) {
4933 for (i = 0; i < 16; i++) {
4934 sig[(*len)++] = 0xFF;
4940 sig[(*len)++] = nhbyte[n];
4959 CHECK(tlen + glen <= 1121);
4965 CHECK(tlen <= 1121);
4966 CHECK(tlen == *len);
4971 for (i = 0; i < 200 *
count; i++) {
4972 unsigned char buffer[2048];
4974 int certainly_der = 0;
4975 int certainly_not_der = 0;
4977 CHECK(buflen <= 2048);
4978 for (j = 0; j < 16; j++) {
4984 certainly_not_der = 0;
4989 fprintf(stderr,
"Failure %x on ", ret);
4990 for (k = 0; k < buflen; k++) {
4991 fprintf(stderr,
"%02x ", buffer[k]);
4993 fprintf(stderr,
"\n");
5023 const unsigned char pubkey_mods_zero[33] = {
5024 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5025 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5026 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0,
5027 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41,
5042 const unsigned char pubkey[33] = {
5043 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5044 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5045 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5046 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5061 const unsigned char pubkey[33] = {
5062 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5063 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5064 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5065 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5068 const unsigned char pubkey2[33] = {
5069 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5070 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5071 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0,
5072 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41,
5096 const unsigned char pubkey[33] = {
5097 0x02, 0x14, 0x4e, 0x5a, 0x58, 0xef, 0x5b, 0x22,
5098 0x6f, 0xd2, 0xe2, 0x07, 0x6a, 0x77, 0xcf, 0x05,
5099 0xb4, 0x1d, 0xe7, 0x4a, 0x30, 0x98, 0x27, 0x8c,
5100 0x93, 0xe6, 0xe6, 0x3c, 0x0b, 0xc4, 0x73, 0x76,
5103 const unsigned char pubkey2[33] = {
5104 0x02, 0x8a, 0xd5, 0x37, 0xed, 0x73, 0xd9, 0x40,
5105 0x1d, 0xa0, 0x33, 0xd2, 0xdc, 0xf0, 0xaf, 0xae,
5106 0x34, 0xcf, 0x5f, 0x96, 0x4c, 0x73, 0x28, 0x0f,
5107 0x92, 0xc0, 0xf6, 0x9d, 0xd9, 0xb2, 0x09, 0x10,
5110 const unsigned char csr[32] = {
5111 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5112 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
5113 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4,
5114 0x40, 0x2d, 0xa1, 0x72, 0x2f, 0xc9, 0xba, 0xeb
5138 const unsigned char pubkey[33] = {
5139 0x03, 0xaf, 0x97, 0xff, 0x7d, 0x3a, 0xf6, 0xa0,
5140 0x02, 0x94, 0xbd, 0x9f, 0x4b, 0x2e, 0xd7, 0x52,
5141 0x28, 0xdb, 0x49, 0x2a, 0x65, 0xcb, 0x1e, 0x27,
5142 0x57, 0x9c, 0xba, 0x74, 0x20, 0xd5, 0x1d, 0x20,
5145 const unsigned char csr[32] = {
5146 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5147 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
5148 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4,
5149 0x40, 0x2d, 0xa1, 0x72, 0x2f, 0xc9, 0xba, 0xee
5172 unsigned char signature[72];
5173 static const unsigned char nonce[32] = {
5174 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5175 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5176 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5177 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
5179 static const unsigned char nonce2[32] = {
5180 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
5181 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
5182 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,
5183 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x40
5185 const unsigned char key[32] = {
5186 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5187 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5188 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5189 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
5191 unsigned char msg[32] = {
5192 0x86, 0x41, 0x99, 0x81, 0x06, 0x23, 0x44, 0x53,
5193 0xaa, 0x5f, 0x9d, 0x6a, 0x31, 0x78, 0xf4, 0xf7,
5194 0xb8, 0x12, 0xe0, 0x0b, 0x81, 0x7a, 0x77, 0x62,
5195 0x65, 0xdf, 0xdd, 0x31, 0xb9, 0x3e, 0x29, 0xa9,
5229 CHECK(ecount == 10);
5231 CHECK(ecount == 11);
5233 CHECK(ecount == 11);
5235 CHECK(ecount == 12);
5237 CHECK(ecount == 13);
5239 CHECK(ecount == 13);
5243 CHECK(ecount == 13);
5259 memset(signature, 255, 64);
5266 for (t = 0; t < 2; t++) {
5267 static const unsigned char zero[32] = {0x00};
5269 unsigned char key[32];
5270 unsigned char msg[32];
5273 const unsigned char *extra;
5274 extra = t == 0 ? NULL : zero;
5278 memset(key, 0xFF, 32);
5300 for(i = 0; i < 256; i++) {
5306 for (j = 0; j < i; j++) {
5313 for(i = 256; i < 512; i++) {
5319 for (j = 0; j < i; j++) {
5328 const unsigned char zeros[32] = {0};
5329 unsigned char nonce[32];
5330 unsigned char nonce2[32];
5331 unsigned char nonce3[32];
5332 unsigned char nonce4[32];
5356 unsigned char privkey[300];
5357 unsigned char seckey[32] = {
5358 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5359 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
5360 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
5361 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41,
5363 size_t outlen = 300;
5374 #ifdef ENABLE_OPENSSL_TESTS 5375 EC_KEY *get_openssl_key(
const unsigned char *key32) {
5376 unsigned char privkey[300];
5378 const unsigned char* pbegin = privkey;
5380 EC_KEY *ec_key = EC_KEY_new_by_curve_name(NID_secp256k1);
5382 CHECK(d2i_ECPrivateKey(&ec_key, &pbegin, privkeylen));
5383 CHECK(EC_KEY_check_key(ec_key));
5387 void test_ecdsa_openssl(
void) {
5395 unsigned int sigsize = 80;
5396 size_t secp_sigsize = 80;
5397 unsigned char message[32];
5398 unsigned char signature[80];
5399 unsigned char key32[32];
5406 ec_key = get_openssl_key(key32);
5407 CHECK(ec_key != NULL);
5408 CHECK(ECDSA_sign(0, message,
sizeof(message), signature, &sigsize, ec_key));