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"    31 #if !defined(VG_CHECK)    32 # if defined(VALGRIND)    33 #  include <valgrind/memcheck.h>    34 #  define VG_UNDEF(x,y) VALGRIND_MAKE_MEM_UNDEFINED((x),(y))    35 #  define VG_CHECK(x,y) VALGRIND_CHECK_MEM_IS_DEFINED((x),(y))    37 #  define VG_UNDEF(x,y)    38 #  define VG_CHECK(x,y)    42 static int count = 64;
    45 static void counting_illegal_callback_fn(
const char* str, 
void* data) {
    53 static void uncounting_illegal_callback_fn(
const char* str, 
void* data) {
    63         unsigned char b32[32];
    64         secp256k1_rand256_test(b32);
    65         if (secp256k1_fe_set_b32(fe, b32)) {
    73     int n = secp256k1_rand_int(9);
    74     secp256k1_fe_normalize(fe);
    78     secp256k1_fe_clear(&zero);
    79     secp256k1_fe_negate(&zero, &zero, 0);
    80     secp256k1_fe_mul_int(&zero, n - 1);
    81     secp256k1_fe_add(fe, &zero);
    89         if (secp256k1_ge_set_xo_var(ge, &fe, secp256k1_rand_bits(1))) {
    90             secp256k1_fe_normalize(&ge->
y);
   100         if (!secp256k1_fe_is_zero(&gej->
z)) {
   104     secp256k1_fe_sqr(&z2, &gej->
z);
   105     secp256k1_fe_mul(&z3, &z2, &gej->
z);
   106     secp256k1_fe_mul(&gej->
x, &ge->
x, &z2);
   107     secp256k1_fe_mul(&gej->
y, &ge->
y, &z3);
   113         unsigned char b32[32];
   115         secp256k1_rand256_test(b32);
   116         secp256k1_scalar_set_b32(num, b32, &overflow);
   117         if (overflow || secp256k1_scalar_is_zero(num)) {
   126         unsigned char b32[32];
   128         secp256k1_rand256(b32);
   129         secp256k1_scalar_set_b32(num, b32, &overflow);
   130         if (overflow || secp256k1_scalar_is_zero(num)) {
   141     unsigned char ctmp[32];
   154     memset(&zero_pubkey, 0, 
sizeof(zero_pubkey));
   183     secp256k1_ge_set_gej(&pub, &pubj);
   197     CHECK(ecount2 == 10);
   199     CHECK(ecount2 == 11);
   203     CHECK(ecount2 == 12);
   207     CHECK(ecount2 == 13);
   213     CHECK(ecount2 == 14);
   221     CHECK(ecount2 == 14);
   227     secp256k1_ecmult_context_build(&vrfy->
ecmult_ctx, NULL);
   232     } 
while(!secp256k1_ecdsa_sig_sign(&both->
ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &nonce, NULL));
   235     CHECK(secp256k1_ecdsa_sig_sign(&sign->
ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &nonce, NULL));
   236     CHECK(secp256k1_ecdsa_sig_sign(&both->
ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &nonce, NULL));
   239     CHECK(secp256k1_ecdsa_sig_verify(&vrfy->
ecmult_ctx, &sigr, &sigs, &pub, &msg));
   240     CHECK(secp256k1_ecdsa_sig_verify(&both->
ecmult_ctx, &sigr, &sigs, &pub, &msg));
   254     static const char *inputs[8] = {
   255         "", 
"abc", 
"message digest", 
"secure hash algorithm", 
"SHA256 is considered to be safe",
   256         "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
   257         "For this sample, this 63-byte string will be used as input data",
   258         "This is exactly 64 bytes long, not counting the terminating byte"   260     static const unsigned char outputs[8][32] = {
   261         {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},
   262         {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},
   263         {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},
   264         {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},
   265         {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},
   266         {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},
   267         {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},
   268         {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}
   271     for (i = 0; i < 8; i++) {
   272         unsigned char out[32];
   274         secp256k1_sha256_initialize(&hasher);
   275         secp256k1_sha256_write(&hasher, (
const unsigned char*)(inputs[i]), strlen(inputs[i]));
   276         secp256k1_sha256_finalize(&hasher, out);
   277         CHECK(memcmp(out, outputs[i], 32) == 0);
   278         if (strlen(inputs[i]) > 0) {
   279             int split = secp256k1_rand_int(strlen(inputs[i]));
   280             secp256k1_sha256_initialize(&hasher);
   281             secp256k1_sha256_write(&hasher, (
const unsigned char*)(inputs[i]), split);
   282             secp256k1_sha256_write(&hasher, (
const unsigned char*)(inputs[i] + split), strlen(inputs[i]) - split);
   283             secp256k1_sha256_finalize(&hasher, out);
   284             CHECK(memcmp(out, outputs[i], 32) == 0);
   290     static const char *keys[6] = {
   291         "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
   293         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
   294         "\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",
   295         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
   296         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"   298     static const char *inputs[6] = {
   299         "\x48\x69\x20\x54\x68\x65\x72\x65",
   300         "\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",
   301         "\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",
   302         "\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",
   303         "\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",
   304         "\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"   306     static const unsigned char outputs[6][32] = {
   307         {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},
   308         {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},
   309         {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},
   310         {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},
   311         {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},
   312         {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}
   315     for (i = 0; i < 6; i++) {
   317         unsigned char out[32];
   318         secp256k1_hmac_sha256_initialize(&hasher, (
const unsigned char*)(keys[i]), strlen(keys[i]));
   319         secp256k1_hmac_sha256_write(&hasher, (
const unsigned char*)(inputs[i]), strlen(inputs[i]));
   320         secp256k1_hmac_sha256_finalize(&hasher, out);
   321         CHECK(memcmp(out, outputs[i], 32) == 0);
   322         if (strlen(inputs[i]) > 0) {
   323             int split = secp256k1_rand_int(strlen(inputs[i]));
   324             secp256k1_hmac_sha256_initialize(&hasher, (
const unsigned char*)(keys[i]), strlen(keys[i]));
   325             secp256k1_hmac_sha256_write(&hasher, (
const unsigned char*)(inputs[i]), split);
   326             secp256k1_hmac_sha256_write(&hasher, (
const unsigned char*)(inputs[i] + split), strlen(inputs[i]) - split);
   327             secp256k1_hmac_sha256_finalize(&hasher, out);
   328             CHECK(memcmp(out, outputs[i], 32) == 0);
   334     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};
   335     static const unsigned char out1[3][32] = {
   336         {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},
   337         {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},
   338         {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}
   341     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};
   342     static const unsigned char out2[3][32] = {
   343         {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},
   344         {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},
   345         {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}
   349     unsigned char out[32];
   352     secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 64);
   353     for (i = 0; i < 3; i++) {
   354         secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32);
   355         CHECK(memcmp(out, out1[i], 32) == 0);
   357     secp256k1_rfc6979_hmac_sha256_finalize(&rng);
   359     secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 65);
   360     for (i = 0; i < 3; i++) {
   361         secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32);
   362         CHECK(memcmp(out, out1[i], 32) != 0);
   364     secp256k1_rfc6979_hmac_sha256_finalize(&rng);
   366     secp256k1_rfc6979_hmac_sha256_initialize(&rng, key2, 64);
   367     for (i = 0; i < 3; i++) {
   368         secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32);
   369         CHECK(memcmp(out, out2[i], 32) == 0);
   371     secp256k1_rfc6979_hmac_sha256_finalize(&rng);
   379     static const unsigned int rounds[7] = {1, 30, 73, 156, 322, 653, 1316};
   382     static const uint32_t mults[6] = {1, 3, 21, 289, 0x9999, 0x80402011};
   384     unsigned int usebits = bits > 6 ? 6 : bits;
   385     unsigned int maxshift = bits - usebits;
   388     uint64_t x[6][27] = {{0}};
   389     unsigned int i, shift, m;
   392     for (i = 0; i < rounds[usebits]; i++) {
   393         uint32_t r = (rand32 ? secp256k1_rand32() : secp256k1_rand_bits(bits));
   394         CHECK((((uint64_t)r) >> bits) == 0);
   395         for (m = 0; m < 
sizeof(mults) / 
sizeof(mults[0]); m++) {
   396             uint32_t rm = r * mults[m];
   397             for (shift = 0; shift <= maxshift; shift++) {
   398                 x[m][shift] |= (((uint64_t)1) << ((rm >> shift) & ((1 << usebits) - 1)));
   402     for (m = 0; m < 
sizeof(mults) / 
sizeof(mults[0]); m++) {
   403         for (shift = 0; shift <= maxshift; shift++) {
   405             CHECK(((~x[m][shift]) << (64 - (1 << usebits))) == 0);
   413     int rounds = (subrange * 2073) / 100;
   416     CHECK((range % subrange) == 0);
   417     for (i = 0; i < rounds; i++) {
   418         uint32_t r = secp256k1_rand_int(range);
   421         x |= (((uint64_t)1) << r);
   424     CHECK(((~x) << (64 - subrange)) == 0);
   430     for (b = 1; b <= 32; b++) {
   436     static const uint32_t ms[] = {1, 3, 17, 1000, 13771, 999999, 33554432};
   437     static const uint32_t ss[] = {1, 3, 6, 9, 13, 31, 64};
   439     for (m = 0; m < 
sizeof(ms) / 
sizeof(ms[0]); m++) {
   440         for (s = 0; s < 
sizeof(ss) / 
sizeof(ss[0]); s++) {
   450     if (secp256k1_rand_bits(1)) {
   451         secp256k1_num_negate(num);
   458     secp256k1_scalar_get_num(num, &sc);
   464     secp256k1_scalar_get_num(num, &sc);
   472     secp256k1_num_copy(&n2, &n1); 
   473     secp256k1_num_sub(&n1, &n2, &n1); 
   474     CHECK(secp256k1_num_is_zero(&n1));
   475     secp256k1_num_copy(&n1, &n2); 
   476     secp256k1_num_negate(&n1); 
   477     CHECK(!secp256k1_num_is_zero(&n1));
   478     secp256k1_num_add(&n1, &n2, &n1); 
   479     CHECK(secp256k1_num_is_zero(&n1));
   480     secp256k1_num_copy(&n1, &n2); 
   481     secp256k1_num_negate(&n1); 
   482     CHECK(secp256k1_num_is_neg(&n1) != secp256k1_num_is_neg(&n2));
   483     secp256k1_num_negate(&n1); 
   484     CHECK(secp256k1_num_eq(&n1, &n2));
   494     if (secp256k1_rand_bits(1)) {
   498     if (secp256k1_rand_bits(1)) {
   501     secp256k1_num_add(&n1p2, &n1, &n2); 
   502     secp256k1_num_add(&n2p1, &n2, &n1); 
   503     secp256k1_num_sub(&n1m2, &n1, &n2); 
   504     secp256k1_num_sub(&n2m1, &n2, &n1); 
   505     CHECK(secp256k1_num_eq(&n1p2, &n2p1));
   506     CHECK(!secp256k1_num_eq(&n1p2, &n1m2));
   507     secp256k1_num_negate(&n2m1); 
   508     CHECK(secp256k1_num_eq(&n2m1, &n1m2));
   509     CHECK(!secp256k1_num_eq(&n2m1, &n1));
   510     secp256k1_num_add(&n2m1, &n2m1, &n2); 
   511     CHECK(secp256k1_num_eq(&n2m1, &n1));
   512     CHECK(!secp256k1_num_eq(&n2p1, &n1));
   513     secp256k1_num_sub(&n2p1, &n2p1, &n2); 
   514     CHECK(secp256k1_num_eq(&n2p1, &n1));
   517     secp256k1_scalar_set_int(&s, 1);
   518     secp256k1_scalar_get_num(&n1, &s);
   519     CHECK(secp256k1_num_is_one(&n1));
   521     secp256k1_scalar_get_num(&n2, &s);
   522     for (i = 0; i < 250; ++i) {
   523         secp256k1_num_add(&n1, &n1, &n1);    
   524         secp256k1_num_add(&n1p2, &n1, &n2);  
   525         CHECK(!secp256k1_num_is_one(&n1p2));
   536     secp256k1_scalar_get_num(&order, &s);
   537     secp256k1_scalar_set_int(&s, 0);
   538     secp256k1_scalar_get_num(&n, &s);
   539     secp256k1_num_mod(&n, &order);
   540     CHECK(secp256k1_num_is_zero(&n));
   543     secp256k1_scalar_set_int(&s, 1);
   544     secp256k1_scalar_get_num(&order, &s);
   545     secp256k1_scalar_get_num(&n, &s);
   546     secp256k1_num_mod(&n, &order);
   547     CHECK(secp256k1_num_is_zero(&n));
   551     secp256k1_scalar_get_num(&n, &s);
   553     for (i = 0; i < 8; ++i) {
   554         secp256k1_num_add(&n, &n, &n);
   556     secp256k1_num_mod(&n, &order);
   557     CHECK(secp256k1_num_is_zero(&n));
   567     const int jacobi5[10] = { 0, 1, -1, -1, 1, 0, 1, -1, -1, 1 };
   570     secp256k1_scalar_set_int(&five, 5);
   571     secp256k1_scalar_get_num(&order, &five);
   572     for (i = 0; i < 10; ++i) {
   573         secp256k1_scalar_set_int(&small, i);
   574         secp256k1_scalar_get_num(&n, &small);
   575         CHECK(secp256k1_num_jacobi(&n, &order) == jacobi5[i]);
   579     secp256k1_scalar_get_num(&order, &five);
   584         secp256k1_scalar_get_num(&fiven, &five);
   585         secp256k1_scalar_get_num(&n, &sqr);
   586         secp256k1_num_mod(&n, &fiven);
   587     } 
while (secp256k1_num_is_zero(&n));
   590     if (secp256k1_num_jacobi(&n, &order) == -1) {
   591         secp256k1_num_add(&n, &n, &n);
   595     CHECK(secp256k1_num_jacobi(&n, &order) == 1);
   597     secp256k1_num_add(&n, &n, &n);
   598     CHECK(secp256k1_num_jacobi(&n, &order) == -1);
   601     secp256k1_scalar_order_get_num(&order);
   603     secp256k1_scalar_sqr(&sqr, &sqr);
   605     secp256k1_scalar_get_num(&n, &sqr);
   606     CHECK(secp256k1_num_jacobi(&n, &order) == 1);
   608     secp256k1_scalar_mul(&sqr, &sqr, &five);
   609     secp256k1_scalar_get_num(&n, &sqr);
   610     CHECK(secp256k1_num_jacobi(&n, &order) == -1);
   612     CHECK(secp256k1_num_jacobi(&order, &order) == 0);
   615     secp256k1_scalar_set_int(&small, 1);
   616     secp256k1_scalar_get_num(&n, &small);
   617     secp256k1_num_sub(&n, &order, &n);
   618     CHECK(secp256k1_num_jacobi(&n, &order) == 1);  
   623     for (i = 0; i < 100*count; i++) {
   652     secp256k1_scalar_get_b32(c, &s2);
   655     secp256k1_scalar_get_num(&snum, &s);
   656     secp256k1_scalar_get_num(&s1num, &s1);
   657     secp256k1_scalar_get_num(&s2num, &s2);
   659     secp256k1_scalar_order_get_num(&order);
   661     secp256k1_num_shift(&half_order, 1);
   668         secp256k1_scalar_set_int(&n, 0);
   669         for (i = 0; i < 256; i += 4) {
   672             secp256k1_scalar_set_int(&t, secp256k1_scalar_get_bits(&s, 256 - 4 - i, 4));
   673             for (j = 0; j < 4; j++) {
   674                 secp256k1_scalar_add(&n, &n, &n);
   676             secp256k1_scalar_add(&n, &n, &t);
   678         CHECK(secp256k1_scalar_eq(&n, &s));
   685         secp256k1_scalar_set_int(&n, 0);
   689             int now = secp256k1_rand_int(15) + 1;
   693             secp256k1_scalar_set_int(&t, secp256k1_scalar_get_bits_var(&s, 256 - now - i, now));
   694             for (j = 0; j < now; j++) {
   695                 secp256k1_scalar_add(&n, &n, &n);
   697             secp256k1_scalar_add(&n, &n, &t);
   700         CHECK(secp256k1_scalar_eq(&n, &s));
   709         secp256k1_num_add(&rnum, &snum, &s2num);
   710         secp256k1_num_mod(&rnum, &order);
   711         secp256k1_scalar_add(&r, &s, &s2);
   712         secp256k1_scalar_get_num(&r2num, &r);
   713         CHECK(secp256k1_num_eq(&rnum, &r2num));
   721         secp256k1_num_mul(&rnum, &snum, &s2num);
   722         secp256k1_num_mod(&rnum, &order);
   723         secp256k1_scalar_mul(&r, &s, &s2);
   724         secp256k1_scalar_get_num(&r2num, &r);
   725         CHECK(secp256k1_num_eq(&rnum, &r2num));
   727         CHECK(secp256k1_scalar_is_zero(&r) == (secp256k1_scalar_is_zero(&s) || secp256k1_scalar_is_zero(&s2)));
   729         CHECK(secp256k1_num_eq(&rnum, &snum) == (secp256k1_scalar_is_zero(&s) || secp256k1_scalar_is_one(&s2)));
   730         CHECK(secp256k1_num_eq(&rnum, &s2num) == (secp256k1_scalar_is_zero(&s2) || secp256k1_scalar_is_one(&s)));
   738         CHECK(secp256k1_num_is_zero(&snum) == secp256k1_scalar_is_zero(&s));
   740         CHECK(secp256k1_scalar_is_high(&s) == (secp256k1_num_cmp(&snum, &half_order) > 0));
   741         secp256k1_scalar_negate(&neg, &s);
   742         secp256k1_num_sub(&negnum, &order, &snum);
   743         secp256k1_num_mod(&negnum, &order);
   745         CHECK(secp256k1_scalar_is_high(&neg) == (secp256k1_num_cmp(&negnum, &half_order) > 0));
   747         CHECK((secp256k1_scalar_is_high(&s) == secp256k1_scalar_is_high(&neg)) == secp256k1_scalar_is_zero(&s));
   748         secp256k1_scalar_get_num(&negnum2, &neg);
   750         CHECK(secp256k1_num_eq(&negnum, &negnum2));
   751         secp256k1_scalar_add(&neg, &neg, &s);
   753         CHECK(secp256k1_scalar_is_zero(&neg));
   754         secp256k1_scalar_negate(&neg, &neg);
   756         CHECK(secp256k1_scalar_is_zero(&neg));
   765         unsigned char cone[1] = {0x01};
   766         unsigned int shift = 256 + secp256k1_rand_int(257);
   767         secp256k1_scalar_mul_shift_var(&r, &s1, &s2, shift);
   768         secp256k1_num_mul(&rnum, &s1num, &s2num);
   769         secp256k1_num_shift(&rnum, shift - 1);
   770         secp256k1_num_set_bin(&one, cone, 1);
   771         secp256k1_num_add(&rnum, &rnum, &one);
   772         secp256k1_num_shift(&rnum, 1);
   773         secp256k1_scalar_get_num(&rnum2, &r);
   774         CHECK(secp256k1_num_eq(&rnum, &rnum2));
   782         for (i = 0; i < 100; ++i) {
   784             int shift = 1 + secp256k1_rand_int(15);
   785             int expected = r.
d[0] % (1 << shift);
   786             low = secp256k1_scalar_shr_int(&r, shift);
   787             CHECK(expected == low);
   794         if (!secp256k1_scalar_is_zero(&s)) {
   800             secp256k1_scalar_inverse(&inv, &s);
   802             secp256k1_num_mod_inverse(&invnum, &snum, &order);
   803             secp256k1_scalar_get_num(&invnum2, &inv);
   804             CHECK(secp256k1_num_eq(&invnum, &invnum2));
   806             secp256k1_scalar_mul(&inv, &inv, &s);
   808             CHECK(secp256k1_scalar_is_one(&inv));
   809             secp256k1_scalar_inverse(&inv, &inv);
   811             CHECK(secp256k1_scalar_is_one(&inv));
   813             secp256k1_scalar_get_num(&invnum, &inv);
   814             CHECK(secp256k1_num_is_one(&invnum));
   822         secp256k1_scalar_add(&r1, &s1, &s2);
   823         secp256k1_scalar_add(&r2, &s2, &s1);
   824         CHECK(secp256k1_scalar_eq(&r1, &r2));
   832         int bit = secp256k1_rand_bits(8);
   833         secp256k1_scalar_set_int(&b, 1);
   834         CHECK(secp256k1_scalar_is_one(&b));
   835         for (i = 0; i < bit; i++) {
   836             secp256k1_scalar_add(&b, &b, &b);
   840         if (!secp256k1_scalar_add(&r1, &r1, &b)) {
   842             secp256k1_scalar_cadd_bit(&r2, bit, 1);
   843             CHECK(secp256k1_scalar_eq(&r1, &r2));
   845             secp256k1_scalar_cadd_bit(&r2, bit, 0);
   846             CHECK(secp256k1_scalar_eq(&r1, &r2));
   853         secp256k1_scalar_mul(&r1, &s1, &s2);
   854         secp256k1_scalar_mul(&r2, &s2, &s1);
   855         CHECK(secp256k1_scalar_eq(&r1, &r2));
   861         secp256k1_scalar_add(&r1, &s1, &s2);
   862         secp256k1_scalar_add(&r1, &r1, &s);
   863         secp256k1_scalar_add(&r2, &s2, &s);
   864         secp256k1_scalar_add(&r2, &s1, &r2);
   865         CHECK(secp256k1_scalar_eq(&r1, &r2));
   871         secp256k1_scalar_mul(&r1, &s1, &s2);
   872         secp256k1_scalar_mul(&r1, &r1, &s);
   873         secp256k1_scalar_mul(&r2, &s2, &s);
   874         secp256k1_scalar_mul(&r2, &s1, &r2);
   875         CHECK(secp256k1_scalar_eq(&r1, &r2));
   881         secp256k1_scalar_add(&r1, &s1, &s2);
   882         secp256k1_scalar_mul(&r1, &r1, &s);
   883         secp256k1_scalar_mul(&r2, &s1, &s);
   884         secp256k1_scalar_mul(&t, &s2, &s);
   885         secp256k1_scalar_add(&r2, &r2, &t);
   886         CHECK(secp256k1_scalar_eq(&r1, &r2));
   892         secp256k1_scalar_sqr(&r1, &s1);
   893         secp256k1_scalar_mul(&r2, &s1, &s1);
   894         CHECK(secp256k1_scalar_eq(&r1, &r2));
   900         secp256k1_scalar_set_int(&v1,1);
   901         secp256k1_scalar_mul(&r1, &s1, &v1);
   902         CHECK(secp256k1_scalar_eq(&r1, &s1));
   908         secp256k1_scalar_set_int(&v0,0);
   909         secp256k1_scalar_add(&r1, &s1, &v0);
   910         CHECK(secp256k1_scalar_eq(&r1, &s1));
   916         secp256k1_scalar_set_int(&v0,0);
   917         secp256k1_scalar_mul(&r1, &s1, &v0);
   918         CHECK(secp256k1_scalar_eq(&r1, &v0));
   925     for (i = 0; i < 128 * count; i++) {
   932         secp256k1_scalar_set_int(&s, 1);
   933         CHECK(secp256k1_scalar_is_one(&s));
   934         secp256k1_scalar_negate(&o, &s);
   935         secp256k1_scalar_add(&o, &o, &s);
   936         CHECK(secp256k1_scalar_is_zero(&o));
   937         secp256k1_scalar_negate(&o, &o);
   938         CHECK(secp256k1_scalar_is_zero(&o));
   946         unsigned char bin[32];
   948         secp256k1_scalar_order_get_num(&order);
   949         secp256k1_num_get_bin(bin, 32, &order);
   950         secp256k1_scalar_set_b32(&zero, bin, &overflow);
   951         CHECK(overflow == 1);
   952         CHECK(secp256k1_scalar_is_zero(&zero));
   959             0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
   960             0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL
   962         CHECK(secp256k1_scalar_check_overflow(&overflowed));
   978 #if defined(USE_SCALAR_INV_NUM)   982         unsigned char chal[33][2][32] = {
   983             {{0xff, 0xff, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00,
   984               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03,
   985               0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff,
   986               0xff, 0xff, 0x03, 0x00, 0xc0, 0xff, 0xff, 0xff},
   987              {0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00,
   988               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8,
   989               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
   990               0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff}},
   991             {{0xef, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
   992               0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00,
   993               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   994               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
   995              {0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
   996               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0,
   997               0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff,
   998               0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x80, 0xff}},
   999             {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
  1000               0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
  1001               0x80, 0x00, 0x00, 0x80, 0xff, 0x3f, 0x00, 0x00,
  1002               0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x00},
  1003              {0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x80,
  1004               0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xe0,
  1005               0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00,
  1006               0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff}},
  1007             {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
  1008               0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
  1009               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
  1010               0x00, 0x1e, 0xf8, 0xff, 0xff, 0xff, 0xfd, 0xff},
  1011              {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f,
  1012               0x00, 0x00, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xe0,
  1013               0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff,
  1014               0xf3, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}},
  1015             {{0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00,
  1016               0x00, 0x1c, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
  1017               0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0x00,
  1018               0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff},
  1019              {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00,
  1020               0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1021               0xff, 0x1f, 0x00, 0x00, 0x80, 0xff, 0xff, 0x3f,
  1022               0x00, 0xfe, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff}},
  1023             {{0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xfc, 0x9f,
  1024               0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x80,
  1025               0xff, 0x0f, 0xfc, 0xff, 0x7f, 0x00, 0x00, 0x00,
  1026               0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},
  1027              {0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
  1028               0x00, 0x00, 0xf8, 0xff, 0x0f, 0xc0, 0xff, 0xff,
  1029               0xff, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff,
  1030               0xff, 0xff, 0xff, 0x07, 0x80, 0xff, 0xff, 0xff}},
  1031             {{0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00,
  1032               0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
  1033               0xf7, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x00,
  1034               0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xf0},
  1035              {0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff,
  1036               0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,
  1037               0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff,
  1038               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
  1039             {{0x00, 0xf8, 0xff, 0x03, 0xff, 0xff, 0xff, 0x00,
  1040               0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
  1041               0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
  1042               0xff, 0xff, 0x03, 0xc0, 0xff, 0x0f, 0xfc, 0xff},
  1043              {0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff,
  1044               0xff, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x00, 0xc0,
  1045               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1046               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
  1047             {{0x8f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1048               0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff,
  1049               0xff, 0x7f, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
  1050               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},
  1051              {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1052               0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1053               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1054               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
  1055             {{0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff,
  1056               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1057               0xff, 0xff, 0x03, 0x00, 0x80, 0x00, 0x00, 0x80,
  1058               0xff, 0xff, 0xff, 0x00, 0x00, 0x80, 0xff, 0x7f},
  1059              {0xff, 0xcf, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,
  1060               0x00, 0xc0, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff,
  1061               0xbf, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00,
  1062               0x80, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00}},
  1063             {{0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff,
  1064               0xff, 0xff, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff,
  1065               0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x80,
  1066               0xff, 0x01, 0xfc, 0xff, 0x01, 0x00, 0xfe, 0xff},
  1067              {0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00,
  1068               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1069               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
  1070               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00}},
  1071             {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
  1072               0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1073               0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1074               0x7f, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80},
  1075              {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1076               0x00, 0xf8, 0xff, 0x01, 0x00, 0xf0, 0xff, 0xff,
  1077               0xe0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
  1078               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
  1079             {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1080               0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1081               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1082               0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x00},
  1083              {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
  1084               0xfc, 0xff, 0xff, 0x3f, 0xf0, 0xff, 0xff, 0x3f,
  1085               0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x00, 0xff,
  1086               0xff, 0xff, 0xff, 0xff, 0x0f, 0x7e, 0x00, 0x00}},
  1087             {{0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
  1088               0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
  1089               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1090               0xff, 0xff, 0x1f, 0x00, 0x00, 0xfe, 0x07, 0x00},
  1091              {0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff,
  1092               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1093               0xff, 0xfb, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00,
  1094               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60}},
  1095             {{0xff, 0x01, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00,
  1096               0x80, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x03,
  1097               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1098               0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
  1099              {0xff, 0xff, 0x1f, 0x00, 0xf0, 0xff, 0xff, 0xff,
  1100               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1101               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1102               0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00}},
  1103             {{0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
  1104               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1105               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1106               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
  1107              {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1108               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff,
  1109               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03,
  1110               0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff}},
  1111             {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
  1112               0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1113               0xc0, 0xff, 0xff, 0xcf, 0xff, 0x1f, 0x00, 0x00,
  1114               0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80},
  1115              {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1116               0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
  1117               0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x7e,
  1118               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
  1119             {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1120               0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff,
  1121               0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
  1122               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00},
  1123              {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
  1124               0xff, 0xff, 0x7f, 0x00, 0x80, 0x00, 0x00, 0x00,
  1125               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
  1126               0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff}},
  1127             {{0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x80,
  1128               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
  1129               0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
  1130               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},
  1131              {0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1132               0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x80,
  1133               0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
  1134               0xff, 0x7f, 0xf8, 0xff, 0xff, 0x1f, 0x00, 0xfe}},
  1135             {{0xff, 0xff, 0xff, 0x3f, 0xf8, 0xff, 0xff, 0xff,
  1136               0xff, 0x03, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00,
  1137               0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1138               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07},
  1139              {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
  1140               0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
  1141               0xff, 0xff, 0xff, 0xff, 0x01, 0x80, 0xff, 0xff,
  1142               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}},
  1143             {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1144               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1145               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1146               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
  1147              {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1148               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
  1149               0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
  1150               0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40}},
  1151             {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1152               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1153               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1154               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
  1155              {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1156               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1157               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1158               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
  1159             {{0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1160               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1161               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1162               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
  1163              {0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1164               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1165               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1166               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
  1167             {{0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xc0,
  1168               0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1169               0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff,
  1170               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f},
  1171              {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00,
  1172               0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00,
  1173               0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff,
  1174               0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff}},
  1175             {{0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1176               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1177               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1178               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
  1179              {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1180               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1181               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1182               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}},
  1183             {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1184               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
  1185               0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
  1186               0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40},
  1187              {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1188               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1189               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1190               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}},
  1191             {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1192               0x7e, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x07, 0x00,
  1193               0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
  1194               0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
  1195              {0xff, 0x01, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
  1196               0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x80,
  1197               0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00,
  1198               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
  1199             {{0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x00,
  1200               0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
  1201               0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
  1202               0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff},
  1203              {0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
  1204               0xff, 0xff, 0x3f, 0x00, 0xf8, 0xff, 0xff, 0xff,
  1205               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1206               0xff, 0x3f, 0x00, 0x00, 0xc0, 0xf1, 0x7f, 0x00}},
  1207             {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
  1208               0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff,
  1209               0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
  1210               0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00},
  1211              {0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
  1212               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff,
  1213               0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f,
  1214               0x00, 0x00, 0xfc, 0xff, 0xff, 0x01, 0xff, 0xff}},
  1215             {{0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
  1216               0x80, 0x00, 0x00, 0x80, 0xff, 0x03, 0xe0, 0x01,
  1217               0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfc, 0xff,
  1218               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},
  1219              {0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
  1220               0xfe, 0xff, 0xff, 0xf0, 0x07, 0x00, 0x3c, 0x80,
  1221               0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff,
  1222               0xff, 0xff, 0x07, 0xe0, 0xff, 0x00, 0x00, 0x00}},
  1223             {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
  1224               0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1225               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf8,
  1226               0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80},
  1227              {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1228               0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x80, 0x00,
  1229               0x00, 0x00, 0x00, 0xc0, 0x7f, 0xfe, 0xff, 0x1f,
  1230               0x00, 0xfe, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff}},
  1231             {{0xff, 0xff, 0x81, 0xff, 0xff, 0xff, 0xff, 0x00,
  1232               0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83,
  1233               0xff, 0xff, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
  1234               0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xf0},
  1235              {0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff,
  1236               0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00,
  1237               0xf8, 0x07, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
  1238               0xff, 0xc7, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff}},
  1239             {{0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
  1240               0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
  1241               0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x03, 0xfb,
  1242               0xfa, 0x8a, 0x7d, 0xdf, 0x13, 0x86, 0xe2, 0x03},
  1243              {0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
  1244               0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
  1245               0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x03, 0xfb,
  1246               0xfa, 0x8a, 0x7d, 0xdf, 0x13, 0x86, 0xe2, 0x03}}
  1248         unsigned char res[33][2][32] = {
  1249             {{0x0c, 0x3b, 0x0a, 0xca, 0x8d, 0x1a, 0x2f, 0xb9,
  1250               0x8a, 0x7b, 0x53, 0x5a, 0x1f, 0xc5, 0x22, 0xa1,
  1251               0x07, 0x2a, 0x48, 0xea, 0x02, 0xeb, 0xb3, 0xd6,
  1252               0x20, 0x1e, 0x86, 0xd0, 0x95, 0xf6, 0x92, 0x35},
  1253              {0xdc, 0x90, 0x7a, 0x07, 0x2e, 0x1e, 0x44, 0x6d,
  1254               0xf8, 0x15, 0x24, 0x5b, 0x5a, 0x96, 0x37, 0x9c,
  1255               0x37, 0x7b, 0x0d, 0xac, 0x1b, 0x65, 0x58, 0x49,
  1256               0x43, 0xb7, 0x31, 0xbb, 0xa7, 0xf4, 0x97, 0x15}},
  1257             {{0xf1, 0xf7, 0x3a, 0x50, 0xe6, 0x10, 0xba, 0x22,
  1258               0x43, 0x4d, 0x1f, 0x1f, 0x7c, 0x27, 0xca, 0x9c,
  1259               0xb8, 0xb6, 0xa0, 0xfc, 0xd8, 0xc0, 0x05, 0x2f,
  1260               0xf7, 0x08, 0xe1, 0x76, 0xdd, 0xd0, 0x80, 0xc8},
  1261              {0xe3, 0x80, 0x80, 0xb8, 0xdb, 0xe3, 0xa9, 0x77,
  1262               0x00, 0xb0, 0xf5, 0x2e, 0x27, 0xe2, 0x68, 0xc4,
  1263               0x88, 0xe8, 0x04, 0xc1, 0x12, 0xbf, 0x78, 0x59,
  1264               0xe6, 0xa9, 0x7c, 0xe1, 0x81, 0xdd, 0xb9, 0xd5}},
  1265             {{0x96, 0xe2, 0xee, 0x01, 0xa6, 0x80, 0x31, 0xef,
  1266               0x5c, 0xd0, 0x19, 0xb4, 0x7d, 0x5f, 0x79, 0xab,
  1267               0xa1, 0x97, 0xd3, 0x7e, 0x33, 0xbb, 0x86, 0x55,
  1268               0x60, 0x20, 0x10, 0x0d, 0x94, 0x2d, 0x11, 0x7c},
  1269              {0xcc, 0xab, 0xe0, 0xe8, 0x98, 0x65, 0x12, 0x96,
  1270               0x38, 0x5a, 0x1a, 0xf2, 0x85, 0x23, 0x59, 0x5f,
  1271               0xf9, 0xf3, 0xc2, 0x81, 0x70, 0x92, 0x65, 0x12,
  1272               0x9c, 0x65, 0x1e, 0x96, 0x00, 0xef, 0xe7, 0x63}},
  1273             {{0xac, 0x1e, 0x62, 0xc2, 0x59, 0xfc, 0x4e, 0x5c,
  1274               0x83, 0xb0, 0xd0, 0x6f, 0xce, 0x19, 0xf6, 0xbf,
  1275               0xa4, 0xb0, 0xe0, 0x53, 0x66, 0x1f, 0xbf, 0xc9,
  1276               0x33, 0x47, 0x37, 0xa9, 0x3d, 0x5d, 0xb0, 0x48},
  1277              {0x86, 0xb9, 0x2a, 0x7f, 0x8e, 0xa8, 0x60, 0x42,
  1278               0x26, 0x6d, 0x6e, 0x1c, 0xa2, 0xec, 0xe0, 0xe5,
  1279               0x3e, 0x0a, 0x33, 0xbb, 0x61, 0x4c, 0x9f, 0x3c,
  1280               0xd1, 0xdf, 0x49, 0x33, 0xcd, 0x72, 0x78, 0x18}},
  1281             {{0xf7, 0xd3, 0xcd, 0x49, 0x5c, 0x13, 0x22, 0xfb,
  1282               0x2e, 0xb2, 0x2f, 0x27, 0xf5, 0x8a, 0x5d, 0x74,
  1283               0xc1, 0x58, 0xc5, 0xc2, 0x2d, 0x9f, 0x52, 0xc6,
  1284               0x63, 0x9f, 0xba, 0x05, 0x76, 0x45, 0x7a, 0x63},
  1285              {0x8a, 0xfa, 0x55, 0x4d, 0xdd, 0xa3, 0xb2, 0xc3,
  1286               0x44, 0xfd, 0xec, 0x72, 0xde, 0xef, 0xc0, 0x99,
  1287               0xf5, 0x9f, 0xe2, 0x52, 0xb4, 0x05, 0x32, 0x58,
  1288               0x57, 0xc1, 0x8f, 0xea, 0xc3, 0x24, 0x5b, 0x94}},
  1289             {{0x05, 0x83, 0xee, 0xdd, 0x64, 0xf0, 0x14, 0x3b,
  1290               0xa0, 0x14, 0x4a, 0x3a, 0x41, 0x82, 0x7c, 0xa7,
  1291               0x2c, 0xaa, 0xb1, 0x76, 0xbb, 0x59, 0x64, 0x5f,
  1292               0x52, 0xad, 0x25, 0x29, 0x9d, 0x8f, 0x0b, 0xb0},
  1293              {0x7e, 0xe3, 0x7c, 0xca, 0xcd, 0x4f, 0xb0, 0x6d,
  1294               0x7a, 0xb2, 0x3e, 0xa0, 0x08, 0xb9, 0xa8, 0x2d,
  1295               0xc2, 0xf4, 0x99, 0x66, 0xcc, 0xac, 0xd8, 0xb9,
  1296               0x72, 0x2a, 0x4a, 0x3e, 0x0f, 0x7b, 0xbf, 0xf4}},
  1297             {{0x8c, 0x9c, 0x78, 0x2b, 0x39, 0x61, 0x7e, 0xf7,
  1298               0x65, 0x37, 0x66, 0x09, 0x38, 0xb9, 0x6f, 0x70,
  1299               0x78, 0x87, 0xff, 0xcf, 0x93, 0xca, 0x85, 0x06,
  1300               0x44, 0x84, 0xa7, 0xfe, 0xd3, 0xa4, 0xe3, 0x7e},
  1301              {0xa2, 0x56, 0x49, 0x23, 0x54, 0xa5, 0x50, 0xe9,
  1302               0x5f, 0xf0, 0x4d, 0xe7, 0xdc, 0x38, 0x32, 0x79,
  1303               0x4f, 0x1c, 0xb7, 0xe4, 0xbb, 0xf8, 0xbb, 0x2e,
  1304               0x40, 0x41, 0x4b, 0xcc, 0xe3, 0x1e, 0x16, 0x36}},
  1305             {{0x0c, 0x1e, 0xd7, 0x09, 0x25, 0x40, 0x97, 0xcb,
  1306               0x5c, 0x46, 0xa8, 0xda, 0xef, 0x25, 0xd5, 0xe5,
  1307               0x92, 0x4d, 0xcf, 0xa3, 0xc4, 0x5d, 0x35, 0x4a,
  1308               0xe4, 0x61, 0x92, 0xf3, 0xbf, 0x0e, 0xcd, 0xbe},
  1309              {0xe4, 0xaf, 0x0a, 0xb3, 0x30, 0x8b, 0x9b, 0x48,
  1310               0x49, 0x43, 0xc7, 0x64, 0x60, 0x4a, 0x2b, 0x9e,
  1311               0x95, 0x5f, 0x56, 0xe8, 0x35, 0xdc, 0xeb, 0xdc,
  1312               0xc7, 0xc4, 0xfe, 0x30, 0x40, 0xc7, 0xbf, 0xa4}},
  1313             {{0xd4, 0xa0, 0xf5, 0x81, 0x49, 0x6b, 0xb6, 0x8b,
  1314               0x0a, 0x69, 0xf9, 0xfe, 0xa8, 0x32, 0xe5, 0xe0,
  1315               0xa5, 0xcd, 0x02, 0x53, 0xf9, 0x2c, 0xe3, 0x53,
  1316               0x83, 0x36, 0xc6, 0x02, 0xb5, 0xeb, 0x64, 0xb8},
  1317              {0x1d, 0x42, 0xb9, 0xf9, 0xe9, 0xe3, 0x93, 0x2c,
  1318               0x4c, 0xee, 0x6c, 0x5a, 0x47, 0x9e, 0x62, 0x01,
  1319               0x6b, 0x04, 0xfe, 0xa4, 0x30, 0x2b, 0x0d, 0x4f,
  1320               0x71, 0x10, 0xd3, 0x55, 0xca, 0xf3, 0x5e, 0x80}},
  1321             {{0x77, 0x05, 0xf6, 0x0c, 0x15, 0x9b, 0x45, 0xe7,
  1322               0xb9, 0x11, 0xb8, 0xf5, 0xd6, 0xda, 0x73, 0x0c,
  1323               0xda, 0x92, 0xea, 0xd0, 0x9d, 0xd0, 0x18, 0x92,
  1324               0xce, 0x9a, 0xaa, 0xee, 0x0f, 0xef, 0xde, 0x30},
  1325              {0xf1, 0xf1, 0xd6, 0x9b, 0x51, 0xd7, 0x77, 0x62,
  1326               0x52, 0x10, 0xb8, 0x7a, 0x84, 0x9d, 0x15, 0x4e,
  1327               0x07, 0xdc, 0x1e, 0x75, 0x0d, 0x0c, 0x3b, 0xdb,
  1328               0x74, 0x58, 0x62, 0x02, 0x90, 0x54, 0x8b, 0x43}},
  1329             {{0xa6, 0xfe, 0x0b, 0x87, 0x80, 0x43, 0x67, 0x25,
  1330               0x57, 0x5d, 0xec, 0x40, 0x50, 0x08, 0xd5, 0x5d,
  1331               0x43, 0xd7, 0xe0, 0xaa, 0xe0, 0x13, 0xb6, 0xb0,
  1332               0xc0, 0xd4, 0xe5, 0x0d, 0x45, 0x83, 0xd6, 0x13},
  1333              {0x40, 0x45, 0x0a, 0x92, 0x31, 0xea, 0x8c, 0x60,
  1334               0x8c, 0x1f, 0xd8, 0x76, 0x45, 0xb9, 0x29, 0x00,
  1335               0x26, 0x32, 0xd8, 0xa6, 0x96, 0x88, 0xe2, 0xc4,
  1336               0x8b, 0xdb, 0x7f, 0x17, 0x87, 0xcc, 0xc8, 0xf2}},
  1337             {{0xc2, 0x56, 0xe2, 0xb6, 0x1a, 0x81, 0xe7, 0x31,
  1338               0x63, 0x2e, 0xbb, 0x0d, 0x2f, 0x81, 0x67, 0xd4,
  1339               0x22, 0xe2, 0x38, 0x02, 0x25, 0x97, 0xc7, 0x88,
  1340               0x6e, 0xdf, 0xbe, 0x2a, 0xa5, 0x73, 0x63, 0xaa},
  1341              {0x50, 0x45, 0xe2, 0xc3, 0xbd, 0x89, 0xfc, 0x57,
  1342               0xbd, 0x3c, 0xa3, 0x98, 0x7e, 0x7f, 0x36, 0x38,
  1343               0x92, 0x39, 0x1f, 0x0f, 0x81, 0x1a, 0x06, 0x51,
  1344               0x1f, 0x8d, 0x6a, 0xff, 0x47, 0x16, 0x06, 0x9c}},
  1345             {{0x33, 0x95, 0xa2, 0x6f, 0x27, 0x5f, 0x9c, 0x9c,
  1346               0x64, 0x45, 0xcb, 0xd1, 0x3c, 0xee, 0x5e, 0x5f,
  1347               0x48, 0xa6, 0xaf, 0xe3, 0x79, 0xcf, 0xb1, 0xe2,
  1348               0xbf, 0x55, 0x0e, 0xa2, 0x3b, 0x62, 0xf0, 0xe4},
  1349              {0x14, 0xe8, 0x06, 0xe3, 0xbe, 0x7e, 0x67, 0x01,
  1350               0xc5, 0x21, 0x67, 0xd8, 0x54, 0xb5, 0x7f, 0xa4,
  1351               0xf9, 0x75, 0x70, 0x1c, 0xfd, 0x79, 0xdb, 0x86,
  1352               0xad, 0x37, 0x85, 0x83, 0x56, 0x4e, 0xf0, 0xbf}},
  1353             {{0xbc, 0xa6, 0xe0, 0x56, 0x4e, 0xef, 0xfa, 0xf5,
  1354               0x1d, 0x5d, 0x3f, 0x2a, 0x5b, 0x19, 0xab, 0x51,
  1355               0xc5, 0x8b, 0xdd, 0x98, 0x28, 0x35, 0x2f, 0xc3,
  1356               0x81, 0x4f, 0x5c, 0xe5, 0x70, 0xb9, 0xeb, 0x62},
  1357              {0xc4, 0x6d, 0x26, 0xb0, 0x17, 0x6b, 0xfe, 0x6c,
  1358               0x12, 0xf8, 0xe7, 0xc1, 0xf5, 0x2f, 0xfa, 0x91,
  1359               0x13, 0x27, 0xbd, 0x73, 0xcc, 0x33, 0x31, 0x1c,
  1360               0x39, 0xe3, 0x27, 0x6a, 0x95, 0xcf, 0xc5, 0xfb}},
  1361             {{0x30, 0xb2, 0x99, 0x84, 0xf0, 0x18, 0x2a, 0x6e,
  1362               0x1e, 0x27, 0xed, 0xa2, 0x29, 0x99, 0x41, 0x56,
  1363               0xe8, 0xd4, 0x0d, 0xef, 0x99, 0x9c, 0xf3, 0x58,
  1364               0x29, 0x55, 0x1a, 0xc0, 0x68, 0xd6, 0x74, 0xa4},
  1365              {0x07, 0x9c, 0xe7, 0xec, 0xf5, 0x36, 0x73, 0x41,
  1366               0xa3, 0x1c, 0xe5, 0x93, 0x97, 0x6a, 0xfd, 0xf7,
  1367               0x53, 0x18, 0xab, 0xaf, 0xeb, 0x85, 0xbd, 0x92,
  1368               0x90, 0xab, 0x3c, 0xbf, 0x30, 0x82, 0xad, 0xf6}},
  1369             {{0xc6, 0x87, 0x8a, 0x2a, 0xea, 0xc0, 0xa9, 0xec,
  1370               0x6d, 0xd3, 0xdc, 0x32, 0x23, 0xce, 0x62, 0x19,
  1371               0xa4, 0x7e, 0xa8, 0xdd, 0x1c, 0x33, 0xae, 0xd3,
  1372               0x4f, 0x62, 0x9f, 0x52, 0xe7, 0x65, 0x46, 0xf4},
  1373              {0x97, 0x51, 0x27, 0x67, 0x2d, 0xa2, 0x82, 0x87,
  1374               0x98, 0xd3, 0xb6, 0x14, 0x7f, 0x51, 0xd3, 0x9a,
  1375               0x0b, 0xd0, 0x76, 0x81, 0xb2, 0x4f, 0x58, 0x92,
  1376               0xa4, 0x86, 0xa1, 0xa7, 0x09, 0x1d, 0xef, 0x9b}},
  1377             {{0xb3, 0x0f, 0x2b, 0x69, 0x0d, 0x06, 0x90, 0x64,
  1378               0xbd, 0x43, 0x4c, 0x10, 0xe8, 0x98, 0x1c, 0xa3,
  1379               0xe1, 0x68, 0xe9, 0x79, 0x6c, 0x29, 0x51, 0x3f,
  1380               0x41, 0xdc, 0xdf, 0x1f, 0xf3, 0x60, 0xbe, 0x33},
  1381              {0xa1, 0x5f, 0xf7, 0x1d, 0xb4, 0x3e, 0x9b, 0x3c,
  1382               0xe7, 0xbd, 0xb6, 0x06, 0xd5, 0x60, 0x06, 0x6d,
  1383               0x50, 0xd2, 0xf4, 0x1a, 0x31, 0x08, 0xf2, 0xea,
  1384               0x8e, 0xef, 0x5f, 0x7d, 0xb6, 0xd0, 0xc0, 0x27}},
  1385             {{0x62, 0x9a, 0xd9, 0xbb, 0x38, 0x36, 0xce, 0xf7,
  1386               0x5d, 0x2f, 0x13, 0xec, 0xc8, 0x2d, 0x02, 0x8a,
  1387               0x2e, 0x72, 0xf0, 0xe5, 0x15, 0x9d, 0x72, 0xae,
  1388               0xfc, 0xb3, 0x4f, 0x02, 0xea, 0xe1, 0x09, 0xfe},
  1389              {0x00, 0x00, 0x00, 0x00, 0xfa, 0x0a, 0x3d, 0xbc,
  1390               0xad, 0x16, 0x0c, 0xb6, 0xe7, 0x7c, 0x8b, 0x39,
  1391               0x9a, 0x43, 0xbb, 0xe3, 0xc2, 0x55, 0x15, 0x14,
  1392               0x75, 0xac, 0x90, 0x9b, 0x7f, 0x9a, 0x92, 0x00}},
  1393             {{0x8b, 0xac, 0x70, 0x86, 0x29, 0x8f, 0x00, 0x23,
  1394               0x7b, 0x45, 0x30, 0xaa, 0xb8, 0x4c, 0xc7, 0x8d,
  1395               0x4e, 0x47, 0x85, 0xc6, 0x19, 0xe3, 0x96, 0xc2,
  1396               0x9a, 0xa0, 0x12, 0xed, 0x6f, 0xd7, 0x76, 0x16},
  1397              {0x45, 0xaf, 0x7e, 0x33, 0xc7, 0x7f, 0x10, 0x6c,
  1398               0x7c, 0x9f, 0x29, 0xc1, 0xa8, 0x7e, 0x15, 0x84,
  1399               0xe7, 0x7d, 0xc0, 0x6d, 0xab, 0x71, 0x5d, 0xd0,
  1400               0x6b, 0x9f, 0x97, 0xab, 0xcb, 0x51, 0x0c, 0x9f}},
  1401             {{0x9e, 0xc3, 0x92, 0xb4, 0x04, 0x9f, 0xc8, 0xbb,
  1402               0xdd, 0x9e, 0xc6, 0x05, 0xfd, 0x65, 0xec, 0x94,
  1403               0x7f, 0x2c, 0x16, 0xc4, 0x40, 0xac, 0x63, 0x7b,
  1404               0x7d, 0xb8, 0x0c, 0xe4, 0x5b, 0xe3, 0xa7, 0x0e},
  1405              {0x43, 0xf4, 0x44, 0xe8, 0xcc, 0xc8, 0xd4, 0x54,
  1406               0x33, 0x37, 0x50, 0xf2, 0x87, 0x42, 0x2e, 0x00,
  1407               0x49, 0x60, 0x62, 0x02, 0xfd, 0x1a, 0x7c, 0xdb,
  1408               0x29, 0x6c, 0x6d, 0x54, 0x53, 0x08, 0xd1, 0xc8}},
  1409             {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1410               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1411               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1412               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
  1413              {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1414               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1415               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1416               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
  1417             {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1418               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1419               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1420               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
  1421              {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1422               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1423               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1424               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}},
  1425             {{0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1,
  1426               0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0,
  1427               0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59,
  1428               0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92},
  1429              {0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1,
  1430               0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0,
  1431               0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59,
  1432               0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}},
  1433             {{0x28, 0x56, 0xac, 0x0e, 0x4f, 0x98, 0x09, 0xf0,
  1434               0x49, 0xfa, 0x7f, 0x84, 0xac, 0x7e, 0x50, 0x5b,
  1435               0x17, 0x43, 0x14, 0x89, 0x9c, 0x53, 0xa8, 0x94,
  1436               0x30, 0xf2, 0x11, 0x4d, 0x92, 0x14, 0x27, 0xe8},
  1437              {0x39, 0x7a, 0x84, 0x56, 0x79, 0x9d, 0xec, 0x26,
  1438               0x2c, 0x53, 0xc1, 0x94, 0xc9, 0x8d, 0x9e, 0x9d,
  1439               0x32, 0x1f, 0xdd, 0x84, 0x04, 0xe8, 0xe2, 0x0a,
  1440               0x6b, 0xbe, 0xbb, 0x42, 0x40, 0x67, 0x30, 0x6c}},
  1441             {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1442               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
  1443               0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4,
  1444               0x40, 0x2d, 0xa1, 0x73, 0x2f, 0xc9, 0xbe, 0xbd},
  1445              {0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1,
  1446               0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0,
  1447               0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59,
  1448               0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}},
  1449             {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1450               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
  1451               0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
  1452               0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40},
  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, 0x01}},
  1457             {{0x1c, 0xc4, 0xf7, 0xda, 0x0f, 0x65, 0xca, 0x39,
  1458               0x70, 0x52, 0x92, 0x8e, 0xc3, 0xc8, 0x15, 0xea,
  1459               0x7f, 0x10, 0x9e, 0x77, 0x4b, 0x6e, 0x2d, 0xdf,
  1460               0xe8, 0x30, 0x9d, 0xda, 0xe8, 0x9a, 0x65, 0xae},
  1461              {0x02, 0xb0, 0x16, 0xb1, 0x1d, 0xc8, 0x57, 0x7b,
  1462               0xa2, 0x3a, 0xa2, 0xa3, 0x38, 0x5c, 0x8f, 0xeb,
  1463               0x66, 0x37, 0x91, 0xa8, 0x5f, 0xef, 0x04, 0xf6,
  1464               0x59, 0x75, 0xe1, 0xee, 0x92, 0xf6, 0x0e, 0x30}},
  1465             {{0x8d, 0x76, 0x14, 0xa4, 0x14, 0x06, 0x9f, 0x9a,
  1466               0xdf, 0x4a, 0x85, 0xa7, 0x6b, 0xbf, 0x29, 0x6f,
  1467               0xbc, 0x34, 0x87, 0x5d, 0xeb, 0xbb, 0x2e, 0xa9,
  1468               0xc9, 0x1f, 0x58, 0xd6, 0x9a, 0x82, 0xa0, 0x56},
  1469              {0xd4, 0xb9, 0xdb, 0x88, 0x1d, 0x04, 0xe9, 0x93,
  1470               0x8d, 0x3f, 0x20, 0xd5, 0x86, 0xa8, 0x83, 0x07,
  1471               0xdb, 0x09, 0xd8, 0x22, 0x1f, 0x7f, 0xf1, 0x71,
  1472               0xc8, 0xe7, 0x5d, 0x47, 0xaf, 0x8b, 0x72, 0xe9}},
  1473             {{0x83, 0xb9, 0x39, 0xb2, 0xa4, 0xdf, 0x46, 0x87,
  1474               0xc2, 0xb8, 0xf1, 0xe6, 0x4c, 0xd1, 0xe2, 0xa9,
  1475               0xe4, 0x70, 0x30, 0x34, 0xbc, 0x52, 0x7c, 0x55,
  1476               0xa6, 0xec, 0x80, 0xa4, 0xe5, 0xd2, 0xdc, 0x73},
  1477              {0x08, 0xf1, 0x03, 0xcf, 0x16, 0x73, 0xe8, 0x7d,
  1478               0xb6, 0x7e, 0x9b, 0xc0, 0xb4, 0xc2, 0xa5, 0x86,
  1479               0x02, 0x77, 0xd5, 0x27, 0x86, 0xa5, 0x15, 0xfb,
  1480               0xae, 0x9b, 0x8c, 0xa9, 0xf9, 0xf8, 0xa8, 0x4a}},
  1481             {{0x8b, 0x00, 0x49, 0xdb, 0xfa, 0xf0, 0x1b, 0xa2,
  1482               0xed, 0x8a, 0x9a, 0x7a, 0x36, 0x78, 0x4a, 0xc7,
  1483               0xf7, 0xad, 0x39, 0xd0, 0x6c, 0x65, 0x7a, 0x41,
  1484               0xce, 0xd6, 0xd6, 0x4c, 0x20, 0x21, 0x6b, 0xc7},
  1485              {0xc6, 0xca, 0x78, 0x1d, 0x32, 0x6c, 0x6c, 0x06,
  1486               0x91, 0xf2, 0x1a, 0xe8, 0x43, 0x16, 0xea, 0x04,
  1487               0x3c, 0x1f, 0x07, 0x85, 0xf7, 0x09, 0x22, 0x08,
  1488               0xba, 0x13, 0xfd, 0x78, 0x1e, 0x3f, 0x6f, 0x62}},
  1489             {{0x25, 0x9b, 0x7c, 0xb0, 0xac, 0x72, 0x6f, 0xb2,
  1490               0xe3, 0x53, 0x84, 0x7a, 0x1a, 0x9a, 0x98, 0x9b,
  1491               0x44, 0xd3, 0x59, 0xd0, 0x8e, 0x57, 0x41, 0x40,
  1492               0x78, 0xa7, 0x30, 0x2f, 0x4c, 0x9c, 0xb9, 0x68},
  1493              {0xb7, 0x75, 0x03, 0x63, 0x61, 0xc2, 0x48, 0x6e,
  1494               0x12, 0x3d, 0xbf, 0x4b, 0x27, 0xdf, 0xb1, 0x7a,
  1495               0xff, 0x4e, 0x31, 0x07, 0x83, 0xf4, 0x62, 0x5b,
  1496               0x19, 0xa5, 0xac, 0xa0, 0x32, 0x58, 0x0d, 0xa7}},
  1497             {{0x43, 0x4f, 0x10, 0xa4, 0xca, 0xdb, 0x38, 0x67,
  1498               0xfa, 0xae, 0x96, 0xb5, 0x6d, 0x97, 0xff, 0x1f,
  1499               0xb6, 0x83, 0x43, 0xd3, 0xa0, 0x2d, 0x70, 0x7a,
  1500               0x64, 0x05, 0x4c, 0xa7, 0xc1, 0xa5, 0x21, 0x51},
  1501              {0xe4, 0xf1, 0x23, 0x84, 0xe1, 0xb5, 0x9d, 0xf2,
  1502               0xb8, 0x73, 0x8b, 0x45, 0x2b, 0x35, 0x46, 0x38,
  1503               0x10, 0x2b, 0x50, 0xf8, 0x8b, 0x35, 0xcd, 0x34,
  1504               0xc8, 0x0e, 0xf6, 0xdb, 0x09, 0x35, 0xf0, 0xda}},
  1505             {{0xdb, 0x21, 0x5c, 0x8d, 0x83, 0x1d, 0xb3, 0x34,
  1506               0xc7, 0x0e, 0x43, 0xa1, 0x58, 0x79, 0x67, 0x13,
  1507               0x1e, 0x86, 0x5d, 0x89, 0x63, 0xe6, 0x0a, 0x46,
  1508               0x5c, 0x02, 0x97, 0x1b, 0x62, 0x43, 0x86, 0xf5},
  1509              {0xdb, 0x21, 0x5c, 0x8d, 0x83, 0x1d, 0xb3, 0x34,
  1510               0xc7, 0x0e, 0x43, 0xa1, 0x58, 0x79, 0x67, 0x13,
  1511               0x1e, 0x86, 0x5d, 0x89, 0x63, 0xe6, 0x0a, 0x46,
  1512               0x5c, 0x02, 0x97, 0x1b, 0x62, 0x43, 0x86, 0xf5}}
  1514         secp256k1_scalar_set_int(&one, 1);
  1515         for (i = 0; i < 33; i++) {
  1516             secp256k1_scalar_set_b32(&x, chal[i][0], &overflow);
  1518             secp256k1_scalar_set_b32(&y, chal[i][1], &overflow);
  1520             secp256k1_scalar_set_b32(&r1, res[i][0], &overflow);
  1522             secp256k1_scalar_set_b32(&r2, res[i][1], &overflow);
  1524             secp256k1_scalar_mul(&z, &x, &y);
  1525             CHECK(!secp256k1_scalar_check_overflow(&z));
  1526             CHECK(secp256k1_scalar_eq(&r1, &z));
  1527             if (!secp256k1_scalar_is_zero(&y)) {
  1528                 secp256k1_scalar_inverse(&zz, &y);
  1529                 CHECK(!secp256k1_scalar_check_overflow(&zz));
  1530 #if defined(USE_SCALAR_INV_NUM)  1531                 secp256k1_scalar_inverse_var(&zzv, &y);
  1532                 CHECK(secp256k1_scalar_eq(&zzv, &zz));
  1534                 secp256k1_scalar_mul(&z, &z, &zz);
  1535                 CHECK(!secp256k1_scalar_check_overflow(&z));
  1536                 CHECK(secp256k1_scalar_eq(&x, &z));
  1537                 secp256k1_scalar_mul(&zz, &zz, &y);
  1538                 CHECK(!secp256k1_scalar_check_overflow(&zz));
  1539                 CHECK(secp256k1_scalar_eq(&one, &zz));
  1541             secp256k1_scalar_mul(&z, &x, &x);
  1542             CHECK(!secp256k1_scalar_check_overflow(&z));
  1543             secp256k1_scalar_sqr(&zz, &x);
  1544             CHECK(!secp256k1_scalar_check_overflow(&zz));
  1545             CHECK(secp256k1_scalar_eq(&zz, &z));
  1546             CHECK(secp256k1_scalar_eq(&r2, &zz));
  1554     unsigned char bin[32];
  1556         secp256k1_rand256(bin);
  1557         if (secp256k1_fe_set_b32(x, bin)) {
  1564     unsigned char bin[32];
  1566         secp256k1_rand256_test(bin);
  1567         if (secp256k1_fe_set_b32(x, bin)) {
  1575     while (--tries >= 0) {
  1577         secp256k1_fe_normalize(nz);
  1578         if (!secp256k1_fe_is_zero(nz)) {
  1589     if (secp256k1_fe_sqrt(&r, ns)) {
  1590         secp256k1_fe_negate(ns, ns, 1);
  1597     secp256k1_fe_normalize_weak(&an);
  1598     secp256k1_fe_normalize_var(&bn);
  1599     return secp256k1_fe_equal_var(&an, &bn);
  1605     secp256k1_fe_mul(&x, a, ai);
  1610     static const unsigned char b32[32] = {
  1611         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
  1612         0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
  1613         0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,
  1614         0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x40
  1617         0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL,
  1618         0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL
  1621         0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL,
  1622         0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL
  1625     unsigned char b322[32];
  1628     CHECK(secp256k1_fe_set_b32(&fe2, b32));
  1629     CHECK(secp256k1_fe_equal_var(&fe, &fe2));
  1630     secp256k1_fe_from_storage(&fe2, &fes);
  1631     CHECK(secp256k1_fe_equal_var(&fe, &fe2));
  1633     secp256k1_fe_get_b32(b322, &fe);
  1634     CHECK(memcmp(b322, b32, 32) == 0);
  1635     secp256k1_fe_to_storage(&fes2, &fe);
  1636     CHECK(memcmp(&fes2, &fes, 
sizeof(fes)) == 0);
  1642     t.magnitude = a->magnitude;
  1643     t.normalized = a->normalized;
  1655     for (i = 0; i < 5*count; i++) {
  1660         CHECK(secp256k1_fe_cmp_var(&x, &x) == 0);
  1661         CHECK(secp256k1_fe_equal_var(&x, &x));
  1663         secp256k1_fe_add(&z,&y);
  1666         secp256k1_fe_cmov(&x, &z, 0);
  1667         VERIFY_CHECK(!x.normalized && x.magnitude == z.magnitude);
  1668         secp256k1_fe_cmov(&x, &x, 1);
  1671         secp256k1_fe_cmov(&q, &z, 1);
  1672         VERIFY_CHECK(!q.normalized && q.magnitude == z.magnitude);
  1674         secp256k1_fe_normalize_var(&x);
  1675         secp256k1_fe_normalize_var(&z);
  1676         CHECK(!secp256k1_fe_equal_var(&x, &z));
  1677         secp256k1_fe_normalize_var(&q);
  1678         secp256k1_fe_cmov(&q, &z, (i&1));
  1680         for (j = 0; j < 6; j++) {
  1681             secp256k1_fe_negate(&z, &z, j+1);
  1682             secp256k1_fe_normalize_var(&q);
  1683             secp256k1_fe_cmov(&q, &z, (j&1));
  1686         secp256k1_fe_normalize_var(&z);
  1688         secp256k1_fe_to_storage(&xs, &x);
  1689         secp256k1_fe_to_storage(&ys, &y);
  1690         secp256k1_fe_to_storage(&zs, &z);
  1691         secp256k1_fe_storage_cmov(&zs, &xs, 0);
  1692         secp256k1_fe_storage_cmov(&zs, &zs, 1);
  1693         CHECK(memcmp(&xs, &zs, 
sizeof(xs)) != 0);
  1694         secp256k1_fe_storage_cmov(&ys, &xs, 1);
  1695         CHECK(memcmp(&xs, &ys, 
sizeof(xs)) == 0);
  1696         secp256k1_fe_from_storage(&x, &xs);
  1697         secp256k1_fe_from_storage(&y, &ys);
  1698         secp256k1_fe_from_storage(&z, &zs);
  1700         secp256k1_fe_add(&y, &x);
  1701         secp256k1_fe_add(&y, &x);
  1703         secp256k1_fe_mul_int(&z, 3);
  1705         secp256k1_fe_add(&y, &x);
  1706         secp256k1_fe_add(&z, &x);
  1709         secp256k1_fe_mul_int(&z, 5);
  1710         secp256k1_fe_mul(&q, &x, &fe5);
  1712         secp256k1_fe_negate(&x, &x, 1);
  1713         secp256k1_fe_add(&z, &x);
  1714         secp256k1_fe_add(&q, &x);
  1723     for (i = 0; i < 10*count; i++) {
  1725         secp256k1_fe_inv(&xi, &x);
  1727         secp256k1_fe_inv(&xii, &xi);
  1735     for (i = 0; i < 10*count; i++) {
  1737         secp256k1_fe_inv_var(&xi, &x);
  1739         secp256k1_fe_inv_var(&xii, &xi);
  1748     secp256k1_fe_inv_all_var(xi, x, 0);
  1749     for (i = 0; i < count; i++) {
  1751         size_t len = secp256k1_rand_int(15) + 1;
  1752         for (j = 0; j < len; j++) {
  1755         secp256k1_fe_inv_all_var(xi, x, len);
  1756         for (j = 0; j < len; j++) {
  1759         secp256k1_fe_inv_all_var(xii, xi, len);
  1760         for (j = 0; j < len; j++) {
  1771         secp256k1_fe_set_int(&x, 1);
  1772         secp256k1_fe_negate(&x, &x, 1);
  1774         for (i = 1; i <= 512; ++i) {
  1775             secp256k1_fe_mul_int(&x, 2);
  1776             secp256k1_fe_normalize(&x);
  1777             secp256k1_fe_sqr(&s, &x);
  1784     int v = secp256k1_fe_sqrt(&r1, a);
  1785     CHECK((v == 0) == (k == NULL));
  1789         secp256k1_fe_negate(&r2, &r1, 1);
  1790         secp256k1_fe_add(&r1, k); secp256k1_fe_add(&r2, k);
  1791         secp256k1_fe_normalize(&r1); secp256k1_fe_normalize(&r2);
  1792         CHECK(secp256k1_fe_is_zero(&r1) || secp256k1_fe_is_zero(&r2));
  1801     secp256k1_fe_set_int(&x, 0);
  1802     secp256k1_fe_sqr(&s, &x);
  1806     for (i = 1; i <= 100; i++) {
  1807         secp256k1_fe_set_int(&x, i);
  1808         secp256k1_fe_sqr(&s, &x);
  1810         secp256k1_fe_negate(&t, &s, 1);
  1815     for (i = 0; i < 10; i++) {
  1818         for (j = 0; j < count; j++) {
  1820             secp256k1_fe_sqr(&s, &x);
  1822             secp256k1_fe_negate(&t, &s, 1);
  1824             secp256k1_fe_mul(&t, &s, &ns);
  1837     CHECK(secp256k1_fe_equal_var(&a->
x, &b->
x));
  1838     CHECK(secp256k1_fe_equal_var(&a->
y, &b->
y));
  1850         secp256k1_fe_normalize(&a2.
x);
  1851         secp256k1_fe_normalize(&a2.
y);
  1852         secp256k1_fe_normalize(&a2.
z);
  1853         secp256k1_fe_normalize(&b2.
x);
  1854         secp256k1_fe_normalize(&b2.
y);
  1855         secp256k1_fe_normalize(&b2.
z);
  1856         ret &= secp256k1_fe_cmp_var(&a2.
x, &b2.
x) == 0;
  1857         ret &= secp256k1_fe_cmp_var(&a2.
y, &b2.
y) == 0;
  1858         ret &= secp256k1_fe_cmp_var(&a2.
z, &b2.
z) == 0;
  1871     secp256k1_fe_sqr(&z2s, &b->
z);
  1872     secp256k1_fe_mul(&u1, &a->
x, &z2s);
  1873     u2 = b->
x; secp256k1_fe_normalize_weak(&u2);
  1874     secp256k1_fe_mul(&s1, &a->
y, &z2s); secp256k1_fe_mul(&s1, &s1, &b->
z);
  1875     s2 = b->
y; secp256k1_fe_normalize_weak(&s2);
  1876     CHECK(secp256k1_fe_equal_var(&u1, &u2));
  1877     CHECK(secp256k1_fe_equal_var(&s1, &s2));
  1882 #ifdef USE_ENDOMORPHISM  1900     secp256k1_gej_set_infinity(&gej[0]);
  1901     secp256k1_ge_clear(&ge[0]);
  1902     secp256k1_ge_set_gej_var(&ge[0], &gej[0]);
  1903     for (i = 0; i < runs; i++) {
  1907 #ifdef USE_ENDOMORPHISM  1908         if (i >= runs - 2) {
  1909             secp256k1_ge_mul_lambda(&g, &ge[1]);
  1911         if (i >= runs - 1) {
  1912             secp256k1_ge_mul_lambda(&g, &g);
  1917         secp256k1_ge_neg(&ge[3 + 4 * i], &g);
  1918         secp256k1_ge_neg(&ge[4 + 4 * i], &g);
  1919         secp256k1_gej_set_ge(&gej[1 + 4 * i], &ge[1 + 4 * i]);
  1921         secp256k1_gej_set_ge(&gej[3 + 4 * i], &ge[3 + 4 * i]);
  1923         for (j = 0; j < 4; j++) {
  1935         for (i = 0; i < 4 * runs + 1; i++) {
  1940                 } 
while(secp256k1_fe_is_zero(&zs[i]));
  1945         secp256k1_fe_inv_all_var(zinv, zs, 4 * runs + 1);
  1952     } 
while(secp256k1_fe_is_zero(&zf));
  1954     secp256k1_fe_inv_var(&zfi3, &zf);
  1955     secp256k1_fe_sqr(&zfi2, &zfi3);
  1956     secp256k1_fe_mul(&zfi3, &zfi3, &zfi2);
  1958     for (i1 = 0; i1 < 1 + 4 * runs; i1++) {
  1960         for (i2 = 0; i2 < 1 + 4 * runs; i2++) {
  1965             secp256k1_gej_add_var(&refj, &gej[i1], &gej[i2], secp256k1_gej_is_infinity(&gej[i1]) ? NULL : &zr);
  1967             if (!secp256k1_gej_is_infinity(&gej[i1]) && !secp256k1_gej_is_infinity(&refj)) {
  1968                 secp256k1_fe zrz; secp256k1_fe_mul(&zrz, &zr, &gej[i1].z);
  1969                 CHECK(secp256k1_fe_equal_var(&zrz, &refj.
z));
  1971             secp256k1_ge_set_gej_var(&ref, &refj);
  1974             secp256k1_gej_add_ge_var(&resj, &gej[i1], &ge[i2], secp256k1_gej_is_infinity(&gej[i1]) ? NULL : &zr);
  1976             if (!secp256k1_gej_is_infinity(&gej[i1]) && !secp256k1_gej_is_infinity(&resj)) {
  1977                 secp256k1_fe zrz; secp256k1_fe_mul(&zrz, &zr, &gej[i1].z);
  1978                 CHECK(secp256k1_fe_equal_var(&zrz, &resj.
z));
  1984                 secp256k1_fe_mul(&ge2_zfi.
x, &ge2_zfi.
x, &zfi2);
  1985                 secp256k1_fe_mul(&ge2_zfi.
y, &ge2_zfi.
y, &zfi3);
  1988                 secp256k1_gej_add_zinv_var(&resj, &gej[i1], &ge2_zfi, &zf);
  1995                 secp256k1_gej_add_ge(&resj, &gej[i1], &ge[i2]);
  2000             if ((i1 == 0 && i2 == 0) || ((i1 + 3)/4 == (i2 + 3)/4 && ((i1 + 3)%4)/2 == ((i2 + 3)%4)/2)) {
  2003                 secp256k1_gej_double_var(&resj, &gej[i1], &zr2);
  2006                 secp256k1_fe_mul(&zr2, &zr2, &gej[i1].z);
  2007                 CHECK(secp256k1_fe_equal_var(&zr2, &resj.
z));
  2009                 secp256k1_gej_double_var(&resj, &gej[i2], NULL);
  2014             if ((i1 == 0 && i2 == 0) || ((i1 + 3)/4 == (i2 + 3)/4 && ((i1 + 3)%4)/2 != ((i2 + 3)%4)/2)) {
  2015                 CHECK(secp256k1_ge_is_infinity(&ref));
  2020                 CHECK(secp256k1_ge_is_infinity(&ge[i1]));
  2021                 CHECK(secp256k1_gej_is_infinity(&gej[i1]));
  2025                 CHECK(secp256k1_ge_is_infinity(&ge[i2]));
  2026                 CHECK(secp256k1_gej_is_infinity(&gej[i2]));
  2036         for (i = 0; i < 4 * runs + 1; i++) {
  2037             gej_shuffled[i] = gej[i];
  2039         for (i = 0; i < 4 * runs + 1; i++) {
  2040             int swap = i + secp256k1_rand_int(4 * runs + 1 - i);
  2043                 gej_shuffled[i] = gej_shuffled[swap];
  2044                 gej_shuffled[swap] = t;
  2047         for (i = 0; i < 4 * runs + 1; i++) {
  2048             secp256k1_gej_add_var(&
sum, &
sum, &gej_shuffled[i], NULL);
  2050         CHECK(secp256k1_gej_is_infinity(&
sum));
  2059         for (i = 0; i < 4 * runs + 1; i++) {
  2062                 secp256k1_fe_mul(&zr[i + 1], &zinv[i], &gej[i + 1].z);
  2065         secp256k1_ge_set_table_gej_var(ge_set_table, gej, zr, 4 * runs + 1);
  2066         secp256k1_ge_set_all_gej_var(ge_set_all, gej, 4 * runs + 1, &ctx->
error_callback);
  2067         for (i = 0; i < 4 * runs + 1; i++) {
  2070             secp256k1_gej_rescale(&gej[i], &s);
  2116         0x8d24cd95, 0x0a355af1, 0x3c543505, 0x44238d30,
  2117         0x0643d79f, 0x05a59614, 0x2f8ec030, 0xd58977cb,
  2118         0x001e337a, 0x38093dcd, 0x6c0f386d, 0x0b1293a8,
  2119         0x4d72c879, 0xd7681924, 0x44e6d2f3, 0x9190117d
  2122         0xc7b74206, 0x1f788cd9, 0xabd0937d, 0x164a0d86,
  2123         0x95f6ff75, 0xf19a4ce9, 0xd013bd7b, 0xbf92d2a7,
  2124         0xffe1cc85, 0xc7f6c232, 0x93f0c792, 0xf4ed6c57,
  2125         0xb28d3786, 0x2897e6db, 0xbb192d0b, 0x6e6feab2
  2128         0x671a63c0, 0x3efdad4c, 0x389a7798, 0x24356027,
  2129         0xb3d69010, 0x278625c3, 0x5c86d390, 0x184a8f7a,
  2130         0x5f6409c2, 0x2ce01f2b, 0x511fd375, 0x25071d08,
  2131         0xda651801, 0x70e95caf, 0x8f0d893c, 0xbed8fbbe
  2136     secp256k1_ge_set_gej(&b, &bj);
  2138     secp256k1_gej_add_var(&resj, &aj, &bj, NULL);
  2139     secp256k1_ge_set_gej(&res, &resj);
  2142     secp256k1_gej_add_ge(&resj, &aj, &b);
  2143     secp256k1_ge_set_gej(&res, &resj);
  2146     secp256k1_gej_add_ge_var(&resj, &aj, &b, NULL);
  2147     secp256k1_ge_set_gej(&res, &resj);
  2153     for (i = 0; i < count * 32; i++) {
  2168     for (i = 1; i <= 6; i++) {
  2171         secp256k1_scalar_add(&
sum, &
sum, &s);
  2173         secp256k1_ge_set_gej(&Q, &Qj);
  2174         secp256k1_pubkey_save(&data[i - 1], &Q);
  2175         d[i - 1] = &data[i - 1];
  2177         secp256k1_ge_set_gej(&Q, &Qj);
  2178         secp256k1_pubkey_save(&sd, &Q);
  2180         CHECK(memcmp(&sd, &sd2, 
sizeof(sd)) == 0);
  2186     for (i = 0; i < count * 8; i++) {
  2199     int res_quad, res_even, res_odd;
  2201     secp256k1_fe_normalize_var(&fex);
  2203     res_quad = secp256k1_ge_set_xquad(&ge_quad, &fex);
  2204     res_even = secp256k1_ge_set_xo_var(&ge_even, &fex, 0);
  2205     res_odd = secp256k1_ge_set_xo_var(&ge_odd, &fex, 1);
  2207     CHECK(res_quad == res_even);
  2208     CHECK(res_quad == res_odd);
  2211         secp256k1_fe_normalize_var(&ge_quad.
x);
  2212         secp256k1_fe_normalize_var(&ge_odd.
x);
  2213         secp256k1_fe_normalize_var(&ge_even.
x);
  2214         secp256k1_fe_normalize_var(&ge_quad.
y);
  2215         secp256k1_fe_normalize_var(&ge_odd.
y);
  2216         secp256k1_fe_normalize_var(&ge_even.
y);
  2224         CHECK(secp256k1_fe_equal_var(&ge_quad.
x, x));
  2225         CHECK(secp256k1_fe_equal_var(&ge_even.
x, x));
  2226         CHECK(secp256k1_fe_equal_var(&ge_odd.
x, x));
  2229         CHECK(secp256k1_fe_is_quad_var(&ge_quad.
y));
  2232         CHECK(secp256k1_fe_is_odd(&ge_odd.
y));
  2233         CHECK(!secp256k1_fe_is_odd(&ge_even.
y));
  2236         secp256k1_gej_set_ge(&gej_quad, &ge_quad);
  2237         CHECK(secp256k1_gej_has_quad_y_var(&gej_quad));
  2240         } 
while (secp256k1_fe_is_zero(&fez));
  2241         secp256k1_gej_rescale(&gej_quad, &fez);
  2242         CHECK(secp256k1_gej_has_quad_y_var(&gej_quad));
  2243         secp256k1_gej_neg(&gej_quad, &gej_quad);
  2244         CHECK(!secp256k1_gej_has_quad_y_var(&gej_quad));
  2247         } 
while (secp256k1_fe_is_zero(&fez));
  2248         secp256k1_gej_rescale(&gej_quad, &fez);
  2249         CHECK(!secp256k1_gej_has_quad_y_var(&gej_quad));
  2250         secp256k1_gej_neg(&gej_quad, &gej_quad);
  2251         CHECK(secp256k1_gej_has_quad_y_var(&gej_quad));
  2257     for (i = 0; i < count * 4; i++) {
  2269         0x8b30bbe9, 0xae2a9906, 0x96b22f67, 0x0709dff3,
  2270         0x727fd8bc, 0x04d3362c, 0x6c7bf458, 0xe2846004,
  2271         0xa357ae91, 0x5c4a6528, 0x1309edf2, 0x0504740f,
  2272         0x0eb33439, 0x90216b4f, 0x81063cb6, 0x5f2f7e0f
  2276         0x84cc5452, 0xf7fde1ed, 0xb4d38a8c, 0xe9b1b84c,
  2277         0xcef31f14, 0x6e569be9, 0x705d357a, 0x42985407
  2280         0xa1e58d22, 0x553dcd42, 0xb2398062, 0x5d4c57a9,
  2281         0x6e9323d4, 0x2b3152e5, 0xca2c3990, 0xedc7c9de
  2296     for (i = 0; i < 200*count; i++) {
  2298         secp256k1_ecmult(&ctx->
ecmult_ctx, &x, &x, &xn, &gn);
  2301         secp256k1_scalar_mul(&ae, &ae, &xn);
  2302         secp256k1_scalar_mul(&ge, &ge, &xn);
  2303         secp256k1_scalar_add(&ge, &ge, &gn);
  2305         secp256k1_scalar_mul(&xn, &xn, &xf);
  2306         secp256k1_scalar_mul(&gn, &gn, &gf);
  2312                 0xD6E96687, 0xF9B10D09, 0x2A6F3543, 0x9D86CEBE,
  2313                 0xA4535D0D, 0x409F5358, 0x6440BD74, 0xB933E830,
  2314                 0xB95CBCA2, 0xC77DA786, 0x539BE8FD, 0x53354D2D,
  2315                 0x3B4F566A, 0xE6580454, 0x07ED6015, 0xEE1B2A88
  2318             secp256k1_gej_neg(&rp, &rp);
  2319             secp256k1_gej_add_var(&rp, &rp, &x, NULL);
  2320             CHECK(secp256k1_gej_is_infinity(&rp));
  2324     secp256k1_ecmult(&ctx->
ecmult_ctx, &x2, &a, &ae, &ge);
  2325     secp256k1_gej_neg(&x2, &x2);
  2326     secp256k1_gej_add_var(&x2, &x2, &x, NULL);
  2327     CHECK(secp256k1_gej_is_infinity(&x2));
  2338     unsigned char pub[65];
  2341     secp256k1_scalar_negate(&nx, &x);
  2342     secp256k1_ecmult(&ctx->
ecmult_ctx, &res1, point, &x, &x); 
  2343     secp256k1_ecmult(&ctx->
ecmult_ctx, &res2, point, &nx, &nx); 
  2344     secp256k1_gej_add_var(&res1, &res1, &res2, NULL);
  2345     CHECK(secp256k1_gej_is_infinity(&res1));
  2346     CHECK(secp256k1_gej_is_valid_var(&res1) == 0);
  2347     secp256k1_ge_set_gej(&res3, &res1);
  2348     CHECK(secp256k1_ge_is_infinity(&res3));
  2349     CHECK(secp256k1_ge_is_valid_var(&res3) == 0);
  2350     CHECK(secp256k1_eckey_pubkey_serialize(&res3, pub, &psize, 0) == 0);
  2352     CHECK(secp256k1_eckey_pubkey_serialize(&res3, pub, &psize, 1) == 0);
  2354     secp256k1_ecmult(&ctx->
ecmult_ctx, &res1, point, &zero, &zero);
  2355     secp256k1_ge_set_gej(&res3, &res1);
  2356     CHECK(secp256k1_ge_is_infinity(&res3));
  2357     secp256k1_ecmult(&ctx->
ecmult_ctx, &res1, point, &one, &zero);
  2358     secp256k1_ge_set_gej(&res3, &res1);
  2360     secp256k1_ecmult(&ctx->
ecmult_ctx, &res1, point, &zero, &one);
  2361     secp256k1_ge_set_gej(&res3, &res1);
  2369         0x7603CB59, 0xB0EF6C63, 0xFE608479, 0x2A0C378C,
  2370         0xDB3233A8, 0x0F8A9A09, 0xA877DEAD, 0x31B38C45
  2372     for (i = 0; i < 500; i++) {
  2374         if (secp256k1_ge_set_xo_var(&p, &x, 1)) {
  2376             CHECK(secp256k1_ge_is_valid_var(&p));
  2377             secp256k1_gej_set_ge(&j, &p);
  2378             CHECK(secp256k1_gej_is_valid_var(&j));
  2381         secp256k1_fe_sqr(&x, &x);
  2383     secp256k1_fe_normalize_var(&x);
  2384     CHECK(secp256k1_fe_equal_var(&x, &xr));
  2390         0x6d986544, 0x57ff52b8, 0xcf1b8126, 0x5b802a5b,
  2391         0xa97f9263, 0xb1e88044, 0x93351325, 0x91bc450a,
  2392         0x535c59f7, 0x325e5d2b, 0xc391fbe8, 0x3c12787c,
  2393         0x337e4a98, 0xe82a9011, 0x0123ba37, 0xdd769c7d
  2397         0x649d4f77, 0xc4242df7, 0x7f2079c9, 0x14530327,
  2398         0xa31b876a, 0xd2d8ce2a, 0x2236d5c6, 0xd7b2029b
  2402         0x23773684, 0x4d209dc7, 0x098a786f, 0x20d06fcd,
  2403         0x070a38bf, 0xc11ac651, 0x03004319, 0x1e2a8786,
  2404         0xed8c3b8e, 0xc06dd57b, 0xd06ea66e, 0x45492b0f,
  2405         0xb84e4e1b, 0xfb77e21f, 0x96baae2a, 0x63dec956
  2408     secp256k1_ecmult_const(&b, &a, &xn);
  2410     CHECK(secp256k1_ge_is_valid_var(&a));
  2424     secp256k1_ecmult_const(&res1, &secp256k1_ge_const_g, &a);
  2425     secp256k1_ecmult_const(&res2, &secp256k1_ge_const_g, &b);
  2426     secp256k1_ge_set_gej(&mid1, &res1);
  2427     secp256k1_ge_set_gej(&mid2, &res2);
  2428     secp256k1_ecmult_const(&res1, &mid1, &b);
  2429     secp256k1_ecmult_const(&res2, &mid2, &a);
  2430     secp256k1_ge_set_gej(&mid1, &res1);
  2431     secp256k1_ge_set_gej(&mid2, &res2);
  2442     secp256k1_scalar_negate(&negone, &one);
  2445     secp256k1_ecmult_const(&res1, &point, &zero);
  2446     secp256k1_ge_set_gej(&res2, &res1);
  2447     CHECK(secp256k1_ge_is_infinity(&res2));
  2448     secp256k1_ecmult_const(&res1, &point, &one);
  2449     secp256k1_ge_set_gej(&res2, &res1);
  2451     secp256k1_ecmult_const(&res1, &point, &negone);
  2452     secp256k1_gej_neg(&res1, &res1);
  2453     secp256k1_ge_set_gej(&res2, &res1);
  2460         0x4968d524, 0x2abf9b7a, 0x466abbcf, 0x34b11b6d,
  2461         0xcd83d307, 0x827bed62, 0x05fad0ce, 0x18fae63b
  2464         0x5494c15d, 0x32099706, 0xc2395f94, 0x348745fd,
  2465         0x757ce30e, 0x4e8c90fb, 0xa2bad184, 0xf883c69f,
  2466         0x5d195d20, 0xe191bf7f, 0x1be3e55f, 0x56a80196,
  2467         0x6071ad01, 0xf1462f66, 0xc997fa94, 0xdb858435
  2473     secp256k1_gej_set_ge(&point, &secp256k1_ge_const_g);
  2474     for (i = 0; i < 100; ++i) {
  2476         secp256k1_ge_set_gej(&tmp, &point);
  2477         secp256k1_ecmult_const(&point, &tmp, &scalar);
  2479     secp256k1_ge_set_gej(&res, &point);
  2496     secp256k1_scalar_set_int(&x, 0);
  2497     secp256k1_scalar_set_int(&two, 2);
  2498     bits = secp256k1_ecmult_wnaf(wnaf, 256, number, w);
  2500     for (i = bits-1; i >= 0; i--) {
  2502         secp256k1_scalar_mul(&x, &x, &two);
  2504             CHECK(zeroes == -1 || zeroes >= w-1); 
  2506             CHECK((v & 1) == 1); 
  2507             CHECK(v <= (1 << (w-1)) - 1); 
  2508             CHECK(v >= -(1 << (w-1)) - 1); 
  2510             CHECK(zeroes != -1); 
  2514             secp256k1_scalar_set_int(&t, v);
  2516             secp256k1_scalar_set_int(&t, -v);
  2517             secp256k1_scalar_negate(&t, &t);
  2519         secp256k1_scalar_add(&x, &x, &t);
  2521     CHECK(secp256k1_scalar_eq(&x, number)); 
  2530     if (!secp256k1_scalar_get_bits(&neg1, 0, 1)) {
  2531         secp256k1_scalar_negate(&neg1, &neg1);
  2534     sign2 = secp256k1_scalar_cond_negate(&neg2, secp256k1_scalar_is_even(&neg2));
  2535     CHECK(sign1 == sign2);
  2536     CHECK(secp256k1_scalar_eq(&neg1, &neg2));
  2541     int wnaf[256] = {0};
  2546     secp256k1_scalar_set_int(&x, 0);
  2547     secp256k1_scalar_set_int(&shift, 1 << w);
  2549 #ifdef USE_ENDOMORPHISM  2550     for (i = 0; i < 16; ++i) {
  2551         secp256k1_scalar_shr_int(&num, 8);
  2554     skew = secp256k1_wnaf_const(wnaf, num, w);
  2561         CHECK(v > -(1 << w)); 
  2562         CHECK(v < (1 << w));  
  2564         secp256k1_scalar_mul(&x, &x, &shift);
  2566             secp256k1_scalar_set_int(&t, v);
  2568             secp256k1_scalar_set_int(&t, -v);
  2569             secp256k1_scalar_negate(&t, &t);
  2571         secp256k1_scalar_add(&x, &x, &t);
  2574     secp256k1_scalar_cadd_bit(&num, skew == 2, 1);
  2575     CHECK(secp256k1_scalar_eq(&x, &num));
  2589     for (i = 0; i < count; i++) {
  2595     secp256k1_scalar_set_int(&n, 0);
  2596     CHECK(secp256k1_scalar_cond_negate(&n, 1) == -1);
  2597     CHECK(secp256k1_scalar_is_zero(&n));
  2598     CHECK(secp256k1_scalar_cond_negate(&n, 0) == 1);
  2599     CHECK(secp256k1_scalar_is_zero(&n));
  2609     secp256k1_ge_neg(&ng, &secp256k1_ge_const_g);
  2610     for (i = 0; i < 36; i++ ) {
  2611         secp256k1_scalar_set_int(&x, i);
  2613         for (j = 0; j < i; j++) {
  2617             secp256k1_gej_add_ge(&r, &r, &ng);
  2619         CHECK(secp256k1_gej_is_infinity(&r));
  2621     for (i = 1; i <= 36; i++ ) {
  2622         secp256k1_scalar_set_int(&x, i);
  2623         secp256k1_scalar_negate(&x, &x);
  2625         for (j = 0; j < i; j++) {
  2629             secp256k1_gej_add_ge(&r, &r, &secp256k1_ge_const_g);
  2631         CHECK(secp256k1_gej_is_infinity(&r));
  2643     unsigned char seed32[32];
  2650     secp256k1_rand256(seed32);
  2658     secp256k1_ge_set_gej(&pge, &pgej);
  2677     for (i = 0; i < 10; i++) {
  2682 #ifdef USE_ENDOMORPHISM  2684 void test_scalar_split(
void) {
  2687     const unsigned char zero[32] = {0};
  2688     unsigned char tmp[32];
  2691     secp256k1_scalar_split_lambda(&s1, &slam, &full);
  2694     if (secp256k1_scalar_is_high(&s1)) {
  2695         secp256k1_scalar_negate(&s1, &s1);
  2697     if (secp256k1_scalar_is_high(&slam)) {
  2698         secp256k1_scalar_negate(&slam, &slam);
  2701     secp256k1_scalar_get_b32(tmp, &s1);
  2702     CHECK(memcmp(zero, tmp, 16) == 0);
  2703     secp256k1_scalar_get_b32(tmp, &slam);
  2704     CHECK(memcmp(zero, tmp, 16) == 0);
  2707 void run_endomorphism_tests(
void) {
  2708     test_scalar_split();
  2713     unsigned char pubkeyc[65];
  2720     for (pubkeyclen = 3; pubkeyclen <= 65; pubkeyclen++) {
  2723         memcpy(&pubkeyc[1], input, 64);
  2724         VG_UNDEF(&pubkeyc[pubkeyclen], 65 - pubkeyclen);
  2725         for (i = 0; i < 256; i++) {
  2732             ysign = (input[63] & 1) + 2;
  2734             xpass = xvalid && (pubkeyclen == 33) && ((i & 254) == 2);
  2736             ypass = xvalid && yvalid && ((i & 4) == ((pubkeyclen == 65) << 2)) &&
  2737                 ((i == 4) || ((i & 251) == ysign)) && ((pubkeyclen == 33) || (pubkeyclen == 65));
  2738             if (xpass || ypass) {
  2740                 unsigned char pubkeyo[65];
  2742                 memset(&pubkey, 0, 
sizeof(pubkey));
  2752                 CHECK(memcmp(&pubkeyo[1], &pubkeyc[1], 32) == 0);
  2753                 CHECK((pubkeyclen != 33) || (pubkeyo[0] == pubkeyc[0]));
  2756                     CHECK(pubkeyo[0] == ysign);
  2757                     CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 1);
  2758                     memset(&pubkey, 0, 
sizeof(pubkey));
  2760                     secp256k1_pubkey_save(&pubkey, &ge);
  2767                     CHECK(pubkeyo[0] == 4);
  2768                     CHECK(memcmp(&pubkeyo[1], input, 64) == 0);
  2773                 memset(&pubkey, 0xfe, 
sizeof(pubkey));
  2779                 CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);
  2788 #define SECP256K1_EC_PARSE_TEST_NVALID (12)  2792             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x52,
  2793             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2794             0x00, 0x00, 0x64, 0xef, 0xa1, 0x7b, 0x77, 0x61, 0xe1, 0xe4, 0x27, 0x06, 0x98, 0x9f, 0xb4, 0x83,
  2795             0xb8, 0xd2, 0xd4, 0x9b, 0xf7, 0x8f, 0xae, 0x98, 0x03, 0xf0, 0x99, 0xb8, 0x34, 0xed, 0xeb, 0x00
  2799             0x7a, 0xe9, 0x6a, 0x2b, 0x65, 0x7c, 0x07, 0x10, 0x6e, 0x64, 0x47, 0x9e, 0xac, 0x34, 0x34, 0xe9,
  2800             0x9c, 0xf0, 0x49, 0x75, 0x12, 0xf5, 0x89, 0x95, 0xc1, 0x39, 0x6c, 0x28, 0x71, 0x95, 0x01, 0xee,
  2801             0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14,
  2802             0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee,
  2806             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  2807             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2c,
  2808             0x0e, 0x99, 0x4b, 0x14, 0xea, 0x72, 0xf8, 0xc3, 0xeb, 0x95, 0xc7, 0x1e, 0xf6, 0x92, 0x57, 0x5e,
  2809             0x77, 0x50, 0x58, 0x33, 0x2d, 0x7e, 0x52, 0xd0, 0x99, 0x5c, 0xf8, 0x03, 0x88, 0x71, 0xb6, 0x7d,
  2813             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  2814             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2c,
  2815             0xf1, 0x66, 0xb4, 0xeb, 0x15, 0x8d, 0x07, 0x3c, 0x14, 0x6a, 0x38, 0xe1, 0x09, 0x6d, 0xa8, 0xa1,
  2816             0x88, 0xaf, 0xa7, 0xcc, 0xd2, 0x81, 0xad, 0x2f, 0x66, 0xa3, 0x07, 0xfb, 0x77, 0x8e, 0x45, 0xb2,
  2820             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2821             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
  2822             0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14,
  2823             0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee,
  2827             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2828             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
  2829             0xbd, 0xe7, 0x0d, 0xf5, 0x19, 0x39, 0xb9, 0x4c, 0x9c, 0x24, 0x97, 0x9f, 0xa7, 0xdd, 0x04, 0xeb,
  2830             0xd9, 0xb3, 0x57, 0x2d, 0xa7, 0x80, 0x22, 0x90, 0x43, 0x8a, 0xf2, 0xa6, 0x81, 0x89, 0x54, 0x41,
  2834             0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6,
  2835             0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07,
  2836             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  2837             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
  2841             0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c,
  2842             0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73,
  2843             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  2844             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
  2848             0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc,
  2849             0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5,
  2850             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  2851             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
  2855             0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6,
  2856             0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07,
  2857             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2858             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
  2862             0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c,
  2863             0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73,
  2864             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2865             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
  2869             0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc,
  2870             0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5,
  2871             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2872             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01
  2875 #define SECP256K1_EC_PARSE_TEST_NXVALID (4)  2879             0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6,
  2880             0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07,
  2881             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  2882             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
  2886             0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c,
  2887             0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73,
  2888             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  2889             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
  2893             0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc,
  2894             0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5,
  2895             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  2896             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
  2900             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2901             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
  2902             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2903             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03
  2906 #define SECP256K1_EC_PARSE_TEST_NINVALID (7)  2910             0x0a, 0x2d, 0x2b, 0xa9, 0x35, 0x07, 0xf1, 0xdf, 0x23, 0x37, 0x70, 0xc2, 0xa7, 0x97, 0x96, 0x2c,
  2911             0xc6, 0x1f, 0x6d, 0x15, 0xda, 0x14, 0xec, 0xd4, 0x7d, 0x8d, 0x27, 0xae, 0x1c, 0xd5, 0xf8, 0x53,
  2912             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2913             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
  2917             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  2918             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
  2919             0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14,
  2920             0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee,
  2924             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  2925             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
  2926             0xbd, 0xe7, 0x0d, 0xf5, 0x19, 0x39, 0xb9, 0x4c, 0x9c, 0x24, 0x97, 0x9f, 0xa7, 0xdd, 0x04, 0xeb,
  2927             0xd9, 0xb3, 0x57, 0x2d, 0xa7, 0x80, 0x22, 0x90, 0x43, 0x8a, 0xf2, 0xa6, 0x81, 0x89, 0x54, 0x41,
  2931             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  2932             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
  2933             0xf4, 0x84, 0x14, 0x5c, 0xb0, 0x14, 0x9b, 0x82, 0x5d, 0xff, 0x41, 0x2f, 0xa0, 0x52, 0xa8, 0x3f,
  2934             0xcb, 0x72, 0xdb, 0x61, 0xd5, 0x6f, 0x37, 0x70, 0xce, 0x06, 0x6b, 0x73, 0x49, 0xa2, 0xaa, 0x28,
  2938             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  2939             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
  2940             0x0b, 0x7b, 0xeb, 0xa3, 0x4f, 0xeb, 0x64, 0x7d, 0xa2, 0x00, 0xbe, 0xd0, 0x5f, 0xad, 0x57, 0xc0,
  2941             0x34, 0x8d, 0x24, 0x9e, 0x2a, 0x90, 0xc8, 0x8f, 0x31, 0xf9, 0x94, 0x8b, 0xb6, 0x5d, 0x52, 0x07,
  2945             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2946             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2947             0x8f, 0x53, 0x7e, 0xef, 0xdf, 0xc1, 0x60, 0x6a, 0x07, 0x27, 0xcd, 0x69, 0xb4, 0xa7, 0x33, 0x3d,
  2948             0x38, 0xed, 0x44, 0xe3, 0x93, 0x2a, 0x71, 0x79, 0xee, 0xcb, 0x4b, 0x6f, 0xba, 0x93, 0x60, 0xdc,
  2952             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2953             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2954             0x70, 0xac, 0x81, 0x10, 0x20, 0x3e, 0x9f, 0x95, 0xf8, 0xd8, 0x32, 0x96, 0x4b, 0x58, 0xcc, 0xc2,
  2955             0xc7, 0x12, 0xbb, 0x1c, 0x6c, 0xd5, 0x8e, 0x86, 0x11, 0x34, 0xb4, 0x8f, 0x45, 0x6c, 0x9b, 0x53
  2958     const unsigned char pubkeyc[66] = {
  2960         0x04, 0x79, 0xBE, 0x66, 0x7E, 0xF9, 0xDC, 0xBB, 0xAC, 0x55, 0xA0, 0x62, 0x95, 0xCE, 0x87, 0x0B,
  2961         0x07, 0x02, 0x9B, 0xFC, 0xDB, 0x2D, 0xCE, 0x28, 0xD9, 0x59, 0xF2, 0x81, 0x5B, 0x16, 0xF8, 0x17,
  2962         0x98, 0x48, 0x3A, 0xDA, 0x77, 0x26, 0xA3, 0xC4, 0x65, 0x5D, 0xA4, 0xFB, 0xFC, 0x0E, 0x11, 0x08,
  2963         0xA8, 0xFD, 0x17, 0xB4, 0x48, 0xA6, 0x85, 0x54, 0x19, 0x9C, 0x47, 0xD0, 0x8F, 0xFB, 0x10, 0xD4,
  2966     unsigned char sout[65];
  2967     unsigned char shortkey[2];
  2979     memset(&pubkey, 0xfe, 
sizeof(pubkey));
  2986     CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);
  2989     for (i = 0; i < 256 ; i++) {
  2990         memset(&pubkey, 0xfe, 
sizeof(pubkey));
  2998         CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);
  3002     for (i = 0; i < 65536 ; i++) {
  3003         memset(&pubkey, 0xfe, 
sizeof(pubkey));
  3005         shortkey[0] = i & 255;
  3006         shortkey[1] = i >> 8;
  3011         CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);
  3014     memset(&pubkey, 0xfe, 
sizeof(pubkey));
  3021     CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);
  3027     memset(&pubkey, 0xfe, 
sizeof(pubkey));
  3033     CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);
  3036     memset(&pubkey, 0xfe, 
sizeof(pubkey));
  3042     CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);
  3045     memset(&pubkey, 0xfe, 
sizeof(pubkey));
  3051     CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);
  3054     memset(&pubkey, 0, 
sizeof(pubkey));
  3061     CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 1);
  3100     CHECK(ecount2 == 10);
  3115     const unsigned char orderc[32] = {
  3116         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  3117         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
  3118         0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
  3119         0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41
  3122     unsigned char ctmp[33];
  3123     unsigned char ctmp2[33];
  3138     memset(ctmp, 255, 32);
  3140     memset(&pubkey, 1, 
sizeof(pubkey));
  3146     memset(ctmp, 0, 32);
  3148     memset(&pubkey, 1, 
sizeof(pubkey));
  3156     memset(&pubkey, 0, 
sizeof(pubkey));
  3161     pubkey_one = pubkey;
  3163     memcpy(ctmp, orderc, 32);
  3166     memset(&pubkey, 1, 
sizeof(pubkey));
  3174     memset(&pubkey, 0, 
sizeof(pubkey));
  3179     pubkey_negone = pubkey;
  3181     memset(ctmp2, 0, 32);
  3183     CHECK(memcmp(orderc, ctmp, 31) == 0 && ctmp[31] == 0x40);
  3184     memcpy(&pubkey2, &pubkey, 
sizeof(pubkey));
  3186     CHECK(memcmp(&pubkey, &pubkey2, 
sizeof(pubkey)) == 0);
  3189     CHECK(memcmp(zeros, ctmp, 32) == 0);
  3191     CHECK(memcmp(&pubkey, zeros, 
sizeof(pubkey)) == 0);
  3192     memcpy(&pubkey, &pubkey2, 
sizeof(pubkey));
  3194     memcpy(ctmp, orderc, 32);
  3197     CHECK(memcmp(zeros, ctmp, 32) == 0);
  3198     memcpy(ctmp, orderc, 32);
  3201     CHECK(memcmp(zeros, ctmp, 32) == 0);
  3202     memcpy(ctmp, orderc, 32);
  3205     CHECK(memcmp(&pubkey, zeros, 
sizeof(pubkey)) == 0);
  3206     memcpy(&pubkey, &pubkey2, 
sizeof(pubkey));
  3208     CHECK(memcmp(&pubkey, zeros, 
sizeof(pubkey)) == 0);
  3209     memcpy(&pubkey, &pubkey2, 
sizeof(pubkey));
  3213     CHECK(memcmp(zeros, ctmp2, 32) == 0);
  3216     CHECK(memcmp(&pubkey, zeros, 
sizeof(pubkey)) == 0);
  3217     memcpy(&pubkey, &pubkey2, 
sizeof(pubkey));
  3221     CHECK(memcmp(ctmp2, zeros, 31) == 0 && ctmp2[31] == 1);
  3226     CHECK(memcmp(&pubkey, &pubkey2, 
sizeof(pubkey)) == 0);
  3231     CHECK(memcmp(&pubkey, &pubkey2, 
sizeof(pubkey)) == 0);
  3237     memset(&pubkey, 0, 32);
  3240     CHECK(memcmp(&pubkey, zeros, 
sizeof(pubkey)) == 0);
  3241     memcpy(&pubkey, &pubkey2, 
sizeof(pubkey));
  3242     memset(&pubkey2, 0, 32);
  3245     CHECK(memcmp(&pubkey2, zeros, 
sizeof(pubkey2)) == 0);
  3253     memset(ctmp2, 0, 32);
  3260     memset(ctmp2, 0, 32);
  3267     memset(ctmp2, 0, 32);
  3273     memset(ctmp2, 0, 32);
  3282     memset(&pubkey, 1, 
sizeof(pubkey));
  3288     pubkeys[0] = &pubkey_one;
  3307     pubkeys[0] = &pubkey_negone;
  3317     CHECK(memcmp(ctmp, ctmp2, 33) == 0);
  3319     pubkeys[0] = &pubkey_one;
  3320     pubkeys[1] = &pubkey_negone;
  3328     pubkeys[2] = &pubkey_one;
  3338     CHECK(memcmp(ctmp, ctmp2, 33) == 0);
  3340     pubkeys[1] = &pubkey_one;
  3354     } 
while(!secp256k1_ecdsa_sig_sign(&ctx->
ecmult_gen_ctx, sigr, sigs, key, msg, &nonce, recid));
  3368     secp256k1_ge_set_gej(&pub, &pubj);
  3369     getrec = secp256k1_rand_bits(1);
  3370     random_sign(&sigr, &sigs, &key, &msg, getrec?&recid:NULL);
  3372         CHECK(recid >= 0 && recid < 4);
  3374     CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sigr, &sigs, &pub, &msg));
  3375     secp256k1_scalar_set_int(&one, 1);
  3376     secp256k1_scalar_add(&msg, &msg, &one);
  3377     CHECK(!secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sigr, &sigs, &pub, &msg));
  3382     for (i = 0; i < 10*count; i++) {
  3388 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) {
  3392     memcpy(nonce32, data, 32);
  3393     return (counter == 0);
  3396 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) {
  3401    return nonce_function_rfc6979(nonce32, msg32, key32, algo16, data, counter - 1);
  3404 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) {
  3407        memset(nonce32, counter==0 ? 0 : 255, 32);
  3414        static const unsigned char order[] = {
  3415            0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  3416            0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
  3417            0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,
  3418            0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x41
  3420        memcpy(nonce32, order, 32);
  3431    return nonce_function_rfc6979(nonce32, msg32, key32, algo16, data, counter - 5);
  3440     unsigned char extra[32] = {0x00};
  3441     unsigned char privkey[32];
  3442     unsigned char message[32];
  3443     unsigned char privkey2[32];
  3446     unsigned char sig[74];
  3448     unsigned char pubkeyc[65];
  3449     size_t pubkeyclen = 65;
  3452     unsigned char seckey[300];
  3453     size_t seckeylen = 300;
  3460         secp256k1_scalar_get_b32(privkey, &key);
  3461         secp256k1_scalar_get_b32(message, &msg);
  3470     memset(&pubkey, 0, 
sizeof(pubkey));
  3474     memcpy(&pubkey_tmp, &pubkey, 
sizeof(pubkey));
  3476     CHECK(memcmp(&pubkey_tmp, &pubkey, 
sizeof(pubkey)) != 0);
  3478     CHECK(memcmp(&pubkey_tmp, &pubkey, 
sizeof(pubkey)) == 0);
  3483     CHECK(memcmp(privkey, privkey2, 32) == 0);
  3486     if (secp256k1_rand_int(3) == 0) {
  3489         unsigned char rnd[32];
  3491         secp256k1_rand256_test(rnd);
  3494         CHECK(ret1 == ret2);
  3499         CHECK(memcmp(&pubkey, &pubkey2, 
sizeof(pubkey)) == 0);
  3503     if (secp256k1_rand_int(3) == 0) {
  3506         unsigned char rnd[32];
  3508         secp256k1_rand256_test(rnd);
  3511         CHECK(ret1 == ret2);
  3516         CHECK(memcmp(&pubkey, &pubkey2, 
sizeof(pubkey)) == 0);
  3528     CHECK(memcmp(&signature[0], &signature[4], 
sizeof(signature[0])) == 0);
  3529     CHECK(memcmp(&signature[0], &signature[1], 
sizeof(signature[0])) != 0);
  3530     CHECK(memcmp(&signature[0], &signature[2], 
sizeof(signature[0])) != 0);
  3531     CHECK(memcmp(&signature[0], &signature[3], 
sizeof(signature[0])) != 0);
  3532     CHECK(memcmp(&signature[1], &signature[2], 
sizeof(signature[0])) != 0);
  3533     CHECK(memcmp(&signature[1], &signature[3], 
sizeof(signature[0])) != 0);
  3534     CHECK(memcmp(&signature[2], &signature[3], 
sizeof(signature[0])) != 0);
  3542     secp256k1_ecdsa_signature_load(ctx, &r, &s, &signature[0]);
  3543     secp256k1_scalar_negate(&s, &s);
  3544     secp256k1_ecdsa_signature_save(&signature[5], &r, &s);
  3551     secp256k1_scalar_negate(&s, &s);
  3552     secp256k1_ecdsa_signature_save(&signature[5], &r, &s);
  3555     CHECK(memcmp(&signature[5], &signature[0], 64) == 0);
  3559     memset(&signature[0], 0, 
sizeof(signature[0]));
  3565     sig[secp256k1_rand_int(siglen)] += 1 + secp256k1_rand_int(255);
  3573     unsigned char in[65];
  3575     size_t len = secp256k1_rand_bits(2) == 0 ? 65 : 33;
  3576     if (secp256k1_rand_bits(2) == 0) {
  3577         len = secp256k1_rand_bits(6);
  3580       in[0] = secp256k1_rand_bits(1) ? 4 : (secp256k1_rand_bits(1) ? 6 : 7);
  3582       in[0] = secp256k1_rand_bits(1) ? 2 : 3;
  3584     if (secp256k1_rand_bits(3) == 0) {
  3585         in[0] = secp256k1_rand_bits(8);
  3588         secp256k1_rand256(&in[1]);
  3591         secp256k1_rand256(&in[33]);
  3593     if (secp256k1_eckey_pubkey_parse(&elem, in, len)) {
  3594         unsigned char out[65];
  3595         unsigned char firstb;
  3600         CHECK(secp256k1_eckey_pubkey_serialize(&elem, out, &size, len == 33));
  3602         CHECK(memcmp(&in[1], &out[1], len-1) == 0);
  3604         if ((in[0] != 6) && (in[0] != 7)) {
  3605             CHECK(in[0] == out[0]);
  3608         CHECK(secp256k1_eckey_pubkey_serialize(&elem, in, &size, 0));
  3610         CHECK(secp256k1_eckey_pubkey_parse(&elem2, in, size));
  3613         in[0] = secp256k1_rand_bits(1) ? 6 : 7;
  3614         res = secp256k1_eckey_pubkey_parse(&elem2, in, size);
  3615         if (firstb == 2 || firstb == 3) {
  3616             if (in[0] == firstb + 4) {
  3624             CHECK(secp256k1_eckey_pubkey_serialize(&elem, out, &size, 0));
  3625             CHECK(memcmp(&in[1], &out[1], 64) == 0);
  3632     for (i = 0; i < 10*count; i++) {
  3639     for (i = 0; i < 64*count; i++) {
  3645     static const unsigned char zeroes[32] = {0};
  3646 #ifdef ENABLE_OPENSSL_TESTS  3647     static const unsigned char max_scalar[32] = {
  3648         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  3649         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
  3650         0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
  3651         0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40
  3658     unsigned char roundtrip_der[2048];
  3659     unsigned char compact_der[64];
  3660     size_t len_der = 2048;
  3661     int parsed_der = 0, valid_der = 0, roundtrips_der = 0;
  3664     unsigned char roundtrip_der_lax[2048];
  3665     unsigned char compact_der_lax[64];
  3666     size_t len_der_lax = 2048;
  3667     int parsed_der_lax = 0, valid_der_lax = 0, roundtrips_der_lax = 0;
  3669 #ifdef ENABLE_OPENSSL_TESTS  3670     ECDSA_SIG *sig_openssl;
  3671     const unsigned char *sigptr;
  3672     unsigned char roundtrip_openssl[2048];
  3673     int len_openssl = 2048;
  3674     int parsed_openssl, valid_openssl = 0, roundtrips_openssl = 0;
  3680         valid_der = (memcmp(compact_der, zeroes, 32) != 0) && (memcmp(compact_der + 32, zeroes, 32) != 0);
  3684         roundtrips_der = (len_der == siglen) && memcmp(roundtrip_der, sig, siglen) == 0;
  3688     if (parsed_der_lax) {
  3690         valid_der_lax = (memcmp(compact_der_lax, zeroes, 32) != 0) && (memcmp(compact_der_lax + 32, zeroes, 32) != 0);
  3692     if (valid_der_lax) {
  3694         roundtrips_der_lax = (len_der_lax == siglen) && memcmp(roundtrip_der_lax, sig, siglen) == 0;
  3697     if (certainly_der) {
  3698         ret |= (!parsed_der) << 2;
  3700     if (certainly_not_der) {
  3701         ret |= (parsed_der) << 17;
  3704         ret |= (!roundtrips_der) << 3;
  3708         ret |= (!roundtrips_der_lax) << 12;
  3709         ret |= (len_der != len_der_lax) << 13;
  3710         ret |= (memcmp(roundtrip_der_lax, roundtrip_der, len_der) != 0) << 14;
  3712     ret |= (roundtrips_der != roundtrips_der_lax) << 15;
  3714         ret |= (!parsed_der_lax) << 16;
  3717 #ifdef ENABLE_OPENSSL_TESTS  3718     sig_openssl = ECDSA_SIG_new();
  3720     parsed_openssl = (d2i_ECDSA_SIG(&sig_openssl, &sigptr, siglen) != NULL);
  3721     if (parsed_openssl) {
  3722         valid_openssl = !BN_is_negative(sig_openssl->r) && !BN_is_negative(sig_openssl->s) && BN_num_bits(sig_openssl->r) > 0 && BN_num_bits(sig_openssl->r) <= 256 && BN_num_bits(sig_openssl->s) > 0 && BN_num_bits(sig_openssl->s) <= 256;
  3723         if (valid_openssl) {
  3724             unsigned char tmp[32] = {0};
  3725             BN_bn2bin(sig_openssl->r, tmp + 32 - BN_num_bytes(sig_openssl->r));
  3726             valid_openssl = memcmp(tmp, max_scalar, 32) < 0;
  3728         if (valid_openssl) {
  3729             unsigned char tmp[32] = {0};
  3730             BN_bn2bin(sig_openssl->s, tmp + 32 - BN_num_bytes(sig_openssl->s));
  3731             valid_openssl = memcmp(tmp, max_scalar, 32) < 0;
  3734     len_openssl = i2d_ECDSA_SIG(sig_openssl, NULL);
  3735     if (len_openssl <= 2048) {
  3736         unsigned char *ptr = roundtrip_openssl;
  3737         CHECK(i2d_ECDSA_SIG(sig_openssl, &ptr) == len_openssl);
  3738         roundtrips_openssl = valid_openssl && ((size_t)len_openssl == siglen) && (memcmp(roundtrip_openssl, sig, siglen) == 0);
  3742     ECDSA_SIG_free(sig_openssl);
  3744     ret |= (parsed_der && !parsed_openssl) << 4;
  3745     ret |= (valid_der && !valid_openssl) << 5;
  3746     ret |= (roundtrips_openssl && !parsed_der) << 6;
  3747     ret |= (roundtrips_der != roundtrips_openssl) << 7;
  3748     if (roundtrips_openssl) {
  3749         ret |= (len_der != (size_t)len_openssl) << 8;
  3750         ret |= (memcmp(roundtrip_der, roundtrip_openssl, len_der) != 0) << 9;
  3756 static void assign_big_endian(
unsigned char *ptr, 
size_t ptrlen, uint32_t val) {
  3758     for (i = 0; i < ptrlen; i++) {
  3759         int shift = ptrlen - 1 - i;
  3763             ptr[i] = (val >> shift) & 0xFF;
  3768 static void damage_array(
unsigned char *sig, 
size_t *len) {
  3770     int action = secp256k1_rand_bits(3);
  3771     if (action < 1 && *len > 3) {
  3773         pos = secp256k1_rand_int(*len);
  3774         memmove(sig + pos, sig + pos + 1, *len - pos - 1);
  3777     } 
else if (action < 2 && *len < 2048) {
  3779         pos = secp256k1_rand_int(1 + *len);
  3780         memmove(sig + pos + 1, sig + pos, *len - pos);
  3781         sig[pos] = secp256k1_rand_bits(8);
  3784     } 
else if (action < 4) {
  3786         sig[secp256k1_rand_int(*len)] += 1 + secp256k1_rand_int(255);
  3790         sig[secp256k1_rand_int(*len)] ^= 1 << secp256k1_rand_bits(3);
  3795 static void random_ber_signature(
unsigned char *sig, 
size_t *len, 
int* certainly_der, 
int* certainly_not_der) {
  3797     int nlow[2], nlen[2], nlenlen[2], nhbit[2], nhbyte[2], nzlen[2];
  3798     size_t tlen, elen, glen;
  3803     der = secp256k1_rand_bits(2) == 0;
  3804     *certainly_der = der;
  3805     *certainly_not_der = 0;
  3806     indet = der ? 0 : secp256k1_rand_int(10) == 0;
  3808     for (n = 0; n < 2; n++) {
  3810         nlow[n] = der ? 1 : (secp256k1_rand_bits(3) != 0);
  3812         nlen[n] = nlow[n] ? secp256k1_rand_int(33) : 32 + secp256k1_rand_int(200) * secp256k1_rand_int(8) / 8;
  3813         CHECK(nlen[n] <= 232);
  3815         nhbit[n] = (nlow[n] == 0 && nlen[n] == 32) ? 1 : (nlen[n] == 0 ? 0 : secp256k1_rand_bits(1));
  3817         nhbyte[n] = nlen[n] == 0 ? 0 : (nhbit[n] ? 128 + secp256k1_rand_bits(7) : 1 + secp256k1_rand_int(127));
  3819         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);
  3820         if (nzlen[n] > ((nlen[n] == 0 || nhbit[n]) ? 1 : 0)) {
  3821             *certainly_not_der = 1;
  3823         CHECK(nlen[n] + nzlen[n] <= 300);
  3825         nlenlen[n] = nlen[n] + nzlen[n] < 128 ? 0 : (nlen[n] + nzlen[n] < 256 ? 1 : 2);
  3828             int add = secp256k1_rand_int(127 - nlenlen[n]) * secp256k1_rand_int(16) * secp256k1_rand_int(16) / 256;
  3831                 *certainly_not_der = 1;
  3834         CHECK(nlen[n] + nzlen[n] + nlenlen[n] <= 427);
  3838     tlen = 2 + nlenlen[0] + nlen[0] + nzlen[0] + 2 + nlenlen[1] + nlen[1] + nzlen[1];
  3842     elen = (der || indet) ? 0 : secp256k1_rand_int(980 - tlen) * secp256k1_rand_int(8) / 8;
  3844         *certainly_not_der = 1;
  3850     glen = der ? 0 : secp256k1_rand_int(990 - tlen) * secp256k1_rand_int(8) / 8;
  3852         *certainly_not_der = 1;
  3854     CHECK(tlen + glen <= 990);
  3857     sig[(*len)++] = 0x30;
  3860         sig[(*len)++] = 0x80;
  3861         *certainly_not_der = 1;
  3863         int tlenlen = tlen < 128 ? 0 : (tlen < 256 ? 1 : 2);
  3865             int add = secp256k1_rand_int(127 - tlenlen) * secp256k1_rand_int(16) * secp256k1_rand_int(16) / 256;
  3868                 *certainly_not_der = 1;
  3873             sig[(*len)++] = tlen;
  3876             sig[(*len)++] = 128 + tlenlen;
  3877             assign_big_endian(sig + *len, tlenlen, tlen);
  3883     CHECK(tlen + glen <= 1119);
  3885     for (n = 0; n < 2; n++) {
  3887         sig[(*len)++] = 0x02;
  3888         if (nlenlen[n] == 0) {
  3890             sig[(*len)++] = nlen[n] + nzlen[n];
  3893             sig[(*len)++] = 128 + nlenlen[n];
  3894             assign_big_endian(sig + *len, nlenlen[n], nlen[n] + nzlen[n]);
  3898         while (nzlen[n] > 0) {
  3899             sig[(*len)++] = 0x00;
  3902         if (nlen[n] == 32 && !nlow[n]) {
  3905             for (i = 0; i < 16; i++) {
  3906                 sig[(*len)++] = 0xFF;
  3912             sig[(*len)++] = nhbyte[n];
  3916         secp256k1_rand_bytes_test(sig + *len, nlen[n]);
  3922     secp256k1_rand_bytes_test(sig + *len, elen);
  3931     CHECK(tlen + glen <= 1121);
  3934     secp256k1_rand_bytes_test(sig + *len, glen);
  3937     CHECK(tlen <= 1121);
  3938     CHECK(tlen == *len);
  3943     for (i = 0; i < 200 * count; i++) {
  3944         unsigned char buffer[2048];
  3946         int certainly_der = 0;
  3947         int certainly_not_der = 0;
  3948         random_ber_signature(buffer, &buflen, &certainly_der, &certainly_not_der);
  3949         CHECK(buflen <= 2048);
  3950         for (j = 0; j < 16; j++) {
  3953                 damage_array(buffer, &buflen);
  3956                 certainly_not_der = 0;
  3961                 fprintf(stderr, 
"Failure %x on ", 
ret);
  3962                 for (k = 0; k < buflen; k++) {
  3963                     fprintf(stderr, 
"%02x ", buffer[k]);
  3965                 fprintf(stderr, 
"\n");
  3983         secp256k1_scalar_set_int(&ss, 1);
  3984         secp256k1_scalar_negate(&ss, &ss);
  3985         secp256k1_scalar_inverse(&ss, &ss);
  3986         secp256k1_scalar_set_int(&sr, 1);
  3988         secp256k1_ge_set_gej(&key, &keyj);
  3990         CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key, &msg) == 0);
  3995         const unsigned char pubkey_mods_zero[33] = {
  3996             0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  3997             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  3998             0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0,
  3999             0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41,
  4005         secp256k1_scalar_set_int(&ss, 1);
  4006         secp256k1_scalar_set_int(&msg, 0);
  4007         secp256k1_scalar_set_int(&sr, 0);
  4008         CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey_mods_zero, 33));
  4009         CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key, &msg) == 0);
  4014         const unsigned char pubkey[33] = {
  4015             0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4016             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4017             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4018             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4024         secp256k1_scalar_set_int(&ss, 0);
  4025         secp256k1_scalar_set_int(&msg, 0);
  4026         secp256k1_scalar_set_int(&sr, 1);
  4027         CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33));
  4028         CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key, &msg) == 0);
  4033         const unsigned char pubkey[33] = {
  4034             0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4035             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4036             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4037             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4040         const unsigned char pubkey2[33] = {
  4041             0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  4042             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  4043             0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0,
  4044             0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41,
  4051         secp256k1_scalar_set_int(&ss, 2);
  4052         secp256k1_scalar_set_int(&msg, 0);
  4053         secp256k1_scalar_set_int(&sr, 2);
  4054         CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33));
  4055         CHECK(secp256k1_eckey_pubkey_parse(&key2, pubkey2, 33));
  4056         CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key, &msg) == 1);
  4057         CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key2, &msg) == 1);
  4058         secp256k1_scalar_negate(&ss, &ss);
  4059         CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key, &msg) == 1);
  4060         CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key2, &msg) == 1);
  4061         secp256k1_scalar_set_int(&ss, 1);
  4062         CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key, &msg) == 0);
  4063         CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key2, &msg) == 0);
  4068         const unsigned char pubkey[33] = {
  4069             0x02, 0x14, 0x4e, 0x5a, 0x58, 0xef, 0x5b, 0x22,
  4070             0x6f, 0xd2, 0xe2, 0x07, 0x6a, 0x77, 0xcf, 0x05,
  4071             0xb4, 0x1d, 0xe7, 0x4a, 0x30, 0x98, 0x27, 0x8c,
  4072             0x93, 0xe6, 0xe6, 0x3c, 0x0b, 0xc4, 0x73, 0x76,
  4075         const unsigned char pubkey2[33] = {
  4076             0x02, 0x8a, 0xd5, 0x37, 0xed, 0x73, 0xd9, 0x40,
  4077             0x1d, 0xa0, 0x33, 0xd2, 0xdc, 0xf0, 0xaf, 0xae,
  4078             0x34, 0xcf, 0x5f, 0x96, 0x4c, 0x73, 0x28, 0x0f,
  4079             0x92, 0xc0, 0xf6, 0x9d, 0xd9, 0xb2, 0x09, 0x10,
  4082         const unsigned char csr[32] = {
  4083             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4084             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
  4085             0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4,
  4086             0x40, 0x2d, 0xa1, 0x72, 0x2f, 0xc9, 0xba, 0xeb
  4092         secp256k1_scalar_set_int(&ss, 1);
  4093         secp256k1_scalar_set_int(&msg, 1);
  4094         secp256k1_scalar_set_b32(&sr, csr, NULL);
  4095         CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33));
  4096         CHECK(secp256k1_eckey_pubkey_parse(&key2, pubkey2, 33));
  4097         CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key, &msg) == 1);
  4098         CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key2, &msg) == 1);
  4099         secp256k1_scalar_negate(&ss, &ss);
  4100         CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key, &msg) == 1);
  4101         CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key2, &msg) == 1);
  4102         secp256k1_scalar_set_int(&ss, 2);
  4103         secp256k1_scalar_inverse_var(&ss, &ss);
  4104         CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key, &msg) == 0);
  4105         CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key2, &msg) == 0);
  4110         const unsigned char pubkey[33] = {
  4111             0x03, 0xaf, 0x97, 0xff, 0x7d, 0x3a, 0xf6, 0xa0,
  4112             0x02, 0x94, 0xbd, 0x9f, 0x4b, 0x2e, 0xd7, 0x52,
  4113             0x28, 0xdb, 0x49, 0x2a, 0x65, 0xcb, 0x1e, 0x27,
  4114             0x57, 0x9c, 0xba, 0x74, 0x20, 0xd5, 0x1d, 0x20,
  4117         const unsigned char csr[32] = {
  4118             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4119             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
  4120             0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4,
  4121             0x40, 0x2d, 0xa1, 0x72, 0x2f, 0xc9, 0xba, 0xee
  4126         secp256k1_scalar_set_int(&ss, 1);
  4127         secp256k1_scalar_set_int(&msg, 1);
  4128         secp256k1_scalar_negate(&msg, &msg);
  4129         secp256k1_scalar_set_b32(&sr, csr, NULL);
  4130         CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33));
  4131         CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key, &msg) == 1);
  4132         secp256k1_scalar_negate(&ss, &ss);
  4133         CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key, &msg) == 1);
  4134         secp256k1_scalar_set_int(&ss, 3);
  4135         secp256k1_scalar_inverse_var(&ss, &ss);
  4136         CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sr, &ss, &key, &msg) == 0);
  4144         unsigned char signature[72];
  4145         static const unsigned char nonce[32] = {
  4146             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4147             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4148             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4149             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
  4151         static const unsigned char nonce2[32] = {
  4152             0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  4153             0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
  4154             0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,
  4155             0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x40
  4157         const unsigned char key[32] = {
  4158             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4159             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4160             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4161             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
  4163         unsigned char msg[32] = {
  4164             0x86, 0x41, 0x99, 0x81, 0x06, 0x23, 0x44, 0x53,
  4165             0xaa, 0x5f, 0x9d, 0x6a, 0x31, 0x78, 0xf4, 0xf7,
  4166             0xb8, 0x12, 0xe0, 0x0b, 0x81, 0x7a, 0x77, 0x62,
  4167             0x65, 0xdf, 0xdd, 0x31, 0xb9, 0x3e, 0x29, 0xa9,
  4201         CHECK(ecount == 10);
  4203         CHECK(ecount == 11);
  4205         CHECK(ecount == 11);
  4207         CHECK(ecount == 12);
  4209         CHECK(ecount == 13);
  4211         CHECK(ecount == 13);
  4215         CHECK(ecount == 13);
  4231         memset(signature, 255, 64);
  4238     for (t = 0; t < 2; t++) {
  4239         static const unsigned char zero[32] = {0x00};
  4241         unsigned char key[32];
  4242         unsigned char msg[32];
  4245         const unsigned char *extra;
  4246         extra = t == 0 ? NULL : zero;
  4250         memset(key, 0xFF, 32);
  4266         CHECK(memcmp(&sig, &sig2, 
sizeof(sig)) == 0);
  4270         CHECK(memcmp(&sig, &sig2, 
sizeof(sig)) == 0);
  4272         for(i = 0; i < 256; i++) {
  4277             secp256k1_ecdsa_signature_load(ctx, &sr[i], &ss, &sig2);
  4278             for (j = 0; j < i; j++) {
  4279                 CHECK(!secp256k1_scalar_eq(&sr[i], &sr[j]));
  4285         for(i = 256; i < 512; i++) {
  4290             secp256k1_ecdsa_signature_load(ctx, &sr[i], &ss, &sig2);
  4291             for (j = 0; j < i; j++) {
  4292                 CHECK(!secp256k1_scalar_eq(&sr[i], &sr[j]));
  4300         const unsigned char zeros[32] = {0};
  4301         unsigned char nonce[32];
  4302         unsigned char nonce2[32];
  4303         unsigned char nonce3[32];
  4304         unsigned char nonce4[32];
  4309         CHECK(nonce_function_rfc6979(nonce, zeros, zeros, NULL, NULL, 0) == 1);
  4311         CHECK(nonce_function_rfc6979(nonce2, zeros, zeros, zeros, NULL, 0) == 1);
  4313         CHECK(nonce_function_rfc6979(nonce3, zeros, zeros, NULL, (
void *)zeros, 0) == 1);
  4315         CHECK(nonce_function_rfc6979(nonce4, zeros, zeros, zeros, (
void *)zeros, 0) == 1);
  4317         CHECK(memcmp(nonce, nonce2, 32) != 0);
  4318         CHECK(memcmp(nonce, nonce3, 32) != 0);
  4319         CHECK(memcmp(nonce, nonce4, 32) != 0);
  4320         CHECK(memcmp(nonce2, nonce3, 32) != 0);
  4321         CHECK(memcmp(nonce2, nonce4, 32) != 0);
  4322         CHECK(memcmp(nonce3, nonce4, 32) != 0);
  4328         unsigned char privkey[300];
  4329         unsigned char seckey[32] = {
  4330             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  4331             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
  4332             0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
  4333             0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41,
  4335         size_t outlen = 300;
  4346 #ifdef ENABLE_OPENSSL_TESTS  4347 EC_KEY *get_openssl_key(
const unsigned char *key32) {
  4348     unsigned char privkey[300];
  4350     const unsigned char* pbegin = privkey;
  4351     int compr = secp256k1_rand_bits(1);
  4352     EC_KEY *ec_key = EC_KEY_new_by_curve_name(NID_secp256k1);
  4354     CHECK(d2i_ECPrivateKey(&ec_key, &pbegin, privkeylen));
  4355     CHECK(EC_KEY_check_key(ec_key));
  4359 void test_ecdsa_openssl(
void) {
  4367     unsigned int sigsize = 80;
  4368     size_t secp_sigsize = 80;
  4369     unsigned char message[32];
  4370     unsigned char signature[80];
  4371     unsigned char key32[32];
  4372     secp256k1_rand256_test(message);
  4373     secp256k1_scalar_set_b32(&msg, message, NULL);
  4375     secp256k1_scalar_get_b32(key32, &key);
  4377     secp256k1_ge_set_gej(&q, &qj);
  4378     ec_key = get_openssl_key(key32);
  4379     CHECK(ec_key != NULL);
  4380     CHECK(ECDSA_sign(0, message, 
sizeof(message), signature, &sigsize, ec_key));
  4381     CHECK(secp256k1_ecdsa_sig_parse(&sigr, &sigs, signature, sigsize));
  4382     CHECK(secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sigr, &sigs, &q, &msg));
  4383     secp256k1_scalar_set_int(&one, 1);
  4384     secp256k1_scalar_add(&msg2, &msg, &one);
  4385     CHECK(!secp256k1_ecdsa_sig_verify(&ctx->
ecmult_ctx, &sigr, &sigs, &q, &msg2));
  4388     CHECK(secp256k1_ecdsa_sig_serialize(signature, &secp_sigsize, &sigr, &sigs));
  4389     CHECK(ECDSA_verify(0, message, 
sizeof(message), signature, secp_sigsize, ec_key) == 1);
  4391     EC_KEY_free(ec_key);
  4394 void run_ecdsa_openssl(
void) {
  4396     for (i = 0; i < 10*count; i++) {
  4397         test_ecdsa_openssl();
  4402 #ifdef ENABLE_MODULE_ECDH  4406 #ifdef ENABLE_MODULE_RECOVERY  4411     unsigned char seed16[16] = {0};
  4412     unsigned char run32[32] = {0};
  4415         count = strtol(argv[1], NULL, 0);
  4421         const char* ch = argv[2];
  4422         while (pos < 16 && ch[0] != 0 && ch[1] != 0) {
  4424             if (sscanf(ch, 
"%2hx", &sh)) {
  4433         FILE *frand = 
fopen(
"/dev/urandom", 
"r");
  4434         if ((frand == NULL) || !fread(&seed16, 
sizeof(seed16), 1, frand)) {
  4435             uint64_t t = time(NULL) * (uint64_t)1337;
  4437             seed16[1] ^= t >> 8;
  4438             seed16[2] ^= t >> 16;
  4439             seed16[3] ^= t >> 24;
  4440             seed16[4] ^= t >> 32;
  4441             seed16[5] ^= t >> 40;
  4442             seed16[6] ^= t >> 48;
  4443             seed16[7] ^= t >> 56;
  4447     secp256k1_rand_seed(seed16);
  4449     printf(
"test count = %i\n", count);
  4450     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]);
  4455     if (secp256k1_rand_bits(1)) {
  4456         secp256k1_rand256(run32);
  4467 #ifndef USE_NUM_NONE  4498 #ifdef USE_ENDOMORPHISM  4499     run_endomorphism_tests();
  4508 #ifdef ENABLE_MODULE_ECDH  4519 #ifdef ENABLE_OPENSSL_TESTS  4520     run_ecdsa_openssl();
  4523 #ifdef ENABLE_MODULE_RECOVERY  4528     secp256k1_rand256(run32);
  4529     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]);
  4534     printf(
"no problems found\n");
 #define VERIFY_CHECK(cond)
 
void run_hmac_sha256_tests(void)
 
int check_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b)
 
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 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. 
 
void random_fe(secp256k1_fe *x)
 
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...
 
void test_add_neg_y_diff_x(void)
 
void run_ecmult_const_tests(void)
 
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 test_point_times_order(const secp256k1_gej *point)
 
#define SECP256K1_GEJ_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)
 
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. 
 
void run_group_decompress(void)
 
FILE * fopen(const fs::path &p, const char *mode)
 
int fe_memcmp(const secp256k1_fe *a, const secp256k1_fe *b)
 
void run_scalar_tests(void)
 
void test_sqrt(const secp256k1_fe *a, const secp256k1_fe *k)
 
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. 
 
void test_random_pubkeys(void)
 
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. 
 
UniValue ret(UniValue::VARR)
 
void test_ecmult_constants(void)
 
#define SECP256K1_CONTEXT_NONE
 
void run_field_misc(void)
 
void run_random_pubkeys(void)
 
void test_wnaf(const secp256k1_scalar *number, int w)
 
void random_scalar_order(secp256k1_scalar *num)
 
#define SECP256K1_GEJ_CONST_INFINITY
 
void random_fe_non_zero(secp256k1_fe *nz)
 
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. 
 
void run_ecmult_constants(void)
 
void(* fn)(const char *text, void *data)
 
A group element of the secp256k1 curve, in jacobian coordinates. 
 
void ge_equals_ge(const secp256k1_ge *a, const secp256k1_ge *b)
 
#define SECP256K1_CONTEXT_SIGN
 
void test_num_add_sub(void)
 
void run_ecdsa_sign_verify(void)
 
void random_field_element_test(secp256k1_fe *fe)
 
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. 
 
void test_ec_combine(void)
 
void test_num_negate(void)
 
void random_sign(secp256k1_scalar *sigr, secp256k1_scalar *sigs, const secp256k1_scalar *key, const secp256k1_scalar *msg, int *recid)
 
#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0)
 
void test_ecmult_gen_blind_reset(void)
 
void ge_equals_gej(const secp256k1_ge *a, const secp256k1_gej *b)
 
void test_num_jacobi(void)
 
void run_eckey_edge_case_test(void)
 
void run_context_tests(void)
 
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. 
 
SECP256K1_API void secp256k1_context_destroy(secp256k1_context *ctx)
Destroy a secp256k1 context object. 
 
int test_ecdsa_der_parse(const unsigned char *sig, size_t siglen, int certainly_der, int certainly_not_der)
 
void run_ecdh_tests(void)
 
void run_field_inv_all_var(void)
 
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. 
 
void test_rand_int(uint32_t range, uint32_t subrange)
 
#define SECP256K1_EC_UNCOMPRESSED
 
#define SECP256K1_EC_COMPRESSED
Flag to pass to secp256k1_ec_pubkey_serialize and secp256k1_ec_privkey_export. 
 
void run_rfc6979_hmac_sha256_tests(void)
 
void run_field_inv_var(void)
 
void random_num_order(secp256k1_num *num)
 
void run_ec_pubkey_parse_test(void)
 
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. 
 
void run_ecmult_gen_blind(void)
 
void run_ecdsa_der_parse(void)
 
secp256k1_ecmult_gen_context ecmult_gen_ctx
 
void run_field_convert(void)
 
#define SECP256K1_SCALAR_CONST(d7, d6, d5, d4, d3, d2, d1, d0)
 
void run_num_smalltests(void)
 
void ecmult_const_mult_zero_one(void)
 
void run_ecmult_chain(void)
 
int is_empty_signature(const secp256k1_ecdsa_signature *sig)
 
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. 
 
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. 
 
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. 
 
void test_group_decompress(const secp256k1_fe *x)
 
void run_ecdsa_end_to_end(void)
 
void test_constant_wnaf_negate(const secp256k1_scalar *number)
 
void ec_pubkey_parse_pointtest(const unsigned char *input, int xvalid, int yvalid)
 
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. 
 
secp256k1_ecmult_context ecmult_ctx
 
A group element of the secp256k1 curve, in affine coordinates. 
 
Opaque data structured that holds a parsed ECDSA signature. 
 
#define SECP256K1_EC_PARSE_TEST_NINVALID
 
A scalar modulo the group order of the secp256k1 curve. 
 
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. 
 
int main(int argc, char **argv)
 
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. 
 
void run_sha256_tests(void)
 
void test_ecdsa_edge_cases(void)
 
#define SECP256K1_GE_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)
 
#define SECP256K1_CONTEXT_VERIFY
Flags to pass to secp256k1_context_create. 
 
SECP256K1_API secp256k1_context * secp256k1_context_clone(const secp256k1_context *ctx) SECP256K1_ARG_NONNULL(1) SECP256K1_WARN_UNUSED_RESULT
Copies a secp256k1 context object. 
 
void random_group_element_jacobian_test(secp256k1_gej *gej, const secp256k1_ge *ge)
 
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. 
 
void random_scalar_order_test(secp256k1_scalar *num)
 
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. 
 
void random_group_element_test(secp256k1_ge *ge)
 
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. 
 
void ecmult_const_random_mult(void)
 
#define SECP256K1_EC_PARSE_TEST_NVALID
 
void * memcpy(void *a, const void *b, size_t c)
 
void random_fe_test(secp256k1_fe *x)
 
#define SECP256K1_FE_STORAGE_CONST(d7, d6, d5, d4, d3, d2, d1, d0)
 
void test_ecdsa_sign_verify(void)
 
void test_ecdsa_end_to_end(void)
 
secp256k1_callback error_callback
 
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. 
 
void test_constant_wnaf(const secp256k1_scalar *number, int w)
 
void random_num_negate(secp256k1_num *num)
 
void random_field_element_magnitude(secp256k1_fe *fe)
 
void ecmult_const_commutativity(void)
 
void random_num_order_test(secp256k1_num *num)
 
void ecmult_const_chain_multiply(void)
 
void test_ecmult_gen_blind(void)
 
int gej_xyz_equals_gej(const secp256k1_gej *a, const secp256k1_gej *b)
 
void random_fe_non_square(secp256k1_fe *ns)
 
void * memmove(void *a, const void *b, size_t c)
 
SECP256K1_API secp256k1_context * secp256k1_context_create(unsigned int flags) SECP256K1_WARN_UNUSED_RESULT
Create a secp256k1 context object. 
 
void run_ec_combine(void)
 
void run_ecdsa_edge_cases(void)
 
void test_rand_bits(int rand32, int bits)
 
void run_recovery_tests(void)
 
int check_fe_inverse(const secp256k1_fe *a, const secp256k1_fe *ai)
 
#define SECP256K1_EC_PARSE_TEST_NXVALID
 
void run_point_times_order(void)
 
Opaque data structure that holds a parsed and valid public key. 
 
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.