7 #if defined HAVE_CONFIG_H    16 #undef USE_ECMULT_STATIC_PRECOMPUTATION    18 #ifndef EXHAUSTIVE_TEST_ORDER    20 #define EXHAUSTIVE_TEST_ORDER 13    21 #define EXHAUSTIVE_TEST_LAMBDA 9       29 #ifdef ENABLE_MODULE_RECOVERY    40     CHECK(secp256k1_fe_equal_var(&a->
x, &b->
x));
    41     CHECK(secp256k1_fe_equal_var(&a->
y, &b->
y));
    52     secp256k1_fe_sqr(&z2s, &b->
z);
    53     secp256k1_fe_mul(&u1, &a->
x, &z2s);
    54     u2 = b->
x; secp256k1_fe_normalize_weak(&u2);
    55     secp256k1_fe_mul(&s1, &a->
y, &z2s); secp256k1_fe_mul(&s1, &s1, &b->
z);
    56     s2 = b->
y; secp256k1_fe_normalize_weak(&s2);
    57     CHECK(secp256k1_fe_equal_var(&u1, &u2));
    58     CHECK(secp256k1_fe_equal_var(&s1, &s2));
    62     unsigned char bin[32];
    64         secp256k1_rand256(bin);
    65         if (secp256k1_fe_set_b32(x, bin)) {
    73                                       const unsigned char *key32, 
const unsigned char *algo16,
    74                                       void *data, 
unsigned int attempt) {
    87     secp256k1_scalar_set_int(&s, *idata);
    88     secp256k1_scalar_get_b32(nonce32, &s);
    92 #ifdef USE_ENDOMORPHISM    93 void test_exhaustive_endomorphism(
const secp256k1_ge *group, 
int order) {
    95     for (i = 0; i < order; i++) {
    97         secp256k1_ge_mul_lambda(&res, &group[i]);
   107     CHECK(secp256k1_ge_is_infinity(&group[0]));
   108     CHECK(secp256k1_gej_is_infinity(&groupj[0]));
   109     for (i = 1; i < order; i++) {
   110         CHECK(!secp256k1_ge_is_infinity(&group[i]));
   111         CHECK(!secp256k1_gej_is_infinity(&groupj[i]));
   115     for (j = 0; j < order; j++) {
   117         secp256k1_fe_inv(&fe_inv, &groupj[j].z);
   118         for (i = 0; i < order; i++) {
   122             secp256k1_gej_add_var(&tmp, &groupj[i], &groupj[j], NULL);
   126                 secp256k1_gej_add_ge(&tmp, &groupj[i], &group[j]);
   130             secp256k1_gej_add_ge_var(&tmp, &groupj[i], &group[j], NULL);
   134             zless_gej.
x = groupj[j].
x;
   135             zless_gej.
y = groupj[j].
y;
   136             secp256k1_gej_add_zinv_var(&tmp, &groupj[i], &zless_gej, &fe_inv);
   142     for (i = 0; i < order; i++) {
   145             secp256k1_gej_double_nonzero(&tmp, &groupj[i], NULL);
   148         secp256k1_gej_double_var(&tmp, &groupj[i], NULL);
   153     for (i = 1; i < order; i++) {
   156         secp256k1_ge_neg(&tmp, &group[i]);
   158         secp256k1_gej_neg(&tmpj, &groupj[i]);
   165     for (r_log = 1; r_log < order; r_log++) {
   166         for (j = 0; j < order; j++) {
   167             for (i = 0; i < order; i++) {
   170                 secp256k1_scalar_set_int(&na, i);
   171                 secp256k1_scalar_set_int(&ng, j);
   173                 secp256k1_ecmult(&ctx->
ecmult_ctx, &tmp, &groupj[r_log], &na, &ng);
   177                     secp256k1_ecmult_const(&tmp, &group[i], &ng);
   187     unsigned char x_bin[32];
   190     secp256k1_fe_normalize(&x);
   191     secp256k1_fe_get_b32(x_bin, &x);
   192     secp256k1_scalar_set_b32(r, x_bin, NULL);
   197     for (s = 1; s < order; s++) {
   198         for (r = 1; r < order; r++) {
   199             for (msg = 1; msg < order; msg++) {
   200                 for (key = 1; key < order; key++) {
   206                     int k, should_verify;
   207                     unsigned char msg32[32];
   209                     secp256k1_scalar_set_int(&s_s, s);
   210                     secp256k1_scalar_set_int(&r_s, r);
   211                     secp256k1_scalar_set_int(&msg_s, msg);
   212                     secp256k1_scalar_set_int(&sk_s, key);
   218                     for (k = 0; k < order; k++) {
   221                         if (r_s == check_x_s) {
   222                             secp256k1_scalar_set_int(&s_times_k_s, k);
   223                             secp256k1_scalar_mul(&s_times_k_s, &s_times_k_s, &s_s);
   224                             secp256k1_scalar_mul(&msg_plus_r_times_sk_s, &r_s, &sk_s);
   225                             secp256k1_scalar_add(&msg_plus_r_times_sk_s, &msg_plus_r_times_sk_s, &msg_s);
   226                             should_verify |= secp256k1_scalar_eq(&s_times_k_s, &msg_plus_r_times_sk_s);
   230                     should_verify &= !secp256k1_scalar_is_high(&s_s);
   233                     secp256k1_ecdsa_signature_save(&sig, &r_s, &s_s);
   234                     memcpy(&nonconst_ge, &group[sk_s], 
sizeof(nonconst_ge));
   235                     secp256k1_pubkey_save(&pk, &nonconst_ge);
   236                     secp256k1_scalar_get_b32(msg32, &msg_s);
   237                     CHECK(should_verify ==
   249     for (i = 1; i < order; i++) {  
   250         for (j = 1; j < order; j++) {  
   251             for (k = 1; k < order; k++) {  
   252                 const int starting_k = k;
   255                 unsigned char sk32[32], msg32[32];
   256                 secp256k1_scalar_set_int(&msg, i);
   257                 secp256k1_scalar_set_int(&sk, j);
   258                 secp256k1_scalar_get_b32(sk32, &sk);
   259                 secp256k1_scalar_get_b32(msg32, &msg);
   263                 secp256k1_ecdsa_signature_load(ctx, &r, &s, &sig);
   268                 CHECK(r == expected_r);
   269                 CHECK((k * s) % order == (i + r * j) % order ||
   273                 if (k < starting_k) {
   290 #ifdef ENABLE_MODULE_RECOVERY   295     for (i = 1; i < order; i++) {  
   296         for (j = 1; j < order; j++) {  
   297             for (k = 1; k < order; k++) {  
   298                 const int starting_k = k;
   303                 unsigned char sk32[32], msg32[32];
   306                 secp256k1_scalar_set_int(&msg, i);
   307                 secp256k1_scalar_set_int(&sk, j);
   308                 secp256k1_scalar_get_b32(sk32, &sk);
   309                 secp256k1_scalar_get_b32(msg32, &msg);
   314                 secp256k1_ecdsa_recoverable_signature_load(ctx, &r, &s, &recid, &rsig);
   316                 CHECK(r == expected_r);
   317                 CHECK((k * s) % order == (i + r * j) % order ||
   324                 r_dot_y_normalized = group[k].
y;
   325                 secp256k1_fe_normalize(&r_dot_y_normalized);
   327                 if ((k * s) % order == (i + r * j) % order) {
   328                     expected_recid = secp256k1_fe_is_odd(&r_dot_y_normalized) ? 1 : 0;
   330                     expected_recid = secp256k1_fe_is_odd(&r_dot_y_normalized) ? 0 : 1;
   332                 CHECK(recid == expected_recid);
   336                 secp256k1_ecdsa_signature_load(ctx, &r, &s, &sig);
   341                 CHECK(r == expected_r);
   342                 CHECK((k * s) % order == (i + r * j) % order ||
   346                 if (k < starting_k) {
   357     for (s = 1; s < order; s++) {
   358         for (r = 1; r < order; r++) {
   359             for (msg = 1; msg < order; msg++) {
   360                 for (key = 1; key < order; key++) {
   368                     int k, should_verify;
   369                     unsigned char msg32[32];
   371                     secp256k1_scalar_set_int(&s_s, s);
   372                     secp256k1_scalar_set_int(&r_s, r);
   373                     secp256k1_scalar_set_int(&msg_s, msg);
   374                     secp256k1_scalar_set_int(&sk_s, key);
   375                     secp256k1_scalar_get_b32(msg32, &msg_s);
   381                     for (k = 0; k < order; k++) {
   384                         if (r_s == check_x_s) {
   385                             secp256k1_scalar_set_int(&s_times_k_s, k);
   386                             secp256k1_scalar_mul(&s_times_k_s, &s_times_k_s, &s_s);
   387                             secp256k1_scalar_mul(&msg_plus_r_times_sk_s, &r_s, &sk_s);
   388                             secp256k1_scalar_add(&msg_plus_r_times_sk_s, &msg_plus_r_times_sk_s, &msg_s);
   389                             should_verify |= secp256k1_scalar_eq(&s_times_k_s, &msg_plus_r_times_sk_s);
   393                     should_verify &= !secp256k1_scalar_is_high(&s_s);
   401                     secp256k1_ecdsa_recoverable_signature_save(&rsig, &r_s, &s_s, recid);
   403                     memcpy(&nonconst_ge, &group[sk_s], 
sizeof(nonconst_ge));
   404                     secp256k1_pubkey_save(&pk, &nonconst_ge);
   405                     CHECK(should_verify ==
   425     secp256k1_gej_set_infinity(&groupj[0]);
   426     secp256k1_ge_set_gej(&group[0], &groupj[0]);
   432         secp256k1_gej_add_ge(&groupj[i], &groupj[i - 1], &secp256k1_ge_const_g);
   433         secp256k1_ge_set_gej(&group[i], &groupj[i]);
   434         secp256k1_gej_rescale(&groupj[i], &z);
   442             secp256k1_scalar_set_int(&scalar_i, i);
   443             secp256k1_ecmult_gen(&ctx->
ecmult_gen_ctx, &generatedj, &scalar_i);
   444             secp256k1_ge_set_gej(&generated, &generatedj);
   446             CHECK(group[i].infinity == 0);
   448             CHECK(secp256k1_fe_equal_var(&generated.
x, &group[i].
x));
   449             CHECK(secp256k1_fe_equal_var(&generated.
y, &group[i].
y));
   454 #ifdef USE_ENDOMORPHISM   462 #ifdef ENABLE_MODULE_RECOVERY 
void ge_equals_ge(const secp256k1_ge *a, const secp256k1_ge *b)
stolen from tests.c 
 
Opaque data structured that holds a parsed ECDSA signature, supporting pubkey recovery. 
 
SECP256K1_API int secp256k1_ecdsa_recoverable_signature_convert(const secp256k1_context *ctx, secp256k1_ecdsa_signature *sig, const secp256k1_ecdsa_recoverable_signature *sigin) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Convert a recoverable signature into a normal signature. 
 
A group element of the secp256k1 curve, in jacobian coordinates. 
 
#define SECP256K1_CONTEXT_SIGN
 
void test_exhaustive_addition(const secp256k1_ge *group, const secp256k1_gej *groupj, int order)
 
SECP256K1_API void secp256k1_context_destroy(secp256k1_context *ctx)
Destroy a secp256k1 context object. 
 
#define EXHAUSTIVE_TEST_LAMBDA
 
secp256k1_ecmult_gen_context ecmult_gen_ctx
 
SECP256K1_API int secp256k1_ecdsa_sign(const secp256k1_context *ctx, secp256k1_ecdsa_signature *sig, const unsigned char *msg32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void *ndata) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4)
Create an ECDSA signature. 
 
SECP256K1_API int secp256k1_ecdsa_sign_recoverable(const secp256k1_context *ctx, secp256k1_ecdsa_recoverable_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 a recoverable ECDSA signature. 
 
void r_from_k(secp256k1_scalar *r, const secp256k1_ge *group, int k)
 
void test_exhaustive_verify(const secp256k1_context *ctx, const secp256k1_ge *group, int order)
 
void test_exhaustive_ecmult(const secp256k1_context *ctx, const secp256k1_ge *group, const secp256k1_gej *groupj, int order)
 
secp256k1_ecmult_context ecmult_ctx
 
A group element of the secp256k1 curve, in affine coordinates. 
 
Opaque data structured that holds a parsed ECDSA signature. 
 
A scalar modulo the group order of the secp256k1 curve. 
 
#define SECP256K1_CONTEXT_VERIFY
Flags to pass to secp256k1_context_create. 
 
#define EXHAUSTIVE_TEST_ORDER
 
void * memcpy(void *a, const void *b, size_t c)
 
void random_fe(secp256k1_fe *x)
 
int secp256k1_nonce_function_smallint(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int attempt)
END stolen from tests.c. 
 
void ge_equals_gej(const secp256k1_ge *a, const secp256k1_gej *b)
 
SECP256K1_API secp256k1_context * secp256k1_context_create(unsigned int flags) SECP256K1_WARN_UNUSED_RESULT
Create a secp256k1 context object. 
 
void test_exhaustive_sign(const secp256k1_context *ctx, const secp256k1_ge *group, int order)
 
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.