Bitcoin ABC 0.32.11
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#include <stdio.h>
8#include <stdlib.h>
9#include <string.h>
10
11#include <time.h>
12
13#include "secp256k1.c"
14#include "../include/secp256k1.h"
15#include "../include/secp256k1_preallocated.h"
16#include "testrand_impl.h"
17#include "util.h"
18
19#include "../contrib/lax_der_parsing.c"
20#include "../contrib/lax_der_privatekey_parsing.c"
21
22#include "modinv32_impl.h"
23#ifdef SECP256K1_WIDEMUL_INT128
24#include "modinv64_impl.h"
25#include "int128_impl.h"
26#endif
27
28#define CONDITIONAL_TEST(cnt, nam) if (COUNT < (cnt)) { printf("Skipping %s (iteration count too low)\n", nam); } else
29
30static int COUNT = 64;
31static secp256k1_context *CTX = NULL;
33
34static void counting_illegal_callback_fn(const char* str, void* data) {
35 /* Dummy callback function that just counts. */
36 int32_t *p;
37 (void)str;
38 p = data;
39 (*p)++;
40}
41
42static void uncounting_illegal_callback_fn(const char* str, void* data) {
43 /* Dummy callback function that just counts (backwards). */
44 int32_t *p;
45 (void)str;
46 p = data;
47 (*p)--;
48}
49
51 do {
52 unsigned char b32[32];
54 if (secp256k1_fe_set_b32(fe, b32)) {
55 break;
56 }
57 } while(1);
58}
59
61 secp256k1_fe zero;
62 int n = secp256k1_testrand_int(9);
64 if (n == 0) {
65 return;
66 }
67 secp256k1_fe_clear(&zero);
68 secp256k1_fe_negate(&zero, &zero, 0);
69 secp256k1_fe_mul_int(&zero, n - 1);
70 secp256k1_fe_add(fe, &zero);
71#ifdef VERIFY
72 CHECK(fe->magnitude == n);
73#endif
74}
75
77 secp256k1_fe fe;
78 do {
82 break;
83 }
84 } while(1);
85 ge->infinity = 0;
86}
87
89 secp256k1_fe z2, z3;
90 do {
92 if (!secp256k1_fe_is_zero(&gej->z)) {
93 break;
94 }
95 } while(1);
96 secp256k1_fe_sqr(&z2, &gej->z);
97 secp256k1_fe_mul(&z3, &z2, &gej->z);
98 secp256k1_fe_mul(&gej->x, &ge->x, &z2);
99 secp256k1_fe_mul(&gej->y, &ge->y, &z3);
100 gej->infinity = ge->infinity;
101}
102
104 secp256k1_ge ge;
107}
108
110 do {
111 unsigned char b32[32];
112 int overflow = 0;
114 secp256k1_scalar_set_b32(num, b32, &overflow);
115 if (overflow || secp256k1_scalar_is_zero(num)) {
116 continue;
117 }
118 break;
119 } while(1);
120}
121
123 do {
124 unsigned char b32[32];
125 int overflow = 0;
127 secp256k1_scalar_set_b32(num, b32, &overflow);
128 if (overflow || secp256k1_scalar_is_zero(num)) {
129 continue;
130 }
131 break;
132 } while(1);
133}
134
135void random_scalar_order_b32(unsigned char *b32) {
138 secp256k1_scalar_get_b32(b32, &num);
139}
140
142 /* Test public API */
144}
145
147 return a->built == b->built
148 && secp256k1_scalar_eq(&a->blind, &b->blind)
150}
151
153 return a->declassify == b->declassify
159}
160
162 /* Check that a context created with any of the flags in the flags array is
163 * identical to the NONE context. */
164 unsigned int flags[] = { SECP256K1_CONTEXT_SIGN,
168 int i;
169 for (i = 0; i < (int)(sizeof(flags)/sizeof(flags[0])); i++) {
170 secp256k1_context *tmp_ctx;
172 tmp_ctx = secp256k1_context_create(flags[i]);
173 CHECK(context_eq(none_ctx, tmp_ctx));
175 }
177}
178
180 int ecount = 0;
181 int ecount2 = 10;
182 secp256k1_pubkey pubkey;
183 secp256k1_pubkey zero_pubkey;
185 unsigned char ctmp[32];
186
187 /* Setup */
190 memset(ctmp, 1, 32);
191 memset(&zero_pubkey, 0, sizeof(zero_pubkey));
192
193 /* Verify context-type checking illegal-argument errors. */
194 CHECK(secp256k1_ec_pubkey_create(STATIC_CTX, &pubkey, ctmp) == 0);
195 CHECK(ecount == 1);
196 VG_UNDEF(&pubkey, sizeof(pubkey));
197 CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey, ctmp) == 1);
198 VG_CHECK(&pubkey, sizeof(pubkey));
199 CHECK(secp256k1_ecdsa_sign(STATIC_CTX, &sig, ctmp, ctmp, NULL, NULL) == 0);
200 CHECK(ecount == 2);
201 VG_UNDEF(&sig, sizeof(sig));
202 CHECK(secp256k1_ecdsa_sign(CTX, &sig, ctmp, ctmp, NULL, NULL) == 1);
203 VG_CHECK(&sig, sizeof(sig));
204 CHECK(ecount2 == 10);
205 CHECK(secp256k1_ecdsa_verify(CTX, &sig, ctmp, &pubkey) == 1);
206 CHECK(ecount2 == 10);
207 CHECK(secp256k1_ecdsa_verify(STATIC_CTX, &sig, ctmp, &pubkey) == 1);
208 CHECK(ecount == 2);
209 CHECK(secp256k1_ec_pubkey_tweak_add(CTX, &pubkey, ctmp) == 1);
210 CHECK(ecount2 == 10);
211 CHECK(secp256k1_ec_pubkey_tweak_add(STATIC_CTX, &pubkey, ctmp) == 1);
212 CHECK(ecount == 2);
213 CHECK(secp256k1_ec_pubkey_tweak_mul(CTX, &pubkey, ctmp) == 1);
214 CHECK(ecount2 == 10);
216 CHECK(ecount == 2);
217 CHECK(secp256k1_ec_pubkey_negate(CTX, &pubkey) == 1);
218 CHECK(ecount == 2);
219 CHECK(secp256k1_ec_pubkey_negate(STATIC_CTX, &zero_pubkey) == 0);
220 CHECK(ecount == 3);
222 CHECK(ecount2 == 11);
223 CHECK(secp256k1_ec_pubkey_tweak_mul(STATIC_CTX, &pubkey, ctmp) == 1);
224 CHECK(ecount == 3);
225
226 /* Clean up */
229}
230
232 int32_t dummy = 0;
233
234 /* Check that deprecated secp256k1_context_no_precomp is an alias to secp256k1_context_static. */
236
237 /* check if sizes for cloning are consistent */
239
240 /* Verify that setting and resetting illegal callback works */
245}
246
247void run_proper_context_tests(int use_prealloc) {
248 int32_t dummy = 0;
249 secp256k1_context *my_ctx;
250 void *my_ctx_prealloc = NULL;
251
252 secp256k1_gej pubj;
253 secp256k1_ge pub;
254 secp256k1_scalar msg, key, nonce;
255 secp256k1_scalar sigr, sigs;
256 if (use_prealloc) {
258 CHECK(my_ctx_prealloc != NULL);
260 } else {
262 }
263
264 /* set error callback (to a function that still aborts in case malloc() fails in secp256k1_context_clone() below) */
268
269 /* check if sizes for cloning are consistent */
271
272 /*** clone and destroy all of them to make sure cloning was complete ***/
273 {
274 secp256k1_context *ctx_tmp;
275
276 if (use_prealloc) {
277 /* clone into a non-preallocated context and then again into a new preallocated one. */
278 ctx_tmp = my_ctx; my_ctx = secp256k1_context_clone(my_ctx); secp256k1_context_preallocated_destroy(ctx_tmp);
279 free(my_ctx_prealloc); my_ctx_prealloc = malloc(secp256k1_context_preallocated_size(SECP256K1_CONTEXT_NONE)); CHECK(my_ctx_prealloc != NULL);
280 ctx_tmp = my_ctx; my_ctx = secp256k1_context_preallocated_clone(my_ctx, my_ctx_prealloc); secp256k1_context_destroy(ctx_tmp);
281 } else {
282 /* clone into a preallocated context and then again into a new non-preallocated one. */
283 void *prealloc_tmp;
284
285 prealloc_tmp = malloc(secp256k1_context_preallocated_size(SECP256K1_CONTEXT_NONE)); CHECK(prealloc_tmp != NULL);
286 ctx_tmp = my_ctx; my_ctx = secp256k1_context_preallocated_clone(my_ctx, prealloc_tmp); secp256k1_context_destroy(ctx_tmp);
287 ctx_tmp = my_ctx; my_ctx = secp256k1_context_clone(my_ctx); secp256k1_context_preallocated_destroy(ctx_tmp);
288 free(prealloc_tmp);
289 }
290 }
291
292 /* Verify that the error callback makes it across the clone. */
295 /* And that it resets back to default. */
296 secp256k1_context_set_error_callback(my_ctx, NULL, NULL);
298
299 /* Verify that setting and resetting illegal callback works */
302 secp256k1_context_set_illegal_callback(my_ctx, NULL, NULL);
304
305 /*** attempt to use them ***/
308 secp256k1_ecmult_gen(&my_ctx->ecmult_gen_ctx, &pubj, &key);
309 secp256k1_ge_set_gej(&pub, &pubj);
310
311 /* obtain a working nonce */
312 do {
314 } while(!secp256k1_ecdsa_sig_sign(&my_ctx->ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &nonce, NULL));
315
316 /* try signing */
317 CHECK(secp256k1_ecdsa_sig_sign(&my_ctx->ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &nonce, NULL));
318
319 /* try verifying */
320 CHECK(secp256k1_ecdsa_sig_verify(&sigr, &sigs, &pub, &msg));
321
322 /* cleanup */
323 if (use_prealloc) {
325 free(my_ctx_prealloc);
326 } else {
328 }
329 /* Defined as no-op. */
332}
333
335 const size_t adj_alloc = ((500 + ALIGNMENT - 1) / ALIGNMENT) * ALIGNMENT;
336
337 int32_t ecount = 0;
338 size_t checkpoint;
339 size_t checkpoint_2;
341 secp256k1_scratch_space local_scratch;
342
345
346 /* Test public API */
347 scratch = secp256k1_scratch_space_create(CTX, 1000);
348 CHECK(scratch != NULL);
349 CHECK(ecount == 0);
350
351 /* Test internal API */
353 CHECK(secp256k1_scratch_max_allocation(&CTX->error_callback, scratch, 1) == 1000 - (ALIGNMENT - 1));
354 CHECK(scratch->alloc_size == 0);
355 CHECK(scratch->alloc_size % ALIGNMENT == 0);
356
357 /* Allocating 500 bytes succeeds */
358 checkpoint = secp256k1_scratch_checkpoint(&CTX->error_callback, scratch);
359 CHECK(secp256k1_scratch_alloc(&CTX->error_callback, scratch, 500) != NULL);
360 CHECK(secp256k1_scratch_max_allocation(&CTX->error_callback, scratch, 0) == 1000 - adj_alloc);
361 CHECK(secp256k1_scratch_max_allocation(&CTX->error_callback, scratch, 1) == 1000 - adj_alloc - (ALIGNMENT - 1));
362 CHECK(scratch->alloc_size != 0);
363 CHECK(scratch->alloc_size % ALIGNMENT == 0);
364
365 /* Allocating another 501 bytes fails */
366 CHECK(secp256k1_scratch_alloc(&CTX->error_callback, scratch, 501) == NULL);
367 CHECK(secp256k1_scratch_max_allocation(&CTX->error_callback, scratch, 0) == 1000 - adj_alloc);
368 CHECK(secp256k1_scratch_max_allocation(&CTX->error_callback, scratch, 1) == 1000 - adj_alloc - (ALIGNMENT - 1));
369 CHECK(scratch->alloc_size != 0);
370 CHECK(scratch->alloc_size % ALIGNMENT == 0);
371
372 /* ...but it succeeds once we apply the checkpoint to undo it */
374 CHECK(scratch->alloc_size == 0);
376 CHECK(secp256k1_scratch_alloc(&CTX->error_callback, scratch, 500) != NULL);
377 CHECK(scratch->alloc_size != 0);
378
379 /* try to apply a bad checkpoint */
380 checkpoint_2 = secp256k1_scratch_checkpoint(&CTX->error_callback, scratch);
382 CHECK(ecount == 0);
383 secp256k1_scratch_apply_checkpoint(&CTX->error_callback, scratch, checkpoint_2); /* checkpoint_2 is after checkpoint */
384 CHECK(ecount == 1);
385 secp256k1_scratch_apply_checkpoint(&CTX->error_callback, scratch, (size_t) -1); /* this is just wildly invalid */
386 CHECK(ecount == 2);
387
388 /* try to use badly initialized scratch space */
390 memset(&local_scratch, 0, sizeof(local_scratch));
391 scratch = &local_scratch;
393 CHECK(ecount == 3);
394 CHECK(secp256k1_scratch_alloc(&CTX->error_callback, scratch, 500) == NULL);
395 CHECK(ecount == 4);
397 CHECK(ecount == 5);
398
399 /* Test that large integers do not wrap around in a bad way */
400 scratch = secp256k1_scratch_space_create(CTX, 1000);
401 /* Try max allocation with a large number of objects. Only makes sense if
402 * ALIGNMENT is greater than 1 because otherwise the objects take no extra
403 * space. */
404 CHECK(ALIGNMENT <= 1 || !secp256k1_scratch_max_allocation(&CTX->error_callback, scratch, (SIZE_MAX / (ALIGNMENT - 1)) + 1));
405 /* Try allocating SIZE_MAX to test wrap around which only happens if
406 * ALIGNMENT > 1, otherwise it returns NULL anyway because the scratch
407 * space is too small. */
408 CHECK(secp256k1_scratch_alloc(&CTX->error_callback, scratch, SIZE_MAX) == NULL);
410
411 /* cleanup */
412 secp256k1_scratch_space_destroy(CTX, NULL); /* no-op */
413
416}
417
418
419void run_ctz_tests(void) {
420 static const uint32_t b32[] = {1, 0xffffffff, 0x5e56968f, 0xe0d63129};
421 static const uint64_t b64[] = {1, 0xffffffffffffffff, 0xbcd02462139b3fc3, 0x98b5f80c769693ef};
422 int shift;
423 unsigned i;
424 for (i = 0; i < sizeof(b32) / sizeof(b32[0]); ++i) {
425 for (shift = 0; shift < 32; ++shift) {
426 CHECK(secp256k1_ctz32_var_debruijn(b32[i] << shift) == shift);
427 CHECK(secp256k1_ctz32_var(b32[i] << shift) == shift);
428 }
429 }
430 for (i = 0; i < sizeof(b64) / sizeof(b64[0]); ++i) {
431 for (shift = 0; shift < 64; ++shift) {
432 CHECK(secp256k1_ctz64_var_debruijn(b64[i] << shift) == shift);
433 CHECK(secp256k1_ctz64_var(b64[i] << shift) == shift);
434 }
435 }
436}
437
438/***** HASH TESTS *****/
439
441 static const char *inputs[] = {
442 "", "abc", "message digest", "secure hash algorithm", "SHA256 is considered to be safe",
443 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
444 "For this sample, this 63-byte string will be used as input data",
445 "This is exactly 64 bytes long, not counting the terminating byte",
446 "aaaaa",
447 };
448 static const unsigned int repeat[] = {
449 1, 1, 1, 1, 1, 1, 1, 1, 1000000/5
450 };
451 static const unsigned char outputs[][32] = {
452 {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},
453 {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},
454 {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},
455 {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},
456 {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},
457 {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},
458 {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},
459 {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},
460 {0xcd, 0xc7, 0x6e, 0x5c, 0x99, 0x14, 0xfb, 0x92, 0x81, 0xa1, 0xc7, 0xe2, 0x84, 0xd7, 0x3e, 0x67, 0xf1, 0x80, 0x9a, 0x48, 0xa4, 0x97, 0x20, 0x0e, 0x04, 0x6d, 0x39, 0xcc, 0xc7, 0x11, 0x2c, 0xd0},
461 };
462 unsigned int i, ninputs;
463
464 /* Skip last input vector for low iteration counts */
465 ninputs = sizeof(inputs)/sizeof(inputs[0]) - 1;
466 CONDITIONAL_TEST(16, "run_sha256_known_output_tests 1000000") ninputs++;
467
468 for (i = 0; i < ninputs; i++) {
469 unsigned char out[32];
470 secp256k1_sha256 hasher;
471 unsigned int j;
472 /* 1. Run: simply write the input bytestrings */
473 j = repeat[i];
475 while (j > 0) {
476 secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i]), strlen(inputs[i]));
477 j--;
478 }
479 secp256k1_sha256_finalize(&hasher, out);
480 CHECK(secp256k1_memcmp_var(out, outputs[i], 32) == 0);
481 /* 2. Run: split the input bytestrings randomly before writing */
482 if (strlen(inputs[i]) > 0) {
483 int split = secp256k1_testrand_int(strlen(inputs[i]));
485 j = repeat[i];
486 while (j > 0) {
487 secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i]), split);
488 secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i] + split), strlen(inputs[i]) - split);
489 j--;
490 }
491 secp256k1_sha256_finalize(&hasher, out);
492 CHECK(secp256k1_memcmp_var(out, outputs[i], 32) == 0);
493 }
494 }
495}
496
542 static const char *input = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno";
543 static const secp256k1_sha256 midstates[] = {
544 {{0xa2b5c8bb, 0x26c88bb3, 0x2abdc3d2, 0x9def99a3, 0xdfd21a6e, 0x41fe585b, 0x7ef2c440, 0x2b79adda},
545 {0x00}, 0xfffc0},
546 {{0xa0d29445, 0x9287de66, 0x76aabd71, 0x41acd765, 0x0c7528b4, 0x84e14906, 0x942faec6, 0xcc5a7b26},
547 {0x00}, 0x1fffc0},
548 {{0x50449526, 0xb9f1d657, 0xa0fc13e9, 0x50860f10, 0xa550c431, 0x3fbc97c1, 0x7bbb2d89, 0xdb67bac1},
549 {0x00}, 0x3fffc0},
550 {{0x54a6efdc, 0x46762e7b, 0x88bfe73f, 0xbbd149c7, 0x41620c43, 0x1168da7b, 0x2c5960f9, 0xeccffda6},
551 {0x00}, 0x7fffc0},
552 {{0x2515a8f5, 0x5faa2977, 0x3a850486, 0xac858cad, 0x7b7276ee, 0x235c0385, 0xc53a157c, 0x7cb3e69c},
553 {0x00}, 0xffffc0},
554 {{0x34f39828, 0x409fedb7, 0x4bbdd0fb, 0x3b643634, 0x7806bf2e, 0xe0d1b713, 0xca3f2e1e, 0xe38722c2},
555 {0x00}, 0x1ffffc0},
556 {{0x389ef5c5, 0x38c54167, 0x8f5d56ab, 0x582a75cc, 0x8217caef, 0xf10947dd, 0x6a1998a8, 0x048f0b8c},
557 {0x00}, 0x3ffffc0},
558 {{0xd6c3f394, 0x0bee43b9, 0x6783f497, 0x29fa9e21, 0x6ce491c1, 0xa81fe45e, 0x2fc3859a, 0x269012d0},
559 {0x00}, 0x7ffffc0},
560 {{0x6dd3c526, 0x44d88aa0, 0x806a1bae, 0xfbcc0d32, 0x9d6144f3, 0x9d2bd757, 0x9851a957, 0xb50430ad},
561 {0x00}, 0xfffffc0},
562 {{0x2add4021, 0xdfe8a9e6, 0xa56317c6, 0x7a15f5bb, 0x4a48aacd, 0x5d368414, 0x4f00e6f0, 0xd9355023},
563 {0x00}, 0x1fffffc0},
564 {{0xb66666b4, 0xdbeac32b, 0x0ea351ae, 0xcba9da46, 0x6278b874, 0x8c508e23, 0xe16ca776, 0x8465bac1},
565 {0x00}, 0x3fffffc0},
566 {{0xb6744789, 0x9cce87aa, 0xc4c478b7, 0xf38404d8, 0x2e38ba62, 0xa3f7019b, 0x50458fe7, 0x3047dbec},
567 {0x00}, 0x7fffffc0},
568 {{0x8b1297ba, 0xba261a80, 0x2ba1b0dd, 0xfbc67d6d, 0x61072c4e, 0x4b5a2a0f, 0x52872760, 0x2dfeb162},
569 {0x00}, 0xffffffc0},
570 {{0x24f33cf7, 0x41ad6583, 0x41c8ff5d, 0xca7ef35f, 0x50395756, 0x021b743e, 0xd7126cd7, 0xd037473a},
571 {0x00}, 0x1ffffffc0},
572 };
573 static const unsigned char outputs[][32] = {
574 {0x0e, 0x83, 0xe2, 0xc9, 0x4f, 0xb2, 0xb8, 0x2b, 0x89, 0x06, 0x92, 0x78, 0x04, 0x03, 0x48, 0x5c, 0x48, 0x44, 0x67, 0x61, 0x77, 0xa4, 0xc7, 0x90, 0x9e, 0x92, 0x55, 0x10, 0x05, 0xfe, 0x39, 0x15},
575 {0x1d, 0x1e, 0xd7, 0xb8, 0xa3, 0xa7, 0x8a, 0x79, 0xfd, 0xa0, 0x05, 0x08, 0x9c, 0xeb, 0xf0, 0xec, 0x67, 0x07, 0x9f, 0x8e, 0x3c, 0x0d, 0x8e, 0xf9, 0x75, 0x55, 0x13, 0xc1, 0xe8, 0x77, 0xf8, 0xbb},
576 {0x66, 0x95, 0x6c, 0xc9, 0xe0, 0x39, 0x65, 0xb6, 0xb0, 0x05, 0xd1, 0xaf, 0xaf, 0xf3, 0x1d, 0xb9, 0xa4, 0xda, 0x6f, 0x20, 0xcd, 0x3a, 0xae, 0x64, 0xc2, 0xdb, 0xee, 0xf5, 0xb8, 0x8d, 0x57, 0x0e},
577 {0x3c, 0xbb, 0x1c, 0x12, 0x5e, 0x17, 0xfd, 0x54, 0x90, 0x45, 0xa7, 0x7b, 0x61, 0x6c, 0x1d, 0xfe, 0xe6, 0xcc, 0x7f, 0xee, 0xcf, 0xef, 0x33, 0x35, 0x50, 0x62, 0x16, 0x70, 0x2f, 0x87, 0xc3, 0xc9},
578 {0x53, 0x4d, 0xa8, 0xe7, 0x1e, 0x98, 0x73, 0x8d, 0xd9, 0xa3, 0x54, 0xa5, 0x0e, 0x59, 0x2c, 0x25, 0x43, 0x6f, 0xaa, 0xa2, 0xf5, 0x21, 0x06, 0x3e, 0xc9, 0x82, 0x06, 0x94, 0x98, 0x72, 0x9d, 0xa7},
579 {0xef, 0x7e, 0xe9, 0x6b, 0xd3, 0xe5, 0xb7, 0x41, 0x4c, 0xc8, 0xd3, 0x07, 0x52, 0x9a, 0x5a, 0x8b, 0x4e, 0x1e, 0x75, 0xa4, 0x17, 0x78, 0xc8, 0x36, 0xcd, 0xf8, 0x2e, 0xd9, 0x57, 0xe3, 0xd7, 0x07},
580 {0x87, 0x16, 0xfb, 0xf9, 0xa5, 0xf8, 0xc4, 0x56, 0x2b, 0x48, 0x52, 0x8e, 0x2d, 0x30, 0x85, 0xb6, 0x4c, 0x56, 0xb5, 0xd1, 0x16, 0x9c, 0xcf, 0x32, 0x95, 0xad, 0x03, 0xe8, 0x05, 0x58, 0x06, 0x76},
581 {0x75, 0x03, 0x80, 0x28, 0xf2, 0xa7, 0x63, 0x22, 0x1a, 0x26, 0x9c, 0x68, 0xe0, 0x58, 0xfc, 0x73, 0xeb, 0x42, 0xf6, 0x86, 0x16, 0x24, 0x4b, 0xbc, 0x24, 0xf7, 0x02, 0xc8, 0x3d, 0x90, 0xe2, 0xb0},
582 {0xdf, 0x49, 0x0f, 0x15, 0x7b, 0x7d, 0xbf, 0xe0, 0xd4, 0xcf, 0x47, 0xc0, 0x80, 0x93, 0x4a, 0x61, 0xaa, 0x03, 0x07, 0x66, 0xb3, 0x38, 0x5d, 0xc8, 0xc9, 0x07, 0x61, 0xfb, 0x97, 0x10, 0x2f, 0xd8},
583 {0x77, 0x19, 0x40, 0x56, 0x41, 0xad, 0xbc, 0x59, 0xda, 0x1e, 0xc5, 0x37, 0x14, 0x63, 0x7b, 0xfb, 0x79, 0xe2, 0x7a, 0xb1, 0x55, 0x42, 0x99, 0x42, 0x56, 0xfe, 0x26, 0x9d, 0x0f, 0x7e, 0x80, 0xc6},
584 {0x50, 0xe7, 0x2a, 0x0e, 0x26, 0x44, 0x2f, 0xe2, 0x55, 0x2d, 0xc3, 0x93, 0x8a, 0xc5, 0x86, 0x58, 0x22, 0x8c, 0x0c, 0xbf, 0xb1, 0xd2, 0xca, 0x87, 0x2a, 0xe4, 0x35, 0x26, 0x6f, 0xcd, 0x05, 0x5e},
585 {0xe4, 0x80, 0x6f, 0xdb, 0x3d, 0x7d, 0xba, 0xde, 0x50, 0x3f, 0xea, 0x00, 0x3d, 0x46, 0x59, 0x64, 0xfd, 0x58, 0x1c, 0xa1, 0xb8, 0x7d, 0x5f, 0xac, 0x94, 0x37, 0x9e, 0xa0, 0xc0, 0x9c, 0x93, 0x8b},
586 {0x2c, 0xf3, 0xa9, 0xf6, 0x15, 0x25, 0x80, 0x70, 0x76, 0x99, 0x7d, 0xf1, 0xc3, 0x2f, 0xa3, 0x31, 0xff, 0x92, 0x35, 0x2e, 0x8d, 0x04, 0x13, 0x33, 0xd8, 0x0d, 0xdb, 0x4a, 0xf6, 0x8c, 0x03, 0x34},
587 {0xec, 0x12, 0x24, 0x9f, 0x35, 0xa4, 0x29, 0x8b, 0x9e, 0x4a, 0x95, 0xf8, 0x61, 0xaf, 0x61, 0xc5, 0x66, 0x55, 0x3e, 0x3f, 0x2a, 0x98, 0xea, 0x71, 0x16, 0x6b, 0x1c, 0xd9, 0xe4, 0x09, 0xd2, 0x8e},
588 };
589 unsigned int i;
590 for (i = 0; i < sizeof(midstates)/sizeof(midstates[0]); i++) {
591 unsigned char out[32];
592 secp256k1_sha256 hasher = midstates[i];
593 secp256k1_sha256_write(&hasher, (const unsigned char*)input, strlen(input));
594 secp256k1_sha256_finalize(&hasher, out);
595 CHECK(secp256k1_memcmp_var(out, outputs[i], 32) == 0);
596 }
597}
598
600 static const char *keys[6] = {
601 "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
602 "\x4a\x65\x66\x65",
603 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
604 "\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",
605 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
606 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
607 };
608 static const char *inputs[6] = {
609 "\x48\x69\x20\x54\x68\x65\x72\x65",
610 "\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",
611 "\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",
612 "\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",
613 "\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",
614 "\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"
615 };
616 static const unsigned char outputs[6][32] = {
617 {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},
618 {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},
619 {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},
620 {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},
621 {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},
622 {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}
623 };
624 int i;
625 for (i = 0; i < 6; i++) {
627 unsigned char out[32];
628 secp256k1_hmac_sha256_initialize(&hasher, (const unsigned char*)(keys[i]), strlen(keys[i]));
629 secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i]), strlen(inputs[i]));
630 secp256k1_hmac_sha256_finalize(&hasher, out);
631 CHECK(secp256k1_memcmp_var(out, outputs[i], 32) == 0);
632 if (strlen(inputs[i]) > 0) {
633 int split = secp256k1_testrand_int(strlen(inputs[i]));
634 secp256k1_hmac_sha256_initialize(&hasher, (const unsigned char*)(keys[i]), strlen(keys[i]));
635 secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i]), split);
636 secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i] + split), strlen(inputs[i]) - split);
637 secp256k1_hmac_sha256_finalize(&hasher, out);
638 CHECK(secp256k1_memcmp_var(out, outputs[i], 32) == 0);
639 }
640 }
641}
642
644 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};
645 static const unsigned char out1[3][32] = {
646 {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},
647 {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},
648 {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}
649 };
650
651 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};
652 static const unsigned char out2[3][32] = {
653 {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},
654 {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},
655 {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}
656 };
657
659 unsigned char out[32];
660 int i;
661
663 for (i = 0; i < 3; i++) {
665 CHECK(secp256k1_memcmp_var(out, out1[i], 32) == 0);
666 }
668
670 for (i = 0; i < 3; i++) {
672 CHECK(secp256k1_memcmp_var(out, out1[i], 32) != 0);
673 }
675
677 for (i = 0; i < 3; i++) {
679 CHECK(secp256k1_memcmp_var(out, out2[i], 32) == 0);
680 }
682}
683
685 int ecount = 0;
686 unsigned char tag[32] = { 0 };
687 unsigned char msg[32] = { 0 };
688 unsigned char hash32[32];
689 unsigned char hash_expected[32] = {
690 0x04, 0x7A, 0x5E, 0x17, 0xB5, 0x86, 0x47, 0xC1,
691 0x3C, 0xC6, 0xEB, 0xC0, 0xAA, 0x58, 0x3B, 0x62,
692 0xFB, 0x16, 0x43, 0x32, 0x68, 0x77, 0x40, 0x6C,
693 0xE2, 0x76, 0x55, 0x9A, 0x3B, 0xDE, 0x55, 0xB3
694 };
695
697
698 /* API test */
699 CHECK(secp256k1_tagged_sha256(CTX, hash32, tag, sizeof(tag), msg, sizeof(msg)) == 1);
700 CHECK(secp256k1_tagged_sha256(CTX, NULL, tag, sizeof(tag), msg, sizeof(msg)) == 0);
701 CHECK(ecount == 1);
702 CHECK(secp256k1_tagged_sha256(CTX, hash32, NULL, 0, msg, sizeof(msg)) == 0);
703 CHECK(ecount == 2);
704 CHECK(secp256k1_tagged_sha256(CTX, hash32, tag, sizeof(tag), NULL, 0) == 0);
705 CHECK(ecount == 3);
706
707 /* Static test vector */
708 memcpy(tag, "tag", 3);
709 memcpy(msg, "msg", 3);
710 CHECK(secp256k1_tagged_sha256(CTX, hash32, tag, 3, msg, 3) == 1);
711 CHECK(secp256k1_memcmp_var(hash32, hash_expected, sizeof(hash32)) == 0);
712}
713
714/***** RANDOM TESTS *****/
715
716void test_rand_bits(int rand32, int bits) {
717 /* (1-1/2^B)^rounds[B] < 1/10^9, so rounds is the number of iterations to
718 * get a false negative chance below once in a billion */
719 static const unsigned int rounds[7] = {1, 30, 73, 156, 322, 653, 1316};
720 /* We try multiplying the results with various odd numbers, which shouldn't
721 * influence the uniform distribution modulo a power of 2. */
722 static const uint32_t mults[6] = {1, 3, 21, 289, 0x9999, 0x80402011};
723 /* We only select up to 6 bits from the output to analyse */
724 unsigned int usebits = bits > 6 ? 6 : bits;
725 unsigned int maxshift = bits - usebits;
726 /* For each of the maxshift+1 usebits-bit sequences inside a bits-bit
727 number, track all observed outcomes, one per bit in a uint64_t. */
728 uint64_t x[6][27] = {{0}};
729 unsigned int i, shift, m;
730 /* Multiply the output of all rand calls with the odd number m, which
731 should not change the uniformity of its distribution. */
732 for (i = 0; i < rounds[usebits]; i++) {
733 uint32_t r = (rand32 ? secp256k1_testrand32() : secp256k1_testrand_bits(bits));
734 CHECK((((uint64_t)r) >> bits) == 0);
735 for (m = 0; m < sizeof(mults) / sizeof(mults[0]); m++) {
736 uint32_t rm = r * mults[m];
737 for (shift = 0; shift <= maxshift; shift++) {
738 x[m][shift] |= (((uint64_t)1) << ((rm >> shift) & ((1 << usebits) - 1)));
739 }
740 }
741 }
742 for (m = 0; m < sizeof(mults) / sizeof(mults[0]); m++) {
743 for (shift = 0; shift <= maxshift; shift++) {
744 /* Test that the lower usebits bits of x[shift] are 1 */
745 CHECK(((~x[m][shift]) << (64 - (1 << usebits))) == 0);
746 }
747 }
748}
749
750/* Subrange must be a whole divisor of range, and at most 64 */
751void test_rand_int(uint32_t range, uint32_t subrange) {
752 /* (1-1/subrange)^rounds < 1/10^9 */
753 int rounds = (subrange * 2073) / 100;
754 int i;
755 uint64_t x = 0;
756 CHECK((range % subrange) == 0);
757 for (i = 0; i < rounds; i++) {
758 uint32_t r = secp256k1_testrand_int(range);
759 CHECK(r < range);
760 r = r % subrange;
761 x |= (((uint64_t)1) << r);
762 }
763 /* Test that the lower subrange bits of x are 1. */
764 CHECK(((~x) << (64 - subrange)) == 0);
765}
766
767void run_rand_bits(void) {
768 size_t b;
769 test_rand_bits(1, 32);
770 for (b = 1; b <= 32; b++) {
771 test_rand_bits(0, b);
772 }
773}
774
775void run_rand_int(void) {
776 static const uint32_t ms[] = {1, 3, 17, 1000, 13771, 999999, 33554432};
777 static const uint32_t ss[] = {1, 3, 6, 9, 13, 31, 64};
778 unsigned int m, s;
779 for (m = 0; m < sizeof(ms) / sizeof(ms[0]); m++) {
780 for (s = 0; s < sizeof(ss) / sizeof(ss[0]); s++) {
781 test_rand_int(ms[m] * ss[s], ss[s]);
782 }
783 }
784}
785
786/***** MODINV TESTS *****/
787
788/* Compute the modular inverse of (odd) x mod 2^64. */
789uint64_t modinv2p64(uint64_t x) {
790 /* If w = 1/x mod 2^(2^L), then w*(2 - w*x) = 1/x mod 2^(2^(L+1)). See
791 * Hacker's Delight second edition, Henry S. Warren, Jr., pages 245-247 for
792 * why. Start with L=0, for which it is true for every odd x that
793 * 1/x=1 mod 2. Iterating 6 times gives us 1/x mod 2^64. */
794 int l;
795 uint64_t w = 1;
796 CHECK(x & 1);
797 for (l = 0; l < 6; ++l) w *= (2 - w*x);
798 return w;
799}
800
801
802/* compute out = (a*b) mod m; if b=NULL, treat b=1; if m=NULL, treat m=infinity.
803 *
804 * Out is a 512-bit number (represented as 32 uint16_t's in LE order). The other
805 * arguments are 256-bit numbers (represented as 16 uint16_t's in LE order). */
806void mulmod256(uint16_t* out, const uint16_t* a, const uint16_t* b, const uint16_t* m) {
807 uint16_t mul[32];
808 uint64_t c = 0;
809 int i, j;
810 int m_bitlen = 0;
811 int mul_bitlen = 0;
812
813 if (b != NULL) {
814 /* Compute the product of a and b, and put it in mul. */
815 for (i = 0; i < 32; ++i) {
816 for (j = i <= 15 ? 0 : i - 15; j <= i && j <= 15; j++) {
817 c += (uint64_t)a[j] * b[i - j];
818 }
819 mul[i] = c & 0xFFFF;
820 c >>= 16;
821 }
822 CHECK(c == 0);
823
824 /* compute the highest set bit in mul */
825 for (i = 511; i >= 0; --i) {
826 if ((mul[i >> 4] >> (i & 15)) & 1) {
827 mul_bitlen = i;
828 break;
829 }
830 }
831 } else {
832 /* if b==NULL, set mul=a. */
833 memcpy(mul, a, 32);
834 memset(mul + 16, 0, 32);
835 /* compute the highest set bit in mul */
836 for (i = 255; i >= 0; --i) {
837 if ((mul[i >> 4] >> (i & 15)) & 1) {
838 mul_bitlen = i;
839 break;
840 }
841 }
842 }
843
844 if (m) {
845 /* Compute the highest set bit in m. */
846 for (i = 255; i >= 0; --i) {
847 if ((m[i >> 4] >> (i & 15)) & 1) {
848 m_bitlen = i;
849 break;
850 }
851 }
852
853 /* Try do mul -= m<<i, for i going down to 0, whenever the result is not negative */
854 for (i = mul_bitlen - m_bitlen; i >= 0; --i) {
855 uint16_t mul2[32];
856 int64_t cs;
857
858 /* Compute mul2 = mul - m<<i. */
859 cs = 0; /* accumulator */
860 for (j = 0; j < 32; ++j) { /* j loops over the output limbs in mul2. */
861 /* Compute sub: the 16 bits in m that will be subtracted from mul2[j]. */
862 uint16_t sub = 0;
863 int p;
864 for (p = 0; p < 16; ++p) { /* p loops over the bit positions in mul2[j]. */
865 int bitpos = j * 16 - i + p; /* bitpos is the correspond bit position in m. */
866 if (bitpos >= 0 && bitpos < 256) {
867 sub |= ((m[bitpos >> 4] >> (bitpos & 15)) & 1) << p;
868 }
869 }
870 /* Add mul[j]-sub to accumulator, and shift bottom 16 bits out to mul2[j]. */
871 cs += mul[j];
872 cs -= sub;
873 mul2[j] = (cs & 0xFFFF);
874 cs >>= 16;
875 }
876 /* If remainder of subtraction is 0, set mul = mul2. */
877 if (cs == 0) {
878 memcpy(mul, mul2, sizeof(mul));
879 }
880 }
881 /* Sanity check: test that all limbs higher than m's highest are zero */
882 for (i = (m_bitlen >> 4) + 1; i < 32; ++i) {
883 CHECK(mul[i] == 0);
884 }
885 }
886 memcpy(out, mul, 32);
887}
888
889/* Convert a 256-bit number represented as 16 uint16_t's to signed30 notation. */
890void uint16_to_signed30(secp256k1_modinv32_signed30* out, const uint16_t* in) {
891 int i;
892 memset(out->v, 0, sizeof(out->v));
893 for (i = 0; i < 256; ++i) {
894 out->v[i / 30] |= (int32_t)(((in[i >> 4]) >> (i & 15)) & 1) << (i % 30);
895 }
896}
897
898/* Convert a 256-bit number in signed30 notation to a representation as 16 uint16_t's. */
899void signed30_to_uint16(uint16_t* out, const secp256k1_modinv32_signed30* in) {
900 int i;
901 memset(out, 0, 32);
902 for (i = 0; i < 256; ++i) {
903 out[i >> 4] |= (((in->v[i / 30]) >> (i % 30)) & 1) << (i & 15);
904 }
905}
906
907/* Randomly mutate the sign of limbs in signed30 representation, without changing the value. */
909 int i;
910 for (i = 0; i < 16; ++i) {
911 int pos = secp256k1_testrand_bits(3);
912 if (x->v[pos] > 0 && x->v[pos + 1] <= 0x3fffffff) {
913 x->v[pos] -= 0x40000000;
914 x->v[pos + 1] += 1;
915 } else if (x->v[pos] < 0 && x->v[pos + 1] >= 0x3fffffff) {
916 x->v[pos] += 0x40000000;
917 x->v[pos + 1] -= 1;
918 }
919 }
920}
921
922/* Test secp256k1_modinv32{_var}, using inputs in 16-bit limb format, and returning inverse. */
923void test_modinv32_uint16(uint16_t* out, const uint16_t* in, const uint16_t* mod) {
924 uint16_t tmp[16];
927 int i, vartime, nonzero;
928
929 uint16_to_signed30(&x, in);
930 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;
933
934 /* compute 1/modulus mod 2^30 */
935 m.modulus_inv30 = modinv2p64(m.modulus.v[0]) & 0x3fffffff;
936 CHECK(((m.modulus_inv30 * m.modulus.v[0]) & 0x3fffffff) == 1);
937
938 for (vartime = 0; vartime < 2; ++vartime) {
939 /* compute inverse */
940 (vartime ? secp256k1_modinv32_var : secp256k1_modinv32)(&x, &m);
941
942 /* produce output */
943 signed30_to_uint16(out, &x);
944
945 /* check if the inverse times the input is 1 (mod m), unless x is 0. */
946 mulmod256(tmp, out, in, mod);
947 CHECK(tmp[0] == nonzero);
948 for (i = 1; i < 16; ++i) CHECK(tmp[i] == 0);
949
950 /* invert again */
951 (vartime ? secp256k1_modinv32_var : secp256k1_modinv32)(&x, &m);
952
953 /* check if the result is equal to the input */
954 signed30_to_uint16(tmp, &x);
955 for (i = 0; i < 16; ++i) CHECK(tmp[i] == in[i]);
956 }
957}
958
959#ifdef SECP256K1_WIDEMUL_INT128
960/* Convert a 256-bit number represented as 16 uint16_t's to signed62 notation. */
961void uint16_to_signed62(secp256k1_modinv64_signed62* out, const uint16_t* in) {
962 int i;
963 memset(out->v, 0, sizeof(out->v));
964 for (i = 0; i < 256; ++i) {
965 out->v[i / 62] |= (int64_t)(((in[i >> 4]) >> (i & 15)) & 1) << (i % 62);
966 }
967}
968
969/* Convert a 256-bit number in signed62 notation to a representation as 16 uint16_t's. */
970void signed62_to_uint16(uint16_t* out, const secp256k1_modinv64_signed62* in) {
971 int i;
972 memset(out, 0, 32);
973 for (i = 0; i < 256; ++i) {
974 out[i >> 4] |= (((in->v[i / 62]) >> (i % 62)) & 1) << (i & 15);
975 }
976}
977
978/* Randomly mutate the sign of limbs in signed62 representation, without changing the value. */
979void mutate_sign_signed62(secp256k1_modinv64_signed62* x) {
980 static const int64_t M62 = (int64_t)(UINT64_MAX >> 2);
981 int i;
982 for (i = 0; i < 8; ++i) {
983 int pos = secp256k1_testrand_bits(2);
984 if (x->v[pos] > 0 && x->v[pos + 1] <= M62) {
985 x->v[pos] -= (M62 + 1);
986 x->v[pos + 1] += 1;
987 } else if (x->v[pos] < 0 && x->v[pos + 1] >= -M62) {
988 x->v[pos] += (M62 + 1);
989 x->v[pos + 1] -= 1;
990 }
991 }
992}
993
994/* Test secp256k1_modinv64{_var}, using inputs in 16-bit limb format, and returning inverse. */
995void test_modinv64_uint16(uint16_t* out, const uint16_t* in, const uint16_t* mod) {
996 static const int64_t M62 = (int64_t)(UINT64_MAX >> 2);
997 uint16_t tmp[16];
1000 int i, vartime, nonzero;
1001
1002 uint16_to_signed62(&x, in);
1003 nonzero = (x.v[0] | x.v[1] | x.v[2] | x.v[3] | x.v[4]) != 0;
1004 uint16_to_signed62(&m.modulus, mod);
1005 mutate_sign_signed62(&m.modulus);
1006
1007 /* compute 1/modulus mod 2^62 */
1008 m.modulus_inv62 = modinv2p64(m.modulus.v[0]) & M62;
1009 CHECK(((m.modulus_inv62 * m.modulus.v[0]) & M62) == 1);
1010
1011 for (vartime = 0; vartime < 2; ++vartime) {
1012 /* compute inverse */
1013 (vartime ? secp256k1_modinv64_var : secp256k1_modinv64)(&x, &m);
1014
1015 /* produce output */
1016 signed62_to_uint16(out, &x);
1017
1018 /* check if the inverse times the input is 1 (mod m), unless x is 0. */
1019 mulmod256(tmp, out, in, mod);
1020 CHECK(tmp[0] == nonzero);
1021 for (i = 1; i < 16; ++i) CHECK(tmp[i] == 0);
1022
1023 /* invert again */
1024 (vartime ? secp256k1_modinv64_var : secp256k1_modinv64)(&x, &m);
1025
1026 /* check if the result is equal to the input */
1027 signed62_to_uint16(tmp, &x);
1028 for (i = 0; i < 16; ++i) CHECK(tmp[i] == in[i]);
1029 }
1030}
1031#endif
1032
1033/* test if a and b are coprime */
1034int coprime(const uint16_t* a, const uint16_t* b) {
1035 uint16_t x[16], y[16], t[16];
1036 int i;
1037 int iszero;
1038 memcpy(x, a, 32);
1039 memcpy(y, b, 32);
1040
1041 /* simple gcd loop: while x!=0, (x,y)=(y%x,x) */
1042 while (1) {
1043 iszero = 1;
1044 for (i = 0; i < 16; ++i) {
1045 if (x[i] != 0) {
1046 iszero = 0;
1047 break;
1048 }
1049 }
1050 if (iszero) break;
1051 mulmod256(t, y, NULL, x);
1052 memcpy(y, x, 32);
1053 memcpy(x, t, 32);
1054 }
1055
1056 /* return whether y=1 */
1057 if (y[0] != 1) return 0;
1058 for (i = 1; i < 16; ++i) {
1059 if (y[i] != 0) return 0;
1060 }
1061 return 1;
1062}
1063
1065 /* Fixed test cases. Each tuple is (input, modulus, output), each as 16x16 bits in LE order. */
1066 static const uint16_t CASES[][3][16] = {
1067 /* Test cases triggering edge cases in divsteps */
1068
1069 /* Test case known to need 713 divsteps */
1070 {{0x1513, 0x5389, 0x54e9, 0x2798, 0x1957, 0x66a0, 0x8057, 0x3477,
1071 0x7784, 0x1052, 0x326a, 0x9331, 0x6506, 0xa95c, 0x91f3, 0xfb5e},
1072 {0x2bdd, 0x8df4, 0xcc61, 0x481f, 0xdae5, 0x5ca7, 0xf43b, 0x7d54,
1073 0x13d6, 0x469b, 0x2294, 0x20f4, 0xb2a4, 0xa2d1, 0x3ff1, 0xfd4b},
1074 {0xffd8, 0xd9a0, 0x456e, 0x81bb, 0xbabd, 0x6cea, 0x6dbd, 0x73ab,
1075 0xbb94, 0x3d3c, 0xdf08, 0x31c4, 0x3e32, 0xc179, 0x2486, 0xb86b}},
1076 /* Test case known to need 589 divsteps, reaching delta=-140 and
1077 delta=141. */
1078 {{0x3fb1, 0x903b, 0x4eb7, 0x4813, 0xd863, 0x26bf, 0xd89f, 0xa8a9,
1079 0x02fe, 0x57c6, 0x554a, 0x4eab, 0x165e, 0x3d61, 0xee1e, 0x456c},
1080 {0x9295, 0x823b, 0x5c1f, 0x5386, 0x48e0, 0x02ff, 0x4c2a, 0xa2da,
1081 0xe58f, 0x967c, 0xc97e, 0x3f5a, 0x69fb, 0x52d9, 0x0a86, 0xb4a3},
1082 {0x3d30, 0xb893, 0xa809, 0xa7a8, 0x26f5, 0x5b42, 0x55be, 0xf4d0,
1083 0x12c2, 0x7e6a, 0xe41a, 0x90c7, 0xebfa, 0xf920, 0x304e, 0x1419}},
1084 /* Test case known to need 650 divsteps, and doing 65 consecutive (f,g/2) steps. */
1085 {{0x8583, 0x5058, 0xbeae, 0xeb69, 0x48bc, 0x52bb, 0x6a9d, 0xcc94,
1086 0x2a21, 0x87d5, 0x5b0d, 0x42f6, 0x5b8a, 0x2214, 0xe9d6, 0xa040},
1087 {0x7531, 0x27cb, 0x7e53, 0xb739, 0x6a5f, 0x83f5, 0xa45c, 0xcb1d,
1088 0x8a87, 0x1c9c, 0x51d7, 0x851c, 0xb9d8, 0x1fbe, 0xc241, 0xd4a3},
1089 {0xcdb4, 0x275c, 0x7d22, 0xa906, 0x0173, 0xc054, 0x7fdf, 0x5005,
1090 0x7fb8, 0x9059, 0xdf51, 0x99df, 0x2654, 0x8f6e, 0x070f, 0xb347}},
1091 /* example needing 713 divsteps; delta=-2..3 */
1092 {{0xe2e9, 0xee91, 0x4345, 0xe5ad, 0xf3ec, 0x8f42, 0x0364, 0xd5c9,
1093 0xff49, 0xbef5, 0x4544, 0x4c7c, 0xae4b, 0xfd9d, 0xb35b, 0xda9d},
1094 {0x36e7, 0x8cca, 0x2ed0, 0x47b3, 0xaca4, 0xb374, 0x7d2a, 0x0772,
1095 0x6bdb, 0xe0a7, 0x900b, 0xfe10, 0x788c, 0x6f22, 0xd909, 0xf298},
1096 {0xd8c6, 0xba39, 0x13ed, 0x198c, 0x16c8, 0xb837, 0xa5f2, 0x9797,
1097 0x0113, 0x882a, 0x15b5, 0x324c, 0xabee, 0xe465, 0x8170, 0x85ac}},
1098 /* example needing 713 divsteps; delta=-2..3 */
1099 {{0xd5b7, 0x2966, 0x040e, 0xf59a, 0x0387, 0xd96d, 0xbfbc, 0xd850,
1100 0x2d96, 0x872a, 0xad81, 0xc03c, 0xbb39, 0xb7fa, 0xd904, 0xef78},
1101 {0x6279, 0x4314, 0xfdd3, 0x1568, 0x0982, 0x4d13, 0x625f, 0x010c,
1102 0x22b1, 0x0cc3, 0xf22d, 0x5710, 0x1109, 0x5751, 0x7714, 0xfcf2},
1103 {0xdb13, 0x5817, 0x232e, 0xe456, 0xbbbc, 0x6fbe, 0x4572, 0xa358,
1104 0xc76d, 0x928e, 0x0162, 0x5314, 0x8325, 0x5683, 0xe21b, 0xda88}},
1105 /* example needing 713 divsteps; delta=-2..3 */
1106 {{0xa06f, 0x71ee, 0x3bac, 0x9ebb, 0xdeaa, 0x09ed, 0x1cf7, 0x9ec9,
1107 0x7158, 0x8b72, 0x5d53, 0x5479, 0x5c75, 0xbb66, 0x9125, 0xeccc},
1108 {0x2941, 0xd46c, 0x3cd4, 0x4a9d, 0x5c4a, 0x256b, 0xbd6c, 0x9b8e,
1109 0x8fe0, 0x8a14, 0xffe8, 0x2496, 0x618d, 0xa9d7, 0x5018, 0xfb29},
1110 {0x437c, 0xbd60, 0x7590, 0x94bb, 0x0095, 0xd35e, 0xd4fe, 0xd6da,
1111 0x0d4e, 0x5342, 0x4cd2, 0x169b, 0x661c, 0x1380, 0xed2d, 0x85c1}},
1112 /* example reaching delta=-64..65; 661 divsteps */
1113 {{0xfde4, 0x68d6, 0x6c48, 0x7f77, 0x1c78, 0x96de, 0x2fd9, 0xa6c2,
1114 0xbbb5, 0xd319, 0x69cf, 0xd4b3, 0xa321, 0xcda0, 0x172e, 0xe530},
1115 {0xd9e3, 0x0f60, 0x3d86, 0xeeab, 0x25ee, 0x9582, 0x2d50, 0xfe16,
1116 0xd4e2, 0xe3ba, 0x94e2, 0x9833, 0x6c5e, 0x8982, 0x13b6, 0xe598},
1117 {0xe675, 0xf55a, 0x10f6, 0xabde, 0x5113, 0xecaa, 0x61ae, 0xad9f,
1118 0x0c27, 0xef33, 0x62e5, 0x211d, 0x08fa, 0xa78d, 0xc675, 0x8bae}},
1119 /* example reaching delta=-64..65; 661 divsteps */
1120 {{0x21bf, 0x52d5, 0x8fd4, 0xaa18, 0x156a, 0x7247, 0xebb8, 0x5717,
1121 0x4eb5, 0x1421, 0xb58f, 0x3b0b, 0x5dff, 0xe533, 0xb369, 0xd28a},
1122 {0x9f6b, 0xe463, 0x2563, 0xc74d, 0x6d81, 0x636a, 0x8fc8, 0x7a94,
1123 0x9429, 0x1585, 0xf35e, 0x7ff5, 0xb64f, 0x9720, 0xba74, 0xe108},
1124 {0xa5ab, 0xea7b, 0xfe5e, 0x8a85, 0x13be, 0x7934, 0xe8a0, 0xa187,
1125 0x86b5, 0xe477, 0xb9a4, 0x75d7, 0x538f, 0xdd70, 0xc781, 0xb67d}},
1126 /* example reaching delta=-64..65; 661 divsteps */
1127 {{0xa41a, 0x3e8d, 0xf1f5, 0x9493, 0x868c, 0x5103, 0x2725, 0x3ceb,
1128 0x6032, 0x3624, 0xdc6b, 0x9120, 0xbf4c, 0x8821, 0x91ad, 0xb31a},
1129 {0x5c0b, 0xdda5, 0x20f8, 0x32a1, 0xaf73, 0x6ec5, 0x4779, 0x43d6,
1130 0xd454, 0x9573, 0xbf84, 0x5a58, 0xe04e, 0x307e, 0xd1d5, 0xe230},
1131 {0xda15, 0xbcd6, 0x7180, 0xabd3, 0x04e6, 0x6986, 0xc0d7, 0x90bb,
1132 0x3a4d, 0x7c95, 0xaaab, 0x9ab3, 0xda34, 0xa7f6, 0x9636, 0x6273}},
1133 /* example doing 123 consecutive (f,g/2) steps; 615 divsteps */
1134 {{0xb4d6, 0xb38f, 0x00aa, 0xebda, 0xd4c2, 0x70b8, 0x9dad, 0x58ee,
1135 0x68f8, 0x48d3, 0xb5ff, 0xf422, 0x9e46, 0x2437, 0x18d0, 0xd9cc},
1136 {0x5c83, 0xfed7, 0x97f5, 0x3f07, 0xcaad, 0x95b1, 0xb4a4, 0xb005,
1137 0x23af, 0xdd27, 0x6c0d, 0x932c, 0xe2b2, 0xe3ae, 0xfb96, 0xdf67},
1138 {0x3105, 0x0127, 0xfd48, 0x039b, 0x35f1, 0xbc6f, 0x6c0a, 0xb572,
1139 0xe4df, 0xebad, 0x8edc, 0xb89d, 0x9555, 0x4c26, 0x1fef, 0x997c}},
1140 /* example doing 123 consecutive (f,g/2) steps; 614 divsteps */
1141 {{0x5138, 0xd474, 0x385f, 0xc964, 0x00f2, 0x6df7, 0x862d, 0xb185,
1142 0xb264, 0xe9e1, 0x466c, 0xf39e, 0xafaf, 0x5f41, 0x47e2, 0xc89d},
1143 {0x8607, 0x9c81, 0x46a2, 0x7dcc, 0xcb0c, 0x9325, 0xe149, 0x2bde,
1144 0x6632, 0x2869, 0xa261, 0xb163, 0xccee, 0x22ae, 0x91e0, 0xcfd5},
1145 {0x831c, 0xda22, 0xb080, 0xba7a, 0x26e2, 0x54b0, 0x073b, 0x5ea0,
1146 0xed4b, 0xcb3d, 0xbba1, 0xbec8, 0xf2ad, 0xae0d, 0x349b, 0x17d1}},
1147 /* example doing 123 consecutive (f,g/2) steps; 614 divsteps */
1148 {{0xe9a5, 0xb4ad, 0xd995, 0x9953, 0xcdff, 0x50d7, 0xf715, 0x9dc7,
1149 0x3e28, 0x15a9, 0x95a3, 0x8554, 0x5b5e, 0xad1d, 0x6d57, 0x3d50},
1150 {0x3ad9, 0xbd60, 0x5cc7, 0x6b91, 0xadeb, 0x71f6, 0x7cc4, 0xa58a,
1151 0x2cce, 0xf17c, 0x38c9, 0x97ed, 0x65fb, 0x3fa6, 0xa6bc, 0xeb24},
1152 {0xf96c, 0x1963, 0x8151, 0xa0cc, 0x299b, 0xf277, 0x001a, 0x16bb,
1153 0xfd2e, 0x532d, 0x0410, 0xe117, 0x6b00, 0x44ec, 0xca6a, 0x1745}},
1154 /* example doing 446 (f,g/2) steps; 523 divsteps */
1155 {{0x3758, 0xa56c, 0xe41e, 0x4e47, 0x0975, 0xa82b, 0x107c, 0x89cf,
1156 0x2093, 0x5a0c, 0xda37, 0xe007, 0x6074, 0x4f68, 0x2f5a, 0xbb8a},
1157 {0x4beb, 0xa40f, 0x2c42, 0xd9d6, 0x97e8, 0xca7c, 0xd395, 0x894f,
1158 0x1f50, 0x8067, 0xa233, 0xb850, 0x1746, 0x1706, 0xbcda, 0xdf32},
1159 {0x762a, 0xceda, 0x4c45, 0x1ca0, 0x8c37, 0xd8c5, 0xef57, 0x7a2c,
1160 0x6e98, 0xe38a, 0xc50e, 0x2ca9, 0xcb85, 0x24d5, 0xc29c, 0x61f6}},
1161 /* example doing 446 (f,g/2) steps; 523 divsteps */
1162 {{0x6f38, 0x74ad, 0x7332, 0x4073, 0x6521, 0xb876, 0xa370, 0xa6bd,
1163 0xcea5, 0xbd06, 0x969f, 0x77c6, 0x1e69, 0x7c49, 0x7d51, 0xb6e7},
1164 {0x3f27, 0x4be4, 0xd81e, 0x1396, 0xb21f, 0x92aa, 0x6dc3, 0x6283,
1165 0x6ada, 0x3ca2, 0xc1e5, 0x8b9b, 0xd705, 0x5598, 0x8ba1, 0xe087},
1166 {0x6a22, 0xe834, 0xbc8d, 0xcee9, 0x42fc, 0xfc77, 0x9c45, 0x1ca8,
1167 0xeb66, 0xed74, 0xaaf9, 0xe75f, 0xfe77, 0x46d2, 0x179b, 0xbf3e}},
1168 /* example doing 336 (f,(f+g)/2) steps; 693 divsteps */
1169 {{0x7ea7, 0x444e, 0x84ea, 0xc447, 0x7c1f, 0xab97, 0x3de6, 0x5878,
1170 0x4e8b, 0xc017, 0x03e0, 0xdc40, 0xbbd0, 0x74ce, 0x0169, 0x7ab5},
1171 {0x4023, 0x154f, 0xfbe4, 0x8195, 0xfda0, 0xef54, 0x9e9a, 0xc703,
1172 0x2803, 0xf760, 0x6302, 0xed5b, 0x7157, 0x6456, 0xdd7d, 0xf14b},
1173 {0xb6fb, 0xe3b3, 0x0733, 0xa77e, 0x44c5, 0x3003, 0xc937, 0xdd4d,
1174 0x5355, 0x14e9, 0x184e, 0xcefe, 0xe6b5, 0xf2e0, 0x0a28, 0x5b74}},
1175 /* example doing 336 (f,(f+g)/2) steps; 687 divsteps */
1176 {{0xa893, 0xb5f4, 0x1ede, 0xa316, 0x242c, 0xbdcc, 0xb017, 0x0836,
1177 0x3a37, 0x27fb, 0xfb85, 0x251e, 0xa189, 0xb15d, 0xa4b8, 0xc24c},
1178 {0xb0b7, 0x57ba, 0xbb6d, 0x9177, 0xc896, 0xc7f2, 0x43b4, 0x85a6,
1179 0xe6c4, 0xe50e, 0x3109, 0x7ca5, 0xd73d, 0x13ff, 0x0c3d, 0xcd62},
1180 {0x48ca, 0xdb34, 0xe347, 0x2cef, 0x4466, 0x10fb, 0x7ee1, 0x6344,
1181 0x4308, 0x966d, 0xd4d1, 0xb099, 0x994f, 0xd025, 0x2187, 0x5866}},
1182 /* example doing 267 (g,(g-f)/2) steps; 678 divsteps */
1183 {{0x0775, 0x1754, 0x01f6, 0xdf37, 0xc0be, 0x8197, 0x072f, 0x6cf5,
1184 0x8b36, 0x8069, 0x5590, 0xb92d, 0x6084, 0x47a4, 0x23fe, 0xddd5},
1185 {0x8e1b, 0xda37, 0x27d9, 0x312e, 0x3a2f, 0xef6d, 0xd9eb, 0x8153,
1186 0xdcba, 0x9fa3, 0x9f80, 0xead5, 0x134d, 0x2ebb, 0x5ec0, 0xe032},
1187 {0x1cb6, 0x5a61, 0x1bed, 0x77d6, 0xd5d1, 0x7498, 0xef33, 0x2dd2,
1188 0x1089, 0xedbd, 0x6958, 0x16ae, 0x336c, 0x45e6, 0x4361, 0xbadc}},
1189 /* example doing 267 (g,(g-f)/2) steps; 676 divsteps */
1190 {{0x0207, 0xf948, 0xc430, 0xf36b, 0xf0a7, 0x5d36, 0x751f, 0x132c,
1191 0x6f25, 0xa630, 0xca1f, 0xc967, 0xaf9c, 0x34e7, 0xa38f, 0xbe9f},
1192 {0x5fb9, 0x7321, 0x6561, 0x5fed, 0x54ec, 0x9c3a, 0xee0e, 0x6717,
1193 0x49af, 0xb896, 0xf4f5, 0x451c, 0x722a, 0xf116, 0x64a9, 0xcf0b},
1194 {0xf4d7, 0xdb47, 0xfef2, 0x4806, 0x4cb8, 0x18c7, 0xd9a7, 0x4951,
1195 0x14d8, 0x5c3a, 0xd22d, 0xd7b2, 0x750c, 0x3de7, 0x8b4a, 0x19aa}},
1196
1197 /* Test cases triggering edge cases in divsteps variant starting with delta=1/2 */
1198
1199 /* example needing 590 divsteps; delta=-5/2..7/2 */
1200 {{0x9118, 0xb640, 0x53d7, 0x30ab, 0x2a23, 0xd907, 0x9323, 0x5b3a,
1201 0xb6d4, 0x538a, 0x7637, 0xfe97, 0xfd05, 0x3cc0, 0x453a, 0xfb7e},
1202 {0x6983, 0x4f75, 0x4ad1, 0x48ad, 0xb2d9, 0x521d, 0x3dbc, 0x9cc0,
1203 0x4b60, 0x0ac6, 0xd3be, 0x0fb6, 0xd305, 0x3895, 0x2da5, 0xfdf8},
1204 {0xcec1, 0x33ac, 0xa801, 0x8194, 0xe36c, 0x65ef, 0x103b, 0xca54,
1205 0xfa9b, 0xb41d, 0x9b52, 0xb6f7, 0xa611, 0x84aa, 0x3493, 0xbf54}},
1206 /* example needing 590 divsteps; delta=-3/2..5/2 */
1207 {{0xb5f2, 0x42d0, 0x35e8, 0x8ca0, 0x4b62, 0x6e1d, 0xbdf3, 0x890e,
1208 0x8c82, 0x23d8, 0xc79a, 0xc8e8, 0x789e, 0x353d, 0x9766, 0xea9d},
1209 {0x6fa1, 0xacba, 0x4b7a, 0x5de1, 0x95d0, 0xc845, 0xebbf, 0x6f5a,
1210 0x30cf, 0x52db, 0x69b7, 0xe278, 0x4b15, 0x8411, 0x2ab2, 0xf3e7},
1211 {0xf12c, 0x9d6d, 0x95fa, 0x1878, 0x9f13, 0x4fb5, 0x3c8b, 0xa451,
1212 0x7182, 0xc4b6, 0x7e2a, 0x7bb7, 0x6e0e, 0x5b68, 0xde55, 0x9927}},
1213 /* example needing 590 divsteps; delta=-3/2..5/2 */
1214 {{0x229c, 0x4ef8, 0x1e93, 0xe5dc, 0xcde5, 0x6d62, 0x263b, 0xad11,
1215 0xced0, 0x88ff, 0xae8e, 0x3183, 0x11d2, 0xa50b, 0x350d, 0xeb40},
1216 {0x3157, 0xe2ea, 0x8a02, 0x0aa3, 0x5ae1, 0xb26c, 0xea27, 0x6805,
1217 0x87e2, 0x9461, 0x37c1, 0x2f8d, 0x85d2, 0x77a8, 0xf805, 0xeec9},
1218 {0x6f4e, 0x2748, 0xf7e5, 0xd8d3, 0xabe2, 0x7270, 0xc4e0, 0xedc7,
1219 0xf196, 0x78ca, 0x9139, 0xd8af, 0x72c6, 0xaf2f, 0x85d2, 0x6cd3}},
1220 /* example needing 590 divsteps; delta=-5/2..7/2 */
1221 {{0xdce8, 0xf1fe, 0x6708, 0x021e, 0xf1ca, 0xd609, 0x5443, 0x85ce,
1222 0x7a05, 0x8f9c, 0x90c3, 0x52e7, 0x8e1d, 0x97b8, 0xc0bf, 0xf2a1},
1223 {0xbd3d, 0xed11, 0x1625, 0xb4c5, 0x844c, 0xa413, 0x2569, 0xb9ba,
1224 0xcd35, 0xff84, 0xcd6e, 0x7f0b, 0x7d5d, 0x10df, 0x3efe, 0xfbe5},
1225 {0xa9dd, 0xafef, 0xb1b7, 0x4c8d, 0x50e4, 0xafbf, 0x2d5a, 0xb27c,
1226 0x0653, 0x66b6, 0x5d36, 0x4694, 0x7e35, 0xc47c, 0x857f, 0x32c5}},
1227 /* example needing 590 divsteps; delta=-3/2..5/2 */
1228 {{0x7902, 0xc9f8, 0x926b, 0xaaeb, 0x90f8, 0x1c89, 0xcce3, 0x96b7,
1229 0x28b2, 0x87a2, 0x136d, 0x695a, 0xa8df, 0x9061, 0x9e31, 0xee82},
1230 {0xd3a9, 0x3c02, 0x818c, 0x6b81, 0x34b3, 0xebbb, 0xe2c8, 0x7712,
1231 0xbfd6, 0x8248, 0xa6f4, 0xba6f, 0x03bb, 0xfb54, 0x7575, 0xfe89},
1232 {0x8246, 0x0d63, 0x478e, 0xf946, 0xf393, 0x0451, 0x08c2, 0x5919,
1233 0x5fd6, 0x4c61, 0xbeb7, 0x9a15, 0x30e1, 0x55fc, 0x6a01, 0x3724}},
1234 /* example reaching delta=-127/2..129/2; 571 divsteps */
1235 {{0x3eff, 0x926a, 0x77f5, 0x1fff, 0x1a5b, 0xf3ef, 0xf64b, 0x8681,
1236 0xf800, 0xf9bc, 0x761d, 0xe268, 0x62b0, 0xa032, 0xba9c, 0xbe56},
1237 {0xb8f9, 0x00e7, 0x47b7, 0xdffc, 0xfd9d, 0x5abb, 0xa19b, 0x1868,
1238 0x31fd, 0x3b29, 0x3674, 0x5449, 0xf54d, 0x1d19, 0x6ac7, 0xff6f},
1239 {0xf1d7, 0x3551, 0x5682, 0x9adf, 0xe8aa, 0x19a5, 0x8340, 0x71db,
1240 0xb7ab, 0x4cfd, 0xf661, 0x632c, 0xc27e, 0xd3c6, 0xdf42, 0xd306}},
1241 /* example reaching delta=-127/2..129/2; 571 divsteps */
1242 {{0x0000, 0x0000, 0x0000, 0x0000, 0x3aff, 0x2ed7, 0xf2e0, 0xabc7,
1243 0x8aee, 0x166e, 0x7ed0, 0x9ac7, 0x714a, 0xb9c5, 0x4d58, 0xad6c},
1244 {0x9cf9, 0x47e2, 0xa421, 0xb277, 0xffc2, 0x2747, 0x6486, 0x94c1,
1245 0x1d99, 0xd49b, 0x1096, 0x991a, 0xe986, 0xae02, 0xe89b, 0xea36},
1246 {0x1fb4, 0x98d8, 0x19b7, 0x80e9, 0xcdac, 0xaa5a, 0xf1e6, 0x0074,
1247 0xe393, 0xed8b, 0x8d5c, 0xe17d, 0x81b3, 0xc16d, 0x54d3, 0x9be3}},
1248 /* example reaching delta=-127/2..129/2; 571 divsteps */
1249 {{0xd047, 0x7e36, 0x3157, 0x7ab6, 0xb4d9, 0x8dae, 0x7534, 0x4f5d,
1250 0x489e, 0xa8ab, 0x8a3d, 0xd52c, 0x62af, 0xa032, 0xba9c, 0xbe56},
1251 {0xb1f1, 0x737f, 0x5964, 0x5afb, 0x3712, 0x8ef9, 0x19f7, 0x9669,
1252 0x664d, 0x03ad, 0xc352, 0xf7a5, 0xf545, 0x1d19, 0x6ac7, 0xff6f},
1253 {0xa834, 0x5256, 0x27bc, 0x33bd, 0xba11, 0x5a7b, 0x791e, 0xe6c0,
1254 0x9ac4, 0x9370, 0x1130, 0x28b4, 0x2b2e, 0x231b, 0x082a, 0x796e}},
1255 /* example doing 123 consecutive (f,g/2) steps; 554 divsteps */
1256 {{0x6ab1, 0x6ea0, 0x1a99, 0xe0c2, 0xdd45, 0x645d, 0x8dbc, 0x466a,
1257 0xfa64, 0x4289, 0xd3f7, 0xfc8f, 0x2894, 0xe3c5, 0xa008, 0xcc14},
1258 {0xc75f, 0xc083, 0x4cc2, 0x64f2, 0x2aff, 0x4c12, 0x8461, 0xc4ae,
1259 0xbbfa, 0xb336, 0xe4b2, 0x3ac5, 0x2c22, 0xf56c, 0x5381, 0xe943},
1260 {0xcd80, 0x760d, 0x4395, 0xb3a6, 0xd497, 0xf583, 0x82bd, 0x1daa,
1261 0xbe92, 0x2613, 0xfdfb, 0x869b, 0x0425, 0xa333, 0x7056, 0xc9c5}},
1262 /* example doing 123 consecutive (f,g/2) steps; 554 divsteps */
1263 {{0x71d4, 0x64df, 0xec4f, 0x74d8, 0x7e0c, 0x40d3, 0x7073, 0x4cc8,
1264 0x2a2a, 0xb1ff, 0x8518, 0x6513, 0xb0ea, 0x640a, 0x62d9, 0xd5f4},
1265 {0xdc75, 0xd937, 0x3b13, 0x1d36, 0xdf83, 0xd034, 0x1c1c, 0x4332,
1266 0x4cc3, 0xeeec, 0x7d94, 0x6771, 0x3384, 0x74b0, 0x947d, 0xf2c4},
1267 {0x0a82, 0x37a4, 0x12d5, 0xec97, 0x972c, 0xe6bf, 0xc348, 0xa0a9,
1268 0xc50c, 0xdc7c, 0xae30, 0x19d1, 0x0fca, 0x35e1, 0xd6f6, 0x81ee}},
1269 /* example doing 123 consecutive (f,g/2) steps; 554 divsteps */
1270 {{0xa6b1, 0xabc5, 0x5bbc, 0x7f65, 0xdd32, 0xaa73, 0xf5a3, 0x1982,
1271 0xced4, 0xe949, 0x0fd6, 0x2bc4, 0x2bd7, 0xe3c5, 0xa008, 0xcc14},
1272 {0x4b5f, 0x8f96, 0xa375, 0xfbcf, 0x1c7d, 0xf1ec, 0x03f5, 0xb35d,
1273 0xb999, 0xdb1f, 0xc9a1, 0xb4c7, 0x1dd5, 0xf56c, 0x5381, 0xe943},
1274 {0xaa3d, 0x38b9, 0xf17d, 0xeed9, 0x9988, 0x69ee, 0xeb88, 0x1495,
1275 0x203f, 0x18c8, 0x82b7, 0xdcb2, 0x34a7, 0x6b00, 0x6998, 0x589a}},
1276 /* example doing 453 (f,g/2) steps; 514 divsteps */
1277 {{0xa478, 0xe60d, 0x3244, 0x60e6, 0xada3, 0xfe50, 0xb6b1, 0x2eae,
1278 0xd0ef, 0xa7b1, 0xef63, 0x05c0, 0xe213, 0x443e, 0x4427, 0x2448},
1279 {0x258f, 0xf9ef, 0xe02b, 0x92dd, 0xd7f3, 0x252b, 0xa503, 0x9089,
1280 0xedff, 0x96c1, 0xfe3a, 0x3a39, 0x198a, 0x981d, 0x0627, 0xedb7},
1281 {0x595a, 0x45be, 0x8fb0, 0x2265, 0xc210, 0x02b8, 0xdce9, 0xe241,
1282 0xcab6, 0xbf0d, 0x0049, 0x8d9a, 0x2f51, 0xae54, 0x5785, 0xb411}},
1283 /* example doing 453 (f,g/2) steps; 514 divsteps */
1284 {{0x48f0, 0x7db3, 0xdafe, 0x1c92, 0x5912, 0xe11a, 0xab52, 0xede1,
1285 0x3182, 0x8980, 0x5d2b, 0x9b5b, 0x8718, 0xda27, 0x1683, 0x1de2},
1286 {0x168f, 0x6f36, 0xce7a, 0xf435, 0x19d4, 0xda5e, 0x2351, 0x9af5,
1287 0xb003, 0x0ef5, 0x3b4c, 0xecec, 0xa9f0, 0x78e1, 0xdfef, 0xe823},
1288 {0x5f55, 0xfdcc, 0xb233, 0x2914, 0x84f0, 0x97d1, 0x9cf4, 0x2159,
1289 0xbf56, 0xb79c, 0x17a3, 0x7cef, 0xd5de, 0x34f0, 0x5311, 0x4c54}},
1290 /* example doing 510 (f,(f+g)/2) steps; 512 divsteps */
1291 {{0x2789, 0x2e04, 0x6e0e, 0xb6cd, 0xe4de, 0x4dbf, 0x228d, 0x7877,
1292 0xc335, 0x806b, 0x38cd, 0x8049, 0xa73b, 0xcfa2, 0x82f7, 0x9e19},
1293 {0xc08d, 0xb99d, 0xb8f3, 0x663d, 0xbbb3, 0x1284, 0x1485, 0x1d49,
1294 0xc98f, 0x9e78, 0x1588, 0x11e3, 0xd91a, 0xa2c7, 0xfff1, 0xc7b9},
1295 {0x1e1f, 0x411d, 0x7c49, 0x0d03, 0xe789, 0x2f8e, 0x5d55, 0xa95e,
1296 0x826e, 0x8de5, 0x52a0, 0x1abc, 0x4cd7, 0xd13a, 0x4395, 0x63e1}},
1297 /* example doing 510 (f,(f+g)/2) steps; 512 divsteps */
1298 {{0xd5a1, 0xf786, 0x555c, 0xb14b, 0x44ae, 0x535f, 0x4a49, 0xffc3,
1299 0xf497, 0x70d1, 0x57c8, 0xa933, 0xc85a, 0x1910, 0x75bf, 0x960b},
1300 {0xfe53, 0x5058, 0x496d, 0xfdff, 0x6fb8, 0x4100, 0x92bd, 0xe0c4,
1301 0xda89, 0xe0a4, 0x841b, 0x43d4, 0xa388, 0x957f, 0x99ca, 0x9abf},
1302 {0xe530, 0x05bc, 0xfeec, 0xfc7e, 0xbcd3, 0x1239, 0x54cb, 0x7042,
1303 0xbccb, 0x139e, 0x9076, 0x0203, 0x6068, 0x90c7, 0x1ddf, 0x488d}},
1304 /* example doing 228 (g,(g-f)/2) steps; 538 divsteps */
1305 {{0x9488, 0xe54b, 0x0e43, 0x81d2, 0x06e7, 0x4b66, 0x36d0, 0x53d6,
1306 0x2b68, 0x22ec, 0x3fa9, 0xc1a7, 0x9ad2, 0xa596, 0xb3ac, 0xdf42},
1307 {0xe31f, 0x0b28, 0x5f3b, 0xc1ff, 0x344c, 0xbf5f, 0xd2ec, 0x2936,
1308 0x9995, 0xdeb2, 0xae6c, 0x2852, 0xa2c6, 0xb306, 0x8120, 0xe305},
1309 {0xa56e, 0xfb98, 0x1537, 0x4d85, 0x619e, 0x866c, 0x3cd4, 0x779a,
1310 0xdd66, 0xa80d, 0xdc2f, 0xcae4, 0xc74c, 0x5175, 0xa65d, 0x605e}},
1311 /* example doing 228 (g,(g-f)/2) steps; 537 divsteps */
1312 {{0x8cd5, 0x376d, 0xd01b, 0x7176, 0x19ef, 0xcf09, 0x8403, 0x5e52,
1313 0x83c1, 0x44de, 0xb91e, 0xb33d, 0xe15c, 0x51e7, 0xbad8, 0x6359},
1314 {0x3b75, 0xf812, 0x5f9e, 0xa04e, 0x92d3, 0x226e, 0x540e, 0x7c9a,
1315 0x31c6, 0x46d2, 0x0b7b, 0xdb4a, 0xe662, 0x4950, 0x0265, 0xf76f},
1316 {0x09ed, 0x692f, 0xe8f1, 0x3482, 0xab54, 0x36b4, 0x8442, 0x6ae9,
1317 0x4329, 0x6505, 0x183b, 0x1c1d, 0x482d, 0x7d63, 0xb44f, 0xcc09}},
1318
1319 /* Test cases with the group order as modulus. */
1320
1321 /* Test case with the group order as modulus, needing 635 divsteps. */
1322 {{0x95ed, 0x6c01, 0xd113, 0x5ff1, 0xd7d0, 0x29cc, 0x5817, 0x6120,
1323 0xca8e, 0xaad1, 0x25ae, 0x8e84, 0x9af6, 0x30bf, 0xf0ed, 0x1686},
1324 {0x4141, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1325 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1326 {0x1631, 0xbf4a, 0x286a, 0x2716, 0x469f, 0x2ac8, 0x1312, 0xe9bc,
1327 0x04f4, 0x304b, 0x9931, 0x113b, 0xd932, 0xc8f4, 0x0d0d, 0x01a1}},
1328 /* example with group size as modulus needing 631 divsteps */
1329 {{0x85ed, 0xc284, 0x9608, 0x3c56, 0x19b6, 0xbb5b, 0x2850, 0xdab7,
1330 0xa7f5, 0xe9ab, 0x06a4, 0x5bbb, 0x1135, 0xa186, 0xc424, 0xc68b},
1331 {0x4141, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1332 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1333 {0x8479, 0x450a, 0x8fa3, 0xde05, 0xb2f5, 0x7793, 0x7269, 0xbabb,
1334 0xc3b3, 0xd49b, 0x3377, 0x03c6, 0xe694, 0xc760, 0xd3cb, 0x2811}},
1335 /* example with group size as modulus needing 565 divsteps starting at delta=1/2 */
1336 {{0x8432, 0x5ceb, 0xa847, 0x6f1e, 0x51dd, 0x535a, 0x6ddc, 0x70ce,
1337 0x6e70, 0xc1f6, 0x18f2, 0x2a7e, 0xc8e7, 0x39f8, 0x7e96, 0xebbf},
1338 {0x4141, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1339 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1340 {0x257e, 0x449f, 0x689f, 0x89aa, 0x3989, 0xb661, 0x376c, 0x1e32,
1341 0x654c, 0xee2e, 0xf4e2, 0x33c8, 0x3f2f, 0x9716, 0x6046, 0xcaa3}},
1342 /* Test case with the group size as modulus, needing 981 divsteps with
1343 broken eta handling. */
1344 {{0xfeb9, 0xb877, 0xee41, 0x7fa3, 0x87da, 0x94c4, 0x9d04, 0xc5ae,
1345 0x5708, 0x0994, 0xfc79, 0x0916, 0xbf32, 0x3ad8, 0xe11c, 0x5ca2},
1346 {0x4141, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1347 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1348 {0x0f12, 0x075e, 0xce1c, 0x6f92, 0xc80f, 0xca92, 0x9a04, 0x6126,
1349 0x4b6c, 0x57d6, 0xca31, 0x97f3, 0x1f99, 0xf4fd, 0xda4d, 0x42ce}},
1350 /* Test case with the group size as modulus, input = 0. */
1351 {{0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1352 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
1353 {0x4141, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1354 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1355 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1356 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
1357 /* Test case with the group size as modulus, input = 1. */
1358 {{0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1359 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
1360 {0x4141, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1361 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1362 {0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1363 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
1364 /* Test case with the group size as modulus, input = 2. */
1365 {{0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1366 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
1367 {0x4141, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1368 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1369 {0x20a1, 0x681b, 0x2f46, 0xdfe9, 0x501d, 0x57a4, 0x6e73, 0x5d57,
1370 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x7fff}},
1371 /* Test case with the group size as modulus, input = group - 1. */
1372 {{0x4140, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1373 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1374 {0x4141, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1375 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1376 {0x4140, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1377 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}},
1378
1379 /* Test cases with the field size as modulus. */
1380
1381 /* Test case with the field size as modulus, needing 637 divsteps. */
1382 {{0x9ec3, 0x1919, 0xca84, 0x7c11, 0xf996, 0x06f3, 0x5408, 0x6688,
1383 0x1320, 0xdb8a, 0x632a, 0x0dcb, 0x8a84, 0x6bee, 0x9c95, 0xe34e},
1384 {0xfc2f, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1385 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1386 {0x18e5, 0x19b6, 0xdf92, 0x1aaa, 0x09fb, 0x8a3f, 0x52b0, 0x8701,
1387 0xac0c, 0x2582, 0xda44, 0x9bcc, 0x6828, 0x1c53, 0xbd8f, 0xbd2c}},
1388 /* example with field size as modulus needing 637 divsteps */
1389 {{0xaec3, 0xa7cf, 0x2f2d, 0x0693, 0x5ad5, 0xa8ff, 0x7ec7, 0x30ff,
1390 0x0c8b, 0xc242, 0xcab2, 0x063a, 0xf86e, 0x6057, 0x9cbd, 0xf6d8},
1391 {0xfc2f, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1392 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1393 {0x0310, 0x579d, 0xcb38, 0x9030, 0x3ded, 0x9bb9, 0x1234, 0x63ce,
1394 0x0c63, 0x8e3d, 0xacfe, 0x3c20, 0xdc85, 0xf859, 0x919e, 0x1d45}},
1395 /* example with field size as modulus needing 564 divsteps starting at delta=1/2 */
1396 {{0x63ae, 0x8d10, 0x0071, 0xdb5c, 0xb454, 0x78d1, 0x744a, 0x5f8e,
1397 0xe4d8, 0x87b1, 0x8e62, 0x9590, 0xcede, 0xa070, 0x36b4, 0x7f6f},
1398 {0xfc2f, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1399 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1400 {0xfdc8, 0xe8d5, 0xbe15, 0x9f86, 0xa5fe, 0xf18e, 0xa7ff, 0xd291,
1401 0xf4c2, 0x9c87, 0xf150, 0x073e, 0x69b8, 0xf7c4, 0xee4b, 0xc7e6}},
1402 /* Test case with the field size as modulus, needing 935 divsteps with
1403 broken eta handling. */
1404 {{0x1b37, 0xbdc3, 0x8bcd, 0x25e3, 0x1eae, 0x567d, 0x30b6, 0xf0d8,
1405 0x9277, 0x0cf8, 0x9c2e, 0xecd7, 0x631d, 0xe38f, 0xd4f8, 0x5c93},
1406 {0xfc2f, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1407 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1408 {0x1622, 0xe05b, 0xe880, 0x7de9, 0x3e45, 0xb682, 0xee6c, 0x67ed,
1409 0xa179, 0x15db, 0x6b0d, 0xa656, 0x7ccb, 0x8ef7, 0xa2ff, 0xe279}},
1410 /* Test case with the field size as modulus, input = 0. */
1411 {{0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1412 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
1413 {0xfc2f, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1414 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1415 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1416 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
1417 /* Test case with the field size as modulus, input = 1. */
1418 {{0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1419 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
1420 {0xfc2f, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1421 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1422 {0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1423 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
1424 /* Test case with the field size as modulus, input = 2. */
1425 {{0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1426 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
1427 {0xfc2f, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1428 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1429 {0xfe18, 0x7fff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1430 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x7fff}},
1431 /* Test case with the field size as modulus, input = field - 1. */
1432 {{0xfc2e, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1433 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1434 {0xfc2f, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1435 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1436 {0xfc2e, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1437 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}},
1438
1439 /* Selected from a large number of random inputs to reach small/large
1440 * d/e values in various configurations. */
1441 {{0x3a08, 0x23e1, 0x4d8c, 0xe606, 0x3263, 0x67af, 0x9bf1, 0x9d70,
1442 0xf5fd, 0x12e4, 0x03c8, 0xb9ca, 0xe847, 0x8c5d, 0x6322, 0xbd30},
1443 {0x8359, 0x59dd, 0x1831, 0x7c1a, 0x1e83, 0xaee1, 0x770d, 0xcea8,
1444 0xfbb1, 0xeed6, 0x10b5, 0xe2c6, 0x36ea, 0xee17, 0xe32c, 0xffff},
1445 {0x1727, 0x0f36, 0x6f85, 0x5d0c, 0xca6c, 0x3072, 0x9628, 0x5842,
1446 0xcb44, 0x7c2b, 0xca4f, 0x62e5, 0x29b1, 0x6ffd, 0x9055, 0xc196}},
1447 {{0x905d, 0x41c8, 0xa2ff, 0x295b, 0x72bb, 0x4679, 0x6d01, 0x2c98,
1448 0xb3e0, 0xc537, 0xa310, 0xe07e, 0xe72f, 0x4999, 0x1148, 0xf65e},
1449 {0x5b41, 0x4239, 0x3c37, 0x5130, 0x30e3, 0xff35, 0xc51f, 0x1a43,
1450 0xdb23, 0x13cf, 0x9f49, 0xf70c, 0x5e70, 0xd411, 0x3005, 0xf8c6},
1451 {0xc30e, 0x68f0, 0x201a, 0xe10c, 0x864a, 0x6243, 0xe946, 0x43ae,
1452 0xf3f1, 0x52dc, 0x1f7f, 0x50d4, 0x2797, 0x064c, 0x5ca4, 0x90e3}},
1453 {{0xf1b5, 0xc6e5, 0xd2c4, 0xff95, 0x27c5, 0x0c92, 0x5d19, 0x7ae5,
1454 0x4fbe, 0x5438, 0x99e1, 0x880d, 0xd892, 0xa05c, 0x6ffd, 0x7eac},
1455 {0x2153, 0xcc9d, 0xfc6c, 0x8358, 0x49a1, 0x01e2, 0xcef0, 0x4969,
1456 0xd69a, 0x8cef, 0xf5b2, 0xfd95, 0xdcc2, 0x71f4, 0x6ae2, 0xceeb},
1457 {0x9b2e, 0xcdc6, 0x0a5c, 0x7317, 0x9084, 0xe228, 0x56cf, 0xd512,
1458 0x628a, 0xce21, 0x3473, 0x4e13, 0x8823, 0x1ed0, 0x34d0, 0xbfa3}},
1459 {{0x5bae, 0x53e5, 0x5f4d, 0x21ca, 0xb875, 0x8ecf, 0x9aa6, 0xbe3c,
1460 0x9f96, 0x7b82, 0x375d, 0x4d3e, 0x491c, 0xb1eb, 0x04c9, 0xb6c8},
1461 {0xfcfd, 0x10b7, 0x73b2, 0xd23b, 0xa357, 0x67da, 0x0d9f, 0x8702,
1462 0xa037, 0xff8e, 0x0e8b, 0x1801, 0x2c5c, 0x4e6e, 0x4558, 0xfff2},
1463 {0xc50f, 0x5654, 0x6713, 0x5ef5, 0xa7ce, 0xa647, 0xc832, 0x69ce,
1464 0x1d5c, 0x4310, 0x0746, 0x5a01, 0x96ea, 0xde4b, 0xa88b, 0x5543}},
1465 {{0xdc7f, 0x5e8c, 0x89d1, 0xb077, 0xd521, 0xcf90, 0x32fa, 0x5737,
1466 0x839e, 0x1464, 0x007c, 0x09c6, 0x9371, 0xe8ea, 0xc1cb, 0x75c4},
1467 {0xe3a3, 0x107f, 0xa82a, 0xa375, 0x4578, 0x60f4, 0x75c9, 0x5ee4,
1468 0x3fd7, 0x2736, 0x2871, 0xd3d2, 0x5f1d, 0x1abb, 0xa764, 0xffff},
1469 {0x45c6, 0x1f2e, 0xb14c, 0x84d7, 0x7bb7, 0x5a04, 0x0504, 0x3f33,
1470 0x5cc1, 0xb07a, 0x6a6c, 0x786f, 0x647f, 0xe1d7, 0x78a2, 0x4cf4}},
1471 {{0xc006, 0x356f, 0x8cd2, 0x967b, 0xb49e, 0x2d4e, 0x14bf, 0x4bcb,
1472 0xddab, 0xd3f9, 0xa068, 0x2c1c, 0xd242, 0xa56d, 0xf2c7, 0x5f97},
1473 {0x465b, 0xb745, 0x0e0d, 0x69a9, 0x987d, 0xcb37, 0xf637, 0xb311,
1474 0xc4d6, 0x2ddb, 0xf68f, 0x2af9, 0x959d, 0x3f53, 0x98f2, 0xf640},
1475 {0xc0f2, 0x6bfb, 0xf5c3, 0x91c1, 0x6b05, 0x0825, 0x5ca0, 0x7df7,
1476 0x9d55, 0x6d9e, 0xfe94, 0x2ad9, 0xd9f0, 0xe68b, 0xa72b, 0xd1b2}},
1477 {{0x2279, 0x61ba, 0x5bc6, 0x136b, 0xf544, 0x717c, 0xafda, 0x02bd,
1478 0x79af, 0x1fad, 0xea09, 0x81bb, 0x932b, 0x32c9, 0xdf1d, 0xe576},
1479 {0x8215, 0x7817, 0xca82, 0x43b0, 0x9b06, 0xea65, 0x1291, 0x0621,
1480 0x0089, 0x46fe, 0xc5a6, 0xddd7, 0x8065, 0xc6a0, 0x214b, 0xfc64},
1481 {0x04bf, 0x6f2a, 0x86b2, 0x841a, 0x4a95, 0xc632, 0x97b7, 0x5821,
1482 0x2b18, 0x1bb0, 0x3e97, 0x935e, 0xcc7d, 0x066b, 0xd513, 0xc251}},
1483 {{0x76e8, 0x5bc2, 0x3eaa, 0x04fc, 0x9974, 0x92c1, 0x7c15, 0xfa89,
1484 0x1151, 0x36ee, 0x48b2, 0x049c, 0x5f16, 0xcee4, 0x925b, 0xe98e},
1485 {0x913f, 0x0a2d, 0xa185, 0x9fea, 0xda5a, 0x4025, 0x40d7, 0x7cfa,
1486 0x88ca, 0xbbe8, 0xb265, 0xb7e4, 0x6cb1, 0xed64, 0xc6f9, 0xffb5},
1487 {0x6ab1, 0x1a86, 0x5009, 0x152b, 0x1cc4, 0xe2c8, 0x960b, 0x19d0,
1488 0x3554, 0xc562, 0xd013, 0xcf91, 0x10e1, 0x7933, 0xe195, 0xcf49}},
1489 {{0x9cb5, 0xd2d7, 0xc6ed, 0xa818, 0xb495, 0x06ee, 0x0f4a, 0x06e3,
1490 0x4c5a, 0x80ce, 0xd49a, 0x4cd7, 0x7487, 0x92af, 0xe516, 0x676c},
1491 {0xd6e9, 0x6b85, 0x619a, 0xb52c, 0x20a0, 0x2f79, 0x3545, 0x1edd,
1492 0x5a6f, 0x8082, 0x9b80, 0xf8f8, 0xc78a, 0xd0a3, 0xadf4, 0xffff},
1493 {0x01c2, 0x2118, 0xef5e, 0xa877, 0x046a, 0xd2c2, 0x2ad5, 0x951c,
1494 0x8900, 0xa5c9, 0x8d0f, 0x6b61, 0x55d3, 0xd572, 0x48de, 0x9219}},
1495 {{0x5114, 0x0644, 0x23dd, 0x01d3, 0xc101, 0xa659, 0xea17, 0x640f,
1496 0xf767, 0x2644, 0x9cec, 0xd8ba, 0xd6da, 0x9156, 0x8aeb, 0x875a},
1497 {0xc1bf, 0xdae9, 0xe96b, 0xce77, 0xf7a1, 0x3e99, 0x5c2e, 0x973b,
1498 0xd048, 0x5bd0, 0x4e8a, 0xcb85, 0xce39, 0x37f5, 0x815d, 0xffff},
1499 {0x48cc, 0x35b6, 0x26d4, 0x2ea6, 0x50d6, 0xa2f9, 0x64b6, 0x03bf,
1500 0xd00c, 0xe057, 0x3343, 0xfb79, 0x3ce5, 0xf717, 0xc5af, 0xe185}},
1501 {{0x13ff, 0x6c76, 0x2077, 0x16e0, 0xd5ca, 0xf2ad, 0x8dba, 0x8f49,
1502 0x7887, 0x16f9, 0xb646, 0xfc87, 0xfa31, 0x5096, 0xf08c, 0x3fbe},
1503 {0x8139, 0x6fd7, 0xf6df, 0xa7bf, 0x6699, 0x5361, 0x6f65, 0x13c8,
1504 0xf4d1, 0xe28f, 0xc545, 0x0a8c, 0x5274, 0xb0a6, 0xffff, 0xffff},
1505 {0x22ca, 0x0cd6, 0xc1b5, 0xb064, 0x44a7, 0x297b, 0x495f, 0x34ac,
1506 0xfa95, 0xec62, 0xf08d, 0x621c, 0x66a6, 0xba94, 0x84c6, 0x8ee0}},
1507 {{0xaa30, 0x312e, 0x439c, 0x4e88, 0x2e2f, 0x32dc, 0xb880, 0xa28e,
1508 0xf795, 0xc910, 0xb406, 0x8dd7, 0xb187, 0xa5a5, 0x38f1, 0xe49e},
1509 {0xfb19, 0xf64a, 0xba6a, 0x8ec2, 0x7255, 0xce89, 0x2cf9, 0x9cba,
1510 0xe1fe, 0x50da, 0x1705, 0xac52, 0xe3d4, 0x4269, 0x0648, 0xfd77},
1511 {0xb4c8, 0x6e8a, 0x2b5f, 0x4c2d, 0x5a67, 0xa7bb, 0x7d6d, 0x5569,
1512 0xa0ea, 0x244a, 0xc0f2, 0xf73d, 0x58cf, 0xac7f, 0xd32b, 0x3018}},
1513 {{0xc953, 0x1ae1, 0xae46, 0x8709, 0x19c2, 0xa986, 0x9abe, 0x1611,
1514 0x0395, 0xd5ab, 0xf0f6, 0xb5b0, 0x5b2b, 0x0317, 0x80ba, 0x376d},
1515 {0xfe77, 0xbc03, 0xac2f, 0x9d00, 0xa175, 0x293d, 0x3b56, 0x0e3a,
1516 0x0a9c, 0xf40c, 0x690e, 0x1508, 0x95d4, 0xddc4, 0xe805, 0xffff},
1517 {0xb1ce, 0x0929, 0xa5fe, 0x4b50, 0x9d5d, 0x8187, 0x2557, 0x4376,
1518 0x11ba, 0xdcef, 0xc1f3, 0xd531, 0x1824, 0x93f6, 0xd81f, 0x8f83}},
1519 {{0xb8d2, 0xb900, 0x4a0c, 0x7188, 0xa5bf, 0x1b0b, 0x2ae5, 0xa35b,
1520 0x98e0, 0x610c, 0x86db, 0x2487, 0xa267, 0x002c, 0xebb6, 0xc5f4},
1521 {0x9cdd, 0x1c1b, 0x2f06, 0x43d1, 0xce47, 0xc334, 0x6e60, 0xc016,
1522 0x989e, 0x0ab2, 0x0cac, 0x1196, 0xe2d9, 0x2e04, 0xc62b, 0xffff},
1523 {0xdc36, 0x1f05, 0x6aa9, 0x7a20, 0x944f, 0x2fd3, 0xa553, 0xdb4f,
1524 0xbd5c, 0x3a75, 0x25d4, 0xe20e, 0xa387, 0x1410, 0xdbb1, 0x1b60}},
1525 {{0x76b3, 0x2207, 0x4930, 0x5dd7, 0x65a0, 0xd55c, 0xb443, 0x53b7,
1526 0x5c22, 0x818a, 0xb2e7, 0x9de8, 0x9985, 0xed45, 0x33b1, 0x53e8},
1527 {0x7913, 0x44e1, 0xf15b, 0x5edd, 0x34f3, 0x4eba, 0x0758, 0x7104,
1528 0x32d9, 0x28f3, 0x4401, 0x85c5, 0xb695, 0xb899, 0xc0f2, 0xffff},
1529 {0x7f43, 0xd202, 0x24c9, 0x69f3, 0x74dc, 0x1a69, 0xeaee, 0x5405,
1530 0x1755, 0x4bb8, 0x04e3, 0x2fd2, 0xada8, 0x39eb, 0x5b4d, 0x96ca}},
1531 {{0x807b, 0x7112, 0xc088, 0xdafd, 0x02fa, 0x9d95, 0x5e42, 0xc033,
1532 0xde0a, 0xeecf, 0x8e90, 0x8da1, 0xb17e, 0x9a5b, 0x4c6d, 0x1914},
1533 {0x4871, 0xd1cb, 0x47d7, 0x327f, 0x09ec, 0x97bb, 0x2fae, 0xd346,
1534 0x6b78, 0x3707, 0xfeb2, 0xa6ab, 0x13df, 0x76b0, 0x8fb9, 0xffb3},
1535 {0x179e, 0xb63b, 0x4784, 0x231e, 0x9f42, 0x7f1a, 0xa3fb, 0xdd8c,
1536 0xd1eb, 0xb4c9, 0x8ca7, 0x018c, 0xf691, 0x576c, 0xa7d6, 0xce27}},
1537 {{0x5f45, 0x7c64, 0x083d, 0xedd5, 0x08a0, 0x0c64, 0x6c6f, 0xec3c,
1538 0xe2fb, 0x352c, 0x9303, 0x75e4, 0xb4e0, 0x8b09, 0xaca4, 0x7025},
1539 {0x1025, 0xb482, 0xfed5, 0xa678, 0x8966, 0x9359, 0x5329, 0x98bb,
1540 0x85b2, 0x73ba, 0x9982, 0x6fdc, 0xf190, 0xbe8c, 0xdc5c, 0xfd93},
1541 {0x83a2, 0x87a4, 0xa680, 0x52a1, 0x1ba1, 0x8848, 0x5db7, 0x9744,
1542 0x409c, 0x0745, 0x0e1e, 0x1cfc, 0x00cd, 0xf573, 0x2071, 0xccaa}},
1543 {{0xf61f, 0x63d4, 0x536c, 0x9eb9, 0x5ddd, 0xbb11, 0x9014, 0xe904,
1544 0xfe01, 0x6b45, 0x1858, 0xcb5b, 0x4c38, 0x43e1, 0x381d, 0x7f94},
1545 {0xf61f, 0x63d4, 0xd810, 0x7ca3, 0x8a04, 0x4b83, 0x11fc, 0xdf94,
1546 0x4169, 0xbd05, 0x608e, 0x7151, 0x4fbf, 0xb31a, 0x38a7, 0xa29b},
1547 {0xe621, 0xdfa5, 0x3d06, 0x1d03, 0x81e6, 0x00da, 0x53a6, 0x965e,
1548 0x93e5, 0x2164, 0x5b61, 0x59b8, 0xa629, 0x8d73, 0x699a, 0x6111}},
1549 {{0x4cc3, 0xd29e, 0xf4a3, 0x3428, 0x2048, 0xeec9, 0x5f50, 0x99a4,
1550 0x6de9, 0x05f2, 0x5aa9, 0x5fd2, 0x98b4, 0x1adc, 0x225f, 0x777f},
1551 {0xe649, 0x37da, 0x5ba6, 0x5765, 0x3f4a, 0x8a1c, 0x2e79, 0xf550,
1552 0x1a54, 0xcd1e, 0x7218, 0x3c3c, 0x6311, 0xfe28, 0x95fb, 0xed97},
1553 {0xe9b6, 0x0c47, 0x3f0e, 0x849b, 0x11f8, 0xe599, 0x5e4d, 0xd618,
1554 0xa06d, 0x33a0, 0x9a3e, 0x44db, 0xded8, 0x10f0, 0x94d2, 0x81fb}},
1555 {{0x2e59, 0x7025, 0xd413, 0x455a, 0x1ce3, 0xbd45, 0x7263, 0x27f7,
1556 0x23e3, 0x518e, 0xbe06, 0xc8c4, 0xe332, 0x4276, 0x68b4, 0xb166},
1557 {0x596f, 0x0cf6, 0xc8ec, 0x787b, 0x04c1, 0x473c, 0xd2b8, 0x8d54,
1558 0x9cdf, 0x77f2, 0xd3f3, 0x6735, 0x0638, 0xf80e, 0x9467, 0xc6aa},
1559 {0xc7e7, 0x1822, 0xb62a, 0xec0d, 0x89cd, 0x7846, 0xbfa2, 0x35d5,
1560 0xfa38, 0x870f, 0x494b, 0x1697, 0x8b17, 0xf904, 0x10b6, 0x9822}},
1561 {{0x6d5b, 0x1d4f, 0x0aaf, 0x807b, 0x35fb, 0x7ee8, 0x00c6, 0x059a,
1562 0xddf0, 0x1fb1, 0xc38a, 0xd78e, 0x2aa4, 0x79e7, 0xad28, 0xc3f1},
1563 {0xe3bb, 0x174e, 0xe0a8, 0x74b6, 0xbd5b, 0x35f6, 0x6d23, 0x6328,
1564 0xc11f, 0x83e1, 0xf928, 0xa918, 0x838e, 0xbf43, 0xe243, 0xfffb},
1565 {0x9cf2, 0x6b8b, 0x3476, 0x9d06, 0xdcf2, 0xdb8a, 0x89cd, 0x4857,
1566 0x75c2, 0xabb8, 0x490b, 0xc9bd, 0x890e, 0xe36e, 0xd552, 0xfffa}},
1567 {{0x2f09, 0x9d62, 0xa9fc, 0xf090, 0xd6d1, 0x9d1d, 0x1828, 0xe413,
1568 0xc92b, 0x3d5a, 0x1373, 0x368c, 0xbaf2, 0x2158, 0x71eb, 0x08a3},
1569 {0x2f09, 0x1d62, 0x4630, 0x0de1, 0x06dc, 0xf7f1, 0xc161, 0x1e92,
1570 0x7495, 0x97e4, 0x94b6, 0xa39e, 0x4f1b, 0x18f8, 0x7bd4, 0x0c4c},
1571 {0xeb3d, 0x723d, 0x0907, 0x525b, 0x463a, 0x49a8, 0xc6b8, 0xce7f,
1572 0x740c, 0x0d7d, 0xa83b, 0x457f, 0xae8e, 0xc6af, 0xd331, 0x0475}},
1573 {{0x6abd, 0xc7af, 0x3e4e, 0x95fd, 0x8fc4, 0xee25, 0x1f9c, 0x0afe,
1574 0x291d, 0xcde0, 0x48f4, 0xb2e8, 0xf7af, 0x8f8d, 0x0bd6, 0x078d},
1575 {0x4037, 0xbf0e, 0x2081, 0xf363, 0x13b2, 0x381e, 0xfb6e, 0x818e,
1576 0x27e4, 0x5662, 0x18b0, 0x0cd2, 0x81f5, 0x9415, 0x0d6c, 0xf9fb},
1577 {0xd205, 0x0981, 0x0498, 0x1f08, 0xdb93, 0x1732, 0x0579, 0x1424,
1578 0xad95, 0x642f, 0x050c, 0x1d6d, 0xfc95, 0xfc4a, 0xd41b, 0x3521}},
1579 {{0xf23a, 0x4633, 0xaef4, 0x1a92, 0x3c8b, 0x1f09, 0x30f3, 0x4c56,
1580 0x2a2f, 0x4f62, 0xf5e4, 0x8329, 0x63cc, 0xb593, 0xec6a, 0xc428},
1581 {0x93a7, 0xfcf6, 0x606d, 0xd4b2, 0x2aad, 0x28b4, 0xc65b, 0x8998,
1582 0x4e08, 0xd178, 0x0900, 0xc82b, 0x7470, 0xa342, 0x7c0f, 0xffff},
1583 {0x315f, 0xf304, 0xeb7b, 0xe5c3, 0x1451, 0x6311, 0x8f37, 0x93a8,
1584 0x4a38, 0xa6c6, 0xe393, 0x1087, 0x6301, 0xd673, 0x4ec4, 0xffff}},
1585 {{0x892e, 0xeed0, 0x1165, 0xcbc1, 0x5545, 0xa280, 0x7243, 0x10c9,
1586 0x9536, 0x36af, 0xb3fc, 0x2d7c, 0xe8a5, 0x09d6, 0xe1d4, 0xe85d},
1587 {0xae09, 0xc28a, 0xd777, 0xbd80, 0x23d6, 0xf980, 0xeb7c, 0x4e0e,
1588 0xf7dc, 0x6475, 0xf10a, 0x2d33, 0x5dfd, 0x797a, 0x7f1c, 0xf71a},
1589 {0x4064, 0x8717, 0xd091, 0x80b0, 0x4527, 0x8442, 0xac8b, 0x9614,
1590 0xc633, 0x35f5, 0x7714, 0x2e83, 0x4aaa, 0xd2e4, 0x1acd, 0x0562}},
1591 {{0xdb64, 0x0937, 0x308b, 0x53b0, 0x00e8, 0xc77f, 0x2f30, 0x37f7,
1592 0x79ce, 0xeb7f, 0xde81, 0x9286, 0xafda, 0x0e62, 0xae00, 0x0067},
1593 {0x2cc7, 0xd362, 0xb161, 0x0557, 0x4ff2, 0xb9c8, 0x06fe, 0x5f2b,
1594 0xde33, 0x0190, 0x28c6, 0xb886, 0xee2b, 0x5a4e, 0x3289, 0x0185},
1595 {0x4215, 0x923e, 0xf34f, 0xb362, 0x88f8, 0xceec, 0xafdd, 0x7f42,
1596 0x0c57, 0x56b2, 0xa366, 0x6a08, 0x0826, 0xfb8f, 0x1b03, 0x0163}},
1597 {{0xa4ba, 0x8408, 0x810a, 0xdeba, 0x47a3, 0x853a, 0xeb64, 0x2f74,
1598 0x3039, 0x038c, 0x7fbb, 0x498e, 0xd1e9, 0x46fb, 0x5691, 0x32a4},
1599 {0xd749, 0xb49d, 0x20b7, 0x2af6, 0xd34a, 0xd2da, 0x0a10, 0xf781,
1600 0x58c9, 0x171f, 0x3cb6, 0x6337, 0x88cd, 0xcf1e, 0xb246, 0x7351},
1601 {0xf729, 0xcf0a, 0x96ea, 0x032c, 0x4a8f, 0x42fe, 0xbac8, 0xec65,
1602 0x1510, 0x0d75, 0x4c17, 0x8d29, 0xa03f, 0x8b7e, 0x2c49, 0x0000}},
1603 {{0x0fa4, 0x8e1c, 0x3788, 0xba3c, 0x8d52, 0xd89d, 0x12c8, 0xeced,
1604 0x9fe6, 0x9b88, 0xecf3, 0xe3c8, 0xac48, 0x76ed, 0xf23e, 0xda79},
1605 {0x1103, 0x227c, 0x5b00, 0x3fcf, 0xc5d0, 0x2d28, 0x8020, 0x4d1c,
1606 0xc6b9, 0x67f9, 0x6f39, 0x989a, 0xda53, 0x3847, 0xd416, 0xe0d0},
1607 {0xdd8e, 0xcf31, 0x3710, 0x7e44, 0xa511, 0x933c, 0x0cc3, 0x5145,
1608 0xf632, 0x5e1d, 0x038f, 0x5ce7, 0x7265, 0xda9d, 0xded6, 0x08f8}},
1609 {{0xe2c8, 0x91d5, 0xa5f5, 0x735f, 0x6b58, 0x56dc, 0xb39d, 0x5c4a,
1610 0x57d0, 0xa1c2, 0xd92f, 0x9ad4, 0xf7c4, 0x51dd, 0xaf5c, 0x0096},
1611 {0x1739, 0x7207, 0x7505, 0xbf35, 0x42de, 0x0a29, 0xa962, 0xdedf,
1612 0x53e8, 0x12bf, 0xcde7, 0xd8e2, 0x8d4d, 0x2c4b, 0xb1b1, 0x0628},
1613 {0x992d, 0xe3a7, 0xb422, 0xc198, 0x23ab, 0xa6ef, 0xb45d, 0x50da,
1614 0xa738, 0x014a, 0x2310, 0x85fb, 0x5fe8, 0x1b18, 0x1774, 0x03a7}},
1615 {{0x1f16, 0x2b09, 0x0236, 0xee90, 0xccf9, 0x9775, 0x8130, 0x4c91,
1616 0x9091, 0x310b, 0x6dc4, 0x86f6, 0xc2e8, 0xef60, 0xfc0e, 0xf3a4},
1617 {0x9f49, 0xac15, 0x02af, 0x110f, 0xc59d, 0x5677, 0xa1a9, 0x38d5,
1618 0x914f, 0xa909, 0x3a3a, 0x4a39, 0x3703, 0xea30, 0x73da, 0xffad},
1619 {0x15ed, 0xdd16, 0x83c7, 0x270a, 0x862f, 0xd8ad, 0xcaa1, 0x5f41,
1620 0x99a9, 0x3fc8, 0x7bb2, 0x360a, 0xb06d, 0xfadc, 0x1b36, 0xffa8}},
1621 {{0xc4e0, 0xb8fd, 0x5106, 0xe169, 0x754c, 0xa58c, 0xc413, 0x8224,
1622 0x5483, 0x63ec, 0xd477, 0x8473, 0x4778, 0x9281, 0x0000, 0x0000},
1623 {0x85e1, 0xff54, 0xb200, 0xe413, 0xf4f4, 0x4c0f, 0xfcec, 0xc183,
1624 0x60d3, 0x1b0c, 0x3834, 0x601c, 0x943c, 0xbe6e, 0x0002, 0x0000},
1625 {0xf4f8, 0xfd5e, 0x61ef, 0xece8, 0x9199, 0xe5c4, 0x05a6, 0xe6c3,
1626 0xc4ae, 0x8b28, 0x66b1, 0x8a95, 0x9ece, 0x8f4a, 0x0001, 0x0000}},
1627 {{0xeae9, 0xa1b4, 0xc6d8, 0x2411, 0x2b5a, 0x1dd0, 0x2dc9, 0xb57b,
1628 0x5ccd, 0x4957, 0xaf59, 0xa04b, 0x5f42, 0xab7c, 0x2826, 0x526f},
1629 {0xf407, 0x165a, 0xb724, 0x2f12, 0x2ea1, 0x470b, 0x4464, 0xbd35,
1630 0x606f, 0xd73e, 0x50d3, 0x8a7f, 0x8029, 0x7ffc, 0xbe31, 0x6cfb},
1631 {0x8171, 0x1f4c, 0xced2, 0x9c99, 0x6d7e, 0x5a0f, 0xfefb, 0x59e3,
1632 0xa0c8, 0xabd9, 0xc4c5, 0x57d3, 0xbfa3, 0x4f11, 0x96a2, 0x5a7d}},
1633 {{0xe068, 0x4cc0, 0x8bcd, 0xc903, 0x9e52, 0xb3e1, 0xd745, 0x0995,
1634 0xdd8f, 0xf14b, 0xd2ac, 0xd65a, 0xda1d, 0xa742, 0xbac5, 0x474c},
1635 {0x7481, 0xf2ad, 0x9757, 0x2d82, 0xb683, 0xb16b, 0x0002, 0x7b60,
1636 0x8f0c, 0x2594, 0x8f64, 0x3b7a, 0x3552, 0x8d9d, 0xb9d7, 0x67eb},
1637 {0xcaab, 0xb9a1, 0xf966, 0xe311, 0x5b34, 0x0fa0, 0x6abc, 0x8134,
1638 0xab3d, 0x90f6, 0x1984, 0x9232, 0xec17, 0x74e5, 0x2ceb, 0x434e}},
1639 {{0x0fb1, 0x7a55, 0x1a5c, 0x53eb, 0xd7b3, 0x7a01, 0xca32, 0x31f6,
1640 0x3b74, 0x679e, 0x1501, 0x6c57, 0xdb20, 0x8b7c, 0xd7d0, 0x8097},
1641 {0xb127, 0xb20c, 0xe3a2, 0x96f3, 0xe0d8, 0xd50c, 0x14b4, 0x0b40,
1642 0x6eeb, 0xa258, 0x99db, 0x3c8c, 0x0f51, 0x4198, 0x3887, 0xffd0},
1643 {0x0273, 0x9f8c, 0x9669, 0xbbba, 0x1c49, 0x767c, 0xc2af, 0x59f0,
1644 0x1366, 0xd397, 0x63ac, 0x6fe8, 0x1a9a, 0x1259, 0x01d0, 0x0016}},
1645 {{0x7876, 0x2a35, 0xa24a, 0x433e, 0x5501, 0x573c, 0xd76d, 0xcb82,
1646 0x1334, 0xb4a6, 0xf290, 0xc797, 0xeae9, 0x2b83, 0x1e2b, 0x8b14},
1647 {0x3885, 0x8aef, 0x9dea, 0x2b8c, 0xdd7c, 0xd7cd, 0xb0cc, 0x05ee,
1648 0x361b, 0x3800, 0xb0d4, 0x4c23, 0xbd3f, 0x5180, 0x9783, 0xff80},
1649 {0xab36, 0x3104, 0xdae8, 0x0704, 0x4a28, 0x6714, 0x824b, 0x0051,
1650 0x8134, 0x1f6a, 0x712d, 0x1f03, 0x03b2, 0xecac, 0x377d, 0xfef9}}
1651 };
1652
1653 int i, j, ok;
1654
1655 /* Test known inputs/outputs */
1656 for (i = 0; (size_t)i < sizeof(CASES) / sizeof(CASES[0]); ++i) {
1657 uint16_t out[16];
1658 test_modinv32_uint16(out, CASES[i][0], CASES[i][1]);
1659 for (j = 0; j < 16; ++j) CHECK(out[j] == CASES[i][2][j]);
1660#ifdef SECP256K1_WIDEMUL_INT128
1661 test_modinv64_uint16(out, CASES[i][0], CASES[i][1]);
1662 for (j = 0; j < 16; ++j) CHECK(out[j] == CASES[i][2][j]);
1663#endif
1664 }
1665
1666 for (i = 0; i < 100 * COUNT; ++i) {
1667 /* 256-bit numbers in 16-uint16_t's notation */
1668 static const uint16_t ZERO[16] = {0};
1669 uint16_t xd[16]; /* the number (in range [0,2^256)) to be inverted */
1670 uint16_t md[16]; /* the modulus (odd, in range [3,2^256)) */
1671 uint16_t id[16]; /* the inverse of xd mod md */
1672
1673 /* generate random xd and md, so that md is odd, md>1, xd<md, and gcd(xd,md)=1 */
1674 do {
1675 /* generate random xd and md (with many subsequent 0s and 1s) */
1676 secp256k1_testrand256_test((unsigned char*)xd);
1677 secp256k1_testrand256_test((unsigned char*)md);
1678 md[0] |= 1; /* modulus must be odd */
1679 /* If modulus is 1, find another one. */
1680 ok = md[0] != 1;
1681 for (j = 1; j < 16; ++j) ok |= md[j] != 0;
1682 mulmod256(xd, xd, NULL, md); /* Make xd = xd mod md */
1683 } while (!(ok && coprime(xd, md)));
1684
1685 test_modinv32_uint16(id, xd, md);
1686#ifdef SECP256K1_WIDEMUL_INT128
1687 test_modinv64_uint16(id, xd, md);
1688#endif
1689
1690 /* In a few cases, also test with input=0 */
1691 if (i < COUNT) {
1692 test_modinv32_uint16(id, ZERO, md);
1693#ifdef SECP256K1_WIDEMUL_INT128
1694 test_modinv64_uint16(id, ZERO, md);
1695#endif
1696 }
1697 }
1698}
1699
1700/***** INT128 TESTS *****/
1701
1702#ifdef SECP256K1_WIDEMUL_INT128
1703/* Add two 256-bit numbers (represented as 16 uint16_t's in LE order) together mod 2^256. */
1704void add256(uint16_t* out, const uint16_t* a, const uint16_t* b) {
1705 int i;
1706 uint32_t carry = 0;
1707 for (i = 0; i < 16; ++i) {
1708 carry += a[i];
1709 carry += b[i];
1710 out[i] = carry;
1711 carry >>= 16;
1712 }
1713}
1714
1715/* Negate a 256-bit number (represented as 16 uint16_t's in LE order) mod 2^256. */
1716void neg256(uint16_t* out, const uint16_t* a) {
1717 int i;
1718 uint32_t carry = 1;
1719 for (i = 0; i < 16; ++i) {
1720 carry += (uint16_t)~a[i];
1721 out[i] = carry;
1722 carry >>= 16;
1723 }
1724}
1725
1726/* Right-shift a 256-bit number (represented as 16 uint16_t's in LE order). */
1727void rshift256(uint16_t* out, const uint16_t* a, int n, int sign_extend) {
1728 uint16_t sign = sign_extend && (a[15] >> 15);
1729 int i, j;
1730 for (i = 15; i >= 0; --i) {
1731 uint16_t v = 0;
1732 for (j = 0; j < 16; ++j) {
1733 int frompos = i*16 + j + n;
1734 if (frompos >= 256) {
1735 v |= sign << j;
1736 } else {
1737 v |= ((uint16_t)((a[frompos >> 4] >> (frompos & 15)) & 1)) << j;
1738 }
1739 }
1740 out[i] = v;
1741 }
1742}
1743
1744/* Load a 64-bit unsigned integer into an array of 16 uint16_t's in LE order representing a 256-bit value. */
1745void load256u64(uint16_t* out, uint64_t v, int is_signed) {
1746 int i;
1747 uint64_t sign = is_signed && (v >> 63) ? UINT64_MAX : 0;
1748 for (i = 0; i < 4; ++i) {
1749 out[i] = v >> (16 * i);
1750 }
1751 for (i = 4; i < 16; ++i) {
1752 out[i] = sign;
1753 }
1754}
1755
1756/* Load a 128-bit unsigned integer into an array of 16 uint16_t's in LE order representing a 256-bit value. */
1757void load256two64(uint16_t* out, uint64_t hi, uint64_t lo, int is_signed) {
1758 int i;
1759 uint64_t sign = is_signed && (hi >> 63) ? UINT64_MAX : 0;
1760 for (i = 0; i < 4; ++i) {
1761 out[i] = lo >> (16 * i);
1762 }
1763 for (i = 4; i < 8; ++i) {
1764 out[i] = hi >> (16 * (i - 4));
1765 }
1766 for (i = 8; i < 16; ++i) {
1767 out[i] = sign;
1768 }
1769}
1770
1771/* Check whether the 256-bit value represented by array of 16-bit values is in range -2^127 < v < 2^127. */
1772int int256is127(const uint16_t* v) {
1773 int all_0 = ((v[7] & 0x8000) == 0), all_1 = ((v[7] & 0x8000) == 0x8000);
1774 int i;
1775 for (i = 8; i < 16; ++i) {
1776 if (v[i] != 0) all_0 = 0;
1777 if (v[i] != 0xffff) all_1 = 0;
1778 }
1779 return all_0 || all_1;
1780}
1781
1782void load256u128(uint16_t* out, const secp256k1_uint128* v) {
1783 uint64_t lo = secp256k1_u128_to_u64(v), hi = secp256k1_u128_hi_u64(v);
1784 load256two64(out, hi, lo, 0);
1785}
1786
1787void load256i128(uint16_t* out, const secp256k1_int128* v) {
1788 uint64_t lo;
1789 int64_t hi;
1790 secp256k1_int128 c = *v;
1791 lo = secp256k1_i128_to_u64(&c);
1792 secp256k1_i128_rshift(&c, 64);
1793 hi = secp256k1_i128_to_i64(&c);
1794 load256two64(out, hi, lo, 1);
1795}
1796
1797void run_int128_test_case(void) {
1798 unsigned char buf[32];
1799 uint64_t v[4];
1800 secp256k1_int128 swa, swz;
1801 secp256k1_uint128 uwa, uwz;
1802 uint64_t ub, uc;
1803 int64_t sb, sc;
1804 uint16_t rswa[16], rswz[32], rswr[32], ruwa[16], ruwz[32], ruwr[32];
1805 uint16_t rub[16], ruc[16], rsb[16], rsc[16];
1806 int i;
1807
1808 /* Generate 32-byte random value. */
1810 /* Convert into 4 64-bit integers. */
1811 for (i = 0; i < 4; ++i) {
1812 uint64_t vi = 0;
1813 int j;
1814 for (j = 0; j < 8; ++j) vi = (vi << 8) + buf[8*i + j];
1815 v[i] = vi;
1816 }
1817 /* Convert those into a 128-bit value and two 64-bit values (signed and unsigned). */
1818 secp256k1_u128_load(&uwa, v[1], v[0]);
1819 secp256k1_i128_load(&swa, v[1], v[0]);
1820 ub = v[2];
1821 sb = v[2];
1822 uc = v[3];
1823 sc = v[3];
1824 /* Load those also into 16-bit array representations. */
1825 load256u128(ruwa, &uwa);
1826 load256i128(rswa, &swa);
1827 load256u64(rub, ub, 0);
1828 load256u64(rsb, sb, 1);
1829 load256u64(ruc, uc, 0);
1830 load256u64(rsc, sc, 1);
1831 /* test secp256k1_u128_mul */
1832 mulmod256(ruwr, rub, ruc, NULL);
1833 secp256k1_u128_mul(&uwz, ub, uc);
1834 load256u128(ruwz, &uwz);
1835 CHECK(secp256k1_memcmp_var(ruwr, ruwz, 16) == 0);
1836 /* test secp256k1_u128_accum_mul */
1837 mulmod256(ruwr, rub, ruc, NULL);
1838 add256(ruwr, ruwr, ruwa);
1839 uwz = uwa;
1840 secp256k1_u128_accum_mul(&uwz, ub, uc);
1841 load256u128(ruwz, &uwz);
1842 CHECK(secp256k1_memcmp_var(ruwr, ruwz, 16) == 0);
1843 /* test secp256k1_u128_accum_u64 */
1844 add256(ruwr, rub, ruwa);
1845 uwz = uwa;
1846 secp256k1_u128_accum_u64(&uwz, ub);
1847 load256u128(ruwz, &uwz);
1848 CHECK(secp256k1_memcmp_var(ruwr, ruwz, 16) == 0);
1849 /* test secp256k1_u128_rshift */
1850 rshift256(ruwr, ruwa, uc % 128, 0);
1851 uwz = uwa;
1852 secp256k1_u128_rshift(&uwz, uc % 128);
1853 load256u128(ruwz, &uwz);
1854 CHECK(secp256k1_memcmp_var(ruwr, ruwz, 16) == 0);
1855 /* test secp256k1_u128_to_u64 */
1856 CHECK(secp256k1_u128_to_u64(&uwa) == v[0]);
1857 /* test secp256k1_u128_hi_u64 */
1858 CHECK(secp256k1_u128_hi_u64(&uwa) == v[1]);
1859 /* test secp256k1_u128_from_u64 */
1860 secp256k1_u128_from_u64(&uwz, ub);
1861 load256u128(ruwz, &uwz);
1862 CHECK(secp256k1_memcmp_var(rub, ruwz, 16) == 0);
1863 /* test secp256k1_u128_check_bits */
1864 {
1865 int uwa_bits = 0;
1866 int j;
1867 for (j = 0; j < 128; ++j) {
1868 if (ruwa[j / 16] >> (j % 16)) uwa_bits = 1 + j;
1869 }
1870 for (j = 0; j < 128; ++j) {
1871 CHECK(secp256k1_u128_check_bits(&uwa, j) == (uwa_bits <= j));
1872 }
1873 }
1874 /* test secp256k1_i128_mul */
1875 mulmod256(rswr, rsb, rsc, NULL);
1876 secp256k1_i128_mul(&swz, sb, sc);
1877 load256i128(rswz, &swz);
1878 CHECK(secp256k1_memcmp_var(rswr, rswz, 16) == 0);
1879 /* test secp256k1_i128_accum_mul */
1880 mulmod256(rswr, rsb, rsc, NULL);
1881 add256(rswr, rswr, rswa);
1882 if (int256is127(rswr)) {
1883 swz = swa;
1884 secp256k1_i128_accum_mul(&swz, sb, sc);
1885 load256i128(rswz, &swz);
1886 CHECK(secp256k1_memcmp_var(rswr, rswz, 16) == 0);
1887 }
1888 /* test secp256k1_i128_det */
1889 {
1890 uint16_t rsd[16], rse[16], rst[32];
1891 int64_t sd = v[0], se = v[1];
1892 load256u64(rsd, sd, 1);
1893 load256u64(rse, se, 1);
1894 mulmod256(rst, rsc, rsd, NULL);
1895 neg256(rst, rst);
1896 mulmod256(rswr, rsb, rse, NULL);
1897 add256(rswr, rswr, rst);
1898 secp256k1_i128_det(&swz, sb, sc, sd, se);
1899 load256i128(rswz, &swz);
1900 CHECK(secp256k1_memcmp_var(rswr, rswz, 16) == 0);
1901 }
1902 /* test secp256k1_i128_rshift */
1903 rshift256(rswr, rswa, uc % 127, 1);
1904 swz = swa;
1905 secp256k1_i128_rshift(&swz, uc % 127);
1906 load256i128(rswz, &swz);
1907 CHECK(secp256k1_memcmp_var(rswr, rswz, 16) == 0);
1908 /* test secp256k1_i128_to_u64 */
1909 CHECK(secp256k1_i128_to_u64(&swa) == v[0]);
1910 /* test secp256k1_i128_from_i64 */
1911 secp256k1_i128_from_i64(&swz, sb);
1912 load256i128(rswz, &swz);
1913 CHECK(secp256k1_memcmp_var(rsb, rswz, 16) == 0);
1914 /* test secp256k1_i128_to_i64 */
1915 CHECK(secp256k1_i128_to_i64(&swz) == sb);
1916 /* test secp256k1_i128_eq_var */
1917 {
1918 int expect = (uc & 1);
1919 swz = swa;
1920 if (!expect) {
1921 /* Make sure swz != swa */
1922 uint64_t v0c = v[0], v1c = v[1];
1923 if (ub & 64) {
1924 v1c ^= (((uint64_t)1) << (ub & 63));
1925 } else {
1926 v0c ^= (((uint64_t)1) << (ub & 63));
1927 }
1928 secp256k1_i128_load(&swz, v1c, v0c);
1929 }
1930 CHECK(secp256k1_i128_eq_var(&swa, &swz) == expect);
1931 }
1932 /* test secp256k1_i128_check_pow2 */
1933 {
1934 int expect = (uc & 1);
1935 int pos = ub % 127;
1936 if (expect) {
1937 /* If expect==1, set swz to exactly (2 << pos). */
1938 uint64_t hi = 0;
1939 uint64_t lo = 0;
1940 if (pos & 64) {
1941 hi = (((uint64_t)1) << (pos & 63));
1942 } else {
1943 lo = (((uint64_t)1) << (pos & 63));
1944 }
1945 secp256k1_i128_load(&swz, hi, lo);
1946 } else {
1947 /* If expect==0, set swz = swa, but update expect=1 if swa happens to equal (2 << pos). */
1948 if (pos & 64) {
1949 if ((v[1] == (((uint64_t)1) << (pos & 63))) && v[0] == 0) expect = 1;
1950 } else {
1951 if ((v[0] == (((uint64_t)1) << (pos & 63))) && v[1] == 0) expect = 1;
1952 }
1953 swz = swa;
1954 }
1955 CHECK(secp256k1_i128_check_pow2(&swz, pos) == expect);
1956 }
1957}
1958
1959void run_int128_tests(void) {
1960 { /* secp256k1_u128_accum_mul */
1962
1963 /* Check secp256k1_u128_accum_mul overflow */
1964 secp256k1_u128_mul(&res, UINT64_MAX, UINT64_MAX);
1965 secp256k1_u128_accum_mul(&res, UINT64_MAX, UINT64_MAX);
1966 CHECK(secp256k1_u128_to_u64(&res) == 2);
1967 CHECK(secp256k1_u128_hi_u64(&res) == 18446744073709551612U);
1968 }
1969 { /* secp256k1_u128_accum_mul */
1970 secp256k1_int128 res;
1971
1972 /* Compute INT128_MAX = 2^127 - 1 with secp256k1_i128_accum_mul */
1973 secp256k1_i128_mul(&res, INT64_MAX, INT64_MAX);
1974 secp256k1_i128_accum_mul(&res, INT64_MAX, INT64_MAX);
1975 CHECK(secp256k1_i128_to_u64(&res) == 2);
1976 secp256k1_i128_accum_mul(&res, 4, 9223372036854775807);
1977 secp256k1_i128_accum_mul(&res, 1, 1);
1978 CHECK(secp256k1_i128_to_u64(&res) == UINT64_MAX);
1979 secp256k1_i128_rshift(&res, 64);
1980 CHECK(secp256k1_i128_to_i64(&res) == INT64_MAX);
1981
1982 /* Compute INT128_MIN = - 2^127 with secp256k1_i128_accum_mul */
1983 secp256k1_i128_mul(&res, INT64_MAX, INT64_MIN);
1984 CHECK(secp256k1_i128_to_u64(&res) == (uint64_t)INT64_MIN);
1985 secp256k1_i128_accum_mul(&res, INT64_MAX, INT64_MIN);
1986 CHECK(secp256k1_i128_to_u64(&res) == 0);
1987 secp256k1_i128_accum_mul(&res, 2, INT64_MIN);
1988 CHECK(secp256k1_i128_to_u64(&res) == 0);
1989 secp256k1_i128_rshift(&res, 64);
1990 CHECK(secp256k1_i128_to_i64(&res) == INT64_MIN);
1991 }
1992 {
1993 /* Randomized tests. */
1994 int i;
1995 for (i = 0; i < 256 * COUNT; ++i) run_int128_test_case();
1996 }
1997}
1998#endif
1999
2000/***** SCALAR TESTS *****/
2001
2002void scalar_test(void) {
2006 unsigned char c[32];
2007
2008 /* Set 's' to a random scalar, with value 'snum'. */
2010
2011 /* Set 's1' to a random scalar, with value 's1num'. */
2013
2014 /* Set 's2' to a random scalar, with value 'snum2', and byte array representation 'c'. */
2017
2018 {
2019 int i;
2020 /* Test that fetching groups of 4 bits from a scalar and recursing n(i)=16*n(i-1)+p(i) reconstructs it. */
2023 for (i = 0; i < 256; i += 4) {
2025 int j;
2026 secp256k1_scalar_set_int(&t, secp256k1_scalar_get_bits(&s, 256 - 4 - i, 4));
2027 for (j = 0; j < 4; j++) {
2028 secp256k1_scalar_add(&n, &n, &n);
2029 }
2030 secp256k1_scalar_add(&n, &n, &t);
2031 }
2032 CHECK(secp256k1_scalar_eq(&n, &s));
2033 }
2034
2035 {
2036 /* Test that fetching groups of randomly-sized bits from a scalar and recursing n(i)=b*n(i-1)+p(i) reconstructs it. */
2038 int i = 0;
2040 while (i < 256) {
2042 int j;
2043 int now = secp256k1_testrand_int(15) + 1;
2044 if (now + i > 256) {
2045 now = 256 - i;
2046 }
2047 secp256k1_scalar_set_int(&t, secp256k1_scalar_get_bits_var(&s, 256 - now - i, now));
2048 for (j = 0; j < now; j++) {
2049 secp256k1_scalar_add(&n, &n, &n);
2050 }
2051 secp256k1_scalar_add(&n, &n, &t);
2052 i += now;
2053 }
2054 CHECK(secp256k1_scalar_eq(&n, &s));
2055 }
2056
2057 {
2058 /* test secp256k1_scalar_shr_int */
2060 int i;
2062 for (i = 0; i < 100; ++i) {
2063 int low;
2064 int shift = 1 + secp256k1_testrand_int(15);
2065 int expected = r.d[0] % (1 << shift);
2066 low = secp256k1_scalar_shr_int(&r, shift);
2067 CHECK(expected == low);
2068 }
2069 }
2070
2071 {
2072 /* Test commutativity of add. */
2073 secp256k1_scalar r1, r2;
2074 secp256k1_scalar_add(&r1, &s1, &s2);
2075 secp256k1_scalar_add(&r2, &s2, &s1);
2076 CHECK(secp256k1_scalar_eq(&r1, &r2));
2077 }
2078
2079 {
2080 secp256k1_scalar r1, r2;
2082 int i;
2083 /* Test add_bit. */
2084 int bit = secp256k1_testrand_bits(8);
2087 for (i = 0; i < bit; i++) {
2088 secp256k1_scalar_add(&b, &b, &b);
2089 }
2090 r1 = s1;
2091 r2 = s1;
2092 if (!secp256k1_scalar_add(&r1, &r1, &b)) {
2093 /* No overflow happened. */
2094 secp256k1_scalar_cadd_bit(&r2, bit, 1);
2095 CHECK(secp256k1_scalar_eq(&r1, &r2));
2096 /* cadd is a noop when flag is zero */
2097 secp256k1_scalar_cadd_bit(&r2, bit, 0);
2098 CHECK(secp256k1_scalar_eq(&r1, &r2));
2099 }
2100 }
2101
2102 {
2103 /* Test commutativity of mul. */
2104 secp256k1_scalar r1, r2;
2105 secp256k1_scalar_mul(&r1, &s1, &s2);
2106 secp256k1_scalar_mul(&r2, &s2, &s1);
2107 CHECK(secp256k1_scalar_eq(&r1, &r2));
2108 }
2109
2110 {
2111 /* Test associativity of add. */
2112 secp256k1_scalar r1, r2;
2113 secp256k1_scalar_add(&r1, &s1, &s2);
2114 secp256k1_scalar_add(&r1, &r1, &s);
2115 secp256k1_scalar_add(&r2, &s2, &s);
2116 secp256k1_scalar_add(&r2, &s1, &r2);
2117 CHECK(secp256k1_scalar_eq(&r1, &r2));
2118 }
2119
2120 {
2121 /* Test associativity of mul. */
2122 secp256k1_scalar r1, r2;
2123 secp256k1_scalar_mul(&r1, &s1, &s2);
2124 secp256k1_scalar_mul(&r1, &r1, &s);
2125 secp256k1_scalar_mul(&r2, &s2, &s);
2126 secp256k1_scalar_mul(&r2, &s1, &r2);
2127 CHECK(secp256k1_scalar_eq(&r1, &r2));
2128 }
2129
2130 {
2131 /* Test distributitivity of mul over add. */
2132 secp256k1_scalar r1, r2, t;
2133 secp256k1_scalar_add(&r1, &s1, &s2);
2134 secp256k1_scalar_mul(&r1, &r1, &s);
2135 secp256k1_scalar_mul(&r2, &s1, &s);
2136 secp256k1_scalar_mul(&t, &s2, &s);
2137 secp256k1_scalar_add(&r2, &r2, &t);
2138 CHECK(secp256k1_scalar_eq(&r1, &r2));
2139 }
2140
2141 {
2142 /* Test multiplicative identity. */
2143 secp256k1_scalar r1, v1;
2145 secp256k1_scalar_mul(&r1, &s1, &v1);
2146 CHECK(secp256k1_scalar_eq(&r1, &s1));
2147 }
2148
2149 {
2150 /* Test additive identity. */
2151 secp256k1_scalar r1, v0;
2153 secp256k1_scalar_add(&r1, &s1, &v0);
2154 CHECK(secp256k1_scalar_eq(&r1, &s1));
2155 }
2156
2157 {
2158 /* Test zero product property. */
2159 secp256k1_scalar r1, v0;
2161 secp256k1_scalar_mul(&r1, &s1, &v0);
2162 CHECK(secp256k1_scalar_eq(&r1, &v0));
2163 }
2164
2165}
2166
2168 unsigned char b32[32];
2171
2172 /* Usually set_b32 and set_b32_seckey give the same result */
2174 secp256k1_scalar_set_b32(&s1, b32, NULL);
2175 CHECK(secp256k1_scalar_set_b32_seckey(&s2, b32) == 1);
2176 CHECK(secp256k1_scalar_eq(&s1, &s2) == 1);
2177
2178 memset(b32, 0, sizeof(b32));
2179 CHECK(secp256k1_scalar_set_b32_seckey(&s2, b32) == 0);
2180 memset(b32, 0xFF, sizeof(b32));
2181 CHECK(secp256k1_scalar_set_b32_seckey(&s2, b32) == 0);
2182}
2183
2185 int i;
2186 for (i = 0; i < 128 * COUNT; i++) {
2187 scalar_test();
2188 }
2189 for (i = 0; i < COUNT; i++) {
2191 }
2192
2193 {
2194 /* (-1)+1 should be zero. */
2195 secp256k1_scalar s, o;
2199 secp256k1_scalar_add(&o, &o, &s);
2203 }
2204
2205 {
2206 /* Does check_overflow check catch all ones? */
2207 static const secp256k1_scalar overflowed = SECP256K1_SCALAR_CONST(
2208 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
2209 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL
2210 );
2212 }
2213
2214 {
2215 /* Static test vectors.
2216 * These were reduced from ~10^12 random vectors based on comparison-decision
2217 * and edge-case coverage on 32-bit and 64-bit implementations.
2218 * The responses were generated with Sage 5.9.
2219 */
2224 secp256k1_scalar one;
2227 secp256k1_scalar zzv;
2228 int overflow;
2229 unsigned char chal[33][2][32] = {
2230 {{0xff, 0xff, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00,
2231 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03,
2232 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff,
2233 0xff, 0xff, 0x03, 0x00, 0xc0, 0xff, 0xff, 0xff},
2234 {0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00,
2235 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8,
2236 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2237 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff}},
2238 {{0xef, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
2239 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00,
2240 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2241 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
2242 {0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
2243 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0,
2244 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff,
2245 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x80, 0xff}},
2246 {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
2247 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
2248 0x80, 0x00, 0x00, 0x80, 0xff, 0x3f, 0x00, 0x00,
2249 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x00},
2250 {0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x80,
2251 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xe0,
2252 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00,
2253 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff}},
2254 {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
2255 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
2256 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
2257 0x00, 0x1e, 0xf8, 0xff, 0xff, 0xff, 0xfd, 0xff},
2258 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f,
2259 0x00, 0x00, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xe0,
2260 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff,
2261 0xf3, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}},
2262 {{0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00,
2263 0x00, 0x1c, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
2264 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0x00,
2265 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff},
2266 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00,
2267 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2268 0xff, 0x1f, 0x00, 0x00, 0x80, 0xff, 0xff, 0x3f,
2269 0x00, 0xfe, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff}},
2270 {{0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xfc, 0x9f,
2271 0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x80,
2272 0xff, 0x0f, 0xfc, 0xff, 0x7f, 0x00, 0x00, 0x00,
2273 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},
2274 {0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2275 0x00, 0x00, 0xf8, 0xff, 0x0f, 0xc0, 0xff, 0xff,
2276 0xff, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff,
2277 0xff, 0xff, 0xff, 0x07, 0x80, 0xff, 0xff, 0xff}},
2278 {{0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00,
2279 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
2280 0xf7, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x00,
2281 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xf0},
2282 {0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff,
2283 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,
2284 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff,
2285 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
2286 {{0x00, 0xf8, 0xff, 0x03, 0xff, 0xff, 0xff, 0x00,
2287 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
2288 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
2289 0xff, 0xff, 0x03, 0xc0, 0xff, 0x0f, 0xfc, 0xff},
2290 {0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff,
2291 0xff, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x00, 0xc0,
2292 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2293 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
2294 {{0x8f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2295 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff,
2296 0xff, 0x7f, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
2297 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},
2298 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2299 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2300 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2301 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
2302 {{0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff,
2303 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2304 0xff, 0xff, 0x03, 0x00, 0x80, 0x00, 0x00, 0x80,
2305 0xff, 0xff, 0xff, 0x00, 0x00, 0x80, 0xff, 0x7f},
2306 {0xff, 0xcf, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,
2307 0x00, 0xc0, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff,
2308 0xbf, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00,
2309 0x80, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00}},
2310 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff,
2311 0xff, 0xff, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff,
2312 0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x80,
2313 0xff, 0x01, 0xfc, 0xff, 0x01, 0x00, 0xfe, 0xff},
2314 {0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00,
2315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
2317 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00}},
2318 {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
2319 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2320 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2321 0x7f, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80},
2322 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2323 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf0, 0xff, 0xff,
2324 0xe0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
2325 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
2326 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2327 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2328 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2329 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x00},
2330 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
2331 0xfc, 0xff, 0xff, 0x3f, 0xf0, 0xff, 0xff, 0x3f,
2332 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x00, 0xff,
2333 0xff, 0xff, 0xff, 0xff, 0x0f, 0x7e, 0x00, 0x00}},
2334 {{0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
2335 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
2336 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2337 0xff, 0xff, 0x1f, 0x00, 0x00, 0xfe, 0x07, 0x00},
2338 {0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff,
2339 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2340 0xff, 0xfb, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00,
2341 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60}},
2342 {{0xff, 0x01, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00,
2343 0x80, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x03,
2344 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2345 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
2346 {0xff, 0xff, 0x1f, 0x00, 0xf0, 0xff, 0xff, 0xff,
2347 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2348 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2349 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00}},
2350 {{0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
2351 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2352 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2353 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
2354 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2355 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff,
2356 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03,
2357 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff}},
2358 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
2359 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2360 0xc0, 0xff, 0xff, 0xcf, 0xff, 0x1f, 0x00, 0x00,
2361 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80},
2362 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2363 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
2364 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x7e,
2365 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
2366 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2367 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff,
2368 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
2369 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00},
2370 {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2371 0xff, 0xff, 0x7f, 0x00, 0x80, 0x00, 0x00, 0x00,
2372 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
2373 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff}},
2374 {{0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x80,
2375 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
2376 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2377 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},
2378 {0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2379 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x80,
2380 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
2381 0xff, 0x7f, 0xf8, 0xff, 0xff, 0x1f, 0x00, 0xfe}},
2382 {{0xff, 0xff, 0xff, 0x3f, 0xf8, 0xff, 0xff, 0xff,
2383 0xff, 0x03, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00,
2384 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2385 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07},
2386 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
2387 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2388 0xff, 0xff, 0xff, 0xff, 0x01, 0x80, 0xff, 0xff,
2389 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}},
2390 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2391 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2392 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2393 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
2394 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2395 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
2396 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
2397 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40}},
2398 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2399 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2400 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2401 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
2402 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2403 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2404 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2405 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
2406 {{0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2407 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2408 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2409 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
2410 {0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2411 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2412 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2413 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
2414 {{0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xc0,
2415 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2416 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff,
2417 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f},
2418 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00,
2419 0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00,
2420 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff,
2421 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff}},
2422 {{0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2423 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2424 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2425 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
2426 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2427 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2428 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2429 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}},
2430 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2431 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
2432 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
2433 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40},
2434 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2435 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2436 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2437 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}},
2438 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2439 0x7e, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x07, 0x00,
2440 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
2441 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
2442 {0xff, 0x01, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
2443 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x80,
2444 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00,
2445 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
2446 {{0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x00,
2447 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
2448 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
2449 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff},
2450 {0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
2451 0xff, 0xff, 0x3f, 0x00, 0xf8, 0xff, 0xff, 0xff,
2452 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2453 0xff, 0x3f, 0x00, 0x00, 0xc0, 0xf1, 0x7f, 0x00}},
2454 {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
2455 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff,
2456 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
2457 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00},
2458 {0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
2459 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff,
2460 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f,
2461 0x00, 0x00, 0xfc, 0xff, 0xff, 0x01, 0xff, 0xff}},
2462 {{0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
2463 0x80, 0x00, 0x00, 0x80, 0xff, 0x03, 0xe0, 0x01,
2464 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfc, 0xff,
2465 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},
2466 {0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
2467 0xfe, 0xff, 0xff, 0xf0, 0x07, 0x00, 0x3c, 0x80,
2468 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff,
2469 0xff, 0xff, 0x07, 0xe0, 0xff, 0x00, 0x00, 0x00}},
2470 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
2471 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2472 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf8,
2473 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80},
2474 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2475 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x80, 0x00,
2476 0x00, 0x00, 0x00, 0xc0, 0x7f, 0xfe, 0xff, 0x1f,
2477 0x00, 0xfe, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff}},
2478 {{0xff, 0xff, 0x81, 0xff, 0xff, 0xff, 0xff, 0x00,
2479 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83,
2480 0xff, 0xff, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
2481 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xf0},
2482 {0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff,
2483 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00,
2484 0xf8, 0x07, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
2485 0xff, 0xc7, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff}},
2486 {{0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
2487 0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
2488 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x03, 0xfb,
2489 0xfa, 0x8a, 0x7d, 0xdf, 0x13, 0x86, 0xe2, 0x03},
2490 {0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
2491 0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
2492 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x03, 0xfb,
2493 0xfa, 0x8a, 0x7d, 0xdf, 0x13, 0x86, 0xe2, 0x03}}
2494 };
2495 unsigned char res[33][2][32] = {
2496 {{0x0c, 0x3b, 0x0a, 0xca, 0x8d, 0x1a, 0x2f, 0xb9,
2497 0x8a, 0x7b, 0x53, 0x5a, 0x1f, 0xc5, 0x22, 0xa1,
2498 0x07, 0x2a, 0x48, 0xea, 0x02, 0xeb, 0xb3, 0xd6,
2499 0x20, 0x1e, 0x86, 0xd0, 0x95, 0xf6, 0x92, 0x35},
2500 {0xdc, 0x90, 0x7a, 0x07, 0x2e, 0x1e, 0x44, 0x6d,
2501 0xf8, 0x15, 0x24, 0x5b, 0x5a, 0x96, 0x37, 0x9c,
2502 0x37, 0x7b, 0x0d, 0xac, 0x1b, 0x65, 0x58, 0x49,
2503 0x43, 0xb7, 0x31, 0xbb, 0xa7, 0xf4, 0x97, 0x15}},
2504 {{0xf1, 0xf7, 0x3a, 0x50, 0xe6, 0x10, 0xba, 0x22,
2505 0x43, 0x4d, 0x1f, 0x1f, 0x7c, 0x27, 0xca, 0x9c,
2506 0xb8, 0xb6, 0xa0, 0xfc, 0xd8, 0xc0, 0x05, 0x2f,
2507 0xf7, 0x08, 0xe1, 0x76, 0xdd, 0xd0, 0x80, 0xc8},
2508 {0xe3, 0x80, 0x80, 0xb8, 0xdb, 0xe3, 0xa9, 0x77,
2509 0x00, 0xb0, 0xf5, 0x2e, 0x27, 0xe2, 0x68, 0xc4,
2510 0x88, 0xe8, 0x04, 0xc1, 0x12, 0xbf, 0x78, 0x59,
2511 0xe6, 0xa9, 0x7c, 0xe1, 0x81, 0xdd, 0xb9, 0xd5}},
2512 {{0x96, 0xe2, 0xee, 0x01, 0xa6, 0x80, 0x31, 0xef,
2513 0x5c, 0xd0, 0x19, 0xb4, 0x7d, 0x5f, 0x79, 0xab,
2514 0xa1, 0x97, 0xd3, 0x7e, 0x33, 0xbb, 0x86, 0x55,
2515 0x60, 0x20, 0x10, 0x0d, 0x94, 0x2d, 0x11, 0x7c},
2516 {0xcc, 0xab, 0xe0, 0xe8, 0x98, 0x65, 0x12, 0x96,
2517 0x38, 0x5a, 0x1a, 0xf2, 0x85, 0x23, 0x59, 0x5f,
2518 0xf9, 0xf3, 0xc2, 0x81, 0x70, 0x92, 0x65, 0x12,
2519 0x9c, 0x65, 0x1e, 0x96, 0x00, 0xef, 0xe7, 0x63}},
2520 {{0xac, 0x1e, 0x62, 0xc2, 0x59, 0xfc, 0x4e, 0x5c,
2521 0x83, 0xb0, 0xd0, 0x6f, 0xce, 0x19, 0xf6, 0xbf,
2522 0xa4, 0xb0, 0xe0, 0x53, 0x66, 0x1f, 0xbf, 0xc9,
2523 0x33, 0x47, 0x37, 0xa9, 0x3d, 0x5d, 0xb0, 0x48},
2524 {0x86, 0xb9, 0x2a, 0x7f, 0x8e, 0xa8, 0x60, 0x42,
2525 0x26, 0x6d, 0x6e, 0x1c, 0xa2, 0xec, 0xe0, 0xe5,
2526 0x3e, 0x0a, 0x33, 0xbb, 0x61, 0x4c, 0x9f, 0x3c,
2527 0xd1, 0xdf, 0x49, 0x33, 0xcd, 0x72, 0x78, 0x18}},
2528 {{0xf7, 0xd3, 0xcd, 0x49, 0x5c, 0x13, 0x22, 0xfb,
2529 0x2e, 0xb2, 0x2f, 0x27, 0xf5, 0x8a, 0x5d, 0x74,
2530 0xc1, 0x58, 0xc5, 0xc2, 0x2d, 0x9f, 0x52, 0xc6,
2531 0x63, 0x9f, 0xba, 0x05, 0x76, 0x45, 0x7a, 0x63},
2532 {0x8a, 0xfa, 0x55, 0x4d, 0xdd, 0xa3, 0xb2, 0xc3,
2533 0x44, 0xfd, 0xec, 0x72, 0xde, 0xef, 0xc0, 0x99,
2534 0xf5, 0x9f, 0xe2, 0x52, 0xb4, 0x05, 0x32, 0x58,
2535 0x57, 0xc1, 0x8f, 0xea, 0xc3, 0x24, 0x5b, 0x94}},
2536 {{0x05, 0x83, 0xee, 0xdd, 0x64, 0xf0, 0x14, 0x3b,
2537 0xa0, 0x14, 0x4a, 0x3a, 0x41, 0x82, 0x7c, 0xa7,
2538 0x2c, 0xaa, 0xb1, 0x76, 0xbb, 0x59, 0x64, 0x5f,
2539 0x52, 0xad, 0x25, 0x29, 0x9d, 0x8f, 0x0b, 0xb0},
2540 {0x7e, 0xe3, 0x7c, 0xca, 0xcd, 0x4f, 0xb0, 0x6d,
2541 0x7a, 0xb2, 0x3e, 0xa0, 0x08, 0xb9, 0xa8, 0x2d,
2542 0xc2, 0xf4, 0x99, 0x66, 0xcc, 0xac, 0xd8, 0xb9,
2543 0x72, 0x2a, 0x4a, 0x3e, 0x0f, 0x7b, 0xbf, 0xf4}},
2544 {{0x8c, 0x9c, 0x78, 0x2b, 0x39, 0x61, 0x7e, 0xf7,
2545 0x65, 0x37, 0x66, 0x09, 0x38, 0xb9, 0x6f, 0x70,
2546 0x78, 0x87, 0xff, 0xcf, 0x93, 0xca, 0x85, 0x06,
2547 0x44, 0x84, 0xa7, 0xfe, 0xd3, 0xa4, 0xe3, 0x7e},
2548 {0xa2, 0x56, 0x49, 0x23, 0x54, 0xa5, 0x50, 0xe9,
2549 0x5f, 0xf0, 0x4d, 0xe7, 0xdc, 0x38, 0x32, 0x79,
2550 0x4f, 0x1c, 0xb7, 0xe4, 0xbb, 0xf8, 0xbb, 0x2e,
2551 0x40, 0x41, 0x4b, 0xcc, 0xe3, 0x1e, 0x16, 0x36}},
2552 {{0x0c, 0x1e, 0xd7, 0x09, 0x25, 0x40, 0x97, 0xcb,
2553 0x5c, 0x46, 0xa8, 0xda, 0xef, 0x25, 0xd5, 0xe5,
2554 0x92, 0x4d, 0xcf, 0xa3, 0xc4, 0x5d, 0x35, 0x4a,
2555 0xe4, 0x61, 0x92, 0xf3, 0xbf, 0x0e, 0xcd, 0xbe},
2556 {0xe4, 0xaf, 0x0a, 0xb3, 0x30, 0x8b, 0x9b, 0x48,
2557 0x49, 0x43, 0xc7, 0x64, 0x60, 0x4a, 0x2b, 0x9e,
2558 0x95, 0x5f, 0x56, 0xe8, 0x35, 0xdc, 0xeb, 0xdc,
2559 0xc7, 0xc4, 0xfe, 0x30, 0x40, 0xc7, 0xbf, 0xa4}},
2560 {{0xd4, 0xa0, 0xf5, 0x81, 0x49, 0x6b, 0xb6, 0x8b,
2561 0x0a, 0x69, 0xf9, 0xfe, 0xa8, 0x32, 0xe5, 0xe0,
2562 0xa5, 0xcd, 0x02, 0x53, 0xf9, 0x2c, 0xe3, 0x53,
2563 0x83, 0x36, 0xc6, 0x02, 0xb5, 0xeb, 0x64, 0xb8},
2564 {0x1d, 0x42, 0xb9, 0xf9, 0xe9, 0xe3, 0x93, 0x2c,
2565 0x4c, 0xee, 0x6c, 0x5a, 0x47, 0x9e, 0x62, 0x01,
2566 0x6b, 0x04, 0xfe, 0xa4, 0x30, 0x2b, 0x0d, 0x4f,
2567 0x71, 0x10, 0xd3, 0x55, 0xca, 0xf3, 0x5e, 0x80}},
2568 {{0x77, 0x05, 0xf6, 0x0c, 0x15, 0x9b, 0x45, 0xe7,
2569 0xb9, 0x11, 0xb8, 0xf5, 0xd6, 0xda, 0x73, 0x0c,
2570 0xda, 0x92, 0xea, 0xd0, 0x9d, 0xd0, 0x18, 0x92,
2571 0xce, 0x9a, 0xaa, 0xee, 0x0f, 0xef, 0xde, 0x30},
2572 {0xf1, 0xf1, 0xd6, 0x9b, 0x51, 0xd7, 0x77, 0x62,
2573 0x52, 0x10, 0xb8, 0x7a, 0x84, 0x9d, 0x15, 0x4e,
2574 0x07, 0xdc, 0x1e, 0x75, 0x0d, 0x0c, 0x3b, 0xdb,
2575 0x74, 0x58, 0x62, 0x02, 0x90, 0x54, 0x8b, 0x43}},
2576 {{0xa6, 0xfe, 0x0b, 0x87, 0x80, 0x43, 0x67, 0x25,
2577 0x57, 0x5d, 0xec, 0x40, 0x50, 0x08, 0xd5, 0x5d,
2578 0x43, 0xd7, 0xe0, 0xaa, 0xe0, 0x13, 0xb6, 0xb0,
2579 0xc0, 0xd4, 0xe5, 0x0d, 0x45, 0x83, 0xd6, 0x13},
2580 {0x40, 0x45, 0x0a, 0x92, 0x31, 0xea, 0x8c, 0x60,
2581 0x8c, 0x1f, 0xd8, 0x76, 0x45, 0xb9, 0x29, 0x00,
2582 0x26, 0x32, 0xd8, 0xa6, 0x96, 0x88, 0xe2, 0xc4,
2583 0x8b, 0xdb, 0x7f, 0x17, 0x87, 0xcc, 0xc8, 0xf2}},
2584 {{0xc2, 0x56, 0xe2, 0xb6, 0x1a, 0x81, 0xe7, 0x31,
2585 0x63, 0x2e, 0xbb, 0x0d, 0x2f, 0x81, 0x67, 0xd4,
2586 0x22, 0xe2, 0x38, 0x02, 0x25, 0x97, 0xc7, 0x88,
2587 0x6e, 0xdf, 0xbe, 0x2a, 0xa5, 0x73, 0x63, 0xaa},
2588 {0x50, 0x45, 0xe2, 0xc3, 0xbd, 0x89, 0xfc, 0x57,
2589 0xbd, 0x3c, 0xa3, 0x98, 0x7e, 0x7f, 0x36, 0x38,
2590 0x92, 0x39, 0x1f, 0x0f, 0x81, 0x1a, 0x06, 0x51,
2591 0x1f, 0x8d, 0x6a, 0xff, 0x47, 0x16, 0x06, 0x9c}},
2592 {{0x33, 0x95, 0xa2, 0x6f, 0x27, 0x5f, 0x9c, 0x9c,
2593 0x64, 0x45, 0xcb, 0xd1, 0x3c, 0xee, 0x5e, 0x5f,
2594 0x48, 0xa6, 0xaf, 0xe3, 0x79, 0xcf, 0xb1, 0xe2,
2595 0xbf, 0x55, 0x0e, 0xa2, 0x3b, 0x62, 0xf0, 0xe4},
2596 {0x14, 0xe8, 0x06, 0xe3, 0xbe, 0x7e, 0x67, 0x01,
2597 0xc5, 0x21, 0x67, 0xd8, 0x54, 0xb5, 0x7f, 0xa4,
2598 0xf9, 0x75, 0x70, 0x1c, 0xfd, 0x79, 0xdb, 0x86,
2599 0xad, 0x37, 0x85, 0x83, 0x56, 0x4e, 0xf0, 0xbf}},
2600 {{0xbc, 0xa6, 0xe0, 0x56, 0x4e, 0xef, 0xfa, 0xf5,
2601 0x1d, 0x5d, 0x3f, 0x2a, 0x5b, 0x19, 0xab, 0x51,
2602 0xc5, 0x8b, 0xdd, 0x98, 0x28, 0x35, 0x2f, 0xc3,
2603 0x81, 0x4f, 0x5c, 0xe5, 0x70, 0xb9, 0xeb, 0x62},
2604 {0xc4, 0x6d, 0x26, 0xb0, 0x17, 0x6b, 0xfe, 0x6c,
2605 0x12, 0xf8, 0xe7, 0xc1, 0xf5, 0x2f, 0xfa, 0x91,
2606 0x13, 0x27, 0xbd, 0x73, 0xcc, 0x33, 0x31, 0x1c,
2607 0x39, 0xe3, 0x27, 0x6a, 0x95, 0xcf, 0xc5, 0xfb}},
2608 {{0x30, 0xb2, 0x99, 0x84, 0xf0, 0x18, 0x2a, 0x6e,
2609 0x1e, 0x27, 0xed, 0xa2, 0x29, 0x99, 0x41, 0x56,
2610 0xe8, 0xd4, 0x0d, 0xef, 0x99, 0x9c, 0xf3, 0x58,
2611 0x29, 0x55, 0x1a, 0xc0, 0x68, 0xd6, 0x74, 0xa4},
2612 {0x07, 0x9c, 0xe7, 0xec, 0xf5, 0x36, 0x73, 0x41,
2613 0xa3, 0x1c, 0xe5, 0x93, 0x97, 0x6a, 0xfd, 0xf7,
2614 0x53, 0x18, 0xab, 0xaf, 0xeb, 0x85, 0xbd, 0x92,
2615 0x90, 0xab, 0x3c, 0xbf, 0x30, 0x82, 0xad, 0xf6}},
2616 {{0xc6, 0x87, 0x8a, 0x2a, 0xea, 0xc0, 0xa9, 0xec,
2617 0x6d, 0xd3, 0xdc, 0x32, 0x23, 0xce, 0x62, 0x19,
2618 0xa4, 0x7e, 0xa8, 0xdd, 0x1c, 0x33, 0xae, 0xd3,
2619 0x4f, 0x62, 0x9f, 0x52, 0xe7, 0x65, 0x46, 0xf4},
2620 {0x97, 0x51, 0x27, 0x67, 0x2d, 0xa2, 0x82, 0x87,
2621 0x98, 0xd3, 0xb6, 0x14, 0x7f, 0x51, 0xd3, 0x9a,
2622 0x0b, 0xd0, 0x76, 0x81, 0xb2, 0x4f, 0x58, 0x92,
2623 0xa4, 0x86, 0xa1, 0xa7, 0x09, 0x1d, 0xef, 0x9b}},
2624 {{0xb3, 0x0f, 0x2b, 0x69, 0x0d, 0x06, 0x90, 0x64,
2625 0xbd, 0x43, 0x4c, 0x10, 0xe8, 0x98, 0x1c, 0xa3,
2626 0xe1, 0x68, 0xe9, 0x79, 0x6c, 0x29, 0x51, 0x3f,
2627 0x41, 0xdc, 0xdf, 0x1f, 0xf3, 0x60, 0xbe, 0x33},
2628 {0xa1, 0x5f, 0xf7, 0x1d, 0xb4, 0x3e, 0x9b, 0x3c,
2629 0xe7, 0xbd, 0xb6, 0x06, 0xd5, 0x60, 0x06, 0x6d,
2630 0x50, 0xd2, 0xf4, 0x1a, 0x31, 0x08, 0xf2, 0xea,
2631 0x8e, 0xef, 0x5f, 0x7d, 0xb6, 0xd0, 0xc0, 0x27}},
2632 {{0x62, 0x9a, 0xd9, 0xbb, 0x38, 0x36, 0xce, 0xf7,
2633 0x5d, 0x2f, 0x13, 0xec, 0xc8, 0x2d, 0x02, 0x8a,
2634 0x2e, 0x72, 0xf0, 0xe5, 0x15, 0x9d, 0x72, 0xae,
2635 0xfc, 0xb3, 0x4f, 0x02, 0xea, 0xe1, 0x09, 0xfe},
2636 {0x00, 0x00, 0x00, 0x00, 0xfa, 0x0a, 0x3d, 0xbc,
2637 0xad, 0x16, 0x0c, 0xb6, 0xe7, 0x7c, 0x8b, 0x39,
2638 0x9a, 0x43, 0xbb, 0xe3, 0xc2, 0x55, 0x15, 0x14,
2639 0x75, 0xac, 0x90, 0x9b, 0x7f, 0x9a, 0x92, 0x00}},
2640 {{0x8b, 0xac, 0x70, 0x86, 0x29, 0x8f, 0x00, 0x23,
2641 0x7b, 0x45, 0x30, 0xaa, 0xb8, 0x4c, 0xc7, 0x8d,
2642 0x4e, 0x47, 0x85, 0xc6, 0x19, 0xe3, 0x96, 0xc2,
2643 0x9a, 0xa0, 0x12, 0xed, 0x6f, 0xd7, 0x76, 0x16},
2644 {0x45, 0xaf, 0x7e, 0x33, 0xc7, 0x7f, 0x10, 0x6c,
2645 0x7c, 0x9f, 0x29, 0xc1, 0xa8, 0x7e, 0x15, 0x84,
2646 0xe7, 0x7d, 0xc0, 0x6d, 0xab, 0x71, 0x5d, 0xd0,
2647 0x6b, 0x9f, 0x97, 0xab, 0xcb, 0x51, 0x0c, 0x9f}},
2648 {{0x9e, 0xc3, 0x92, 0xb4, 0x04, 0x9f, 0xc8, 0xbb,
2649 0xdd, 0x9e, 0xc6, 0x05, 0xfd, 0x65, 0xec, 0x94,
2650 0x7f, 0x2c, 0x16, 0xc4, 0x40, 0xac, 0x63, 0x7b,
2651 0x7d, 0xb8, 0x0c, 0xe4, 0x5b, 0xe3, 0xa7, 0x0e},
2652 {0x43, 0xf4, 0x44, 0xe8, 0xcc, 0xc8, 0xd4, 0x54,
2653 0x33, 0x37, 0x50, 0xf2, 0x87, 0x42, 0x2e, 0x00,
2654 0x49, 0x60, 0x62, 0x02, 0xfd, 0x1a, 0x7c, 0xdb,
2655 0x29, 0x6c, 0x6d, 0x54, 0x53, 0x08, 0xd1, 0xc8}},
2656 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2657 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2658 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2659 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
2660 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2661 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2662 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2663 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
2664 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2665 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2666 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2667 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
2668 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2669 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2670 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2671 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}},
2672 {{0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1,
2673 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0,
2674 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59,
2675 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92},
2676 {0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1,
2677 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0,
2678 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59,
2679 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}},
2680 {{0x28, 0x56, 0xac, 0x0e, 0x4f, 0x98, 0x09, 0xf0,
2681 0x49, 0xfa, 0x7f, 0x84, 0xac, 0x7e, 0x50, 0x5b,
2682 0x17, 0x43, 0x14, 0x89, 0x9c, 0x53, 0xa8, 0x94,
2683 0x30, 0xf2, 0x11, 0x4d, 0x92, 0x14, 0x27, 0xe8},
2684 {0x39, 0x7a, 0x84, 0x56, 0x79, 0x9d, 0xec, 0x26,
2685 0x2c, 0x53, 0xc1, 0x94, 0xc9, 0x8d, 0x9e, 0x9d,
2686 0x32, 0x1f, 0xdd, 0x84, 0x04, 0xe8, 0xe2, 0x0a,
2687 0x6b, 0xbe, 0xbb, 0x42, 0x40, 0x67, 0x30, 0x6c}},
2688 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2689 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2690 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4,
2691 0x40, 0x2d, 0xa1, 0x73, 0x2f, 0xc9, 0xbe, 0xbd},
2692 {0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1,
2693 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0,
2694 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59,
2695 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}},
2696 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2697 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
2698 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
2699 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40},
2700 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2701 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2702 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2703 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}},
2704 {{0x1c, 0xc4, 0xf7, 0xda, 0x0f, 0x65, 0xca, 0x39,
2705 0x70, 0x52, 0x92, 0x8e, 0xc3, 0xc8, 0x15, 0xea,
2706 0x7f, 0x10, 0x9e, 0x77, 0x4b, 0x6e, 0x2d, 0xdf,
2707 0xe8, 0x30, 0x9d, 0xda, 0xe8, 0x9a, 0x65, 0xae},
2708 {0x02, 0xb0, 0x16, 0xb1, 0x1d, 0xc8, 0x57, 0x7b,
2709 0xa2, 0x3a, 0xa2, 0xa3, 0x38, 0x5c, 0x8f, 0xeb,
2710 0x66, 0x37, 0x91, 0xa8, 0x5f, 0xef, 0x04, 0xf6,
2711 0x59, 0x75, 0xe1, 0xee, 0x92, 0xf6, 0x0e, 0x30}},
2712 {{0x8d, 0x76, 0x14, 0xa4, 0x14, 0x06, 0x9f, 0x9a,
2713 0xdf, 0x4a, 0x85, 0xa7, 0x6b, 0xbf, 0x29, 0x6f,
2714 0xbc, 0x34, 0x87, 0x5d, 0xeb, 0xbb, 0x2e, 0xa9,
2715 0xc9, 0x1f, 0x58, 0xd6, 0x9a, 0x82, 0xa0, 0x56},
2716 {0xd4, 0xb9, 0xdb, 0x88, 0x1d, 0x04, 0xe9, 0x93,
2717 0x8d, 0x3f, 0x20, 0xd5, 0x86, 0xa8, 0x83, 0x07,
2718 0xdb, 0x09, 0xd8, 0x22, 0x1f, 0x7f, 0xf1, 0x71,
2719 0xc8, 0xe7, 0x5d, 0x47, 0xaf, 0x8b, 0x72, 0xe9}},
2720 {{0x83, 0xb9, 0x39, 0xb2, 0xa4, 0xdf, 0x46, 0x87,
2721 0xc2, 0xb8, 0xf1, 0xe6, 0x4c, 0xd1, 0xe2, 0xa9,
2722 0xe4, 0x70, 0x30, 0x34, 0xbc, 0x52, 0x7c, 0x55,
2723 0xa6, 0xec, 0x80, 0xa4, 0xe5, 0xd2, 0xdc, 0x73},
2724 {0x08, 0xf1, 0x03, 0xcf, 0x16, 0x73, 0xe8, 0x7d,
2725 0xb6, 0x7e, 0x9b, 0xc0, 0xb4, 0xc2, 0xa5, 0x86,
2726 0x02, 0x77, 0xd5, 0x27, 0x86, 0xa5, 0x15, 0xfb,
2727 0xae, 0x9b, 0x8c, 0xa9, 0xf9, 0xf8, 0xa8, 0x4a}},
2728 {{0x8b, 0x00, 0x49, 0xdb, 0xfa, 0xf0, 0x1b, 0xa2,
2729 0xed, 0x8a, 0x9a, 0x7a, 0x36, 0x78, 0x4a, 0xc7,
2730 0xf7, 0xad, 0x39, 0xd0, 0x6c, 0x65, 0x7a, 0x41,
2731 0xce, 0xd6, 0xd6, 0x4c, 0x20, 0x21, 0x6b, 0xc7},
2732 {0xc6, 0xca, 0x78, 0x1d, 0x32, 0x6c, 0x6c, 0x06,
2733 0x91, 0xf2, 0x1a, 0xe8, 0x43, 0x16, 0xea, 0x04,
2734 0x3c, 0x1f, 0x07, 0x85, 0xf7, 0x09, 0x22, 0x08,
2735 0xba, 0x13, 0xfd, 0x78, 0x1e, 0x3f, 0x6f, 0x62}},
2736 {{0x25, 0x9b, 0x7c, 0xb0, 0xac, 0x72, 0x6f, 0xb2,
2737 0xe3, 0x53, 0x84, 0x7a, 0x1a, 0x9a, 0x98, 0x9b,
2738 0x44, 0xd3, 0x59, 0xd0, 0x8e, 0x57, 0x41, 0x40,
2739 0x78, 0xa7, 0x30, 0x2f, 0x4c, 0x9c, 0xb9, 0x68},
2740 {0xb7, 0x75, 0x03, 0x63, 0x61, 0xc2, 0x48, 0x6e,
2741 0x12, 0x3d, 0xbf, 0x4b, 0x27, 0xdf, 0xb1, 0x7a,
2742 0xff, 0x4e, 0x31, 0x07, 0x83, 0xf4, 0x62, 0x5b,
2743 0x19, 0xa5, 0xac, 0xa0, 0x32, 0x58, 0x0d, 0xa7}},
2744 {{0x43, 0x4f, 0x10, 0xa4, 0xca, 0xdb, 0x38, 0x67,
2745 0xfa, 0xae, 0x96, 0xb5, 0x6d, 0x97, 0xff, 0x1f,
2746 0xb6, 0x83, 0x43, 0xd3, 0xa0, 0x2d, 0x70, 0x7a,
2747 0x64, 0x05, 0x4c, 0xa7, 0xc1, 0xa5, 0x21, 0x51},
2748 {0xe4, 0xf1, 0x23, 0x84, 0xe1, 0xb5, 0x9d, 0xf2,
2749 0xb8, 0x73, 0x8b, 0x45, 0x2b, 0x35, 0x46, 0x38,
2750 0x10, 0x2b, 0x50, 0xf8, 0x8b, 0x35, 0xcd, 0x34,
2751 0xc8, 0x0e, 0xf6, 0xdb, 0x09, 0x35, 0xf0, 0xda}},
2752 {{0xdb, 0x21, 0x5c, 0x8d, 0x83, 0x1d, 0xb3, 0x34,
2753 0xc7, 0x0e, 0x43, 0xa1, 0x58, 0x79, 0x67, 0x13,
2754 0x1e, 0x86, 0x5d, 0x89, 0x63, 0xe6, 0x0a, 0x46,
2755 0x5c, 0x02, 0x97, 0x1b, 0x62, 0x43, 0x86, 0xf5},
2756 {0xdb, 0x21, 0x5c, 0x8d, 0x83, 0x1d, 0xb3, 0x34,
2757 0xc7, 0x0e, 0x43, 0xa1, 0x58, 0x79, 0x67, 0x13,
2758 0x1e, 0x86, 0x5d, 0x89, 0x63, 0xe6, 0x0a, 0x46,
2759 0x5c, 0x02, 0x97, 0x1b, 0x62, 0x43, 0x86, 0xf5}}
2760 };
2761 secp256k1_scalar_set_int(&one, 1);
2762 for (i = 0; i < 33; i++) {
2763 secp256k1_scalar_set_b32(&x, chal[i][0], &overflow);
2764 CHECK(!overflow);
2765 secp256k1_scalar_set_b32(&y, chal[i][1], &overflow);
2766 CHECK(!overflow);
2767 secp256k1_scalar_set_b32(&r1, res[i][0], &overflow);
2768 CHECK(!overflow);
2769 secp256k1_scalar_set_b32(&r2, res[i][1], &overflow);
2770 CHECK(!overflow);
2771 secp256k1_scalar_mul(&z, &x, &y);
2773 CHECK(secp256k1_scalar_eq(&r1, &z));
2774 if (!secp256k1_scalar_is_zero(&y)) {
2775 secp256k1_scalar_inverse(&zz, &y);
2778 CHECK(secp256k1_scalar_eq(&zzv, &zz));
2779 secp256k1_scalar_mul(&z, &z, &zz);
2781 CHECK(secp256k1_scalar_eq(&x, &z));
2782 secp256k1_scalar_mul(&zz, &zz, &y);
2784 CHECK(secp256k1_scalar_eq(&one, &zz));
2785 }
2786 }
2787 }
2788}
2789
2790/***** FIELD TESTS *****/
2791
2793 unsigned char bin[32];
2794 do {
2796 if (secp256k1_fe_set_b32(x, bin)) {
2797 return;
2798 }
2799 } while(1);
2800}
2801
2803 unsigned char bin[32];
2804 do {
2806 if (secp256k1_fe_set_b32(x, bin)) {
2807 return;
2808 }
2809 } while(1);
2810}
2811
2813 int tries = 10;
2814 while (--tries >= 0) {
2815 random_fe(nz);
2817 if (!secp256k1_fe_is_zero(nz)) {
2818 break;
2819 }
2820 }
2821 /* Infinitesimal probability of spurious failure here */
2822 CHECK(tries >= 0);
2823}
2824
2826 secp256k1_fe r;
2828 if (secp256k1_fe_sqrt(&r, ns)) {
2829 secp256k1_fe_negate(ns, ns, 1);
2830 }
2831}
2832
2834 secp256k1_fe an = *a;
2835 secp256k1_fe bn = *b;
2838 return secp256k1_fe_equal_var(&an, &bn);
2839}
2840
2842 static const unsigned char b32[32] = {
2843 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2844 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
2845 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,
2846 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x40
2847 };
2849 0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL,
2850 0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL
2851 );
2852 static const secp256k1_fe fe = SECP256K1_FE_CONST(
2853 0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL,
2854 0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL
2855 );
2856 secp256k1_fe fe2;
2857 unsigned char b322[32];
2859 /* Check conversions to fe. */
2860 CHECK(secp256k1_fe_set_b32(&fe2, b32));
2861 CHECK(secp256k1_fe_equal_var(&fe, &fe2));
2862 secp256k1_fe_from_storage(&fe2, &fes);
2863 CHECK(secp256k1_fe_equal_var(&fe, &fe2));
2864 /* Check conversion from fe. */
2865 secp256k1_fe_get_b32(b322, &fe);
2866 CHECK(secp256k1_memcmp_var(b322, b32, 32) == 0);
2867 secp256k1_fe_to_storage(&fes2, &fe);
2868 CHECK(secp256k1_memcmp_var(&fes2, &fes, sizeof(fes)) == 0);
2869}
2870
2871/* Returns true if two field elements have the same representation. */
2872int fe_identical(const secp256k1_fe *a, const secp256k1_fe *b) {
2873 int ret = 1;
2874#ifdef VERIFY
2875 ret &= (a->magnitude == b->magnitude);
2876 ret &= (a->normalized == b->normalized);
2877#endif
2878 /* Compare the struct member that holds the limbs. */
2879 ret &= (secp256k1_memcmp_var(a->n, b->n, sizeof(a->n)) == 0);
2880 return ret;
2881}
2882
2883void run_field_half(void) {
2884 secp256k1_fe t, u;
2885 int m;
2886
2887 /* Check magnitude 0 input */
2890#ifdef VERIFY
2891 CHECK(t.magnitude == 1);
2892 CHECK(t.normalized == 0);
2893#endif
2895
2896 /* Check non-zero magnitudes in the supported range */
2897 for (m = 1; m < 32; m++) {
2898 /* Check max-value input */
2900
2901 u = t;
2903#ifdef VERIFY
2904 CHECK(u.magnitude == (m >> 1) + 1);
2905 CHECK(u.normalized == 0);
2906#endif
2908 secp256k1_fe_add(&u, &u);
2909 CHECK(check_fe_equal(&t, &u));
2910
2911 /* Check worst-case input: ensure the LSB is 1 so that P will be added,
2912 * which will also cause all carries to be 1, since all limbs that can
2913 * generate a carry are initially even and all limbs of P are odd in
2914 * every existing field implementation. */
2916 CHECK(t.n[0] > 0);
2917 CHECK((t.n[0] & 1) == 0);
2918 --t.n[0];
2919
2920 u = t;
2922#ifdef VERIFY
2923 CHECK(u.magnitude == (m >> 1) + 1);
2924 CHECK(u.normalized == 0);
2925#endif
2927 secp256k1_fe_add(&u, &u);
2928 CHECK(check_fe_equal(&t, &u));
2929 }
2930}
2931
2932void run_field_misc(void) {
2933 secp256k1_fe x;
2934 secp256k1_fe y;
2935 secp256k1_fe z;
2936 secp256k1_fe q;
2937 secp256k1_fe fe5 = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 5);
2938 int i, j;
2939 for (i = 0; i < 1000 * COUNT; i++) {
2940 secp256k1_fe_storage xs, ys, zs;
2941 if (i & 1) {
2942 random_fe(&x);
2943 } else {
2944 random_fe_test(&x);
2945 }
2947 /* Test the fe equality and comparison operations. */
2948 CHECK(secp256k1_fe_cmp_var(&x, &x) == 0);
2950 z = x;
2951 secp256k1_fe_add(&z,&y);
2952 /* Test fe conditional move; z is not normalized here. */
2953 q = x;
2954 secp256k1_fe_cmov(&x, &z, 0);
2955#ifdef VERIFY
2956 CHECK(x.normalized && x.magnitude == 1);
2957#endif
2958 secp256k1_fe_cmov(&x, &x, 1);
2959 CHECK(!fe_identical(&x, &z));
2960 CHECK(fe_identical(&x, &q));
2961 secp256k1_fe_cmov(&q, &z, 1);
2962#ifdef VERIFY
2963 CHECK(!q.normalized && q.magnitude == z.magnitude);
2964#endif
2965 CHECK(fe_identical(&q, &z));
2968 CHECK(!secp256k1_fe_equal_var(&x, &z));
2970 secp256k1_fe_cmov(&q, &z, (i&1));
2971#ifdef VERIFY
2972 CHECK(q.normalized && q.magnitude == 1);
2973#endif
2974 for (j = 0; j < 6; j++) {
2975 secp256k1_fe_negate(&z, &z, j+1);
2977 secp256k1_fe_cmov(&q, &z, (j&1));
2978#ifdef VERIFY
2979 CHECK((q.normalized != (j&1)) && q.magnitude == ((j&1) ? z.magnitude : 1));
2980#endif
2981 }
2983 /* Test storage conversion and conditional moves. */
2984 secp256k1_fe_to_storage(&xs, &x);
2985 secp256k1_fe_to_storage(&ys, &y);
2986 secp256k1_fe_to_storage(&zs, &z);
2987 secp256k1_fe_storage_cmov(&zs, &xs, 0);
2988 secp256k1_fe_storage_cmov(&zs, &zs, 1);
2989 CHECK(secp256k1_memcmp_var(&xs, &zs, sizeof(xs)) != 0);
2990 secp256k1_fe_storage_cmov(&ys, &xs, 1);
2991 CHECK(secp256k1_memcmp_var(&xs, &ys, sizeof(xs)) == 0);
2995 /* Test that mul_int, mul, and add agree. */
2996 secp256k1_fe_add(&y, &x);
2997 secp256k1_fe_add(&y, &x);
2998 z = x;
2999 secp256k1_fe_mul_int(&z, 3);
3000 CHECK(check_fe_equal(&y, &z));
3001 secp256k1_fe_add(&y, &x);
3002 secp256k1_fe_add(&z, &x);
3003 CHECK(check_fe_equal(&z, &y));
3004 z = x;
3005 secp256k1_fe_mul_int(&z, 5);
3006 secp256k1_fe_mul(&q, &x, &fe5);
3007 CHECK(check_fe_equal(&z, &q));
3008 secp256k1_fe_negate(&x, &x, 1);
3009 secp256k1_fe_add(&z, &x);
3010 secp256k1_fe_add(&q, &x);
3011 CHECK(check_fe_equal(&y, &z));
3012 CHECK(check_fe_equal(&q, &y));
3013 /* Check secp256k1_fe_half. */
3014 z = x;
3016 secp256k1_fe_add(&z, &z);
3017 CHECK(check_fe_equal(&x, &z));
3018 secp256k1_fe_add(&z, &z);
3020 CHECK(check_fe_equal(&x, &z));
3021 }
3022}
3023
3024void test_fe_mul(const secp256k1_fe* a, const secp256k1_fe* b, int use_sqr)
3025{
3026 secp256k1_fe c, an, bn;
3027 /* Variables in BE 32-byte format. */
3028 unsigned char a32[32], b32[32], c32[32];
3029 /* Variables in LE 16x uint16_t format. */
3030 uint16_t a16[16], b16[16], c16[16];
3031 /* Field modulus in LE 16x uint16_t format. */
3032 static const uint16_t m16[16] = {
3033 0xfc2f, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
3034 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
3035 };
3036 uint16_t t16[32];
3037 int i;
3038
3039 /* Compute C = A * B in fe format. */
3040 c = *a;
3041 if (use_sqr) {
3042 secp256k1_fe_sqr(&c, &c);
3043 } else {
3044 secp256k1_fe_mul(&c, &c, b);
3045 }
3046
3047 /* Convert A, B, C into LE 16x uint16_t format. */
3048 an = *a;
3049 bn = *b;
3053 secp256k1_fe_get_b32(a32, &an);
3054 secp256k1_fe_get_b32(b32, &bn);
3055 secp256k1_fe_get_b32(c32, &c);
3056 for (i = 0; i < 16; ++i) {
3057 a16[i] = a32[31 - 2*i] + ((uint16_t)a32[30 - 2*i] << 8);
3058 b16[i] = b32[31 - 2*i] + ((uint16_t)b32[30 - 2*i] << 8);
3059 c16[i] = c32[31 - 2*i] + ((uint16_t)c32[30 - 2*i] << 8);
3060 }
3061 /* Compute T = A * B in LE 16x uint16_t format. */
3062 mulmod256(t16, a16, b16, m16);
3063 /* Compare */
3064 CHECK(secp256k1_memcmp_var(t16, c16, 32) == 0);
3065}
3066
3067void run_fe_mul(void) {
3068 int i;
3069 for (i = 0; i < 100 * COUNT; ++i) {
3070 secp256k1_fe a, b, c, d;
3071 random_fe(&a);
3073 random_fe(&b);
3075 random_fe_test(&c);
3077 random_fe_test(&d);
3079 test_fe_mul(&a, &a, 1);
3080 test_fe_mul(&c, &c, 1);
3081 test_fe_mul(&a, &b, 0);
3082 test_fe_mul(&a, &c, 0);
3083 test_fe_mul(&c, &b, 0);
3084 test_fe_mul(&c, &d, 0);
3085 }
3086}
3087
3088void run_sqr(void) {
3089 secp256k1_fe x, s;
3090
3091 {
3092 int i;
3093 secp256k1_fe_set_int(&x, 1);
3094 secp256k1_fe_negate(&x, &x, 1);
3095
3096 for (i = 1; i <= 512; ++i) {
3097 secp256k1_fe_mul_int(&x, 2);
3099 secp256k1_fe_sqr(&s, &x);
3100 }
3101 }
3102}
3103
3104void test_sqrt(const secp256k1_fe *a, const secp256k1_fe *k) {
3105 secp256k1_fe r1, r2;
3106 int v = secp256k1_fe_sqrt(&r1, a);
3107 CHECK((v == 0) == (k == NULL));
3108
3109 if (k != NULL) {
3110 /* Check that the returned root is +/- the given known answer */
3111 secp256k1_fe_negate(&r2, &r1, 1);
3112 secp256k1_fe_add(&r1, k); secp256k1_fe_add(&r2, k);
3115 }
3116}
3117
3118void run_sqrt(void) {
3119 secp256k1_fe ns, x, s, t;
3120 int i;
3121
3122 /* Check sqrt(0) is 0 */
3123 secp256k1_fe_set_int(&x, 0);
3124 secp256k1_fe_sqr(&s, &x);
3125 test_sqrt(&s, &x);
3126
3127 /* Check sqrt of small squares (and their negatives) */
3128 for (i = 1; i <= 100; i++) {
3129 secp256k1_fe_set_int(&x, i);
3130 secp256k1_fe_sqr(&s, &x);
3131 test_sqrt(&s, &x);
3132 secp256k1_fe_negate(&t, &s, 1);
3133 test_sqrt(&t, NULL);
3134 }
3135
3136 /* Consistency checks for large random values */
3137 for (i = 0; i < 10; i++) {
3138 int j;
3140 for (j = 0; j < COUNT; j++) {
3141 random_fe(&x);
3142 secp256k1_fe_sqr(&s, &x);
3143 test_sqrt(&s, &x);
3144 secp256k1_fe_negate(&t, &s, 1);
3145 test_sqrt(&t, NULL);
3146 secp256k1_fe_mul(&t, &s, &ns);
3147 test_sqrt(&t, NULL);
3148 }
3149 }
3150}
3151
3152/***** FIELD/SCALAR INVERSE TESTS *****/
3153
3155 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFE,
3156 0xBAAEDCE6, 0xAF48A03B, 0xBFD25E8C, 0xD0364140
3157);
3158
3160 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
3161 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFC2E
3162);
3163
3164/* These tests test the following identities:
3165 *
3166 * for x==0: 1/x == 0
3167 * for x!=0: x*(1/x) == 1
3168 * for x!=0 and x!=1: 1/(1/x - 1) + 1 == -1/(x-1)
3169 */
3170
3172{
3173 secp256k1_scalar l, r, t;
3174
3175 (var ? secp256k1_scalar_inverse_var : secp256k1_scalar_inverse)(&l, x); /* l = 1/x */
3176 if (out) *out = l;
3177 if (secp256k1_scalar_is_zero(x)) {
3179 return;
3180 }
3181 secp256k1_scalar_mul(&t, x, &l); /* t = x*(1/x) */
3182 CHECK(secp256k1_scalar_is_one(&t)); /* x*(1/x) == 1 */
3183 secp256k1_scalar_add(&r, x, &scalar_minus_one); /* r = x-1 */
3184 if (secp256k1_scalar_is_zero(&r)) return;
3185 (var ? secp256k1_scalar_inverse_var : secp256k1_scalar_inverse)(&r, &r); /* r = 1/(x-1) */
3186 secp256k1_scalar_add(&l, &scalar_minus_one, &l); /* l = 1/x-1 */
3187 (var ? secp256k1_scalar_inverse_var : secp256k1_scalar_inverse)(&l, &l); /* l = 1/(1/x-1) */
3188 secp256k1_scalar_add(&l, &l, &secp256k1_scalar_one); /* l = 1/(1/x-1)+1 */
3189 secp256k1_scalar_add(&l, &r, &l); /* l = 1/(1/x-1)+1 + 1/(x-1) */
3190 CHECK(secp256k1_scalar_is_zero(&l)); /* l == 0 */
3191}
3192
3193void test_inverse_field(secp256k1_fe* out, const secp256k1_fe* x, int var)
3194{
3195 secp256k1_fe l, r, t;
3196
3197 (var ? secp256k1_fe_inv_var : secp256k1_fe_inv)(&l, x) ; /* l = 1/x */
3198 if (out) *out = l;
3199 t = *x; /* t = x */
3202 return;
3203 }
3204 secp256k1_fe_mul(&t, x, &l); /* t = x*(1/x) */
3205 secp256k1_fe_add(&t, &fe_minus_one); /* t = x*(1/x)-1 */
3206 CHECK(secp256k1_fe_normalizes_to_zero(&t)); /* x*(1/x)-1 == 0 */
3207 r = *x; /* r = x */
3208 secp256k1_fe_add(&r, &fe_minus_one); /* r = x-1 */
3210 (var ? secp256k1_fe_inv_var : secp256k1_fe_inv)(&r, &r); /* r = 1/(x-1) */
3211 secp256k1_fe_add(&l, &fe_minus_one); /* l = 1/x-1 */
3212 (var ? secp256k1_fe_inv_var : secp256k1_fe_inv)(&l, &l); /* l = 1/(1/x-1) */
3213 secp256k1_fe_add(&l, &secp256k1_fe_one); /* l = 1/(1/x-1)+1 */
3214 secp256k1_fe_add(&l, &r); /* l = 1/(1/x-1)+1 + 1/(x-1) */
3216}
3217
3219{
3220 /* Fixed test cases for field inverses: pairs of (x, 1/x) mod p. */
3221 static const secp256k1_fe fe_cases[][2] = {
3222 /* 0 */
3223 {SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0),
3224 SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0)},
3225 /* 1 */
3226 {SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1),
3227 SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1)},
3228 /* -1 */
3229 {SECP256K1_FE_CONST(0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfffffffe, 0xfffffc2e),
3230 SECP256K1_FE_CONST(0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfffffffe, 0xfffffc2e)},
3231 /* 2 */
3232 {SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 2),
3233 SECP256K1_FE_CONST(0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x7ffffe18)},
3234 /* 2**128 */
3235 {SECP256K1_FE_CONST(0, 0, 0, 1, 0, 0, 0, 0),
3236 SECP256K1_FE_CONST(0xbcb223fe, 0xdc24a059, 0xd838091d, 0xd2253530, 0xffffffff, 0xffffffff, 0xffffffff, 0x434dd931)},
3237 /* Input known to need 637 divsteps */
3238 {SECP256K1_FE_CONST(0xe34e9c95, 0x6bee8a84, 0x0dcb632a, 0xdb8a1320, 0x66885408, 0x06f3f996, 0x7c11ca84, 0x19199ec3),
3239 SECP256K1_FE_CONST(0xbd2cbd8f, 0x1c536828, 0x9bccda44, 0x2582ac0c, 0x870152b0, 0x8a3f09fb, 0x1aaadf92, 0x19b618e5)},
3240 /* Input known to need 567 divsteps starting with delta=1/2. */
3241 {SECP256K1_FE_CONST(0xf6bc3ba3, 0x636451c4, 0x3e46357d, 0x2c21d619, 0x0988e234, 0x15985661, 0x6672982b, 0xa7549bfc),
3242 SECP256K1_FE_CONST(0xb024fdc7, 0x5547451e, 0x426c585f, 0xbd481425, 0x73df6b75, 0xeef6d9d0, 0x389d87d4, 0xfbb440ba)},
3243 /* Input known to need 566 divsteps starting with delta=1/2. */
3244 {SECP256K1_FE_CONST(0xb595d81b, 0x2e3c1e2f, 0x482dbc65, 0xe4865af7, 0x9a0a50aa, 0x29f9e618, 0x6f87d7a5, 0x8d1063ae),
3245 SECP256K1_FE_CONST(0xc983337c, 0x5d5c74e1, 0x49918330, 0x0b53afb5, 0xa0428a0b, 0xce6eef86, 0x059bd8ef, 0xe5b908de)},
3246 /* Set of 10 inputs accessing all 128 entries in the modinv32 divsteps_var table */
3247 {SECP256K1_FE_CONST(0x00000000, 0x00000000, 0xe0ff1f80, 0x1f000000, 0x00000000, 0x00000000, 0xfeff0100, 0x00000000),
3248 SECP256K1_FE_CONST(0x9faf9316, 0x77e5049d, 0x0b5e7a1b, 0xef70b893, 0x18c9e30c, 0x045e7fd7, 0x29eddf8c, 0xd62e9e3d)},
3249 {SECP256K1_FE_CONST(0x621a538d, 0x511b2780, 0x35688252, 0x53f889a4, 0x6317c3ac, 0x32ba0a46, 0x6277c0d1, 0xccd31192),
3250 SECP256K1_FE_CONST(0x38513b0c, 0x5eba856f, 0xe29e882e, 0x9b394d8c, 0x34bda011, 0xeaa66943, 0x6a841a4c, 0x6ae8bcff)},
3251 {SECP256K1_FE_CONST(0x00000200, 0xf0ffff1f, 0x00000000, 0x0000e0ff, 0xffffffff, 0xfffcffff, 0xffffffff, 0xffff0100),
3252 SECP256K1_FE_CONST(0x5da42a52, 0x3640de9e, 0x13e64343, 0x0c7591b7, 0x6c1e3519, 0xf048c5b6, 0x0484217c, 0xedbf8b2f)},
3253 {SECP256K1_FE_CONST(0xd1343ef9, 0x4b952621, 0x7c52a2ee, 0x4ea1281b, 0x4ab46410, 0x9f26998d, 0xa686a8ff, 0x9f2103e8),
3254 SECP256K1_FE_CONST(0x84044385, 0x9a4619bf, 0x74e35b6d, 0xa47e0c46, 0x6b7fb47d, 0x9ffab128, 0xb0775aa3, 0xcb318bd1)},
3255 {SECP256K1_FE_CONST(0xb27235d2, 0xc56a52be, 0x210db37a, 0xd50d23a4, 0xbe621bdd, 0x5df22c6a, 0xe926ba62, 0xd2e4e440),
3256 SECP256K1_FE_CONST(0x67a26e54, 0x483a9d3c, 0xa568469e, 0xd258ab3d, 0xb9ec9981, 0xdca9b1bd, 0x8d2775fe, 0x53ae429b)},
3257 {SECP256K1_FE_CONST(0x00000000, 0x00000000, 0x00e0ffff, 0xffffff83, 0xffffffff, 0x3f00f00f, 0x000000e0, 0xffffffff),
3258 SECP256K1_FE_CONST(0x310e10f8, 0x23bbfab0, 0xac94907d, 0x076c9a45, 0x8d357d7f, 0xc763bcee, 0x00d0e615, 0x5a6acef6)},
3259 {SECP256K1_FE_CONST(0xfeff0300, 0x001c0000, 0xf80700c0, 0x0ff0ffff, 0xffffffff, 0x0fffffff, 0xffff0100, 0x7f0000fe),
3260 SECP256K1_FE_CONST(0x28e2fdb4, 0x0709168b, 0x86f598b0, 0x3453a370, 0x530cf21f, 0x32f978d5, 0x1d527a71, 0x59269b0c)},
3261 {SECP256K1_FE_CONST(0xc2591afa, 0x7bb98ef7, 0x090bb273, 0x85c14f87, 0xbb0b28e0, 0x54d3c453, 0x85c66753, 0xd5574d2f),
3262 SECP256K1_FE_CONST(0xfdca70a2, 0x70ce627c, 0x95e66fae, 0x848a6dbb, 0x07ffb15c, 0x5f63a058, 0xba4140ed, 0x6113b503)},
3263 {SECP256K1_FE_CONST(0xf5475db3, 0xedc7b5a3, 0x411c047e, 0xeaeb452f, 0xc625828e, 0x1cf5ad27, 0x8eec1060, 0xc7d3e690),
3264 SECP256K1_FE_CONST(0x5eb756c0, 0xf963f4b9, 0xdc6a215e, 0xec8cc2d8, 0x2e9dec01, 0xde5eb88d, 0x6aba7164, 0xaecb2c5a)},
3265 {SECP256K1_FE_CONST(0x00000000, 0x00f8ffff, 0xffffffff, 0x01000000, 0xe0ff1f00, 0x00000000, 0xffffff7f, 0x00000000),
3266 SECP256K1_FE_CONST(0xe0d2e3d8, 0x49b6157d, 0xe54e88c2, 0x1a7f02ca, 0x7dd28167, 0xf1125d81, 0x7bfa444e, 0xbe110037)},
3267 /* Selection of randomly generated inputs that reach high/low d/e values in various configurations. */
3268 {SECP256K1_FE_CONST(0x13cc08a4, 0xd8c41f0f, 0x179c3e67, 0x54c46c67, 0xc4109221, 0x09ab3b13, 0xe24d9be1, 0xffffe950),
3269 SECP256K1_FE_CONST(0xb80c8006, 0xd16abaa7, 0xcabd71e5, 0xcf6714f4, 0x966dd3d0, 0x64767a2d, 0xe92c4441, 0x51008cd1)},
3270 {SECP256K1_FE_CONST(0xaa6db990, 0x95efbca1, 0x3cc6ff71, 0x0602e24a, 0xf49ff938, 0x99fffc16, 0x46f40993, 0xc6e72057),
3271 SECP256K1_FE_CONST(0xd5d3dd69, 0xb0c195e5, 0x285f1d49, 0xe639e48c, 0x9223f8a9, 0xca1d731d, 0x9ca482f9, 0xa5b93e06)},
3272 {SECP256K1_FE_CONST(0x1c680eac, 0xaeabffd8, 0x9bdc4aee, 0x1781e3de, 0xa3b08108, 0x0015f2e0, 0x94449e1b, 0x2f67a058),
3273 SECP256K1_FE_CONST(0x7f083f8d, 0x31254f29, 0x6510f475, 0x245c373d, 0xc5622590, 0x4b323393, 0x32ed1719, 0xc127444b)},
3274 {SECP256K1_FE_CONST(0x147d44b3, 0x012d83f8, 0xc160d386, 0x1a44a870, 0x9ba6be96, 0x8b962707, 0x267cbc1a, 0xb65b2f0a),
3275 SECP256K1_FE_CONST(0x555554ff, 0x170aef1e, 0x50a43002, 0xe51fbd36, 0xafadb458, 0x7a8aded1, 0x0ca6cd33, 0x6ed9087c)},
3276 {SECP256K1_FE_CONST(0x12423796, 0x22f0fe61, 0xf9ca017c, 0x5384d107, 0xa1fbf3b2, 0x3b018013, 0x916a3c37, 0x4000b98c),
3277 SECP256K1_FE_CONST(0x20257700, 0x08668f94, 0x1177e306, 0x136c01f5, 0x8ed1fbd2, 0x95ec4589, 0xae38edb9, 0xfd19b6d7)},
3278 {SECP256K1_FE_CONST(0xdcf2d030, 0x9ab42cb4, 0x93ffa181, 0xdcd23619, 0x39699b52, 0x08909a20, 0xb5a17695, 0x3a9dcf21),
3279 SECP256K1_FE_CONST(0x1f701dea, 0xe211fb1f, 0x4f37180d, 0x63a0f51c, 0x29fe1e40, 0xa40b6142, 0x2e7b12eb, 0x982b06b6)},
3280 {SECP256K1_FE_CONST(0x79a851f6, 0xa6314ed3, 0xb35a55e6, 0xca1c7d7f, 0xe32369ea, 0xf902432e, 0x375308c5, 0xdfd5b600),
3281 SECP256K1_FE_CONST(0xcaae00c5, 0xe6b43851, 0x9dabb737, 0x38cba42c, 0xa02c8549, 0x7895dcbf, 0xbd183d71, 0xafe4476a)},
3282 {SECP256K1_FE_CONST(0xede78fdd, 0xcfc92bf1, 0x4fec6c6c, 0xdb8d37e2, 0xfb66bc7b, 0x28701870, 0x7fa27c9a, 0x307196ec),
3283 SECP256K1_FE_CONST(0x68193a6c, 0x9a8b87a7, 0x2a760c64, 0x13e473f6, 0x23ae7bed, 0x1de05422, 0x88865427, 0xa3418265)},
3284 {SECP256K1_FE_CONST(0xa40b2079, 0xb8f88e89, 0xa7617997, 0x89baf5ae, 0x174df343, 0x75138eae, 0x2711595d, 0x3fc3e66c),
3285 SECP256K1_FE_CONST(0x9f99c6a5, 0x6d685267, 0xd4b87c37, 0x9d9c4576, 0x358c692b, 0x6bbae0ed, 0x3389c93d, 0x7fdd2655)},
3286 {SECP256K1_FE_CONST(0x7c74c6b6, 0xe98d9151, 0x72645cf1, 0x7f06e321, 0xcefee074, 0x15b2113a, 0x10a9be07, 0x08a45696),
3287 SECP256K1_FE_CONST(0x8c919a88, 0x898bc1e0, 0x77f26f97, 0x12e655b7, 0x9ba0ac40, 0xe15bb19e, 0x8364cc3b, 0xe227a8ee)},
3288 {SECP256K1_FE_CONST(0x109ba1ce, 0xdafa6d4a, 0xa1cec2b2, 0xeb1069f4, 0xb7a79e5b, 0xec6eb99b, 0xaec5f643, 0xee0e723e),
3289 SECP256K1_FE_CONST(0x93d13eb8, 0x4bb0bcf9, 0xe64f5a71, 0xdbe9f359, 0x7191401c, 0x6f057a4a, 0xa407fe1b, 0x7ecb65cc)},
3290 {SECP256K1_FE_CONST(0x3db076cd, 0xec74a5c9, 0xf61dd138, 0x90e23e06, 0xeeedd2d0, 0x74cbc4e0, 0x3dbe1e91, 0xded36a78),
3291 SECP256K1_FE_CONST(0x3f07f966, 0x8e2a1e09, 0x706c71df, 0x02b5e9d5, 0xcb92ddbf, 0xcdd53010, 0x16545564, 0xe660b107)},
3292 {SECP256K1_FE_CONST(0xe31c73ed, 0xb4c4b82c, 0x02ae35f7, 0x4cdec153, 0x98b522fd, 0xf7d2460c, 0x6bf7c0f8, 0x4cf67b0d),
3293 SECP256K1_FE_CONST(0x4b8f1faf, 0x94e8b070, 0x19af0ff6, 0xa319cd31, 0xdf0a7ffb, 0xefaba629, 0x59c50666, 0x1fe5b843)},
3294 {SECP256K1_FE_CONST(0x4c8b0e6e, 0x83392ab6, 0xc0e3e9f1, 0xbbd85497, 0x16698897, 0xf552d50d, 0x79652ddb, 0x12f99870),
3295 SECP256K1_FE_CONST(0x56d5101f, 0xd23b7949, 0x17dc38d6, 0xf24022ef, 0xcf18e70a, 0x5cc34424, 0x438544c3, 0x62da4bca)},
3296 {SECP256K1_FE_CONST(0xb0e040e2, 0x40cc35da, 0x7dd5c611, 0x7fccb178, 0x28888137, 0xbc930358, 0xea2cbc90, 0x775417dc),
3297 SECP256K1_FE_CONST(0xca37f0d4, 0x016dd7c8, 0xab3ae576, 0x96e08d69, 0x68ed9155, 0xa9b44270, 0x900ae35d, 0x7c7800cd)},
3298 {SECP256K1_FE_CONST(0x8a32ea49, 0x7fbb0bae, 0x69724a9d, 0x8e2105b2, 0xbdf69178, 0x862577ef, 0x35055590, 0x667ddaef),
3299 SECP256K1_FE_CONST(0xd02d7ead, 0xc5e190f0, 0x559c9d72, 0xdaef1ffc, 0x64f9f425, 0xf43645ea, 0x7341e08d, 0x11768e96)},
3300 {SECP256K1_FE_CONST(0xa3592d98, 0x9abe289d, 0x579ebea6, 0xbb0857a8, 0xe242ab73, 0x85f9a2ce, 0xb6998f0f, 0xbfffbfc6),
3301 SECP256K1_FE_CONST(0x093c1533, 0x32032efa, 0x6aa46070, 0x0039599e, 0x589c35f4, 0xff525430, 0x7fe3777a, 0x44b43ddc)},
3302 {SECP256K1_FE_CONST(0x647178a3, 0x229e607b, 0xcc98521a, 0xcce3fdd9, 0x1e1bc9c9, 0x97fb7c6a, 0x61b961e0, 0x99b10709),
3303 SECP256K1_FE_CONST(0x98217c13, 0xd51ddf78, 0x96310e77, 0xdaebd908, 0x602ca683, 0xcb46d07a, 0xa1fcf17e, 0xc8e2feb3)},
3304 {SECP256K1_FE_CONST(0x7334627c, 0x73f98968, 0x99464b4b, 0xf5964958, 0x1b95870d, 0xc658227e, 0x5e3235d8, 0xdcab5787),
3305 SECP256K1_FE_CONST(0x000006fd, 0xc7e9dd94, 0x40ae367a, 0xe51d495c, 0x07603b9b, 0x2d088418, 0x6cc5c74c, 0x98514307)},
3306 {SECP256K1_FE_CONST(0x82e83876, 0x96c28938, 0xa50dd1c5, 0x605c3ad1, 0xc048637d, 0x7a50825f, 0x335ed01a, 0x00005760),
3307 SECP256K1_FE_CONST(0xb0393f9f, 0x9f2aa55e, 0xf5607e2e, 0x5287d961, 0x60b3e704, 0xf3e16e80, 0xb4f9a3ea, 0xfec7f02d)},
3308 {SECP256K1_FE_CONST(0xc97b6cec, 0x3ee6b8dc, 0x98d24b58, 0x3c1970a1, 0xfe06297a, 0xae813529, 0xe76bb6bd, 0x771ae51d),
3309 SECP256K1_FE_CONST(0x0507c702, 0xd407d097, 0x47ddeb06, 0xf6625419, 0x79f48f79, 0x7bf80d0b, 0xfc34b364, 0x253a5db1)},
3310 {SECP256K1_FE_CONST(0xd559af63, 0x77ea9bc4, 0x3cf1ad14, 0x5c7a4bbb, 0x10e7d18b, 0x7ce0dfac, 0x380bb19d, 0x0bb99bd3),
3311 SECP256K1_FE_CONST(0x00196119, 0xb9b00d92, 0x34edfdb5, 0xbbdc42fc, 0xd2daa33a, 0x163356ca, 0xaa8754c8, 0xb0ec8b0b)},
3312 {SECP256K1_FE_CONST(0x8ddfa3dc, 0x52918da0, 0x640519dc, 0x0af8512a, 0xca2d33b2, 0xbde52514, 0xda9c0afc, 0xcb29fce4),
3313 SECP256K1_FE_CONST(0xb3e4878d, 0x5cb69148, 0xcd54388b, 0xc23acce0, 0x62518ba8, 0xf09def92, 0x7b31e6aa, 0x6ba35b02)},
3314 {SECP256K1_FE_CONST(0xf8207492, 0xe3049f0a, 0x65285f2b, 0x0bfff996, 0x00ca112e, 0xc05da837, 0x546d41f9, 0x5194fb91),
3315 SECP256K1_FE_CONST(0x7b7ee50b, 0xa8ed4bbd, 0xf6469930, 0x81419a5c, 0x071441c7, 0x290d046e, 0x3b82ea41, 0x611c5f95)},
3316 {SECP256K1_FE_CONST(0x050f7c80, 0x5bcd3c6b, 0x823cb724, 0x5ce74db7, 0xa4e39f5c, 0xbd8828d7, 0xfd4d3e07, 0x3ec2926a),
3317 SECP256K1_FE_CONST(0x000d6730, 0xb0171314, 0x4764053d, 0xee157117, 0x48fd61da, 0xdea0b9db, 0x1d5e91c6, 0xbdc3f59e)},
3318 {SECP256K1_FE_CONST(0x3e3ea8eb, 0x05d760cf, 0x23009263, 0xb3cb3ac9, 0x088f6f0d, 0x3fc182a3, 0xbd57087c, 0xe67c62f9),
3319 SECP256K1_FE_CONST(0xbe988716, 0xa29c1bf6, 0x4456aed6, 0xab1e4720, 0x49929305, 0x51043bf4, 0xebd833dd, 0xdd511e8b)},
3320 {SECP256K1_FE_CONST(0x6964d2a9, 0xa7fa6501, 0xa5959249, 0x142f4029, 0xea0c1b5f, 0x2f487ef6, 0x301ac80a, 0x768be5cd),
3321 SECP256K1_FE_CONST(0x3918ffe4, 0x07492543, 0xed24d0b7, 0x3df95f8f, 0xaffd7cb4, 0x0de2191c, 0x9ec2f2ad, 0x2c0cb3c6)},
3322 {SECP256K1_FE_CONST(0x37c93520, 0xf6ddca57, 0x2b42fd5e, 0xb5c7e4de, 0x11b5b81c, 0xb95e91f3, 0x95c4d156, 0x39877ccb),
3323 SECP256K1_FE_CONST(0x9a94b9b5, 0x57eb71ee, 0x4c975b8b, 0xac5262a8, 0x077b0595, 0xe12a6b1f, 0xd728edef, 0x1a6bf956)}
3324 };
3325 /* Fixed test cases for scalar inverses: pairs of (x, 1/x) mod n. */
3326 static const secp256k1_scalar scalar_cases[][2] = {
3327 /* 0 */
3328 {SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0),
3329 SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0)},
3330 /* 1 */
3331 {SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1),
3332 SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1)},
3333 /* -1 */
3334 {SECP256K1_SCALAR_CONST(0xffffffff, 0xffffffff, 0xffffffff, 0xfffffffe, 0xbaaedce6, 0xaf48a03b, 0xbfd25e8c, 0xd0364140),
3335 SECP256K1_SCALAR_CONST(0xffffffff, 0xffffffff, 0xffffffff, 0xfffffffe, 0xbaaedce6, 0xaf48a03b, 0xbfd25e8c, 0xd0364140)},
3336 /* 2 */
3337 {SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 2),
3338 SECP256K1_SCALAR_CONST(0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x5d576e73, 0x57a4501d, 0xdfe92f46, 0x681b20a1)},
3339 /* 2**128 */
3340 {SECP256K1_SCALAR_CONST(0, 0, 0, 1, 0, 0, 0, 0),
3341 SECP256K1_SCALAR_CONST(0x50a51ac8, 0x34b9ec24, 0x4b0dff66, 0x5588b13e, 0x9984d5b3, 0xcf80ef0f, 0xd6a23766, 0xa3ee9f22)},
3342 /* Input known to need 635 divsteps */
3343 {SECP256K1_SCALAR_CONST(0xcb9f1d35, 0xdd4416c2, 0xcd71bf3f, 0x6365da66, 0x3c9b3376, 0x8feb7ae9, 0x32a5ef60, 0x19199ec3),
3344 SECP256K1_SCALAR_CONST(0x1d7c7bba, 0xf1893d53, 0xb834bd09, 0x36b411dc, 0x42c2e42f, 0xec72c428, 0x5e189791, 0x8e9bc708)},
3345 /* Input known to need 566 divsteps starting with delta=1/2. */
3346 {SECP256K1_SCALAR_CONST(0x7e3c993d, 0xa4272488, 0xbc015b49, 0x2db54174, 0xd382083a, 0xebe6db35, 0x80f82eff, 0xcd132c72),
3347 SECP256K1_SCALAR_CONST(0x086f34a0, 0x3e631f76, 0x77418f28, 0xcc84ac95, 0x6304439d, 0x365db268, 0x312c6ded, 0xd0b934f8)},
3348 /* Input known to need 565 divsteps starting with delta=1/2. */
3349 {SECP256K1_SCALAR_CONST(0xbad7e587, 0x3f307859, 0x60d93147, 0x8a18491e, 0xb38a9fd5, 0x254350d3, 0x4b1f0e4b, 0x7dd6edc4),
3350 SECP256K1_SCALAR_CONST(0x89f2df26, 0x39e2b041, 0xf19bd876, 0xd039c8ac, 0xc2223add, 0x29c4943e, 0x6632d908, 0x515f467b)},
3351 /* Selection of randomly generated inputs that reach low/high d/e values in various configurations. */
3352 {SECP256K1_SCALAR_CONST(0x1950d757, 0xb37a5809, 0x435059bb, 0x0bb8997e, 0x07e1e3c8, 0x5e5d7d2c, 0x6a0ed8e3, 0xdbde180e),
3353 SECP256K1_SCALAR_CONST(0xbf72af9b, 0x750309e2, 0x8dda230b, 0xfe432b93, 0x7e25e475, 0x4388251e, 0x633d894b, 0x3bcb6f8c)},
3354 {SECP256K1_SCALAR_CONST(0x9bccf4e7, 0xc5a515e3, 0x50637aa9, 0xbb65a13f, 0x391749a1, 0x62de7d4e, 0xf6d7eabb, 0x3cd10ce0),
3355 SECP256K1_SCALAR_CONST(0xaf2d5623, 0xb6385a33, 0xcd0365be, 0x5e92a70d, 0x7f09179c, 0x3baaf30f, 0x8f9cc83b, 0x20092f67)},
3356 {SECP256K1_SCALAR_CONST(0x73a57111, 0xb242952a, 0x5c5dee59, 0xf3be2ace, 0xa30a7659, 0xa46e5f47, 0xd21267b1, 0x39e642c9),
3357 SECP256K1_SCALAR_CONST(0xa711df07, 0xcbcf13ef, 0xd61cc6be, 0xbcd058ce, 0xb02cf157, 0x272d4a18, 0x86d0feb3, 0xcd5fa004)},
3358 {SECP256K1_SCALAR_CONST(0x04884963, 0xce0580b1, 0xba547030, 0x3c691db3, 0x9cd2c84f, 0x24c7cebd, 0x97ebfdba, 0x3e785ec2),
3359 SECP256K1_SCALAR_CONST(0xaaaaaf14, 0xd7c99ba7, 0x517ce2c1, 0x78a28b4c, 0x3769a851, 0xe5c5a03d, 0x4cc28f33, 0x0ec4dc5d)},
3360 {SECP256K1_SCALAR_CONST(0x1679ed49, 0x21f537b1, 0x815cb8ae, 0x9efc511c, 0x5b9fa037, 0x0b0f275e, 0x6c985281, 0x6c4a9905),
3361 SECP256K1_SCALAR_CONST(0xb14ac3d5, 0x62b52999, 0xef34ead1, 0xffca4998, 0x0294341a, 0x1f8172aa, 0xea1624f9, 0x302eea62)},
3362 {SECP256K1_SCALAR_CONST(0x626b37c0, 0xf0057c35, 0xee982f83, 0x452a1fd3, 0xea826506, 0x48b08a9d, 0x1d2c4799, 0x4ad5f6ec),
3363 SECP256K1_SCALAR_CONST(0xe38643b7, 0x567bfc2f, 0x5d2f1c15, 0xe327239c, 0x07112443, 0x69509283, 0xfd98e77a, 0xdb71c1e8)},
3364 {SECP256K1_SCALAR_CONST(0x1850a3a7, 0x759efc56, 0x54f287b2, 0x14d1234b, 0xe263bbc9, 0xcf4d8927, 0xd5f85f27, 0x965bd816),
3365 SECP256K1_SCALAR_CONST(0x3b071831, 0xcac9619a, 0xcceb0596, 0xf614d63b, 0x95d0db2f, 0xc6a00901, 0x8eaa2621, 0xabfa0009)},
3366 {SECP256K1_SCALAR_CONST(0x94ae5d06, 0xa27dc400, 0x487d72be, 0xaa51ebed, 0xe475b5c0, 0xea675ffc, 0xf4df627a, 0xdca4222f),
3367 SECP256K1_SCALAR_CONST(0x01b412ed, 0xd7830956, 0x1532537e, 0xe5e3dc99, 0x8fd3930a, 0x54f8d067, 0x32ef5760, 0x594438a5)},
3368 {SECP256K1_SCALAR_CONST(0x1f24278a, 0xb5bfe374, 0xa328dbbc, 0xebe35f48, 0x6620e009, 0xd58bb1b4, 0xb5a6bf84, 0x8815f63a),
3369 SECP256K1_SCALAR_CONST(0xfe928416, 0xca5ba2d3, 0xfde513da, 0x903a60c7, 0x9e58ad8a, 0x8783bee4, 0x083a3843, 0xa608c914)},
3370 {SECP256K1_SCALAR_CONST(0xdc107d58, 0x274f6330, 0x67dba8bc, 0x26093111, 0x5201dfb8, 0x968ce3f5, 0xf34d1bd4, 0xf2146504),
3371 SECP256K1_SCALAR_CONST(0x660cfa90, 0x13c3d93e, 0x7023b1e5, 0xedd09e71, 0x6d9c9d10, 0x7a3d2cdb, 0xdd08edc3, 0xaa78fcfb)},
3372 {SECP256K1_SCALAR_CONST(0x7cd1e905, 0xc6f02776, 0x2f551cc7, 0x5da61cff, 0x7da05389, 0x1119d5a4, 0x631c7442, 0x894fd4f7),
3373 SECP256K1_SCALAR_CONST(0xff20862a, 0x9d3b1a37, 0x1628803b, 0x3004ccae, 0xaa23282a, 0xa89a1109, 0xd94ece5e, 0x181bdc46)},
3374 {SECP256K1_SCALAR_CONST(0x5b9dade8, 0x23d26c58, 0xcd12d818, 0x25b8ae97, 0x3dea04af, 0xf482c96b, 0xa062f254, 0x9e453640),
3375 SECP256K1_SCALAR_CONST(0x50c38800, 0x15fa53f4, 0xbe1e5392, 0x5c9b120a, 0x262c22c7, 0x18fa0816, 0x5f2baab4, 0x8cb5db46)},
3376 {SECP256K1_SCALAR_CONST(0x11cdaeda, 0x969c464b, 0xef1f4ab0, 0x5b01d22e, 0x656fd098, 0x882bea84, 0x65cdbe7a, 0x0c19ff03),
3377 SECP256K1_SCALAR_CONST(0x1968d0fa, 0xac46f103, 0xb55f1f72, 0xb3820bed, 0xec6b359a, 0x4b1ae0ad, 0x7e38e1fb, 0x295ccdfb)},
3378 {SECP256K1_SCALAR_CONST(0x2c351aa1, 0x26e91589, 0x194f8a1e, 0x06561f66, 0x0cb97b7f, 0x10914454, 0x134d1c03, 0x157266b4),
3379 SECP256K1_SCALAR_CONST(0xbe49ada6, 0x92bd8711, 0x41b176c4, 0xa478ba95, 0x14883434, 0x9d1cd6f3, 0xcc4b847d, 0x22af80f5)},
3380 {SECP256K1_SCALAR_CONST(0x6ba07c6e, 0x13a60edb, 0x6247f5c3, 0x84b5fa56, 0x76fe3ec5, 0x80426395, 0xf65ec2ae, 0x623ba730),
3381 SECP256K1_SCALAR_CONST(0x25ac23f7, 0x418cd747, 0x98376f9d, 0x4a11c7bf, 0x24c8ebfe, 0x4c8a8655, 0x345f4f52, 0x1c515595)},
3382 {SECP256K1_SCALAR_CONST(0x9397a712, 0x8abb6951, 0x2d4a3d54, 0x703b1c2a, 0x0661dca8, 0xd75c9b31, 0xaed4d24b, 0xd2ab2948),
3383 SECP256K1_SCALAR_CONST(0xc52e8bef, 0xd55ce3eb, 0x1c897739, 0xeb9fb606, 0x36b9cd57, 0x18c51cc2, 0x6a87489e, 0xffd0dcf3)},
3384 {SECP256K1_SCALAR_CONST(0xe6a808cc, 0xeb437888, 0xe97798df, 0x4e224e44, 0x7e3b380a, 0x207c1653, 0x889f3212, 0xc6738b6f),
3385 SECP256K1_SCALAR_CONST(0x31f9ae13, 0xd1e08b20, 0x757a2e5e, 0x5243a0eb, 0x8ae35f73, 0x19bb6122, 0xb910f26b, 0xda70aa55)},
3386 {SECP256K1_SCALAR_CONST(0xd0320548, 0xab0effe7, 0xa70779e0, 0x61a347a6, 0xb8c1e010, 0x9d5281f8, 0x2ee588a6, 0x80000000),
3387 SECP256K1_SCALAR_CONST(0x1541897e, 0x78195c90, 0x7583dd9e, 0x728b6100, 0xbce8bc6d, 0x7a53b471, 0x5dcd9e45, 0x4425fcaf)},
3388 {SECP256K1_SCALAR_CONST(0x93d623f1, 0xd45b50b0, 0x796e9186, 0x9eac9407, 0xd30edc20, 0xef6304cf, 0x250494e7, 0xba503de9),
3389 SECP256K1_SCALAR_CONST(0x7026d638, 0x1178b548, 0x92043952, 0x3c7fb47c, 0xcd3ea236, 0x31d82b01, 0x612fc387, 0x80b9b957)},
3390 {SECP256K1_SCALAR_CONST(0xf860ab39, 0x55f5d412, 0xa4d73bcc, 0x3b48bd90, 0xc248ffd3, 0x13ca10be, 0x8fba84cc, 0xdd28d6a3),
3391 SECP256K1_SCALAR_CONST(0x5c32fc70, 0xe0b15d67, 0x76694700, 0xfe62be4d, 0xeacdb229, 0x7a4433d9, 0x52155cd0, 0x7649ab59)},
3392 {SECP256K1_SCALAR_CONST(0x4e41311c, 0x0800af58, 0x7a690a8e, 0xe175c9ba, 0x6981ab73, 0xac532ea8, 0x5c1f5e63, 0x6ac1f189),
3393 SECP256K1_SCALAR_CONST(0xfffffff9, 0xd075982c, 0x7fbd3825, 0xc05038a2, 0x4533b91f, 0x94ec5f45, 0xb280b28f, 0x842324dc)},
3394 {SECP256K1_SCALAR_CONST(0x48e473bf, 0x3555eade, 0xad5d7089, 0x2424c4e4, 0x0a99397c, 0x2dc796d8, 0xb7a43a69, 0xd0364141),
3395 SECP256K1_SCALAR_CONST(0x634976b2, 0xa0e47895, 0x1ec38593, 0x266d6fd0, 0x6f602644, 0x9bb762f1, 0x7180c704, 0xe23a4daa)},
3396 {SECP256K1_SCALAR_CONST(0xbe83878d, 0x3292fc54, 0x26e71c62, 0x556ccedc, 0x7cbb8810, 0x4032a720, 0x34ead589, 0xe4d6bd13),
3397 SECP256K1_SCALAR_CONST(0x6cd150ad, 0x25e59d0f, 0x74cbae3d, 0x6377534a, 0x1e6562e8, 0xb71b9d18, 0xe1e5d712, 0x8480abb3)},
3398 {SECP256K1_SCALAR_CONST(0xcdddf2e5, 0xefc15f88, 0xc9ee06de, 0x8a846ca9, 0x28561581, 0x68daa5fb, 0xd1cf3451, 0xeb1782d0),
3399 SECP256K1_SCALAR_CONST(0xffffffd9, 0xed8d2af4, 0x993c865a, 0x23e9681a, 0x3ca3a3dc, 0xe6d5a46e, 0xbd86bd87, 0x61b55c70)},
3400 {SECP256K1_SCALAR_CONST(0xb6a18f1f, 0x04872df9, 0x08165ec4, 0x319ca19c, 0x6c0359ab, 0x1f7118fb, 0xc2ef8082, 0xca8b7785),
3401 SECP256K1_SCALAR_CONST(0xff55b19b, 0x0f1ac78c, 0x0f0c88c2, 0x2358d5ad, 0x5f455e4e, 0x3330b72f, 0x274dc153, 0xffbf272b)},
3402 {SECP256K1_SCALAR_CONST(0xea4898e5, 0x30eba3e8, 0xcf0e5c3d, 0x06ec6844, 0x01e26fb6, 0x75636225, 0xc5d08f4c, 0x1decafa0),
3403 SECP256K1_SCALAR_CONST(0xe5a014a8, 0xe3c4ec1e, 0xea4f9b32, 0xcfc7b386, 0x00630806, 0x12c08d02, 0x6407ccc2, 0xb067d90e)},
3404 {SECP256K1_SCALAR_CONST(0x70e9aea9, 0x7e933af0, 0x8a23bfab, 0x23e4b772, 0xff951863, 0x5ffcf47d, 0x6bebc918, 0x2ca58265),
3405 SECP256K1_SCALAR_CONST(0xf4e00006, 0x81bc6441, 0x4eb6ec02, 0xc194a859, 0x80ad7c48, 0xba4e9afb, 0x8b6bdbe0, 0x989d8f77)},
3406 {SECP256K1_SCALAR_CONST(0x3c56c774, 0x46efe6f0, 0xe93618b8, 0xf9b5a846, 0xd247df61, 0x83b1e215, 0x06dc8bcc, 0xeefc1bf5),
3407 SECP256K1_SCALAR_CONST(0xfff8937a, 0x2cd9586b, 0x43c25e57, 0xd1cefa7a, 0x9fb91ed3, 0x95b6533d, 0x8ad0de5b, 0xafb93f00)},
3408 {SECP256K1_SCALAR_CONST(0xfb5c2772, 0x5cb30e83, 0xe38264df, 0xe4e3ebf3, 0x392aa92e, 0xa68756a1, 0x51279ac5, 0xb50711a8),
3409 SECP256K1_SCALAR_CONST(0x000013af, 0x1105bfe7, 0xa6bbd7fb, 0x3d638f99, 0x3b266b02, 0x072fb8bc, 0x39251130, 0x2e0fd0ea)}
3410 };
3411 int i, var, testrand;
3412 unsigned char b32[32];
3413 secp256k1_fe x_fe;
3414 secp256k1_scalar x_scalar;
3415 memset(b32, 0, sizeof(b32));
3416 /* Test fixed test cases through test_inverse_{scalar,field}, both ways. */
3417 for (i = 0; (size_t)i < sizeof(fe_cases)/sizeof(fe_cases[0]); ++i) {
3418 for (var = 0; var <= 1; ++var) {
3419 test_inverse_field(&x_fe, &fe_cases[i][0], var);
3420 check_fe_equal(&x_fe, &fe_cases[i][1]);
3421 test_inverse_field(&x_fe, &fe_cases[i][1], var);
3422 check_fe_equal(&x_fe, &fe_cases[i][0]);
3423 }
3424 }
3425 for (i = 0; (size_t)i < sizeof(scalar_cases)/sizeof(scalar_cases[0]); ++i) {
3426 for (var = 0; var <= 1; ++var) {
3427 test_inverse_scalar(&x_scalar, &scalar_cases[i][0], var);
3428 CHECK(secp256k1_scalar_eq(&x_scalar, &scalar_cases[i][1]));
3429 test_inverse_scalar(&x_scalar, &scalar_cases[i][1], var);
3430 CHECK(secp256k1_scalar_eq(&x_scalar, &scalar_cases[i][0]));
3431 }
3432 }
3433 /* Test inputs 0..999 and their respective negations. */
3434 for (i = 0; i < 1000; ++i) {
3435 b32[31] = i & 0xff;
3436 b32[30] = (i >> 8) & 0xff;
3437 secp256k1_scalar_set_b32(&x_scalar, b32, NULL);
3438 secp256k1_fe_set_b32(&x_fe, b32);
3439 for (var = 0; var <= 1; ++var) {
3440 test_inverse_scalar(NULL, &x_scalar, var);
3441 test_inverse_field(NULL, &x_fe, var);
3442 }
3443 secp256k1_scalar_negate(&x_scalar, &x_scalar);
3444 secp256k1_fe_negate(&x_fe, &x_fe, 1);
3445 for (var = 0; var <= 1; ++var) {
3446 test_inverse_scalar(NULL, &x_scalar, var);
3447 test_inverse_field(NULL, &x_fe, var);
3448 }
3449 }
3450 /* test 128*count random inputs; half with testrand256_test, half with testrand256 */
3451 for (testrand = 0; testrand <= 1; ++testrand) {
3452 for (i = 0; i < 64 * COUNT; ++i) {
3454 secp256k1_scalar_set_b32(&x_scalar, b32, NULL);
3455 secp256k1_fe_set_b32(&x_fe, b32);
3456 for (var = 0; var <= 1; ++var) {
3457 test_inverse_scalar(NULL, &x_scalar, var);
3458 test_inverse_field(NULL, &x_fe, var);
3459 }
3460 }
3461 }
3462}
3463
3464/***** GROUP TESTS *****/
3465
3466void ge_equals_ge(const secp256k1_ge *a, const secp256k1_ge *b) {
3467 CHECK(a->infinity == b->infinity);
3468 if (a->infinity) {
3469 return;
3470 }
3471 CHECK(secp256k1_fe_equal_var(&a->x, &b->x));
3472 CHECK(secp256k1_fe_equal_var(&a->y, &b->y));
3473}
3474
3475/* This compares jacobian points including their Z, not just their geometric meaning. */
3477 secp256k1_gej a2;
3478 secp256k1_gej b2;
3479 int ret = 1;
3480 ret &= a->infinity == b->infinity;
3481 if (ret && !a->infinity) {
3482 a2 = *a;
3483 b2 = *b;
3490 ret &= secp256k1_fe_cmp_var(&a2.x, &b2.x) == 0;
3491 ret &= secp256k1_fe_cmp_var(&a2.y, &b2.y) == 0;
3492 ret &= secp256k1_fe_cmp_var(&a2.z, &b2.z) == 0;
3493 }
3494 return ret;
3495}
3496
3497void ge_equals_gej(const secp256k1_ge *a, const secp256k1_gej *b) {
3498 secp256k1_fe z2s;
3499 secp256k1_fe u1, u2, s1, s2;
3500 CHECK(a->infinity == b->infinity);
3501 if (a->infinity) {
3502 return;
3503 }
3504 /* Check a.x * b.z^2 == b.x && a.y * b.z^3 == b.y, to avoid inverses. */
3505 secp256k1_fe_sqr(&z2s, &b->z);
3506 secp256k1_fe_mul(&u1, &a->x, &z2s);
3507 u2 = b->x; secp256k1_fe_normalize_weak(&u2);
3508 secp256k1_fe_mul(&s1, &a->y, &z2s); secp256k1_fe_mul(&s1, &s1, &b->z);
3509 s2 = b->y; secp256k1_fe_normalize_weak(&s2);
3510 CHECK(secp256k1_fe_equal_var(&u1, &u2));
3511 CHECK(secp256k1_fe_equal_var(&s1, &s2));
3512}
3513
3514void test_ge(void) {
3515 int i, i1;
3516 int runs = 6;
3517 /* 25 points are used:
3518 * - infinity
3519 * - for each of four random points p1 p2 p3 p4, we add the point, its
3520 * negation, and then those two again but with randomized Z coordinate.
3521 * - The same is then done for lambda*p1 and lambda^2*p1.
3522 */
3523 secp256k1_ge *ge = (secp256k1_ge *)checked_malloc(&CTX->error_callback, sizeof(secp256k1_ge) * (1 + 4 * runs));
3524 secp256k1_gej *gej = (secp256k1_gej *)checked_malloc(&CTX->error_callback, sizeof(secp256k1_gej) * (1 + 4 * runs));
3525 secp256k1_fe zf;
3526 secp256k1_fe zfi2, zfi3;
3527
3529 secp256k1_ge_clear(&ge[0]);
3530 secp256k1_ge_set_gej_var(&ge[0], &gej[0]);
3531 for (i = 0; i < runs; i++) {
3532 int j;
3533 secp256k1_ge g;
3535 if (i >= runs - 2) {
3536 secp256k1_ge_mul_lambda(&g, &ge[1]);
3537 }
3538 if (i >= runs - 1) {
3540 }
3541 ge[1 + 4 * i] = g;
3542 ge[2 + 4 * i] = g;
3543 secp256k1_ge_neg(&ge[3 + 4 * i], &g);
3544 secp256k1_ge_neg(&ge[4 + 4 * i], &g);
3545 secp256k1_gej_set_ge(&gej[1 + 4 * i], &ge[1 + 4 * i]);
3546 random_group_element_jacobian_test(&gej[2 + 4 * i], &ge[2 + 4 * i]);
3547 secp256k1_gej_set_ge(&gej[3 + 4 * i], &ge[3 + 4 * i]);
3548 random_group_element_jacobian_test(&gej[4 + 4 * i], &ge[4 + 4 * i]);
3549 for (j = 0; j < 4; j++) {
3550 random_field_element_magnitude(&ge[1 + j + 4 * i].x);
3551 random_field_element_magnitude(&ge[1 + j + 4 * i].y);
3552 random_field_element_magnitude(&gej[1 + j + 4 * i].x);
3553 random_field_element_magnitude(&gej[1 + j + 4 * i].y);
3554 random_field_element_magnitude(&gej[1 + j + 4 * i].z);
3555 }
3556 }
3557
3558 /* Generate random zf, and zfi2 = 1/zf^2, zfi3 = 1/zf^3 */
3559 do {
3561 } while(secp256k1_fe_is_zero(&zf));
3563 secp256k1_fe_inv_var(&zfi3, &zf);
3564 secp256k1_fe_sqr(&zfi2, &zfi3);
3565 secp256k1_fe_mul(&zfi3, &zfi3, &zfi2);
3566
3567 for (i1 = 0; i1 < 1 + 4 * runs; i1++) {
3568 int i2;
3569 for (i2 = 0; i2 < 1 + 4 * runs; i2++) {
3570 /* Compute reference result using gej + gej (var). */
3571 secp256k1_gej refj, resj;
3572 secp256k1_ge ref;
3573 secp256k1_fe zr;
3574 secp256k1_gej_add_var(&refj, &gej[i1], &gej[i2], secp256k1_gej_is_infinity(&gej[i1]) ? NULL : &zr);
3575 /* Check Z ratio. */
3576 if (!secp256k1_gej_is_infinity(&gej[i1]) && !secp256k1_gej_is_infinity(&refj)) {
3577 secp256k1_fe zrz; secp256k1_fe_mul(&zrz, &zr, &gej[i1].z);
3578 CHECK(secp256k1_fe_equal_var(&zrz, &refj.z));
3579 }
3580 secp256k1_ge_set_gej_var(&ref, &refj);
3581
3582 /* Test gej + ge with Z ratio result (var). */
3583 secp256k1_gej_add_ge_var(&resj, &gej[i1], &ge[i2], secp256k1_gej_is_infinity(&gej[i1]) ? NULL : &zr);
3584 ge_equals_gej(&ref, &resj);
3585 if (!secp256k1_gej_is_infinity(&gej[i1]) && !secp256k1_gej_is_infinity(&resj)) {
3586 secp256k1_fe zrz; secp256k1_fe_mul(&zrz, &zr, &gej[i1].z);
3587 CHECK(secp256k1_fe_equal_var(&zrz, &resj.z));
3588 }
3589
3590 /* Test gej + ge (var, with additional Z factor). */
3591 {
3592 secp256k1_ge ge2_zfi = ge[i2]; /* the second term with x and y rescaled for z = 1/zf */
3593 secp256k1_fe_mul(&ge2_zfi.x, &ge2_zfi.x, &zfi2);
3594 secp256k1_fe_mul(&ge2_zfi.y, &ge2_zfi.y, &zfi3);
3597 secp256k1_gej_add_zinv_var(&resj, &gej[i1], &ge2_zfi, &zf);
3598 ge_equals_gej(&ref, &resj);
3599 }
3600
3601 /* Test gej + ge (const). */
3602 if (i2 != 0) {
3603 /* secp256k1_gej_add_ge does not support its second argument being infinity. */
3604 secp256k1_gej_add_ge(&resj, &gej[i1], &ge[i2]);
3605 ge_equals_gej(&ref, &resj);
3606 }
3607
3608 /* Test doubling (var). */
3609 if ((i1 == 0 && i2 == 0) || ((i1 + 3)/4 == (i2 + 3)/4 && ((i1 + 3)%4)/2 == ((i2 + 3)%4)/2)) {
3610 secp256k1_fe zr2;
3611 /* Normal doubling with Z ratio result. */
3612 secp256k1_gej_double_var(&resj, &gej[i1], &zr2);
3613 ge_equals_gej(&ref, &resj);
3614 /* Check Z ratio. */
3615 secp256k1_fe_mul(&zr2, &zr2, &gej[i1].z);
3616 CHECK(secp256k1_fe_equal_var(&zr2, &resj.z));
3617 /* Normal doubling. */
3618 secp256k1_gej_double_var(&resj, &gej[i2], NULL);
3619 ge_equals_gej(&ref, &resj);
3620 /* Constant-time doubling. */
3621 secp256k1_gej_double(&resj, &gej[i2]);
3622 ge_equals_gej(&ref, &resj);
3623 }
3624
3625 /* Test adding opposites. */
3626 if ((i1 == 0 && i2 == 0) || ((i1 + 3)/4 == (i2 + 3)/4 && ((i1 + 3)%4)/2 != ((i2 + 3)%4)/2)) {
3628 }
3629
3630 /* Test adding infinity. */
3631 if (i1 == 0) {
3634 ge_equals_gej(&ref, &gej[i2]);
3635 }
3636 if (i2 == 0) {
3639 ge_equals_gej(&ref, &gej[i1]);
3640 }
3641 }
3642 }
3643
3644 /* Test adding all points together in random order equals infinity. */
3645 {
3647 secp256k1_gej *gej_shuffled = (secp256k1_gej *)checked_malloc(&CTX->error_callback, (4 * runs + 1) * sizeof(secp256k1_gej));
3648 for (i = 0; i < 4 * runs + 1; i++) {
3649 gej_shuffled[i] = gej[i];
3650 }
3651 for (i = 0; i < 4 * runs + 1; i++) {
3652 int swap = i + secp256k1_testrand_int(4 * runs + 1 - i);
3653 if (swap != i) {
3654 secp256k1_gej t = gej_shuffled[i];
3655 gej_shuffled[i] = gej_shuffled[swap];
3656 gej_shuffled[swap] = t;
3657 }
3658 }
3659 for (i = 0; i < 4 * runs + 1; i++) {
3660 secp256k1_gej_add_var(&sum, &sum, &gej_shuffled[i], NULL);
3661 }
3663 free(gej_shuffled);
3664 }
3665
3666 /* Test batch gej -> ge conversion without known z ratios. */
3667 {
3668 secp256k1_ge *ge_set_all = (secp256k1_ge *)checked_malloc(&CTX->error_callback, (4 * runs + 1) * sizeof(secp256k1_ge));
3669 secp256k1_ge_set_all_gej_var(ge_set_all, gej, 4 * runs + 1);
3670 for (i = 0; i < 4 * runs + 1; i++) {
3671 secp256k1_fe s;
3673 secp256k1_gej_rescale(&gej[i], &s);
3674 ge_equals_gej(&ge_set_all[i], &gej[i]);
3675 }
3676 free(ge_set_all);
3677 }
3678
3679 /* Test batch gej -> ge conversion with many infinities. */
3680 for (i = 0; i < 4 * runs + 1; i++) {
3681 int odd;
3683 odd = secp256k1_fe_is_odd(&ge[i].x);
3684 CHECK(odd == 0 || odd == 1);
3685 /* randomly set half the points to infinity */
3686 if (odd == i % 2) {
3688 }
3689 secp256k1_gej_set_ge(&gej[i], &ge[i]);
3690 }
3691 /* batch convert */
3692 secp256k1_ge_set_all_gej_var(ge, gej, 4 * runs + 1);
3693 /* check result */
3694 for (i = 0; i < 4 * runs + 1; i++) {
3695 ge_equals_gej(&ge[i], &gej[i]);
3696 }
3697
3698 /* Test batch gej -> ge conversion with all infinities. */
3699 for (i = 0; i < 4 * runs + 1; i++) {
3701 }
3702 /* batch convert */
3703 secp256k1_ge_set_all_gej_var(ge, gej, 4 * runs + 1);
3704 /* check result */
3705 for (i = 0; i < 4 * runs + 1; i++) {
3707 }
3708
3709 free(ge);
3710 free(gej);
3711}
3712
3713
3715 secp256k1_ge p;
3716 secp256k1_gej pj, npj, infj1, infj2, infj3;
3717 secp256k1_fe zinv;
3718
3719 /* Test that adding P+(-P) results in a fully initialized infinity*/
3721 secp256k1_gej_set_ge(&pj, &p);
3722 secp256k1_gej_neg(&npj, &pj);
3723
3724 secp256k1_gej_add_var(&infj1, &pj, &npj, NULL);
3726 CHECK(secp256k1_fe_is_zero(&infj1.x));
3727 CHECK(secp256k1_fe_is_zero(&infj1.y));
3728 CHECK(secp256k1_fe_is_zero(&infj1.z));
3729
3730 secp256k1_gej_add_ge_var(&infj2, &npj, &p, NULL);
3732 CHECK(secp256k1_fe_is_zero(&infj2.x));
3733 CHECK(secp256k1_fe_is_zero(&infj2.y));
3734 CHECK(secp256k1_fe_is_zero(&infj2.z));
3735
3736 secp256k1_fe_set_int(&zinv, 1);
3737 secp256k1_gej_add_zinv_var(&infj3, &npj, &p, &zinv);
3739 CHECK(secp256k1_fe_is_zero(&infj3.x));
3740 CHECK(secp256k1_fe_is_zero(&infj3.y));
3741 CHECK(secp256k1_fe_is_zero(&infj3.z));
3742
3743
3744}
3745
3747 /* The point of this test is to check that we can add two points
3748 * whose y-coordinates are negatives of each other but whose x
3749 * coordinates differ. If the x-coordinates were the same, these
3750 * points would be negatives of each other and their sum is
3751 * infinity. This is cool because it "covers up" any degeneracy
3752 * in the addition algorithm that would cause the xy coordinates
3753 * of the sum to be wrong (since infinity has no xy coordinates).
3754 * HOWEVER, if the x-coordinates are different, infinity is the
3755 * wrong answer, and such degeneracies are exposed. This is the
3756 * root of https://github.com/bitcoin-core/secp256k1/issues/257
3757 * which this test is a regression test for.
3758 *
3759 * These points were generated in sage as
3760 * # secp256k1 params
3761 * F = FiniteField (0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F)
3762 * C = EllipticCurve ([F (0), F (7)])
3763 * G = C.lift_x(0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798)
3764 * N = FiniteField(G.order())
3765 *
3766 * # endomorphism values (lambda is 1^{1/3} in N, beta is 1^{1/3} in F)
3767 * x = polygen(N)
3768 * lam = (1 - x^3).roots()[1][0]
3769 *
3770 * # random "bad pair"
3771 * P = C.random_element()
3772 * Q = -int(lam) * P
3773 * print " P: %x %x" % P.xy()
3774 * print " Q: %x %x" % Q.xy()
3775 * print "P + Q: %x %x" % (P + Q).xy()
3776 */
3778 0x8d24cd95, 0x0a355af1, 0x3c543505, 0x44238d30,
3779 0x0643d79f, 0x05a59614, 0x2f8ec030, 0xd58977cb,
3780 0x001e337a, 0x38093dcd, 0x6c0f386d, 0x0b1293a8,
3781 0x4d72c879, 0xd7681924, 0x44e6d2f3, 0x9190117d
3782 );
3784 0xc7b74206, 0x1f788cd9, 0xabd0937d, 0x164a0d86,
3785 0x95f6ff75, 0xf19a4ce9, 0xd013bd7b, 0xbf92d2a7,
3786 0xffe1cc85, 0xc7f6c232, 0x93f0c792, 0xf4ed6c57,
3787 0xb28d3786, 0x2897e6db, 0xbb192d0b, 0x6e6feab2
3788 );
3790 0x671a63c0, 0x3efdad4c, 0x389a7798, 0x24356027,
3791 0xb3d69010, 0x278625c3, 0x5c86d390, 0x184a8f7a,
3792 0x5f6409c2, 0x2ce01f2b, 0x511fd375, 0x25071d08,
3793 0xda651801, 0x70e95caf, 0x8f0d893c, 0xbed8fbbe
3794 );
3795 secp256k1_ge b;
3796 secp256k1_gej resj;
3797 secp256k1_ge res;
3798 secp256k1_ge_set_gej(&b, &bj);
3799
3800 secp256k1_gej_add_var(&resj, &aj, &bj, NULL);
3801 secp256k1_ge_set_gej(&res, &resj);
3802 ge_equals_gej(&res, &sumj);
3803
3804 secp256k1_gej_add_ge(&resj, &aj, &b);
3805 secp256k1_ge_set_gej(&res, &resj);
3806 ge_equals_gej(&res, &sumj);
3807
3808 secp256k1_gej_add_ge_var(&resj, &aj, &b, NULL);
3809 secp256k1_ge_set_gej(&res, &resj);
3810 ge_equals_gej(&res, &sumj);
3811}
3812
3813void run_ge(void) {
3814 int i;
3815 for (i = 0; i < COUNT * 32; i++) {
3816 test_ge();
3817 }
3820}
3821
3823 secp256k1_gej t = *a;
3824 secp256k1_gej_cmov(&t, b, 0);
3825 CHECK(gej_xyz_equals_gej(&t, a));
3826 secp256k1_gej_cmov(&t, b, 1);
3827 CHECK(gej_xyz_equals_gej(&t, b));
3828}
3829
3830void run_gej(void) {
3831 int i;
3832 secp256k1_gej a, b;
3833
3834 /* Tests for secp256k1_gej_cmov */
3835 for (i = 0; i < COUNT; i++) {
3838 test_gej_cmov(&a, &b);
3839
3840 random_gej_test(&a);
3841 test_gej_cmov(&a, &b);
3842 test_gej_cmov(&b, &a);
3843
3844 b = a;
3845 test_gej_cmov(&a, &b);
3846
3847 random_gej_test(&b);
3848 test_gej_cmov(&a, &b);
3849 test_gej_cmov(&b, &a);
3850 }
3851
3852 /* Tests for secp256k1_gej_eq_var */
3853 for (i = 0; i < COUNT; i++) {
3854 secp256k1_fe fe;
3855 random_gej_test(&a);
3856 random_gej_test(&b);
3857 CHECK(!secp256k1_gej_eq_var(&a, &b));
3858
3859 b = a;
3861 if (secp256k1_fe_is_zero(&fe)) {
3862 continue;
3863 }
3864 secp256k1_gej_rescale(&a, &fe);
3865 CHECK(secp256k1_gej_eq_var(&a, &b));
3866 }
3867}
3868
3870 secp256k1_scalar sum = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0);
3871 secp256k1_pubkey data[6];
3872 const secp256k1_pubkey* d[6];
3874 secp256k1_pubkey sd2;
3875 secp256k1_gej Qj;
3876 secp256k1_ge Q;
3877 int i;
3878 for (i = 1; i <= 6; i++) {
3883 secp256k1_ge_set_gej(&Q, &Qj);
3884 secp256k1_pubkey_save(&data[i - 1], &Q);
3885 d[i - 1] = &data[i - 1];
3887 secp256k1_ge_set_gej(&Q, &Qj);
3888 secp256k1_pubkey_save(&sd, &Q);
3889 CHECK(secp256k1_ec_pubkey_combine(CTX, &sd2, d, i) == 1);
3890 CHECK(secp256k1_memcmp_var(&sd, &sd2, sizeof(sd)) == 0);
3891 }
3892}
3893
3894void run_ec_combine(void) {
3895 int i;
3896 for (i = 0; i < COUNT * 8; i++) {
3898 }
3899}
3900
3902 /* The input itself, normalized. */
3903 secp256k1_fe fex = *x;
3904 secp256k1_fe fez;
3905 /* Results of set_xquad_var, set_xo_var(..., 0), set_xo_var(..., 1). */
3906 secp256k1_ge ge_quad, ge_even, ge_odd;
3907 secp256k1_gej gej_quad;
3908 /* Return values of the above calls. */
3909 int res_quad, res_even, res_odd;
3910
3912
3913 res_quad = secp256k1_ge_set_xquad(&ge_quad, &fex);
3914 res_even = secp256k1_ge_set_xo_var(&ge_even, &fex, 0);
3915 res_odd = secp256k1_ge_set_xo_var(&ge_odd, &fex, 1);
3916
3917 CHECK(res_quad == res_even);
3918 CHECK(res_quad == res_odd);
3919
3920 if (res_quad) {
3921 secp256k1_fe_normalize_var(&ge_quad.x);
3923 secp256k1_fe_normalize_var(&ge_even.x);
3924 secp256k1_fe_normalize_var(&ge_quad.y);
3926 secp256k1_fe_normalize_var(&ge_even.y);
3927
3928 /* No infinity allowed. */
3929 CHECK(!ge_quad.infinity);
3930 CHECK(!ge_even.infinity);
3931 CHECK(!ge_odd.infinity);
3932
3933 /* Check that the x coordinates check out. */
3934 CHECK(secp256k1_fe_equal_var(&ge_quad.x, x));
3935 CHECK(secp256k1_fe_equal_var(&ge_even.x, x));
3936 CHECK(secp256k1_fe_equal_var(&ge_odd.x, x));
3937
3938 /* Check that the Y coordinate result in ge_quad is a square. */
3939 CHECK(secp256k1_fe_is_quad_var(&ge_quad.y));
3940
3941 /* Check odd/even Y in ge_odd, ge_even. */
3942 CHECK(secp256k1_fe_is_odd(&ge_odd.y));
3943 CHECK(!secp256k1_fe_is_odd(&ge_even.y));
3944
3945 /* Check secp256k1_gej_has_quad_y_var. */
3946 secp256k1_gej_set_ge(&gej_quad, &ge_quad);
3948 do {
3949 random_fe_test(&fez);
3950 } while (secp256k1_fe_is_zero(&fez));
3951 secp256k1_gej_rescale(&gej_quad, &fez);
3953 secp256k1_gej_neg(&gej_quad, &gej_quad);
3955 do {
3956 random_fe_test(&fez);
3957 } while (secp256k1_fe_is_zero(&fez));
3958 secp256k1_gej_rescale(&gej_quad, &fez);
3960 secp256k1_gej_neg(&gej_quad, &gej_quad);
3962 }
3963}
3964
3966 int i;
3967 for (i = 0; i < COUNT * 4; i++) {
3968 secp256k1_fe fe;
3969 random_fe_test(&fe);
3971 }
3972}
3973
3974/***** ECMULT TESTS *****/
3975
3976void test_pre_g_table(const secp256k1_ge_storage * pre_g, size_t n) {
3977 /* Tests the pre_g / pre_g_128 tables for consistency.
3978 * For independent verification we take a "geometric" approach to verification.
3979 * We check that every entry is on-curve.
3980 * We check that for consecutive entries p and q, that p + gg - q = 0 by checking
3981 * (1) p, gg, and -q are colinear.
3982 * (2) p, gg, and -q are all distinct.
3983 * where gg is twice the generator, where the generator is the first table entry.
3984 *
3985 * Checking the table's generators are correct is done in run_ecmult_pre_g.
3986 */
3987 secp256k1_gej g2;
3988 secp256k1_ge p, q, gg;
3989 secp256k1_fe dpx, dpy, dqx, dqy;
3990 size_t i;
3991
3992 CHECK(0 < n);
3993
3994 secp256k1_ge_from_storage(&p, &pre_g[0]);
3996
3997 secp256k1_gej_set_ge(&g2, &p);
3998 secp256k1_gej_double_var(&g2, &g2, NULL);
3999 secp256k1_ge_set_gej_var(&gg, &g2);
4000 for (i = 1; i < n; ++i) {
4001 secp256k1_fe_negate(&dpx, &p.x, 1); secp256k1_fe_add(&dpx, &gg.x); secp256k1_fe_normalize_weak(&dpx);
4002 secp256k1_fe_negate(&dpy, &p.y, 1); secp256k1_fe_add(&dpy, &gg.y); secp256k1_fe_normalize_weak(&dpy);
4003 /* Check that p is not equal to gg */
4005
4006 secp256k1_ge_from_storage(&q, &pre_g[i]);
4008
4009 secp256k1_fe_negate(&dqx, &q.x, 1); secp256k1_fe_add(&dqx, &gg.x); secp256k1_fe_normalize_weak(&dqx);
4010 dqy = q.y; secp256k1_fe_add(&dqy, &gg.y); secp256k1_fe_normalize_weak(&dqy);
4011 /* Check that -q is not equal to gg */
4013
4014 /* Check that -q is not equal to p */
4015 CHECK(!secp256k1_fe_equal_var(&dpx, &dqx) || !secp256k1_fe_equal_var(&dpy, &dqy));
4016
4017 /* Check that p, -q and gg are colinear */
4018 secp256k1_fe_mul(&dpx, &dpx, &dqy);
4019 secp256k1_fe_mul(&dpy, &dpy, &dqx);
4020 CHECK(secp256k1_fe_equal_var(&dpx, &dpy));
4021
4022 p = q;
4023 }
4024}
4025
4028 secp256k1_gej gj;
4029 secp256k1_ge g;
4030 size_t i;
4031
4032 /* Check that the pre_g and pre_g_128 tables are consistent. */
4035
4036 /* Check the first entry from the pre_g table. */
4038 CHECK(secp256k1_memcmp_var(&gs, &secp256k1_pre_g[0], sizeof(gs)) == 0);
4039
4040 /* Check the first entry from the pre_g_128 table. */
4042 for (i = 0; i < 128; ++i) {
4043 secp256k1_gej_double_var(&gj, &gj, NULL);
4044 }
4045 secp256k1_ge_set_gej(&g, &gj);
4046 secp256k1_ge_to_storage(&gs, &g);
4047 CHECK(secp256k1_memcmp_var(&gs, &secp256k1_pre_g_128[0], sizeof(gs)) == 0);
4048}
4049
4051 /* random starting point A (on the curve) */
4053 0x8b30bbe9, 0xae2a9906, 0x96b22f67, 0x0709dff3,
4054 0x727fd8bc, 0x04d3362c, 0x6c7bf458, 0xe2846004,
4055 0xa357ae91, 0x5c4a6528, 0x1309edf2, 0x0504740f,
4056 0x0eb33439, 0x90216b4f, 0x81063cb6, 0x5f2f7e0f
4057 );
4058 /* two random initial factors xn and gn */
4060 0x84cc5452, 0xf7fde1ed, 0xb4d38a8c, 0xe9b1b84c,
4061 0xcef31f14, 0x6e569be9, 0x705d357a, 0x42985407
4062 );
4064 0xa1e58d22, 0x553dcd42, 0xb2398062, 0x5d4c57a9,
4065 0x6e9323d4, 0x2b3152e5, 0xca2c3990, 0xedc7c9de
4066 );
4067 /* two small multipliers to be applied to xn and gn in every iteration: */
4068 static const secp256k1_scalar xf = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0x1337);
4069 static const secp256k1_scalar gf = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0x7113);
4070 /* accumulators with the resulting coefficients to A and G */
4071 secp256k1_scalar ae = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1);
4072 secp256k1_scalar ge = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0);
4073 /* actual points */
4074 secp256k1_gej x;
4075 secp256k1_gej x2;
4076 int i;
4077
4078 /* the point being computed */
4079 x = a;
4080 for (i = 0; i < 200*COUNT; i++) {
4081 /* in each iteration, compute X = xn*X + gn*G; */
4082 secp256k1_ecmult(&x, &x, &xn, &gn);
4083 /* also compute ae and ge: the actual accumulated factors for A and G */
4084 /* if X was (ae*A+ge*G), xn*X + gn*G results in (xn*ae*A + (xn*ge+gn)*G) */
4085 secp256k1_scalar_mul(&ae, &ae, &xn);
4086 secp256k1_scalar_mul(&ge, &ge, &xn);
4087 secp256k1_scalar_add(&ge, &ge, &gn);
4088 /* modify xn and gn */
4089 secp256k1_scalar_mul(&xn, &xn, &xf);
4090 secp256k1_scalar_mul(&gn, &gn, &gf);
4091
4092 /* verify */
4093 if (i == 19999) {
4094 /* expected result after 19999 iterations */
4096 0xD6E96687, 0xF9B10D09, 0x2A6F3543, 0x9D86CEBE,
4097 0xA4535D0D, 0x409F5358, 0x6440BD74, 0xB933E830,
4098 0xB95CBCA2, 0xC77DA786, 0x539BE8FD, 0x53354D2D,
4099 0x3B4F566A, 0xE6580454, 0x07ED6015, 0xEE1B2A88
4100 );
4101 CHECK(secp256k1_gej_eq_var(&rp, &x));
4102 }
4103 }
4104 /* redo the computation, but directly with the resulting ae and ge coefficients: */
4105 secp256k1_ecmult(&x2, &a, &ae, &ge);
4106 CHECK(secp256k1_gej_eq_var(&x, &x2));
4107}
4108
4110 /* X * (point + G) + (order-X) * (pointer + G) = 0 */
4113 secp256k1_scalar zero = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0);
4114 secp256k1_scalar one = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1);
4115 secp256k1_gej res1, res2;
4116 secp256k1_ge res3;
4117 unsigned char pub[65];
4118 size_t psize = 65;
4120 secp256k1_scalar_negate(&nx, &x);
4121 secp256k1_ecmult(&res1, point, &x, &x); /* calc res1 = x * point + x * G; */
4122 secp256k1_ecmult(&res2, point, &nx, &nx); /* calc res2 = (order - x) * point + (order - x) * G; */
4123 secp256k1_gej_add_var(&res1, &res1, &res2, NULL);
4125 secp256k1_ge_set_gej(&res3, &res1);
4127 CHECK(secp256k1_ge_is_valid_var(&res3) == 0);
4128 CHECK(secp256k1_eckey_pubkey_serialize(&res3, pub, &psize, 0) == 0);
4129 psize = 65;
4130 CHECK(secp256k1_eckey_pubkey_serialize(&res3, pub, &psize, 1) == 0);
4131 /* check zero/one edge cases */
4132 secp256k1_ecmult(&res1, point, &zero, &zero);
4133 secp256k1_ge_set_gej(&res3, &res1);
4135 secp256k1_ecmult(&res1, point, &one, &zero);
4136 secp256k1_ge_set_gej(&res3, &res1);
4137 ge_equals_gej(&res3, point);
4138 secp256k1_ecmult(&res1, point, &zero, &one);
4139 secp256k1_ge_set_gej(&res3, &res1);
4141}
4142
4143/* These scalars reach large (in absolute value) outputs when fed to secp256k1_scalar_split_lambda.
4144 *
4145 * They are computed as:
4146 * - For a in [-2, -1, 0, 1, 2]:
4147 * - For b in [-3, -1, 1, 3]:
4148 * - Output (a*LAMBDA + (ORDER+b)/2) % ORDER
4149 */
4151 SECP256K1_SCALAR_CONST(0xd938a566, 0x7f479e3e, 0xb5b3c7fa, 0xefdb3749, 0x3aa0585c, 0xc5ea2367, 0xe1b660db, 0x0209e6fc),
4152 SECP256K1_SCALAR_CONST(0xd938a566, 0x7f479e3e, 0xb5b3c7fa, 0xefdb3749, 0x3aa0585c, 0xc5ea2367, 0xe1b660db, 0x0209e6fd),
4153 SECP256K1_SCALAR_CONST(0xd938a566, 0x7f479e3e, 0xb5b3c7fa, 0xefdb3749, 0x3aa0585c, 0xc5ea2367, 0xe1b660db, 0x0209e6fe),
4154 SECP256K1_SCALAR_CONST(0xd938a566, 0x7f479e3e, 0xb5b3c7fa, 0xefdb3749, 0x3aa0585c, 0xc5ea2367, 0xe1b660db, 0x0209e6ff),
4155 SECP256K1_SCALAR_CONST(0x2c9c52b3, 0x3fa3cf1f, 0x5ad9e3fd, 0x77ed9ba5, 0xb294b893, 0x3722e9a5, 0x00e698ca, 0x4cf7632d),
4156 SECP256K1_SCALAR_CONST(0x2c9c52b3, 0x3fa3cf1f, 0x5ad9e3fd, 0x77ed9ba5, 0xb294b893, 0x3722e9a5, 0x00e698ca, 0x4cf7632e),
4157 SECP256K1_SCALAR_CONST(0x2c9c52b3, 0x3fa3cf1f, 0x5ad9e3fd, 0x77ed9ba5, 0xb294b893, 0x3722e9a5, 0x00e698ca, 0x4cf7632f),
4158 SECP256K1_SCALAR_CONST(0x2c9c52b3, 0x3fa3cf1f, 0x5ad9e3fd, 0x77ed9ba5, 0xb294b893, 0x3722e9a5, 0x00e698ca, 0x4cf76330),
4159 SECP256K1_SCALAR_CONST(0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xd576e735, 0x57a4501d, 0xdfe92f46, 0x681b209f),
4160 SECP256K1_SCALAR_CONST(0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xd576e735, 0x57a4501d, 0xdfe92f46, 0x681b20a0),
4161 SECP256K1_SCALAR_CONST(0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xd576e735, 0x57a4501d, 0xdfe92f46, 0x681b20a1),
4162 SECP256K1_SCALAR_CONST(0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xd576e735, 0x57a4501d, 0xdfe92f46, 0x681b20a2),
4163 SECP256K1_SCALAR_CONST(0xd363ad4c, 0xc05c30e0, 0xa5261c02, 0x88126459, 0xf85915d7, 0x7825b696, 0xbeebc5c2, 0x833ede11),
4164 SECP256K1_SCALAR_CONST(0xd363ad4c, 0xc05c30e0, 0xa5261c02, 0x88126459, 0xf85915d7, 0x7825b696, 0xbeebc5c2, 0x833ede12),
4165 SECP256K1_SCALAR_CONST(0xd363ad4c, 0xc05c30e0, 0xa5261c02, 0x88126459, 0xf85915d7, 0x7825b696, 0xbeebc5c2, 0x833ede13),
4166 SECP256K1_SCALAR_CONST(0xd363ad4c, 0xc05c30e0, 0xa5261c02, 0x88126459, 0xf85915d7, 0x7825b696, 0xbeebc5c2, 0x833ede14),
4167 SECP256K1_SCALAR_CONST(0x26c75a99, 0x80b861c1, 0x4a4c3805, 0x1024c8b4, 0x704d760e, 0xe95e7cd3, 0xde1bfdb1, 0xce2c5a42),
4168 SECP256K1_SCALAR_CONST(0x26c75a99, 0x80b861c1, 0x4a4c3805, 0x1024c8b4, 0x704d760e, 0xe95e7cd3, 0xde1bfdb1, 0xce2c5a43),
4169 SECP256K1_SCALAR_CONST(0x26c75a99, 0x80b861c1, 0x4a4c3805, 0x1024c8b4, 0x704d760e, 0xe95e7cd3, 0xde1bfdb1, 0xce2c5a44),
4170 SECP256K1_SCALAR_CONST(0x26c75a99, 0x80b861c1, 0x4a4c3805, 0x1024c8b4, 0x704d760e, 0xe95e7cd3, 0xde1bfdb1, 0xce2c5a45)
4171};
4172
4173void test_ecmult_target(const secp256k1_scalar* target, int mode) {
4174 /* Mode: 0=ecmult_gen, 1=ecmult, 2=ecmult_const */
4175 secp256k1_scalar n1, n2;
4176 secp256k1_ge p;
4177 secp256k1_gej pj, p1j, p2j, ptj;
4178 static const secp256k1_scalar zero = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0);
4179
4180 /* Generate random n1,n2 such that n1+n2 = -target. */
4182 secp256k1_scalar_add(&n2, &n1, target);
4183 secp256k1_scalar_negate(&n2, &n2);
4184
4185 /* Generate a random input point. */
4186 if (mode != 0) {
4188 secp256k1_gej_set_ge(&pj, &p);
4189 }
4190
4191 /* EC multiplications */
4192 if (mode == 0) {
4195 secp256k1_ecmult_gen(&CTX->ecmult_gen_ctx, &ptj, target);
4196 } else if (mode == 1) {
4197 secp256k1_ecmult(&p1j, &pj, &n1, &zero);
4198 secp256k1_ecmult(&p2j, &pj, &n2, &zero);
4199 secp256k1_ecmult(&ptj, &pj, target, &zero);
4200 } else {
4201 secp256k1_ecmult_const(&p1j, &p, &n1, 256);
4202 secp256k1_ecmult_const(&p2j, &p, &n2, 256);
4203 secp256k1_ecmult_const(&ptj, &p, target, 256);
4204 }
4205
4206 /* Add them all up: n1*P + n2*P + target*P = (n1+n2+target)*P = (n1+n1-n1-n2)*P = 0. */
4207 secp256k1_gej_add_var(&ptj, &ptj, &p1j, NULL);
4208 secp256k1_gej_add_var(&ptj, &ptj, &p2j, NULL);
4210}
4211
4213 int i;
4214 unsigned j;
4215 for (i = 0; i < 4*COUNT; ++i) {
4216 for (j = 0; j < sizeof(scalars_near_split_bounds) / sizeof(scalars_near_split_bounds[0]); ++j) {
4220 }
4221 }
4222}
4223
4225 int i;
4226 secp256k1_fe x = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 2);
4227 static const secp256k1_fe xr = SECP256K1_FE_CONST(
4228 0x7603CB59, 0xB0EF6C63, 0xFE608479, 0x2A0C378C,
4229 0xDB3233A8, 0x0F8A9A09, 0xA877DEAD, 0x31B38C45
4230 );
4231 for (i = 0; i < 500; i++) {
4232 secp256k1_ge p;
4233 if (secp256k1_ge_set_xo_var(&p, &x, 1)) {
4234 secp256k1_gej j;
4236 secp256k1_gej_set_ge(&j, &p);
4238 }
4239 secp256k1_fe_sqr(&x, &x);
4240 }
4242 CHECK(secp256k1_fe_equal_var(&x, &xr));
4243}
4244
4246 /* random starting point A (on the curve) */
4248 0x6d986544, 0x57ff52b8, 0xcf1b8126, 0x5b802a5b,
4249 0xa97f9263, 0xb1e88044, 0x93351325, 0x91bc450a,
4250 0x535c59f7, 0x325e5d2b, 0xc391fbe8, 0x3c12787c,
4251 0x337e4a98, 0xe82a9011, 0x0123ba37, 0xdd769c7d
4252 );
4253 /* random initial factor xn */
4255 0x649d4f77, 0xc4242df7, 0x7f2079c9, 0x14530327,
4256 0xa31b876a, 0xd2d8ce2a, 0x2236d5c6, 0xd7b2029b
4257 );
4258 /* expected xn * A (from sage) */
4259 secp256k1_ge expected_b = SECP256K1_GE_CONST(
4260 0x23773684, 0x4d209dc7, 0x098a786f, 0x20d06fcd,
4261 0x070a38bf, 0xc11ac651, 0x03004319, 0x1e2a8786,
4262 0xed8c3b8e, 0xc06dd57b, 0xd06ea66e, 0x45492b0f,
4263 0xb84e4e1b, 0xfb77e21f, 0x96baae2a, 0x63dec956
4264 );
4265 secp256k1_gej b;
4266 secp256k1_ecmult_const(&b, &a, &xn, 256);
4267
4269 ge_equals_gej(&expected_b, &b);
4270}
4271
4275 secp256k1_gej res1;
4276 secp256k1_gej res2;
4277 secp256k1_ge mid1;
4278 secp256k1_ge mid2;
4281
4284 secp256k1_ge_set_gej(&mid1, &res1);
4285 secp256k1_ge_set_gej(&mid2, &res2);
4286 secp256k1_ecmult_const(&res1, &mid1, &b, 256);
4287 secp256k1_ecmult_const(&res2, &mid2, &a, 256);
4288 secp256k1_ge_set_gej(&mid1, &res1);
4289 secp256k1_ge_set_gej(&mid2, &res2);
4290 ge_equals_ge(&mid1, &mid2);
4291}
4292
4294 secp256k1_scalar zero = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0);
4295 secp256k1_scalar one = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1);
4296 secp256k1_scalar negone;
4297 secp256k1_gej res1;
4298 secp256k1_ge res2;
4299 secp256k1_ge point;
4300 secp256k1_scalar_negate(&negone, &one);
4301
4303 secp256k1_ecmult_const(&res1, &point, &zero, 3);
4304 secp256k1_ge_set_gej(&res2, &res1);
4306 secp256k1_ecmult_const(&res1, &point, &one, 2);
4307 secp256k1_ge_set_gej(&res2, &res1);
4308 ge_equals_ge(&res2, &point);
4309 secp256k1_ecmult_const(&res1, &point, &negone, 256);
4310 secp256k1_gej_neg(&res1, &res1);
4311 secp256k1_ge_set_gej(&res2, &res1);
4312 ge_equals_ge(&res2, &point);
4313}
4314
4316 /* Check known result (randomly generated test problem from sage) */
4318 0x4968d524, 0x2abf9b7a, 0x466abbcf, 0x34b11b6d,
4319 0xcd83d307, 0x827bed62, 0x05fad0ce, 0x18fae63b
4320 );
4321 const secp256k1_gej expected_point = SECP256K1_GEJ_CONST(
4322 0x5494c15d, 0x32099706, 0xc2395f94, 0x348745fd,
4323 0x757ce30e, 0x4e8c90fb, 0xa2bad184, 0xf883c69f,
4324 0x5d195d20, 0xe191bf7f, 0x1be3e55f, 0x56a80196,
4325 0x6071ad01, 0xf1462f66, 0xc997fa94, 0xdb858435
4326 );
4327 secp256k1_gej point;
4328 secp256k1_ge res;
4329 int i;
4330
4332 for (i = 0; i < 100; ++i) {
4333 secp256k1_ge tmp;
4334 secp256k1_ge_set_gej(&tmp, &point);
4335 secp256k1_ecmult_const(&point, &tmp, &scalar, 256);
4336 }
4337 secp256k1_ge_set_gej(&res, &point);
4338 ge_equals_gej(&res, &expected_point);
4339}
4340
4346}
4347
4348typedef struct {
4352
4353static int ecmult_multi_callback(secp256k1_scalar *sc, secp256k1_ge *pt, size_t idx, void *cbdata) {
4354 ecmult_multi_data *data = (ecmult_multi_data*) cbdata;
4355 *sc = data->sc[idx];
4356 *pt = data->pt[idx];
4357 return 1;
4358}
4359
4360static int ecmult_multi_false_callback(secp256k1_scalar *sc, secp256k1_ge *pt, size_t idx, void *cbdata) {
4361 (void)sc;
4362 (void)pt;
4363 (void)idx;
4364 (void)cbdata;
4365 return 0;
4366}
4367
4369 int ncount;
4370 secp256k1_scalar szero;
4371 secp256k1_scalar sc[32];
4372 secp256k1_ge pt[32];
4373 secp256k1_gej r;
4374 secp256k1_gej r2;
4375 ecmult_multi_data data;
4376
4377 data.sc = sc;
4378 data.pt = pt;
4379 secp256k1_scalar_set_int(&szero, 0);
4380
4381 /* No points to multiply */
4382 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, NULL, ecmult_multi_callback, &data, 0));
4383
4384 /* Check 1- and 2-point multiplies against ecmult */
4385 for (ncount = 0; ncount < COUNT; ncount++) {
4386 secp256k1_ge ptg;
4387 secp256k1_gej ptgj;
4388 random_scalar_order(&sc[0]);
4389 random_scalar_order(&sc[1]);
4390
4392 secp256k1_gej_set_ge(&ptgj, &ptg);
4393 pt[0] = ptg;
4394 pt[1] = secp256k1_ge_const_g;
4395
4396 /* only G scalar */
4397 secp256k1_ecmult(&r2, &ptgj, &szero, &sc[0]);
4398 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &sc[0], ecmult_multi_callback, &data, 0));
4399 CHECK(secp256k1_gej_eq_var(&r, &r2));
4400
4401 /* 1-point */
4402 secp256k1_ecmult(&r2, &ptgj, &sc[0], &szero);
4403 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &szero, ecmult_multi_callback, &data, 1));
4404 CHECK(secp256k1_gej_eq_var(&r, &r2));
4405
4406 /* Try to multiply 1 point, but callback returns false */
4407 CHECK(!ecmult_multi(&CTX->error_callback, scratch, &r, &szero, ecmult_multi_false_callback, &data, 1));
4408
4409 /* 2-point */
4410 secp256k1_ecmult(&r2, &ptgj, &sc[0], &sc[1]);
4411 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &szero, ecmult_multi_callback, &data, 2));
4412 CHECK(secp256k1_gej_eq_var(&r, &r2));
4413
4414 /* 2-point with G scalar */
4415 secp256k1_ecmult(&r2, &ptgj, &sc[0], &sc[1]);
4416 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &sc[1], ecmult_multi_callback, &data, 1));
4417 CHECK(secp256k1_gej_eq_var(&r, &r2));
4418 }
4419
4420 /* Check infinite outputs of various forms */
4421 for (ncount = 0; ncount < COUNT; ncount++) {
4422 secp256k1_ge ptg;
4423 size_t i, j;
4424 size_t sizes[] = { 2, 10, 32 };
4425
4426 for (j = 0; j < 3; j++) {
4427 for (i = 0; i < 32; i++) {
4428 random_scalar_order(&sc[i]);
4430 }
4431 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &szero, ecmult_multi_callback, &data, sizes[j]));
4433 }
4434
4435 for (j = 0; j < 3; j++) {
4436 for (i = 0; i < 32; i++) {
4438 pt[i] = ptg;
4439 secp256k1_scalar_set_int(&sc[i], 0);
4440 }
4441 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &szero, ecmult_multi_callback, &data, sizes[j]));
4443 }
4444
4445 for (j = 0; j < 3; j++) {
4447 for (i = 0; i < 16; i++) {
4448 random_scalar_order(&sc[2*i]);
4449 secp256k1_scalar_negate(&sc[2*i + 1], &sc[2*i]);
4450 pt[2 * i] = ptg;
4451 pt[2 * i + 1] = ptg;
4452 }
4453
4454 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &szero, ecmult_multi_callback, &data, sizes[j]));
4456
4457 random_scalar_order(&sc[0]);
4458 for (i = 0; i < 16; i++) {
4460
4461 sc[2*i] = sc[0];
4462 sc[2*i+1] = sc[0];
4463 pt[2 * i] = ptg;
4464 secp256k1_ge_neg(&pt[2*i+1], &pt[2*i]);
4465 }
4466
4467 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &szero, ecmult_multi_callback, &data, sizes[j]));
4469 }
4470
4472 secp256k1_scalar_set_int(&sc[0], 0);
4473 pt[0] = ptg;
4474 for (i = 1; i < 32; i++) {
4475 pt[i] = ptg;
4476
4477 random_scalar_order(&sc[i]);
4478 secp256k1_scalar_add(&sc[0], &sc[0], &sc[i]);
4479 secp256k1_scalar_negate(&sc[i], &sc[i]);
4480 }
4481
4482 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &szero, ecmult_multi_callback, &data, 32));
4484 }
4485
4486 /* Check random points, constant scalar */
4487 for (ncount = 0; ncount < COUNT; ncount++) {
4488 size_t i;
4490
4491 random_scalar_order(&sc[0]);
4492 for (i = 0; i < 20; i++) {
4493 secp256k1_ge ptg;
4494 sc[i] = sc[0];
4496 pt[i] = ptg;
4497 secp256k1_gej_add_ge_var(&r, &r, &pt[i], NULL);
4498 }
4499
4500 secp256k1_ecmult(&r2, &r, &sc[0], &szero);
4501 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &szero, ecmult_multi_callback, &data, 20));
4502 CHECK(secp256k1_gej_eq_var(&r, &r2));
4503 }
4504
4505 /* Check random scalars, constant point */
4506 for (ncount = 0; ncount < COUNT; ncount++) {
4507 size_t i;
4508 secp256k1_ge ptg;
4509 secp256k1_gej p0j;
4512
4514 for (i = 0; i < 20; i++) {
4515 random_scalar_order(&sc[i]);
4516 pt[i] = ptg;
4517 secp256k1_scalar_add(&rs, &rs, &sc[i]);
4518 }
4519
4520 secp256k1_gej_set_ge(&p0j, &pt[0]);
4521 secp256k1_ecmult(&r2, &p0j, &rs, &szero);
4522 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &szero, ecmult_multi_callback, &data, 20));
4523 CHECK(secp256k1_gej_eq_var(&r, &r2));
4524 }
4525
4526 /* Sanity check that zero scalars don't cause problems */
4527 for (ncount = 0; ncount < 20; ncount++) {
4528 random_scalar_order(&sc[ncount]);
4529 random_group_element_test(&pt[ncount]);
4530 }
4531 secp256k1_scalar_clear(&sc[0]);
4532 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &szero, ecmult_multi_callback, &data, 20));
4533 secp256k1_scalar_clear(&sc[1]);
4534 secp256k1_scalar_clear(&sc[2]);
4535 secp256k1_scalar_clear(&sc[3]);
4536 secp256k1_scalar_clear(&sc[4]);
4537 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &szero, ecmult_multi_callback, &data, 6));
4538 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &szero, ecmult_multi_callback, &data, 5));
4540
4541 /* Run through s0*(t0*P) + s1*(t1*P) exhaustively for many small values of s0, s1, t0, t1 */
4542 {
4543 const size_t TOP = 8;
4544 size_t s0i, s1i;
4545 size_t t0i, t1i;
4546 secp256k1_ge ptg;
4547 secp256k1_gej ptgj;
4548
4550 secp256k1_gej_set_ge(&ptgj, &ptg);
4551
4552 for(t0i = 0; t0i < TOP; t0i++) {
4553 for(t1i = 0; t1i < TOP; t1i++) {
4554 secp256k1_gej t0p, t1p;
4555 secp256k1_scalar t0, t1;
4556
4557 secp256k1_scalar_set_int(&t0, (t0i + 1) / 2);
4558 secp256k1_scalar_cond_negate(&t0, t0i & 1);
4559 secp256k1_scalar_set_int(&t1, (t1i + 1) / 2);
4560 secp256k1_scalar_cond_negate(&t1, t1i & 1);
4561
4562 secp256k1_ecmult(&t0p, &ptgj, &t0, &szero);
4563 secp256k1_ecmult(&t1p, &ptgj, &t1, &szero);
4564
4565 for(s0i = 0; s0i < TOP; s0i++) {
4566 for(s1i = 0; s1i < TOP; s1i++) {
4567 secp256k1_scalar tmp1, tmp2;
4568 secp256k1_gej expected, actual;
4569
4570 secp256k1_ge_set_gej(&pt[0], &t0p);
4571 secp256k1_ge_set_gej(&pt[1], &t1p);
4572
4573 secp256k1_scalar_set_int(&sc[0], (s0i + 1) / 2);
4574 secp256k1_scalar_cond_negate(&sc[0], s0i & 1);
4575 secp256k1_scalar_set_int(&sc[1], (s1i + 1) / 2);
4576 secp256k1_scalar_cond_negate(&sc[1], s1i & 1);
4577
4578 secp256k1_scalar_mul(&tmp1, &t0, &sc[0]);
4579 secp256k1_scalar_mul(&tmp2, &t1, &sc[1]);
4580 secp256k1_scalar_add(&tmp1, &tmp1, &tmp2);
4581
4582 secp256k1_ecmult(&expected, &ptgj, &tmp1, &szero);
4583 CHECK(ecmult_multi(&CTX->error_callback, scratch, &actual, &szero, ecmult_multi_callback, &data, 2));
4584 CHECK(secp256k1_gej_eq_var(&actual, &expected));
4585 }
4586 }
4587 }
4588 }
4589 }
4590}
4591
4593 /* Large random test for ecmult_multi_* functions which exercises:
4594 * - Few or many inputs (0 up to 128, roughly exponentially distributed).
4595 * - Few or many 0*P or a*INF inputs (roughly uniformly distributed).
4596 * - Including or excluding an nonzero a*G term (or such a term at all).
4597 * - Final expected result equal to infinity or not (roughly 50%).
4598 * - ecmult_multi_var, ecmult_strauss_single_batch, ecmult_pippenger_single_batch
4599 */
4600
4601 /* These 4 variables define the eventual input to the ecmult_multi function.
4602 * g_scalar is the G scalar fed to it (or NULL, possibly, if g_scalar=0), and
4603 * scalars[0..filled-1] and gejs[0..filled-1] are the scalars and points
4604 * which form its normal inputs. */
4605 int filled = 0;
4606 secp256k1_scalar g_scalar = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0);
4607 secp256k1_scalar scalars[128];
4608 secp256k1_gej gejs[128];
4609 /* The expected result, and the computed result. */
4610 secp256k1_gej expected, computed;
4611 /* Temporaries. */
4612 secp256k1_scalar sc_tmp;
4613 secp256k1_ge ge_tmp;
4614 /* Variables needed for the actual input to ecmult_multi. */
4615 secp256k1_ge ges[128];
4616 ecmult_multi_data data;
4617
4618 int i;
4619 /* Which multiplication function to use */
4620 int fn = secp256k1_testrand_int(3);
4624 /* Simulate exponentially distributed num. */
4625 int num_bits = 2 + secp256k1_testrand_int(6);
4626 /* Number of (scalar, point) inputs (excluding g). */
4627 int num = secp256k1_testrand_int((1 << num_bits) + 1);
4628 /* Number of those which are nonzero. */
4629 int num_nonzero = secp256k1_testrand_int(num + 1);
4630 /* Whether we're aiming to create an input with nonzero expected result. */
4631 int nonzero_result = secp256k1_testrand_bits(1);
4632 /* Whether we will provide nonzero g multiplicand. In some cases our hand
4633 * is forced here based on num_nonzero and nonzero_result. */
4634 int g_nonzero = num_nonzero == 0 ? nonzero_result :
4635 num_nonzero == 1 && !nonzero_result ? 1 :
4637 /* Which g_scalar pointer to pass into ecmult_multi(). */
4638 const secp256k1_scalar* g_scalar_ptr = (g_nonzero || secp256k1_testrand_bits(1)) ? &g_scalar : NULL;
4639 /* How many EC multiplications were performed in this function. */
4640 int mults = 0;
4641 /* How many randomization steps to apply to the input list. */
4642 int rands = (int)secp256k1_testrand_bits(3);
4643 if (rands > num_nonzero) rands = num_nonzero;
4644
4645 secp256k1_gej_set_infinity(&expected);
4647 secp256k1_scalar_set_int(&scalars[0], 0);
4648
4649 if (g_nonzero) {
4650 /* If g_nonzero, set g_scalar to nonzero value r. */
4651 random_scalar_order_test(&g_scalar);
4652 if (!nonzero_result) {
4653 /* If expected=0 is desired, add a (a*r, -(1/a)*g) term to compensate. */
4654 CHECK(num_nonzero > filled);
4655 random_scalar_order_test(&sc_tmp);
4656 secp256k1_scalar_mul(&scalars[filled], &sc_tmp, &g_scalar);
4657 secp256k1_scalar_inverse_var(&sc_tmp, &sc_tmp);
4658 secp256k1_scalar_negate(&sc_tmp, &sc_tmp);
4659 secp256k1_ecmult_gen(&CTX->ecmult_gen_ctx, &gejs[filled], &sc_tmp);
4660 ++filled;
4661 ++mults;
4662 }
4663 }
4664
4665 if (nonzero_result && filled < num_nonzero) {
4666 /* If a nonzero result is desired, and there is space, add a random nonzero term. */
4667 random_scalar_order_test(&scalars[filled]);
4669 secp256k1_gej_set_ge(&gejs[filled], &ge_tmp);
4670 ++filled;
4671 }
4672
4673 if (nonzero_result) {
4674 /* Compute the expected result using normal ecmult. */
4675 CHECK(filled <= 1);
4676 secp256k1_ecmult(&expected, &gejs[0], &scalars[0], &g_scalar);
4677 mults += filled + g_nonzero;
4678 }
4679
4680 /* At this point we have expected = scalar_g*G + sum(scalars[i]*gejs[i] for i=0..filled-1). */
4681 CHECK(filled <= 1 + !nonzero_result);
4682 CHECK(filled <= num_nonzero);
4683
4684 /* Add entries to scalars,gejs so that there are num of them. All the added entries
4685 * either have scalar=0 or point=infinity, so these do not change the expected result. */
4686 while (filled < num) {
4687 if (secp256k1_testrand_bits(1)) {
4688 secp256k1_gej_set_infinity(&gejs[filled]);
4689 random_scalar_order_test(&scalars[filled]);
4690 } else {
4691 secp256k1_scalar_set_int(&scalars[filled], 0);
4693 secp256k1_gej_set_ge(&gejs[filled], &ge_tmp);
4694 }
4695 ++filled;
4696 }
4697
4698 /* Now perform cheapish transformations on gejs and scalars, for indices
4699 * 0..num_nonzero-1, which do not change the expected result, but may
4700 * convert some of them to be both non-0-scalar and non-infinity-point. */
4701 for (i = 0; i < rands; ++i) {
4702 int j;
4703 secp256k1_scalar v, iv;
4704 /* Shuffle the entries. */
4705 for (j = 0; j < num_nonzero; ++j) {
4706 int k = secp256k1_testrand_int(num_nonzero - j);
4707 if (k != 0) {
4708 secp256k1_gej gej = gejs[j];
4709 secp256k1_scalar sc = scalars[j];
4710 gejs[j] = gejs[j + k];
4711 scalars[j] = scalars[j + k];
4712 gejs[j + k] = gej;
4713 scalars[j + k] = sc;
4714 }
4715 }
4716 /* Perturb all consecutive pairs of inputs:
4717 * a*P + b*Q -> (a+b)*P + b*(Q-P). */
4718 for (j = 0; j + 1 < num_nonzero; j += 2) {
4719 secp256k1_gej gej;
4720 secp256k1_scalar_add(&scalars[j], &scalars[j], &scalars[j+1]);
4721 secp256k1_gej_neg(&gej, &gejs[j]);
4722 secp256k1_gej_add_var(&gejs[j+1], &gejs[j+1], &gej, NULL);
4723 }
4724 /* Transform the last input: a*P -> (v*a) * ((1/v)*P). */
4725 CHECK(num_nonzero >= 1);
4727 secp256k1_scalar_inverse(&iv, &v);
4728 secp256k1_scalar_mul(&scalars[num_nonzero - 1], &scalars[num_nonzero - 1], &v);
4729 secp256k1_ecmult(&gejs[num_nonzero - 1], &gejs[num_nonzero - 1], &iv, NULL);
4730 ++mults;
4731 }
4732
4733 /* Shuffle all entries (0..num-1). */
4734 for (i = 0; i < num; ++i) {
4735 int j = secp256k1_testrand_int(num - i);
4736 if (j != 0) {
4737 secp256k1_gej gej = gejs[i];
4738 secp256k1_scalar sc = scalars[i];
4739 gejs[i] = gejs[i + j];
4740 scalars[i] = scalars[i + j];
4741 gejs[i + j] = gej;
4742 scalars[i + j] = sc;
4743 }
4744 }
4745
4746 /* Compute affine versions of all inputs. */
4747 secp256k1_ge_set_all_gej_var(ges, gejs, filled);
4748 /* Invoke ecmult_multi code. */
4749 data.sc = scalars;
4750 data.pt = ges;
4751 CHECK(ecmult_multi(&CTX->error_callback, scratch, &computed, g_scalar_ptr, ecmult_multi_callback, &data, filled));
4752 mults += num_nonzero + g_nonzero;
4753 /* Compare with expected result. */
4754 CHECK(secp256k1_gej_eq_var(&computed, &expected));
4755 return mults;
4756}
4757
4759 secp256k1_scalar szero;
4761 secp256k1_ge pt;
4762 secp256k1_gej r;
4763 ecmult_multi_data data;
4764 secp256k1_scratch *scratch_empty;
4765
4768 data.sc = &sc;
4769 data.pt = &pt;
4770 secp256k1_scalar_set_int(&szero, 0);
4771
4772 /* Try to multiply 1 point, but scratch space is empty.*/
4773 scratch_empty = secp256k1_scratch_create(&CTX->error_callback, 0);
4774 CHECK(!ecmult_multi(&CTX->error_callback, scratch_empty, &r, &szero, ecmult_multi_callback, &data, 1));
4776}
4777
4779 int i;
4780
4782 for(i = 1; i <= PIPPENGER_MAX_BUCKET_WINDOW; i++) {
4783 /* Bucket_window of 8 is not used with endo */
4784 if (i == 8) {
4785 continue;
4786 }
4788 if (i != PIPPENGER_MAX_BUCKET_WINDOW) {
4790 }
4791 }
4792}
4793
4799 size_t scratch_size = secp256k1_testrand_bits(8);
4801 secp256k1_scratch *scratch;
4802 size_t n_points_supported;
4803 int bucket_window = 0;
4804
4805 for(; scratch_size < max_size; scratch_size+=256) {
4806 size_t i;
4807 size_t total_alloc;
4808 size_t checkpoint;
4809 scratch = secp256k1_scratch_create(&CTX->error_callback, scratch_size);
4810 CHECK(scratch != NULL);
4811 checkpoint = secp256k1_scratch_checkpoint(&CTX->error_callback, scratch);
4812 n_points_supported = secp256k1_pippenger_max_points(&CTX->error_callback, scratch);
4813 if (n_points_supported == 0) {
4815 continue;
4816 }
4817 bucket_window = secp256k1_pippenger_bucket_window(n_points_supported);
4818 /* allocate `total_alloc` bytes over `PIPPENGER_SCRATCH_OBJECTS` many allocations */
4819 total_alloc = secp256k1_pippenger_scratch_size(n_points_supported, bucket_window);
4820 for (i = 0; i < PIPPENGER_SCRATCH_OBJECTS - 1; i++) {
4822 total_alloc--;
4823 }
4824 CHECK(secp256k1_scratch_alloc(&CTX->error_callback, scratch, total_alloc));
4827 }
4828 CHECK(bucket_window == PIPPENGER_MAX_BUCKET_WINDOW);
4829}
4830
4832 size_t n_batches, n_batch_points, max_n_batch_points, n;
4833
4834 max_n_batch_points = 0;
4835 n = 1;
4836 CHECK(secp256k1_ecmult_multi_batch_size_helper(&n_batches, &n_batch_points, max_n_batch_points, n) == 0);
4837
4838 max_n_batch_points = 1;
4839 n = 0;
4840 CHECK(secp256k1_ecmult_multi_batch_size_helper(&n_batches, &n_batch_points, max_n_batch_points, n) == 1);
4841 CHECK(n_batches == 0);
4842 CHECK(n_batch_points == 0);
4843
4844 max_n_batch_points = 2;
4845 n = 5;
4846 CHECK(secp256k1_ecmult_multi_batch_size_helper(&n_batches, &n_batch_points, max_n_batch_points, n) == 1);
4847 CHECK(n_batches == 3);
4848 CHECK(n_batch_points == 2);
4849
4850 max_n_batch_points = ECMULT_MAX_POINTS_PER_BATCH;
4852 CHECK(secp256k1_ecmult_multi_batch_size_helper(&n_batches, &n_batch_points, max_n_batch_points, n) == 1);
4853 CHECK(n_batches == 1);
4854 CHECK(n_batch_points == ECMULT_MAX_POINTS_PER_BATCH);
4855
4856 max_n_batch_points = ECMULT_MAX_POINTS_PER_BATCH + 1;
4858 CHECK(secp256k1_ecmult_multi_batch_size_helper(&n_batches, &n_batch_points, max_n_batch_points, n) == 1);
4859 CHECK(n_batches == 2);
4860 CHECK(n_batch_points == ECMULT_MAX_POINTS_PER_BATCH/2 + 1);
4861
4862 max_n_batch_points = 1;
4863 n = SIZE_MAX;
4864 CHECK(secp256k1_ecmult_multi_batch_size_helper(&n_batches, &n_batch_points, max_n_batch_points, n) == 1);
4865 CHECK(n_batches == SIZE_MAX);
4866 CHECK(n_batch_points == 1);
4867
4868 max_n_batch_points = 2;
4869 n = SIZE_MAX;
4870 CHECK(secp256k1_ecmult_multi_batch_size_helper(&n_batches, &n_batch_points, max_n_batch_points, n) == 1);
4871 CHECK(n_batches == SIZE_MAX/2 + 1);
4872 CHECK(n_batch_points == 2);
4873}
4874
4880 static const int n_points = 2*ECMULT_PIPPENGER_THRESHOLD;
4881 secp256k1_scalar scG;
4882 secp256k1_scalar szero;
4885 secp256k1_gej r;
4886 secp256k1_gej r2;
4887 ecmult_multi_data data;
4888 int i;
4889 secp256k1_scratch *scratch;
4890
4892 secp256k1_scalar_set_int(&szero, 0);
4893
4894 /* Get random scalars and group elements and compute result */
4895 random_scalar_order(&scG);
4896 secp256k1_ecmult(&r2, &r2, &szero, &scG);
4897 for(i = 0; i < n_points; i++) {
4898 secp256k1_ge ptg;
4899 secp256k1_gej ptgj;
4901 secp256k1_gej_set_ge(&ptgj, &ptg);
4902 pt[i] = ptg;
4903 random_scalar_order(&sc[i]);
4904 secp256k1_ecmult(&ptgj, &ptgj, &sc[i], NULL);
4905 secp256k1_gej_add_var(&r2, &r2, &ptgj, NULL);
4906 }
4907 data.sc = sc;
4908 data.pt = pt;
4909 secp256k1_gej_neg(&r2, &r2);
4910
4911 /* Test with empty scratch space. It should compute the correct result using
4912 * ecmult_mult_simple algorithm which doesn't require a scratch space. */
4914 CHECK(secp256k1_ecmult_multi_var(&CTX->error_callback, scratch, &r, &scG, ecmult_multi_callback, &data, n_points));
4915 secp256k1_gej_add_var(&r, &r, &r2, NULL);
4918
4919 /* Test with space for 1 point in pippenger. That's not enough because
4920 * ecmult_multi selects strauss which requires more memory. It should
4921 * therefore select the simple algorithm. */
4923 CHECK(secp256k1_ecmult_multi_var(&CTX->error_callback, scratch, &r, &scG, ecmult_multi_callback, &data, n_points));
4924 secp256k1_gej_add_var(&r, &r, &r2, NULL);
4927
4928 for(i = 1; i <= n_points; i++) {
4930 int bucket_window = secp256k1_pippenger_bucket_window(i);
4931 size_t scratch_size = secp256k1_pippenger_scratch_size(i, bucket_window);
4933 } else {
4934 size_t scratch_size = secp256k1_strauss_scratch_size(i);
4936 }
4937 CHECK(secp256k1_ecmult_multi_var(&CTX->error_callback, scratch, &r, &scG, ecmult_multi_callback, &data, n_points));
4938 secp256k1_gej_add_var(&r, &r, &r2, NULL);
4941 }
4942 free(sc);
4943 free(pt);
4944}
4945
4947 secp256k1_scratch *scratch;
4948 int64_t todo = (int64_t)320 * COUNT;
4949
4952 scratch = secp256k1_scratch_create(&CTX->error_callback, 819200);
4959 while (todo > 0) {
4960 todo -= test_ecmult_multi_random(scratch);
4961 }
4963
4964 /* Run test_ecmult_multi with space for exactly one point */
4968
4971}
4972
4973void test_wnaf(const secp256k1_scalar *number, int w) {
4974 secp256k1_scalar x, two, t;
4975 int wnaf[256];
4976 int zeroes = -1;
4977 int i;
4978 int bits;
4980 secp256k1_scalar_set_int(&two, 2);
4981 bits = secp256k1_ecmult_wnaf(wnaf, 256, number, w);
4982 CHECK(bits <= 256);
4983 for (i = bits-1; i >= 0; i--) {
4984 int v = wnaf[i];
4985 secp256k1_scalar_mul(&x, &x, &two);
4986 if (v) {
4987 CHECK(zeroes == -1 || zeroes >= w-1); /* check that distance between non-zero elements is at least w-1 */
4988 zeroes=0;
4989 CHECK((v & 1) == 1); /* check non-zero elements are odd */
4990 CHECK(v <= (1 << (w-1)) - 1); /* check range below */
4991 CHECK(v >= -(1 << (w-1)) - 1); /* check range above */
4992 } else {
4993 CHECK(zeroes != -1); /* check that no unnecessary zero padding exists */
4994 zeroes++;
4995 }
4996 if (v >= 0) {
4998 } else {
5001 }
5002 secp256k1_scalar_add(&x, &x, &t);
5003 }
5004 CHECK(secp256k1_scalar_eq(&x, number)); /* check that wnaf represents number */
5005}
5006
5008 secp256k1_scalar neg1 = *number;
5009 secp256k1_scalar neg2 = *number;
5010 int sign1 = 1;
5011 int sign2 = 1;
5012
5013 if (!secp256k1_scalar_get_bits(&neg1, 0, 1)) {
5014 secp256k1_scalar_negate(&neg1, &neg1);
5015 sign1 = -1;
5016 }
5018 CHECK(sign1 == sign2);
5019 CHECK(secp256k1_scalar_eq(&neg1, &neg2));
5020}
5021
5022void test_constant_wnaf(const secp256k1_scalar *number, int w) {
5023 secp256k1_scalar x, shift;
5024 int wnaf[256] = {0};
5025 int i;
5026 int skew;
5027 int bits = 256;
5028 secp256k1_scalar num = *number;
5029 secp256k1_scalar scalar_skew;
5030
5032 secp256k1_scalar_set_int(&shift, 1 << w);
5033 for (i = 0; i < 16; ++i) {
5034 secp256k1_scalar_shr_int(&num, 8);
5035 }
5036 bits = 128;
5037 skew = secp256k1_wnaf_const(wnaf, &num, w, bits);
5038
5039 for (i = WNAF_SIZE_BITS(bits, w); i >= 0; --i) {
5041 int v = wnaf[i];
5042 CHECK(v != 0); /* check nonzero */
5043 CHECK(v & 1); /* check parity */
5044 CHECK(v > -(1 << w)); /* check range above */
5045 CHECK(v < (1 << w)); /* check range below */
5046
5047 secp256k1_scalar_mul(&x, &x, &shift);
5048 if (v >= 0) {
5050 } else {
5053 }
5054 secp256k1_scalar_add(&x, &x, &t);
5055 }
5056 /* Skew num because when encoding numbers as odd we use an offset */
5057 secp256k1_scalar_set_int(&scalar_skew, skew);
5058 secp256k1_scalar_add(&num, &num, &scalar_skew);
5059 CHECK(secp256k1_scalar_eq(&x, &num));
5060}
5061
5062void test_fixed_wnaf(const secp256k1_scalar *number, int w) {
5063 secp256k1_scalar x, shift;
5064 int wnaf[256] = {0};
5065 int i;
5066 int skew;
5067 secp256k1_scalar num = *number;
5068
5070 secp256k1_scalar_set_int(&shift, 1 << w);
5071 for (i = 0; i < 16; ++i) {
5072 secp256k1_scalar_shr_int(&num, 8);
5073 }
5074 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
5075
5076 for (i = WNAF_SIZE(w)-1; i >= 0; --i) {
5078 int v = wnaf[i];
5079 CHECK(v == 0 || v & 1); /* check parity */
5080 CHECK(v > -(1 << w)); /* check range above */
5081 CHECK(v < (1 << w)); /* check range below */
5082
5083 secp256k1_scalar_mul(&x, &x, &shift);
5084 if (v >= 0) {
5086 } else {
5089 }
5090 secp256k1_scalar_add(&x, &x, &t);
5091 }
5092 /* If skew is 1 then add 1 to num */
5093 secp256k1_scalar_cadd_bit(&num, 0, skew == 1);
5094 CHECK(secp256k1_scalar_eq(&x, &num));
5095}
5096
5097/* Checks that the first 8 elements of wnaf are equal to wnaf_expected and the
5098 * rest is 0.*/
5099void test_fixed_wnaf_small_helper(int *wnaf, int *wnaf_expected, int w) {
5100 int i;
5101 for (i = WNAF_SIZE(w)-1; i >= 8; --i) {
5102 CHECK(wnaf[i] == 0);
5103 }
5104 for (i = 7; i >= 0; --i) {
5105 CHECK(wnaf[i] == wnaf_expected[i]);
5106 }
5107}
5108
5110 int w = 4;
5111 int wnaf[256] = {0};
5112 int i;
5113 int skew;
5114 secp256k1_scalar num;
5115
5116 secp256k1_scalar_set_int(&num, 0);
5117 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
5118 for (i = WNAF_SIZE(w)-1; i >= 0; --i) {
5119 int v = wnaf[i];
5120 CHECK(v == 0);
5121 }
5122 CHECK(skew == 0);
5123
5124 secp256k1_scalar_set_int(&num, 1);
5125 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
5126 for (i = WNAF_SIZE(w)-1; i >= 1; --i) {
5127 int v = wnaf[i];
5128 CHECK(v == 0);
5129 }
5130 CHECK(wnaf[0] == 1);
5131 CHECK(skew == 0);
5132
5133 {
5134 int wnaf_expected[8] = { 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf };
5135 secp256k1_scalar_set_int(&num, 0xffffffff);
5136 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
5137 test_fixed_wnaf_small_helper(wnaf, wnaf_expected, w);
5138 CHECK(skew == 0);
5139 }
5140 {
5141 int wnaf_expected[8] = { -1, -1, -1, -1, -1, -1, -1, 0xf };
5142 secp256k1_scalar_set_int(&num, 0xeeeeeeee);
5143 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
5144 test_fixed_wnaf_small_helper(wnaf, wnaf_expected, w);
5145 CHECK(skew == 1);
5146 }
5147 {
5148 int wnaf_expected[8] = { 1, 0, 1, 0, 1, 0, 1, 0 };
5149 secp256k1_scalar_set_int(&num, 0x01010101);
5150 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
5151 test_fixed_wnaf_small_helper(wnaf, wnaf_expected, w);
5152 CHECK(skew == 0);
5153 }
5154 {
5155 int wnaf_expected[8] = { -0xf, 0, 0xf, -0xf, 0, 0xf, 1, 0 };
5156 secp256k1_scalar_set_int(&num, 0x01ef1ef1);
5157 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
5158 test_fixed_wnaf_small_helper(wnaf, wnaf_expected, w);
5159 CHECK(skew == 0);
5160 }
5161}
5162
5163void run_wnaf(void) {
5164 int i;
5165 secp256k1_scalar n = {{0}};
5166
5167 test_constant_wnaf(&n, 4);
5168 /* Sanity check: 1 and 2 are the smallest odd and even numbers and should
5169 * have easier-to-diagnose failure modes */
5170 n.d[0] = 1;
5171 test_constant_wnaf(&n, 4);
5172 n.d[0] = 2;
5173 test_constant_wnaf(&n, 4);
5174 /* Test -1, because it's a special case in wnaf_const */
5177 test_constant_wnaf(&n, 4);
5178
5179 /* Test -2, which may not lead to overflows in wnaf_const */
5182 test_constant_wnaf(&n, 4);
5183
5184 /* Test (1/2) - 1 = 1/-2 and 1/2 = (1/-2) + 1
5185 as corner cases of negation handling in wnaf_const */
5187 test_constant_wnaf(&n, 4);
5188
5190 test_constant_wnaf(&n, 4);
5191
5192 /* Test 0 for fixed wnaf */
5194 /* Random tests */
5195 for (i = 0; i < COUNT; i++) {
5197 test_wnaf(&n, 4+(i%10));
5199 test_constant_wnaf(&n, 4 + (i % 10));
5200 test_fixed_wnaf(&n, 4 + (i % 10));
5201 }
5203 CHECK(secp256k1_scalar_cond_negate(&n, 1) == -1);
5207}
5208
5209static int test_ecmult_accumulate_cb(secp256k1_scalar* sc, secp256k1_ge* pt, size_t idx, void* data) {
5210 const secp256k1_scalar* indata = (const secp256k1_scalar*)data;
5211 *sc = *indata;
5213 CHECK(idx == 0);
5214 return 1;
5215}
5216
5218 /* Compute x*G in 6 different ways, serialize it uncompressed, and feed it into acc. */
5219 secp256k1_gej rj1, rj2, rj3, rj4, rj5, rj6, gj, infj;
5220 secp256k1_ge r;
5221 const secp256k1_scalar zero = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0);
5222 unsigned char bytes[65];
5223 size_t size = 65;
5227 secp256k1_ecmult(&rj2, &gj, x, &zero);
5228 secp256k1_ecmult(&rj3, &infj, &zero, x);
5229 secp256k1_ecmult_multi_var(NULL, scratch, &rj4, x, NULL, NULL, 0);
5230 secp256k1_ecmult_multi_var(NULL, scratch, &rj5, &zero, test_ecmult_accumulate_cb, (void*)x, 1);
5232 secp256k1_ge_set_gej_var(&r, &rj1);
5233 ge_equals_gej(&r, &rj2);
5234 ge_equals_gej(&r, &rj3);
5235 ge_equals_gej(&r, &rj4);
5236 ge_equals_gej(&r, &rj5);
5237 ge_equals_gej(&r, &rj6);
5238 if (secp256k1_ge_is_infinity(&r)) {
5239 /* Store infinity as 0x00 */
5240 const unsigned char zerobyte[1] = {0};
5241 secp256k1_sha256_write(acc, zerobyte, 1);
5242 } else {
5243 /* Store other points using their uncompressed serialization. */
5244 secp256k1_eckey_pubkey_serialize(&r, bytes, &size, 0);
5245 CHECK(size == 65);
5246 secp256k1_sha256_write(acc, bytes, size);
5247 }
5248}
5249
5251 /* Using test_ecmult_accumulate, test ecmult for:
5252 * - For i in 0..36:
5253 * - Key i
5254 * - Key -i
5255 * - For i in 0..255:
5256 * - For j in 1..255 (only odd values):
5257 * - Key (j*2^i) mod order
5258 */
5260 secp256k1_sha256 acc;
5261 unsigned char b32[32];
5262 int i, j;
5264
5265 /* Expected hash of all the computed points; created with an independent
5266 * implementation. */
5267 static const unsigned char expected32[32] = {
5268 0xe4, 0x71, 0x1b, 0x4d, 0x14, 0x1e, 0x68, 0x48,
5269 0xb7, 0xaf, 0x47, 0x2b, 0x4c, 0xd2, 0x04, 0x14,
5270 0x3a, 0x75, 0x87, 0x60, 0x1a, 0xf9, 0x63, 0x60,
5271 0xd0, 0xcb, 0x1f, 0xaa, 0x85, 0x9a, 0xb7, 0xb4
5272 };
5274 for (i = 0; i <= 36; ++i) {
5276 test_ecmult_accumulate(&acc, &x, scratch);
5278 test_ecmult_accumulate(&acc, &x, scratch);
5279 };
5280 for (i = 0; i < 256; ++i) {
5281 for (j = 1; j < 256; j += 2) {
5282 int k;
5284 for (k = 0; k < i; ++k) secp256k1_scalar_add(&x, &x, &x);
5285 test_ecmult_accumulate(&acc, &x, scratch);
5286 }
5287 }
5288 secp256k1_sha256_finalize(&acc, b32);
5289 CHECK(secp256k1_memcmp_var(b32, expected32, 32) == 0);
5290
5292}
5293
5294void test_ecmult_constants_sha(uint32_t prefix, size_t iter, const unsigned char* expected32) {
5295 /* Using test_ecmult_accumulate, test ecmult for:
5296 * - Key 0
5297 * - Key 1
5298 * - Key -1
5299 * - For i in range(iter):
5300 * - Key SHA256(LE32(prefix) || LE16(i))
5301 */
5303 secp256k1_sha256 acc;
5304 unsigned char b32[32];
5305 unsigned char inp[6];
5306 size_t i;
5308
5309 inp[0] = prefix & 0xFF;
5310 inp[1] = (prefix >> 8) & 0xFF;
5311 inp[2] = (prefix >> 16) & 0xFF;
5312 inp[3] = (prefix >> 24) & 0xFF;
5315 test_ecmult_accumulate(&acc, &x, scratch);
5317 test_ecmult_accumulate(&acc, &x, scratch);
5319 test_ecmult_accumulate(&acc, &x, scratch);
5320
5321 for (i = 0; i < iter; ++i) {
5322 secp256k1_sha256 gen;
5323 inp[4] = i & 0xff;
5324 inp[5] = (i >> 8) & 0xff;
5326 secp256k1_sha256_write(&gen, inp, sizeof(inp));
5327 secp256k1_sha256_finalize(&gen, b32);
5328 secp256k1_scalar_set_b32(&x, b32, NULL);
5329 test_ecmult_accumulate(&acc, &x, scratch);
5330 }
5331 secp256k1_sha256_finalize(&acc, b32);
5332 CHECK(secp256k1_memcmp_var(b32, expected32, 32) == 0);
5333
5335}
5336
5338 /* Expected hashes of all points in the tests below. Computed using an
5339 * independent implementation. */
5340 static const unsigned char expected32_6bit20[32] = {
5341 0x68, 0xb6, 0xed, 0x6f, 0x28, 0xca, 0xc9, 0x7f,
5342 0x8e, 0x8b, 0xd6, 0xc0, 0x61, 0x79, 0x34, 0x6e,
5343 0x5a, 0x8f, 0x2b, 0xbc, 0x3e, 0x1f, 0xc5, 0x2e,
5344 0x2a, 0xd0, 0x45, 0x67, 0x7f, 0x95, 0x95, 0x8e
5345 };
5346 static const unsigned char expected32_8bit8[32] = {
5347 0x8b, 0x65, 0x8e, 0xea, 0x86, 0xae, 0x3c, 0x95,
5348 0x90, 0xb6, 0x77, 0xa4, 0x8c, 0x76, 0xd9, 0xec,
5349 0xf5, 0xab, 0x8a, 0x2f, 0xfd, 0xdb, 0x19, 0x12,
5350 0x1a, 0xee, 0xe6, 0xb7, 0x6e, 0x05, 0x3f, 0xc6
5351 };
5352 /* For every combination of 6 bit positions out of 256, restricted to
5353 * 20-bit windows (i.e., the first and last bit position are no more than
5354 * 19 bits apart), all 64 bit patterns occur in the input scalars used in
5355 * this test. */
5356 CONDITIONAL_TEST(1, "test_ecmult_constants_sha 1024") {
5357 test_ecmult_constants_sha(4808378u, 1024, expected32_6bit20);
5358 }
5359
5360 /* For every combination of 8 consecutive bit positions, all 256 bit
5361 * patterns occur in the input scalars used in this test. */
5362 CONDITIONAL_TEST(3, "test_ecmult_constants_sha 2048") {
5363 test_ecmult_constants_sha(1607366309u, 2048, expected32_8bit8);
5364 }
5365
5366 CONDITIONAL_TEST(35, "test_ecmult_constants_2bit") {
5368 }
5369}
5370
5372 /* Test ecmult_gen() blinding and confirm that the blinding changes, the affine points match, and the z's don't match. */
5373 secp256k1_scalar key;
5375 unsigned char seed32[32];
5376 secp256k1_gej pgej;
5377 secp256k1_gej pgej2;
5378 secp256k1_gej i;
5379 secp256k1_ge pge;
5381 secp256k1_ecmult_gen(&CTX->ecmult_gen_ctx, &pgej, &key);
5382 secp256k1_testrand256(seed32);
5387 secp256k1_ecmult_gen(&CTX->ecmult_gen_ctx, &pgej2, &key);
5388 CHECK(!gej_xyz_equals_gej(&pgej, &pgej2));
5390 secp256k1_ge_set_gej(&pge, &pgej);
5391 ge_equals_gej(&pge, &pgej2);
5392}
5393
5395 /* Test ecmult_gen() blinding reset and confirm that the blinding is consistent. */
5397 secp256k1_gej initial;
5400 initial = CTX->ecmult_gen_ctx.initial;
5404}
5405
5407 int i;
5409 for (i = 0; i < 10; i++) {
5411 }
5412}
5413
5414/***** ENDOMORPHISH TESTS *****/
5416 secp256k1_scalar s, s1, slam;
5417 const unsigned char zero[32] = {0};
5418 unsigned char tmp[32];
5419
5420 secp256k1_scalar_split_lambda(&s1, &slam, full);
5421
5422 /* check slam*lambda + s1 == full */
5424 secp256k1_scalar_add(&s, &s, &s1);
5425 CHECK(secp256k1_scalar_eq(&s, full));
5426
5427 /* check that both are <= 128 bits in size */
5428 if (secp256k1_scalar_is_high(&s1)) {
5429 secp256k1_scalar_negate(&s1, &s1);
5430 }
5431 if (secp256k1_scalar_is_high(&slam)) {
5432 secp256k1_scalar_negate(&slam, &slam);
5433 }
5434
5435 secp256k1_scalar_get_b32(tmp, &s1);
5436 CHECK(secp256k1_memcmp_var(zero, tmp, 16) == 0);
5437 secp256k1_scalar_get_b32(tmp, &slam);
5438 CHECK(secp256k1_memcmp_var(zero, tmp, 16) == 0);
5439}
5440
5441
5443 unsigned i;
5444 static secp256k1_scalar s;
5452
5453 for (i = 0; i < 100U * COUNT; ++i) {
5454 secp256k1_scalar full;
5456 test_scalar_split(&full);
5457 }
5458 for (i = 0; i < sizeof(scalars_near_split_bounds) / sizeof(scalars_near_split_bounds[0]); ++i) {
5460 }
5461}
5462
5463void ec_pubkey_parse_pointtest(const unsigned char *input, int xvalid, int yvalid) {
5464 unsigned char pubkeyc[65];
5465 secp256k1_pubkey pubkey;
5466 secp256k1_ge ge;
5467 size_t pubkeyclen;
5468 int32_t ecount;
5469 ecount = 0;
5471 for (pubkeyclen = 3; pubkeyclen <= 65; pubkeyclen++) {
5472 /* Smaller sizes are tested exhaustively elsewhere. */
5473 int32_t i;
5474 memcpy(&pubkeyc[1], input, 64);
5475 VG_UNDEF(&pubkeyc[pubkeyclen], 65 - pubkeyclen);
5476 for (i = 0; i < 256; i++) {
5477 /* Try all type bytes. */
5478 int xpass;
5479 int ypass;
5480 int ysign;
5481 pubkeyc[0] = i;
5482 /* What sign does this point have? */
5483 ysign = (input[63] & 1) + 2;
5484 /* For the current type (i) do we expect parsing to work? Handled all of compressed/uncompressed/hybrid. */
5485 xpass = xvalid && (pubkeyclen == 33) && ((i & 254) == 2);
5486 /* Do we expect a parse and re-serialize as uncompressed to give a matching y? */
5487 ypass = xvalid && yvalid && ((i & 4) == ((pubkeyclen == 65) << 2)) &&
5488 ((i == 4) || ((i & 251) == ysign)) && ((pubkeyclen == 33) || (pubkeyclen == 65));
5489 if (xpass || ypass) {
5490 /* These cases must parse. */
5491 unsigned char pubkeyo[65];
5492 size_t outl;
5493 memset(&pubkey, 0, sizeof(pubkey));
5494 VG_UNDEF(&pubkey, sizeof(pubkey));
5495 ecount = 0;
5496 CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, pubkeyc, pubkeyclen) == 1);
5497 VG_CHECK(&pubkey, sizeof(pubkey));
5498 outl = 65;
5499 VG_UNDEF(pubkeyo, 65);
5500 CHECK(secp256k1_ec_pubkey_serialize(CTX, pubkeyo, &outl, &pubkey, SECP256K1_EC_COMPRESSED) == 1);
5501 VG_CHECK(pubkeyo, outl);
5502 CHECK(outl == 33);
5503 CHECK(secp256k1_memcmp_var(&pubkeyo[1], &pubkeyc[1], 32) == 0);
5504 CHECK((pubkeyclen != 33) || (pubkeyo[0] == pubkeyc[0]));
5505 if (ypass) {
5506 /* This test isn't always done because we decode with alternative signs, so the y won't match. */
5507 CHECK(pubkeyo[0] == ysign);
5508 CHECK(secp256k1_pubkey_load(CTX, &ge, &pubkey) == 1);
5509 memset(&pubkey, 0, sizeof(pubkey));
5510 VG_UNDEF(&pubkey, sizeof(pubkey));
5511 secp256k1_pubkey_save(&pubkey, &ge);
5512 VG_CHECK(&pubkey, sizeof(pubkey));
5513 outl = 65;
5514 VG_UNDEF(pubkeyo, 65);
5515 CHECK(secp256k1_ec_pubkey_serialize(CTX, pubkeyo, &outl, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 1);
5516 VG_CHECK(pubkeyo, outl);
5517 CHECK(outl == 65);
5518 CHECK(pubkeyo[0] == 4);
5519 CHECK(secp256k1_memcmp_var(&pubkeyo[1], input, 64) == 0);
5520 }
5521 CHECK(ecount == 0);
5522 } else {
5523 /* These cases must fail to parse. */
5524 memset(&pubkey, 0xfe, sizeof(pubkey));
5525 ecount = 0;
5526 VG_UNDEF(&pubkey, sizeof(pubkey));
5527 CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, pubkeyc, pubkeyclen) == 0);
5528 VG_CHECK(&pubkey, sizeof(pubkey));
5529 CHECK(ecount == 0);
5530 CHECK(secp256k1_pubkey_load(CTX, &ge, &pubkey) == 0);
5531 CHECK(ecount == 1);
5532 }
5533 }
5534 }
5536}
5537
5539#define SECP256K1_EC_PARSE_TEST_NVALID (12)
5540 const unsigned char valid[SECP256K1_EC_PARSE_TEST_NVALID][64] = {
5541 {
5542 /* Point with leading and trailing zeros in x and y serialization. */
5543 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x52,
5544 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5545 0x00, 0x00, 0x64, 0xef, 0xa1, 0x7b, 0x77, 0x61, 0xe1, 0xe4, 0x27, 0x06, 0x98, 0x9f, 0xb4, 0x83,
5546 0xb8, 0xd2, 0xd4, 0x9b, 0xf7, 0x8f, 0xae, 0x98, 0x03, 0xf0, 0x99, 0xb8, 0x34, 0xed, 0xeb, 0x00
5547 },
5548 {
5549 /* Point with x equal to a 3rd root of unity.*/
5550 0x7a, 0xe9, 0x6a, 0x2b, 0x65, 0x7c, 0x07, 0x10, 0x6e, 0x64, 0x47, 0x9e, 0xac, 0x34, 0x34, 0xe9,
5551 0x9c, 0xf0, 0x49, 0x75, 0x12, 0xf5, 0x89, 0x95, 0xc1, 0x39, 0x6c, 0x28, 0x71, 0x95, 0x01, 0xee,
5552 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14,
5553 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee,
5554 },
5555 {
5556 /* Point with largest x. (1/2) */
5557 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5558 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2c,
5559 0x0e, 0x99, 0x4b, 0x14, 0xea, 0x72, 0xf8, 0xc3, 0xeb, 0x95, 0xc7, 0x1e, 0xf6, 0x92, 0x57, 0x5e,
5560 0x77, 0x50, 0x58, 0x33, 0x2d, 0x7e, 0x52, 0xd0, 0x99, 0x5c, 0xf8, 0x03, 0x88, 0x71, 0xb6, 0x7d,
5561 },
5562 {
5563 /* Point with largest x. (2/2) */
5564 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5565 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2c,
5566 0xf1, 0x66, 0xb4, 0xeb, 0x15, 0x8d, 0x07, 0x3c, 0x14, 0x6a, 0x38, 0xe1, 0x09, 0x6d, 0xa8, 0xa1,
5567 0x88, 0xaf, 0xa7, 0xcc, 0xd2, 0x81, 0xad, 0x2f, 0x66, 0xa3, 0x07, 0xfb, 0x77, 0x8e, 0x45, 0xb2,
5568 },
5569 {
5570 /* Point with smallest x. (1/2) */
5571 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5572 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
5573 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14,
5574 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee,
5575 },
5576 {
5577 /* Point with smallest x. (2/2) */
5578 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5579 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
5580 0xbd, 0xe7, 0x0d, 0xf5, 0x19, 0x39, 0xb9, 0x4c, 0x9c, 0x24, 0x97, 0x9f, 0xa7, 0xdd, 0x04, 0xeb,
5581 0xd9, 0xb3, 0x57, 0x2d, 0xa7, 0x80, 0x22, 0x90, 0x43, 0x8a, 0xf2, 0xa6, 0x81, 0x89, 0x54, 0x41,
5582 },
5583 {
5584 /* Point with largest y. (1/3) */
5585 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6,
5586 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07,
5587 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5588 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
5589 },
5590 {
5591 /* Point with largest y. (2/3) */
5592 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c,
5593 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73,
5594 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5595 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
5596 },
5597 {
5598 /* Point with largest y. (3/3) */
5599 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc,
5600 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5,
5601 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5602 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
5603 },
5604 {
5605 /* Point with smallest y. (1/3) */
5606 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6,
5607 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07,
5608 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5609 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
5610 },
5611 {
5612 /* Point with smallest y. (2/3) */
5613 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c,
5614 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73,
5615 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5616 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
5617 },
5618 {
5619 /* Point with smallest y. (3/3) */
5620 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc,
5621 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5,
5622 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5623 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01
5624 }
5625 };
5626#define SECP256K1_EC_PARSE_TEST_NXVALID (4)
5627 const unsigned char onlyxvalid[SECP256K1_EC_PARSE_TEST_NXVALID][64] = {
5628 {
5629 /* Valid if y overflow ignored (y = 1 mod p). (1/3) */
5630 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6,
5631 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07,
5632 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5633 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
5634 },
5635 {
5636 /* Valid if y overflow ignored (y = 1 mod p). (2/3) */
5637 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c,
5638 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73,
5639 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5640 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
5641 },
5642 {
5643 /* Valid if y overflow ignored (y = 1 mod p). (3/3)*/
5644 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc,
5645 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5,
5646 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5647 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
5648 },
5649 {
5650 /* x on curve, y is from y^2 = x^3 + 8. */
5651 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5652 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
5653 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5654 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03
5655 }
5656 };
5657#define SECP256K1_EC_PARSE_TEST_NINVALID (7)
5658 const unsigned char invalid[SECP256K1_EC_PARSE_TEST_NINVALID][64] = {
5659 {
5660 /* x is third root of -8, y is -1 * (x^3+7); also on the curve for y^2 = x^3 + 9. */
5661 0x0a, 0x2d, 0x2b, 0xa9, 0x35, 0x07, 0xf1, 0xdf, 0x23, 0x37, 0x70, 0xc2, 0xa7, 0x97, 0x96, 0x2c,
5662 0xc6, 0x1f, 0x6d, 0x15, 0xda, 0x14, 0xec, 0xd4, 0x7d, 0x8d, 0x27, 0xae, 0x1c, 0xd5, 0xf8, 0x53,
5663 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5664 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
5665 },
5666 {
5667 /* Valid if x overflow ignored (x = 1 mod p). */
5668 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5669 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
5670 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14,
5671 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee,
5672 },
5673 {
5674 /* Valid if x overflow ignored (x = 1 mod p). */
5675 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5676 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
5677 0xbd, 0xe7, 0x0d, 0xf5, 0x19, 0x39, 0xb9, 0x4c, 0x9c, 0x24, 0x97, 0x9f, 0xa7, 0xdd, 0x04, 0xeb,
5678 0xd9, 0xb3, 0x57, 0x2d, 0xa7, 0x80, 0x22, 0x90, 0x43, 0x8a, 0xf2, 0xa6, 0x81, 0x89, 0x54, 0x41,
5679 },
5680 {
5681 /* x is -1, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 5. */
5682 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5683 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
5684 0xf4, 0x84, 0x14, 0x5c, 0xb0, 0x14, 0x9b, 0x82, 0x5d, 0xff, 0x41, 0x2f, 0xa0, 0x52, 0xa8, 0x3f,
5685 0xcb, 0x72, 0xdb, 0x61, 0xd5, 0x6f, 0x37, 0x70, 0xce, 0x06, 0x6b, 0x73, 0x49, 0xa2, 0xaa, 0x28,
5686 },
5687 {
5688 /* x is -1, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 5. */
5689 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5690 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
5691 0x0b, 0x7b, 0xeb, 0xa3, 0x4f, 0xeb, 0x64, 0x7d, 0xa2, 0x00, 0xbe, 0xd0, 0x5f, 0xad, 0x57, 0xc0,
5692 0x34, 0x8d, 0x24, 0x9e, 0x2a, 0x90, 0xc8, 0x8f, 0x31, 0xf9, 0x94, 0x8b, 0xb6, 0x5d, 0x52, 0x07,
5693 },
5694 {
5695 /* x is zero, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 7. */
5696 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5697 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5698 0x8f, 0x53, 0x7e, 0xef, 0xdf, 0xc1, 0x60, 0x6a, 0x07, 0x27, 0xcd, 0x69, 0xb4, 0xa7, 0x33, 0x3d,
5699 0x38, 0xed, 0x44, 0xe3, 0x93, 0x2a, 0x71, 0x79, 0xee, 0xcb, 0x4b, 0x6f, 0xba, 0x93, 0x60, 0xdc,
5700 },
5701 {
5702 /* x is zero, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 7. */
5703 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5704 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5705 0x70, 0xac, 0x81, 0x10, 0x20, 0x3e, 0x9f, 0x95, 0xf8, 0xd8, 0x32, 0x96, 0x4b, 0x58, 0xcc, 0xc2,
5706 0xc7, 0x12, 0xbb, 0x1c, 0x6c, 0xd5, 0x8e, 0x86, 0x11, 0x34, 0xb4, 0x8f, 0x45, 0x6c, 0x9b, 0x53
5707 }
5708 };
5709 const unsigned char pubkeyc[66] = {
5710 /* Serialization of G. */
5711 0x04, 0x79, 0xBE, 0x66, 0x7E, 0xF9, 0xDC, 0xBB, 0xAC, 0x55, 0xA0, 0x62, 0x95, 0xCE, 0x87, 0x0B,
5712 0x07, 0x02, 0x9B, 0xFC, 0xDB, 0x2D, 0xCE, 0x28, 0xD9, 0x59, 0xF2, 0x81, 0x5B, 0x16, 0xF8, 0x17,
5713 0x98, 0x48, 0x3A, 0xDA, 0x77, 0x26, 0xA3, 0xC4, 0x65, 0x5D, 0xA4, 0xFB, 0xFC, 0x0E, 0x11, 0x08,
5714 0xA8, 0xFD, 0x17, 0xB4, 0x48, 0xA6, 0x85, 0x54, 0x19, 0x9C, 0x47, 0xD0, 0x8F, 0xFB, 0x10, 0xD4,
5715 0xB8, 0x00
5716 };
5717 unsigned char sout[65];
5718 unsigned char shortkey[2];
5719 secp256k1_ge ge;
5720 secp256k1_pubkey pubkey;
5721 size_t len;
5722 int32_t i;
5723 int32_t ecount;
5724 int32_t ecount2;
5725 ecount = 0;
5726 /* Nothing should be reading this far into pubkeyc. */
5727 VG_UNDEF(&pubkeyc[65], 1);
5729 /* Zero length claimed, fail, zeroize, no illegal arg error. */
5730 memset(&pubkey, 0xfe, sizeof(pubkey));
5731 ecount = 0;
5732 VG_UNDEF(shortkey, 2);
5733 VG_UNDEF(&pubkey, sizeof(pubkey));
5734 CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, shortkey, 0) == 0);
5735 VG_CHECK(&pubkey, sizeof(pubkey));
5736 CHECK(ecount == 0);
5737 CHECK(secp256k1_pubkey_load(CTX, &ge, &pubkey) == 0);
5738 CHECK(ecount == 1);
5739 /* Length one claimed, fail, zeroize, no illegal arg error. */
5740 for (i = 0; i < 256 ; i++) {
5741 memset(&pubkey, 0xfe, sizeof(pubkey));
5742 ecount = 0;
5743 shortkey[0] = i;
5744 VG_UNDEF(&shortkey[1], 1);
5745 VG_UNDEF(&pubkey, sizeof(pubkey));
5746 CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, shortkey, 1) == 0);
5747 VG_CHECK(&pubkey, sizeof(pubkey));
5748 CHECK(ecount == 0);
5749 CHECK(secp256k1_pubkey_load(CTX, &ge, &pubkey) == 0);
5750 CHECK(ecount == 1);
5751 }
5752 /* Length two claimed, fail, zeroize, no illegal arg error. */
5753 for (i = 0; i < 65536 ; i++) {
5754 memset(&pubkey, 0xfe, sizeof(pubkey));
5755 ecount = 0;
5756 shortkey[0] = i & 255;
5757 shortkey[1] = i >> 8;
5758 VG_UNDEF(&pubkey, sizeof(pubkey));
5759 CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, shortkey, 2) == 0);
5760 VG_CHECK(&pubkey, sizeof(pubkey));
5761 CHECK(ecount == 0);
5762 CHECK(secp256k1_pubkey_load(CTX, &ge, &pubkey) == 0);
5763 CHECK(ecount == 1);
5764 }
5765 memset(&pubkey, 0xfe, sizeof(pubkey));
5766 ecount = 0;
5767 VG_UNDEF(&pubkey, sizeof(pubkey));
5768 /* 33 bytes claimed on otherwise valid input starting with 0x04, fail, zeroize output, no illegal arg error. */
5769 CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, pubkeyc, 33) == 0);
5770 VG_CHECK(&pubkey, sizeof(pubkey));
5771 CHECK(ecount == 0);
5772 CHECK(secp256k1_pubkey_load(CTX, &ge, &pubkey) == 0);
5773 CHECK(ecount == 1);
5774 /* NULL pubkey, illegal arg error. Pubkey isn't rewritten before this step, since it's NULL into the parser. */
5775 CHECK(secp256k1_ec_pubkey_parse(CTX, NULL, pubkeyc, 65) == 0);
5776 CHECK(ecount == 2);
5777 /* NULL input string. Illegal arg and zeroize output. */
5778 memset(&pubkey, 0xfe, sizeof(pubkey));
5779 ecount = 0;
5780 VG_UNDEF(&pubkey, sizeof(pubkey));
5781 CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, NULL, 65) == 0);
5782 VG_CHECK(&pubkey, sizeof(pubkey));
5783 CHECK(ecount == 1);
5784 CHECK(secp256k1_pubkey_load(CTX, &ge, &pubkey) == 0);
5785 CHECK(ecount == 2);
5786 /* 64 bytes claimed on input starting with 0x04, fail, zeroize output, no illegal arg error. */
5787 memset(&pubkey, 0xfe, sizeof(pubkey));
5788 ecount = 0;
5789 VG_UNDEF(&pubkey, sizeof(pubkey));
5790 CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, pubkeyc, 64) == 0);
5791 VG_CHECK(&pubkey, sizeof(pubkey));
5792 CHECK(ecount == 0);
5793 CHECK(secp256k1_pubkey_load(CTX, &ge, &pubkey) == 0);
5794 CHECK(ecount == 1);
5795 /* 66 bytes claimed, fail, zeroize output, no illegal arg error. */
5796 memset(&pubkey, 0xfe, sizeof(pubkey));
5797 ecount = 0;
5798 VG_UNDEF(&pubkey, sizeof(pubkey));
5799 CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, pubkeyc, 66) == 0);
5800 VG_CHECK(&pubkey, sizeof(pubkey));
5801 CHECK(ecount == 0);
5802 CHECK(secp256k1_pubkey_load(CTX, &ge, &pubkey) == 0);
5803 CHECK(ecount == 1);
5804 /* Valid parse. */
5805 memset(&pubkey, 0, sizeof(pubkey));
5806 ecount = 0;
5807 VG_UNDEF(&pubkey, sizeof(pubkey));
5808 CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, pubkeyc, 65) == 1);
5809 CHECK(secp256k1_ec_pubkey_parse(secp256k1_context_static, &pubkey, pubkeyc, 65) == 1);
5810 VG_CHECK(&pubkey, sizeof(pubkey));
5811 CHECK(ecount == 0);
5812 VG_UNDEF(&ge, sizeof(ge));
5813 CHECK(secp256k1_pubkey_load(CTX, &ge, &pubkey) == 1);
5814 VG_CHECK(&ge.x, sizeof(ge.x));
5815 VG_CHECK(&ge.y, sizeof(ge.y));
5816 VG_CHECK(&ge.infinity, sizeof(ge.infinity));
5818 CHECK(ecount == 0);
5819 /* secp256k1_ec_pubkey_serialize illegal args. */
5820 ecount = 0;
5821 len = 65;
5823 CHECK(ecount == 1);
5824 CHECK(len == 0);
5826 CHECK(ecount == 2);
5827 len = 65;
5828 VG_UNDEF(sout, 65);
5830 VG_CHECK(sout, 65);
5831 CHECK(ecount == 3);
5832 CHECK(len == 0);
5833 len = 65;
5834 CHECK(secp256k1_ec_pubkey_serialize(CTX, sout, &len, &pubkey, ~0) == 0);
5835 CHECK(ecount == 4);
5836 CHECK(len == 0);
5837 len = 65;
5838 VG_UNDEF(sout, 65);
5840 VG_CHECK(sout, 65);
5841 CHECK(ecount == 4);
5842 CHECK(len == 65);
5843 /* Multiple illegal args. Should still set arg error only once. */
5844 ecount = 0;
5845 ecount2 = 11;
5846 CHECK(secp256k1_ec_pubkey_parse(CTX, NULL, NULL, 65) == 0);
5847 CHECK(ecount == 1);
5848 /* Does the illegal arg callback actually change the behavior? */
5850 CHECK(secp256k1_ec_pubkey_parse(CTX, NULL, NULL, 65) == 0);
5851 CHECK(ecount == 1);
5852 CHECK(ecount2 == 10);
5854 /* Try a bunch of prefabbed points with all possible encodings. */
5855 for (i = 0; i < SECP256K1_EC_PARSE_TEST_NVALID; i++) {
5856 ec_pubkey_parse_pointtest(valid[i], 1, 1);
5857 }
5858 for (i = 0; i < SECP256K1_EC_PARSE_TEST_NXVALID; i++) {
5859 ec_pubkey_parse_pointtest(onlyxvalid[i], 1, 0);
5860 }
5861 for (i = 0; i < SECP256K1_EC_PARSE_TEST_NINVALID; i++) {
5862 ec_pubkey_parse_pointtest(invalid[i], 0, 0);
5863 }
5864}
5865
5867 const unsigned char orderc[32] = {
5868 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5869 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
5870 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
5871 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41
5872 };
5873 const unsigned char zeros[sizeof(secp256k1_pubkey)] = {0x00};
5874 unsigned char ctmp[33];
5875 unsigned char ctmp2[33];
5876 secp256k1_pubkey pubkey;
5877 secp256k1_pubkey pubkey2;
5878 secp256k1_pubkey pubkey_one;
5879 secp256k1_pubkey pubkey_negone;
5880 const secp256k1_pubkey *pubkeys[3];
5881 size_t len;
5882 int32_t ecount;
5883 /* Group order is too large, reject. */
5884 CHECK(secp256k1_ec_seckey_verify(CTX, orderc) == 0);
5885 VG_UNDEF(&pubkey, sizeof(pubkey));
5886 CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey, orderc) == 0);
5887 VG_CHECK(&pubkey, sizeof(pubkey));
5888 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
5889 /* Maximum value is too large, reject. */
5890 memset(ctmp, 255, 32);
5892 memset(&pubkey, 1, sizeof(pubkey));
5893 VG_UNDEF(&pubkey, sizeof(pubkey));
5894 CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey, ctmp) == 0);
5895 VG_CHECK(&pubkey, sizeof(pubkey));
5896 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
5897 /* Zero is too small, reject. */
5898 memset(ctmp, 0, 32);
5900 memset(&pubkey, 1, sizeof(pubkey));
5901 VG_UNDEF(&pubkey, sizeof(pubkey));
5902 CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey, ctmp) == 0);
5903 VG_CHECK(&pubkey, sizeof(pubkey));
5904 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
5905 /* One must be accepted. */
5906 ctmp[31] = 0x01;
5908 memset(&pubkey, 0, sizeof(pubkey));
5909 VG_UNDEF(&pubkey, sizeof(pubkey));
5910 CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey, ctmp) == 1);
5911 VG_CHECK(&pubkey, sizeof(pubkey));
5912 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0);
5913 pubkey_one = pubkey;
5914 /* Group order + 1 is too large, reject. */
5915 memcpy(ctmp, orderc, 32);
5916 ctmp[31] = 0x42;
5918 memset(&pubkey, 1, sizeof(pubkey));
5919 VG_UNDEF(&pubkey, sizeof(pubkey));
5920 CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey, ctmp) == 0);
5921 VG_CHECK(&pubkey, sizeof(pubkey));
5922 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
5923 /* -1 must be accepted. */
5924 ctmp[31] = 0x40;
5926 memset(&pubkey, 0, sizeof(pubkey));
5927 VG_UNDEF(&pubkey, sizeof(pubkey));
5928 CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey, ctmp) == 1);
5929 VG_CHECK(&pubkey, sizeof(pubkey));
5930 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0);
5931 pubkey_negone = pubkey;
5932 /* Tweak of zero leaves the value unchanged. */
5933 memset(ctmp2, 0, 32);
5934 CHECK(secp256k1_ec_seckey_tweak_add(CTX, ctmp, ctmp2) == 1);
5935 CHECK(secp256k1_memcmp_var(orderc, ctmp, 31) == 0 && ctmp[31] == 0x40);
5936 memcpy(&pubkey2, &pubkey, sizeof(pubkey));
5937 CHECK(secp256k1_ec_pubkey_tweak_add(CTX, &pubkey, ctmp2) == 1);
5938 CHECK(secp256k1_memcmp_var(&pubkey, &pubkey2, sizeof(pubkey)) == 0);
5939 /* Multiply tweak of zero zeroizes the output. */
5940 CHECK(secp256k1_ec_seckey_tweak_mul(CTX, ctmp, ctmp2) == 0);
5941 CHECK(secp256k1_memcmp_var(zeros, ctmp, 32) == 0);
5942 CHECK(secp256k1_ec_pubkey_tweak_mul(CTX, &pubkey, ctmp2) == 0);
5943 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(pubkey)) == 0);
5944 memcpy(&pubkey, &pubkey2, sizeof(pubkey));
5945 /* If seckey_tweak_add or seckey_tweak_mul are called with an overflowing
5946 seckey, the seckey is zeroized. */
5947 memcpy(ctmp, orderc, 32);
5948 memset(ctmp2, 0, 32);
5949 ctmp2[31] = 0x01;
5950 CHECK(secp256k1_ec_seckey_verify(CTX, ctmp2) == 1);
5952 CHECK(secp256k1_ec_seckey_tweak_add(CTX, ctmp, ctmp2) == 0);
5953 CHECK(secp256k1_memcmp_var(zeros, ctmp, 32) == 0);
5954 memcpy(ctmp, orderc, 32);
5955 CHECK(secp256k1_ec_seckey_tweak_mul(CTX, ctmp, ctmp2) == 0);
5956 CHECK(secp256k1_memcmp_var(zeros, ctmp, 32) == 0);
5957 /* If seckey_tweak_add or seckey_tweak_mul are called with an overflowing
5958 tweak, the seckey is zeroized. */
5959 memcpy(ctmp, orderc, 32);
5960 ctmp[31] = 0x40;
5961 CHECK(secp256k1_ec_seckey_tweak_add(CTX, ctmp, orderc) == 0);
5962 CHECK(secp256k1_memcmp_var(zeros, ctmp, 32) == 0);
5963 memcpy(ctmp, orderc, 32);
5964 ctmp[31] = 0x40;
5965 CHECK(secp256k1_ec_seckey_tweak_mul(CTX, ctmp, orderc) == 0);
5966 CHECK(secp256k1_memcmp_var(zeros, ctmp, 32) == 0);
5967 memcpy(ctmp, orderc, 32);
5968 ctmp[31] = 0x40;
5969 /* If pubkey_tweak_add or pubkey_tweak_mul are called with an overflowing
5970 tweak, the pubkey is zeroized. */
5971 CHECK(secp256k1_ec_pubkey_tweak_add(CTX, &pubkey, orderc) == 0);
5972 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(pubkey)) == 0);
5973 memcpy(&pubkey, &pubkey2, sizeof(pubkey));
5974 CHECK(secp256k1_ec_pubkey_tweak_mul(CTX, &pubkey, orderc) == 0);
5975 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(pubkey)) == 0);
5976 memcpy(&pubkey, &pubkey2, sizeof(pubkey));
5977 /* If the resulting key in secp256k1_ec_seckey_tweak_add and
5978 * secp256k1_ec_pubkey_tweak_add is 0 the functions fail and in the latter
5979 * case the pubkey is zeroized. */
5980 memcpy(ctmp, orderc, 32);
5981 ctmp[31] = 0x40;
5982 memset(ctmp2, 0, 32);
5983 ctmp2[31] = 1;
5984 CHECK(secp256k1_ec_seckey_tweak_add(CTX, ctmp2, ctmp) == 0);
5985 CHECK(secp256k1_memcmp_var(zeros, ctmp2, 32) == 0);
5986 ctmp2[31] = 1;
5987 CHECK(secp256k1_ec_pubkey_tweak_add(CTX, &pubkey, ctmp2) == 0);
5988 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(pubkey)) == 0);
5989 memcpy(&pubkey, &pubkey2, sizeof(pubkey));
5990 /* Tweak computation wraps and results in a key of 1. */
5991 ctmp2[31] = 2;
5992 CHECK(secp256k1_ec_seckey_tweak_add(CTX, ctmp2, ctmp) == 1);
5993 CHECK(secp256k1_memcmp_var(ctmp2, zeros, 31) == 0 && ctmp2[31] == 1);
5994 ctmp2[31] = 2;
5995 CHECK(secp256k1_ec_pubkey_tweak_add(CTX, &pubkey, ctmp2) == 1);
5996 ctmp2[31] = 1;
5997 CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey2, ctmp2) == 1);
5998 CHECK(secp256k1_memcmp_var(&pubkey, &pubkey2, sizeof(pubkey)) == 0);
5999 /* Tweak mul * 2 = 1+1. */
6000 CHECK(secp256k1_ec_pubkey_tweak_add(CTX, &pubkey, ctmp2) == 1);
6001 ctmp2[31] = 2;
6002 CHECK(secp256k1_ec_pubkey_tweak_mul(CTX, &pubkey2, ctmp2) == 1);
6003 CHECK(secp256k1_memcmp_var(&pubkey, &pubkey2, sizeof(pubkey)) == 0);
6004 /* Test argument errors. */
6005 ecount = 0;
6007 CHECK(ecount == 0);
6008 /* Zeroize pubkey on parse error. */
6009 memset(&pubkey, 0, 32);
6010 CHECK(secp256k1_ec_pubkey_tweak_add(CTX, &pubkey, ctmp2) == 0);
6011 CHECK(ecount == 1);
6012 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(pubkey)) == 0);
6013 memcpy(&pubkey, &pubkey2, sizeof(pubkey));
6014 memset(&pubkey2, 0, 32);
6015 CHECK(secp256k1_ec_pubkey_tweak_mul(CTX, &pubkey2, ctmp2) == 0);
6016 CHECK(ecount == 2);
6017 CHECK(secp256k1_memcmp_var(&pubkey2, zeros, sizeof(pubkey2)) == 0);
6018 /* Plain argument errors. */
6019 ecount = 0;
6021 CHECK(ecount == 0);
6023 CHECK(ecount == 1);
6024 ecount = 0;
6025 memset(ctmp2, 0, 32);
6026 ctmp2[31] = 4;
6027 CHECK(secp256k1_ec_pubkey_tweak_add(CTX, NULL, ctmp2) == 0);
6028 CHECK(ecount == 1);
6029 CHECK(secp256k1_ec_pubkey_tweak_add(CTX, &pubkey, NULL) == 0);
6030 CHECK(ecount == 2);
6031 ecount = 0;
6032 memset(ctmp2, 0, 32);
6033 ctmp2[31] = 4;
6034 CHECK(secp256k1_ec_pubkey_tweak_mul(CTX, NULL, ctmp2) == 0);
6035 CHECK(ecount == 1);
6036 CHECK(secp256k1_ec_pubkey_tweak_mul(CTX, &pubkey, NULL) == 0);
6037 CHECK(ecount == 2);
6038 ecount = 0;
6039 memset(ctmp2, 0, 32);
6040 CHECK(secp256k1_ec_seckey_tweak_add(CTX, NULL, ctmp2) == 0);
6041 CHECK(ecount == 1);
6042 CHECK(secp256k1_ec_seckey_tweak_add(CTX, ctmp, NULL) == 0);
6043 CHECK(ecount == 2);
6044 ecount = 0;
6045 memset(ctmp2, 0, 32);
6046 ctmp2[31] = 1;
6047 CHECK(secp256k1_ec_seckey_tweak_mul(CTX, NULL, ctmp2) == 0);
6048 CHECK(ecount == 1);
6049 CHECK(secp256k1_ec_seckey_tweak_mul(CTX, ctmp, NULL) == 0);
6050 CHECK(ecount == 2);
6051 ecount = 0;
6052 CHECK(secp256k1_ec_pubkey_create(CTX, NULL, ctmp) == 0);
6053 CHECK(ecount == 1);
6054 memset(&pubkey, 1, sizeof(pubkey));
6055 CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey, NULL) == 0);
6056 CHECK(ecount == 2);
6057 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
6058 /* secp256k1_ec_pubkey_combine tests. */
6059 ecount = 0;
6060 pubkeys[0] = &pubkey_one;
6061 VG_UNDEF(&pubkeys[0], sizeof(secp256k1_pubkey *));
6062 VG_UNDEF(&pubkeys[1], sizeof(secp256k1_pubkey *));
6063 VG_UNDEF(&pubkeys[2], sizeof(secp256k1_pubkey *));
6064 memset(&pubkey, 255, sizeof(secp256k1_pubkey));
6065 VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey));
6066 CHECK(secp256k1_ec_pubkey_combine(CTX, &pubkey, pubkeys, 0) == 0);
6067 VG_CHECK(&pubkey, sizeof(secp256k1_pubkey));
6068 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
6069 CHECK(ecount == 1);
6070 CHECK(secp256k1_ec_pubkey_combine(CTX, NULL, pubkeys, 1) == 0);
6071 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
6072 CHECK(ecount == 2);
6073 memset(&pubkey, 255, sizeof(secp256k1_pubkey));
6074 VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey));
6075 CHECK(secp256k1_ec_pubkey_combine(CTX, &pubkey, NULL, 1) == 0);
6076 VG_CHECK(&pubkey, sizeof(secp256k1_pubkey));
6077 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
6078 CHECK(ecount == 3);
6079 pubkeys[0] = &pubkey_negone;
6080 memset(&pubkey, 255, sizeof(secp256k1_pubkey));
6081 VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey));
6082 CHECK(secp256k1_ec_pubkey_combine(CTX, &pubkey, pubkeys, 1) == 1);
6083 VG_CHECK(&pubkey, sizeof(secp256k1_pubkey));
6084 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0);
6085 CHECK(ecount == 3);
6086 len = 33;
6088 CHECK(secp256k1_ec_pubkey_serialize(CTX, ctmp2, &len, &pubkey_negone, SECP256K1_EC_COMPRESSED) == 1);
6089 CHECK(secp256k1_memcmp_var(ctmp, ctmp2, 33) == 0);
6090 /* Result is infinity. */
6091 pubkeys[0] = &pubkey_one;
6092 pubkeys[1] = &pubkey_negone;
6093 memset(&pubkey, 255, sizeof(secp256k1_pubkey));
6094 VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey));
6095 CHECK(secp256k1_ec_pubkey_combine(CTX, &pubkey, pubkeys, 2) == 0);
6096 VG_CHECK(&pubkey, sizeof(secp256k1_pubkey));
6097 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
6098 CHECK(ecount == 3);
6099 /* Passes through infinity but comes out one. */
6100 pubkeys[2] = &pubkey_one;
6101 memset(&pubkey, 255, sizeof(secp256k1_pubkey));
6102 VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey));
6103 CHECK(secp256k1_ec_pubkey_combine(CTX, &pubkey, pubkeys, 3) == 1);
6104 VG_CHECK(&pubkey, sizeof(secp256k1_pubkey));
6105 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0);
6106 CHECK(ecount == 3);
6107 len = 33;
6109 CHECK(secp256k1_ec_pubkey_serialize(CTX, ctmp2, &len, &pubkey_one, SECP256K1_EC_COMPRESSED) == 1);
6110 CHECK(secp256k1_memcmp_var(ctmp, ctmp2, 33) == 0);
6111 /* Adds to two. */
6112 pubkeys[1] = &pubkey_one;
6113 memset(&pubkey, 255, sizeof(secp256k1_pubkey));
6114 VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey));
6115 CHECK(secp256k1_ec_pubkey_combine(CTX, &pubkey, pubkeys, 2) == 1);
6116 VG_CHECK(&pubkey, sizeof(secp256k1_pubkey));
6117 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0);
6118 CHECK(ecount == 3);
6120}
6121
6123 unsigned char seckey[32];
6124 unsigned char seckey_tmp[32];
6125
6127 memcpy(seckey_tmp, seckey, 32);
6128
6129 /* Verify negation changes the key and changes it back */
6130 CHECK(secp256k1_ec_seckey_negate(CTX, seckey) == 1);
6131 CHECK(secp256k1_memcmp_var(seckey, seckey_tmp, 32) != 0);
6132 CHECK(secp256k1_ec_seckey_negate(CTX, seckey) == 1);
6133 CHECK(secp256k1_memcmp_var(seckey, seckey_tmp, 32) == 0);
6134
6135 /* Check that privkey alias gives same result */
6136 CHECK(secp256k1_ec_seckey_negate(CTX, seckey) == 1);
6137 CHECK(secp256k1_ec_privkey_negate(CTX, seckey_tmp) == 1);
6138 CHECK(secp256k1_memcmp_var(seckey, seckey_tmp, 32) == 0);
6139
6140 /* Negating all 0s fails */
6141 memset(seckey, 0, 32);
6142 memset(seckey_tmp, 0, 32);
6143 CHECK(secp256k1_ec_seckey_negate(CTX, seckey) == 0);
6144 /* Check that seckey is not modified */
6145 CHECK(secp256k1_memcmp_var(seckey, seckey_tmp, 32) == 0);
6146
6147 /* Negating an overflowing seckey fails and the seckey is zeroed. In this
6148 * test, the seckey has 16 random bytes to ensure that ec_seckey_negate
6149 * doesn't just set seckey to a constant value in case of failure. */
6151 memset(seckey, 0xFF, 16);
6152 memset(seckey_tmp, 0, 32);
6153 CHECK(secp256k1_ec_seckey_negate(CTX, seckey) == 0);
6154 CHECK(secp256k1_memcmp_var(seckey, seckey_tmp, 32) == 0);
6155}
6156
6157void random_sign(secp256k1_scalar *sigr, secp256k1_scalar *sigs, const secp256k1_scalar *key, const secp256k1_scalar *msg, int *recid) {
6158 secp256k1_scalar nonce;
6159 do {
6161 } while(!secp256k1_ecdsa_sig_sign(&CTX->ecmult_gen_ctx, sigr, sigs, key, msg, &nonce, recid));
6162}
6163
6165 secp256k1_gej pubj;
6166 secp256k1_ge pub;
6167 secp256k1_scalar one;
6168 secp256k1_scalar msg, key;
6169 secp256k1_scalar sigr, sigs;
6170 int getrec;
6171 int recid;
6174 secp256k1_ecmult_gen(&CTX->ecmult_gen_ctx, &pubj, &key);
6175 secp256k1_ge_set_gej(&pub, &pubj);
6176 getrec = secp256k1_testrand_bits(1);
6177 /* The specific way in which this conditional is written sidesteps a potential bug in clang.
6178 See the commit messages of the commit that introduced this comment for details. */
6179 if (getrec) {
6180 random_sign(&sigr, &sigs, &key, &msg, &recid);
6181 CHECK(recid >= 0 && recid < 4);
6182 } else {
6183 random_sign(&sigr, &sigs, &key, &msg, NULL);
6184 }
6185 CHECK(secp256k1_ecdsa_sig_verify(&sigr, &sigs, &pub, &msg));
6186 secp256k1_scalar_set_int(&one, 1);
6187 secp256k1_scalar_add(&msg, &msg, &one);
6188 CHECK(!secp256k1_ecdsa_sig_verify(&sigr, &sigs, &pub, &msg));
6189}
6190
6192 int i;
6193 for (i = 0; i < 10*COUNT; i++) {
6195 }
6196}
6197
6199static int precomputed_nonce_function(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) {
6200 (void)msg32;
6201 (void)key32;
6202 (void)algo16;
6203 memcpy(nonce32, data, 32);
6204 return (counter == 0);
6205}
6206
6207static 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) {
6208 /* Dummy nonce generator that has a fatal error on the first counter value. */
6209 if (counter == 0) {
6210 return 0;
6211 }
6212 return nonce_function_rfc6979(nonce32, msg32, key32, algo16, data, counter - 1);
6213}
6214
6215static 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) {
6216 /* Dummy nonce generator that produces unacceptable nonces for the first several counter values. */
6217 if (counter < 3) {
6218 memset(nonce32, counter==0 ? 0 : 255, 32);
6219 if (counter == 2) {
6220 nonce32[31]--;
6221 }
6222 return 1;
6223 }
6224 if (counter < 5) {
6225 static const unsigned char order[] = {
6226 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
6227 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
6228 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,
6229 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x41
6230 };
6231 memcpy(nonce32, order, 32);
6232 if (counter == 4) {
6233 nonce32[31]++;
6234 }
6235 return 1;
6236 }
6237 /* Retry rate of 6979 is negligible esp. as we only call this in deterministic tests. */
6238 /* If someone does fine a case where it retries for secp256k1, we'd like to know. */
6239 if (counter > 5) {
6240 return 0;
6241 }
6242 return nonce_function_rfc6979(nonce32, msg32, key32, algo16, data, counter - 5);
6243}
6244
6246 static const unsigned char res[sizeof(secp256k1_ecdsa_signature)] = {0};
6247 return secp256k1_memcmp_var(sig, res, sizeof(secp256k1_ecdsa_signature)) == 0;
6248}
6249
6251 unsigned char extra[32] = {0x00};
6252 unsigned char privkey[32];
6253 unsigned char message[32];
6254 unsigned char privkey2[32];
6255 secp256k1_ecdsa_signature signature[6];
6256 secp256k1_scalar r, s;
6257 unsigned char sig[74];
6258 size_t siglen = 74;
6259 unsigned char pubkeyc[65];
6260 size_t pubkeyclen = 65;
6261 secp256k1_pubkey pubkey;
6262 secp256k1_pubkey pubkey_tmp;
6263 unsigned char seckey[300];
6264 size_t seckeylen = 300;
6265
6266 /* Generate a random key and message. */
6267 {
6268 secp256k1_scalar msg, key;
6271 secp256k1_scalar_get_b32(privkey, &key);
6272 secp256k1_scalar_get_b32(message, &msg);
6273 }
6274
6275 /* Construct and verify corresponding public key. */
6276 CHECK(secp256k1_ec_seckey_verify(CTX, privkey) == 1);
6277 CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey, privkey) == 1);
6278
6279 /* Verify exporting and importing public key. */
6281 memset(&pubkey, 0, sizeof(pubkey));
6282 CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, pubkeyc, pubkeyclen) == 1);
6283
6284 /* Verify negation changes the key and changes it back */
6285 memcpy(&pubkey_tmp, &pubkey, sizeof(pubkey));
6286 CHECK(secp256k1_ec_pubkey_negate(CTX, &pubkey_tmp) == 1);
6287 CHECK(secp256k1_memcmp_var(&pubkey_tmp, &pubkey, sizeof(pubkey)) != 0);
6288 CHECK(secp256k1_ec_pubkey_negate(CTX, &pubkey_tmp) == 1);
6289 CHECK(secp256k1_memcmp_var(&pubkey_tmp, &pubkey, sizeof(pubkey)) == 0);
6290
6291 /* Verify private key import and export. */
6292 CHECK(ec_privkey_export_der(CTX, seckey, &seckeylen, privkey, secp256k1_testrand_bits(1) == 1));
6293 CHECK(ec_privkey_import_der(CTX, privkey2, seckey, seckeylen) == 1);
6294 CHECK(secp256k1_memcmp_var(privkey, privkey2, 32) == 0);
6295
6296 /* Optionally tweak the keys using addition. */
6297 if (secp256k1_testrand_int(3) == 0) {
6298 int ret1;
6299 int ret2;
6300 int ret3;
6301 unsigned char rnd[32];
6302 unsigned char privkey_tmp[32];
6303 secp256k1_pubkey pubkey2;
6305 memcpy(privkey_tmp, privkey, 32);
6306 ret1 = secp256k1_ec_seckey_tweak_add(CTX, privkey, rnd);
6307 ret2 = secp256k1_ec_pubkey_tweak_add(CTX, &pubkey, rnd);
6308 /* Check that privkey alias gives same result */
6309 ret3 = secp256k1_ec_privkey_tweak_add(CTX, privkey_tmp, rnd);
6310 CHECK(ret1 == ret2);
6311 CHECK(ret2 == ret3);
6312 if (ret1 == 0) {
6313 return;
6314 }
6315 CHECK(secp256k1_memcmp_var(privkey, privkey_tmp, 32) == 0);
6316 CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey2, privkey) == 1);
6317 CHECK(secp256k1_memcmp_var(&pubkey, &pubkey2, sizeof(pubkey)) == 0);
6318 }
6319
6320 /* Optionally tweak the keys using multiplication. */
6321 if (secp256k1_testrand_int(3) == 0) {
6322 int ret1;
6323 int ret2;
6324 int ret3;
6325 unsigned char rnd[32];
6326 unsigned char privkey_tmp[32];
6327 secp256k1_pubkey pubkey2;
6329 memcpy(privkey_tmp, privkey, 32);
6330 ret1 = secp256k1_ec_seckey_tweak_mul(CTX, privkey, rnd);
6331 ret2 = secp256k1_ec_pubkey_tweak_mul(CTX, &pubkey, rnd);
6332 /* Check that privkey alias gives same result */
6333 ret3 = secp256k1_ec_privkey_tweak_mul(CTX, privkey_tmp, rnd);
6334 CHECK(ret1 == ret2);
6335 CHECK(ret2 == ret3);
6336 if (ret1 == 0) {
6337 return;
6338 }
6339 CHECK(secp256k1_memcmp_var(privkey, privkey_tmp, 32) == 0);
6340 CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey2, privkey) == 1);
6341 CHECK(secp256k1_memcmp_var(&pubkey, &pubkey2, sizeof(pubkey)) == 0);
6342 }
6343
6344 /* Sign. */
6345 CHECK(secp256k1_ecdsa_sign(CTX, &signature[0], message, privkey, NULL, NULL) == 1);
6346 CHECK(secp256k1_ecdsa_sign(CTX, &signature[4], message, privkey, NULL, NULL) == 1);
6347 CHECK(secp256k1_ecdsa_sign(CTX, &signature[1], message, privkey, NULL, extra) == 1);
6348 extra[31] = 1;
6349 CHECK(secp256k1_ecdsa_sign(CTX, &signature[2], message, privkey, NULL, extra) == 1);
6350 extra[31] = 0;
6351 extra[0] = 1;
6352 CHECK(secp256k1_ecdsa_sign(CTX, &signature[3], message, privkey, NULL, extra) == 1);
6353 CHECK(secp256k1_memcmp_var(&signature[0], &signature[4], sizeof(signature[0])) == 0);
6354 CHECK(secp256k1_memcmp_var(&signature[0], &signature[1], sizeof(signature[0])) != 0);
6355 CHECK(secp256k1_memcmp_var(&signature[0], &signature[2], sizeof(signature[0])) != 0);
6356 CHECK(secp256k1_memcmp_var(&signature[0], &signature[3], sizeof(signature[0])) != 0);
6357 CHECK(secp256k1_memcmp_var(&signature[1], &signature[2], sizeof(signature[0])) != 0);
6358 CHECK(secp256k1_memcmp_var(&signature[1], &signature[3], sizeof(signature[0])) != 0);
6359 CHECK(secp256k1_memcmp_var(&signature[2], &signature[3], sizeof(signature[0])) != 0);
6360 /* Verify. */
6361 CHECK(secp256k1_ecdsa_verify(CTX, &signature[0], message, &pubkey) == 1);
6362 CHECK(secp256k1_ecdsa_verify(CTX, &signature[1], message, &pubkey) == 1);
6363 CHECK(secp256k1_ecdsa_verify(CTX, &signature[2], message, &pubkey) == 1);
6364 CHECK(secp256k1_ecdsa_verify(CTX, &signature[3], message, &pubkey) == 1);
6365 /* Test lower-S form, malleate, verify and fail, test again, malleate again */
6366 CHECK(!secp256k1_ecdsa_signature_normalize(CTX, NULL, &signature[0]));
6367 secp256k1_ecdsa_signature_load(CTX, &r, &s, &signature[0]);
6369 secp256k1_ecdsa_signature_save(&signature[5], &r, &s);
6370 CHECK(secp256k1_ecdsa_verify(CTX, &signature[5], message, &pubkey) == 0);
6371 CHECK(secp256k1_ecdsa_signature_normalize(CTX, NULL, &signature[5]));
6372 CHECK(secp256k1_ecdsa_signature_normalize(CTX, &signature[5], &signature[5]));
6373 CHECK(!secp256k1_ecdsa_signature_normalize(CTX, NULL, &signature[5]));
6374 CHECK(!secp256k1_ecdsa_signature_normalize(CTX, &signature[5], &signature[5]));
6375 CHECK(secp256k1_ecdsa_verify(CTX, &signature[5], message, &pubkey) == 1);
6377 secp256k1_ecdsa_signature_save(&signature[5], &r, &s);
6378 CHECK(!secp256k1_ecdsa_signature_normalize(CTX, NULL, &signature[5]));
6379 CHECK(secp256k1_ecdsa_verify(CTX, &signature[5], message, &pubkey) == 1);
6380 CHECK(secp256k1_memcmp_var(&signature[5], &signature[0], 64) == 0);
6381
6382 /* Serialize/parse DER and verify again */
6383 CHECK(secp256k1_ecdsa_signature_serialize_der(CTX, sig, &siglen, &signature[0]) == 1);
6384 memset(&signature[0], 0, sizeof(signature[0]));
6385 CHECK(secp256k1_ecdsa_signature_parse_der(CTX, &signature[0], sig, siglen) == 1);
6386 CHECK(secp256k1_ecdsa_verify(CTX, &signature[0], message, &pubkey) == 1);
6387 /* Serialize/destroy/parse DER and verify again. */
6388 siglen = 74;
6389 CHECK(secp256k1_ecdsa_signature_serialize_der(CTX, sig, &siglen, &signature[0]) == 1);
6391 CHECK(secp256k1_ecdsa_signature_parse_der(CTX, &signature[0], sig, siglen) == 0 ||
6392 secp256k1_ecdsa_verify(CTX, &signature[0], message, &pubkey) == 0);
6393}
6394
6396 secp256k1_ge elem;
6397 secp256k1_ge elem2;
6398 unsigned char in[65];
6399 /* Generate some randomly sized pubkeys. */
6400 size_t len = secp256k1_testrand_bits(2) == 0 ? 65 : 33;
6401 if (secp256k1_testrand_bits(2) == 0) {
6402 len = secp256k1_testrand_bits(6);
6403 }
6404 if (len == 65) {
6405 in[0] = secp256k1_testrand_bits(1) ? 4 : (secp256k1_testrand_bits(1) ? 6 : 7);
6406 } else {
6407 in[0] = secp256k1_testrand_bits(1) ? 2 : 3;
6408 }
6409 if (secp256k1_testrand_bits(3) == 0) {
6410 in[0] = secp256k1_testrand_bits(8);
6411 }
6412 if (len > 1) {
6413 secp256k1_testrand256(&in[1]);
6414 }
6415 if (len > 33) {
6416 secp256k1_testrand256(&in[33]);
6417 }
6418 if (secp256k1_eckey_pubkey_parse(&elem, in, len)) {
6419 unsigned char out[65];
6420 unsigned char firstb;
6421 int res;
6422 size_t size = len;
6423 firstb = in[0];
6424 /* If the pubkey can be parsed, it should round-trip... */
6425 CHECK(secp256k1_eckey_pubkey_serialize(&elem, out, &size, len == 33));
6426 CHECK(size == len);
6427 CHECK(secp256k1_memcmp_var(&in[1], &out[1], len-1) == 0);
6428 /* ... except for the type of hybrid inputs. */
6429 if ((in[0] != 6) && (in[0] != 7)) {
6430 CHECK(in[0] == out[0]);
6431 }
6432 size = 65;
6433 CHECK(secp256k1_eckey_pubkey_serialize(&elem, in, &size, 0));
6434 CHECK(size == 65);
6435 CHECK(secp256k1_eckey_pubkey_parse(&elem2, in, size));
6436 ge_equals_ge(&elem,&elem2);
6437 /* Check that the X9.62 hybrid type is checked. */
6438 in[0] = secp256k1_testrand_bits(1) ? 6 : 7;
6439 res = secp256k1_eckey_pubkey_parse(&elem2, in, size);
6440 if (firstb == 2 || firstb == 3) {
6441 if (in[0] == firstb + 4) {
6442 CHECK(res);
6443 } else {
6444 CHECK(!res);
6445 }
6446 }
6447 if (res) {
6448 ge_equals_ge(&elem,&elem2);
6449 CHECK(secp256k1_eckey_pubkey_serialize(&elem, out, &size, 0));
6450 CHECK(secp256k1_memcmp_var(&in[1], &out[1], 64) == 0);
6451 }
6452 }
6453}
6454
6456 unsigned char pk1_ser[33] = {
6457 0x02,
6458 0x58, 0x84, 0xb3, 0xa2, 0x4b, 0x97, 0x37, 0x88, 0x92, 0x38, 0xa6, 0x26, 0x62, 0x52, 0x35, 0x11,
6459 0xd0, 0x9a, 0xa1, 0x1b, 0x80, 0x0b, 0x5e, 0x93, 0x80, 0x26, 0x11, 0xef, 0x67, 0x4b, 0xd9, 0x23
6460 };
6461 const unsigned char pk2_ser[33] = {
6462 0x02,
6463 0xde, 0x36, 0x0e, 0x87, 0x59, 0x8f, 0x3c, 0x01, 0x36, 0x2a, 0x2a, 0xb8, 0xc6, 0xf4, 0x5e, 0x4d,
6464 0xb2, 0xc2, 0xd5, 0x03, 0xa7, 0xf9, 0xf1, 0x4f, 0xa8, 0xfa, 0x95, 0xa8, 0xe9, 0x69, 0x76, 0x1c
6465 };
6466 secp256k1_pubkey pk1;
6467 secp256k1_pubkey pk2;
6468 int32_t ecount = 0;
6469
6470 CHECK(secp256k1_ec_pubkey_parse(CTX, &pk1, pk1_ser, sizeof(pk1_ser)) == 1);
6471 CHECK(secp256k1_ec_pubkey_parse(CTX, &pk2, pk2_ser, sizeof(pk2_ser)) == 1);
6472
6474 CHECK(secp256k1_ec_pubkey_cmp(CTX, NULL, &pk2) < 0);
6475 CHECK(ecount == 1);
6476 CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk1, NULL) > 0);
6477 CHECK(ecount == 2);
6478 CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk1, &pk2) < 0);
6479 CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk2, &pk1) > 0);
6480 CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk1, &pk1) == 0);
6481 CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk2, &pk2) == 0);
6482 CHECK(ecount == 2);
6483 {
6484 secp256k1_pubkey pk_tmp;
6485 memset(&pk_tmp, 0, sizeof(pk_tmp)); /* illegal pubkey */
6486 CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk_tmp, &pk2) < 0);
6487 CHECK(ecount == 3);
6488 CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk_tmp, &pk_tmp) == 0);
6489 CHECK(ecount == 5);
6490 CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk2, &pk_tmp) > 0);
6491 CHECK(ecount == 6);
6492 }
6493
6495
6496 /* Make pk2 the same as pk1 but with 3 rather than 2. Note that in
6497 * an uncompressed encoding, these would have the opposite ordering */
6498 pk1_ser[0] = 3;
6499 CHECK(secp256k1_ec_pubkey_parse(CTX, &pk2, pk1_ser, sizeof(pk1_ser)) == 1);
6500 CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk1, &pk2) < 0);
6501 CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk2, &pk1) > 0);
6502}
6503
6505 int i;
6506 for (i = 0; i < 10*COUNT; i++) {
6508 }
6509}
6510
6512 int i;
6513 for (i = 0; i < 64*COUNT; i++) {
6515 }
6516}
6517
6518int test_ecdsa_der_parse(const unsigned char *sig, size_t siglen, int certainly_der, int certainly_not_der) {
6519 static const unsigned char zeroes[32] = {0};
6520
6521 int ret = 0;
6522
6524 unsigned char roundtrip_der[2048];
6525 unsigned char compact_der[64];
6526 size_t len_der = 2048;
6527 int parsed_der = 0, valid_der = 0, roundtrips_der = 0;
6528
6529 secp256k1_ecdsa_signature sig_der_lax;
6530 unsigned char roundtrip_der_lax[2048];
6531 unsigned char compact_der_lax[64];
6532 size_t len_der_lax = 2048;
6533 int parsed_der_lax = 0, valid_der_lax = 0, roundtrips_der_lax = 0;
6534
6535 parsed_der = secp256k1_ecdsa_signature_parse_der(CTX, &sig_der, sig, siglen);
6536 if (parsed_der) {
6537 ret |= (!secp256k1_ecdsa_signature_serialize_compact(CTX, compact_der, &sig_der)) << 0;
6538 valid_der = (secp256k1_memcmp_var(compact_der, zeroes, 32) != 0) && (secp256k1_memcmp_var(compact_der + 32, zeroes, 32) != 0);
6539 }
6540 if (valid_der) {
6541 ret |= (!secp256k1_ecdsa_signature_serialize_der(CTX, roundtrip_der, &len_der, &sig_der)) << 1;
6542 roundtrips_der = (len_der == siglen) && secp256k1_memcmp_var(roundtrip_der, sig, siglen) == 0;
6543 }
6544
6545 parsed_der_lax = ecdsa_signature_parse_der_lax(CTX, &sig_der_lax, sig, siglen);
6546 if (parsed_der_lax) {
6547 ret |= (!secp256k1_ecdsa_signature_serialize_compact(CTX, compact_der_lax, &sig_der_lax)) << 10;
6548 valid_der_lax = (secp256k1_memcmp_var(compact_der_lax, zeroes, 32) != 0) && (secp256k1_memcmp_var(compact_der_lax + 32, zeroes, 32) != 0);
6549 }
6550 if (valid_der_lax) {
6551 ret |= (!secp256k1_ecdsa_signature_serialize_der(CTX, roundtrip_der_lax, &len_der_lax, &sig_der_lax)) << 11;
6552 roundtrips_der_lax = (len_der_lax == siglen) && secp256k1_memcmp_var(roundtrip_der_lax, sig, siglen) == 0;
6553 }
6554
6555 if (certainly_der) {
6556 ret |= (!parsed_der) << 2;
6557 }
6558 if (certainly_not_der) {
6559 ret |= (parsed_der) << 17;
6560 }
6561 if (valid_der) {
6562 ret |= (!roundtrips_der) << 3;
6563 }
6564
6565 if (valid_der) {
6566 ret |= (!roundtrips_der_lax) << 12;
6567 ret |= (len_der != len_der_lax) << 13;
6568 ret |= ((len_der != len_der_lax) || (secp256k1_memcmp_var(roundtrip_der_lax, roundtrip_der, len_der) != 0)) << 14;
6569 }
6570 ret |= (roundtrips_der != roundtrips_der_lax) << 15;
6571 if (parsed_der) {
6572 ret |= (!parsed_der_lax) << 16;
6573 }
6574
6575 return ret;
6576}
6577
6578static void assign_big_endian(unsigned char *ptr, size_t ptrlen, uint32_t val) {
6579 size_t i;
6580 for (i = 0; i < ptrlen; i++) {
6581 int shift = ptrlen - 1 - i;
6582 if (shift >= 4) {
6583 ptr[i] = 0;
6584 } else {
6585 ptr[i] = (val >> shift) & 0xFF;
6586 }
6587 }
6588}
6589
6590static void damage_array(unsigned char *sig, size_t *len) {
6591 int pos;
6592 int action = secp256k1_testrand_bits(3);
6593 if (action < 1 && *len > 3) {
6594 /* Delete a byte. */
6595 pos = secp256k1_testrand_int(*len);
6596 memmove(sig + pos, sig + pos + 1, *len - pos - 1);
6597 (*len)--;
6598 return;
6599 } else if (action < 2 && *len < 2048) {
6600 /* Insert a byte. */
6601 pos = secp256k1_testrand_int(1 + *len);
6602 memmove(sig + pos + 1, sig + pos, *len - pos);
6603 sig[pos] = secp256k1_testrand_bits(8);
6604 (*len)++;
6605 return;
6606 } else if (action < 4) {
6607 /* Modify a byte. */
6609 return;
6610 } else { /* action < 8 */
6611 /* Modify a bit. */
6613 return;
6614 }
6615}
6616
6617static void random_ber_signature(unsigned char *sig, size_t *len, int* certainly_der, int* certainly_not_der) {
6618 int der;
6619 int nlow[2], nlen[2], nlenlen[2], nhbit[2], nhbyte[2], nzlen[2];
6620 size_t tlen, elen, glen;
6621 int indet;
6622 int n;
6623
6624 *len = 0;
6625 der = secp256k1_testrand_bits(2) == 0;
6626 *certainly_der = der;
6627 *certainly_not_der = 0;
6628 indet = der ? 0 : secp256k1_testrand_int(10) == 0;
6629
6630 for (n = 0; n < 2; n++) {
6631 /* 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) */
6632 nlow[n] = der ? 1 : (secp256k1_testrand_bits(3) != 0);
6633 /* The length of the number in bytes (the first byte of which will always be nonzero) */
6634 nlen[n] = nlow[n] ? secp256k1_testrand_int(33) : 32 + secp256k1_testrand_int(200) * secp256k1_testrand_bits(3) / 8;
6635 CHECK(nlen[n] <= 232);
6636 /* The top bit of the number. */
6637 nhbit[n] = (nlow[n] == 0 && nlen[n] == 32) ? 1 : (nlen[n] == 0 ? 0 : secp256k1_testrand_bits(1));
6638 /* The top byte of the number (after the potential hardcoded 16 0xFF characters for "high" 32 bytes numbers) */
6639 nhbyte[n] = nlen[n] == 0 ? 0 : (nhbit[n] ? 128 + secp256k1_testrand_bits(7) : 1 + secp256k1_testrand_int(127));
6640 /* 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) */
6641 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);
6642 if (nzlen[n] > ((nlen[n] == 0 || nhbit[n]) ? 1 : 0)) {
6643 *certainly_not_der = 1;
6644 }
6645 CHECK(nlen[n] + nzlen[n] <= 300);
6646 /* The length of the length descriptor for the number. 0 means short encoding, anything else is long encoding. */
6647 nlenlen[n] = nlen[n] + nzlen[n] < 128 ? 0 : (nlen[n] + nzlen[n] < 256 ? 1 : 2);
6648 if (!der) {
6649 /* nlenlen[n] max 127 bytes */
6650 int add = secp256k1_testrand_int(127 - nlenlen[n]) * secp256k1_testrand_bits(4) * secp256k1_testrand_bits(4) / 256;
6651 nlenlen[n] += add;
6652 if (add != 0) {
6653 *certainly_not_der = 1;
6654 }
6655 }
6656 CHECK(nlen[n] + nzlen[n] + nlenlen[n] <= 427);
6657 }
6658
6659 /* The total length of the data to go, so far */
6660 tlen = 2 + nlenlen[0] + nlen[0] + nzlen[0] + 2 + nlenlen[1] + nlen[1] + nzlen[1];
6661 CHECK(tlen <= 856);
6662
6663 /* The length of the garbage inside the tuple. */
6664 elen = (der || indet) ? 0 : secp256k1_testrand_int(980 - tlen) * secp256k1_testrand_bits(3) / 8;
6665 if (elen != 0) {
6666 *certainly_not_der = 1;
6667 }
6668 tlen += elen;
6669 CHECK(tlen <= 980);
6670
6671 /* The length of the garbage after the end of the tuple. */
6672 glen = der ? 0 : secp256k1_testrand_int(990 - tlen) * secp256k1_testrand_bits(3) / 8;
6673 if (glen != 0) {
6674 *certainly_not_der = 1;
6675 }
6676 CHECK(tlen + glen <= 990);
6677
6678 /* Write the tuple header. */
6679 sig[(*len)++] = 0x30;
6680 if (indet) {
6681 /* Indeterminate length */
6682 sig[(*len)++] = 0x80;
6683 *certainly_not_der = 1;
6684 } else {
6685 int tlenlen = tlen < 128 ? 0 : (tlen < 256 ? 1 : 2);
6686 if (!der) {
6687 int add = secp256k1_testrand_int(127 - tlenlen) * secp256k1_testrand_bits(4) * secp256k1_testrand_bits(4) / 256;
6688 tlenlen += add;
6689 if (add != 0) {
6690 *certainly_not_der = 1;
6691 }
6692 }
6693 if (tlenlen == 0) {
6694 /* Short length notation */
6695 sig[(*len)++] = tlen;
6696 } else {
6697 /* Long length notation */
6698 sig[(*len)++] = 128 + tlenlen;
6699 assign_big_endian(sig + *len, tlenlen, tlen);
6700 *len += tlenlen;
6701 }
6702 tlen += tlenlen;
6703 }
6704 tlen += 2;
6705 CHECK(tlen + glen <= 1119);
6706
6707 for (n = 0; n < 2; n++) {
6708 /* Write the integer header. */
6709 sig[(*len)++] = 0x02;
6710 if (nlenlen[n] == 0) {
6711 /* Short length notation */
6712 sig[(*len)++] = nlen[n] + nzlen[n];
6713 } else {
6714 /* Long length notation. */
6715 sig[(*len)++] = 128 + nlenlen[n];
6716 assign_big_endian(sig + *len, nlenlen[n], nlen[n] + nzlen[n]);
6717 *len += nlenlen[n];
6718 }
6719 /* Write zero padding */
6720 while (nzlen[n] > 0) {
6721 sig[(*len)++] = 0x00;
6722 nzlen[n]--;
6723 }
6724 if (nlen[n] == 32 && !nlow[n]) {
6725 /* Special extra 16 0xFF bytes in "high" 32-byte numbers */
6726 int i;
6727 for (i = 0; i < 16; i++) {
6728 sig[(*len)++] = 0xFF;
6729 }
6730 nlen[n] -= 16;
6731 }
6732 /* Write first byte of number */
6733 if (nlen[n] > 0) {
6734 sig[(*len)++] = nhbyte[n];
6735 nlen[n]--;
6736 }
6737 /* Generate remaining random bytes of number */
6738 secp256k1_testrand_bytes_test(sig + *len, nlen[n]);
6739 *len += nlen[n];
6740 nlen[n] = 0;
6741 }
6742
6743 /* Generate random garbage inside tuple. */
6744 secp256k1_testrand_bytes_test(sig + *len, elen);
6745 *len += elen;
6746
6747 /* Generate end-of-contents bytes. */
6748 if (indet) {
6749 sig[(*len)++] = 0;
6750 sig[(*len)++] = 0;
6751 tlen += 2;
6752 }
6753 CHECK(tlen + glen <= 1121);
6754
6755 /* Generate random garbage outside tuple. */
6756 secp256k1_testrand_bytes_test(sig + *len, glen);
6757 *len += glen;
6758 tlen += glen;
6759 CHECK(tlen <= 1121);
6760 CHECK(tlen == *len);
6761}
6762
6764 int i,j;
6765 for (i = 0; i < 200 * COUNT; i++) {
6766 unsigned char buffer[2048];
6767 size_t buflen = 0;
6768 int certainly_der = 0;
6769 int certainly_not_der = 0;
6770 random_ber_signature(buffer, &buflen, &certainly_der, &certainly_not_der);
6771 CHECK(buflen <= 2048);
6772 for (j = 0; j < 16; j++) {
6773 int ret = 0;
6774 if (j > 0) {
6775 damage_array(buffer, &buflen);
6776 /* We don't know anything anymore about the DERness of the result */
6777 certainly_der = 0;
6778 certainly_not_der = 0;
6779 }
6780 ret = test_ecdsa_der_parse(buffer, buflen, certainly_der, certainly_not_der);
6781 if (ret != 0) {
6782 size_t k;
6783 fprintf(stderr, "Failure %x on ", ret);
6784 for (k = 0; k < buflen; k++) {
6785 fprintf(stderr, "%02x ", buffer[k]);
6786 }
6787 fprintf(stderr, "\n");
6788 }
6789 CHECK(ret == 0);
6790 }
6791 }
6792}
6793
6794/* Tests several edge cases. */
6796 int t;
6798
6799 /* Test the case where ECDSA recomputes a point that is infinity. */
6800 {
6801 secp256k1_gej keyj;
6802 secp256k1_ge key;
6803 secp256k1_scalar msg;
6804 secp256k1_scalar sr, ss;
6806 secp256k1_scalar_negate(&ss, &ss);
6807 secp256k1_scalar_inverse(&ss, &ss);
6810 secp256k1_ge_set_gej(&key, &keyj);
6811 msg = ss;
6812 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 0);
6813 }
6814
6815 /* Verify signature with r of zero fails. */
6816 {
6817 const unsigned char pubkey_mods_zero[33] = {
6818 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
6819 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
6820 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0,
6821 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41,
6822 0x41
6823 };
6824 secp256k1_ge key;
6825 secp256k1_scalar msg;
6826 secp256k1_scalar sr, ss;
6828 secp256k1_scalar_set_int(&msg, 0);
6830 CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey_mods_zero, 33));
6831 CHECK(secp256k1_ecdsa_sig_verify( &sr, &ss, &key, &msg) == 0);
6832 }
6833
6834 /* Verify signature with s of zero fails. */
6835 {
6836 const unsigned char pubkey[33] = {
6837 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6838 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6839 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6840 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6841 0x01
6842 };
6843 secp256k1_ge key;
6844 secp256k1_scalar msg;
6845 secp256k1_scalar sr, ss;
6847 secp256k1_scalar_set_int(&msg, 0);
6849 CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33));
6850 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 0);
6851 }
6852
6853 /* Verify signature with message 0 passes. */
6854 {
6855 const unsigned char pubkey[33] = {
6856 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6857 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6858 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6859 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6860 0x02
6861 };
6862 const unsigned char pubkey2[33] = {
6863 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
6864 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
6865 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0,
6866 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41,
6867 0x43
6868 };
6869 secp256k1_ge key;
6870 secp256k1_ge key2;
6871 secp256k1_scalar msg;
6872 secp256k1_scalar sr, ss;
6874 secp256k1_scalar_set_int(&msg, 0);
6876 CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33));
6877 CHECK(secp256k1_eckey_pubkey_parse(&key2, pubkey2, 33));
6878 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 1);
6879 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key2, &msg) == 1);
6880 secp256k1_scalar_negate(&ss, &ss);
6881 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 1);
6882 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key2, &msg) == 1);
6884 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 0);
6885 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key2, &msg) == 0);
6886 }
6887
6888 /* Verify signature with message 1 passes. */
6889 {
6890 const unsigned char pubkey[33] = {
6891 0x02, 0x14, 0x4e, 0x5a, 0x58, 0xef, 0x5b, 0x22,
6892 0x6f, 0xd2, 0xe2, 0x07, 0x6a, 0x77, 0xcf, 0x05,
6893 0xb4, 0x1d, 0xe7, 0x4a, 0x30, 0x98, 0x27, 0x8c,
6894 0x93, 0xe6, 0xe6, 0x3c, 0x0b, 0xc4, 0x73, 0x76,
6895 0x25
6896 };
6897 const unsigned char pubkey2[33] = {
6898 0x02, 0x8a, 0xd5, 0x37, 0xed, 0x73, 0xd9, 0x40,
6899 0x1d, 0xa0, 0x33, 0xd2, 0xdc, 0xf0, 0xaf, 0xae,
6900 0x34, 0xcf, 0x5f, 0x96, 0x4c, 0x73, 0x28, 0x0f,
6901 0x92, 0xc0, 0xf6, 0x9d, 0xd9, 0xb2, 0x09, 0x10,
6902 0x62
6903 };
6904 const unsigned char csr[32] = {
6905 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6906 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
6907 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4,
6908 0x40, 0x2d, 0xa1, 0x72, 0x2f, 0xc9, 0xba, 0xeb
6909 };
6910 secp256k1_ge key;
6911 secp256k1_ge key2;
6912 secp256k1_scalar msg;
6913 secp256k1_scalar sr, ss;
6915 secp256k1_scalar_set_int(&msg, 1);
6916 secp256k1_scalar_set_b32(&sr, csr, NULL);
6917 CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33));
6918 CHECK(secp256k1_eckey_pubkey_parse(&key2, pubkey2, 33));
6919 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 1);
6920 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key2, &msg) == 1);
6921 secp256k1_scalar_negate(&ss, &ss);
6922 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 1);
6923 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key2, &msg) == 1);
6926 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 0);
6927 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key2, &msg) == 0);
6928 }
6929
6930 /* Verify signature with message -1 passes. */
6931 {
6932 const unsigned char pubkey[33] = {
6933 0x03, 0xaf, 0x97, 0xff, 0x7d, 0x3a, 0xf6, 0xa0,
6934 0x02, 0x94, 0xbd, 0x9f, 0x4b, 0x2e, 0xd7, 0x52,
6935 0x28, 0xdb, 0x49, 0x2a, 0x65, 0xcb, 0x1e, 0x27,
6936 0x57, 0x9c, 0xba, 0x74, 0x20, 0xd5, 0x1d, 0x20,
6937 0xf1
6938 };
6939 const unsigned char csr[32] = {
6940 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6941 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
6942 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4,
6943 0x40, 0x2d, 0xa1, 0x72, 0x2f, 0xc9, 0xba, 0xee
6944 };
6945 secp256k1_ge key;
6946 secp256k1_scalar msg;
6947 secp256k1_scalar sr, ss;
6949 secp256k1_scalar_set_int(&msg, 1);
6950 secp256k1_scalar_negate(&msg, &msg);
6951 secp256k1_scalar_set_b32(&sr, csr, NULL);
6952 CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33));
6953 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 1);
6954 secp256k1_scalar_negate(&ss, &ss);
6955 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 1);
6958 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 0);
6959 }
6960
6961 /* Signature where s would be zero. */
6962 {
6963 secp256k1_pubkey pubkey;
6964 size_t siglen;
6965 int32_t ecount;
6966 unsigned char signature[72];
6967 static const unsigned char nonce[32] = {
6968 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6969 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6970 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6971 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
6972 };
6973 static const unsigned char nonce2[32] = {
6974 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
6975 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
6976 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,
6977 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x40
6978 };
6979 const unsigned char key[32] = {
6980 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6981 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6982 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6983 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
6984 };
6985 unsigned char msg[32] = {
6986 0x86, 0x41, 0x99, 0x81, 0x06, 0x23, 0x44, 0x53,
6987 0xaa, 0x5f, 0x9d, 0x6a, 0x31, 0x78, 0xf4, 0xf7,
6988 0xb8, 0x12, 0xe0, 0x0b, 0x81, 0x7a, 0x77, 0x62,
6989 0x65, 0xdf, 0xdd, 0x31, 0xb9, 0x3e, 0x29, 0xa9,
6990 };
6991 ecount = 0;
6993 CHECK(secp256k1_ecdsa_sign(CTX, &sig, msg, key, precomputed_nonce_function, nonce) == 0);
6994 CHECK(secp256k1_ecdsa_sign(CTX, &sig, msg, key, precomputed_nonce_function, nonce2) == 0);
6995 msg[31] = 0xaa;
6996 CHECK(secp256k1_ecdsa_sign(CTX, &sig, msg, key, precomputed_nonce_function, nonce) == 1);
6997 CHECK(ecount == 0);
6998 CHECK(secp256k1_ecdsa_sign(CTX, NULL, msg, key, precomputed_nonce_function, nonce2) == 0);
6999 CHECK(ecount == 1);
7000 CHECK(secp256k1_ecdsa_sign(CTX, &sig, NULL, key, precomputed_nonce_function, nonce2) == 0);
7001 CHECK(ecount == 2);
7002 CHECK(secp256k1_ecdsa_sign(CTX, &sig, msg, NULL, precomputed_nonce_function, nonce2) == 0);
7003 CHECK(ecount == 3);
7004 CHECK(secp256k1_ecdsa_sign(CTX, &sig, msg, key, precomputed_nonce_function, nonce2) == 1);
7005 CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey, key) == 1);
7006 CHECK(secp256k1_ecdsa_verify(CTX, NULL, msg, &pubkey) == 0);
7007 CHECK(ecount == 4);
7008 CHECK(secp256k1_ecdsa_verify(CTX, &sig, NULL, &pubkey) == 0);
7009 CHECK(ecount == 5);
7010 CHECK(secp256k1_ecdsa_verify(CTX, &sig, msg, NULL) == 0);
7011 CHECK(ecount == 6);
7012 CHECK(secp256k1_ecdsa_verify(CTX, &sig, msg, &pubkey) == 1);
7013 CHECK(ecount == 6);
7014 CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey, NULL) == 0);
7015 CHECK(ecount == 7);
7016 /* That pubkeyload fails via an ARGCHECK is a little odd but makes sense because pubkeys are an opaque data type. */
7017 CHECK(secp256k1_ecdsa_verify(CTX, &sig, msg, &pubkey) == 0);
7018 CHECK(ecount == 8);
7019 siglen = 72;
7020 CHECK(secp256k1_ecdsa_signature_serialize_der(CTX, NULL, &siglen, &sig) == 0);
7021 CHECK(ecount == 9);
7022 CHECK(secp256k1_ecdsa_signature_serialize_der(CTX, signature, NULL, &sig) == 0);
7023 CHECK(ecount == 10);
7024 CHECK(secp256k1_ecdsa_signature_serialize_der(CTX, signature, &siglen, NULL) == 0);
7025 CHECK(ecount == 11);
7026 CHECK(secp256k1_ecdsa_signature_serialize_der(CTX, signature, &siglen, &sig) == 1);
7027 CHECK(ecount == 11);
7028 CHECK(secp256k1_ecdsa_signature_parse_der(CTX, NULL, signature, siglen) == 0);
7029 CHECK(ecount == 12);
7030 CHECK(secp256k1_ecdsa_signature_parse_der(CTX, &sig, NULL, siglen) == 0);
7031 CHECK(ecount == 13);
7032 CHECK(secp256k1_ecdsa_signature_parse_der(CTX, &sig, signature, siglen) == 1);
7033 CHECK(ecount == 13);
7034 siglen = 10;
7035 /* Too little room for a signature does not fail via ARGCHECK. */
7036 CHECK(secp256k1_ecdsa_signature_serialize_der(CTX, signature, &siglen, &sig) == 0);
7037 CHECK(ecount == 13);
7038 ecount = 0;
7040 CHECK(ecount == 1);
7042 CHECK(ecount == 2);
7044 CHECK(ecount == 3);
7046 CHECK(ecount == 3);
7047 CHECK(secp256k1_ecdsa_signature_parse_compact(CTX, NULL, signature) == 0);
7048 CHECK(ecount == 4);
7050 CHECK(ecount == 5);
7052 CHECK(ecount == 5);
7053 memset(signature, 255, 64);
7055 CHECK(ecount == 5);
7057 }
7058
7059 /* Nonce function corner cases. */
7060 for (t = 0; t < 2; t++) {
7061 static const unsigned char zero[32] = {0x00};
7062 int i;
7063 unsigned char key[32];
7064 unsigned char msg[32];
7066 secp256k1_scalar sr[512], ss;
7067 const unsigned char *extra;
7068 extra = t == 0 ? NULL : zero;
7069 memset(msg, 0, 32);
7070 msg[31] = 1;
7071 /* High key results in signature failure. */
7072 memset(key, 0xFF, 32);
7073 CHECK(secp256k1_ecdsa_sign(CTX, &sig, msg, key, NULL, extra) == 0);
7075 /* Zero key results in signature failure. */
7076 memset(key, 0, 32);
7077 CHECK(secp256k1_ecdsa_sign(CTX, &sig, msg, key, NULL, extra) == 0);
7079 /* Nonce function failure results in signature failure. */
7080 key[31] = 1;
7081 CHECK(secp256k1_ecdsa_sign(CTX, &sig, msg, key, nonce_function_test_fail, extra) == 0);
7083 /* The retry loop successfully makes its way to the first good value. */
7084 CHECK(secp256k1_ecdsa_sign(CTX, &sig, msg, key, nonce_function_test_retry, extra) == 1);
7086 CHECK(secp256k1_ecdsa_sign(CTX, &sig2, msg, key, nonce_function_rfc6979, extra) == 1);
7087 CHECK(!is_empty_signature(&sig2));
7088 CHECK(secp256k1_memcmp_var(&sig, &sig2, sizeof(sig)) == 0);
7089 /* The default nonce function is deterministic. */
7090 CHECK(secp256k1_ecdsa_sign(CTX, &sig2, msg, key, NULL, extra) == 1);
7091 CHECK(!is_empty_signature(&sig2));
7092 CHECK(secp256k1_memcmp_var(&sig, &sig2, sizeof(sig)) == 0);
7093 /* The default nonce function changes output with different messages. */
7094 for(i = 0; i < 256; i++) {
7095 int j;
7096 msg[0] = i;
7097 CHECK(secp256k1_ecdsa_sign(CTX, &sig2, msg, key, NULL, extra) == 1);
7098 CHECK(!is_empty_signature(&sig2));
7099 secp256k1_ecdsa_signature_load(CTX, &sr[i], &ss, &sig2);
7100 for (j = 0; j < i; j++) {
7101 CHECK(!secp256k1_scalar_eq(&sr[i], &sr[j]));
7102 }
7103 }
7104 msg[0] = 0;
7105 msg[31] = 2;
7106 /* The default nonce function changes output with different keys. */
7107 for(i = 256; i < 512; i++) {
7108 int j;
7109 key[0] = i - 256;
7110 CHECK(secp256k1_ecdsa_sign(CTX, &sig2, msg, key, NULL, extra) == 1);
7111 CHECK(!is_empty_signature(&sig2));
7112 secp256k1_ecdsa_signature_load(CTX, &sr[i], &ss, &sig2);
7113 for (j = 0; j < i; j++) {
7114 CHECK(!secp256k1_scalar_eq(&sr[i], &sr[j]));
7115 }
7116 }
7117 key[0] = 0;
7118 }
7119
7120 {
7121 /* Check that optional nonce arguments do not have equivalent effect. */
7122 const unsigned char zeros[32] = {0};
7123 unsigned char nonce[32];
7124 unsigned char nonce2[32];
7125 unsigned char nonce3[32];
7126 unsigned char nonce4[32];
7127 VG_UNDEF(nonce,32);
7128 VG_UNDEF(nonce2,32);
7129 VG_UNDEF(nonce3,32);
7130 VG_UNDEF(nonce4,32);
7131 CHECK(nonce_function_rfc6979(nonce, zeros, zeros, NULL, NULL, 0) == 1);
7132 VG_CHECK(nonce,32);
7133 CHECK(nonce_function_rfc6979(nonce2, zeros, zeros, zeros, NULL, 0) == 1);
7134 VG_CHECK(nonce2,32);
7135 CHECK(nonce_function_rfc6979(nonce3, zeros, zeros, NULL, (void *)zeros, 0) == 1);
7136 VG_CHECK(nonce3,32);
7137 CHECK(nonce_function_rfc6979(nonce4, zeros, zeros, zeros, (void *)zeros, 0) == 1);
7138 VG_CHECK(nonce4,32);
7139 CHECK(secp256k1_memcmp_var(nonce, nonce2, 32) != 0);
7140 CHECK(secp256k1_memcmp_var(nonce, nonce3, 32) != 0);
7141 CHECK(secp256k1_memcmp_var(nonce, nonce4, 32) != 0);
7142 CHECK(secp256k1_memcmp_var(nonce2, nonce3, 32) != 0);
7143 CHECK(secp256k1_memcmp_var(nonce2, nonce4, 32) != 0);
7144 CHECK(secp256k1_memcmp_var(nonce3, nonce4, 32) != 0);
7145 }
7146
7147
7148 /* Privkey export where pubkey is the point at infinity. */
7149 {
7150 unsigned char privkey[300];
7151 unsigned char seckey[32] = {
7152 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
7153 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
7154 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
7155 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41,
7156 };
7157 size_t outlen = 300;
7158 CHECK(!ec_privkey_export_der(CTX, privkey, &outlen, seckey, 0));
7159 outlen = 300;
7160 CHECK(!ec_privkey_export_der(CTX, privkey, &outlen, seckey, 1));
7161 }
7162}
7163
7166}
7167
7168#ifdef ENABLE_MODULE_ECDH
7169# include "modules/ecdh/tests_impl.h"
7170#endif
7171
7172#ifdef ENABLE_MODULE_MULTISET
7174#endif
7175
7176#ifdef ENABLE_MODULE_RECOVERY
7178#endif
7179
7180#ifdef ENABLE_MODULE_SCHNORR
7182#endif
7183
7184#ifdef ENABLE_MODULE_EXTRAKEYS
7186#endif
7187
7188#ifdef ENABLE_MODULE_SCHNORRSIG
7190#endif
7191
7193 unsigned char buf1[6] = {1, 2, 3, 4, 5, 6};
7194 unsigned char buf2[sizeof(buf1)];
7195
7196 /* secp256k1_memczero(..., ..., 0) is a noop. */
7197 memcpy(buf2, buf1, sizeof(buf1));
7198 secp256k1_memczero(buf1, sizeof(buf1), 0);
7199 CHECK(secp256k1_memcmp_var(buf1, buf2, sizeof(buf1)) == 0);
7200
7201 /* secp256k1_memczero(..., ..., 1) zeros the buffer. */
7202 memset(buf2, 0, sizeof(buf2));
7203 secp256k1_memczero(buf1, sizeof(buf1) , 1);
7204 CHECK(secp256k1_memcmp_var(buf1, buf2, sizeof(buf1)) == 0);
7205}
7206
7208 const uint32_t x = 0xFF03AB45;
7209 const unsigned char x_be[4] = {0xFF, 0x03, 0xAB, 0x45};
7210 unsigned char buf[4];
7211 uint32_t x_;
7212
7213 secp256k1_write_be32(buf, x);
7214 CHECK(secp256k1_memcmp_var(buf, x_be, sizeof(buf)) == 0);
7215
7216 x_ = secp256k1_read_be32(buf);
7217 CHECK(x == x_);
7218}
7219
7220void int_cmov_test(void) {
7221 int r = INT_MAX;
7222 int a = 0;
7223
7224 secp256k1_int_cmov(&r, &a, 0);
7225 CHECK(r == INT_MAX);
7226
7227 r = 0; a = INT_MAX;
7228 secp256k1_int_cmov(&r, &a, 1);
7229 CHECK(r == INT_MAX);
7230
7231 a = 0;
7232 secp256k1_int_cmov(&r, &a, 1);
7233 CHECK(r == 0);
7234
7235 a = 1;
7236 secp256k1_int_cmov(&r, &a, 1);
7237 CHECK(r == 1);
7238
7239 r = 1; a = 0;
7240 secp256k1_int_cmov(&r, &a, 0);
7241 CHECK(r == 1);
7242
7243}
7244
7245void fe_cmov_test(void) {
7246 static const secp256k1_fe zero = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0);
7247 static const secp256k1_fe one = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1);
7248 static const secp256k1_fe max = SECP256K1_FE_CONST(
7249 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
7250 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL
7251 );
7252 secp256k1_fe r = max;
7253 secp256k1_fe a = zero;
7254
7255 secp256k1_fe_cmov(&r, &a, 0);
7256 CHECK(secp256k1_memcmp_var(&r, &max, sizeof(r)) == 0);
7257
7258 r = zero; a = max;
7259 secp256k1_fe_cmov(&r, &a, 1);
7260 CHECK(secp256k1_memcmp_var(&r, &max, sizeof(r)) == 0);
7261
7262 a = zero;
7263 secp256k1_fe_cmov(&r, &a, 1);
7264 CHECK(secp256k1_memcmp_var(&r, &zero, sizeof(r)) == 0);
7265
7266 a = one;
7267 secp256k1_fe_cmov(&r, &a, 1);
7268 CHECK(secp256k1_memcmp_var(&r, &one, sizeof(r)) == 0);
7269
7270 r = one; a = zero;
7271 secp256k1_fe_cmov(&r, &a, 0);
7272 CHECK(secp256k1_memcmp_var(&r, &one, sizeof(r)) == 0);
7273}
7274
7276 static const secp256k1_fe_storage zero = SECP256K1_FE_STORAGE_CONST(0, 0, 0, 0, 0, 0, 0, 0);
7277 static const secp256k1_fe_storage one = SECP256K1_FE_STORAGE_CONST(0, 0, 0, 0, 0, 0, 0, 1);
7279 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
7280 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL
7281 );
7282 secp256k1_fe_storage r = max;
7283 secp256k1_fe_storage a = zero;
7284
7285 secp256k1_fe_storage_cmov(&r, &a, 0);
7286 CHECK(secp256k1_memcmp_var(&r, &max, sizeof(r)) == 0);
7287
7288 r = zero; a = max;
7289 secp256k1_fe_storage_cmov(&r, &a, 1);
7290 CHECK(secp256k1_memcmp_var(&r, &max, sizeof(r)) == 0);
7291
7292 a = zero;
7293 secp256k1_fe_storage_cmov(&r, &a, 1);
7294 CHECK(secp256k1_memcmp_var(&r, &zero, sizeof(r)) == 0);
7295
7296 a = one;
7297 secp256k1_fe_storage_cmov(&r, &a, 1);
7298 CHECK(secp256k1_memcmp_var(&r, &one, sizeof(r)) == 0);
7299
7300 r = one; a = zero;
7301 secp256k1_fe_storage_cmov(&r, &a, 0);
7302 CHECK(secp256k1_memcmp_var(&r, &one, sizeof(r)) == 0);
7303}
7304
7306 static const secp256k1_scalar zero = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0);
7307 static const secp256k1_scalar one = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1);
7308 static const secp256k1_scalar max = SECP256K1_SCALAR_CONST(
7309 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
7310 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL
7311 );
7312 secp256k1_scalar r = max;
7313 secp256k1_scalar a = zero;
7314
7315 secp256k1_scalar_cmov(&r, &a, 0);
7316 CHECK(secp256k1_memcmp_var(&r, &max, sizeof(r)) == 0);
7317
7318 r = zero; a = max;
7319 secp256k1_scalar_cmov(&r, &a, 1);
7320 CHECK(secp256k1_memcmp_var(&r, &max, sizeof(r)) == 0);
7321
7322 a = zero;
7323 secp256k1_scalar_cmov(&r, &a, 1);
7324 CHECK(secp256k1_memcmp_var(&r, &zero, sizeof(r)) == 0);
7325
7326 a = one;
7327 secp256k1_scalar_cmov(&r, &a, 1);
7328 CHECK(secp256k1_memcmp_var(&r, &one, sizeof(r)) == 0);
7329
7330 r = one; a = zero;
7331 secp256k1_scalar_cmov(&r, &a, 0);
7332 CHECK(secp256k1_memcmp_var(&r, &one, sizeof(r)) == 0);
7333}
7334
7336 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);
7337 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);
7339 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
7340 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
7341 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
7342 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL
7343 );
7344 secp256k1_ge_storage r = max;
7345 secp256k1_ge_storage a = zero;
7346
7347 secp256k1_ge_storage_cmov(&r, &a, 0);
7348 CHECK(secp256k1_memcmp_var(&r, &max, sizeof(r)) == 0);
7349
7350 r = zero; a = max;
7351 secp256k1_ge_storage_cmov(&r, &a, 1);
7352 CHECK(secp256k1_memcmp_var(&r, &max, sizeof(r)) == 0);
7353
7354 a = zero;
7355 secp256k1_ge_storage_cmov(&r, &a, 1);
7356 CHECK(secp256k1_memcmp_var(&r, &zero, sizeof(r)) == 0);
7357
7358 a = one;
7359 secp256k1_ge_storage_cmov(&r, &a, 1);
7360 CHECK(secp256k1_memcmp_var(&r, &one, sizeof(r)) == 0);
7361
7362 r = one; a = zero;
7363 secp256k1_ge_storage_cmov(&r, &a, 0);
7364 CHECK(secp256k1_memcmp_var(&r, &one, sizeof(r)) == 0);
7365}
7366
7367void run_cmov_tests(void) {
7368 int_cmov_test();
7369 fe_cmov_test();
7373}
7374
7375int main(int argc, char **argv) {
7376 /* Disable buffering for stdout to improve reliability of getting
7377 * diagnostic information. Happens right at the start of main because
7378 * setbuf must be used before any other operation on the stream. */
7379 setbuf(stdout, NULL);
7380 /* Also disable buffering for stderr because it's not guaranteed that it's
7381 * unbuffered on all systems. */
7382 setbuf(stderr, NULL);
7383
7384 /* find iteration count */
7385 if (argc > 1) {
7386 COUNT = strtol(argv[1], NULL, 0);
7387 } else {
7388 const char* env = getenv("SECP256K1_TEST_ITERS");
7389 if (env && strlen(env) > 0) {
7390 COUNT = strtol(env, NULL, 0);
7391 }
7392 }
7393 if (COUNT <= 0) {
7394 fputs("An iteration count of 0 or less is not allowed.\n", stderr);
7395 return EXIT_FAILURE;
7396 }
7397 printf("test count = %i\n", COUNT);
7398
7399 /* find random seed */
7400 secp256k1_testrand_init(argc > 2 ? argv[2] : NULL);
7401
7402 /*** Setup test environment ***/
7403
7404 /* Create a global context available to all tests */
7406 /* Randomize the context only with probability 15/16
7407 to make sure we test without context randomization from time to time.
7408 TODO Reconsider this when recalibrating the tests. */
7409 if (secp256k1_testrand_bits(4)) {
7410 unsigned char rand32[32];
7411 secp256k1_testrand256(rand32);
7413 }
7414 /* Make a writable copy of secp256k1_context_static in order to test the effect of API functions
7415 that write to the context. The API does not support cloning the static context, so we use
7416 memcpy instead. The user is not supposed to copy a context but we should still ensure that
7417 the API functions handle copies of the static context gracefully. */
7418 STATIC_CTX = malloc(sizeof(*secp256k1_context_static));
7419 CHECK(STATIC_CTX != NULL);
7422
7423 /*** Run actual tests ***/
7424
7425 /* selftest tests */
7427
7428 /* context tests */
7433
7434 /* scratch tests */
7436
7437 /* randomness tests */
7438 run_rand_bits();
7439 run_rand_int();
7440
7441 /* integer arithmetic tests */
7442#ifdef SECP256K1_WIDEMUL_INT128
7443 run_int128_tests();
7444#endif
7445 run_ctz_tests();
7448
7449 /* hash tests */
7455
7456 /* scalar tests */
7458
7459 /* field tests */
7463 run_fe_mul();
7464 run_sqr();
7465 run_sqrt();
7466
7467 /* group tests */
7468 run_ge();
7469 run_gej();
7471
7472 /* ecmult tests */
7474 run_wnaf();
7483
7484 /* endomorphism tests */
7486
7487 /* EC point parser test */
7489
7490 /* EC key edge cases */
7492
7493 /* EC key arithmetic test */
7495
7496#ifdef ENABLE_MODULE_ECDH
7497 /* ecdh tests */
7499#endif
7500
7501 /* ecdsa tests */
7509
7510#ifdef ENABLE_MODULE_MULTISET
7512#endif
7513
7514#ifdef ENABLE_MODULE_RECOVERY
7515 /* ECDSA pubkey recovery tests */
7517#endif
7518
7519#ifdef ENABLE_MODULE_SCHNORR
7520 /* Schnorr signature tests */
7522#endif
7523
7524#ifdef ENABLE_MODULE_EXTRAKEYS
7526#endif
7527
7528#ifdef ENABLE_MODULE_SCHNORRSIG
7530#endif
7531
7532 /* util tests */
7535
7537
7538 /*** Tear down test environment ***/
7539 free(STATIC_CTX);
7541
7543
7544 printf("no problems found\n");
7545 return 0;
7546}
int flags
Definition: bitcoin-tx.cpp:542
void run_ecdh_tests(void)
Definition: tests_impl.h:158
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:41
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:605
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:735
#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:401
static int secp256k1_wnaf_fixed(int *wnaf, const secp256k1_scalar *s, int w)
Convert a number to WNAF notation.
Definition: ecmult_impl.h:416
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:159
static size_t secp256k1_strauss_scratch_size(size_t n_points)
Definition: ecmult_impl.h:356
#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:576
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:726
#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:798
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:643
#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:816
volatile double sum
Definition: examples.cpp:10
void run_extrakeys_tests(void)
Definition: tests_impl.h:553
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_get_bounds(secp256k1_fe *r, int m)
Sets each limb of 'r' to its upper bound at magnitude 'm'.
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 const secp256k1_fe secp256k1_fe_one
Field element module.
Definition: field.h:31
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)
Normalize a field element.
static void secp256k1_fe_half(secp256k1_fe *r)
Halves the value of a field element modulo the field prime.
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
#define SECP256K1_GEJ_CONST_INFINITY
Definition: group.h:36
#define SECP256K1_GE_STORAGE_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)
Definition: group.h:43
static int secp256k1_gej_eq_var(const secp256k1_gej *a, const secp256k1_gej *b)
Check two group elements (jacobian) for equality in variable time.
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:22
static void secp256k1_gej_cmov(secp256k1_gej *r, const secp256k1_gej *a, int flag)
If flag is true, set *r equal to *a; otherwise leave it.
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:35
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
int128_t secp256k1_int128
Definition: int128_native.h:17
static SECP256K1_INLINE void secp256k1_i128_load(secp256k1_int128 *r, int64_t hi, uint64_t lo)
static SECP256K1_INLINE void secp256k1_i128_det(secp256k1_int128 *r, int64_t a, int64_t b, int64_t c, int64_t d)
static SECP256K1_INLINE int secp256k1_u128_check_bits(const secp256k1_uint128 *r, unsigned int n)
static SECP256K1_INLINE void secp256k1_i128_rshift(secp256k1_int128 *r, unsigned int n)
static SECP256K1_INLINE uint64_t secp256k1_u128_hi_u64(const secp256k1_uint128 *a)
static SECP256K1_INLINE uint64_t secp256k1_i128_to_u64(const secp256k1_int128 *a)
static SECP256K1_INLINE void secp256k1_i128_from_i64(secp256k1_int128 *r, int64_t a)
static SECP256K1_INLINE void secp256k1_u128_from_u64(secp256k1_uint128 *r, uint64_t a)
static SECP256K1_INLINE int secp256k1_i128_eq_var(const secp256k1_int128 *a, const secp256k1_int128 *b)
static SECP256K1_INLINE int64_t secp256k1_i128_to_i64(const secp256k1_int128 *a)
static SECP256K1_INLINE void secp256k1_i128_mul(secp256k1_int128 *r, int64_t a, int64_t b)
static SECP256K1_INLINE void secp256k1_u128_rshift(secp256k1_uint128 *r, unsigned int n)
static SECP256K1_INLINE void secp256k1_u128_accum_u64(secp256k1_uint128 *r, uint64_t a)
static SECP256K1_INLINE int secp256k1_i128_check_pow2(const secp256k1_int128 *r, unsigned int n)
static SECP256K1_INLINE void secp256k1_i128_accum_mul(secp256k1_int128 *r, int64_t a, int64_t b)
static SECP256K1_INLINE void secp256k1_u128_accum_mul(secp256k1_uint128 *r, uint64_t a, uint64_t b)
static SECP256K1_INLINE void secp256k1_u128_load(secp256k1_uint128 *r, uint64_t hi, uint64_t lo)
static SECP256K1_INLINE void secp256k1_u128_mul(secp256k1_uint128 *r, uint64_t a, uint64_t b)
static SECP256K1_INLINE uint64_t secp256k1_u128_to_u64(const secp256k1_uint128 *a)
int ec_privkey_export_der(const secp256k1_context *ctx, unsigned char *privkey, size_t *privkeylen, const unsigned char *key32, int compressed)
Export a private key in DER format.
int ec_privkey_import_der(const secp256k1_context *ctx, unsigned char *out32, const unsigned char *privkey, size_t privkeylen)
Import a private key in DER format.
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(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:36
void run_recovery_tests(void)
Definition: tests_impl.h:361
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 void secp256k1_scalar_split_lambda(secp256k1_scalar *SECP256K1_RESTRICT r1, secp256k1_scalar *SECP256K1_RESTRICT r2, const secp256k1_scalar *SECP256K1_RESTRICT k)
Find r1 and r2 such that r1+r2*lambda = k, where r1 and r2 or their negations are maximum 128 bits lo...
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 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:28
static const secp256k1_scalar secp256k1_scalar_one
Definition: scalar_impl.h:27
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:63
void run_schnorr_tests(void)
Definition: tests_impl.h:512
void run_schnorrsig_tests(void)
Definition: tests_impl.h:865
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:308
static SECP256K1_INLINE int secp256k1_memcmp_var(const void *s1, const void *s2, size_t n)
Semantics like memcmp.
Definition: util.h:197
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:211
#define VG_CHECK(x, y)
Definition: util.h:108
#define ALIGNMENT
Definition: util.h:141
static void secp256k1_default_error_callback_fn(const char *str, void *data)
Definition: util.h:35
#define VG_UNDEF(x, y)
Definition: util.h:107
static SECP256K1_INLINE uint32_t secp256k1_read_be32(const unsigned char *p)
Definition: util.h:326
static SECP256K1_INLINE int secp256k1_ctz32_var(uint32_t x)
Definition: util.h:290
static SECP256K1_INLINE void secp256k1_write_be32(unsigned char *p, uint32_t x)
Definition: util.h:334
static void secp256k1_default_illegal_callback_fn(const char *str, void *data)
Definition: util.h:30
static SECP256K1_INLINE int secp256k1_ctz64_var_debruijn(uint64_t x)
Definition: util.h:279
#define CHECK(cond)
Definition: util.h:81
static SECP256K1_INLINE int secp256k1_ctz32_var_debruijn(uint32_t x)
Definition: util.h:267
static SECP256K1_INLINE void * checked_malloc(const secp256k1_callback *cb, size_t size)
Definition: util.h:119
static SECP256K1_INLINE void secp256k1_memczero(void *s, size_t len, int flag)
Definition: util.h:178
static int secp256k1_context_is_proper(const secp256k1_context *ctx)
Definition: secp256k1.c:84
const secp256k1_context * secp256k1_context_no_precomp
Definition: secp256k1.c:77
static void secp256k1_ecdsa_signature_save(secp256k1_ecdsa_signature *sig, const secp256k1_scalar *r, const secp256k1_scalar *s)
Definition: secp256k1.c:345
static int secp256k1_pubkey_load(const secp256k1_context *ctx, secp256k1_ge *ge, const secp256k1_pubkey *pubkey)
Definition: secp256k1.c:231
static void secp256k1_pubkey_save(secp256k1_pubkey *pubkey, secp256k1_ge *ge)
Definition: secp256k1.c:250
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:457
static void secp256k1_ecdsa_signature_load(const secp256k1_context *ctx, secp256k1_scalar *r, secp256k1_scalar *s, const secp256k1_ecdsa_signature *sig)
Definition: secp256k1.c:331
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:176
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:696
#define SECP256K1_CONTEXT_SIGN
Definition: secp256k1.h:207
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:207
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_context_randomize(secp256k1_context *ctx, const unsigned char *seed32) SECP256K1_ARG_NONNULL(1)
Randomizes the context to provide enhanced protection against side-channel leakage.
Definition: secp256k1.c:743
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:751
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:606
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:371
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:282
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:195
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:305
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:565
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:137
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:183
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:550
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:264
#define SECP256K1_CONTEXT_NONE
Context flags to pass to secp256k1_context_create, secp256k1_context_preallocated_size,...
Definition: secp256k1.h:203
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:355
SECP256K1_API void secp256k1_selftest(void)
Perform basic self tests (to be used in conjunction with secp256k1_context_static)
Definition: secp256k1.c:88
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:588
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:777
#define SECP256K1_EC_COMPRESSED
Flag to pass to secp256k1_ec_pubkey_serialize.
Definition: secp256k1.h:213
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:436
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:417
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:158
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:679
#define SECP256K1_EC_UNCOMPRESSED
Definition: secp256k1.h:214
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:392
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:625
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) SECP256K1_DEPRECATED("Use secp256k1_ec_seckey_tweak_add instead")
Same as secp256k1_ec_seckey_tweak_add, but DEPRECATED.
Definition: secp256k1.c:668
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:212
#define SECP256K1_CONTEXT_VERIFY
Deprecated context flags.
Definition: secp256k1.h:206
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) SECP256K1_DEPRECATED("Use secp256k1_ec_seckey_negate instead")
Same as secp256k1_ec_seckey_negate, but DEPRECATED.
Definition: secp256k1.c:621
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:652
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:720
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:404
SECP256K1_API const secp256k1_context * secp256k1_context_static
A built-in constant secp256k1 context object with static storage duration, to be used in conjunction ...
Definition: secp256k1.c:76
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) SECP256K1_DEPRECATED("Use secp256k1_ec_seckey_tweak_mul instead")
Same as secp256k1_ec_seckey_tweak_mul, but DEPRECATED.
Definition: secp256k1.c:716
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:108
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:169
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:114
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:94
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:148
secp256k1_scalar * sc
Definition: tests.c:4349
secp256k1_ge * pt
Definition: tests.c:4350
void(* fn)(const char *text, void *data)
Definition: util.h:21
const void * data
Definition: util.h:22
secp256k1_callback illegal_callback
Definition: secp256k1.c:65
secp256k1_callback error_callback
Definition: secp256k1.c:66
secp256k1_ecmult_gen_context ecmult_gen_ctx
Definition: secp256k1.c:64
Opaque data structured that holds a parsed ECDSA signature.
Definition: secp256k1.h:87
secp256k1_scalar blind
Definition: ecmult_gen.h:36
uint32_t n[10]
Definition: field_10x26.h:16
A group element in affine coordinates on the secp256k1 curve, or occasionally on an isomorphic curve ...
Definition: group.h:16
int infinity
Definition: group.h:19
secp256k1_fe x
Definition: group.h:17
secp256k1_fe y
Definition: group.h:18
A group element of the secp256k1 curve, in jacobian coordinates.
Definition: group.h:28
secp256k1_fe y
Definition: group.h:30
secp256k1_fe x
Definition: group.h:29
int infinity
Definition: group.h:32
secp256k1_fe z
Definition: group.h:31
secp256k1_modinv32_signed30 modulus
Definition: modinv32.h:21
secp256k1_modinv64_signed62 modulus
Definition: modinv64.h:25
Opaque data structure that holds a parsed and valid public key.
Definition: secp256k1.h:74
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:4879
void random_scalar_order(secp256k1_scalar *num)
Definition: tests.c:122
void run_group_decompress(void)
Definition: tests.c:3965
void run_random_pubkeys(void)
Definition: tests.c:6504
void run_ec_illegal_argument_tests(void)
Definition: tests.c:179
void scalar_test(void)
Definition: tests.c:2002
int fe_identical(const secp256k1_fe *a, const secp256k1_fe *b)
Definition: tests.c:2872
void test_intialized_inf(void)
Definition: tests.c:3714
void test_ecmult_target(const secp256k1_scalar *target, int mode)
Definition: tests.c:4173
void fe_cmov_test(void)
Definition: tests.c:7245
void test_inverse_field(secp256k1_fe *out, const secp256k1_fe *x, int var)
Definition: tests.c:3193
void run_modinv_tests(void)
Definition: tests.c:1064
int test_ecdsa_der_parse(const unsigned char *sig, size_t siglen, int certainly_der, int certainly_not_der)
Definition: tests.c:6518
void test_ecmult_multi_batch_size_helper(void)
Definition: tests.c:4831
void run_ec_pubkey_parse_test(void)
Definition: tests.c:5538
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:6207
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:6215
#define SECP256K1_EC_PARSE_TEST_NINVALID
static int COUNT
Definition: tests.c:30
void run_endomorphism_tests(void)
Definition: tests.c:5442
void test_pre_g_table(const secp256k1_ge_storage *pre_g, size_t n)
Definition: tests.c:3976
void test_gej_cmov(const secp256k1_gej *a, const secp256k1_gej *b)
Definition: tests.c:3822
void ecmult_const_random_mult(void)
Definition: tests.c:4245
void test_ge(void)
Definition: tests.c:3514
void run_eckey_edge_case_test(void)
Definition: tests.c:5866
void test_ecmult_gen_blind_reset(void)
Definition: tests.c:5394
void run_fe_mul(void)
Definition: tests.c:3067
void run_ec_combine(void)
Definition: tests.c:3894
void run_ecmult_pre_g(void)
Definition: tests.c:4026
void test_fe_mul(const secp256k1_fe *a, const secp256k1_fe *b, int use_sqr)
Definition: tests.c:3024
int main(int argc, char **argv)
Definition: tests.c:7375
void test_secp256k1_pippenger_bucket_window_inv(void)
Definition: tests.c:4778
void run_cmov_tests(void)
Definition: tests.c:7367
void run_field_convert(void)
Definition: tests.c:2841
void test_ecdsa_end_to_end(void)
Definition: tests.c:6250
#define SECP256K1_EC_PARSE_TEST_NVALID
void run_field_misc(void)
Definition: tests.c:2932
void test_sqrt(const secp256k1_fe *a, const secp256k1_fe *k)
Definition: tests.c:3104
void test_ecmult_constants_2bit(void)
Definition: tests.c:5250
void random_field_element_magnitude(secp256k1_fe *fe)
Definition: tests.c:60
void run_secp256k1_byteorder_tests(void)
Definition: tests.c:7207
void mulmod256(uint16_t *out, const uint16_t *a, const uint16_t *b, const uint16_t *m)
Definition: tests.c:806
void random_scalar_order_test(secp256k1_scalar *num)
Definition: tests.c:109
void run_sha256_counter_tests(void)
SHA256 counter tests.
Definition: tests.c:541
static secp256k1_context * CTX
Definition: tests.c:31
void test_point_times_order(const secp256k1_gej *point)
Definition: tests.c:4109
static void random_ber_signature(unsigned char *sig, size_t *len, int *certainly_der, int *certainly_not_der)
Definition: tests.c:6617
#define CONDITIONAL_TEST(cnt, nam)
Definition: tests.c:28
void test_ecmult_multi(secp256k1_scratch *scratch, secp256k1_ecmult_multi_func ecmult_multi)
Definition: tests.c:4368
void random_sign(secp256k1_scalar *sigr, secp256k1_scalar *sigs, const secp256k1_scalar *key, const secp256k1_scalar *msg, int *recid)
Definition: tests.c:6157
void int_cmov_test(void)
Definition: tests.c:7220
void run_ctz_tests(void)
Definition: tests.c:419
void ecmult_const_chain_multiply(void)
Definition: tests.c:4315
void run_deprecated_context_flags_test(void)
Definition: tests.c:161
static void assign_big_endian(unsigned char *ptr, size_t ptrlen, uint32_t val)
Definition: tests.c:6578
void random_group_element_test(secp256k1_ge *ge)
Definition: tests.c:76
void run_field_half(void)
Definition: tests.c:2883
void test_modinv32_uint16(uint16_t *out, const uint16_t *in, const uint16_t *mod)
Definition: tests.c:923
void scalar_cmov_test(void)
Definition: tests.c:7305
void run_hmac_sha256_tests(void)
Definition: tests.c:599
void ge_equals_ge(const secp256k1_ge *a, const secp256k1_ge *b)
Definition: tests.c:3466
void test_rand_int(uint32_t range, uint32_t subrange)
Definition: tests.c:751
void run_rand_int(void)
Definition: tests.c:775
void random_fe_test(secp256k1_fe *x)
Definition: tests.c:2802
void ge_equals_gej(const secp256k1_ge *a, const secp256k1_gej *b)
Definition: tests.c:3497
void test_wnaf(const secp256k1_scalar *number, int w)
Definition: tests.c:4973
int is_empty_signature(const secp256k1_ecdsa_signature *sig)
Definition: tests.c:6245
void random_fe_non_zero(secp256k1_fe *nz)
Definition: tests.c:2812
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:6199
void test_add_neg_y_diff_x(void)
Definition: tests.c:3746
void run_gej(void)
Definition: tests.c:3830
void run_ecdsa_sign_verify(void)
Definition: tests.c:6191
static const secp256k1_scalar scalar_minus_one
Definition: tests.c:3154
void run_rand_bits(void)
Definition: tests.c:767
void test_ecmult_accumulate(secp256k1_sha256 *acc, const secp256k1_scalar *x, secp256k1_scratch *scratch)
Definition: tests.c:5217
void random_group_element_jacobian_test(secp256k1_gej *gej, const secp256k1_ge *ge)
Definition: tests.c:88
int coprime(const uint16_t *a, const uint16_t *b)
Definition: tests.c:1034
void run_ecmult_constants(void)
Definition: tests.c:5337
void random_scalar_order_b32(unsigned char *b32)
Definition: tests.c:135
void run_pubkey_comparison(void)
Definition: tests.c:6455
void run_selftest_tests(void)
Definition: tests.c:141
int gej_xyz_equals_gej(const secp256k1_gej *a, const secp256k1_gej *b)
Definition: tests.c:3476
void test_random_pubkeys(void)
Definition: tests.c:6395
void run_sqrt(void)
Definition: tests.c:3118
void test_ecdsa_sign_verify(void)
Definition: tests.c:6164
void ge_storage_cmov_test(void)
Definition: tests.c:7335
void random_gej_test(secp256k1_gej *gej)
Definition: tests.c:103
void run_inverse_tests(void)
Definition: tests.c:3218
void run_ge(void)
Definition: tests.c:3813
void ecmult_const_mult_zero_one(void)
Definition: tests.c:4293
void run_ecdsa_end_to_end(void)
Definition: tests.c:6511
void ecmult_const_commutativity(void)
Definition: tests.c:4272
void test_constant_wnaf(const secp256k1_scalar *number, int w)
Definition: tests.c:5022
void ec_pubkey_parse_pointtest(const unsigned char *input, int xvalid, int yvalid)
Definition: tests.c:5463
void test_ecmult_gen_blind(void)
Definition: tests.c:5371
static int ecmult_multi_callback(secp256k1_scalar *sc, secp256k1_ge *pt, size_t idx, void *cbdata)
Definition: tests.c:4353
void fe_storage_cmov_test(void)
Definition: tests.c:7275
void run_ecmult_near_split_bound(void)
Definition: tests.c:4212
void run_static_context_tests(void)
Definition: tests.c:231
void test_fixed_wnaf(const secp256k1_scalar *number, int w)
Definition: tests.c:5062
void test_ecdsa_edge_cases(void)
Definition: tests.c:6795
void test_inverse_scalar(secp256k1_scalar *out, const secp256k1_scalar *x, int var)
Definition: tests.c:3171
void test_group_decompress(const secp256k1_fe *x)
Definition: tests.c:3901
void test_fixed_wnaf_small_helper(int *wnaf, int *wnaf_expected, int w)
Definition: tests.c:5099
void run_ecmult_gen_blind(void)
Definition: tests.c:5406
int test_ecmult_multi_random(secp256k1_scratch *scratch)
Definition: tests.c:4592
void run_scalar_set_b32_seckey_tests(void)
Definition: tests.c:2167
void run_secp256k1_memczero_test(void)
Definition: tests.c:7192
static void counting_illegal_callback_fn(const char *str, void *data)
Definition: tests.c:34
void random_fe_non_square(secp256k1_fe *ns)
Definition: tests.c:2825
void run_point_times_order(void)
Definition: tests.c:4224
static void uncounting_illegal_callback_fn(const char *str, void *data)
Definition: tests.c:42
void test_scalar_split(const secp256k1_scalar *full)
Definition: tests.c:5415
static const secp256k1_scalar scalars_near_split_bounds[20]
Definition: tests.c:4150
void run_eckey_negate_test(void)
Definition: tests.c:6122
void uint16_to_signed30(secp256k1_modinv32_signed30 *out, const uint16_t *in)
Definition: tests.c:890
void random_fe(secp256k1_fe *x)
Definition: tests.c:2792
void run_proper_context_tests(int use_prealloc)
Definition: tests.c:247
void test_fixed_wnaf_small(void)
Definition: tests.c:5109
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:4798
void run_ecmult_multi_tests(void)
Definition: tests.c:4946
void run_ecdsa_edge_cases(void)
Definition: tests.c:7164
void test_ecmult_multi_batch_single(secp256k1_ecmult_multi_func ecmult_multi)
Definition: tests.c:4758
void run_sha256_known_output_tests(void)
Definition: tests.c:440
void test_constant_wnaf_negate(const secp256k1_scalar *number)
Definition: tests.c:5007
void test_ecmult_constants_sha(uint32_t prefix, size_t iter, const unsigned char *expected32)
Definition: tests.c:5294
void run_rfc6979_hmac_sha256_tests(void)
Definition: tests.c:643
int ecmult_gen_context_eq(const secp256k1_ecmult_gen_context *a, const secp256k1_ecmult_gen_context *b)
Definition: tests.c:146
static int test_ecmult_accumulate_cb(secp256k1_scalar *sc, secp256k1_ge *pt, size_t idx, void *data)
Definition: tests.c:5209
int context_eq(const secp256k1_context *a, const secp256k1_context *b)
Definition: tests.c:152
static int ecmult_multi_false_callback(secp256k1_scalar *sc, secp256k1_ge *pt, size_t idx, void *cbdata)
Definition: tests.c:4360
void run_tagged_sha256_tests(void)
Definition: tests.c:684
int check_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b)
Definition: tests.c:2833
void run_sqr(void)
Definition: tests.c:3088
void run_ecmult_chain(void)
Definition: tests.c:4050
static secp256k1_context * STATIC_CTX
Definition: tests.c:32
void run_ecdsa_der_parse(void)
Definition: tests.c:6763
void mutate_sign_signed30(secp256k1_modinv32_signed30 *x)
Definition: tests.c:908
uint64_t modinv2p64(uint64_t x)
Definition: tests.c:789
void random_field_element_test(secp256k1_fe *fe)
Definition: tests.c:50
void run_wnaf(void)
Definition: tests.c:5163
void run_scratch_tests(void)
Definition: tests.c:334
void signed30_to_uint16(uint16_t *out, const secp256k1_modinv32_signed30 *in)
Definition: tests.c:899
void test_ec_combine(void)
Definition: tests.c:3869
void run_ecmult_const_tests(void)
Definition: tests.c:4341
#define SECP256K1_EC_PARSE_TEST_NXVALID
static void damage_array(unsigned char *sig, size_t *len)
Definition: tests.c:6590
void test_rand_bits(int rand32, int bits)
Definition: tests.c:716
void run_scalar_tests(void)
Definition: tests.c:2184
static const secp256k1_fe fe_minus_one
Definition: tests.c:3159
#define expect(bit)