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 455 test_exhaustive_endomorphism(group, EXHAUSTIVE_TEST_ORDER);
462 #ifdef ENABLE_MODULE_RECOVERY 463 test_exhaustive_recovery_sign(ctx, group, EXHAUSTIVE_TEST_ORDER);
464 test_exhaustive_recovery_verify(ctx, group, EXHAUSTIVE_TEST_ORDER);
static const std::string s2("AAD")
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.