Bitcoin ABC 0.32.7
P2P Digital Currency
tests.c
Go to the documentation of this file.
1/***********************************************************************
2 * Copyright (c) 2013, 2014, 2015 Pieter Wuille, Gregory Maxwell *
3 * Distributed under the MIT software license, see the accompanying *
4 * file COPYING or https://www.opensource.org/licenses/mit-license.php.*
5 ***********************************************************************/
6
7#if defined HAVE_CONFIG_H
8#include "libsecp256k1-config.h"
9#endif
10
11#include <stdio.h>
12#include <stdlib.h>
13#include <string.h>
14
15#include <time.h>
16
17#include "secp256k1.c"
18#include "../include/secp256k1.h"
19#include "../include/secp256k1_preallocated.h"
20#include "testrand_impl.h"
21#include "util.h"
22
23#include "../contrib/lax_der_parsing.c"
24#include "../contrib/lax_der_privatekey_parsing.c"
25
26#include "modinv32_impl.h"
27#ifdef SECP256K1_WIDEMUL_INT128
28#include "modinv64_impl.h"
29#endif
30
31#define CONDITIONAL_TEST(cnt, nam) if (count < (cnt)) { printf("Skipping %s (iteration count too low)\n", nam); } else
32
33static int count = 64;
34static secp256k1_context *ctx = NULL;
35
36static void counting_illegal_callback_fn(const char* str, void* data) {
37 /* Dummy callback function that just counts. */
38 int32_t *p;
39 (void)str;
40 p = data;
41 (*p)++;
42}
43
44static void uncounting_illegal_callback_fn(const char* str, void* data) {
45 /* Dummy callback function that just counts (backwards). */
46 int32_t *p;
47 (void)str;
48 p = data;
49 (*p)--;
50}
51
53 do {
54 unsigned char b32[32];
56 if (secp256k1_fe_set_b32(fe, b32)) {
57 break;
58 }
59 } while(1);
60}
61
63 secp256k1_fe zero;
64 int n = secp256k1_testrand_int(9);
66 if (n == 0) {
67 return;
68 }
69 secp256k1_fe_clear(&zero);
70 secp256k1_fe_negate(&zero, &zero, 0);
71 secp256k1_fe_mul_int(&zero, n - 1);
72 secp256k1_fe_add(fe, &zero);
73#ifdef VERIFY
74 CHECK(fe->magnitude == n);
75#endif
76}
77
79 secp256k1_fe fe;
80 do {
84 break;
85 }
86 } while(1);
87 ge->infinity = 0;
88}
89
91 secp256k1_fe z2, z3;
92 do {
94 if (!secp256k1_fe_is_zero(&gej->z)) {
95 break;
96 }
97 } while(1);
98 secp256k1_fe_sqr(&z2, &gej->z);
99 secp256k1_fe_mul(&z3, &z2, &gej->z);
100 secp256k1_fe_mul(&gej->x, &ge->x, &z2);
101 secp256k1_fe_mul(&gej->y, &ge->y, &z3);
102 gej->infinity = ge->infinity;
103}
104
106 do {
107 unsigned char b32[32];
108 int overflow = 0;
110 secp256k1_scalar_set_b32(num, b32, &overflow);
111 if (overflow || secp256k1_scalar_is_zero(num)) {
112 continue;
113 }
114 break;
115 } while(1);
116}
117
119 do {
120 unsigned char b32[32];
121 int overflow = 0;
123 secp256k1_scalar_set_b32(num, b32, &overflow);
124 if (overflow || secp256k1_scalar_is_zero(num)) {
125 continue;
126 }
127 break;
128 } while(1);
129}
130
131void random_scalar_order_b32(unsigned char *b32) {
134 secp256k1_scalar_get_b32(b32, &num);
135}
136
137void run_context_tests(int use_prealloc) {
138 secp256k1_pubkey pubkey;
139 secp256k1_pubkey zero_pubkey;
141 unsigned char ctmp[32];
142 int32_t ecount;
143 int32_t ecount2;
144 secp256k1_context *none;
145 secp256k1_context *sign;
146 secp256k1_context *vrfy;
147 secp256k1_context *both;
148 secp256k1_context *sttc;
149 void *none_prealloc = NULL;
150 void *sign_prealloc = NULL;
151 void *vrfy_prealloc = NULL;
152 void *both_prealloc = NULL;
153 void *sttc_prealloc = NULL;
154
155 secp256k1_gej pubj;
156 secp256k1_ge pub;
157 secp256k1_scalar msg, key, nonce;
158 secp256k1_scalar sigr, sigs;
159
160 if (use_prealloc) {
166 CHECK(none_prealloc != NULL);
167 CHECK(sign_prealloc != NULL);
168 CHECK(vrfy_prealloc != NULL);
169 CHECK(both_prealloc != NULL);
170 CHECK(sttc_prealloc != NULL);
176 } else {
182 }
183
184 memset(&zero_pubkey, 0, sizeof(zero_pubkey));
185
186 ecount = 0;
187 ecount2 = 10;
190 /* set error callback (to a function that still aborts in case malloc() fails in secp256k1_context_clone() below) */
192 CHECK(sign->error_callback.fn != vrfy->error_callback.fn);
194
195 /* check if sizes for cloning are consistent */
201
202 /*** clone and destroy all of them to make sure cloning was complete ***/
203 {
204 secp256k1_context *ctx_tmp;
205
206 if (use_prealloc) {
207 /* clone into a non-preallocated context and then again into a new preallocated one. */
208 ctx_tmp = none; none = secp256k1_context_clone(none); secp256k1_context_preallocated_destroy(ctx_tmp);
209 free(none_prealloc); none_prealloc = malloc(secp256k1_context_preallocated_size(SECP256K1_CONTEXT_NONE)); CHECK(none_prealloc != NULL);
210 ctx_tmp = none; none = secp256k1_context_preallocated_clone(none, none_prealloc); secp256k1_context_destroy(ctx_tmp);
211
212 ctx_tmp = sign; sign = secp256k1_context_clone(sign); secp256k1_context_preallocated_destroy(ctx_tmp);
213 free(sign_prealloc); sign_prealloc = malloc(secp256k1_context_preallocated_size(SECP256K1_CONTEXT_SIGN)); CHECK(sign_prealloc != NULL);
214 ctx_tmp = sign; sign = secp256k1_context_preallocated_clone(sign, sign_prealloc); secp256k1_context_destroy(ctx_tmp);
215
216 ctx_tmp = vrfy; vrfy = secp256k1_context_clone(vrfy); secp256k1_context_preallocated_destroy(ctx_tmp);
217 free(vrfy_prealloc); vrfy_prealloc = malloc(secp256k1_context_preallocated_size(SECP256K1_CONTEXT_VERIFY)); CHECK(vrfy_prealloc != NULL);
218 ctx_tmp = vrfy; vrfy = secp256k1_context_preallocated_clone(vrfy, vrfy_prealloc); secp256k1_context_destroy(ctx_tmp);
219
220 ctx_tmp = both; both = secp256k1_context_clone(both); secp256k1_context_preallocated_destroy(ctx_tmp);
221 free(both_prealloc); both_prealloc = malloc(secp256k1_context_preallocated_size(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY)); CHECK(both_prealloc != NULL);
222 ctx_tmp = both; both = secp256k1_context_preallocated_clone(both, both_prealloc); secp256k1_context_destroy(ctx_tmp);
223 } else {
224 /* clone into a preallocated context and then again into a new non-preallocated one. */
225 void *prealloc_tmp;
226
227 prealloc_tmp = malloc(secp256k1_context_preallocated_size(SECP256K1_CONTEXT_NONE)); CHECK(prealloc_tmp != NULL);
228 ctx_tmp = none; none = secp256k1_context_preallocated_clone(none, prealloc_tmp); secp256k1_context_destroy(ctx_tmp);
229 ctx_tmp = none; none = secp256k1_context_clone(none); secp256k1_context_preallocated_destroy(ctx_tmp);
230 free(prealloc_tmp);
231
232 prealloc_tmp = malloc(secp256k1_context_preallocated_size(SECP256K1_CONTEXT_SIGN)); CHECK(prealloc_tmp != NULL);
233 ctx_tmp = sign; sign = secp256k1_context_preallocated_clone(sign, prealloc_tmp); secp256k1_context_destroy(ctx_tmp);
234 ctx_tmp = sign; sign = secp256k1_context_clone(sign); secp256k1_context_preallocated_destroy(ctx_tmp);
235 free(prealloc_tmp);
236
237 prealloc_tmp = malloc(secp256k1_context_preallocated_size(SECP256K1_CONTEXT_VERIFY)); CHECK(prealloc_tmp != NULL);
238 ctx_tmp = vrfy; vrfy = secp256k1_context_preallocated_clone(vrfy, prealloc_tmp); secp256k1_context_destroy(ctx_tmp);
239 ctx_tmp = vrfy; vrfy = secp256k1_context_clone(vrfy); secp256k1_context_preallocated_destroy(ctx_tmp);
240 free(prealloc_tmp);
241
242 prealloc_tmp = malloc(secp256k1_context_preallocated_size(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY)); CHECK(prealloc_tmp != NULL);
243 ctx_tmp = both; both = secp256k1_context_preallocated_clone(both, prealloc_tmp); secp256k1_context_destroy(ctx_tmp);
244 ctx_tmp = both; both = secp256k1_context_clone(both); secp256k1_context_preallocated_destroy(ctx_tmp);
245 free(prealloc_tmp);
246 }
247 }
248
249 /* Verify that the error callback makes it across the clone. */
250 CHECK(sign->error_callback.fn != vrfy->error_callback.fn);
252 /* And that it resets back to default. */
253 secp256k1_context_set_error_callback(sign, NULL, NULL);
254 CHECK(vrfy->error_callback.fn == sign->error_callback.fn);
255
256 /*** attempt to use them ***/
259 secp256k1_ecmult_gen(&both->ecmult_gen_ctx, &pubj, &key);
260 secp256k1_ge_set_gej(&pub, &pubj);
261
262 /* Verify context-type checking illegal-argument errors. */
263 memset(ctmp, 1, 32);
264 CHECK(secp256k1_ec_pubkey_create(sttc, &pubkey, ctmp) == 0);
265 CHECK(ecount == 1);
266 VG_UNDEF(&pubkey, sizeof(pubkey));
267 CHECK(secp256k1_ec_pubkey_create(sign, &pubkey, ctmp) == 1);
268 VG_CHECK(&pubkey, sizeof(pubkey));
269 CHECK(secp256k1_ecdsa_sign(sttc, &sig, ctmp, ctmp, NULL, NULL) == 0);
270 CHECK(ecount == 2);
271 VG_UNDEF(&sig, sizeof(sig));
272 CHECK(secp256k1_ecdsa_sign(sign, &sig, ctmp, ctmp, NULL, NULL) == 1);
273 VG_CHECK(&sig, sizeof(sig));
274 CHECK(ecount2 == 10);
275 CHECK(secp256k1_ecdsa_verify(sign, &sig, ctmp, &pubkey) == 1);
276 CHECK(ecount2 == 10);
277 CHECK(secp256k1_ecdsa_verify(sttc, &sig, ctmp, &pubkey) == 1);
278 CHECK(ecount == 2);
279 CHECK(secp256k1_ec_pubkey_tweak_add(sign, &pubkey, ctmp) == 1);
280 CHECK(ecount2 == 10);
281 CHECK(secp256k1_ec_pubkey_tweak_add(sttc, &pubkey, ctmp) == 1);
282 CHECK(ecount == 2);
283 CHECK(secp256k1_ec_pubkey_tweak_mul(sign, &pubkey, ctmp) == 1);
284 CHECK(ecount2 == 10);
285 CHECK(secp256k1_ec_pubkey_negate(sttc, &pubkey) == 1);
286 CHECK(ecount == 2);
287 CHECK(secp256k1_ec_pubkey_negate(sign, &pubkey) == 1);
288 CHECK(ecount == 2);
289 CHECK(secp256k1_ec_pubkey_negate(sign, NULL) == 0);
290 CHECK(ecount2 == 11);
291 CHECK(secp256k1_ec_pubkey_negate(sttc, &zero_pubkey) == 0);
292 CHECK(ecount == 3);
293 CHECK(secp256k1_ec_pubkey_tweak_mul(sttc, &pubkey, ctmp) == 1);
294 CHECK(ecount == 3);
295 CHECK(secp256k1_context_randomize(sttc, ctmp) == 1);
296 CHECK(ecount == 3);
297 CHECK(secp256k1_context_randomize(sttc, NULL) == 1);
298 CHECK(ecount == 3);
299 CHECK(secp256k1_context_randomize(sign, ctmp) == 1);
300 CHECK(ecount2 == 11);
301 CHECK(secp256k1_context_randomize(sign, NULL) == 1);
302 CHECK(ecount2 == 11);
305
306 /* obtain a working nonce */
307 do {
309 } while(!secp256k1_ecdsa_sig_sign(&both->ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &nonce, NULL));
310
311 /* try signing */
312 CHECK(secp256k1_ecdsa_sig_sign(&sign->ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &nonce, NULL));
313 CHECK(secp256k1_ecdsa_sig_sign(&both->ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &nonce, NULL));
314
315 /* try verifying */
316 CHECK(secp256k1_ecdsa_sig_verify(&sigr, &sigs, &pub, &msg));
317 CHECK(secp256k1_ecdsa_sig_verify(&sigr, &sigs, &pub, &msg));
318
319 /* cleanup */
320 if (use_prealloc) {
326 free(none_prealloc);
327 free(sign_prealloc);
328 free(vrfy_prealloc);
329 free(both_prealloc);
330 free(sttc_prealloc);
331 } else {
337 }
338 /* Defined as no-op. */
341
342}
343
345 const size_t adj_alloc = ((500 + ALIGNMENT - 1) / ALIGNMENT) * ALIGNMENT;
346
347 int32_t ecount = 0;
348 size_t checkpoint;
349 size_t checkpoint_2;
352 secp256k1_scratch_space local_scratch;
353
354 /* Test public API */
357
358 scratch = secp256k1_scratch_space_create(none, 1000);
359 CHECK(scratch != NULL);
360 CHECK(ecount == 0);
361
362 /* Test internal API */
363 CHECK(secp256k1_scratch_max_allocation(&none->error_callback, scratch, 0) == 1000);
364 CHECK(secp256k1_scratch_max_allocation(&none->error_callback, scratch, 1) == 1000 - (ALIGNMENT - 1));
365 CHECK(scratch->alloc_size == 0);
366 CHECK(scratch->alloc_size % ALIGNMENT == 0);
367
368 /* Allocating 500 bytes succeeds */
369 checkpoint = secp256k1_scratch_checkpoint(&none->error_callback, scratch);
370 CHECK(secp256k1_scratch_alloc(&none->error_callback, scratch, 500) != NULL);
371 CHECK(secp256k1_scratch_max_allocation(&none->error_callback, scratch, 0) == 1000 - adj_alloc);
372 CHECK(secp256k1_scratch_max_allocation(&none->error_callback, scratch, 1) == 1000 - adj_alloc - (ALIGNMENT - 1));
373 CHECK(scratch->alloc_size != 0);
374 CHECK(scratch->alloc_size % ALIGNMENT == 0);
375
376 /* Allocating another 501 bytes fails */
377 CHECK(secp256k1_scratch_alloc(&none->error_callback, scratch, 501) == NULL);
378 CHECK(secp256k1_scratch_max_allocation(&none->error_callback, scratch, 0) == 1000 - adj_alloc);
379 CHECK(secp256k1_scratch_max_allocation(&none->error_callback, scratch, 1) == 1000 - adj_alloc - (ALIGNMENT - 1));
380 CHECK(scratch->alloc_size != 0);
381 CHECK(scratch->alloc_size % ALIGNMENT == 0);
382
383 /* ...but it succeeds once we apply the checkpoint to undo it */
384 secp256k1_scratch_apply_checkpoint(&none->error_callback, scratch, checkpoint);
385 CHECK(scratch->alloc_size == 0);
386 CHECK(secp256k1_scratch_max_allocation(&none->error_callback, scratch, 0) == 1000);
387 CHECK(secp256k1_scratch_alloc(&none->error_callback, scratch, 500) != NULL);
388 CHECK(scratch->alloc_size != 0);
389
390 /* try to apply a bad checkpoint */
391 checkpoint_2 = secp256k1_scratch_checkpoint(&none->error_callback, scratch);
392 secp256k1_scratch_apply_checkpoint(&none->error_callback, scratch, checkpoint);
393 CHECK(ecount == 0);
394 secp256k1_scratch_apply_checkpoint(&none->error_callback, scratch, checkpoint_2); /* checkpoint_2 is after checkpoint */
395 CHECK(ecount == 1);
396 secp256k1_scratch_apply_checkpoint(&none->error_callback, scratch, (size_t) -1); /* this is just wildly invalid */
397 CHECK(ecount == 2);
398
399 /* try to use badly initialized scratch space */
400 secp256k1_scratch_space_destroy(none, scratch);
401 memset(&local_scratch, 0, sizeof(local_scratch));
402 scratch = &local_scratch;
404 CHECK(ecount == 3);
405 CHECK(secp256k1_scratch_alloc(&none->error_callback, scratch, 500) == NULL);
406 CHECK(ecount == 4);
407 secp256k1_scratch_space_destroy(none, scratch);
408 CHECK(ecount == 5);
409
410 /* Test that large integers do not wrap around in a bad way */
411 scratch = secp256k1_scratch_space_create(none, 1000);
412 /* Try max allocation with a large number of objects. Only makes sense if
413 * ALIGNMENT is greater than 1 because otherwise the objects take no extra
414 * space. */
415 CHECK(ALIGNMENT <= 1 || !secp256k1_scratch_max_allocation(&none->error_callback, scratch, (SIZE_MAX / (ALIGNMENT - 1)) + 1));
416 /* Try allocating SIZE_MAX to test wrap around which only happens if
417 * ALIGNMENT > 1, otherwise it returns NULL anyway because the scratch
418 * space is too small. */
419 CHECK(secp256k1_scratch_alloc(&none->error_callback, scratch, SIZE_MAX) == NULL);
420 secp256k1_scratch_space_destroy(none, scratch);
421
422 /* cleanup */
423 secp256k1_scratch_space_destroy(none, NULL); /* no-op */
425}
426
427void run_ctz_tests(void) {
428 static const uint32_t b32[] = {1, 0xffffffff, 0x5e56968f, 0xe0d63129};
429 static const uint64_t b64[] = {1, 0xffffffffffffffff, 0xbcd02462139b3fc3, 0x98b5f80c769693ef};
430 int shift;
431 unsigned i;
432 for (i = 0; i < sizeof(b32) / sizeof(b32[0]); ++i) {
433 for (shift = 0; shift < 32; ++shift) {
434 CHECK(secp256k1_ctz32_var_debruijn(b32[i] << shift) == shift);
435 CHECK(secp256k1_ctz32_var(b32[i] << shift) == shift);
436 }
437 }
438 for (i = 0; i < sizeof(b64) / sizeof(b64[0]); ++i) {
439 for (shift = 0; shift < 64; ++shift) {
440 CHECK(secp256k1_ctz64_var_debruijn(b64[i] << shift) == shift);
441 CHECK(secp256k1_ctz64_var(b64[i] << shift) == shift);
442 }
443 }
444}
445
446/***** HASH TESTS *****/
447
449 static const char *inputs[8] = {
450 "", "abc", "message digest", "secure hash algorithm", "SHA256 is considered to be safe",
451 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
452 "For this sample, this 63-byte string will be used as input data",
453 "This is exactly 64 bytes long, not counting the terminating byte"
454 };
455 static const unsigned char outputs[8][32] = {
456 {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},
457 {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},
458 {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},
459 {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},
460 {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},
461 {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},
462 {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},
463 {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}
464 };
465 int i;
466 for (i = 0; i < 8; i++) {
467 unsigned char out[32];
468 secp256k1_sha256 hasher;
470 secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i]), strlen(inputs[i]));
471 secp256k1_sha256_finalize(&hasher, out);
472 CHECK(secp256k1_memcmp_var(out, outputs[i], 32) == 0);
473 if (strlen(inputs[i]) > 0) {
474 int split = secp256k1_testrand_int(strlen(inputs[i]));
476 secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i]), split);
477 secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i] + split), strlen(inputs[i]) - split);
478 secp256k1_sha256_finalize(&hasher, out);
479 CHECK(secp256k1_memcmp_var(out, outputs[i], 32) == 0);
480 }
481 }
482}
483
485 static const char *keys[6] = {
486 "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
487 "\x4a\x65\x66\x65",
488 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
489 "\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",
490 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
491 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
492 };
493 static const char *inputs[6] = {
494 "\x48\x69\x20\x54\x68\x65\x72\x65",
495 "\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",
496 "\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",
497 "\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",
498 "\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",
499 "\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"
500 };
501 static const unsigned char outputs[6][32] = {
502 {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},
503 {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},
504 {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},
505 {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},
506 {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},
507 {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}
508 };
509 int i;
510 for (i = 0; i < 6; i++) {
512 unsigned char out[32];
513 secp256k1_hmac_sha256_initialize(&hasher, (const unsigned char*)(keys[i]), strlen(keys[i]));
514 secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i]), strlen(inputs[i]));
515 secp256k1_hmac_sha256_finalize(&hasher, out);
516 CHECK(secp256k1_memcmp_var(out, outputs[i], 32) == 0);
517 if (strlen(inputs[i]) > 0) {
518 int split = secp256k1_testrand_int(strlen(inputs[i]));
519 secp256k1_hmac_sha256_initialize(&hasher, (const unsigned char*)(keys[i]), strlen(keys[i]));
520 secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i]), split);
521 secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i] + split), strlen(inputs[i]) - split);
522 secp256k1_hmac_sha256_finalize(&hasher, out);
523 CHECK(secp256k1_memcmp_var(out, outputs[i], 32) == 0);
524 }
525 }
526}
527
529 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};
530 static const unsigned char out1[3][32] = {
531 {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},
532 {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},
533 {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}
534 };
535
536 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};
537 static const unsigned char out2[3][32] = {
538 {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},
539 {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},
540 {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}
541 };
542
544 unsigned char out[32];
545 int i;
546
548 for (i = 0; i < 3; i++) {
550 CHECK(secp256k1_memcmp_var(out, out1[i], 32) == 0);
551 }
553
555 for (i = 0; i < 3; i++) {
557 CHECK(secp256k1_memcmp_var(out, out1[i], 32) != 0);
558 }
560
562 for (i = 0; i < 3; i++) {
564 CHECK(secp256k1_memcmp_var(out, out2[i], 32) == 0);
565 }
567}
568
570 int ecount = 0;
572 unsigned char tag[32] = { 0 };
573 unsigned char msg[32] = { 0 };
574 unsigned char hash32[32];
575 unsigned char hash_expected[32] = {
576 0x04, 0x7A, 0x5E, 0x17, 0xB5, 0x86, 0x47, 0xC1,
577 0x3C, 0xC6, 0xEB, 0xC0, 0xAA, 0x58, 0x3B, 0x62,
578 0xFB, 0x16, 0x43, 0x32, 0x68, 0x77, 0x40, 0x6C,
579 0xE2, 0x76, 0x55, 0x9A, 0x3B, 0xDE, 0x55, 0xB3
580 };
581
583
584 /* API test */
585 CHECK(secp256k1_tagged_sha256(none, hash32, tag, sizeof(tag), msg, sizeof(msg)) == 1);
586 CHECK(secp256k1_tagged_sha256(none, NULL, tag, sizeof(tag), msg, sizeof(msg)) == 0);
587 CHECK(ecount == 1);
588 CHECK(secp256k1_tagged_sha256(none, hash32, NULL, 0, msg, sizeof(msg)) == 0);
589 CHECK(ecount == 2);
590 CHECK(secp256k1_tagged_sha256(none, hash32, tag, sizeof(tag), NULL, 0) == 0);
591 CHECK(ecount == 3);
592
593 /* Static test vector */
594 memcpy(tag, "tag", 3);
595 memcpy(msg, "msg", 3);
596 CHECK(secp256k1_tagged_sha256(none, hash32, tag, 3, msg, 3) == 1);
597 CHECK(secp256k1_memcmp_var(hash32, hash_expected, sizeof(hash32)) == 0);
599}
600
601/***** RANDOM TESTS *****/
602
603void test_rand_bits(int rand32, int bits) {
604 /* (1-1/2^B)^rounds[B] < 1/10^9, so rounds is the number of iterations to
605 * get a false negative chance below once in a billion */
606 static const unsigned int rounds[7] = {1, 30, 73, 156, 322, 653, 1316};
607 /* We try multiplying the results with various odd numbers, which shouldn't
608 * influence the uniform distribution modulo a power of 2. */
609 static const uint32_t mults[6] = {1, 3, 21, 289, 0x9999, 0x80402011};
610 /* We only select up to 6 bits from the output to analyse */
611 unsigned int usebits = bits > 6 ? 6 : bits;
612 unsigned int maxshift = bits - usebits;
613 /* For each of the maxshift+1 usebits-bit sequences inside a bits-bit
614 number, track all observed outcomes, one per bit in a uint64_t. */
615 uint64_t x[6][27] = {{0}};
616 unsigned int i, shift, m;
617 /* Multiply the output of all rand calls with the odd number m, which
618 should not change the uniformity of its distribution. */
619 for (i = 0; i < rounds[usebits]; i++) {
620 uint32_t r = (rand32 ? secp256k1_testrand32() : secp256k1_testrand_bits(bits));
621 CHECK((((uint64_t)r) >> bits) == 0);
622 for (m = 0; m < sizeof(mults) / sizeof(mults[0]); m++) {
623 uint32_t rm = r * mults[m];
624 for (shift = 0; shift <= maxshift; shift++) {
625 x[m][shift] |= (((uint64_t)1) << ((rm >> shift) & ((1 << usebits) - 1)));
626 }
627 }
628 }
629 for (m = 0; m < sizeof(mults) / sizeof(mults[0]); m++) {
630 for (shift = 0; shift <= maxshift; shift++) {
631 /* Test that the lower usebits bits of x[shift] are 1 */
632 CHECK(((~x[m][shift]) << (64 - (1 << usebits))) == 0);
633 }
634 }
635}
636
637/* Subrange must be a whole divisor of range, and at most 64 */
638void test_rand_int(uint32_t range, uint32_t subrange) {
639 /* (1-1/subrange)^rounds < 1/10^9 */
640 int rounds = (subrange * 2073) / 100;
641 int i;
642 uint64_t x = 0;
643 CHECK((range % subrange) == 0);
644 for (i = 0; i < rounds; i++) {
645 uint32_t r = secp256k1_testrand_int(range);
646 CHECK(r < range);
647 r = r % subrange;
648 x |= (((uint64_t)1) << r);
649 }
650 /* Test that the lower subrange bits of x are 1. */
651 CHECK(((~x) << (64 - subrange)) == 0);
652}
653
654void run_rand_bits(void) {
655 size_t b;
656 test_rand_bits(1, 32);
657 for (b = 1; b <= 32; b++) {
658 test_rand_bits(0, b);
659 }
660}
661
662void run_rand_int(void) {
663 static const uint32_t ms[] = {1, 3, 17, 1000, 13771, 999999, 33554432};
664 static const uint32_t ss[] = {1, 3, 6, 9, 13, 31, 64};
665 unsigned int m, s;
666 for (m = 0; m < sizeof(ms) / sizeof(ms[0]); m++) {
667 for (s = 0; s < sizeof(ss) / sizeof(ss[0]); s++) {
668 test_rand_int(ms[m] * ss[s], ss[s]);
669 }
670 }
671}
672
673/***** MODINV TESTS *****/
674
675/* Compute the modular inverse of (odd) x mod 2^64. */
676uint64_t modinv2p64(uint64_t x) {
677 /* If w = 1/x mod 2^(2^L), then w*(2 - w*x) = 1/x mod 2^(2^(L+1)). See
678 * Hacker's Delight second edition, Henry S. Warren, Jr., pages 245-247 for
679 * why. Start with L=0, for which it is true for every odd x that
680 * 1/x=1 mod 2. Iterating 6 times gives us 1/x mod 2^64. */
681 int l;
682 uint64_t w = 1;
683 CHECK(x & 1);
684 for (l = 0; l < 6; ++l) w *= (2 - w*x);
685 return w;
686}
687
688/* compute out = (a*b) mod m; if b=NULL, treat b=1.
689 *
690 * Out is a 512-bit number (represented as 32 uint16_t's in LE order). The other
691 * arguments are 256-bit numbers (represented as 16 uint16_t's in LE order). */
692void mulmod256(uint16_t* out, const uint16_t* a, const uint16_t* b, const uint16_t* m) {
693 uint16_t mul[32];
694 uint64_t c = 0;
695 int i, j;
696 int m_bitlen = 0;
697 int mul_bitlen = 0;
698
699 if (b != NULL) {
700 /* Compute the product of a and b, and put it in mul. */
701 for (i = 0; i < 32; ++i) {
702 for (j = i <= 15 ? 0 : i - 15; j <= i && j <= 15; j++) {
703 c += (uint64_t)a[j] * b[i - j];
704 }
705 mul[i] = c & 0xFFFF;
706 c >>= 16;
707 }
708 CHECK(c == 0);
709
710 /* compute the highest set bit in mul */
711 for (i = 511; i >= 0; --i) {
712 if ((mul[i >> 4] >> (i & 15)) & 1) {
713 mul_bitlen = i;
714 break;
715 }
716 }
717 } else {
718 /* if b==NULL, set mul=a. */
719 memcpy(mul, a, 32);
720 memset(mul + 16, 0, 32);
721 /* compute the highest set bit in mul */
722 for (i = 255; i >= 0; --i) {
723 if ((mul[i >> 4] >> (i & 15)) & 1) {
724 mul_bitlen = i;
725 break;
726 }
727 }
728 }
729
730 /* Compute the highest set bit in m. */
731 for (i = 255; i >= 0; --i) {
732 if ((m[i >> 4] >> (i & 15)) & 1) {
733 m_bitlen = i;
734 break;
735 }
736 }
737
738 /* Try do mul -= m<<i, for i going down to 0, whenever the result is not negative */
739 for (i = mul_bitlen - m_bitlen; i >= 0; --i) {
740 uint16_t mul2[32];
741 int64_t cs;
742
743 /* Compute mul2 = mul - m<<i. */
744 cs = 0; /* accumulator */
745 for (j = 0; j < 32; ++j) { /* j loops over the output limbs in mul2. */
746 /* Compute sub: the 16 bits in m that will be subtracted from mul2[j]. */
747 uint16_t sub = 0;
748 int p;
749 for (p = 0; p < 16; ++p) { /* p loops over the bit positions in mul2[j]. */
750 int bitpos = j * 16 - i + p; /* bitpos is the correspond bit position in m. */
751 if (bitpos >= 0 && bitpos < 256) {
752 sub |= ((m[bitpos >> 4] >> (bitpos & 15)) & 1) << p;
753 }
754 }
755 /* Add mul[j]-sub to accumulator, and shift bottom 16 bits out to mul2[j]. */
756 cs += mul[j];
757 cs -= sub;
758 mul2[j] = (cs & 0xFFFF);
759 cs >>= 16;
760 }
761 /* If remainder of subtraction is 0, set mul = mul2. */
762 if (cs == 0) {
763 memcpy(mul, mul2, sizeof(mul));
764 }
765 }
766 /* Sanity check: test that all limbs higher than m's highest are zero */
767 for (i = (m_bitlen >> 4) + 1; i < 32; ++i) {
768 CHECK(mul[i] == 0);
769 }
770 memcpy(out, mul, 32);
771}
772
773/* Convert a 256-bit number represented as 16 uint16_t's to signed30 notation. */
774void uint16_to_signed30(secp256k1_modinv32_signed30* out, const uint16_t* in) {
775 int i;
776 memset(out->v, 0, sizeof(out->v));
777 for (i = 0; i < 256; ++i) {
778 out->v[i / 30] |= (int32_t)(((in[i >> 4]) >> (i & 15)) & 1) << (i % 30);
779 }
780}
781
782/* Convert a 256-bit number in signed30 notation to a representation as 16 uint16_t's. */
783void signed30_to_uint16(uint16_t* out, const secp256k1_modinv32_signed30* in) {
784 int i;
785 memset(out, 0, 32);
786 for (i = 0; i < 256; ++i) {
787 out[i >> 4] |= (((in->v[i / 30]) >> (i % 30)) & 1) << (i & 15);
788 }
789}
790
791/* Randomly mutate the sign of limbs in signed30 representation, without changing the value. */
793 int i;
794 for (i = 0; i < 16; ++i) {
795 int pos = secp256k1_testrand_bits(3);
796 if (x->v[pos] > 0 && x->v[pos + 1] <= 0x3fffffff) {
797 x->v[pos] -= 0x40000000;
798 x->v[pos + 1] += 1;
799 } else if (x->v[pos] < 0 && x->v[pos + 1] >= 0x3fffffff) {
800 x->v[pos] += 0x40000000;
801 x->v[pos + 1] -= 1;
802 }
803 }
804}
805
806/* Test secp256k1_modinv32{_var}, using inputs in 16-bit limb format, and returning inverse. */
807void test_modinv32_uint16(uint16_t* out, const uint16_t* in, const uint16_t* mod) {
808 uint16_t tmp[16];
811 int i, vartime, nonzero;
812
813 uint16_to_signed30(&x, in);
814 nonzero = (x.v[0] | x.v[1] | x.v[2] | x.v[3] | x.v[4] | x.v[5] | x.v[6] | x.v[7] | x.v[8]) != 0;
817
818 /* compute 1/modulus mod 2^30 */
819 m.modulus_inv30 = modinv2p64(m.modulus.v[0]) & 0x3fffffff;
820 CHECK(((m.modulus_inv30 * m.modulus.v[0]) & 0x3fffffff) == 1);
821
822 for (vartime = 0; vartime < 2; ++vartime) {
823 /* compute inverse */
824 (vartime ? secp256k1_modinv32_var : secp256k1_modinv32)(&x, &m);
825
826 /* produce output */
827 signed30_to_uint16(out, &x);
828
829 /* check if the inverse times the input is 1 (mod m), unless x is 0. */
830 mulmod256(tmp, out, in, mod);
831 CHECK(tmp[0] == nonzero);
832 for (i = 1; i < 16; ++i) CHECK(tmp[i] == 0);
833
834 /* invert again */
835 (vartime ? secp256k1_modinv32_var : secp256k1_modinv32)(&x, &m);
836
837 /* check if the result is equal to the input */
838 signed30_to_uint16(tmp, &x);
839 for (i = 0; i < 16; ++i) CHECK(tmp[i] == in[i]);
840 }
841}
842
843#ifdef SECP256K1_WIDEMUL_INT128
844/* Convert a 256-bit number represented as 16 uint16_t's to signed62 notation. */
845void uint16_to_signed62(secp256k1_modinv64_signed62* out, const uint16_t* in) {
846 int i;
847 memset(out->v, 0, sizeof(out->v));
848 for (i = 0; i < 256; ++i) {
849 out->v[i / 62] |= (int64_t)(((in[i >> 4]) >> (i & 15)) & 1) << (i % 62);
850 }
851}
852
853/* Convert a 256-bit number in signed62 notation to a representation as 16 uint16_t's. */
854void signed62_to_uint16(uint16_t* out, const secp256k1_modinv64_signed62* in) {
855 int i;
856 memset(out, 0, 32);
857 for (i = 0; i < 256; ++i) {
858 out[i >> 4] |= (((in->v[i / 62]) >> (i % 62)) & 1) << (i & 15);
859 }
860}
861
862/* Randomly mutate the sign of limbs in signed62 representation, without changing the value. */
863void mutate_sign_signed62(secp256k1_modinv64_signed62* x) {
864 static const int64_t M62 = (int64_t)(UINT64_MAX >> 2);
865 int i;
866 for (i = 0; i < 8; ++i) {
867 int pos = secp256k1_testrand_bits(2);
868 if (x->v[pos] > 0 && x->v[pos + 1] <= M62) {
869 x->v[pos] -= (M62 + 1);
870 x->v[pos + 1] += 1;
871 } else if (x->v[pos] < 0 && x->v[pos + 1] >= -M62) {
872 x->v[pos] += (M62 + 1);
873 x->v[pos + 1] -= 1;
874 }
875 }
876}
877
878/* Test secp256k1_modinv64{_var}, using inputs in 16-bit limb format, and returning inverse. */
879void test_modinv64_uint16(uint16_t* out, const uint16_t* in, const uint16_t* mod) {
880 static const int64_t M62 = (int64_t)(UINT64_MAX >> 2);
881 uint16_t tmp[16];
884 int i, vartime, nonzero;
885
886 uint16_to_signed62(&x, in);
887 nonzero = (x.v[0] | x.v[1] | x.v[2] | x.v[3] | x.v[4]) != 0;
888 uint16_to_signed62(&m.modulus, mod);
889 mutate_sign_signed62(&m.modulus);
890
891 /* compute 1/modulus mod 2^62 */
892 m.modulus_inv62 = modinv2p64(m.modulus.v[0]) & M62;
893 CHECK(((m.modulus_inv62 * m.modulus.v[0]) & M62) == 1);
894
895 for (vartime = 0; vartime < 2; ++vartime) {
896 /* compute inverse */
897 (vartime ? secp256k1_modinv64_var : secp256k1_modinv64)(&x, &m);
898
899 /* produce output */
900 signed62_to_uint16(out, &x);
901
902 /* check if the inverse times the input is 1 (mod m), unless x is 0. */
903 mulmod256(tmp, out, in, mod);
904 CHECK(tmp[0] == nonzero);
905 for (i = 1; i < 16; ++i) CHECK(tmp[i] == 0);
906
907 /* invert again */
908 (vartime ? secp256k1_modinv64_var : secp256k1_modinv64)(&x, &m);
909
910 /* check if the result is equal to the input */
911 signed62_to_uint16(tmp, &x);
912 for (i = 0; i < 16; ++i) CHECK(tmp[i] == in[i]);
913 }
914}
915#endif
916
917/* test if a and b are coprime */
918int coprime(const uint16_t* a, const uint16_t* b) {
919 uint16_t x[16], y[16], t[16];
920 int i;
921 int iszero;
922 memcpy(x, a, 32);
923 memcpy(y, b, 32);
924
925 /* simple gcd loop: while x!=0, (x,y)=(y%x,x) */
926 while (1) {
927 iszero = 1;
928 for (i = 0; i < 16; ++i) {
929 if (x[i] != 0) {
930 iszero = 0;
931 break;
932 }
933 }
934 if (iszero) break;
935 mulmod256(t, y, NULL, x);
936 memcpy(y, x, 32);
937 memcpy(x, t, 32);
938 }
939
940 /* return whether y=1 */
941 if (y[0] != 1) return 0;
942 for (i = 1; i < 16; ++i) {
943 if (y[i] != 0) return 0;
944 }
945 return 1;
946}
947
949 /* Fixed test cases. Each tuple is (input, modulus, output), each as 16x16 bits in LE order. */
950 static const uint16_t CASES[][3][16] = {
951 /* Test cases triggering edge cases in divsteps */
952
953 /* Test case known to need 713 divsteps */
954 {{0x1513, 0x5389, 0x54e9, 0x2798, 0x1957, 0x66a0, 0x8057, 0x3477,
955 0x7784, 0x1052, 0x326a, 0x9331, 0x6506, 0xa95c, 0x91f3, 0xfb5e},
956 {0x2bdd, 0x8df4, 0xcc61, 0x481f, 0xdae5, 0x5ca7, 0xf43b, 0x7d54,
957 0x13d6, 0x469b, 0x2294, 0x20f4, 0xb2a4, 0xa2d1, 0x3ff1, 0xfd4b},
958 {0xffd8, 0xd9a0, 0x456e, 0x81bb, 0xbabd, 0x6cea, 0x6dbd, 0x73ab,
959 0xbb94, 0x3d3c, 0xdf08, 0x31c4, 0x3e32, 0xc179, 0x2486, 0xb86b}},
960 /* Test case known to need 589 divsteps, reaching delta=-140 and
961 delta=141. */
962 {{0x3fb1, 0x903b, 0x4eb7, 0x4813, 0xd863, 0x26bf, 0xd89f, 0xa8a9,
963 0x02fe, 0x57c6, 0x554a, 0x4eab, 0x165e, 0x3d61, 0xee1e, 0x456c},
964 {0x9295, 0x823b, 0x5c1f, 0x5386, 0x48e0, 0x02ff, 0x4c2a, 0xa2da,
965 0xe58f, 0x967c, 0xc97e, 0x3f5a, 0x69fb, 0x52d9, 0x0a86, 0xb4a3},
966 {0x3d30, 0xb893, 0xa809, 0xa7a8, 0x26f5, 0x5b42, 0x55be, 0xf4d0,
967 0x12c2, 0x7e6a, 0xe41a, 0x90c7, 0xebfa, 0xf920, 0x304e, 0x1419}},
968 /* Test case known to need 650 divsteps, and doing 65 consecutive (f,g/2) steps. */
969 {{0x8583, 0x5058, 0xbeae, 0xeb69, 0x48bc, 0x52bb, 0x6a9d, 0xcc94,
970 0x2a21, 0x87d5, 0x5b0d, 0x42f6, 0x5b8a, 0x2214, 0xe9d6, 0xa040},
971 {0x7531, 0x27cb, 0x7e53, 0xb739, 0x6a5f, 0x83f5, 0xa45c, 0xcb1d,
972 0x8a87, 0x1c9c, 0x51d7, 0x851c, 0xb9d8, 0x1fbe, 0xc241, 0xd4a3},
973 {0xcdb4, 0x275c, 0x7d22, 0xa906, 0x0173, 0xc054, 0x7fdf, 0x5005,
974 0x7fb8, 0x9059, 0xdf51, 0x99df, 0x2654, 0x8f6e, 0x070f, 0xb347}},
975 /* example needing 713 divsteps; delta=-2..3 */
976 {{0xe2e9, 0xee91, 0x4345, 0xe5ad, 0xf3ec, 0x8f42, 0x0364, 0xd5c9,
977 0xff49, 0xbef5, 0x4544, 0x4c7c, 0xae4b, 0xfd9d, 0xb35b, 0xda9d},
978 {0x36e7, 0x8cca, 0x2ed0, 0x47b3, 0xaca4, 0xb374, 0x7d2a, 0x0772,
979 0x6bdb, 0xe0a7, 0x900b, 0xfe10, 0x788c, 0x6f22, 0xd909, 0xf298},
980 {0xd8c6, 0xba39, 0x13ed, 0x198c, 0x16c8, 0xb837, 0xa5f2, 0x9797,
981 0x0113, 0x882a, 0x15b5, 0x324c, 0xabee, 0xe465, 0x8170, 0x85ac}},
982 /* example needing 713 divsteps; delta=-2..3 */
983 {{0xd5b7, 0x2966, 0x040e, 0xf59a, 0x0387, 0xd96d, 0xbfbc, 0xd850,
984 0x2d96, 0x872a, 0xad81, 0xc03c, 0xbb39, 0xb7fa, 0xd904, 0xef78},
985 {0x6279, 0x4314, 0xfdd3, 0x1568, 0x0982, 0x4d13, 0x625f, 0x010c,
986 0x22b1, 0x0cc3, 0xf22d, 0x5710, 0x1109, 0x5751, 0x7714, 0xfcf2},
987 {0xdb13, 0x5817, 0x232e, 0xe456, 0xbbbc, 0x6fbe, 0x4572, 0xa358,
988 0xc76d, 0x928e, 0x0162, 0x5314, 0x8325, 0x5683, 0xe21b, 0xda88}},
989 /* example needing 713 divsteps; delta=-2..3 */
990 {{0xa06f, 0x71ee, 0x3bac, 0x9ebb, 0xdeaa, 0x09ed, 0x1cf7, 0x9ec9,
991 0x7158, 0x8b72, 0x5d53, 0x5479, 0x5c75, 0xbb66, 0x9125, 0xeccc},
992 {0x2941, 0xd46c, 0x3cd4, 0x4a9d, 0x5c4a, 0x256b, 0xbd6c, 0x9b8e,
993 0x8fe0, 0x8a14, 0xffe8, 0x2496, 0x618d, 0xa9d7, 0x5018, 0xfb29},
994 {0x437c, 0xbd60, 0x7590, 0x94bb, 0x0095, 0xd35e, 0xd4fe, 0xd6da,
995 0x0d4e, 0x5342, 0x4cd2, 0x169b, 0x661c, 0x1380, 0xed2d, 0x85c1}},
996 /* example reaching delta=-64..65; 661 divsteps */
997 {{0xfde4, 0x68d6, 0x6c48, 0x7f77, 0x1c78, 0x96de, 0x2fd9, 0xa6c2,
998 0xbbb5, 0xd319, 0x69cf, 0xd4b3, 0xa321, 0xcda0, 0x172e, 0xe530},
999 {0xd9e3, 0x0f60, 0x3d86, 0xeeab, 0x25ee, 0x9582, 0x2d50, 0xfe16,
1000 0xd4e2, 0xe3ba, 0x94e2, 0x9833, 0x6c5e, 0x8982, 0x13b6, 0xe598},
1001 {0xe675, 0xf55a, 0x10f6, 0xabde, 0x5113, 0xecaa, 0x61ae, 0xad9f,
1002 0x0c27, 0xef33, 0x62e5, 0x211d, 0x08fa, 0xa78d, 0xc675, 0x8bae}},
1003 /* example reaching delta=-64..65; 661 divsteps */
1004 {{0x21bf, 0x52d5, 0x8fd4, 0xaa18, 0x156a, 0x7247, 0xebb8, 0x5717,
1005 0x4eb5, 0x1421, 0xb58f, 0x3b0b, 0x5dff, 0xe533, 0xb369, 0xd28a},
1006 {0x9f6b, 0xe463, 0x2563, 0xc74d, 0x6d81, 0x636a, 0x8fc8, 0x7a94,
1007 0x9429, 0x1585, 0xf35e, 0x7ff5, 0xb64f, 0x9720, 0xba74, 0xe108},
1008 {0xa5ab, 0xea7b, 0xfe5e, 0x8a85, 0x13be, 0x7934, 0xe8a0, 0xa187,
1009 0x86b5, 0xe477, 0xb9a4, 0x75d7, 0x538f, 0xdd70, 0xc781, 0xb67d}},
1010 /* example reaching delta=-64..65; 661 divsteps */
1011 {{0xa41a, 0x3e8d, 0xf1f5, 0x9493, 0x868c, 0x5103, 0x2725, 0x3ceb,
1012 0x6032, 0x3624, 0xdc6b, 0x9120, 0xbf4c, 0x8821, 0x91ad, 0xb31a},
1013 {0x5c0b, 0xdda5, 0x20f8, 0x32a1, 0xaf73, 0x6ec5, 0x4779, 0x43d6,
1014 0xd454, 0x9573, 0xbf84, 0x5a58, 0xe04e, 0x307e, 0xd1d5, 0xe230},
1015 {0xda15, 0xbcd6, 0x7180, 0xabd3, 0x04e6, 0x6986, 0xc0d7, 0x90bb,
1016 0x3a4d, 0x7c95, 0xaaab, 0x9ab3, 0xda34, 0xa7f6, 0x9636, 0x6273}},
1017 /* example doing 123 consecutive (f,g/2) steps; 615 divsteps */
1018 {{0xb4d6, 0xb38f, 0x00aa, 0xebda, 0xd4c2, 0x70b8, 0x9dad, 0x58ee,
1019 0x68f8, 0x48d3, 0xb5ff, 0xf422, 0x9e46, 0x2437, 0x18d0, 0xd9cc},
1020 {0x5c83, 0xfed7, 0x97f5, 0x3f07, 0xcaad, 0x95b1, 0xb4a4, 0xb005,
1021 0x23af, 0xdd27, 0x6c0d, 0x932c, 0xe2b2, 0xe3ae, 0xfb96, 0xdf67},
1022 {0x3105, 0x0127, 0xfd48, 0x039b, 0x35f1, 0xbc6f, 0x6c0a, 0xb572,
1023 0xe4df, 0xebad, 0x8edc, 0xb89d, 0x9555, 0x4c26, 0x1fef, 0x997c}},
1024 /* example doing 123 consecutive (f,g/2) steps; 614 divsteps */
1025 {{0x5138, 0xd474, 0x385f, 0xc964, 0x00f2, 0x6df7, 0x862d, 0xb185,
1026 0xb264, 0xe9e1, 0x466c, 0xf39e, 0xafaf, 0x5f41, 0x47e2, 0xc89d},
1027 {0x8607, 0x9c81, 0x46a2, 0x7dcc, 0xcb0c, 0x9325, 0xe149, 0x2bde,
1028 0x6632, 0x2869, 0xa261, 0xb163, 0xccee, 0x22ae, 0x91e0, 0xcfd5},
1029 {0x831c, 0xda22, 0xb080, 0xba7a, 0x26e2, 0x54b0, 0x073b, 0x5ea0,
1030 0xed4b, 0xcb3d, 0xbba1, 0xbec8, 0xf2ad, 0xae0d, 0x349b, 0x17d1}},
1031 /* example doing 123 consecutive (f,g/2) steps; 614 divsteps */
1032 {{0xe9a5, 0xb4ad, 0xd995, 0x9953, 0xcdff, 0x50d7, 0xf715, 0x9dc7,
1033 0x3e28, 0x15a9, 0x95a3, 0x8554, 0x5b5e, 0xad1d, 0x6d57, 0x3d50},
1034 {0x3ad9, 0xbd60, 0x5cc7, 0x6b91, 0xadeb, 0x71f6, 0x7cc4, 0xa58a,
1035 0x2cce, 0xf17c, 0x38c9, 0x97ed, 0x65fb, 0x3fa6, 0xa6bc, 0xeb24},
1036 {0xf96c, 0x1963, 0x8151, 0xa0cc, 0x299b, 0xf277, 0x001a, 0x16bb,
1037 0xfd2e, 0x532d, 0x0410, 0xe117, 0x6b00, 0x44ec, 0xca6a, 0x1745}},
1038 /* example doing 446 (f,g/2) steps; 523 divsteps */
1039 {{0x3758, 0xa56c, 0xe41e, 0x4e47, 0x0975, 0xa82b, 0x107c, 0x89cf,
1040 0x2093, 0x5a0c, 0xda37, 0xe007, 0x6074, 0x4f68, 0x2f5a, 0xbb8a},
1041 {0x4beb, 0xa40f, 0x2c42, 0xd9d6, 0x97e8, 0xca7c, 0xd395, 0x894f,
1042 0x1f50, 0x8067, 0xa233, 0xb850, 0x1746, 0x1706, 0xbcda, 0xdf32},
1043 {0x762a, 0xceda, 0x4c45, 0x1ca0, 0x8c37, 0xd8c5, 0xef57, 0x7a2c,
1044 0x6e98, 0xe38a, 0xc50e, 0x2ca9, 0xcb85, 0x24d5, 0xc29c, 0x61f6}},
1045 /* example doing 446 (f,g/2) steps; 523 divsteps */
1046 {{0x6f38, 0x74ad, 0x7332, 0x4073, 0x6521, 0xb876, 0xa370, 0xa6bd,
1047 0xcea5, 0xbd06, 0x969f, 0x77c6, 0x1e69, 0x7c49, 0x7d51, 0xb6e7},
1048 {0x3f27, 0x4be4, 0xd81e, 0x1396, 0xb21f, 0x92aa, 0x6dc3, 0x6283,
1049 0x6ada, 0x3ca2, 0xc1e5, 0x8b9b, 0xd705, 0x5598, 0x8ba1, 0xe087},
1050 {0x6a22, 0xe834, 0xbc8d, 0xcee9, 0x42fc, 0xfc77, 0x9c45, 0x1ca8,
1051 0xeb66, 0xed74, 0xaaf9, 0xe75f, 0xfe77, 0x46d2, 0x179b, 0xbf3e}},
1052 /* example doing 336 (f,(f+g)/2) steps; 693 divsteps */
1053 {{0x7ea7, 0x444e, 0x84ea, 0xc447, 0x7c1f, 0xab97, 0x3de6, 0x5878,
1054 0x4e8b, 0xc017, 0x03e0, 0xdc40, 0xbbd0, 0x74ce, 0x0169, 0x7ab5},
1055 {0x4023, 0x154f, 0xfbe4, 0x8195, 0xfda0, 0xef54, 0x9e9a, 0xc703,
1056 0x2803, 0xf760, 0x6302, 0xed5b, 0x7157, 0x6456, 0xdd7d, 0xf14b},
1057 {0xb6fb, 0xe3b3, 0x0733, 0xa77e, 0x44c5, 0x3003, 0xc937, 0xdd4d,
1058 0x5355, 0x14e9, 0x184e, 0xcefe, 0xe6b5, 0xf2e0, 0x0a28, 0x5b74}},
1059 /* example doing 336 (f,(f+g)/2) steps; 687 divsteps */
1060 {{0xa893, 0xb5f4, 0x1ede, 0xa316, 0x242c, 0xbdcc, 0xb017, 0x0836,
1061 0x3a37, 0x27fb, 0xfb85, 0x251e, 0xa189, 0xb15d, 0xa4b8, 0xc24c},
1062 {0xb0b7, 0x57ba, 0xbb6d, 0x9177, 0xc896, 0xc7f2, 0x43b4, 0x85a6,
1063 0xe6c4, 0xe50e, 0x3109, 0x7ca5, 0xd73d, 0x13ff, 0x0c3d, 0xcd62},
1064 {0x48ca, 0xdb34, 0xe347, 0x2cef, 0x4466, 0x10fb, 0x7ee1, 0x6344,
1065 0x4308, 0x966d, 0xd4d1, 0xb099, 0x994f, 0xd025, 0x2187, 0x5866}},
1066 /* example doing 267 (g,(g-f)/2) steps; 678 divsteps */
1067 {{0x0775, 0x1754, 0x01f6, 0xdf37, 0xc0be, 0x8197, 0x072f, 0x6cf5,
1068 0x8b36, 0x8069, 0x5590, 0xb92d, 0x6084, 0x47a4, 0x23fe, 0xddd5},
1069 {0x8e1b, 0xda37, 0x27d9, 0x312e, 0x3a2f, 0xef6d, 0xd9eb, 0x8153,
1070 0xdcba, 0x9fa3, 0x9f80, 0xead5, 0x134d, 0x2ebb, 0x5ec0, 0xe032},
1071 {0x1cb6, 0x5a61, 0x1bed, 0x77d6, 0xd5d1, 0x7498, 0xef33, 0x2dd2,
1072 0x1089, 0xedbd, 0x6958, 0x16ae, 0x336c, 0x45e6, 0x4361, 0xbadc}},
1073 /* example doing 267 (g,(g-f)/2) steps; 676 divsteps */
1074 {{0x0207, 0xf948, 0xc430, 0xf36b, 0xf0a7, 0x5d36, 0x751f, 0x132c,
1075 0x6f25, 0xa630, 0xca1f, 0xc967, 0xaf9c, 0x34e7, 0xa38f, 0xbe9f},
1076 {0x5fb9, 0x7321, 0x6561, 0x5fed, 0x54ec, 0x9c3a, 0xee0e, 0x6717,
1077 0x49af, 0xb896, 0xf4f5, 0x451c, 0x722a, 0xf116, 0x64a9, 0xcf0b},
1078 {0xf4d7, 0xdb47, 0xfef2, 0x4806, 0x4cb8, 0x18c7, 0xd9a7, 0x4951,
1079 0x14d8, 0x5c3a, 0xd22d, 0xd7b2, 0x750c, 0x3de7, 0x8b4a, 0x19aa}},
1080
1081 /* Test cases triggering edge cases in divsteps variant starting with delta=1/2 */
1082
1083 /* example needing 590 divsteps; delta=-5/2..7/2 */
1084 {{0x9118, 0xb640, 0x53d7, 0x30ab, 0x2a23, 0xd907, 0x9323, 0x5b3a,
1085 0xb6d4, 0x538a, 0x7637, 0xfe97, 0xfd05, 0x3cc0, 0x453a, 0xfb7e},
1086 {0x6983, 0x4f75, 0x4ad1, 0x48ad, 0xb2d9, 0x521d, 0x3dbc, 0x9cc0,
1087 0x4b60, 0x0ac6, 0xd3be, 0x0fb6, 0xd305, 0x3895, 0x2da5, 0xfdf8},
1088 {0xcec1, 0x33ac, 0xa801, 0x8194, 0xe36c, 0x65ef, 0x103b, 0xca54,
1089 0xfa9b, 0xb41d, 0x9b52, 0xb6f7, 0xa611, 0x84aa, 0x3493, 0xbf54}},
1090 /* example needing 590 divsteps; delta=-3/2..5/2 */
1091 {{0xb5f2, 0x42d0, 0x35e8, 0x8ca0, 0x4b62, 0x6e1d, 0xbdf3, 0x890e,
1092 0x8c82, 0x23d8, 0xc79a, 0xc8e8, 0x789e, 0x353d, 0x9766, 0xea9d},
1093 {0x6fa1, 0xacba, 0x4b7a, 0x5de1, 0x95d0, 0xc845, 0xebbf, 0x6f5a,
1094 0x30cf, 0x52db, 0x69b7, 0xe278, 0x4b15, 0x8411, 0x2ab2, 0xf3e7},
1095 {0xf12c, 0x9d6d, 0x95fa, 0x1878, 0x9f13, 0x4fb5, 0x3c8b, 0xa451,
1096 0x7182, 0xc4b6, 0x7e2a, 0x7bb7, 0x6e0e, 0x5b68, 0xde55, 0x9927}},
1097 /* example needing 590 divsteps; delta=-3/2..5/2 */
1098 {{0x229c, 0x4ef8, 0x1e93, 0xe5dc, 0xcde5, 0x6d62, 0x263b, 0xad11,
1099 0xced0, 0x88ff, 0xae8e, 0x3183, 0x11d2, 0xa50b, 0x350d, 0xeb40},
1100 {0x3157, 0xe2ea, 0x8a02, 0x0aa3, 0x5ae1, 0xb26c, 0xea27, 0x6805,
1101 0x87e2, 0x9461, 0x37c1, 0x2f8d, 0x85d2, 0x77a8, 0xf805, 0xeec9},
1102 {0x6f4e, 0x2748, 0xf7e5, 0xd8d3, 0xabe2, 0x7270, 0xc4e0, 0xedc7,
1103 0xf196, 0x78ca, 0x9139, 0xd8af, 0x72c6, 0xaf2f, 0x85d2, 0x6cd3}},
1104 /* example needing 590 divsteps; delta=-5/2..7/2 */
1105 {{0xdce8, 0xf1fe, 0x6708, 0x021e, 0xf1ca, 0xd609, 0x5443, 0x85ce,
1106 0x7a05, 0x8f9c, 0x90c3, 0x52e7, 0x8e1d, 0x97b8, 0xc0bf, 0xf2a1},
1107 {0xbd3d, 0xed11, 0x1625, 0xb4c5, 0x844c, 0xa413, 0x2569, 0xb9ba,
1108 0xcd35, 0xff84, 0xcd6e, 0x7f0b, 0x7d5d, 0x10df, 0x3efe, 0xfbe5},
1109 {0xa9dd, 0xafef, 0xb1b7, 0x4c8d, 0x50e4, 0xafbf, 0x2d5a, 0xb27c,
1110 0x0653, 0x66b6, 0x5d36, 0x4694, 0x7e35, 0xc47c, 0x857f, 0x32c5}},
1111 /* example needing 590 divsteps; delta=-3/2..5/2 */
1112 {{0x7902, 0xc9f8, 0x926b, 0xaaeb, 0x90f8, 0x1c89, 0xcce3, 0x96b7,
1113 0x28b2, 0x87a2, 0x136d, 0x695a, 0xa8df, 0x9061, 0x9e31, 0xee82},
1114 {0xd3a9, 0x3c02, 0x818c, 0x6b81, 0x34b3, 0xebbb, 0xe2c8, 0x7712,
1115 0xbfd6, 0x8248, 0xa6f4, 0xba6f, 0x03bb, 0xfb54, 0x7575, 0xfe89},
1116 {0x8246, 0x0d63, 0x478e, 0xf946, 0xf393, 0x0451, 0x08c2, 0x5919,
1117 0x5fd6, 0x4c61, 0xbeb7, 0x9a15, 0x30e1, 0x55fc, 0x6a01, 0x3724}},
1118 /* example reaching delta=-127/2..129/2; 571 divsteps */
1119 {{0x3eff, 0x926a, 0x77f5, 0x1fff, 0x1a5b, 0xf3ef, 0xf64b, 0x8681,
1120 0xf800, 0xf9bc, 0x761d, 0xe268, 0x62b0, 0xa032, 0xba9c, 0xbe56},
1121 {0xb8f9, 0x00e7, 0x47b7, 0xdffc, 0xfd9d, 0x5abb, 0xa19b, 0x1868,
1122 0x31fd, 0x3b29, 0x3674, 0x5449, 0xf54d, 0x1d19, 0x6ac7, 0xff6f},
1123 {0xf1d7, 0x3551, 0x5682, 0x9adf, 0xe8aa, 0x19a5, 0x8340, 0x71db,
1124 0xb7ab, 0x4cfd, 0xf661, 0x632c, 0xc27e, 0xd3c6, 0xdf42, 0xd306}},
1125 /* example reaching delta=-127/2..129/2; 571 divsteps */
1126 {{0x0000, 0x0000, 0x0000, 0x0000, 0x3aff, 0x2ed7, 0xf2e0, 0xabc7,
1127 0x8aee, 0x166e, 0x7ed0, 0x9ac7, 0x714a, 0xb9c5, 0x4d58, 0xad6c},
1128 {0x9cf9, 0x47e2, 0xa421, 0xb277, 0xffc2, 0x2747, 0x6486, 0x94c1,
1129 0x1d99, 0xd49b, 0x1096, 0x991a, 0xe986, 0xae02, 0xe89b, 0xea36},
1130 {0x1fb4, 0x98d8, 0x19b7, 0x80e9, 0xcdac, 0xaa5a, 0xf1e6, 0x0074,
1131 0xe393, 0xed8b, 0x8d5c, 0xe17d, 0x81b3, 0xc16d, 0x54d3, 0x9be3}},
1132 /* example reaching delta=-127/2..129/2; 571 divsteps */
1133 {{0xd047, 0x7e36, 0x3157, 0x7ab6, 0xb4d9, 0x8dae, 0x7534, 0x4f5d,
1134 0x489e, 0xa8ab, 0x8a3d, 0xd52c, 0x62af, 0xa032, 0xba9c, 0xbe56},
1135 {0xb1f1, 0x737f, 0x5964, 0x5afb, 0x3712, 0x8ef9, 0x19f7, 0x9669,
1136 0x664d, 0x03ad, 0xc352, 0xf7a5, 0xf545, 0x1d19, 0x6ac7, 0xff6f},
1137 {0xa834, 0x5256, 0x27bc, 0x33bd, 0xba11, 0x5a7b, 0x791e, 0xe6c0,
1138 0x9ac4, 0x9370, 0x1130, 0x28b4, 0x2b2e, 0x231b, 0x082a, 0x796e}},
1139 /* example doing 123 consecutive (f,g/2) steps; 554 divsteps */
1140 {{0x6ab1, 0x6ea0, 0x1a99, 0xe0c2, 0xdd45, 0x645d, 0x8dbc, 0x466a,
1141 0xfa64, 0x4289, 0xd3f7, 0xfc8f, 0x2894, 0xe3c5, 0xa008, 0xcc14},
1142 {0xc75f, 0xc083, 0x4cc2, 0x64f2, 0x2aff, 0x4c12, 0x8461, 0xc4ae,
1143 0xbbfa, 0xb336, 0xe4b2, 0x3ac5, 0x2c22, 0xf56c, 0x5381, 0xe943},
1144 {0xcd80, 0x760d, 0x4395, 0xb3a6, 0xd497, 0xf583, 0x82bd, 0x1daa,
1145 0xbe92, 0x2613, 0xfdfb, 0x869b, 0x0425, 0xa333, 0x7056, 0xc9c5}},
1146 /* example doing 123 consecutive (f,g/2) steps; 554 divsteps */
1147 {{0x71d4, 0x64df, 0xec4f, 0x74d8, 0x7e0c, 0x40d3, 0x7073, 0x4cc8,
1148 0x2a2a, 0xb1ff, 0x8518, 0x6513, 0xb0ea, 0x640a, 0x62d9, 0xd5f4},
1149 {0xdc75, 0xd937, 0x3b13, 0x1d36, 0xdf83, 0xd034, 0x1c1c, 0x4332,
1150 0x4cc3, 0xeeec, 0x7d94, 0x6771, 0x3384, 0x74b0, 0x947d, 0xf2c4},
1151 {0x0a82, 0x37a4, 0x12d5, 0xec97, 0x972c, 0xe6bf, 0xc348, 0xa0a9,
1152 0xc50c, 0xdc7c, 0xae30, 0x19d1, 0x0fca, 0x35e1, 0xd6f6, 0x81ee}},
1153 /* example doing 123 consecutive (f,g/2) steps; 554 divsteps */
1154 {{0xa6b1, 0xabc5, 0x5bbc, 0x7f65, 0xdd32, 0xaa73, 0xf5a3, 0x1982,
1155 0xced4, 0xe949, 0x0fd6, 0x2bc4, 0x2bd7, 0xe3c5, 0xa008, 0xcc14},
1156 {0x4b5f, 0x8f96, 0xa375, 0xfbcf, 0x1c7d, 0xf1ec, 0x03f5, 0xb35d,
1157 0xb999, 0xdb1f, 0xc9a1, 0xb4c7, 0x1dd5, 0xf56c, 0x5381, 0xe943},
1158 {0xaa3d, 0x38b9, 0xf17d, 0xeed9, 0x9988, 0x69ee, 0xeb88, 0x1495,
1159 0x203f, 0x18c8, 0x82b7, 0xdcb2, 0x34a7, 0x6b00, 0x6998, 0x589a}},
1160 /* example doing 453 (f,g/2) steps; 514 divsteps */
1161 {{0xa478, 0xe60d, 0x3244, 0x60e6, 0xada3, 0xfe50, 0xb6b1, 0x2eae,
1162 0xd0ef, 0xa7b1, 0xef63, 0x05c0, 0xe213, 0x443e, 0x4427, 0x2448},
1163 {0x258f, 0xf9ef, 0xe02b, 0x92dd, 0xd7f3, 0x252b, 0xa503, 0x9089,
1164 0xedff, 0x96c1, 0xfe3a, 0x3a39, 0x198a, 0x981d, 0x0627, 0xedb7},
1165 {0x595a, 0x45be, 0x8fb0, 0x2265, 0xc210, 0x02b8, 0xdce9, 0xe241,
1166 0xcab6, 0xbf0d, 0x0049, 0x8d9a, 0x2f51, 0xae54, 0x5785, 0xb411}},
1167 /* example doing 453 (f,g/2) steps; 514 divsteps */
1168 {{0x48f0, 0x7db3, 0xdafe, 0x1c92, 0x5912, 0xe11a, 0xab52, 0xede1,
1169 0x3182, 0x8980, 0x5d2b, 0x9b5b, 0x8718, 0xda27, 0x1683, 0x1de2},
1170 {0x168f, 0x6f36, 0xce7a, 0xf435, 0x19d4, 0xda5e, 0x2351, 0x9af5,
1171 0xb003, 0x0ef5, 0x3b4c, 0xecec, 0xa9f0, 0x78e1, 0xdfef, 0xe823},
1172 {0x5f55, 0xfdcc, 0xb233, 0x2914, 0x84f0, 0x97d1, 0x9cf4, 0x2159,
1173 0xbf56, 0xb79c, 0x17a3, 0x7cef, 0xd5de, 0x34f0, 0x5311, 0x4c54}},
1174 /* example doing 510 (f,(f+g)/2) steps; 512 divsteps */
1175 {{0x2789, 0x2e04, 0x6e0e, 0xb6cd, 0xe4de, 0x4dbf, 0x228d, 0x7877,
1176 0xc335, 0x806b, 0x38cd, 0x8049, 0xa73b, 0xcfa2, 0x82f7, 0x9e19},
1177 {0xc08d, 0xb99d, 0xb8f3, 0x663d, 0xbbb3, 0x1284, 0x1485, 0x1d49,
1178 0xc98f, 0x9e78, 0x1588, 0x11e3, 0xd91a, 0xa2c7, 0xfff1, 0xc7b9},
1179 {0x1e1f, 0x411d, 0x7c49, 0x0d03, 0xe789, 0x2f8e, 0x5d55, 0xa95e,
1180 0x826e, 0x8de5, 0x52a0, 0x1abc, 0x4cd7, 0xd13a, 0x4395, 0x63e1}},
1181 /* example doing 510 (f,(f+g)/2) steps; 512 divsteps */
1182 {{0xd5a1, 0xf786, 0x555c, 0xb14b, 0x44ae, 0x535f, 0x4a49, 0xffc3,
1183 0xf497, 0x70d1, 0x57c8, 0xa933, 0xc85a, 0x1910, 0x75bf, 0x960b},
1184 {0xfe53, 0x5058, 0x496d, 0xfdff, 0x6fb8, 0x4100, 0x92bd, 0xe0c4,
1185 0xda89, 0xe0a4, 0x841b, 0x43d4, 0xa388, 0x957f, 0x99ca, 0x9abf},
1186 {0xe530, 0x05bc, 0xfeec, 0xfc7e, 0xbcd3, 0x1239, 0x54cb, 0x7042,
1187 0xbccb, 0x139e, 0x9076, 0x0203, 0x6068, 0x90c7, 0x1ddf, 0x488d}},
1188 /* example doing 228 (g,(g-f)/2) steps; 538 divsteps */
1189 {{0x9488, 0xe54b, 0x0e43, 0x81d2, 0x06e7, 0x4b66, 0x36d0, 0x53d6,
1190 0x2b68, 0x22ec, 0x3fa9, 0xc1a7, 0x9ad2, 0xa596, 0xb3ac, 0xdf42},
1191 {0xe31f, 0x0b28, 0x5f3b, 0xc1ff, 0x344c, 0xbf5f, 0xd2ec, 0x2936,
1192 0x9995, 0xdeb2, 0xae6c, 0x2852, 0xa2c6, 0xb306, 0x8120, 0xe305},
1193 {0xa56e, 0xfb98, 0x1537, 0x4d85, 0x619e, 0x866c, 0x3cd4, 0x779a,
1194 0xdd66, 0xa80d, 0xdc2f, 0xcae4, 0xc74c, 0x5175, 0xa65d, 0x605e}},
1195 /* example doing 228 (g,(g-f)/2) steps; 537 divsteps */
1196 {{0x8cd5, 0x376d, 0xd01b, 0x7176, 0x19ef, 0xcf09, 0x8403, 0x5e52,
1197 0x83c1, 0x44de, 0xb91e, 0xb33d, 0xe15c, 0x51e7, 0xbad8, 0x6359},
1198 {0x3b75, 0xf812, 0x5f9e, 0xa04e, 0x92d3, 0x226e, 0x540e, 0x7c9a,
1199 0x31c6, 0x46d2, 0x0b7b, 0xdb4a, 0xe662, 0x4950, 0x0265, 0xf76f},
1200 {0x09ed, 0x692f, 0xe8f1, 0x3482, 0xab54, 0x36b4, 0x8442, 0x6ae9,
1201 0x4329, 0x6505, 0x183b, 0x1c1d, 0x482d, 0x7d63, 0xb44f, 0xcc09}},
1202
1203 /* Test cases with the group order as modulus. */
1204
1205 /* Test case with the group order as modulus, needing 635 divsteps. */
1206 {{0x95ed, 0x6c01, 0xd113, 0x5ff1, 0xd7d0, 0x29cc, 0x5817, 0x6120,
1207 0xca8e, 0xaad1, 0x25ae, 0x8e84, 0x9af6, 0x30bf, 0xf0ed, 0x1686},
1208 {0x4141, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1209 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1210 {0x1631, 0xbf4a, 0x286a, 0x2716, 0x469f, 0x2ac8, 0x1312, 0xe9bc,
1211 0x04f4, 0x304b, 0x9931, 0x113b, 0xd932, 0xc8f4, 0x0d0d, 0x01a1}},
1212 /* example with group size as modulus needing 631 divsteps */
1213 {{0x85ed, 0xc284, 0x9608, 0x3c56, 0x19b6, 0xbb5b, 0x2850, 0xdab7,
1214 0xa7f5, 0xe9ab, 0x06a4, 0x5bbb, 0x1135, 0xa186, 0xc424, 0xc68b},
1215 {0x4141, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1216 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1217 {0x8479, 0x450a, 0x8fa3, 0xde05, 0xb2f5, 0x7793, 0x7269, 0xbabb,
1218 0xc3b3, 0xd49b, 0x3377, 0x03c6, 0xe694, 0xc760, 0xd3cb, 0x2811}},
1219 /* example with group size as modulus needing 565 divsteps starting at delta=1/2 */
1220 {{0x8432, 0x5ceb, 0xa847, 0x6f1e, 0x51dd, 0x535a, 0x6ddc, 0x70ce,
1221 0x6e70, 0xc1f6, 0x18f2, 0x2a7e, 0xc8e7, 0x39f8, 0x7e96, 0xebbf},
1222 {0x4141, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1223 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1224 {0x257e, 0x449f, 0x689f, 0x89aa, 0x3989, 0xb661, 0x376c, 0x1e32,
1225 0x654c, 0xee2e, 0xf4e2, 0x33c8, 0x3f2f, 0x9716, 0x6046, 0xcaa3}},
1226 /* Test case with the group size as modulus, needing 981 divsteps with
1227 broken eta handling. */
1228 {{0xfeb9, 0xb877, 0xee41, 0x7fa3, 0x87da, 0x94c4, 0x9d04, 0xc5ae,
1229 0x5708, 0x0994, 0xfc79, 0x0916, 0xbf32, 0x3ad8, 0xe11c, 0x5ca2},
1230 {0x4141, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1231 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1232 {0x0f12, 0x075e, 0xce1c, 0x6f92, 0xc80f, 0xca92, 0x9a04, 0x6126,
1233 0x4b6c, 0x57d6, 0xca31, 0x97f3, 0x1f99, 0xf4fd, 0xda4d, 0x42ce}},
1234 /* Test case with the group size as modulus, input = 0. */
1235 {{0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1236 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
1237 {0x4141, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1238 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1239 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1240 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
1241 /* Test case with the group size as modulus, input = 1. */
1242 {{0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1243 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
1244 {0x4141, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1245 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1246 {0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1247 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
1248 /* Test case with the group size as modulus, input = 2. */
1249 {{0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1250 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
1251 {0x4141, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1252 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1253 {0x20a1, 0x681b, 0x2f46, 0xdfe9, 0x501d, 0x57a4, 0x6e73, 0x5d57,
1254 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x7fff}},
1255 /* Test case with the group size as modulus, input = group - 1. */
1256 {{0x4140, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1257 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1258 {0x4141, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1259 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1260 {0x4140, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1261 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}},
1262
1263 /* Test cases with the field size as modulus. */
1264
1265 /* Test case with the field size as modulus, needing 637 divsteps. */
1266 {{0x9ec3, 0x1919, 0xca84, 0x7c11, 0xf996, 0x06f3, 0x5408, 0x6688,
1267 0x1320, 0xdb8a, 0x632a, 0x0dcb, 0x8a84, 0x6bee, 0x9c95, 0xe34e},
1268 {0xfc2f, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1269 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1270 {0x18e5, 0x19b6, 0xdf92, 0x1aaa, 0x09fb, 0x8a3f, 0x52b0, 0x8701,
1271 0xac0c, 0x2582, 0xda44, 0x9bcc, 0x6828, 0x1c53, 0xbd8f, 0xbd2c}},
1272 /* example with field size as modulus needing 637 divsteps */
1273 {{0xaec3, 0xa7cf, 0x2f2d, 0x0693, 0x5ad5, 0xa8ff, 0x7ec7, 0x30ff,
1274 0x0c8b, 0xc242, 0xcab2, 0x063a, 0xf86e, 0x6057, 0x9cbd, 0xf6d8},
1275 {0xfc2f, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1276 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1277 {0x0310, 0x579d, 0xcb38, 0x9030, 0x3ded, 0x9bb9, 0x1234, 0x63ce,
1278 0x0c63, 0x8e3d, 0xacfe, 0x3c20, 0xdc85, 0xf859, 0x919e, 0x1d45}},
1279 /* example with field size as modulus needing 564 divsteps starting at delta=1/2 */
1280 {{0x63ae, 0x8d10, 0x0071, 0xdb5c, 0xb454, 0x78d1, 0x744a, 0x5f8e,
1281 0xe4d8, 0x87b1, 0x8e62, 0x9590, 0xcede, 0xa070, 0x36b4, 0x7f6f},
1282 {0xfc2f, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1283 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1284 {0xfdc8, 0xe8d5, 0xbe15, 0x9f86, 0xa5fe, 0xf18e, 0xa7ff, 0xd291,
1285 0xf4c2, 0x9c87, 0xf150, 0x073e, 0x69b8, 0xf7c4, 0xee4b, 0xc7e6}},
1286 /* Test case with the field size as modulus, needing 935 divsteps with
1287 broken eta handling. */
1288 {{0x1b37, 0xbdc3, 0x8bcd, 0x25e3, 0x1eae, 0x567d, 0x30b6, 0xf0d8,
1289 0x9277, 0x0cf8, 0x9c2e, 0xecd7, 0x631d, 0xe38f, 0xd4f8, 0x5c93},
1290 {0xfc2f, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1291 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1292 {0x1622, 0xe05b, 0xe880, 0x7de9, 0x3e45, 0xb682, 0xee6c, 0x67ed,
1293 0xa179, 0x15db, 0x6b0d, 0xa656, 0x7ccb, 0x8ef7, 0xa2ff, 0xe279}},
1294 /* Test case with the field size as modulus, input = 0. */
1295 {{0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1296 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
1297 {0xfc2f, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1298 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1299 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1300 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
1301 /* Test case with the field size as modulus, input = 1. */
1302 {{0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1303 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
1304 {0xfc2f, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1305 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1306 {0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1307 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
1308 /* Test case with the field size as modulus, input = 2. */
1309 {{0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1310 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
1311 {0xfc2f, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1312 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1313 {0xfe18, 0x7fff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1314 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x7fff}},
1315 /* Test case with the field size as modulus, input = field - 1. */
1316 {{0xfc2e, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1317 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1318 {0xfc2f, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1319 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1320 {0xfc2e, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1321 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}},
1322
1323 /* Selected from a large number of random inputs to reach small/large
1324 * d/e values in various configurations. */
1325 {{0x3a08, 0x23e1, 0x4d8c, 0xe606, 0x3263, 0x67af, 0x9bf1, 0x9d70,
1326 0xf5fd, 0x12e4, 0x03c8, 0xb9ca, 0xe847, 0x8c5d, 0x6322, 0xbd30},
1327 {0x8359, 0x59dd, 0x1831, 0x7c1a, 0x1e83, 0xaee1, 0x770d, 0xcea8,
1328 0xfbb1, 0xeed6, 0x10b5, 0xe2c6, 0x36ea, 0xee17, 0xe32c, 0xffff},
1329 {0x1727, 0x0f36, 0x6f85, 0x5d0c, 0xca6c, 0x3072, 0x9628, 0x5842,
1330 0xcb44, 0x7c2b, 0xca4f, 0x62e5, 0x29b1, 0x6ffd, 0x9055, 0xc196}},
1331 {{0x905d, 0x41c8, 0xa2ff, 0x295b, 0x72bb, 0x4679, 0x6d01, 0x2c98,
1332 0xb3e0, 0xc537, 0xa310, 0xe07e, 0xe72f, 0x4999, 0x1148, 0xf65e},
1333 {0x5b41, 0x4239, 0x3c37, 0x5130, 0x30e3, 0xff35, 0xc51f, 0x1a43,
1334 0xdb23, 0x13cf, 0x9f49, 0xf70c, 0x5e70, 0xd411, 0x3005, 0xf8c6},
1335 {0xc30e, 0x68f0, 0x201a, 0xe10c, 0x864a, 0x6243, 0xe946, 0x43ae,
1336 0xf3f1, 0x52dc, 0x1f7f, 0x50d4, 0x2797, 0x064c, 0x5ca4, 0x90e3}},
1337 {{0xf1b5, 0xc6e5, 0xd2c4, 0xff95, 0x27c5, 0x0c92, 0x5d19, 0x7ae5,
1338 0x4fbe, 0x5438, 0x99e1, 0x880d, 0xd892, 0xa05c, 0x6ffd, 0x7eac},
1339 {0x2153, 0xcc9d, 0xfc6c, 0x8358, 0x49a1, 0x01e2, 0xcef0, 0x4969,
1340 0xd69a, 0x8cef, 0xf5b2, 0xfd95, 0xdcc2, 0x71f4, 0x6ae2, 0xceeb},
1341 {0x9b2e, 0xcdc6, 0x0a5c, 0x7317, 0x9084, 0xe228, 0x56cf, 0xd512,
1342 0x628a, 0xce21, 0x3473, 0x4e13, 0x8823, 0x1ed0, 0x34d0, 0xbfa3}},
1343 {{0x5bae, 0x53e5, 0x5f4d, 0x21ca, 0xb875, 0x8ecf, 0x9aa6, 0xbe3c,
1344 0x9f96, 0x7b82, 0x375d, 0x4d3e, 0x491c, 0xb1eb, 0x04c9, 0xb6c8},
1345 {0xfcfd, 0x10b7, 0x73b2, 0xd23b, 0xa357, 0x67da, 0x0d9f, 0x8702,
1346 0xa037, 0xff8e, 0x0e8b, 0x1801, 0x2c5c, 0x4e6e, 0x4558, 0xfff2},
1347 {0xc50f, 0x5654, 0x6713, 0x5ef5, 0xa7ce, 0xa647, 0xc832, 0x69ce,
1348 0x1d5c, 0x4310, 0x0746, 0x5a01, 0x96ea, 0xde4b, 0xa88b, 0x5543}},
1349 {{0xdc7f, 0x5e8c, 0x89d1, 0xb077, 0xd521, 0xcf90, 0x32fa, 0x5737,
1350 0x839e, 0x1464, 0x007c, 0x09c6, 0x9371, 0xe8ea, 0xc1cb, 0x75c4},
1351 {0xe3a3, 0x107f, 0xa82a, 0xa375, 0x4578, 0x60f4, 0x75c9, 0x5ee4,
1352 0x3fd7, 0x2736, 0x2871, 0xd3d2, 0x5f1d, 0x1abb, 0xa764, 0xffff},
1353 {0x45c6, 0x1f2e, 0xb14c, 0x84d7, 0x7bb7, 0x5a04, 0x0504, 0x3f33,
1354 0x5cc1, 0xb07a, 0x6a6c, 0x786f, 0x647f, 0xe1d7, 0x78a2, 0x4cf4}},
1355 {{0xc006, 0x356f, 0x8cd2, 0x967b, 0xb49e, 0x2d4e, 0x14bf, 0x4bcb,
1356 0xddab, 0xd3f9, 0xa068, 0x2c1c, 0xd242, 0xa56d, 0xf2c7, 0x5f97},
1357 {0x465b, 0xb745, 0x0e0d, 0x69a9, 0x987d, 0xcb37, 0xf637, 0xb311,
1358 0xc4d6, 0x2ddb, 0xf68f, 0x2af9, 0x959d, 0x3f53, 0x98f2, 0xf640},
1359 {0xc0f2, 0x6bfb, 0xf5c3, 0x91c1, 0x6b05, 0x0825, 0x5ca0, 0x7df7,
1360 0x9d55, 0x6d9e, 0xfe94, 0x2ad9, 0xd9f0, 0xe68b, 0xa72b, 0xd1b2}},
1361 {{0x2279, 0x61ba, 0x5bc6, 0x136b, 0xf544, 0x717c, 0xafda, 0x02bd,
1362 0x79af, 0x1fad, 0xea09, 0x81bb, 0x932b, 0x32c9, 0xdf1d, 0xe576},
1363 {0x8215, 0x7817, 0xca82, 0x43b0, 0x9b06, 0xea65, 0x1291, 0x0621,
1364 0x0089, 0x46fe, 0xc5a6, 0xddd7, 0x8065, 0xc6a0, 0x214b, 0xfc64},
1365 {0x04bf, 0x6f2a, 0x86b2, 0x841a, 0x4a95, 0xc632, 0x97b7, 0x5821,
1366 0x2b18, 0x1bb0, 0x3e97, 0x935e, 0xcc7d, 0x066b, 0xd513, 0xc251}},
1367 {{0x76e8, 0x5bc2, 0x3eaa, 0x04fc, 0x9974, 0x92c1, 0x7c15, 0xfa89,
1368 0x1151, 0x36ee, 0x48b2, 0x049c, 0x5f16, 0xcee4, 0x925b, 0xe98e},
1369 {0x913f, 0x0a2d, 0xa185, 0x9fea, 0xda5a, 0x4025, 0x40d7, 0x7cfa,
1370 0x88ca, 0xbbe8, 0xb265, 0xb7e4, 0x6cb1, 0xed64, 0xc6f9, 0xffb5},
1371 {0x6ab1, 0x1a86, 0x5009, 0x152b, 0x1cc4, 0xe2c8, 0x960b, 0x19d0,
1372 0x3554, 0xc562, 0xd013, 0xcf91, 0x10e1, 0x7933, 0xe195, 0xcf49}},
1373 {{0x9cb5, 0xd2d7, 0xc6ed, 0xa818, 0xb495, 0x06ee, 0x0f4a, 0x06e3,
1374 0x4c5a, 0x80ce, 0xd49a, 0x4cd7, 0x7487, 0x92af, 0xe516, 0x676c},
1375 {0xd6e9, 0x6b85, 0x619a, 0xb52c, 0x20a0, 0x2f79, 0x3545, 0x1edd,
1376 0x5a6f, 0x8082, 0x9b80, 0xf8f8, 0xc78a, 0xd0a3, 0xadf4, 0xffff},
1377 {0x01c2, 0x2118, 0xef5e, 0xa877, 0x046a, 0xd2c2, 0x2ad5, 0x951c,
1378 0x8900, 0xa5c9, 0x8d0f, 0x6b61, 0x55d3, 0xd572, 0x48de, 0x9219}},
1379 {{0x5114, 0x0644, 0x23dd, 0x01d3, 0xc101, 0xa659, 0xea17, 0x640f,
1380 0xf767, 0x2644, 0x9cec, 0xd8ba, 0xd6da, 0x9156, 0x8aeb, 0x875a},
1381 {0xc1bf, 0xdae9, 0xe96b, 0xce77, 0xf7a1, 0x3e99, 0x5c2e, 0x973b,
1382 0xd048, 0x5bd0, 0x4e8a, 0xcb85, 0xce39, 0x37f5, 0x815d, 0xffff},
1383 {0x48cc, 0x35b6, 0x26d4, 0x2ea6, 0x50d6, 0xa2f9, 0x64b6, 0x03bf,
1384 0xd00c, 0xe057, 0x3343, 0xfb79, 0x3ce5, 0xf717, 0xc5af, 0xe185}},
1385 {{0x13ff, 0x6c76, 0x2077, 0x16e0, 0xd5ca, 0xf2ad, 0x8dba, 0x8f49,
1386 0x7887, 0x16f9, 0xb646, 0xfc87, 0xfa31, 0x5096, 0xf08c, 0x3fbe},
1387 {0x8139, 0x6fd7, 0xf6df, 0xa7bf, 0x6699, 0x5361, 0x6f65, 0x13c8,
1388 0xf4d1, 0xe28f, 0xc545, 0x0a8c, 0x5274, 0xb0a6, 0xffff, 0xffff},
1389 {0x22ca, 0x0cd6, 0xc1b5, 0xb064, 0x44a7, 0x297b, 0x495f, 0x34ac,
1390 0xfa95, 0xec62, 0xf08d, 0x621c, 0x66a6, 0xba94, 0x84c6, 0x8ee0}},
1391 {{0xaa30, 0x312e, 0x439c, 0x4e88, 0x2e2f, 0x32dc, 0xb880, 0xa28e,
1392 0xf795, 0xc910, 0xb406, 0x8dd7, 0xb187, 0xa5a5, 0x38f1, 0xe49e},
1393 {0xfb19, 0xf64a, 0xba6a, 0x8ec2, 0x7255, 0xce89, 0x2cf9, 0x9cba,
1394 0xe1fe, 0x50da, 0x1705, 0xac52, 0xe3d4, 0x4269, 0x0648, 0xfd77},
1395 {0xb4c8, 0x6e8a, 0x2b5f, 0x4c2d, 0x5a67, 0xa7bb, 0x7d6d, 0x5569,
1396 0xa0ea, 0x244a, 0xc0f2, 0xf73d, 0x58cf, 0xac7f, 0xd32b, 0x3018}},
1397 {{0xc953, 0x1ae1, 0xae46, 0x8709, 0x19c2, 0xa986, 0x9abe, 0x1611,
1398 0x0395, 0xd5ab, 0xf0f6, 0xb5b0, 0x5b2b, 0x0317, 0x80ba, 0x376d},
1399 {0xfe77, 0xbc03, 0xac2f, 0x9d00, 0xa175, 0x293d, 0x3b56, 0x0e3a,
1400 0x0a9c, 0xf40c, 0x690e, 0x1508, 0x95d4, 0xddc4, 0xe805, 0xffff},
1401 {0xb1ce, 0x0929, 0xa5fe, 0x4b50, 0x9d5d, 0x8187, 0x2557, 0x4376,
1402 0x11ba, 0xdcef, 0xc1f3, 0xd531, 0x1824, 0x93f6, 0xd81f, 0x8f83}},
1403 {{0xb8d2, 0xb900, 0x4a0c, 0x7188, 0xa5bf, 0x1b0b, 0x2ae5, 0xa35b,
1404 0x98e0, 0x610c, 0x86db, 0x2487, 0xa267, 0x002c, 0xebb6, 0xc5f4},
1405 {0x9cdd, 0x1c1b, 0x2f06, 0x43d1, 0xce47, 0xc334, 0x6e60, 0xc016,
1406 0x989e, 0x0ab2, 0x0cac, 0x1196, 0xe2d9, 0x2e04, 0xc62b, 0xffff},
1407 {0xdc36, 0x1f05, 0x6aa9, 0x7a20, 0x944f, 0x2fd3, 0xa553, 0xdb4f,
1408 0xbd5c, 0x3a75, 0x25d4, 0xe20e, 0xa387, 0x1410, 0xdbb1, 0x1b60}},
1409 {{0x76b3, 0x2207, 0x4930, 0x5dd7, 0x65a0, 0xd55c, 0xb443, 0x53b7,
1410 0x5c22, 0x818a, 0xb2e7, 0x9de8, 0x9985, 0xed45, 0x33b1, 0x53e8},
1411 {0x7913, 0x44e1, 0xf15b, 0x5edd, 0x34f3, 0x4eba, 0x0758, 0x7104,
1412 0x32d9, 0x28f3, 0x4401, 0x85c5, 0xb695, 0xb899, 0xc0f2, 0xffff},
1413 {0x7f43, 0xd202, 0x24c9, 0x69f3, 0x74dc, 0x1a69, 0xeaee, 0x5405,
1414 0x1755, 0x4bb8, 0x04e3, 0x2fd2, 0xada8, 0x39eb, 0x5b4d, 0x96ca}},
1415 {{0x807b, 0x7112, 0xc088, 0xdafd, 0x02fa, 0x9d95, 0x5e42, 0xc033,
1416 0xde0a, 0xeecf, 0x8e90, 0x8da1, 0xb17e, 0x9a5b, 0x4c6d, 0x1914},
1417 {0x4871, 0xd1cb, 0x47d7, 0x327f, 0x09ec, 0x97bb, 0x2fae, 0xd346,
1418 0x6b78, 0x3707, 0xfeb2, 0xa6ab, 0x13df, 0x76b0, 0x8fb9, 0xffb3},
1419 {0x179e, 0xb63b, 0x4784, 0x231e, 0x9f42, 0x7f1a, 0xa3fb, 0xdd8c,
1420 0xd1eb, 0xb4c9, 0x8ca7, 0x018c, 0xf691, 0x576c, 0xa7d6, 0xce27}},
1421 {{0x5f45, 0x7c64, 0x083d, 0xedd5, 0x08a0, 0x0c64, 0x6c6f, 0xec3c,
1422 0xe2fb, 0x352c, 0x9303, 0x75e4, 0xb4e0, 0x8b09, 0xaca4, 0x7025},
1423 {0x1025, 0xb482, 0xfed5, 0xa678, 0x8966, 0x9359, 0x5329, 0x98bb,
1424 0x85b2, 0x73ba, 0x9982, 0x6fdc, 0xf190, 0xbe8c, 0xdc5c, 0xfd93},
1425 {0x83a2, 0x87a4, 0xa680, 0x52a1, 0x1ba1, 0x8848, 0x5db7, 0x9744,
1426 0x409c, 0x0745, 0x0e1e, 0x1cfc, 0x00cd, 0xf573, 0x2071, 0xccaa}},
1427 {{0xf61f, 0x63d4, 0x536c, 0x9eb9, 0x5ddd, 0xbb11, 0x9014, 0xe904,
1428 0xfe01, 0x6b45, 0x1858, 0xcb5b, 0x4c38, 0x43e1, 0x381d, 0x7f94},
1429 {0xf61f, 0x63d4, 0xd810, 0x7ca3, 0x8a04, 0x4b83, 0x11fc, 0xdf94,
1430 0x4169, 0xbd05, 0x608e, 0x7151, 0x4fbf, 0xb31a, 0x38a7, 0xa29b},
1431 {0xe621, 0xdfa5, 0x3d06, 0x1d03, 0x81e6, 0x00da, 0x53a6, 0x965e,
1432 0x93e5, 0x2164, 0x5b61, 0x59b8, 0xa629, 0x8d73, 0x699a, 0x6111}},
1433 {{0x4cc3, 0xd29e, 0xf4a3, 0x3428, 0x2048, 0xeec9, 0x5f50, 0x99a4,
1434 0x6de9, 0x05f2, 0x5aa9, 0x5fd2, 0x98b4, 0x1adc, 0x225f, 0x777f},
1435 {0xe649, 0x37da, 0x5ba6, 0x5765, 0x3f4a, 0x8a1c, 0x2e79, 0xf550,
1436 0x1a54, 0xcd1e, 0x7218, 0x3c3c, 0x6311, 0xfe28, 0x95fb, 0xed97},
1437 {0xe9b6, 0x0c47, 0x3f0e, 0x849b, 0x11f8, 0xe599, 0x5e4d, 0xd618,
1438 0xa06d, 0x33a0, 0x9a3e, 0x44db, 0xded8, 0x10f0, 0x94d2, 0x81fb}},
1439 {{0x2e59, 0x7025, 0xd413, 0x455a, 0x1ce3, 0xbd45, 0x7263, 0x27f7,
1440 0x23e3, 0x518e, 0xbe06, 0xc8c4, 0xe332, 0x4276, 0x68b4, 0xb166},
1441 {0x596f, 0x0cf6, 0xc8ec, 0x787b, 0x04c1, 0x473c, 0xd2b8, 0x8d54,
1442 0x9cdf, 0x77f2, 0xd3f3, 0x6735, 0x0638, 0xf80e, 0x9467, 0xc6aa},
1443 {0xc7e7, 0x1822, 0xb62a, 0xec0d, 0x89cd, 0x7846, 0xbfa2, 0x35d5,
1444 0xfa38, 0x870f, 0x494b, 0x1697, 0x8b17, 0xf904, 0x10b6, 0x9822}},
1445 {{0x6d5b, 0x1d4f, 0x0aaf, 0x807b, 0x35fb, 0x7ee8, 0x00c6, 0x059a,
1446 0xddf0, 0x1fb1, 0xc38a, 0xd78e, 0x2aa4, 0x79e7, 0xad28, 0xc3f1},
1447 {0xe3bb, 0x174e, 0xe0a8, 0x74b6, 0xbd5b, 0x35f6, 0x6d23, 0x6328,
1448 0xc11f, 0x83e1, 0xf928, 0xa918, 0x838e, 0xbf43, 0xe243, 0xfffb},
1449 {0x9cf2, 0x6b8b, 0x3476, 0x9d06, 0xdcf2, 0xdb8a, 0x89cd, 0x4857,
1450 0x75c2, 0xabb8, 0x490b, 0xc9bd, 0x890e, 0xe36e, 0xd552, 0xfffa}},
1451 {{0x2f09, 0x9d62, 0xa9fc, 0xf090, 0xd6d1, 0x9d1d, 0x1828, 0xe413,
1452 0xc92b, 0x3d5a, 0x1373, 0x368c, 0xbaf2, 0x2158, 0x71eb, 0x08a3},
1453 {0x2f09, 0x1d62, 0x4630, 0x0de1, 0x06dc, 0xf7f1, 0xc161, 0x1e92,
1454 0x7495, 0x97e4, 0x94b6, 0xa39e, 0x4f1b, 0x18f8, 0x7bd4, 0x0c4c},
1455 {0xeb3d, 0x723d, 0x0907, 0x525b, 0x463a, 0x49a8, 0xc6b8, 0xce7f,
1456 0x740c, 0x0d7d, 0xa83b, 0x457f, 0xae8e, 0xc6af, 0xd331, 0x0475}},
1457 {{0x6abd, 0xc7af, 0x3e4e, 0x95fd, 0x8fc4, 0xee25, 0x1f9c, 0x0afe,
1458 0x291d, 0xcde0, 0x48f4, 0xb2e8, 0xf7af, 0x8f8d, 0x0bd6, 0x078d},
1459 {0x4037, 0xbf0e, 0x2081, 0xf363, 0x13b2, 0x381e, 0xfb6e, 0x818e,
1460 0x27e4, 0x5662, 0x18b0, 0x0cd2, 0x81f5, 0x9415, 0x0d6c, 0xf9fb},
1461 {0xd205, 0x0981, 0x0498, 0x1f08, 0xdb93, 0x1732, 0x0579, 0x1424,
1462 0xad95, 0x642f, 0x050c, 0x1d6d, 0xfc95, 0xfc4a, 0xd41b, 0x3521}},
1463 {{0xf23a, 0x4633, 0xaef4, 0x1a92, 0x3c8b, 0x1f09, 0x30f3, 0x4c56,
1464 0x2a2f, 0x4f62, 0xf5e4, 0x8329, 0x63cc, 0xb593, 0xec6a, 0xc428},
1465 {0x93a7, 0xfcf6, 0x606d, 0xd4b2, 0x2aad, 0x28b4, 0xc65b, 0x8998,
1466 0x4e08, 0xd178, 0x0900, 0xc82b, 0x7470, 0xa342, 0x7c0f, 0xffff},
1467 {0x315f, 0xf304, 0xeb7b, 0xe5c3, 0x1451, 0x6311, 0x8f37, 0x93a8,
1468 0x4a38, 0xa6c6, 0xe393, 0x1087, 0x6301, 0xd673, 0x4ec4, 0xffff}},
1469 {{0x892e, 0xeed0, 0x1165, 0xcbc1, 0x5545, 0xa280, 0x7243, 0x10c9,
1470 0x9536, 0x36af, 0xb3fc, 0x2d7c, 0xe8a5, 0x09d6, 0xe1d4, 0xe85d},
1471 {0xae09, 0xc28a, 0xd777, 0xbd80, 0x23d6, 0xf980, 0xeb7c, 0x4e0e,
1472 0xf7dc, 0x6475, 0xf10a, 0x2d33, 0x5dfd, 0x797a, 0x7f1c, 0xf71a},
1473 {0x4064, 0x8717, 0xd091, 0x80b0, 0x4527, 0x8442, 0xac8b, 0x9614,
1474 0xc633, 0x35f5, 0x7714, 0x2e83, 0x4aaa, 0xd2e4, 0x1acd, 0x0562}},
1475 {{0xdb64, 0x0937, 0x308b, 0x53b0, 0x00e8, 0xc77f, 0x2f30, 0x37f7,
1476 0x79ce, 0xeb7f, 0xde81, 0x9286, 0xafda, 0x0e62, 0xae00, 0x0067},
1477 {0x2cc7, 0xd362, 0xb161, 0x0557, 0x4ff2, 0xb9c8, 0x06fe, 0x5f2b,
1478 0xde33, 0x0190, 0x28c6, 0xb886, 0xee2b, 0x5a4e, 0x3289, 0x0185},
1479 {0x4215, 0x923e, 0xf34f, 0xb362, 0x88f8, 0xceec, 0xafdd, 0x7f42,
1480 0x0c57, 0x56b2, 0xa366, 0x6a08, 0x0826, 0xfb8f, 0x1b03, 0x0163}},
1481 {{0xa4ba, 0x8408, 0x810a, 0xdeba, 0x47a3, 0x853a, 0xeb64, 0x2f74,
1482 0x3039, 0x038c, 0x7fbb, 0x498e, 0xd1e9, 0x46fb, 0x5691, 0x32a4},
1483 {0xd749, 0xb49d, 0x20b7, 0x2af6, 0xd34a, 0xd2da, 0x0a10, 0xf781,
1484 0x58c9, 0x171f, 0x3cb6, 0x6337, 0x88cd, 0xcf1e, 0xb246, 0x7351},
1485 {0xf729, 0xcf0a, 0x96ea, 0x032c, 0x4a8f, 0x42fe, 0xbac8, 0xec65,
1486 0x1510, 0x0d75, 0x4c17, 0x8d29, 0xa03f, 0x8b7e, 0x2c49, 0x0000}},
1487 {{0x0fa4, 0x8e1c, 0x3788, 0xba3c, 0x8d52, 0xd89d, 0x12c8, 0xeced,
1488 0x9fe6, 0x9b88, 0xecf3, 0xe3c8, 0xac48, 0x76ed, 0xf23e, 0xda79},
1489 {0x1103, 0x227c, 0x5b00, 0x3fcf, 0xc5d0, 0x2d28, 0x8020, 0x4d1c,
1490 0xc6b9, 0x67f9, 0x6f39, 0x989a, 0xda53, 0x3847, 0xd416, 0xe0d0},
1491 {0xdd8e, 0xcf31, 0x3710, 0x7e44, 0xa511, 0x933c, 0x0cc3, 0x5145,
1492 0xf632, 0x5e1d, 0x038f, 0x5ce7, 0x7265, 0xda9d, 0xded6, 0x08f8}},
1493 {{0xe2c8, 0x91d5, 0xa5f5, 0x735f, 0x6b58, 0x56dc, 0xb39d, 0x5c4a,
1494 0x57d0, 0xa1c2, 0xd92f, 0x9ad4, 0xf7c4, 0x51dd, 0xaf5c, 0x0096},
1495 {0x1739, 0x7207, 0x7505, 0xbf35, 0x42de, 0x0a29, 0xa962, 0xdedf,
1496 0x53e8, 0x12bf, 0xcde7, 0xd8e2, 0x8d4d, 0x2c4b, 0xb1b1, 0x0628},
1497 {0x992d, 0xe3a7, 0xb422, 0xc198, 0x23ab, 0xa6ef, 0xb45d, 0x50da,
1498 0xa738, 0x014a, 0x2310, 0x85fb, 0x5fe8, 0x1b18, 0x1774, 0x03a7}},
1499 {{0x1f16, 0x2b09, 0x0236, 0xee90, 0xccf9, 0x9775, 0x8130, 0x4c91,
1500 0x9091, 0x310b, 0x6dc4, 0x86f6, 0xc2e8, 0xef60, 0xfc0e, 0xf3a4},
1501 {0x9f49, 0xac15, 0x02af, 0x110f, 0xc59d, 0x5677, 0xa1a9, 0x38d5,
1502 0x914f, 0xa909, 0x3a3a, 0x4a39, 0x3703, 0xea30, 0x73da, 0xffad},
1503 {0x15ed, 0xdd16, 0x83c7, 0x270a, 0x862f, 0xd8ad, 0xcaa1, 0x5f41,
1504 0x99a9, 0x3fc8, 0x7bb2, 0x360a, 0xb06d, 0xfadc, 0x1b36, 0xffa8}},
1505 {{0xc4e0, 0xb8fd, 0x5106, 0xe169, 0x754c, 0xa58c, 0xc413, 0x8224,
1506 0x5483, 0x63ec, 0xd477, 0x8473, 0x4778, 0x9281, 0x0000, 0x0000},
1507 {0x85e1, 0xff54, 0xb200, 0xe413, 0xf4f4, 0x4c0f, 0xfcec, 0xc183,
1508 0x60d3, 0x1b0c, 0x3834, 0x601c, 0x943c, 0xbe6e, 0x0002, 0x0000},
1509 {0xf4f8, 0xfd5e, 0x61ef, 0xece8, 0x9199, 0xe5c4, 0x05a6, 0xe6c3,
1510 0xc4ae, 0x8b28, 0x66b1, 0x8a95, 0x9ece, 0x8f4a, 0x0001, 0x0000}},
1511 {{0xeae9, 0xa1b4, 0xc6d8, 0x2411, 0x2b5a, 0x1dd0, 0x2dc9, 0xb57b,
1512 0x5ccd, 0x4957, 0xaf59, 0xa04b, 0x5f42, 0xab7c, 0x2826, 0x526f},
1513 {0xf407, 0x165a, 0xb724, 0x2f12, 0x2ea1, 0x470b, 0x4464, 0xbd35,
1514 0x606f, 0xd73e, 0x50d3, 0x8a7f, 0x8029, 0x7ffc, 0xbe31, 0x6cfb},
1515 {0x8171, 0x1f4c, 0xced2, 0x9c99, 0x6d7e, 0x5a0f, 0xfefb, 0x59e3,
1516 0xa0c8, 0xabd9, 0xc4c5, 0x57d3, 0xbfa3, 0x4f11, 0x96a2, 0x5a7d}},
1517 {{0xe068, 0x4cc0, 0x8bcd, 0xc903, 0x9e52, 0xb3e1, 0xd745, 0x0995,
1518 0xdd8f, 0xf14b, 0xd2ac, 0xd65a, 0xda1d, 0xa742, 0xbac5, 0x474c},
1519 {0x7481, 0xf2ad, 0x9757, 0x2d82, 0xb683, 0xb16b, 0x0002, 0x7b60,
1520 0x8f0c, 0x2594, 0x8f64, 0x3b7a, 0x3552, 0x8d9d, 0xb9d7, 0x67eb},
1521 {0xcaab, 0xb9a1, 0xf966, 0xe311, 0x5b34, 0x0fa0, 0x6abc, 0x8134,
1522 0xab3d, 0x90f6, 0x1984, 0x9232, 0xec17, 0x74e5, 0x2ceb, 0x434e}},
1523 {{0x0fb1, 0x7a55, 0x1a5c, 0x53eb, 0xd7b3, 0x7a01, 0xca32, 0x31f6,
1524 0x3b74, 0x679e, 0x1501, 0x6c57, 0xdb20, 0x8b7c, 0xd7d0, 0x8097},
1525 {0xb127, 0xb20c, 0xe3a2, 0x96f3, 0xe0d8, 0xd50c, 0x14b4, 0x0b40,
1526 0x6eeb, 0xa258, 0x99db, 0x3c8c, 0x0f51, 0x4198, 0x3887, 0xffd0},
1527 {0x0273, 0x9f8c, 0x9669, 0xbbba, 0x1c49, 0x767c, 0xc2af, 0x59f0,
1528 0x1366, 0xd397, 0x63ac, 0x6fe8, 0x1a9a, 0x1259, 0x01d0, 0x0016}},
1529 {{0x7876, 0x2a35, 0xa24a, 0x433e, 0x5501, 0x573c, 0xd76d, 0xcb82,
1530 0x1334, 0xb4a6, 0xf290, 0xc797, 0xeae9, 0x2b83, 0x1e2b, 0x8b14},
1531 {0x3885, 0x8aef, 0x9dea, 0x2b8c, 0xdd7c, 0xd7cd, 0xb0cc, 0x05ee,
1532 0x361b, 0x3800, 0xb0d4, 0x4c23, 0xbd3f, 0x5180, 0x9783, 0xff80},
1533 {0xab36, 0x3104, 0xdae8, 0x0704, 0x4a28, 0x6714, 0x824b, 0x0051,
1534 0x8134, 0x1f6a, 0x712d, 0x1f03, 0x03b2, 0xecac, 0x377d, 0xfef9}}
1535 };
1536
1537 int i, j, ok;
1538
1539 /* Test known inputs/outputs */
1540 for (i = 0; (size_t)i < sizeof(CASES) / sizeof(CASES[0]); ++i) {
1541 uint16_t out[16];
1542 test_modinv32_uint16(out, CASES[i][0], CASES[i][1]);
1543 for (j = 0; j < 16; ++j) CHECK(out[j] == CASES[i][2][j]);
1544#ifdef SECP256K1_WIDEMUL_INT128
1545 test_modinv64_uint16(out, CASES[i][0], CASES[i][1]);
1546 for (j = 0; j < 16; ++j) CHECK(out[j] == CASES[i][2][j]);
1547#endif
1548 }
1549
1550 for (i = 0; i < 100 * count; ++i) {
1551 /* 256-bit numbers in 16-uint16_t's notation */
1552 static const uint16_t ZERO[16] = {0};
1553 uint16_t xd[16]; /* the number (in range [0,2^256)) to be inverted */
1554 uint16_t md[16]; /* the modulus (odd, in range [3,2^256)) */
1555 uint16_t id[16]; /* the inverse of xd mod md */
1556
1557 /* generate random xd and md, so that md is odd, md>1, xd<md, and gcd(xd,md)=1 */
1558 do {
1559 /* generate random xd and md (with many subsequent 0s and 1s) */
1560 secp256k1_testrand256_test((unsigned char*)xd);
1561 secp256k1_testrand256_test((unsigned char*)md);
1562 md[0] |= 1; /* modulus must be odd */
1563 /* If modulus is 1, find another one. */
1564 ok = md[0] != 1;
1565 for (j = 1; j < 16; ++j) ok |= md[j] != 0;
1566 mulmod256(xd, xd, NULL, md); /* Make xd = xd mod md */
1567 } while (!(ok && coprime(xd, md)));
1568
1569 test_modinv32_uint16(id, xd, md);
1570#ifdef SECP256K1_WIDEMUL_INT128
1571 test_modinv64_uint16(id, xd, md);
1572#endif
1573
1574 /* In a few cases, also test with input=0 */
1575 if (i < count) {
1576 test_modinv32_uint16(id, ZERO, md);
1577#ifdef SECP256K1_WIDEMUL_INT128
1578 test_modinv64_uint16(id, ZERO, md);
1579#endif
1580 }
1581 }
1582}
1583
1584/***** SCALAR TESTS *****/
1585
1586
1587void scalar_test(void) {
1591 unsigned char c[32];
1592
1593 /* Set 's' to a random scalar, with value 'snum'. */
1595
1596 /* Set 's1' to a random scalar, with value 's1num'. */
1598
1599 /* Set 's2' to a random scalar, with value 'snum2', and byte array representation 'c'. */
1602
1603 {
1604 int i;
1605 /* Test that fetching groups of 4 bits from a scalar and recursing n(i)=16*n(i-1)+p(i) reconstructs it. */
1608 for (i = 0; i < 256; i += 4) {
1610 int j;
1611 secp256k1_scalar_set_int(&t, secp256k1_scalar_get_bits(&s, 256 - 4 - i, 4));
1612 for (j = 0; j < 4; j++) {
1613 secp256k1_scalar_add(&n, &n, &n);
1614 }
1615 secp256k1_scalar_add(&n, &n, &t);
1616 }
1617 CHECK(secp256k1_scalar_eq(&n, &s));
1618 }
1619
1620 {
1621 /* Test that fetching groups of randomly-sized bits from a scalar and recursing n(i)=b*n(i-1)+p(i) reconstructs it. */
1623 int i = 0;
1625 while (i < 256) {
1627 int j;
1628 int now = secp256k1_testrand_int(15) + 1;
1629 if (now + i > 256) {
1630 now = 256 - i;
1631 }
1632 secp256k1_scalar_set_int(&t, secp256k1_scalar_get_bits_var(&s, 256 - now - i, now));
1633 for (j = 0; j < now; j++) {
1634 secp256k1_scalar_add(&n, &n, &n);
1635 }
1636 secp256k1_scalar_add(&n, &n, &t);
1637 i += now;
1638 }
1639 CHECK(secp256k1_scalar_eq(&n, &s));
1640 }
1641
1642 {
1643 /* test secp256k1_scalar_shr_int */
1645 int i;
1647 for (i = 0; i < 100; ++i) {
1648 int low;
1649 int shift = 1 + secp256k1_testrand_int(15);
1650 int expected = r.d[0] % (1 << shift);
1651 low = secp256k1_scalar_shr_int(&r, shift);
1652 CHECK(expected == low);
1653 }
1654 }
1655
1656 {
1657 /* Test commutativity of add. */
1658 secp256k1_scalar r1, r2;
1659 secp256k1_scalar_add(&r1, &s1, &s2);
1660 secp256k1_scalar_add(&r2, &s2, &s1);
1661 CHECK(secp256k1_scalar_eq(&r1, &r2));
1662 }
1663
1664 {
1665 secp256k1_scalar r1, r2;
1667 int i;
1668 /* Test add_bit. */
1669 int bit = secp256k1_testrand_bits(8);
1672 for (i = 0; i < bit; i++) {
1673 secp256k1_scalar_add(&b, &b, &b);
1674 }
1675 r1 = s1;
1676 r2 = s1;
1677 if (!secp256k1_scalar_add(&r1, &r1, &b)) {
1678 /* No overflow happened. */
1679 secp256k1_scalar_cadd_bit(&r2, bit, 1);
1680 CHECK(secp256k1_scalar_eq(&r1, &r2));
1681 /* cadd is a noop when flag is zero */
1682 secp256k1_scalar_cadd_bit(&r2, bit, 0);
1683 CHECK(secp256k1_scalar_eq(&r1, &r2));
1684 }
1685 }
1686
1687 {
1688 /* Test commutativity of mul. */
1689 secp256k1_scalar r1, r2;
1690 secp256k1_scalar_mul(&r1, &s1, &s2);
1691 secp256k1_scalar_mul(&r2, &s2, &s1);
1692 CHECK(secp256k1_scalar_eq(&r1, &r2));
1693 }
1694
1695 {
1696 /* Test associativity of add. */
1697 secp256k1_scalar r1, r2;
1698 secp256k1_scalar_add(&r1, &s1, &s2);
1699 secp256k1_scalar_add(&r1, &r1, &s);
1700 secp256k1_scalar_add(&r2, &s2, &s);
1701 secp256k1_scalar_add(&r2, &s1, &r2);
1702 CHECK(secp256k1_scalar_eq(&r1, &r2));
1703 }
1704
1705 {
1706 /* Test associativity of mul. */
1707 secp256k1_scalar r1, r2;
1708 secp256k1_scalar_mul(&r1, &s1, &s2);
1709 secp256k1_scalar_mul(&r1, &r1, &s);
1710 secp256k1_scalar_mul(&r2, &s2, &s);
1711 secp256k1_scalar_mul(&r2, &s1, &r2);
1712 CHECK(secp256k1_scalar_eq(&r1, &r2));
1713 }
1714
1715 {
1716 /* Test distributitivity of mul over add. */
1717 secp256k1_scalar r1, r2, t;
1718 secp256k1_scalar_add(&r1, &s1, &s2);
1719 secp256k1_scalar_mul(&r1, &r1, &s);
1720 secp256k1_scalar_mul(&r2, &s1, &s);
1721 secp256k1_scalar_mul(&t, &s2, &s);
1722 secp256k1_scalar_add(&r2, &r2, &t);
1723 CHECK(secp256k1_scalar_eq(&r1, &r2));
1724 }
1725
1726 {
1727 /* Test multiplicative identity. */
1728 secp256k1_scalar r1, v1;
1730 secp256k1_scalar_mul(&r1, &s1, &v1);
1731 CHECK(secp256k1_scalar_eq(&r1, &s1));
1732 }
1733
1734 {
1735 /* Test additive identity. */
1736 secp256k1_scalar r1, v0;
1738 secp256k1_scalar_add(&r1, &s1, &v0);
1739 CHECK(secp256k1_scalar_eq(&r1, &s1));
1740 }
1741
1742 {
1743 /* Test zero product property. */
1744 secp256k1_scalar r1, v0;
1746 secp256k1_scalar_mul(&r1, &s1, &v0);
1747 CHECK(secp256k1_scalar_eq(&r1, &v0));
1748 }
1749
1750}
1751
1753 unsigned char b32[32];
1756
1757 /* Usually set_b32 and set_b32_seckey give the same result */
1759 secp256k1_scalar_set_b32(&s1, b32, NULL);
1760 CHECK(secp256k1_scalar_set_b32_seckey(&s2, b32) == 1);
1761 CHECK(secp256k1_scalar_eq(&s1, &s2) == 1);
1762
1763 memset(b32, 0, sizeof(b32));
1764 CHECK(secp256k1_scalar_set_b32_seckey(&s2, b32) == 0);
1765 memset(b32, 0xFF, sizeof(b32));
1766 CHECK(secp256k1_scalar_set_b32_seckey(&s2, b32) == 0);
1767}
1768
1770 int i;
1771 for (i = 0; i < 128 * count; i++) {
1772 scalar_test();
1773 }
1774 for (i = 0; i < count; i++) {
1776 }
1777
1778 {
1779 /* (-1)+1 should be zero. */
1780 secp256k1_scalar s, o;
1784 secp256k1_scalar_add(&o, &o, &s);
1788 }
1789
1790 {
1791 /* Does check_overflow check catch all ones? */
1792 static const secp256k1_scalar overflowed = SECP256K1_SCALAR_CONST(
1793 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
1794 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL
1795 );
1797 }
1798
1799 {
1800 /* Static test vectors.
1801 * These were reduced from ~10^12 random vectors based on comparison-decision
1802 * and edge-case coverage on 32-bit and 64-bit implementations.
1803 * The responses were generated with Sage 5.9.
1804 */
1809 secp256k1_scalar one;
1812 secp256k1_scalar zzv;
1813 int overflow;
1814 unsigned char chal[33][2][32] = {
1815 {{0xff, 0xff, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00,
1816 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03,
1817 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff,
1818 0xff, 0xff, 0x03, 0x00, 0xc0, 0xff, 0xff, 0xff},
1819 {0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00,
1820 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8,
1821 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1822 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff}},
1823 {{0xef, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
1824 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00,
1825 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1826 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
1827 {0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
1828 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0,
1829 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff,
1830 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x80, 0xff}},
1831 {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
1832 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
1833 0x80, 0x00, 0x00, 0x80, 0xff, 0x3f, 0x00, 0x00,
1834 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x00},
1835 {0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x80,
1836 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xe0,
1837 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00,
1838 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff}},
1839 {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
1840 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
1841 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1842 0x00, 0x1e, 0xf8, 0xff, 0xff, 0xff, 0xfd, 0xff},
1843 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f,
1844 0x00, 0x00, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xe0,
1845 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff,
1846 0xf3, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}},
1847 {{0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00,
1848 0x00, 0x1c, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1849 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0x00,
1850 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff},
1851 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00,
1852 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1853 0xff, 0x1f, 0x00, 0x00, 0x80, 0xff, 0xff, 0x3f,
1854 0x00, 0xfe, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff}},
1855 {{0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xfc, 0x9f,
1856 0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x80,
1857 0xff, 0x0f, 0xfc, 0xff, 0x7f, 0x00, 0x00, 0x00,
1858 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},
1859 {0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1860 0x00, 0x00, 0xf8, 0xff, 0x0f, 0xc0, 0xff, 0xff,
1861 0xff, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff,
1862 0xff, 0xff, 0xff, 0x07, 0x80, 0xff, 0xff, 0xff}},
1863 {{0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00,
1864 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
1865 0xf7, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x00,
1866 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xf0},
1867 {0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff,
1868 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,
1869 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff,
1870 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
1871 {{0x00, 0xf8, 0xff, 0x03, 0xff, 0xff, 0xff, 0x00,
1872 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1873 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
1874 0xff, 0xff, 0x03, 0xc0, 0xff, 0x0f, 0xfc, 0xff},
1875 {0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff,
1876 0xff, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x00, 0xc0,
1877 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1878 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
1879 {{0x8f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1880 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff,
1881 0xff, 0x7f, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
1882 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},
1883 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1884 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1885 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1886 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
1887 {{0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff,
1888 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1889 0xff, 0xff, 0x03, 0x00, 0x80, 0x00, 0x00, 0x80,
1890 0xff, 0xff, 0xff, 0x00, 0x00, 0x80, 0xff, 0x7f},
1891 {0xff, 0xcf, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,
1892 0x00, 0xc0, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff,
1893 0xbf, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00,
1894 0x80, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00}},
1895 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff,
1896 0xff, 0xff, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff,
1897 0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x80,
1898 0xff, 0x01, 0xfc, 0xff, 0x01, 0x00, 0xfe, 0xff},
1899 {0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00,
1900 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1901 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
1902 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00}},
1903 {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
1904 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1905 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1906 0x7f, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80},
1907 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1908 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf0, 0xff, 0xff,
1909 0xe0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
1910 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
1911 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1912 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1913 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1914 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x00},
1915 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
1916 0xfc, 0xff, 0xff, 0x3f, 0xf0, 0xff, 0xff, 0x3f,
1917 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x00, 0xff,
1918 0xff, 0xff, 0xff, 0xff, 0x0f, 0x7e, 0x00, 0x00}},
1919 {{0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1920 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
1921 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1922 0xff, 0xff, 0x1f, 0x00, 0x00, 0xfe, 0x07, 0x00},
1923 {0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff,
1924 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1925 0xff, 0xfb, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00,
1926 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60}},
1927 {{0xff, 0x01, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00,
1928 0x80, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x03,
1929 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1930 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
1931 {0xff, 0xff, 0x1f, 0x00, 0xf0, 0xff, 0xff, 0xff,
1932 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1933 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1934 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00}},
1935 {{0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
1936 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1937 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1938 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
1939 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1940 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff,
1941 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03,
1942 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff}},
1943 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1944 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1945 0xc0, 0xff, 0xff, 0xcf, 0xff, 0x1f, 0x00, 0x00,
1946 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80},
1947 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1948 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
1949 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x7e,
1950 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
1951 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1952 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff,
1953 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
1954 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00},
1955 {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1956 0xff, 0xff, 0x7f, 0x00, 0x80, 0x00, 0x00, 0x00,
1957 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1958 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff}},
1959 {{0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x80,
1960 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1961 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1962 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},
1963 {0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1964 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x80,
1965 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
1966 0xff, 0x7f, 0xf8, 0xff, 0xff, 0x1f, 0x00, 0xfe}},
1967 {{0xff, 0xff, 0xff, 0x3f, 0xf8, 0xff, 0xff, 0xff,
1968 0xff, 0x03, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00,
1969 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1970 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07},
1971 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1972 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1973 0xff, 0xff, 0xff, 0xff, 0x01, 0x80, 0xff, 0xff,
1974 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}},
1975 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1976 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1977 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1978 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
1979 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1980 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
1981 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
1982 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40}},
1983 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1984 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1985 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1986 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
1987 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1988 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1989 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1990 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
1991 {{0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1992 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1993 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1994 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
1995 {0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1996 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1997 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1998 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
1999 {{0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xc0,
2000 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2001 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff,
2002 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f},
2003 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00,
2004 0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00,
2005 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff,
2006 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff}},
2007 {{0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2008 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2009 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2010 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
2011 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2012 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2013 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2014 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}},
2015 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2016 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
2017 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
2018 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40},
2019 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2020 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2021 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2022 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}},
2023 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2024 0x7e, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x07, 0x00,
2025 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
2026 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
2027 {0xff, 0x01, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
2028 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x80,
2029 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00,
2030 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
2031 {{0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x00,
2032 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
2033 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
2034 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff},
2035 {0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
2036 0xff, 0xff, 0x3f, 0x00, 0xf8, 0xff, 0xff, 0xff,
2037 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2038 0xff, 0x3f, 0x00, 0x00, 0xc0, 0xf1, 0x7f, 0x00}},
2039 {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
2040 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff,
2041 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
2042 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00},
2043 {0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
2044 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff,
2045 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f,
2046 0x00, 0x00, 0xfc, 0xff, 0xff, 0x01, 0xff, 0xff}},
2047 {{0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
2048 0x80, 0x00, 0x00, 0x80, 0xff, 0x03, 0xe0, 0x01,
2049 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfc, 0xff,
2050 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},
2051 {0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
2052 0xfe, 0xff, 0xff, 0xf0, 0x07, 0x00, 0x3c, 0x80,
2053 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff,
2054 0xff, 0xff, 0x07, 0xe0, 0xff, 0x00, 0x00, 0x00}},
2055 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
2056 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2057 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf8,
2058 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80},
2059 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2060 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x80, 0x00,
2061 0x00, 0x00, 0x00, 0xc0, 0x7f, 0xfe, 0xff, 0x1f,
2062 0x00, 0xfe, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff}},
2063 {{0xff, 0xff, 0x81, 0xff, 0xff, 0xff, 0xff, 0x00,
2064 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83,
2065 0xff, 0xff, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
2066 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xf0},
2067 {0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff,
2068 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00,
2069 0xf8, 0x07, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
2070 0xff, 0xc7, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff}},
2071 {{0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
2072 0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
2073 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x03, 0xfb,
2074 0xfa, 0x8a, 0x7d, 0xdf, 0x13, 0x86, 0xe2, 0x03},
2075 {0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
2076 0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
2077 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x03, 0xfb,
2078 0xfa, 0x8a, 0x7d, 0xdf, 0x13, 0x86, 0xe2, 0x03}}
2079 };
2080 unsigned char res[33][2][32] = {
2081 {{0x0c, 0x3b, 0x0a, 0xca, 0x8d, 0x1a, 0x2f, 0xb9,
2082 0x8a, 0x7b, 0x53, 0x5a, 0x1f, 0xc5, 0x22, 0xa1,
2083 0x07, 0x2a, 0x48, 0xea, 0x02, 0xeb, 0xb3, 0xd6,
2084 0x20, 0x1e, 0x86, 0xd0, 0x95, 0xf6, 0x92, 0x35},
2085 {0xdc, 0x90, 0x7a, 0x07, 0x2e, 0x1e, 0x44, 0x6d,
2086 0xf8, 0x15, 0x24, 0x5b, 0x5a, 0x96, 0x37, 0x9c,
2087 0x37, 0x7b, 0x0d, 0xac, 0x1b, 0x65, 0x58, 0x49,
2088 0x43, 0xb7, 0x31, 0xbb, 0xa7, 0xf4, 0x97, 0x15}},
2089 {{0xf1, 0xf7, 0x3a, 0x50, 0xe6, 0x10, 0xba, 0x22,
2090 0x43, 0x4d, 0x1f, 0x1f, 0x7c, 0x27, 0xca, 0x9c,
2091 0xb8, 0xb6, 0xa0, 0xfc, 0xd8, 0xc0, 0x05, 0x2f,
2092 0xf7, 0x08, 0xe1, 0x76, 0xdd, 0xd0, 0x80, 0xc8},
2093 {0xe3, 0x80, 0x80, 0xb8, 0xdb, 0xe3, 0xa9, 0x77,
2094 0x00, 0xb0, 0xf5, 0x2e, 0x27, 0xe2, 0x68, 0xc4,
2095 0x88, 0xe8, 0x04, 0xc1, 0x12, 0xbf, 0x78, 0x59,
2096 0xe6, 0xa9, 0x7c, 0xe1, 0x81, 0xdd, 0xb9, 0xd5}},
2097 {{0x96, 0xe2, 0xee, 0x01, 0xa6, 0x80, 0x31, 0xef,
2098 0x5c, 0xd0, 0x19, 0xb4, 0x7d, 0x5f, 0x79, 0xab,
2099 0xa1, 0x97, 0xd3, 0x7e, 0x33, 0xbb, 0x86, 0x55,
2100 0x60, 0x20, 0x10, 0x0d, 0x94, 0x2d, 0x11, 0x7c},
2101 {0xcc, 0xab, 0xe0, 0xe8, 0x98, 0x65, 0x12, 0x96,
2102 0x38, 0x5a, 0x1a, 0xf2, 0x85, 0x23, 0x59, 0x5f,
2103 0xf9, 0xf3, 0xc2, 0x81, 0x70, 0x92, 0x65, 0x12,
2104 0x9c, 0x65, 0x1e, 0x96, 0x00, 0xef, 0xe7, 0x63}},
2105 {{0xac, 0x1e, 0x62, 0xc2, 0x59, 0xfc, 0x4e, 0x5c,
2106 0x83, 0xb0, 0xd0, 0x6f, 0xce, 0x19, 0xf6, 0xbf,
2107 0xa4, 0xb0, 0xe0, 0x53, 0x66, 0x1f, 0xbf, 0xc9,
2108 0x33, 0x47, 0x37, 0xa9, 0x3d, 0x5d, 0xb0, 0x48},
2109 {0x86, 0xb9, 0x2a, 0x7f, 0x8e, 0xa8, 0x60, 0x42,
2110 0x26, 0x6d, 0x6e, 0x1c, 0xa2, 0xec, 0xe0, 0xe5,
2111 0x3e, 0x0a, 0x33, 0xbb, 0x61, 0x4c, 0x9f, 0x3c,
2112 0xd1, 0xdf, 0x49, 0x33, 0xcd, 0x72, 0x78, 0x18}},
2113 {{0xf7, 0xd3, 0xcd, 0x49, 0x5c, 0x13, 0x22, 0xfb,
2114 0x2e, 0xb2, 0x2f, 0x27, 0xf5, 0x8a, 0x5d, 0x74,
2115 0xc1, 0x58, 0xc5, 0xc2, 0x2d, 0x9f, 0x52, 0xc6,
2116 0x63, 0x9f, 0xba, 0x05, 0x76, 0x45, 0x7a, 0x63},
2117 {0x8a, 0xfa, 0x55, 0x4d, 0xdd, 0xa3, 0xb2, 0xc3,
2118 0x44, 0xfd, 0xec, 0x72, 0xde, 0xef, 0xc0, 0x99,
2119 0xf5, 0x9f, 0xe2, 0x52, 0xb4, 0x05, 0x32, 0x58,
2120 0x57, 0xc1, 0x8f, 0xea, 0xc3, 0x24, 0x5b, 0x94}},
2121 {{0x05, 0x83, 0xee, 0xdd, 0x64, 0xf0, 0x14, 0x3b,
2122 0xa0, 0x14, 0x4a, 0x3a, 0x41, 0x82, 0x7c, 0xa7,
2123 0x2c, 0xaa, 0xb1, 0x76, 0xbb, 0x59, 0x64, 0x5f,
2124 0x52, 0xad, 0x25, 0x29, 0x9d, 0x8f, 0x0b, 0xb0},
2125 {0x7e, 0xe3, 0x7c, 0xca, 0xcd, 0x4f, 0xb0, 0x6d,
2126 0x7a, 0xb2, 0x3e, 0xa0, 0x08, 0xb9, 0xa8, 0x2d,
2127 0xc2, 0xf4, 0x99, 0x66, 0xcc, 0xac, 0xd8, 0xb9,
2128 0x72, 0x2a, 0x4a, 0x3e, 0x0f, 0x7b, 0xbf, 0xf4}},
2129 {{0x8c, 0x9c, 0x78, 0x2b, 0x39, 0x61, 0x7e, 0xf7,
2130 0x65, 0x37, 0x66, 0x09, 0x38, 0xb9, 0x6f, 0x70,
2131 0x78, 0x87, 0xff, 0xcf, 0x93, 0xca, 0x85, 0x06,
2132 0x44, 0x84, 0xa7, 0xfe, 0xd3, 0xa4, 0xe3, 0x7e},
2133 {0xa2, 0x56, 0x49, 0x23, 0x54, 0xa5, 0x50, 0xe9,
2134 0x5f, 0xf0, 0x4d, 0xe7, 0xdc, 0x38, 0x32, 0x79,
2135 0x4f, 0x1c, 0xb7, 0xe4, 0xbb, 0xf8, 0xbb, 0x2e,
2136 0x40, 0x41, 0x4b, 0xcc, 0xe3, 0x1e, 0x16, 0x36}},
2137 {{0x0c, 0x1e, 0xd7, 0x09, 0x25, 0x40, 0x97, 0xcb,
2138 0x5c, 0x46, 0xa8, 0xda, 0xef, 0x25, 0xd5, 0xe5,
2139 0x92, 0x4d, 0xcf, 0xa3, 0xc4, 0x5d, 0x35, 0x4a,
2140 0xe4, 0x61, 0x92, 0xf3, 0xbf, 0x0e, 0xcd, 0xbe},
2141 {0xe4, 0xaf, 0x0a, 0xb3, 0x30, 0x8b, 0x9b, 0x48,
2142 0x49, 0x43, 0xc7, 0x64, 0x60, 0x4a, 0x2b, 0x9e,
2143 0x95, 0x5f, 0x56, 0xe8, 0x35, 0xdc, 0xeb, 0xdc,
2144 0xc7, 0xc4, 0xfe, 0x30, 0x40, 0xc7, 0xbf, 0xa4}},
2145 {{0xd4, 0xa0, 0xf5, 0x81, 0x49, 0x6b, 0xb6, 0x8b,
2146 0x0a, 0x69, 0xf9, 0xfe, 0xa8, 0x32, 0xe5, 0xe0,
2147 0xa5, 0xcd, 0x02, 0x53, 0xf9, 0x2c, 0xe3, 0x53,
2148 0x83, 0x36, 0xc6, 0x02, 0xb5, 0xeb, 0x64, 0xb8},
2149 {0x1d, 0x42, 0xb9, 0xf9, 0xe9, 0xe3, 0x93, 0x2c,
2150 0x4c, 0xee, 0x6c, 0x5a, 0x47, 0x9e, 0x62, 0x01,
2151 0x6b, 0x04, 0xfe, 0xa4, 0x30, 0x2b, 0x0d, 0x4f,
2152 0x71, 0x10, 0xd3, 0x55, 0xca, 0xf3, 0x5e, 0x80}},
2153 {{0x77, 0x05, 0xf6, 0x0c, 0x15, 0x9b, 0x45, 0xe7,
2154 0xb9, 0x11, 0xb8, 0xf5, 0xd6, 0xda, 0x73, 0x0c,
2155 0xda, 0x92, 0xea, 0xd0, 0x9d, 0xd0, 0x18, 0x92,
2156 0xce, 0x9a, 0xaa, 0xee, 0x0f, 0xef, 0xde, 0x30},
2157 {0xf1, 0xf1, 0xd6, 0x9b, 0x51, 0xd7, 0x77, 0x62,
2158 0x52, 0x10, 0xb8, 0x7a, 0x84, 0x9d, 0x15, 0x4e,
2159 0x07, 0xdc, 0x1e, 0x75, 0x0d, 0x0c, 0x3b, 0xdb,
2160 0x74, 0x58, 0x62, 0x02, 0x90, 0x54, 0x8b, 0x43}},
2161 {{0xa6, 0xfe, 0x0b, 0x87, 0x80, 0x43, 0x67, 0x25,
2162 0x57, 0x5d, 0xec, 0x40, 0x50, 0x08, 0xd5, 0x5d,
2163 0x43, 0xd7, 0xe0, 0xaa, 0xe0, 0x13, 0xb6, 0xb0,
2164 0xc0, 0xd4, 0xe5, 0x0d, 0x45, 0x83, 0xd6, 0x13},
2165 {0x40, 0x45, 0x0a, 0x92, 0x31, 0xea, 0x8c, 0x60,
2166 0x8c, 0x1f, 0xd8, 0x76, 0x45, 0xb9, 0x29, 0x00,
2167 0x26, 0x32, 0xd8, 0xa6, 0x96, 0x88, 0xe2, 0xc4,
2168 0x8b, 0xdb, 0x7f, 0x17, 0x87, 0xcc, 0xc8, 0xf2}},
2169 {{0xc2, 0x56, 0xe2, 0xb6, 0x1a, 0x81, 0xe7, 0x31,
2170 0x63, 0x2e, 0xbb, 0x0d, 0x2f, 0x81, 0x67, 0xd4,
2171 0x22, 0xe2, 0x38, 0x02, 0x25, 0x97, 0xc7, 0x88,
2172 0x6e, 0xdf, 0xbe, 0x2a, 0xa5, 0x73, 0x63, 0xaa},
2173 {0x50, 0x45, 0xe2, 0xc3, 0xbd, 0x89, 0xfc, 0x57,
2174 0xbd, 0x3c, 0xa3, 0x98, 0x7e, 0x7f, 0x36, 0x38,
2175 0x92, 0x39, 0x1f, 0x0f, 0x81, 0x1a, 0x06, 0x51,
2176 0x1f, 0x8d, 0x6a, 0xff, 0x47, 0x16, 0x06, 0x9c}},
2177 {{0x33, 0x95, 0xa2, 0x6f, 0x27, 0x5f, 0x9c, 0x9c,
2178 0x64, 0x45, 0xcb, 0xd1, 0x3c, 0xee, 0x5e, 0x5f,
2179 0x48, 0xa6, 0xaf, 0xe3, 0x79, 0xcf, 0xb1, 0xe2,
2180 0xbf, 0x55, 0x0e, 0xa2, 0x3b, 0x62, 0xf0, 0xe4},
2181 {0x14, 0xe8, 0x06, 0xe3, 0xbe, 0x7e, 0x67, 0x01,
2182 0xc5, 0x21, 0x67, 0xd8, 0x54, 0xb5, 0x7f, 0xa4,
2183 0xf9, 0x75, 0x70, 0x1c, 0xfd, 0x79, 0xdb, 0x86,
2184 0xad, 0x37, 0x85, 0x83, 0x56, 0x4e, 0xf0, 0xbf}},
2185 {{0xbc, 0xa6, 0xe0, 0x56, 0x4e, 0xef, 0xfa, 0xf5,
2186 0x1d, 0x5d, 0x3f, 0x2a, 0x5b, 0x19, 0xab, 0x51,
2187 0xc5, 0x8b, 0xdd, 0x98, 0x28, 0x35, 0x2f, 0xc3,
2188 0x81, 0x4f, 0x5c, 0xe5, 0x70, 0xb9, 0xeb, 0x62},
2189 {0xc4, 0x6d, 0x26, 0xb0, 0x17, 0x6b, 0xfe, 0x6c,
2190 0x12, 0xf8, 0xe7, 0xc1, 0xf5, 0x2f, 0xfa, 0x91,
2191 0x13, 0x27, 0xbd, 0x73, 0xcc, 0x33, 0x31, 0x1c,
2192 0x39, 0xe3, 0x27, 0x6a, 0x95, 0xcf, 0xc5, 0xfb}},
2193 {{0x30, 0xb2, 0x99, 0x84, 0xf0, 0x18, 0x2a, 0x6e,
2194 0x1e, 0x27, 0xed, 0xa2, 0x29, 0x99, 0x41, 0x56,
2195 0xe8, 0xd4, 0x0d, 0xef, 0x99, 0x9c, 0xf3, 0x58,
2196 0x29, 0x55, 0x1a, 0xc0, 0x68, 0xd6, 0x74, 0xa4},
2197 {0x07, 0x9c, 0xe7, 0xec, 0xf5, 0x36, 0x73, 0x41,
2198 0xa3, 0x1c, 0xe5, 0x93, 0x97, 0x6a, 0xfd, 0xf7,
2199 0x53, 0x18, 0xab, 0xaf, 0xeb, 0x85, 0xbd, 0x92,
2200 0x90, 0xab, 0x3c, 0xbf, 0x30, 0x82, 0xad, 0xf6}},
2201 {{0xc6, 0x87, 0x8a, 0x2a, 0xea, 0xc0, 0xa9, 0xec,
2202 0x6d, 0xd3, 0xdc, 0x32, 0x23, 0xce, 0x62, 0x19,
2203 0xa4, 0x7e, 0xa8, 0xdd, 0x1c, 0x33, 0xae, 0xd3,
2204 0x4f, 0x62, 0x9f, 0x52, 0xe7, 0x65, 0x46, 0xf4},
2205 {0x97, 0x51, 0x27, 0x67, 0x2d, 0xa2, 0x82, 0x87,
2206 0x98, 0xd3, 0xb6, 0x14, 0x7f, 0x51, 0xd3, 0x9a,
2207 0x0b, 0xd0, 0x76, 0x81, 0xb2, 0x4f, 0x58, 0x92,
2208 0xa4, 0x86, 0xa1, 0xa7, 0x09, 0x1d, 0xef, 0x9b}},
2209 {{0xb3, 0x0f, 0x2b, 0x69, 0x0d, 0x06, 0x90, 0x64,
2210 0xbd, 0x43, 0x4c, 0x10, 0xe8, 0x98, 0x1c, 0xa3,
2211 0xe1, 0x68, 0xe9, 0x79, 0x6c, 0x29, 0x51, 0x3f,
2212 0x41, 0xdc, 0xdf, 0x1f, 0xf3, 0x60, 0xbe, 0x33},
2213 {0xa1, 0x5f, 0xf7, 0x1d, 0xb4, 0x3e, 0x9b, 0x3c,
2214 0xe7, 0xbd, 0xb6, 0x06, 0xd5, 0x60, 0x06, 0x6d,
2215 0x50, 0xd2, 0xf4, 0x1a, 0x31, 0x08, 0xf2, 0xea,
2216 0x8e, 0xef, 0x5f, 0x7d, 0xb6, 0xd0, 0xc0, 0x27}},
2217 {{0x62, 0x9a, 0xd9, 0xbb, 0x38, 0x36, 0xce, 0xf7,
2218 0x5d, 0x2f, 0x13, 0xec, 0xc8, 0x2d, 0x02, 0x8a,
2219 0x2e, 0x72, 0xf0, 0xe5, 0x15, 0x9d, 0x72, 0xae,
2220 0xfc, 0xb3, 0x4f, 0x02, 0xea, 0xe1, 0x09, 0xfe},
2221 {0x00, 0x00, 0x00, 0x00, 0xfa, 0x0a, 0x3d, 0xbc,
2222 0xad, 0x16, 0x0c, 0xb6, 0xe7, 0x7c, 0x8b, 0x39,
2223 0x9a, 0x43, 0xbb, 0xe3, 0xc2, 0x55, 0x15, 0x14,
2224 0x75, 0xac, 0x90, 0x9b, 0x7f, 0x9a, 0x92, 0x00}},
2225 {{0x8b, 0xac, 0x70, 0x86, 0x29, 0x8f, 0x00, 0x23,
2226 0x7b, 0x45, 0x30, 0xaa, 0xb8, 0x4c, 0xc7, 0x8d,
2227 0x4e, 0x47, 0x85, 0xc6, 0x19, 0xe3, 0x96, 0xc2,
2228 0x9a, 0xa0, 0x12, 0xed, 0x6f, 0xd7, 0x76, 0x16},
2229 {0x45, 0xaf, 0x7e, 0x33, 0xc7, 0x7f, 0x10, 0x6c,
2230 0x7c, 0x9f, 0x29, 0xc1, 0xa8, 0x7e, 0x15, 0x84,
2231 0xe7, 0x7d, 0xc0, 0x6d, 0xab, 0x71, 0x5d, 0xd0,
2232 0x6b, 0x9f, 0x97, 0xab, 0xcb, 0x51, 0x0c, 0x9f}},
2233 {{0x9e, 0xc3, 0x92, 0xb4, 0x04, 0x9f, 0xc8, 0xbb,
2234 0xdd, 0x9e, 0xc6, 0x05, 0xfd, 0x65, 0xec, 0x94,
2235 0x7f, 0x2c, 0x16, 0xc4, 0x40, 0xac, 0x63, 0x7b,
2236 0x7d, 0xb8, 0x0c, 0xe4, 0x5b, 0xe3, 0xa7, 0x0e},
2237 {0x43, 0xf4, 0x44, 0xe8, 0xcc, 0xc8, 0xd4, 0x54,
2238 0x33, 0x37, 0x50, 0xf2, 0x87, 0x42, 0x2e, 0x00,
2239 0x49, 0x60, 0x62, 0x02, 0xfd, 0x1a, 0x7c, 0xdb,
2240 0x29, 0x6c, 0x6d, 0x54, 0x53, 0x08, 0xd1, 0xc8}},
2241 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2242 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2243 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2244 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
2245 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2246 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2247 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2248 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
2249 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2250 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2251 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2252 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
2253 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2254 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2255 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2256 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}},
2257 {{0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1,
2258 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0,
2259 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59,
2260 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92},
2261 {0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1,
2262 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0,
2263 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59,
2264 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}},
2265 {{0x28, 0x56, 0xac, 0x0e, 0x4f, 0x98, 0x09, 0xf0,
2266 0x49, 0xfa, 0x7f, 0x84, 0xac, 0x7e, 0x50, 0x5b,
2267 0x17, 0x43, 0x14, 0x89, 0x9c, 0x53, 0xa8, 0x94,
2268 0x30, 0xf2, 0x11, 0x4d, 0x92, 0x14, 0x27, 0xe8},
2269 {0x39, 0x7a, 0x84, 0x56, 0x79, 0x9d, 0xec, 0x26,
2270 0x2c, 0x53, 0xc1, 0x94, 0xc9, 0x8d, 0x9e, 0x9d,
2271 0x32, 0x1f, 0xdd, 0x84, 0x04, 0xe8, 0xe2, 0x0a,
2272 0x6b, 0xbe, 0xbb, 0x42, 0x40, 0x67, 0x30, 0x6c}},
2273 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2274 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2275 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4,
2276 0x40, 0x2d, 0xa1, 0x73, 0x2f, 0xc9, 0xbe, 0xbd},
2277 {0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1,
2278 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0,
2279 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59,
2280 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}},
2281 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2282 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
2283 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
2284 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40},
2285 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2286 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2287 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2288 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}},
2289 {{0x1c, 0xc4, 0xf7, 0xda, 0x0f, 0x65, 0xca, 0x39,
2290 0x70, 0x52, 0x92, 0x8e, 0xc3, 0xc8, 0x15, 0xea,
2291 0x7f, 0x10, 0x9e, 0x77, 0x4b, 0x6e, 0x2d, 0xdf,
2292 0xe8, 0x30, 0x9d, 0xda, 0xe8, 0x9a, 0x65, 0xae},
2293 {0x02, 0xb0, 0x16, 0xb1, 0x1d, 0xc8, 0x57, 0x7b,
2294 0xa2, 0x3a, 0xa2, 0xa3, 0x38, 0x5c, 0x8f, 0xeb,
2295 0x66, 0x37, 0x91, 0xa8, 0x5f, 0xef, 0x04, 0xf6,
2296 0x59, 0x75, 0xe1, 0xee, 0x92, 0xf6, 0x0e, 0x30}},
2297 {{0x8d, 0x76, 0x14, 0xa4, 0x14, 0x06, 0x9f, 0x9a,
2298 0xdf, 0x4a, 0x85, 0xa7, 0x6b, 0xbf, 0x29, 0x6f,
2299 0xbc, 0x34, 0x87, 0x5d, 0xeb, 0xbb, 0x2e, 0xa9,
2300 0xc9, 0x1f, 0x58, 0xd6, 0x9a, 0x82, 0xa0, 0x56},
2301 {0xd4, 0xb9, 0xdb, 0x88, 0x1d, 0x04, 0xe9, 0x93,
2302 0x8d, 0x3f, 0x20, 0xd5, 0x86, 0xa8, 0x83, 0x07,
2303 0xdb, 0x09, 0xd8, 0x22, 0x1f, 0x7f, 0xf1, 0x71,
2304 0xc8, 0xe7, 0x5d, 0x47, 0xaf, 0x8b, 0x72, 0xe9}},
2305 {{0x83, 0xb9, 0x39, 0xb2, 0xa4, 0xdf, 0x46, 0x87,
2306 0xc2, 0xb8, 0xf1, 0xe6, 0x4c, 0xd1, 0xe2, 0xa9,
2307 0xe4, 0x70, 0x30, 0x34, 0xbc, 0x52, 0x7c, 0x55,
2308 0xa6, 0xec, 0x80, 0xa4, 0xe5, 0xd2, 0xdc, 0x73},
2309 {0x08, 0xf1, 0x03, 0xcf, 0x16, 0x73, 0xe8, 0x7d,
2310 0xb6, 0x7e, 0x9b, 0xc0, 0xb4, 0xc2, 0xa5, 0x86,
2311 0x02, 0x77, 0xd5, 0x27, 0x86, 0xa5, 0x15, 0xfb,
2312 0xae, 0x9b, 0x8c, 0xa9, 0xf9, 0xf8, 0xa8, 0x4a}},
2313 {{0x8b, 0x00, 0x49, 0xdb, 0xfa, 0xf0, 0x1b, 0xa2,
2314 0xed, 0x8a, 0x9a, 0x7a, 0x36, 0x78, 0x4a, 0xc7,
2315 0xf7, 0xad, 0x39, 0xd0, 0x6c, 0x65, 0x7a, 0x41,
2316 0xce, 0xd6, 0xd6, 0x4c, 0x20, 0x21, 0x6b, 0xc7},
2317 {0xc6, 0xca, 0x78, 0x1d, 0x32, 0x6c, 0x6c, 0x06,
2318 0x91, 0xf2, 0x1a, 0xe8, 0x43, 0x16, 0xea, 0x04,
2319 0x3c, 0x1f, 0x07, 0x85, 0xf7, 0x09, 0x22, 0x08,
2320 0xba, 0x13, 0xfd, 0x78, 0x1e, 0x3f, 0x6f, 0x62}},
2321 {{0x25, 0x9b, 0x7c, 0xb0, 0xac, 0x72, 0x6f, 0xb2,
2322 0xe3, 0x53, 0x84, 0x7a, 0x1a, 0x9a, 0x98, 0x9b,
2323 0x44, 0xd3, 0x59, 0xd0, 0x8e, 0x57, 0x41, 0x40,
2324 0x78, 0xa7, 0x30, 0x2f, 0x4c, 0x9c, 0xb9, 0x68},
2325 {0xb7, 0x75, 0x03, 0x63, 0x61, 0xc2, 0x48, 0x6e,
2326 0x12, 0x3d, 0xbf, 0x4b, 0x27, 0xdf, 0xb1, 0x7a,
2327 0xff, 0x4e, 0x31, 0x07, 0x83, 0xf4, 0x62, 0x5b,
2328 0x19, 0xa5, 0xac, 0xa0, 0x32, 0x58, 0x0d, 0xa7}},
2329 {{0x43, 0x4f, 0x10, 0xa4, 0xca, 0xdb, 0x38, 0x67,
2330 0xfa, 0xae, 0x96, 0xb5, 0x6d, 0x97, 0xff, 0x1f,
2331 0xb6, 0x83, 0x43, 0xd3, 0xa0, 0x2d, 0x70, 0x7a,
2332 0x64, 0x05, 0x4c, 0xa7, 0xc1, 0xa5, 0x21, 0x51},
2333 {0xe4, 0xf1, 0x23, 0x84, 0xe1, 0xb5, 0x9d, 0xf2,
2334 0xb8, 0x73, 0x8b, 0x45, 0x2b, 0x35, 0x46, 0x38,
2335 0x10, 0x2b, 0x50, 0xf8, 0x8b, 0x35, 0xcd, 0x34,
2336 0xc8, 0x0e, 0xf6, 0xdb, 0x09, 0x35, 0xf0, 0xda}},
2337 {{0xdb, 0x21, 0x5c, 0x8d, 0x83, 0x1d, 0xb3, 0x34,
2338 0xc7, 0x0e, 0x43, 0xa1, 0x58, 0x79, 0x67, 0x13,
2339 0x1e, 0x86, 0x5d, 0x89, 0x63, 0xe6, 0x0a, 0x46,
2340 0x5c, 0x02, 0x97, 0x1b, 0x62, 0x43, 0x86, 0xf5},
2341 {0xdb, 0x21, 0x5c, 0x8d, 0x83, 0x1d, 0xb3, 0x34,
2342 0xc7, 0x0e, 0x43, 0xa1, 0x58, 0x79, 0x67, 0x13,
2343 0x1e, 0x86, 0x5d, 0x89, 0x63, 0xe6, 0x0a, 0x46,
2344 0x5c, 0x02, 0x97, 0x1b, 0x62, 0x43, 0x86, 0xf5}}
2345 };
2346 secp256k1_scalar_set_int(&one, 1);
2347 for (i = 0; i < 33; i++) {
2348 secp256k1_scalar_set_b32(&x, chal[i][0], &overflow);
2349 CHECK(!overflow);
2350 secp256k1_scalar_set_b32(&y, chal[i][1], &overflow);
2351 CHECK(!overflow);
2352 secp256k1_scalar_set_b32(&r1, res[i][0], &overflow);
2353 CHECK(!overflow);
2354 secp256k1_scalar_set_b32(&r2, res[i][1], &overflow);
2355 CHECK(!overflow);
2356 secp256k1_scalar_mul(&z, &x, &y);
2358 CHECK(secp256k1_scalar_eq(&r1, &z));
2359 if (!secp256k1_scalar_is_zero(&y)) {
2360 secp256k1_scalar_inverse(&zz, &y);
2363 CHECK(secp256k1_scalar_eq(&zzv, &zz));
2364 secp256k1_scalar_mul(&z, &z, &zz);
2366 CHECK(secp256k1_scalar_eq(&x, &z));
2367 secp256k1_scalar_mul(&zz, &zz, &y);
2369 CHECK(secp256k1_scalar_eq(&one, &zz));
2370 }
2371 }
2372 }
2373}
2374
2375/***** FIELD TESTS *****/
2376
2378 unsigned char bin[32];
2379 do {
2381 if (secp256k1_fe_set_b32(x, bin)) {
2382 return;
2383 }
2384 } while(1);
2385}
2386
2388 unsigned char bin[32];
2389 do {
2391 if (secp256k1_fe_set_b32(x, bin)) {
2392 return;
2393 }
2394 } while(1);
2395}
2396
2398 int tries = 10;
2399 while (--tries >= 0) {
2400 random_fe(nz);
2402 if (!secp256k1_fe_is_zero(nz)) {
2403 break;
2404 }
2405 }
2406 /* Infinitesimal probability of spurious failure here */
2407 CHECK(tries >= 0);
2408}
2409
2411 secp256k1_fe r;
2413 if (secp256k1_fe_sqrt(&r, ns)) {
2414 secp256k1_fe_negate(ns, ns, 1);
2415 }
2416}
2417
2419 secp256k1_fe an = *a;
2420 secp256k1_fe bn = *b;
2423 return secp256k1_fe_equal_var(&an, &bn);
2424}
2425
2427 static const unsigned char b32[32] = {
2428 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2429 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
2430 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,
2431 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x40
2432 };
2434 0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL,
2435 0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL
2436 );
2437 static const secp256k1_fe fe = SECP256K1_FE_CONST(
2438 0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL,
2439 0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL
2440 );
2441 secp256k1_fe fe2;
2442 unsigned char b322[32];
2444 /* Check conversions to fe. */
2445 CHECK(secp256k1_fe_set_b32(&fe2, b32));
2446 CHECK(secp256k1_fe_equal_var(&fe, &fe2));
2447 secp256k1_fe_from_storage(&fe2, &fes);
2448 CHECK(secp256k1_fe_equal_var(&fe, &fe2));
2449 /* Check conversion from fe. */
2450 secp256k1_fe_get_b32(b322, &fe);
2451 CHECK(secp256k1_memcmp_var(b322, b32, 32) == 0);
2452 secp256k1_fe_to_storage(&fes2, &fe);
2453 CHECK(secp256k1_memcmp_var(&fes2, &fes, sizeof(fes)) == 0);
2454}
2455
2456/* Returns true if two field elements have the same representation. */
2457int fe_identical(const secp256k1_fe *a, const secp256k1_fe *b) {
2458 int ret = 1;
2459#ifdef VERIFY
2460 ret &= (a->magnitude == b->magnitude);
2461 ret &= (a->normalized == b->normalized);
2462#endif
2463 /* Compare the struct member that holds the limbs. */
2464 ret &= (secp256k1_memcmp_var(a->n, b->n, sizeof(a->n)) == 0);
2465 return ret;
2466}
2467
2468void run_field_misc(void) {
2469 secp256k1_fe x;
2470 secp256k1_fe y;
2471 secp256k1_fe z;
2472 secp256k1_fe q;
2473 secp256k1_fe fe5 = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 5);
2474 int i, j;
2475 for (i = 0; i < 5*count; i++) {
2476 secp256k1_fe_storage xs, ys, zs;
2477 random_fe(&x);
2479 /* Test the fe equality and comparison operations. */
2480 CHECK(secp256k1_fe_cmp_var(&x, &x) == 0);
2482 z = x;
2483 secp256k1_fe_add(&z,&y);
2484 /* Test fe conditional move; z is not normalized here. */
2485 q = x;
2486 secp256k1_fe_cmov(&x, &z, 0);
2487#ifdef VERIFY
2488 CHECK(x.normalized && x.magnitude == 1);
2489#endif
2490 secp256k1_fe_cmov(&x, &x, 1);
2491 CHECK(!fe_identical(&x, &z));
2492 CHECK(fe_identical(&x, &q));
2493 secp256k1_fe_cmov(&q, &z, 1);
2494#ifdef VERIFY
2495 CHECK(!q.normalized && q.magnitude == z.magnitude);
2496#endif
2497 CHECK(fe_identical(&q, &z));
2500 CHECK(!secp256k1_fe_equal_var(&x, &z));
2502 secp256k1_fe_cmov(&q, &z, (i&1));
2503#ifdef VERIFY
2504 CHECK(q.normalized && q.magnitude == 1);
2505#endif
2506 for (j = 0; j < 6; j++) {
2507 secp256k1_fe_negate(&z, &z, j+1);
2509 secp256k1_fe_cmov(&q, &z, (j&1));
2510#ifdef VERIFY
2511 CHECK((q.normalized != (j&1)) && q.magnitude == ((j&1) ? z.magnitude : 1));
2512#endif
2513 }
2515 /* Test storage conversion and conditional moves. */
2516 secp256k1_fe_to_storage(&xs, &x);
2517 secp256k1_fe_to_storage(&ys, &y);
2518 secp256k1_fe_to_storage(&zs, &z);
2519 secp256k1_fe_storage_cmov(&zs, &xs, 0);
2520 secp256k1_fe_storage_cmov(&zs, &zs, 1);
2521 CHECK(secp256k1_memcmp_var(&xs, &zs, sizeof(xs)) != 0);
2522 secp256k1_fe_storage_cmov(&ys, &xs, 1);
2523 CHECK(secp256k1_memcmp_var(&xs, &ys, sizeof(xs)) == 0);
2527 /* Test that mul_int, mul, and add agree. */
2528 secp256k1_fe_add(&y, &x);
2529 secp256k1_fe_add(&y, &x);
2530 z = x;
2531 secp256k1_fe_mul_int(&z, 3);
2532 CHECK(check_fe_equal(&y, &z));
2533 secp256k1_fe_add(&y, &x);
2534 secp256k1_fe_add(&z, &x);
2535 CHECK(check_fe_equal(&z, &y));
2536 z = x;
2537 secp256k1_fe_mul_int(&z, 5);
2538 secp256k1_fe_mul(&q, &x, &fe5);
2539 CHECK(check_fe_equal(&z, &q));
2540 secp256k1_fe_negate(&x, &x, 1);
2541 secp256k1_fe_add(&z, &x);
2542 secp256k1_fe_add(&q, &x);
2543 CHECK(check_fe_equal(&y, &z));
2544 CHECK(check_fe_equal(&q, &y));
2545 }
2546}
2547
2548void test_fe_mul(const secp256k1_fe* a, const secp256k1_fe* b, int use_sqr)
2549{
2550 secp256k1_fe c, an, bn;
2551 /* Variables in BE 32-byte format. */
2552 unsigned char a32[32], b32[32], c32[32];
2553 /* Variables in LE 16x uint16_t format. */
2554 uint16_t a16[16], b16[16], c16[16];
2555 /* Field modulus in LE 16x uint16_t format. */
2556 static const uint16_t m16[16] = {
2557 0xfc2f, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
2558 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
2559 };
2560 uint16_t t16[32];
2561 int i;
2562
2563 /* Compute C = A * B in fe format. */
2564 c = *a;
2565 if (use_sqr) {
2566 secp256k1_fe_sqr(&c, &c);
2567 } else {
2568 secp256k1_fe_mul(&c, &c, b);
2569 }
2570
2571 /* Convert A, B, C into LE 16x uint16_t format. */
2572 an = *a;
2573 bn = *b;
2577 secp256k1_fe_get_b32(a32, &an);
2578 secp256k1_fe_get_b32(b32, &bn);
2579 secp256k1_fe_get_b32(c32, &c);
2580 for (i = 0; i < 16; ++i) {
2581 a16[i] = a32[31 - 2*i] + ((uint16_t)a32[30 - 2*i] << 8);
2582 b16[i] = b32[31 - 2*i] + ((uint16_t)b32[30 - 2*i] << 8);
2583 c16[i] = c32[31 - 2*i] + ((uint16_t)c32[30 - 2*i] << 8);
2584 }
2585 /* Compute T = A * B in LE 16x uint16_t format. */
2586 mulmod256(t16, a16, b16, m16);
2587 /* Compare */
2588 CHECK(secp256k1_memcmp_var(t16, c16, 32) == 0);
2589}
2590
2591void run_fe_mul(void) {
2592 int i;
2593 for (i = 0; i < 100 * count; ++i) {
2594 secp256k1_fe a, b, c, d;
2595 random_fe(&a);
2597 random_fe(&b);
2599 random_fe_test(&c);
2601 random_fe_test(&d);
2603 test_fe_mul(&a, &a, 1);
2604 test_fe_mul(&c, &c, 1);
2605 test_fe_mul(&a, &b, 0);
2606 test_fe_mul(&a, &c, 0);
2607 test_fe_mul(&c, &b, 0);
2608 test_fe_mul(&c, &d, 0);
2609 }
2610}
2611
2612void run_sqr(void) {
2613 secp256k1_fe x, s;
2614
2615 {
2616 int i;
2617 secp256k1_fe_set_int(&x, 1);
2618 secp256k1_fe_negate(&x, &x, 1);
2619
2620 for (i = 1; i <= 512; ++i) {
2621 secp256k1_fe_mul_int(&x, 2);
2623 secp256k1_fe_sqr(&s, &x);
2624 }
2625 }
2626}
2627
2628void test_sqrt(const secp256k1_fe *a, const secp256k1_fe *k) {
2629 secp256k1_fe r1, r2;
2630 int v = secp256k1_fe_sqrt(&r1, a);
2631 CHECK((v == 0) == (k == NULL));
2632
2633 if (k != NULL) {
2634 /* Check that the returned root is +/- the given known answer */
2635 secp256k1_fe_negate(&r2, &r1, 1);
2636 secp256k1_fe_add(&r1, k); secp256k1_fe_add(&r2, k);
2639 }
2640}
2641
2642void run_sqrt(void) {
2643 secp256k1_fe ns, x, s, t;
2644 int i;
2645
2646 /* Check sqrt(0) is 0 */
2647 secp256k1_fe_set_int(&x, 0);
2648 secp256k1_fe_sqr(&s, &x);
2649 test_sqrt(&s, &x);
2650
2651 /* Check sqrt of small squares (and their negatives) */
2652 for (i = 1; i <= 100; i++) {
2653 secp256k1_fe_set_int(&x, i);
2654 secp256k1_fe_sqr(&s, &x);
2655 test_sqrt(&s, &x);
2656 secp256k1_fe_negate(&t, &s, 1);
2657 test_sqrt(&t, NULL);
2658 }
2659
2660 /* Consistency checks for large random values */
2661 for (i = 0; i < 10; i++) {
2662 int j;
2664 for (j = 0; j < count; j++) {
2665 random_fe(&x);
2666 secp256k1_fe_sqr(&s, &x);
2667 test_sqrt(&s, &x);
2668 secp256k1_fe_negate(&t, &s, 1);
2669 test_sqrt(&t, NULL);
2670 secp256k1_fe_mul(&t, &s, &ns);
2671 test_sqrt(&t, NULL);
2672 }
2673 }
2674}
2675
2676/***** FIELD/SCALAR INVERSE TESTS *****/
2677
2679 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFE,
2680 0xBAAEDCE6, 0xAF48A03B, 0xBFD25E8C, 0xD0364140
2681);
2682
2684 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
2685 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFC2E
2686);
2687
2688/* These tests test the following identities:
2689 *
2690 * for x==0: 1/x == 0
2691 * for x!=0: x*(1/x) == 1
2692 * for x!=0 and x!=1: 1/(1/x - 1) + 1 == -1/(x-1)
2693 */
2694
2696{
2697 secp256k1_scalar l, r, t;
2698
2699 (var ? secp256k1_scalar_inverse_var : secp256k1_scalar_inverse)(&l, x); /* l = 1/x */
2700 if (out) *out = l;
2701 if (secp256k1_scalar_is_zero(x)) {
2703 return;
2704 }
2705 secp256k1_scalar_mul(&t, x, &l); /* t = x*(1/x) */
2706 CHECK(secp256k1_scalar_is_one(&t)); /* x*(1/x) == 1 */
2707 secp256k1_scalar_add(&r, x, &scalar_minus_one); /* r = x-1 */
2708 if (secp256k1_scalar_is_zero(&r)) return;
2709 (var ? secp256k1_scalar_inverse_var : secp256k1_scalar_inverse)(&r, &r); /* r = 1/(x-1) */
2710 secp256k1_scalar_add(&l, &scalar_minus_one, &l); /* l = 1/x-1 */
2711 (var ? secp256k1_scalar_inverse_var : secp256k1_scalar_inverse)(&l, &l); /* l = 1/(1/x-1) */
2712 secp256k1_scalar_add(&l, &l, &secp256k1_scalar_one); /* l = 1/(1/x-1)+1 */
2713 secp256k1_scalar_add(&l, &r, &l); /* l = 1/(1/x-1)+1 + 1/(x-1) */
2714 CHECK(secp256k1_scalar_is_zero(&l)); /* l == 0 */
2715}
2716
2717void test_inverse_field(secp256k1_fe* out, const secp256k1_fe* x, int var)
2718{
2719 secp256k1_fe l, r, t;
2720
2721 (var ? secp256k1_fe_inv_var : secp256k1_fe_inv)(&l, x) ; /* l = 1/x */
2722 if (out) *out = l;
2723 t = *x; /* t = x */
2726 return;
2727 }
2728 secp256k1_fe_mul(&t, x, &l); /* t = x*(1/x) */
2729 secp256k1_fe_add(&t, &fe_minus_one); /* t = x*(1/x)-1 */
2730 CHECK(secp256k1_fe_normalizes_to_zero(&t)); /* x*(1/x)-1 == 0 */
2731 r = *x; /* r = x */
2732 secp256k1_fe_add(&r, &fe_minus_one); /* r = x-1 */
2734 (var ? secp256k1_fe_inv_var : secp256k1_fe_inv)(&r, &r); /* r = 1/(x-1) */
2735 secp256k1_fe_add(&l, &fe_minus_one); /* l = 1/x-1 */
2736 (var ? secp256k1_fe_inv_var : secp256k1_fe_inv)(&l, &l); /* l = 1/(1/x-1) */
2737 secp256k1_fe_add(&l, &secp256k1_fe_one); /* l = 1/(1/x-1)+1 */
2738 secp256k1_fe_add(&l, &r); /* l = 1/(1/x-1)+1 + 1/(x-1) */
2740}
2741
2743{
2744 /* Fixed test cases for field inverses: pairs of (x, 1/x) mod p. */
2745 static const secp256k1_fe fe_cases[][2] = {
2746 /* 0 */
2747 {SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0),
2748 SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0)},
2749 /* 1 */
2750 {SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1),
2751 SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1)},
2752 /* -1 */
2753 {SECP256K1_FE_CONST(0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfffffffe, 0xfffffc2e),
2754 SECP256K1_FE_CONST(0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfffffffe, 0xfffffc2e)},
2755 /* 2 */
2756 {SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 2),
2757 SECP256K1_FE_CONST(0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x7ffffe18)},
2758 /* 2**128 */
2759 {SECP256K1_FE_CONST(0, 0, 0, 1, 0, 0, 0, 0),
2760 SECP256K1_FE_CONST(0xbcb223fe, 0xdc24a059, 0xd838091d, 0xd2253530, 0xffffffff, 0xffffffff, 0xffffffff, 0x434dd931)},
2761 /* Input known to need 637 divsteps */
2762 {SECP256K1_FE_CONST(0xe34e9c95, 0x6bee8a84, 0x0dcb632a, 0xdb8a1320, 0x66885408, 0x06f3f996, 0x7c11ca84, 0x19199ec3),
2763 SECP256K1_FE_CONST(0xbd2cbd8f, 0x1c536828, 0x9bccda44, 0x2582ac0c, 0x870152b0, 0x8a3f09fb, 0x1aaadf92, 0x19b618e5)},
2764 /* Input known to need 567 divsteps starting with delta=1/2. */
2765 {SECP256K1_FE_CONST(0xf6bc3ba3, 0x636451c4, 0x3e46357d, 0x2c21d619, 0x0988e234, 0x15985661, 0x6672982b, 0xa7549bfc),
2766 SECP256K1_FE_CONST(0xb024fdc7, 0x5547451e, 0x426c585f, 0xbd481425, 0x73df6b75, 0xeef6d9d0, 0x389d87d4, 0xfbb440ba)},
2767 /* Input known to need 566 divsteps starting with delta=1/2. */
2768 {SECP256K1_FE_CONST(0xb595d81b, 0x2e3c1e2f, 0x482dbc65, 0xe4865af7, 0x9a0a50aa, 0x29f9e618, 0x6f87d7a5, 0x8d1063ae),
2769 SECP256K1_FE_CONST(0xc983337c, 0x5d5c74e1, 0x49918330, 0x0b53afb5, 0xa0428a0b, 0xce6eef86, 0x059bd8ef, 0xe5b908de)},
2770 /* Set of 10 inputs accessing all 128 entries in the modinv32 divsteps_var table */
2771 {SECP256K1_FE_CONST(0x00000000, 0x00000000, 0xe0ff1f80, 0x1f000000, 0x00000000, 0x00000000, 0xfeff0100, 0x00000000),
2772 SECP256K1_FE_CONST(0x9faf9316, 0x77e5049d, 0x0b5e7a1b, 0xef70b893, 0x18c9e30c, 0x045e7fd7, 0x29eddf8c, 0xd62e9e3d)},
2773 {SECP256K1_FE_CONST(0x621a538d, 0x511b2780, 0x35688252, 0x53f889a4, 0x6317c3ac, 0x32ba0a46, 0x6277c0d1, 0xccd31192),
2774 SECP256K1_FE_CONST(0x38513b0c, 0x5eba856f, 0xe29e882e, 0x9b394d8c, 0x34bda011, 0xeaa66943, 0x6a841a4c, 0x6ae8bcff)},
2775 {SECP256K1_FE_CONST(0x00000200, 0xf0ffff1f, 0x00000000, 0x0000e0ff, 0xffffffff, 0xfffcffff, 0xffffffff, 0xffff0100),
2776 SECP256K1_FE_CONST(0x5da42a52, 0x3640de9e, 0x13e64343, 0x0c7591b7, 0x6c1e3519, 0xf048c5b6, 0x0484217c, 0xedbf8b2f)},
2777 {SECP256K1_FE_CONST(0xd1343ef9, 0x4b952621, 0x7c52a2ee, 0x4ea1281b, 0x4ab46410, 0x9f26998d, 0xa686a8ff, 0x9f2103e8),
2778 SECP256K1_FE_CONST(0x84044385, 0x9a4619bf, 0x74e35b6d, 0xa47e0c46, 0x6b7fb47d, 0x9ffab128, 0xb0775aa3, 0xcb318bd1)},
2779 {SECP256K1_FE_CONST(0xb27235d2, 0xc56a52be, 0x210db37a, 0xd50d23a4, 0xbe621bdd, 0x5df22c6a, 0xe926ba62, 0xd2e4e440),
2780 SECP256K1_FE_CONST(0x67a26e54, 0x483a9d3c, 0xa568469e, 0xd258ab3d, 0xb9ec9981, 0xdca9b1bd, 0x8d2775fe, 0x53ae429b)},
2781 {SECP256K1_FE_CONST(0x00000000, 0x00000000, 0x00e0ffff, 0xffffff83, 0xffffffff, 0x3f00f00f, 0x000000e0, 0xffffffff),
2782 SECP256K1_FE_CONST(0x310e10f8, 0x23bbfab0, 0xac94907d, 0x076c9a45, 0x8d357d7f, 0xc763bcee, 0x00d0e615, 0x5a6acef6)},
2783 {SECP256K1_FE_CONST(0xfeff0300, 0x001c0000, 0xf80700c0, 0x0ff0ffff, 0xffffffff, 0x0fffffff, 0xffff0100, 0x7f0000fe),
2784 SECP256K1_FE_CONST(0x28e2fdb4, 0x0709168b, 0x86f598b0, 0x3453a370, 0x530cf21f, 0x32f978d5, 0x1d527a71, 0x59269b0c)},
2785 {SECP256K1_FE_CONST(0xc2591afa, 0x7bb98ef7, 0x090bb273, 0x85c14f87, 0xbb0b28e0, 0x54d3c453, 0x85c66753, 0xd5574d2f),
2786 SECP256K1_FE_CONST(0xfdca70a2, 0x70ce627c, 0x95e66fae, 0x848a6dbb, 0x07ffb15c, 0x5f63a058, 0xba4140ed, 0x6113b503)},
2787 {SECP256K1_FE_CONST(0xf5475db3, 0xedc7b5a3, 0x411c047e, 0xeaeb452f, 0xc625828e, 0x1cf5ad27, 0x8eec1060, 0xc7d3e690),
2788 SECP256K1_FE_CONST(0x5eb756c0, 0xf963f4b9, 0xdc6a215e, 0xec8cc2d8, 0x2e9dec01, 0xde5eb88d, 0x6aba7164, 0xaecb2c5a)},
2789 {SECP256K1_FE_CONST(0x00000000, 0x00f8ffff, 0xffffffff, 0x01000000, 0xe0ff1f00, 0x00000000, 0xffffff7f, 0x00000000),
2790 SECP256K1_FE_CONST(0xe0d2e3d8, 0x49b6157d, 0xe54e88c2, 0x1a7f02ca, 0x7dd28167, 0xf1125d81, 0x7bfa444e, 0xbe110037)},
2791 /* Selection of randomly generated inputs that reach high/low d/e values in various configurations. */
2792 {SECP256K1_FE_CONST(0x13cc08a4, 0xd8c41f0f, 0x179c3e67, 0x54c46c67, 0xc4109221, 0x09ab3b13, 0xe24d9be1, 0xffffe950),
2793 SECP256K1_FE_CONST(0xb80c8006, 0xd16abaa7, 0xcabd71e5, 0xcf6714f4, 0x966dd3d0, 0x64767a2d, 0xe92c4441, 0x51008cd1)},
2794 {SECP256K1_FE_CONST(0xaa6db990, 0x95efbca1, 0x3cc6ff71, 0x0602e24a, 0xf49ff938, 0x99fffc16, 0x46f40993, 0xc6e72057),
2795 SECP256K1_FE_CONST(0xd5d3dd69, 0xb0c195e5, 0x285f1d49, 0xe639e48c, 0x9223f8a9, 0xca1d731d, 0x9ca482f9, 0xa5b93e06)},
2796 {SECP256K1_FE_CONST(0x1c680eac, 0xaeabffd8, 0x9bdc4aee, 0x1781e3de, 0xa3b08108, 0x0015f2e0, 0x94449e1b, 0x2f67a058),
2797 SECP256K1_FE_CONST(0x7f083f8d, 0x31254f29, 0x6510f475, 0x245c373d, 0xc5622590, 0x4b323393, 0x32ed1719, 0xc127444b)},
2798 {SECP256K1_FE_CONST(0x147d44b3, 0x012d83f8, 0xc160d386, 0x1a44a870, 0x9ba6be96, 0x8b962707, 0x267cbc1a, 0xb65b2f0a),
2799 SECP256K1_FE_CONST(0x555554ff, 0x170aef1e, 0x50a43002, 0xe51fbd36, 0xafadb458, 0x7a8aded1, 0x0ca6cd33, 0x6ed9087c)},
2800 {SECP256K1_FE_CONST(0x12423796, 0x22f0fe61, 0xf9ca017c, 0x5384d107, 0xa1fbf3b2, 0x3b018013, 0x916a3c37, 0x4000b98c),
2801 SECP256K1_FE_CONST(0x20257700, 0x08668f94, 0x1177e306, 0x136c01f5, 0x8ed1fbd2, 0x95ec4589, 0xae38edb9, 0xfd19b6d7)},
2802 {SECP256K1_FE_CONST(0xdcf2d030, 0x9ab42cb4, 0x93ffa181, 0xdcd23619, 0x39699b52, 0x08909a20, 0xb5a17695, 0x3a9dcf21),
2803 SECP256K1_FE_CONST(0x1f701dea, 0xe211fb1f, 0x4f37180d, 0x63a0f51c, 0x29fe1e40, 0xa40b6142, 0x2e7b12eb, 0x982b06b6)},
2804 {SECP256K1_FE_CONST(0x79a851f6, 0xa6314ed3, 0xb35a55e6, 0xca1c7d7f, 0xe32369ea, 0xf902432e, 0x375308c5, 0xdfd5b600),
2805 SECP256K1_FE_CONST(0xcaae00c5, 0xe6b43851, 0x9dabb737, 0x38cba42c, 0xa02c8549, 0x7895dcbf, 0xbd183d71, 0xafe4476a)},
2806 {SECP256K1_FE_CONST(0xede78fdd, 0xcfc92bf1, 0x4fec6c6c, 0xdb8d37e2, 0xfb66bc7b, 0x28701870, 0x7fa27c9a, 0x307196ec),
2807 SECP256K1_FE_CONST(0x68193a6c, 0x9a8b87a7, 0x2a760c64, 0x13e473f6, 0x23ae7bed, 0x1de05422, 0x88865427, 0xa3418265)},
2808 {SECP256K1_FE_CONST(0xa40b2079, 0xb8f88e89, 0xa7617997, 0x89baf5ae, 0x174df343, 0x75138eae, 0x2711595d, 0x3fc3e66c),
2809 SECP256K1_FE_CONST(0x9f99c6a5, 0x6d685267, 0xd4b87c37, 0x9d9c4576, 0x358c692b, 0x6bbae0ed, 0x3389c93d, 0x7fdd2655)},
2810 {SECP256K1_FE_CONST(0x7c74c6b6, 0xe98d9151, 0x72645cf1, 0x7f06e321, 0xcefee074, 0x15b2113a, 0x10a9be07, 0x08a45696),
2811 SECP256K1_FE_CONST(0x8c919a88, 0x898bc1e0, 0x77f26f97, 0x12e655b7, 0x9ba0ac40, 0xe15bb19e, 0x8364cc3b, 0xe227a8ee)},
2812 {SECP256K1_FE_CONST(0x109ba1ce, 0xdafa6d4a, 0xa1cec2b2, 0xeb1069f4, 0xb7a79e5b, 0xec6eb99b, 0xaec5f643, 0xee0e723e),
2813 SECP256K1_FE_CONST(0x93d13eb8, 0x4bb0bcf9, 0xe64f5a71, 0xdbe9f359, 0x7191401c, 0x6f057a4a, 0xa407fe1b, 0x7ecb65cc)},
2814 {SECP256K1_FE_CONST(0x3db076cd, 0xec74a5c9, 0xf61dd138, 0x90e23e06, 0xeeedd2d0, 0x74cbc4e0, 0x3dbe1e91, 0xded36a78),
2815 SECP256K1_FE_CONST(0x3f07f966, 0x8e2a1e09, 0x706c71df, 0x02b5e9d5, 0xcb92ddbf, 0xcdd53010, 0x16545564, 0xe660b107)},
2816 {SECP256K1_FE_CONST(0xe31c73ed, 0xb4c4b82c, 0x02ae35f7, 0x4cdec153, 0x98b522fd, 0xf7d2460c, 0x6bf7c0f8, 0x4cf67b0d),
2817 SECP256K1_FE_CONST(0x4b8f1faf, 0x94e8b070, 0x19af0ff6, 0xa319cd31, 0xdf0a7ffb, 0xefaba629, 0x59c50666, 0x1fe5b843)},
2818 {SECP256K1_FE_CONST(0x4c8b0e6e, 0x83392ab6, 0xc0e3e9f1, 0xbbd85497, 0x16698897, 0xf552d50d, 0x79652ddb, 0x12f99870),
2819 SECP256K1_FE_CONST(0x56d5101f, 0xd23b7949, 0x17dc38d6, 0xf24022ef, 0xcf18e70a, 0x5cc34424, 0x438544c3, 0x62da4bca)},
2820 {SECP256K1_FE_CONST(0xb0e040e2, 0x40cc35da, 0x7dd5c611, 0x7fccb178, 0x28888137, 0xbc930358, 0xea2cbc90, 0x775417dc),
2821 SECP256K1_FE_CONST(0xca37f0d4, 0x016dd7c8, 0xab3ae576, 0x96e08d69, 0x68ed9155, 0xa9b44270, 0x900ae35d, 0x7c7800cd)},
2822 {SECP256K1_FE_CONST(0x8a32ea49, 0x7fbb0bae, 0x69724a9d, 0x8e2105b2, 0xbdf69178, 0x862577ef, 0x35055590, 0x667ddaef),
2823 SECP256K1_FE_CONST(0xd02d7ead, 0xc5e190f0, 0x559c9d72, 0xdaef1ffc, 0x64f9f425, 0xf43645ea, 0x7341e08d, 0x11768e96)},
2824 {SECP256K1_FE_CONST(0xa3592d98, 0x9abe289d, 0x579ebea6, 0xbb0857a8, 0xe242ab73, 0x85f9a2ce, 0xb6998f0f, 0xbfffbfc6),
2825 SECP256K1_FE_CONST(0x093c1533, 0x32032efa, 0x6aa46070, 0x0039599e, 0x589c35f4, 0xff525430, 0x7fe3777a, 0x44b43ddc)},
2826 {SECP256K1_FE_CONST(0x647178a3, 0x229e607b, 0xcc98521a, 0xcce3fdd9, 0x1e1bc9c9, 0x97fb7c6a, 0x61b961e0, 0x99b10709),
2827 SECP256K1_FE_CONST(0x98217c13, 0xd51ddf78, 0x96310e77, 0xdaebd908, 0x602ca683, 0xcb46d07a, 0xa1fcf17e, 0xc8e2feb3)},
2828 {SECP256K1_FE_CONST(0x7334627c, 0x73f98968, 0x99464b4b, 0xf5964958, 0x1b95870d, 0xc658227e, 0x5e3235d8, 0xdcab5787),
2829 SECP256K1_FE_CONST(0x000006fd, 0xc7e9dd94, 0x40ae367a, 0xe51d495c, 0x07603b9b, 0x2d088418, 0x6cc5c74c, 0x98514307)},
2830 {SECP256K1_FE_CONST(0x82e83876, 0x96c28938, 0xa50dd1c5, 0x605c3ad1, 0xc048637d, 0x7a50825f, 0x335ed01a, 0x00005760),
2831 SECP256K1_FE_CONST(0xb0393f9f, 0x9f2aa55e, 0xf5607e2e, 0x5287d961, 0x60b3e704, 0xf3e16e80, 0xb4f9a3ea, 0xfec7f02d)},
2832 {SECP256K1_FE_CONST(0xc97b6cec, 0x3ee6b8dc, 0x98d24b58, 0x3c1970a1, 0xfe06297a, 0xae813529, 0xe76bb6bd, 0x771ae51d),
2833 SECP256K1_FE_CONST(0x0507c702, 0xd407d097, 0x47ddeb06, 0xf6625419, 0x79f48f79, 0x7bf80d0b, 0xfc34b364, 0x253a5db1)},
2834 {SECP256K1_FE_CONST(0xd559af63, 0x77ea9bc4, 0x3cf1ad14, 0x5c7a4bbb, 0x10e7d18b, 0x7ce0dfac, 0x380bb19d, 0x0bb99bd3),
2835 SECP256K1_FE_CONST(0x00196119, 0xb9b00d92, 0x34edfdb5, 0xbbdc42fc, 0xd2daa33a, 0x163356ca, 0xaa8754c8, 0xb0ec8b0b)},
2836 {SECP256K1_FE_CONST(0x8ddfa3dc, 0x52918da0, 0x640519dc, 0x0af8512a, 0xca2d33b2, 0xbde52514, 0xda9c0afc, 0xcb29fce4),
2837 SECP256K1_FE_CONST(0xb3e4878d, 0x5cb69148, 0xcd54388b, 0xc23acce0, 0x62518ba8, 0xf09def92, 0x7b31e6aa, 0x6ba35b02)},
2838 {SECP256K1_FE_CONST(0xf8207492, 0xe3049f0a, 0x65285f2b, 0x0bfff996, 0x00ca112e, 0xc05da837, 0x546d41f9, 0x5194fb91),
2839 SECP256K1_FE_CONST(0x7b7ee50b, 0xa8ed4bbd, 0xf6469930, 0x81419a5c, 0x071441c7, 0x290d046e, 0x3b82ea41, 0x611c5f95)},
2840 {SECP256K1_FE_CONST(0x050f7c80, 0x5bcd3c6b, 0x823cb724, 0x5ce74db7, 0xa4e39f5c, 0xbd8828d7, 0xfd4d3e07, 0x3ec2926a),
2841 SECP256K1_FE_CONST(0x000d6730, 0xb0171314, 0x4764053d, 0xee157117, 0x48fd61da, 0xdea0b9db, 0x1d5e91c6, 0xbdc3f59e)},
2842 {SECP256K1_FE_CONST(0x3e3ea8eb, 0x05d760cf, 0x23009263, 0xb3cb3ac9, 0x088f6f0d, 0x3fc182a3, 0xbd57087c, 0xe67c62f9),
2843 SECP256K1_FE_CONST(0xbe988716, 0xa29c1bf6, 0x4456aed6, 0xab1e4720, 0x49929305, 0x51043bf4, 0xebd833dd, 0xdd511e8b)},
2844 {SECP256K1_FE_CONST(0x6964d2a9, 0xa7fa6501, 0xa5959249, 0x142f4029, 0xea0c1b5f, 0x2f487ef6, 0x301ac80a, 0x768be5cd),
2845 SECP256K1_FE_CONST(0x3918ffe4, 0x07492543, 0xed24d0b7, 0x3df95f8f, 0xaffd7cb4, 0x0de2191c, 0x9ec2f2ad, 0x2c0cb3c6)},
2846 {SECP256K1_FE_CONST(0x37c93520, 0xf6ddca57, 0x2b42fd5e, 0xb5c7e4de, 0x11b5b81c, 0xb95e91f3, 0x95c4d156, 0x39877ccb),
2847 SECP256K1_FE_CONST(0x9a94b9b5, 0x57eb71ee, 0x4c975b8b, 0xac5262a8, 0x077b0595, 0xe12a6b1f, 0xd728edef, 0x1a6bf956)}
2848 };
2849 /* Fixed test cases for scalar inverses: pairs of (x, 1/x) mod n. */
2850 static const secp256k1_scalar scalar_cases[][2] = {
2851 /* 0 */
2852 {SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0),
2853 SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0)},
2854 /* 1 */
2855 {SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1),
2856 SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1)},
2857 /* -1 */
2858 {SECP256K1_SCALAR_CONST(0xffffffff, 0xffffffff, 0xffffffff, 0xfffffffe, 0xbaaedce6, 0xaf48a03b, 0xbfd25e8c, 0xd0364140),
2859 SECP256K1_SCALAR_CONST(0xffffffff, 0xffffffff, 0xffffffff, 0xfffffffe, 0xbaaedce6, 0xaf48a03b, 0xbfd25e8c, 0xd0364140)},
2860 /* 2 */
2861 {SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 2),
2862 SECP256K1_SCALAR_CONST(0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x5d576e73, 0x57a4501d, 0xdfe92f46, 0x681b20a1)},
2863 /* 2**128 */
2864 {SECP256K1_SCALAR_CONST(0, 0, 0, 1, 0, 0, 0, 0),
2865 SECP256K1_SCALAR_CONST(0x50a51ac8, 0x34b9ec24, 0x4b0dff66, 0x5588b13e, 0x9984d5b3, 0xcf80ef0f, 0xd6a23766, 0xa3ee9f22)},
2866 /* Input known to need 635 divsteps */
2867 {SECP256K1_SCALAR_CONST(0xcb9f1d35, 0xdd4416c2, 0xcd71bf3f, 0x6365da66, 0x3c9b3376, 0x8feb7ae9, 0x32a5ef60, 0x19199ec3),
2868 SECP256K1_SCALAR_CONST(0x1d7c7bba, 0xf1893d53, 0xb834bd09, 0x36b411dc, 0x42c2e42f, 0xec72c428, 0x5e189791, 0x8e9bc708)},
2869 /* Input known to need 566 divsteps starting with delta=1/2. */
2870 {SECP256K1_SCALAR_CONST(0x7e3c993d, 0xa4272488, 0xbc015b49, 0x2db54174, 0xd382083a, 0xebe6db35, 0x80f82eff, 0xcd132c72),
2871 SECP256K1_SCALAR_CONST(0x086f34a0, 0x3e631f76, 0x77418f28, 0xcc84ac95, 0x6304439d, 0x365db268, 0x312c6ded, 0xd0b934f8)},
2872 /* Input known to need 565 divsteps starting with delta=1/2. */
2873 {SECP256K1_SCALAR_CONST(0xbad7e587, 0x3f307859, 0x60d93147, 0x8a18491e, 0xb38a9fd5, 0x254350d3, 0x4b1f0e4b, 0x7dd6edc4),
2874 SECP256K1_SCALAR_CONST(0x89f2df26, 0x39e2b041, 0xf19bd876, 0xd039c8ac, 0xc2223add, 0x29c4943e, 0x6632d908, 0x515f467b)},
2875 /* Selection of randomly generated inputs that reach low/high d/e values in various configurations. */
2876 {SECP256K1_SCALAR_CONST(0x1950d757, 0xb37a5809, 0x435059bb, 0x0bb8997e, 0x07e1e3c8, 0x5e5d7d2c, 0x6a0ed8e3, 0xdbde180e),
2877 SECP256K1_SCALAR_CONST(0xbf72af9b, 0x750309e2, 0x8dda230b, 0xfe432b93, 0x7e25e475, 0x4388251e, 0x633d894b, 0x3bcb6f8c)},
2878 {SECP256K1_SCALAR_CONST(0x9bccf4e7, 0xc5a515e3, 0x50637aa9, 0xbb65a13f, 0x391749a1, 0x62de7d4e, 0xf6d7eabb, 0x3cd10ce0),
2879 SECP256K1_SCALAR_CONST(0xaf2d5623, 0xb6385a33, 0xcd0365be, 0x5e92a70d, 0x7f09179c, 0x3baaf30f, 0x8f9cc83b, 0x20092f67)},
2880 {SECP256K1_SCALAR_CONST(0x73a57111, 0xb242952a, 0x5c5dee59, 0xf3be2ace, 0xa30a7659, 0xa46e5f47, 0xd21267b1, 0x39e642c9),
2881 SECP256K1_SCALAR_CONST(0xa711df07, 0xcbcf13ef, 0xd61cc6be, 0xbcd058ce, 0xb02cf157, 0x272d4a18, 0x86d0feb3, 0xcd5fa004)},
2882 {SECP256K1_SCALAR_CONST(0x04884963, 0xce0580b1, 0xba547030, 0x3c691db3, 0x9cd2c84f, 0x24c7cebd, 0x97ebfdba, 0x3e785ec2),
2883 SECP256K1_SCALAR_CONST(0xaaaaaf14, 0xd7c99ba7, 0x517ce2c1, 0x78a28b4c, 0x3769a851, 0xe5c5a03d, 0x4cc28f33, 0x0ec4dc5d)},
2884 {SECP256K1_SCALAR_CONST(0x1679ed49, 0x21f537b1, 0x815cb8ae, 0x9efc511c, 0x5b9fa037, 0x0b0f275e, 0x6c985281, 0x6c4a9905),
2885 SECP256K1_SCALAR_CONST(0xb14ac3d5, 0x62b52999, 0xef34ead1, 0xffca4998, 0x0294341a, 0x1f8172aa, 0xea1624f9, 0x302eea62)},
2886 {SECP256K1_SCALAR_CONST(0x626b37c0, 0xf0057c35, 0xee982f83, 0x452a1fd3, 0xea826506, 0x48b08a9d, 0x1d2c4799, 0x4ad5f6ec),
2887 SECP256K1_SCALAR_CONST(0xe38643b7, 0x567bfc2f, 0x5d2f1c15, 0xe327239c, 0x07112443, 0x69509283, 0xfd98e77a, 0xdb71c1e8)},
2888 {SECP256K1_SCALAR_CONST(0x1850a3a7, 0x759efc56, 0x54f287b2, 0x14d1234b, 0xe263bbc9, 0xcf4d8927, 0xd5f85f27, 0x965bd816),
2889 SECP256K1_SCALAR_CONST(0x3b071831, 0xcac9619a, 0xcceb0596, 0xf614d63b, 0x95d0db2f, 0xc6a00901, 0x8eaa2621, 0xabfa0009)},
2890 {SECP256K1_SCALAR_CONST(0x94ae5d06, 0xa27dc400, 0x487d72be, 0xaa51ebed, 0xe475b5c0, 0xea675ffc, 0xf4df627a, 0xdca4222f),
2891 SECP256K1_SCALAR_CONST(0x01b412ed, 0xd7830956, 0x1532537e, 0xe5e3dc99, 0x8fd3930a, 0x54f8d067, 0x32ef5760, 0x594438a5)},
2892 {SECP256K1_SCALAR_CONST(0x1f24278a, 0xb5bfe374, 0xa328dbbc, 0xebe35f48, 0x6620e009, 0xd58bb1b4, 0xb5a6bf84, 0x8815f63a),
2893 SECP256K1_SCALAR_CONST(0xfe928416, 0xca5ba2d3, 0xfde513da, 0x903a60c7, 0x9e58ad8a, 0x8783bee4, 0x083a3843, 0xa608c914)},
2894 {SECP256K1_SCALAR_CONST(0xdc107d58, 0x274f6330, 0x67dba8bc, 0x26093111, 0x5201dfb8, 0x968ce3f5, 0xf34d1bd4, 0xf2146504),
2895 SECP256K1_SCALAR_CONST(0x660cfa90, 0x13c3d93e, 0x7023b1e5, 0xedd09e71, 0x6d9c9d10, 0x7a3d2cdb, 0xdd08edc3, 0xaa78fcfb)},
2896 {SECP256K1_SCALAR_CONST(0x7cd1e905, 0xc6f02776, 0x2f551cc7, 0x5da61cff, 0x7da05389, 0x1119d5a4, 0x631c7442, 0x894fd4f7),
2897 SECP256K1_SCALAR_CONST(0xff20862a, 0x9d3b1a37, 0x1628803b, 0x3004ccae, 0xaa23282a, 0xa89a1109, 0xd94ece5e, 0x181bdc46)},
2898 {SECP256K1_SCALAR_CONST(0x5b9dade8, 0x23d26c58, 0xcd12d818, 0x25b8ae97, 0x3dea04af, 0xf482c96b, 0xa062f254, 0x9e453640),
2899 SECP256K1_SCALAR_CONST(0x50c38800, 0x15fa53f4, 0xbe1e5392, 0x5c9b120a, 0x262c22c7, 0x18fa0816, 0x5f2baab4, 0x8cb5db46)},
2900 {SECP256K1_SCALAR_CONST(0x11cdaeda, 0x969c464b, 0xef1f4ab0, 0x5b01d22e, 0x656fd098, 0x882bea84, 0x65cdbe7a, 0x0c19ff03),
2901 SECP256K1_SCALAR_CONST(0x1968d0fa, 0xac46f103, 0xb55f1f72, 0xb3820bed, 0xec6b359a, 0x4b1ae0ad, 0x7e38e1fb, 0x295ccdfb)},
2902 {SECP256K1_SCALAR_CONST(0x2c351aa1, 0x26e91589, 0x194f8a1e, 0x06561f66, 0x0cb97b7f, 0x10914454, 0x134d1c03, 0x157266b4),
2903 SECP256K1_SCALAR_CONST(0xbe49ada6, 0x92bd8711, 0x41b176c4, 0xa478ba95, 0x14883434, 0x9d1cd6f3, 0xcc4b847d, 0x22af80f5)},
2904 {SECP256K1_SCALAR_CONST(0x6ba07c6e, 0x13a60edb, 0x6247f5c3, 0x84b5fa56, 0x76fe3ec5, 0x80426395, 0xf65ec2ae, 0x623ba730),
2905 SECP256K1_SCALAR_CONST(0x25ac23f7, 0x418cd747, 0x98376f9d, 0x4a11c7bf, 0x24c8ebfe, 0x4c8a8655, 0x345f4f52, 0x1c515595)},
2906 {SECP256K1_SCALAR_CONST(0x9397a712, 0x8abb6951, 0x2d4a3d54, 0x703b1c2a, 0x0661dca8, 0xd75c9b31, 0xaed4d24b, 0xd2ab2948),
2907 SECP256K1_SCALAR_CONST(0xc52e8bef, 0xd55ce3eb, 0x1c897739, 0xeb9fb606, 0x36b9cd57, 0x18c51cc2, 0x6a87489e, 0xffd0dcf3)},
2908 {SECP256K1_SCALAR_CONST(0xe6a808cc, 0xeb437888, 0xe97798df, 0x4e224e44, 0x7e3b380a, 0x207c1653, 0x889f3212, 0xc6738b6f),
2909 SECP256K1_SCALAR_CONST(0x31f9ae13, 0xd1e08b20, 0x757a2e5e, 0x5243a0eb, 0x8ae35f73, 0x19bb6122, 0xb910f26b, 0xda70aa55)},
2910 {SECP256K1_SCALAR_CONST(0xd0320548, 0xab0effe7, 0xa70779e0, 0x61a347a6, 0xb8c1e010, 0x9d5281f8, 0x2ee588a6, 0x80000000),
2911 SECP256K1_SCALAR_CONST(0x1541897e, 0x78195c90, 0x7583dd9e, 0x728b6100, 0xbce8bc6d, 0x7a53b471, 0x5dcd9e45, 0x4425fcaf)},
2912 {SECP256K1_SCALAR_CONST(0x93d623f1, 0xd45b50b0, 0x796e9186, 0x9eac9407, 0xd30edc20, 0xef6304cf, 0x250494e7, 0xba503de9),
2913 SECP256K1_SCALAR_CONST(0x7026d638, 0x1178b548, 0x92043952, 0x3c7fb47c, 0xcd3ea236, 0x31d82b01, 0x612fc387, 0x80b9b957)},
2914 {SECP256K1_SCALAR_CONST(0xf860ab39, 0x55f5d412, 0xa4d73bcc, 0x3b48bd90, 0xc248ffd3, 0x13ca10be, 0x8fba84cc, 0xdd28d6a3),
2915 SECP256K1_SCALAR_CONST(0x5c32fc70, 0xe0b15d67, 0x76694700, 0xfe62be4d, 0xeacdb229, 0x7a4433d9, 0x52155cd0, 0x7649ab59)},
2916 {SECP256K1_SCALAR_CONST(0x4e41311c, 0x0800af58, 0x7a690a8e, 0xe175c9ba, 0x6981ab73, 0xac532ea8, 0x5c1f5e63, 0x6ac1f189),
2917 SECP256K1_SCALAR_CONST(0xfffffff9, 0xd075982c, 0x7fbd3825, 0xc05038a2, 0x4533b91f, 0x94ec5f45, 0xb280b28f, 0x842324dc)},
2918 {SECP256K1_SCALAR_CONST(0x48e473bf, 0x3555eade, 0xad5d7089, 0x2424c4e4, 0x0a99397c, 0x2dc796d8, 0xb7a43a69, 0xd0364141),
2919 SECP256K1_SCALAR_CONST(0x634976b2, 0xa0e47895, 0x1ec38593, 0x266d6fd0, 0x6f602644, 0x9bb762f1, 0x7180c704, 0xe23a4daa)},
2920 {SECP256K1_SCALAR_CONST(0xbe83878d, 0x3292fc54, 0x26e71c62, 0x556ccedc, 0x7cbb8810, 0x4032a720, 0x34ead589, 0xe4d6bd13),
2921 SECP256K1_SCALAR_CONST(0x6cd150ad, 0x25e59d0f, 0x74cbae3d, 0x6377534a, 0x1e6562e8, 0xb71b9d18, 0xe1e5d712, 0x8480abb3)},
2922 {SECP256K1_SCALAR_CONST(0xcdddf2e5, 0xefc15f88, 0xc9ee06de, 0x8a846ca9, 0x28561581, 0x68daa5fb, 0xd1cf3451, 0xeb1782d0),
2923 SECP256K1_SCALAR_CONST(0xffffffd9, 0xed8d2af4, 0x993c865a, 0x23e9681a, 0x3ca3a3dc, 0xe6d5a46e, 0xbd86bd87, 0x61b55c70)},
2924 {SECP256K1_SCALAR_CONST(0xb6a18f1f, 0x04872df9, 0x08165ec4, 0x319ca19c, 0x6c0359ab, 0x1f7118fb, 0xc2ef8082, 0xca8b7785),
2925 SECP256K1_SCALAR_CONST(0xff55b19b, 0x0f1ac78c, 0x0f0c88c2, 0x2358d5ad, 0x5f455e4e, 0x3330b72f, 0x274dc153, 0xffbf272b)},
2926 {SECP256K1_SCALAR_CONST(0xea4898e5, 0x30eba3e8, 0xcf0e5c3d, 0x06ec6844, 0x01e26fb6, 0x75636225, 0xc5d08f4c, 0x1decafa0),
2927 SECP256K1_SCALAR_CONST(0xe5a014a8, 0xe3c4ec1e, 0xea4f9b32, 0xcfc7b386, 0x00630806, 0x12c08d02, 0x6407ccc2, 0xb067d90e)},
2928 {SECP256K1_SCALAR_CONST(0x70e9aea9, 0x7e933af0, 0x8a23bfab, 0x23e4b772, 0xff951863, 0x5ffcf47d, 0x6bebc918, 0x2ca58265),
2929 SECP256K1_SCALAR_CONST(0xf4e00006, 0x81bc6441, 0x4eb6ec02, 0xc194a859, 0x80ad7c48, 0xba4e9afb, 0x8b6bdbe0, 0x989d8f77)},
2930 {SECP256K1_SCALAR_CONST(0x3c56c774, 0x46efe6f0, 0xe93618b8, 0xf9b5a846, 0xd247df61, 0x83b1e215, 0x06dc8bcc, 0xeefc1bf5),
2931 SECP256K1_SCALAR_CONST(0xfff8937a, 0x2cd9586b, 0x43c25e57, 0xd1cefa7a, 0x9fb91ed3, 0x95b6533d, 0x8ad0de5b, 0xafb93f00)},
2932 {SECP256K1_SCALAR_CONST(0xfb5c2772, 0x5cb30e83, 0xe38264df, 0xe4e3ebf3, 0x392aa92e, 0xa68756a1, 0x51279ac5, 0xb50711a8),
2933 SECP256K1_SCALAR_CONST(0x000013af, 0x1105bfe7, 0xa6bbd7fb, 0x3d638f99, 0x3b266b02, 0x072fb8bc, 0x39251130, 0x2e0fd0ea)}
2934 };
2935 int i, var, testrand;
2936 unsigned char b32[32];
2937 secp256k1_fe x_fe;
2938 secp256k1_scalar x_scalar;
2939 memset(b32, 0, sizeof(b32));
2940 /* Test fixed test cases through test_inverse_{scalar,field}, both ways. */
2941 for (i = 0; (size_t)i < sizeof(fe_cases)/sizeof(fe_cases[0]); ++i) {
2942 for (var = 0; var <= 1; ++var) {
2943 test_inverse_field(&x_fe, &fe_cases[i][0], var);
2944 check_fe_equal(&x_fe, &fe_cases[i][1]);
2945 test_inverse_field(&x_fe, &fe_cases[i][1], var);
2946 check_fe_equal(&x_fe, &fe_cases[i][0]);
2947 }
2948 }
2949 for (i = 0; (size_t)i < sizeof(scalar_cases)/sizeof(scalar_cases[0]); ++i) {
2950 for (var = 0; var <= 1; ++var) {
2951 test_inverse_scalar(&x_scalar, &scalar_cases[i][0], var);
2952 CHECK(secp256k1_scalar_eq(&x_scalar, &scalar_cases[i][1]));
2953 test_inverse_scalar(&x_scalar, &scalar_cases[i][1], var);
2954 CHECK(secp256k1_scalar_eq(&x_scalar, &scalar_cases[i][0]));
2955 }
2956 }
2957 /* Test inputs 0..999 and their respective negations. */
2958 for (i = 0; i < 1000; ++i) {
2959 b32[31] = i & 0xff;
2960 b32[30] = (i >> 8) & 0xff;
2961 secp256k1_scalar_set_b32(&x_scalar, b32, NULL);
2962 secp256k1_fe_set_b32(&x_fe, b32);
2963 for (var = 0; var <= 1; ++var) {
2964 test_inverse_scalar(NULL, &x_scalar, var);
2965 test_inverse_field(NULL, &x_fe, var);
2966 }
2967 secp256k1_scalar_negate(&x_scalar, &x_scalar);
2968 secp256k1_fe_negate(&x_fe, &x_fe, 1);
2969 for (var = 0; var <= 1; ++var) {
2970 test_inverse_scalar(NULL, &x_scalar, var);
2971 test_inverse_field(NULL, &x_fe, var);
2972 }
2973 }
2974 /* test 128*count random inputs; half with testrand256_test, half with testrand256 */
2975 for (testrand = 0; testrand <= 1; ++testrand) {
2976 for (i = 0; i < 64 * count; ++i) {
2978 secp256k1_scalar_set_b32(&x_scalar, b32, NULL);
2979 secp256k1_fe_set_b32(&x_fe, b32);
2980 for (var = 0; var <= 1; ++var) {
2981 test_inverse_scalar(NULL, &x_scalar, var);
2982 test_inverse_field(NULL, &x_fe, var);
2983 }
2984 }
2985 }
2986}
2987
2988/***** GROUP TESTS *****/
2989
2990void ge_equals_ge(const secp256k1_ge *a, const secp256k1_ge *b) {
2991 CHECK(a->infinity == b->infinity);
2992 if (a->infinity) {
2993 return;
2994 }
2995 CHECK(secp256k1_fe_equal_var(&a->x, &b->x));
2996 CHECK(secp256k1_fe_equal_var(&a->y, &b->y));
2997}
2998
2999/* This compares jacobian points including their Z, not just their geometric meaning. */
3001 secp256k1_gej a2;
3002 secp256k1_gej b2;
3003 int ret = 1;
3004 ret &= a->infinity == b->infinity;
3005 if (ret && !a->infinity) {
3006 a2 = *a;
3007 b2 = *b;
3014 ret &= secp256k1_fe_cmp_var(&a2.x, &b2.x) == 0;
3015 ret &= secp256k1_fe_cmp_var(&a2.y, &b2.y) == 0;
3016 ret &= secp256k1_fe_cmp_var(&a2.z, &b2.z) == 0;
3017 }
3018 return ret;
3019}
3020
3021void ge_equals_gej(const secp256k1_ge *a, const secp256k1_gej *b) {
3022 secp256k1_fe z2s;
3023 secp256k1_fe u1, u2, s1, s2;
3024 CHECK(a->infinity == b->infinity);
3025 if (a->infinity) {
3026 return;
3027 }
3028 /* Check a.x * b.z^2 == b.x && a.y * b.z^3 == b.y, to avoid inverses. */
3029 secp256k1_fe_sqr(&z2s, &b->z);
3030 secp256k1_fe_mul(&u1, &a->x, &z2s);
3031 u2 = b->x; secp256k1_fe_normalize_weak(&u2);
3032 secp256k1_fe_mul(&s1, &a->y, &z2s); secp256k1_fe_mul(&s1, &s1, &b->z);
3033 s2 = b->y; secp256k1_fe_normalize_weak(&s2);
3034 CHECK(secp256k1_fe_equal_var(&u1, &u2));
3035 CHECK(secp256k1_fe_equal_var(&s1, &s2));
3036}
3037
3038void test_ge(void) {
3039 int i, i1;
3040 int runs = 6;
3041 /* 25 points are used:
3042 * - infinity
3043 * - for each of four random points p1 p2 p3 p4, we add the point, its
3044 * negation, and then those two again but with randomized Z coordinate.
3045 * - The same is then done for lambda*p1 and lambda^2*p1.
3046 */
3047 secp256k1_ge *ge = (secp256k1_ge *)checked_malloc(&ctx->error_callback, sizeof(secp256k1_ge) * (1 + 4 * runs));
3048 secp256k1_gej *gej = (secp256k1_gej *)checked_malloc(&ctx->error_callback, sizeof(secp256k1_gej) * (1 + 4 * runs));
3049 secp256k1_fe zf;
3050 secp256k1_fe zfi2, zfi3;
3051
3053 secp256k1_ge_clear(&ge[0]);
3054 secp256k1_ge_set_gej_var(&ge[0], &gej[0]);
3055 for (i = 0; i < runs; i++) {
3056 int j;
3057 secp256k1_ge g;
3059 if (i >= runs - 2) {
3060 secp256k1_ge_mul_lambda(&g, &ge[1]);
3061 }
3062 if (i >= runs - 1) {
3064 }
3065 ge[1 + 4 * i] = g;
3066 ge[2 + 4 * i] = g;
3067 secp256k1_ge_neg(&ge[3 + 4 * i], &g);
3068 secp256k1_ge_neg(&ge[4 + 4 * i], &g);
3069 secp256k1_gej_set_ge(&gej[1 + 4 * i], &ge[1 + 4 * i]);
3070 random_group_element_jacobian_test(&gej[2 + 4 * i], &ge[2 + 4 * i]);
3071 secp256k1_gej_set_ge(&gej[3 + 4 * i], &ge[3 + 4 * i]);
3072 random_group_element_jacobian_test(&gej[4 + 4 * i], &ge[4 + 4 * i]);
3073 for (j = 0; j < 4; j++) {
3074 random_field_element_magnitude(&ge[1 + j + 4 * i].x);
3075 random_field_element_magnitude(&ge[1 + j + 4 * i].y);
3076 random_field_element_magnitude(&gej[1 + j + 4 * i].x);
3077 random_field_element_magnitude(&gej[1 + j + 4 * i].y);
3078 random_field_element_magnitude(&gej[1 + j + 4 * i].z);
3079 }
3080 }
3081
3082 /* Generate random zf, and zfi2 = 1/zf^2, zfi3 = 1/zf^3 */
3083 do {
3085 } while(secp256k1_fe_is_zero(&zf));
3087 secp256k1_fe_inv_var(&zfi3, &zf);
3088 secp256k1_fe_sqr(&zfi2, &zfi3);
3089 secp256k1_fe_mul(&zfi3, &zfi3, &zfi2);
3090
3091 for (i1 = 0; i1 < 1 + 4 * runs; i1++) {
3092 int i2;
3093 for (i2 = 0; i2 < 1 + 4 * runs; i2++) {
3094 /* Compute reference result using gej + gej (var). */
3095 secp256k1_gej refj, resj;
3096 secp256k1_ge ref;
3097 secp256k1_fe zr;
3098 secp256k1_gej_add_var(&refj, &gej[i1], &gej[i2], secp256k1_gej_is_infinity(&gej[i1]) ? NULL : &zr);
3099 /* Check Z ratio. */
3100 if (!secp256k1_gej_is_infinity(&gej[i1]) && !secp256k1_gej_is_infinity(&refj)) {
3101 secp256k1_fe zrz; secp256k1_fe_mul(&zrz, &zr, &gej[i1].z);
3102 CHECK(secp256k1_fe_equal_var(&zrz, &refj.z));
3103 }
3104 secp256k1_ge_set_gej_var(&ref, &refj);
3105
3106 /* Test gej + ge with Z ratio result (var). */
3107 secp256k1_gej_add_ge_var(&resj, &gej[i1], &ge[i2], secp256k1_gej_is_infinity(&gej[i1]) ? NULL : &zr);
3108 ge_equals_gej(&ref, &resj);
3109 if (!secp256k1_gej_is_infinity(&gej[i1]) && !secp256k1_gej_is_infinity(&resj)) {
3110 secp256k1_fe zrz; secp256k1_fe_mul(&zrz, &zr, &gej[i1].z);
3111 CHECK(secp256k1_fe_equal_var(&zrz, &resj.z));
3112 }
3113
3114 /* Test gej + ge (var, with additional Z factor). */
3115 {
3116 secp256k1_ge ge2_zfi = ge[i2]; /* the second term with x and y rescaled for z = 1/zf */
3117 secp256k1_fe_mul(&ge2_zfi.x, &ge2_zfi.x, &zfi2);
3118 secp256k1_fe_mul(&ge2_zfi.y, &ge2_zfi.y, &zfi3);
3121 secp256k1_gej_add_zinv_var(&resj, &gej[i1], &ge2_zfi, &zf);
3122 ge_equals_gej(&ref, &resj);
3123 }
3124
3125 /* Test gej + ge (const). */
3126 if (i2 != 0) {
3127 /* secp256k1_gej_add_ge does not support its second argument being infinity. */
3128 secp256k1_gej_add_ge(&resj, &gej[i1], &ge[i2]);
3129 ge_equals_gej(&ref, &resj);
3130 }
3131
3132 /* Test doubling (var). */
3133 if ((i1 == 0 && i2 == 0) || ((i1 + 3)/4 == (i2 + 3)/4 && ((i1 + 3)%4)/2 == ((i2 + 3)%4)/2)) {
3134 secp256k1_fe zr2;
3135 /* Normal doubling with Z ratio result. */
3136 secp256k1_gej_double_var(&resj, &gej[i1], &zr2);
3137 ge_equals_gej(&ref, &resj);
3138 /* Check Z ratio. */
3139 secp256k1_fe_mul(&zr2, &zr2, &gej[i1].z);
3140 CHECK(secp256k1_fe_equal_var(&zr2, &resj.z));
3141 /* Normal doubling. */
3142 secp256k1_gej_double_var(&resj, &gej[i2], NULL);
3143 ge_equals_gej(&ref, &resj);
3144 /* Constant-time doubling. */
3145 secp256k1_gej_double(&resj, &gej[i2]);
3146 ge_equals_gej(&ref, &resj);
3147 }
3148
3149 /* Test adding opposites. */
3150 if ((i1 == 0 && i2 == 0) || ((i1 + 3)/4 == (i2 + 3)/4 && ((i1 + 3)%4)/2 != ((i2 + 3)%4)/2)) {
3152 }
3153
3154 /* Test adding infinity. */
3155 if (i1 == 0) {
3158 ge_equals_gej(&ref, &gej[i2]);
3159 }
3160 if (i2 == 0) {
3163 ge_equals_gej(&ref, &gej[i1]);
3164 }
3165 }
3166 }
3167
3168 /* Test adding all points together in random order equals infinity. */
3169 {
3171 secp256k1_gej *gej_shuffled = (secp256k1_gej *)checked_malloc(&ctx->error_callback, (4 * runs + 1) * sizeof(secp256k1_gej));
3172 for (i = 0; i < 4 * runs + 1; i++) {
3173 gej_shuffled[i] = gej[i];
3174 }
3175 for (i = 0; i < 4 * runs + 1; i++) {
3176 int swap = i + secp256k1_testrand_int(4 * runs + 1 - i);
3177 if (swap != i) {
3178 secp256k1_gej t = gej_shuffled[i];
3179 gej_shuffled[i] = gej_shuffled[swap];
3180 gej_shuffled[swap] = t;
3181 }
3182 }
3183 for (i = 0; i < 4 * runs + 1; i++) {
3184 secp256k1_gej_add_var(&sum, &sum, &gej_shuffled[i], NULL);
3185 }
3187 free(gej_shuffled);
3188 }
3189
3190 /* Test batch gej -> ge conversion without known z ratios. */
3191 {
3192 secp256k1_ge *ge_set_all = (secp256k1_ge *)checked_malloc(&ctx->error_callback, (4 * runs + 1) * sizeof(secp256k1_ge));
3193 secp256k1_ge_set_all_gej_var(ge_set_all, gej, 4 * runs + 1);
3194 for (i = 0; i < 4 * runs + 1; i++) {
3195 secp256k1_fe s;
3197 secp256k1_gej_rescale(&gej[i], &s);
3198 ge_equals_gej(&ge_set_all[i], &gej[i]);
3199 }
3200 free(ge_set_all);
3201 }
3202
3203 /* Test batch gej -> ge conversion with many infinities. */
3204 for (i = 0; i < 4 * runs + 1; i++) {
3205 int odd;
3207 odd = secp256k1_fe_is_odd(&ge[i].x);
3208 CHECK(odd == 0 || odd == 1);
3209 /* randomly set half the points to infinity */
3210 if (odd == i % 2) {
3212 }
3213 secp256k1_gej_set_ge(&gej[i], &ge[i]);
3214 }
3215 /* batch convert */
3216 secp256k1_ge_set_all_gej_var(ge, gej, 4 * runs + 1);
3217 /* check result */
3218 for (i = 0; i < 4 * runs + 1; i++) {
3219 ge_equals_gej(&ge[i], &gej[i]);
3220 }
3221
3222 /* Test batch gej -> ge conversion with all infinities. */
3223 for (i = 0; i < 4 * runs + 1; i++) {
3225 }
3226 /* batch convert */
3227 secp256k1_ge_set_all_gej_var(ge, gej, 4 * runs + 1);
3228 /* check result */
3229 for (i = 0; i < 4 * runs + 1; i++) {
3231 }
3232
3233 free(ge);
3234 free(gej);
3235}
3236
3237
3239 secp256k1_ge p;
3240 secp256k1_gej pj, npj, infj1, infj2, infj3;
3241 secp256k1_fe zinv;
3242
3243 /* Test that adding P+(-P) results in a fully initialized infinity*/
3245 secp256k1_gej_set_ge(&pj, &p);
3246 secp256k1_gej_neg(&npj, &pj);
3247
3248 secp256k1_gej_add_var(&infj1, &pj, &npj, NULL);
3250 CHECK(secp256k1_fe_is_zero(&infj1.x));
3251 CHECK(secp256k1_fe_is_zero(&infj1.y));
3252 CHECK(secp256k1_fe_is_zero(&infj1.z));
3253
3254 secp256k1_gej_add_ge_var(&infj2, &npj, &p, NULL);
3256 CHECK(secp256k1_fe_is_zero(&infj2.x));
3257 CHECK(secp256k1_fe_is_zero(&infj2.y));
3258 CHECK(secp256k1_fe_is_zero(&infj2.z));
3259
3260 secp256k1_fe_set_int(&zinv, 1);
3261 secp256k1_gej_add_zinv_var(&infj3, &npj, &p, &zinv);
3263 CHECK(secp256k1_fe_is_zero(&infj3.x));
3264 CHECK(secp256k1_fe_is_zero(&infj3.y));
3265 CHECK(secp256k1_fe_is_zero(&infj3.z));
3266
3267
3268}
3269
3271 /* The point of this test is to check that we can add two points
3272 * whose y-coordinates are negatives of each other but whose x
3273 * coordinates differ. If the x-coordinates were the same, these
3274 * points would be negatives of each other and their sum is
3275 * infinity. This is cool because it "covers up" any degeneracy
3276 * in the addition algorithm that would cause the xy coordinates
3277 * of the sum to be wrong (since infinity has no xy coordinates).
3278 * HOWEVER, if the x-coordinates are different, infinity is the
3279 * wrong answer, and such degeneracies are exposed. This is the
3280 * root of https://github.com/bitcoin-core/secp256k1/issues/257
3281 * which this test is a regression test for.
3282 *
3283 * These points were generated in sage as
3284 * # secp256k1 params
3285 * F = FiniteField (0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F)
3286 * C = EllipticCurve ([F (0), F (7)])
3287 * G = C.lift_x(0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798)
3288 * N = FiniteField(G.order())
3289 *
3290 * # endomorphism values (lambda is 1^{1/3} in N, beta is 1^{1/3} in F)
3291 * x = polygen(N)
3292 * lam = (1 - x^3).roots()[1][0]
3293 *
3294 * # random "bad pair"
3295 * P = C.random_element()
3296 * Q = -int(lam) * P
3297 * print " P: %x %x" % P.xy()
3298 * print " Q: %x %x" % Q.xy()
3299 * print "P + Q: %x %x" % (P + Q).xy()
3300 */
3302 0x8d24cd95, 0x0a355af1, 0x3c543505, 0x44238d30,
3303 0x0643d79f, 0x05a59614, 0x2f8ec030, 0xd58977cb,
3304 0x001e337a, 0x38093dcd, 0x6c0f386d, 0x0b1293a8,
3305 0x4d72c879, 0xd7681924, 0x44e6d2f3, 0x9190117d
3306 );
3308 0xc7b74206, 0x1f788cd9, 0xabd0937d, 0x164a0d86,
3309 0x95f6ff75, 0xf19a4ce9, 0xd013bd7b, 0xbf92d2a7,
3310 0xffe1cc85, 0xc7f6c232, 0x93f0c792, 0xf4ed6c57,
3311 0xb28d3786, 0x2897e6db, 0xbb192d0b, 0x6e6feab2
3312 );
3314 0x671a63c0, 0x3efdad4c, 0x389a7798, 0x24356027,
3315 0xb3d69010, 0x278625c3, 0x5c86d390, 0x184a8f7a,
3316 0x5f6409c2, 0x2ce01f2b, 0x511fd375, 0x25071d08,
3317 0xda651801, 0x70e95caf, 0x8f0d893c, 0xbed8fbbe
3318 );
3319 secp256k1_ge b;
3320 secp256k1_gej resj;
3321 secp256k1_ge res;
3322 secp256k1_ge_set_gej(&b, &bj);
3323
3324 secp256k1_gej_add_var(&resj, &aj, &bj, NULL);
3325 secp256k1_ge_set_gej(&res, &resj);
3326 ge_equals_gej(&res, &sumj);
3327
3328 secp256k1_gej_add_ge(&resj, &aj, &b);
3329 secp256k1_ge_set_gej(&res, &resj);
3330 ge_equals_gej(&res, &sumj);
3331
3332 secp256k1_gej_add_ge_var(&resj, &aj, &b, NULL);
3333 secp256k1_ge_set_gej(&res, &resj);
3334 ge_equals_gej(&res, &sumj);
3335}
3336
3337void run_ge(void) {
3338 int i;
3339 for (i = 0; i < count * 32; i++) {
3340 test_ge();
3341 }
3344}
3345
3347 secp256k1_scalar sum = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0);
3348 secp256k1_pubkey data[6];
3349 const secp256k1_pubkey* d[6];
3351 secp256k1_pubkey sd2;
3352 secp256k1_gej Qj;
3353 secp256k1_ge Q;
3354 int i;
3355 for (i = 1; i <= 6; i++) {
3360 secp256k1_ge_set_gej(&Q, &Qj);
3361 secp256k1_pubkey_save(&data[i - 1], &Q);
3362 d[i - 1] = &data[i - 1];
3364 secp256k1_ge_set_gej(&Q, &Qj);
3365 secp256k1_pubkey_save(&sd, &Q);
3366 CHECK(secp256k1_ec_pubkey_combine(ctx, &sd2, d, i) == 1);
3367 CHECK(secp256k1_memcmp_var(&sd, &sd2, sizeof(sd)) == 0);
3368 }
3369}
3370
3371void run_ec_combine(void) {
3372 int i;
3373 for (i = 0; i < count * 8; i++) {
3375 }
3376}
3377
3379 /* The input itself, normalized. */
3380 secp256k1_fe fex = *x;
3381 secp256k1_fe fez;
3382 /* Results of set_xquad_var, set_xo_var(..., 0), set_xo_var(..., 1). */
3383 secp256k1_ge ge_quad, ge_even, ge_odd;
3384 secp256k1_gej gej_quad;
3385 /* Return values of the above calls. */
3386 int res_quad, res_even, res_odd;
3387
3389
3390 res_quad = secp256k1_ge_set_xquad(&ge_quad, &fex);
3391 res_even = secp256k1_ge_set_xo_var(&ge_even, &fex, 0);
3392 res_odd = secp256k1_ge_set_xo_var(&ge_odd, &fex, 1);
3393
3394 CHECK(res_quad == res_even);
3395 CHECK(res_quad == res_odd);
3396
3397 if (res_quad) {
3398 secp256k1_fe_normalize_var(&ge_quad.x);
3400 secp256k1_fe_normalize_var(&ge_even.x);
3401 secp256k1_fe_normalize_var(&ge_quad.y);
3403 secp256k1_fe_normalize_var(&ge_even.y);
3404
3405 /* No infinity allowed. */
3406 CHECK(!ge_quad.infinity);
3407 CHECK(!ge_even.infinity);
3408 CHECK(!ge_odd.infinity);
3409
3410 /* Check that the x coordinates check out. */
3411 CHECK(secp256k1_fe_equal_var(&ge_quad.x, x));
3412 CHECK(secp256k1_fe_equal_var(&ge_even.x, x));
3413 CHECK(secp256k1_fe_equal_var(&ge_odd.x, x));
3414
3415 /* Check that the Y coordinate result in ge_quad is a square. */
3416 CHECK(secp256k1_fe_is_quad_var(&ge_quad.y));
3417
3418 /* Check odd/even Y in ge_odd, ge_even. */
3419 CHECK(secp256k1_fe_is_odd(&ge_odd.y));
3420 CHECK(!secp256k1_fe_is_odd(&ge_even.y));
3421
3422 /* Check secp256k1_gej_has_quad_y_var. */
3423 secp256k1_gej_set_ge(&gej_quad, &ge_quad);
3425 do {
3426 random_fe_test(&fez);
3427 } while (secp256k1_fe_is_zero(&fez));
3428 secp256k1_gej_rescale(&gej_quad, &fez);
3430 secp256k1_gej_neg(&gej_quad, &gej_quad);
3432 do {
3433 random_fe_test(&fez);
3434 } while (secp256k1_fe_is_zero(&fez));
3435 secp256k1_gej_rescale(&gej_quad, &fez);
3437 secp256k1_gej_neg(&gej_quad, &gej_quad);
3439 }
3440}
3441
3443 int i;
3444 for (i = 0; i < count * 4; i++) {
3445 secp256k1_fe fe;
3446 random_fe_test(&fe);
3448 }
3449}
3450
3451/***** ECMULT TESTS *****/
3452
3453void test_pre_g_table(const secp256k1_ge_storage * pre_g, size_t n) {
3454 /* Tests the pre_g / pre_g_128 tables for consistency.
3455 * For independent verification we take a "geometric" approach to verification.
3456 * We check that every entry is on-curve.
3457 * We check that for consecutive entries p and q, that p + gg - q = 0 by checking
3458 * (1) p, gg, and -q are colinear.
3459 * (2) p, gg, and -q are all distinct.
3460 * where gg is twice the generator, where the generator is the first table entry.
3461 *
3462 * Checking the table's generators are correct is done in run_ecmult_pre_g.
3463 */
3464 secp256k1_gej g2;
3465 secp256k1_ge p, q, gg;
3466 secp256k1_fe dpx, dpy, dqx, dqy;
3467 size_t i;
3468
3469 CHECK(0 < n);
3470
3471 secp256k1_ge_from_storage(&p, &pre_g[0]);
3473
3474 secp256k1_gej_set_ge(&g2, &p);
3475 secp256k1_gej_double_var(&g2, &g2, NULL);
3476 secp256k1_ge_set_gej_var(&gg, &g2);
3477 for (i = 1; i < n; ++i) {
3478 secp256k1_fe_negate(&dpx, &p.x, 1); secp256k1_fe_add(&dpx, &gg.x); secp256k1_fe_normalize_weak(&dpx);
3479 secp256k1_fe_negate(&dpy, &p.y, 1); secp256k1_fe_add(&dpy, &gg.y); secp256k1_fe_normalize_weak(&dpy);
3480 /* Check that p is not equal to gg */
3482
3483 secp256k1_ge_from_storage(&q, &pre_g[i]);
3485
3486 secp256k1_fe_negate(&dqx, &q.x, 1); secp256k1_fe_add(&dqx, &gg.x); secp256k1_fe_normalize_weak(&dqx);
3487 dqy = q.y; secp256k1_fe_add(&dqy, &gg.y); secp256k1_fe_normalize_weak(&dqy);
3488 /* Check that -q is not equal to gg */
3490
3491 /* Check that -q is not equal to p */
3492 CHECK(!secp256k1_fe_equal_var(&dpx, &dqx) || !secp256k1_fe_equal_var(&dpy, &dqy));
3493
3494 /* Check that p, -q and gg are colinear */
3495 secp256k1_fe_mul(&dpx, &dpx, &dqy);
3496 secp256k1_fe_mul(&dpy, &dpy, &dqx);
3497 CHECK(secp256k1_fe_equal_var(&dpx, &dpy));
3498
3499 p = q;
3500 }
3501}
3502
3505 secp256k1_gej gj;
3506 secp256k1_ge g;
3507 size_t i;
3508
3509 /* Check that the pre_g and pre_g_128 tables are consistent. */
3512
3513 /* Check the first entry from the pre_g table. */
3515 CHECK(secp256k1_memcmp_var(&gs, &secp256k1_pre_g[0], sizeof(gs)) == 0);
3516
3517 /* Check the first entry from the pre_g_128 table. */
3519 for (i = 0; i < 128; ++i) {
3520 secp256k1_gej_double_var(&gj, &gj, NULL);
3521 }
3522 secp256k1_ge_set_gej(&g, &gj);
3523 secp256k1_ge_to_storage(&gs, &g);
3524 CHECK(secp256k1_memcmp_var(&gs, &secp256k1_pre_g_128[0], sizeof(gs)) == 0);
3525}
3526
3528 /* random starting point A (on the curve) */
3530 0x8b30bbe9, 0xae2a9906, 0x96b22f67, 0x0709dff3,
3531 0x727fd8bc, 0x04d3362c, 0x6c7bf458, 0xe2846004,
3532 0xa357ae91, 0x5c4a6528, 0x1309edf2, 0x0504740f,
3533 0x0eb33439, 0x90216b4f, 0x81063cb6, 0x5f2f7e0f
3534 );
3535 /* two random initial factors xn and gn */
3537 0x84cc5452, 0xf7fde1ed, 0xb4d38a8c, 0xe9b1b84c,
3538 0xcef31f14, 0x6e569be9, 0x705d357a, 0x42985407
3539 );
3541 0xa1e58d22, 0x553dcd42, 0xb2398062, 0x5d4c57a9,
3542 0x6e9323d4, 0x2b3152e5, 0xca2c3990, 0xedc7c9de
3543 );
3544 /* two small multipliers to be applied to xn and gn in every iteration: */
3545 static const secp256k1_scalar xf = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0x1337);
3546 static const secp256k1_scalar gf = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0x7113);
3547 /* accumulators with the resulting coefficients to A and G */
3548 secp256k1_scalar ae = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1);
3549 secp256k1_scalar ge = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0);
3550 /* actual points */
3551 secp256k1_gej x;
3552 secp256k1_gej x2;
3553 int i;
3554
3555 /* the point being computed */
3556 x = a;
3557 for (i = 0; i < 200*count; i++) {
3558 /* in each iteration, compute X = xn*X + gn*G; */
3559 secp256k1_ecmult(&x, &x, &xn, &gn);
3560 /* also compute ae and ge: the actual accumulated factors for A and G */
3561 /* if X was (ae*A+ge*G), xn*X + gn*G results in (xn*ae*A + (xn*ge+gn)*G) */
3562 secp256k1_scalar_mul(&ae, &ae, &xn);
3563 secp256k1_scalar_mul(&ge, &ge, &xn);
3564 secp256k1_scalar_add(&ge, &ge, &gn);
3565 /* modify xn and gn */
3566 secp256k1_scalar_mul(&xn, &xn, &xf);
3567 secp256k1_scalar_mul(&gn, &gn, &gf);
3568
3569 /* verify */
3570 if (i == 19999) {
3571 /* expected result after 19999 iterations */
3573 0xD6E96687, 0xF9B10D09, 0x2A6F3543, 0x9D86CEBE,
3574 0xA4535D0D, 0x409F5358, 0x6440BD74, 0xB933E830,
3575 0xB95CBCA2, 0xC77DA786, 0x539BE8FD, 0x53354D2D,
3576 0x3B4F566A, 0xE6580454, 0x07ED6015, 0xEE1B2A88
3577 );
3578
3579 secp256k1_gej_neg(&rp, &rp);
3580 secp256k1_gej_add_var(&rp, &rp, &x, NULL);
3582 }
3583 }
3584 /* redo the computation, but directly with the resulting ae and ge coefficients: */
3585 secp256k1_ecmult(&x2, &a, &ae, &ge);
3586 secp256k1_gej_neg(&x2, &x2);
3587 secp256k1_gej_add_var(&x2, &x2, &x, NULL);
3589}
3590
3592 /* X * (point + G) + (order-X) * (pointer + G) = 0 */
3595 secp256k1_scalar zero = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0);
3596 secp256k1_scalar one = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1);
3597 secp256k1_gej res1, res2;
3598 secp256k1_ge res3;
3599 unsigned char pub[65];
3600 size_t psize = 65;
3602 secp256k1_scalar_negate(&nx, &x);
3603 secp256k1_ecmult(&res1, point, &x, &x); /* calc res1 = x * point + x * G; */
3604 secp256k1_ecmult(&res2, point, &nx, &nx); /* calc res2 = (order - x) * point + (order - x) * G; */
3605 secp256k1_gej_add_var(&res1, &res1, &res2, NULL);
3607 secp256k1_ge_set_gej(&res3, &res1);
3609 CHECK(secp256k1_ge_is_valid_var(&res3) == 0);
3610 CHECK(secp256k1_eckey_pubkey_serialize(&res3, pub, &psize, 0) == 0);
3611 psize = 65;
3612 CHECK(secp256k1_eckey_pubkey_serialize(&res3, pub, &psize, 1) == 0);
3613 /* check zero/one edge cases */
3614 secp256k1_ecmult(&res1, point, &zero, &zero);
3615 secp256k1_ge_set_gej(&res3, &res1);
3617 secp256k1_ecmult(&res1, point, &one, &zero);
3618 secp256k1_ge_set_gej(&res3, &res1);
3619 ge_equals_gej(&res3, point);
3620 secp256k1_ecmult(&res1, point, &zero, &one);
3621 secp256k1_ge_set_gej(&res3, &res1);
3623}
3624
3625/* These scalars reach large (in absolute value) outputs when fed to secp256k1_scalar_split_lambda.
3626 *
3627 * They are computed as:
3628 * - For a in [-2, -1, 0, 1, 2]:
3629 * - For b in [-3, -1, 1, 3]:
3630 * - Output (a*LAMBDA + (ORDER+b)/2) % ORDER
3631 */
3633 SECP256K1_SCALAR_CONST(0xd938a566, 0x7f479e3e, 0xb5b3c7fa, 0xefdb3749, 0x3aa0585c, 0xc5ea2367, 0xe1b660db, 0x0209e6fc),
3634 SECP256K1_SCALAR_CONST(0xd938a566, 0x7f479e3e, 0xb5b3c7fa, 0xefdb3749, 0x3aa0585c, 0xc5ea2367, 0xe1b660db, 0x0209e6fd),
3635 SECP256K1_SCALAR_CONST(0xd938a566, 0x7f479e3e, 0xb5b3c7fa, 0xefdb3749, 0x3aa0585c, 0xc5ea2367, 0xe1b660db, 0x0209e6fe),
3636 SECP256K1_SCALAR_CONST(0xd938a566, 0x7f479e3e, 0xb5b3c7fa, 0xefdb3749, 0x3aa0585c, 0xc5ea2367, 0xe1b660db, 0x0209e6ff),
3637 SECP256K1_SCALAR_CONST(0x2c9c52b3, 0x3fa3cf1f, 0x5ad9e3fd, 0x77ed9ba5, 0xb294b893, 0x3722e9a5, 0x00e698ca, 0x4cf7632d),
3638 SECP256K1_SCALAR_CONST(0x2c9c52b3, 0x3fa3cf1f, 0x5ad9e3fd, 0x77ed9ba5, 0xb294b893, 0x3722e9a5, 0x00e698ca, 0x4cf7632e),
3639 SECP256K1_SCALAR_CONST(0x2c9c52b3, 0x3fa3cf1f, 0x5ad9e3fd, 0x77ed9ba5, 0xb294b893, 0x3722e9a5, 0x00e698ca, 0x4cf7632f),
3640 SECP256K1_SCALAR_CONST(0x2c9c52b3, 0x3fa3cf1f, 0x5ad9e3fd, 0x77ed9ba5, 0xb294b893, 0x3722e9a5, 0x00e698ca, 0x4cf76330),
3641 SECP256K1_SCALAR_CONST(0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xd576e735, 0x57a4501d, 0xdfe92f46, 0x681b209f),
3642 SECP256K1_SCALAR_CONST(0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xd576e735, 0x57a4501d, 0xdfe92f46, 0x681b20a0),
3643 SECP256K1_SCALAR_CONST(0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xd576e735, 0x57a4501d, 0xdfe92f46, 0x681b20a1),
3644 SECP256K1_SCALAR_CONST(0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xd576e735, 0x57a4501d, 0xdfe92f46, 0x681b20a2),
3645 SECP256K1_SCALAR_CONST(0xd363ad4c, 0xc05c30e0, 0xa5261c02, 0x88126459, 0xf85915d7, 0x7825b696, 0xbeebc5c2, 0x833ede11),
3646 SECP256K1_SCALAR_CONST(0xd363ad4c, 0xc05c30e0, 0xa5261c02, 0x88126459, 0xf85915d7, 0x7825b696, 0xbeebc5c2, 0x833ede12),
3647 SECP256K1_SCALAR_CONST(0xd363ad4c, 0xc05c30e0, 0xa5261c02, 0x88126459, 0xf85915d7, 0x7825b696, 0xbeebc5c2, 0x833ede13),
3648 SECP256K1_SCALAR_CONST(0xd363ad4c, 0xc05c30e0, 0xa5261c02, 0x88126459, 0xf85915d7, 0x7825b696, 0xbeebc5c2, 0x833ede14),
3649 SECP256K1_SCALAR_CONST(0x26c75a99, 0x80b861c1, 0x4a4c3805, 0x1024c8b4, 0x704d760e, 0xe95e7cd3, 0xde1bfdb1, 0xce2c5a42),
3650 SECP256K1_SCALAR_CONST(0x26c75a99, 0x80b861c1, 0x4a4c3805, 0x1024c8b4, 0x704d760e, 0xe95e7cd3, 0xde1bfdb1, 0xce2c5a43),
3651 SECP256K1_SCALAR_CONST(0x26c75a99, 0x80b861c1, 0x4a4c3805, 0x1024c8b4, 0x704d760e, 0xe95e7cd3, 0xde1bfdb1, 0xce2c5a44),
3652 SECP256K1_SCALAR_CONST(0x26c75a99, 0x80b861c1, 0x4a4c3805, 0x1024c8b4, 0x704d760e, 0xe95e7cd3, 0xde1bfdb1, 0xce2c5a45)
3653};
3654
3655void test_ecmult_target(const secp256k1_scalar* target, int mode) {
3656 /* Mode: 0=ecmult_gen, 1=ecmult, 2=ecmult_const */
3657 secp256k1_scalar n1, n2;
3658 secp256k1_ge p;
3659 secp256k1_gej pj, p1j, p2j, ptj;
3660 static const secp256k1_scalar zero = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0);
3661
3662 /* Generate random n1,n2 such that n1+n2 = -target. */
3664 secp256k1_scalar_add(&n2, &n1, target);
3665 secp256k1_scalar_negate(&n2, &n2);
3666
3667 /* Generate a random input point. */
3668 if (mode != 0) {
3670 secp256k1_gej_set_ge(&pj, &p);
3671 }
3672
3673 /* EC multiplications */
3674 if (mode == 0) {
3677 secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &ptj, target);
3678 } else if (mode == 1) {
3679 secp256k1_ecmult(&p1j, &pj, &n1, &zero);
3680 secp256k1_ecmult(&p2j, &pj, &n2, &zero);
3681 secp256k1_ecmult(&ptj, &pj, target, &zero);
3682 } else {
3683 secp256k1_ecmult_const(&p1j, &p, &n1, 256);
3684 secp256k1_ecmult_const(&p2j, &p, &n2, 256);
3685 secp256k1_ecmult_const(&ptj, &p, target, 256);
3686 }
3687
3688 /* Add them all up: n1*P + n2*P + target*P = (n1+n2+target)*P = (n1+n1-n1-n2)*P = 0. */
3689 secp256k1_gej_add_var(&ptj, &ptj, &p1j, NULL);
3690 secp256k1_gej_add_var(&ptj, &ptj, &p2j, NULL);
3692}
3693
3695 int i;
3696 unsigned j;
3697 for (i = 0; i < 4*count; ++i) {
3698 for (j = 0; j < sizeof(scalars_near_split_bounds) / sizeof(scalars_near_split_bounds[0]); ++j) {
3702 }
3703 }
3704}
3705
3707 int i;
3708 secp256k1_fe x = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 2);
3709 static const secp256k1_fe xr = SECP256K1_FE_CONST(
3710 0x7603CB59, 0xB0EF6C63, 0xFE608479, 0x2A0C378C,
3711 0xDB3233A8, 0x0F8A9A09, 0xA877DEAD, 0x31B38C45
3712 );
3713 for (i = 0; i < 500; i++) {
3714 secp256k1_ge p;
3715 if (secp256k1_ge_set_xo_var(&p, &x, 1)) {
3716 secp256k1_gej j;
3718 secp256k1_gej_set_ge(&j, &p);
3720 }
3721 secp256k1_fe_sqr(&x, &x);
3722 }
3724 CHECK(secp256k1_fe_equal_var(&x, &xr));
3725}
3726
3728 /* random starting point A (on the curve) */
3730 0x6d986544, 0x57ff52b8, 0xcf1b8126, 0x5b802a5b,
3731 0xa97f9263, 0xb1e88044, 0x93351325, 0x91bc450a,
3732 0x535c59f7, 0x325e5d2b, 0xc391fbe8, 0x3c12787c,
3733 0x337e4a98, 0xe82a9011, 0x0123ba37, 0xdd769c7d
3734 );
3735 /* random initial factor xn */
3737 0x649d4f77, 0xc4242df7, 0x7f2079c9, 0x14530327,
3738 0xa31b876a, 0xd2d8ce2a, 0x2236d5c6, 0xd7b2029b
3739 );
3740 /* expected xn * A (from sage) */
3741 secp256k1_ge expected_b = SECP256K1_GE_CONST(
3742 0x23773684, 0x4d209dc7, 0x098a786f, 0x20d06fcd,
3743 0x070a38bf, 0xc11ac651, 0x03004319, 0x1e2a8786,
3744 0xed8c3b8e, 0xc06dd57b, 0xd06ea66e, 0x45492b0f,
3745 0xb84e4e1b, 0xfb77e21f, 0x96baae2a, 0x63dec956
3746 );
3747 secp256k1_gej b;
3748 secp256k1_ecmult_const(&b, &a, &xn, 256);
3749
3751 ge_equals_gej(&expected_b, &b);
3752}
3753
3757 secp256k1_gej res1;
3758 secp256k1_gej res2;
3759 secp256k1_ge mid1;
3760 secp256k1_ge mid2;
3763
3766 secp256k1_ge_set_gej(&mid1, &res1);
3767 secp256k1_ge_set_gej(&mid2, &res2);
3768 secp256k1_ecmult_const(&res1, &mid1, &b, 256);
3769 secp256k1_ecmult_const(&res2, &mid2, &a, 256);
3770 secp256k1_ge_set_gej(&mid1, &res1);
3771 secp256k1_ge_set_gej(&mid2, &res2);
3772 ge_equals_ge(&mid1, &mid2);
3773}
3774
3776 secp256k1_scalar zero = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0);
3777 secp256k1_scalar one = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1);
3778 secp256k1_scalar negone;
3779 secp256k1_gej res1;
3780 secp256k1_ge res2;
3781 secp256k1_ge point;
3782 secp256k1_scalar_negate(&negone, &one);
3783
3785 secp256k1_ecmult_const(&res1, &point, &zero, 3);
3786 secp256k1_ge_set_gej(&res2, &res1);
3788 secp256k1_ecmult_const(&res1, &point, &one, 2);
3789 secp256k1_ge_set_gej(&res2, &res1);
3790 ge_equals_ge(&res2, &point);
3791 secp256k1_ecmult_const(&res1, &point, &negone, 256);
3792 secp256k1_gej_neg(&res1, &res1);
3793 secp256k1_ge_set_gej(&res2, &res1);
3794 ge_equals_ge(&res2, &point);
3795}
3796
3798 /* Check known result (randomly generated test problem from sage) */
3800 0x4968d524, 0x2abf9b7a, 0x466abbcf, 0x34b11b6d,
3801 0xcd83d307, 0x827bed62, 0x05fad0ce, 0x18fae63b
3802 );
3803 const secp256k1_gej expected_point = SECP256K1_GEJ_CONST(
3804 0x5494c15d, 0x32099706, 0xc2395f94, 0x348745fd,
3805 0x757ce30e, 0x4e8c90fb, 0xa2bad184, 0xf883c69f,
3806 0x5d195d20, 0xe191bf7f, 0x1be3e55f, 0x56a80196,
3807 0x6071ad01, 0xf1462f66, 0xc997fa94, 0xdb858435
3808 );
3809 secp256k1_gej point;
3810 secp256k1_ge res;
3811 int i;
3812
3814 for (i = 0; i < 100; ++i) {
3815 secp256k1_ge tmp;
3816 secp256k1_ge_set_gej(&tmp, &point);
3817 secp256k1_ecmult_const(&point, &tmp, &scalar, 256);
3818 }
3819 secp256k1_ge_set_gej(&res, &point);
3820 ge_equals_gej(&res, &expected_point);
3821}
3822
3828}
3829
3830typedef struct {
3834
3835static int ecmult_multi_callback(secp256k1_scalar *sc, secp256k1_ge *pt, size_t idx, void *cbdata) {
3836 ecmult_multi_data *data = (ecmult_multi_data*) cbdata;
3837 *sc = data->sc[idx];
3838 *pt = data->pt[idx];
3839 return 1;
3840}
3841
3842static int ecmult_multi_false_callback(secp256k1_scalar *sc, secp256k1_ge *pt, size_t idx, void *cbdata) {
3843 (void)sc;
3844 (void)pt;
3845 (void)idx;
3846 (void)cbdata;
3847 return 0;
3848}
3849
3851 int ncount;
3852 secp256k1_scalar szero;
3853 secp256k1_scalar sc[32];
3854 secp256k1_ge pt[32];
3855 secp256k1_gej r;
3856 secp256k1_gej r2;
3857 ecmult_multi_data data;
3858
3859 data.sc = sc;
3860 data.pt = pt;
3861 secp256k1_scalar_set_int(&szero, 0);
3862
3863 /* No points to multiply */
3864 CHECK(ecmult_multi(&ctx->error_callback, scratch, &r, NULL, ecmult_multi_callback, &data, 0));
3865
3866 /* Check 1- and 2-point multiplies against ecmult */
3867 for (ncount = 0; ncount < count; ncount++) {
3868 secp256k1_ge ptg;
3869 secp256k1_gej ptgj;
3870 random_scalar_order(&sc[0]);
3871 random_scalar_order(&sc[1]);
3872
3874 secp256k1_gej_set_ge(&ptgj, &ptg);
3875 pt[0] = ptg;
3876 pt[1] = secp256k1_ge_const_g;
3877
3878 /* only G scalar */
3879 secp256k1_ecmult(&r2, &ptgj, &szero, &sc[0]);
3880 CHECK(ecmult_multi(&ctx->error_callback, scratch, &r, &sc[0], ecmult_multi_callback, &data, 0));
3881 secp256k1_gej_neg(&r2, &r2);
3882 secp256k1_gej_add_var(&r, &r, &r2, NULL);
3884
3885 /* 1-point */
3886 secp256k1_ecmult(&r2, &ptgj, &sc[0], &szero);
3887 CHECK(ecmult_multi(&ctx->error_callback, scratch, &r, &szero, ecmult_multi_callback, &data, 1));
3888 secp256k1_gej_neg(&r2, &r2);
3889 secp256k1_gej_add_var(&r, &r, &r2, NULL);
3891
3892 /* Try to multiply 1 point, but callback returns false */
3893 CHECK(!ecmult_multi(&ctx->error_callback, scratch, &r, &szero, ecmult_multi_false_callback, &data, 1));
3894
3895 /* 2-point */
3896 secp256k1_ecmult(&r2, &ptgj, &sc[0], &sc[1]);
3897 CHECK(ecmult_multi(&ctx->error_callback, scratch, &r, &szero, ecmult_multi_callback, &data, 2));
3898 secp256k1_gej_neg(&r2, &r2);
3899 secp256k1_gej_add_var(&r, &r, &r2, NULL);
3901
3902 /* 2-point with G scalar */
3903 secp256k1_ecmult(&r2, &ptgj, &sc[0], &sc[1]);
3904 CHECK(ecmult_multi(&ctx->error_callback, scratch, &r, &sc[1], ecmult_multi_callback, &data, 1));
3905 secp256k1_gej_neg(&r2, &r2);
3906 secp256k1_gej_add_var(&r, &r, &r2, NULL);
3908 }
3909
3910 /* Check infinite outputs of various forms */
3911 for (ncount = 0; ncount < count; ncount++) {
3912 secp256k1_ge ptg;
3913 size_t i, j;
3914 size_t sizes[] = { 2, 10, 32 };
3915
3916 for (j = 0; j < 3; j++) {
3917 for (i = 0; i < 32; i++) {
3918 random_scalar_order(&sc[i]);
3920 }
3921 CHECK(ecmult_multi(&ctx->error_callback, scratch, &r, &szero, ecmult_multi_callback, &data, sizes[j]));
3923 }
3924
3925 for (j = 0; j < 3; j++) {
3926 for (i = 0; i < 32; i++) {
3928 pt[i] = ptg;
3929 secp256k1_scalar_set_int(&sc[i], 0);
3930 }
3931 CHECK(ecmult_multi(&ctx->error_callback, scratch, &r, &szero, ecmult_multi_callback, &data, sizes[j]));
3933 }
3934
3935 for (j = 0; j < 3; j++) {
3937 for (i = 0; i < 16; i++) {
3938 random_scalar_order(&sc[2*i]);
3939 secp256k1_scalar_negate(&sc[2*i + 1], &sc[2*i]);
3940 pt[2 * i] = ptg;
3941 pt[2 * i + 1] = ptg;
3942 }
3943
3944 CHECK(ecmult_multi(&ctx->error_callback, scratch, &r, &szero, ecmult_multi_callback, &data, sizes[j]));
3946
3947 random_scalar_order(&sc[0]);
3948 for (i = 0; i < 16; i++) {
3950
3951 sc[2*i] = sc[0];
3952 sc[2*i+1] = sc[0];
3953 pt[2 * i] = ptg;
3954 secp256k1_ge_neg(&pt[2*i+1], &pt[2*i]);
3955 }
3956
3957 CHECK(ecmult_multi(&ctx->error_callback, scratch, &r, &szero, ecmult_multi_callback, &data, sizes[j]));
3959 }
3960
3962 secp256k1_scalar_set_int(&sc[0], 0);
3963 pt[0] = ptg;
3964 for (i = 1; i < 32; i++) {
3965 pt[i] = ptg;
3966
3967 random_scalar_order(&sc[i]);
3968 secp256k1_scalar_add(&sc[0], &sc[0], &sc[i]);
3969 secp256k1_scalar_negate(&sc[i], &sc[i]);
3970 }
3971
3972 CHECK(ecmult_multi(&ctx->error_callback, scratch, &r, &szero, ecmult_multi_callback, &data, 32));
3974 }
3975
3976 /* Check random points, constant scalar */
3977 for (ncount = 0; ncount < count; ncount++) {
3978 size_t i;
3980
3981 random_scalar_order(&sc[0]);
3982 for (i = 0; i < 20; i++) {
3983 secp256k1_ge ptg;
3984 sc[i] = sc[0];
3986 pt[i] = ptg;
3987 secp256k1_gej_add_ge_var(&r, &r, &pt[i], NULL);
3988 }
3989
3990 secp256k1_ecmult(&r2, &r, &sc[0], &szero);
3991 CHECK(ecmult_multi(&ctx->error_callback, scratch, &r, &szero, ecmult_multi_callback, &data, 20));
3992 secp256k1_gej_neg(&r2, &r2);
3993 secp256k1_gej_add_var(&r, &r, &r2, NULL);
3995 }
3996
3997 /* Check random scalars, constant point */
3998 for (ncount = 0; ncount < count; ncount++) {
3999 size_t i;
4000 secp256k1_ge ptg;
4001 secp256k1_gej p0j;
4004
4006 for (i = 0; i < 20; i++) {
4007 random_scalar_order(&sc[i]);
4008 pt[i] = ptg;
4009 secp256k1_scalar_add(&rs, &rs, &sc[i]);
4010 }
4011
4012 secp256k1_gej_set_ge(&p0j, &pt[0]);
4013 secp256k1_ecmult(&r2, &p0j, &rs, &szero);
4014 CHECK(ecmult_multi(&ctx->error_callback, scratch, &r, &szero, ecmult_multi_callback, &data, 20));
4015 secp256k1_gej_neg(&r2, &r2);
4016 secp256k1_gej_add_var(&r, &r, &r2, NULL);
4018 }
4019
4020 /* Sanity check that zero scalars don't cause problems */
4021 for (ncount = 0; ncount < 20; ncount++) {
4022 random_scalar_order(&sc[ncount]);
4023 random_group_element_test(&pt[ncount]);
4024 }
4025 secp256k1_scalar_clear(&sc[0]);
4026 CHECK(ecmult_multi(&ctx->error_callback, scratch, &r, &szero, ecmult_multi_callback, &data, 20));
4027 secp256k1_scalar_clear(&sc[1]);
4028 secp256k1_scalar_clear(&sc[2]);
4029 secp256k1_scalar_clear(&sc[3]);
4030 secp256k1_scalar_clear(&sc[4]);
4031 CHECK(ecmult_multi(&ctx->error_callback, scratch, &r, &szero, ecmult_multi_callback, &data, 6));
4032 CHECK(ecmult_multi(&ctx->error_callback, scratch, &r, &szero, ecmult_multi_callback, &data, 5));
4034
4035 /* Run through s0*(t0*P) + s1*(t1*P) exhaustively for many small values of s0, s1, t0, t1 */
4036 {
4037 const size_t TOP = 8;
4038 size_t s0i, s1i;
4039 size_t t0i, t1i;
4040 secp256k1_ge ptg;
4041 secp256k1_gej ptgj;
4042
4044 secp256k1_gej_set_ge(&ptgj, &ptg);
4045
4046 for(t0i = 0; t0i < TOP; t0i++) {
4047 for(t1i = 0; t1i < TOP; t1i++) {
4048 secp256k1_gej t0p, t1p;
4049 secp256k1_scalar t0, t1;
4050
4051 secp256k1_scalar_set_int(&t0, (t0i + 1) / 2);
4052 secp256k1_scalar_cond_negate(&t0, t0i & 1);
4053 secp256k1_scalar_set_int(&t1, (t1i + 1) / 2);
4054 secp256k1_scalar_cond_negate(&t1, t1i & 1);
4055
4056 secp256k1_ecmult(&t0p, &ptgj, &t0, &szero);
4057 secp256k1_ecmult(&t1p, &ptgj, &t1, &szero);
4058
4059 for(s0i = 0; s0i < TOP; s0i++) {
4060 for(s1i = 0; s1i < TOP; s1i++) {
4061 secp256k1_scalar tmp1, tmp2;
4062 secp256k1_gej expected, actual;
4063
4064 secp256k1_ge_set_gej(&pt[0], &t0p);
4065 secp256k1_ge_set_gej(&pt[1], &t1p);
4066
4067 secp256k1_scalar_set_int(&sc[0], (s0i + 1) / 2);
4068 secp256k1_scalar_cond_negate(&sc[0], s0i & 1);
4069 secp256k1_scalar_set_int(&sc[1], (s1i + 1) / 2);
4070 secp256k1_scalar_cond_negate(&sc[1], s1i & 1);
4071
4072 secp256k1_scalar_mul(&tmp1, &t0, &sc[0]);
4073 secp256k1_scalar_mul(&tmp2, &t1, &sc[1]);
4074 secp256k1_scalar_add(&tmp1, &tmp1, &tmp2);
4075
4076 secp256k1_ecmult(&expected, &ptgj, &tmp1, &szero);
4077 CHECK(ecmult_multi(&ctx->error_callback, scratch, &actual, &szero, ecmult_multi_callback, &data, 2));
4078 secp256k1_gej_neg(&expected, &expected);
4079 secp256k1_gej_add_var(&actual, &actual, &expected, NULL);
4081 }
4082 }
4083 }
4084 }
4085 }
4086}
4087
4089 /* Large random test for ecmult_multi_* functions which exercises:
4090 * - Few or many inputs (0 up to 128, roughly exponentially distributed).
4091 * - Few or many 0*P or a*INF inputs (roughly uniformly distributed).
4092 * - Including or excluding an nonzero a*G term (or such a term at all).
4093 * - Final expected result equal to infinity or not (roughly 50%).
4094 * - ecmult_multi_var, ecmult_strauss_single_batch, ecmult_pippenger_single_batch
4095 */
4096
4097 /* These 4 variables define the eventual input to the ecmult_multi function.
4098 * g_scalar is the G scalar fed to it (or NULL, possibly, if g_scalar=0), and
4099 * scalars[0..filled-1] and gejs[0..filled-1] are the scalars and points
4100 * which form its normal inputs. */
4101 int filled = 0;
4102 secp256k1_scalar g_scalar = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0);
4103 secp256k1_scalar scalars[128];
4104 secp256k1_gej gejs[128];
4105 /* The expected result, and the computed result. */
4106 secp256k1_gej expected, computed;
4107 /* Temporaries. */
4108 secp256k1_scalar sc_tmp;
4109 secp256k1_ge ge_tmp;
4110 /* Variables needed for the actual input to ecmult_multi. */
4111 secp256k1_ge ges[128];
4112 ecmult_multi_data data;
4113
4114 int i;
4115 /* Which multiplication function to use */
4116 int fn = secp256k1_testrand_int(3);
4120 /* Simulate exponentially distributed num. */
4121 int num_bits = 2 + secp256k1_testrand_int(6);
4122 /* Number of (scalar, point) inputs (excluding g). */
4123 int num = secp256k1_testrand_int((1 << num_bits) + 1);
4124 /* Number of those which are nonzero. */
4125 int num_nonzero = secp256k1_testrand_int(num + 1);
4126 /* Whether we're aiming to create an input with nonzero expected result. */
4127 int nonzero_result = secp256k1_testrand_bits(1);
4128 /* Whether we will provide nonzero g multiplicand. In some cases our hand
4129 * is forced here based on num_nonzero and nonzero_result. */
4130 int g_nonzero = num_nonzero == 0 ? nonzero_result :
4131 num_nonzero == 1 && !nonzero_result ? 1 :
4133 /* Which g_scalar pointer to pass into ecmult_multi(). */
4134 const secp256k1_scalar* g_scalar_ptr = (g_nonzero || secp256k1_testrand_bits(1)) ? &g_scalar : NULL;
4135 /* How many EC multiplications were performed in this function. */
4136 int mults = 0;
4137 /* How many randomization steps to apply to the input list. */
4138 int rands = (int)secp256k1_testrand_bits(3);
4139 if (rands > num_nonzero) rands = num_nonzero;
4140
4141 secp256k1_gej_set_infinity(&expected);
4143 secp256k1_scalar_set_int(&scalars[0], 0);
4144
4145 if (g_nonzero) {
4146 /* If g_nonzero, set g_scalar to nonzero value r. */
4147 random_scalar_order_test(&g_scalar);
4148 if (!nonzero_result) {
4149 /* If expected=0 is desired, add a (a*r, -(1/a)*g) term to compensate. */
4150 CHECK(num_nonzero > filled);
4151 random_scalar_order_test(&sc_tmp);
4152 secp256k1_scalar_mul(&scalars[filled], &sc_tmp, &g_scalar);
4153 secp256k1_scalar_inverse_var(&sc_tmp, &sc_tmp);
4154 secp256k1_scalar_negate(&sc_tmp, &sc_tmp);
4155 secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &gejs[filled], &sc_tmp);
4156 ++filled;
4157 ++mults;
4158 }
4159 }
4160
4161 if (nonzero_result && filled < num_nonzero) {
4162 /* If a nonzero result is desired, and there is space, add a random nonzero term. */
4163 random_scalar_order_test(&scalars[filled]);
4165 secp256k1_gej_set_ge(&gejs[filled], &ge_tmp);
4166 ++filled;
4167 }
4168
4169 if (nonzero_result) {
4170 /* Compute the expected result using normal ecmult. */
4171 CHECK(filled <= 1);
4172 secp256k1_ecmult(&expected, &gejs[0], &scalars[0], &g_scalar);
4173 mults += filled + g_nonzero;
4174 }
4175
4176 /* At this point we have expected = scalar_g*G + sum(scalars[i]*gejs[i] for i=0..filled-1). */
4177 CHECK(filled <= 1 + !nonzero_result);
4178 CHECK(filled <= num_nonzero);
4179
4180 /* Add entries to scalars,gejs so that there are num of them. All the added entries
4181 * either have scalar=0 or point=infinity, so these do not change the expected result. */
4182 while (filled < num) {
4183 if (secp256k1_testrand_bits(1)) {
4184 secp256k1_gej_set_infinity(&gejs[filled]);
4185 random_scalar_order_test(&scalars[filled]);
4186 } else {
4187 secp256k1_scalar_set_int(&scalars[filled], 0);
4189 secp256k1_gej_set_ge(&gejs[filled], &ge_tmp);
4190 }
4191 ++filled;
4192 }
4193
4194 /* Now perform cheapish transformations on gejs and scalars, for indices
4195 * 0..num_nonzero-1, which do not change the expected result, but may
4196 * convert some of them to be both non-0-scalar and non-infinity-point. */
4197 for (i = 0; i < rands; ++i) {
4198 int j;
4199 secp256k1_scalar v, iv;
4200 /* Shuffle the entries. */
4201 for (j = 0; j < num_nonzero; ++j) {
4202 int k = secp256k1_testrand_int(num_nonzero - j);
4203 if (k != 0) {
4204 secp256k1_gej gej = gejs[j];
4205 secp256k1_scalar sc = scalars[j];
4206 gejs[j] = gejs[j + k];
4207 scalars[j] = scalars[j + k];
4208 gejs[j + k] = gej;
4209 scalars[j + k] = sc;
4210 }
4211 }
4212 /* Perturb all consecutive pairs of inputs:
4213 * a*P + b*Q -> (a+b)*P + b*(Q-P). */
4214 for (j = 0; j + 1 < num_nonzero; j += 2) {
4215 secp256k1_gej gej;
4216 secp256k1_scalar_add(&scalars[j], &scalars[j], &scalars[j+1]);
4217 secp256k1_gej_neg(&gej, &gejs[j]);
4218 secp256k1_gej_add_var(&gejs[j+1], &gejs[j+1], &gej, NULL);
4219 }
4220 /* Transform the last input: a*P -> (v*a) * ((1/v)*P). */
4221 CHECK(num_nonzero >= 1);
4223 secp256k1_scalar_inverse(&iv, &v);
4224 secp256k1_scalar_mul(&scalars[num_nonzero - 1], &scalars[num_nonzero - 1], &v);
4225 secp256k1_ecmult(&gejs[num_nonzero - 1], &gejs[num_nonzero - 1], &iv, NULL);
4226 ++mults;
4227 }
4228
4229 /* Shuffle all entries (0..num-1). */
4230 for (i = 0; i < num; ++i) {
4231 int j = secp256k1_testrand_int(num - i);
4232 if (j != 0) {
4233 secp256k1_gej gej = gejs[i];
4234 secp256k1_scalar sc = scalars[i];
4235 gejs[i] = gejs[i + j];
4236 scalars[i] = scalars[i + j];
4237 gejs[i + j] = gej;
4238 scalars[i + j] = sc;
4239 }
4240 }
4241
4242 /* Compute affine versions of all inputs. */
4243 secp256k1_ge_set_all_gej_var(ges, gejs, filled);
4244 /* Invoke ecmult_multi code. */
4245 data.sc = scalars;
4246 data.pt = ges;
4247 CHECK(ecmult_multi(&ctx->error_callback, scratch, &computed, g_scalar_ptr, ecmult_multi_callback, &data, filled));
4248 mults += num_nonzero + g_nonzero;
4249 /* Compare with expected result. */
4250 secp256k1_gej_neg(&computed, &computed);
4251 secp256k1_gej_add_var(&computed, &computed, &expected, NULL);
4252 CHECK(secp256k1_gej_is_infinity(&computed));
4253 return mults;
4254}
4255
4257 secp256k1_scalar szero;
4259 secp256k1_ge pt;
4260 secp256k1_gej r;
4261 ecmult_multi_data data;
4262 secp256k1_scratch *scratch_empty;
4263
4266 data.sc = &sc;
4267 data.pt = &pt;
4268 secp256k1_scalar_set_int(&szero, 0);
4269
4270 /* Try to multiply 1 point, but scratch space is empty.*/
4271 scratch_empty = secp256k1_scratch_create(&ctx->error_callback, 0);
4272 CHECK(!ecmult_multi(&ctx->error_callback, scratch_empty, &r, &szero, ecmult_multi_callback, &data, 1));
4274}
4275
4277 int i;
4278
4280 for(i = 1; i <= PIPPENGER_MAX_BUCKET_WINDOW; i++) {
4281 /* Bucket_window of 8 is not used with endo */
4282 if (i == 8) {
4283 continue;
4284 }
4286 if (i != PIPPENGER_MAX_BUCKET_WINDOW) {
4288 }
4289 }
4290}
4291
4297 size_t scratch_size = secp256k1_testrand_bits(8);
4299 secp256k1_scratch *scratch;
4300 size_t n_points_supported;
4301 int bucket_window = 0;
4302
4303 for(; scratch_size < max_size; scratch_size+=256) {
4304 size_t i;
4305 size_t total_alloc;
4306 size_t checkpoint;
4307 scratch = secp256k1_scratch_create(&ctx->error_callback, scratch_size);
4308 CHECK(scratch != NULL);
4309 checkpoint = secp256k1_scratch_checkpoint(&ctx->error_callback, scratch);
4310 n_points_supported = secp256k1_pippenger_max_points(&ctx->error_callback, scratch);
4311 if (n_points_supported == 0) {
4313 continue;
4314 }
4315 bucket_window = secp256k1_pippenger_bucket_window(n_points_supported);
4316 /* allocate `total_alloc` bytes over `PIPPENGER_SCRATCH_OBJECTS` many allocations */
4317 total_alloc = secp256k1_pippenger_scratch_size(n_points_supported, bucket_window);
4318 for (i = 0; i < PIPPENGER_SCRATCH_OBJECTS - 1; i++) {
4320 total_alloc--;
4321 }
4322 CHECK(secp256k1_scratch_alloc(&ctx->error_callback, scratch, total_alloc));
4325 }
4326 CHECK(bucket_window == PIPPENGER_MAX_BUCKET_WINDOW);
4327}
4328
4330 size_t n_batches, n_batch_points, max_n_batch_points, n;
4331
4332 max_n_batch_points = 0;
4333 n = 1;
4334 CHECK(secp256k1_ecmult_multi_batch_size_helper(&n_batches, &n_batch_points, max_n_batch_points, n) == 0);
4335
4336 max_n_batch_points = 1;
4337 n = 0;
4338 CHECK(secp256k1_ecmult_multi_batch_size_helper(&n_batches, &n_batch_points, max_n_batch_points, n) == 1);
4339 CHECK(n_batches == 0);
4340 CHECK(n_batch_points == 0);
4341
4342 max_n_batch_points = 2;
4343 n = 5;
4344 CHECK(secp256k1_ecmult_multi_batch_size_helper(&n_batches, &n_batch_points, max_n_batch_points, n) == 1);
4345 CHECK(n_batches == 3);
4346 CHECK(n_batch_points == 2);
4347
4348 max_n_batch_points = ECMULT_MAX_POINTS_PER_BATCH;
4350 CHECK(secp256k1_ecmult_multi_batch_size_helper(&n_batches, &n_batch_points, max_n_batch_points, n) == 1);
4351 CHECK(n_batches == 1);
4352 CHECK(n_batch_points == ECMULT_MAX_POINTS_PER_BATCH);
4353
4354 max_n_batch_points = ECMULT_MAX_POINTS_PER_BATCH + 1;
4356 CHECK(secp256k1_ecmult_multi_batch_size_helper(&n_batches, &n_batch_points, max_n_batch_points, n) == 1);
4357 CHECK(n_batches == 2);
4358 CHECK(n_batch_points == ECMULT_MAX_POINTS_PER_BATCH/2 + 1);
4359
4360 max_n_batch_points = 1;
4361 n = SIZE_MAX;
4362 CHECK(secp256k1_ecmult_multi_batch_size_helper(&n_batches, &n_batch_points, max_n_batch_points, n) == 1);
4363 CHECK(n_batches == SIZE_MAX);
4364 CHECK(n_batch_points == 1);
4365
4366 max_n_batch_points = 2;
4367 n = SIZE_MAX;
4368 CHECK(secp256k1_ecmult_multi_batch_size_helper(&n_batches, &n_batch_points, max_n_batch_points, n) == 1);
4369 CHECK(n_batches == SIZE_MAX/2 + 1);
4370 CHECK(n_batch_points == 2);
4371}
4372
4378 static const int n_points = 2*ECMULT_PIPPENGER_THRESHOLD;
4379 secp256k1_scalar scG;
4380 secp256k1_scalar szero;
4383 secp256k1_gej r;
4384 secp256k1_gej r2;
4385 ecmult_multi_data data;
4386 int i;
4387 secp256k1_scratch *scratch;
4388
4390 secp256k1_scalar_set_int(&szero, 0);
4391
4392 /* Get random scalars and group elements and compute result */
4393 random_scalar_order(&scG);
4394 secp256k1_ecmult(&r2, &r2, &szero, &scG);
4395 for(i = 0; i < n_points; i++) {
4396 secp256k1_ge ptg;
4397 secp256k1_gej ptgj;
4399 secp256k1_gej_set_ge(&ptgj, &ptg);
4400 pt[i] = ptg;
4401 random_scalar_order(&sc[i]);
4402 secp256k1_ecmult(&ptgj, &ptgj, &sc[i], NULL);
4403 secp256k1_gej_add_var(&r2, &r2, &ptgj, NULL);
4404 }
4405 data.sc = sc;
4406 data.pt = pt;
4407 secp256k1_gej_neg(&r2, &r2);
4408
4409 /* Test with empty scratch space. It should compute the correct result using
4410 * ecmult_mult_simple algorithm which doesn't require a scratch space. */
4412 CHECK(secp256k1_ecmult_multi_var(&ctx->error_callback, scratch, &r, &scG, ecmult_multi_callback, &data, n_points));
4413 secp256k1_gej_add_var(&r, &r, &r2, NULL);
4416
4417 /* Test with space for 1 point in pippenger. That's not enough because
4418 * ecmult_multi selects strauss which requires more memory. It should
4419 * therefore select the simple algorithm. */
4421 CHECK(secp256k1_ecmult_multi_var(&ctx->error_callback, scratch, &r, &scG, ecmult_multi_callback, &data, n_points));
4422 secp256k1_gej_add_var(&r, &r, &r2, NULL);
4425
4426 for(i = 1; i <= n_points; i++) {
4428 int bucket_window = secp256k1_pippenger_bucket_window(i);
4429 size_t scratch_size = secp256k1_pippenger_scratch_size(i, bucket_window);
4431 } else {
4432 size_t scratch_size = secp256k1_strauss_scratch_size(i);
4434 }
4435 CHECK(secp256k1_ecmult_multi_var(&ctx->error_callback, scratch, &r, &scG, ecmult_multi_callback, &data, n_points));
4436 secp256k1_gej_add_var(&r, &r, &r2, NULL);
4439 }
4440 free(sc);
4441 free(pt);
4442}
4443
4445 secp256k1_scratch *scratch;
4446 int64_t todo = (int64_t)320 * count;
4447
4450 scratch = secp256k1_scratch_create(&ctx->error_callback, 819200);
4457 while (todo > 0) {
4458 todo -= test_ecmult_multi_random(scratch);
4459 }
4461
4462 /* Run test_ecmult_multi with space for exactly one point */
4466
4469}
4470
4471void test_wnaf(const secp256k1_scalar *number, int w) {
4472 secp256k1_scalar x, two, t;
4473 int wnaf[256];
4474 int zeroes = -1;
4475 int i;
4476 int bits;
4478 secp256k1_scalar_set_int(&two, 2);
4479 bits = secp256k1_ecmult_wnaf(wnaf, 256, number, w);
4480 CHECK(bits <= 256);
4481 for (i = bits-1; i >= 0; i--) {
4482 int v = wnaf[i];
4483 secp256k1_scalar_mul(&x, &x, &two);
4484 if (v) {
4485 CHECK(zeroes == -1 || zeroes >= w-1); /* check that distance between non-zero elements is at least w-1 */
4486 zeroes=0;
4487 CHECK((v & 1) == 1); /* check non-zero elements are odd */
4488 CHECK(v <= (1 << (w-1)) - 1); /* check range below */
4489 CHECK(v >= -(1 << (w-1)) - 1); /* check range above */
4490 } else {
4491 CHECK(zeroes != -1); /* check that no unnecessary zero padding exists */
4492 zeroes++;
4493 }
4494 if (v >= 0) {
4496 } else {
4499 }
4500 secp256k1_scalar_add(&x, &x, &t);
4501 }
4502 CHECK(secp256k1_scalar_eq(&x, number)); /* check that wnaf represents number */
4503}
4504
4506 secp256k1_scalar neg1 = *number;
4507 secp256k1_scalar neg2 = *number;
4508 int sign1 = 1;
4509 int sign2 = 1;
4510
4511 if (!secp256k1_scalar_get_bits(&neg1, 0, 1)) {
4512 secp256k1_scalar_negate(&neg1, &neg1);
4513 sign1 = -1;
4514 }
4516 CHECK(sign1 == sign2);
4517 CHECK(secp256k1_scalar_eq(&neg1, &neg2));
4518}
4519
4520void test_constant_wnaf(const secp256k1_scalar *number, int w) {
4521 secp256k1_scalar x, shift;
4522 int wnaf[256] = {0};
4523 int i;
4524 int skew;
4525 int bits = 256;
4526 secp256k1_scalar num = *number;
4527 secp256k1_scalar scalar_skew;
4528
4530 secp256k1_scalar_set_int(&shift, 1 << w);
4531 for (i = 0; i < 16; ++i) {
4532 secp256k1_scalar_shr_int(&num, 8);
4533 }
4534 bits = 128;
4535 skew = secp256k1_wnaf_const(wnaf, &num, w, bits);
4536
4537 for (i = WNAF_SIZE_BITS(bits, w); i >= 0; --i) {
4539 int v = wnaf[i];
4540 CHECK(v != 0); /* check nonzero */
4541 CHECK(v & 1); /* check parity */
4542 CHECK(v > -(1 << w)); /* check range above */
4543 CHECK(v < (1 << w)); /* check range below */
4544
4545 secp256k1_scalar_mul(&x, &x, &shift);
4546 if (v >= 0) {
4548 } else {
4551 }
4552 secp256k1_scalar_add(&x, &x, &t);
4553 }
4554 /* Skew num because when encoding numbers as odd we use an offset */
4555 secp256k1_scalar_set_int(&scalar_skew, 1 << (skew == 2));
4556 secp256k1_scalar_add(&num, &num, &scalar_skew);
4557 CHECK(secp256k1_scalar_eq(&x, &num));
4558}
4559
4560void test_fixed_wnaf(const secp256k1_scalar *number, int w) {
4561 secp256k1_scalar x, shift;
4562 int wnaf[256] = {0};
4563 int i;
4564 int skew;
4565 secp256k1_scalar num = *number;
4566
4568 secp256k1_scalar_set_int(&shift, 1 << w);
4569 for (i = 0; i < 16; ++i) {
4570 secp256k1_scalar_shr_int(&num, 8);
4571 }
4572 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
4573
4574 for (i = WNAF_SIZE(w)-1; i >= 0; --i) {
4576 int v = wnaf[i];
4577 CHECK(v == 0 || v & 1); /* check parity */
4578 CHECK(v > -(1 << w)); /* check range above */
4579 CHECK(v < (1 << w)); /* check range below */
4580
4581 secp256k1_scalar_mul(&x, &x, &shift);
4582 if (v >= 0) {
4584 } else {
4587 }
4588 secp256k1_scalar_add(&x, &x, &t);
4589 }
4590 /* If skew is 1 then add 1 to num */
4591 secp256k1_scalar_cadd_bit(&num, 0, skew == 1);
4592 CHECK(secp256k1_scalar_eq(&x, &num));
4593}
4594
4595/* Checks that the first 8 elements of wnaf are equal to wnaf_expected and the
4596 * rest is 0.*/
4597void test_fixed_wnaf_small_helper(int *wnaf, int *wnaf_expected, int w) {
4598 int i;
4599 for (i = WNAF_SIZE(w)-1; i >= 8; --i) {
4600 CHECK(wnaf[i] == 0);
4601 }
4602 for (i = 7; i >= 0; --i) {
4603 CHECK(wnaf[i] == wnaf_expected[i]);
4604 }
4605}
4606
4608 int w = 4;
4609 int wnaf[256] = {0};
4610 int i;
4611 int skew;
4612 secp256k1_scalar num;
4613
4614 secp256k1_scalar_set_int(&num, 0);
4615 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
4616 for (i = WNAF_SIZE(w)-1; i >= 0; --i) {
4617 int v = wnaf[i];
4618 CHECK(v == 0);
4619 }
4620 CHECK(skew == 0);
4621
4622 secp256k1_scalar_set_int(&num, 1);
4623 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
4624 for (i = WNAF_SIZE(w)-1; i >= 1; --i) {
4625 int v = wnaf[i];
4626 CHECK(v == 0);
4627 }
4628 CHECK(wnaf[0] == 1);
4629 CHECK(skew == 0);
4630
4631 {
4632 int wnaf_expected[8] = { 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf };
4633 secp256k1_scalar_set_int(&num, 0xffffffff);
4634 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
4635 test_fixed_wnaf_small_helper(wnaf, wnaf_expected, w);
4636 CHECK(skew == 0);
4637 }
4638 {
4639 int wnaf_expected[8] = { -1, -1, -1, -1, -1, -1, -1, 0xf };
4640 secp256k1_scalar_set_int(&num, 0xeeeeeeee);
4641 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
4642 test_fixed_wnaf_small_helper(wnaf, wnaf_expected, w);
4643 CHECK(skew == 1);
4644 }
4645 {
4646 int wnaf_expected[8] = { 1, 0, 1, 0, 1, 0, 1, 0 };
4647 secp256k1_scalar_set_int(&num, 0x01010101);
4648 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
4649 test_fixed_wnaf_small_helper(wnaf, wnaf_expected, w);
4650 CHECK(skew == 0);
4651 }
4652 {
4653 int wnaf_expected[8] = { -0xf, 0, 0xf, -0xf, 0, 0xf, 1, 0 };
4654 secp256k1_scalar_set_int(&num, 0x01ef1ef1);
4655 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
4656 test_fixed_wnaf_small_helper(wnaf, wnaf_expected, w);
4657 CHECK(skew == 0);
4658 }
4659}
4660
4661void run_wnaf(void) {
4662 int i;
4663 secp256k1_scalar n = {{0}};
4664
4665 test_constant_wnaf(&n, 4);
4666 /* Sanity check: 1 and 2 are the smallest odd and even numbers and should
4667 * have easier-to-diagnose failure modes */
4668 n.d[0] = 1;
4669 test_constant_wnaf(&n, 4);
4670 n.d[0] = 2;
4671 test_constant_wnaf(&n, 4);
4672 /* Test -1, because it's a special case in wnaf_const */
4675 test_constant_wnaf(&n, 4);
4676
4677 /* Test -2, which may not lead to overflows in wnaf_const */
4680 test_constant_wnaf(&n, 4);
4681
4682 /* Test (1/2) - 1 = 1/-2 and 1/2 = (1/-2) + 1
4683 as corner cases of negation handling in wnaf_const */
4685 test_constant_wnaf(&n, 4);
4686
4688 test_constant_wnaf(&n, 4);
4689
4690 /* Test 0 for fixed wnaf */
4692 /* Random tests */
4693 for (i = 0; i < count; i++) {
4695 test_wnaf(&n, 4+(i%10));
4697 test_constant_wnaf(&n, 4 + (i % 10));
4698 test_fixed_wnaf(&n, 4 + (i % 10));
4699 }
4701 CHECK(secp256k1_scalar_cond_negate(&n, 1) == -1);
4705}
4706
4707static int test_ecmult_accumulate_cb(secp256k1_scalar* sc, secp256k1_ge* pt, size_t idx, void* data) {
4708 const secp256k1_scalar* indata = (const secp256k1_scalar*)data;
4709 *sc = *indata;
4711 CHECK(idx == 0);
4712 return 1;
4713}
4714
4716 /* Compute x*G in 6 different ways, serialize it uncompressed, and feed it into acc. */
4717 secp256k1_gej rj1, rj2, rj3, rj4, rj5, rj6, gj, infj;
4718 secp256k1_ge r;
4719 const secp256k1_scalar zero = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0);
4720 unsigned char bytes[65];
4721 size_t size = 65;
4725 secp256k1_ecmult(&rj2, &gj, x, &zero);
4726 secp256k1_ecmult(&rj3, &infj, &zero, x);
4727 secp256k1_ecmult_multi_var(NULL, scratch, &rj4, x, NULL, NULL, 0);
4728 secp256k1_ecmult_multi_var(NULL, scratch, &rj5, &zero, test_ecmult_accumulate_cb, (void*)x, 1);
4730 secp256k1_ge_set_gej_var(&r, &rj1);
4731 ge_equals_gej(&r, &rj2);
4732 ge_equals_gej(&r, &rj3);
4733 ge_equals_gej(&r, &rj4);
4734 ge_equals_gej(&r, &rj5);
4735 ge_equals_gej(&r, &rj6);
4736 if (secp256k1_ge_is_infinity(&r)) {
4737 /* Store infinity as 0x00 */
4738 const unsigned char zerobyte[1] = {0};
4739 secp256k1_sha256_write(acc, zerobyte, 1);
4740 } else {
4741 /* Store other points using their uncompressed serialization. */
4742 secp256k1_eckey_pubkey_serialize(&r, bytes, &size, 0);
4743 CHECK(size == 65);
4744 secp256k1_sha256_write(acc, bytes, size);
4745 }
4746}
4747
4749 /* Using test_ecmult_accumulate, test ecmult for:
4750 * - For i in 0..36:
4751 * - Key i
4752 * - Key -i
4753 * - For i in 0..255:
4754 * - For j in 1..255 (only odd values):
4755 * - Key (j*2^i) mod order
4756 */
4758 secp256k1_sha256 acc;
4759 unsigned char b32[32];
4760 int i, j;
4762
4763 /* Expected hash of all the computed points; created with an independent
4764 * implementation. */
4765 static const unsigned char expected32[32] = {
4766 0xe4, 0x71, 0x1b, 0x4d, 0x14, 0x1e, 0x68, 0x48,
4767 0xb7, 0xaf, 0x47, 0x2b, 0x4c, 0xd2, 0x04, 0x14,
4768 0x3a, 0x75, 0x87, 0x60, 0x1a, 0xf9, 0x63, 0x60,
4769 0xd0, 0xcb, 0x1f, 0xaa, 0x85, 0x9a, 0xb7, 0xb4
4770 };
4772 for (i = 0; i <= 36; ++i) {
4774 test_ecmult_accumulate(&acc, &x, scratch);
4776 test_ecmult_accumulate(&acc, &x, scratch);
4777 };
4778 for (i = 0; i < 256; ++i) {
4779 for (j = 1; j < 256; j += 2) {
4780 int k;
4782 for (k = 0; k < i; ++k) secp256k1_scalar_add(&x, &x, &x);
4783 test_ecmult_accumulate(&acc, &x, scratch);
4784 }
4785 }
4786 secp256k1_sha256_finalize(&acc, b32);
4787 CHECK(secp256k1_memcmp_var(b32, expected32, 32) == 0);
4788
4790}
4791
4792void test_ecmult_constants_sha(uint32_t prefix, size_t iter, const unsigned char* expected32) {
4793 /* Using test_ecmult_accumulate, test ecmult for:
4794 * - Key 0
4795 * - Key 1
4796 * - Key -1
4797 * - For i in range(iter):
4798 * - Key SHA256(LE32(prefix) || LE16(i))
4799 */
4801 secp256k1_sha256 acc;
4802 unsigned char b32[32];
4803 unsigned char inp[6];
4804 size_t i;
4806
4807 inp[0] = prefix & 0xFF;
4808 inp[1] = (prefix >> 8) & 0xFF;
4809 inp[2] = (prefix >> 16) & 0xFF;
4810 inp[3] = (prefix >> 24) & 0xFF;
4813 test_ecmult_accumulate(&acc, &x, scratch);
4815 test_ecmult_accumulate(&acc, &x, scratch);
4817 test_ecmult_accumulate(&acc, &x, scratch);
4818
4819 for (i = 0; i < iter; ++i) {
4820 secp256k1_sha256 gen;
4821 inp[4] = i & 0xff;
4822 inp[5] = (i >> 8) & 0xff;
4824 secp256k1_sha256_write(&gen, inp, sizeof(inp));
4825 secp256k1_sha256_finalize(&gen, b32);
4826 secp256k1_scalar_set_b32(&x, b32, NULL);
4827 test_ecmult_accumulate(&acc, &x, scratch);
4828 }
4829 secp256k1_sha256_finalize(&acc, b32);
4830 CHECK(secp256k1_memcmp_var(b32, expected32, 32) == 0);
4831
4833}
4834
4836 /* Expected hashes of all points in the tests below. Computed using an
4837 * independent implementation. */
4838 static const unsigned char expected32_6bit20[32] = {
4839 0x68, 0xb6, 0xed, 0x6f, 0x28, 0xca, 0xc9, 0x7f,
4840 0x8e, 0x8b, 0xd6, 0xc0, 0x61, 0x79, 0x34, 0x6e,
4841 0x5a, 0x8f, 0x2b, 0xbc, 0x3e, 0x1f, 0xc5, 0x2e,
4842 0x2a, 0xd0, 0x45, 0x67, 0x7f, 0x95, 0x95, 0x8e
4843 };
4844 static const unsigned char expected32_8bit8[32] = {
4845 0x8b, 0x65, 0x8e, 0xea, 0x86, 0xae, 0x3c, 0x95,
4846 0x90, 0xb6, 0x77, 0xa4, 0x8c, 0x76, 0xd9, 0xec,
4847 0xf5, 0xab, 0x8a, 0x2f, 0xfd, 0xdb, 0x19, 0x12,
4848 0x1a, 0xee, 0xe6, 0xb7, 0x6e, 0x05, 0x3f, 0xc6
4849 };
4850 /* For every combination of 6 bit positions out of 256, restricted to
4851 * 20-bit windows (i.e., the first and last bit position are no more than
4852 * 19 bits apart), all 64 bit patterns occur in the input scalars used in
4853 * this test. */
4854 CONDITIONAL_TEST(1, "test_ecmult_constants_sha 1024") {
4855 test_ecmult_constants_sha(4808378u, 1024, expected32_6bit20);
4856 }
4857
4858 /* For every combination of 8 consecutive bit positions, all 256 bit
4859 * patterns occur in the input scalars used in this test. */
4860 CONDITIONAL_TEST(3, "test_ecmult_constants_sha 2048") {
4861 test_ecmult_constants_sha(1607366309u, 2048, expected32_8bit8);
4862 }
4863
4864 CONDITIONAL_TEST(35, "test_ecmult_constants_2bit") {
4866 }
4867}
4868
4870 /* Test ecmult_gen() blinding and confirm that the blinding changes, the affine points match, and the z's don't match. */
4871 secp256k1_scalar key;
4873 unsigned char seed32[32];
4874 secp256k1_gej pgej;
4875 secp256k1_gej pgej2;
4876 secp256k1_gej i;
4877 secp256k1_ge pge;
4879 secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pgej, &key);
4880 secp256k1_testrand256(seed32);
4885 secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pgej2, &key);
4886 CHECK(!gej_xyz_equals_gej(&pgej, &pgej2));
4888 secp256k1_ge_set_gej(&pge, &pgej);
4889 ge_equals_gej(&pge, &pgej2);
4890}
4891
4893 /* Test ecmult_gen() blinding reset and confirm that the blinding is consistent. */
4895 secp256k1_gej initial;
4898 initial = ctx->ecmult_gen_ctx.initial;
4902}
4903
4905 int i;
4907 for (i = 0; i < 10; i++) {
4909 }
4910}
4911
4912/***** ENDOMORPHISH TESTS *****/
4914 secp256k1_scalar s, s1, slam;
4915 const unsigned char zero[32] = {0};
4916 unsigned char tmp[32];
4917
4918 secp256k1_scalar_split_lambda(&s1, &slam, full);
4919
4920 /* check slam*lambda + s1 == full */
4922 secp256k1_scalar_add(&s, &s, &s1);
4923 CHECK(secp256k1_scalar_eq(&s, full));
4924
4925 /* check that both are <= 128 bits in size */
4926 if (secp256k1_scalar_is_high(&s1)) {
4927 secp256k1_scalar_negate(&s1, &s1);
4928 }
4929 if (secp256k1_scalar_is_high(&slam)) {
4930 secp256k1_scalar_negate(&slam, &slam);
4931 }
4932
4933 secp256k1_scalar_get_b32(tmp, &s1);
4934 CHECK(secp256k1_memcmp_var(zero, tmp, 16) == 0);
4935 secp256k1_scalar_get_b32(tmp, &slam);
4936 CHECK(secp256k1_memcmp_var(zero, tmp, 16) == 0);
4937}
4938
4939
4941 unsigned i;
4942 static secp256k1_scalar s;
4950
4951 for (i = 0; i < 100U * count; ++i) {
4952 secp256k1_scalar full;
4954 test_scalar_split(&full);
4955 }
4956 for (i = 0; i < sizeof(scalars_near_split_bounds) / sizeof(scalars_near_split_bounds[0]); ++i) {
4958 }
4959}
4960
4961void ec_pubkey_parse_pointtest(const unsigned char *input, int xvalid, int yvalid) {
4962 unsigned char pubkeyc[65];
4963 secp256k1_pubkey pubkey;
4964 secp256k1_ge ge;
4965 size_t pubkeyclen;
4966 int32_t ecount;
4967 ecount = 0;
4969 for (pubkeyclen = 3; pubkeyclen <= 65; pubkeyclen++) {
4970 /* Smaller sizes are tested exhaustively elsewhere. */
4971 int32_t i;
4972 memcpy(&pubkeyc[1], input, 64);
4973 VG_UNDEF(&pubkeyc[pubkeyclen], 65 - pubkeyclen);
4974 for (i = 0; i < 256; i++) {
4975 /* Try all type bytes. */
4976 int xpass;
4977 int ypass;
4978 int ysign;
4979 pubkeyc[0] = i;
4980 /* What sign does this point have? */
4981 ysign = (input[63] & 1) + 2;
4982 /* For the current type (i) do we expect parsing to work? Handled all of compressed/uncompressed/hybrid. */
4983 xpass = xvalid && (pubkeyclen == 33) && ((i & 254) == 2);
4984 /* Do we expect a parse and re-serialize as uncompressed to give a matching y? */
4985 ypass = xvalid && yvalid && ((i & 4) == ((pubkeyclen == 65) << 2)) &&
4986 ((i == 4) || ((i & 251) == ysign)) && ((pubkeyclen == 33) || (pubkeyclen == 65));
4987 if (xpass || ypass) {
4988 /* These cases must parse. */
4989 unsigned char pubkeyo[65];
4990 size_t outl;
4991 memset(&pubkey, 0, sizeof(pubkey));
4992 VG_UNDEF(&pubkey, sizeof(pubkey));
4993 ecount = 0;
4994 CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, pubkeyclen) == 1);
4995 VG_CHECK(&pubkey, sizeof(pubkey));
4996 outl = 65;
4997 VG_UNDEF(pubkeyo, 65);
4998 CHECK(secp256k1_ec_pubkey_serialize(ctx, pubkeyo, &outl, &pubkey, SECP256K1_EC_COMPRESSED) == 1);
4999 VG_CHECK(pubkeyo, outl);
5000 CHECK(outl == 33);
5001 CHECK(secp256k1_memcmp_var(&pubkeyo[1], &pubkeyc[1], 32) == 0);
5002 CHECK((pubkeyclen != 33) || (pubkeyo[0] == pubkeyc[0]));
5003 if (ypass) {
5004 /* This test isn't always done because we decode with alternative signs, so the y won't match. */
5005 CHECK(pubkeyo[0] == ysign);
5006 CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 1);
5007 memset(&pubkey, 0, sizeof(pubkey));
5008 VG_UNDEF(&pubkey, sizeof(pubkey));
5009 secp256k1_pubkey_save(&pubkey, &ge);
5010 VG_CHECK(&pubkey, sizeof(pubkey));
5011 outl = 65;
5012 VG_UNDEF(pubkeyo, 65);
5013 CHECK(secp256k1_ec_pubkey_serialize(ctx, pubkeyo, &outl, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 1);
5014 VG_CHECK(pubkeyo, outl);
5015 CHECK(outl == 65);
5016 CHECK(pubkeyo[0] == 4);
5017 CHECK(secp256k1_memcmp_var(&pubkeyo[1], input, 64) == 0);
5018 }
5019 CHECK(ecount == 0);
5020 } else {
5021 /* These cases must fail to parse. */
5022 memset(&pubkey, 0xfe, sizeof(pubkey));
5023 ecount = 0;
5024 VG_UNDEF(&pubkey, sizeof(pubkey));
5025 CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, pubkeyclen) == 0);
5026 VG_CHECK(&pubkey, sizeof(pubkey));
5027 CHECK(ecount == 0);
5028 CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);
5029 CHECK(ecount == 1);
5030 }
5031 }
5032 }
5034}
5035
5037#define SECP256K1_EC_PARSE_TEST_NVALID (12)
5038 const unsigned char valid[SECP256K1_EC_PARSE_TEST_NVALID][64] = {
5039 {
5040 /* Point with leading and trailing zeros in x and y serialization. */
5041 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x52,
5042 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5043 0x00, 0x00, 0x64, 0xef, 0xa1, 0x7b, 0x77, 0x61, 0xe1, 0xe4, 0x27, 0x06, 0x98, 0x9f, 0xb4, 0x83,
5044 0xb8, 0xd2, 0xd4, 0x9b, 0xf7, 0x8f, 0xae, 0x98, 0x03, 0xf0, 0x99, 0xb8, 0x34, 0xed, 0xeb, 0x00
5045 },
5046 {
5047 /* Point with x equal to a 3rd root of unity.*/
5048 0x7a, 0xe9, 0x6a, 0x2b, 0x65, 0x7c, 0x07, 0x10, 0x6e, 0x64, 0x47, 0x9e, 0xac, 0x34, 0x34, 0xe9,
5049 0x9c, 0xf0, 0x49, 0x75, 0x12, 0xf5, 0x89, 0x95, 0xc1, 0x39, 0x6c, 0x28, 0x71, 0x95, 0x01, 0xee,
5050 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14,
5051 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee,
5052 },
5053 {
5054 /* Point with largest x. (1/2) */
5055 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5056 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2c,
5057 0x0e, 0x99, 0x4b, 0x14, 0xea, 0x72, 0xf8, 0xc3, 0xeb, 0x95, 0xc7, 0x1e, 0xf6, 0x92, 0x57, 0x5e,
5058 0x77, 0x50, 0x58, 0x33, 0x2d, 0x7e, 0x52, 0xd0, 0x99, 0x5c, 0xf8, 0x03, 0x88, 0x71, 0xb6, 0x7d,
5059 },
5060 {
5061 /* Point with largest x. (2/2) */
5062 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5063 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2c,
5064 0xf1, 0x66, 0xb4, 0xeb, 0x15, 0x8d, 0x07, 0x3c, 0x14, 0x6a, 0x38, 0xe1, 0x09, 0x6d, 0xa8, 0xa1,
5065 0x88, 0xaf, 0xa7, 0xcc, 0xd2, 0x81, 0xad, 0x2f, 0x66, 0xa3, 0x07, 0xfb, 0x77, 0x8e, 0x45, 0xb2,
5066 },
5067 {
5068 /* Point with smallest x. (1/2) */
5069 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5070 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
5071 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14,
5072 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee,
5073 },
5074 {
5075 /* Point with smallest x. (2/2) */
5076 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5077 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
5078 0xbd, 0xe7, 0x0d, 0xf5, 0x19, 0x39, 0xb9, 0x4c, 0x9c, 0x24, 0x97, 0x9f, 0xa7, 0xdd, 0x04, 0xeb,
5079 0xd9, 0xb3, 0x57, 0x2d, 0xa7, 0x80, 0x22, 0x90, 0x43, 0x8a, 0xf2, 0xa6, 0x81, 0x89, 0x54, 0x41,
5080 },
5081 {
5082 /* Point with largest y. (1/3) */
5083 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6,
5084 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07,
5085 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5086 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
5087 },
5088 {
5089 /* Point with largest y. (2/3) */
5090 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c,
5091 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73,
5092 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5093 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
5094 },
5095 {
5096 /* Point with largest y. (3/3) */
5097 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc,
5098 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5,
5099 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5100 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
5101 },
5102 {
5103 /* Point with smallest y. (1/3) */
5104 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6,
5105 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07,
5106 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5107 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
5108 },
5109 {
5110 /* Point with smallest y. (2/3) */
5111 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c,
5112 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73,
5113 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5114 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
5115 },
5116 {
5117 /* Point with smallest y. (3/3) */
5118 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc,
5119 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5,
5120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5121 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01
5122 }
5123 };
5124#define SECP256K1_EC_PARSE_TEST_NXVALID (4)
5125 const unsigned char onlyxvalid[SECP256K1_EC_PARSE_TEST_NXVALID][64] = {
5126 {
5127 /* Valid if y overflow ignored (y = 1 mod p). (1/3) */
5128 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6,
5129 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07,
5130 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5131 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
5132 },
5133 {
5134 /* Valid if y overflow ignored (y = 1 mod p). (2/3) */
5135 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c,
5136 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73,
5137 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5138 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
5139 },
5140 {
5141 /* Valid if y overflow ignored (y = 1 mod p). (3/3)*/
5142 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc,
5143 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5,
5144 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5145 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
5146 },
5147 {
5148 /* x on curve, y is from y^2 = x^3 + 8. */
5149 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5150 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
5151 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5152 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03
5153 }
5154 };
5155#define SECP256K1_EC_PARSE_TEST_NINVALID (7)
5156 const unsigned char invalid[SECP256K1_EC_PARSE_TEST_NINVALID][64] = {
5157 {
5158 /* x is third root of -8, y is -1 * (x^3+7); also on the curve for y^2 = x^3 + 9. */
5159 0x0a, 0x2d, 0x2b, 0xa9, 0x35, 0x07, 0xf1, 0xdf, 0x23, 0x37, 0x70, 0xc2, 0xa7, 0x97, 0x96, 0x2c,
5160 0xc6, 0x1f, 0x6d, 0x15, 0xda, 0x14, 0xec, 0xd4, 0x7d, 0x8d, 0x27, 0xae, 0x1c, 0xd5, 0xf8, 0x53,
5161 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5162 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
5163 },
5164 {
5165 /* Valid if x overflow ignored (x = 1 mod p). */
5166 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5167 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
5168 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14,
5169 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee,
5170 },
5171 {
5172 /* Valid if x overflow ignored (x = 1 mod p). */
5173 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5174 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
5175 0xbd, 0xe7, 0x0d, 0xf5, 0x19, 0x39, 0xb9, 0x4c, 0x9c, 0x24, 0x97, 0x9f, 0xa7, 0xdd, 0x04, 0xeb,
5176 0xd9, 0xb3, 0x57, 0x2d, 0xa7, 0x80, 0x22, 0x90, 0x43, 0x8a, 0xf2, 0xa6, 0x81, 0x89, 0x54, 0x41,
5177 },
5178 {
5179 /* x is -1, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 5. */
5180 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5181 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
5182 0xf4, 0x84, 0x14, 0x5c, 0xb0, 0x14, 0x9b, 0x82, 0x5d, 0xff, 0x41, 0x2f, 0xa0, 0x52, 0xa8, 0x3f,
5183 0xcb, 0x72, 0xdb, 0x61, 0xd5, 0x6f, 0x37, 0x70, 0xce, 0x06, 0x6b, 0x73, 0x49, 0xa2, 0xaa, 0x28,
5184 },
5185 {
5186 /* x is -1, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 5. */
5187 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5188 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
5189 0x0b, 0x7b, 0xeb, 0xa3, 0x4f, 0xeb, 0x64, 0x7d, 0xa2, 0x00, 0xbe, 0xd0, 0x5f, 0xad, 0x57, 0xc0,
5190 0x34, 0x8d, 0x24, 0x9e, 0x2a, 0x90, 0xc8, 0x8f, 0x31, 0xf9, 0x94, 0x8b, 0xb6, 0x5d, 0x52, 0x07,
5191 },
5192 {
5193 /* x is zero, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 7. */
5194 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5195 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5196 0x8f, 0x53, 0x7e, 0xef, 0xdf, 0xc1, 0x60, 0x6a, 0x07, 0x27, 0xcd, 0x69, 0xb4, 0xa7, 0x33, 0x3d,
5197 0x38, 0xed, 0x44, 0xe3, 0x93, 0x2a, 0x71, 0x79, 0xee, 0xcb, 0x4b, 0x6f, 0xba, 0x93, 0x60, 0xdc,
5198 },
5199 {
5200 /* x is zero, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 7. */
5201 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5202 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5203 0x70, 0xac, 0x81, 0x10, 0x20, 0x3e, 0x9f, 0x95, 0xf8, 0xd8, 0x32, 0x96, 0x4b, 0x58, 0xcc, 0xc2,
5204 0xc7, 0x12, 0xbb, 0x1c, 0x6c, 0xd5, 0x8e, 0x86, 0x11, 0x34, 0xb4, 0x8f, 0x45, 0x6c, 0x9b, 0x53
5205 }
5206 };
5207 const unsigned char pubkeyc[66] = {
5208 /* Serialization of G. */
5209 0x04, 0x79, 0xBE, 0x66, 0x7E, 0xF9, 0xDC, 0xBB, 0xAC, 0x55, 0xA0, 0x62, 0x95, 0xCE, 0x87, 0x0B,
5210 0x07, 0x02, 0x9B, 0xFC, 0xDB, 0x2D, 0xCE, 0x28, 0xD9, 0x59, 0xF2, 0x81, 0x5B, 0x16, 0xF8, 0x17,
5211 0x98, 0x48, 0x3A, 0xDA, 0x77, 0x26, 0xA3, 0xC4, 0x65, 0x5D, 0xA4, 0xFB, 0xFC, 0x0E, 0x11, 0x08,
5212 0xA8, 0xFD, 0x17, 0xB4, 0x48, 0xA6, 0x85, 0x54, 0x19, 0x9C, 0x47, 0xD0, 0x8F, 0xFB, 0x10, 0xD4,
5213 0xB8, 0x00
5214 };
5215 unsigned char sout[65];
5216 unsigned char shortkey[2];
5217 secp256k1_ge ge;
5218 secp256k1_pubkey pubkey;
5219 size_t len;
5220 int32_t i;
5221 int32_t ecount;
5222 int32_t ecount2;
5223 ecount = 0;
5224 /* Nothing should be reading this far into pubkeyc. */
5225 VG_UNDEF(&pubkeyc[65], 1);
5227 /* Zero length claimed, fail, zeroize, no illegal arg error. */
5228 memset(&pubkey, 0xfe, sizeof(pubkey));
5229 ecount = 0;
5230 VG_UNDEF(shortkey, 2);
5231 VG_UNDEF(&pubkey, sizeof(pubkey));
5232 CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, shortkey, 0) == 0);
5233 VG_CHECK(&pubkey, sizeof(pubkey));
5234 CHECK(ecount == 0);
5235 CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);
5236 CHECK(ecount == 1);
5237 /* Length one claimed, fail, zeroize, no illegal arg error. */
5238 for (i = 0; i < 256 ; i++) {
5239 memset(&pubkey, 0xfe, sizeof(pubkey));
5240 ecount = 0;
5241 shortkey[0] = i;
5242 VG_UNDEF(&shortkey[1], 1);
5243 VG_UNDEF(&pubkey, sizeof(pubkey));
5244 CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, shortkey, 1) == 0);
5245 VG_CHECK(&pubkey, sizeof(pubkey));
5246 CHECK(ecount == 0);
5247 CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);
5248 CHECK(ecount == 1);
5249 }
5250 /* Length two claimed, fail, zeroize, no illegal arg error. */
5251 for (i = 0; i < 65536 ; i++) {
5252 memset(&pubkey, 0xfe, sizeof(pubkey));
5253 ecount = 0;
5254 shortkey[0] = i & 255;
5255 shortkey[1] = i >> 8;
5256 VG_UNDEF(&pubkey, sizeof(pubkey));
5257 CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, shortkey, 2) == 0);
5258 VG_CHECK(&pubkey, sizeof(pubkey));
5259 CHECK(ecount == 0);
5260 CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);
5261 CHECK(ecount == 1);
5262 }
5263 memset(&pubkey, 0xfe, sizeof(pubkey));
5264 ecount = 0;
5265 VG_UNDEF(&pubkey, sizeof(pubkey));
5266 /* 33 bytes claimed on otherwise valid input starting with 0x04, fail, zeroize output, no illegal arg error. */
5267 CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, 33) == 0);
5268 VG_CHECK(&pubkey, sizeof(pubkey));
5269 CHECK(ecount == 0);
5270 CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);
5271 CHECK(ecount == 1);
5272 /* NULL pubkey, illegal arg error. Pubkey isn't rewritten before this step, since it's NULL into the parser. */
5273 CHECK(secp256k1_ec_pubkey_parse(ctx, NULL, pubkeyc, 65) == 0);
5274 CHECK(ecount == 2);
5275 /* NULL input string. Illegal arg and zeroize output. */
5276 memset(&pubkey, 0xfe, sizeof(pubkey));
5277 ecount = 0;
5278 VG_UNDEF(&pubkey, sizeof(pubkey));
5279 CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, NULL, 65) == 0);
5280 VG_CHECK(&pubkey, sizeof(pubkey));
5281 CHECK(ecount == 1);
5282 CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);
5283 CHECK(ecount == 2);
5284 /* 64 bytes claimed on input starting with 0x04, fail, zeroize output, no illegal arg error. */
5285 memset(&pubkey, 0xfe, sizeof(pubkey));
5286 ecount = 0;
5287 VG_UNDEF(&pubkey, sizeof(pubkey));
5288 CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, 64) == 0);
5289 VG_CHECK(&pubkey, sizeof(pubkey));
5290 CHECK(ecount == 0);
5291 CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);
5292 CHECK(ecount == 1);
5293 /* 66 bytes claimed, fail, zeroize output, no illegal arg error. */
5294 memset(&pubkey, 0xfe, sizeof(pubkey));
5295 ecount = 0;
5296 VG_UNDEF(&pubkey, sizeof(pubkey));
5297 CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, 66) == 0);
5298 VG_CHECK(&pubkey, sizeof(pubkey));
5299 CHECK(ecount == 0);
5300 CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);
5301 CHECK(ecount == 1);
5302 /* Valid parse. */
5303 memset(&pubkey, 0, sizeof(pubkey));
5304 ecount = 0;
5305 VG_UNDEF(&pubkey, sizeof(pubkey));
5306 CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, 65) == 1);
5308 VG_CHECK(&pubkey, sizeof(pubkey));
5309 CHECK(ecount == 0);
5310 VG_UNDEF(&ge, sizeof(ge));
5311 CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 1);
5312 VG_CHECK(&ge.x, sizeof(ge.x));
5313 VG_CHECK(&ge.y, sizeof(ge.y));
5314 VG_CHECK(&ge.infinity, sizeof(ge.infinity));
5316 CHECK(ecount == 0);
5317 /* secp256k1_ec_pubkey_serialize illegal args. */
5318 ecount = 0;
5319 len = 65;
5321 CHECK(ecount == 1);
5322 CHECK(len == 0);
5324 CHECK(ecount == 2);
5325 len = 65;
5326 VG_UNDEF(sout, 65);
5328 VG_CHECK(sout, 65);
5329 CHECK(ecount == 3);
5330 CHECK(len == 0);
5331 len = 65;
5332 CHECK(secp256k1_ec_pubkey_serialize(ctx, sout, &len, &pubkey, ~0) == 0);
5333 CHECK(ecount == 4);
5334 CHECK(len == 0);
5335 len = 65;
5336 VG_UNDEF(sout, 65);
5338 VG_CHECK(sout, 65);
5339 CHECK(ecount == 4);
5340 CHECK(len == 65);
5341 /* Multiple illegal args. Should still set arg error only once. */
5342 ecount = 0;
5343 ecount2 = 11;
5344 CHECK(secp256k1_ec_pubkey_parse(ctx, NULL, NULL, 65) == 0);
5345 CHECK(ecount == 1);
5346 /* Does the illegal arg callback actually change the behavior? */
5348 CHECK(secp256k1_ec_pubkey_parse(ctx, NULL, NULL, 65) == 0);
5349 CHECK(ecount == 1);
5350 CHECK(ecount2 == 10);
5352 /* Try a bunch of prefabbed points with all possible encodings. */
5353 for (i = 0; i < SECP256K1_EC_PARSE_TEST_NVALID; i++) {
5354 ec_pubkey_parse_pointtest(valid[i], 1, 1);
5355 }
5356 for (i = 0; i < SECP256K1_EC_PARSE_TEST_NXVALID; i++) {
5357 ec_pubkey_parse_pointtest(onlyxvalid[i], 1, 0);
5358 }
5359 for (i = 0; i < SECP256K1_EC_PARSE_TEST_NINVALID; i++) {
5360 ec_pubkey_parse_pointtest(invalid[i], 0, 0);
5361 }
5362}
5363
5365 const unsigned char orderc[32] = {
5366 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5367 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
5368 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
5369 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41
5370 };
5371 const unsigned char zeros[sizeof(secp256k1_pubkey)] = {0x00};
5372 unsigned char ctmp[33];
5373 unsigned char ctmp2[33];
5374 secp256k1_pubkey pubkey;
5375 secp256k1_pubkey pubkey2;
5376 secp256k1_pubkey pubkey_one;
5377 secp256k1_pubkey pubkey_negone;
5378 const secp256k1_pubkey *pubkeys[3];
5379 size_t len;
5380 int32_t ecount;
5381 /* Group order is too large, reject. */
5382 CHECK(secp256k1_ec_seckey_verify(ctx, orderc) == 0);
5383 VG_UNDEF(&pubkey, sizeof(pubkey));
5384 CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, orderc) == 0);
5385 VG_CHECK(&pubkey, sizeof(pubkey));
5386 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
5387 /* Maximum value is too large, reject. */
5388 memset(ctmp, 255, 32);
5390 memset(&pubkey, 1, sizeof(pubkey));
5391 VG_UNDEF(&pubkey, sizeof(pubkey));
5392 CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 0);
5393 VG_CHECK(&pubkey, sizeof(pubkey));
5394 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
5395 /* Zero is too small, reject. */
5396 memset(ctmp, 0, 32);
5398 memset(&pubkey, 1, sizeof(pubkey));
5399 VG_UNDEF(&pubkey, sizeof(pubkey));
5400 CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 0);
5401 VG_CHECK(&pubkey, sizeof(pubkey));
5402 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
5403 /* One must be accepted. */
5404 ctmp[31] = 0x01;
5406 memset(&pubkey, 0, sizeof(pubkey));
5407 VG_UNDEF(&pubkey, sizeof(pubkey));
5408 CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 1);
5409 VG_CHECK(&pubkey, sizeof(pubkey));
5410 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0);
5411 pubkey_one = pubkey;
5412 /* Group order + 1 is too large, reject. */
5413 memcpy(ctmp, orderc, 32);
5414 ctmp[31] = 0x42;
5416 memset(&pubkey, 1, sizeof(pubkey));
5417 VG_UNDEF(&pubkey, sizeof(pubkey));
5418 CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 0);
5419 VG_CHECK(&pubkey, sizeof(pubkey));
5420 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
5421 /* -1 must be accepted. */
5422 ctmp[31] = 0x40;
5424 memset(&pubkey, 0, sizeof(pubkey));
5425 VG_UNDEF(&pubkey, sizeof(pubkey));
5426 CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 1);
5427 VG_CHECK(&pubkey, sizeof(pubkey));
5428 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0);
5429 pubkey_negone = pubkey;
5430 /* Tweak of zero leaves the value unchanged. */
5431 memset(ctmp2, 0, 32);
5432 CHECK(secp256k1_ec_seckey_tweak_add(ctx, ctmp, ctmp2) == 1);
5433 CHECK(secp256k1_memcmp_var(orderc, ctmp, 31) == 0 && ctmp[31] == 0x40);
5434 memcpy(&pubkey2, &pubkey, sizeof(pubkey));
5435 CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 1);
5436 CHECK(secp256k1_memcmp_var(&pubkey, &pubkey2, sizeof(pubkey)) == 0);
5437 /* Multiply tweak of zero zeroizes the output. */
5438 CHECK(secp256k1_ec_seckey_tweak_mul(ctx, ctmp, ctmp2) == 0);
5439 CHECK(secp256k1_memcmp_var(zeros, ctmp, 32) == 0);
5440 CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, ctmp2) == 0);
5441 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(pubkey)) == 0);
5442 memcpy(&pubkey, &pubkey2, sizeof(pubkey));
5443 /* If seckey_tweak_add or seckey_tweak_mul are called with an overflowing
5444 seckey, the seckey is zeroized. */
5445 memcpy(ctmp, orderc, 32);
5446 memset(ctmp2, 0, 32);
5447 ctmp2[31] = 0x01;
5448 CHECK(secp256k1_ec_seckey_verify(ctx, ctmp2) == 1);
5450 CHECK(secp256k1_ec_seckey_tweak_add(ctx, ctmp, ctmp2) == 0);
5451 CHECK(secp256k1_memcmp_var(zeros, ctmp, 32) == 0);
5452 memcpy(ctmp, orderc, 32);
5453 CHECK(secp256k1_ec_seckey_tweak_mul(ctx, ctmp, ctmp2) == 0);
5454 CHECK(secp256k1_memcmp_var(zeros, ctmp, 32) == 0);
5455 /* If seckey_tweak_add or seckey_tweak_mul are called with an overflowing
5456 tweak, the seckey is zeroized. */
5457 memcpy(ctmp, orderc, 32);
5458 ctmp[31] = 0x40;
5459 CHECK(secp256k1_ec_seckey_tweak_add(ctx, ctmp, orderc) == 0);
5460 CHECK(secp256k1_memcmp_var(zeros, ctmp, 32) == 0);
5461 memcpy(ctmp, orderc, 32);
5462 ctmp[31] = 0x40;
5463 CHECK(secp256k1_ec_seckey_tweak_mul(ctx, ctmp, orderc) == 0);
5464 CHECK(secp256k1_memcmp_var(zeros, ctmp, 32) == 0);
5465 memcpy(ctmp, orderc, 32);
5466 ctmp[31] = 0x40;
5467 /* If pubkey_tweak_add or pubkey_tweak_mul are called with an overflowing
5468 tweak, the pubkey is zeroized. */
5469 CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, orderc) == 0);
5470 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(pubkey)) == 0);
5471 memcpy(&pubkey, &pubkey2, sizeof(pubkey));
5472 CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, orderc) == 0);
5473 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(pubkey)) == 0);
5474 memcpy(&pubkey, &pubkey2, sizeof(pubkey));
5475 /* If the resulting key in secp256k1_ec_seckey_tweak_add and
5476 * secp256k1_ec_pubkey_tweak_add is 0 the functions fail and in the latter
5477 * case the pubkey is zeroized. */
5478 memcpy(ctmp, orderc, 32);
5479 ctmp[31] = 0x40;
5480 memset(ctmp2, 0, 32);
5481 ctmp2[31] = 1;
5482 CHECK(secp256k1_ec_seckey_tweak_add(ctx, ctmp2, ctmp) == 0);
5483 CHECK(secp256k1_memcmp_var(zeros, ctmp2, 32) == 0);
5484 ctmp2[31] = 1;
5485 CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 0);
5486 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(pubkey)) == 0);
5487 memcpy(&pubkey, &pubkey2, sizeof(pubkey));
5488 /* Tweak computation wraps and results in a key of 1. */
5489 ctmp2[31] = 2;
5490 CHECK(secp256k1_ec_seckey_tweak_add(ctx, ctmp2, ctmp) == 1);
5491 CHECK(secp256k1_memcmp_var(ctmp2, zeros, 31) == 0 && ctmp2[31] == 1);
5492 ctmp2[31] = 2;
5493 CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 1);
5494 ctmp2[31] = 1;
5495 CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey2, ctmp2) == 1);
5496 CHECK(secp256k1_memcmp_var(&pubkey, &pubkey2, sizeof(pubkey)) == 0);
5497 /* Tweak mul * 2 = 1+1. */
5498 CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 1);
5499 ctmp2[31] = 2;
5500 CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey2, ctmp2) == 1);
5501 CHECK(secp256k1_memcmp_var(&pubkey, &pubkey2, sizeof(pubkey)) == 0);
5502 /* Test argument errors. */
5503 ecount = 0;
5505 CHECK(ecount == 0);
5506 /* Zeroize pubkey on parse error. */
5507 memset(&pubkey, 0, 32);
5508 CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 0);
5509 CHECK(ecount == 1);
5510 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(pubkey)) == 0);
5511 memcpy(&pubkey, &pubkey2, sizeof(pubkey));
5512 memset(&pubkey2, 0, 32);
5513 CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey2, ctmp2) == 0);
5514 CHECK(ecount == 2);
5515 CHECK(secp256k1_memcmp_var(&pubkey2, zeros, sizeof(pubkey2)) == 0);
5516 /* Plain argument errors. */
5517 ecount = 0;
5519 CHECK(ecount == 0);
5521 CHECK(ecount == 1);
5522 ecount = 0;
5523 memset(ctmp2, 0, 32);
5524 ctmp2[31] = 4;
5525 CHECK(secp256k1_ec_pubkey_tweak_add(ctx, NULL, ctmp2) == 0);
5526 CHECK(ecount == 1);
5527 CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, NULL) == 0);
5528 CHECK(ecount == 2);
5529 ecount = 0;
5530 memset(ctmp2, 0, 32);
5531 ctmp2[31] = 4;
5532 CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, NULL, ctmp2) == 0);
5533 CHECK(ecount == 1);
5534 CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, NULL) == 0);
5535 CHECK(ecount == 2);
5536 ecount = 0;
5537 memset(ctmp2, 0, 32);
5538 CHECK(secp256k1_ec_seckey_tweak_add(ctx, NULL, ctmp2) == 0);
5539 CHECK(ecount == 1);
5540 CHECK(secp256k1_ec_seckey_tweak_add(ctx, ctmp, NULL) == 0);
5541 CHECK(ecount == 2);
5542 ecount = 0;
5543 memset(ctmp2, 0, 32);
5544 ctmp2[31] = 1;
5545 CHECK(secp256k1_ec_seckey_tweak_mul(ctx, NULL, ctmp2) == 0);
5546 CHECK(ecount == 1);
5547 CHECK(secp256k1_ec_seckey_tweak_mul(ctx, ctmp, NULL) == 0);
5548 CHECK(ecount == 2);
5549 ecount = 0;
5550 CHECK(secp256k1_ec_pubkey_create(ctx, NULL, ctmp) == 0);
5551 CHECK(ecount == 1);
5552 memset(&pubkey, 1, sizeof(pubkey));
5553 CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, NULL) == 0);
5554 CHECK(ecount == 2);
5555 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
5556 /* secp256k1_ec_pubkey_combine tests. */
5557 ecount = 0;
5558 pubkeys[0] = &pubkey_one;
5559 VG_UNDEF(&pubkeys[0], sizeof(secp256k1_pubkey *));
5560 VG_UNDEF(&pubkeys[1], sizeof(secp256k1_pubkey *));
5561 VG_UNDEF(&pubkeys[2], sizeof(secp256k1_pubkey *));
5562 memset(&pubkey, 255, sizeof(secp256k1_pubkey));
5563 VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey));
5564 CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 0) == 0);
5565 VG_CHECK(&pubkey, sizeof(secp256k1_pubkey));
5566 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
5567 CHECK(ecount == 1);
5568 CHECK(secp256k1_ec_pubkey_combine(ctx, NULL, pubkeys, 1) == 0);
5569 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
5570 CHECK(ecount == 2);
5571 memset(&pubkey, 255, sizeof(secp256k1_pubkey));
5572 VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey));
5573 CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, NULL, 1) == 0);
5574 VG_CHECK(&pubkey, sizeof(secp256k1_pubkey));
5575 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
5576 CHECK(ecount == 3);
5577 pubkeys[0] = &pubkey_negone;
5578 memset(&pubkey, 255, sizeof(secp256k1_pubkey));
5579 VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey));
5580 CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 1) == 1);
5581 VG_CHECK(&pubkey, sizeof(secp256k1_pubkey));
5582 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0);
5583 CHECK(ecount == 3);
5584 len = 33;
5586 CHECK(secp256k1_ec_pubkey_serialize(ctx, ctmp2, &len, &pubkey_negone, SECP256K1_EC_COMPRESSED) == 1);
5587 CHECK(secp256k1_memcmp_var(ctmp, ctmp2, 33) == 0);
5588 /* Result is infinity. */
5589 pubkeys[0] = &pubkey_one;
5590 pubkeys[1] = &pubkey_negone;
5591 memset(&pubkey, 255, sizeof(secp256k1_pubkey));
5592 VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey));
5593 CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 2) == 0);
5594 VG_CHECK(&pubkey, sizeof(secp256k1_pubkey));
5595 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
5596 CHECK(ecount == 3);
5597 /* Passes through infinity but comes out one. */
5598 pubkeys[2] = &pubkey_one;
5599 memset(&pubkey, 255, sizeof(secp256k1_pubkey));
5600 VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey));
5601 CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 3) == 1);
5602 VG_CHECK(&pubkey, sizeof(secp256k1_pubkey));
5603 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0);
5604 CHECK(ecount == 3);
5605 len = 33;
5607 CHECK(secp256k1_ec_pubkey_serialize(ctx, ctmp2, &len, &pubkey_one, SECP256K1_EC_COMPRESSED) == 1);
5608 CHECK(secp256k1_memcmp_var(ctmp, ctmp2, 33) == 0);
5609 /* Adds to two. */
5610 pubkeys[1] = &pubkey_one;
5611 memset(&pubkey, 255, sizeof(secp256k1_pubkey));
5612 VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey));
5613 CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 2) == 1);
5614 VG_CHECK(&pubkey, sizeof(secp256k1_pubkey));
5615 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0);
5616 CHECK(ecount == 3);
5618}
5619
5621 unsigned char seckey[32];
5622 unsigned char seckey_tmp[32];
5623
5625 memcpy(seckey_tmp, seckey, 32);
5626
5627 /* Verify negation changes the key and changes it back */
5628 CHECK(secp256k1_ec_seckey_negate(ctx, seckey) == 1);
5629 CHECK(secp256k1_memcmp_var(seckey, seckey_tmp, 32) != 0);
5630 CHECK(secp256k1_ec_seckey_negate(ctx, seckey) == 1);
5631 CHECK(secp256k1_memcmp_var(seckey, seckey_tmp, 32) == 0);
5632
5633 /* Check that privkey alias gives same result */
5634 CHECK(secp256k1_ec_seckey_negate(ctx, seckey) == 1);
5635 CHECK(secp256k1_ec_privkey_negate(ctx, seckey_tmp) == 1);
5636 CHECK(secp256k1_memcmp_var(seckey, seckey_tmp, 32) == 0);
5637
5638 /* Negating all 0s fails */
5639 memset(seckey, 0, 32);
5640 memset(seckey_tmp, 0, 32);
5641 CHECK(secp256k1_ec_seckey_negate(ctx, seckey) == 0);
5642 /* Check that seckey is not modified */
5643 CHECK(secp256k1_memcmp_var(seckey, seckey_tmp, 32) == 0);
5644
5645 /* Negating an overflowing seckey fails and the seckey is zeroed. In this
5646 * test, the seckey has 16 random bytes to ensure that ec_seckey_negate
5647 * doesn't just set seckey to a constant value in case of failure. */
5649 memset(seckey, 0xFF, 16);
5650 memset(seckey_tmp, 0, 32);
5651 CHECK(secp256k1_ec_seckey_negate(ctx, seckey) == 0);
5652 CHECK(secp256k1_memcmp_var(seckey, seckey_tmp, 32) == 0);
5653}
5654
5655void random_sign(secp256k1_scalar *sigr, secp256k1_scalar *sigs, const secp256k1_scalar *key, const secp256k1_scalar *msg, int *recid) {
5656 secp256k1_scalar nonce;
5657 do {
5659 } while(!secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, sigr, sigs, key, msg, &nonce, recid));
5660}
5661
5663 secp256k1_gej pubj;
5664 secp256k1_ge pub;
5665 secp256k1_scalar one;
5666 secp256k1_scalar msg, key;
5667 secp256k1_scalar sigr, sigs;
5668 int getrec;
5669 int recid;
5672 secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pubj, &key);
5673 secp256k1_ge_set_gej(&pub, &pubj);
5674 getrec = secp256k1_testrand_bits(1);
5675 /* The specific way in which this conditional is written sidesteps a potential bug in clang.
5676 See the commit messages of the commit that introduced this comment for details. */
5677 if (getrec) {
5678 random_sign(&sigr, &sigs, &key, &msg, &recid);
5679 CHECK(recid >= 0 && recid < 4);
5680 } else {
5681 random_sign(&sigr, &sigs, &key, &msg, NULL);
5682 }
5683 CHECK(secp256k1_ecdsa_sig_verify(&sigr, &sigs, &pub, &msg));
5684 secp256k1_scalar_set_int(&one, 1);
5685 secp256k1_scalar_add(&msg, &msg, &one);
5686 CHECK(!secp256k1_ecdsa_sig_verify(&sigr, &sigs, &pub, &msg));
5687}
5688
5690 int i;
5691 for (i = 0; i < 10*count; i++) {
5693 }
5694}
5695
5697static int precomputed_nonce_function(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) {
5698 (void)msg32;
5699 (void)key32;
5700 (void)algo16;
5701 memcpy(nonce32, data, 32);
5702 return (counter == 0);
5703}
5704
5705static 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) {
5706 /* Dummy nonce generator that has a fatal error on the first counter value. */
5707 if (counter == 0) {
5708 return 0;
5709 }
5710 return nonce_function_rfc6979(nonce32, msg32, key32, algo16, data, counter - 1);
5711}
5712
5713static 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) {
5714 /* Dummy nonce generator that produces unacceptable nonces for the first several counter values. */
5715 if (counter < 3) {
5716 memset(nonce32, counter==0 ? 0 : 255, 32);
5717 if (counter == 2) {
5718 nonce32[31]--;
5719 }
5720 return 1;
5721 }
5722 if (counter < 5) {
5723 static const unsigned char order[] = {
5724 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
5725 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
5726 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,
5727 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x41
5728 };
5729 memcpy(nonce32, order, 32);
5730 if (counter == 4) {
5731 nonce32[31]++;
5732 }
5733 return 1;
5734 }
5735 /* Retry rate of 6979 is negligible esp. as we only call this in deterministic tests. */
5736 /* If someone does fine a case where it retries for secp256k1, we'd like to know. */
5737 if (counter > 5) {
5738 return 0;
5739 }
5740 return nonce_function_rfc6979(nonce32, msg32, key32, algo16, data, counter - 5);
5741}
5742
5744 static const unsigned char res[sizeof(secp256k1_ecdsa_signature)] = {0};
5745 return secp256k1_memcmp_var(sig, res, sizeof(secp256k1_ecdsa_signature)) == 0;
5746}
5747
5749 unsigned char extra[32] = {0x00};
5750 unsigned char privkey[32];
5751 unsigned char message[32];
5752 unsigned char privkey2[32];
5753 secp256k1_ecdsa_signature signature[6];
5754 secp256k1_scalar r, s;
5755 unsigned char sig[74];
5756 size_t siglen = 74;
5757 unsigned char pubkeyc[65];
5758 size_t pubkeyclen = 65;
5759 secp256k1_pubkey pubkey;
5760 secp256k1_pubkey pubkey_tmp;
5761 unsigned char seckey[300];
5762 size_t seckeylen = 300;
5763
5764 /* Generate a random key and message. */
5765 {
5766 secp256k1_scalar msg, key;
5769 secp256k1_scalar_get_b32(privkey, &key);
5770 secp256k1_scalar_get_b32(message, &msg);
5771 }
5772
5773 /* Construct and verify corresponding public key. */
5774 CHECK(secp256k1_ec_seckey_verify(ctx, privkey) == 1);
5775 CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, privkey) == 1);
5776
5777 /* Verify exporting and importing public key. */
5779 memset(&pubkey, 0, sizeof(pubkey));
5780 CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, pubkeyclen) == 1);
5781
5782 /* Verify negation changes the key and changes it back */
5783 memcpy(&pubkey_tmp, &pubkey, sizeof(pubkey));
5784 CHECK(secp256k1_ec_pubkey_negate(ctx, &pubkey_tmp) == 1);
5785 CHECK(secp256k1_memcmp_var(&pubkey_tmp, &pubkey, sizeof(pubkey)) != 0);
5786 CHECK(secp256k1_ec_pubkey_negate(ctx, &pubkey_tmp) == 1);
5787 CHECK(secp256k1_memcmp_var(&pubkey_tmp, &pubkey, sizeof(pubkey)) == 0);
5788
5789 /* Verify private key import and export. */
5790 CHECK(ec_privkey_export_der(ctx, seckey, &seckeylen, privkey, secp256k1_testrand_bits(1) == 1));
5791 CHECK(ec_privkey_import_der(ctx, privkey2, seckey, seckeylen) == 1);
5792 CHECK(secp256k1_memcmp_var(privkey, privkey2, 32) == 0);
5793
5794 /* Optionally tweak the keys using addition. */
5795 if (secp256k1_testrand_int(3) == 0) {
5796 int ret1;
5797 int ret2;
5798 int ret3;
5799 unsigned char rnd[32];
5800 unsigned char privkey_tmp[32];
5801 secp256k1_pubkey pubkey2;
5803 memcpy(privkey_tmp, privkey, 32);
5804 ret1 = secp256k1_ec_seckey_tweak_add(ctx, privkey, rnd);
5805 ret2 = secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, rnd);
5806 /* Check that privkey alias gives same result */
5807 ret3 = secp256k1_ec_privkey_tweak_add(ctx, privkey_tmp, rnd);
5808 CHECK(ret1 == ret2);
5809 CHECK(ret2 == ret3);
5810 if (ret1 == 0) {
5811 return;
5812 }
5813 CHECK(secp256k1_memcmp_var(privkey, privkey_tmp, 32) == 0);
5814 CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey2, privkey) == 1);
5815 CHECK(secp256k1_memcmp_var(&pubkey, &pubkey2, sizeof(pubkey)) == 0);
5816 }
5817
5818 /* Optionally tweak the keys using multiplication. */
5819 if (secp256k1_testrand_int(3) == 0) {
5820 int ret1;
5821 int ret2;
5822 int ret3;
5823 unsigned char rnd[32];
5824 unsigned char privkey_tmp[32];
5825 secp256k1_pubkey pubkey2;
5827 memcpy(privkey_tmp, privkey, 32);
5828 ret1 = secp256k1_ec_seckey_tweak_mul(ctx, privkey, rnd);
5829 ret2 = secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, rnd);
5830 /* Check that privkey alias gives same result */
5831 ret3 = secp256k1_ec_privkey_tweak_mul(ctx, privkey_tmp, rnd);
5832 CHECK(ret1 == ret2);
5833 CHECK(ret2 == ret3);
5834 if (ret1 == 0) {
5835 return;
5836 }
5837 CHECK(secp256k1_memcmp_var(privkey, privkey_tmp, 32) == 0);
5838 CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey2, privkey) == 1);
5839 CHECK(secp256k1_memcmp_var(&pubkey, &pubkey2, sizeof(pubkey)) == 0);
5840 }
5841
5842 /* Sign. */
5843 CHECK(secp256k1_ecdsa_sign(ctx, &signature[0], message, privkey, NULL, NULL) == 1);
5844 CHECK(secp256k1_ecdsa_sign(ctx, &signature[4], message, privkey, NULL, NULL) == 1);
5845 CHECK(secp256k1_ecdsa_sign(ctx, &signature[1], message, privkey, NULL, extra) == 1);
5846 extra[31] = 1;
5847 CHECK(secp256k1_ecdsa_sign(ctx, &signature[2], message, privkey, NULL, extra) == 1);
5848 extra[31] = 0;
5849 extra[0] = 1;
5850 CHECK(secp256k1_ecdsa_sign(ctx, &signature[3], message, privkey, NULL, extra) == 1);
5851 CHECK(secp256k1_memcmp_var(&signature[0], &signature[4], sizeof(signature[0])) == 0);
5852 CHECK(secp256k1_memcmp_var(&signature[0], &signature[1], sizeof(signature[0])) != 0);
5853 CHECK(secp256k1_memcmp_var(&signature[0], &signature[2], sizeof(signature[0])) != 0);
5854 CHECK(secp256k1_memcmp_var(&signature[0], &signature[3], sizeof(signature[0])) != 0);
5855 CHECK(secp256k1_memcmp_var(&signature[1], &signature[2], sizeof(signature[0])) != 0);
5856 CHECK(secp256k1_memcmp_var(&signature[1], &signature[3], sizeof(signature[0])) != 0);
5857 CHECK(secp256k1_memcmp_var(&signature[2], &signature[3], sizeof(signature[0])) != 0);
5858 /* Verify. */
5859 CHECK(secp256k1_ecdsa_verify(ctx, &signature[0], message, &pubkey) == 1);
5860 CHECK(secp256k1_ecdsa_verify(ctx, &signature[1], message, &pubkey) == 1);
5861 CHECK(secp256k1_ecdsa_verify(ctx, &signature[2], message, &pubkey) == 1);
5862 CHECK(secp256k1_ecdsa_verify(ctx, &signature[3], message, &pubkey) == 1);
5863 /* Test lower-S form, malleate, verify and fail, test again, malleate again */
5864 CHECK(!secp256k1_ecdsa_signature_normalize(ctx, NULL, &signature[0]));
5865 secp256k1_ecdsa_signature_load(ctx, &r, &s, &signature[0]);
5867 secp256k1_ecdsa_signature_save(&signature[5], &r, &s);
5868 CHECK(secp256k1_ecdsa_verify(ctx, &signature[5], message, &pubkey) == 0);
5869 CHECK(secp256k1_ecdsa_signature_normalize(ctx, NULL, &signature[5]));
5870 CHECK(secp256k1_ecdsa_signature_normalize(ctx, &signature[5], &signature[5]));
5871 CHECK(!secp256k1_ecdsa_signature_normalize(ctx, NULL, &signature[5]));
5872 CHECK(!secp256k1_ecdsa_signature_normalize(ctx, &signature[5], &signature[5]));
5873 CHECK(secp256k1_ecdsa_verify(ctx, &signature[5], message, &pubkey) == 1);
5875 secp256k1_ecdsa_signature_save(&signature[5], &r, &s);
5876 CHECK(!secp256k1_ecdsa_signature_normalize(ctx, NULL, &signature[5]));
5877 CHECK(secp256k1_ecdsa_verify(ctx, &signature[5], message, &pubkey) == 1);
5878 CHECK(secp256k1_memcmp_var(&signature[5], &signature[0], 64) == 0);
5879
5880 /* Serialize/parse DER and verify again */
5881 CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, sig, &siglen, &signature[0]) == 1);
5882 memset(&signature[0], 0, sizeof(signature[0]));
5883 CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &signature[0], sig, siglen) == 1);
5884 CHECK(secp256k1_ecdsa_verify(ctx, &signature[0], message, &pubkey) == 1);
5885 /* Serialize/destroy/parse DER and verify again. */
5886 siglen = 74;
5887 CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, sig, &siglen, &signature[0]) == 1);
5889 CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &signature[0], sig, siglen) == 0 ||
5890 secp256k1_ecdsa_verify(ctx, &signature[0], message, &pubkey) == 0);
5891}
5892
5894 secp256k1_ge elem;
5895 secp256k1_ge elem2;
5896 unsigned char in[65];
5897 /* Generate some randomly sized pubkeys. */
5898 size_t len = secp256k1_testrand_bits(2) == 0 ? 65 : 33;
5899 if (secp256k1_testrand_bits(2) == 0) {
5900 len = secp256k1_testrand_bits(6);
5901 }
5902 if (len == 65) {
5903 in[0] = secp256k1_testrand_bits(1) ? 4 : (secp256k1_testrand_bits(1) ? 6 : 7);
5904 } else {
5905 in[0] = secp256k1_testrand_bits(1) ? 2 : 3;
5906 }
5907 if (secp256k1_testrand_bits(3) == 0) {
5908 in[0] = secp256k1_testrand_bits(8);
5909 }
5910 if (len > 1) {
5911 secp256k1_testrand256(&in[1]);
5912 }
5913 if (len > 33) {
5914 secp256k1_testrand256(&in[33]);
5915 }
5916 if (secp256k1_eckey_pubkey_parse(&elem, in, len)) {
5917 unsigned char out[65];
5918 unsigned char firstb;
5919 int res;
5920 size_t size = len;
5921 firstb = in[0];
5922 /* If the pubkey can be parsed, it should round-trip... */
5923 CHECK(secp256k1_eckey_pubkey_serialize(&elem, out, &size, len == 33));
5924 CHECK(size == len);
5925 CHECK(secp256k1_memcmp_var(&in[1], &out[1], len-1) == 0);
5926 /* ... except for the type of hybrid inputs. */
5927 if ((in[0] != 6) && (in[0] != 7)) {
5928 CHECK(in[0] == out[0]);
5929 }
5930 size = 65;
5931 CHECK(secp256k1_eckey_pubkey_serialize(&elem, in, &size, 0));
5932 CHECK(size == 65);
5933 CHECK(secp256k1_eckey_pubkey_parse(&elem2, in, size));
5934 ge_equals_ge(&elem,&elem2);
5935 /* Check that the X9.62 hybrid type is checked. */
5936 in[0] = secp256k1_testrand_bits(1) ? 6 : 7;
5937 res = secp256k1_eckey_pubkey_parse(&elem2, in, size);
5938 if (firstb == 2 || firstb == 3) {
5939 if (in[0] == firstb + 4) {
5940 CHECK(res);
5941 } else {
5942 CHECK(!res);
5943 }
5944 }
5945 if (res) {
5946 ge_equals_ge(&elem,&elem2);
5947 CHECK(secp256k1_eckey_pubkey_serialize(&elem, out, &size, 0));
5948 CHECK(secp256k1_memcmp_var(&in[1], &out[1], 64) == 0);
5949 }
5950 }
5951}
5952
5954 unsigned char pk1_ser[33] = {
5955 0x02,
5956 0x58, 0x84, 0xb3, 0xa2, 0x4b, 0x97, 0x37, 0x88, 0x92, 0x38, 0xa6, 0x26, 0x62, 0x52, 0x35, 0x11,
5957 0xd0, 0x9a, 0xa1, 0x1b, 0x80, 0x0b, 0x5e, 0x93, 0x80, 0x26, 0x11, 0xef, 0x67, 0x4b, 0xd9, 0x23
5958 };
5959 const unsigned char pk2_ser[33] = {
5960 0x02,
5961 0xde, 0x36, 0x0e, 0x87, 0x59, 0x8f, 0x3c, 0x01, 0x36, 0x2a, 0x2a, 0xb8, 0xc6, 0xf4, 0x5e, 0x4d,
5962 0xb2, 0xc2, 0xd5, 0x03, 0xa7, 0xf9, 0xf1, 0x4f, 0xa8, 0xfa, 0x95, 0xa8, 0xe9, 0x69, 0x76, 0x1c
5963 };
5964 secp256k1_pubkey pk1;
5965 secp256k1_pubkey pk2;
5966 int32_t ecount = 0;
5967
5968 CHECK(secp256k1_ec_pubkey_parse(ctx, &pk1, pk1_ser, sizeof(pk1_ser)) == 1);
5969 CHECK(secp256k1_ec_pubkey_parse(ctx, &pk2, pk2_ser, sizeof(pk2_ser)) == 1);
5970
5972 CHECK(secp256k1_ec_pubkey_cmp(ctx, NULL, &pk2) < 0);
5973 CHECK(ecount == 1);
5974 CHECK(secp256k1_ec_pubkey_cmp(ctx, &pk1, NULL) > 0);
5975 CHECK(ecount == 2);
5976 CHECK(secp256k1_ec_pubkey_cmp(ctx, &pk1, &pk2) < 0);
5977 CHECK(secp256k1_ec_pubkey_cmp(ctx, &pk2, &pk1) > 0);
5978 CHECK(secp256k1_ec_pubkey_cmp(ctx, &pk1, &pk1) == 0);
5979 CHECK(secp256k1_ec_pubkey_cmp(ctx, &pk2, &pk2) == 0);
5980 CHECK(ecount == 2);
5981 {
5982 secp256k1_pubkey pk_tmp;
5983 memset(&pk_tmp, 0, sizeof(pk_tmp)); /* illegal pubkey */
5984 CHECK(secp256k1_ec_pubkey_cmp(ctx, &pk_tmp, &pk2) < 0);
5985 CHECK(ecount == 3);
5986 CHECK(secp256k1_ec_pubkey_cmp(ctx, &pk_tmp, &pk_tmp) == 0);
5987 CHECK(ecount == 5);
5988 CHECK(secp256k1_ec_pubkey_cmp(ctx, &pk2, &pk_tmp) > 0);
5989 CHECK(ecount == 6);
5990 }
5991
5993
5994 /* Make pk2 the same as pk1 but with 3 rather than 2. Note that in
5995 * an uncompressed encoding, these would have the opposite ordering */
5996 pk1_ser[0] = 3;
5997 CHECK(secp256k1_ec_pubkey_parse(ctx, &pk2, pk1_ser, sizeof(pk1_ser)) == 1);
5998 CHECK(secp256k1_ec_pubkey_cmp(ctx, &pk1, &pk2) < 0);
5999 CHECK(secp256k1_ec_pubkey_cmp(ctx, &pk2, &pk1) > 0);
6000}
6001
6003 int i;
6004 for (i = 0; i < 10*count; i++) {
6006 }
6007}
6008
6010 int i;
6011 for (i = 0; i < 64*count; i++) {
6013 }
6014}
6015
6016int test_ecdsa_der_parse(const unsigned char *sig, size_t siglen, int certainly_der, int certainly_not_der) {
6017 static const unsigned char zeroes[32] = {0};
6018
6019 int ret = 0;
6020
6022 unsigned char roundtrip_der[2048];
6023 unsigned char compact_der[64];
6024 size_t len_der = 2048;
6025 int parsed_der = 0, valid_der = 0, roundtrips_der = 0;
6026
6027 secp256k1_ecdsa_signature sig_der_lax;
6028 unsigned char roundtrip_der_lax[2048];
6029 unsigned char compact_der_lax[64];
6030 size_t len_der_lax = 2048;
6031 int parsed_der_lax = 0, valid_der_lax = 0, roundtrips_der_lax = 0;
6032
6033 parsed_der = secp256k1_ecdsa_signature_parse_der(ctx, &sig_der, sig, siglen);
6034 if (parsed_der) {
6035 ret |= (!secp256k1_ecdsa_signature_serialize_compact(ctx, compact_der, &sig_der)) << 0;
6036 valid_der = (secp256k1_memcmp_var(compact_der, zeroes, 32) != 0) && (secp256k1_memcmp_var(compact_der + 32, zeroes, 32) != 0);
6037 }
6038 if (valid_der) {
6039 ret |= (!secp256k1_ecdsa_signature_serialize_der(ctx, roundtrip_der, &len_der, &sig_der)) << 1;
6040 roundtrips_der = (len_der == siglen) && secp256k1_memcmp_var(roundtrip_der, sig, siglen) == 0;
6041 }
6042
6043 parsed_der_lax = ecdsa_signature_parse_der_lax(ctx, &sig_der_lax, sig, siglen);
6044 if (parsed_der_lax) {
6045 ret |= (!secp256k1_ecdsa_signature_serialize_compact(ctx, compact_der_lax, &sig_der_lax)) << 10;
6046 valid_der_lax = (secp256k1_memcmp_var(compact_der_lax, zeroes, 32) != 0) && (secp256k1_memcmp_var(compact_der_lax + 32, zeroes, 32) != 0);
6047 }
6048 if (valid_der_lax) {
6049 ret |= (!secp256k1_ecdsa_signature_serialize_der(ctx, roundtrip_der_lax, &len_der_lax, &sig_der_lax)) << 11;
6050 roundtrips_der_lax = (len_der_lax == siglen) && secp256k1_memcmp_var(roundtrip_der_lax, sig, siglen) == 0;
6051 }
6052
6053 if (certainly_der) {
6054 ret |= (!parsed_der) << 2;
6055 }
6056 if (certainly_not_der) {
6057 ret |= (parsed_der) << 17;
6058 }
6059 if (valid_der) {
6060 ret |= (!roundtrips_der) << 3;
6061 }
6062
6063 if (valid_der) {
6064 ret |= (!roundtrips_der_lax) << 12;
6065 ret |= (len_der != len_der_lax) << 13;
6066 ret |= ((len_der != len_der_lax) || (secp256k1_memcmp_var(roundtrip_der_lax, roundtrip_der, len_der) != 0)) << 14;
6067 }
6068 ret |= (roundtrips_der != roundtrips_der_lax) << 15;
6069 if (parsed_der) {
6070 ret |= (!parsed_der_lax) << 16;
6071 }
6072
6073 return ret;
6074}
6075
6076static void assign_big_endian(unsigned char *ptr, size_t ptrlen, uint32_t val) {
6077 size_t i;
6078 for (i = 0; i < ptrlen; i++) {
6079 int shift = ptrlen - 1 - i;
6080 if (shift >= 4) {
6081 ptr[i] = 0;
6082 } else {
6083 ptr[i] = (val >> shift) & 0xFF;
6084 }
6085 }
6086}
6087
6088static void damage_array(unsigned char *sig, size_t *len) {
6089 int pos;
6090 int action = secp256k1_testrand_bits(3);
6091 if (action < 1 && *len > 3) {
6092 /* Delete a byte. */
6093 pos = secp256k1_testrand_int(*len);
6094 memmove(sig + pos, sig + pos + 1, *len - pos - 1);
6095 (*len)--;
6096 return;
6097 } else if (action < 2 && *len < 2048) {
6098 /* Insert a byte. */
6099 pos = secp256k1_testrand_int(1 + *len);
6100 memmove(sig + pos + 1, sig + pos, *len - pos);
6101 sig[pos] = secp256k1_testrand_bits(8);
6102 (*len)++;
6103 return;
6104 } else if (action < 4) {
6105 /* Modify a byte. */
6107 return;
6108 } else { /* action < 8 */
6109 /* Modify a bit. */
6111 return;
6112 }
6113}
6114
6115static void random_ber_signature(unsigned char *sig, size_t *len, int* certainly_der, int* certainly_not_der) {
6116 int der;
6117 int nlow[2], nlen[2], nlenlen[2], nhbit[2], nhbyte[2], nzlen[2];
6118 size_t tlen, elen, glen;
6119 int indet;
6120 int n;
6121
6122 *len = 0;
6123 der = secp256k1_testrand_bits(2) == 0;
6124 *certainly_der = der;
6125 *certainly_not_der = 0;
6126 indet = der ? 0 : secp256k1_testrand_int(10) == 0;
6127
6128 for (n = 0; n < 2; n++) {
6129 /* We generate two classes of numbers: nlow==1 "low" ones (up to 32 bytes), nlow==0 "high" ones (32 bytes with 129 top bits set, or larger than 32 bytes) */
6130 nlow[n] = der ? 1 : (secp256k1_testrand_bits(3) != 0);
6131 /* The length of the number in bytes (the first byte of which will always be nonzero) */
6132 nlen[n] = nlow[n] ? secp256k1_testrand_int(33) : 32 + secp256k1_testrand_int(200) * secp256k1_testrand_bits(3) / 8;
6133 CHECK(nlen[n] <= 232);
6134 /* The top bit of the number. */
6135 nhbit[n] = (nlow[n] == 0 && nlen[n] == 32) ? 1 : (nlen[n] == 0 ? 0 : secp256k1_testrand_bits(1));
6136 /* The top byte of the number (after the potential hardcoded 16 0xFF characters for "high" 32 bytes numbers) */
6137 nhbyte[n] = nlen[n] == 0 ? 0 : (nhbit[n] ? 128 + secp256k1_testrand_bits(7) : 1 + secp256k1_testrand_int(127));
6138 /* The number of zero bytes in front of the number (which is 0 or 1 in case of DER, otherwise we extend up to 300 bytes) */
6139 nzlen[n] = der ? ((nlen[n] == 0 || nhbit[n]) ? 1 : 0) : (nlow[n] ? secp256k1_testrand_int(3) : secp256k1_testrand_int(300 - nlen[n]) * secp256k1_testrand_bits(3) / 8);
6140 if (nzlen[n] > ((nlen[n] == 0 || nhbit[n]) ? 1 : 0)) {
6141 *certainly_not_der = 1;
6142 }
6143 CHECK(nlen[n] + nzlen[n] <= 300);
6144 /* The length of the length descriptor for the number. 0 means short encoding, anything else is long encoding. */
6145 nlenlen[n] = nlen[n] + nzlen[n] < 128 ? 0 : (nlen[n] + nzlen[n] < 256 ? 1 : 2);
6146 if (!der) {
6147 /* nlenlen[n] max 127 bytes */
6148 int add = secp256k1_testrand_int(127 - nlenlen[n]) * secp256k1_testrand_bits(4) * secp256k1_testrand_bits(4) / 256;
6149 nlenlen[n] += add;
6150 if (add != 0) {
6151 *certainly_not_der = 1;
6152 }
6153 }
6154 CHECK(nlen[n] + nzlen[n] + nlenlen[n] <= 427);
6155 }
6156
6157 /* The total length of the data to go, so far */
6158 tlen = 2 + nlenlen[0] + nlen[0] + nzlen[0] + 2 + nlenlen[1] + nlen[1] + nzlen[1];
6159 CHECK(tlen <= 856);
6160
6161 /* The length of the garbage inside the tuple. */
6162 elen = (der || indet) ? 0 : secp256k1_testrand_int(980 - tlen) * secp256k1_testrand_bits(3) / 8;
6163 if (elen != 0) {
6164 *certainly_not_der = 1;
6165 }
6166 tlen += elen;
6167 CHECK(tlen <= 980);
6168
6169 /* The length of the garbage after the end of the tuple. */
6170 glen = der ? 0 : secp256k1_testrand_int(990 - tlen) * secp256k1_testrand_bits(3) / 8;
6171 if (glen != 0) {
6172 *certainly_not_der = 1;
6173 }
6174 CHECK(tlen + glen <= 990);
6175
6176 /* Write the tuple header. */
6177 sig[(*len)++] = 0x30;
6178 if (indet) {
6179 /* Indeterminate length */
6180 sig[(*len)++] = 0x80;
6181 *certainly_not_der = 1;
6182 } else {
6183 int tlenlen = tlen < 128 ? 0 : (tlen < 256 ? 1 : 2);
6184 if (!der) {
6185 int add = secp256k1_testrand_int(127 - tlenlen) * secp256k1_testrand_bits(4) * secp256k1_testrand_bits(4) / 256;
6186 tlenlen += add;
6187 if (add != 0) {
6188 *certainly_not_der = 1;
6189 }
6190 }
6191 if (tlenlen == 0) {
6192 /* Short length notation */
6193 sig[(*len)++] = tlen;
6194 } else {
6195 /* Long length notation */
6196 sig[(*len)++] = 128 + tlenlen;
6197 assign_big_endian(sig + *len, tlenlen, tlen);
6198 *len += tlenlen;
6199 }
6200 tlen += tlenlen;
6201 }
6202 tlen += 2;
6203 CHECK(tlen + glen <= 1119);
6204
6205 for (n = 0; n < 2; n++) {
6206 /* Write the integer header. */
6207 sig[(*len)++] = 0x02;
6208 if (nlenlen[n] == 0) {
6209 /* Short length notation */
6210 sig[(*len)++] = nlen[n] + nzlen[n];
6211 } else {
6212 /* Long length notation. */
6213 sig[(*len)++] = 128 + nlenlen[n];
6214 assign_big_endian(sig + *len, nlenlen[n], nlen[n] + nzlen[n]);
6215 *len += nlenlen[n];
6216 }
6217 /* Write zero padding */
6218 while (nzlen[n] > 0) {
6219 sig[(*len)++] = 0x00;
6220 nzlen[n]--;
6221 }
6222 if (nlen[n] == 32 && !nlow[n]) {
6223 /* Special extra 16 0xFF bytes in "high" 32-byte numbers */
6224 int i;
6225 for (i = 0; i < 16; i++) {
6226 sig[(*len)++] = 0xFF;
6227 }
6228 nlen[n] -= 16;
6229 }
6230 /* Write first byte of number */
6231 if (nlen[n] > 0) {
6232 sig[(*len)++] = nhbyte[n];
6233 nlen[n]--;
6234 }
6235 /* Generate remaining random bytes of number */
6236 secp256k1_testrand_bytes_test(sig + *len, nlen[n]);
6237 *len += nlen[n];
6238 nlen[n] = 0;
6239 }
6240
6241 /* Generate random garbage inside tuple. */
6242 secp256k1_testrand_bytes_test(sig + *len, elen);
6243 *len += elen;
6244
6245 /* Generate end-of-contents bytes. */
6246 if (indet) {
6247 sig[(*len)++] = 0;
6248 sig[(*len)++] = 0;
6249 tlen += 2;
6250 }
6251 CHECK(tlen + glen <= 1121);
6252
6253 /* Generate random garbage outside tuple. */
6254 secp256k1_testrand_bytes_test(sig + *len, glen);
6255 *len += glen;
6256 tlen += glen;
6257 CHECK(tlen <= 1121);
6258 CHECK(tlen == *len);
6259}
6260
6262 int i,j;
6263 for (i = 0; i < 200 * count; i++) {
6264 unsigned char buffer[2048];
6265 size_t buflen = 0;
6266 int certainly_der = 0;
6267 int certainly_not_der = 0;
6268 random_ber_signature(buffer, &buflen, &certainly_der, &certainly_not_der);
6269 CHECK(buflen <= 2048);
6270 for (j = 0; j < 16; j++) {
6271 int ret = 0;
6272 if (j > 0) {
6273 damage_array(buffer, &buflen);
6274 /* We don't know anything anymore about the DERness of the result */
6275 certainly_der = 0;
6276 certainly_not_der = 0;
6277 }
6278 ret = test_ecdsa_der_parse(buffer, buflen, certainly_der, certainly_not_der);
6279 if (ret != 0) {
6280 size_t k;
6281 fprintf(stderr, "Failure %x on ", ret);
6282 for (k = 0; k < buflen; k++) {
6283 fprintf(stderr, "%02x ", buffer[k]);
6284 }
6285 fprintf(stderr, "\n");
6286 }
6287 CHECK(ret == 0);
6288 }
6289 }
6290}
6291
6292/* Tests several edge cases. */
6294 int t;
6296
6297 /* Test the case where ECDSA recomputes a point that is infinity. */
6298 {
6299 secp256k1_gej keyj;
6300 secp256k1_ge key;
6301 secp256k1_scalar msg;
6302 secp256k1_scalar sr, ss;
6304 secp256k1_scalar_negate(&ss, &ss);
6305 secp256k1_scalar_inverse(&ss, &ss);
6308 secp256k1_ge_set_gej(&key, &keyj);
6309 msg = ss;
6310 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 0);
6311 }
6312
6313 /* Verify signature with r of zero fails. */
6314 {
6315 const unsigned char pubkey_mods_zero[33] = {
6316 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
6317 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
6318 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0,
6319 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41,
6320 0x41
6321 };
6322 secp256k1_ge key;
6323 secp256k1_scalar msg;
6324 secp256k1_scalar sr, ss;
6326 secp256k1_scalar_set_int(&msg, 0);
6328 CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey_mods_zero, 33));
6329 CHECK(secp256k1_ecdsa_sig_verify( &sr, &ss, &key, &msg) == 0);
6330 }
6331
6332 /* Verify signature with s of zero fails. */
6333 {
6334 const unsigned char pubkey[33] = {
6335 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6336 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6337 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6338 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6339 0x01
6340 };
6341 secp256k1_ge key;
6342 secp256k1_scalar msg;
6343 secp256k1_scalar sr, ss;
6345 secp256k1_scalar_set_int(&msg, 0);
6347 CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33));
6348 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 0);
6349 }
6350
6351 /* Verify signature with message 0 passes. */
6352 {
6353 const unsigned char pubkey[33] = {
6354 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6358 0x02
6359 };
6360 const unsigned char pubkey2[33] = {
6361 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
6362 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
6363 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0,
6364 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41,
6365 0x43
6366 };
6367 secp256k1_ge key;
6368 secp256k1_ge key2;
6369 secp256k1_scalar msg;
6370 secp256k1_scalar sr, ss;
6372 secp256k1_scalar_set_int(&msg, 0);
6374 CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33));
6375 CHECK(secp256k1_eckey_pubkey_parse(&key2, pubkey2, 33));
6376 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 1);
6377 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key2, &msg) == 1);
6378 secp256k1_scalar_negate(&ss, &ss);
6379 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 1);
6380 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key2, &msg) == 1);
6382 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 0);
6383 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key2, &msg) == 0);
6384 }
6385
6386 /* Verify signature with message 1 passes. */
6387 {
6388 const unsigned char pubkey[33] = {
6389 0x02, 0x14, 0x4e, 0x5a, 0x58, 0xef, 0x5b, 0x22,
6390 0x6f, 0xd2, 0xe2, 0x07, 0x6a, 0x77, 0xcf, 0x05,
6391 0xb4, 0x1d, 0xe7, 0x4a, 0x30, 0x98, 0x27, 0x8c,
6392 0x93, 0xe6, 0xe6, 0x3c, 0x0b, 0xc4, 0x73, 0x76,
6393 0x25
6394 };
6395 const unsigned char pubkey2[33] = {
6396 0x02, 0x8a, 0xd5, 0x37, 0xed, 0x73, 0xd9, 0x40,
6397 0x1d, 0xa0, 0x33, 0xd2, 0xdc, 0xf0, 0xaf, 0xae,
6398 0x34, 0xcf, 0x5f, 0x96, 0x4c, 0x73, 0x28, 0x0f,
6399 0x92, 0xc0, 0xf6, 0x9d, 0xd9, 0xb2, 0x09, 0x10,
6400 0x62
6401 };
6402 const unsigned char csr[32] = {
6403 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6404 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
6405 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4,
6406 0x40, 0x2d, 0xa1, 0x72, 0x2f, 0xc9, 0xba, 0xeb
6407 };
6408 secp256k1_ge key;
6409 secp256k1_ge key2;
6410 secp256k1_scalar msg;
6411 secp256k1_scalar sr, ss;
6413 secp256k1_scalar_set_int(&msg, 1);
6414 secp256k1_scalar_set_b32(&sr, csr, NULL);
6415 CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33));
6416 CHECK(secp256k1_eckey_pubkey_parse(&key2, pubkey2, 33));
6417 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 1);
6418 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key2, &msg) == 1);
6419 secp256k1_scalar_negate(&ss, &ss);
6420 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 1);
6421 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key2, &msg) == 1);
6424 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 0);
6425 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key2, &msg) == 0);
6426 }
6427
6428 /* Verify signature with message -1 passes. */
6429 {
6430 const unsigned char pubkey[33] = {
6431 0x03, 0xaf, 0x97, 0xff, 0x7d, 0x3a, 0xf6, 0xa0,
6432 0x02, 0x94, 0xbd, 0x9f, 0x4b, 0x2e, 0xd7, 0x52,
6433 0x28, 0xdb, 0x49, 0x2a, 0x65, 0xcb, 0x1e, 0x27,
6434 0x57, 0x9c, 0xba, 0x74, 0x20, 0xd5, 0x1d, 0x20,
6435 0xf1
6436 };
6437 const unsigned char csr[32] = {
6438 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6439 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
6440 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4,
6441 0x40, 0x2d, 0xa1, 0x72, 0x2f, 0xc9, 0xba, 0xee
6442 };
6443 secp256k1_ge key;
6444 secp256k1_scalar msg;
6445 secp256k1_scalar sr, ss;
6447 secp256k1_scalar_set_int(&msg, 1);
6448 secp256k1_scalar_negate(&msg, &msg);
6449 secp256k1_scalar_set_b32(&sr, csr, NULL);
6450 CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33));
6451 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 1);
6452 secp256k1_scalar_negate(&ss, &ss);
6453 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 1);
6456 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 0);
6457 }
6458
6459 /* Signature where s would be zero. */
6460 {
6461 secp256k1_pubkey pubkey;
6462 size_t siglen;
6463 int32_t ecount;
6464 unsigned char signature[72];
6465 static const unsigned char nonce[32] = {
6466 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6467 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6468 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6469 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
6470 };
6471 static const unsigned char nonce2[32] = {
6472 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
6473 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
6474 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,
6475 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x40
6476 };
6477 const unsigned char key[32] = {
6478 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6479 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6480 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6481 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
6482 };
6483 unsigned char msg[32] = {
6484 0x86, 0x41, 0x99, 0x81, 0x06, 0x23, 0x44, 0x53,
6485 0xaa, 0x5f, 0x9d, 0x6a, 0x31, 0x78, 0xf4, 0xf7,
6486 0xb8, 0x12, 0xe0, 0x0b, 0x81, 0x7a, 0x77, 0x62,
6487 0x65, 0xdf, 0xdd, 0x31, 0xb9, 0x3e, 0x29, 0xa9,
6488 };
6489 ecount = 0;
6491 CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, precomputed_nonce_function, nonce) == 0);
6492 CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, precomputed_nonce_function, nonce2) == 0);
6493 msg[31] = 0xaa;
6494 CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, precomputed_nonce_function, nonce) == 1);
6495 CHECK(ecount == 0);
6496 CHECK(secp256k1_ecdsa_sign(ctx, NULL, msg, key, precomputed_nonce_function, nonce2) == 0);
6497 CHECK(ecount == 1);
6498 CHECK(secp256k1_ecdsa_sign(ctx, &sig, NULL, key, precomputed_nonce_function, nonce2) == 0);
6499 CHECK(ecount == 2);
6500 CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, NULL, precomputed_nonce_function, nonce2) == 0);
6501 CHECK(ecount == 3);
6502 CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, precomputed_nonce_function, nonce2) == 1);
6503 CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, key) == 1);
6504 CHECK(secp256k1_ecdsa_verify(ctx, NULL, msg, &pubkey) == 0);
6505 CHECK(ecount == 4);
6506 CHECK(secp256k1_ecdsa_verify(ctx, &sig, NULL, &pubkey) == 0);
6507 CHECK(ecount == 5);
6508 CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg, NULL) == 0);
6509 CHECK(ecount == 6);
6510 CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg, &pubkey) == 1);
6511 CHECK(ecount == 6);
6512 CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, NULL) == 0);
6513 CHECK(ecount == 7);
6514 /* That pubkeyload fails via an ARGCHECK is a little odd but makes sense because pubkeys are an opaque data type. */
6515 CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg, &pubkey) == 0);
6516 CHECK(ecount == 8);
6517 siglen = 72;
6518 CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, NULL, &siglen, &sig) == 0);
6519 CHECK(ecount == 9);
6520 CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, signature, NULL, &sig) == 0);
6521 CHECK(ecount == 10);
6522 CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, signature, &siglen, NULL) == 0);
6523 CHECK(ecount == 11);
6524 CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, signature, &siglen, &sig) == 1);
6525 CHECK(ecount == 11);
6526 CHECK(secp256k1_ecdsa_signature_parse_der(ctx, NULL, signature, siglen) == 0);
6527 CHECK(ecount == 12);
6528 CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, NULL, siglen) == 0);
6529 CHECK(ecount == 13);
6530 CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, signature, siglen) == 1);
6531 CHECK(ecount == 13);
6532 siglen = 10;
6533 /* Too little room for a signature does not fail via ARGCHECK. */
6534 CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, signature, &siglen, &sig) == 0);
6535 CHECK(ecount == 13);
6536 ecount = 0;
6538 CHECK(ecount == 1);
6540 CHECK(ecount == 2);
6542 CHECK(ecount == 3);
6544 CHECK(ecount == 3);
6545 CHECK(secp256k1_ecdsa_signature_parse_compact(ctx, NULL, signature) == 0);
6546 CHECK(ecount == 4);
6548 CHECK(ecount == 5);
6550 CHECK(ecount == 5);
6551 memset(signature, 255, 64);
6553 CHECK(ecount == 5);
6555 }
6556
6557 /* Nonce function corner cases. */
6558 for (t = 0; t < 2; t++) {
6559 static const unsigned char zero[32] = {0x00};
6560 int i;
6561 unsigned char key[32];
6562 unsigned char msg[32];
6564 secp256k1_scalar sr[512], ss;
6565 const unsigned char *extra;
6566 extra = t == 0 ? NULL : zero;
6567 memset(msg, 0, 32);
6568 msg[31] = 1;
6569 /* High key results in signature failure. */
6570 memset(key, 0xFF, 32);
6571 CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, NULL, extra) == 0);
6573 /* Zero key results in signature failure. */
6574 memset(key, 0, 32);
6575 CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, NULL, extra) == 0);
6577 /* Nonce function failure results in signature failure. */
6578 key[31] = 1;
6579 CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, nonce_function_test_fail, extra) == 0);
6581 /* The retry loop successfully makes its way to the first good value. */
6582 CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, nonce_function_test_retry, extra) == 1);
6584 CHECK(secp256k1_ecdsa_sign(ctx, &sig2, msg, key, nonce_function_rfc6979, extra) == 1);
6585 CHECK(!is_empty_signature(&sig2));
6586 CHECK(secp256k1_memcmp_var(&sig, &sig2, sizeof(sig)) == 0);
6587 /* The default nonce function is deterministic. */
6588 CHECK(secp256k1_ecdsa_sign(ctx, &sig2, msg, key, NULL, extra) == 1);
6589 CHECK(!is_empty_signature(&sig2));
6590 CHECK(secp256k1_memcmp_var(&sig, &sig2, sizeof(sig)) == 0);
6591 /* The default nonce function changes output with different messages. */
6592 for(i = 0; i < 256; i++) {
6593 int j;
6594 msg[0] = i;
6595 CHECK(secp256k1_ecdsa_sign(ctx, &sig2, msg, key, NULL, extra) == 1);
6596 CHECK(!is_empty_signature(&sig2));
6597 secp256k1_ecdsa_signature_load(ctx, &sr[i], &ss, &sig2);
6598 for (j = 0; j < i; j++) {
6599 CHECK(!secp256k1_scalar_eq(&sr[i], &sr[j]));
6600 }
6601 }
6602 msg[0] = 0;
6603 msg[31] = 2;
6604 /* The default nonce function changes output with different keys. */
6605 for(i = 256; i < 512; i++) {
6606 int j;
6607 key[0] = i - 256;
6608 CHECK(secp256k1_ecdsa_sign(ctx, &sig2, msg, key, NULL, extra) == 1);
6609 CHECK(!is_empty_signature(&sig2));
6610 secp256k1_ecdsa_signature_load(ctx, &sr[i], &ss, &sig2);
6611 for (j = 0; j < i; j++) {
6612 CHECK(!secp256k1_scalar_eq(&sr[i], &sr[j]));
6613 }
6614 }
6615 key[0] = 0;
6616 }
6617
6618 {
6619 /* Check that optional nonce arguments do not have equivalent effect. */
6620 const unsigned char zeros[32] = {0};
6621 unsigned char nonce[32];
6622 unsigned char nonce2[32];
6623 unsigned char nonce3[32];
6624 unsigned char nonce4[32];
6625 VG_UNDEF(nonce,32);
6626 VG_UNDEF(nonce2,32);
6627 VG_UNDEF(nonce3,32);
6628 VG_UNDEF(nonce4,32);
6629 CHECK(nonce_function_rfc6979(nonce, zeros, zeros, NULL, NULL, 0) == 1);
6630 VG_CHECK(nonce,32);
6631 CHECK(nonce_function_rfc6979(nonce2, zeros, zeros, zeros, NULL, 0) == 1);
6632 VG_CHECK(nonce2,32);
6633 CHECK(nonce_function_rfc6979(nonce3, zeros, zeros, NULL, (void *)zeros, 0) == 1);
6634 VG_CHECK(nonce3,32);
6635 CHECK(nonce_function_rfc6979(nonce4, zeros, zeros, zeros, (void *)zeros, 0) == 1);
6636 VG_CHECK(nonce4,32);
6637 CHECK(secp256k1_memcmp_var(nonce, nonce2, 32) != 0);
6638 CHECK(secp256k1_memcmp_var(nonce, nonce3, 32) != 0);
6639 CHECK(secp256k1_memcmp_var(nonce, nonce4, 32) != 0);
6640 CHECK(secp256k1_memcmp_var(nonce2, nonce3, 32) != 0);
6641 CHECK(secp256k1_memcmp_var(nonce2, nonce4, 32) != 0);
6642 CHECK(secp256k1_memcmp_var(nonce3, nonce4, 32) != 0);
6643 }
6644
6645
6646 /* Privkey export where pubkey is the point at infinity. */
6647 {
6648 unsigned char privkey[300];
6649 unsigned char seckey[32] = {
6650 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
6651 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
6652 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
6653 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41,
6654 };
6655 size_t outlen = 300;
6656 CHECK(!ec_privkey_export_der(ctx, privkey, &outlen, seckey, 0));
6657 outlen = 300;
6658 CHECK(!ec_privkey_export_der(ctx, privkey, &outlen, seckey, 1));
6659 }
6660}
6661
6664}
6665
6666#ifdef ENABLE_MODULE_ECDH
6667# include "modules/ecdh/tests_impl.h"
6668#endif
6669
6670#ifdef ENABLE_MODULE_MULTISET
6672#endif
6673
6674#ifdef ENABLE_MODULE_RECOVERY
6676#endif
6677
6678#ifdef ENABLE_MODULE_SCHNORR
6680#endif
6681
6682#ifdef ENABLE_MODULE_EXTRAKEYS
6684#endif
6685
6686#ifdef ENABLE_MODULE_SCHNORRSIG
6688#endif
6689
6691 unsigned char buf1[6] = {1, 2, 3, 4, 5, 6};
6692 unsigned char buf2[sizeof(buf1)];
6693
6694 /* secp256k1_memczero(..., ..., 0) is a noop. */
6695 memcpy(buf2, buf1, sizeof(buf1));
6696 secp256k1_memczero(buf1, sizeof(buf1), 0);
6697 CHECK(secp256k1_memcmp_var(buf1, buf2, sizeof(buf1)) == 0);
6698
6699 /* secp256k1_memczero(..., ..., 1) zeros the buffer. */
6700 memset(buf2, 0, sizeof(buf2));
6701 secp256k1_memczero(buf1, sizeof(buf1) , 1);
6702 CHECK(secp256k1_memcmp_var(buf1, buf2, sizeof(buf1)) == 0);
6703}
6704
6705void int_cmov_test(void) {
6706 int r = INT_MAX;
6707 int a = 0;
6708
6709 secp256k1_int_cmov(&r, &a, 0);
6710 CHECK(r == INT_MAX);
6711
6712 r = 0; a = INT_MAX;
6713 secp256k1_int_cmov(&r, &a, 1);
6714 CHECK(r == INT_MAX);
6715
6716 a = 0;
6717 secp256k1_int_cmov(&r, &a, 1);
6718 CHECK(r == 0);
6719
6720 a = 1;
6721 secp256k1_int_cmov(&r, &a, 1);
6722 CHECK(r == 1);
6723
6724 r = 1; a = 0;
6725 secp256k1_int_cmov(&r, &a, 0);
6726 CHECK(r == 1);
6727
6728}
6729
6730void fe_cmov_test(void) {
6731 static const secp256k1_fe zero = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0);
6732 static const secp256k1_fe one = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1);
6733 static const secp256k1_fe max = SECP256K1_FE_CONST(
6734 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
6735 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL
6736 );
6737 secp256k1_fe r = max;
6738 secp256k1_fe a = zero;
6739
6740 secp256k1_fe_cmov(&r, &a, 0);
6741 CHECK(secp256k1_memcmp_var(&r, &max, sizeof(r)) == 0);
6742
6743 r = zero; a = max;
6744 secp256k1_fe_cmov(&r, &a, 1);
6745 CHECK(secp256k1_memcmp_var(&r, &max, sizeof(r)) == 0);
6746
6747 a = zero;
6748 secp256k1_fe_cmov(&r, &a, 1);
6749 CHECK(secp256k1_memcmp_var(&r, &zero, sizeof(r)) == 0);
6750
6751 a = one;
6752 secp256k1_fe_cmov(&r, &a, 1);
6753 CHECK(secp256k1_memcmp_var(&r, &one, sizeof(r)) == 0);
6754
6755 r = one; a = zero;
6756 secp256k1_fe_cmov(&r, &a, 0);
6757 CHECK(secp256k1_memcmp_var(&r, &one, sizeof(r)) == 0);
6758}
6759
6761 static const secp256k1_fe_storage zero = SECP256K1_FE_STORAGE_CONST(0, 0, 0, 0, 0, 0, 0, 0);
6762 static const secp256k1_fe_storage one = SECP256K1_FE_STORAGE_CONST(0, 0, 0, 0, 0, 0, 0, 1);
6764 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
6765 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL
6766 );
6767 secp256k1_fe_storage r = max;
6768 secp256k1_fe_storage a = zero;
6769
6770 secp256k1_fe_storage_cmov(&r, &a, 0);
6771 CHECK(secp256k1_memcmp_var(&r, &max, sizeof(r)) == 0);
6772
6773 r = zero; a = max;
6774 secp256k1_fe_storage_cmov(&r, &a, 1);
6775 CHECK(secp256k1_memcmp_var(&r, &max, sizeof(r)) == 0);
6776
6777 a = zero;
6778 secp256k1_fe_storage_cmov(&r, &a, 1);
6779 CHECK(secp256k1_memcmp_var(&r, &zero, sizeof(r)) == 0);
6780
6781 a = one;
6782 secp256k1_fe_storage_cmov(&r, &a, 1);
6783 CHECK(secp256k1_memcmp_var(&r, &one, sizeof(r)) == 0);
6784
6785 r = one; a = zero;
6786 secp256k1_fe_storage_cmov(&r, &a, 0);
6787 CHECK(secp256k1_memcmp_var(&r, &one, sizeof(r)) == 0);
6788}
6789
6791 static const secp256k1_scalar zero = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0);
6792 static const secp256k1_scalar one = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1);
6793 static const secp256k1_scalar max = SECP256K1_SCALAR_CONST(
6794 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
6795 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL
6796 );
6797 secp256k1_scalar r = max;
6798 secp256k1_scalar a = zero;
6799
6800 secp256k1_scalar_cmov(&r, &a, 0);
6801 CHECK(secp256k1_memcmp_var(&r, &max, sizeof(r)) == 0);
6802
6803 r = zero; a = max;
6804 secp256k1_scalar_cmov(&r, &a, 1);
6805 CHECK(secp256k1_memcmp_var(&r, &max, sizeof(r)) == 0);
6806
6807 a = zero;
6808 secp256k1_scalar_cmov(&r, &a, 1);
6809 CHECK(secp256k1_memcmp_var(&r, &zero, sizeof(r)) == 0);
6810
6811 a = one;
6812 secp256k1_scalar_cmov(&r, &a, 1);
6813 CHECK(secp256k1_memcmp_var(&r, &one, sizeof(r)) == 0);
6814
6815 r = one; a = zero;
6816 secp256k1_scalar_cmov(&r, &a, 0);
6817 CHECK(secp256k1_memcmp_var(&r, &one, sizeof(r)) == 0);
6818}
6819
6821 static const secp256k1_ge_storage zero = SECP256K1_GE_STORAGE_CONST(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
6822 static const secp256k1_ge_storage one = SECP256K1_GE_STORAGE_CONST(0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1);
6824 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
6825 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
6826 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
6827 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL
6828 );
6829 secp256k1_ge_storage r = max;
6830 secp256k1_ge_storage a = zero;
6831
6832 secp256k1_ge_storage_cmov(&r, &a, 0);
6833 CHECK(secp256k1_memcmp_var(&r, &max, sizeof(r)) == 0);
6834
6835 r = zero; a = max;
6836 secp256k1_ge_storage_cmov(&r, &a, 1);
6837 CHECK(secp256k1_memcmp_var(&r, &max, sizeof(r)) == 0);
6838
6839 a = zero;
6840 secp256k1_ge_storage_cmov(&r, &a, 1);
6841 CHECK(secp256k1_memcmp_var(&r, &zero, sizeof(r)) == 0);
6842
6843 a = one;
6844 secp256k1_ge_storage_cmov(&r, &a, 1);
6845 CHECK(secp256k1_memcmp_var(&r, &one, sizeof(r)) == 0);
6846
6847 r = one; a = zero;
6848 secp256k1_ge_storage_cmov(&r, &a, 0);
6849 CHECK(secp256k1_memcmp_var(&r, &one, sizeof(r)) == 0);
6850}
6851
6852void run_cmov_tests(void) {
6853 int_cmov_test();
6854 fe_cmov_test();
6858}
6859
6860int main(int argc, char **argv) {
6861 /* Disable buffering for stdout to improve reliability of getting
6862 * diagnostic information. Happens right at the start of main because
6863 * setbuf must be used before any other operation on the stream. */
6864 setbuf(stdout, NULL);
6865 /* Also disable buffering for stderr because it's not guaranteed that it's
6866 * unbuffered on all systems. */
6867 setbuf(stderr, NULL);
6868
6869 /* find iteration count */
6870 if (argc > 1) {
6871 count = strtol(argv[1], NULL, 0);
6872 } else {
6873 const char* env = getenv("SECP256K1_TEST_ITERS");
6874 if (env && strlen(env) > 0) {
6875 count = strtol(env, NULL, 0);
6876 }
6877 }
6878 if (count <= 0) {
6879 fputs("An iteration count of 0 or less is not allowed.\n", stderr);
6880 return EXIT_FAILURE;
6881 }
6882 printf("test count = %i\n", count);
6883
6884 /* find random seed */
6885 secp256k1_testrand_init(argc > 2 ? argv[2] : NULL);
6886
6887 /* initialize */
6892 if (secp256k1_testrand_bits(1)) {
6893 unsigned char rand32[32];
6894 secp256k1_testrand256(rand32);
6896 }
6897
6898 run_rand_bits();
6899 run_rand_int();
6900
6901 run_ctz_tests();
6904
6909
6910 /* scalar tests */
6912
6913 /* field tests */
6916 run_fe_mul();
6917 run_sqr();
6918 run_sqrt();
6919
6920 /* group tests */
6921 run_ge();
6923
6924 /* ecmult tests */
6926 run_wnaf();
6935
6936 /* endomorphism tests */
6938
6939 /* EC point parser test */
6941
6942 /* EC key edge cases */
6944
6945 /* EC key arithmetic test */
6947
6948#ifdef ENABLE_MODULE_ECDH
6949 /* ecdh tests */
6951#endif
6952
6953 /* ecdsa tests */
6960
6961#ifdef ENABLE_MODULE_MULTISET
6963#endif
6964
6965#ifdef ENABLE_MODULE_RECOVERY
6966 /* ECDSA pubkey recovery tests */
6968#endif
6969
6970#ifdef ENABLE_MODULE_SCHNORR
6971 /* Schnorr signature tests */
6973#endif
6974
6975#ifdef ENABLE_MODULE_EXTRAKEYS
6977#endif
6978
6979#ifdef ENABLE_MODULE_SCHNORRSIG
6981#endif
6982
6983 /* util tests */
6985
6987
6989
6990 /* shutdown */
6992
6993 printf("no problems found\n");
6994 return 0;
6995}
void run_ecdh_tests(void)
Definition: tests_impl.h:126
static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context *ctx, secp256k1_scalar *r, secp256k1_scalar *s, const secp256k1_scalar *seckey, const secp256k1_scalar *message, const secp256k1_scalar *nonce, int *recid)
static int secp256k1_ecdsa_sig_verify(const secp256k1_scalar *r, const secp256k1_scalar *s, const secp256k1_ge *pubkey, const secp256k1_scalar *message)
static int secp256k1_eckey_pubkey_parse(secp256k1_ge *elem, const unsigned char *pub, size_t size)
static int secp256k1_eckey_pubkey_serialize(secp256k1_ge *elem, unsigned char *pub, size_t *size, int compressed)
static int secp256k1_ecmult_multi_var(const secp256k1_callback *error_callback, secp256k1_scratch *scratch, secp256k1_gej *r, const secp256k1_scalar *inp_g_sc, secp256k1_ecmult_multi_callback cb, void *cbdata, size_t n)
Multi-multiply: R = inp_g_sc * G + sum_i ni * Ai.
#define ECMULT_TABLE_SIZE(w)
The number of entries a table with precomputed multiples needs to have.
Definition: ecmult.h:33
static void secp256k1_ecmult(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_scalar *na, const secp256k1_scalar *ng)
Double multiply: R = na*A + ng*G.
static void secp256k1_ecmult_const(secp256k1_gej *r, const secp256k1_ge *a, const secp256k1_scalar *q, int bits)
Multiply: R = q*A (in constant-time) Here bits should be set to the maximum bitlength of the absolute...
static int secp256k1_wnaf_const(int *wnaf, const secp256k1_scalar *scalar, int w, int size)
Convert a number to WNAF notation.
static void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context *ctx, secp256k1_gej *r, const secp256k1_scalar *a)
Multiply with the generator: R = a*G.
static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context *ctx, const unsigned char *seed32)
#define STRAUSS_SCRATCH_OBJECTS
Definition: ecmult_impl.h:50
static size_t secp256k1_pippenger_bucket_window_inv(int bucket_window)
Returns the maximum optimal number of points for a bucket_window.
Definition: ecmult_impl.h:583
static size_t secp256k1_pippenger_max_points(const secp256k1_callback *error_callback, secp256k1_scratch *scratch)
Returns the maximum number of points in addition to G that can be used with a given scratch space.
Definition: ecmult_impl.h:713
#define WNAF_SIZE(w)
Definition: ecmult_impl.h:46
static int secp256k1_ecmult_strauss_batch_single(const secp256k1_callback *error_callback, secp256k1_scratch *scratch, secp256k1_gej *r, const secp256k1_scalar *inp_g_sc, secp256k1_ecmult_multi_callback cb, void *cbdata, size_t n)
Definition: ecmult_impl.h:379
static int secp256k1_wnaf_fixed(int *wnaf, const secp256k1_scalar *s, int w)
Convert a number to WNAF notation.
Definition: ecmult_impl.h:394
static int secp256k1_ecmult_wnaf(int *wnaf, int len, const secp256k1_scalar *a, int w)
Convert a number to WNAF notation.
Definition: ecmult_impl.h:132
static size_t secp256k1_strauss_scratch_size(size_t n_points)
Definition: ecmult_impl.h:332
#define ECMULT_PIPPENGER_THRESHOLD
Definition: ecmult_impl.h:55
static int secp256k1_pippenger_bucket_window(size_t n)
Returns optimal bucket_window (number of bits of a scalar represented by a set of buckets) for a give...
Definition: ecmult_impl.h:554
static int secp256k1_ecmult_pippenger_batch_single(const secp256k1_callback *error_callback, secp256k1_scratch *scratch, secp256k1_gej *r, const secp256k1_scalar *inp_g_sc, secp256k1_ecmult_multi_callback cb, void *cbdata, size_t n)
Definition: ecmult_impl.h:704
#define ECMULT_MAX_POINTS_PER_BATCH
Definition: ecmult_impl.h:57
#define PIPPENGER_MAX_BUCKET_WINDOW
Definition: ecmult_impl.h:52
#define PIPPENGER_SCRATCH_OBJECTS
Definition: ecmult_impl.h:49
static int secp256k1_ecmult_multi_batch_size_helper(size_t *n_batches, size_t *n_batch_points, size_t max_n_batch_points, size_t n)
Definition: ecmult_impl.h:776
static size_t secp256k1_pippenger_scratch_size(size_t n_points, int bucket_window)
Returns the scratch size required for a given number of points (excluding base point G) without consi...
Definition: ecmult_impl.h:621
#define WNAF_SIZE_BITS(bits, w)
Definition: ecmult_impl.h:45
int(* secp256k1_ecmult_multi_func)(const secp256k1_callback *error_callback, secp256k1_scratch *, secp256k1_gej *, const secp256k1_scalar *, secp256k1_ecmult_multi_callback cb, void *, size_t)
Definition: ecmult_impl.h:794
volatile double sum
Definition: examples.cpp:10
void run_extrakeys_tests(void)
Definition: tests_impl.h:582
static void secp256k1_fe_inv_var(secp256k1_fe *r, const secp256k1_fe *a)
Potentially faster version of secp256k1_fe_inv, without constant-time guarantee.
static int secp256k1_fe_normalizes_to_zero_var(const secp256k1_fe *r)
Verify whether a field element represents zero i.e.
static void secp256k1_fe_normalize_weak(secp256k1_fe *r)
Weakly normalize a field element: reduce its magnitude to 1, but don't fully normalize.
static int secp256k1_fe_is_quad_var(const secp256k1_fe *a)
Checks whether a field element is a quadratic residue.
static int secp256k1_fe_equal_var(const secp256k1_fe *a, const secp256k1_fe *b)
Same as secp256k1_fe_equal, but may be variable time.
static int secp256k1_fe_sqrt(secp256k1_fe *r, const secp256k1_fe *a)
If a has a square root, it is computed in r and 1 is returned.
static void secp256k1_fe_normalize_var(secp256k1_fe *r)
Normalize a field element, without constant-time guarantee.
static void secp256k1_fe_clear(secp256k1_fe *a)
Sets a field element equal to zero, initializing all fields.
static void secp256k1_fe_inv(secp256k1_fe *r, const secp256k1_fe *a)
Sets a field element to be the (modular) inverse of another.
static void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag)
If flag is true, set *r equal to *a; otherwise leave it.
static void secp256k1_fe_mul_int(secp256k1_fe *r, int a)
Multiplies the passed field element with a small integer constant.
static void secp256k1_fe_negate(secp256k1_fe *r, const secp256k1_fe *a, int m)
Set a field element equal to the additive inverse of another.
static int secp256k1_fe_is_odd(const secp256k1_fe *a)
Check the "oddness" of a field element.
static void secp256k1_fe_set_int(secp256k1_fe *r, int a)
Set a field element equal to a small (not greater than 0x7FFF), non-negative integer.
static void secp256k1_fe_mul(secp256k1_fe *r, const secp256k1_fe *a, const secp256k1_fe *SECP256K1_RESTRICT b)
Sets a field element to be the product of two others.
static int secp256k1_fe_set_b32(secp256k1_fe *r, const unsigned char *a)
Set a field element equal to 32-byte big endian value.
static int secp256k1_fe_is_zero(const secp256k1_fe *a)
Verify whether a field element is zero.
static void secp256k1_fe_from_storage(secp256k1_fe *r, const secp256k1_fe_storage *a)
Convert a field element back from the storage type.
static void secp256k1_fe_sqr(secp256k1_fe *r, const secp256k1_fe *a)
Sets a field element to be the square of another.
static int secp256k1_fe_normalizes_to_zero(const secp256k1_fe *r)
Verify whether a field element represents zero i.e.
static void secp256k1_fe_add(secp256k1_fe *r, const secp256k1_fe *a)
Adds a field element to another.
static void secp256k1_fe_normalize(secp256k1_fe *r)
Field element module.
static void secp256k1_fe_to_storage(secp256k1_fe_storage *r, const secp256k1_fe *a)
Convert a field element to the storage type.
static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe *a)
Convert a field element to a 32-byte big endian value.
static void secp256k1_fe_storage_cmov(secp256k1_fe_storage *r, const secp256k1_fe_storage *a, int flag)
If flag is true, set *r equal to *a; otherwise leave it.
static int secp256k1_fe_cmp_var(const secp256k1_fe *a, const secp256k1_fe *b)
Compare two field elements.
#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0)
Definition: field_10x26.h:40
#define SECP256K1_FE_STORAGE_CONST(d7, d6, d5, d4, d3, d2, d1, d0)
Definition: field_10x26.h:47
static const secp256k1_fe secp256k1_fe_one
Definition: field_impl.h:143
#define SECP256K1_GEJ_CONST_INFINITY
Definition: group.h:31
#define SECP256K1_GE_STORAGE_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)
Definition: group.h:38
static void secp256k1_gej_double_var(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr)
Set r equal to the double of a.
static void secp256k1_gej_add_zinv_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, const secp256k1_fe *bzinv)
Set r equal to the sum of a and b (with the inverse of b's Z coordinate passed as bzinv).
static void secp256k1_ge_mul_lambda(secp256k1_ge *r, const secp256k1_ge *a)
Set r to be equal to lambda times a, where lambda is chosen in a way such that this is very fast.
static void secp256k1_gej_set_infinity(secp256k1_gej *r)
Set a group element (jacobian) equal to the point at infinity.
static int secp256k1_gej_is_infinity(const secp256k1_gej *a)
Check whether a group element is the point at infinity.
static void secp256k1_ge_clear(secp256k1_ge *r)
Clear a secp256k1_ge to prevent leaking sensitive information.
static int secp256k1_ge_set_xo_var(secp256k1_ge *r, const secp256k1_fe *x, int odd)
Set a group element (affine) equal to the point with the given X coordinate, and given oddness for Y.
static void secp256k1_gej_add_ge_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, secp256k1_fe *rzr)
Set r equal to the sum of a and b (with b given in affine coordinates).
static void secp256k1_gej_add_ge(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b)
Set r equal to the sum of a and b (with b given in affine coordinates, and not infinity).
static int secp256k1_ge_is_valid_var(const secp256k1_ge *a)
Check whether a group element is valid (i.e., on the curve).
static void secp256k1_ge_from_storage(secp256k1_ge *r, const secp256k1_ge_storage *a)
Convert a group element back from the storage type.
static void secp256k1_gej_add_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_gej *b, secp256k1_fe *rzr)
Set r equal to the sum of a and b.
static void secp256k1_gej_rescale(secp256k1_gej *r, const secp256k1_fe *b)
Rescale a jacobian point by b which must be non-zero.
static void secp256k1_ge_storage_cmov(secp256k1_ge_storage *r, const secp256k1_ge_storage *a, int flag)
If flag is true, set *r equal to *a; otherwise leave it.
static int secp256k1_ge_set_xquad(secp256k1_ge *r, const secp256k1_fe *x)
Set a group element (affine) equal to the point with the given X coordinate and a Y coordinate that i...
static void secp256k1_ge_set_gej(secp256k1_ge *r, secp256k1_gej *a)
Set a group element equal to another which is given in jacobian coordinates.
static void secp256k1_ge_neg(secp256k1_ge *r, const secp256k1_ge *a)
Set r equal to the inverse of a (i.e., mirrored around the X axis)
static int secp256k1_ge_is_infinity(const secp256k1_ge *a)
Check whether a group element is the point at infinity.
static void secp256k1_ge_set_infinity(secp256k1_ge *r)
Set a group element (affine) equal to the point at infinity.
static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a, size_t len)
Set a batch of group elements equal to the inputs given in jacobian coordinates.
static void secp256k1_gej_double(secp256k1_gej *r, const secp256k1_gej *a)
Set r equal to the double of a.
static void secp256k1_gej_set_ge(secp256k1_gej *r, const secp256k1_ge *a)
Set a group element (jacobian) equal to another which is given in affine coordinates.
static void secp256k1_ge_to_storage(secp256k1_ge_storage *r, const secp256k1_ge *a)
Convert a group element to the storage type.
#define SECP256K1_GE_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)
Definition: group.h:19
static void secp256k1_ge_set_gej_var(secp256k1_ge *r, secp256k1_gej *a)
Set a group element equal to another which is given in jacobian coordinates.
static int secp256k1_gej_has_quad_y_var(const secp256k1_gej *a)
Check whether a group element's y coordinate is a quadratic residue.
#define SECP256K1_GEJ_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)
Definition: group.h:30
static void secp256k1_gej_neg(secp256k1_gej *r, const secp256k1_gej *a)
Set r equal to the inverse of a (i.e., mirrored around the X axis)
static const secp256k1_ge secp256k1_ge_const_g
Definition: group_impl.h:62
int ec_privkey_export_der(const secp256k1_context *ctx, uint8_t *privkey, size_t *privkeylen, const uint8_t *key32, bool compressed)
This serializes to a DER encoding of the ECPrivateKey type from section C.4 of SEC 1 http://www....
Definition: key.cpp:101
int ec_privkey_import_der(const secp256k1_context *ctx, uint8_t *out32, const uint8_t *privkey, size_t privkeylen)
These functions are taken from the libsecp256k1 distribution and are very ugly.
Definition: key.cpp:40
static void pool cs
static void secp256k1_modinv32_var(secp256k1_modinv32_signed30 *x, const secp256k1_modinv32_modinfo *modinfo)
static void secp256k1_modinv32(secp256k1_modinv32_signed30 *x, const secp256k1_modinv32_modinfo *modinfo)
static void secp256k1_modinv64(secp256k1_modinv64_signed62 *x, const secp256k1_modinv64_modinfo *modinfo)
static void secp256k1_modinv64_var(secp256k1_modinv64_signed62 *x, const secp256k1_modinv64_modinfo *modinfo)
void run_multiset_tests(void)
Definition: tests_impl.h:336
void printf(const char *fmt, const Args &...args)
Format list of arguments to std::cout, according to the given format string.
Definition: tinyformat.h:1126
const secp256k1_ge_storage secp256k1_pre_g_128[ECMULT_TABLE_SIZE(WINDOW_G)]
const secp256k1_ge_storage secp256k1_pre_g[ECMULT_TABLE_SIZE(WINDOW_G)]
#define WINDOW_G
SchnorrSig sig
Definition: processor.cpp:523
int ecdsa_signature_parse_der_lax(const secp256k1_context *ctx, secp256k1_ecdsa_signature *sig, const uint8_t *input, size_t inputlen)
This function is taken from the libsecp256k1 distribution and implements DER parsing for ECDSA signat...
Definition: pubkey.cpp:28
void run_recovery_tests(void)
Definition: tests_impl.h:387
const char * prefix
Definition: rest.cpp:812
static void secp256k1_scalar_cmov(secp256k1_scalar *r, const secp256k1_scalar *a, int flag)
If flag is true, set *r equal to *a; otherwise leave it.
static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *bin, int *overflow)
Set a scalar from a big endian byte array.
static int secp256k1_scalar_set_b32_seckey(secp256k1_scalar *r, const unsigned char *bin)
Set a scalar from a big endian byte array and returns 1 if it is a valid seckey and 0 otherwise.
static int secp256k1_scalar_is_even(const secp256k1_scalar *a)
Check whether a scalar, considered as an nonnegative integer, is even.
static int secp256k1_scalar_is_zero(const secp256k1_scalar *a)
Check whether a scalar equals zero.
static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v)
Set a scalar to an unsigned integer.
static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b)
Compare two scalars.
static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar *a)
Convert a scalar to a byte array.
static int secp256k1_scalar_cond_negate(secp256k1_scalar *a, int flag)
Conditionally negate a number, in constant time.
static void secp256k1_scalar_inverse_var(secp256k1_scalar *r, const secp256k1_scalar *a)
Compute the inverse of a scalar (modulo the group order), without constant-time guarantee.
static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count)
Access bits from a scalar.
static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b)
Add two scalars together (modulo the group order).
static void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b)
Multiply two scalars (modulo the group order).
static int secp256k1_scalar_is_one(const secp256k1_scalar *a)
Check whether a scalar equals one.
static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a)
Compute the complement of a scalar (modulo the group order).
static int secp256k1_scalar_is_high(const secp256k1_scalar *a)
Check whether a scalar is higher than the group order divided by 2.
static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count)
Access bits from a scalar.
static void secp256k1_scalar_inverse(secp256k1_scalar *r, const secp256k1_scalar *a)
Compute the inverse of a scalar (modulo the group order).
static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag)
Conditionally add a power of two to a scalar.
static void secp256k1_scalar_clear(secp256k1_scalar *r)
Clear a scalar to prevent the leak of sensitive data.
static void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *k)
Find r1 and r2 such that r1+r2*lambda = k, where r1 and r2 or their negations are maximum 128 bits lo...
static int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n)
Shift a scalar right by some amount strictly between 0 and 16, returning the low bits that were shift...
#define SECP256K1_SCALAR_CONST(d7, d6, d5, d4, d3, d2, d1, d0)
Definition: scalar_4x64.h:17
static SECP256K1_INLINE int secp256k1_scalar_check_overflow(const secp256k1_scalar *a)
static const secp256k1_scalar secp256k1_scalar_zero
Definition: scalar_impl.h:32
static const secp256k1_scalar secp256k1_scalar_one
Definition: scalar_impl.h:31
static const secp256k1_scalar secp256k1_const_lambda
The Secp256k1 curve has an endomorphism, where lambda * (x, y) = (beta * x, y), where lambda is:
Definition: scalar_impl.h:64
void run_schnorr_tests(void)
Definition: tests_impl.h:512
void run_schnorrsig_tests(void)
Definition: tests_impl.h:888
static void secp256k1_scratch_apply_checkpoint(const secp256k1_callback *error_callback, secp256k1_scratch *scratch, size_t checkpoint)
Applies a check point received from secp256k1_scratch_checkpoint, undoing all allocations since that ...
static void secp256k1_scratch_destroy(const secp256k1_callback *error_callback, secp256k1_scratch *scratch)
static secp256k1_scratch * secp256k1_scratch_create(const secp256k1_callback *error_callback, size_t max_size)
static size_t secp256k1_scratch_max_allocation(const secp256k1_callback *error_callback, const secp256k1_scratch *scratch, size_t n_objects)
Returns the maximum allocation the scratch space will allow.
static void * secp256k1_scratch_alloc(const secp256k1_callback *error_callback, secp256k1_scratch *scratch, size_t n)
Returns a pointer into the most recently allocated frame, or NULL if there is insufficient available ...
static size_t secp256k1_scratch_checkpoint(const secp256k1_callback *error_callback, const secp256k1_scratch *scratch)
Returns an opaque object used to "checkpoint" a scratch space.
static void secp256k1_sha256_initialize(secp256k1_sha256 *hash)
static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256 *rng, unsigned char *out, size_t outlen)
static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256 *hash, unsigned char *out32)
static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256 *hash, const unsigned char *key, size_t size)
static void secp256k1_sha256_finalize(secp256k1_sha256 *hash, unsigned char *out32)
static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256 *rng, const unsigned char *key, size_t keylen)
static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256 *rng)
static void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256 *hash, const unsigned char *data, size_t size)
static void secp256k1_sha256_write(secp256k1_sha256 *hash, const unsigned char *data, size_t size)
static SECP256K1_INLINE int secp256k1_ctz64_var(uint64_t x)
Definition: util.h:324
static SECP256K1_INLINE int secp256k1_memcmp_var(const void *s1, const void *s2, size_t n)
Semantics like memcmp.
Definition: util.h:221
static SECP256K1_INLINE void secp256k1_int_cmov(int *r, const int *a, int flag)
If flag is true, set *r equal to *a; otherwise leave it.
Definition: util.h:235
#define VG_CHECK(x, y)
Definition: util.h:107
#define ALIGNMENT
Definition: util.h:140
#define VG_UNDEF(x, y)
Definition: util.h:106
static SECP256K1_INLINE int secp256k1_ctz32_var(uint32_t x)
Definition: util.h:306
static void secp256k1_default_illegal_callback_fn(const char *str, void *data)
Definition: util.h:29
static SECP256K1_INLINE int secp256k1_ctz64_var_debruijn(uint64_t x)
Definition: util.h:295
#define CHECK(cond)
Definition: util.h:80
static SECP256K1_INLINE int secp256k1_ctz32_var_debruijn(uint32_t x)
Definition: util.h:283
static SECP256K1_INLINE void * checked_malloc(const secp256k1_callback *cb, size_t size)
Definition: util.h:118
static SECP256K1_INLINE void secp256k1_memczero(void *s, size_t len, int flag)
Definition: util.h:202
static void secp256k1_ecdsa_signature_save(secp256k1_ecdsa_signature *sig, const secp256k1_scalar *r, const secp256k1_scalar *s)
Definition: secp256k1.c:309
static int secp256k1_pubkey_load(const secp256k1_context *ctx, secp256k1_ge *ge, const secp256k1_pubkey *pubkey)
Definition: secp256k1.c:195
static void secp256k1_pubkey_save(secp256k1_pubkey *pubkey, secp256k1_ge *ge)
Definition: secp256k1.c:214
static int nonce_function_rfc6979(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter)
Definition: secp256k1.c:421
static void secp256k1_ecdsa_signature_load(const secp256k1_context *ctx, secp256k1_scalar *r, secp256k1_scalar *s, const secp256k1_ecdsa_signature *sig)
Definition: secp256k1.c:295
SECP256K1_API void secp256k1_context_destroy(secp256k1_context *ctx) SECP256K1_ARG_NONNULL(1)
Destroy a secp256k1 context object (created in dynamically allocated memory).
Definition: secp256k1.c:146
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_tweak_mul(const secp256k1_context *ctx, unsigned char *seckey, const unsigned char *tweak32) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Tweak a secret key by multiplying it by a tweak.
Definition: secp256k1.c:656
#define SECP256K1_CONTEXT_SIGN
Definition: secp256k1.h:185
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT secp256k1_scratch_space * secp256k1_scratch_space_create(const secp256k1_context *ctx, size_t size) SECP256K1_ARG_NONNULL(1)
Create a secp256k1 scratch space object.
Definition: secp256k1.c:171
SECP256K1_API const secp256k1_context * secp256k1_context_no_precomp
A simple secp256k1 context object with no precomputed tables.
Definition: secp256k1.c:60
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.
Definition: secp256k1.c:703
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(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Add a number of public keys together.
Definition: secp256k1.c:711
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_negate(const secp256k1_context *ctx, unsigned char *seckey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2)
Negates a secret key in place.
Definition: secp256k1.c:566
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.
Definition: secp256k1.c:335
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.
Definition: secp256k1.c:246
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.
Definition: secp256k1.c:162
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_cmp(const secp256k1_context *ctx, const secp256k1_pubkey *pubkey1, const secp256k1_pubkey *pubkey2) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Compare two public keys using lexicographic (of compressed serialization) order.
Definition: secp256k1.c:269
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.
Definition: secp256k1.c:525
SECP256K1_API secp256k1_context * secp256k1_context_create(unsigned int flags) SECP256K1_WARN_UNUSED_RESULT
Create a secp256k1 context object (in dynamically allocated memory).
Definition: secp256k1.c:107
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.
Definition: secp256k1.c:153
SECP256K1_API int secp256k1_ecdsa_sign(const secp256k1_context *ctx, secp256k1_ecdsa_signature *sig, const unsigned char *msghash32, 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.
Definition: secp256k1.c:510
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.
Definition: secp256k1.c:228
#define SECP256K1_CONTEXT_NONE
Definition: secp256k1.h:187
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.
Definition: secp256k1.c:319
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_negate(const secp256k1_context *ctx, unsigned char *seckey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2)
Same as secp256k1_ec_seckey_negate, but DEPRECATED.
Definition: secp256k1.c:581
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.
Definition: secp256k1.c:548
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_tagged_sha256(const secp256k1_context *ctx, unsigned char *hash32, const unsigned char *tag, size_t taglen, const unsigned char *msg, size_t msglen) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(5)
Compute a tagged hash as defined in BIP-340.
Definition: secp256k1.c:737
#define SECP256K1_EC_COMPRESSED
Flag to pass to secp256k1_ec_pubkey_serialize.
Definition: secp256k1.h:190
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_verify(const secp256k1_context *ctx, const secp256k1_ecdsa_signature *sig, const unsigned char *msghash32, const secp256k1_pubkey *pubkey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4)
Verify an ECDSA signature.
Definition: secp256k1.c:400
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.
Definition: secp256k1.c:381
SECP256K1_API secp256k1_context * secp256k1_context_clone(const secp256k1_context *ctx) SECP256K1_ARG_NONNULL(1) SECP256K1_WARN_UNUSED_RESULT
Copy a secp256k1 context object (into dynamically allocated memory).
Definition: secp256k1.c:128
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_add(const secp256k1_context *ctx, secp256k1_pubkey *pubkey, const unsigned char *tweak32) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Tweak a public key by adding tweak times the generator to it.
Definition: secp256k1.c:639
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_add(const secp256k1_context *ctx, unsigned char *seckey, const unsigned char *tweak32) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Same as secp256k1_ec_seckey_tweak_add, but DEPRECATED.
Definition: secp256k1.c:628
#define SECP256K1_EC_UNCOMPRESSED
Definition: secp256k1.h:191
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_mul(const secp256k1_context *ctx, unsigned char *seckey, const unsigned char *tweak32) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Same as secp256k1_ec_seckey_tweak_mul, but DEPRECATED.
Definition: secp256k1.c:676
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.
Definition: secp256k1.c:356
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.
Definition: secp256k1.c:585
SECP256K1_API void secp256k1_scratch_space_destroy(const secp256k1_context *ctx, secp256k1_scratch_space *scratch) SECP256K1_ARG_NONNULL(1)
Destroy a secp256k1 scratch space.
Definition: secp256k1.c:176
#define SECP256K1_CONTEXT_VERIFY
Flags to pass to secp256k1_context_create, secp256k1_context_preallocated_size, and secp256k1_context...
Definition: secp256k1.h:184
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_tweak_add(const secp256k1_context *ctx, unsigned char *seckey, const unsigned char *tweak32) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Tweak a secret key by adding tweak to it.
Definition: secp256k1.c:612
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_mul(const secp256k1_context *ctx, secp256k1_pubkey *pubkey, const unsigned char *tweak32) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Tweak a public key by multiplying it by a tweak value.
Definition: secp256k1.c:680
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.
Definition: secp256k1.c:368
SECP256K1_API size_t secp256k1_context_preallocated_clone_size(const secp256k1_context *ctx) SECP256K1_ARG_NONNULL(1) SECP256K1_WARN_UNUSED_RESULT
Determine the memory size of a secp256k1 context object to be copied into caller-provided memory.
Definition: secp256k1.c:76
SECP256K1_API void secp256k1_context_preallocated_destroy(secp256k1_context *ctx) SECP256K1_ARG_NONNULL(1)
Destroy a secp256k1 context object that has been created in caller-provided memory.
Definition: secp256k1.c:139
SECP256K1_API secp256k1_context * secp256k1_context_preallocated_create(void *prealloc, unsigned int flags) SECP256K1_ARG_NONNULL(1) SECP256K1_WARN_UNUSED_RESULT
Create a secp256k1 context object in caller-provided memory.
Definition: secp256k1.c:82
SECP256K1_API size_t secp256k1_context_preallocated_size(unsigned int flags) SECP256K1_WARN_UNUSED_RESULT
Determine the memory size of a secp256k1 context object to be created in caller-provided memory.
Definition: secp256k1.c:62
SECP256K1_API secp256k1_context * secp256k1_context_preallocated_clone(const secp256k1_context *ctx, void *prealloc) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_WARN_UNUSED_RESULT
Copy a secp256k1 context object into caller-provided memory.
Definition: secp256k1.c:118
secp256k1_scalar * sc
Definition: tests.c:3831
secp256k1_ge * pt
Definition: tests.c:3832
void(* fn)(const char *text, void *data)
Definition: util.h:20
secp256k1_callback error_callback
Definition: secp256k1.c:50
secp256k1_ecmult_gen_context ecmult_gen_ctx
Definition: secp256k1.c:48
Opaque data structured that holds a parsed ECDSA signature.
Definition: secp256k1.h:83
secp256k1_scalar blind
Definition: ecmult_gen.h:27
uint32_t n[10]
Definition: field_10x26.h:16
A group element of the secp256k1 curve, in affine coordinates.
Definition: group.h:13
int infinity
Definition: group.h:16
secp256k1_fe x
Definition: group.h:14
secp256k1_fe y
Definition: group.h:15
A group element of the secp256k1 curve, in jacobian coordinates.
Definition: group.h:23
secp256k1_fe y
Definition: group.h:25
secp256k1_fe x
Definition: group.h:24
int infinity
Definition: group.h:27
secp256k1_fe z
Definition: group.h:26
secp256k1_modinv32_signed30 modulus
Definition: modinv32.h:25
secp256k1_modinv64_signed62 modulus
Definition: modinv64.h:29
Opaque data structure that holds a parsed and valid public key.
Definition: secp256k1.h:70
A scalar modulo the group order of the secp256k1 curve.
Definition: scalar_4x64.h:13
uint64_t d[4]
Definition: scalar_4x64.h:14
size_t alloc_size
amount that has been allocated (i.e.
Definition: scratch.h:19
static uint32_t secp256k1_testrand_int(uint32_t range)
Generate a pseudorandom number in the range [0..range-1].
static void secp256k1_testrand_bytes_test(unsigned char *bytes, size_t len)
Generate pseudorandom bytes with long sequences of zero and one bits.
static void secp256k1_testrand256(unsigned char *b32)
Generate a pseudorandom 32-byte array.
static void secp256k1_testrand_init(const char *hexseed)
Initialize the test RNG using (hex encoded) array up to 16 bytes, or randomly if hexseed is NULL.
static void secp256k1_testrand_finish(void)
Print final test information.
static SECP256K1_INLINE uint32_t secp256k1_testrand32(void)
Generate a pseudorandom number in the range [0..2**32-1].
static void secp256k1_testrand256_test(unsigned char *b32)
Generate a pseudorandom 32-byte array with long sequences of zero and one bits.
static SECP256K1_INLINE uint64_t secp256k1_testrand_bits(int bits)
Generate a pseudorandom number in the range [0..2**bits-1].
void test_ecmult_multi_batching(void)
Run secp256k1_ecmult_multi_var with num points and a scratch space restricted to 1 <= i <= num points...
Definition: tests.c:4377
void random_scalar_order(secp256k1_scalar *num)
Definition: tests.c:118
void run_group_decompress(void)
Definition: tests.c:3442
void run_random_pubkeys(void)
Definition: tests.c:6002
static secp256k1_context * ctx
Definition: tests.c:34
void scalar_test(void)
Definition: tests.c:1587
int fe_identical(const secp256k1_fe *a, const secp256k1_fe *b)
Definition: tests.c:2457
void test_intialized_inf(void)
Definition: tests.c:3238
void test_ecmult_target(const secp256k1_scalar *target, int mode)
Definition: tests.c:3655
void fe_cmov_test(void)
Definition: tests.c:6730
void test_inverse_field(secp256k1_fe *out, const secp256k1_fe *x, int var)
Definition: tests.c:2717
void run_modinv_tests(void)
Definition: tests.c:948
int test_ecdsa_der_parse(const unsigned char *sig, size_t siglen, int certainly_der, int certainly_not_der)
Definition: tests.c:6016
void test_ecmult_multi_batch_size_helper(void)
Definition: tests.c:4329
void run_ec_pubkey_parse_test(void)
Definition: tests.c:5036
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)
Definition: tests.c:5705
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)
Definition: tests.c:5713
#define SECP256K1_EC_PARSE_TEST_NINVALID
void run_endomorphism_tests(void)
Definition: tests.c:4940
void test_pre_g_table(const secp256k1_ge_storage *pre_g, size_t n)
Definition: tests.c:3453
void run_sha256_tests(void)
Definition: tests.c:448
void ecmult_const_random_mult(void)
Definition: tests.c:3727
void test_ge(void)
Definition: tests.c:3038
void run_eckey_edge_case_test(void)
Definition: tests.c:5364
void test_ecmult_gen_blind_reset(void)
Definition: tests.c:4892
void run_fe_mul(void)
Definition: tests.c:2591
void run_ec_combine(void)
Definition: tests.c:3371
void run_ecmult_pre_g(void)
Definition: tests.c:3503
void test_fe_mul(const secp256k1_fe *a, const secp256k1_fe *b, int use_sqr)
Definition: tests.c:2548
int main(int argc, char **argv)
Definition: tests.c:6860
void test_secp256k1_pippenger_bucket_window_inv(void)
Definition: tests.c:4276
void run_cmov_tests(void)
Definition: tests.c:6852
void run_field_convert(void)
Definition: tests.c:2426
void test_ecdsa_end_to_end(void)
Definition: tests.c:5748
#define SECP256K1_EC_PARSE_TEST_NVALID
void run_field_misc(void)
Definition: tests.c:2468
void test_sqrt(const secp256k1_fe *a, const secp256k1_fe *k)
Definition: tests.c:2628
void test_ecmult_constants_2bit(void)
Definition: tests.c:4748
void random_field_element_magnitude(secp256k1_fe *fe)
Definition: tests.c:62
void mulmod256(uint16_t *out, const uint16_t *a, const uint16_t *b, const uint16_t *m)
Definition: tests.c:692
void random_scalar_order_test(secp256k1_scalar *num)
Definition: tests.c:105
void test_point_times_order(const secp256k1_gej *point)
Definition: tests.c:3591
static void random_ber_signature(unsigned char *sig, size_t *len, int *certainly_der, int *certainly_not_der)
Definition: tests.c:6115
#define CONDITIONAL_TEST(cnt, nam)
Definition: tests.c:31
void test_ecmult_multi(secp256k1_scratch *scratch, secp256k1_ecmult_multi_func ecmult_multi)
Definition: tests.c:3850
void random_sign(secp256k1_scalar *sigr, secp256k1_scalar *sigs, const secp256k1_scalar *key, const secp256k1_scalar *msg, int *recid)
Definition: tests.c:5655
void int_cmov_test(void)
Definition: tests.c:6705
void run_ctz_tests(void)
Definition: tests.c:427
void ecmult_const_chain_multiply(void)
Definition: tests.c:3797
static void assign_big_endian(unsigned char *ptr, size_t ptrlen, uint32_t val)
Definition: tests.c:6076
void random_group_element_test(secp256k1_ge *ge)
Definition: tests.c:78
void test_modinv32_uint16(uint16_t *out, const uint16_t *in, const uint16_t *mod)
Definition: tests.c:807
void scalar_cmov_test(void)
Definition: tests.c:6790
void run_hmac_sha256_tests(void)
Definition: tests.c:484
void ge_equals_ge(const secp256k1_ge *a, const secp256k1_ge *b)
Definition: tests.c:2990
void test_rand_int(uint32_t range, uint32_t subrange)
Definition: tests.c:638
void run_rand_int(void)
Definition: tests.c:662
void random_fe_test(secp256k1_fe *x)
Definition: tests.c:2387
void ge_equals_gej(const secp256k1_ge *a, const secp256k1_gej *b)
Definition: tests.c:3021
void test_wnaf(const secp256k1_scalar *number, int w)
Definition: tests.c:4471
int is_empty_signature(const secp256k1_ecdsa_signature *sig)
Definition: tests.c:5743
void random_fe_non_zero(secp256k1_fe *nz)
Definition: tests.c:2397
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)
Dummy nonce generation function that just uses a precomputed nonce, and fails if it is not accepted.
Definition: tests.c:5697
void test_add_neg_y_diff_x(void)
Definition: tests.c:3270
void run_ecdsa_sign_verify(void)
Definition: tests.c:5689
static const secp256k1_scalar scalar_minus_one
Definition: tests.c:2678
void run_rand_bits(void)
Definition: tests.c:654
void test_ecmult_accumulate(secp256k1_sha256 *acc, const secp256k1_scalar *x, secp256k1_scratch *scratch)
Definition: tests.c:4715
void random_group_element_jacobian_test(secp256k1_gej *gej, const secp256k1_ge *ge)
Definition: tests.c:90
int coprime(const uint16_t *a, const uint16_t *b)
Definition: tests.c:918
void run_ecmult_constants(void)
Definition: tests.c:4835
void random_scalar_order_b32(unsigned char *b32)
Definition: tests.c:131
void run_pubkey_comparison(void)
Definition: tests.c:5953
int gej_xyz_equals_gej(const secp256k1_gej *a, const secp256k1_gej *b)
Definition: tests.c:3000
void test_random_pubkeys(void)
Definition: tests.c:5893
void run_sqrt(void)
Definition: tests.c:2642
void test_ecdsa_sign_verify(void)
Definition: tests.c:5662
void ge_storage_cmov_test(void)
Definition: tests.c:6820
void run_inverse_tests(void)
Definition: tests.c:2742
void run_ge(void)
Definition: tests.c:3337
void ecmult_const_mult_zero_one(void)
Definition: tests.c:3775
void run_ecdsa_end_to_end(void)
Definition: tests.c:6009
void ecmult_const_commutativity(void)
Definition: tests.c:3754
void test_constant_wnaf(const secp256k1_scalar *number, int w)
Definition: tests.c:4520
void ec_pubkey_parse_pointtest(const unsigned char *input, int xvalid, int yvalid)
Definition: tests.c:4961
void test_ecmult_gen_blind(void)
Definition: tests.c:4869
static int ecmult_multi_callback(secp256k1_scalar *sc, secp256k1_ge *pt, size_t idx, void *cbdata)
Definition: tests.c:3835
void fe_storage_cmov_test(void)
Definition: tests.c:6760
void run_ecmult_near_split_bound(void)
Definition: tests.c:3694
void test_fixed_wnaf(const secp256k1_scalar *number, int w)
Definition: tests.c:4560
void test_ecdsa_edge_cases(void)
Definition: tests.c:6293
void test_inverse_scalar(secp256k1_scalar *out, const secp256k1_scalar *x, int var)
Definition: tests.c:2695
void test_group_decompress(const secp256k1_fe *x)
Definition: tests.c:3378
void test_fixed_wnaf_small_helper(int *wnaf, int *wnaf_expected, int w)
Definition: tests.c:4597
void run_ecmult_gen_blind(void)
Definition: tests.c:4904
int test_ecmult_multi_random(secp256k1_scratch *scratch)
Definition: tests.c:4088
void run_scalar_set_b32_seckey_tests(void)
Definition: tests.c:1752
void run_secp256k1_memczero_test(void)
Definition: tests.c:6690
static void counting_illegal_callback_fn(const char *str, void *data)
Definition: tests.c:36
void random_fe_non_square(secp256k1_fe *ns)
Definition: tests.c:2410
void run_point_times_order(void)
Definition: tests.c:3706
static void uncounting_illegal_callback_fn(const char *str, void *data)
Definition: tests.c:44
void test_scalar_split(const secp256k1_scalar *full)
Definition: tests.c:4913
static const secp256k1_scalar scalars_near_split_bounds[20]
Definition: tests.c:3632
void run_eckey_negate_test(void)
Definition: tests.c:5620
void uint16_to_signed30(secp256k1_modinv32_signed30 *out, const uint16_t *in)
Definition: tests.c:774
static int count
Definition: tests.c:33
void random_fe(secp256k1_fe *x)
Definition: tests.c:2377
void test_fixed_wnaf_small(void)
Definition: tests.c:4607
void test_ecmult_multi_pippenger_max_points(void)
Probabilistically test the function returning the maximum number of possible points for a given scrat...
Definition: tests.c:4296
void run_ecmult_multi_tests(void)
Definition: tests.c:4444
void run_ecdsa_edge_cases(void)
Definition: tests.c:6662
void test_ecmult_multi_batch_single(secp256k1_ecmult_multi_func ecmult_multi)
Definition: tests.c:4256
void test_constant_wnaf_negate(const secp256k1_scalar *number)
Definition: tests.c:4505
void test_ecmult_constants_sha(uint32_t prefix, size_t iter, const unsigned char *expected32)
Definition: tests.c:4792
void run_rfc6979_hmac_sha256_tests(void)
Definition: tests.c:528
static int test_ecmult_accumulate_cb(secp256k1_scalar *sc, secp256k1_ge *pt, size_t idx, void *data)
Definition: tests.c:4707
static int ecmult_multi_false_callback(secp256k1_scalar *sc, secp256k1_ge *pt, size_t idx, void *cbdata)
Definition: tests.c:3842
void run_tagged_sha256_tests(void)
Definition: tests.c:569
int check_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b)
Definition: tests.c:2418
void run_sqr(void)
Definition: tests.c:2612
void run_ecmult_chain(void)
Definition: tests.c:3527
void run_ecdsa_der_parse(void)
Definition: tests.c:6261
void mutate_sign_signed30(secp256k1_modinv32_signed30 *x)
Definition: tests.c:792
uint64_t modinv2p64(uint64_t x)
Definition: tests.c:676
void random_field_element_test(secp256k1_fe *fe)
Definition: tests.c:52
void run_wnaf(void)
Definition: tests.c:4661
void run_scratch_tests(void)
Definition: tests.c:344
void run_context_tests(int use_prealloc)
Definition: tests.c:137
void signed30_to_uint16(uint16_t *out, const secp256k1_modinv32_signed30 *in)
Definition: tests.c:783
void test_ec_combine(void)
Definition: tests.c:3346
void run_ecmult_const_tests(void)
Definition: tests.c:3823
#define SECP256K1_EC_PARSE_TEST_NXVALID
static void damage_array(unsigned char *sig, size_t *len)
Definition: tests.c:6088
void test_rand_bits(int rand32, int bits)
Definition: tests.c:603
void run_scalar_tests(void)
Definition: tests.c:1769
static const secp256k1_fe fe_minus_one
Definition: tests.c:2683