Bitcoin Core 32.99.0
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 <stdint.h>
10#include <string.h>
11
12#include <time.h>
13
14#ifdef USE_EXTERNAL_DEFAULT_CALLBACKS
15 #pragma message("Ignoring USE_EXTERNAL_CALLBACKS in tests.")
16 #undef USE_EXTERNAL_DEFAULT_CALLBACKS
17#endif
18#if defined(VERIFY) && defined(COVERAGE)
19 #pragma message("Defining VERIFY for tests being built for coverage analysis support is meaningless.")
20#endif
21#include "secp256k1.c"
22
23#include "../include/secp256k1.h"
24#include "../include/secp256k1_preallocated.h"
25#include "testrand_impl.h"
26#include "checkmem.h"
27#include "testutil.h"
28#include "util.h"
29#include "unit_test.h"
30#include "unit_test.c"
31
32#include "../contrib/lax_der_parsing.c"
33#include "../contrib/lax_der_privatekey_parsing.c"
34
35#include "modinv32_impl.h"
36#ifdef SECP256K1_WIDEMUL_INT128
37#include "modinv64_impl.h"
38#include "int128_impl.h"
39#endif
40
41#if defined(__GNUC__)
42# pragma GCC diagnostic push
43# pragma GCC diagnostic warning "-Wunused-function"
44#endif
45
46#define CONDITIONAL_TEST(cnt, nam) if (COUNT < (cnt)) { printf("Skipping %s (iteration count too low)\n", nam); } else
47
48static secp256k1_context *CTX = NULL;
50
51static int all_bytes_equal(const void* s, unsigned char value, size_t n) {
52 const unsigned char *p = s;
53 size_t i;
54
55 for (i = 0; i < n; i++) {
56 if (p[i] != value) {
57 return 0;
58 }
59 }
60 return 1;
61}
62
63#define CHECK_COUNTING_CALLBACK_VOID(ctx, expr_or_stmt, callback, callback_setter) do { \
64 int32_t _calls_to_callback = 0; \
65 secp256k1_callback _saved_callback = ctx->callback; \
66 callback_setter(ctx, counting_callback_fn, &_calls_to_callback); \
67 { expr_or_stmt; } \
68 ctx->callback = _saved_callback; \
69 CHECK(_calls_to_callback == 1); \
70} while(0);
71
72/* CHECK that expr_or_stmt calls the error or illegal callback of ctx exactly once
73 *
74 * Useful for checking functions that return void (e.g., API functions that use ARG_CHECK_VOID) */
75#define CHECK_ERROR_VOID(ctx, expr_or_stmt) \
76 CHECK_COUNTING_CALLBACK_VOID(ctx, expr_or_stmt, error_callback, secp256k1_context_set_error_callback)
77#define CHECK_ILLEGAL_VOID(ctx, expr_or_stmt) \
78 CHECK_COUNTING_CALLBACK_VOID(ctx, expr_or_stmt, illegal_callback, secp256k1_context_set_illegal_callback)
79
80/* CHECK that
81 * - expr calls the illegal callback of ctx exactly once and,
82 * - expr == 0 (or equivalently, expr == NULL)
83 *
84 * Useful for checking functions that return an integer or a pointer. */
85#define CHECK_ILLEGAL(ctx, expr) CHECK_ILLEGAL_VOID(ctx, CHECK((expr) == 0))
86#define CHECK_ERROR(ctx, expr) CHECK_ERROR_VOID(ctx, CHECK((expr) == 0))
87
88static void counting_callback_fn(const char* str, void* data) {
89 /* Dummy callback function that just counts. */
90 int32_t *p;
91 (void)str;
92 p = data;
93 CHECK(*p != INT32_MAX);
94 (*p)++;
95}
96
97static void run_xoshiro256pp_tests(void) {
98 {
99 size_t i;
100 /* Sanity check that we run before the actual seeding. */
101 for (i = 0; i < ARRAY_SIZE(secp256k1_test_state); i++) {
103 }
104 }
105 {
106 int i;
107 unsigned char buf32[32];
108 unsigned char seed16[16] = {
109 'C', 'H', 'I', 'C', 'K', 'E', 'N', '!',
110 'C', 'H', 'I', 'C', 'K', 'E', 'N', '!',
111 };
112 unsigned char buf32_expected[32] = {
113 0xAF, 0xCC, 0xA9, 0x16, 0xB5, 0x6C, 0xE3, 0xF0,
114 0x44, 0x3F, 0x45, 0xE0, 0x47, 0xA5, 0x08, 0x36,
115 0x4C, 0xCC, 0xC1, 0x18, 0xB2, 0xD8, 0x8F, 0xEF,
116 0x43, 0x26, 0x15, 0x57, 0x37, 0x00, 0xEF, 0x30,
117 };
118 testrand_seed(seed16);
119 for (i = 0; i < 17; i++) {
120 testrand256(buf32);
121 }
122 CHECK(secp256k1_memcmp_var(buf32, buf32_expected, sizeof(buf32)) == 0);
123 }
124}
125
126static void run_selftest_tests(void) {
127 /* Test public API */
129}
130
132 return a->built == b->built
136}
137
138static int context_eq(const secp256k1_context *a, const secp256k1_context *b) {
139 return a->declassify == b->declassify
146}
147
149 /* Check that a context created with any of the flags in the flags array is
150 * identical to the NONE context. */
151 unsigned int flags[] = { SECP256K1_CONTEXT_SIGN,
155 int i;
156 for (i = 0; i < (int)(ARRAY_SIZE(flags)); i++) {
157 secp256k1_context *tmp_ctx;
159 tmp_ctx = secp256k1_context_create(flags[i]);
160 CHECK(context_eq(none_ctx, tmp_ctx));
162 }
164}
165
167 secp256k1_pubkey pubkey;
168 secp256k1_pubkey zero_pubkey;
170 unsigned char ctmp[32];
171
172 /* Setup */
173 memset(ctmp, 1, 32);
174 memset(&zero_pubkey, 0, sizeof(zero_pubkey));
175
176 /* Verify context-type checking illegal-argument errors. */
178 SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
179 CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey, ctmp) == 1);
180 SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
181 CHECK_ILLEGAL(STATIC_CTX, secp256k1_ecdsa_sign(STATIC_CTX, &sig, ctmp, ctmp, NULL, NULL));
182 SECP256K1_CHECKMEM_UNDEFINE(&sig, sizeof(sig));
183 CHECK(secp256k1_ecdsa_sign(CTX, &sig, ctmp, ctmp, NULL, NULL) == 1);
184 SECP256K1_CHECKMEM_CHECK(&sig, sizeof(sig));
185 CHECK(secp256k1_ecdsa_verify(CTX, &sig, ctmp, &pubkey) == 1);
186 CHECK(secp256k1_ecdsa_verify(STATIC_CTX, &sig, ctmp, &pubkey) == 1);
187 CHECK(secp256k1_ec_pubkey_tweak_add(CTX, &pubkey, ctmp) == 1);
188 CHECK(secp256k1_ec_pubkey_tweak_add(STATIC_CTX, &pubkey, ctmp) == 1);
189 CHECK(secp256k1_ec_pubkey_tweak_mul(CTX, &pubkey, ctmp) == 1);
191 CHECK(secp256k1_ec_pubkey_negate(CTX, &pubkey) == 1);
194 CHECK(secp256k1_ec_pubkey_tweak_mul(STATIC_CTX, &pubkey, ctmp) == 1);
195}
196
197static void run_static_context_tests(int use_prealloc) {
198 {
199 unsigned char seed[32] = {0x17};
200
201 /* Randomizing secp256k1_context_static is not supported. */
204
205 /* Destroying or cloning secp256k1_context_static is not supported. */
206 if (use_prealloc) {
208 {
209 secp256k1_context *my_static_ctx = malloc(sizeof(*STATIC_CTX));
210 CHECK(my_static_ctx != NULL);
211 memset(my_static_ctx, 0x2a, sizeof(*my_static_ctx));
213 CHECK(all_bytes_equal(my_static_ctx, 0x2a, sizeof(*my_static_ctx)));
214 free(my_static_ctx);
215 }
217 } else {
220 }
221 }
222
223 {
224 /* Verify that setting and resetting illegal callback works */
225 int32_t dummy = 0;
232 }
233}
234
236{
239}
240
241static void run_proper_context_tests(int use_prealloc) {
242 int32_t dummy = 0;
243 secp256k1_context *my_ctx, *my_ctx_fresh;
244 void *my_ctx_prealloc = NULL;
245 unsigned char seed[32] = {0x17};
246
247 secp256k1_ge pub;
249 secp256k1_scalar sigr, sigs;
250
251 /* Fresh reference context for comparison */
253
254 if (use_prealloc) {
256 CHECK(my_ctx_prealloc != NULL);
258 } else {
260 }
261
262 /* Randomize and reset randomization */
263 CHECK(context_eq(my_ctx, my_ctx_fresh));
264 CHECK(secp256k1_context_randomize(my_ctx, seed) == 1);
265 CHECK(!context_eq(my_ctx, my_ctx_fresh));
266 CHECK(secp256k1_context_randomize(my_ctx, NULL) == 1);
267 CHECK(context_eq(my_ctx, my_ctx_fresh));
268
269 /* set error callback (to a function that still aborts in case malloc() fails in secp256k1_context_clone() below) */
273
274 /* check if sizes for cloning are consistent */
276
277 /*** clone and destroy all of them to make sure cloning was complete ***/
278 {
279 secp256k1_context *ctx_tmp;
280
281 if (use_prealloc) {
282 /* clone into a non-preallocated context and then again into a new preallocated one. */
283 ctx_tmp = my_ctx;
284 my_ctx = secp256k1_context_clone(my_ctx);
285 CHECK(context_eq(ctx_tmp, my_ctx));
287
288 free(my_ctx_prealloc);
290 CHECK(my_ctx_prealloc != NULL);
291 ctx_tmp = my_ctx;
292 my_ctx = secp256k1_context_preallocated_clone(my_ctx, my_ctx_prealloc);
293 CHECK(context_eq(ctx_tmp, my_ctx));
295 } else {
296 /* clone into a preallocated context and then again into a new non-preallocated one. */
297 void *prealloc_tmp;
298
300 CHECK(prealloc_tmp != NULL);
301 ctx_tmp = my_ctx;
302 my_ctx = secp256k1_context_preallocated_clone(my_ctx, prealloc_tmp);
303 CHECK(context_eq(ctx_tmp, my_ctx));
305
306 ctx_tmp = my_ctx;
307 my_ctx = secp256k1_context_clone(my_ctx);
308 CHECK(context_eq(ctx_tmp, my_ctx));
310 free(prealloc_tmp);
311 }
312 }
313
314 /* Verify that the error callback makes it across the clone. */
317 /* And that it resets back to default. */
318 secp256k1_context_set_error_callback(my_ctx, NULL, NULL);
320 CHECK(context_eq(my_ctx, my_ctx_fresh));
321
322 /* Verify that setting and resetting illegal callback works */
325 CHECK(my_ctx->illegal_callback.data == &dummy);
326 secp256k1_context_set_illegal_callback(my_ctx, NULL, NULL);
328 CHECK(my_ctx->illegal_callback.data == NULL);
329 CHECK(context_eq(my_ctx, my_ctx_fresh));
330
331 /*** attempt to use them ***/
334 secp256k1_ecmult_gen_ge(&my_ctx->ecmult_gen_ctx, &pub, &key);
335
336 /* obtain a working nonce */
337 do {
339 } while(!secp256k1_ecdsa_sig_sign(&my_ctx->ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &nonce, NULL));
340
341 /* try signing */
342 CHECK(secp256k1_ecdsa_sig_sign(&my_ctx->ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &nonce, NULL));
343
344 /* try verifying */
345 CHECK(secp256k1_ecdsa_sig_verify(&sigr, &sigs, &pub, &msg));
346
347 /* cleanup */
348 if (use_prealloc) {
350 free(my_ctx_prealloc);
351 } else {
353 }
354 secp256k1_context_destroy(my_ctx_fresh);
355
356 /* Defined as no-op. */
359}
360
362{
365}
366
367static void run_scratch_tests(void) {
368 const size_t adj_alloc = ((500 + ALIGNMENT - 1) / ALIGNMENT) * ALIGNMENT;
369
370 size_t checkpoint;
371 size_t checkpoint_2;
373
374 /* Test public API */
375 scratch = secp256k1_scratch_space_create(CTX, 1000);
376 CHECK(scratch != NULL);
377
378 /* Test internal API */
380 CHECK(secp256k1_scratch_max_allocation(&CTX->error_callback, scratch, 1) == 1000 - (ALIGNMENT - 1));
381 CHECK(scratch->alloc_size == 0);
382 CHECK(scratch->alloc_size % ALIGNMENT == 0);
383
384 /* Allocating 500 bytes succeeds */
385 checkpoint = secp256k1_scratch_checkpoint(&CTX->error_callback, scratch);
386 CHECK(secp256k1_scratch_alloc(&CTX->error_callback, scratch, 500) != NULL);
387 CHECK(secp256k1_scratch_max_allocation(&CTX->error_callback, scratch, 0) == 1000 - adj_alloc);
388 CHECK(secp256k1_scratch_max_allocation(&CTX->error_callback, scratch, 1) == 1000 - adj_alloc - (ALIGNMENT - 1));
389 CHECK(scratch->alloc_size != 0);
390 CHECK(scratch->alloc_size % ALIGNMENT == 0);
391
392 /* Allocating another 501 bytes fails */
393 CHECK(secp256k1_scratch_alloc(&CTX->error_callback, scratch, 501) == NULL);
394 CHECK(secp256k1_scratch_max_allocation(&CTX->error_callback, scratch, 0) == 1000 - adj_alloc);
395 CHECK(secp256k1_scratch_max_allocation(&CTX->error_callback, scratch, 1) == 1000 - adj_alloc - (ALIGNMENT - 1));
396 CHECK(scratch->alloc_size != 0);
397 CHECK(scratch->alloc_size % ALIGNMENT == 0);
398
399 /* ...but it succeeds once we apply the checkpoint to undo it */
401 CHECK(scratch->alloc_size == 0);
403 CHECK(secp256k1_scratch_alloc(&CTX->error_callback, scratch, 500) != NULL);
404 CHECK(scratch->alloc_size != 0);
405
406 /* try to apply a bad checkpoint */
407 checkpoint_2 = secp256k1_scratch_checkpoint(&CTX->error_callback, scratch);
409 CHECK_ERROR_VOID(CTX, secp256k1_scratch_apply_checkpoint(&CTX->error_callback, scratch, checkpoint_2)); /* checkpoint_2 is after checkpoint */
410 CHECK_ERROR_VOID(CTX, secp256k1_scratch_apply_checkpoint(&CTX->error_callback, scratch, (size_t) -1)); /* this is just wildly invalid */
411
412 /* Test that large integers do not wrap around in a bad way */
413 /* Try max allocation with a large number of objects. Only makes sense if
414 * ALIGNMENT is greater than 1 because otherwise the objects take no extra
415 * space. */
416 CHECK(ALIGNMENT <= 1 || !secp256k1_scratch_max_allocation(&CTX->error_callback, scratch, (SIZE_MAX / (ALIGNMENT - 1)) + 1));
417 /* Try allocating SIZE_MAX to test wrap around which only happens if
418 * ALIGNMENT > 1, otherwise it returns NULL anyway because the scratch
419 * space is too small. */
420 CHECK(secp256k1_scratch_alloc(&CTX->error_callback, scratch, SIZE_MAX) == NULL);
422
423 /* Creating a scratch space whose size would wrap around when the aligned
424 * header size is added to it fails, both for SIZE_MAX and for the smallest
425 * size that still wraps. */
426 CHECK(secp256k1_scratch_space_create(CTX, SIZE_MAX) == NULL);
428
429 /* cleanup */
430 secp256k1_scratch_space_destroy(CTX, NULL); /* no-op */
431}
432
433/* try to use badly initialized scratch space */
435 secp256k1_scratch_space* scratch = checked_malloc(&CTX->error_callback, sizeof(*scratch));
436 size_t magic_size = sizeof(scratch->magic);
437 memset(scratch, 0, sizeof(*scratch));
438 /* catch accesses beyond the magic */
439 SECP256K1_CHECKMEM_UNDEFINE((unsigned char*)scratch + magic_size, sizeof(*scratch) - magic_size);
440
444
445 free(scratch);
446}
447
448/* A compression function that does nothing */
449static void invalid_sha256_compression(uint32_t *s, const unsigned char *msg, size_t rounds) {
450 (void)s; (void)msg; (void)rounds;
451}
452
453static int own_transform_called = 0;
454static void good_sha256_compression(uint32_t *s, const unsigned char *msg, size_t rounds) {
457}
458
460 secp256k1_context *ctx, *ctx_cloned;
462 unsigned char sha_out[32];
463 /* 1) Verify the context is initialized with the default compression function */
466
467 /* 2) Verify providing a bad compression function fails during set */
470
471 /* 3) Provide sha256 to ctx and verify it is called when provided */
475
476 /* 4) Verify callback makes it across clone */
477 ctx_cloned = secp256k1_context_clone(ctx);
479
480 /* 5) A hash operation should invoke the installed callback */
483 secp256k1_sha256_write(&ctx->hash_ctx, &sha, (const unsigned char*)"a", 1);
484 secp256k1_sha256_finalize(&ctx->hash_ctx, &sha, sha_out);
486
487 /* 6) Unset sha256 and verify the default one is set again */
490
492 secp256k1_context_destroy(ctx_cloned);
493}
494
495/* Hashes the first block over and over instead of moving on. */
496static void sha256_transform_noadvance(uint32_t *s, const unsigned char *chunk, size_t blocks) {
497 size_t i;
498 for (i = 0; i < blocks; i++) {
499 secp256k1_sha256_transform(s, chunk, 1);
500 }
501}
502
503/* Drops the last block of a multi-block call. */
504static void sha256_transform_short(uint32_t *s, const unsigned char *chunk, size_t blocks) {
505 secp256k1_sha256_transform(s, chunk, blocks > 0 ? blocks - 1 : 0);
506}
507
508/* Starts from the IV instead of the state it was given. */
509static void sha256_transform_ivreset(uint32_t *s, const unsigned char *chunk, size_t blocks) {
512 memcpy(s, h.s, sizeof(h.s));
513 secp256k1_sha256_transform(s, chunk, blocks);
514}
515
516/* Correct only on multiples of four blocks. */
517static void sha256_transform_batch4(uint32_t *s, const unsigned char *chunk, size_t blocks) {
518 secp256k1_sha256_transform(s, chunk, blocks - (blocks & 3));
519}
520
521/* Right digest, one bit off. */
522static void sha256_transform_corrupt(uint32_t *s, const unsigned char *chunk, size_t blocks) {
523 secp256k1_sha256_transform(s, chunk, blocks);
524 s[0] ^= 1;
525}
526
527#ifdef UINTPTR_MAX
528
529/* Wrong when input is 64-byte aligned, like a broken SIMD fast path. */
530static void sha256_transform_align64_fail(uint32_t *s, const unsigned char *chunk, size_t blocks) {
531 int aligned = ((uintptr_t)chunk % 64) == 0;
532 secp256k1_sha256_transform(s, chunk, blocks);
533 if (aligned) s[0] ^= 1;
534}
535
536/* Wrong when input is 32-byte aligned but not 64 */
537static void sha256_transform_align32_fail(uint32_t *s, const unsigned char *chunk, size_t blocks) {
538 int align32_not64 = (((uintptr_t)chunk % 32) == 0) && (((uintptr_t)chunk % 64) != 0);
539 secp256k1_sha256_transform(s, chunk, blocks);
540 if (align32_not64) {
541 s[0] ^= 1;
542 }
543}
544
545/* Wrong on any unaligned input. */
546static void sha256_transform_unaligned_fail(uint32_t *s, const unsigned char *chunk, size_t blocks) {
547 int aligned = ((uintptr_t)chunk % 64) == 0;
548 secp256k1_sha256_transform(s, chunk, blocks);
549 if (!aligned) s[0] ^= 1;
550}
551
552#endif /* UINTPTR_MAX */
553
560#ifdef UINTPTR_MAX
561 CHECK(secp256k1_sha256_smoke_test(sha256_transform_align64_fail) == 0);
562 CHECK(secp256k1_sha256_smoke_test(sha256_transform_align32_fail) == 0);
563 CHECK(secp256k1_sha256_smoke_test(sha256_transform_unaligned_fail) == 0);
564#endif
566}
567
569 secp256k1_hash_ctx hash_ctx;
570 secp256k1_sha256 sha256_one;
571 secp256k1_sha256 sha256_two;
572 unsigned char out_one[32], out_two[32];
573
575
576 { /* 1) Writing one 64-byte full block vs two 32-byte blocks */
577 const unsigned char data[64] = "totally serious test message to hash, definitely no random data";
578 unsigned char data32[32];
579
580 secp256k1_sha256_initialize(&sha256_one);
581 secp256k1_sha256_initialize(&sha256_two);
582
583 /* Write the 64-byte block */
584 secp256k1_sha256_write(&hash_ctx, &sha256_one, data, 64);
585 secp256k1_sha256_finalize(&hash_ctx, &sha256_one, out_one);
586
587 /* Write the two 32-byte blocks */
588 memcpy(data32, data, 32);
589 secp256k1_sha256_write(&hash_ctx, &sha256_two, data32, 32);
590 memcpy(data32, data + 32, 32);
591 secp256k1_sha256_write(&hash_ctx, &sha256_two, data32, 32);
592 secp256k1_sha256_finalize(&hash_ctx, &sha256_two, out_two);
593
594 CHECK(secp256k1_memcmp_var(out_one, out_two, 32) == 0);
595 }
596
597 { /* 2) Writing one 80-byte block vs two 40-byte blocks */
598 const unsigned char data[80] = "Genesis: The Times 03/Jan/2009 Chancellor on brink of second bailout for banks ";
599 unsigned char data40[40];
600
601 secp256k1_sha256_initialize(&sha256_one);
602 secp256k1_sha256_initialize(&sha256_two);
603
604 /* Write the 80-byte block */
605 secp256k1_sha256_write(&hash_ctx, &sha256_one, data, 80);
606 secp256k1_sha256_finalize(&hash_ctx, &sha256_one, out_one);
607
608 /* Write the two 40-byte blocks */
609 memcpy(data40, data, 40);
610 secp256k1_sha256_write(&hash_ctx, &sha256_two, data40, 40);
611 memcpy(data40, data + 40, 40);
612 secp256k1_sha256_write(&hash_ctx, &sha256_two, data40, 40);
613 secp256k1_sha256_finalize(&hash_ctx, &sha256_two, out_two);
614
615 CHECK(secp256k1_memcmp_var(out_one, out_two, 32) == 0);
616 }
617
618 { /* 3) Writing multiple consecutive full blocks in one write (128 bytes) */
619 unsigned char data[128];
620 unsigned char i;
621 for (i = 0; i < 128; i++) data[i] = i;
622
623 secp256k1_sha256_initialize(&sha256_one);
624 secp256k1_sha256_initialize(&sha256_two);
625
626 /* Single write of 128 bytes (two full 64-byte blocks) */
627 secp256k1_sha256_write(&hash_ctx, &sha256_one, data, 128);
628 secp256k1_sha256_finalize(&hash_ctx, &sha256_one, out_one);
629
630 /* Two separate writes of 64 bytes each */
631 secp256k1_sha256_write(&hash_ctx, &sha256_two, data, 64);
632 secp256k1_sha256_write(&hash_ctx, &sha256_two, data + 64, 64);
633 secp256k1_sha256_finalize(&hash_ctx, &sha256_two, out_two);
634
635 CHECK(secp256k1_memcmp_var(out_one, out_two, 32) == 0);
636 }
637
638 { /* 4) Mixed small + large writes in sequence */
639 unsigned char data[150];
640 unsigned char i;
641 for (i = 0; i < 150; i++) data[i] = i;
642
643 secp256k1_sha256_initialize(&sha256_one);
644 secp256k1_sha256_initialize(&sha256_two);
645
646 /* Single write of 150 bytes */
647 secp256k1_sha256_write(&hash_ctx, &sha256_one, data, 150);
648 secp256k1_sha256_finalize(&hash_ctx, &sha256_one, out_one);
649
650 /* Split writes: 10, 64, 64, 12 bytes */
651 secp256k1_sha256_write(&hash_ctx, &sha256_two, data, 10);
652 secp256k1_sha256_write(&hash_ctx, &sha256_two, data + 10, 64);
653 secp256k1_sha256_write(&hash_ctx, &sha256_two, data + 74, 64);
654 secp256k1_sha256_write(&hash_ctx, &sha256_two, data + 138, 12);
655 secp256k1_sha256_finalize(&hash_ctx, &sha256_two, out_two);
656
657 CHECK(secp256k1_memcmp_var(out_one, out_two, 32) == 0);
658 }
659}
660
661static void run_ctz_tests(void) {
662 static const uint32_t b32[] = {1, 0xffffffff, 0x5e56968f, 0xe0d63129};
663 static const uint64_t b64[] = {1, 0xffffffffffffffff, 0xbcd02462139b3fc3, 0x98b5f80c769693ef};
664 int shift;
665 unsigned i;
666 for (i = 0; i < ARRAY_SIZE(b32); ++i) {
667 for (shift = 0; shift < 32; ++shift) {
668 CHECK(secp256k1_ctz32_var_debruijn(b32[i] << shift) == shift);
669 CHECK(secp256k1_ctz32_var(b32[i] << shift) == shift);
670 }
671 }
672 for (i = 0; i < ARRAY_SIZE(b64); ++i) {
673 for (shift = 0; shift < 64; ++shift) {
674 CHECK(secp256k1_ctz64_var_debruijn(b64[i] << shift) == shift);
675 CHECK(secp256k1_ctz64_var(b64[i] << shift) == shift);
676 }
677 }
678}
679
680/***** HASH TESTS *****/
681
683 const secp256k1_hash_ctx *hash_ctx = &CTX->hash_ctx;
684 static const char *inputs[] = {
685 "", "abc", "message digest", "secure hash algorithm", "SHA256 is considered to be safe",
686 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
687 "For this sample, this 63-byte string will be used as input data",
688 "This is exactly 64 bytes long, not counting the terminating byte",
689 "aaaaa",
690 };
691 static const unsigned int repeat[] = {
692 1, 1, 1, 1, 1, 1, 1, 1, 1000000/5
693 };
694 static const unsigned char outputs[][32] = {
695 {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},
696 {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},
697 {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},
698 {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},
699 {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},
700 {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},
701 {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},
702 {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},
703 {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},
704 };
705 unsigned int i, ninputs;
706
707 /* Skip last input vector for low iteration counts */
708 ninputs = ARRAY_SIZE(inputs) - 1;
709 CONDITIONAL_TEST(16, "run_sha256_known_output_tests 1000000") ninputs++;
710
711 for (i = 0; i < ninputs; i++) {
712 unsigned char out[32];
713 secp256k1_sha256 hasher;
714 unsigned int j;
715 /* 1. Run: simply write the input bytestrings */
716 j = repeat[i];
718 while (j > 0) {
719 secp256k1_sha256_write(hash_ctx, &hasher, (const unsigned char*)(inputs[i]), strlen(inputs[i]));
720 j--;
721 }
722 secp256k1_sha256_finalize(hash_ctx, &hasher, out);
723 CHECK(secp256k1_memcmp_var(out, outputs[i], 32) == 0);
724 /* 2. Run: split the input bytestrings randomly before writing */
725 if (strlen(inputs[i]) > 0) {
726 int split = testrand_int(strlen(inputs[i]));
728 j = repeat[i];
729 while (j > 0) {
730 secp256k1_sha256_write(hash_ctx, &hasher, (const unsigned char*)(inputs[i]), split);
731 secp256k1_sha256_write(hash_ctx, &hasher, (const unsigned char*)(inputs[i] + split), strlen(inputs[i]) - split);
732 j--;
733 }
734 secp256k1_sha256_finalize(hash_ctx, &hasher, out);
735 CHECK(secp256k1_memcmp_var(out, outputs[i], 32) == 0);
736 }
737 }
738}
739
784static void run_sha256_counter_tests(void) {
785 static const char *input = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno";
786 static const secp256k1_sha256 midstates[] = {
787 {{0xa2b5c8bb, 0x26c88bb3, 0x2abdc3d2, 0x9def99a3, 0xdfd21a6e, 0x41fe585b, 0x7ef2c440, 0x2b79adda},
788 {0x00}, 0xfffc0},
789 {{0xa0d29445, 0x9287de66, 0x76aabd71, 0x41acd765, 0x0c7528b4, 0x84e14906, 0x942faec6, 0xcc5a7b26},
790 {0x00}, 0x1fffc0},
791 {{0x50449526, 0xb9f1d657, 0xa0fc13e9, 0x50860f10, 0xa550c431, 0x3fbc97c1, 0x7bbb2d89, 0xdb67bac1},
792 {0x00}, 0x3fffc0},
793 {{0x54a6efdc, 0x46762e7b, 0x88bfe73f, 0xbbd149c7, 0x41620c43, 0x1168da7b, 0x2c5960f9, 0xeccffda6},
794 {0x00}, 0x7fffc0},
795 {{0x2515a8f5, 0x5faa2977, 0x3a850486, 0xac858cad, 0x7b7276ee, 0x235c0385, 0xc53a157c, 0x7cb3e69c},
796 {0x00}, 0xffffc0},
797 {{0x34f39828, 0x409fedb7, 0x4bbdd0fb, 0x3b643634, 0x7806bf2e, 0xe0d1b713, 0xca3f2e1e, 0xe38722c2},
798 {0x00}, 0x1ffffc0},
799 {{0x389ef5c5, 0x38c54167, 0x8f5d56ab, 0x582a75cc, 0x8217caef, 0xf10947dd, 0x6a1998a8, 0x048f0b8c},
800 {0x00}, 0x3ffffc0},
801 {{0xd6c3f394, 0x0bee43b9, 0x6783f497, 0x29fa9e21, 0x6ce491c1, 0xa81fe45e, 0x2fc3859a, 0x269012d0},
802 {0x00}, 0x7ffffc0},
803 {{0x6dd3c526, 0x44d88aa0, 0x806a1bae, 0xfbcc0d32, 0x9d6144f3, 0x9d2bd757, 0x9851a957, 0xb50430ad},
804 {0x00}, 0xfffffc0},
805 {{0x2add4021, 0xdfe8a9e6, 0xa56317c6, 0x7a15f5bb, 0x4a48aacd, 0x5d368414, 0x4f00e6f0, 0xd9355023},
806 {0x00}, 0x1fffffc0},
807 {{0xb66666b4, 0xdbeac32b, 0x0ea351ae, 0xcba9da46, 0x6278b874, 0x8c508e23, 0xe16ca776, 0x8465bac1},
808 {0x00}, 0x3fffffc0},
809 {{0xb6744789, 0x9cce87aa, 0xc4c478b7, 0xf38404d8, 0x2e38ba62, 0xa3f7019b, 0x50458fe7, 0x3047dbec},
810 {0x00}, 0x7fffffc0},
811 {{0x8b1297ba, 0xba261a80, 0x2ba1b0dd, 0xfbc67d6d, 0x61072c4e, 0x4b5a2a0f, 0x52872760, 0x2dfeb162},
812 {0x00}, 0xffffffc0},
813 {{0x24f33cf7, 0x41ad6583, 0x41c8ff5d, 0xca7ef35f, 0x50395756, 0x021b743e, 0xd7126cd7, 0xd037473a},
814 {0x00}, 0x1ffffffc0},
815 };
816 static const unsigned char outputs[][32] = {
817 {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},
818 {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},
819 {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},
820 {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},
821 {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},
822 {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},
823 {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},
824 {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},
825 {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},
826 {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},
827 {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},
828 {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},
829 {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},
830 {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},
831 };
832 const secp256k1_hash_ctx *hash_ctx = &CTX->hash_ctx;
833 unsigned int i;
834 for (i = 0; i < ARRAY_SIZE(midstates); i++) {
835 unsigned char out[32];
836 secp256k1_sha256 hasher = midstates[i];
837 secp256k1_sha256_write(hash_ctx, &hasher, (const unsigned char*)input, strlen(input));
838 secp256k1_sha256_finalize(hash_ctx, &hasher, out);
839 CHECK(secp256k1_memcmp_var(out, outputs[i], 32) == 0);
840 }
841}
842
843/* Tests for the equality of two sha256 structs. This function only produces a
844 * correct result if an integer multiple of 64 many bytes have been written
845 * into the hash functions. This function is used by some module tests. */
846static void test_sha256_eq(const secp256k1_sha256 *sha1, const secp256k1_sha256 *sha2) {
847 /* Is buffer fully consumed? */
848 CHECK((sha1->bytes & 0x3F) == 0);
849
850 CHECK(sha1->bytes == sha2->bytes);
851 CHECK(secp256k1_memcmp_var(sha1->s, sha2->s, sizeof(sha1->s)) == 0);
852}
853/* Convenience function for using test_sha256_eq to verify the correctness of a
854 * tagged hash midstate. This function is used by some module tests. */
855static void test_sha256_tag_midstate(const secp256k1_hash_ctx *hash_ctx, secp256k1_sha256 *sha_tagged, const unsigned char *tag, size_t taglen) {
857 secp256k1_sha256_initialize_tagged(hash_ctx, &sha, tag, taglen);
858 test_sha256_eq(&sha, sha_tagged);
859}
860
861static void run_hmac_sha256_tests(void) {
862 static const char *keys[6] = {
863 "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
864 "\x4a\x65\x66\x65",
865 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
866 "\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",
867 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
868 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
869 };
870 static const char *inputs[6] = {
871 "\x48\x69\x20\x54\x68\x65\x72\x65",
872 "\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",
873 "\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",
874 "\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",
875 "\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",
876 "\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"
877 };
878 static const unsigned char outputs[6][32] = {
879 {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},
880 {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},
881 {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},
882 {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},
883 {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},
884 {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}
885 };
886 int i;
887 const secp256k1_hash_ctx *hash_ctx = &CTX->hash_ctx;
888 for (i = 0; i < 6; i++) {
890 unsigned char out[32];
891 secp256k1_hmac_sha256_initialize(hash_ctx, &hasher, (const unsigned char*)(keys[i]), strlen(keys[i]));
892 secp256k1_hmac_sha256_write(hash_ctx, &hasher, (const unsigned char*)(inputs[i]), strlen(inputs[i]));
893 secp256k1_hmac_sha256_finalize(hash_ctx, &hasher, out);
894 CHECK(secp256k1_memcmp_var(out, outputs[i], 32) == 0);
895 if (strlen(inputs[i]) > 0) {
896 int split = testrand_int(strlen(inputs[i]));
897 secp256k1_hmac_sha256_initialize(hash_ctx, &hasher, (const unsigned char*)(keys[i]), strlen(keys[i]));
898 secp256k1_hmac_sha256_write(hash_ctx, &hasher, (const unsigned char*)(inputs[i]), split);
899 secp256k1_hmac_sha256_write(hash_ctx, &hasher, (const unsigned char*)(inputs[i] + split), strlen(inputs[i]) - split);
900 secp256k1_hmac_sha256_finalize(hash_ctx, &hasher, out);
901 CHECK(secp256k1_memcmp_var(out, outputs[i], 32) == 0);
902 }
903 }
904}
905
907 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};
908 static const unsigned char out1[3][32] = {
909 {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},
910 {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},
911 {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}
912 };
913
914 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};
915 static const unsigned char out2[3][32] = {
916 {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},
917 {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},
918 {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}
919 };
920
921 const secp256k1_hash_ctx *hash_ctx = &CTX->hash_ctx;
923 unsigned char out[32];
924 int i;
925
926 secp256k1_rfc6979_hmac_sha256_initialize(hash_ctx, &rng, key1, 64);
927 for (i = 0; i < 3; i++) {
929 CHECK(secp256k1_memcmp_var(out, out1[i], 32) == 0);
930 }
932
933 secp256k1_rfc6979_hmac_sha256_initialize(hash_ctx, &rng, key1, 65);
934 for (i = 0; i < 3; i++) {
936 CHECK(secp256k1_memcmp_var(out, out1[i], 32) != 0);
937 }
939
940 secp256k1_rfc6979_hmac_sha256_initialize(hash_ctx, &rng, key2, 64);
941 for (i = 0; i < 3; i++) {
943 CHECK(secp256k1_memcmp_var(out, out2[i], 32) == 0);
944 }
946}
947
948static void run_tagged_sha256_tests(void) {
949 unsigned char tag[32] = { 0 };
950 unsigned char msg[32] = { 0 };
951 unsigned char hash32[32];
952 unsigned char hash_expected[32] = {
953 0x04, 0x7A, 0x5E, 0x17, 0xB5, 0x86, 0x47, 0xC1,
954 0x3C, 0xC6, 0xEB, 0xC0, 0xAA, 0x58, 0x3B, 0x62,
955 0xFB, 0x16, 0x43, 0x32, 0x68, 0x77, 0x40, 0x6C,
956 0xE2, 0x76, 0x55, 0x9A, 0x3B, 0xDE, 0x55, 0xB3
957 };
958
959 /* API test */
960 CHECK(secp256k1_tagged_sha256(CTX, hash32, tag, sizeof(tag), msg, sizeof(msg)) == 1);
961 CHECK_ILLEGAL(CTX, secp256k1_tagged_sha256(CTX, NULL, tag, sizeof(tag), msg, sizeof(msg)));
962 CHECK_ILLEGAL(CTX, secp256k1_tagged_sha256(CTX, hash32, NULL, 0, msg, sizeof(msg)));
963 CHECK_ILLEGAL(CTX, secp256k1_tagged_sha256(CTX, hash32, tag, sizeof(tag), NULL, 0));
964
965 /* Static test vector */
966 memcpy(tag, "tag", 3);
967 memcpy(msg, "msg", 3);
968 CHECK(secp256k1_tagged_sha256(CTX, hash32, tag, 3, msg, 3) == 1);
969 CHECK(secp256k1_memcmp_var(hash32, hash_expected, sizeof(hash32)) == 0);
970}
971
973 /* Midstate for the tagged hash with tag "sha256_midstate_test_tag". */
974 static const unsigned char tag[] = "sha256_midstate_test_tag";
975 static const uint32_t midstate[8] = {
976 0xa9ec59eaul, 0x9b4c2ffful, 0x400821e2ul, 0x0dcf3847ul,
977 0xbe7ea179ul, 0xa5772bdcul, 0x7d29bfe3ul, 0xa486b855ul
978 };
979 const secp256k1_hash_ctx *hash_ctx = &CTX->hash_ctx;
981
982 secp256k1_sha256_initialize_midstate(&sha, 64, midstate);
983 test_sha256_tag_midstate(hash_ctx, &sha, tag, sizeof(tag) - 1);
984}
985
986/***** MODINV TESTS *****/
987
988/* Compute the modular inverse of (odd) x mod 2^64. */
989static uint64_t modinv2p64(uint64_t x) {
990 /* If w = 1/x mod 2^(2^L), then w*(2 - w*x) = 1/x mod 2^(2^(L+1)). See
991 * Hacker's Delight second edition, Henry S. Warren, Jr., pages 245-247 for
992 * why. Start with L=0, for which it is true for every odd x that
993 * 1/x=1 mod 2. Iterating 6 times gives us 1/x mod 2^64. */
994 int l;
995 uint64_t w = 1;
996 CHECK(x & 1);
997 for (l = 0; l < 6; ++l) w *= (2 - w*x);
998 return w;
999}
1000
1001
1002/* compute out = (a*b) mod m; if b=NULL, treat b=1; if m=NULL, treat m=infinity.
1003 *
1004 * Out is a 512-bit number (represented as 32 uint16_t's in LE order). The other
1005 * arguments are 256-bit numbers (represented as 16 uint16_t's in LE order). */
1006static void mulmod256(uint16_t* out, const uint16_t* a, const uint16_t* b, const uint16_t* m) {
1007 uint16_t mul[32];
1008 uint64_t c = 0;
1009 int i, j;
1010 int m_bitlen = 0;
1011 int mul_bitlen = 0;
1012
1013 if (b != NULL) {
1014 /* Compute the product of a and b, and put it in mul. */
1015 for (i = 0; i < 32; ++i) {
1016 for (j = i <= 15 ? 0 : i - 15; j <= i && j <= 15; j++) {
1017 c += (uint64_t)a[j] * b[i - j];
1018 }
1019 mul[i] = c & 0xFFFF;
1020 c >>= 16;
1021 }
1022 CHECK(c == 0);
1023
1024 /* compute the highest set bit in mul */
1025 for (i = 511; i >= 0; --i) {
1026 if ((mul[i >> 4] >> (i & 15)) & 1) {
1027 mul_bitlen = i;
1028 break;
1029 }
1030 }
1031 } else {
1032 /* if b==NULL, set mul=a. */
1033 memcpy(mul, a, 32);
1034 memset(mul + 16, 0, 32);
1035 /* compute the highest set bit in mul */
1036 for (i = 255; i >= 0; --i) {
1037 if ((mul[i >> 4] >> (i & 15)) & 1) {
1038 mul_bitlen = i;
1039 break;
1040 }
1041 }
1042 }
1043
1044 if (m) {
1045 /* Compute the highest set bit in m. */
1046 for (i = 255; i >= 0; --i) {
1047 if ((m[i >> 4] >> (i & 15)) & 1) {
1048 m_bitlen = i;
1049 break;
1050 }
1051 }
1052
1053 /* Try do mul -= m<<i, for i going down to 0, whenever the result is not negative */
1054 for (i = mul_bitlen - m_bitlen; i >= 0; --i) {
1055 uint16_t mul2[32];
1056 int64_t cs;
1057
1058 /* Compute mul2 = mul - m<<i. */
1059 cs = 0; /* accumulator */
1060 for (j = 0; j < 32; ++j) { /* j loops over the output limbs in mul2. */
1061 /* Compute sub: the 16 bits in m that will be subtracted from mul2[j]. */
1062 uint16_t sub = 0;
1063 int p;
1064 for (p = 0; p < 16; ++p) { /* p loops over the bit positions in mul2[j]. */
1065 int bitpos = j * 16 - i + p; /* bitpos is the correspond bit position in m. */
1066 if (bitpos >= 0 && bitpos < 256) {
1067 sub |= ((m[bitpos >> 4] >> (bitpos & 15)) & 1) << p;
1068 }
1069 }
1070 /* Add mul[j]-sub to accumulator, and shift bottom 16 bits out to mul2[j]. */
1071 cs += mul[j];
1072 cs -= sub;
1073 mul2[j] = (cs & 0xFFFF);
1074 cs >>= 16;
1075 }
1076 /* If remainder of subtraction is 0, set mul = mul2. */
1077 if (cs == 0) {
1078 memcpy(mul, mul2, sizeof(mul));
1079 }
1080 }
1081 /* Sanity check: test that all limbs higher than m's highest are zero */
1082 for (i = (m_bitlen >> 4) + 1; i < 32; ++i) {
1083 CHECK(mul[i] == 0);
1084 }
1085 }
1086 memcpy(out, mul, 32);
1087}
1088
1089/* Convert a 256-bit number represented as 16 uint16_t's to signed30 notation. */
1090static void uint16_to_signed30(secp256k1_modinv32_signed30* out, const uint16_t* in) {
1091 int i;
1092 memset(out->v, 0, sizeof(out->v));
1093 for (i = 0; i < 256; ++i) {
1094 out->v[i / 30] |= (int32_t)(((in[i >> 4]) >> (i & 15)) & 1) << (i % 30);
1095 }
1096}
1097
1098/* Convert a 256-bit number in signed30 notation to a representation as 16 uint16_t's. */
1099static void signed30_to_uint16(uint16_t* out, const secp256k1_modinv32_signed30* in) {
1100 int i;
1101 memset(out, 0, 32);
1102 for (i = 0; i < 256; ++i) {
1103 out[i >> 4] |= (((in->v[i / 30]) >> (i % 30)) & 1) << (i & 15);
1104 }
1105}
1106
1107/* Randomly mutate the sign of limbs in signed30 representation, without changing the value. */
1109 int i;
1110 for (i = 0; i < 16; ++i) {
1111 int pos = testrand_bits(3);
1112 if (x->v[pos] > 0 && x->v[pos + 1] <= 0x3fffffff) {
1113 x->v[pos] -= 0x40000000;
1114 x->v[pos + 1] += 1;
1115 } else if (x->v[pos] < 0 && x->v[pos + 1] >= 0x3fffffff) {
1116 x->v[pos] += 0x40000000;
1117 x->v[pos + 1] -= 1;
1118 }
1119 }
1120}
1121
1122/* Test secp256k1_modinv32{_var}, using inputs in 16-bit limb format, and returning inverse. */
1123static void test_modinv32_uint16(uint16_t* out, const uint16_t* in, const uint16_t* mod) {
1124 uint16_t tmp[16];
1127 int i, vartime, nonzero;
1128
1129 uint16_to_signed30(&x, in);
1130 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;
1131 uint16_to_signed30(&m.modulus, mod);
1132
1133 /* compute 1/modulus mod 2^30 */
1134 m.modulus_inv30 = modinv2p64(m.modulus.v[0]) & 0x3fffffff;
1135 CHECK(((m.modulus_inv30 * m.modulus.v[0]) & 0x3fffffff) == 1);
1136
1137 /* Test secp256k1_jacobi32_maybe_var. */
1138 if (nonzero) {
1139 int jac;
1140 uint16_t sqr[16], negone[16];
1141 mulmod256(sqr, in, in, mod);
1142 uint16_to_signed30(&x, sqr);
1143 /* Compute jacobi symbol of in^2, which must be 1 (or uncomputable). */
1144 jac = secp256k1_jacobi32_maybe_var(&x, &m);
1145 CHECK(jac == 0 || jac == 1);
1146 /* Then compute the jacobi symbol of -(in^2). x and -x have opposite
1147 * jacobi symbols if and only if (mod % 4) == 3. */
1148 negone[0] = mod[0] - 1;
1149 for (i = 1; i < 16; ++i) negone[i] = mod[i];
1150 mulmod256(sqr, sqr, negone, mod);
1151 uint16_to_signed30(&x, sqr);
1152 jac = secp256k1_jacobi32_maybe_var(&x, &m);
1153 CHECK(jac == 0 || jac == 1 - (mod[0] & 2));
1154 }
1155
1156 uint16_to_signed30(&x, in);
1157 mutate_sign_signed30(&m.modulus);
1158 for (vartime = 0; vartime < 2; ++vartime) {
1159 /* compute inverse */
1160 (vartime ? secp256k1_modinv32_var : secp256k1_modinv32)(&x, &m);
1161
1162 /* produce output */
1164
1165 /* check if the inverse times the input is 1 (mod m), unless x is 0. */
1166 mulmod256(tmp, out, in, mod);
1167 CHECK(tmp[0] == nonzero);
1168 for (i = 1; i < 16; ++i) CHECK(tmp[i] == 0);
1169
1170 /* invert again */
1171 (vartime ? secp256k1_modinv32_var : secp256k1_modinv32)(&x, &m);
1172
1173 /* check if the result is equal to the input */
1174 signed30_to_uint16(tmp, &x);
1175 for (i = 0; i < 16; ++i) CHECK(tmp[i] == in[i]);
1176 }
1177}
1178
1179#ifdef SECP256K1_WIDEMUL_INT128
1180/* Convert a 256-bit number represented as 16 uint16_t's to signed62 notation. */
1181static void uint16_to_signed62(secp256k1_modinv64_signed62* out, const uint16_t* in) {
1182 int i;
1183 memset(out->v, 0, sizeof(out->v));
1184 for (i = 0; i < 256; ++i) {
1185 out->v[i / 62] |= (int64_t)(((in[i >> 4]) >> (i & 15)) & 1) << (i % 62);
1186 }
1187}
1188
1189/* Convert a 256-bit number in signed62 notation to a representation as 16 uint16_t's. */
1190static void signed62_to_uint16(uint16_t* out, const secp256k1_modinv64_signed62* in) {
1191 int i;
1192 memset(out, 0, 32);
1193 for (i = 0; i < 256; ++i) {
1194 out[i >> 4] |= (((in->v[i / 62]) >> (i % 62)) & 1) << (i & 15);
1195 }
1196}
1197
1198/* Randomly mutate the sign of limbs in signed62 representation, without changing the value. */
1199static void mutate_sign_signed62(secp256k1_modinv64_signed62* x) {
1200 static const int64_t M62 = (int64_t)(UINT64_MAX >> 2);
1201 int i;
1202 for (i = 0; i < 8; ++i) {
1203 int pos = testrand_bits(2);
1204 if (x->v[pos] > 0 && x->v[pos + 1] <= M62) {
1205 x->v[pos] -= (M62 + 1);
1206 x->v[pos + 1] += 1;
1207 } else if (x->v[pos] < 0 && x->v[pos + 1] >= -M62) {
1208 x->v[pos] += (M62 + 1);
1209 x->v[pos + 1] -= 1;
1210 }
1211 }
1212}
1213
1214/* Test secp256k1_modinv64{_var}, using inputs in 16-bit limb format, and returning inverse. */
1215static void test_modinv64_uint16(uint16_t* out, const uint16_t* in, const uint16_t* mod) {
1216 static const int64_t M62 = (int64_t)(UINT64_MAX >> 2);
1217 uint16_t tmp[16];
1220 int i, vartime, nonzero;
1221
1222 uint16_to_signed62(&x, in);
1223 nonzero = (x.v[0] | x.v[1] | x.v[2] | x.v[3] | x.v[4]) != 0;
1224 uint16_to_signed62(&m.modulus, mod);
1225
1226 /* compute 1/modulus mod 2^62 */
1227 m.modulus_inv62 = modinv2p64(m.modulus.v[0]) & M62;
1228 CHECK(((m.modulus_inv62 * m.modulus.v[0]) & M62) == 1);
1229
1230 /* Test secp256k1_jacobi64_maybe_var. */
1231 if (nonzero) {
1232 int jac;
1233 uint16_t sqr[16], negone[16];
1234 mulmod256(sqr, in, in, mod);
1235 uint16_to_signed62(&x, sqr);
1236 /* Compute jacobi symbol of in^2, which must be 1 (or uncomputable). */
1237 jac = secp256k1_jacobi64_maybe_var(&x, &m);
1238 CHECK(jac == 0 || jac == 1);
1239 /* Then compute the jacobi symbol of -(in^2). x and -x have opposite
1240 * jacobi symbols if and only if (mod % 4) == 3. */
1241 negone[0] = mod[0] - 1;
1242 for (i = 1; i < 16; ++i) negone[i] = mod[i];
1243 mulmod256(sqr, sqr, negone, mod);
1244 uint16_to_signed62(&x, sqr);
1245 jac = secp256k1_jacobi64_maybe_var(&x, &m);
1246 CHECK(jac == 0 || jac == 1 - (mod[0] & 2));
1247 }
1248
1249 uint16_to_signed62(&x, in);
1250 mutate_sign_signed62(&m.modulus);
1251 for (vartime = 0; vartime < 2; ++vartime) {
1252 /* compute inverse */
1253 (vartime ? secp256k1_modinv64_var : secp256k1_modinv64)(&x, &m);
1254
1255 /* produce output */
1256 signed62_to_uint16(out, &x);
1257
1258 /* check if the inverse times the input is 1 (mod m), unless x is 0. */
1259 mulmod256(tmp, out, in, mod);
1260 CHECK(tmp[0] == nonzero);
1261 for (i = 1; i < 16; ++i) CHECK(tmp[i] == 0);
1262
1263 /* invert again */
1264 (vartime ? secp256k1_modinv64_var : secp256k1_modinv64)(&x, &m);
1265
1266 /* check if the result is equal to the input */
1267 signed62_to_uint16(tmp, &x);
1268 for (i = 0; i < 16; ++i) CHECK(tmp[i] == in[i]);
1269 }
1270}
1271#endif
1272
1273/* test if a and b are coprime */
1274static int coprime(const uint16_t* a, const uint16_t* b) {
1275 uint16_t x[16], y[16], t[16];
1276 int i;
1277 int iszero;
1278 memcpy(x, a, 32);
1279 memcpy(y, b, 32);
1280
1281 /* simple gcd loop: while x!=0, (x,y)=(y%x,x) */
1282 while (1) {
1283 iszero = 1;
1284 for (i = 0; i < 16; ++i) {
1285 if (x[i] != 0) {
1286 iszero = 0;
1287 break;
1288 }
1289 }
1290 if (iszero) break;
1291 mulmod256(t, y, NULL, x);
1292 memcpy(y, x, 32);
1293 memcpy(x, t, 32);
1294 }
1295
1296 /* return whether y=1 */
1297 if (y[0] != 1) return 0;
1298 for (i = 1; i < 16; ++i) {
1299 if (y[i] != 0) return 0;
1300 }
1301 return 1;
1302}
1303
1304static void run_modinv_tests(void) {
1305 /* Fixed test cases. Each tuple is (input, modulus, output), each as 16x16 bits in LE order. */
1306 static const uint16_t CASES[][3][16] = {
1307 /* Test cases triggering edge cases in divsteps */
1308
1309 /* Test case known to need 713 divsteps */
1310 {{0x1513, 0x5389, 0x54e9, 0x2798, 0x1957, 0x66a0, 0x8057, 0x3477,
1311 0x7784, 0x1052, 0x326a, 0x9331, 0x6506, 0xa95c, 0x91f3, 0xfb5e},
1312 {0x2bdd, 0x8df4, 0xcc61, 0x481f, 0xdae5, 0x5ca7, 0xf43b, 0x7d54,
1313 0x13d6, 0x469b, 0x2294, 0x20f4, 0xb2a4, 0xa2d1, 0x3ff1, 0xfd4b},
1314 {0xffd8, 0xd9a0, 0x456e, 0x81bb, 0xbabd, 0x6cea, 0x6dbd, 0x73ab,
1315 0xbb94, 0x3d3c, 0xdf08, 0x31c4, 0x3e32, 0xc179, 0x2486, 0xb86b}},
1316 /* Test case known to need 589 divsteps, reaching delta=-140 and
1317 delta=141. */
1318 {{0x3fb1, 0x903b, 0x4eb7, 0x4813, 0xd863, 0x26bf, 0xd89f, 0xa8a9,
1319 0x02fe, 0x57c6, 0x554a, 0x4eab, 0x165e, 0x3d61, 0xee1e, 0x456c},
1320 {0x9295, 0x823b, 0x5c1f, 0x5386, 0x48e0, 0x02ff, 0x4c2a, 0xa2da,
1321 0xe58f, 0x967c, 0xc97e, 0x3f5a, 0x69fb, 0x52d9, 0x0a86, 0xb4a3},
1322 {0x3d30, 0xb893, 0xa809, 0xa7a8, 0x26f5, 0x5b42, 0x55be, 0xf4d0,
1323 0x12c2, 0x7e6a, 0xe41a, 0x90c7, 0xebfa, 0xf920, 0x304e, 0x1419}},
1324 /* Test case known to need 650 divsteps, and doing 65 consecutive (f,g/2) steps. */
1325 {{0x8583, 0x5058, 0xbeae, 0xeb69, 0x48bc, 0x52bb, 0x6a9d, 0xcc94,
1326 0x2a21, 0x87d5, 0x5b0d, 0x42f6, 0x5b8a, 0x2214, 0xe9d6, 0xa040},
1327 {0x7531, 0x27cb, 0x7e53, 0xb739, 0x6a5f, 0x83f5, 0xa45c, 0xcb1d,
1328 0x8a87, 0x1c9c, 0x51d7, 0x851c, 0xb9d8, 0x1fbe, 0xc241, 0xd4a3},
1329 {0xcdb4, 0x275c, 0x7d22, 0xa906, 0x0173, 0xc054, 0x7fdf, 0x5005,
1330 0x7fb8, 0x9059, 0xdf51, 0x99df, 0x2654, 0x8f6e, 0x070f, 0xb347}},
1331 /* example needing 713 divsteps; delta=-2..3 */
1332 {{0xe2e9, 0xee91, 0x4345, 0xe5ad, 0xf3ec, 0x8f42, 0x0364, 0xd5c9,
1333 0xff49, 0xbef5, 0x4544, 0x4c7c, 0xae4b, 0xfd9d, 0xb35b, 0xda9d},
1334 {0x36e7, 0x8cca, 0x2ed0, 0x47b3, 0xaca4, 0xb374, 0x7d2a, 0x0772,
1335 0x6bdb, 0xe0a7, 0x900b, 0xfe10, 0x788c, 0x6f22, 0xd909, 0xf298},
1336 {0xd8c6, 0xba39, 0x13ed, 0x198c, 0x16c8, 0xb837, 0xa5f2, 0x9797,
1337 0x0113, 0x882a, 0x15b5, 0x324c, 0xabee, 0xe465, 0x8170, 0x85ac}},
1338 /* example needing 713 divsteps; delta=-2..3 */
1339 {{0xd5b7, 0x2966, 0x040e, 0xf59a, 0x0387, 0xd96d, 0xbfbc, 0xd850,
1340 0x2d96, 0x872a, 0xad81, 0xc03c, 0xbb39, 0xb7fa, 0xd904, 0xef78},
1341 {0x6279, 0x4314, 0xfdd3, 0x1568, 0x0982, 0x4d13, 0x625f, 0x010c,
1342 0x22b1, 0x0cc3, 0xf22d, 0x5710, 0x1109, 0x5751, 0x7714, 0xfcf2},
1343 {0xdb13, 0x5817, 0x232e, 0xe456, 0xbbbc, 0x6fbe, 0x4572, 0xa358,
1344 0xc76d, 0x928e, 0x0162, 0x5314, 0x8325, 0x5683, 0xe21b, 0xda88}},
1345 /* example needing 713 divsteps; delta=-2..3 */
1346 {{0xa06f, 0x71ee, 0x3bac, 0x9ebb, 0xdeaa, 0x09ed, 0x1cf7, 0x9ec9,
1347 0x7158, 0x8b72, 0x5d53, 0x5479, 0x5c75, 0xbb66, 0x9125, 0xeccc},
1348 {0x2941, 0xd46c, 0x3cd4, 0x4a9d, 0x5c4a, 0x256b, 0xbd6c, 0x9b8e,
1349 0x8fe0, 0x8a14, 0xffe8, 0x2496, 0x618d, 0xa9d7, 0x5018, 0xfb29},
1350 {0x437c, 0xbd60, 0x7590, 0x94bb, 0x0095, 0xd35e, 0xd4fe, 0xd6da,
1351 0x0d4e, 0x5342, 0x4cd2, 0x169b, 0x661c, 0x1380, 0xed2d, 0x85c1}},
1352 /* example reaching delta=-64..65; 661 divsteps */
1353 {{0xfde4, 0x68d6, 0x6c48, 0x7f77, 0x1c78, 0x96de, 0x2fd9, 0xa6c2,
1354 0xbbb5, 0xd319, 0x69cf, 0xd4b3, 0xa321, 0xcda0, 0x172e, 0xe530},
1355 {0xd9e3, 0x0f60, 0x3d86, 0xeeab, 0x25ee, 0x9582, 0x2d50, 0xfe16,
1356 0xd4e2, 0xe3ba, 0x94e2, 0x9833, 0x6c5e, 0x8982, 0x13b6, 0xe598},
1357 {0xe675, 0xf55a, 0x10f6, 0xabde, 0x5113, 0xecaa, 0x61ae, 0xad9f,
1358 0x0c27, 0xef33, 0x62e5, 0x211d, 0x08fa, 0xa78d, 0xc675, 0x8bae}},
1359 /* example reaching delta=-64..65; 661 divsteps */
1360 {{0x21bf, 0x52d5, 0x8fd4, 0xaa18, 0x156a, 0x7247, 0xebb8, 0x5717,
1361 0x4eb5, 0x1421, 0xb58f, 0x3b0b, 0x5dff, 0xe533, 0xb369, 0xd28a},
1362 {0x9f6b, 0xe463, 0x2563, 0xc74d, 0x6d81, 0x636a, 0x8fc8, 0x7a94,
1363 0x9429, 0x1585, 0xf35e, 0x7ff5, 0xb64f, 0x9720, 0xba74, 0xe108},
1364 {0xa5ab, 0xea7b, 0xfe5e, 0x8a85, 0x13be, 0x7934, 0xe8a0, 0xa187,
1365 0x86b5, 0xe477, 0xb9a4, 0x75d7, 0x538f, 0xdd70, 0xc781, 0xb67d}},
1366 /* example reaching delta=-64..65; 661 divsteps */
1367 {{0xa41a, 0x3e8d, 0xf1f5, 0x9493, 0x868c, 0x5103, 0x2725, 0x3ceb,
1368 0x6032, 0x3624, 0xdc6b, 0x9120, 0xbf4c, 0x8821, 0x91ad, 0xb31a},
1369 {0x5c0b, 0xdda5, 0x20f8, 0x32a1, 0xaf73, 0x6ec5, 0x4779, 0x43d6,
1370 0xd454, 0x9573, 0xbf84, 0x5a58, 0xe04e, 0x307e, 0xd1d5, 0xe230},
1371 {0xda15, 0xbcd6, 0x7180, 0xabd3, 0x04e6, 0x6986, 0xc0d7, 0x90bb,
1372 0x3a4d, 0x7c95, 0xaaab, 0x9ab3, 0xda34, 0xa7f6, 0x9636, 0x6273}},
1373 /* example doing 123 consecutive (f,g/2) steps; 615 divsteps */
1374 {{0xb4d6, 0xb38f, 0x00aa, 0xebda, 0xd4c2, 0x70b8, 0x9dad, 0x58ee,
1375 0x68f8, 0x48d3, 0xb5ff, 0xf422, 0x9e46, 0x2437, 0x18d0, 0xd9cc},
1376 {0x5c83, 0xfed7, 0x97f5, 0x3f07, 0xcaad, 0x95b1, 0xb4a4, 0xb005,
1377 0x23af, 0xdd27, 0x6c0d, 0x932c, 0xe2b2, 0xe3ae, 0xfb96, 0xdf67},
1378 {0x3105, 0x0127, 0xfd48, 0x039b, 0x35f1, 0xbc6f, 0x6c0a, 0xb572,
1379 0xe4df, 0xebad, 0x8edc, 0xb89d, 0x9555, 0x4c26, 0x1fef, 0x997c}},
1380 /* example doing 123 consecutive (f,g/2) steps; 614 divsteps */
1381 {{0x5138, 0xd474, 0x385f, 0xc964, 0x00f2, 0x6df7, 0x862d, 0xb185,
1382 0xb264, 0xe9e1, 0x466c, 0xf39e, 0xafaf, 0x5f41, 0x47e2, 0xc89d},
1383 {0x8607, 0x9c81, 0x46a2, 0x7dcc, 0xcb0c, 0x9325, 0xe149, 0x2bde,
1384 0x6632, 0x2869, 0xa261, 0xb163, 0xccee, 0x22ae, 0x91e0, 0xcfd5},
1385 {0x831c, 0xda22, 0xb080, 0xba7a, 0x26e2, 0x54b0, 0x073b, 0x5ea0,
1386 0xed4b, 0xcb3d, 0xbba1, 0xbec8, 0xf2ad, 0xae0d, 0x349b, 0x17d1}},
1387 /* example doing 123 consecutive (f,g/2) steps; 614 divsteps */
1388 {{0xe9a5, 0xb4ad, 0xd995, 0x9953, 0xcdff, 0x50d7, 0xf715, 0x9dc7,
1389 0x3e28, 0x15a9, 0x95a3, 0x8554, 0x5b5e, 0xad1d, 0x6d57, 0x3d50},
1390 {0x3ad9, 0xbd60, 0x5cc7, 0x6b91, 0xadeb, 0x71f6, 0x7cc4, 0xa58a,
1391 0x2cce, 0xf17c, 0x38c9, 0x97ed, 0x65fb, 0x3fa6, 0xa6bc, 0xeb24},
1392 {0xf96c, 0x1963, 0x8151, 0xa0cc, 0x299b, 0xf277, 0x001a, 0x16bb,
1393 0xfd2e, 0x532d, 0x0410, 0xe117, 0x6b00, 0x44ec, 0xca6a, 0x1745}},
1394 /* example doing 446 (f,g/2) steps; 523 divsteps */
1395 {{0x3758, 0xa56c, 0xe41e, 0x4e47, 0x0975, 0xa82b, 0x107c, 0x89cf,
1396 0x2093, 0x5a0c, 0xda37, 0xe007, 0x6074, 0x4f68, 0x2f5a, 0xbb8a},
1397 {0x4beb, 0xa40f, 0x2c42, 0xd9d6, 0x97e8, 0xca7c, 0xd395, 0x894f,
1398 0x1f50, 0x8067, 0xa233, 0xb850, 0x1746, 0x1706, 0xbcda, 0xdf32},
1399 {0x762a, 0xceda, 0x4c45, 0x1ca0, 0x8c37, 0xd8c5, 0xef57, 0x7a2c,
1400 0x6e98, 0xe38a, 0xc50e, 0x2ca9, 0xcb85, 0x24d5, 0xc29c, 0x61f6}},
1401 /* example doing 446 (f,g/2) steps; 523 divsteps */
1402 {{0x6f38, 0x74ad, 0x7332, 0x4073, 0x6521, 0xb876, 0xa370, 0xa6bd,
1403 0xcea5, 0xbd06, 0x969f, 0x77c6, 0x1e69, 0x7c49, 0x7d51, 0xb6e7},
1404 {0x3f27, 0x4be4, 0xd81e, 0x1396, 0xb21f, 0x92aa, 0x6dc3, 0x6283,
1405 0x6ada, 0x3ca2, 0xc1e5, 0x8b9b, 0xd705, 0x5598, 0x8ba1, 0xe087},
1406 {0x6a22, 0xe834, 0xbc8d, 0xcee9, 0x42fc, 0xfc77, 0x9c45, 0x1ca8,
1407 0xeb66, 0xed74, 0xaaf9, 0xe75f, 0xfe77, 0x46d2, 0x179b, 0xbf3e}},
1408 /* example doing 336 (f,(f+g)/2) steps; 693 divsteps */
1409 {{0x7ea7, 0x444e, 0x84ea, 0xc447, 0x7c1f, 0xab97, 0x3de6, 0x5878,
1410 0x4e8b, 0xc017, 0x03e0, 0xdc40, 0xbbd0, 0x74ce, 0x0169, 0x7ab5},
1411 {0x4023, 0x154f, 0xfbe4, 0x8195, 0xfda0, 0xef54, 0x9e9a, 0xc703,
1412 0x2803, 0xf760, 0x6302, 0xed5b, 0x7157, 0x6456, 0xdd7d, 0xf14b},
1413 {0xb6fb, 0xe3b3, 0x0733, 0xa77e, 0x44c5, 0x3003, 0xc937, 0xdd4d,
1414 0x5355, 0x14e9, 0x184e, 0xcefe, 0xe6b5, 0xf2e0, 0x0a28, 0x5b74}},
1415 /* example doing 336 (f,(f+g)/2) steps; 687 divsteps */
1416 {{0xa893, 0xb5f4, 0x1ede, 0xa316, 0x242c, 0xbdcc, 0xb017, 0x0836,
1417 0x3a37, 0x27fb, 0xfb85, 0x251e, 0xa189, 0xb15d, 0xa4b8, 0xc24c},
1418 {0xb0b7, 0x57ba, 0xbb6d, 0x9177, 0xc896, 0xc7f2, 0x43b4, 0x85a6,
1419 0xe6c4, 0xe50e, 0x3109, 0x7ca5, 0xd73d, 0x13ff, 0x0c3d, 0xcd62},
1420 {0x48ca, 0xdb34, 0xe347, 0x2cef, 0x4466, 0x10fb, 0x7ee1, 0x6344,
1421 0x4308, 0x966d, 0xd4d1, 0xb099, 0x994f, 0xd025, 0x2187, 0x5866}},
1422 /* example doing 267 (g,(g-f)/2) steps; 678 divsteps */
1423 {{0x0775, 0x1754, 0x01f6, 0xdf37, 0xc0be, 0x8197, 0x072f, 0x6cf5,
1424 0x8b36, 0x8069, 0x5590, 0xb92d, 0x6084, 0x47a4, 0x23fe, 0xddd5},
1425 {0x8e1b, 0xda37, 0x27d9, 0x312e, 0x3a2f, 0xef6d, 0xd9eb, 0x8153,
1426 0xdcba, 0x9fa3, 0x9f80, 0xead5, 0x134d, 0x2ebb, 0x5ec0, 0xe032},
1427 {0x1cb6, 0x5a61, 0x1bed, 0x77d6, 0xd5d1, 0x7498, 0xef33, 0x2dd2,
1428 0x1089, 0xedbd, 0x6958, 0x16ae, 0x336c, 0x45e6, 0x4361, 0xbadc}},
1429 /* example doing 267 (g,(g-f)/2) steps; 676 divsteps */
1430 {{0x0207, 0xf948, 0xc430, 0xf36b, 0xf0a7, 0x5d36, 0x751f, 0x132c,
1431 0x6f25, 0xa630, 0xca1f, 0xc967, 0xaf9c, 0x34e7, 0xa38f, 0xbe9f},
1432 {0x5fb9, 0x7321, 0x6561, 0x5fed, 0x54ec, 0x9c3a, 0xee0e, 0x6717,
1433 0x49af, 0xb896, 0xf4f5, 0x451c, 0x722a, 0xf116, 0x64a9, 0xcf0b},
1434 {0xf4d7, 0xdb47, 0xfef2, 0x4806, 0x4cb8, 0x18c7, 0xd9a7, 0x4951,
1435 0x14d8, 0x5c3a, 0xd22d, 0xd7b2, 0x750c, 0x3de7, 0x8b4a, 0x19aa}},
1436
1437 /* Test cases triggering edge cases in divsteps variant starting with delta=1/2 */
1438
1439 /* example needing 590 divsteps; delta=-5/2..7/2 */
1440 {{0x9118, 0xb640, 0x53d7, 0x30ab, 0x2a23, 0xd907, 0x9323, 0x5b3a,
1441 0xb6d4, 0x538a, 0x7637, 0xfe97, 0xfd05, 0x3cc0, 0x453a, 0xfb7e},
1442 {0x6983, 0x4f75, 0x4ad1, 0x48ad, 0xb2d9, 0x521d, 0x3dbc, 0x9cc0,
1443 0x4b60, 0x0ac6, 0xd3be, 0x0fb6, 0xd305, 0x3895, 0x2da5, 0xfdf8},
1444 {0xcec1, 0x33ac, 0xa801, 0x8194, 0xe36c, 0x65ef, 0x103b, 0xca54,
1445 0xfa9b, 0xb41d, 0x9b52, 0xb6f7, 0xa611, 0x84aa, 0x3493, 0xbf54}},
1446 /* example needing 590 divsteps; delta=-3/2..5/2 */
1447 {{0xb5f2, 0x42d0, 0x35e8, 0x8ca0, 0x4b62, 0x6e1d, 0xbdf3, 0x890e,
1448 0x8c82, 0x23d8, 0xc79a, 0xc8e8, 0x789e, 0x353d, 0x9766, 0xea9d},
1449 {0x6fa1, 0xacba, 0x4b7a, 0x5de1, 0x95d0, 0xc845, 0xebbf, 0x6f5a,
1450 0x30cf, 0x52db, 0x69b7, 0xe278, 0x4b15, 0x8411, 0x2ab2, 0xf3e7},
1451 {0xf12c, 0x9d6d, 0x95fa, 0x1878, 0x9f13, 0x4fb5, 0x3c8b, 0xa451,
1452 0x7182, 0xc4b6, 0x7e2a, 0x7bb7, 0x6e0e, 0x5b68, 0xde55, 0x9927}},
1453 /* example needing 590 divsteps; delta=-3/2..5/2 */
1454 {{0x229c, 0x4ef8, 0x1e93, 0xe5dc, 0xcde5, 0x6d62, 0x263b, 0xad11,
1455 0xced0, 0x88ff, 0xae8e, 0x3183, 0x11d2, 0xa50b, 0x350d, 0xeb40},
1456 {0x3157, 0xe2ea, 0x8a02, 0x0aa3, 0x5ae1, 0xb26c, 0xea27, 0x6805,
1457 0x87e2, 0x9461, 0x37c1, 0x2f8d, 0x85d2, 0x77a8, 0xf805, 0xeec9},
1458 {0x6f4e, 0x2748, 0xf7e5, 0xd8d3, 0xabe2, 0x7270, 0xc4e0, 0xedc7,
1459 0xf196, 0x78ca, 0x9139, 0xd8af, 0x72c6, 0xaf2f, 0x85d2, 0x6cd3}},
1460 /* example needing 590 divsteps; delta=-5/2..7/2 */
1461 {{0xdce8, 0xf1fe, 0x6708, 0x021e, 0xf1ca, 0xd609, 0x5443, 0x85ce,
1462 0x7a05, 0x8f9c, 0x90c3, 0x52e7, 0x8e1d, 0x97b8, 0xc0bf, 0xf2a1},
1463 {0xbd3d, 0xed11, 0x1625, 0xb4c5, 0x844c, 0xa413, 0x2569, 0xb9ba,
1464 0xcd35, 0xff84, 0xcd6e, 0x7f0b, 0x7d5d, 0x10df, 0x3efe, 0xfbe5},
1465 {0xa9dd, 0xafef, 0xb1b7, 0x4c8d, 0x50e4, 0xafbf, 0x2d5a, 0xb27c,
1466 0x0653, 0x66b6, 0x5d36, 0x4694, 0x7e35, 0xc47c, 0x857f, 0x32c5}},
1467 /* example needing 590 divsteps; delta=-3/2..5/2 */
1468 {{0x7902, 0xc9f8, 0x926b, 0xaaeb, 0x90f8, 0x1c89, 0xcce3, 0x96b7,
1469 0x28b2, 0x87a2, 0x136d, 0x695a, 0xa8df, 0x9061, 0x9e31, 0xee82},
1470 {0xd3a9, 0x3c02, 0x818c, 0x6b81, 0x34b3, 0xebbb, 0xe2c8, 0x7712,
1471 0xbfd6, 0x8248, 0xa6f4, 0xba6f, 0x03bb, 0xfb54, 0x7575, 0xfe89},
1472 {0x8246, 0x0d63, 0x478e, 0xf946, 0xf393, 0x0451, 0x08c2, 0x5919,
1473 0x5fd6, 0x4c61, 0xbeb7, 0x9a15, 0x30e1, 0x55fc, 0x6a01, 0x3724}},
1474 /* example reaching delta=-127/2..129/2; 571 divsteps */
1475 {{0x3eff, 0x926a, 0x77f5, 0x1fff, 0x1a5b, 0xf3ef, 0xf64b, 0x8681,
1476 0xf800, 0xf9bc, 0x761d, 0xe268, 0x62b0, 0xa032, 0xba9c, 0xbe56},
1477 {0xb8f9, 0x00e7, 0x47b7, 0xdffc, 0xfd9d, 0x5abb, 0xa19b, 0x1868,
1478 0x31fd, 0x3b29, 0x3674, 0x5449, 0xf54d, 0x1d19, 0x6ac7, 0xff6f},
1479 {0xf1d7, 0x3551, 0x5682, 0x9adf, 0xe8aa, 0x19a5, 0x8340, 0x71db,
1480 0xb7ab, 0x4cfd, 0xf661, 0x632c, 0xc27e, 0xd3c6, 0xdf42, 0xd306}},
1481 /* example reaching delta=-127/2..129/2; 571 divsteps */
1482 {{0x0000, 0x0000, 0x0000, 0x0000, 0x3aff, 0x2ed7, 0xf2e0, 0xabc7,
1483 0x8aee, 0x166e, 0x7ed0, 0x9ac7, 0x714a, 0xb9c5, 0x4d58, 0xad6c},
1484 {0x9cf9, 0x47e2, 0xa421, 0xb277, 0xffc2, 0x2747, 0x6486, 0x94c1,
1485 0x1d99, 0xd49b, 0x1096, 0x991a, 0xe986, 0xae02, 0xe89b, 0xea36},
1486 {0x1fb4, 0x98d8, 0x19b7, 0x80e9, 0xcdac, 0xaa5a, 0xf1e6, 0x0074,
1487 0xe393, 0xed8b, 0x8d5c, 0xe17d, 0x81b3, 0xc16d, 0x54d3, 0x9be3}},
1488 /* example reaching delta=-127/2..129/2; 571 divsteps */
1489 {{0xd047, 0x7e36, 0x3157, 0x7ab6, 0xb4d9, 0x8dae, 0x7534, 0x4f5d,
1490 0x489e, 0xa8ab, 0x8a3d, 0xd52c, 0x62af, 0xa032, 0xba9c, 0xbe56},
1491 {0xb1f1, 0x737f, 0x5964, 0x5afb, 0x3712, 0x8ef9, 0x19f7, 0x9669,
1492 0x664d, 0x03ad, 0xc352, 0xf7a5, 0xf545, 0x1d19, 0x6ac7, 0xff6f},
1493 {0xa834, 0x5256, 0x27bc, 0x33bd, 0xba11, 0x5a7b, 0x791e, 0xe6c0,
1494 0x9ac4, 0x9370, 0x1130, 0x28b4, 0x2b2e, 0x231b, 0x082a, 0x796e}},
1495 /* example doing 123 consecutive (f,g/2) steps; 554 divsteps */
1496 {{0x6ab1, 0x6ea0, 0x1a99, 0xe0c2, 0xdd45, 0x645d, 0x8dbc, 0x466a,
1497 0xfa64, 0x4289, 0xd3f7, 0xfc8f, 0x2894, 0xe3c5, 0xa008, 0xcc14},
1498 {0xc75f, 0xc083, 0x4cc2, 0x64f2, 0x2aff, 0x4c12, 0x8461, 0xc4ae,
1499 0xbbfa, 0xb336, 0xe4b2, 0x3ac5, 0x2c22, 0xf56c, 0x5381, 0xe943},
1500 {0xcd80, 0x760d, 0x4395, 0xb3a6, 0xd497, 0xf583, 0x82bd, 0x1daa,
1501 0xbe92, 0x2613, 0xfdfb, 0x869b, 0x0425, 0xa333, 0x7056, 0xc9c5}},
1502 /* example doing 123 consecutive (f,g/2) steps; 554 divsteps */
1503 {{0x71d4, 0x64df, 0xec4f, 0x74d8, 0x7e0c, 0x40d3, 0x7073, 0x4cc8,
1504 0x2a2a, 0xb1ff, 0x8518, 0x6513, 0xb0ea, 0x640a, 0x62d9, 0xd5f4},
1505 {0xdc75, 0xd937, 0x3b13, 0x1d36, 0xdf83, 0xd034, 0x1c1c, 0x4332,
1506 0x4cc3, 0xeeec, 0x7d94, 0x6771, 0x3384, 0x74b0, 0x947d, 0xf2c4},
1507 {0x0a82, 0x37a4, 0x12d5, 0xec97, 0x972c, 0xe6bf, 0xc348, 0xa0a9,
1508 0xc50c, 0xdc7c, 0xae30, 0x19d1, 0x0fca, 0x35e1, 0xd6f6, 0x81ee}},
1509 /* example doing 123 consecutive (f,g/2) steps; 554 divsteps */
1510 {{0xa6b1, 0xabc5, 0x5bbc, 0x7f65, 0xdd32, 0xaa73, 0xf5a3, 0x1982,
1511 0xced4, 0xe949, 0x0fd6, 0x2bc4, 0x2bd7, 0xe3c5, 0xa008, 0xcc14},
1512 {0x4b5f, 0x8f96, 0xa375, 0xfbcf, 0x1c7d, 0xf1ec, 0x03f5, 0xb35d,
1513 0xb999, 0xdb1f, 0xc9a1, 0xb4c7, 0x1dd5, 0xf56c, 0x5381, 0xe943},
1514 {0xaa3d, 0x38b9, 0xf17d, 0xeed9, 0x9988, 0x69ee, 0xeb88, 0x1495,
1515 0x203f, 0x18c8, 0x82b7, 0xdcb2, 0x34a7, 0x6b00, 0x6998, 0x589a}},
1516 /* example doing 453 (f,g/2) steps; 514 divsteps */
1517 {{0xa478, 0xe60d, 0x3244, 0x60e6, 0xada3, 0xfe50, 0xb6b1, 0x2eae,
1518 0xd0ef, 0xa7b1, 0xef63, 0x05c0, 0xe213, 0x443e, 0x4427, 0x2448},
1519 {0x258f, 0xf9ef, 0xe02b, 0x92dd, 0xd7f3, 0x252b, 0xa503, 0x9089,
1520 0xedff, 0x96c1, 0xfe3a, 0x3a39, 0x198a, 0x981d, 0x0627, 0xedb7},
1521 {0x595a, 0x45be, 0x8fb0, 0x2265, 0xc210, 0x02b8, 0xdce9, 0xe241,
1522 0xcab6, 0xbf0d, 0x0049, 0x8d9a, 0x2f51, 0xae54, 0x5785, 0xb411}},
1523 /* example doing 453 (f,g/2) steps; 514 divsteps */
1524 {{0x48f0, 0x7db3, 0xdafe, 0x1c92, 0x5912, 0xe11a, 0xab52, 0xede1,
1525 0x3182, 0x8980, 0x5d2b, 0x9b5b, 0x8718, 0xda27, 0x1683, 0x1de2},
1526 {0x168f, 0x6f36, 0xce7a, 0xf435, 0x19d4, 0xda5e, 0x2351, 0x9af5,
1527 0xb003, 0x0ef5, 0x3b4c, 0xecec, 0xa9f0, 0x78e1, 0xdfef, 0xe823},
1528 {0x5f55, 0xfdcc, 0xb233, 0x2914, 0x84f0, 0x97d1, 0x9cf4, 0x2159,
1529 0xbf56, 0xb79c, 0x17a3, 0x7cef, 0xd5de, 0x34f0, 0x5311, 0x4c54}},
1530 /* example doing 510 (f,(f+g)/2) steps; 512 divsteps */
1531 {{0x2789, 0x2e04, 0x6e0e, 0xb6cd, 0xe4de, 0x4dbf, 0x228d, 0x7877,
1532 0xc335, 0x806b, 0x38cd, 0x8049, 0xa73b, 0xcfa2, 0x82f7, 0x9e19},
1533 {0xc08d, 0xb99d, 0xb8f3, 0x663d, 0xbbb3, 0x1284, 0x1485, 0x1d49,
1534 0xc98f, 0x9e78, 0x1588, 0x11e3, 0xd91a, 0xa2c7, 0xfff1, 0xc7b9},
1535 {0x1e1f, 0x411d, 0x7c49, 0x0d03, 0xe789, 0x2f8e, 0x5d55, 0xa95e,
1536 0x826e, 0x8de5, 0x52a0, 0x1abc, 0x4cd7, 0xd13a, 0x4395, 0x63e1}},
1537 /* example doing 510 (f,(f+g)/2) steps; 512 divsteps */
1538 {{0xd5a1, 0xf786, 0x555c, 0xb14b, 0x44ae, 0x535f, 0x4a49, 0xffc3,
1539 0xf497, 0x70d1, 0x57c8, 0xa933, 0xc85a, 0x1910, 0x75bf, 0x960b},
1540 {0xfe53, 0x5058, 0x496d, 0xfdff, 0x6fb8, 0x4100, 0x92bd, 0xe0c4,
1541 0xda89, 0xe0a4, 0x841b, 0x43d4, 0xa388, 0x957f, 0x99ca, 0x9abf},
1542 {0xe530, 0x05bc, 0xfeec, 0xfc7e, 0xbcd3, 0x1239, 0x54cb, 0x7042,
1543 0xbccb, 0x139e, 0x9076, 0x0203, 0x6068, 0x90c7, 0x1ddf, 0x488d}},
1544 /* example doing 228 (g,(g-f)/2) steps; 538 divsteps */
1545 {{0x9488, 0xe54b, 0x0e43, 0x81d2, 0x06e7, 0x4b66, 0x36d0, 0x53d6,
1546 0x2b68, 0x22ec, 0x3fa9, 0xc1a7, 0x9ad2, 0xa596, 0xb3ac, 0xdf42},
1547 {0xe31f, 0x0b28, 0x5f3b, 0xc1ff, 0x344c, 0xbf5f, 0xd2ec, 0x2936,
1548 0x9995, 0xdeb2, 0xae6c, 0x2852, 0xa2c6, 0xb306, 0x8120, 0xe305},
1549 {0xa56e, 0xfb98, 0x1537, 0x4d85, 0x619e, 0x866c, 0x3cd4, 0x779a,
1550 0xdd66, 0xa80d, 0xdc2f, 0xcae4, 0xc74c, 0x5175, 0xa65d, 0x605e}},
1551 /* example doing 228 (g,(g-f)/2) steps; 537 divsteps */
1552 {{0x8cd5, 0x376d, 0xd01b, 0x7176, 0x19ef, 0xcf09, 0x8403, 0x5e52,
1553 0x83c1, 0x44de, 0xb91e, 0xb33d, 0xe15c, 0x51e7, 0xbad8, 0x6359},
1554 {0x3b75, 0xf812, 0x5f9e, 0xa04e, 0x92d3, 0x226e, 0x540e, 0x7c9a,
1555 0x31c6, 0x46d2, 0x0b7b, 0xdb4a, 0xe662, 0x4950, 0x0265, 0xf76f},
1556 {0x09ed, 0x692f, 0xe8f1, 0x3482, 0xab54, 0x36b4, 0x8442, 0x6ae9,
1557 0x4329, 0x6505, 0x183b, 0x1c1d, 0x482d, 0x7d63, 0xb44f, 0xcc09}},
1558
1559 /* Test cases with the group order as modulus. */
1560
1561 /* Test case with the group order as modulus, needing 635 divsteps. */
1562 {{0x95ed, 0x6c01, 0xd113, 0x5ff1, 0xd7d0, 0x29cc, 0x5817, 0x6120,
1563 0xca8e, 0xaad1, 0x25ae, 0x8e84, 0x9af6, 0x30bf, 0xf0ed, 0x1686},
1564 {0x4141, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1565 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1566 {0x1631, 0xbf4a, 0x286a, 0x2716, 0x469f, 0x2ac8, 0x1312, 0xe9bc,
1567 0x04f4, 0x304b, 0x9931, 0x113b, 0xd932, 0xc8f4, 0x0d0d, 0x01a1}},
1568 /* example with group size as modulus needing 631 divsteps */
1569 {{0x85ed, 0xc284, 0x9608, 0x3c56, 0x19b6, 0xbb5b, 0x2850, 0xdab7,
1570 0xa7f5, 0xe9ab, 0x06a4, 0x5bbb, 0x1135, 0xa186, 0xc424, 0xc68b},
1571 {0x4141, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1572 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1573 {0x8479, 0x450a, 0x8fa3, 0xde05, 0xb2f5, 0x7793, 0x7269, 0xbabb,
1574 0xc3b3, 0xd49b, 0x3377, 0x03c6, 0xe694, 0xc760, 0xd3cb, 0x2811}},
1575 /* example with group size as modulus needing 565 divsteps starting at delta=1/2 */
1576 {{0x8432, 0x5ceb, 0xa847, 0x6f1e, 0x51dd, 0x535a, 0x6ddc, 0x70ce,
1577 0x6e70, 0xc1f6, 0x18f2, 0x2a7e, 0xc8e7, 0x39f8, 0x7e96, 0xebbf},
1578 {0x4141, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1579 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1580 {0x257e, 0x449f, 0x689f, 0x89aa, 0x3989, 0xb661, 0x376c, 0x1e32,
1581 0x654c, 0xee2e, 0xf4e2, 0x33c8, 0x3f2f, 0x9716, 0x6046, 0xcaa3}},
1582 /* Test case with the group size as modulus, needing 981 divsteps with
1583 broken eta handling. */
1584 {{0xfeb9, 0xb877, 0xee41, 0x7fa3, 0x87da, 0x94c4, 0x9d04, 0xc5ae,
1585 0x5708, 0x0994, 0xfc79, 0x0916, 0xbf32, 0x3ad8, 0xe11c, 0x5ca2},
1586 {0x4141, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1587 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1588 {0x0f12, 0x075e, 0xce1c, 0x6f92, 0xc80f, 0xca92, 0x9a04, 0x6126,
1589 0x4b6c, 0x57d6, 0xca31, 0x97f3, 0x1f99, 0xf4fd, 0xda4d, 0x42ce}},
1590 /* Test case with the group size as modulus, input = 0. */
1591 {{0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1592 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
1593 {0x4141, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1594 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1595 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1596 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
1597 /* Test case with the group size as modulus, input = 1. */
1598 {{0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1599 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
1600 {0x4141, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1601 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1602 {0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1603 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
1604 /* Test case with the group size as modulus, input = 2. */
1605 {{0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1606 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
1607 {0x4141, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1608 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1609 {0x20a1, 0x681b, 0x2f46, 0xdfe9, 0x501d, 0x57a4, 0x6e73, 0x5d57,
1610 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x7fff}},
1611 /* Test case with the group size as modulus, input = group - 1. */
1612 {{0x4140, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1613 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1614 {0x4141, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1615 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1616 {0x4140, 0xd036, 0x5e8c, 0xbfd2, 0xa03b, 0xaf48, 0xdce6, 0xbaae,
1617 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}},
1618
1619 /* Test cases with the field size as modulus. */
1620
1621 /* Test case with the field size as modulus, needing 637 divsteps. */
1622 {{0x9ec3, 0x1919, 0xca84, 0x7c11, 0xf996, 0x06f3, 0x5408, 0x6688,
1623 0x1320, 0xdb8a, 0x632a, 0x0dcb, 0x8a84, 0x6bee, 0x9c95, 0xe34e},
1624 {0xfc2f, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1625 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1626 {0x18e5, 0x19b6, 0xdf92, 0x1aaa, 0x09fb, 0x8a3f, 0x52b0, 0x8701,
1627 0xac0c, 0x2582, 0xda44, 0x9bcc, 0x6828, 0x1c53, 0xbd8f, 0xbd2c}},
1628 /* example with field size as modulus needing 637 divsteps */
1629 {{0xaec3, 0xa7cf, 0x2f2d, 0x0693, 0x5ad5, 0xa8ff, 0x7ec7, 0x30ff,
1630 0x0c8b, 0xc242, 0xcab2, 0x063a, 0xf86e, 0x6057, 0x9cbd, 0xf6d8},
1631 {0xfc2f, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1632 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1633 {0x0310, 0x579d, 0xcb38, 0x9030, 0x3ded, 0x9bb9, 0x1234, 0x63ce,
1634 0x0c63, 0x8e3d, 0xacfe, 0x3c20, 0xdc85, 0xf859, 0x919e, 0x1d45}},
1635 /* example with field size as modulus needing 564 divsteps starting at delta=1/2 */
1636 {{0x63ae, 0x8d10, 0x0071, 0xdb5c, 0xb454, 0x78d1, 0x744a, 0x5f8e,
1637 0xe4d8, 0x87b1, 0x8e62, 0x9590, 0xcede, 0xa070, 0x36b4, 0x7f6f},
1638 {0xfc2f, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1639 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1640 {0xfdc8, 0xe8d5, 0xbe15, 0x9f86, 0xa5fe, 0xf18e, 0xa7ff, 0xd291,
1641 0xf4c2, 0x9c87, 0xf150, 0x073e, 0x69b8, 0xf7c4, 0xee4b, 0xc7e6}},
1642 /* Test case with the field size as modulus, needing 935 divsteps with
1643 broken eta handling. */
1644 {{0x1b37, 0xbdc3, 0x8bcd, 0x25e3, 0x1eae, 0x567d, 0x30b6, 0xf0d8,
1645 0x9277, 0x0cf8, 0x9c2e, 0xecd7, 0x631d, 0xe38f, 0xd4f8, 0x5c93},
1646 {0xfc2f, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1647 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1648 {0x1622, 0xe05b, 0xe880, 0x7de9, 0x3e45, 0xb682, 0xee6c, 0x67ed,
1649 0xa179, 0x15db, 0x6b0d, 0xa656, 0x7ccb, 0x8ef7, 0xa2ff, 0xe279}},
1650 /* Test case with the field size as modulus, input = 0. */
1651 {{0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1652 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
1653 {0xfc2f, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1654 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1655 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1656 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
1657 /* Test case with the field size as modulus, input = 1. */
1658 {{0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1659 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
1660 {0xfc2f, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1661 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1662 {0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1663 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
1664 /* Test case with the field size as modulus, input = 2. */
1665 {{0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1666 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
1667 {0xfc2f, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1668 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1669 {0xfe18, 0x7fff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1670 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x7fff}},
1671 /* Test case with the field size as modulus, input = field - 1. */
1672 {{0xfc2e, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1673 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1674 {0xfc2f, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1675 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff},
1676 {0xfc2e, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
1677 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}},
1678
1679 /* Selected from a large number of random inputs to reach small/large
1680 * d/e values in various configurations. */
1681 {{0x3a08, 0x23e1, 0x4d8c, 0xe606, 0x3263, 0x67af, 0x9bf1, 0x9d70,
1682 0xf5fd, 0x12e4, 0x03c8, 0xb9ca, 0xe847, 0x8c5d, 0x6322, 0xbd30},
1683 {0x8359, 0x59dd, 0x1831, 0x7c1a, 0x1e83, 0xaee1, 0x770d, 0xcea8,
1684 0xfbb1, 0xeed6, 0x10b5, 0xe2c6, 0x36ea, 0xee17, 0xe32c, 0xffff},
1685 {0x1727, 0x0f36, 0x6f85, 0x5d0c, 0xca6c, 0x3072, 0x9628, 0x5842,
1686 0xcb44, 0x7c2b, 0xca4f, 0x62e5, 0x29b1, 0x6ffd, 0x9055, 0xc196}},
1687 {{0x905d, 0x41c8, 0xa2ff, 0x295b, 0x72bb, 0x4679, 0x6d01, 0x2c98,
1688 0xb3e0, 0xc537, 0xa310, 0xe07e, 0xe72f, 0x4999, 0x1148, 0xf65e},
1689 {0x5b41, 0x4239, 0x3c37, 0x5130, 0x30e3, 0xff35, 0xc51f, 0x1a43,
1690 0xdb23, 0x13cf, 0x9f49, 0xf70c, 0x5e70, 0xd411, 0x3005, 0xf8c6},
1691 {0xc30e, 0x68f0, 0x201a, 0xe10c, 0x864a, 0x6243, 0xe946, 0x43ae,
1692 0xf3f1, 0x52dc, 0x1f7f, 0x50d4, 0x2797, 0x064c, 0x5ca4, 0x90e3}},
1693 {{0xf1b5, 0xc6e5, 0xd2c4, 0xff95, 0x27c5, 0x0c92, 0x5d19, 0x7ae5,
1694 0x4fbe, 0x5438, 0x99e1, 0x880d, 0xd892, 0xa05c, 0x6ffd, 0x7eac},
1695 {0x2153, 0xcc9d, 0xfc6c, 0x8358, 0x49a1, 0x01e2, 0xcef0, 0x4969,
1696 0xd69a, 0x8cef, 0xf5b2, 0xfd95, 0xdcc2, 0x71f4, 0x6ae2, 0xceeb},
1697 {0x9b2e, 0xcdc6, 0x0a5c, 0x7317, 0x9084, 0xe228, 0x56cf, 0xd512,
1698 0x628a, 0xce21, 0x3473, 0x4e13, 0x8823, 0x1ed0, 0x34d0, 0xbfa3}},
1699 {{0x5bae, 0x53e5, 0x5f4d, 0x21ca, 0xb875, 0x8ecf, 0x9aa6, 0xbe3c,
1700 0x9f96, 0x7b82, 0x375d, 0x4d3e, 0x491c, 0xb1eb, 0x04c9, 0xb6c8},
1701 {0xfcfd, 0x10b7, 0x73b2, 0xd23b, 0xa357, 0x67da, 0x0d9f, 0x8702,
1702 0xa037, 0xff8e, 0x0e8b, 0x1801, 0x2c5c, 0x4e6e, 0x4558, 0xfff2},
1703 {0xc50f, 0x5654, 0x6713, 0x5ef5, 0xa7ce, 0xa647, 0xc832, 0x69ce,
1704 0x1d5c, 0x4310, 0x0746, 0x5a01, 0x96ea, 0xde4b, 0xa88b, 0x5543}},
1705 {{0xdc7f, 0x5e8c, 0x89d1, 0xb077, 0xd521, 0xcf90, 0x32fa, 0x5737,
1706 0x839e, 0x1464, 0x007c, 0x09c6, 0x9371, 0xe8ea, 0xc1cb, 0x75c4},
1707 {0xe3a3, 0x107f, 0xa82a, 0xa375, 0x4578, 0x60f4, 0x75c9, 0x5ee4,
1708 0x3fd7, 0x2736, 0x2871, 0xd3d2, 0x5f1d, 0x1abb, 0xa764, 0xffff},
1709 {0x45c6, 0x1f2e, 0xb14c, 0x84d7, 0x7bb7, 0x5a04, 0x0504, 0x3f33,
1710 0x5cc1, 0xb07a, 0x6a6c, 0x786f, 0x647f, 0xe1d7, 0x78a2, 0x4cf4}},
1711 {{0xc006, 0x356f, 0x8cd2, 0x967b, 0xb49e, 0x2d4e, 0x14bf, 0x4bcb,
1712 0xddab, 0xd3f9, 0xa068, 0x2c1c, 0xd242, 0xa56d, 0xf2c7, 0x5f97},
1713 {0x465b, 0xb745, 0x0e0d, 0x69a9, 0x987d, 0xcb37, 0xf637, 0xb311,
1714 0xc4d6, 0x2ddb, 0xf68f, 0x2af9, 0x959d, 0x3f53, 0x98f2, 0xf640},
1715 {0xc0f2, 0x6bfb, 0xf5c3, 0x91c1, 0x6b05, 0x0825, 0x5ca0, 0x7df7,
1716 0x9d55, 0x6d9e, 0xfe94, 0x2ad9, 0xd9f0, 0xe68b, 0xa72b, 0xd1b2}},
1717 {{0x2279, 0x61ba, 0x5bc6, 0x136b, 0xf544, 0x717c, 0xafda, 0x02bd,
1718 0x79af, 0x1fad, 0xea09, 0x81bb, 0x932b, 0x32c9, 0xdf1d, 0xe576},
1719 {0x8215, 0x7817, 0xca82, 0x43b0, 0x9b06, 0xea65, 0x1291, 0x0621,
1720 0x0089, 0x46fe, 0xc5a6, 0xddd7, 0x8065, 0xc6a0, 0x214b, 0xfc64},
1721 {0x04bf, 0x6f2a, 0x86b2, 0x841a, 0x4a95, 0xc632, 0x97b7, 0x5821,
1722 0x2b18, 0x1bb0, 0x3e97, 0x935e, 0xcc7d, 0x066b, 0xd513, 0xc251}},
1723 {{0x76e8, 0x5bc2, 0x3eaa, 0x04fc, 0x9974, 0x92c1, 0x7c15, 0xfa89,
1724 0x1151, 0x36ee, 0x48b2, 0x049c, 0x5f16, 0xcee4, 0x925b, 0xe98e},
1725 {0x913f, 0x0a2d, 0xa185, 0x9fea, 0xda5a, 0x4025, 0x40d7, 0x7cfa,
1726 0x88ca, 0xbbe8, 0xb265, 0xb7e4, 0x6cb1, 0xed64, 0xc6f9, 0xffb5},
1727 {0x6ab1, 0x1a86, 0x5009, 0x152b, 0x1cc4, 0xe2c8, 0x960b, 0x19d0,
1728 0x3554, 0xc562, 0xd013, 0xcf91, 0x10e1, 0x7933, 0xe195, 0xcf49}},
1729 {{0x9cb5, 0xd2d7, 0xc6ed, 0xa818, 0xb495, 0x06ee, 0x0f4a, 0x06e3,
1730 0x4c5a, 0x80ce, 0xd49a, 0x4cd7, 0x7487, 0x92af, 0xe516, 0x676c},
1731 {0xd6e9, 0x6b85, 0x619a, 0xb52c, 0x20a0, 0x2f79, 0x3545, 0x1edd,
1732 0x5a6f, 0x8082, 0x9b80, 0xf8f8, 0xc78a, 0xd0a3, 0xadf4, 0xffff},
1733 {0x01c2, 0x2118, 0xef5e, 0xa877, 0x046a, 0xd2c2, 0x2ad5, 0x951c,
1734 0x8900, 0xa5c9, 0x8d0f, 0x6b61, 0x55d3, 0xd572, 0x48de, 0x9219}},
1735 {{0x5114, 0x0644, 0x23dd, 0x01d3, 0xc101, 0xa659, 0xea17, 0x640f,
1736 0xf767, 0x2644, 0x9cec, 0xd8ba, 0xd6da, 0x9156, 0x8aeb, 0x875a},
1737 {0xc1bf, 0xdae9, 0xe96b, 0xce77, 0xf7a1, 0x3e99, 0x5c2e, 0x973b,
1738 0xd048, 0x5bd0, 0x4e8a, 0xcb85, 0xce39, 0x37f5, 0x815d, 0xffff},
1739 {0x48cc, 0x35b6, 0x26d4, 0x2ea6, 0x50d6, 0xa2f9, 0x64b6, 0x03bf,
1740 0xd00c, 0xe057, 0x3343, 0xfb79, 0x3ce5, 0xf717, 0xc5af, 0xe185}},
1741 {{0x13ff, 0x6c76, 0x2077, 0x16e0, 0xd5ca, 0xf2ad, 0x8dba, 0x8f49,
1742 0x7887, 0x16f9, 0xb646, 0xfc87, 0xfa31, 0x5096, 0xf08c, 0x3fbe},
1743 {0x8139, 0x6fd7, 0xf6df, 0xa7bf, 0x6699, 0x5361, 0x6f65, 0x13c8,
1744 0xf4d1, 0xe28f, 0xc545, 0x0a8c, 0x5274, 0xb0a6, 0xffff, 0xffff},
1745 {0x22ca, 0x0cd6, 0xc1b5, 0xb064, 0x44a7, 0x297b, 0x495f, 0x34ac,
1746 0xfa95, 0xec62, 0xf08d, 0x621c, 0x66a6, 0xba94, 0x84c6, 0x8ee0}},
1747 {{0xaa30, 0x312e, 0x439c, 0x4e88, 0x2e2f, 0x32dc, 0xb880, 0xa28e,
1748 0xf795, 0xc910, 0xb406, 0x8dd7, 0xb187, 0xa5a5, 0x38f1, 0xe49e},
1749 {0xfb19, 0xf64a, 0xba6a, 0x8ec2, 0x7255, 0xce89, 0x2cf9, 0x9cba,
1750 0xe1fe, 0x50da, 0x1705, 0xac52, 0xe3d4, 0x4269, 0x0648, 0xfd77},
1751 {0xb4c8, 0x6e8a, 0x2b5f, 0x4c2d, 0x5a67, 0xa7bb, 0x7d6d, 0x5569,
1752 0xa0ea, 0x244a, 0xc0f2, 0xf73d, 0x58cf, 0xac7f, 0xd32b, 0x3018}},
1753 {{0xc953, 0x1ae1, 0xae46, 0x8709, 0x19c2, 0xa986, 0x9abe, 0x1611,
1754 0x0395, 0xd5ab, 0xf0f6, 0xb5b0, 0x5b2b, 0x0317, 0x80ba, 0x376d},
1755 {0xfe77, 0xbc03, 0xac2f, 0x9d00, 0xa175, 0x293d, 0x3b56, 0x0e3a,
1756 0x0a9c, 0xf40c, 0x690e, 0x1508, 0x95d4, 0xddc4, 0xe805, 0xffff},
1757 {0xb1ce, 0x0929, 0xa5fe, 0x4b50, 0x9d5d, 0x8187, 0x2557, 0x4376,
1758 0x11ba, 0xdcef, 0xc1f3, 0xd531, 0x1824, 0x93f6, 0xd81f, 0x8f83}},
1759 {{0xb8d2, 0xb900, 0x4a0c, 0x7188, 0xa5bf, 0x1b0b, 0x2ae5, 0xa35b,
1760 0x98e0, 0x610c, 0x86db, 0x2487, 0xa267, 0x002c, 0xebb6, 0xc5f4},
1761 {0x9cdd, 0x1c1b, 0x2f06, 0x43d1, 0xce47, 0xc334, 0x6e60, 0xc016,
1762 0x989e, 0x0ab2, 0x0cac, 0x1196, 0xe2d9, 0x2e04, 0xc62b, 0xffff},
1763 {0xdc36, 0x1f05, 0x6aa9, 0x7a20, 0x944f, 0x2fd3, 0xa553, 0xdb4f,
1764 0xbd5c, 0x3a75, 0x25d4, 0xe20e, 0xa387, 0x1410, 0xdbb1, 0x1b60}},
1765 {{0x76b3, 0x2207, 0x4930, 0x5dd7, 0x65a0, 0xd55c, 0xb443, 0x53b7,
1766 0x5c22, 0x818a, 0xb2e7, 0x9de8, 0x9985, 0xed45, 0x33b1, 0x53e8},
1767 {0x7913, 0x44e1, 0xf15b, 0x5edd, 0x34f3, 0x4eba, 0x0758, 0x7104,
1768 0x32d9, 0x28f3, 0x4401, 0x85c5, 0xb695, 0xb899, 0xc0f2, 0xffff},
1769 {0x7f43, 0xd202, 0x24c9, 0x69f3, 0x74dc, 0x1a69, 0xeaee, 0x5405,
1770 0x1755, 0x4bb8, 0x04e3, 0x2fd2, 0xada8, 0x39eb, 0x5b4d, 0x96ca}},
1771 {{0x807b, 0x7112, 0xc088, 0xdafd, 0x02fa, 0x9d95, 0x5e42, 0xc033,
1772 0xde0a, 0xeecf, 0x8e90, 0x8da1, 0xb17e, 0x9a5b, 0x4c6d, 0x1914},
1773 {0x4871, 0xd1cb, 0x47d7, 0x327f, 0x09ec, 0x97bb, 0x2fae, 0xd346,
1774 0x6b78, 0x3707, 0xfeb2, 0xa6ab, 0x13df, 0x76b0, 0x8fb9, 0xffb3},
1775 {0x179e, 0xb63b, 0x4784, 0x231e, 0x9f42, 0x7f1a, 0xa3fb, 0xdd8c,
1776 0xd1eb, 0xb4c9, 0x8ca7, 0x018c, 0xf691, 0x576c, 0xa7d6, 0xce27}},
1777 {{0x5f45, 0x7c64, 0x083d, 0xedd5, 0x08a0, 0x0c64, 0x6c6f, 0xec3c,
1778 0xe2fb, 0x352c, 0x9303, 0x75e4, 0xb4e0, 0x8b09, 0xaca4, 0x7025},
1779 {0x1025, 0xb482, 0xfed5, 0xa678, 0x8966, 0x9359, 0x5329, 0x98bb,
1780 0x85b2, 0x73ba, 0x9982, 0x6fdc, 0xf190, 0xbe8c, 0xdc5c, 0xfd93},
1781 {0x83a2, 0x87a4, 0xa680, 0x52a1, 0x1ba1, 0x8848, 0x5db7, 0x9744,
1782 0x409c, 0x0745, 0x0e1e, 0x1cfc, 0x00cd, 0xf573, 0x2071, 0xccaa}},
1783 {{0xf61f, 0x63d4, 0x536c, 0x9eb9, 0x5ddd, 0xbb11, 0x9014, 0xe904,
1784 0xfe01, 0x6b45, 0x1858, 0xcb5b, 0x4c38, 0x43e1, 0x381d, 0x7f94},
1785 {0xf61f, 0x63d4, 0xd810, 0x7ca3, 0x8a04, 0x4b83, 0x11fc, 0xdf94,
1786 0x4169, 0xbd05, 0x608e, 0x7151, 0x4fbf, 0xb31a, 0x38a7, 0xa29b},
1787 {0xe621, 0xdfa5, 0x3d06, 0x1d03, 0x81e6, 0x00da, 0x53a6, 0x965e,
1788 0x93e5, 0x2164, 0x5b61, 0x59b8, 0xa629, 0x8d73, 0x699a, 0x6111}},
1789 {{0x4cc3, 0xd29e, 0xf4a3, 0x3428, 0x2048, 0xeec9, 0x5f50, 0x99a4,
1790 0x6de9, 0x05f2, 0x5aa9, 0x5fd2, 0x98b4, 0x1adc, 0x225f, 0x777f},
1791 {0xe649, 0x37da, 0x5ba6, 0x5765, 0x3f4a, 0x8a1c, 0x2e79, 0xf550,
1792 0x1a54, 0xcd1e, 0x7218, 0x3c3c, 0x6311, 0xfe28, 0x95fb, 0xed97},
1793 {0xe9b6, 0x0c47, 0x3f0e, 0x849b, 0x11f8, 0xe599, 0x5e4d, 0xd618,
1794 0xa06d, 0x33a0, 0x9a3e, 0x44db, 0xded8, 0x10f0, 0x94d2, 0x81fb}},
1795 {{0x2e59, 0x7025, 0xd413, 0x455a, 0x1ce3, 0xbd45, 0x7263, 0x27f7,
1796 0x23e3, 0x518e, 0xbe06, 0xc8c4, 0xe332, 0x4276, 0x68b4, 0xb166},
1797 {0x596f, 0x0cf6, 0xc8ec, 0x787b, 0x04c1, 0x473c, 0xd2b8, 0x8d54,
1798 0x9cdf, 0x77f2, 0xd3f3, 0x6735, 0x0638, 0xf80e, 0x9467, 0xc6aa},
1799 {0xc7e7, 0x1822, 0xb62a, 0xec0d, 0x89cd, 0x7846, 0xbfa2, 0x35d5,
1800 0xfa38, 0x870f, 0x494b, 0x1697, 0x8b17, 0xf904, 0x10b6, 0x9822}},
1801 {{0x6d5b, 0x1d4f, 0x0aaf, 0x807b, 0x35fb, 0x7ee8, 0x00c6, 0x059a,
1802 0xddf0, 0x1fb1, 0xc38a, 0xd78e, 0x2aa4, 0x79e7, 0xad28, 0xc3f1},
1803 {0xe3bb, 0x174e, 0xe0a8, 0x74b6, 0xbd5b, 0x35f6, 0x6d23, 0x6328,
1804 0xc11f, 0x83e1, 0xf928, 0xa918, 0x838e, 0xbf43, 0xe243, 0xfffb},
1805 {0x9cf2, 0x6b8b, 0x3476, 0x9d06, 0xdcf2, 0xdb8a, 0x89cd, 0x4857,
1806 0x75c2, 0xabb8, 0x490b, 0xc9bd, 0x890e, 0xe36e, 0xd552, 0xfffa}},
1807 {{0x2f09, 0x9d62, 0xa9fc, 0xf090, 0xd6d1, 0x9d1d, 0x1828, 0xe413,
1808 0xc92b, 0x3d5a, 0x1373, 0x368c, 0xbaf2, 0x2158, 0x71eb, 0x08a3},
1809 {0x2f09, 0x1d62, 0x4630, 0x0de1, 0x06dc, 0xf7f1, 0xc161, 0x1e92,
1810 0x7495, 0x97e4, 0x94b6, 0xa39e, 0x4f1b, 0x18f8, 0x7bd4, 0x0c4c},
1811 {0xeb3d, 0x723d, 0x0907, 0x525b, 0x463a, 0x49a8, 0xc6b8, 0xce7f,
1812 0x740c, 0x0d7d, 0xa83b, 0x457f, 0xae8e, 0xc6af, 0xd331, 0x0475}},
1813 {{0x6abd, 0xc7af, 0x3e4e, 0x95fd, 0x8fc4, 0xee25, 0x1f9c, 0x0afe,
1814 0x291d, 0xcde0, 0x48f4, 0xb2e8, 0xf7af, 0x8f8d, 0x0bd6, 0x078d},
1815 {0x4037, 0xbf0e, 0x2081, 0xf363, 0x13b2, 0x381e, 0xfb6e, 0x818e,
1816 0x27e4, 0x5662, 0x18b0, 0x0cd2, 0x81f5, 0x9415, 0x0d6c, 0xf9fb},
1817 {0xd205, 0x0981, 0x0498, 0x1f08, 0xdb93, 0x1732, 0x0579, 0x1424,
1818 0xad95, 0x642f, 0x050c, 0x1d6d, 0xfc95, 0xfc4a, 0xd41b, 0x3521}},
1819 {{0xf23a, 0x4633, 0xaef4, 0x1a92, 0x3c8b, 0x1f09, 0x30f3, 0x4c56,
1820 0x2a2f, 0x4f62, 0xf5e4, 0x8329, 0x63cc, 0xb593, 0xec6a, 0xc428},
1821 {0x93a7, 0xfcf6, 0x606d, 0xd4b2, 0x2aad, 0x28b4, 0xc65b, 0x8998,
1822 0x4e08, 0xd178, 0x0900, 0xc82b, 0x7470, 0xa342, 0x7c0f, 0xffff},
1823 {0x315f, 0xf304, 0xeb7b, 0xe5c3, 0x1451, 0x6311, 0x8f37, 0x93a8,
1824 0x4a38, 0xa6c6, 0xe393, 0x1087, 0x6301, 0xd673, 0x4ec4, 0xffff}},
1825 {{0x892e, 0xeed0, 0x1165, 0xcbc1, 0x5545, 0xa280, 0x7243, 0x10c9,
1826 0x9536, 0x36af, 0xb3fc, 0x2d7c, 0xe8a5, 0x09d6, 0xe1d4, 0xe85d},
1827 {0xae09, 0xc28a, 0xd777, 0xbd80, 0x23d6, 0xf980, 0xeb7c, 0x4e0e,
1828 0xf7dc, 0x6475, 0xf10a, 0x2d33, 0x5dfd, 0x797a, 0x7f1c, 0xf71a},
1829 {0x4064, 0x8717, 0xd091, 0x80b0, 0x4527, 0x8442, 0xac8b, 0x9614,
1830 0xc633, 0x35f5, 0x7714, 0x2e83, 0x4aaa, 0xd2e4, 0x1acd, 0x0562}},
1831 {{0xdb64, 0x0937, 0x308b, 0x53b0, 0x00e8, 0xc77f, 0x2f30, 0x37f7,
1832 0x79ce, 0xeb7f, 0xde81, 0x9286, 0xafda, 0x0e62, 0xae00, 0x0067},
1833 {0x2cc7, 0xd362, 0xb161, 0x0557, 0x4ff2, 0xb9c8, 0x06fe, 0x5f2b,
1834 0xde33, 0x0190, 0x28c6, 0xb886, 0xee2b, 0x5a4e, 0x3289, 0x0185},
1835 {0x4215, 0x923e, 0xf34f, 0xb362, 0x88f8, 0xceec, 0xafdd, 0x7f42,
1836 0x0c57, 0x56b2, 0xa366, 0x6a08, 0x0826, 0xfb8f, 0x1b03, 0x0163}},
1837 {{0xa4ba, 0x8408, 0x810a, 0xdeba, 0x47a3, 0x853a, 0xeb64, 0x2f74,
1838 0x3039, 0x038c, 0x7fbb, 0x498e, 0xd1e9, 0x46fb, 0x5691, 0x32a4},
1839 {0xd749, 0xb49d, 0x20b7, 0x2af6, 0xd34a, 0xd2da, 0x0a10, 0xf781,
1840 0x58c9, 0x171f, 0x3cb6, 0x6337, 0x88cd, 0xcf1e, 0xb246, 0x7351},
1841 {0xf729, 0xcf0a, 0x96ea, 0x032c, 0x4a8f, 0x42fe, 0xbac8, 0xec65,
1842 0x1510, 0x0d75, 0x4c17, 0x8d29, 0xa03f, 0x8b7e, 0x2c49, 0x0000}},
1843 {{0x0fa4, 0x8e1c, 0x3788, 0xba3c, 0x8d52, 0xd89d, 0x12c8, 0xeced,
1844 0x9fe6, 0x9b88, 0xecf3, 0xe3c8, 0xac48, 0x76ed, 0xf23e, 0xda79},
1845 {0x1103, 0x227c, 0x5b00, 0x3fcf, 0xc5d0, 0x2d28, 0x8020, 0x4d1c,
1846 0xc6b9, 0x67f9, 0x6f39, 0x989a, 0xda53, 0x3847, 0xd416, 0xe0d0},
1847 {0xdd8e, 0xcf31, 0x3710, 0x7e44, 0xa511, 0x933c, 0x0cc3, 0x5145,
1848 0xf632, 0x5e1d, 0x038f, 0x5ce7, 0x7265, 0xda9d, 0xded6, 0x08f8}},
1849 {{0xe2c8, 0x91d5, 0xa5f5, 0x735f, 0x6b58, 0x56dc, 0xb39d, 0x5c4a,
1850 0x57d0, 0xa1c2, 0xd92f, 0x9ad4, 0xf7c4, 0x51dd, 0xaf5c, 0x0096},
1851 {0x1739, 0x7207, 0x7505, 0xbf35, 0x42de, 0x0a29, 0xa962, 0xdedf,
1852 0x53e8, 0x12bf, 0xcde7, 0xd8e2, 0x8d4d, 0x2c4b, 0xb1b1, 0x0628},
1853 {0x992d, 0xe3a7, 0xb422, 0xc198, 0x23ab, 0xa6ef, 0xb45d, 0x50da,
1854 0xa738, 0x014a, 0x2310, 0x85fb, 0x5fe8, 0x1b18, 0x1774, 0x03a7}},
1855 {{0x1f16, 0x2b09, 0x0236, 0xee90, 0xccf9, 0x9775, 0x8130, 0x4c91,
1856 0x9091, 0x310b, 0x6dc4, 0x86f6, 0xc2e8, 0xef60, 0xfc0e, 0xf3a4},
1857 {0x9f49, 0xac15, 0x02af, 0x110f, 0xc59d, 0x5677, 0xa1a9, 0x38d5,
1858 0x914f, 0xa909, 0x3a3a, 0x4a39, 0x3703, 0xea30, 0x73da, 0xffad},
1859 {0x15ed, 0xdd16, 0x83c7, 0x270a, 0x862f, 0xd8ad, 0xcaa1, 0x5f41,
1860 0x99a9, 0x3fc8, 0x7bb2, 0x360a, 0xb06d, 0xfadc, 0x1b36, 0xffa8}},
1861 {{0xc4e0, 0xb8fd, 0x5106, 0xe169, 0x754c, 0xa58c, 0xc413, 0x8224,
1862 0x5483, 0x63ec, 0xd477, 0x8473, 0x4778, 0x9281, 0x0000, 0x0000},
1863 {0x85e1, 0xff54, 0xb200, 0xe413, 0xf4f4, 0x4c0f, 0xfcec, 0xc183,
1864 0x60d3, 0x1b0c, 0x3834, 0x601c, 0x943c, 0xbe6e, 0x0002, 0x0000},
1865 {0xf4f8, 0xfd5e, 0x61ef, 0xece8, 0x9199, 0xe5c4, 0x05a6, 0xe6c3,
1866 0xc4ae, 0x8b28, 0x66b1, 0x8a95, 0x9ece, 0x8f4a, 0x0001, 0x0000}},
1867 {{0xeae9, 0xa1b4, 0xc6d8, 0x2411, 0x2b5a, 0x1dd0, 0x2dc9, 0xb57b,
1868 0x5ccd, 0x4957, 0xaf59, 0xa04b, 0x5f42, 0xab7c, 0x2826, 0x526f},
1869 {0xf407, 0x165a, 0xb724, 0x2f12, 0x2ea1, 0x470b, 0x4464, 0xbd35,
1870 0x606f, 0xd73e, 0x50d3, 0x8a7f, 0x8029, 0x7ffc, 0xbe31, 0x6cfb},
1871 {0x8171, 0x1f4c, 0xced2, 0x9c99, 0x6d7e, 0x5a0f, 0xfefb, 0x59e3,
1872 0xa0c8, 0xabd9, 0xc4c5, 0x57d3, 0xbfa3, 0x4f11, 0x96a2, 0x5a7d}},
1873 {{0xe068, 0x4cc0, 0x8bcd, 0xc903, 0x9e52, 0xb3e1, 0xd745, 0x0995,
1874 0xdd8f, 0xf14b, 0xd2ac, 0xd65a, 0xda1d, 0xa742, 0xbac5, 0x474c},
1875 {0x7481, 0xf2ad, 0x9757, 0x2d82, 0xb683, 0xb16b, 0x0002, 0x7b60,
1876 0x8f0c, 0x2594, 0x8f64, 0x3b7a, 0x3552, 0x8d9d, 0xb9d7, 0x67eb},
1877 {0xcaab, 0xb9a1, 0xf966, 0xe311, 0x5b34, 0x0fa0, 0x6abc, 0x8134,
1878 0xab3d, 0x90f6, 0x1984, 0x9232, 0xec17, 0x74e5, 0x2ceb, 0x434e}},
1879 {{0x0fb1, 0x7a55, 0x1a5c, 0x53eb, 0xd7b3, 0x7a01, 0xca32, 0x31f6,
1880 0x3b74, 0x679e, 0x1501, 0x6c57, 0xdb20, 0x8b7c, 0xd7d0, 0x8097},
1881 {0xb127, 0xb20c, 0xe3a2, 0x96f3, 0xe0d8, 0xd50c, 0x14b4, 0x0b40,
1882 0x6eeb, 0xa258, 0x99db, 0x3c8c, 0x0f51, 0x4198, 0x3887, 0xffd0},
1883 {0x0273, 0x9f8c, 0x9669, 0xbbba, 0x1c49, 0x767c, 0xc2af, 0x59f0,
1884 0x1366, 0xd397, 0x63ac, 0x6fe8, 0x1a9a, 0x1259, 0x01d0, 0x0016}},
1885 {{0x7876, 0x2a35, 0xa24a, 0x433e, 0x5501, 0x573c, 0xd76d, 0xcb82,
1886 0x1334, 0xb4a6, 0xf290, 0xc797, 0xeae9, 0x2b83, 0x1e2b, 0x8b14},
1887 {0x3885, 0x8aef, 0x9dea, 0x2b8c, 0xdd7c, 0xd7cd, 0xb0cc, 0x05ee,
1888 0x361b, 0x3800, 0xb0d4, 0x4c23, 0xbd3f, 0x5180, 0x9783, 0xff80},
1889 {0xab36, 0x3104, 0xdae8, 0x0704, 0x4a28, 0x6714, 0x824b, 0x0051,
1890 0x8134, 0x1f6a, 0x712d, 0x1f03, 0x03b2, 0xecac, 0x377d, 0xfef9}}
1891 };
1892
1893 int i, j, ok;
1894
1895 /* Test known inputs/outputs */
1896 for (i = 0; (size_t)i < ARRAY_SIZE(CASES); ++i) {
1897 uint16_t out[16];
1898 test_modinv32_uint16(out, CASES[i][0], CASES[i][1]);
1899 for (j = 0; j < 16; ++j) CHECK(out[j] == CASES[i][2][j]);
1900#ifdef SECP256K1_WIDEMUL_INT128
1901 test_modinv64_uint16(out, CASES[i][0], CASES[i][1]);
1902 for (j = 0; j < 16; ++j) CHECK(out[j] == CASES[i][2][j]);
1903#endif
1904 }
1905
1906 for (i = 0; i < 100 * COUNT; ++i) {
1907 /* 256-bit numbers in 16-uint16_t's notation */
1908 static const uint16_t ZERO[16] = {0};
1909 uint16_t xd[16]; /* the number (in range [0,2^256)) to be inverted */
1910 uint16_t md[16]; /* the modulus (odd, in range [3,2^256)) */
1911 uint16_t id[16]; /* the inverse of xd mod md */
1912
1913 /* generate random xd and md, so that md is odd, md>1, xd<md, and gcd(xd,md)=1 */
1914 do {
1915 /* generate random xd and md (with many subsequent 0s and 1s) */
1916 testrand256_test((unsigned char*)xd);
1917 testrand256_test((unsigned char*)md);
1918 md[0] |= 1; /* modulus must be odd */
1919 /* If modulus is 1, find another one. */
1920 ok = md[0] != 1;
1921 for (j = 1; j < 16; ++j) ok |= md[j] != 0;
1922 mulmod256(xd, xd, NULL, md); /* Make xd = xd mod md */
1923 } while (!(ok && coprime(xd, md)));
1924
1925 test_modinv32_uint16(id, xd, md);
1926#ifdef SECP256K1_WIDEMUL_INT128
1927 test_modinv64_uint16(id, xd, md);
1928#endif
1929
1930 /* In a few cases, also test with input=0 */
1931 if (i < COUNT) {
1932 test_modinv32_uint16(id, ZERO, md);
1933#ifdef SECP256K1_WIDEMUL_INT128
1934 test_modinv64_uint16(id, ZERO, md);
1935#endif
1936 }
1937 }
1938}
1939
1940/***** INT128 TESTS *****/
1941
1942#ifdef SECP256K1_WIDEMUL_INT128
1943/* Add two 256-bit numbers (represented as 16 uint16_t's in LE order) together mod 2^256. */
1944static void add256(uint16_t* out, const uint16_t* a, const uint16_t* b) {
1945 int i;
1946 uint32_t carry = 0;
1947 for (i = 0; i < 16; ++i) {
1948 carry += a[i];
1949 carry += b[i];
1950 out[i] = carry;
1951 carry >>= 16;
1952 }
1953}
1954
1955/* Negate a 256-bit number (represented as 16 uint16_t's in LE order) mod 2^256. */
1956static void neg256(uint16_t* out, const uint16_t* a) {
1957 int i;
1958 uint32_t carry = 1;
1959 for (i = 0; i < 16; ++i) {
1960 carry += (uint16_t)~a[i];
1961 out[i] = carry;
1962 carry >>= 16;
1963 }
1964}
1965
1966/* Right-shift a 256-bit number (represented as 16 uint16_t's in LE order). */
1967static void rshift256(uint16_t* out, const uint16_t* a, int n, int sign_extend) {
1968 uint16_t sign = sign_extend && (a[15] >> 15);
1969 int i, j;
1970 for (i = 15; i >= 0; --i) {
1971 uint16_t v = 0;
1972 for (j = 0; j < 16; ++j) {
1973 int frompos = i*16 + j + n;
1974 if (frompos >= 256) {
1975 v |= sign << j;
1976 } else {
1977 v |= ((uint16_t)((a[frompos >> 4] >> (frompos & 15)) & 1)) << j;
1978 }
1979 }
1980 out[i] = v;
1981 }
1982}
1983
1984/* Load a 64-bit unsigned integer into an array of 16 uint16_t's in LE order representing a 256-bit value. */
1985static void load256u64(uint16_t* out, uint64_t v, int is_signed) {
1986 int i;
1987 uint64_t sign = is_signed && (v >> 63) ? UINT64_MAX : 0;
1988 for (i = 0; i < 4; ++i) {
1989 out[i] = v >> (16 * i);
1990 }
1991 for (i = 4; i < 16; ++i) {
1992 out[i] = sign;
1993 }
1994}
1995
1996/* Load a 128-bit unsigned integer into an array of 16 uint16_t's in LE order representing a 256-bit value. */
1997static void load256two64(uint16_t* out, uint64_t hi, uint64_t lo, int is_signed) {
1998 int i;
1999 uint64_t sign = is_signed && (hi >> 63) ? UINT64_MAX : 0;
2000 for (i = 0; i < 4; ++i) {
2001 out[i] = lo >> (16 * i);
2002 }
2003 for (i = 4; i < 8; ++i) {
2004 out[i] = hi >> (16 * (i - 4));
2005 }
2006 for (i = 8; i < 16; ++i) {
2007 out[i] = sign;
2008 }
2009}
2010
2011/* Check whether the 256-bit value represented by array of 16-bit values is in range -2^127 < v < 2^127. */
2012static int int256is127(const uint16_t* v) {
2013 int all_0 = ((v[7] & 0x8000) == 0), all_1 = ((v[7] & 0x8000) == 0x8000);
2014 int i;
2015 for (i = 8; i < 16; ++i) {
2016 if (v[i] != 0) all_0 = 0;
2017 if (v[i] != 0xffff) all_1 = 0;
2018 }
2019 return all_0 || all_1;
2020}
2021
2022static void load256u128(uint16_t* out, const secp256k1_uint128* v) {
2023 uint64_t lo = secp256k1_u128_to_u64(v), hi = secp256k1_u128_hi_u64(v);
2024 load256two64(out, hi, lo, 0);
2025}
2026
2027static void load256i128(uint16_t* out, const secp256k1_int128* v) {
2028 uint64_t lo;
2029 int64_t hi;
2030 secp256k1_int128 c = *v;
2031 lo = secp256k1_i128_to_u64(&c);
2032 secp256k1_i128_rshift(&c, 64);
2033 hi = secp256k1_i128_to_i64(&c);
2034 load256two64(out, hi, lo, 1);
2035}
2036
2037static void run_int128_test_case(void) {
2038 unsigned char buf[32];
2039 uint64_t v[4];
2040 secp256k1_int128 swa, swz;
2041 secp256k1_uint128 uwa, uwz;
2042 uint64_t ub, uc;
2043 int64_t sb, sc;
2044 uint16_t rswa[16], rswz[32], rswr[32], ruwa[16], ruwz[32], ruwr[32];
2045 uint16_t rub[16], ruc[16], rsb[16], rsc[16];
2046 int i;
2047
2048 /* Generate 32-byte random value. */
2049 testrand256_test(buf);
2050 /* Convert into 4 64-bit integers. */
2051 for (i = 0; i < 4; ++i) {
2052 uint64_t vi = 0;
2053 int j;
2054 for (j = 0; j < 8; ++j) vi = (vi << 8) + buf[8*i + j];
2055 v[i] = vi;
2056 }
2057 /* Convert those into a 128-bit value and two 64-bit values (signed and unsigned). */
2058 secp256k1_u128_load(&uwa, v[1], v[0]);
2059 secp256k1_i128_load(&swa, v[1], v[0]);
2060 ub = v[2];
2061 sb = v[2];
2062 uc = v[3];
2063 sc = v[3];
2064 /* Load those also into 16-bit array representations. */
2065 load256u128(ruwa, &uwa);
2066 load256i128(rswa, &swa);
2067 load256u64(rub, ub, 0);
2068 load256u64(rsb, sb, 1);
2069 load256u64(ruc, uc, 0);
2070 load256u64(rsc, sc, 1);
2071 /* test secp256k1_u128_mul */
2072 mulmod256(ruwr, rub, ruc, NULL);
2073 secp256k1_u128_mul(&uwz, ub, uc);
2074 load256u128(ruwz, &uwz);
2075 CHECK(secp256k1_memcmp_var(ruwr, ruwz, 16) == 0);
2076 /* test secp256k1_u128_accum_mul */
2077 mulmod256(ruwr, rub, ruc, NULL);
2078 add256(ruwr, ruwr, ruwa);
2079 uwz = uwa;
2080 secp256k1_u128_accum_mul(&uwz, ub, uc);
2081 load256u128(ruwz, &uwz);
2082 CHECK(secp256k1_memcmp_var(ruwr, ruwz, 16) == 0);
2083 /* test secp256k1_u128_accum_u64 */
2084 add256(ruwr, rub, ruwa);
2085 uwz = uwa;
2086 secp256k1_u128_accum_u64(&uwz, ub);
2087 load256u128(ruwz, &uwz);
2088 CHECK(secp256k1_memcmp_var(ruwr, ruwz, 16) == 0);
2089 /* test secp256k1_u128_rshift */
2090 rshift256(ruwr, ruwa, uc % 128, 0);
2091 uwz = uwa;
2092 secp256k1_u128_rshift(&uwz, uc % 128);
2093 load256u128(ruwz, &uwz);
2094 CHECK(secp256k1_memcmp_var(ruwr, ruwz, 16) == 0);
2095 /* test secp256k1_u128_to_u64 */
2096 CHECK(secp256k1_u128_to_u64(&uwa) == v[0]);
2097 /* test secp256k1_u128_hi_u64 */
2098 CHECK(secp256k1_u128_hi_u64(&uwa) == v[1]);
2099 /* test secp256k1_u128_from_u64 */
2100 secp256k1_u128_from_u64(&uwz, ub);
2101 load256u128(ruwz, &uwz);
2102 CHECK(secp256k1_memcmp_var(rub, ruwz, 16) == 0);
2103 /* test secp256k1_u128_check_bits */
2104 {
2105 int uwa_bits = 0;
2106 int j;
2107 for (j = 0; j < 128; ++j) {
2108 if (ruwa[j / 16] >> (j % 16)) uwa_bits = 1 + j;
2109 }
2110 for (j = 0; j < 128; ++j) {
2111 CHECK(secp256k1_u128_check_bits(&uwa, j) == (uwa_bits <= j));
2112 }
2113 }
2114 /* test secp256k1_i128_mul */
2115 mulmod256(rswr, rsb, rsc, NULL);
2116 secp256k1_i128_mul(&swz, sb, sc);
2117 load256i128(rswz, &swz);
2118 CHECK(secp256k1_memcmp_var(rswr, rswz, 16) == 0);
2119 /* test secp256k1_i128_accum_mul */
2120 mulmod256(rswr, rsb, rsc, NULL);
2121 add256(rswr, rswr, rswa);
2122 if (int256is127(rswr)) {
2123 swz = swa;
2124 secp256k1_i128_accum_mul(&swz, sb, sc);
2125 load256i128(rswz, &swz);
2126 CHECK(secp256k1_memcmp_var(rswr, rswz, 16) == 0);
2127 }
2128 /* test secp256k1_i128_det */
2129 {
2130 uint16_t rsd[16], rse[16], rst[32];
2131 int64_t sd = v[0], se = v[1];
2132 load256u64(rsd, sd, 1);
2133 load256u64(rse, se, 1);
2134 mulmod256(rst, rsc, rsd, NULL);
2135 neg256(rst, rst);
2136 mulmod256(rswr, rsb, rse, NULL);
2137 add256(rswr, rswr, rst);
2138 secp256k1_i128_det(&swz, sb, sc, sd, se);
2139 load256i128(rswz, &swz);
2140 CHECK(secp256k1_memcmp_var(rswr, rswz, 16) == 0);
2141 }
2142 /* test secp256k1_i128_rshift */
2143 rshift256(rswr, rswa, uc % 127, 1);
2144 swz = swa;
2145 secp256k1_i128_rshift(&swz, uc % 127);
2146 load256i128(rswz, &swz);
2147 CHECK(secp256k1_memcmp_var(rswr, rswz, 16) == 0);
2148 /* test secp256k1_i128_to_u64 */
2149 CHECK(secp256k1_i128_to_u64(&swa) == v[0]);
2150 /* test secp256k1_i128_from_i64 */
2151 secp256k1_i128_from_i64(&swz, sb);
2152 load256i128(rswz, &swz);
2153 CHECK(secp256k1_memcmp_var(rsb, rswz, 16) == 0);
2154 /* test secp256k1_i128_to_i64 */
2155 CHECK(secp256k1_i128_to_i64(&swz) == sb);
2156 /* test secp256k1_i128_eq_var */
2157 {
2158 int expect = (uc & 1);
2159 swz = swa;
2160 if (!expect) {
2161 /* Make sure swz != swa */
2162 uint64_t v0c = v[0], v1c = v[1];
2163 if (ub & 64) {
2164 v1c ^= (((uint64_t)1) << (ub & 63));
2165 } else {
2166 v0c ^= (((uint64_t)1) << (ub & 63));
2167 }
2168 secp256k1_i128_load(&swz, v1c, v0c);
2169 }
2170 CHECK(secp256k1_i128_eq_var(&swa, &swz) == expect);
2171 }
2172 /* test secp256k1_i128_check_pow2 (sign == 1) */
2173 {
2174 int expect = (uc & 1);
2175 int pos = ub % 127;
2176 if (expect) {
2177 /* If expect==1, set swz to exactly 2^pos. */
2178 uint64_t hi = 0;
2179 uint64_t lo = 0;
2180 if (pos >= 64) {
2181 hi = (((uint64_t)1) << (pos & 63));
2182 } else {
2183 lo = (((uint64_t)1) << (pos & 63));
2184 }
2185 secp256k1_i128_load(&swz, hi, lo);
2186 } else {
2187 /* If expect==0, set swz = swa, but update expect=1 if swa happens to equal 2^pos. */
2188 if (pos >= 64) {
2189 if ((v[1] == (((uint64_t)1) << (pos & 63))) && v[0] == 0) expect = 1;
2190 } else {
2191 if ((v[0] == (((uint64_t)1) << (pos & 63))) && v[1] == 0) expect = 1;
2192 }
2193 swz = swa;
2194 }
2195 CHECK(secp256k1_i128_check_pow2(&swz, pos, 1) == expect);
2196 }
2197 /* test secp256k1_i128_check_pow2 (sign == -1) */
2198 {
2199 int expect = (uc & 1);
2200 int pos = ub % 127;
2201 if (expect) {
2202 /* If expect==1, set swz to exactly -2^pos. */
2203 uint64_t hi = ~(uint64_t)0;
2204 uint64_t lo = ~(uint64_t)0;
2205 if (pos >= 64) {
2206 hi <<= (pos & 63);
2207 lo = 0;
2208 } else {
2209 lo <<= (pos & 63);
2210 }
2211 secp256k1_i128_load(&swz, hi, lo);
2212 } else {
2213 /* If expect==0, set swz = swa, but update expect=1 if swa happens to equal -2^pos. */
2214 if (pos >= 64) {
2215 if ((v[1] == ((~(uint64_t)0) << (pos & 63))) && v[0] == 0) expect = 1;
2216 } else {
2217 if ((v[0] == ((~(uint64_t)0) << (pos & 63))) && v[1] == ~(uint64_t)0) expect = 1;
2218 }
2219 swz = swa;
2220 }
2221 CHECK(secp256k1_i128_check_pow2(&swz, pos, -1) == expect);
2222 }
2223}
2224
2225static void run_int128_tests(void) {
2226 { /* secp256k1_u128_accum_mul */
2228
2229 /* Check secp256k1_u128_accum_mul overflow */
2230 secp256k1_u128_mul(&res, UINT64_MAX, UINT64_MAX);
2231 secp256k1_u128_accum_mul(&res, UINT64_MAX, UINT64_MAX);
2232 CHECK(secp256k1_u128_to_u64(&res) == 2);
2233 CHECK(secp256k1_u128_hi_u64(&res) == 18446744073709551612U);
2234 }
2235 { /* secp256k1_u128_accum_mul */
2236 secp256k1_int128 res;
2237
2238 /* Compute INT128_MAX = 2^127 - 1 with secp256k1_i128_accum_mul */
2239 secp256k1_i128_mul(&res, INT64_MAX, INT64_MAX);
2240 secp256k1_i128_accum_mul(&res, INT64_MAX, INT64_MAX);
2241 CHECK(secp256k1_i128_to_u64(&res) == 2);
2242 secp256k1_i128_accum_mul(&res, 4, 9223372036854775807);
2243 secp256k1_i128_accum_mul(&res, 1, 1);
2244 CHECK(secp256k1_i128_to_u64(&res) == UINT64_MAX);
2245 secp256k1_i128_rshift(&res, 64);
2246 CHECK(secp256k1_i128_to_i64(&res) == INT64_MAX);
2247
2248 /* Compute INT128_MIN = - 2^127 with secp256k1_i128_accum_mul */
2249 secp256k1_i128_mul(&res, INT64_MAX, INT64_MIN);
2250 CHECK(secp256k1_i128_to_u64(&res) == (uint64_t)INT64_MIN);
2251 secp256k1_i128_accum_mul(&res, INT64_MAX, INT64_MIN);
2252 CHECK(secp256k1_i128_to_u64(&res) == 0);
2253 secp256k1_i128_accum_mul(&res, 2, INT64_MIN);
2254 CHECK(secp256k1_i128_to_u64(&res) == 0);
2255 secp256k1_i128_rshift(&res, 64);
2256 CHECK(secp256k1_i128_to_i64(&res) == INT64_MIN);
2257 }
2258 {
2259 /* Randomized tests. */
2260 int i;
2261 for (i = 0; i < 256 * COUNT; ++i) run_int128_test_case();
2262 }
2263}
2264#endif
2265
2266/***** SCALAR TESTS *****/
2267
2268static void scalar_test(void) {
2272 unsigned char c[32];
2273
2274 /* Set 's' to a random scalar, with value 'snum'. */
2276
2277 /* Set 's1' to a random scalar, with value 's1num'. */
2279
2280 /* Set 's2' to a random scalar, with value 'snum2', and byte array representation 'c'. */
2283
2284 {
2285 int i;
2286 /* Test that fetching groups of 4 bits from a scalar and recursing n(i)=16*n(i-1)+p(i) reconstructs it. */
2289 for (i = 0; i < 256; i += 4) {
2291 int j;
2293 for (j = 0; j < 4; j++) {
2294 secp256k1_scalar_add(&n, &n, &n);
2295 }
2296 secp256k1_scalar_add(&n, &n, &t);
2297 }
2299 }
2300
2301 {
2302 /* Test that fetching groups of randomly-sized bits from a scalar and recursing n(i)=b*n(i-1)+p(i) reconstructs it. */
2304 int i = 0;
2306 while (i < 256) {
2308 int j;
2309 int now = testrand_int(15) + 1;
2310 if (now + i > 256) {
2311 now = 256 - i;
2312 }
2314 for (j = 0; j < now; j++) {
2315 secp256k1_scalar_add(&n, &n, &n);
2316 }
2317 secp256k1_scalar_add(&n, &n, &t);
2318 i += now;
2319 }
2321 }
2322
2323 {
2324 /* Test commutativity of add. */
2325 secp256k1_scalar r1, r2;
2326 secp256k1_scalar_add(&r1, &s1, &s2);
2327 secp256k1_scalar_add(&r2, &s2, &s1);
2328 CHECK(secp256k1_scalar_eq(&r1, &r2));
2329 }
2330
2331 {
2332 secp256k1_scalar r1, r2;
2334 int i;
2335 /* Test add_bit. */
2336 int bit = testrand_bits(8);
2339 for (i = 0; i < bit; i++) {
2340 secp256k1_scalar_add(&b, &b, &b);
2341 }
2342 r1 = s1;
2343 r2 = s1;
2344 if (!secp256k1_scalar_add(&r1, &r1, &b)) {
2345 /* No overflow happened. */
2346 secp256k1_scalar_cadd_bit(&r2, bit, 1);
2347 CHECK(secp256k1_scalar_eq(&r1, &r2));
2348 /* cadd is a noop when flag is zero */
2349 secp256k1_scalar_cadd_bit(&r2, bit, 0);
2350 CHECK(secp256k1_scalar_eq(&r1, &r2));
2351 }
2352 }
2353
2354 {
2355 /* Test commutativity of mul. */
2356 secp256k1_scalar r1, r2;
2357 secp256k1_scalar_mul(&r1, &s1, &s2);
2358 secp256k1_scalar_mul(&r2, &s2, &s1);
2359 CHECK(secp256k1_scalar_eq(&r1, &r2));
2360 }
2361
2362 {
2363 /* Test associativity of add. */
2364 secp256k1_scalar r1, r2;
2365 secp256k1_scalar_add(&r1, &s1, &s2);
2366 secp256k1_scalar_add(&r1, &r1, &s);
2367 secp256k1_scalar_add(&r2, &s2, &s);
2368 secp256k1_scalar_add(&r2, &s1, &r2);
2369 CHECK(secp256k1_scalar_eq(&r1, &r2));
2370 }
2371
2372 {
2373 /* Test associativity of mul. */
2374 secp256k1_scalar r1, r2;
2375 secp256k1_scalar_mul(&r1, &s1, &s2);
2376 secp256k1_scalar_mul(&r1, &r1, &s);
2377 secp256k1_scalar_mul(&r2, &s2, &s);
2378 secp256k1_scalar_mul(&r2, &s1, &r2);
2379 CHECK(secp256k1_scalar_eq(&r1, &r2));
2380 }
2381
2382 {
2383 /* Test distributitivity of mul over add. */
2384 secp256k1_scalar r1, r2, t;
2385 secp256k1_scalar_add(&r1, &s1, &s2);
2386 secp256k1_scalar_mul(&r1, &r1, &s);
2387 secp256k1_scalar_mul(&r2, &s1, &s);
2388 secp256k1_scalar_mul(&t, &s2, &s);
2389 secp256k1_scalar_add(&r2, &r2, &t);
2390 CHECK(secp256k1_scalar_eq(&r1, &r2));
2391 }
2392
2393 {
2394 /* Test multiplicative identity. */
2397 CHECK(secp256k1_scalar_eq(&r1, &s1));
2398 }
2399
2400 {
2401 /* Test additive identity. */
2404 CHECK(secp256k1_scalar_eq(&r1, &s1));
2405 }
2406
2407 {
2408 /* Test zero product property. */
2412 }
2413
2414 {
2415 /* Test halving. */
2417 secp256k1_scalar_add(&r, &s, &s);
2418 secp256k1_scalar_half(&r, &r);
2420 }
2421}
2422
2424 unsigned char b32[32];
2427
2428 /* Usually set_b32 and set_b32_seckey give the same result */
2430 secp256k1_scalar_set_b32(&s1, b32, NULL);
2431 CHECK(secp256k1_scalar_set_b32_seckey(&s2, b32) == 1);
2432 CHECK(secp256k1_scalar_eq(&s1, &s2) == 1);
2433
2434 memset(b32, 0, sizeof(b32));
2435 CHECK(secp256k1_scalar_set_b32_seckey(&s2, b32) == 0);
2436 memset(b32, 0xFF, sizeof(b32));
2437 CHECK(secp256k1_scalar_set_b32_seckey(&s2, b32) == 0);
2438}
2439
2442 const secp256k1_scalar n_minus_1 = SECP256K1_SCALAR_CONST(
2443 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL,
2444 0xBAAEDCE6UL, 0xAF48A03BUL, 0xBFD25E8CUL, 0xD0364140UL
2445 );
2447 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL,
2448 0xBAAEDCE6UL, 0xAF48A03BUL, 0xBFD25E8CUL, 0xD0364141UL
2449 );
2451 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL,
2452 0xBAAEDCE6UL, 0xAF48A03BUL, 0xBFD25E8CUL, 0xD0364142UL
2453 );
2455 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
2456 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL
2457 );
2458
2459 int i;
2460
2463 CHECK(secp256k1_scalar_check_overflow(&n_minus_1) == 0);
2465 CHECK(secp256k1_scalar_check_overflow(&n_plus_1) == 1);
2467
2468 for (i = 0; i < 2 * COUNT; i++) {
2469 int expected_overflow;
2470 int overflow = 0;
2471 unsigned char b32[32];
2472
2473 testrand256(b32);
2474
2475 /* Force top bits to be 0xFF sometimes to ensure we hit overflows */
2476 if (i % 2 == 0) {
2477 memset(b32, 0xFF, 16);
2478 }
2479
2480 expected_overflow = (secp256k1_memcmp_var(b32, secp256k1_group_order_bytes, 32) >= 0);
2481
2482 secp256k1_scalar_set_b32(&s, b32, &overflow);
2483 CHECK(overflow == expected_overflow);
2484 }
2485}
2486
2487static void run_scalar_tests(void) {
2488 int i;
2489
2491
2492 for (i = 0; i < 128 * COUNT; i++) {
2493 scalar_test();
2494 }
2495 for (i = 0; i < COUNT; i++) {
2497 }
2498
2499 {
2500 /* Check that the scalar constants secp256k1_scalar_zero and
2501 secp256k1_scalar_one contain the expected values. */
2502 secp256k1_scalar zero, one;
2503
2505 secp256k1_scalar_set_int(&zero, 0);
2507
2509 secp256k1_scalar_set_int(&one, 1);
2511 }
2512
2513 {
2514 /* (-1)+1 should be zero. */
2521 }
2522
2523 {
2524 /* Test that halving and doubling roundtrips on some fixed values. */
2525 static const secp256k1_scalar HALF_TESTS[] = {
2526 /* 0 */
2527 SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0),
2528 /* 1 */
2529 SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1),
2530 /* -1 */
2531 SECP256K1_SCALAR_CONST(0xfffffffful, 0xfffffffful, 0xfffffffful, 0xfffffffeul, 0xbaaedce6ul, 0xaf48a03bul, 0xbfd25e8cul, 0xd0364140ul),
2532 /* -2 (largest odd value) */
2533 SECP256K1_SCALAR_CONST(0xfffffffful, 0xfffffffful, 0xfffffffful, 0xfffffffeul, 0xbaaedce6ul, 0xaf48a03bul, 0xbfd25e8cul, 0xd036413Ful),
2534 /* Half the secp256k1 order */
2535 SECP256K1_SCALAR_CONST(0x7ffffffful, 0xfffffffful, 0xfffffffful, 0xfffffffful, 0x5d576e73ul, 0x57a4501dul, 0xdfe92f46ul, 0x681b20a0ul),
2536 /* Half the secp256k1 order + 1 */
2537 SECP256K1_SCALAR_CONST(0x7ffffffful, 0xfffffffful, 0xfffffffful, 0xfffffffful, 0x5d576e73ul, 0x57a4501dul, 0xdfe92f46ul, 0x681b20a1ul),
2538 /* 2^255 */
2539 SECP256K1_SCALAR_CONST(0x80000000ul, 0, 0, 0, 0, 0, 0, 0),
2540 /* 2^255 - 1 */
2541 SECP256K1_SCALAR_CONST(0x7ffffffful, 0xfffffffful, 0xfffffffful, 0xfffffffful, 0xfffffffful, 0xfffffffful, 0xfffffffful, 0xfffffffful),
2542 };
2543 unsigned n;
2544 for (n = 0; n < ARRAY_SIZE(HALF_TESTS); ++n) {
2546 secp256k1_scalar_half(&s, &HALF_TESTS[n]);
2547 secp256k1_scalar_add(&s, &s, &s);
2548 CHECK(secp256k1_scalar_eq(&s, &HALF_TESTS[n]));
2549 secp256k1_scalar_add(&s, &s, &s);
2551 CHECK(secp256k1_scalar_eq(&s, &HALF_TESTS[n]));
2552 }
2553 }
2554
2555 {
2556 /* Static test vectors.
2557 * These were reduced from ~10^12 random vectors based on comparison-decision
2558 * and edge-case coverage on 32-bit and 64-bit implementations.
2559 * The responses were generated with Sage 5.9.
2560 */
2567 secp256k1_scalar zzv;
2568 int overflow;
2569 unsigned char chal[33][2][32] = {
2570 {{0xff, 0xff, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00,
2571 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03,
2572 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff,
2573 0xff, 0xff, 0x03, 0x00, 0xc0, 0xff, 0xff, 0xff},
2574 {0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00,
2575 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8,
2576 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2577 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff}},
2578 {{0xef, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
2579 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00,
2580 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2581 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
2582 {0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
2583 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0,
2584 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff,
2585 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x80, 0xff}},
2586 {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
2587 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
2588 0x80, 0x00, 0x00, 0x80, 0xff, 0x3f, 0x00, 0x00,
2589 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x00},
2590 {0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x80,
2591 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xe0,
2592 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00,
2593 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff}},
2594 {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
2595 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
2596 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
2597 0x00, 0x1e, 0xf8, 0xff, 0xff, 0xff, 0xfd, 0xff},
2598 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f,
2599 0x00, 0x00, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xe0,
2600 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff,
2601 0xf3, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}},
2602 {{0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00,
2603 0x00, 0x1c, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
2604 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0x00,
2605 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff},
2606 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00,
2607 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2608 0xff, 0x1f, 0x00, 0x00, 0x80, 0xff, 0xff, 0x3f,
2609 0x00, 0xfe, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff}},
2610 {{0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xfc, 0x9f,
2611 0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x80,
2612 0xff, 0x0f, 0xfc, 0xff, 0x7f, 0x00, 0x00, 0x00,
2613 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},
2614 {0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2615 0x00, 0x00, 0xf8, 0xff, 0x0f, 0xc0, 0xff, 0xff,
2616 0xff, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff,
2617 0xff, 0xff, 0xff, 0x07, 0x80, 0xff, 0xff, 0xff}},
2618 {{0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00,
2619 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
2620 0xf7, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x00,
2621 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xf0},
2622 {0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff,
2623 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,
2624 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff,
2625 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
2626 {{0x00, 0xf8, 0xff, 0x03, 0xff, 0xff, 0xff, 0x00,
2627 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
2628 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
2629 0xff, 0xff, 0x03, 0xc0, 0xff, 0x0f, 0xfc, 0xff},
2630 {0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff,
2631 0xff, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x00, 0xc0,
2632 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2633 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
2634 {{0x8f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2635 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff,
2636 0xff, 0x7f, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
2637 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},
2638 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2639 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2640 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2641 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
2642 {{0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff,
2643 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2644 0xff, 0xff, 0x03, 0x00, 0x80, 0x00, 0x00, 0x80,
2645 0xff, 0xff, 0xff, 0x00, 0x00, 0x80, 0xff, 0x7f},
2646 {0xff, 0xcf, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,
2647 0x00, 0xc0, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff,
2648 0xbf, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00,
2649 0x80, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00}},
2650 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff,
2651 0xff, 0xff, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff,
2652 0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x80,
2653 0xff, 0x01, 0xfc, 0xff, 0x01, 0x00, 0xfe, 0xff},
2654 {0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00,
2655 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2656 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
2657 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00}},
2658 {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
2659 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2660 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2661 0x7f, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80},
2662 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2663 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf0, 0xff, 0xff,
2664 0xe0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
2665 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
2666 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2667 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2668 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2669 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x00},
2670 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
2671 0xfc, 0xff, 0xff, 0x3f, 0xf0, 0xff, 0xff, 0x3f,
2672 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x00, 0xff,
2673 0xff, 0xff, 0xff, 0xff, 0x0f, 0x7e, 0x00, 0x00}},
2674 {{0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
2675 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
2676 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2677 0xff, 0xff, 0x1f, 0x00, 0x00, 0xfe, 0x07, 0x00},
2678 {0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff,
2679 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2680 0xff, 0xfb, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00,
2681 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60}},
2682 {{0xff, 0x01, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00,
2683 0x80, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x03,
2684 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2685 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
2686 {0xff, 0xff, 0x1f, 0x00, 0xf0, 0xff, 0xff, 0xff,
2687 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2688 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2689 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00}},
2690 {{0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
2691 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2692 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2693 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
2694 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2695 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff,
2696 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03,
2697 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff}},
2698 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
2699 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2700 0xc0, 0xff, 0xff, 0xcf, 0xff, 0x1f, 0x00, 0x00,
2701 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80},
2702 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2703 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
2704 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x7e,
2705 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
2706 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2707 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff,
2708 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
2709 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00},
2710 {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2711 0xff, 0xff, 0x7f, 0x00, 0x80, 0x00, 0x00, 0x00,
2712 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
2713 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff}},
2714 {{0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x80,
2715 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
2716 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2717 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},
2718 {0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2719 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x80,
2720 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
2721 0xff, 0x7f, 0xf8, 0xff, 0xff, 0x1f, 0x00, 0xfe}},
2722 {{0xff, 0xff, 0xff, 0x3f, 0xf8, 0xff, 0xff, 0xff,
2723 0xff, 0x03, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00,
2724 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2725 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07},
2726 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
2727 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2728 0xff, 0xff, 0xff, 0xff, 0x01, 0x80, 0xff, 0xff,
2729 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}},
2730 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2731 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2732 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2733 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
2734 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2735 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
2736 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
2737 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40}},
2738 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2739 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2740 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2741 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
2742 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2743 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2744 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2745 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
2746 {{0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2747 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2748 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2749 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
2750 {0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2751 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2752 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2753 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
2754 {{0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xc0,
2755 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2756 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff,
2757 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f},
2758 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00,
2759 0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00,
2760 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff,
2761 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff}},
2762 {{0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2763 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2764 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2765 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
2766 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2767 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2768 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2769 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}},
2770 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2771 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
2772 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
2773 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40},
2774 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2775 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2776 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2777 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}},
2778 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2779 0x7e, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x07, 0x00,
2780 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
2781 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
2782 {0xff, 0x01, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
2783 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x80,
2784 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00,
2785 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
2786 {{0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x00,
2787 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
2788 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
2789 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff},
2790 {0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
2791 0xff, 0xff, 0x3f, 0x00, 0xf8, 0xff, 0xff, 0xff,
2792 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2793 0xff, 0x3f, 0x00, 0x00, 0xc0, 0xf1, 0x7f, 0x00}},
2794 {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
2795 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff,
2796 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
2797 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00},
2798 {0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
2799 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff,
2800 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f,
2801 0x00, 0x00, 0xfc, 0xff, 0xff, 0x01, 0xff, 0xff}},
2802 {{0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
2803 0x80, 0x00, 0x00, 0x80, 0xff, 0x03, 0xe0, 0x01,
2804 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfc, 0xff,
2805 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},
2806 {0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
2807 0xfe, 0xff, 0xff, 0xf0, 0x07, 0x00, 0x3c, 0x80,
2808 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff,
2809 0xff, 0xff, 0x07, 0xe0, 0xff, 0x00, 0x00, 0x00}},
2810 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
2811 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2812 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf8,
2813 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80},
2814 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2815 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x80, 0x00,
2816 0x00, 0x00, 0x00, 0xc0, 0x7f, 0xfe, 0xff, 0x1f,
2817 0x00, 0xfe, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff}},
2818 {{0xff, 0xff, 0x81, 0xff, 0xff, 0xff, 0xff, 0x00,
2819 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83,
2820 0xff, 0xff, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,
2821 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xf0},
2822 {0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff,
2823 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00,
2824 0xf8, 0x07, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
2825 0xff, 0xc7, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff}},
2826 {{0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
2827 0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
2828 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x03, 0xfb,
2829 0xfa, 0x8a, 0x7d, 0xdf, 0x13, 0x86, 0xe2, 0x03},
2830 {0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
2831 0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,
2832 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x03, 0xfb,
2833 0xfa, 0x8a, 0x7d, 0xdf, 0x13, 0x86, 0xe2, 0x03}}
2834 };
2835 unsigned char res[33][2][32] = {
2836 {{0x0c, 0x3b, 0x0a, 0xca, 0x8d, 0x1a, 0x2f, 0xb9,
2837 0x8a, 0x7b, 0x53, 0x5a, 0x1f, 0xc5, 0x22, 0xa1,
2838 0x07, 0x2a, 0x48, 0xea, 0x02, 0xeb, 0xb3, 0xd6,
2839 0x20, 0x1e, 0x86, 0xd0, 0x95, 0xf6, 0x92, 0x35},
2840 {0xdc, 0x90, 0x7a, 0x07, 0x2e, 0x1e, 0x44, 0x6d,
2841 0xf8, 0x15, 0x24, 0x5b, 0x5a, 0x96, 0x37, 0x9c,
2842 0x37, 0x7b, 0x0d, 0xac, 0x1b, 0x65, 0x58, 0x49,
2843 0x43, 0xb7, 0x31, 0xbb, 0xa7, 0xf4, 0x97, 0x15}},
2844 {{0xf1, 0xf7, 0x3a, 0x50, 0xe6, 0x10, 0xba, 0x22,
2845 0x43, 0x4d, 0x1f, 0x1f, 0x7c, 0x27, 0xca, 0x9c,
2846 0xb8, 0xb6, 0xa0, 0xfc, 0xd8, 0xc0, 0x05, 0x2f,
2847 0xf7, 0x08, 0xe1, 0x76, 0xdd, 0xd0, 0x80, 0xc8},
2848 {0xe3, 0x80, 0x80, 0xb8, 0xdb, 0xe3, 0xa9, 0x77,
2849 0x00, 0xb0, 0xf5, 0x2e, 0x27, 0xe2, 0x68, 0xc4,
2850 0x88, 0xe8, 0x04, 0xc1, 0x12, 0xbf, 0x78, 0x59,
2851 0xe6, 0xa9, 0x7c, 0xe1, 0x81, 0xdd, 0xb9, 0xd5}},
2852 {{0x96, 0xe2, 0xee, 0x01, 0xa6, 0x80, 0x31, 0xef,
2853 0x5c, 0xd0, 0x19, 0xb4, 0x7d, 0x5f, 0x79, 0xab,
2854 0xa1, 0x97, 0xd3, 0x7e, 0x33, 0xbb, 0x86, 0x55,
2855 0x60, 0x20, 0x10, 0x0d, 0x94, 0x2d, 0x11, 0x7c},
2856 {0xcc, 0xab, 0xe0, 0xe8, 0x98, 0x65, 0x12, 0x96,
2857 0x38, 0x5a, 0x1a, 0xf2, 0x85, 0x23, 0x59, 0x5f,
2858 0xf9, 0xf3, 0xc2, 0x81, 0x70, 0x92, 0x65, 0x12,
2859 0x9c, 0x65, 0x1e, 0x96, 0x00, 0xef, 0xe7, 0x63}},
2860 {{0xac, 0x1e, 0x62, 0xc2, 0x59, 0xfc, 0x4e, 0x5c,
2861 0x83, 0xb0, 0xd0, 0x6f, 0xce, 0x19, 0xf6, 0xbf,
2862 0xa4, 0xb0, 0xe0, 0x53, 0x66, 0x1f, 0xbf, 0xc9,
2863 0x33, 0x47, 0x37, 0xa9, 0x3d, 0x5d, 0xb0, 0x48},
2864 {0x86, 0xb9, 0x2a, 0x7f, 0x8e, 0xa8, 0x60, 0x42,
2865 0x26, 0x6d, 0x6e, 0x1c, 0xa2, 0xec, 0xe0, 0xe5,
2866 0x3e, 0x0a, 0x33, 0xbb, 0x61, 0x4c, 0x9f, 0x3c,
2867 0xd1, 0xdf, 0x49, 0x33, 0xcd, 0x72, 0x78, 0x18}},
2868 {{0xf7, 0xd3, 0xcd, 0x49, 0x5c, 0x13, 0x22, 0xfb,
2869 0x2e, 0xb2, 0x2f, 0x27, 0xf5, 0x8a, 0x5d, 0x74,
2870 0xc1, 0x58, 0xc5, 0xc2, 0x2d, 0x9f, 0x52, 0xc6,
2871 0x63, 0x9f, 0xba, 0x05, 0x76, 0x45, 0x7a, 0x63},
2872 {0x8a, 0xfa, 0x55, 0x4d, 0xdd, 0xa3, 0xb2, 0xc3,
2873 0x44, 0xfd, 0xec, 0x72, 0xde, 0xef, 0xc0, 0x99,
2874 0xf5, 0x9f, 0xe2, 0x52, 0xb4, 0x05, 0x32, 0x58,
2875 0x57, 0xc1, 0x8f, 0xea, 0xc3, 0x24, 0x5b, 0x94}},
2876 {{0x05, 0x83, 0xee, 0xdd, 0x64, 0xf0, 0x14, 0x3b,
2877 0xa0, 0x14, 0x4a, 0x3a, 0x41, 0x82, 0x7c, 0xa7,
2878 0x2c, 0xaa, 0xb1, 0x76, 0xbb, 0x59, 0x64, 0x5f,
2879 0x52, 0xad, 0x25, 0x29, 0x9d, 0x8f, 0x0b, 0xb0},
2880 {0x7e, 0xe3, 0x7c, 0xca, 0xcd, 0x4f, 0xb0, 0x6d,
2881 0x7a, 0xb2, 0x3e, 0xa0, 0x08, 0xb9, 0xa8, 0x2d,
2882 0xc2, 0xf4, 0x99, 0x66, 0xcc, 0xac, 0xd8, 0xb9,
2883 0x72, 0x2a, 0x4a, 0x3e, 0x0f, 0x7b, 0xbf, 0xf4}},
2884 {{0x8c, 0x9c, 0x78, 0x2b, 0x39, 0x61, 0x7e, 0xf7,
2885 0x65, 0x37, 0x66, 0x09, 0x38, 0xb9, 0x6f, 0x70,
2886 0x78, 0x87, 0xff, 0xcf, 0x93, 0xca, 0x85, 0x06,
2887 0x44, 0x84, 0xa7, 0xfe, 0xd3, 0xa4, 0xe3, 0x7e},
2888 {0xa2, 0x56, 0x49, 0x23, 0x54, 0xa5, 0x50, 0xe9,
2889 0x5f, 0xf0, 0x4d, 0xe7, 0xdc, 0x38, 0x32, 0x79,
2890 0x4f, 0x1c, 0xb7, 0xe4, 0xbb, 0xf8, 0xbb, 0x2e,
2891 0x40, 0x41, 0x4b, 0xcc, 0xe3, 0x1e, 0x16, 0x36}},
2892 {{0x0c, 0x1e, 0xd7, 0x09, 0x25, 0x40, 0x97, 0xcb,
2893 0x5c, 0x46, 0xa8, 0xda, 0xef, 0x25, 0xd5, 0xe5,
2894 0x92, 0x4d, 0xcf, 0xa3, 0xc4, 0x5d, 0x35, 0x4a,
2895 0xe4, 0x61, 0x92, 0xf3, 0xbf, 0x0e, 0xcd, 0xbe},
2896 {0xe4, 0xaf, 0x0a, 0xb3, 0x30, 0x8b, 0x9b, 0x48,
2897 0x49, 0x43, 0xc7, 0x64, 0x60, 0x4a, 0x2b, 0x9e,
2898 0x95, 0x5f, 0x56, 0xe8, 0x35, 0xdc, 0xeb, 0xdc,
2899 0xc7, 0xc4, 0xfe, 0x30, 0x40, 0xc7, 0xbf, 0xa4}},
2900 {{0xd4, 0xa0, 0xf5, 0x81, 0x49, 0x6b, 0xb6, 0x8b,
2901 0x0a, 0x69, 0xf9, 0xfe, 0xa8, 0x32, 0xe5, 0xe0,
2902 0xa5, 0xcd, 0x02, 0x53, 0xf9, 0x2c, 0xe3, 0x53,
2903 0x83, 0x36, 0xc6, 0x02, 0xb5, 0xeb, 0x64, 0xb8},
2904 {0x1d, 0x42, 0xb9, 0xf9, 0xe9, 0xe3, 0x93, 0x2c,
2905 0x4c, 0xee, 0x6c, 0x5a, 0x47, 0x9e, 0x62, 0x01,
2906 0x6b, 0x04, 0xfe, 0xa4, 0x30, 0x2b, 0x0d, 0x4f,
2907 0x71, 0x10, 0xd3, 0x55, 0xca, 0xf3, 0x5e, 0x80}},
2908 {{0x77, 0x05, 0xf6, 0x0c, 0x15, 0x9b, 0x45, 0xe7,
2909 0xb9, 0x11, 0xb8, 0xf5, 0xd6, 0xda, 0x73, 0x0c,
2910 0xda, 0x92, 0xea, 0xd0, 0x9d, 0xd0, 0x18, 0x92,
2911 0xce, 0x9a, 0xaa, 0xee, 0x0f, 0xef, 0xde, 0x30},
2912 {0xf1, 0xf1, 0xd6, 0x9b, 0x51, 0xd7, 0x77, 0x62,
2913 0x52, 0x10, 0xb8, 0x7a, 0x84, 0x9d, 0x15, 0x4e,
2914 0x07, 0xdc, 0x1e, 0x75, 0x0d, 0x0c, 0x3b, 0xdb,
2915 0x74, 0x58, 0x62, 0x02, 0x90, 0x54, 0x8b, 0x43}},
2916 {{0xa6, 0xfe, 0x0b, 0x87, 0x80, 0x43, 0x67, 0x25,
2917 0x57, 0x5d, 0xec, 0x40, 0x50, 0x08, 0xd5, 0x5d,
2918 0x43, 0xd7, 0xe0, 0xaa, 0xe0, 0x13, 0xb6, 0xb0,
2919 0xc0, 0xd4, 0xe5, 0x0d, 0x45, 0x83, 0xd6, 0x13},
2920 {0x40, 0x45, 0x0a, 0x92, 0x31, 0xea, 0x8c, 0x60,
2921 0x8c, 0x1f, 0xd8, 0x76, 0x45, 0xb9, 0x29, 0x00,
2922 0x26, 0x32, 0xd8, 0xa6, 0x96, 0x88, 0xe2, 0xc4,
2923 0x8b, 0xdb, 0x7f, 0x17, 0x87, 0xcc, 0xc8, 0xf2}},
2924 {{0xc2, 0x56, 0xe2, 0xb6, 0x1a, 0x81, 0xe7, 0x31,
2925 0x63, 0x2e, 0xbb, 0x0d, 0x2f, 0x81, 0x67, 0xd4,
2926 0x22, 0xe2, 0x38, 0x02, 0x25, 0x97, 0xc7, 0x88,
2927 0x6e, 0xdf, 0xbe, 0x2a, 0xa5, 0x73, 0x63, 0xaa},
2928 {0x50, 0x45, 0xe2, 0xc3, 0xbd, 0x89, 0xfc, 0x57,
2929 0xbd, 0x3c, 0xa3, 0x98, 0x7e, 0x7f, 0x36, 0x38,
2930 0x92, 0x39, 0x1f, 0x0f, 0x81, 0x1a, 0x06, 0x51,
2931 0x1f, 0x8d, 0x6a, 0xff, 0x47, 0x16, 0x06, 0x9c}},
2932 {{0x33, 0x95, 0xa2, 0x6f, 0x27, 0x5f, 0x9c, 0x9c,
2933 0x64, 0x45, 0xcb, 0xd1, 0x3c, 0xee, 0x5e, 0x5f,
2934 0x48, 0xa6, 0xaf, 0xe3, 0x79, 0xcf, 0xb1, 0xe2,
2935 0xbf, 0x55, 0x0e, 0xa2, 0x3b, 0x62, 0xf0, 0xe4},
2936 {0x14, 0xe8, 0x06, 0xe3, 0xbe, 0x7e, 0x67, 0x01,
2937 0xc5, 0x21, 0x67, 0xd8, 0x54, 0xb5, 0x7f, 0xa4,
2938 0xf9, 0x75, 0x70, 0x1c, 0xfd, 0x79, 0xdb, 0x86,
2939 0xad, 0x37, 0x85, 0x83, 0x56, 0x4e, 0xf0, 0xbf}},
2940 {{0xbc, 0xa6, 0xe0, 0x56, 0x4e, 0xef, 0xfa, 0xf5,
2941 0x1d, 0x5d, 0x3f, 0x2a, 0x5b, 0x19, 0xab, 0x51,
2942 0xc5, 0x8b, 0xdd, 0x98, 0x28, 0x35, 0x2f, 0xc3,
2943 0x81, 0x4f, 0x5c, 0xe5, 0x70, 0xb9, 0xeb, 0x62},
2944 {0xc4, 0x6d, 0x26, 0xb0, 0x17, 0x6b, 0xfe, 0x6c,
2945 0x12, 0xf8, 0xe7, 0xc1, 0xf5, 0x2f, 0xfa, 0x91,
2946 0x13, 0x27, 0xbd, 0x73, 0xcc, 0x33, 0x31, 0x1c,
2947 0x39, 0xe3, 0x27, 0x6a, 0x95, 0xcf, 0xc5, 0xfb}},
2948 {{0x30, 0xb2, 0x99, 0x84, 0xf0, 0x18, 0x2a, 0x6e,
2949 0x1e, 0x27, 0xed, 0xa2, 0x29, 0x99, 0x41, 0x56,
2950 0xe8, 0xd4, 0x0d, 0xef, 0x99, 0x9c, 0xf3, 0x58,
2951 0x29, 0x55, 0x1a, 0xc0, 0x68, 0xd6, 0x74, 0xa4},
2952 {0x07, 0x9c, 0xe7, 0xec, 0xf5, 0x36, 0x73, 0x41,
2953 0xa3, 0x1c, 0xe5, 0x93, 0x97, 0x6a, 0xfd, 0xf7,
2954 0x53, 0x18, 0xab, 0xaf, 0xeb, 0x85, 0xbd, 0x92,
2955 0x90, 0xab, 0x3c, 0xbf, 0x30, 0x82, 0xad, 0xf6}},
2956 {{0xc6, 0x87, 0x8a, 0x2a, 0xea, 0xc0, 0xa9, 0xec,
2957 0x6d, 0xd3, 0xdc, 0x32, 0x23, 0xce, 0x62, 0x19,
2958 0xa4, 0x7e, 0xa8, 0xdd, 0x1c, 0x33, 0xae, 0xd3,
2959 0x4f, 0x62, 0x9f, 0x52, 0xe7, 0x65, 0x46, 0xf4},
2960 {0x97, 0x51, 0x27, 0x67, 0x2d, 0xa2, 0x82, 0x87,
2961 0x98, 0xd3, 0xb6, 0x14, 0x7f, 0x51, 0xd3, 0x9a,
2962 0x0b, 0xd0, 0x76, 0x81, 0xb2, 0x4f, 0x58, 0x92,
2963 0xa4, 0x86, 0xa1, 0xa7, 0x09, 0x1d, 0xef, 0x9b}},
2964 {{0xb3, 0x0f, 0x2b, 0x69, 0x0d, 0x06, 0x90, 0x64,
2965 0xbd, 0x43, 0x4c, 0x10, 0xe8, 0x98, 0x1c, 0xa3,
2966 0xe1, 0x68, 0xe9, 0x79, 0x6c, 0x29, 0x51, 0x3f,
2967 0x41, 0xdc, 0xdf, 0x1f, 0xf3, 0x60, 0xbe, 0x33},
2968 {0xa1, 0x5f, 0xf7, 0x1d, 0xb4, 0x3e, 0x9b, 0x3c,
2969 0xe7, 0xbd, 0xb6, 0x06, 0xd5, 0x60, 0x06, 0x6d,
2970 0x50, 0xd2, 0xf4, 0x1a, 0x31, 0x08, 0xf2, 0xea,
2971 0x8e, 0xef, 0x5f, 0x7d, 0xb6, 0xd0, 0xc0, 0x27}},
2972 {{0x62, 0x9a, 0xd9, 0xbb, 0x38, 0x36, 0xce, 0xf7,
2973 0x5d, 0x2f, 0x13, 0xec, 0xc8, 0x2d, 0x02, 0x8a,
2974 0x2e, 0x72, 0xf0, 0xe5, 0x15, 0x9d, 0x72, 0xae,
2975 0xfc, 0xb3, 0x4f, 0x02, 0xea, 0xe1, 0x09, 0xfe},
2976 {0x00, 0x00, 0x00, 0x00, 0xfa, 0x0a, 0x3d, 0xbc,
2977 0xad, 0x16, 0x0c, 0xb6, 0xe7, 0x7c, 0x8b, 0x39,
2978 0x9a, 0x43, 0xbb, 0xe3, 0xc2, 0x55, 0x15, 0x14,
2979 0x75, 0xac, 0x90, 0x9b, 0x7f, 0x9a, 0x92, 0x00}},
2980 {{0x8b, 0xac, 0x70, 0x86, 0x29, 0x8f, 0x00, 0x23,
2981 0x7b, 0x45, 0x30, 0xaa, 0xb8, 0x4c, 0xc7, 0x8d,
2982 0x4e, 0x47, 0x85, 0xc6, 0x19, 0xe3, 0x96, 0xc2,
2983 0x9a, 0xa0, 0x12, 0xed, 0x6f, 0xd7, 0x76, 0x16},
2984 {0x45, 0xaf, 0x7e, 0x33, 0xc7, 0x7f, 0x10, 0x6c,
2985 0x7c, 0x9f, 0x29, 0xc1, 0xa8, 0x7e, 0x15, 0x84,
2986 0xe7, 0x7d, 0xc0, 0x6d, 0xab, 0x71, 0x5d, 0xd0,
2987 0x6b, 0x9f, 0x97, 0xab, 0xcb, 0x51, 0x0c, 0x9f}},
2988 {{0x9e, 0xc3, 0x92, 0xb4, 0x04, 0x9f, 0xc8, 0xbb,
2989 0xdd, 0x9e, 0xc6, 0x05, 0xfd, 0x65, 0xec, 0x94,
2990 0x7f, 0x2c, 0x16, 0xc4, 0x40, 0xac, 0x63, 0x7b,
2991 0x7d, 0xb8, 0x0c, 0xe4, 0x5b, 0xe3, 0xa7, 0x0e},
2992 {0x43, 0xf4, 0x44, 0xe8, 0xcc, 0xc8, 0xd4, 0x54,
2993 0x33, 0x37, 0x50, 0xf2, 0x87, 0x42, 0x2e, 0x00,
2994 0x49, 0x60, 0x62, 0x02, 0xfd, 0x1a, 0x7c, 0xdb,
2995 0x29, 0x6c, 0x6d, 0x54, 0x53, 0x08, 0xd1, 0xc8}},
2996 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2997 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2998 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2999 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
3000 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3001 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3002 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3003 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
3004 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3005 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3006 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3007 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
3008 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3009 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3010 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3011 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}},
3012 {{0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1,
3013 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0,
3014 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59,
3015 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92},
3016 {0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1,
3017 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0,
3018 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59,
3019 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}},
3020 {{0x28, 0x56, 0xac, 0x0e, 0x4f, 0x98, 0x09, 0xf0,
3021 0x49, 0xfa, 0x7f, 0x84, 0xac, 0x7e, 0x50, 0x5b,
3022 0x17, 0x43, 0x14, 0x89, 0x9c, 0x53, 0xa8, 0x94,
3023 0x30, 0xf2, 0x11, 0x4d, 0x92, 0x14, 0x27, 0xe8},
3024 {0x39, 0x7a, 0x84, 0x56, 0x79, 0x9d, 0xec, 0x26,
3025 0x2c, 0x53, 0xc1, 0x94, 0xc9, 0x8d, 0x9e, 0x9d,
3026 0x32, 0x1f, 0xdd, 0x84, 0x04, 0xe8, 0xe2, 0x0a,
3027 0x6b, 0xbe, 0xbb, 0x42, 0x40, 0x67, 0x30, 0x6c}},
3028 {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3029 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
3030 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4,
3031 0x40, 0x2d, 0xa1, 0x73, 0x2f, 0xc9, 0xbe, 0xbd},
3032 {0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1,
3033 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0,
3034 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59,
3035 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}},
3036 {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
3037 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
3038 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
3039 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40},
3040 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3041 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3042 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3043 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}},
3044 {{0x1c, 0xc4, 0xf7, 0xda, 0x0f, 0x65, 0xca, 0x39,
3045 0x70, 0x52, 0x92, 0x8e, 0xc3, 0xc8, 0x15, 0xea,
3046 0x7f, 0x10, 0x9e, 0x77, 0x4b, 0x6e, 0x2d, 0xdf,
3047 0xe8, 0x30, 0x9d, 0xda, 0xe8, 0x9a, 0x65, 0xae},
3048 {0x02, 0xb0, 0x16, 0xb1, 0x1d, 0xc8, 0x57, 0x7b,
3049 0xa2, 0x3a, 0xa2, 0xa3, 0x38, 0x5c, 0x8f, 0xeb,
3050 0x66, 0x37, 0x91, 0xa8, 0x5f, 0xef, 0x04, 0xf6,
3051 0x59, 0x75, 0xe1, 0xee, 0x92, 0xf6, 0x0e, 0x30}},
3052 {{0x8d, 0x76, 0x14, 0xa4, 0x14, 0x06, 0x9f, 0x9a,
3053 0xdf, 0x4a, 0x85, 0xa7, 0x6b, 0xbf, 0x29, 0x6f,
3054 0xbc, 0x34, 0x87, 0x5d, 0xeb, 0xbb, 0x2e, 0xa9,
3055 0xc9, 0x1f, 0x58, 0xd6, 0x9a, 0x82, 0xa0, 0x56},
3056 {0xd4, 0xb9, 0xdb, 0x88, 0x1d, 0x04, 0xe9, 0x93,
3057 0x8d, 0x3f, 0x20, 0xd5, 0x86, 0xa8, 0x83, 0x07,
3058 0xdb, 0x09, 0xd8, 0x22, 0x1f, 0x7f, 0xf1, 0x71,
3059 0xc8, 0xe7, 0x5d, 0x47, 0xaf, 0x8b, 0x72, 0xe9}},
3060 {{0x83, 0xb9, 0x39, 0xb2, 0xa4, 0xdf, 0x46, 0x87,
3061 0xc2, 0xb8, 0xf1, 0xe6, 0x4c, 0xd1, 0xe2, 0xa9,
3062 0xe4, 0x70, 0x30, 0x34, 0xbc, 0x52, 0x7c, 0x55,
3063 0xa6, 0xec, 0x80, 0xa4, 0xe5, 0xd2, 0xdc, 0x73},
3064 {0x08, 0xf1, 0x03, 0xcf, 0x16, 0x73, 0xe8, 0x7d,
3065 0xb6, 0x7e, 0x9b, 0xc0, 0xb4, 0xc2, 0xa5, 0x86,
3066 0x02, 0x77, 0xd5, 0x27, 0x86, 0xa5, 0x15, 0xfb,
3067 0xae, 0x9b, 0x8c, 0xa9, 0xf9, 0xf8, 0xa8, 0x4a}},
3068 {{0x8b, 0x00, 0x49, 0xdb, 0xfa, 0xf0, 0x1b, 0xa2,
3069 0xed, 0x8a, 0x9a, 0x7a, 0x36, 0x78, 0x4a, 0xc7,
3070 0xf7, 0xad, 0x39, 0xd0, 0x6c, 0x65, 0x7a, 0x41,
3071 0xce, 0xd6, 0xd6, 0x4c, 0x20, 0x21, 0x6b, 0xc7},
3072 {0xc6, 0xca, 0x78, 0x1d, 0x32, 0x6c, 0x6c, 0x06,
3073 0x91, 0xf2, 0x1a, 0xe8, 0x43, 0x16, 0xea, 0x04,
3074 0x3c, 0x1f, 0x07, 0x85, 0xf7, 0x09, 0x22, 0x08,
3075 0xba, 0x13, 0xfd, 0x78, 0x1e, 0x3f, 0x6f, 0x62}},
3076 {{0x25, 0x9b, 0x7c, 0xb0, 0xac, 0x72, 0x6f, 0xb2,
3077 0xe3, 0x53, 0x84, 0x7a, 0x1a, 0x9a, 0x98, 0x9b,
3078 0x44, 0xd3, 0x59, 0xd0, 0x8e, 0x57, 0x41, 0x40,
3079 0x78, 0xa7, 0x30, 0x2f, 0x4c, 0x9c, 0xb9, 0x68},
3080 {0xb7, 0x75, 0x03, 0x63, 0x61, 0xc2, 0x48, 0x6e,
3081 0x12, 0x3d, 0xbf, 0x4b, 0x27, 0xdf, 0xb1, 0x7a,
3082 0xff, 0x4e, 0x31, 0x07, 0x83, 0xf4, 0x62, 0x5b,
3083 0x19, 0xa5, 0xac, 0xa0, 0x32, 0x58, 0x0d, 0xa7}},
3084 {{0x43, 0x4f, 0x10, 0xa4, 0xca, 0xdb, 0x38, 0x67,
3085 0xfa, 0xae, 0x96, 0xb5, 0x6d, 0x97, 0xff, 0x1f,
3086 0xb6, 0x83, 0x43, 0xd3, 0xa0, 0x2d, 0x70, 0x7a,
3087 0x64, 0x05, 0x4c, 0xa7, 0xc1, 0xa5, 0x21, 0x51},
3088 {0xe4, 0xf1, 0x23, 0x84, 0xe1, 0xb5, 0x9d, 0xf2,
3089 0xb8, 0x73, 0x8b, 0x45, 0x2b, 0x35, 0x46, 0x38,
3090 0x10, 0x2b, 0x50, 0xf8, 0x8b, 0x35, 0xcd, 0x34,
3091 0xc8, 0x0e, 0xf6, 0xdb, 0x09, 0x35, 0xf0, 0xda}},
3092 {{0xdb, 0x21, 0x5c, 0x8d, 0x83, 0x1d, 0xb3, 0x34,
3093 0xc7, 0x0e, 0x43, 0xa1, 0x58, 0x79, 0x67, 0x13,
3094 0x1e, 0x86, 0x5d, 0x89, 0x63, 0xe6, 0x0a, 0x46,
3095 0x5c, 0x02, 0x97, 0x1b, 0x62, 0x43, 0x86, 0xf5},
3096 {0xdb, 0x21, 0x5c, 0x8d, 0x83, 0x1d, 0xb3, 0x34,
3097 0xc7, 0x0e, 0x43, 0xa1, 0x58, 0x79, 0x67, 0x13,
3098 0x1e, 0x86, 0x5d, 0x89, 0x63, 0xe6, 0x0a, 0x46,
3099 0x5c, 0x02, 0x97, 0x1b, 0x62, 0x43, 0x86, 0xf5}}
3100 };
3101 for (i = 0; i < 33; i++) {
3102 secp256k1_scalar_set_b32(&x, chal[i][0], &overflow);
3103 CHECK(!overflow);
3104 secp256k1_scalar_set_b32(&y, chal[i][1], &overflow);
3105 CHECK(!overflow);
3106 secp256k1_scalar_set_b32(&r1, res[i][0], &overflow);
3107 CHECK(!overflow);
3108 secp256k1_scalar_set_b32(&r2, res[i][1], &overflow);
3109 CHECK(!overflow);
3110 secp256k1_scalar_mul(&z, &x, &y);
3111 CHECK(secp256k1_scalar_eq(&r1, &z));
3112 if (!secp256k1_scalar_is_zero(&y)) {
3113 secp256k1_scalar_inverse(&zz, &y);
3115 CHECK(secp256k1_scalar_eq(&zzv, &zz));
3116 secp256k1_scalar_mul(&z, &z, &zz);
3117 CHECK(secp256k1_scalar_eq(&x, &z));
3118 secp256k1_scalar_mul(&zz, &zz, &y);
3120 }
3121 secp256k1_scalar_mul(&z, &x, &x);
3122 CHECK(secp256k1_scalar_eq(&r2, &z));
3123 }
3124 }
3125}
3126
3127/***** FIELD TESTS *****/
3128
3130 secp256k1_fe r;
3132 if (secp256k1_fe_sqrt(&r, ns)) {
3133 secp256k1_fe_negate(ns, ns, 1);
3134 }
3135}
3136
3137static int fe_equal(const secp256k1_fe *a, const secp256k1_fe *b) {
3138 secp256k1_fe an = *a;
3139 secp256k1_fe bn = *b;
3141 return secp256k1_fe_equal(&an, &bn);
3142}
3143
3145 int i;
3146 secp256k1_fe a, b;
3147 for (i = 0; i < 100 * COUNT; ++i) {
3149 b = a;
3152 CHECK(secp256k1_fe_equal(&a, &b));
3153 }
3154}
3155
3156static void run_field_convert(void) {
3157 static const unsigned char b32[32] = {
3158 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
3159 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
3160 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,
3161 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x40
3162 };
3164 0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL,
3165 0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL
3166 );
3167 static const secp256k1_fe fe = SECP256K1_FE_CONST(
3168 0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL,
3169 0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL
3170 );
3171 secp256k1_fe fe2;
3172 unsigned char b322[32];
3174 /* Check conversions to fe. */
3176 CHECK(secp256k1_fe_equal(&fe, &fe2));
3177 secp256k1_fe_from_storage(&fe2, &fes);
3178 CHECK(secp256k1_fe_equal(&fe, &fe2));
3179 /* Check conversion from fe. */
3180 secp256k1_fe_get_b32(b322, &fe);
3181 CHECK(secp256k1_memcmp_var(b322, b32, 32) == 0);
3182 secp256k1_fe_to_storage(&fes2, &fe);
3183 CHECK(secp256k1_memcmp_var(&fes2, &fes, sizeof(fes)) == 0);
3184}
3185
3186static void run_field_be32_overflow(void) {
3187 {
3188 static const unsigned char zero_overflow[32] = {
3189 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
3190 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
3191 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
3192 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFC, 0x2F,
3193 };
3194 static const unsigned char zero[32] = { 0x00 };
3195 unsigned char out[32];
3196 secp256k1_fe fe;
3197 CHECK(secp256k1_fe_set_b32_limit(&fe, zero_overflow) == 0);
3198 secp256k1_fe_set_b32_mod(&fe, zero_overflow);
3201 CHECK(secp256k1_fe_is_zero(&fe) == 1);
3203 CHECK(secp256k1_memcmp_var(out, zero, 32) == 0);
3204 }
3205 {
3206 static const unsigned char one_overflow[32] = {
3207 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
3208 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
3209 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
3210 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFC, 0x30,
3211 };
3212 static const unsigned char one[32] = {
3213 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3215 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3216 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
3217 };
3218 unsigned char out[32];
3219 secp256k1_fe fe;
3220 CHECK(secp256k1_fe_set_b32_limit(&fe, one_overflow) == 0);
3221 secp256k1_fe_set_b32_mod(&fe, one_overflow);
3225 CHECK(secp256k1_memcmp_var(out, one, 32) == 0);
3226 }
3227 {
3228 static const unsigned char ff_overflow[32] = {
3229 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
3230 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
3231 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
3232 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
3233 };
3234 static const unsigned char ff[32] = {
3235 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3236 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3237 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3238 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xD0,
3239 };
3240 unsigned char out[32];
3241 secp256k1_fe fe;
3242 const secp256k1_fe fe_ff = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0x01, 0x000003d0);
3243 CHECK(secp256k1_fe_set_b32_limit(&fe, ff_overflow) == 0);
3244 secp256k1_fe_set_b32_mod(&fe, ff_overflow);
3246 CHECK(secp256k1_fe_cmp_var(&fe, &fe_ff) == 0);
3248 CHECK(secp256k1_memcmp_var(out, ff, 32) == 0);
3249 }
3250}
3251
3252/* Returns true if two field elements have the same representation. */
3253static int fe_identical(const secp256k1_fe *a, const secp256k1_fe *b) {
3254 int ret = 1;
3255 /* Compare the struct member that holds the limbs. */
3256 ret &= (secp256k1_memcmp_var(a->n, b->n, sizeof(a->n)) == 0);
3257 return ret;
3258}
3259
3260static void run_field_half(void) {
3261 secp256k1_fe t, u;
3262 int m;
3263
3264 /* Check magnitude 0 input */
3267#ifdef VERIFY
3268 CHECK(t.magnitude == 1);
3269 CHECK(t.normalized == 0);
3270#endif
3272
3273 /* Check non-zero magnitudes in the supported range */
3274 for (m = 1; m < 32; m++) {
3275 /* Check max-value input */
3277
3278 u = t;
3280#ifdef VERIFY
3281 CHECK(u.magnitude == (m >> 1) + 1);
3282 CHECK(u.normalized == 0);
3283#endif
3285 secp256k1_fe_add(&u, &u);
3286 CHECK(fe_equal(&t, &u));
3287
3288 /* Check worst-case input: ensure the LSB is 1 so that P will be added,
3289 * which will also cause all carries to be 1, since all limbs that can
3290 * generate a carry are initially even and all limbs of P are odd in
3291 * every existing field implementation. */
3293 CHECK(t.n[0] > 0);
3294 CHECK((t.n[0] & 1) == 0);
3295 --t.n[0];
3296
3297 u = t;
3299#ifdef VERIFY
3300 CHECK(u.magnitude == (m >> 1) + 1);
3301 CHECK(u.normalized == 0);
3302#endif
3304 secp256k1_fe_add(&u, &u);
3305 CHECK(fe_equal(&t, &u));
3306 }
3307}
3308
3309static void run_field_misc(void) {
3310 secp256k1_fe x;
3311 secp256k1_fe y;
3312 secp256k1_fe z;
3313 secp256k1_fe q;
3314 int v;
3315 secp256k1_fe fe5 = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 5);
3316 int i, j;
3317 for (i = 0; i < 1000 * COUNT; i++) {
3318 secp256k1_fe_storage xs, ys, zs;
3319 if (i & 1) {
3321 } else {
3323 }
3325 v = testrand_bits(15);
3326 /* Test that fe_add_int is equivalent to fe_set_int + fe_add. */
3327 secp256k1_fe_set_int_unchecked(&q, v); /* q = v */
3328 z = x; /* z = x */
3329 secp256k1_fe_add(&z, &q); /* z = x+v */
3330 q = x; /* q = x */
3331 secp256k1_fe_add_int(&q, v); /* q = x+v */
3332 CHECK(fe_equal(&q, &z));
3333 /* Test the fe equality and comparison operations. */
3334 CHECK(secp256k1_fe_cmp_var(&x, &x) == 0);
3335 CHECK(secp256k1_fe_equal(&x, &x));
3336 z = x;
3337 secp256k1_fe_add(&z,&y);
3338 /* Test fe conditional move; z is not normalized here. */
3339 q = x;
3340 secp256k1_fe_cmov(&x, &z, 0);
3341#ifdef VERIFY
3342 CHECK(!x.normalized);
3343 CHECK((x.magnitude == q.magnitude) || (x.magnitude == z.magnitude));
3344 CHECK((x.magnitude >= q.magnitude) && (x.magnitude >= z.magnitude));
3345#endif
3346 x = q;
3347 secp256k1_fe_cmov(&x, &x, 1);
3348 CHECK(!fe_identical(&x, &z));
3349 CHECK(fe_identical(&x, &q));
3350 secp256k1_fe_cmov(&q, &z, 1);
3351#ifdef VERIFY
3352 CHECK(!q.normalized);
3353 CHECK((q.magnitude == x.magnitude) || (q.magnitude == z.magnitude));
3354 CHECK((q.magnitude >= x.magnitude) && (q.magnitude >= z.magnitude));
3355#endif
3356 CHECK(fe_identical(&q, &z));
3357 q = z;
3360 CHECK(!secp256k1_fe_equal(&x, &z));
3362 secp256k1_fe_cmov(&q, &z, (i&1));
3363#ifdef VERIFY
3364 CHECK(q.normalized && q.magnitude == 1);
3365#endif
3366 for (j = 0; j < 6; j++) {
3367 secp256k1_fe_negate_unchecked(&z, &z, j+1);
3369 secp256k1_fe_cmov(&q, &z, (j&1));
3370#ifdef VERIFY
3371 CHECK(!q.normalized && q.magnitude == z.magnitude);
3372#endif
3373 }
3375 /* Test storage conversion and conditional moves. */
3376 secp256k1_fe_to_storage(&xs, &x);
3377 secp256k1_fe_to_storage(&ys, &y);
3378 secp256k1_fe_to_storage(&zs, &z);
3379 secp256k1_fe_storage_cmov(&zs, &xs, 0);
3380 secp256k1_fe_storage_cmov(&zs, &zs, 1);
3381 CHECK(secp256k1_memcmp_var(&xs, &zs, sizeof(xs)) != 0);
3382 secp256k1_fe_storage_cmov(&ys, &xs, 1);
3383 CHECK(secp256k1_memcmp_var(&xs, &ys, sizeof(xs)) == 0);
3387 /* Test that mul_int, mul, and add agree. */
3388 secp256k1_fe_add(&y, &x);
3389 secp256k1_fe_add(&y, &x);
3390 z = x;
3391 secp256k1_fe_mul_int(&z, 3);
3392 CHECK(fe_equal(&y, &z));
3393 secp256k1_fe_add(&y, &x);
3394 secp256k1_fe_add(&z, &x);
3395 CHECK(fe_equal(&z, &y));
3396 z = x;
3397 secp256k1_fe_mul_int(&z, 5);
3398 secp256k1_fe_mul(&q, &x, &fe5);
3399 CHECK(fe_equal(&z, &q));
3400 secp256k1_fe_negate(&x, &x, 1);
3401 secp256k1_fe_add(&z, &x);
3402 secp256k1_fe_add(&q, &x);
3403 CHECK(fe_equal(&y, &z));
3404 CHECK(fe_equal(&q, &y));
3405 /* Check secp256k1_fe_half. */
3406 z = x;
3408 secp256k1_fe_add(&z, &z);
3409 CHECK(fe_equal(&x, &z));
3410 secp256k1_fe_add(&z, &z);
3412 CHECK(fe_equal(&x, &z));
3413 }
3414}
3415
3416static void test_fe_mul(const secp256k1_fe* a, const secp256k1_fe* b, int use_sqr)
3417{
3418 secp256k1_fe c, an, bn;
3419 /* Variables in BE 32-byte format. */
3420 unsigned char a32[32], b32[32], c32[32];
3421 /* Variables in LE 16x uint16_t format. */
3422 uint16_t a16[16], b16[16], c16[16];
3423 /* Field modulus in LE 16x uint16_t format. */
3424 static const uint16_t m16[16] = {
3425 0xfc2f, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
3426 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
3427 };
3428 uint16_t t16[32];
3429 int i;
3430
3431 /* Compute C = A * B in fe format. */
3432 c = *a;
3433 if (use_sqr) {
3434 secp256k1_fe_sqr(&c, &c);
3435 } else {
3436 secp256k1_fe_mul(&c, &c, b);
3437 }
3438
3439 /* Convert A, B, C into LE 16x uint16_t format. */
3440 an = *a;
3441 bn = *b;
3445 secp256k1_fe_get_b32(a32, &an);
3446 secp256k1_fe_get_b32(b32, &bn);
3447 secp256k1_fe_get_b32(c32, &c);
3448 for (i = 0; i < 16; ++i) {
3449 a16[i] = a32[31 - 2*i] + ((uint16_t)a32[30 - 2*i] << 8);
3450 b16[i] = b32[31 - 2*i] + ((uint16_t)b32[30 - 2*i] << 8);
3451 c16[i] = c32[31 - 2*i] + ((uint16_t)c32[30 - 2*i] << 8);
3452 }
3453 /* Compute T = A * B in LE 16x uint16_t format. */
3454 mulmod256(t16, a16, b16, m16);
3455 /* Compare */
3456 CHECK(secp256k1_memcmp_var(t16, c16, 32) == 0);
3457}
3458
3459static void run_fe_mul(void) {
3460 int i;
3461 for (i = 0; i < 100 * COUNT; ++i) {
3462 secp256k1_fe a, b, c, d;
3471 test_fe_mul(&a, &a, 1);
3472 test_fe_mul(&c, &c, 1);
3473 test_fe_mul(&a, &b, 0);
3474 test_fe_mul(&a, &c, 0);
3475 test_fe_mul(&c, &b, 0);
3476 test_fe_mul(&c, &d, 0);
3477 }
3478}
3479
3480static void run_sqr(void) {
3481 int i;
3482 secp256k1_fe x, y, lhs, rhs, tmp;
3483
3484 secp256k1_fe_set_int(&x, 1);
3485 secp256k1_fe_negate(&x, &x, 1);
3486
3487 for (i = 1; i <= 512; ++i) {
3488 secp256k1_fe_mul_int(&x, 2);
3490
3491 /* Check that (x+y)*(x-y) = x^2 - y*2 for some random values y */
3493
3494 lhs = x;
3495 secp256k1_fe_add(&lhs, &y); /* lhs = x+y */
3496 secp256k1_fe_negate(&tmp, &y, 1); /* tmp = -y */
3497 secp256k1_fe_add(&tmp, &x); /* tmp = x-y */
3498 secp256k1_fe_mul(&lhs, &lhs, &tmp); /* lhs = (x+y)*(x-y) */
3499
3500 secp256k1_fe_sqr(&rhs, &x); /* rhs = x^2 */
3501 secp256k1_fe_sqr(&tmp, &y); /* tmp = y^2 */
3502 secp256k1_fe_negate(&tmp, &tmp, 1); /* tmp = -y^2 */
3503 secp256k1_fe_add(&rhs, &tmp); /* rhs = x^2 - y^2 */
3504
3505 CHECK(fe_equal(&lhs, &rhs));
3506 }
3507}
3508
3509static void test_sqrt(const secp256k1_fe *a, const secp256k1_fe *k) {
3510 secp256k1_fe r1, r2;
3511 int v = secp256k1_fe_sqrt(&r1, a);
3512 CHECK((v == 0) == (k == NULL));
3513
3514 if (k != NULL) {
3515 /* Check that the returned root is +/- the given known answer */
3516 secp256k1_fe_negate(&r2, &r1, 1);
3517 secp256k1_fe_add(&r1, k); secp256k1_fe_add(&r2, k);
3520 }
3521}
3522
3523static void run_sqrt(void) {
3524 secp256k1_fe ns, x, s, t;
3525 int i;
3526
3527 /* Check sqrt(0) is 0 */
3528 secp256k1_fe_set_int(&x, 0);
3529 secp256k1_fe_sqr(&s, &x);
3530 test_sqrt(&s, &x);
3531
3532 /* Check sqrt of small squares (and their negatives) */
3533 for (i = 1; i <= 100; i++) {
3535 secp256k1_fe_sqr(&s, &x);
3536 test_sqrt(&s, &x);
3537 secp256k1_fe_negate(&t, &s, 1);
3538 test_sqrt(&t, NULL);
3539 }
3540
3541 /* Consistency checks for large random values */
3542 for (i = 0; i < 10; i++) {
3543 int j;
3545 for (j = 0; j < COUNT; j++) {
3547 secp256k1_fe_sqr(&s, &x);
3549 test_sqrt(&s, &x);
3550 secp256k1_fe_negate(&t, &s, 1);
3552 test_sqrt(&t, NULL);
3553 secp256k1_fe_mul(&t, &s, &ns);
3554 test_sqrt(&t, NULL);
3555 }
3556 }
3557}
3558
3559/***** FIELD/SCALAR INVERSE TESTS *****/
3560
3562 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFE,
3563 0xBAAEDCE6, 0xAF48A03B, 0xBFD25E8C, 0xD0364140
3564);
3565
3567 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
3568 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFC2E
3569);
3570
3571/* These tests test the following identities:
3572 *
3573 * for x==0: 1/x == 0
3574 * for x!=0: x*(1/x) == 1
3575 * for x!=0 and x!=1: 1/(1/x - 1) + 1 == -1/(x-1)
3576 */
3577
3579{
3580 secp256k1_scalar l, r, t;
3581
3582 (var ? secp256k1_scalar_inverse_var : secp256k1_scalar_inverse)(&l, x); /* l = 1/x */
3583 if (out) *out = l;
3584 if (secp256k1_scalar_is_zero(x)) {
3586 return;
3587 }
3588 secp256k1_scalar_mul(&t, x, &l); /* t = x*(1/x) */
3589 CHECK(secp256k1_scalar_is_one(&t)); /* x*(1/x) == 1 */
3590 secp256k1_scalar_add(&r, x, &scalar_minus_one); /* r = x-1 */
3591 if (secp256k1_scalar_is_zero(&r)) return;
3592 (var ? secp256k1_scalar_inverse_var : secp256k1_scalar_inverse)(&r, &r); /* r = 1/(x-1) */
3593 secp256k1_scalar_add(&l, &scalar_minus_one, &l); /* l = 1/x-1 */
3594 (var ? secp256k1_scalar_inverse_var : secp256k1_scalar_inverse)(&l, &l); /* l = 1/(1/x-1) */
3595 secp256k1_scalar_add(&l, &l, &secp256k1_scalar_one); /* l = 1/(1/x-1)+1 */
3596 secp256k1_scalar_add(&l, &r, &l); /* l = 1/(1/x-1)+1 + 1/(x-1) */
3597 CHECK(secp256k1_scalar_is_zero(&l)); /* l == 0 */
3598}
3599
3600static void test_inverse_field(secp256k1_fe* out, const secp256k1_fe* x, int var)
3601{
3602 secp256k1_fe l, r, t;
3603
3604 (var ? secp256k1_fe_inv_var : secp256k1_fe_inv)(&l, x) ; /* l = 1/x */
3605 if (out) *out = l;
3606 t = *x; /* t = x */
3609 return;
3610 }
3611 secp256k1_fe_mul(&t, x, &l); /* t = x*(1/x) */
3612 secp256k1_fe_add(&t, &fe_minus_one); /* t = x*(1/x)-1 */
3613 CHECK(secp256k1_fe_normalizes_to_zero(&t)); /* x*(1/x)-1 == 0 */
3614 r = *x; /* r = x */
3615 secp256k1_fe_add(&r, &fe_minus_one); /* r = x-1 */
3617 (var ? secp256k1_fe_inv_var : secp256k1_fe_inv)(&r, &r); /* r = 1/(x-1) */
3618 secp256k1_fe_add(&l, &fe_minus_one); /* l = 1/x-1 */
3619 (var ? secp256k1_fe_inv_var : secp256k1_fe_inv)(&l, &l); /* l = 1/(1/x-1) */
3620 secp256k1_fe_add_int(&l, 1); /* l = 1/(1/x-1)+1 */
3621 secp256k1_fe_add(&l, &r); /* l = 1/(1/x-1)+1 + 1/(x-1) */
3623}
3624
3625static void run_inverse_tests(void)
3626{
3627 /* Fixed test cases for field inverses: pairs of (x, 1/x) mod p. */
3628 static const secp256k1_fe fe_cases[][2] = {
3629 /* 0 */
3630 {SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0),
3631 SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0)},
3632 /* 1 */
3633 {SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1),
3634 SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1)},
3635 /* -1 */
3636 {SECP256K1_FE_CONST(0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfffffffe, 0xfffffc2e),
3637 SECP256K1_FE_CONST(0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfffffffe, 0xfffffc2e)},
3638 /* 2 */
3639 {SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 2),
3640 SECP256K1_FE_CONST(0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x7ffffe18)},
3641 /* 2**128 */
3642 {SECP256K1_FE_CONST(0, 0, 0, 1, 0, 0, 0, 0),
3643 SECP256K1_FE_CONST(0xbcb223fe, 0xdc24a059, 0xd838091d, 0xd2253530, 0xffffffff, 0xffffffff, 0xffffffff, 0x434dd931)},
3644 /* Input known to need 637 divsteps */
3645 {SECP256K1_FE_CONST(0xe34e9c95, 0x6bee8a84, 0x0dcb632a, 0xdb8a1320, 0x66885408, 0x06f3f996, 0x7c11ca84, 0x19199ec3),
3646 SECP256K1_FE_CONST(0xbd2cbd8f, 0x1c536828, 0x9bccda44, 0x2582ac0c, 0x870152b0, 0x8a3f09fb, 0x1aaadf92, 0x19b618e5)},
3647 /* Input known to need 567 divsteps starting with delta=1/2. */
3648 {SECP256K1_FE_CONST(0xf6bc3ba3, 0x636451c4, 0x3e46357d, 0x2c21d619, 0x0988e234, 0x15985661, 0x6672982b, 0xa7549bfc),
3649 SECP256K1_FE_CONST(0xb024fdc7, 0x5547451e, 0x426c585f, 0xbd481425, 0x73df6b75, 0xeef6d9d0, 0x389d87d4, 0xfbb440ba)},
3650 /* Input known to need 566 divsteps starting with delta=1/2. */
3651 {SECP256K1_FE_CONST(0xb595d81b, 0x2e3c1e2f, 0x482dbc65, 0xe4865af7, 0x9a0a50aa, 0x29f9e618, 0x6f87d7a5, 0x8d1063ae),
3652 SECP256K1_FE_CONST(0xc983337c, 0x5d5c74e1, 0x49918330, 0x0b53afb5, 0xa0428a0b, 0xce6eef86, 0x059bd8ef, 0xe5b908de)},
3653 /* Set of 10 inputs accessing all 128 entries in the modinv32 divsteps_var table */
3654 {SECP256K1_FE_CONST(0x00000000, 0x00000000, 0xe0ff1f80, 0x1f000000, 0x00000000, 0x00000000, 0xfeff0100, 0x00000000),
3655 SECP256K1_FE_CONST(0x9faf9316, 0x77e5049d, 0x0b5e7a1b, 0xef70b893, 0x18c9e30c, 0x045e7fd7, 0x29eddf8c, 0xd62e9e3d)},
3656 {SECP256K1_FE_CONST(0x621a538d, 0x511b2780, 0x35688252, 0x53f889a4, 0x6317c3ac, 0x32ba0a46, 0x6277c0d1, 0xccd31192),
3657 SECP256K1_FE_CONST(0x38513b0c, 0x5eba856f, 0xe29e882e, 0x9b394d8c, 0x34bda011, 0xeaa66943, 0x6a841a4c, 0x6ae8bcff)},
3658 {SECP256K1_FE_CONST(0x00000200, 0xf0ffff1f, 0x00000000, 0x0000e0ff, 0xffffffff, 0xfffcffff, 0xffffffff, 0xffff0100),
3659 SECP256K1_FE_CONST(0x5da42a52, 0x3640de9e, 0x13e64343, 0x0c7591b7, 0x6c1e3519, 0xf048c5b6, 0x0484217c, 0xedbf8b2f)},
3660 {SECP256K1_FE_CONST(0xd1343ef9, 0x4b952621, 0x7c52a2ee, 0x4ea1281b, 0x4ab46410, 0x9f26998d, 0xa686a8ff, 0x9f2103e8),
3661 SECP256K1_FE_CONST(0x84044385, 0x9a4619bf, 0x74e35b6d, 0xa47e0c46, 0x6b7fb47d, 0x9ffab128, 0xb0775aa3, 0xcb318bd1)},
3662 {SECP256K1_FE_CONST(0xb27235d2, 0xc56a52be, 0x210db37a, 0xd50d23a4, 0xbe621bdd, 0x5df22c6a, 0xe926ba62, 0xd2e4e440),
3663 SECP256K1_FE_CONST(0x67a26e54, 0x483a9d3c, 0xa568469e, 0xd258ab3d, 0xb9ec9981, 0xdca9b1bd, 0x8d2775fe, 0x53ae429b)},
3664 {SECP256K1_FE_CONST(0x00000000, 0x00000000, 0x00e0ffff, 0xffffff83, 0xffffffff, 0x3f00f00f, 0x000000e0, 0xffffffff),
3665 SECP256K1_FE_CONST(0x310e10f8, 0x23bbfab0, 0xac94907d, 0x076c9a45, 0x8d357d7f, 0xc763bcee, 0x00d0e615, 0x5a6acef6)},
3666 {SECP256K1_FE_CONST(0xfeff0300, 0x001c0000, 0xf80700c0, 0x0ff0ffff, 0xffffffff, 0x0fffffff, 0xffff0100, 0x7f0000fe),
3667 SECP256K1_FE_CONST(0x28e2fdb4, 0x0709168b, 0x86f598b0, 0x3453a370, 0x530cf21f, 0x32f978d5, 0x1d527a71, 0x59269b0c)},
3668 {SECP256K1_FE_CONST(0xc2591afa, 0x7bb98ef7, 0x090bb273, 0x85c14f87, 0xbb0b28e0, 0x54d3c453, 0x85c66753, 0xd5574d2f),
3669 SECP256K1_FE_CONST(0xfdca70a2, 0x70ce627c, 0x95e66fae, 0x848a6dbb, 0x07ffb15c, 0x5f63a058, 0xba4140ed, 0x6113b503)},
3670 {SECP256K1_FE_CONST(0xf5475db3, 0xedc7b5a3, 0x411c047e, 0xeaeb452f, 0xc625828e, 0x1cf5ad27, 0x8eec1060, 0xc7d3e690),
3671 SECP256K1_FE_CONST(0x5eb756c0, 0xf963f4b9, 0xdc6a215e, 0xec8cc2d8, 0x2e9dec01, 0xde5eb88d, 0x6aba7164, 0xaecb2c5a)},
3672 {SECP256K1_FE_CONST(0x00000000, 0x00f8ffff, 0xffffffff, 0x01000000, 0xe0ff1f00, 0x00000000, 0xffffff7f, 0x00000000),
3673 SECP256K1_FE_CONST(0xe0d2e3d8, 0x49b6157d, 0xe54e88c2, 0x1a7f02ca, 0x7dd28167, 0xf1125d81, 0x7bfa444e, 0xbe110037)},
3674 /* Selection of randomly generated inputs that reach high/low d/e values in various configurations. */
3675 {SECP256K1_FE_CONST(0x13cc08a4, 0xd8c41f0f, 0x179c3e67, 0x54c46c67, 0xc4109221, 0x09ab3b13, 0xe24d9be1, 0xffffe950),
3676 SECP256K1_FE_CONST(0xb80c8006, 0xd16abaa7, 0xcabd71e5, 0xcf6714f4, 0x966dd3d0, 0x64767a2d, 0xe92c4441, 0x51008cd1)},
3677 {SECP256K1_FE_CONST(0xaa6db990, 0x95efbca1, 0x3cc6ff71, 0x0602e24a, 0xf49ff938, 0x99fffc16, 0x46f40993, 0xc6e72057),
3678 SECP256K1_FE_CONST(0xd5d3dd69, 0xb0c195e5, 0x285f1d49, 0xe639e48c, 0x9223f8a9, 0xca1d731d, 0x9ca482f9, 0xa5b93e06)},
3679 {SECP256K1_FE_CONST(0x1c680eac, 0xaeabffd8, 0x9bdc4aee, 0x1781e3de, 0xa3b08108, 0x0015f2e0, 0x94449e1b, 0x2f67a058),
3680 SECP256K1_FE_CONST(0x7f083f8d, 0x31254f29, 0x6510f475, 0x245c373d, 0xc5622590, 0x4b323393, 0x32ed1719, 0xc127444b)},
3681 {SECP256K1_FE_CONST(0x147d44b3, 0x012d83f8, 0xc160d386, 0x1a44a870, 0x9ba6be96, 0x8b962707, 0x267cbc1a, 0xb65b2f0a),
3682 SECP256K1_FE_CONST(0x555554ff, 0x170aef1e, 0x50a43002, 0xe51fbd36, 0xafadb458, 0x7a8aded1, 0x0ca6cd33, 0x6ed9087c)},
3683 {SECP256K1_FE_CONST(0x12423796, 0x22f0fe61, 0xf9ca017c, 0x5384d107, 0xa1fbf3b2, 0x3b018013, 0x916a3c37, 0x4000b98c),
3684 SECP256K1_FE_CONST(0x20257700, 0x08668f94, 0x1177e306, 0x136c01f5, 0x8ed1fbd2, 0x95ec4589, 0xae38edb9, 0xfd19b6d7)},
3685 {SECP256K1_FE_CONST(0xdcf2d030, 0x9ab42cb4, 0x93ffa181, 0xdcd23619, 0x39699b52, 0x08909a20, 0xb5a17695, 0x3a9dcf21),
3686 SECP256K1_FE_CONST(0x1f701dea, 0xe211fb1f, 0x4f37180d, 0x63a0f51c, 0x29fe1e40, 0xa40b6142, 0x2e7b12eb, 0x982b06b6)},
3687 {SECP256K1_FE_CONST(0x79a851f6, 0xa6314ed3, 0xb35a55e6, 0xca1c7d7f, 0xe32369ea, 0xf902432e, 0x375308c5, 0xdfd5b600),
3688 SECP256K1_FE_CONST(0xcaae00c5, 0xe6b43851, 0x9dabb737, 0x38cba42c, 0xa02c8549, 0x7895dcbf, 0xbd183d71, 0xafe4476a)},
3689 {SECP256K1_FE_CONST(0xede78fdd, 0xcfc92bf1, 0x4fec6c6c, 0xdb8d37e2, 0xfb66bc7b, 0x28701870, 0x7fa27c9a, 0x307196ec),
3690 SECP256K1_FE_CONST(0x68193a6c, 0x9a8b87a7, 0x2a760c64, 0x13e473f6, 0x23ae7bed, 0x1de05422, 0x88865427, 0xa3418265)},
3691 {SECP256K1_FE_CONST(0xa40b2079, 0xb8f88e89, 0xa7617997, 0x89baf5ae, 0x174df343, 0x75138eae, 0x2711595d, 0x3fc3e66c),
3692 SECP256K1_FE_CONST(0x9f99c6a5, 0x6d685267, 0xd4b87c37, 0x9d9c4576, 0x358c692b, 0x6bbae0ed, 0x3389c93d, 0x7fdd2655)},
3693 {SECP256K1_FE_CONST(0x7c74c6b6, 0xe98d9151, 0x72645cf1, 0x7f06e321, 0xcefee074, 0x15b2113a, 0x10a9be07, 0x08a45696),
3694 SECP256K1_FE_CONST(0x8c919a88, 0x898bc1e0, 0x77f26f97, 0x12e655b7, 0x9ba0ac40, 0xe15bb19e, 0x8364cc3b, 0xe227a8ee)},
3695 {SECP256K1_FE_CONST(0x109ba1ce, 0xdafa6d4a, 0xa1cec2b2, 0xeb1069f4, 0xb7a79e5b, 0xec6eb99b, 0xaec5f643, 0xee0e723e),
3696 SECP256K1_FE_CONST(0x93d13eb8, 0x4bb0bcf9, 0xe64f5a71, 0xdbe9f359, 0x7191401c, 0x6f057a4a, 0xa407fe1b, 0x7ecb65cc)},
3697 {SECP256K1_FE_CONST(0x3db076cd, 0xec74a5c9, 0xf61dd138, 0x90e23e06, 0xeeedd2d0, 0x74cbc4e0, 0x3dbe1e91, 0xded36a78),
3698 SECP256K1_FE_CONST(0x3f07f966, 0x8e2a1e09, 0x706c71df, 0x02b5e9d5, 0xcb92ddbf, 0xcdd53010, 0x16545564, 0xe660b107)},
3699 {SECP256K1_FE_CONST(0xe31c73ed, 0xb4c4b82c, 0x02ae35f7, 0x4cdec153, 0x98b522fd, 0xf7d2460c, 0x6bf7c0f8, 0x4cf67b0d),
3700 SECP256K1_FE_CONST(0x4b8f1faf, 0x94e8b070, 0x19af0ff6, 0xa319cd31, 0xdf0a7ffb, 0xefaba629, 0x59c50666, 0x1fe5b843)},
3701 {SECP256K1_FE_CONST(0x4c8b0e6e, 0x83392ab6, 0xc0e3e9f1, 0xbbd85497, 0x16698897, 0xf552d50d, 0x79652ddb, 0x12f99870),
3702 SECP256K1_FE_CONST(0x56d5101f, 0xd23b7949, 0x17dc38d6, 0xf24022ef, 0xcf18e70a, 0x5cc34424, 0x438544c3, 0x62da4bca)},
3703 {SECP256K1_FE_CONST(0xb0e040e2, 0x40cc35da, 0x7dd5c611, 0x7fccb178, 0x28888137, 0xbc930358, 0xea2cbc90, 0x775417dc),
3704 SECP256K1_FE_CONST(0xca37f0d4, 0x016dd7c8, 0xab3ae576, 0x96e08d69, 0x68ed9155, 0xa9b44270, 0x900ae35d, 0x7c7800cd)},
3705 {SECP256K1_FE_CONST(0x8a32ea49, 0x7fbb0bae, 0x69724a9d, 0x8e2105b2, 0xbdf69178, 0x862577ef, 0x35055590, 0x667ddaef),
3706 SECP256K1_FE_CONST(0xd02d7ead, 0xc5e190f0, 0x559c9d72, 0xdaef1ffc, 0x64f9f425, 0xf43645ea, 0x7341e08d, 0x11768e96)},
3707 {SECP256K1_FE_CONST(0xa3592d98, 0x9abe289d, 0x579ebea6, 0xbb0857a8, 0xe242ab73, 0x85f9a2ce, 0xb6998f0f, 0xbfffbfc6),
3708 SECP256K1_FE_CONST(0x093c1533, 0x32032efa, 0x6aa46070, 0x0039599e, 0x589c35f4, 0xff525430, 0x7fe3777a, 0x44b43ddc)},
3709 {SECP256K1_FE_CONST(0x647178a3, 0x229e607b, 0xcc98521a, 0xcce3fdd9, 0x1e1bc9c9, 0x97fb7c6a, 0x61b961e0, 0x99b10709),
3710 SECP256K1_FE_CONST(0x98217c13, 0xd51ddf78, 0x96310e77, 0xdaebd908, 0x602ca683, 0xcb46d07a, 0xa1fcf17e, 0xc8e2feb3)},
3711 {SECP256K1_FE_CONST(0x7334627c, 0x73f98968, 0x99464b4b, 0xf5964958, 0x1b95870d, 0xc658227e, 0x5e3235d8, 0xdcab5787),
3712 SECP256K1_FE_CONST(0x000006fd, 0xc7e9dd94, 0x40ae367a, 0xe51d495c, 0x07603b9b, 0x2d088418, 0x6cc5c74c, 0x98514307)},
3713 {SECP256K1_FE_CONST(0x82e83876, 0x96c28938, 0xa50dd1c5, 0x605c3ad1, 0xc048637d, 0x7a50825f, 0x335ed01a, 0x00005760),
3714 SECP256K1_FE_CONST(0xb0393f9f, 0x9f2aa55e, 0xf5607e2e, 0x5287d961, 0x60b3e704, 0xf3e16e80, 0xb4f9a3ea, 0xfec7f02d)},
3715 {SECP256K1_FE_CONST(0xc97b6cec, 0x3ee6b8dc, 0x98d24b58, 0x3c1970a1, 0xfe06297a, 0xae813529, 0xe76bb6bd, 0x771ae51d),
3716 SECP256K1_FE_CONST(0x0507c702, 0xd407d097, 0x47ddeb06, 0xf6625419, 0x79f48f79, 0x7bf80d0b, 0xfc34b364, 0x253a5db1)},
3717 {SECP256K1_FE_CONST(0xd559af63, 0x77ea9bc4, 0x3cf1ad14, 0x5c7a4bbb, 0x10e7d18b, 0x7ce0dfac, 0x380bb19d, 0x0bb99bd3),
3718 SECP256K1_FE_CONST(0x00196119, 0xb9b00d92, 0x34edfdb5, 0xbbdc42fc, 0xd2daa33a, 0x163356ca, 0xaa8754c8, 0xb0ec8b0b)},
3719 {SECP256K1_FE_CONST(0x8ddfa3dc, 0x52918da0, 0x640519dc, 0x0af8512a, 0xca2d33b2, 0xbde52514, 0xda9c0afc, 0xcb29fce4),
3720 SECP256K1_FE_CONST(0xb3e4878d, 0x5cb69148, 0xcd54388b, 0xc23acce0, 0x62518ba8, 0xf09def92, 0x7b31e6aa, 0x6ba35b02)},
3721 {SECP256K1_FE_CONST(0xf8207492, 0xe3049f0a, 0x65285f2b, 0x0bfff996, 0x00ca112e, 0xc05da837, 0x546d41f9, 0x5194fb91),
3722 SECP256K1_FE_CONST(0x7b7ee50b, 0xa8ed4bbd, 0xf6469930, 0x81419a5c, 0x071441c7, 0x290d046e, 0x3b82ea41, 0x611c5f95)},
3723 {SECP256K1_FE_CONST(0x050f7c80, 0x5bcd3c6b, 0x823cb724, 0x5ce74db7, 0xa4e39f5c, 0xbd8828d7, 0xfd4d3e07, 0x3ec2926a),
3724 SECP256K1_FE_CONST(0x000d6730, 0xb0171314, 0x4764053d, 0xee157117, 0x48fd61da, 0xdea0b9db, 0x1d5e91c6, 0xbdc3f59e)},
3725 {SECP256K1_FE_CONST(0x3e3ea8eb, 0x05d760cf, 0x23009263, 0xb3cb3ac9, 0x088f6f0d, 0x3fc182a3, 0xbd57087c, 0xe67c62f9),
3726 SECP256K1_FE_CONST(0xbe988716, 0xa29c1bf6, 0x4456aed6, 0xab1e4720, 0x49929305, 0x51043bf4, 0xebd833dd, 0xdd511e8b)},
3727 {SECP256K1_FE_CONST(0x6964d2a9, 0xa7fa6501, 0xa5959249, 0x142f4029, 0xea0c1b5f, 0x2f487ef6, 0x301ac80a, 0x768be5cd),
3728 SECP256K1_FE_CONST(0x3918ffe4, 0x07492543, 0xed24d0b7, 0x3df95f8f, 0xaffd7cb4, 0x0de2191c, 0x9ec2f2ad, 0x2c0cb3c6)},
3729 {SECP256K1_FE_CONST(0x37c93520, 0xf6ddca57, 0x2b42fd5e, 0xb5c7e4de, 0x11b5b81c, 0xb95e91f3, 0x95c4d156, 0x39877ccb),
3730 SECP256K1_FE_CONST(0x9a94b9b5, 0x57eb71ee, 0x4c975b8b, 0xac5262a8, 0x077b0595, 0xe12a6b1f, 0xd728edef, 0x1a6bf956)}
3731 };
3732 /* Fixed test cases for scalar inverses: pairs of (x, 1/x) mod n. */
3733 static const secp256k1_scalar scalar_cases[][2] = {
3734 /* 0 */
3735 {SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0),
3736 SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0)},
3737 /* 1 */
3738 {SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1),
3739 SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1)},
3740 /* -1 */
3741 {SECP256K1_SCALAR_CONST(0xffffffff, 0xffffffff, 0xffffffff, 0xfffffffe, 0xbaaedce6, 0xaf48a03b, 0xbfd25e8c, 0xd0364140),
3742 SECP256K1_SCALAR_CONST(0xffffffff, 0xffffffff, 0xffffffff, 0xfffffffe, 0xbaaedce6, 0xaf48a03b, 0xbfd25e8c, 0xd0364140)},
3743 /* 2 */
3744 {SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 2),
3745 SECP256K1_SCALAR_CONST(0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x5d576e73, 0x57a4501d, 0xdfe92f46, 0x681b20a1)},
3746 /* 2**128 */
3747 {SECP256K1_SCALAR_CONST(0, 0, 0, 1, 0, 0, 0, 0),
3748 SECP256K1_SCALAR_CONST(0x50a51ac8, 0x34b9ec24, 0x4b0dff66, 0x5588b13e, 0x9984d5b3, 0xcf80ef0f, 0xd6a23766, 0xa3ee9f22)},
3749 /* Input known to need 635 divsteps */
3750 {SECP256K1_SCALAR_CONST(0xcb9f1d35, 0xdd4416c2, 0xcd71bf3f, 0x6365da66, 0x3c9b3376, 0x8feb7ae9, 0x32a5ef60, 0x19199ec3),
3751 SECP256K1_SCALAR_CONST(0x1d7c7bba, 0xf1893d53, 0xb834bd09, 0x36b411dc, 0x42c2e42f, 0xec72c428, 0x5e189791, 0x8e9bc708)},
3752 /* Input known to need 566 divsteps starting with delta=1/2. */
3753 {SECP256K1_SCALAR_CONST(0x7e3c993d, 0xa4272488, 0xbc015b49, 0x2db54174, 0xd382083a, 0xebe6db35, 0x80f82eff, 0xcd132c72),
3754 SECP256K1_SCALAR_CONST(0x086f34a0, 0x3e631f76, 0x77418f28, 0xcc84ac95, 0x6304439d, 0x365db268, 0x312c6ded, 0xd0b934f8)},
3755 /* Input known to need 565 divsteps starting with delta=1/2. */
3756 {SECP256K1_SCALAR_CONST(0xbad7e587, 0x3f307859, 0x60d93147, 0x8a18491e, 0xb38a9fd5, 0x254350d3, 0x4b1f0e4b, 0x7dd6edc4),
3757 SECP256K1_SCALAR_CONST(0x89f2df26, 0x39e2b041, 0xf19bd876, 0xd039c8ac, 0xc2223add, 0x29c4943e, 0x6632d908, 0x515f467b)},
3758 /* Selection of randomly generated inputs that reach low/high d/e values in various configurations. */
3759 {SECP256K1_SCALAR_CONST(0x1950d757, 0xb37a5809, 0x435059bb, 0x0bb8997e, 0x07e1e3c8, 0x5e5d7d2c, 0x6a0ed8e3, 0xdbde180e),
3760 SECP256K1_SCALAR_CONST(0xbf72af9b, 0x750309e2, 0x8dda230b, 0xfe432b93, 0x7e25e475, 0x4388251e, 0x633d894b, 0x3bcb6f8c)},
3761 {SECP256K1_SCALAR_CONST(0x9bccf4e7, 0xc5a515e3, 0x50637aa9, 0xbb65a13f, 0x391749a1, 0x62de7d4e, 0xf6d7eabb, 0x3cd10ce0),
3762 SECP256K1_SCALAR_CONST(0xaf2d5623, 0xb6385a33, 0xcd0365be, 0x5e92a70d, 0x7f09179c, 0x3baaf30f, 0x8f9cc83b, 0x20092f67)},
3763 {SECP256K1_SCALAR_CONST(0x73a57111, 0xb242952a, 0x5c5dee59, 0xf3be2ace, 0xa30a7659, 0xa46e5f47, 0xd21267b1, 0x39e642c9),
3764 SECP256K1_SCALAR_CONST(0xa711df07, 0xcbcf13ef, 0xd61cc6be, 0xbcd058ce, 0xb02cf157, 0x272d4a18, 0x86d0feb3, 0xcd5fa004)},
3765 {SECP256K1_SCALAR_CONST(0x04884963, 0xce0580b1, 0xba547030, 0x3c691db3, 0x9cd2c84f, 0x24c7cebd, 0x97ebfdba, 0x3e785ec2),
3766 SECP256K1_SCALAR_CONST(0xaaaaaf14, 0xd7c99ba7, 0x517ce2c1, 0x78a28b4c, 0x3769a851, 0xe5c5a03d, 0x4cc28f33, 0x0ec4dc5d)},
3767 {SECP256K1_SCALAR_CONST(0x1679ed49, 0x21f537b1, 0x815cb8ae, 0x9efc511c, 0x5b9fa037, 0x0b0f275e, 0x6c985281, 0x6c4a9905),
3768 SECP256K1_SCALAR_CONST(0xb14ac3d5, 0x62b52999, 0xef34ead1, 0xffca4998, 0x0294341a, 0x1f8172aa, 0xea1624f9, 0x302eea62)},
3769 {SECP256K1_SCALAR_CONST(0x626b37c0, 0xf0057c35, 0xee982f83, 0x452a1fd3, 0xea826506, 0x48b08a9d, 0x1d2c4799, 0x4ad5f6ec),
3770 SECP256K1_SCALAR_CONST(0xe38643b7, 0x567bfc2f, 0x5d2f1c15, 0xe327239c, 0x07112443, 0x69509283, 0xfd98e77a, 0xdb71c1e8)},
3771 {SECP256K1_SCALAR_CONST(0x1850a3a7, 0x759efc56, 0x54f287b2, 0x14d1234b, 0xe263bbc9, 0xcf4d8927, 0xd5f85f27, 0x965bd816),
3772 SECP256K1_SCALAR_CONST(0x3b071831, 0xcac9619a, 0xcceb0596, 0xf614d63b, 0x95d0db2f, 0xc6a00901, 0x8eaa2621, 0xabfa0009)},
3773 {SECP256K1_SCALAR_CONST(0x94ae5d06, 0xa27dc400, 0x487d72be, 0xaa51ebed, 0xe475b5c0, 0xea675ffc, 0xf4df627a, 0xdca4222f),
3774 SECP256K1_SCALAR_CONST(0x01b412ed, 0xd7830956, 0x1532537e, 0xe5e3dc99, 0x8fd3930a, 0x54f8d067, 0x32ef5760, 0x594438a5)},
3775 {SECP256K1_SCALAR_CONST(0x1f24278a, 0xb5bfe374, 0xa328dbbc, 0xebe35f48, 0x6620e009, 0xd58bb1b4, 0xb5a6bf84, 0x8815f63a),
3776 SECP256K1_SCALAR_CONST(0xfe928416, 0xca5ba2d3, 0xfde513da, 0x903a60c7, 0x9e58ad8a, 0x8783bee4, 0x083a3843, 0xa608c914)},
3777 {SECP256K1_SCALAR_CONST(0xdc107d58, 0x274f6330, 0x67dba8bc, 0x26093111, 0x5201dfb8, 0x968ce3f5, 0xf34d1bd4, 0xf2146504),
3778 SECP256K1_SCALAR_CONST(0x660cfa90, 0x13c3d93e, 0x7023b1e5, 0xedd09e71, 0x6d9c9d10, 0x7a3d2cdb, 0xdd08edc3, 0xaa78fcfb)},
3779 {SECP256K1_SCALAR_CONST(0x7cd1e905, 0xc6f02776, 0x2f551cc7, 0x5da61cff, 0x7da05389, 0x1119d5a4, 0x631c7442, 0x894fd4f7),
3780 SECP256K1_SCALAR_CONST(0xff20862a, 0x9d3b1a37, 0x1628803b, 0x3004ccae, 0xaa23282a, 0xa89a1109, 0xd94ece5e, 0x181bdc46)},
3781 {SECP256K1_SCALAR_CONST(0x5b9dade8, 0x23d26c58, 0xcd12d818, 0x25b8ae97, 0x3dea04af, 0xf482c96b, 0xa062f254, 0x9e453640),
3782 SECP256K1_SCALAR_CONST(0x50c38800, 0x15fa53f4, 0xbe1e5392, 0x5c9b120a, 0x262c22c7, 0x18fa0816, 0x5f2baab4, 0x8cb5db46)},
3783 {SECP256K1_SCALAR_CONST(0x11cdaeda, 0x969c464b, 0xef1f4ab0, 0x5b01d22e, 0x656fd098, 0x882bea84, 0x65cdbe7a, 0x0c19ff03),
3784 SECP256K1_SCALAR_CONST(0x1968d0fa, 0xac46f103, 0xb55f1f72, 0xb3820bed, 0xec6b359a, 0x4b1ae0ad, 0x7e38e1fb, 0x295ccdfb)},
3785 {SECP256K1_SCALAR_CONST(0x2c351aa1, 0x26e91589, 0x194f8a1e, 0x06561f66, 0x0cb97b7f, 0x10914454, 0x134d1c03, 0x157266b4),
3786 SECP256K1_SCALAR_CONST(0xbe49ada6, 0x92bd8711, 0x41b176c4, 0xa478ba95, 0x14883434, 0x9d1cd6f3, 0xcc4b847d, 0x22af80f5)},
3787 {SECP256K1_SCALAR_CONST(0x6ba07c6e, 0x13a60edb, 0x6247f5c3, 0x84b5fa56, 0x76fe3ec5, 0x80426395, 0xf65ec2ae, 0x623ba730),
3788 SECP256K1_SCALAR_CONST(0x25ac23f7, 0x418cd747, 0x98376f9d, 0x4a11c7bf, 0x24c8ebfe, 0x4c8a8655, 0x345f4f52, 0x1c515595)},
3789 {SECP256K1_SCALAR_CONST(0x9397a712, 0x8abb6951, 0x2d4a3d54, 0x703b1c2a, 0x0661dca8, 0xd75c9b31, 0xaed4d24b, 0xd2ab2948),
3790 SECP256K1_SCALAR_CONST(0xc52e8bef, 0xd55ce3eb, 0x1c897739, 0xeb9fb606, 0x36b9cd57, 0x18c51cc2, 0x6a87489e, 0xffd0dcf3)},
3791 {SECP256K1_SCALAR_CONST(0xe6a808cc, 0xeb437888, 0xe97798df, 0x4e224e44, 0x7e3b380a, 0x207c1653, 0x889f3212, 0xc6738b6f),
3792 SECP256K1_SCALAR_CONST(0x31f9ae13, 0xd1e08b20, 0x757a2e5e, 0x5243a0eb, 0x8ae35f73, 0x19bb6122, 0xb910f26b, 0xda70aa55)},
3793 {SECP256K1_SCALAR_CONST(0xd0320548, 0xab0effe7, 0xa70779e0, 0x61a347a6, 0xb8c1e010, 0x9d5281f8, 0x2ee588a6, 0x80000000),
3794 SECP256K1_SCALAR_CONST(0x1541897e, 0x78195c90, 0x7583dd9e, 0x728b6100, 0xbce8bc6d, 0x7a53b471, 0x5dcd9e45, 0x4425fcaf)},
3795 {SECP256K1_SCALAR_CONST(0x93d623f1, 0xd45b50b0, 0x796e9186, 0x9eac9407, 0xd30edc20, 0xef6304cf, 0x250494e7, 0xba503de9),
3796 SECP256K1_SCALAR_CONST(0x7026d638, 0x1178b548, 0x92043952, 0x3c7fb47c, 0xcd3ea236, 0x31d82b01, 0x612fc387, 0x80b9b957)},
3797 {SECP256K1_SCALAR_CONST(0xf860ab39, 0x55f5d412, 0xa4d73bcc, 0x3b48bd90, 0xc248ffd3, 0x13ca10be, 0x8fba84cc, 0xdd28d6a3),
3798 SECP256K1_SCALAR_CONST(0x5c32fc70, 0xe0b15d67, 0x76694700, 0xfe62be4d, 0xeacdb229, 0x7a4433d9, 0x52155cd0, 0x7649ab59)},
3799 {SECP256K1_SCALAR_CONST(0x4e41311c, 0x0800af58, 0x7a690a8e, 0xe175c9ba, 0x6981ab73, 0xac532ea8, 0x5c1f5e63, 0x6ac1f189),
3800 SECP256K1_SCALAR_CONST(0xfffffff9, 0xd075982c, 0x7fbd3825, 0xc05038a2, 0x4533b91f, 0x94ec5f45, 0xb280b28f, 0x842324dc)},
3801 {SECP256K1_SCALAR_CONST(0x48e473bf, 0x3555eade, 0xad5d7089, 0x2424c4e4, 0x0a99397c, 0x2dc796d8, 0xb7a43a69, 0xd0364141),
3802 SECP256K1_SCALAR_CONST(0x634976b2, 0xa0e47895, 0x1ec38593, 0x266d6fd0, 0x6f602644, 0x9bb762f1, 0x7180c704, 0xe23a4daa)},
3803 {SECP256K1_SCALAR_CONST(0xbe83878d, 0x3292fc54, 0x26e71c62, 0x556ccedc, 0x7cbb8810, 0x4032a720, 0x34ead589, 0xe4d6bd13),
3804 SECP256K1_SCALAR_CONST(0x6cd150ad, 0x25e59d0f, 0x74cbae3d, 0x6377534a, 0x1e6562e8, 0xb71b9d18, 0xe1e5d712, 0x8480abb3)},
3805 {SECP256K1_SCALAR_CONST(0xcdddf2e5, 0xefc15f88, 0xc9ee06de, 0x8a846ca9, 0x28561581, 0x68daa5fb, 0xd1cf3451, 0xeb1782d0),
3806 SECP256K1_SCALAR_CONST(0xffffffd9, 0xed8d2af4, 0x993c865a, 0x23e9681a, 0x3ca3a3dc, 0xe6d5a46e, 0xbd86bd87, 0x61b55c70)},
3807 {SECP256K1_SCALAR_CONST(0xb6a18f1f, 0x04872df9, 0x08165ec4, 0x319ca19c, 0x6c0359ab, 0x1f7118fb, 0xc2ef8082, 0xca8b7785),
3808 SECP256K1_SCALAR_CONST(0xff55b19b, 0x0f1ac78c, 0x0f0c88c2, 0x2358d5ad, 0x5f455e4e, 0x3330b72f, 0x274dc153, 0xffbf272b)},
3809 {SECP256K1_SCALAR_CONST(0xea4898e5, 0x30eba3e8, 0xcf0e5c3d, 0x06ec6844, 0x01e26fb6, 0x75636225, 0xc5d08f4c, 0x1decafa0),
3810 SECP256K1_SCALAR_CONST(0xe5a014a8, 0xe3c4ec1e, 0xea4f9b32, 0xcfc7b386, 0x00630806, 0x12c08d02, 0x6407ccc2, 0xb067d90e)},
3811 {SECP256K1_SCALAR_CONST(0x70e9aea9, 0x7e933af0, 0x8a23bfab, 0x23e4b772, 0xff951863, 0x5ffcf47d, 0x6bebc918, 0x2ca58265),
3812 SECP256K1_SCALAR_CONST(0xf4e00006, 0x81bc6441, 0x4eb6ec02, 0xc194a859, 0x80ad7c48, 0xba4e9afb, 0x8b6bdbe0, 0x989d8f77)},
3813 {SECP256K1_SCALAR_CONST(0x3c56c774, 0x46efe6f0, 0xe93618b8, 0xf9b5a846, 0xd247df61, 0x83b1e215, 0x06dc8bcc, 0xeefc1bf5),
3814 SECP256K1_SCALAR_CONST(0xfff8937a, 0x2cd9586b, 0x43c25e57, 0xd1cefa7a, 0x9fb91ed3, 0x95b6533d, 0x8ad0de5b, 0xafb93f00)},
3815 {SECP256K1_SCALAR_CONST(0xfb5c2772, 0x5cb30e83, 0xe38264df, 0xe4e3ebf3, 0x392aa92e, 0xa68756a1, 0x51279ac5, 0xb50711a8),
3816 SECP256K1_SCALAR_CONST(0x000013af, 0x1105bfe7, 0xa6bbd7fb, 0x3d638f99, 0x3b266b02, 0x072fb8bc, 0x39251130, 0x2e0fd0ea)}
3817 };
3818 int i, var, testrand;
3819 unsigned char b32[32];
3820 secp256k1_fe x_fe;
3821 secp256k1_scalar x_scalar;
3822 memset(b32, 0, sizeof(b32));
3823 /* Test fixed test cases through test_inverse_{scalar,field}, both ways. */
3824 for (i = 0; (size_t)i < ARRAY_SIZE(fe_cases); ++i) {
3825 for (var = 0; var <= 1; ++var) {
3826 test_inverse_field(&x_fe, &fe_cases[i][0], var);
3827 CHECK(fe_equal(&x_fe, &fe_cases[i][1]));
3828 test_inverse_field(&x_fe, &fe_cases[i][1], var);
3829 CHECK(fe_equal(&x_fe, &fe_cases[i][0]));
3830 }
3831 }
3832 for (i = 0; (size_t)i < ARRAY_SIZE(scalar_cases); ++i) {
3833 for (var = 0; var <= 1; ++var) {
3834 test_inverse_scalar(&x_scalar, &scalar_cases[i][0], var);
3835 CHECK(secp256k1_scalar_eq(&x_scalar, &scalar_cases[i][1]));
3836 test_inverse_scalar(&x_scalar, &scalar_cases[i][1], var);
3837 CHECK(secp256k1_scalar_eq(&x_scalar, &scalar_cases[i][0]));
3838 }
3839 }
3840 /* Test inputs 0..999 and their respective negations. */
3841 for (i = 0; i < 1000; ++i) {
3842 b32[31] = i & 0xff;
3843 b32[30] = (i >> 8) & 0xff;
3844 secp256k1_scalar_set_b32(&x_scalar, b32, NULL);
3845 secp256k1_fe_set_b32_mod(&x_fe, b32);
3846 for (var = 0; var <= 1; ++var) {
3847 test_inverse_scalar(NULL, &x_scalar, var);
3848 test_inverse_field(NULL, &x_fe, var);
3849 }
3850 secp256k1_scalar_negate(&x_scalar, &x_scalar);
3851 secp256k1_fe_negate(&x_fe, &x_fe, 1);
3852 for (var = 0; var <= 1; ++var) {
3853 test_inverse_scalar(NULL, &x_scalar, var);
3854 test_inverse_field(NULL, &x_fe, var);
3855 }
3856 }
3857 /* test 128*count random inputs; half with testrand256_test, half with testrand256 */
3858 for (testrand = 0; testrand <= 1; ++testrand) {
3859 for (i = 0; i < 64 * COUNT; ++i) {
3860 (testrand ? testrand256_test : testrand256)(b32);
3861 secp256k1_scalar_set_b32(&x_scalar, b32, NULL);
3862 secp256k1_fe_set_b32_mod(&x_fe, b32);
3863 for (var = 0; var <= 1; ++var) {
3864 test_inverse_scalar(NULL, &x_scalar, var);
3865 test_inverse_field(NULL, &x_fe, var);
3866 }
3867 }
3868 }
3869}
3870
3871/***** HSORT TESTS *****/
3872
3873static void test_heap_swap(void) {
3874 unsigned char a[600];
3875 unsigned char e[sizeof(a)];
3876 memset(a, 21, 200);
3877 memset(a + 200, 99, 200);
3878 memset(a + 400, 42, 200);
3879 memset(e, 42, 200);
3880 memset(e + 200, 99, 200);
3881 memset(e + 400, 21, 200);
3882 secp256k1_heap_swap(a, 0, 2, 200);
3883 CHECK(secp256k1_memcmp_var(a, e, sizeof(a)) == 0);
3884}
3885
3886static void test_hsort_is_sorted(unsigned char *elements, size_t n, size_t len) {
3887 size_t i;
3888 for (i = 1; i < n; i++) {
3889 CHECK(secp256k1_memcmp_var(&elements[(i-1) * len], &elements[i * len], len) <= 0);
3890 }
3891}
3892
3894 size_t counter;
3896};
3897
3898
3899static int test_hsort_cmp(const void *ele1, const void *ele2, void *data) {
3900 struct test_hsort_cmp_data *d = (struct test_hsort_cmp_data *) data;
3901 d->counter += 1;
3902 return secp256k1_memcmp_var((unsigned char *)ele1, (unsigned char *)ele2, d->element_len);
3903}
3904
3905#define NUM 65
3906#define MAX_ELEMENT_LEN 65
3907static void test_hsort(size_t element_len) {
3908 unsigned char elements[NUM * MAX_ELEMENT_LEN] = { 0 };
3910 int i;
3911
3913 data.counter = 0;
3914 data.element_len = element_len;
3915
3917 CHECK(data.counter == 0);
3919 CHECK(data.counter == 0);
3921 CHECK(data.counter >= NUM - 1);
3923
3924 /* Test hsort with array of random length n */
3925 for (i = 0; i < COUNT; i++) {
3926 int n = testrand_int(NUM);
3927 testrand_bytes_test(elements, n*element_len);
3929 test_hsort_is_sorted(elements, n, element_len);
3930 }
3931}
3932#undef NUM
3933#undef MAX_ELEMENT_LEN
3934
3935
3936static void run_hsort_tests(void) {
3938 test_hsort(1);
3939 test_hsort(64);
3940 test_hsort(65);
3941}
3942
3943/***** GROUP TESTS *****/
3944
3945/* This compares jacobian points including their Z, not just their geometric meaning. */
3946static int gej_xyz_equals_gej(const secp256k1_gej *a, const secp256k1_gej *b) {
3947 secp256k1_gej a2;
3948 secp256k1_gej b2;
3949 int ret = 1;
3950 ret &= a->infinity == b->infinity;
3951 if (ret && !a->infinity) {
3952 a2 = *a;
3953 b2 = *b;
3960 ret &= secp256k1_fe_cmp_var(&a2.x, &b2.x) == 0;
3961 ret &= secp256k1_fe_cmp_var(&a2.y, &b2.y) == 0;
3962 ret &= secp256k1_fe_cmp_var(&a2.z, &b2.z) == 0;
3963 }
3964 return ret;
3965}
3966
3967static void test_ge(void) {
3968 int i, i1;
3969 int runs = 6;
3970 /* 25 points are used:
3971 * - infinity
3972 * - for each of four random points p1 p2 p3 p4, we add the point, its
3973 * negation, and then those two again but with randomized Z coordinate.
3974 * - The same is then done for lambda*p1 and lambda^2*p1.
3975 */
3976 secp256k1_ge *ge = checked_malloc(&CTX->error_callback, sizeof(secp256k1_ge) * (1 + 4 * runs));
3977 secp256k1_gej *gej = checked_malloc(&CTX->error_callback, sizeof(secp256k1_gej) * (1 + 4 * runs));
3978 secp256k1_fe zf, r;
3979 secp256k1_fe zfi2, zfi3;
3980
3983 for (i = 0; i < runs; i++) {
3984 int j, k;
3987 if (i >= runs - 2) {
3988 secp256k1_ge_mul_lambda(&g, &ge[1]);
3989 CHECK(!secp256k1_ge_eq_var(&g, &ge[1]));
3990 }
3991 if (i >= runs - 1) {
3993 }
3994 ge[1 + 4 * i] = g;
3995 ge[2 + 4 * i] = g;
3996 secp256k1_ge_neg(&ge[3 + 4 * i], &g);
3997 secp256k1_ge_neg(&ge[4 + 4 * i], &g);
3998 secp256k1_gej_set_ge(&gej[1 + 4 * i], &ge[1 + 4 * i]);
3999 testutil_random_ge_jacobian_test(&gej[2 + 4 * i], &ge[2 + 4 * i]);
4000 secp256k1_gej_set_ge(&gej[3 + 4 * i], &ge[3 + 4 * i]);
4001 testutil_random_ge_jacobian_test(&gej[4 + 4 * i], &ge[4 + 4 * i]);
4002 for (j = 0; j < 4; j++) {
4003 testutil_random_ge_x_magnitude(&ge[1 + j + 4 * i]);
4004 testutil_random_ge_y_magnitude(&ge[1 + j + 4 * i]);
4005 testutil_random_gej_x_magnitude(&gej[1 + j + 4 * i]);
4006 testutil_random_gej_y_magnitude(&gej[1 + j + 4 * i]);
4007 testutil_random_gej_z_magnitude(&gej[1 + j + 4 * i]);
4008 }
4009
4010 for (j = 0; j < 4; ++j) {
4011 for (k = 0; k < 4; ++k) {
4012 int expect_equal = (j >> 1) == (k >> 1);
4013 CHECK(secp256k1_ge_eq_var(&ge[1 + j + 4 * i], &ge[1 + k + 4 * i]) == expect_equal);
4014 CHECK(secp256k1_gej_eq_var(&gej[1 + j + 4 * i], &gej[1 + k + 4 * i]) == expect_equal);
4015 CHECK(secp256k1_gej_eq_ge_var(&gej[1 + j + 4 * i], &ge[1 + k + 4 * i]) == expect_equal);
4016 CHECK(secp256k1_gej_eq_ge_var(&gej[1 + k + 4 * i], &ge[1 + j + 4 * i]) == expect_equal);
4017 }
4018 }
4019 }
4020
4021 /* Generate random zf, and zfi2 = 1/zf^2, zfi3 = 1/zf^3 */
4024 secp256k1_fe_inv_var(&zfi3, &zf);
4025 secp256k1_fe_sqr(&zfi2, &zfi3);
4026 secp256k1_fe_mul(&zfi3, &zfi3, &zfi2);
4027
4028 /* Generate random r */
4030
4031 for (i1 = 0; i1 < 1 + 4 * runs; i1++) {
4032 int i2;
4033 for (i2 = 0; i2 < 1 + 4 * runs; i2++) {
4034 /* Compute reference result using gej + gej (var). */
4035 secp256k1_gej refj, resj;
4036 secp256k1_ge ref;
4037 secp256k1_fe zr;
4038 secp256k1_gej_add_var(&refj, &gej[i1], &gej[i2], secp256k1_gej_is_infinity(&gej[i1]) ? NULL : &zr);
4039 /* Check Z ratio. */
4040 if (!secp256k1_gej_is_infinity(&gej[i1]) && !secp256k1_gej_is_infinity(&refj)) {
4041 secp256k1_fe zrz; secp256k1_fe_mul(&zrz, &zr, &gej[i1].z);
4042 CHECK(secp256k1_fe_equal(&zrz, &refj.z));
4043 }
4044 secp256k1_ge_set_gej_var(&ref, &refj);
4045
4046 /* Test gej + ge with Z ratio result (var). */
4047 secp256k1_gej_add_ge_var(&resj, &gej[i1], &ge[i2], secp256k1_gej_is_infinity(&gej[i1]) ? NULL : &zr);
4048 CHECK(secp256k1_gej_eq_ge_var(&resj, &ref));
4049 if (!secp256k1_gej_is_infinity(&gej[i1]) && !secp256k1_gej_is_infinity(&resj)) {
4050 secp256k1_fe zrz; secp256k1_fe_mul(&zrz, &zr, &gej[i1].z);
4051 CHECK(secp256k1_fe_equal(&zrz, &resj.z));
4052 }
4053
4054 /* Test gej + ge (var, with additional Z factor). */
4055 {
4056 secp256k1_ge ge2_zfi = ge[i2]; /* the second term with x and y rescaled for z = 1/zf */
4057 secp256k1_fe_mul(&ge2_zfi.x, &ge2_zfi.x, &zfi2);
4058 secp256k1_fe_mul(&ge2_zfi.y, &ge2_zfi.y, &zfi3);
4061 secp256k1_gej_add_zinv_var(&resj, &gej[i1], &ge2_zfi, &zf);
4062 CHECK(secp256k1_gej_eq_ge_var(&resj, &ref));
4063 }
4064
4065 /* Test gej + ge (const). */
4066 if (i2 != 0) {
4067 /* secp256k1_gej_add_ge does not support its second argument being infinity. */
4068 secp256k1_gej_add_ge(&resj, &gej[i1], &ge[i2]);
4069 CHECK(secp256k1_gej_eq_ge_var(&resj, &ref));
4070 }
4071
4072 /* Test doubling (var). */
4073 if ((i1 == 0 && i2 == 0) || ((i1 + 3)/4 == (i2 + 3)/4 && ((i1 + 3)%4)/2 == ((i2 + 3)%4)/2)) {
4074 secp256k1_fe zr2;
4075 /* Normal doubling with Z ratio result. */
4076 secp256k1_gej_double_var(&resj, &gej[i1], &zr2);
4077 CHECK(secp256k1_gej_eq_ge_var(&resj, &ref));
4078 /* Check Z ratio. */
4079 secp256k1_fe_mul(&zr2, &zr2, &gej[i1].z);
4080 CHECK(secp256k1_fe_equal(&zr2, &resj.z));
4081 /* Normal doubling. */
4082 secp256k1_gej_double_var(&resj, &gej[i2], NULL);
4083 CHECK(secp256k1_gej_eq_ge_var(&resj, &ref));
4084 /* Constant-time doubling. */
4085 secp256k1_gej_double(&resj, &gej[i2]);
4086 CHECK(secp256k1_gej_eq_ge_var(&resj, &ref));
4087 }
4088
4089 /* Test adding opposites. */
4090 if ((i1 == 0 && i2 == 0) || ((i1 + 3)/4 == (i2 + 3)/4 && ((i1 + 3)%4)/2 != ((i2 + 3)%4)/2)) {
4092 }
4093
4094 /* Test adding infinity. */
4095 if (i1 == 0) {
4098 CHECK(secp256k1_gej_eq_ge_var(&gej[i2], &ref));
4099 }
4100 if (i2 == 0) {
4103 CHECK(secp256k1_gej_eq_ge_var(&gej[i1], &ref));
4104 }
4105 }
4106 }
4107
4108 /* Test adding all points together in random order equals infinity. */
4109 {
4111 secp256k1_gej *gej_shuffled = checked_malloc(&CTX->error_callback, (4 * runs + 1) * sizeof(secp256k1_gej));
4112 for (i = 0; i < 4 * runs + 1; i++) {
4113 gej_shuffled[i] = gej[i];
4114 }
4115 for (i = 0; i < 4 * runs + 1; i++) {
4116 int swap = i + testrand_int(4 * runs + 1 - i);
4117 if (swap != i) {
4118 secp256k1_gej t = gej_shuffled[i];
4119 gej_shuffled[i] = gej_shuffled[swap];
4120 gej_shuffled[swap] = t;
4121 }
4122 }
4123 for (i = 0; i < 4 * runs + 1; i++) {
4124 secp256k1_gej_add_var(&sum, &sum, &gej_shuffled[i], NULL);
4125 }
4127 free(gej_shuffled);
4128 }
4129
4130 /* Test batch gej -> ge conversion without known z ratios. */
4131 {
4132 secp256k1_ge *ge_set_all_var = checked_malloc(&CTX->error_callback, (4 * runs + 1) * sizeof(secp256k1_ge));
4133 secp256k1_ge *ge_set_all = checked_malloc(&CTX->error_callback, (4 * runs + 1) * sizeof(secp256k1_ge));
4134 secp256k1_ge_set_all_gej_var(&ge_set_all_var[0], &gej[0], 4 * runs + 1);
4135 for (i = 0; i < 4 * runs + 1; i++) {
4138 secp256k1_gej_rescale(&gej[i], &s);
4139 CHECK(secp256k1_gej_eq_ge_var(&gej[i], &ge_set_all_var[i]));
4140 }
4141
4142 /* Skip infinity at &gej[0]. */
4143 secp256k1_ge_set_all_gej(&ge_set_all[1], &gej[1], 4 * runs);
4144 for (i = 1; i < 4 * runs + 1; i++) {
4147 secp256k1_gej_rescale(&gej[i], &s);
4148 CHECK(secp256k1_gej_eq_ge_var(&gej[i], &ge_set_all[i]));
4149 CHECK(secp256k1_ge_eq_var(&ge_set_all_var[i], &ge_set_all[i]));
4150 }
4151
4152 /* Test with an array of length 1. */
4153 secp256k1_ge_set_all_gej_var(ge_set_all_var, &gej[1], 1);
4154 secp256k1_ge_set_all_gej(ge_set_all, &gej[1], 1);
4155 CHECK(secp256k1_gej_eq_ge_var(&gej[1], &ge_set_all_var[1]));
4156 CHECK(secp256k1_gej_eq_ge_var(&gej[1], &ge_set_all[1]));
4157 CHECK(secp256k1_ge_eq_var(&ge_set_all_var[1], &ge_set_all[1]));
4158
4159 /* Test with an array of length 0. */
4160 secp256k1_ge_set_all_gej_var(NULL, NULL, 0);
4161 secp256k1_ge_set_all_gej(NULL, NULL, 0);
4162
4163 free(ge_set_all_var);
4164 free(ge_set_all);
4165 }
4166
4167 /* Test that all elements have X coordinates on the curve. */
4168 for (i = 1; i < 4 * runs + 1; i++) {
4169 secp256k1_fe n;
4171 /* And the same holds after random rescaling. */
4172 secp256k1_fe_mul(&n, &zf, &ge[i].x);
4174 }
4175
4176 /* Test correspondence of secp256k1_ge_x{,_frac}_on_curve_var with ge_set_xo. */
4177 {
4178 secp256k1_fe n;
4179 secp256k1_ge q;
4180 int ret_on_curve, ret_frac_on_curve, ret_set_xo;
4181 secp256k1_fe_mul(&n, &zf, &r);
4182 ret_on_curve = secp256k1_ge_x_on_curve_var(&r);
4183 ret_frac_on_curve = secp256k1_ge_x_frac_on_curve_var(&n, &zf);
4184 ret_set_xo = secp256k1_ge_set_xo_var(&q, &r, 0);
4185 CHECK(ret_on_curve == ret_frac_on_curve);
4186 CHECK(ret_on_curve == ret_set_xo);
4187 if (ret_set_xo) CHECK(secp256k1_fe_equal(&r, &q.x));
4188 }
4189
4190 /* Test batch gej -> ge conversion with many infinities. */
4191 for (i = 0; i < 4 * runs + 1; i++) {
4192 int odd;
4194 odd = secp256k1_fe_is_odd(&ge[i].x);
4195 CHECK(odd == 0 || odd == 1);
4196 /* randomly set half the points to infinity */
4197 if (odd == i % 2) {
4199 }
4200 secp256k1_gej_set_ge(&gej[i], &ge[i]);
4201 }
4202 /* batch convert */
4203 secp256k1_ge_set_all_gej_var(ge, gej, 4 * runs + 1);
4204 /* check result */
4205 for (i = 0; i < 4 * runs + 1; i++) {
4206 CHECK(secp256k1_gej_eq_ge_var(&gej[i], &ge[i]));
4207 }
4208
4209 /* Test batch gej -> ge conversion with all infinities. */
4210 for (i = 0; i < 4 * runs + 1; i++) {
4212 }
4213 /* batch convert */
4214 secp256k1_ge_set_all_gej_var(ge, gej, 4 * runs + 1);
4215 /* check result */
4216 for (i = 0; i < 4 * runs + 1; i++) {
4218 }
4219
4220 free(ge);
4221 free(gej);
4222}
4223
4224static void test_initialized_inf(void) {
4225 secp256k1_ge p;
4226 secp256k1_gej pj, npj, infj1, infj2, infj3;
4227 secp256k1_fe zinv;
4228
4229 /* Test that adding P+(-P) results in a fully initialized infinity*/
4231 secp256k1_gej_set_ge(&pj, &p);
4232 secp256k1_gej_neg(&npj, &pj);
4233
4234 secp256k1_gej_add_var(&infj1, &pj, &npj, NULL);
4236 CHECK(secp256k1_fe_is_zero(&infj1.x));
4237 CHECK(secp256k1_fe_is_zero(&infj1.y));
4238 CHECK(secp256k1_fe_is_zero(&infj1.z));
4239
4240 secp256k1_gej_add_ge_var(&infj2, &npj, &p, NULL);
4242 CHECK(secp256k1_fe_is_zero(&infj2.x));
4243 CHECK(secp256k1_fe_is_zero(&infj2.y));
4244 CHECK(secp256k1_fe_is_zero(&infj2.z));
4245
4246 secp256k1_fe_set_int(&zinv, 1);
4247 secp256k1_gej_add_zinv_var(&infj3, &npj, &p, &zinv);
4249 CHECK(secp256k1_fe_is_zero(&infj3.x));
4250 CHECK(secp256k1_fe_is_zero(&infj3.y));
4251 CHECK(secp256k1_fe_is_zero(&infj3.z));
4252
4253
4254}
4255
4256static void test_add_neg_y_diff_x(void) {
4257 /* The point of this test is to check that we can add two points
4258 * whose y-coordinates are negatives of each other but whose x
4259 * coordinates differ. If the x-coordinates were the same, these
4260 * points would be negatives of each other and their sum is
4261 * infinity. This is cool because it "covers up" any degeneracy
4262 * in the addition algorithm that would cause the xy coordinates
4263 * of the sum to be wrong (since infinity has no xy coordinates).
4264 * HOWEVER, if the x-coordinates are different, infinity is the
4265 * wrong answer, and such degeneracies are exposed. This is the
4266 * root of https://github.com/bitcoin-core/secp256k1/issues/257
4267 * which this test is a regression test for.
4268 *
4269 * These points were generated in sage as
4270 *
4271 * load("secp256k1_params.sage")
4272 *
4273 * # random "bad pair"
4274 * P = C.random_element()
4275 * Q = -int(LAMBDA) * P
4276 * print(" P: %x %x" % P.xy())
4277 * print(" Q: %x %x" % Q.xy())
4278 * print("P + Q: %x %x" % (P + Q).xy())
4279 */
4281 0x8d24cd95, 0x0a355af1, 0x3c543505, 0x44238d30,
4282 0x0643d79f, 0x05a59614, 0x2f8ec030, 0xd58977cb,
4283 0x001e337a, 0x38093dcd, 0x6c0f386d, 0x0b1293a8,
4284 0x4d72c879, 0xd7681924, 0x44e6d2f3, 0x9190117d
4285 );
4287 0xc7b74206, 0x1f788cd9, 0xabd0937d, 0x164a0d86,
4288 0x95f6ff75, 0xf19a4ce9, 0xd013bd7b, 0xbf92d2a7,
4289 0xffe1cc85, 0xc7f6c232, 0x93f0c792, 0xf4ed6c57,
4290 0xb28d3786, 0x2897e6db, 0xbb192d0b, 0x6e6feab2
4291 );
4293 0x671a63c0, 0x3efdad4c, 0x389a7798, 0x24356027,
4294 0xb3d69010, 0x278625c3, 0x5c86d390, 0x184a8f7a,
4295 0x5f6409c2, 0x2ce01f2b, 0x511fd375, 0x25071d08,
4296 0xda651801, 0x70e95caf, 0x8f0d893c, 0xbed8fbbe
4297 );
4298 secp256k1_ge b;
4299 secp256k1_gej resj;
4300 secp256k1_ge res;
4301 secp256k1_ge_set_gej(&b, &bj);
4302
4303 secp256k1_gej_add_var(&resj, &aj, &bj, NULL);
4304 secp256k1_ge_set_gej(&res, &resj);
4305 CHECK(secp256k1_gej_eq_ge_var(&sumj, &res));
4306
4307 secp256k1_gej_add_ge(&resj, &aj, &b);
4308 secp256k1_ge_set_gej(&res, &resj);
4309 CHECK(secp256k1_gej_eq_ge_var(&sumj, &res));
4310
4311 secp256k1_gej_add_ge_var(&resj, &aj, &b, NULL);
4312 secp256k1_ge_set_gej(&res, &resj);
4313 CHECK(secp256k1_gej_eq_ge_var(&sumj, &res));
4314}
4315
4316static void test_ge_bytes(void) {
4317 int i;
4318
4319 for (i = 0; i < COUNT + 1; i++) {
4320 unsigned char buf[64];
4321 secp256k1_ge p, q;
4322
4323 if (i == 0) {
4325 } else {
4327 }
4328
4329 if (!secp256k1_ge_is_infinity(&p)) {
4330 secp256k1_ge_to_bytes(buf, &p);
4331
4332 secp256k1_ge_from_bytes(&q, buf);
4333 CHECK(secp256k1_ge_eq_var(&p, &q));
4334
4336 CHECK(secp256k1_ge_eq_var(&p, &q));
4337 }
4340 CHECK(secp256k1_ge_eq_var(&p, &q));
4341 }
4342}
4343
4344static void run_ge(void) {
4345 int i;
4346 for (i = 0; i < COUNT * 32; i++) {
4347 test_ge();
4348 }
4351 test_ge_bytes();
4352}
4353
4354static void test_gej_cmov(const secp256k1_gej *a, const secp256k1_gej *b) {
4355 secp256k1_gej t = *a;
4356 secp256k1_gej_cmov(&t, b, 0);
4358 secp256k1_gej_cmov(&t, b, 1);
4360}
4361
4362static void run_gej(void) {
4363 int i;
4364 secp256k1_gej a, b;
4365
4366 /* Tests for secp256k1_gej_cmov */
4367 for (i = 0; i < COUNT; i++) {
4370 test_gej_cmov(&a, &b);
4371
4373 test_gej_cmov(&a, &b);
4374 test_gej_cmov(&b, &a);
4375
4376 b = a;
4377 test_gej_cmov(&a, &b);
4378
4380 test_gej_cmov(&a, &b);
4381 test_gej_cmov(&b, &a);
4382 }
4383
4384 /* Tests for secp256k1_gej_eq_var */
4385 for (i = 0; i < COUNT; i++) {
4386 secp256k1_fe fe;
4389 CHECK(!secp256k1_gej_eq_var(&a, &b));
4390
4391 b = a;
4393 secp256k1_gej_rescale(&a, &fe);
4394 CHECK(secp256k1_gej_eq_var(&a, &b));
4395 }
4396}
4397
4398static void test_ec_combine(void) {
4401 const secp256k1_pubkey* d[6];
4403 secp256k1_pubkey sd2;
4404 secp256k1_ge Q;
4405 int i;
4406 for (i = 1; i <= 6; i++) {
4411 secp256k1_pubkey_save(&data[i - 1], &Q);
4412 d[i - 1] = &data[i - 1];
4414 secp256k1_pubkey_save(&sd, &Q);
4415 CHECK(secp256k1_ec_pubkey_combine(CTX, &sd2, d, i) == 1);
4416 CHECK(secp256k1_memcmp_var(&sd, &sd2, sizeof(sd)) == 0);
4417 }
4418}
4419
4420static void run_ec_combine(void) {
4421 int i;
4422 for (i = 0; i < COUNT * 8; i++) {
4424 }
4425}
4426
4428 /* The input itself, normalized. */
4429 secp256k1_fe fex = *x;
4430 /* Results of set_xo_var(..., 0), set_xo_var(..., 1). */
4431 secp256k1_ge ge_even, ge_odd;
4432 /* Return values of the above calls. */
4433 int res_even, res_odd;
4434
4436
4437 res_even = secp256k1_ge_set_xo_var(&ge_even, &fex, 0);
4438 res_odd = secp256k1_ge_set_xo_var(&ge_odd, &fex, 1);
4439
4440 CHECK(res_even == res_odd);
4441
4442 if (res_even) {
4444 secp256k1_fe_normalize_var(&ge_even.x);
4446 secp256k1_fe_normalize_var(&ge_even.y);
4447
4448 /* No infinity allowed. */
4449 CHECK(!secp256k1_ge_is_infinity(&ge_even));
4451
4452 /* Check that the x coordinates check out. */
4453 CHECK(secp256k1_fe_equal(&ge_even.x, x));
4454 CHECK(secp256k1_fe_equal(&ge_odd.x, x));
4455
4456 /* Check odd/even Y in ge_odd, ge_even. */
4457 CHECK(secp256k1_fe_is_odd(&ge_odd.y));
4458 CHECK(!secp256k1_fe_is_odd(&ge_even.y));
4459 }
4460}
4461
4462static void run_group_decompress(void) {
4463 int i;
4464 for (i = 0; i < COUNT * 4; i++) {
4465 secp256k1_fe fe;
4468 }
4469}
4470
4471/***** ECMULT TESTS *****/
4472
4473static void test_pre_g_table(const secp256k1_ge_storage * pre_g, size_t n) {
4474 /* Tests the pre_g / pre_g_128 tables for consistency.
4475 * For independent verification we take a "geometric" approach to verification.
4476 * We check that every entry is on-curve.
4477 * We check that for consecutive entries p and q, that p + gg - q = 0 by checking
4478 * (1) p, gg, and -q are colinear.
4479 * (2) p, gg, and -q are all distinct.
4480 * where gg is twice the generator, where the generator is the first table entry.
4481 *
4482 * Checking the table's generators are correct is done in run_ecmult_pre_g.
4483 */
4484 secp256k1_gej g2;
4485 secp256k1_ge p, q, gg;
4486 secp256k1_fe dpx, dpy, dqx, dqy;
4487 size_t i;
4488
4489 CHECK(0 < n);
4490
4491 secp256k1_ge_from_storage(&p, &pre_g[0]);
4493
4494 secp256k1_gej_set_ge(&g2, &p);
4495 secp256k1_gej_double_var(&g2, &g2, NULL);
4496 secp256k1_ge_set_gej_var(&gg, &g2);
4497 for (i = 1; i < n; ++i) {
4498 secp256k1_fe_negate(&dpx, &p.x, 1); secp256k1_fe_add(&dpx, &gg.x); secp256k1_fe_normalize_weak(&dpx);
4499 secp256k1_fe_negate(&dpy, &p.y, 1); secp256k1_fe_add(&dpy, &gg.y); secp256k1_fe_normalize_weak(&dpy);
4500 /* Check that p is not equal to gg */
4502
4503 secp256k1_ge_from_storage(&q, &pre_g[i]);
4505
4506 secp256k1_fe_negate(&dqx, &q.x, 1); secp256k1_fe_add(&dqx, &gg.x);
4507 dqy = q.y; secp256k1_fe_add(&dqy, &gg.y);
4508 /* Check that -q is not equal to gg */
4510
4511 /* Check that -q is not equal to p */
4512 CHECK(!secp256k1_fe_equal(&dpx, &dqx) || !secp256k1_fe_equal(&dpy, &dqy));
4513
4514 /* Check that p, -q and gg are colinear */
4515 secp256k1_fe_mul(&dpx, &dpx, &dqy);
4516 secp256k1_fe_mul(&dpy, &dpy, &dqx);
4517 CHECK(secp256k1_fe_equal(&dpx, &dpy));
4518
4519 p = q;
4520 }
4521}
4522
4523static void run_ecmult_pre_g(void) {
4525 secp256k1_gej gj;
4527 size_t i;
4528
4529 /* Check that the pre_g and pre_g_128 tables are consistent. */
4532
4533 /* Check the first entry from the pre_g table. */
4535 CHECK(secp256k1_memcmp_var(&gs, &secp256k1_pre_g[0], sizeof(gs)) == 0);
4536
4537 /* Check the first entry from the pre_g_128 table. */
4539 for (i = 0; i < 128; ++i) {
4540 secp256k1_gej_double_var(&gj, &gj, NULL);
4541 }
4542 secp256k1_ge_set_gej(&g, &gj);
4544 CHECK(secp256k1_memcmp_var(&gs, &secp256k1_pre_g_128[0], sizeof(gs)) == 0);
4545}
4546
4547static void run_ecmult_chain(void) {
4548 /* random starting point A (on the curve) */
4550 0x8b30bbe9, 0xae2a9906, 0x96b22f67, 0x0709dff3,
4551 0x727fd8bc, 0x04d3362c, 0x6c7bf458, 0xe2846004,
4552 0xa357ae91, 0x5c4a6528, 0x1309edf2, 0x0504740f,
4553 0x0eb33439, 0x90216b4f, 0x81063cb6, 0x5f2f7e0f
4554 );
4555 /* two random initial factors xn and gn */
4557 0x84cc5452, 0xf7fde1ed, 0xb4d38a8c, 0xe9b1b84c,
4558 0xcef31f14, 0x6e569be9, 0x705d357a, 0x42985407
4559 );
4561 0xa1e58d22, 0x553dcd42, 0xb2398062, 0x5d4c57a9,
4562 0x6e9323d4, 0x2b3152e5, 0xca2c3990, 0xedc7c9de
4563 );
4564 /* two small multipliers to be applied to xn and gn in every iteration: */
4565 static const secp256k1_scalar xf = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0x1337);
4566 static const secp256k1_scalar gf = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0x7113);
4567 /* accumulators with the resulting coefficients to A and G */
4570 /* actual points */
4571 secp256k1_gej x;
4572 secp256k1_gej x2;
4573 int i;
4574
4575 /* the point being computed */
4576 x = a;
4577 for (i = 0; i < 200*COUNT; i++) {
4578 /* in each iteration, compute X = xn*X + gn*G; */
4579 secp256k1_ecmult(&x, &x, &xn, &gn);
4580 /* also compute ae and ge: the actual accumulated factors for A and G */
4581 /* if X was (ae*A+ge*G), xn*X + gn*G results in (xn*ae*A + (xn*ge+gn)*G) */
4582 secp256k1_scalar_mul(&ae, &ae, &xn);
4583 secp256k1_scalar_mul(&ge, &ge, &xn);
4584 secp256k1_scalar_add(&ge, &ge, &gn);
4585 /* modify xn and gn */
4586 secp256k1_scalar_mul(&xn, &xn, &xf);
4587 secp256k1_scalar_mul(&gn, &gn, &gf);
4588
4589 /* verify */
4590 if (i == 19999) {
4591 /* expected result after 19999 iterations */
4593 0xD6E96687, 0xF9B10D09, 0x2A6F3543, 0x9D86CEBE,
4594 0xA4535D0D, 0x409F5358, 0x6440BD74, 0xB933E830,
4595 0xB95CBCA2, 0xC77DA786, 0x539BE8FD, 0x53354D2D,
4596 0x3B4F566A, 0xE6580454, 0x07ED6015, 0xEE1B2A88
4597 );
4598 CHECK(secp256k1_gej_eq_var(&rp, &x));
4599 }
4600 }
4601 /* redo the computation, but directly with the resulting ae and ge coefficients: */
4602 secp256k1_ecmult(&x2, &a, &ae, &ge);
4603 CHECK(secp256k1_gej_eq_var(&x, &x2));
4604}
4605
4606static void test_point_times_order(const secp256k1_gej *point) {
4607 /* X * (point + G) + (order-X) * (pointer + G) = 0 */
4610 secp256k1_gej res1, res2;
4611 secp256k1_ge res3;
4613 secp256k1_scalar_negate(&nx, &x);
4614 secp256k1_ecmult(&res1, point, &x, &x); /* calc res1 = x * point + x * G; */
4615 secp256k1_ecmult(&res2, point, &nx, &nx); /* calc res2 = (order - x) * point + (order - x) * G; */
4616 secp256k1_gej_add_var(&res1, &res1, &res2, NULL);
4618 secp256k1_ge_set_gej(&res3, &res1);
4620 CHECK(secp256k1_ge_is_valid_var(&res3) == 0);
4621 /* check zero/one edge cases */
4623 secp256k1_ecmult(&res2, point, &secp256k1_scalar_zero, NULL);
4624 secp256k1_ge_set_gej(&res3, &res1);
4628
4630 secp256k1_ecmult(&res2, point, &secp256k1_scalar_one, NULL);
4631 secp256k1_ge_set_gej(&res3, &res1);
4632 CHECK(secp256k1_gej_eq_ge_var(point, &res3));
4633 secp256k1_ge_set_gej(&res3, &res2);
4634 CHECK(secp256k1_gej_eq_ge_var(point, &res3));
4635
4637 secp256k1_ge_set_gej(&res3, &res1);
4639}
4640
4641/* These scalars reach large (in absolute value) outputs when fed to secp256k1_scalar_split_lambda.
4642 *
4643 * They are computed as:
4644 * - For a in [-2, -1, 0, 1, 2]:
4645 * - For b in [-3, -1, 1, 3]:
4646 * - Output (a*LAMBDA + (ORDER+b)/2) % ORDER
4647 */
4649 SECP256K1_SCALAR_CONST(0xd938a566, 0x7f479e3e, 0xb5b3c7fa, 0xefdb3749, 0x3aa0585c, 0xc5ea2367, 0xe1b660db, 0x0209e6fc),
4650 SECP256K1_SCALAR_CONST(0xd938a566, 0x7f479e3e, 0xb5b3c7fa, 0xefdb3749, 0x3aa0585c, 0xc5ea2367, 0xe1b660db, 0x0209e6fd),
4651 SECP256K1_SCALAR_CONST(0xd938a566, 0x7f479e3e, 0xb5b3c7fa, 0xefdb3749, 0x3aa0585c, 0xc5ea2367, 0xe1b660db, 0x0209e6fe),
4652 SECP256K1_SCALAR_CONST(0xd938a566, 0x7f479e3e, 0xb5b3c7fa, 0xefdb3749, 0x3aa0585c, 0xc5ea2367, 0xe1b660db, 0x0209e6ff),
4653 SECP256K1_SCALAR_CONST(0x2c9c52b3, 0x3fa3cf1f, 0x5ad9e3fd, 0x77ed9ba5, 0xb294b893, 0x3722e9a5, 0x00e698ca, 0x4cf7632d),
4654 SECP256K1_SCALAR_CONST(0x2c9c52b3, 0x3fa3cf1f, 0x5ad9e3fd, 0x77ed9ba5, 0xb294b893, 0x3722e9a5, 0x00e698ca, 0x4cf7632e),
4655 SECP256K1_SCALAR_CONST(0x2c9c52b3, 0x3fa3cf1f, 0x5ad9e3fd, 0x77ed9ba5, 0xb294b893, 0x3722e9a5, 0x00e698ca, 0x4cf7632f),
4656 SECP256K1_SCALAR_CONST(0x2c9c52b3, 0x3fa3cf1f, 0x5ad9e3fd, 0x77ed9ba5, 0xb294b893, 0x3722e9a5, 0x00e698ca, 0x4cf76330),
4657 SECP256K1_SCALAR_CONST(0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xd576e735, 0x57a4501d, 0xdfe92f46, 0x681b209f),
4658 SECP256K1_SCALAR_CONST(0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xd576e735, 0x57a4501d, 0xdfe92f46, 0x681b20a0),
4659 SECP256K1_SCALAR_CONST(0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xd576e735, 0x57a4501d, 0xdfe92f46, 0x681b20a1),
4660 SECP256K1_SCALAR_CONST(0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xd576e735, 0x57a4501d, 0xdfe92f46, 0x681b20a2),
4661 SECP256K1_SCALAR_CONST(0xd363ad4c, 0xc05c30e0, 0xa5261c02, 0x88126459, 0xf85915d7, 0x7825b696, 0xbeebc5c2, 0x833ede11),
4662 SECP256K1_SCALAR_CONST(0xd363ad4c, 0xc05c30e0, 0xa5261c02, 0x88126459, 0xf85915d7, 0x7825b696, 0xbeebc5c2, 0x833ede12),
4663 SECP256K1_SCALAR_CONST(0xd363ad4c, 0xc05c30e0, 0xa5261c02, 0x88126459, 0xf85915d7, 0x7825b696, 0xbeebc5c2, 0x833ede13),
4664 SECP256K1_SCALAR_CONST(0xd363ad4c, 0xc05c30e0, 0xa5261c02, 0x88126459, 0xf85915d7, 0x7825b696, 0xbeebc5c2, 0x833ede14),
4665 SECP256K1_SCALAR_CONST(0x26c75a99, 0x80b861c1, 0x4a4c3805, 0x1024c8b4, 0x704d760e, 0xe95e7cd3, 0xde1bfdb1, 0xce2c5a42),
4666 SECP256K1_SCALAR_CONST(0x26c75a99, 0x80b861c1, 0x4a4c3805, 0x1024c8b4, 0x704d760e, 0xe95e7cd3, 0xde1bfdb1, 0xce2c5a43),
4667 SECP256K1_SCALAR_CONST(0x26c75a99, 0x80b861c1, 0x4a4c3805, 0x1024c8b4, 0x704d760e, 0xe95e7cd3, 0xde1bfdb1, 0xce2c5a44),
4668 SECP256K1_SCALAR_CONST(0x26c75a99, 0x80b861c1, 0x4a4c3805, 0x1024c8b4, 0x704d760e, 0xe95e7cd3, 0xde1bfdb1, 0xce2c5a45)
4669};
4670
4671static void test_ecmult_target(const secp256k1_scalar* target, int mode) {
4672 /* Mode: 0=ecmult_gen, 1=ecmult, 2=ecmult_const */
4673 secp256k1_scalar n1, n2;
4674 secp256k1_ge p;
4675 secp256k1_gej pj, p1j, p2j, ptj;
4676
4677 /* Generate random n1,n2 such that n1+n2 = -target. */
4679 secp256k1_scalar_add(&n2, &n1, target);
4680 secp256k1_scalar_negate(&n2, &n2);
4681
4682 /* Generate a random input point. */
4683 if (mode != 0) {
4685 secp256k1_gej_set_ge(&pj, &p);
4686 }
4687
4688 /* EC multiplications */
4689 if (mode == 0) {
4693 } else if (mode == 1) {
4694 secp256k1_ecmult(&p1j, &pj, &n1, &secp256k1_scalar_zero);
4695 secp256k1_ecmult(&p2j, &pj, &n2, &secp256k1_scalar_zero);
4696 secp256k1_ecmult(&ptj, &pj, target, &secp256k1_scalar_zero);
4697 } else {
4698 secp256k1_ecmult_const(&p1j, &p, &n1);
4699 secp256k1_ecmult_const(&p2j, &p, &n2);
4700 secp256k1_ecmult_const(&ptj, &p, target);
4701 }
4702
4703 /* Add them all up: n1*P + n2*P + target*P = (n1+n2+target)*P = (n1+n1-n1-n2)*P = 0. */
4704 secp256k1_gej_add_var(&ptj, &ptj, &p1j, NULL);
4705 secp256k1_gej_add_var(&ptj, &ptj, &p2j, NULL);
4707}
4708
4710 int i;
4711 unsigned j;
4712 for (i = 0; i < 4*COUNT; ++i) {
4713 for (j = 0; j < ARRAY_SIZE(scalars_near_split_bounds); ++j) {
4717 }
4718 }
4719}
4720
4721static void run_point_times_order(void) {
4722 int i;
4723 secp256k1_fe x = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 2);
4724 static const secp256k1_fe xr = SECP256K1_FE_CONST(
4725 0x7603CB59, 0xB0EF6C63, 0xFE608479, 0x2A0C378C,
4726 0xDB3233A8, 0x0F8A9A09, 0xA877DEAD, 0x31B38C45
4727 );
4728 for (i = 0; i < 500; i++) {
4729 secp256k1_ge p;
4730 if (secp256k1_ge_set_xo_var(&p, &x, 1)) {
4731 secp256k1_gej j;
4733 secp256k1_gej_set_ge(&j, &p);
4735 }
4736 secp256k1_fe_sqr(&x, &x);
4737 }
4739 CHECK(secp256k1_fe_equal(&x, &xr));
4740}
4741
4742static void ecmult_const_random_mult(void) {
4743 /* random starting point A (on the curve) */
4745 0x6d986544, 0x57ff52b8, 0xcf1b8126, 0x5b802a5b,
4746 0xa97f9263, 0xb1e88044, 0x93351325, 0x91bc450a,
4747 0x535c59f7, 0x325e5d2b, 0xc391fbe8, 0x3c12787c,
4748 0x337e4a98, 0xe82a9011, 0x0123ba37, 0xdd769c7d
4749 );
4750 /* random initial factor xn */
4752 0x649d4f77, 0xc4242df7, 0x7f2079c9, 0x14530327,
4753 0xa31b876a, 0xd2d8ce2a, 0x2236d5c6, 0xd7b2029b
4754 );
4755 /* expected xn * A (from sage) */
4756 secp256k1_ge expected_b = SECP256K1_GE_CONST(
4757 0x23773684, 0x4d209dc7, 0x098a786f, 0x20d06fcd,
4758 0x070a38bf, 0xc11ac651, 0x03004319, 0x1e2a8786,
4759 0xed8c3b8e, 0xc06dd57b, 0xd06ea66e, 0x45492b0f,
4760 0xb84e4e1b, 0xfb77e21f, 0x96baae2a, 0x63dec956
4761 );
4762 secp256k1_gej b;
4763 secp256k1_ecmult_const(&b, &a, &xn);
4764
4766 CHECK(secp256k1_gej_eq_ge_var(&b, &expected_b));
4767}
4768
4772 secp256k1_gej res1;
4773 secp256k1_gej res2;
4774 secp256k1_ge mid1;
4775 secp256k1_ge mid2;
4778
4781 secp256k1_ge_set_gej(&mid1, &res1);
4782 secp256k1_ge_set_gej(&mid2, &res2);
4783 secp256k1_ecmult_const(&res1, &mid1, &b);
4784 secp256k1_ecmult_const(&res2, &mid2, &a);
4785 secp256k1_ge_set_gej(&mid1, &res1);
4786 secp256k1_ge_set_gej(&mid2, &res2);
4787 CHECK(secp256k1_ge_eq_var(&mid1, &mid2));
4788}
4789
4792 secp256k1_scalar negone;
4793 secp256k1_gej res1;
4794 secp256k1_ge res2;
4795 secp256k1_ge point;
4796 secp256k1_ge inf;
4797
4802
4803 /* 0*point */
4806
4807 /* s*inf */
4808 secp256k1_ecmult_const(&res1, &inf, &s);
4810
4811 /* 1*point */
4813 secp256k1_ge_set_gej(&res2, &res1);
4814 CHECK(secp256k1_ge_eq_var(&res2, &point));
4815
4816 /* -1*point */
4817 secp256k1_ecmult_const(&res1, &point, &negone);
4818 secp256k1_gej_neg(&res1, &res1);
4819 secp256k1_ge_set_gej(&res2, &res1);
4820 CHECK(secp256k1_ge_eq_var(&res2, &point));
4821}
4822
4823static void ecmult_const_check_result(const secp256k1_ge *A, const secp256k1_scalar* q, const secp256k1_gej *res) {
4824 secp256k1_gej pointj, res2j;
4825 secp256k1_ge res2;
4826 secp256k1_gej_set_ge(&pointj, A);
4827 secp256k1_ecmult(&res2j, &pointj, q, &secp256k1_scalar_zero);
4828 secp256k1_ge_set_gej(&res2, &res2j);
4829 CHECK(secp256k1_gej_eq_ge_var(res, &res2));
4830}
4831
4832static void ecmult_const_edges(void) {
4834 secp256k1_ge point;
4835 secp256k1_gej res;
4836 size_t i;
4837 size_t cases = 1 + ARRAY_SIZE(scalars_near_split_bounds);
4838
4839 /* We are trying to reach the following edge cases (variables are defined as
4840 * in ecmult_const_impl.h):
4841 * 1. i = 0: s = 0 <=> q = -K
4842 * 2. i > 0: v1, v2 large values
4843 * <=> s1, s2 large values
4844 * <=> s = scalars_near_split_bounds[i]
4845 * <=> q = 2*scalars_near_split_bounds[i] - K
4846 */
4847 for (i = 0; i < cases; ++i) {
4849 if (i > 0) {
4852 }
4854 secp256k1_ecmult_const(&res, &point, &q);
4855 ecmult_const_check_result(&point, &q, &res);
4856 }
4857}
4858
4859static void ecmult_const_mult_xonly(void) {
4860 int i;
4861
4862 /* Test correspondence between secp256k1_ecmult_const and secp256k1_ecmult_const_xonly. */
4863 for (i = 0; i < 2*COUNT; ++i) {
4864 secp256k1_ge base;
4865 secp256k1_gej basej, resj;
4866 secp256k1_fe n, d, resx, v;
4868 int res;
4869 /* Random base point. */
4871 /* Random scalar to multiply it with. */
4873 /* If i is odd, n=d*base.x for random non-zero d */
4874 if (i & 1) {
4876 secp256k1_fe_mul(&n, &base.x, &d);
4877 } else {
4878 n = base.x;
4879 }
4880 /* Perform x-only multiplication. */
4881 res = secp256k1_ecmult_const_xonly(&resx, &n, (i & 1) ? &d : NULL, &q, i & 2);
4882 CHECK(res);
4883 /* Perform normal multiplication. */
4884 secp256k1_gej_set_ge(&basej, &base);
4885 secp256k1_ecmult(&resj, &basej, &q, NULL);
4886 /* Check that resj's X coordinate corresponds with resx. */
4887 secp256k1_fe_sqr(&v, &resj.z);
4888 secp256k1_fe_mul(&v, &v, &resx);
4889 CHECK(fe_equal(&v, &resj.x));
4890 }
4891
4892 /* Test that secp256k1_ecmult_const_xonly correctly rejects X coordinates not on curve. */
4893 for (i = 0; i < 2*COUNT; ++i) {
4894 secp256k1_fe x, n, d, r;
4895 int res;
4898 /* Generate random X coordinate not on the curve. */
4899 do {
4901 } while (secp256k1_ge_x_on_curve_var(&x));
4902 /* If i is odd, n=d*x for random non-zero d. */
4903 if (i & 1) {
4905 secp256k1_fe_mul(&n, &x, &d);
4906 } else {
4907 n = x;
4908 }
4909 res = secp256k1_ecmult_const_xonly(&r, &n, (i & 1) ? &d : NULL, &q, 0);
4910 CHECK(res == 0);
4911 }
4912}
4913
4915 /* Check known result (randomly generated test problem from sage) */
4917 0x4968d524, 0x2abf9b7a, 0x466abbcf, 0x34b11b6d,
4918 0xcd83d307, 0x827bed62, 0x05fad0ce, 0x18fae63b
4919 );
4920 const secp256k1_gej expected_point = SECP256K1_GEJ_CONST(
4921 0x5494c15d, 0x32099706, 0xc2395f94, 0x348745fd,
4922 0x757ce30e, 0x4e8c90fb, 0xa2bad184, 0xf883c69f,
4923 0x5d195d20, 0xe191bf7f, 0x1be3e55f, 0x56a80196,
4924 0x6071ad01, 0xf1462f66, 0xc997fa94, 0xdb858435
4925 );
4926 secp256k1_gej point;
4927 secp256k1_ge res;
4928 int i;
4929
4931 for (i = 0; i < 100; ++i) {
4932 secp256k1_ge tmp;
4933 secp256k1_ge_set_gej(&tmp, &point);
4934 secp256k1_ecmult_const(&point, &tmp, &scalar);
4935 }
4936 secp256k1_ge_set_gej(&res, &point);
4937 CHECK(secp256k1_gej_eq_ge_var(&expected_point, &res));
4938}
4939
4940static void run_ecmult_const_tests(void) {
4947}
4948
4949typedef struct {
4953
4954static int ecmult_multi_callback(secp256k1_scalar *sc, secp256k1_ge *pt, size_t idx, void *cbdata) {
4956 *sc = data->sc[idx];
4957 *pt = data->pt[idx];
4958 return 1;
4959}
4960
4961static int ecmult_multi_false_callback(secp256k1_scalar *sc, secp256k1_ge *pt, size_t idx, void *cbdata) {
4962 (void)sc;
4963 (void)pt;
4964 (void)idx;
4965 (void)cbdata;
4966 return 0;
4967}
4968
4970 int ncount;
4971 secp256k1_scalar sc[32];
4972 secp256k1_ge pt[32];
4973 secp256k1_gej r;
4974 secp256k1_gej r2;
4976
4977 data.sc = sc;
4978 data.pt = pt;
4979
4980 /* No points to multiply */
4981 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, NULL, ecmult_multi_callback, &data, 0));
4982
4983 /* Check 1- and 2-point multiplies against ecmult */
4984 for (ncount = 0; ncount < COUNT; ncount++) {
4985 secp256k1_ge ptg;
4986 secp256k1_gej ptgj;
4989
4991 secp256k1_gej_set_ge(&ptgj, &ptg);
4992 pt[0] = ptg;
4993 pt[1] = secp256k1_ge_const_g;
4994
4995 /* only G scalar */
4996 secp256k1_ecmult(&r2, &ptgj, &secp256k1_scalar_zero, &sc[0]);
4997 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &sc[0], ecmult_multi_callback, &data, 0));
4998 CHECK(secp256k1_gej_eq_var(&r, &r2));
4999
5000 /* 1-point */
5001 secp256k1_ecmult(&r2, &ptgj, &sc[0], &secp256k1_scalar_zero);
5002 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &secp256k1_scalar_zero, ecmult_multi_callback, &data, 1));
5003 CHECK(secp256k1_gej_eq_var(&r, &r2));
5004
5005 /* Try to multiply 1 point, but callback returns false */
5006 CHECK(!ecmult_multi(&CTX->error_callback, scratch, &r, &secp256k1_scalar_zero, ecmult_multi_false_callback, &data, 1));
5007
5008 /* 2-point */
5009 secp256k1_ecmult(&r2, &ptgj, &sc[0], &sc[1]);
5010 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &secp256k1_scalar_zero, ecmult_multi_callback, &data, 2));
5011 CHECK(secp256k1_gej_eq_var(&r, &r2));
5012
5013 /* 2-point with G scalar */
5014 secp256k1_ecmult(&r2, &ptgj, &sc[0], &sc[1]);
5015 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &sc[1], ecmult_multi_callback, &data, 1));
5016 CHECK(secp256k1_gej_eq_var(&r, &r2));
5017 }
5018
5019 /* Check infinite outputs of various forms */
5020 for (ncount = 0; ncount < COUNT; ncount++) {
5021 secp256k1_ge ptg;
5022 size_t i, j;
5023 size_t sizes[] = { 2, 10, 32 };
5024
5025 for (j = 0; j < 3; j++) {
5026 for (i = 0; i < 32; i++) {
5029 }
5030 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &secp256k1_scalar_zero, ecmult_multi_callback, &data, sizes[j]));
5032 }
5033
5034 for (j = 0; j < 3; j++) {
5035 for (i = 0; i < 32; i++) {
5037 pt[i] = ptg;
5038 secp256k1_scalar_set_int(&sc[i], 0);
5039 }
5040 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &secp256k1_scalar_zero, ecmult_multi_callback, &data, sizes[j]));
5042 }
5043
5044 for (j = 0; j < 3; j++) {
5046 for (i = 0; i < 16; i++) {
5048 secp256k1_scalar_negate(&sc[2*i + 1], &sc[2*i]);
5049 pt[2 * i] = ptg;
5050 pt[2 * i + 1] = ptg;
5051 }
5052
5053 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &secp256k1_scalar_zero, ecmult_multi_callback, &data, sizes[j]));
5055
5057 for (i = 0; i < 16; i++) {
5059
5060 sc[2*i] = sc[0];
5061 sc[2*i+1] = sc[0];
5062 pt[2 * i] = ptg;
5063 secp256k1_ge_neg(&pt[2*i+1], &pt[2*i]);
5064 }
5065
5066 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &secp256k1_scalar_zero, ecmult_multi_callback, &data, sizes[j]));
5068 }
5069
5071 secp256k1_scalar_set_int(&sc[0], 0);
5072 pt[0] = ptg;
5073 for (i = 1; i < 32; i++) {
5074 pt[i] = ptg;
5075
5077 secp256k1_scalar_add(&sc[0], &sc[0], &sc[i]);
5078 secp256k1_scalar_negate(&sc[i], &sc[i]);
5079 }
5080
5081 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &secp256k1_scalar_zero, ecmult_multi_callback, &data, 32));
5083 }
5084
5085 /* Check random points, constant scalar */
5086 for (ncount = 0; ncount < COUNT; ncount++) {
5087 size_t i;
5089
5091 for (i = 0; i < 20; i++) {
5092 secp256k1_ge ptg;
5093 sc[i] = sc[0];
5095 pt[i] = ptg;
5096 secp256k1_gej_add_ge_var(&r, &r, &pt[i], NULL);
5097 }
5098
5099 secp256k1_ecmult(&r2, &r, &sc[0], &secp256k1_scalar_zero);
5100 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &secp256k1_scalar_zero, ecmult_multi_callback, &data, 20));
5101 CHECK(secp256k1_gej_eq_var(&r, &r2));
5102 }
5103
5104 /* Check random scalars, constant point */
5105 for (ncount = 0; ncount < COUNT; ncount++) {
5106 size_t i;
5107 secp256k1_ge ptg;
5108 secp256k1_gej p0j;
5111
5113 for (i = 0; i < 20; i++) {
5115 pt[i] = ptg;
5116 secp256k1_scalar_add(&rs, &rs, &sc[i]);
5117 }
5118
5119 secp256k1_gej_set_ge(&p0j, &pt[0]);
5120 secp256k1_ecmult(&r2, &p0j, &rs, &secp256k1_scalar_zero);
5121 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &secp256k1_scalar_zero, ecmult_multi_callback, &data, 20));
5122 CHECK(secp256k1_gej_eq_var(&r, &r2));
5123 }
5124
5125 /* Sanity check that zero scalars don't cause problems */
5126 for (ncount = 0; ncount < 20; ncount++) {
5127 testutil_random_scalar_order(&sc[ncount]);
5128 testutil_random_ge_test(&pt[ncount]);
5129 }
5130
5131 secp256k1_scalar_set_int(&sc[0], 0);
5132 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &secp256k1_scalar_zero, ecmult_multi_callback, &data, 20));
5133 secp256k1_scalar_set_int(&sc[1], 0);
5134 secp256k1_scalar_set_int(&sc[2], 0);
5135 secp256k1_scalar_set_int(&sc[3], 0);
5136 secp256k1_scalar_set_int(&sc[4], 0);
5137 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &secp256k1_scalar_zero, ecmult_multi_callback, &data, 6));
5138 CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &secp256k1_scalar_zero, ecmult_multi_callback, &data, 5));
5140
5141 /* Run through s0*(t0*P) + s1*(t1*P) exhaustively for many small values of s0, s1, t0, t1 */
5142 {
5143 const size_t TOP = 8;
5144 size_t s0i, s1i;
5145 size_t t0i, t1i;
5146 secp256k1_ge ptg;
5147 secp256k1_gej ptgj;
5148
5150 secp256k1_gej_set_ge(&ptgj, &ptg);
5151
5152 for(t0i = 0; t0i < TOP; t0i++) {
5153 for(t1i = 0; t1i < TOP; t1i++) {
5154 secp256k1_gej t0p, t1p;
5155 secp256k1_scalar t0, t1;
5156
5157 secp256k1_scalar_set_int(&t0, (t0i + 1) / 2);
5158 secp256k1_scalar_cond_negate(&t0, t0i & 1);
5159 secp256k1_scalar_set_int(&t1, (t1i + 1) / 2);
5160 secp256k1_scalar_cond_negate(&t1, t1i & 1);
5161
5162 secp256k1_ecmult(&t0p, &ptgj, &t0, &secp256k1_scalar_zero);
5163 secp256k1_ecmult(&t1p, &ptgj, &t1, &secp256k1_scalar_zero);
5164
5165 for(s0i = 0; s0i < TOP; s0i++) {
5166 for(s1i = 0; s1i < TOP; s1i++) {
5167 secp256k1_scalar tmp1, tmp2;
5168 secp256k1_gej expected, actual;
5169
5170 secp256k1_ge_set_gej(&pt[0], &t0p);
5171 secp256k1_ge_set_gej(&pt[1], &t1p);
5172
5173 secp256k1_scalar_set_int(&sc[0], (s0i + 1) / 2);
5174 secp256k1_scalar_cond_negate(&sc[0], s0i & 1);
5175 secp256k1_scalar_set_int(&sc[1], (s1i + 1) / 2);
5176 secp256k1_scalar_cond_negate(&sc[1], s1i & 1);
5177
5178 secp256k1_scalar_mul(&tmp1, &t0, &sc[0]);
5179 secp256k1_scalar_mul(&tmp2, &t1, &sc[1]);
5180 secp256k1_scalar_add(&tmp1, &tmp1, &tmp2);
5181
5182 secp256k1_ecmult(&expected, &ptgj, &tmp1, &secp256k1_scalar_zero);
5183 CHECK(ecmult_multi(&CTX->error_callback, scratch, &actual, &secp256k1_scalar_zero, ecmult_multi_callback, &data, 2));
5184 CHECK(secp256k1_gej_eq_var(&actual, &expected));
5185 }
5186 }
5187 }
5188 }
5189 }
5190}
5191
5193 /* Large random test for ecmult_multi_* functions which exercises:
5194 * - Few or many inputs (0 up to 128, roughly exponentially distributed).
5195 * - Few or many 0*P or a*INF inputs (roughly uniformly distributed).
5196 * - Including or excluding an nonzero a*G term (or such a term at all).
5197 * - Final expected result equal to infinity or not (roughly 50%).
5198 * - ecmult_multi_var, ecmult_strauss_single_batch, ecmult_pippenger_single_batch
5199 */
5200
5201 /* These 4 variables define the eventual input to the ecmult_multi function.
5202 * g_scalar is the G scalar fed to it (or NULL, possibly, if g_scalar=0), and
5203 * scalars[0..filled-1] and gejs[0..filled-1] are the scalars and points
5204 * which form its normal inputs. */
5205 int filled = 0;
5207 secp256k1_scalar scalars[128];
5208 secp256k1_gej gejs[128];
5209 /* The expected result, and the computed result. */
5210 secp256k1_gej expected, computed;
5211 /* Temporaries. */
5212 secp256k1_scalar sc_tmp;
5213 secp256k1_ge ge_tmp;
5214 /* Variables needed for the actual input to ecmult_multi. */
5215 secp256k1_ge ges[128];
5217
5218 int i;
5219 /* Which multiplication function to use */
5220 int fn = testrand_int(3);
5224 /* Simulate exponentially distributed num. */
5225 int num_bits = 2 + testrand_int(6);
5226 /* Number of (scalar, point) inputs (excluding g). */
5227 int num = testrand_int((1 << num_bits) + 1);
5228 /* Number of those which are nonzero. */
5229 int num_nonzero = testrand_int(num + 1);
5230 /* Whether we're aiming to create an input with nonzero expected result. */
5231 int nonzero_result = testrand_bits(1);
5232 /* Whether we will provide nonzero g multiplicand. In some cases our hand
5233 * is forced here based on num_nonzero and nonzero_result. */
5234 int g_nonzero = num_nonzero == 0 ? nonzero_result :
5235 num_nonzero == 1 && !nonzero_result ? 1 :
5236 (int)testrand_bits(1);
5237 /* Which g_scalar pointer to pass into ecmult_multi(). */
5238 const secp256k1_scalar* g_scalar_ptr = (g_nonzero || testrand_bits(1)) ? &g_scalar : NULL;
5239 /* How many EC multiplications were performed in this function. */
5240 int mults = 0;
5241 /* How many randomization steps to apply to the input list. */
5242 int rands = (int)testrand_bits(3);
5243 if (rands > num_nonzero) rands = num_nonzero;
5244
5245 secp256k1_gej_set_infinity(&expected);
5247 secp256k1_scalar_set_int(&scalars[0], 0);
5248
5249 if (g_nonzero) {
5250 /* If g_nonzero, set g_scalar to nonzero value r. */
5252 if (!nonzero_result) {
5253 /* If expected=0 is desired, add a (a*r, -(1/a)*g) term to compensate. */
5254 CHECK(num_nonzero > filled);
5256 secp256k1_scalar_mul(&scalars[filled], &sc_tmp, &g_scalar);
5257 secp256k1_scalar_inverse_var(&sc_tmp, &sc_tmp);
5258 secp256k1_scalar_negate(&sc_tmp, &sc_tmp);
5259 secp256k1_ecmult_gen_gej(&CTX->ecmult_gen_ctx, &gejs[filled], &sc_tmp);
5260 ++filled;
5261 ++mults;
5262 }
5263 }
5264
5265 if (nonzero_result && filled < num_nonzero) {
5266 /* If a nonzero result is desired, and there is space, add a random nonzero term. */
5267 testutil_random_scalar_order_test(&scalars[filled]);
5268 testutil_random_ge_test(&ge_tmp);
5269 secp256k1_gej_set_ge(&gejs[filled], &ge_tmp);
5270 ++filled;
5271 }
5272
5273 if (nonzero_result) {
5274 /* Compute the expected result using normal ecmult. */
5275 CHECK(filled <= 1);
5276 secp256k1_ecmult(&expected, &gejs[0], &scalars[0], &g_scalar);
5277 mults += filled + g_nonzero;
5278 }
5279
5280 /* At this point we have expected = scalar_g*G + sum(scalars[i]*gejs[i] for i=0..filled-1). */
5281 CHECK(filled <= 1 + !nonzero_result);
5282 CHECK(filled <= num_nonzero);
5283
5284 /* Add entries to scalars,gejs so that there are num of them. All the added entries
5285 * either have scalar=0 or point=infinity, so these do not change the expected result. */
5286 while (filled < num) {
5287 if (testrand_bits(1)) {
5288 secp256k1_gej_set_infinity(&gejs[filled]);
5289 testutil_random_scalar_order_test(&scalars[filled]);
5290 } else {
5291 secp256k1_scalar_set_int(&scalars[filled], 0);
5292 testutil_random_ge_test(&ge_tmp);
5293 secp256k1_gej_set_ge(&gejs[filled], &ge_tmp);
5294 }
5295 ++filled;
5296 }
5297
5298 /* Now perform cheapish transformations on gejs and scalars, for indices
5299 * 0..num_nonzero-1, which do not change the expected result, but may
5300 * convert some of them to be both non-0-scalar and non-infinity-point. */
5301 for (i = 0; i < rands; ++i) {
5302 int j;
5303 secp256k1_scalar v, iv;
5304 /* Shuffle the entries. */
5305 for (j = 0; j < num_nonzero; ++j) {
5306 int k = testrand_int(num_nonzero - j);
5307 if (k != 0) {
5308 secp256k1_gej gej = gejs[j];
5309 secp256k1_scalar sc = scalars[j];
5310 gejs[j] = gejs[j + k];
5311 scalars[j] = scalars[j + k];
5312 gejs[j + k] = gej;
5313 scalars[j + k] = sc;
5314 }
5315 }
5316 /* Perturb all consecutive pairs of inputs:
5317 * a*P + b*Q -> (a+b)*P + b*(Q-P). */
5318 for (j = 0; j + 1 < num_nonzero; j += 2) {
5319 secp256k1_gej gej;
5320 secp256k1_scalar_add(&scalars[j], &scalars[j], &scalars[j+1]);
5321 secp256k1_gej_neg(&gej, &gejs[j]);
5322 secp256k1_gej_add_var(&gejs[j+1], &gejs[j+1], &gej, NULL);
5323 }
5324 /* Transform the last input: a*P -> (v*a) * ((1/v)*P). */
5325 CHECK(num_nonzero >= 1);
5327 secp256k1_scalar_inverse(&iv, &v);
5328 secp256k1_scalar_mul(&scalars[num_nonzero - 1], &scalars[num_nonzero - 1], &v);
5329 secp256k1_ecmult(&gejs[num_nonzero - 1], &gejs[num_nonzero - 1], &iv, NULL);
5330 ++mults;
5331 }
5332
5333 /* Shuffle all entries (0..num-1). */
5334 for (i = 0; i < num; ++i) {
5335 int j = testrand_int(num - i);
5336 if (j != 0) {
5337 secp256k1_gej gej = gejs[i];
5338 secp256k1_scalar sc = scalars[i];
5339 gejs[i] = gejs[i + j];
5340 scalars[i] = scalars[i + j];
5341 gejs[i + j] = gej;
5342 scalars[i + j] = sc;
5343 }
5344 }
5345
5346 /* Compute affine versions of all inputs. */
5347 secp256k1_ge_set_all_gej_var(ges, gejs, filled);
5348 /* Invoke ecmult_multi code. */
5349 data.sc = scalars;
5350 data.pt = ges;
5351 CHECK(ecmult_multi(&CTX->error_callback, scratch, &computed, g_scalar_ptr, ecmult_multi_callback, &data, filled));
5352 mults += num_nonzero + g_nonzero;
5353 /* Compare with expected result. */
5354 CHECK(secp256k1_gej_eq_var(&computed, &expected));
5355 return mults;
5356}
5357
5360 secp256k1_ge pt;
5361 secp256k1_gej r;
5363 secp256k1_scratch *scratch_empty;
5364
5367 data.sc = &sc;
5368 data.pt = &pt;
5369
5370 /* Try to multiply 1 point, but scratch space is empty.*/
5371 scratch_empty = secp256k1_scratch_create(&CTX->error_callback, 0);
5372 CHECK(!ecmult_multi(&CTX->error_callback, scratch_empty, &r, &secp256k1_scalar_zero, ecmult_multi_callback, &data, 1));
5374}
5375
5377 int i;
5378
5380 for(i = 1; i <= PIPPENGER_MAX_BUCKET_WINDOW; i++) {
5381 /* Bucket_window of 8 is not used with endo */
5382 if (i == 8) {
5383 continue;
5384 }
5386 if (i != PIPPENGER_MAX_BUCKET_WINDOW) {
5388 }
5389 }
5390}
5391
5397 size_t scratch_size = testrand_bits(8);
5399 secp256k1_scratch *scratch;
5400 size_t n_points_supported;
5401 int bucket_window = 0;
5402
5403 for(; scratch_size < max_size; scratch_size+=256) {
5404 size_t i;
5405 size_t total_alloc;
5406 size_t checkpoint;
5407 scratch = secp256k1_scratch_create(&CTX->error_callback, scratch_size);
5408 CHECK(scratch != NULL);
5409 checkpoint = secp256k1_scratch_checkpoint(&CTX->error_callback, scratch);
5410 n_points_supported = secp256k1_pippenger_max_points(&CTX->error_callback, scratch);
5411 if (n_points_supported == 0) {
5413 continue;
5414 }
5415 bucket_window = secp256k1_pippenger_bucket_window(n_points_supported);
5416 /* allocate `total_alloc` bytes over `PIPPENGER_SCRATCH_OBJECTS` many allocations */
5417 total_alloc = secp256k1_pippenger_scratch_size(n_points_supported, bucket_window);
5418 for (i = 0; i < PIPPENGER_SCRATCH_OBJECTS - 1; i++) {
5420 total_alloc--;
5421 }
5422 CHECK(secp256k1_scratch_alloc(&CTX->error_callback, scratch, total_alloc));
5425 }
5426 CHECK(bucket_window == PIPPENGER_MAX_BUCKET_WINDOW);
5427}
5428
5430 size_t n_batches, n_batch_points, max_n_batch_points, n;
5431
5432 max_n_batch_points = 0;
5433 n = 1;
5434 CHECK(secp256k1_ecmult_multi_batch_size_helper(&n_batches, &n_batch_points, max_n_batch_points, n) == 0);
5435
5436 max_n_batch_points = 1;
5437 n = 0;
5438 CHECK(secp256k1_ecmult_multi_batch_size_helper(&n_batches, &n_batch_points, max_n_batch_points, n) == 1);
5439 CHECK(n_batches == 0);
5440 CHECK(n_batch_points == 0);
5441
5442 max_n_batch_points = 2;
5443 n = 5;
5444 CHECK(secp256k1_ecmult_multi_batch_size_helper(&n_batches, &n_batch_points, max_n_batch_points, n) == 1);
5445 CHECK(n_batches == 3);
5446 CHECK(n_batch_points == 2);
5447
5448 max_n_batch_points = ECMULT_MAX_POINTS_PER_BATCH;
5450 CHECK(secp256k1_ecmult_multi_batch_size_helper(&n_batches, &n_batch_points, max_n_batch_points, n) == 1);
5451 CHECK(n_batches == 1);
5452 CHECK(n_batch_points == ECMULT_MAX_POINTS_PER_BATCH);
5453
5454 max_n_batch_points = ECMULT_MAX_POINTS_PER_BATCH + 1;
5456 CHECK(secp256k1_ecmult_multi_batch_size_helper(&n_batches, &n_batch_points, max_n_batch_points, n) == 1);
5457 CHECK(n_batches == 2);
5458 CHECK(n_batch_points == ECMULT_MAX_POINTS_PER_BATCH/2 + 1);
5459
5460 max_n_batch_points = 1;
5461 n = SIZE_MAX;
5462 CHECK(secp256k1_ecmult_multi_batch_size_helper(&n_batches, &n_batch_points, max_n_batch_points, n) == 1);
5463 CHECK(n_batches == SIZE_MAX);
5464 CHECK(n_batch_points == 1);
5465
5466 max_n_batch_points = 2;
5467 n = SIZE_MAX;
5468 CHECK(secp256k1_ecmult_multi_batch_size_helper(&n_batches, &n_batch_points, max_n_batch_points, n) == 1);
5469 CHECK(n_batches == SIZE_MAX/2 + 1);
5470 CHECK(n_batch_points == 2);
5471}
5472
5478 static const int n_points = 2*ECMULT_PIPPENGER_THRESHOLD;
5479 secp256k1_scalar scG;
5481 secp256k1_ge *pt = checked_malloc(&CTX->error_callback, sizeof(secp256k1_ge) * n_points);
5482 secp256k1_gej r;
5483 secp256k1_gej r2;
5485 int i;
5486 secp256k1_scratch *scratch;
5487
5489
5490 /* Get random scalars and group elements and compute result */
5492 secp256k1_ecmult(&r2, &r2, &secp256k1_scalar_zero, &scG);
5493 for(i = 0; i < n_points; i++) {
5494 secp256k1_ge ptg;
5495 secp256k1_gej ptgj;
5497 secp256k1_gej_set_ge(&ptgj, &ptg);
5498 pt[i] = ptg;
5500 secp256k1_ecmult(&ptgj, &ptgj, &sc[i], NULL);
5501 secp256k1_gej_add_var(&r2, &r2, &ptgj, NULL);
5502 }
5503 data.sc = sc;
5504 data.pt = pt;
5505 secp256k1_gej_neg(&r2, &r2);
5506
5507 /* Test with empty scratch space. It should compute the correct result using
5508 * ecmult_mult_simple algorithm which doesn't require a scratch space. */
5511 secp256k1_gej_add_var(&r, &r, &r2, NULL);
5514
5515 /* Test with space for 1 point in pippenger. That's not enough because
5516 * ecmult_multi selects strauss which requires more memory. It should
5517 * therefore select the simple algorithm. */
5520 secp256k1_gej_add_var(&r, &r, &r2, NULL);
5523
5524 for(i = 1; i <= n_points; i++) {
5526 int bucket_window = secp256k1_pippenger_bucket_window(i);
5527 size_t scratch_size = secp256k1_pippenger_scratch_size(i, bucket_window);
5529 } else {
5530 size_t scratch_size = secp256k1_strauss_scratch_size(i);
5532 }
5534 secp256k1_gej_add_var(&r, &r, &r2, NULL);
5537 }
5538 free(sc);
5539 free(pt);
5540}
5541
5542static void run_ecmult_multi_tests(void) {
5543 secp256k1_scratch *scratch;
5544 int64_t todo = (int64_t)320 * COUNT;
5545
5548 scratch = secp256k1_scratch_create(&CTX->error_callback, 819200);
5555 while (todo > 0) {
5556 todo -= test_ecmult_multi_random(scratch);
5557 }
5559
5560 /* Run test_ecmult_multi with space for exactly one point */
5564
5567}
5568
5569static void test_wnaf(const secp256k1_scalar *number, int w) {
5570 secp256k1_scalar x, two, t;
5571 int wnaf[256];
5572 int zeroes = -1;
5573 int i;
5574 int bits;
5576 secp256k1_scalar_set_int(&two, 2);
5577 bits = secp256k1_ecmult_wnaf(wnaf, 256, number, w);
5578 CHECK(bits <= 256);
5579 for (i = bits-1; i >= 0; i--) {
5580 int v = wnaf[i];
5581 secp256k1_scalar_mul(&x, &x, &two);
5582 if (v) {
5583 CHECK(zeroes == -1 || zeroes >= w-1); /* check that distance between non-zero elements is at least w-1 */
5584 zeroes=0;
5585 CHECK((v & 1) == 1); /* check non-zero elements are odd */
5586 CHECK(v <= (1 << (w-1)) - 1); /* check range below */
5587 CHECK(v >= -(1 << (w-1)) - 1); /* check range above */
5588 } else {
5589 CHECK(zeroes != -1); /* check that no unnecessary zero padding exists */
5590 zeroes++;
5591 }
5592 if (v >= 0) {
5594 } else {
5597 }
5598 secp256k1_scalar_add(&x, &x, &t);
5599 }
5600 CHECK(secp256k1_scalar_eq(&x, number)); /* check that wnaf represents number */
5601}
5602
5603static void test_fixed_wnaf(const secp256k1_scalar *number, int w) {
5604 secp256k1_scalar x, shift;
5605 int wnaf[256] = {0};
5606 int i;
5607 int skew;
5608 secp256k1_scalar num, unused;
5609
5611 secp256k1_scalar_set_int(&shift, 1 << w);
5612 /* Make num a 128-bit scalar. */
5613 secp256k1_scalar_split_128(&num, &unused, number);
5614 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
5615
5616 for (i = WNAF_SIZE(w)-1; i >= 0; --i) {
5618 int v = wnaf[i];
5619 CHECK(v == 0 || v & 1); /* check parity */
5620 CHECK(v > -(1 << w)); /* check range above */
5621 CHECK(v < (1 << w)); /* check range below */
5622
5623 secp256k1_scalar_mul(&x, &x, &shift);
5624 if (v >= 0) {
5626 } else {
5629 }
5630 secp256k1_scalar_add(&x, &x, &t);
5631 }
5632 /* If skew is 1 then add 1 to num */
5633 secp256k1_scalar_cadd_bit(&num, 0, skew == 1);
5634 CHECK(secp256k1_scalar_eq(&x, &num));
5635}
5636
5637/* Checks that the first 8 elements of wnaf are equal to wnaf_expected and the
5638 * rest is 0.*/
5639static void test_fixed_wnaf_small_helper(int *wnaf, int *wnaf_expected, int w) {
5640 int i;
5641 for (i = WNAF_SIZE(w)-1; i >= 8; --i) {
5642 CHECK(wnaf[i] == 0);
5643 }
5644 for (i = 7; i >= 0; --i) {
5645 CHECK(wnaf[i] == wnaf_expected[i]);
5646 }
5647}
5648
5649static void test_fixed_wnaf_small(void) {
5650 int w = 4;
5651 int wnaf[256] = {0};
5652 int i;
5653 int skew;
5654 secp256k1_scalar num;
5655
5656 secp256k1_scalar_set_int(&num, 0);
5657 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
5658 for (i = WNAF_SIZE(w)-1; i >= 0; --i) {
5659 int v = wnaf[i];
5660 CHECK(v == 0);
5661 }
5662 CHECK(skew == 0);
5663
5664 secp256k1_scalar_set_int(&num, 1);
5665 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
5666 for (i = WNAF_SIZE(w)-1; i >= 1; --i) {
5667 int v = wnaf[i];
5668 CHECK(v == 0);
5669 }
5670 CHECK(wnaf[0] == 1);
5671 CHECK(skew == 0);
5672
5673 {
5674 int wnaf_expected[8] = { 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf };
5675 secp256k1_scalar_set_int(&num, 0xffffffff);
5676 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
5677 test_fixed_wnaf_small_helper(wnaf, wnaf_expected, w);
5678 CHECK(skew == 0);
5679 }
5680 {
5681 int wnaf_expected[8] = { -1, -1, -1, -1, -1, -1, -1, 0xf };
5682 secp256k1_scalar_set_int(&num, 0xeeeeeeee);
5683 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
5684 test_fixed_wnaf_small_helper(wnaf, wnaf_expected, w);
5685 CHECK(skew == 1);
5686 }
5687 {
5688 int wnaf_expected[8] = { 1, 0, 1, 0, 1, 0, 1, 0 };
5689 secp256k1_scalar_set_int(&num, 0x01010101);
5690 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
5691 test_fixed_wnaf_small_helper(wnaf, wnaf_expected, w);
5692 CHECK(skew == 0);
5693 }
5694 {
5695 int wnaf_expected[8] = { -0xf, 0, 0xf, -0xf, 0, 0xf, 1, 0 };
5696 secp256k1_scalar_set_int(&num, 0x01ef1ef1);
5697 skew = secp256k1_wnaf_fixed(wnaf, &num, w);
5698 test_fixed_wnaf_small_helper(wnaf, wnaf_expected, w);
5699 CHECK(skew == 0);
5700 }
5701}
5702
5703static void run_wnaf(void) {
5704 int i;
5706
5707 /* Test 0 for fixed wnaf */
5709 /* Random tests */
5710 for (i = 0; i < COUNT; i++) {
5712 test_wnaf(&n, 4+(i%10));
5713 test_fixed_wnaf(&n, 4 + (i % 10));
5714 }
5716 CHECK(secp256k1_scalar_cond_negate(&n, 1) == -1);
5720}
5721
5722static int test_ecmult_accumulate_cb(secp256k1_scalar* sc, secp256k1_ge* pt, size_t idx, void* data) {
5723 const secp256k1_scalar* indata = (const secp256k1_scalar*)data;
5724 *sc = *indata;
5726 CHECK(idx == 0);
5727 return 1;
5728}
5729
5731 /* Compute x*G in many different ways, serialize it uncompressed, and feed it into acc. */
5732 secp256k1_gej gj, infj;
5733 secp256k1_ge r;
5734 secp256k1_gej rj[7];
5735 unsigned char bytes[65];
5736 size_t i;
5740 secp256k1_ecmult(&rj[1], &gj, x, NULL);
5741 secp256k1_ecmult(&rj[2], &gj, x, &secp256k1_scalar_zero);
5742 secp256k1_ecmult(&rj[3], &infj, &secp256k1_scalar_zero, x);
5743 CHECK(secp256k1_ecmult_multi_var(&CTX->error_callback, scratch, &rj[4], x, NULL, NULL, 0));
5746 secp256k1_ge_set_gej_var(&r, &rj[0]);
5747 for (i = 0; i < ARRAY_SIZE(rj); i++) {
5748 CHECK(secp256k1_gej_eq_ge_var(&rj[i], &r));
5749 }
5750 if (secp256k1_ge_is_infinity(&r)) {
5751 /* Store infinity as 0x00 */
5752 const unsigned char zerobyte[1] = {0};
5753 secp256k1_sha256_write(&CTX->hash_ctx, acc, zerobyte, 1);
5754 } else {
5755 /* Store other points using their uncompressed serialization. */
5756 secp256k1_ge_serialize65(&r, bytes);
5757 secp256k1_sha256_write(&CTX->hash_ctx, acc, bytes, sizeof(bytes));
5758 }
5759}
5760
5762 /* Using test_ecmult_accumulate, test ecmult for:
5763 * - For i in 0..36:
5764 * - Key i
5765 * - Key -i
5766 * - For i in 0..255:
5767 * - For j in 1..255 (only odd values):
5768 * - Key (j*2^i) mod order
5769 */
5771 secp256k1_sha256 acc;
5772 unsigned char b32[32];
5773 int i, j;
5775
5776 /* Expected hash of all the computed points; created with an independent
5777 * implementation. */
5778 static const unsigned char expected32[32] = {
5779 0xe4, 0x71, 0x1b, 0x4d, 0x14, 0x1e, 0x68, 0x48,
5780 0xb7, 0xaf, 0x47, 0x2b, 0x4c, 0xd2, 0x04, 0x14,
5781 0x3a, 0x75, 0x87, 0x60, 0x1a, 0xf9, 0x63, 0x60,
5782 0xd0, 0xcb, 0x1f, 0xaa, 0x85, 0x9a, 0xb7, 0xb4
5783 };
5785 for (i = 0; i <= 36; ++i) {
5787 test_ecmult_accumulate(&acc, &x, scratch);
5789 test_ecmult_accumulate(&acc, &x, scratch);
5790 };
5791 for (i = 0; i < 256; ++i) {
5792 for (j = 1; j < 256; j += 2) {
5793 int k;
5795 for (k = 0; k < i; ++k) secp256k1_scalar_add(&x, &x, &x);
5796 test_ecmult_accumulate(&acc, &x, scratch);
5797 }
5798 }
5800 CHECK(secp256k1_memcmp_var(b32, expected32, 32) == 0);
5801
5803}
5804
5805static void test_ecmult_constants_sha(uint32_t prefix, size_t iter, const unsigned char* expected32) {
5806 /* Using test_ecmult_accumulate, test ecmult for:
5807 * - Key 0
5808 * - Key 1
5809 * - Key -1
5810 * - For i in range(iter):
5811 * - Key SHA256(LE32(prefix) || LE16(i))
5812 */
5814 secp256k1_sha256 acc;
5815 unsigned char b32[32];
5816 unsigned char inp[6];
5817 size_t i;
5818 const secp256k1_hash_ctx *hash_ctx = &CTX->hash_ctx;
5820
5821 inp[0] = prefix & 0xFF;
5822 inp[1] = (prefix >> 8) & 0xFF;
5823 inp[2] = (prefix >> 16) & 0xFF;
5824 inp[3] = (prefix >> 24) & 0xFF;
5827 test_ecmult_accumulate(&acc, &x, scratch);
5829 test_ecmult_accumulate(&acc, &x, scratch);
5831 test_ecmult_accumulate(&acc, &x, scratch);
5832
5833 for (i = 0; i < iter; ++i) {
5834 secp256k1_sha256 gen;
5835 inp[4] = i & 0xff;
5836 inp[5] = (i >> 8) & 0xff;
5838 secp256k1_sha256_write(hash_ctx, &gen, inp, sizeof(inp));
5839 secp256k1_sha256_finalize(hash_ctx, &gen, b32);
5840 secp256k1_scalar_set_b32(&x, b32, NULL);
5841 test_ecmult_accumulate(&acc, &x, scratch);
5842 }
5843 secp256k1_sha256_finalize(hash_ctx, &acc, b32);
5844 CHECK(secp256k1_memcmp_var(b32, expected32, 32) == 0);
5845
5847}
5848
5849static void run_ecmult_constants(void) {
5850 /* Expected hashes of all points in the tests below. Computed using an
5851 * independent implementation. */
5852 static const unsigned char expected32_6bit20[32] = {
5853 0x68, 0xb6, 0xed, 0x6f, 0x28, 0xca, 0xc9, 0x7f,
5854 0x8e, 0x8b, 0xd6, 0xc0, 0x61, 0x79, 0x34, 0x6e,
5855 0x5a, 0x8f, 0x2b, 0xbc, 0x3e, 0x1f, 0xc5, 0x2e,
5856 0x2a, 0xd0, 0x45, 0x67, 0x7f, 0x95, 0x95, 0x8e
5857 };
5858 static const unsigned char expected32_8bit8[32] = {
5859 0x8b, 0x65, 0x8e, 0xea, 0x86, 0xae, 0x3c, 0x95,
5860 0x90, 0xb6, 0x77, 0xa4, 0x8c, 0x76, 0xd9, 0xec,
5861 0xf5, 0xab, 0x8a, 0x2f, 0xfd, 0xdb, 0x19, 0x12,
5862 0x1a, 0xee, 0xe6, 0xb7, 0x6e, 0x05, 0x3f, 0xc6
5863 };
5864 /* For every combination of 6 bit positions out of 256, restricted to
5865 * 20-bit windows (i.e., the first and last bit position are no more than
5866 * 19 bits apart), all 64 bit patterns occur in the input scalars used in
5867 * this test. */
5868 CONDITIONAL_TEST(1, "test_ecmult_constants_sha 1024") {
5869 test_ecmult_constants_sha(4808378u, 1024, expected32_6bit20);
5870 }
5871
5872 /* For every combination of 8 consecutive bit positions, all 256 bit
5873 * patterns occur in the input scalars used in this test. */
5874 CONDITIONAL_TEST(3, "test_ecmult_constants_sha 2048") {
5875 test_ecmult_constants_sha(1607366309u, 2048, expected32_8bit8);
5876 }
5877
5878 CONDITIONAL_TEST(16, "test_ecmult_constants_2bit") {
5880 }
5881}
5882
5883static void run_ecmult_gen_ge(void) {
5884 /* Test that secp256k1_ecmult_gen_ge result matches secp256k1_ecmult_gen_gej with
5885 * manual Jacobian-to-affine conversion (secp256k1_ge_set_gej) over random scalars */
5886 int i;
5887
5888 for (i = 0; i < COUNT; i++) {
5889 secp256k1_scalar scalar;
5890 secp256k1_gej result_gej;
5891 secp256k1_ge result_ge, expected_ge;
5892
5894 secp256k1_ecmult_gen_gej(&CTX->ecmult_gen_ctx, &result_gej, &scalar);
5895 secp256k1_ge_set_gej(&expected_ge, &result_gej);
5896 secp256k1_ecmult_gen_ge(&CTX->ecmult_gen_ctx, &result_ge, &scalar);
5897
5898 CHECK(secp256k1_ge_eq_var(&result_ge, &expected_ge));
5899 }
5900}
5901
5902static void test_ecmult_gen_blind(void) {
5903 /* Test ecmult_gen() blinding and confirm that the blinding changes, the affine points match, and the z's don't match. */
5904 secp256k1_scalar key;
5906 unsigned char seed32[32];
5907 secp256k1_gej pgej;
5908 secp256k1_gej pgej2;
5909 secp256k1_ge p;
5910 secp256k1_ge pge;
5913 testrand256(seed32);
5919 CHECK(!gej_xyz_equals_gej(&pgej, &pgej2));
5921 secp256k1_ge_set_gej(&pge, &pgej);
5922 CHECK(secp256k1_gej_eq_ge_var(&pgej2, &pge));
5923}
5924
5926 /* Test ecmult_gen() blinding reset and confirm that the blinding is consistent. */
5928 secp256k1_ge p1, p2;
5935 CHECK(secp256k1_ge_eq_var(&p1, &p2));
5936}
5937
5938/* Verify that ecmult_gen for scalars gn for which gn + scalar_offset = {-1,0,1}. */
5940 int i;
5941 secp256k1_gej res1, res2, res3;
5942 secp256k1_scalar gn = secp256k1_scalar_one; /* gn = 1 */
5943 secp256k1_scalar_add(&gn, &gn, &CTX->ecmult_gen_ctx.scalar_offset); /* gn = 1 + scalar_offset */
5944 secp256k1_scalar_negate(&gn, &gn); /* gn = -1 - scalar_offset */
5945
5946 for (i = -1; i < 2; ++i) {
5947 /* Run test with gn = i - scalar_offset (so that the ecmult_gen recoded value represents i). */
5949 secp256k1_ecmult(&res2, NULL, &secp256k1_scalar_zero, &gn);
5951 CHECK(secp256k1_gej_eq_var(&res1, &res2));
5952 CHECK(secp256k1_gej_eq_var(&res1, &res3));
5954 }
5955}
5956
5957static void run_ecmult_gen_blind(void) {
5958 int i;
5961 for (i = 0; i < 10; i++) {
5963 }
5964}
5965
5966/***** ENDOMORPHISH TESTS *****/
5967static void test_scalar_split(const secp256k1_scalar* full) {
5968 secp256k1_scalar s, s1, slam;
5969 const unsigned char zero[32] = {0};
5970 unsigned char tmp[32];
5971
5972 secp256k1_scalar_split_lambda(&s1, &slam, full);
5973
5974 /* check slam*lambda + s1 == full */
5976 secp256k1_scalar_add(&s, &s, &s1);
5977 CHECK(secp256k1_scalar_eq(&s, full));
5978
5979 /* check that both are <= 128 bits in size */
5980 if (secp256k1_scalar_is_high(&s1)) {
5981 secp256k1_scalar_negate(&s1, &s1);
5982 }
5983 if (secp256k1_scalar_is_high(&slam)) {
5984 secp256k1_scalar_negate(&slam, &slam);
5985 }
5986
5987 secp256k1_scalar_get_b32(tmp, &s1);
5988 CHECK(secp256k1_memcmp_var(zero, tmp, 16) == 0);
5989 secp256k1_scalar_get_b32(tmp, &slam);
5990 CHECK(secp256k1_memcmp_var(zero, tmp, 16) == 0);
5991}
5992
5993
5994static void run_endomorphism_tests(void) {
5995 unsigned i;
5996 static secp256k1_scalar s;
6004
6005 for (i = 0; i < 100U * COUNT; ++i) {
6006 secp256k1_scalar full;
6008 test_scalar_split(&full);
6009 }
6010 for (i = 0; i < ARRAY_SIZE(scalars_near_split_bounds); ++i) {
6012 }
6013}
6014
6015static void ec_pubkey_parse_pointtest(const unsigned char *input, int xvalid, int yvalid) {
6016 unsigned char pubkeyc[65];
6017 secp256k1_pubkey pubkey;
6018 secp256k1_ge ge;
6019 size_t pubkeyclen;
6020
6021 for (pubkeyclen = 3; pubkeyclen <= 65; pubkeyclen++) {
6022 /* Smaller sizes are tested exhaustively elsewhere. */
6023 int32_t i;
6024 memcpy(&pubkeyc[1], input, 64);
6025 SECP256K1_CHECKMEM_UNDEFINE(&pubkeyc[pubkeyclen], 65 - pubkeyclen);
6026 for (i = 0; i < 256; i++) {
6027 /* Try all type bytes. */
6028 int xpass;
6029 int ypass;
6030 int ysign;
6031 pubkeyc[0] = i;
6032 /* What sign does this point have? */
6033 ysign = (input[63] & 1) + 2;
6034 /* For the current type (i) do we expect parsing to work? Handled all of compressed/uncompressed/hybrid. */
6035 xpass = xvalid && (pubkeyclen == 33) && ((i & 254) == 2);
6036 /* Do we expect a parse and re-serialize as uncompressed to give a matching y? */
6037 ypass = xvalid && yvalid && ((i & 4) == ((pubkeyclen == 65) << 2)) &&
6038 ((i == 4) || ((i & 251) == ysign)) && ((pubkeyclen == 33) || (pubkeyclen == 65));
6039 if (xpass || ypass) {
6040 /* These cases must parse. */
6041 unsigned char pubkeyo[65];
6042 size_t outl;
6043 memset(&pubkey, 0, sizeof(pubkey));
6044 SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
6045 CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, pubkeyc, pubkeyclen) == 1);
6046 SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
6047 outl = 65;
6048 SECP256K1_CHECKMEM_UNDEFINE(pubkeyo, 65);
6049 CHECK(secp256k1_ec_pubkey_serialize(CTX, pubkeyo, &outl, &pubkey, SECP256K1_EC_COMPRESSED) == 1);
6050 SECP256K1_CHECKMEM_CHECK(pubkeyo, outl);
6051 CHECK(outl == 33);
6052 CHECK(secp256k1_memcmp_var(&pubkeyo[1], &pubkeyc[1], 32) == 0);
6053 CHECK((pubkeyclen != 33) || (pubkeyo[0] == pubkeyc[0]));
6054 if (ypass) {
6055 /* This test isn't always done because we decode with alternative signs, so the y won't match. */
6056 CHECK(pubkeyo[0] == ysign);
6057 CHECK(secp256k1_pubkey_load(CTX, &ge, &pubkey) == 1);
6058 memset(&pubkey, 0, sizeof(pubkey));
6059 SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
6060 secp256k1_pubkey_save(&pubkey, &ge);
6061 SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
6062 outl = 65;
6063 SECP256K1_CHECKMEM_UNDEFINE(pubkeyo, 65);
6064 CHECK(secp256k1_ec_pubkey_serialize(CTX, pubkeyo, &outl, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 1);
6065 SECP256K1_CHECKMEM_CHECK(pubkeyo, outl);
6066 CHECK(outl == 65);
6067 CHECK(pubkeyo[0] == 4);
6068 CHECK(secp256k1_memcmp_var(&pubkeyo[1], input, 64) == 0);
6069 }
6070 } else {
6071 /* These cases must fail to parse. */
6072 memset(&pubkey, 0xfe, sizeof(pubkey));
6073 SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
6074 CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, pubkeyc, pubkeyclen) == 0);
6075 SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
6076 CHECK_ILLEGAL(CTX, secp256k1_pubkey_load(CTX, &ge, &pubkey));
6077 }
6078 }
6079 }
6080}
6081
6082static void run_ec_pubkey_parse_test(void) {
6083#define SECP256K1_EC_PARSE_TEST_NVALID (12)
6084 const unsigned char valid[SECP256K1_EC_PARSE_TEST_NVALID][64] = {
6085 {
6086 /* Point with leading and trailing zeros in x and y serialization. */
6087 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x52,
6088 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6089 0x00, 0x00, 0x64, 0xef, 0xa1, 0x7b, 0x77, 0x61, 0xe1, 0xe4, 0x27, 0x06, 0x98, 0x9f, 0xb4, 0x83,
6090 0xb8, 0xd2, 0xd4, 0x9b, 0xf7, 0x8f, 0xae, 0x98, 0x03, 0xf0, 0x99, 0xb8, 0x34, 0xed, 0xeb, 0x00
6091 },
6092 {
6093 /* Point with x equal to a 3rd root of unity.*/
6094 0x7a, 0xe9, 0x6a, 0x2b, 0x65, 0x7c, 0x07, 0x10, 0x6e, 0x64, 0x47, 0x9e, 0xac, 0x34, 0x34, 0xe9,
6095 0x9c, 0xf0, 0x49, 0x75, 0x12, 0xf5, 0x89, 0x95, 0xc1, 0x39, 0x6c, 0x28, 0x71, 0x95, 0x01, 0xee,
6096 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14,
6097 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee,
6098 },
6099 {
6100 /* Point with largest x. (1/2) */
6101 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
6102 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2c,
6103 0x0e, 0x99, 0x4b, 0x14, 0xea, 0x72, 0xf8, 0xc3, 0xeb, 0x95, 0xc7, 0x1e, 0xf6, 0x92, 0x57, 0x5e,
6104 0x77, 0x50, 0x58, 0x33, 0x2d, 0x7e, 0x52, 0xd0, 0x99, 0x5c, 0xf8, 0x03, 0x88, 0x71, 0xb6, 0x7d,
6105 },
6106 {
6107 /* Point with largest x. (2/2) */
6108 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
6109 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2c,
6110 0xf1, 0x66, 0xb4, 0xeb, 0x15, 0x8d, 0x07, 0x3c, 0x14, 0x6a, 0x38, 0xe1, 0x09, 0x6d, 0xa8, 0xa1,
6111 0x88, 0xaf, 0xa7, 0xcc, 0xd2, 0x81, 0xad, 0x2f, 0x66, 0xa3, 0x07, 0xfb, 0x77, 0x8e, 0x45, 0xb2,
6112 },
6113 {
6114 /* Point with smallest x. (1/2) */
6115 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6116 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
6117 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14,
6118 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee,
6119 },
6120 {
6121 /* Point with smallest x. (2/2) */
6122 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6123 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
6124 0xbd, 0xe7, 0x0d, 0xf5, 0x19, 0x39, 0xb9, 0x4c, 0x9c, 0x24, 0x97, 0x9f, 0xa7, 0xdd, 0x04, 0xeb,
6125 0xd9, 0xb3, 0x57, 0x2d, 0xa7, 0x80, 0x22, 0x90, 0x43, 0x8a, 0xf2, 0xa6, 0x81, 0x89, 0x54, 0x41,
6126 },
6127 {
6128 /* Point with largest y. (1/3) */
6129 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6,
6130 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07,
6131 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
6132 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
6133 },
6134 {
6135 /* Point with largest y. (2/3) */
6136 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c,
6137 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73,
6138 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
6139 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
6140 },
6141 {
6142 /* Point with largest y. (3/3) */
6143 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc,
6144 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5,
6145 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
6146 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
6147 },
6148 {
6149 /* Point with smallest y. (1/3) */
6150 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6,
6151 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07,
6152 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
6154 },
6155 {
6156 /* Point with smallest y. (2/3) */
6157 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c,
6158 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73,
6159 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6160 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
6161 },
6162 {
6163 /* Point with smallest y. (3/3) */
6164 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc,
6165 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5,
6166 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6167 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01
6168 }
6169 };
6170#define SECP256K1_EC_PARSE_TEST_NXVALID (4)
6171 const unsigned char onlyxvalid[SECP256K1_EC_PARSE_TEST_NXVALID][64] = {
6172 {
6173 /* Valid if y overflow ignored (y = 1 mod p). (1/3) */
6174 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6,
6175 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07,
6176 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
6177 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
6178 },
6179 {
6180 /* Valid if y overflow ignored (y = 1 mod p). (2/3) */
6181 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c,
6182 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73,
6183 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
6184 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
6185 },
6186 {
6187 /* Valid if y overflow ignored (y = 1 mod p). (3/3)*/
6188 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc,
6189 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5,
6190 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
6191 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
6192 },
6193 {
6194 /* x on curve, y is from y^2 = x^3 + 8. */
6195 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6196 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
6197 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6198 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03
6199 }
6200 };
6201#define SECP256K1_EC_PARSE_TEST_NINVALID (7)
6202 const unsigned char invalid[SECP256K1_EC_PARSE_TEST_NINVALID][64] = {
6203 {
6204 /* x is third root of -8, y is -1 * (x^3+7); also on the curve for y^2 = x^3 + 9. */
6205 0x0a, 0x2d, 0x2b, 0xa9, 0x35, 0x07, 0xf1, 0xdf, 0x23, 0x37, 0x70, 0xc2, 0xa7, 0x97, 0x96, 0x2c,
6206 0xc6, 0x1f, 0x6d, 0x15, 0xda, 0x14, 0xec, 0xd4, 0x7d, 0x8d, 0x27, 0xae, 0x1c, 0xd5, 0xf8, 0x53,
6207 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6208 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
6209 },
6210 {
6211 /* Valid if x overflow ignored (x = 1 mod p). */
6212 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
6213 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
6214 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14,
6215 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee,
6216 },
6217 {
6218 /* Valid if x overflow ignored (x = 1 mod p). */
6219 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
6220 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,
6221 0xbd, 0xe7, 0x0d, 0xf5, 0x19, 0x39, 0xb9, 0x4c, 0x9c, 0x24, 0x97, 0x9f, 0xa7, 0xdd, 0x04, 0xeb,
6222 0xd9, 0xb3, 0x57, 0x2d, 0xa7, 0x80, 0x22, 0x90, 0x43, 0x8a, 0xf2, 0xa6, 0x81, 0x89, 0x54, 0x41,
6223 },
6224 {
6225 /* x is -1, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 5. */
6226 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
6227 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
6228 0xf4, 0x84, 0x14, 0x5c, 0xb0, 0x14, 0x9b, 0x82, 0x5d, 0xff, 0x41, 0x2f, 0xa0, 0x52, 0xa8, 0x3f,
6229 0xcb, 0x72, 0xdb, 0x61, 0xd5, 0x6f, 0x37, 0x70, 0xce, 0x06, 0x6b, 0x73, 0x49, 0xa2, 0xaa, 0x28,
6230 },
6231 {
6232 /* x is -1, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 5. */
6233 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
6234 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,
6235 0x0b, 0x7b, 0xeb, 0xa3, 0x4f, 0xeb, 0x64, 0x7d, 0xa2, 0x00, 0xbe, 0xd0, 0x5f, 0xad, 0x57, 0xc0,
6236 0x34, 0x8d, 0x24, 0x9e, 0x2a, 0x90, 0xc8, 0x8f, 0x31, 0xf9, 0x94, 0x8b, 0xb6, 0x5d, 0x52, 0x07,
6237 },
6238 {
6239 /* x is zero, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 7. */
6240 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6241 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6242 0x8f, 0x53, 0x7e, 0xef, 0xdf, 0xc1, 0x60, 0x6a, 0x07, 0x27, 0xcd, 0x69, 0xb4, 0xa7, 0x33, 0x3d,
6243 0x38, 0xed, 0x44, 0xe3, 0x93, 0x2a, 0x71, 0x79, 0xee, 0xcb, 0x4b, 0x6f, 0xba, 0x93, 0x60, 0xdc,
6244 },
6245 {
6246 /* x is zero, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 7. */
6247 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6248 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6249 0x70, 0xac, 0x81, 0x10, 0x20, 0x3e, 0x9f, 0x95, 0xf8, 0xd8, 0x32, 0x96, 0x4b, 0x58, 0xcc, 0xc2,
6250 0xc7, 0x12, 0xbb, 0x1c, 0x6c, 0xd5, 0x8e, 0x86, 0x11, 0x34, 0xb4, 0x8f, 0x45, 0x6c, 0x9b, 0x53
6251 }
6252 };
6253 const unsigned char pubkeyc[66] = {
6254 /* Serialization of G. */
6255 0x04, 0x79, 0xBE, 0x66, 0x7E, 0xF9, 0xDC, 0xBB, 0xAC, 0x55, 0xA0, 0x62, 0x95, 0xCE, 0x87, 0x0B,
6256 0x07, 0x02, 0x9B, 0xFC, 0xDB, 0x2D, 0xCE, 0x28, 0xD9, 0x59, 0xF2, 0x81, 0x5B, 0x16, 0xF8, 0x17,
6257 0x98, 0x48, 0x3A, 0xDA, 0x77, 0x26, 0xA3, 0xC4, 0x65, 0x5D, 0xA4, 0xFB, 0xFC, 0x0E, 0x11, 0x08,
6258 0xA8, 0xFD, 0x17, 0xB4, 0x48, 0xA6, 0x85, 0x54, 0x19, 0x9C, 0x47, 0xD0, 0x8F, 0xFB, 0x10, 0xD4,
6259 0xB8, 0x00
6260 };
6261 unsigned char sout[65];
6262 unsigned char shortkey[2] = { 0 };
6263 secp256k1_ge ge;
6264 secp256k1_pubkey pubkey;
6265 size_t len;
6266 int32_t i;
6267
6268 /* Nothing should be reading this far into pubkeyc. */
6269 SECP256K1_CHECKMEM_UNDEFINE(&pubkeyc[65], 1);
6270 /* Zero length claimed, fail, zeroize, no illegal arg error. */
6271 memset(&pubkey, 0xfe, sizeof(pubkey));
6272 SECP256K1_CHECKMEM_UNDEFINE(shortkey, 2);
6273 SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
6274 CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, shortkey, 0) == 0);
6275 SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
6276 CHECK_ILLEGAL(CTX, secp256k1_pubkey_load(CTX, &ge, &pubkey));
6277 /* Length one claimed, fail, zeroize, no illegal arg error. */
6278 for (i = 0; i < 256 ; i++) {
6279 memset(&pubkey, 0xfe, sizeof(pubkey));
6280 shortkey[0] = i;
6281 SECP256K1_CHECKMEM_UNDEFINE(&shortkey[1], 1);
6282 SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
6283 CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, shortkey, 1) == 0);
6284 SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
6285 CHECK_ILLEGAL(CTX, secp256k1_pubkey_load(CTX, &ge, &pubkey));
6286 }
6287 /* Length two claimed, fail, zeroize, no illegal arg error. */
6288 for (i = 0; i < 65536 ; i++) {
6289 memset(&pubkey, 0xfe, sizeof(pubkey));
6290 shortkey[0] = i & 255;
6291 shortkey[1] = i >> 8;
6292 SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
6293 CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, shortkey, 2) == 0);
6294 SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
6295 CHECK_ILLEGAL(CTX, secp256k1_pubkey_load(CTX, &ge, &pubkey));
6296 }
6297 memset(&pubkey, 0xfe, sizeof(pubkey));
6298 SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
6299 /* 33 bytes claimed on otherwise valid input starting with 0x04, fail, zeroize output, no illegal arg error. */
6300 CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, pubkeyc, 33) == 0);
6301 SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
6302 CHECK_ILLEGAL(CTX, secp256k1_pubkey_load(CTX, &ge, &pubkey));
6303 /* NULL pubkey, illegal arg error. Pubkey isn't rewritten before this step, since it's NULL into the parser. */
6304 CHECK_ILLEGAL(CTX, secp256k1_ec_pubkey_parse(CTX, NULL, pubkeyc, 65));
6305 /* NULL input string. Illegal arg and zeroize output. */
6306 memset(&pubkey, 0xfe, sizeof(pubkey));
6307 SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
6308 CHECK_ILLEGAL(CTX, secp256k1_ec_pubkey_parse(CTX, &pubkey, NULL, 65));
6309 SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
6310 CHECK_ILLEGAL(CTX, secp256k1_pubkey_load(CTX, &ge, &pubkey));
6311 /* 64 bytes claimed on input starting with 0x04, fail, zeroize output, no illegal arg error. */
6312 memset(&pubkey, 0xfe, sizeof(pubkey));
6313 SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
6314 CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, pubkeyc, 64) == 0);
6315 SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
6316 CHECK_ILLEGAL(CTX, secp256k1_pubkey_load(CTX, &ge, &pubkey));
6317 /* 66 bytes claimed, fail, zeroize output, no illegal arg error. */
6318 memset(&pubkey, 0xfe, sizeof(pubkey));
6319 SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
6320 CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, pubkeyc, 66) == 0);
6321 SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
6322 CHECK_ILLEGAL(CTX, secp256k1_pubkey_load(CTX, &ge, &pubkey));
6323 /* Valid parse. */
6324 memset(&pubkey, 0, sizeof(pubkey));
6325 SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
6326 CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, pubkeyc, 65) == 1);
6327 CHECK(secp256k1_ec_pubkey_parse(secp256k1_context_static, &pubkey, pubkeyc, 65) == 1);
6328 SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
6329 SECP256K1_CHECKMEM_UNDEFINE(&ge, sizeof(ge));
6330 CHECK(secp256k1_pubkey_load(CTX, &ge, &pubkey) == 1);
6331 SECP256K1_CHECKMEM_CHECK(&ge.x, sizeof(ge.x));
6332 SECP256K1_CHECKMEM_CHECK(&ge.y, sizeof(ge.y));
6335 /* secp256k1_ec_pubkey_serialize illegal args. */
6336 len = 65;
6338 CHECK(len == 0);
6340 len = 65;
6343 SECP256K1_CHECKMEM_CHECK(sout, 65);
6344 CHECK(len == 0);
6345 len = 65;
6346 CHECK_ILLEGAL(CTX, secp256k1_ec_pubkey_serialize(CTX, sout, &len, &pubkey, ~0));
6347 CHECK(len == 0);
6348 len = 65;
6351 SECP256K1_CHECKMEM_CHECK(sout, 65);
6352 CHECK(len == 65);
6353 /* Multiple illegal args. Should still set arg error only once. */
6355 /* Try a bunch of prefabbed points with all possible encodings. */
6356 for (i = 0; i < SECP256K1_EC_PARSE_TEST_NVALID; i++) {
6357 ec_pubkey_parse_pointtest(valid[i], 1, 1);
6358 }
6359 for (i = 0; i < SECP256K1_EC_PARSE_TEST_NXVALID; i++) {
6360 ec_pubkey_parse_pointtest(onlyxvalid[i], 1, 0);
6361 }
6362 for (i = 0; i < SECP256K1_EC_PARSE_TEST_NINVALID; i++) {
6363 ec_pubkey_parse_pointtest(invalid[i], 0, 0);
6364 }
6365}
6366
6367static void run_eckey_edge_case_test(void) {
6368 const unsigned char *orderc = secp256k1_group_order_bytes;
6369 const unsigned char zeros[sizeof(secp256k1_pubkey)] = {0x00};
6370 unsigned char ctmp[33];
6371 unsigned char ctmp2[33];
6372 secp256k1_pubkey pubkey;
6373 secp256k1_pubkey pubkey2;
6374 secp256k1_pubkey pubkey_one;
6375 secp256k1_pubkey pubkey_negone;
6376 const secp256k1_pubkey *pubkeys[3];
6377 size_t len;
6378 int i;
6379 /* Group order is too large, reject. */
6380 CHECK(secp256k1_ec_seckey_verify(CTX, orderc) == 0);
6381 SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
6382 CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey, orderc) == 0);
6383 SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
6384 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
6385 /* Maximum value is too large, reject. */
6386 memset(ctmp, 255, 32);
6388 memset(&pubkey, 1, sizeof(pubkey));
6389 SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
6390 CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey, ctmp) == 0);
6391 SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
6392 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
6393 /* Zero is too small, reject. */
6394 memset(ctmp, 0, 32);
6396 memset(&pubkey, 1, sizeof(pubkey));
6397 SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
6398 CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey, ctmp) == 0);
6399 SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
6400 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
6401 /* One must be accepted. */
6402 ctmp[31] = 0x01;
6404 memset(&pubkey, 0, sizeof(pubkey));
6405 SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
6406 CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey, ctmp) == 1);
6407 SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
6408 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0);
6409 pubkey_one = pubkey;
6410 /* Group order + 1 is too large, reject. */
6411 memcpy(ctmp, orderc, 32);
6412 ctmp[31] = 0x42;
6414 memset(&pubkey, 1, sizeof(pubkey));
6415 SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
6416 CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey, ctmp) == 0);
6417 SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
6418 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
6419 /* -1 must be accepted. */
6420 ctmp[31] = 0x40;
6422 memset(&pubkey, 0, sizeof(pubkey));
6423 SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
6424 CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey, ctmp) == 1);
6425 SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
6426 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0);
6427 pubkey_negone = pubkey;
6428 /* Tweak of zero leaves the value unchanged. */
6429 memset(ctmp2, 0, 32);
6430 CHECK(secp256k1_ec_seckey_tweak_add(CTX, ctmp, ctmp2) == 1);
6431 CHECK(secp256k1_memcmp_var(orderc, ctmp, 31) == 0 && ctmp[31] == 0x40);
6432 memcpy(&pubkey2, &pubkey, sizeof(pubkey));
6433 CHECK(secp256k1_ec_pubkey_tweak_add(CTX, &pubkey, ctmp2) == 1);
6434 CHECK(secp256k1_memcmp_var(&pubkey, &pubkey2, sizeof(pubkey)) == 0);
6435 /* Multiply tweak of zero zeroizes the output. */
6436 CHECK(secp256k1_ec_seckey_tweak_mul(CTX, ctmp, ctmp2) == 0);
6437 CHECK(secp256k1_memcmp_var(zeros, ctmp, 32) == 0);
6438 CHECK(secp256k1_ec_pubkey_tweak_mul(CTX, &pubkey, ctmp2) == 0);
6439 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(pubkey)) == 0);
6440 memcpy(&pubkey, &pubkey2, sizeof(pubkey));
6441 /* If seckey_tweak_add or seckey_tweak_mul are called with an overflowing
6442 seckey, the seckey is zeroized. */
6443 memcpy(ctmp, orderc, 32);
6444 memset(ctmp2, 0, 32);
6445 ctmp2[31] = 0x01;
6446 CHECK(secp256k1_ec_seckey_verify(CTX, ctmp2) == 1);
6448 CHECK(secp256k1_ec_seckey_tweak_add(CTX, ctmp, ctmp2) == 0);
6449 CHECK(secp256k1_memcmp_var(zeros, ctmp, 32) == 0);
6450 memcpy(ctmp, orderc, 32);
6451 CHECK(secp256k1_ec_seckey_tweak_mul(CTX, ctmp, ctmp2) == 0);
6452 CHECK(secp256k1_memcmp_var(zeros, ctmp, 32) == 0);
6453 /* If seckey_tweak_add or seckey_tweak_mul are called with an overflowing
6454 tweak, the seckey is zeroized. */
6455 memcpy(ctmp, orderc, 32);
6456 ctmp[31] = 0x40;
6457 CHECK(secp256k1_ec_seckey_tweak_add(CTX, ctmp, orderc) == 0);
6458 CHECK(secp256k1_memcmp_var(zeros, ctmp, 32) == 0);
6459 memcpy(ctmp, orderc, 32);
6460 ctmp[31] = 0x40;
6461 CHECK(secp256k1_ec_seckey_tweak_mul(CTX, ctmp, orderc) == 0);
6462 CHECK(secp256k1_memcmp_var(zeros, ctmp, 32) == 0);
6463 memcpy(ctmp, orderc, 32);
6464 ctmp[31] = 0x40;
6465 /* If pubkey_tweak_add or pubkey_tweak_mul are called with an overflowing
6466 tweak, the pubkey is zeroized. */
6467 CHECK(secp256k1_ec_pubkey_tweak_add(CTX, &pubkey, orderc) == 0);
6468 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(pubkey)) == 0);
6469 memcpy(&pubkey, &pubkey2, sizeof(pubkey));
6470 CHECK(secp256k1_ec_pubkey_tweak_mul(CTX, &pubkey, orderc) == 0);
6471 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(pubkey)) == 0);
6472 memcpy(&pubkey, &pubkey2, sizeof(pubkey));
6473 /* If the resulting key in secp256k1_ec_seckey_tweak_add and
6474 * secp256k1_ec_pubkey_tweak_add is 0 the functions fail and in the latter
6475 * case the pubkey is zeroized. */
6476 memcpy(ctmp, orderc, 32);
6477 ctmp[31] = 0x40;
6478 memset(ctmp2, 0, 32);
6479 ctmp2[31] = 1;
6480 CHECK(secp256k1_ec_seckey_tweak_add(CTX, ctmp2, ctmp) == 0);
6481 CHECK(secp256k1_memcmp_var(zeros, ctmp2, 32) == 0);
6482 ctmp2[31] = 1;
6483 CHECK(secp256k1_ec_pubkey_tweak_add(CTX, &pubkey, ctmp2) == 0);
6484 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(pubkey)) == 0);
6485 memcpy(&pubkey, &pubkey2, sizeof(pubkey));
6486 /* Tweak computation wraps and results in a key of 1. */
6487 ctmp2[31] = 2;
6488 CHECK(secp256k1_ec_seckey_tweak_add(CTX, ctmp2, ctmp) == 1);
6489 CHECK(secp256k1_memcmp_var(ctmp2, zeros, 31) == 0 && ctmp2[31] == 1);
6490 ctmp2[31] = 2;
6491 CHECK(secp256k1_ec_pubkey_tweak_add(CTX, &pubkey, ctmp2) == 1);
6492 ctmp2[31] = 1;
6493 CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey2, ctmp2) == 1);
6494 CHECK(secp256k1_memcmp_var(&pubkey, &pubkey2, sizeof(pubkey)) == 0);
6495 /* Tweak mul * 2 = 1+1. */
6496 CHECK(secp256k1_ec_pubkey_tweak_add(CTX, &pubkey, ctmp2) == 1);
6497 ctmp2[31] = 2;
6498 CHECK(secp256k1_ec_pubkey_tweak_mul(CTX, &pubkey2, ctmp2) == 1);
6499 CHECK(secp256k1_memcmp_var(&pubkey, &pubkey2, sizeof(pubkey)) == 0);
6500 /* Zeroize pubkey on parse error. */
6501 memset(&pubkey, 0, 32);
6503 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(pubkey)) == 0);
6504 memcpy(&pubkey, &pubkey2, sizeof(pubkey));
6505 memset(&pubkey2, 0, 32);
6507 CHECK(secp256k1_memcmp_var(&pubkey2, zeros, sizeof(pubkey2)) == 0);
6508 /* Plain argument errors. */
6511 memset(ctmp2, 0, 32);
6512 ctmp2[31] = 4;
6515 memset(ctmp2, 0, 32);
6516 ctmp2[31] = 4;
6519 memset(ctmp2, 0, 32);
6522 memset(ctmp2, 0, 32);
6523 ctmp2[31] = 1;
6527 memset(&pubkey, 1, sizeof(pubkey));
6529 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
6530 /* secp256k1_ec_pubkey_combine tests. */
6531 pubkeys[0] = &pubkey_one;
6532 SECP256K1_CHECKMEM_UNDEFINE(&pubkeys[0], sizeof(secp256k1_pubkey *));
6533 SECP256K1_CHECKMEM_UNDEFINE(&pubkeys[1], sizeof(secp256k1_pubkey *));
6534 SECP256K1_CHECKMEM_UNDEFINE(&pubkeys[2], sizeof(secp256k1_pubkey *));
6535 memset(&pubkey, 255, sizeof(secp256k1_pubkey));
6537 CHECK_ILLEGAL(CTX, secp256k1_ec_pubkey_combine(CTX, &pubkey, pubkeys, 0));
6539 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
6540 CHECK_ILLEGAL(CTX, secp256k1_ec_pubkey_combine(CTX, NULL, pubkeys, 1));
6541 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
6542 memset(&pubkey, 255, sizeof(secp256k1_pubkey));
6544 CHECK_ILLEGAL(CTX, secp256k1_ec_pubkey_combine(CTX, &pubkey, NULL, 1));
6546 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
6547 pubkeys[0] = &pubkey_negone;
6548 memset(&pubkey, 255, sizeof(secp256k1_pubkey));
6550 CHECK(secp256k1_ec_pubkey_combine(CTX, &pubkey, pubkeys, 1) == 1);
6552 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0);
6553 len = 33;
6555 CHECK(secp256k1_ec_pubkey_serialize(CTX, ctmp2, &len, &pubkey_negone, SECP256K1_EC_COMPRESSED) == 1);
6556 CHECK(secp256k1_memcmp_var(ctmp, ctmp2, 33) == 0);
6557 /* Result is infinity. */
6558 pubkeys[0] = &pubkey_one;
6559 pubkeys[1] = &pubkey_negone;
6560 memset(&pubkey, 255, sizeof(secp256k1_pubkey));
6562 CHECK(secp256k1_ec_pubkey_combine(CTX, &pubkey, pubkeys, 2) == 0);
6564 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
6565 /* Passes through infinity but comes out one. */
6566 pubkeys[2] = &pubkey_one;
6567 memset(&pubkey, 255, sizeof(secp256k1_pubkey));
6569 CHECK(secp256k1_ec_pubkey_combine(CTX, &pubkey, pubkeys, 3) == 1);
6571 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0);
6572 /* check that NULL in array of pubkey pointers is not allowed */
6573 for (i = 0; i < 3; i++) {
6574 const secp256k1_pubkey *original_ptr = pubkeys[i];
6575 secp256k1_pubkey result;
6576 pubkeys[i] = NULL;
6577 CHECK_ILLEGAL(CTX, secp256k1_ec_pubkey_combine(CTX, &result, pubkeys, 3));
6578 pubkeys[i] = original_ptr;
6579 }
6580 len = 33;
6582 CHECK(secp256k1_ec_pubkey_serialize(CTX, ctmp2, &len, &pubkey_one, SECP256K1_EC_COMPRESSED) == 1);
6583 CHECK(secp256k1_memcmp_var(ctmp, ctmp2, 33) == 0);
6584 /* Adds to two. */
6585 pubkeys[1] = &pubkey_one;
6586 memset(&pubkey, 255, sizeof(secp256k1_pubkey));
6588 CHECK(secp256k1_ec_pubkey_combine(CTX, &pubkey, pubkeys, 2) == 1);
6590 CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0);
6591}
6592
6593static void run_eckey_negate_test(void) {
6594 unsigned char seckey[32];
6595 unsigned char seckey_tmp[32];
6596
6598 memcpy(seckey_tmp, seckey, 32);
6599
6600 /* Verify negation changes the key and changes it back */
6601 CHECK(secp256k1_ec_seckey_negate(CTX, seckey) == 1);
6602 CHECK(secp256k1_memcmp_var(seckey, seckey_tmp, 32) != 0);
6603 CHECK(secp256k1_ec_seckey_negate(CTX, seckey) == 1);
6604 CHECK(secp256k1_memcmp_var(seckey, seckey_tmp, 32) == 0);
6605
6606 /* Negating all 0s fails */
6607 memset(seckey, 0, 32);
6608 memset(seckey_tmp, 0, 32);
6609 CHECK(secp256k1_ec_seckey_negate(CTX, seckey) == 0);
6610 /* Check that seckey is not modified */
6611 CHECK(secp256k1_memcmp_var(seckey, seckey_tmp, 32) == 0);
6612
6613 /* Negating an overflowing seckey fails and the seckey is zeroed. In this
6614 * test, the seckey has 16 random bytes to ensure that ec_seckey_negate
6615 * doesn't just set seckey to a constant value in case of failure. */
6617 memset(seckey, 0xFF, 16);
6618 memset(seckey_tmp, 0, 32);
6619 CHECK(secp256k1_ec_seckey_negate(CTX, seckey) == 0);
6620 CHECK(secp256k1_memcmp_var(seckey, seckey_tmp, 32) == 0);
6621}
6622
6623static void random_sign(secp256k1_scalar *sigr, secp256k1_scalar *sigs, const secp256k1_scalar *key, const secp256k1_scalar *msg, int *recid) {
6625 do {
6627 } while(!secp256k1_ecdsa_sig_sign(&CTX->ecmult_gen_ctx, sigr, sigs, key, msg, &nonce, recid));
6628}
6629
6630static void test_ecdsa_sign_verify(void) {
6631 secp256k1_ge pub;
6632 secp256k1_scalar one;
6633 secp256k1_scalar msg, key;
6634 secp256k1_scalar sigr, sigs;
6635 int getrec;
6636 int recid;
6640 getrec = testrand_bits(1);
6641 /* The specific way in which this conditional is written sidesteps a potential bug in clang.
6642 See the commit messages of the commit that introduced this comment for details. */
6643 if (getrec) {
6644 random_sign(&sigr, &sigs, &key, &msg, &recid);
6645 CHECK(recid >= 0 && recid < 4);
6646 } else {
6647 random_sign(&sigr, &sigs, &key, &msg, NULL);
6648 }
6649 CHECK(secp256k1_ecdsa_sig_verify(&sigr, &sigs, &pub, &msg));
6650 secp256k1_scalar_set_int(&one, 1);
6651 secp256k1_scalar_add(&msg, &msg, &one);
6652 CHECK(!secp256k1_ecdsa_sig_verify(&sigr, &sigs, &pub, &msg));
6653}
6654
6655static void run_ecdsa_sign_verify(void) {
6656 int i;
6657 for (i = 0; i < 10*COUNT; i++) {
6659 }
6660}
6661
6663static int precomputed_nonce_function(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) {
6664 (void)msg32;
6665 (void)key32;
6666 (void)algo16;
6667 memcpy(nonce32, data, 32);
6668 return (counter == 0);
6669}
6670
6671static 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) {
6672 /* Dummy nonce generator that has a fatal error on the first counter value. */
6673 if (counter == 0) {
6674 return 0;
6675 }
6676 return nonce_function_rfc6979(nonce32, msg32, key32, algo16, data, counter - 1);
6677}
6678
6679static 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) {
6680 /* Dummy nonce generator that produces unacceptable nonces for the first several counter values. */
6681 if (counter < 3) {
6682 memset(nonce32, counter==0 ? 0 : 255, 32);
6683 if (counter == 2) {
6684 nonce32[31]--;
6685 }
6686 return 1;
6687 }
6688 if (counter < 5) {
6689 memcpy(nonce32, secp256k1_group_order_bytes, 32);
6690 if (counter == 4) {
6691 nonce32[31]++;
6692 }
6693 return 1;
6694 }
6695 /* Retry rate of 6979 is negligible esp. as we only call this in deterministic tests. */
6696 /* If someone does fine a case where it retries for secp256k1, we'd like to know. */
6697 if (counter > 5) {
6698 return 0;
6699 }
6700 return nonce_function_rfc6979(nonce32, msg32, key32, algo16, data, counter - 5);
6701}
6702
6704 static const unsigned char res[sizeof(secp256k1_ecdsa_signature)] = {0};
6705 return secp256k1_memcmp_var(sig, res, sizeof(secp256k1_ecdsa_signature)) == 0;
6706}
6707
6708static void test_ecdsa_end_to_end(void) {
6709 unsigned char extra[32] = {0x00};
6710 unsigned char privkey[32];
6711 unsigned char message[32];
6712 unsigned char privkey2[32];
6713 secp256k1_ecdsa_signature signature[6];
6715 unsigned char sig[74];
6716 size_t siglen = 74;
6717 unsigned char pubkeyc[65];
6718 size_t pubkeyclen = 65;
6719 secp256k1_pubkey pubkey;
6720 secp256k1_pubkey pubkey_tmp;
6721 unsigned char seckey[300];
6722 size_t seckeylen = 300;
6723
6724 /* Generate a random key and message. */
6725 {
6726 secp256k1_scalar msg, key;
6729 secp256k1_scalar_get_b32(privkey, &key);
6730 secp256k1_scalar_get_b32(message, &msg);
6731 }
6732
6733 /* Construct and verify corresponding public key. */
6734 CHECK(secp256k1_ec_seckey_verify(CTX, privkey) == 1);
6735 CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey, privkey) == 1);
6736
6737 /* Verify exporting and importing public key. */
6739 memset(&pubkey, 0, sizeof(pubkey));
6740 CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, pubkeyc, pubkeyclen) == 1);
6741
6742 /* Verify negation changes the key and changes it back */
6743 memcpy(&pubkey_tmp, &pubkey, sizeof(pubkey));
6744 CHECK(secp256k1_ec_pubkey_negate(CTX, &pubkey_tmp) == 1);
6745 CHECK(secp256k1_memcmp_var(&pubkey_tmp, &pubkey, sizeof(pubkey)) != 0);
6746 CHECK(secp256k1_ec_pubkey_negate(CTX, &pubkey_tmp) == 1);
6747 CHECK(secp256k1_memcmp_var(&pubkey_tmp, &pubkey, sizeof(pubkey)) == 0);
6748
6749 /* Verify private key import and export. */
6750 CHECK(ec_privkey_export_der(CTX, seckey, &seckeylen, privkey, testrand_bits(1) == 1));
6751 CHECK(ec_privkey_import_der(CTX, privkey2, seckey, seckeylen) == 1);
6752 CHECK(secp256k1_memcmp_var(privkey, privkey2, 32) == 0);
6753
6754 /* Optionally tweak the keys using addition. */
6755 if (testrand_int(3) == 0) {
6756 int ret1;
6757 int ret2;
6758 unsigned char rnd[32];
6759 secp256k1_pubkey pubkey2;
6760 testrand256_test(rnd);
6761 ret1 = secp256k1_ec_seckey_tweak_add(CTX, privkey, rnd);
6762 ret2 = secp256k1_ec_pubkey_tweak_add(CTX, &pubkey, rnd);
6763 CHECK(ret1 == ret2);
6764 if (ret1 == 0) {
6765 return;
6766 }
6767 CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey2, privkey) == 1);
6768 CHECK(secp256k1_memcmp_var(&pubkey, &pubkey2, sizeof(pubkey)) == 0);
6769 }
6770
6771 /* Optionally tweak the keys using multiplication. */
6772 if (testrand_int(3) == 0) {
6773 int ret1;
6774 int ret2;
6775 unsigned char rnd[32];
6776 secp256k1_pubkey pubkey2;
6777 testrand256_test(rnd);
6778 ret1 = secp256k1_ec_seckey_tweak_mul(CTX, privkey, rnd);
6779 ret2 = secp256k1_ec_pubkey_tweak_mul(CTX, &pubkey, rnd);
6780 CHECK(ret1 == ret2);
6781 if (ret1 == 0) {
6782 return;
6783 }
6784 CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey2, privkey) == 1);
6785 CHECK(secp256k1_memcmp_var(&pubkey, &pubkey2, sizeof(pubkey)) == 0);
6786 }
6787
6788 /* Sign. */
6789 CHECK(secp256k1_ecdsa_sign(CTX, &signature[0], message, privkey, NULL, NULL) == 1);
6790 CHECK(secp256k1_ecdsa_sign(CTX, &signature[4], message, privkey, NULL, NULL) == 1);
6791 CHECK(secp256k1_ecdsa_sign(CTX, &signature[1], message, privkey, NULL, extra) == 1);
6792 extra[31] = 1;
6793 CHECK(secp256k1_ecdsa_sign(CTX, &signature[2], message, privkey, NULL, extra) == 1);
6794 extra[31] = 0;
6795 extra[0] = 1;
6796 CHECK(secp256k1_ecdsa_sign(CTX, &signature[3], message, privkey, NULL, extra) == 1);
6797 CHECK(secp256k1_memcmp_var(&signature[0], &signature[4], sizeof(signature[0])) == 0);
6798 CHECK(secp256k1_memcmp_var(&signature[0], &signature[1], sizeof(signature[0])) != 0);
6799 CHECK(secp256k1_memcmp_var(&signature[0], &signature[2], sizeof(signature[0])) != 0);
6800 CHECK(secp256k1_memcmp_var(&signature[0], &signature[3], sizeof(signature[0])) != 0);
6801 CHECK(secp256k1_memcmp_var(&signature[1], &signature[2], sizeof(signature[0])) != 0);
6802 CHECK(secp256k1_memcmp_var(&signature[1], &signature[3], sizeof(signature[0])) != 0);
6803 CHECK(secp256k1_memcmp_var(&signature[2], &signature[3], sizeof(signature[0])) != 0);
6804 /* Verify. */
6805 CHECK(secp256k1_ecdsa_verify(CTX, &signature[0], message, &pubkey) == 1);
6806 CHECK(secp256k1_ecdsa_verify(CTX, &signature[1], message, &pubkey) == 1);
6807 CHECK(secp256k1_ecdsa_verify(CTX, &signature[2], message, &pubkey) == 1);
6808 CHECK(secp256k1_ecdsa_verify(CTX, &signature[3], message, &pubkey) == 1);
6809 /* Test lower-S form, malleate, verify and fail, test again, malleate again */
6810 CHECK(!secp256k1_ecdsa_signature_normalize(CTX, NULL, &signature[0]));
6811 secp256k1_ecdsa_signature_load(CTX, &r, &s, &signature[0]);
6813 secp256k1_ecdsa_signature_save(&signature[5], &r, &s);
6814 CHECK(secp256k1_ecdsa_verify(CTX, &signature[5], message, &pubkey) == 0);
6815 CHECK(secp256k1_ecdsa_signature_normalize(CTX, NULL, &signature[5]));
6816 CHECK(secp256k1_ecdsa_signature_normalize(CTX, &signature[5], &signature[5]));
6817 CHECK(!secp256k1_ecdsa_signature_normalize(CTX, NULL, &signature[5]));
6818 CHECK(!secp256k1_ecdsa_signature_normalize(CTX, &signature[5], &signature[5]));
6819 CHECK(secp256k1_ecdsa_verify(CTX, &signature[5], message, &pubkey) == 1);
6821 secp256k1_ecdsa_signature_save(&signature[5], &r, &s);
6822 CHECK(!secp256k1_ecdsa_signature_normalize(CTX, NULL, &signature[5]));
6823 CHECK(secp256k1_ecdsa_verify(CTX, &signature[5], message, &pubkey) == 1);
6824 CHECK(secp256k1_memcmp_var(&signature[5], &signature[0], 64) == 0);
6825
6826 /* Serialize/parse DER and verify again */
6827 CHECK(secp256k1_ecdsa_signature_serialize_der(CTX, sig, &siglen, &signature[0]) == 1);
6828 memset(&signature[0], 0, sizeof(signature[0]));
6829 CHECK(secp256k1_ecdsa_signature_parse_der(CTX, &signature[0], sig, siglen) == 1);
6830 CHECK(secp256k1_ecdsa_verify(CTX, &signature[0], message, &pubkey) == 1);
6831 /* Serializing into a buffer of exactly the required size succeeds and
6832 * yields the same encoding; one byte less fails and reports the size. */
6833 {
6834 unsigned char sig2[74];
6835 size_t siglen2 = siglen;
6836 CHECK(secp256k1_ecdsa_signature_serialize_der(CTX, sig2, &siglen2, &signature[0]) == 1);
6837 CHECK(siglen2 == siglen);
6838 CHECK(secp256k1_memcmp_var(sig2, sig, siglen) == 0);
6839 siglen2 = siglen - 1;
6840 CHECK(secp256k1_ecdsa_signature_serialize_der(CTX, sig2, &siglen2, &signature[0]) == 0);
6841 CHECK(siglen2 == siglen);
6842 }
6843 /* Serialize/destroy/parse DER and verify again. */
6844 siglen = 74;
6845 CHECK(secp256k1_ecdsa_signature_serialize_der(CTX, sig, &siglen, &signature[0]) == 1);
6846 sig[testrand_int(siglen)] += 1 + testrand_int(255);
6847 CHECK(secp256k1_ecdsa_signature_parse_der(CTX, &signature[0], sig, siglen) == 0 ||
6848 secp256k1_ecdsa_verify(CTX, &signature[0], message, &pubkey) == 0);
6849}
6850
6851static void test_random_pubkeys(void) {
6852 secp256k1_ge elem;
6853 secp256k1_ge elem2;
6854 unsigned char in[65];
6855 /* Generate some randomly sized pubkeys. */
6856 size_t len = testrand_bits(2) == 0 ? 65 : 33;
6857 if (testrand_bits(2) == 0) {
6858 len = testrand_bits(6);
6859 }
6860 if (len == 65) {
6861 in[0] = testrand_bits(1) ? 4 : (testrand_bits(1) ? 6 : 7);
6862 } else {
6863 in[0] = testrand_bits(1) ? 2 : 3;
6864 }
6865 if (testrand_bits(3) == 0) {
6866 in[0] = testrand_bits(8);
6867 }
6868 if (len > 1) {
6869 testrand256(&in[1]);
6870 }
6871 if (len > 33) {
6872 testrand256(&in[33]);
6873 }
6874 if (secp256k1_ge_parse(&elem, in, len)) {
6875 unsigned char out[65];
6876 unsigned char firstb;
6877 int res;
6878 size_t size = len;
6879 firstb = in[0];
6880 /* If the pubkey can be parsed, it should round-trip... */
6881 if (len == 33) {
6883 } else {
6885 }
6886 CHECK(secp256k1_memcmp_var(&in[1], &out[1], len-1) == 0);
6887 /* ... except for the type of hybrid inputs. */
6888 if ((in[0] != 6) && (in[0] != 7)) {
6889 CHECK(in[0] == out[0]);
6890 }
6891 size = 65;
6892 secp256k1_ge_serialize65(&elem, in);
6893 CHECK(secp256k1_ge_parse(&elem2, in, size));
6894 CHECK(secp256k1_ge_eq_var(&elem2, &elem));
6895 /* Check that the X9.62 hybrid type is checked. */
6896 in[0] = testrand_bits(1) ? 6 : 7;
6897 res = secp256k1_ge_parse(&elem2, in, size);
6898 if (firstb == 2 || firstb == 3) {
6899 if (in[0] == firstb + 4) {
6900 CHECK(res);
6901 } else {
6902 CHECK(!res);
6903 }
6904 }
6905 if (res) {
6906 CHECK(secp256k1_ge_eq_var(&elem, &elem2));
6908 CHECK(secp256k1_memcmp_var(&in[1], &out[1], 64) == 0);
6909 }
6910 }
6911}
6912
6913static void run_pubkey_comparison(void) {
6914 unsigned char pk1_ser[33] = {
6915 0x02,
6916 0x58, 0x84, 0xb3, 0xa2, 0x4b, 0x97, 0x37, 0x88, 0x92, 0x38, 0xa6, 0x26, 0x62, 0x52, 0x35, 0x11,
6917 0xd0, 0x9a, 0xa1, 0x1b, 0x80, 0x0b, 0x5e, 0x93, 0x80, 0x26, 0x11, 0xef, 0x67, 0x4b, 0xd9, 0x23
6918 };
6919 const unsigned char pk2_ser[33] = {
6920 0x02,
6921 0xde, 0x36, 0x0e, 0x87, 0x59, 0x8f, 0x3c, 0x01, 0x36, 0x2a, 0x2a, 0xb8, 0xc6, 0xf4, 0x5e, 0x4d,
6922 0xb2, 0xc2, 0xd5, 0x03, 0xa7, 0xf9, 0xf1, 0x4f, 0xa8, 0xfa, 0x95, 0xa8, 0xe9, 0x69, 0x76, 0x1c
6923 };
6924 secp256k1_pubkey pk1;
6925 secp256k1_pubkey pk2;
6926
6927 CHECK(secp256k1_ec_pubkey_parse(CTX, &pk1, pk1_ser, sizeof(pk1_ser)) == 1);
6928 CHECK(secp256k1_ec_pubkey_parse(CTX, &pk2, pk2_ser, sizeof(pk2_ser)) == 1);
6929
6932 CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk1, &pk2) < 0);
6933 CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk2, &pk1) > 0);
6934 CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk1, &pk1) == 0);
6935 CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk2, &pk2) == 0);
6936 {
6937 secp256k1_pubkey pk_tmp;
6938 memset(&pk_tmp, 0, sizeof(pk_tmp)); /* illegal pubkey */
6940 {
6941 int32_t ecount = 0;
6943 CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk_tmp, &pk_tmp) == 0);
6944 CHECK(ecount == 2);
6946 }
6948 }
6949
6950 /* Make pk2 the same as pk1 but with 3 rather than 2. Note that in
6951 * an uncompressed encoding, these would have the opposite ordering */
6952 pk1_ser[0] = 3;
6953 CHECK(secp256k1_ec_pubkey_parse(CTX, &pk2, pk1_ser, sizeof(pk1_ser)) == 1);
6954 CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk1, &pk2) < 0);
6955 CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk2, &pk1) > 0);
6956}
6957
6958static void test_sort_helper(secp256k1_pubkey *pk, size_t *pk_order, size_t n_pk) {
6959 size_t i;
6960 const secp256k1_pubkey *pk_test[5];
6961
6962 for (i = 0; i < n_pk; i++) {
6963 pk_test[i] = &pk[pk_order[i]];
6964 }
6965 CHECK(secp256k1_ec_pubkey_sort(CTX, pk_test, n_pk) == 1);
6966 for (i = 0; i < n_pk; i++) {
6967 CHECK(secp256k1_memcmp_var(pk_test[i], &pk[i], sizeof(*pk_test[i])) == 0);
6968 }
6969}
6970
6971static void permute(size_t *arr, size_t n) {
6972 size_t i;
6973 for (i = n - 1; i >= 1; i--) {
6974 size_t tmp, j;
6975 j = testrand_int(i + 1);
6976 tmp = arr[i];
6977 arr[i] = arr[j];
6978 arr[j] = tmp;
6979 }
6980}
6981
6982static void test_sort_api(void) {
6983 secp256k1_pubkey pks[2];
6984 const secp256k1_pubkey *pks_ptr[2];
6985 int i;
6986
6987 pks_ptr[0] = &pks[0];
6988 pks_ptr[1] = &pks[1];
6989
6992
6993 CHECK(secp256k1_ec_pubkey_sort(CTX, pks_ptr, 2) == 1);
6994 /* check that NULL in array of public key pointers is not allowed */
6995 for (i = 0; i < 2; i++) {
6996 const secp256k1_pubkey *original_ptr = pks_ptr[i];
6997 pks_ptr[i] = NULL;
6999 pks_ptr[i] = original_ptr;
7000 }
7002 CHECK(secp256k1_ec_pubkey_sort(CTX, pks_ptr, 0) == 1);
7003 /* Test illegal public keys */
7004 memset(&pks[0], 0, sizeof(pks[0]));
7006 memset(&pks[1], 0, sizeof(pks[1]));
7007 {
7008 int32_t ecount = 0;
7010 CHECK(secp256k1_ec_pubkey_sort(CTX, pks_ptr, 2) == 1);
7011 CHECK(ecount == 2);
7013 }
7014}
7015
7016static void test_sort(void) {
7018 unsigned char pk_ser[5][33] = {
7019 { 0x02, 0x08 },
7020 { 0x02, 0x0b },
7021 { 0x02, 0x0c },
7022 { 0x03, 0x05 },
7023 { 0x03, 0x0a },
7024 };
7025 int i;
7026 size_t pk_order[5] = { 0, 1, 2, 3, 4 };
7027
7028 for (i = 0; i < 5; i++) {
7029 CHECK(secp256k1_ec_pubkey_parse(CTX, &pk[i], pk_ser[i], sizeof(pk_ser[i])));
7030 }
7031
7032 permute(pk_order, 1);
7033 test_sort_helper(pk, pk_order, 1);
7034 permute(pk_order, 2);
7035 test_sort_helper(pk, pk_order, 2);
7036 permute(pk_order, 3);
7037 test_sort_helper(pk, pk_order, 3);
7038 for (i = 0; i < COUNT; i++) {
7039 permute(pk_order, 4);
7040 test_sort_helper(pk, pk_order, 4);
7041 }
7042 for (i = 0; i < COUNT; i++) {
7043 permute(pk_order, 5);
7044 test_sort_helper(pk, pk_order, 5);
7045 }
7046 /* Check that sorting also works for random pubkeys */
7047 for (i = 0; i < COUNT; i++) {
7048 int j;
7049 const secp256k1_pubkey *pk_ptr[5];
7050 for (j = 0; j < 5; j++) {
7052 pk_ptr[j] = &pk[j];
7053 }
7054 CHECK(secp256k1_ec_pubkey_sort(CTX, pk_ptr, 5) == 1);
7055 for (j = 1; j < 5; j++) {
7056 CHECK(secp256k1_ec_pubkey_sort_cmp(&pk_ptr[j - 1], &pk_ptr[j], CTX) <= 0);
7057 }
7058 }
7059}
7060
7061/* Test vectors from BIP-MuSig2 */
7062static void test_sort_vectors(void) {
7063 enum { N_PUBKEYS = 6 };
7064 unsigned char pk_ser[N_PUBKEYS][33] = {
7065 { 0x02, 0xDD, 0x30, 0x8A, 0xFE, 0xC5, 0x77, 0x7E, 0x13, 0x12, 0x1F,
7066 0xA7, 0x2B, 0x9C, 0xC1, 0xB7, 0xCC, 0x01, 0x39, 0x71, 0x53, 0x09,
7067 0xB0, 0x86, 0xC9, 0x60, 0xE1, 0x8F, 0xD9, 0x69, 0x77, 0x4E, 0xB8 },
7068 { 0x02, 0xF9, 0x30, 0x8A, 0x01, 0x92, 0x58, 0xC3, 0x10, 0x49, 0x34,
7069 0x4F, 0x85, 0xF8, 0x9D, 0x52, 0x29, 0xB5, 0x31, 0xC8, 0x45, 0x83,
7070 0x6F, 0x99, 0xB0, 0x86, 0x01, 0xF1, 0x13, 0xBC, 0xE0, 0x36, 0xF9 },
7071 { 0x03, 0xDF, 0xF1, 0xD7, 0x7F, 0x2A, 0x67, 0x1C, 0x5F, 0x36, 0x18,
7072 0x37, 0x26, 0xDB, 0x23, 0x41, 0xBE, 0x58, 0xFE, 0xAE, 0x1D, 0xA2,
7073 0xDE, 0xCE, 0xD8, 0x43, 0x24, 0x0F, 0x7B, 0x50, 0x2B, 0xA6, 0x59 },
7074 { 0x02, 0x35, 0x90, 0xA9, 0x4E, 0x76, 0x8F, 0x8E, 0x18, 0x15, 0xC2,
7075 0xF2, 0x4B, 0x4D, 0x80, 0xA8, 0xE3, 0x14, 0x93, 0x16, 0xC3, 0x51,
7076 0x8C, 0xE7, 0xB7, 0xAD, 0x33, 0x83, 0x68, 0xD0, 0x38, 0xCA, 0x66 },
7077 { 0x02, 0xDD, 0x30, 0x8A, 0xFE, 0xC5, 0x77, 0x7E, 0x13, 0x12, 0x1F,
7078 0xA7, 0x2B, 0x9C, 0xC1, 0xB7, 0xCC, 0x01, 0x39, 0x71, 0x53, 0x09,
7079 0xB0, 0x86, 0xC9, 0x60, 0xE1, 0x8F, 0xD9, 0x69, 0x77, 0x4E, 0xFF },
7080 { 0x02, 0xDD, 0x30, 0x8A, 0xFE, 0xC5, 0x77, 0x7E, 0x13, 0x12, 0x1F,
7081 0xA7, 0x2B, 0x9C, 0xC1, 0xB7, 0xCC, 0x01, 0x39, 0x71, 0x53, 0x09,
7082 0xB0, 0x86, 0xC9, 0x60, 0xE1, 0x8F, 0xD9, 0x69, 0x77, 0x4E, 0xB8 }
7083 };
7084 secp256k1_pubkey pubkeys[N_PUBKEYS];
7085 secp256k1_pubkey *sorted[N_PUBKEYS];
7086 const secp256k1_pubkey *pks_ptr[N_PUBKEYS];
7087 int i;
7088
7089 sorted[0] = &pubkeys[3];
7090 sorted[1] = &pubkeys[0];
7091 sorted[2] = &pubkeys[0];
7092 sorted[3] = &pubkeys[4];
7093 sorted[4] = &pubkeys[1];
7094 sorted[5] = &pubkeys[2];
7095
7096 for (i = 0; i < N_PUBKEYS; i++) {
7097 CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkeys[i], pk_ser[i], sizeof(pk_ser[i])));
7098 pks_ptr[i] = &pubkeys[i];
7099 }
7101 for (i = 0; i < N_PUBKEYS; i++) {
7102 CHECK(secp256k1_memcmp_var(pks_ptr[i], sorted[i], sizeof(secp256k1_pubkey)) == 0);
7103 }
7104}
7105
7106static void run_pubkey_sort(void) {
7107 test_sort_api();
7108 test_sort();
7110}
7111
7112
7113static void run_random_pubkeys(void) {
7114 int i;
7115 for (i = 0; i < 10*COUNT; i++) {
7117 }
7118}
7119
7120static void run_ecdsa_end_to_end(void) {
7121 int i;
7122 for (i = 0; i < 64*COUNT; i++) {
7124 }
7125}
7126
7127static int test_ecdsa_der_parse(const unsigned char *sig, size_t siglen, int certainly_der, int certainly_not_der) {
7128 static const unsigned char zeroes[32] = {0};
7129
7130 int ret = 0;
7131
7133 unsigned char roundtrip_der[2048];
7134 unsigned char compact_der[64];
7135 size_t len_der = 2048;
7136 int parsed_der = 0, valid_der = 0, roundtrips_der = 0;
7137
7138 secp256k1_ecdsa_signature sig_der_lax;
7139 unsigned char roundtrip_der_lax[2048];
7140 unsigned char compact_der_lax[64];
7141 size_t len_der_lax = 2048;
7142 int parsed_der_lax = 0, valid_der_lax = 0, roundtrips_der_lax = 0;
7143
7144 parsed_der = secp256k1_ecdsa_signature_parse_der(CTX, &sig_der, sig, siglen);
7145 if (parsed_der) {
7146 ret |= (!secp256k1_ecdsa_signature_serialize_compact(CTX, compact_der, &sig_der)) << 0;
7147 valid_der = (secp256k1_memcmp_var(compact_der, zeroes, 32) != 0) && (secp256k1_memcmp_var(compact_der + 32, zeroes, 32) != 0);
7148 }
7149 if (valid_der) {
7150 ret |= (!secp256k1_ecdsa_signature_serialize_der(CTX, roundtrip_der, &len_der, &sig_der)) << 1;
7151 roundtrips_der = (len_der == siglen) && secp256k1_memcmp_var(roundtrip_der, sig, siglen) == 0;
7152 }
7153
7154 parsed_der_lax = ecdsa_signature_parse_der_lax(CTX, &sig_der_lax, sig, siglen);
7155 if (parsed_der_lax) {
7156 ret |= (!secp256k1_ecdsa_signature_serialize_compact(CTX, compact_der_lax, &sig_der_lax)) << 10;
7157 valid_der_lax = (secp256k1_memcmp_var(compact_der_lax, zeroes, 32) != 0) && (secp256k1_memcmp_var(compact_der_lax + 32, zeroes, 32) != 0);
7158 }
7159 if (valid_der_lax) {
7160 ret |= (!secp256k1_ecdsa_signature_serialize_der(CTX, roundtrip_der_lax, &len_der_lax, &sig_der_lax)) << 11;
7161 roundtrips_der_lax = (len_der_lax == siglen) && secp256k1_memcmp_var(roundtrip_der_lax, sig, siglen) == 0;
7162 }
7163
7164 if (certainly_der) {
7165 ret |= (!parsed_der) << 2;
7166 }
7167 if (certainly_not_der) {
7168 ret |= (parsed_der) << 17;
7169 }
7170 if (valid_der) {
7171 ret |= (!roundtrips_der) << 3;
7172 }
7173
7174 if (valid_der) {
7175 ret |= (!roundtrips_der_lax) << 12;
7176 ret |= (len_der != len_der_lax) << 13;
7177 ret |= ((len_der != len_der_lax) || (secp256k1_memcmp_var(roundtrip_der_lax, roundtrip_der, len_der) != 0)) << 14;
7178 }
7179 ret |= (roundtrips_der != roundtrips_der_lax) << 15;
7180 if (parsed_der) {
7181 ret |= (!parsed_der_lax) << 16;
7182 }
7183
7184 return ret;
7185}
7186
7187static void assign_big_endian(unsigned char *ptr, size_t ptrlen, uint32_t val) {
7188 size_t i;
7189 for (i = 0; i < ptrlen; i++) {
7190 int shift = ptrlen - 1 - i;
7191 if (shift >= 4) {
7192 ptr[i] = 0;
7193 } else {
7194 ptr[i] = (val >> shift) & 0xFF;
7195 }
7196 }
7197}
7198
7199static void damage_array(unsigned char *sig, size_t *len) {
7200 int pos;
7201 int action = testrand_bits(3);
7202 if (action < 1 && *len > 3) {
7203 /* Delete a byte. */
7204 pos = testrand_int(*len);
7205 memmove(sig + pos, sig + pos + 1, *len - pos - 1);
7206 (*len)--;
7207 return;
7208 } else if (action < 2 && *len < 2048) {
7209 /* Insert a byte. */
7210 pos = testrand_int(1 + *len);
7211 memmove(sig + pos + 1, sig + pos, *len - pos);
7212 sig[pos] = testrand_bits(8);
7213 (*len)++;
7214 return;
7215 } else if (action < 4) {
7216 /* Modify a byte. */
7217 sig[testrand_int(*len)] += 1 + testrand_int(255);
7218 return;
7219 } else { /* action < 8 */
7220 /* Modify a bit. */
7221 sig[testrand_int(*len)] ^= 1 << testrand_bits(3);
7222 return;
7223 }
7224}
7225
7226static void random_ber_signature(unsigned char *sig, size_t *len, int* certainly_der, int* certainly_not_der) {
7227 int der;
7228 int nlow[2], nlen[2], nlenlen[2], nhbit[2], nhbyte[2], nzlen[2];
7229 size_t tlen, elen, glen;
7230 int indet;
7231 int n;
7232
7233 *len = 0;
7234 der = testrand_bits(2) == 0;
7235 *certainly_der = der;
7236 *certainly_not_der = 0;
7237 indet = der ? 0 : testrand_int(10) == 0;
7238
7239 for (n = 0; n < 2; n++) {
7240 /* 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) */
7241 nlow[n] = der ? 1 : (testrand_bits(3) != 0);
7242 /* The length of the number in bytes (the first byte of which will always be nonzero) */
7243 nlen[n] = nlow[n] ? testrand_int(33) : 32 + testrand_int(200) * testrand_bits(3) / 8;
7244 CHECK(nlen[n] <= 232);
7245 /* The top bit of the number. */
7246 nhbit[n] = (nlow[n] == 0 && nlen[n] == 32) ? 1 : (nlen[n] == 0 ? 0 : testrand_bits(1));
7247 /* The top byte of the number (after the potential hardcoded 16 0xFF characters for "high" 32 bytes numbers) */
7248 nhbyte[n] = nlen[n] == 0 ? 0 : (nhbit[n] ? 128 + testrand_bits(7) : 1 + testrand_int(127));
7249 /* 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) */
7250 nzlen[n] = der ? ((nlen[n] == 0 || nhbit[n]) ? 1 : 0) : (nlow[n] ? testrand_int(3) : testrand_int(300 - nlen[n]) * testrand_bits(3) / 8);
7251 if (nzlen[n] > ((nlen[n] == 0 || nhbit[n]) ? 1 : 0)) {
7252 *certainly_not_der = 1;
7253 }
7254 CHECK(nlen[n] + nzlen[n] <= 300);
7255 /* The length of the length descriptor for the number. 0 means short encoding, anything else is long encoding. */
7256 nlenlen[n] = nlen[n] + nzlen[n] < 128 ? 0 : (nlen[n] + nzlen[n] < 256 ? 1 : 2);
7257 if (!der) {
7258 /* nlenlen[n] max 127 bytes */
7259 int add = testrand_int(127 - nlenlen[n]) * testrand_bits(4) * testrand_bits(4) / 256;
7260 nlenlen[n] += add;
7261 if (add != 0) {
7262 *certainly_not_der = 1;
7263 }
7264 }
7265 CHECK(nlen[n] + nzlen[n] + nlenlen[n] <= 427);
7266 }
7267
7268 /* The total length of the data to go, so far */
7269 tlen = 2 + nlenlen[0] + nlen[0] + nzlen[0] + 2 + nlenlen[1] + nlen[1] + nzlen[1];
7270 CHECK(tlen <= 856);
7271
7272 /* The length of the garbage inside the tuple. */
7273 elen = (der || indet) ? 0 : testrand_int(980 - tlen) * testrand_bits(3) / 8;
7274 if (elen != 0) {
7275 *certainly_not_der = 1;
7276 }
7277 tlen += elen;
7278 CHECK(tlen <= 980);
7279
7280 /* The length of the garbage after the end of the tuple. */
7281 glen = der ? 0 : testrand_int(990 - tlen) * testrand_bits(3) / 8;
7282 if (glen != 0) {
7283 *certainly_not_der = 1;
7284 }
7285 CHECK(tlen + glen <= 990);
7286
7287 /* Write the tuple header. */
7288 sig[(*len)++] = 0x30;
7289 if (indet) {
7290 /* Indeterminate length */
7291 sig[(*len)++] = 0x80;
7292 *certainly_not_der = 1;
7293 } else {
7294 int tlenlen = tlen < 128 ? 0 : (tlen < 256 ? 1 : 2);
7295 if (!der) {
7296 int add = testrand_int(127 - tlenlen) * testrand_bits(4) * testrand_bits(4) / 256;
7297 tlenlen += add;
7298 if (add != 0) {
7299 *certainly_not_der = 1;
7300 }
7301 }
7302 if (tlenlen == 0) {
7303 /* Short length notation */
7304 sig[(*len)++] = tlen;
7305 } else {
7306 /* Long length notation */
7307 sig[(*len)++] = 128 + tlenlen;
7308 assign_big_endian(sig + *len, tlenlen, tlen);
7309 *len += tlenlen;
7310 }
7311 tlen += tlenlen;
7312 }
7313 tlen += 2;
7314 CHECK(tlen + glen <= 1119);
7315
7316 for (n = 0; n < 2; n++) {
7317 /* Write the integer header. */
7318 sig[(*len)++] = 0x02;
7319 if (nlenlen[n] == 0) {
7320 /* Short length notation */
7321 sig[(*len)++] = nlen[n] + nzlen[n];
7322 } else {
7323 /* Long length notation. */
7324 sig[(*len)++] = 128 + nlenlen[n];
7325 assign_big_endian(sig + *len, nlenlen[n], nlen[n] + nzlen[n]);
7326 *len += nlenlen[n];
7327 }
7328 /* Write zero padding */
7329 while (nzlen[n] > 0) {
7330 sig[(*len)++] = 0x00;
7331 nzlen[n]--;
7332 }
7333 if (nlen[n] == 32 && !nlow[n]) {
7334 /* Special extra 16 0xFF bytes in "high" 32-byte numbers */
7335 int i;
7336 for (i = 0; i < 16; i++) {
7337 sig[(*len)++] = 0xFF;
7338 }
7339 nlen[n] -= 16;
7340 }
7341 /* Write first byte of number */
7342 if (nlen[n] > 0) {
7343 sig[(*len)++] = nhbyte[n];
7344 nlen[n]--;
7345 }
7346 /* Generate remaining random bytes of number */
7347 testrand_bytes_test(sig + *len, nlen[n]);
7348 *len += nlen[n];
7349 nlen[n] = 0;
7350 }
7351
7352 /* Generate random garbage inside tuple. */
7353 testrand_bytes_test(sig + *len, elen);
7354 *len += elen;
7355
7356 /* Generate end-of-contents bytes. */
7357 if (indet) {
7358 sig[(*len)++] = 0;
7359 sig[(*len)++] = 0;
7360 tlen += 2;
7361 }
7362 CHECK(tlen + glen <= 1121);
7363
7364 /* Generate random garbage outside tuple. */
7365 testrand_bytes_test(sig + *len, glen);
7366 *len += glen;
7367 tlen += glen;
7368 CHECK(tlen <= 1121);
7369 CHECK(tlen == *len);
7370}
7371
7372static void run_ecdsa_der_parse(void) {
7373 int i,j;
7374 for (i = 0; i < 200 * COUNT; i++) {
7375 unsigned char buffer[2048];
7376 size_t buflen = 0;
7377 int certainly_der = 0;
7378 int certainly_not_der = 0;
7379 random_ber_signature(buffer, &buflen, &certainly_der, &certainly_not_der);
7380 CHECK(buflen <= 2048);
7381 for (j = 0; j < 16; j++) {
7382 int ret = 0;
7383 if (j > 0) {
7384 damage_array(buffer, &buflen);
7385 /* We don't know anything anymore about the DERness of the result */
7386 certainly_der = 0;
7387 certainly_not_der = 0;
7388 }
7389 ret = test_ecdsa_der_parse(buffer, buflen, certainly_der, certainly_not_der);
7390 if (ret != 0) {
7391 size_t k;
7392 fprintf(stderr, "Failure %x on ", ret);
7393 for (k = 0; k < buflen; k++) {
7394 fprintf(stderr, "%02x ", buffer[k]);
7395 }
7396 fprintf(stderr, "\n");
7397 }
7398 CHECK(ret == 0);
7399 }
7400 }
7401}
7402
7403/* Appends the body of a signature holding a 122-byte R integer, which exceeds
7404 * 32 bytes and therefore overflows to zero, and the 2-byte S integer 0x0123.
7405 * The body is exactly 128 bytes long, the smallest length whose encoding
7406 * requires the long form. */
7407static size_t der_long_form_body(unsigned char *buf) {
7408 size_t len = 0;
7409 size_t i;
7410 buf[len++] = 0x02;
7411 buf[len++] = 0x7A;
7412 for (i = 0; i < 0x7A; i++) {
7413 buf[len++] = 0x01;
7414 }
7415 buf[len++] = 0x02;
7416 buf[len++] = 0x02;
7417 buf[len++] = 0x01;
7418 buf[len++] = 0x23;
7419 CHECK(len == 128);
7420 return len;
7421}
7422
7423/* Appends the 35-byte encoding of an INTEGER holding a zero pad followed by 32
7424 * bytes whose top bit is set. */
7425static size_t der_padded_integer(unsigned char *buf) {
7426 size_t len = 0;
7427 size_t i;
7428 buf[len++] = 0x02;
7429 buf[len++] = 0x21;
7430 buf[len++] = 0x00;
7431 buf[len++] = 0x80;
7432 for (i = 0; i < 31; i++) {
7433 buf[len++] = 0x01;
7434 }
7435 CHECK(len == 35);
7436 return len;
7437}
7438
7439/* Checks that sig holds the values encoded by der_long_form_body. */
7441 static const unsigned char zeroes[62] = {0};
7442 unsigned char compact[64];
7444 CHECK(secp256k1_memcmp_var(compact, zeroes, 62) == 0);
7445 CHECK(compact[62] == 0x01);
7446 CHECK(compact[63] == 0x23);
7447}
7448
7449/* Tests the long form length encoding (X.690-0207 8.1.3.5).
7450 *
7451 * random_ber_signature only emits long form lengths in signatures it marks as
7452 * certainly_not_der, so run_ecdsa_der_parse never asserts that a long form
7453 * length is accepted. Note that the long form is only valid in DER for lengths
7454 * of at least 128, which is more than a signature with two in-range scalars
7455 * needs, so the R integers below are longer than 32 bytes. Such integers are
7456 * not rejected: secp256k1_der_parse_integer flags them as overflowing and, as
7457 * for any overflow, sets the scalar to zero. */
7459 unsigned char buf[256];
7461 size_t len;
7462 size_t i;
7463
7464 /* A sequence of length 128, the shortest length using the long form. */
7465 len = 0;
7466 buf[len++] = 0x30;
7467 buf[len++] = 0x81;
7468 buf[len++] = 0x80;
7469 len += der_long_form_body(buf + len);
7470 CHECK(len == 131);
7471 CHECK(secp256k1_ecdsa_signature_parse_der(CTX, &sig, buf, len) == 1);
7472 der_long_form_check(&sig);
7473
7474 /* The same, with the R integer's own length in the long form as well. */
7475 len = 0;
7476 buf[len++] = 0x30;
7477 buf[len++] = 0x81;
7478 buf[len++] = 0x87;
7479 buf[len++] = 0x02;
7480 buf[len++] = 0x81;
7481 buf[len++] = 0x80;
7482 for (i = 0; i < 0x80; i++) {
7483 buf[len++] = 0x01;
7484 }
7485 buf[len++] = 0x02;
7486 buf[len++] = 0x02;
7487 buf[len++] = 0x01;
7488 buf[len++] = 0x23;
7489 CHECK(len == 138);
7490 CHECK(secp256k1_ecdsa_signature_parse_der(CTX, &sig, buf, len) == 1);
7491 der_long_form_check(&sig);
7492
7493 /* Lengths below 128 must use the short form. */
7494 len = 0;
7495 buf[len++] = 0x30;
7496 buf[len++] = 0x81;
7497 buf[len++] = 0x46;
7498 len += der_padded_integer(buf + len);
7499 len += der_padded_integer(buf + len);
7500 CHECK(len == 73);
7501 CHECK(secp256k1_ecdsa_signature_parse_der(CTX, &sig, buf, len) == 0);
7502 /* The same body with a short form length is accepted, so the encoding of
7503 * the length is the only reason the signature above is rejected. */
7504 memmove(buf + 1, buf + 2, len - 2);
7505 len--;
7506 CHECK(secp256k1_ecdsa_signature_parse_der(CTX, &sig, buf, len) == 1);
7507
7508 /* The long form length octets may not have a leading zero. */
7509 len = 0;
7510 buf[len++] = 0x30;
7511 buf[len++] = 0x82;
7512 buf[len++] = 0x00;
7513 buf[len++] = 0x80;
7514 len += der_long_form_body(buf + len);
7515 CHECK(len == 132);
7516 CHECK(secp256k1_ecdsa_signature_parse_der(CTX, &sig, buf, len) == 0);
7517}
7518
7519/* Tests several edge cases. */
7520static void run_ecdsa_edge_cases(void) {
7521 int t;
7523
7524 /* Test the case where ECDSA recomputes a point that is infinity. */
7525 {
7526 secp256k1_ge key;
7528 secp256k1_scalar sr, ss;
7530 secp256k1_scalar_negate(&ss, &ss);
7531 secp256k1_scalar_inverse(&ss, &ss);
7534 msg = ss;
7535 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 0);
7536 }
7537
7538 /* Verify signature with r of zero fails. */
7539 {
7540 const unsigned char pubkey_mods_zero[33] = {
7541 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
7542 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
7543 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0,
7544 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41,
7545 0x41
7546 };
7547 secp256k1_ge key;
7549 secp256k1_scalar sr, ss;
7553 CHECK(secp256k1_ge_parse(&key, pubkey_mods_zero, 33));
7554 CHECK(secp256k1_ecdsa_sig_verify( &sr, &ss, &key, &msg) == 0);
7555 }
7556
7557 /* Verify signature with s of zero fails. */
7558 {
7559 const unsigned char pubkey[33] = {
7560 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7561 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7562 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7563 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7564 0x01
7565 };
7566 secp256k1_ge key;
7568 secp256k1_scalar sr, ss;
7572 CHECK(secp256k1_ge_parse(&key, pubkey, 33));
7573 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 0);
7574 }
7575
7576 /* Verify signature with message 0 passes. */
7577 {
7578 const unsigned char pubkey[33] = {
7579 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7580 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7581 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7582 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7583 0x02
7584 };
7585 const unsigned char pubkey2[33] = {
7586 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
7587 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
7588 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0,
7589 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41,
7590 0x43
7591 };
7592 secp256k1_ge key;
7593 secp256k1_ge key2;
7595 secp256k1_scalar sr, ss;
7599 CHECK(secp256k1_ge_parse(&key, pubkey, 33));
7600 CHECK(secp256k1_ge_parse(&key2, pubkey2, 33));
7601 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 1);
7602 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key2, &msg) == 1);
7603 secp256k1_scalar_negate(&ss, &ss);
7604 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 1);
7605 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key2, &msg) == 1);
7607 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 0);
7608 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key2, &msg) == 0);
7609 }
7610
7611 /* Verify signature with message 1 passes. */
7612 {
7613 const unsigned char pubkey[33] = {
7614 0x02, 0x14, 0x4e, 0x5a, 0x58, 0xef, 0x5b, 0x22,
7615 0x6f, 0xd2, 0xe2, 0x07, 0x6a, 0x77, 0xcf, 0x05,
7616 0xb4, 0x1d, 0xe7, 0x4a, 0x30, 0x98, 0x27, 0x8c,
7617 0x93, 0xe6, 0xe6, 0x3c, 0x0b, 0xc4, 0x73, 0x76,
7618 0x25
7619 };
7620 const unsigned char pubkey2[33] = {
7621 0x02, 0x8a, 0xd5, 0x37, 0xed, 0x73, 0xd9, 0x40,
7622 0x1d, 0xa0, 0x33, 0xd2, 0xdc, 0xf0, 0xaf, 0xae,
7623 0x34, 0xcf, 0x5f, 0x96, 0x4c, 0x73, 0x28, 0x0f,
7624 0x92, 0xc0, 0xf6, 0x9d, 0xd9, 0xb2, 0x09, 0x10,
7625 0x62
7626 };
7627 const unsigned char csr[32] = {
7628 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7629 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
7630 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4,
7631 0x40, 0x2d, 0xa1, 0x72, 0x2f, 0xc9, 0xba, 0xeb
7632 };
7633 secp256k1_ge key;
7634 secp256k1_ge key2;
7636 secp256k1_scalar sr, ss;
7639 secp256k1_scalar_set_b32(&sr, csr, NULL);
7640 CHECK(secp256k1_ge_parse(&key, pubkey, 33));
7641 CHECK(secp256k1_ge_parse(&key2, pubkey2, 33));
7642 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 1);
7643 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key2, &msg) == 1);
7644 secp256k1_scalar_negate(&ss, &ss);
7645 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 1);
7646 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key2, &msg) == 1);
7649 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 0);
7650 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key2, &msg) == 0);
7651 }
7652
7653 /* Verify signature with message -1 passes. */
7654 {
7655 const unsigned char pubkey[33] = {
7656 0x03, 0xaf, 0x97, 0xff, 0x7d, 0x3a, 0xf6, 0xa0,
7657 0x02, 0x94, 0xbd, 0x9f, 0x4b, 0x2e, 0xd7, 0x52,
7658 0x28, 0xdb, 0x49, 0x2a, 0x65, 0xcb, 0x1e, 0x27,
7659 0x57, 0x9c, 0xba, 0x74, 0x20, 0xd5, 0x1d, 0x20,
7660 0xf1
7661 };
7662 const unsigned char csr[32] = {
7663 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7664 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
7665 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4,
7666 0x40, 0x2d, 0xa1, 0x72, 0x2f, 0xc9, 0xba, 0xee
7667 };
7668 secp256k1_ge key;
7670 secp256k1_scalar sr, ss;
7674 secp256k1_scalar_set_b32(&sr, csr, NULL);
7675 CHECK(secp256k1_ge_parse(&key, pubkey, 33));
7676 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 1);
7677 secp256k1_scalar_negate(&ss, &ss);
7678 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 1);
7681 CHECK(secp256k1_ecdsa_sig_verify(&sr, &ss, &key, &msg) == 0);
7682 }
7683
7684 /* Signature where s would be zero. */
7685 {
7686 secp256k1_pubkey pubkey;
7687 size_t siglen;
7688 unsigned char signature[72];
7689 static const unsigned char nonce[32] = {
7690 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7691 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7692 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7693 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
7694 };
7695 static const unsigned char nonce2[32] = {
7696 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
7697 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
7698 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,
7699 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x40
7700 };
7701 const unsigned char key[32] = {
7702 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7703 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7704 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7705 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
7706 };
7707 unsigned char msg[32] = {
7708 0x86, 0x41, 0x99, 0x81, 0x06, 0x23, 0x44, 0x53,
7709 0xaa, 0x5f, 0x9d, 0x6a, 0x31, 0x78, 0xf4, 0xf7,
7710 0xb8, 0x12, 0xe0, 0x0b, 0x81, 0x7a, 0x77, 0x62,
7711 0x65, 0xdf, 0xdd, 0x31, 0xb9, 0x3e, 0x29, 0xa9,
7712 };
7714 CHECK(secp256k1_ecdsa_sign(CTX, &sig, msg, key, precomputed_nonce_function, nonce2) == 0);
7715 msg[31] = 0xaa;
7720 CHECK(secp256k1_ecdsa_sign(CTX, &sig, msg, key, precomputed_nonce_function, nonce2) == 1);
7721 CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey, key) == 1);
7722 CHECK_ILLEGAL(CTX, secp256k1_ecdsa_verify(CTX, NULL, msg, &pubkey));
7723 CHECK_ILLEGAL(CTX, secp256k1_ecdsa_verify(CTX, &sig, NULL, &pubkey));
7725 CHECK(secp256k1_ecdsa_verify(CTX, &sig, msg, &pubkey) == 1);
7727 /* That pubkeyload fails via an ARGCHECK is a little odd but makes sense because pubkeys are an opaque data type. */
7728 CHECK_ILLEGAL(CTX, secp256k1_ecdsa_verify(CTX, &sig, msg, &pubkey));
7729 siglen = 72;
7732 CHECK_ILLEGAL(CTX, secp256k1_ecdsa_signature_serialize_der(CTX, signature, &siglen, NULL));
7733 CHECK(secp256k1_ecdsa_signature_serialize_der(CTX, signature, &siglen, &sig) == 1);
7734 CHECK_ILLEGAL(CTX, secp256k1_ecdsa_signature_parse_der(CTX, NULL, signature, siglen));
7736 CHECK(secp256k1_ecdsa_signature_parse_der(CTX, &sig, signature, siglen) == 1);
7737 siglen = 10;
7738 /* Too little room for a signature does not fail via ARGCHECK. */
7739 CHECK(secp256k1_ecdsa_signature_serialize_der(CTX, signature, &siglen, &sig) == 0);
7746 CHECK(secp256k1_ecdsa_signature_parse_compact(CTX, &sig, signature) == 1);
7747 memset(signature, 255, 64);
7748 CHECK(secp256k1_ecdsa_signature_parse_compact(CTX, &sig, signature) == 0);
7749 }
7750
7751 /* Nonce function corner cases. */
7752 for (t = 0; t < 2; t++) {
7753 static const unsigned char zero[32] = {0x00};
7754 int i;
7755 unsigned char key[32];
7756 unsigned char msg[32];
7758 secp256k1_scalar sr[512], ss;
7759 const unsigned char *extra;
7760 extra = t == 0 ? NULL : zero;
7761 memset(msg, 0, 32);
7762 msg[31] = 1;
7763 /* High key results in signature failure. */
7764 memset(key, 0xFF, 32);
7765 CHECK(secp256k1_ecdsa_sign(CTX, &sig, msg, key, NULL, extra) == 0);
7767 /* Zero key results in signature failure. */
7768 memset(key, 0, 32);
7769 CHECK(secp256k1_ecdsa_sign(CTX, &sig, msg, key, NULL, extra) == 0);
7771 /* Nonce function failure results in signature failure. */
7772 key[31] = 1;
7773 CHECK(secp256k1_ecdsa_sign(CTX, &sig, msg, key, nonce_function_test_fail, extra) == 0);
7775 /* The retry loop successfully makes its way to the first good value. */
7776 CHECK(secp256k1_ecdsa_sign(CTX, &sig, msg, key, nonce_function_test_retry, extra) == 1);
7777 CHECK(!is_empty_signature(&sig));
7778 CHECK(secp256k1_ecdsa_sign(CTX, &sig2, msg, key, nonce_function_rfc6979, extra) == 1);
7779 CHECK(!is_empty_signature(&sig2));
7780 CHECK(secp256k1_memcmp_var(&sig, &sig2, sizeof(sig)) == 0);
7781 /* The default nonce function is deterministic. */
7782 CHECK(secp256k1_ecdsa_sign(CTX, &sig2, msg, key, NULL, extra) == 1);
7783 CHECK(!is_empty_signature(&sig2));
7784 CHECK(secp256k1_memcmp_var(&sig, &sig2, sizeof(sig)) == 0);
7785 /* The default nonce function changes output with different messages. */
7786 for(i = 0; i < 256; i++) {
7787 int j;
7788 msg[0] = i;
7789 CHECK(secp256k1_ecdsa_sign(CTX, &sig2, msg, key, NULL, extra) == 1);
7790 CHECK(!is_empty_signature(&sig2));
7791 secp256k1_ecdsa_signature_load(CTX, &sr[i], &ss, &sig2);
7792 for (j = 0; j < i; j++) {
7793 CHECK(!secp256k1_scalar_eq(&sr[i], &sr[j]));
7794 }
7795 }
7796 msg[0] = 0;
7797 msg[31] = 2;
7798 /* The default nonce function changes output with different keys. */
7799 for(i = 256; i < 512; i++) {
7800 int j;
7801 key[0] = i - 256;
7802 CHECK(secp256k1_ecdsa_sign(CTX, &sig2, msg, key, NULL, extra) == 1);
7803 CHECK(!is_empty_signature(&sig2));
7804 secp256k1_ecdsa_signature_load(CTX, &sr[i], &ss, &sig2);
7805 for (j = 0; j < i; j++) {
7806 CHECK(!secp256k1_scalar_eq(&sr[i], &sr[j]));
7807 }
7808 }
7809 key[0] = 0;
7810 }
7811
7812 {
7813 /* Check that optional nonce arguments do not have equivalent effect. */
7814 const unsigned char zeros[32] = {0};
7815 unsigned char nonce[32];
7816 unsigned char nonce2[32];
7817 unsigned char nonce3[32];
7818 unsigned char nonce4[32];
7820 SECP256K1_CHECKMEM_UNDEFINE(nonce2,32);
7821 SECP256K1_CHECKMEM_UNDEFINE(nonce3,32);
7822 SECP256K1_CHECKMEM_UNDEFINE(nonce4,32);
7823 CHECK(nonce_function_rfc6979(nonce, zeros, zeros, NULL, NULL, 0) == 1);
7825 CHECK(nonce_function_rfc6979(nonce2, zeros, zeros, zeros, NULL, 0) == 1);
7826 SECP256K1_CHECKMEM_CHECK(nonce2,32);
7827 CHECK(nonce_function_rfc6979(nonce3, zeros, zeros, NULL, (void *)zeros, 0) == 1);
7828 SECP256K1_CHECKMEM_CHECK(nonce3,32);
7829 CHECK(nonce_function_rfc6979(nonce4, zeros, zeros, zeros, (void *)zeros, 0) == 1);
7830 SECP256K1_CHECKMEM_CHECK(nonce4,32);
7831 CHECK(secp256k1_memcmp_var(nonce, nonce2, 32) != 0);
7832 CHECK(secp256k1_memcmp_var(nonce, nonce3, 32) != 0);
7833 CHECK(secp256k1_memcmp_var(nonce, nonce4, 32) != 0);
7834 CHECK(secp256k1_memcmp_var(nonce2, nonce3, 32) != 0);
7835 CHECK(secp256k1_memcmp_var(nonce2, nonce4, 32) != 0);
7836 CHECK(secp256k1_memcmp_var(nonce3, nonce4, 32) != 0);
7837 }
7838
7839
7840 /* Privkey export where pubkey is the point at infinity. */
7841 {
7842 unsigned char privkey[300];
7843 const unsigned char *seckey = secp256k1_group_order_bytes;
7844 size_t outlen = 300;
7845 CHECK(!ec_privkey_export_der(CTX, privkey, &outlen, seckey, 0));
7846 outlen = 300;
7847 CHECK(!ec_privkey_export_der(CTX, privkey, &outlen, seckey, 1));
7848 }
7849}
7850
7852static void ecdsa_ctx_sha256(void) {
7853 /* Check ctx-provided SHA256 compression override takes effect */
7855 secp256k1_ecdsa_signature out_default, out_custom;
7856 unsigned char sk[32] = {1}, msg32[32] = {1};
7857
7858 /* Default behavior. No ctx-provided SHA256 compression */
7859 CHECK(secp256k1_ecdsa_sign(ctx, &out_default, msg32, sk, NULL, NULL));
7860 CHECK(!sha256_ecdsa_called);
7861
7862 /* Override SHA256 compression directly, bypassing the ctx setter sanity checks */
7863 ctx->hash_ctx.fn_sha256_compression = sha256_ecdsa;
7864 CHECK(secp256k1_ecdsa_sign(ctx, &out_custom, msg32, sk, NULL, NULL));
7865 CHECK(sha256_ecdsa_called);
7866 /* Outputs must differ if custom compression was used */
7867 CHECK(secp256k1_memcmp_var(out_default.data, out_custom.data, 64) != 0);
7868
7870}
7871
7876static void test_ecdsa_wycheproof(void) {
7878
7879 int t;
7880 const secp256k1_hash_ctx *hash_ctx = &CTX->hash_ctx;
7882 secp256k1_ecdsa_signature signature;
7883 secp256k1_sha256 hasher;
7884 secp256k1_pubkey pubkey;
7885 const unsigned char *msg, *sig, *pk;
7886 unsigned char out[32] = {0};
7887 int actual_verify = 0;
7888
7889 memset(&pubkey, 0, sizeof(pubkey));
7891 CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, pk, 65) == 1);
7892
7895 secp256k1_sha256_write(hash_ctx, &hasher, msg, testvectors[t].msg_len);
7896 secp256k1_sha256_finalize(hash_ctx, &hasher, out);
7897
7898 sig = &wycheproof_ecdsa_signatures[testvectors[t].sig_offset];
7899 if (secp256k1_ecdsa_signature_parse_der(CTX, &signature, sig, testvectors[t].sig_len) == 1) {
7900 actual_verify = secp256k1_ecdsa_verify(CTX, (const secp256k1_ecdsa_signature *)&signature, out, &pubkey);
7901 }
7902 CHECK(testvectors[t].expected_verify == actual_verify);
7903 }
7904}
7905
7906/* Tests cases from Wycheproof test suite. */
7907static void run_ecdsa_wycheproof(void) {
7909}
7910
7911#ifdef ENABLE_MODULE_ECDH
7912# include "modules/ecdh/tests_impl.h"
7913#endif
7914
7915#ifdef ENABLE_MODULE_RECOVERY
7917#endif
7918
7919#ifdef ENABLE_MODULE_EXTRAKEYS
7921#endif
7922
7923#ifdef ENABLE_MODULE_SCHNORRSIG
7925#endif
7926
7927#ifdef ENABLE_MODULE_MUSIG
7929#endif
7930
7931#ifdef ENABLE_MODULE_ELLSWIFT
7933#endif
7934
7935#ifdef ENABLE_MODULE_SILENTPAYMENTS
7937#endif
7938
7940 unsigned char buf1[6] = {1, 2, 3, 4, 5, 6};
7941 unsigned char buf2[sizeof(buf1)];
7942
7943 /* secp256k1_memczero(..., ..., 0) is a noop. */
7944 memcpy(buf2, buf1, sizeof(buf1));
7945 secp256k1_memczero(buf1, sizeof(buf1), 0);
7946 CHECK(secp256k1_memcmp_var(buf1, buf2, sizeof(buf1)) == 0);
7947
7948 /* secp256k1_memczero(..., ..., 1) zeros the buffer. */
7949 memset(buf2, 0, sizeof(buf2));
7950 secp256k1_memczero(buf1, sizeof(buf1) , 1);
7951 CHECK(secp256k1_memcmp_var(buf1, buf2, sizeof(buf1)) == 0);
7952}
7953
7954
7956 unsigned char buf1[3] = {0, 1};
7957 unsigned char buf2[3] = {1, 0};
7958
7959 CHECK(secp256k1_is_zero_array(buf1, 0) == 1);
7960 CHECK(secp256k1_is_zero_array(buf1, 1) == 1);
7961 CHECK(secp256k1_is_zero_array(buf1, 2) == 0);
7962 CHECK(secp256k1_is_zero_array(buf2, 1) == 0);
7963 CHECK(secp256k1_is_zero_array(buf2, 2) == 0);
7964}
7965
7967 {
7968 const uint32_t x = 0xFF03AB45;
7969 const unsigned char x_be[4] = {0xFF, 0x03, 0xAB, 0x45};
7970 unsigned char buf[4];
7971 uint32_t x_;
7972
7973 secp256k1_write_be32(buf, x);
7974 CHECK(secp256k1_memcmp_var(buf, x_be, sizeof(buf)) == 0);
7975
7976 x_ = secp256k1_read_be32(buf);
7977 CHECK(x == x_);
7978 }
7979
7980 {
7981 const uint64_t x = 0xCAFE0123BEEF4567;
7982 const unsigned char x_be[8] = {0xCA, 0xFE, 0x01, 0x23, 0xBE, 0xEF, 0x45, 0x67};
7983 unsigned char buf[8];
7984 uint64_t x_;
7985
7986 secp256k1_write_be64(buf, x);
7987 CHECK(secp256k1_memcmp_var(buf, x_be, sizeof(buf)) == 0);
7988
7989 x_ = secp256k1_read_be64(buf);
7990 CHECK(x == x_);
7991 }
7992}
7993
7994static void int_cmov_test(void) {
7995 int r = INT_MAX;
7996 int a = 0;
7997
7998 secp256k1_int_cmov(&r, &a, 0);
7999 CHECK(r == INT_MAX);
8000
8001 r = 0; a = INT_MAX;
8002 secp256k1_int_cmov(&r, &a, 1);
8003 CHECK(r == INT_MAX);
8004
8005 a = 0;
8006 secp256k1_int_cmov(&r, &a, 1);
8007 CHECK(r == 0);
8008
8009 a = 1;
8010 secp256k1_int_cmov(&r, &a, 1);
8011 CHECK(r == 1);
8012
8013 r = 1; a = 0;
8014 secp256k1_int_cmov(&r, &a, 0);
8015 CHECK(r == 1);
8016
8017}
8018
8019static void fe_cmov_test(void) {
8020 static const secp256k1_fe zero = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0);
8021 static const secp256k1_fe one = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1);
8022 static const secp256k1_fe max = SECP256K1_FE_CONST(
8023 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
8024 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL
8025 );
8026 secp256k1_fe r = max;
8027 secp256k1_fe a = zero;
8028
8029 secp256k1_fe_cmov(&r, &a, 0);
8030 CHECK(fe_identical(&r, &max));
8031
8032 r = zero; a = max;
8033 secp256k1_fe_cmov(&r, &a, 1);
8034 CHECK(fe_identical(&r, &max));
8035
8036 a = zero;
8037 secp256k1_fe_cmov(&r, &a, 1);
8038 CHECK(fe_identical(&r, &zero));
8039
8040 a = one;
8041 secp256k1_fe_cmov(&r, &a, 1);
8042 CHECK(fe_identical(&r, &one));
8043
8044 r = one; a = zero;
8045 secp256k1_fe_cmov(&r, &a, 0);
8046 CHECK(fe_identical(&r, &one));
8047}
8048
8049static void fe_storage_cmov_test(void) {
8050 static const secp256k1_fe_storage zero = SECP256K1_FE_STORAGE_CONST(0, 0, 0, 0, 0, 0, 0, 0);
8051 static const secp256k1_fe_storage one = SECP256K1_FE_STORAGE_CONST(0, 0, 0, 0, 0, 0, 0, 1);
8053 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
8054 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL
8055 );
8056 secp256k1_fe_storage r = max;
8057 secp256k1_fe_storage a = zero;
8058
8059 secp256k1_fe_storage_cmov(&r, &a, 0);
8060 CHECK(secp256k1_memcmp_var(&r, &max, sizeof(r)) == 0);
8061
8062 r = zero; a = max;
8063 secp256k1_fe_storage_cmov(&r, &a, 1);
8064 CHECK(secp256k1_memcmp_var(&r, &max, sizeof(r)) == 0);
8065
8066 a = zero;
8067 secp256k1_fe_storage_cmov(&r, &a, 1);
8068 CHECK(secp256k1_memcmp_var(&r, &zero, sizeof(r)) == 0);
8069
8070 a = one;
8071 secp256k1_fe_storage_cmov(&r, &a, 1);
8072 CHECK(secp256k1_memcmp_var(&r, &one, sizeof(r)) == 0);
8073
8074 r = one; a = zero;
8075 secp256k1_fe_storage_cmov(&r, &a, 0);
8076 CHECK(secp256k1_memcmp_var(&r, &one, sizeof(r)) == 0);
8077}
8078
8079static void scalar_cmov_test(void) {
8080 static const secp256k1_scalar max = SECP256K1_SCALAR_CONST(
8081 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL,
8082 0xBAAEDCE6UL, 0xAF48A03BUL, 0xBFD25E8CUL, 0xD0364140UL
8083 );
8084 secp256k1_scalar r = max;
8086
8087 secp256k1_scalar_cmov(&r, &a, 0);
8088 CHECK(secp256k1_memcmp_var(&r, &max, sizeof(r)) == 0);
8089
8090 r = secp256k1_scalar_zero; a = max;
8091 secp256k1_scalar_cmov(&r, &a, 1);
8092 CHECK(secp256k1_memcmp_var(&r, &max, sizeof(r)) == 0);
8093
8095 secp256k1_scalar_cmov(&r, &a, 1);
8096 CHECK(secp256k1_memcmp_var(&r, &secp256k1_scalar_zero, sizeof(r)) == 0);
8097
8099 secp256k1_scalar_cmov(&r, &a, 1);
8100 CHECK(secp256k1_memcmp_var(&r, &secp256k1_scalar_one, sizeof(r)) == 0);
8101
8103 secp256k1_scalar_cmov(&r, &a, 0);
8104 CHECK(secp256k1_memcmp_var(&r, &secp256k1_scalar_one, sizeof(r)) == 0);
8105}
8106
8107static void ge_storage_cmov_test(void) {
8108 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);
8109 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);
8111 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
8112 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
8113 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
8114 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL
8115 );
8116 secp256k1_ge_storage r = max;
8117 secp256k1_ge_storage a = zero;
8118
8119 secp256k1_ge_storage_cmov(&r, &a, 0);
8120 CHECK(secp256k1_memcmp_var(&r, &max, sizeof(r)) == 0);
8121
8122 r = zero; a = max;
8123 secp256k1_ge_storage_cmov(&r, &a, 1);
8124 CHECK(secp256k1_memcmp_var(&r, &max, sizeof(r)) == 0);
8125
8126 a = zero;
8127 secp256k1_ge_storage_cmov(&r, &a, 1);
8128 CHECK(secp256k1_memcmp_var(&r, &zero, sizeof(r)) == 0);
8129
8130 a = one;
8131 secp256k1_ge_storage_cmov(&r, &a, 1);
8132 CHECK(secp256k1_memcmp_var(&r, &one, sizeof(r)) == 0);
8133
8134 r = one; a = zero;
8135 secp256k1_ge_storage_cmov(&r, &a, 0);
8136 CHECK(secp256k1_memcmp_var(&r, &one, sizeof(r)) == 0);
8137}
8138
8139static void run_cmov_tests(void) {
8140 int_cmov_test();
8141 fe_cmov_test();
8145}
8146
8147/* --------------------------------------------------------- */
8148/* Test Registry */
8149/* --------------------------------------------------------- */
8150
8151/* --- Special test cases that must run before RNG initialization --- */
8152static const struct tf_test_entry tests_no_rng[] = {
8153 CASE(xoshiro256pp_tests),
8154};
8156
8157/* --- Standard test cases start here --- */
8158static const struct tf_test_entry tests_general[] = {
8159 CASE(selftest_tests),
8160 CASE(all_proper_context_tests),
8161 CASE(all_static_context_tests),
8162 CASE(deprecated_context_flags_test),
8163 CASE(scratch_tests),
8164 CASE(invalid_scratch_space_tests),
8165 CASE(plug_sha256_compression_tests),
8166 CASE(sha256_compression_smoke_test_tests),
8167 CASE(sha256_multi_block_compression_tests),
8168};
8169
8170static const struct tf_test_entry tests_integer[] = {
8171#ifdef SECP256K1_WIDEMUL_INT128
8172 CASE(int128_tests),
8173#endif
8174 CASE(ctz_tests),
8175 CASE(modinv_tests),
8176 CASE(inverse_tests),
8177};
8178
8179static const struct tf_test_entry tests_hash[] = {
8180 CASE(sha256_known_output_tests),
8181 CASE(sha256_counter_tests),
8182 CASE(hmac_sha256_tests),
8183 CASE(rfc6979_hmac_sha256_tests),
8184 CASE(tagged_sha256_tests),
8185 CASE(sha256_initialize_midstate_tests),
8186};
8187
8188static const struct tf_test_entry tests_scalar[] = {
8189 CASE(scalar_tests),
8190};
8191
8192static const struct tf_test_entry tests_field[] = {
8193 CASE(field_half),
8194 CASE(field_misc),
8195 CASE(fe_equal_magnitude_boundaries),
8196 CASE(field_convert),
8197 CASE(field_be32_overflow),
8198 CASE(fe_mul),
8199 CASE(sqr),
8200 CASE(sqrt),
8201};
8202
8203static const struct tf_test_entry tests_group[] = {
8204 CASE(ge),
8205 CASE(gej),
8206 CASE(group_decompress),
8207};
8208
8209static const struct tf_test_entry tests_ecmult[] = {
8210 CASE(ecmult_pre_g),
8211 CASE(wnaf),
8212 CASE(point_times_order),
8213 CASE(ecmult_near_split_bound),
8214 CASE(ecmult_chain),
8215 CASE(ecmult_constants),
8216 CASE(ecmult_gen_ge),
8217 CASE(ecmult_gen_blind),
8218 CASE(ecmult_const_tests),
8219 CASE(ecmult_multi_tests),
8220 CASE(ec_combine),
8221};
8222
8223static const struct tf_test_entry tests_ec[] = {
8224 CASE(endomorphism_tests),
8225 CASE(ec_pubkey_parse_test),
8226 CASE(eckey_edge_case_test),
8227 CASE(eckey_negate_test),
8228};
8229
8230static const struct tf_test_entry tests_ecdsa[] = {
8231 CASE(ec_illegal_argument_tests),
8232 CASE(pubkey_comparison),
8233 CASE(pubkey_sort),
8234 CASE(random_pubkeys),
8235 CASE(ecdsa_der_parse),
8236 CASE(ecdsa_der_parse_long_form),
8237 CASE(ecdsa_sign_verify),
8238 CASE(ecdsa_end_to_end),
8239 CASE(ecdsa_edge_cases),
8240 CASE(ecdsa_wycheproof),
8242};
8243
8244static const struct tf_test_entry tests_utils[] = {
8245 CASE(hsort_tests),
8246 CASE(secp256k1_memczero_test),
8247 CASE(secp256k1_is_zero_array_test),
8248 CASE(secp256k1_byteorder_tests),
8249 CASE(cmov_tests),
8250};
8251
8252/* Register test modules */
8253static const struct tf_test_module registry_modules[] = {
8254 MAKE_TEST_MODULE(general),
8255 MAKE_TEST_MODULE(integer),
8256 MAKE_TEST_MODULE(hash),
8257 MAKE_TEST_MODULE(scalar),
8258 MAKE_TEST_MODULE(field),
8260 MAKE_TEST_MODULE(ecmult),
8261 MAKE_TEST_MODULE(ec),
8262#ifdef ENABLE_MODULE_ECDH
8263 MAKE_TEST_MODULE(ecdh),
8264#endif
8265 MAKE_TEST_MODULE(ecdsa),
8266#ifdef ENABLE_MODULE_RECOVERY
8267 /* ECDSA pubkey recovery tests */
8268 MAKE_TEST_MODULE(recovery),
8269#endif
8270#ifdef ENABLE_MODULE_EXTRAKEYS
8271 MAKE_TEST_MODULE(extrakeys),
8272#endif
8273#ifdef ENABLE_MODULE_SCHNORRSIG
8274 MAKE_TEST_MODULE(schnorrsig),
8275#endif
8276#ifdef ENABLE_MODULE_MUSIG
8277 MAKE_TEST_MODULE(musig),
8278#endif
8279#ifdef ENABLE_MODULE_ELLSWIFT
8280 MAKE_TEST_MODULE(ellswift),
8281#endif
8282#ifdef ENABLE_MODULE_SILENTPAYMENTS
8283 MAKE_TEST_MODULE(silentpayments),
8284#endif
8285 MAKE_TEST_MODULE(utils),
8286};
8287
8288/* Setup test environment */
8289static int setup(void) {
8290 /* Create a global context available to all tests */
8292 /* Randomize the context only with probability 15/16
8293 to make sure we test without context randomization from time to time.
8294 TODO Reconsider this when recalibrating the tests. */
8295 if (testrand_bits(4)) {
8296 unsigned char rand32[32];
8297 testrand256(rand32);
8299 }
8300 /* Make a writable copy of secp256k1_context_static in order to test the effect of API functions
8301 that write to the context. The API does not support cloning the static context, so we use
8302 memcpy instead. The user is not supposed to copy a context but we should still ensure that
8303 the API functions handle copies of the static context gracefully. */
8304 STATIC_CTX = malloc(sizeof(*secp256k1_context_static));
8305 CHECK(STATIC_CTX != NULL);
8308 return 0;
8309}
8310
8311/* Shutdown test environment */
8312static int teardown(void) {
8313 free(STATIC_CTX);
8315 return 0;
8316}
8317
8318int main(int argc, char **argv) {
8319 struct tf_framework tf = {0};
8323
8324 /* Add context creation/destruction functions */
8325 tf.fn_setup = setup;
8326 tf.fn_teardown = teardown;
8327
8328 /* Init and run framework */
8329 if (tf_init(&tf, argc, argv) != 0) return EXIT_FAILURE;
8330 return tf_run(&tf);
8331}
8332
8333#if defined(__GNUC__)
8334# pragma GCC diagnostic pop
8335#endif
static void pool cs
int ret
int flags
Definition: bitcoin-tx.cpp:530
#define SECP256K1_CHECKMEM_UNDEFINE(p, len)
Definition: checkmem.h:105
#define SECP256K1_CHECKMEM_CHECK(p, len)
Definition: checkmem.h:107
static const PrecomputedData data
Precomputed COutPoint and CCoins values.
static const wycheproof_ecdh_testvector testvectors[SECP256K1_ECDH_WYCHEPROOF_NUMBER_TESTVECTORS]
static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context *ecmult_gen_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 const unsigned char wycheproof_ecdsa_signatures[]
static const unsigned char wycheproof_ecdsa_public_keys[]
static const unsigned char wycheproof_ecdsa_messages[]
#define SECP256K1_ECDSA_WYCHEPROOF_NUMBER_TESTVECTORS
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 int secp256k1_ecmult_const_xonly(secp256k1_fe *r, const secp256k1_fe *n, const secp256k1_fe *d, const secp256k1_scalar *q, int known_on_curve)
Same as secp256k1_ecmult_const, but takes in an x coordinate of the base point only,...
static void secp256k1_ecmult_const(secp256k1_gej *r, const secp256k1_ge *a, const secp256k1_scalar *q)
Multiply: R = q*A (in constant-time for q)
static const secp256k1_scalar secp256k1_ecmult_const_K
static void secp256k1_ecmult_gen_ge(const secp256k1_ecmult_gen_context *ecmult_gen_ctx, secp256k1_ge *r, const secp256k1_scalar *a)
static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context *ecmult_gen_ctx, const secp256k1_hash_ctx *hash_ctx, const unsigned char *seed32)
static void secp256k1_ecmult_gen_gej(const secp256k1_ecmult_gen_context *ecmult_gen_ctx, secp256k1_gej *r, const secp256k1_scalar *a)
Multiply with the generator: R = a*G.
#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:626
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:743
#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:422
static int secp256k1_wnaf_fixed(int *wnaf, const secp256k1_scalar *s, int w)
Convert a number to WNAF notation.
Definition: ecmult_impl.h:437
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:162
static size_t secp256k1_strauss_scratch_size(size_t n_points)
Definition: ecmult_impl.h:377
#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:597
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:734
#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:804
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:664
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:822
volatile double sum
Definition: examples.cpp:10
#define N_PUBKEYS
Definition: tests_impl.h:252
#define secp256k1_fe_cmov
Definition: field.h:95
#define secp256k1_fe_negate(r, a, m)
Negate a field element.
Definition: field.h:218
#define secp256k1_fe_mul_int(r, a)
Multiply a field element with a small integer.
Definition: field.h:240
#define secp256k1_fe_normalizes_to_zero_var
Definition: field.h:82
#define secp256k1_fe_cmp_var
Definition: field.h:86
#define secp256k1_fe_normalize_weak
Definition: field.h:79
#define secp256k1_fe_is_odd
Definition: field.h:85
#define secp256k1_fe_mul
Definition: field.h:93
static const secp256k1_fe secp256k1_fe_one
Definition: field.h:68
static int secp256k1_fe_sqrt(secp256k1_fe *SECP256K1_RESTRICT r, const secp256k1_fe *SECP256K1_RESTRICT a)
Compute a square root of a field element.
#define secp256k1_fe_add
Definition: field.h:92
#define secp256k1_fe_normalize_var
Definition: field.h:80
#define secp256k1_fe_half
Definition: field.h:101
#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0)
This expands to an initializer for a secp256k1_fe valued sum((i*32) * d_i, i=0..7) mod p.
Definition: field.h:66
#define secp256k1_fe_to_storage
Definition: field.h:96
#define secp256k1_fe_inv_var
Definition: field.h:99
#define secp256k1_fe_is_zero
Definition: field.h:84
#define secp256k1_fe_set_b32_limit
Definition: field.h:88
#define secp256k1_fe_is_square_var
Definition: field.h:103
#define secp256k1_fe_get_bounds
Definition: field.h:100
#define secp256k1_fe_from_storage
Definition: field.h:97
#define secp256k1_fe_set_b32_mod
Definition: field.h:87
#define secp256k1_fe_negate_unchecked
Definition: field.h:90
#define secp256k1_fe_set_int_unchecked
Definition: field.h:83
#define secp256k1_fe_get_b32
Definition: field.h:89
#define secp256k1_fe_normalizes_to_zero
Definition: field.h:81
#define secp256k1_fe_inv
Definition: field.h:98
#define secp256k1_fe_sqr
Definition: field.h:94
#define secp256k1_fe_normalize
Definition: field.h:78
static int secp256k1_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b)
Determine whether two field elements are equal.
static void secp256k1_fe_storage_cmov(secp256k1_fe_storage *r, const secp256k1_fe_storage *a, int flag)
If flag is 1, set *r equal to *a; if flag is 0, leave it.
#define secp256k1_fe_add_int
Definition: field.h:102
#define secp256k1_fe_set_int(r, a)
Set a field element to an integer in range [0,0x7FFF].
Definition: field.h:145
#define SECP256K1_FE_STORAGE_CONST(d7, d6, d5, d4, d3, d2, d1, d0)
Definition: field_10x26.h:54
#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 void secp256k1_ge_serialize65(secp256k1_ge *elem, unsigned char *pub65)
Serialize a group element (that is not allowed to be infinity) to an uncompressed public key (65 byte...
static int secp256k1_gej_is_infinity(const secp256k1_gej *a)
Check whether a group element is the point at infinity.
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 int secp256k1_ge_eq_var(const secp256k1_ge *a, const secp256k1_ge *b)
Check two group elements (affine) for equality in variable time.
static int secp256k1_ge_x_on_curve_var(const secp256k1_fe *x)
Determine whether x is a valid X coordinate on the curve.
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_ge_to_bytes_ext(unsigned char *data, const secp256k1_ge *ge)
Convert a group element (that is allowed to be infinity) to a 64-byte array.
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_gej_eq_ge_var(const secp256k1_gej *a, const secp256k1_ge *b)
Check two group elements (jacobian and affine) for equality in variable time.
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_serialize33(secp256k1_ge *elem, unsigned char *pub33)
Serialize a group element (that is not allowed to be infinity) to a compressed public key (33 bytes).
static void secp256k1_ge_from_bytes_ext(secp256k1_ge *ge, const unsigned char *data)
Convert a 64-byte array into a group element.
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 int secp256k1_ge_x_frac_on_curve_var(const secp256k1_fe *xn, const secp256k1_fe *xd)
Determine whether fraction xn/xd is a valid X coordinate on the curve (xd != 0).
static void secp256k1_ge_storage_cmov(secp256k1_ge_storage *r, const secp256k1_ge_storage *a, int flag)
If flag is 1, set *r equal to *a; if flag is 0, leave it.
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 void secp256k1_ge_set_all_gej(secp256k1_ge *r, const secp256k1_gej *a, size_t len)
Set group elements r[0:len] (affine) equal to group elements a[0:len] (jacobian).
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 int secp256k1_ge_parse(secp256k1_ge *elem, const unsigned char *pub, size_t size)
Parse a group element from a 33-byte compressed or 65-byte uncompressed public key.
static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a, size_t len)
Set group elements r[0:len] (affine) equal to group elements a[0:len] (jacobian).
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_ge_to_bytes(unsigned char *buf, const secp256k1_ge *a)
Convert a group element that is not infinity to a 64-byte array.
static void secp256k1_gej_cmov(secp256k1_gej *r, const secp256k1_gej *a, int flag)
If flag is 1, set *r equal to *a; if flag is 0, 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.
#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 void secp256k1_ge_from_bytes(secp256k1_ge *r, const unsigned char *buf)
Convert a 64-byte array into group element.
static const secp256k1_ge secp256k1_ge_const_g
Definition: group_impl.h:72
static int secp256k1_sha256_smoke_test(const secp256k1_sha256_compression_function fn_compression)
Definition: hash_impl.h:141
static void secp256k1_sha256_transform(uint32_t *state, const unsigned char *blocks64, size_t n_blocks)
Definition: hash_impl.h:133
static void secp256k1_sha256_initialize_tagged(const secp256k1_hash_ctx *hash_ctx, secp256k1_sha256 *hash, const unsigned char *tag, size_t taglen)
Definition: hash_impl.h:261
static void secp256k1_hsort(void *ptr, size_t count, size_t size, int(*cmp)(const void *, const void *, void *), void *cmp_data)
static SECP256K1_INLINE void secp256k1_heap_swap(unsigned char *arr, size_t i, size_t j, size_t stride)
Definition: hsort_impl.h:34
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 int secp256k1_i128_check_pow2(const secp256k1_int128 *r, unsigned int n, int sign)
static SECP256K1_INLINE void secp256k1_u128_accum_u64(secp256k1_uint128 *r, uint64_t a)
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.
unsigned int nonce
#define CHECK(cond)
Unconditional failure on condition failure.
Definition: util.h:49
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 int secp256k1_jacobi32_maybe_var(const 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)
static int secp256k1_jacobi64_maybe_var(const secp256k1_modinv64_signed62 *x, const secp256k1_modinv64_modinfo *modinfo)
static int sign(const secp256k1_context *ctx, struct signer_secrets *signer_secrets, struct signer *signer, const secp256k1_musig_keyagg_cache *cache, const unsigned char *msg32, unsigned char *sig64)
Definition: musig.c:106
const auto ZERO
A stack consisting of a single zero-length element (interpreted as 0 by the script interpreter in num...
Definition: miniscript.h:345
Internal SHA-1 implementation.
Definition: sha1.cpp:16
static std::vector< std::string > split(const std::string &str, const std::string &delims=" \t")
Definition: subprocess.h:308
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
int ecdsa_signature_parse_der_lax(secp256k1_ecdsa_signature *sig, const unsigned char *input, size_t inputlen)
This function is taken from the libsecp256k1 distribution and implements DER parsing for ECDSA signat...
Definition: pubkey.cpp:45
const char * prefix
Definition: rest.cpp:1197
static void secp256k1_scalar_cmov(secp256k1_scalar *r, const secp256k1_scalar *a, int flag)
If flag is 1, set *r equal to *a; if flag is 0, leave it.
static void secp256k1_scalar_half(secp256k1_scalar *r, const secp256k1_scalar *a)
Multiply a scalar with the multiplicative inverse of 2.
static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *k)
Find r1 and r2 such that r1+r2*2^128 = k.
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_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 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 uint32_t secp256k1_scalar_get_bits_limb32(const secp256k1_scalar *a, unsigned int offset, unsigned int count)
Access bits (1 <= count <= 32) from a scalar.
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 uint32_t secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count)
Access bits (1 <= count <= 32) 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.
#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:83
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_hmac_sha256_finalize(const secp256k1_hash_ctx *hash_ctx, secp256k1_hmac_sha256 *hash, unsigned char *out32)
static void secp256k1_sha256_finalize(const secp256k1_hash_ctx *hash_ctx, secp256k1_sha256 *hash, unsigned char *out32)
static void secp256k1_sha256_initialize(secp256k1_sha256 *hash)
static void secp256k1_sha256_initialize_midstate(secp256k1_sha256 *hash, uint64_t bytes, const uint32_t state[8])
static void secp256k1_hmac_sha256_write(const secp256k1_hash_ctx *hash_ctx, secp256k1_hmac_sha256 *hash, const unsigned char *data, size_t size)
static void secp256k1_rfc6979_hmac_sha256_generate(const secp256k1_hash_ctx *hash_ctx, secp256k1_rfc6979_hmac_sha256 *rng, unsigned char *out, size_t outlen)
static void secp256k1_rfc6979_hmac_sha256_initialize(const secp256k1_hash_ctx *hash_ctx, 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_sha256_write(const secp256k1_hash_ctx *hash_ctx, secp256k1_sha256 *hash, const unsigned char *data, size_t size)
static void secp256k1_hmac_sha256_initialize(const secp256k1_hash_ctx *hash_ctx, secp256k1_hmac_sha256 *hash, const unsigned char *key, size_t size)
static SECP256K1_INLINE int secp256k1_ctz64_var(uint64_t x)
Definition: util.h:410
static SECP256K1_INLINE int secp256k1_memcmp_var(const void *s1, const void *s2, size_t n)
Semantics like memcmp.
Definition: util.h:281
static SECP256K1_INLINE void secp256k1_int_cmov(int *r, const int *a, int flag)
If flag is 1, set *r equal to *a; if flag is 0, leave it.
Definition: util.h:312
#define ARRAY_SIZE(arr)
Definition: util.h:194
#define ALIGNMENT
Definition: util.h:186
static void secp256k1_default_error_callback_fn(const char *str, void *data)
Definition: util.h:112
static SECP256K1_INLINE int secp256k1_is_zero_array(const unsigned char *s, size_t len)
Definition: util.h:296
#define ROUND_TO_ALIGN(size)
Definition: util.h:192
static SECP256K1_INLINE uint32_t secp256k1_read_be32(const unsigned char *p)
Definition: util.h:428
static SECP256K1_INLINE int secp256k1_ctz32_var(uint32_t x)
Definition: util.h:392
static SECP256K1_INLINE void secp256k1_write_be32(unsigned char *p, uint32_t x)
Definition: util.h:436
static SECP256K1_INLINE void secp256k1_write_be64(unsigned char *p, uint64_t x)
Definition: util.h:456
static void secp256k1_default_illegal_callback_fn(const char *str, void *data)
Definition: util.h:107
static SECP256K1_INLINE int secp256k1_ctz64_var_debruijn(uint64_t x)
Definition: util.h:381
#define VERIFY_CHECK(cond)
Definition: util.h:169
static SECP256K1_INLINE int secp256k1_ctz32_var_debruijn(uint32_t x)
Definition: util.h:369
static SECP256K1_INLINE uint64_t secp256k1_read_be64(const unsigned char *p)
Definition: util.h:444
static SECP256K1_INLINE void * checked_malloc(const secp256k1_callback *cb, size_t size)
Definition: util.h:172
static SECP256K1_INLINE void secp256k1_memczero(void *s, size_t len, int flag)
Definition: util.h:220
static void secp256k1_scratch_space_destroy(const secp256k1_context *ctx, secp256k1_scratch_space *scratch)
Definition: secp256k1.c:242
static int secp256k1_context_is_proper(const secp256k1_context *ctx)
Definition: secp256k1.c:83
static void secp256k1_ecdsa_signature_save(secp256k1_ecdsa_signature *sig, const secp256k1_scalar *r, const secp256k1_scalar *s)
Definition: secp256k1.c:381
static secp256k1_scratch_space * secp256k1_scratch_space_create(const secp256k1_context *ctx, size_t max_size)
Definition: secp256k1.c:237
static int secp256k1_pubkey_load(const secp256k1_context *ctx, secp256k1_ge *ge, const secp256k1_pubkey *pubkey)
Definition: secp256k1.c:254
static void secp256k1_pubkey_save(secp256k1_pubkey *pubkey, secp256k1_ge *ge)
Definition: secp256k1.c:260
static int secp256k1_ec_pubkey_sort_cmp(const void *pk1, const void *pk2, void *ctx)
Definition: secp256k1.c:334
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:530
static void secp256k1_ecdsa_signature_load(const secp256k1_context *ctx, secp256k1_scalar *r, secp256k1_scalar *s, const secp256k1_ecdsa_signature *sig)
Definition: secp256k1.c:367
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:189
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:732
#define SECP256K1_CONTEXT_SIGN
Definition: secp256k1.h:210
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:775
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:785
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:650
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:407
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:213
SECP256K1_API 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:665
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:308
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 elliptic curve secret key.
Definition: secp256k1.c:611
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:143
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:201
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:597
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:206
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:391
SECP256K1_API void secp256k1_selftest(void)
Perform basic self tests (to be used in conjunction with secp256k1_context_static)
Definition: secp256k1.c:87
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:632
#define SECP256K1_EC_COMPRESSED
Flag to pass to secp256k1_ec_pubkey_serialize.
Definition: secp256k1.h:216
struct secp256k1_pubkey secp256k1_pubkey
Opaque data structure that holds a parsed and valid public key.
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_verify(const secp256k1_context *ctx, const secp256k1_ecdsa_signature *sig, const unsigned char *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:472
SECP256K1_API 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:811
SECP256K1_API const secp256k1_context *const secp256k1_context_static
A built-in constant secp256k1 context object with static storage duration, to be used in conjunction ...
Definition: secp256k1.h:237
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:453
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:165
SECP256K1_API void secp256k1_context_set_sha256_compression(secp256k1_context *ctx, secp256k1_sha256_compression_function fn_compression) SECP256K1_ARG_NONNULL(1)
Set a callback function to override the internal SHA256 compression function.
Definition: secp256k1.c:225
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:715
#define SECP256K1_EC_UNCOMPRESSED
Definition: secp256k1.h:217
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:428
struct secp256k1_ecdsa_signature secp256k1_ecdsa_signature
Opaque data structure that holds a parsed ECDSA signature.
SECP256K1_API int secp256k1_ec_pubkey_sort(const secp256k1_context *ctx, const secp256k1_pubkey **pubkeys, size_t n_pubkeys) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2)
Sort public keys using lexicographic (of compressed serialization) order.
Definition: secp256k1.c:340
#define SECP256K1_CONTEXT_VERIFY
Deprecated context flags.
Definition: secp256k1.h:209
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:692
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:752
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:440
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:113
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:178
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:119
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:93
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:154
secp256k1_scalar * sc
Definition: tests.c:4950
secp256k1_ge * pt
Definition: tests.c:4951
void(* fn)(const char *text, void *data)
Definition: util.h:98
const void * data
Definition: util.h:99
secp256k1_callback illegal_callback
Definition: secp256k1.c:64
secp256k1_callback error_callback
Definition: secp256k1.c:65
secp256k1_ecmult_gen_context ecmult_gen_ctx
Definition: secp256k1.c:62
secp256k1_hash_ctx hash_ctx
Definition: secp256k1.c:63
Opaque data structure that holds a parsed ECDSA signature.
Definition: secp256k1.h:75
unsigned char data[64]
Definition: secp256k1.h:76
secp256k1_scalar scalar_offset
Definition: ecmult_gen.h:128
This field implementation represents the value as 10 uint32_t limbs in base 2^26.
Definition: field_10x26.h:14
uint32_t n[10]
Definition: field_10x26.h:22
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_sha256_compression_function fn_sha256_compression
Definition: hash.h:16
Opaque data structure that holds a parsed and valid public key.
Definition: secp256k1.h:62
A scalar modulo the group order of the secp256k1 curve.
Definition: scalar_4x64.h:13
size_t alloc_size
amount that has been allocated (i.e.
Definition: scratch.h:19
unsigned char magic[8]
guard against interpreting this object as other types
Definition: scratch.h:14
uint64_t bytes
Definition: hash.h:24
uint32_t s[8]
Definition: hash.h:22
size_t element_len
Definition: tests.c:3895
teardown_fn fn_teardown
Definition: unit_test.h:106
setup_ctx_fn fn_setup
Definition: unit_test.h:105
const struct tf_test_module * registry_no_rng
Definition: unit_test.h:103
const struct tf_test_module * registry_modules
Definition: unit_test.h:99
int num_modules
Definition: unit_test.h:101
Definition: unit_test.h:53
std::vector< uint16_t > keys
Definition: dbwrapper.cpp:376
FastRandomContext rng
Definition: dbwrapper.cpp:413
static void testrand256_test(unsigned char *b32)
Generate a pseudorandom 32-byte array with long sequences of zero and one bits.
static void testrand256(unsigned char *b32)
Generate a pseudorandom 32-byte array.
static SECP256K1_INLINE uint64_t testrand_bits(int bits)
Generate a pseudorandom number in the range [0..2**bits-1].
static uint32_t testrand_int(uint32_t range)
Generate a pseudorandom number in the range [0..range-1].
static SECP256K1_INLINE void testrand_seed(const unsigned char *seed16)
Seed the pseudorandom number generator for testing.
static void testrand_bytes_test(unsigned char *bytes, size_t len)
Generate pseudorandom bytes with long sequences of zero and one bits.
static uint64_t secp256k1_test_state[4]
Definition: testrand_impl.h:18
static void run_random_pubkeys(void)
Definition: tests.c:7113
#define CHECK_ILLEGAL_VOID(ctx, expr_or_stmt)
Definition: tests.c:77
static void run_all_proper_context_tests(void)
Definition: tests.c:361
static void test_wnaf(const secp256k1_scalar *number, int w)
Definition: tests.c:5569
static size_t der_padded_integer(unsigned char *buf)
Definition: tests.c:7425
static void run_inverse_tests(void)
Definition: tests.c:3625
static void counting_callback_fn(const char *str, void *data)
Definition: tests.c:88
static void mutate_sign_signed30(secp256k1_modinv32_signed30 *x)
Definition: tests.c:1108
static void ec_pubkey_parse_pointtest(const unsigned char *input, int xvalid, int yvalid)
Definition: tests.c:6015
static const struct tf_test_module registry_modules_no_rng
Definition: tests.c:8155
static void test_ecdsa_sign_verify(void)
Definition: tests.c:6630
static void test_ge(void)
Definition: tests.c:3967
#define CHECK_ERROR_VOID(ctx, expr_or_stmt)
Definition: tests.c:75
static const struct tf_test_entry tests_field[]
Definition: tests.c:8192
static void run_pubkey_comparison(void)
Definition: tests.c:6913
static void run_ecdsa_sign_verify(void)
Definition: tests.c:6655
static void run_field_misc(void)
Definition: tests.c:3309
static void good_sha256_compression(uint32_t *s, const unsigned char *msg, size_t rounds)
Definition: tests.c:454
static void test_ecmult_gen_blind_reset(void)
Definition: tests.c:5925
static void run_ec_pubkey_parse_test(void)
Definition: tests.c:6082
static void run_static_context_tests(int use_prealloc)
Definition: tests.c:197
static void random_sign(secp256k1_scalar *sigr, secp256k1_scalar *sigs, const secp256k1_scalar *key, const secp256k1_scalar *msg, int *recid)
Definition: tests.c:6623
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:6671
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:6679
#define SECP256K1_EC_PARSE_TEST_NINVALID
static int test_ecmult_multi_random(secp256k1_scratch *scratch)
Definition: tests.c:5192
static void mulmod256(uint16_t *out, const uint16_t *a, const uint16_t *b, const uint16_t *m)
Definition: tests.c:1006
static const struct tf_test_entry tests_group[]
Definition: tests.c:8203
static void test_sha256_tag_midstate(const secp256k1_hash_ctx *hash_ctx, secp256k1_sha256 *sha_tagged, const unsigned char *tag, size_t taglen)
Definition: tests.c:855
static void ecmult_const_check_result(const secp256k1_ge *A, const secp256k1_scalar *q, const secp256k1_gej *res)
Definition: tests.c:4823
static void test_sort(void)
Definition: tests.c:7016
#define CHECK_ILLEGAL(ctx, expr)
Definition: tests.c:85
static int gej_xyz_equals_gej(const secp256k1_gej *a, const secp256k1_gej *b)
Definition: tests.c:3946
static int ecmult_gen_context_eq(const secp256k1_ecmult_gen_context *a, const secp256k1_ecmult_gen_context *b)
Definition: tests.c:131
static void run_tagged_sha256_tests(void)
Definition: tests.c:948
static void run_sha256_counter_tests(void)
SHA256 counter tests.
Definition: tests.c:784
static void test_fixed_wnaf_small_helper(int *wnaf, int *wnaf_expected, int w)
Definition: tests.c:5639
static int test_hsort_cmp(const void *ele1, const void *ele2, void *data)
Definition: tests.c:3899
static void run_sha256_compression_smoke_test_tests(void)
Definition: tests.c:554
static int all_bytes_equal(const void *s, unsigned char value, size_t n)
Definition: tests.c:51
static void test_fixed_wnaf_small(void)
Definition: tests.c:5649
int main(int argc, char **argv)
Definition: tests.c:8318
static void run_plug_sha256_compression_tests(void)
Definition: tests.c:459
static void run_ecmult_const_tests(void)
Definition: tests.c:4940
static int fe_identical(const secp256k1_fe *a, const secp256k1_fe *b)
Definition: tests.c:3253
#define SECP256K1_EC_PARSE_TEST_NVALID
static void run_eckey_edge_case_test(void)
Definition: tests.c:6367
static int teardown(void)
Definition: tests.c:8312
static void run_pubkey_sort(void)
Definition: tests.c:7106
static void random_fe_non_square(secp256k1_fe *ns)
Definition: tests.c:3129
static void run_secp256k1_byteorder_tests(void)
Definition: tests.c:7966
static void run_ecmult_constants(void)
Definition: tests.c:5849
static void run_field_be32_overflow(void)
Definition: tests.c:3186
static void test_modinv32_uint16(uint16_t *out, const uint16_t *in, const uint16_t *mod)
Definition: tests.c:1123
static void run_ecmult_chain(void)
Definition: tests.c:4547
static const struct tf_test_entry tests_utils[]
Definition: tests.c:8244
static void test_inverse_field(secp256k1_fe *out, const secp256k1_fe *x, int var)
Definition: tests.c:3600
static void der_long_form_check(const secp256k1_ecdsa_signature *sig)
Definition: tests.c:7440
static size_t der_long_form_body(unsigned char *buf)
Definition: tests.c:7407
static void run_ec_combine(void)
Definition: tests.c:4420
static const struct tf_test_module registry_modules[]
Definition: tests.c:8253
static void run_deprecated_context_flags_test(void)
Definition: tests.c:148
static secp256k1_context * CTX
Definition: tests.c:48
static void run_point_times_order(void)
Definition: tests.c:4721
static void random_ber_signature(unsigned char *sig, size_t *len, int *certainly_der, int *certainly_not_der)
Definition: tests.c:7226
static void test_sort_vectors(void)
Definition: tests.c:7062
#define CONDITIONAL_TEST(cnt, nam)
Definition: tests.c:46
static void ecmult_const_commutativity(void)
Definition: tests.c:4769
static void int_cmov_test(void)
Definition: tests.c:7994
static const struct tf_test_entry tests_ecdsa[]
Definition: tests.c:8230
static void test_ge_bytes(void)
Definition: tests.c:4316
static void test_add_neg_y_diff_x(void)
Definition: tests.c:4256
static void test_ecmult_accumulate(secp256k1_sha256 *acc, const secp256k1_scalar *x, secp256k1_scratch *scratch)
Definition: tests.c:5730
static void test_point_times_order(const secp256k1_gej *point)
Definition: tests.c:4606
static void assign_big_endian(unsigned char *ptr, size_t ptrlen, uint32_t val)
Definition: tests.c:7187
static const struct tf_test_entry tests_ec[]
Definition: tests.c:8223
static void run_hmac_sha256_tests(void)
Definition: tests.c:861
static int fe_equal(const secp256k1_fe *a, const secp256k1_fe *b)
Definition: tests.c:3137
static void test_ecmult_multi_batch_single(secp256k1_ecmult_multi_func ecmult_multi)
Definition: tests.c:5358
static void signed30_to_uint16(uint16_t *out, const secp256k1_modinv32_signed30 *in)
Definition: tests.c:1099
static void run_secp256k1_is_zero_array_test(void)
Definition: tests.c:7955
static void run_fe_equal_magnitude_boundaries(void)
Definition: tests.c:3144
static const struct tf_test_entry tests_no_rng[]
Definition: tests.c:8152
static int is_empty_signature(const secp256k1_ecdsa_signature *sig)
Definition: tests.c:6703
static void run_field_half(void)
Definition: tests.c:3260
static void run_eckey_negate_test(void)
Definition: tests.c:6593
static void scalar_test(void)
Definition: tests.c:2268
static void run_scalar_set_b32_seckey_tests(void)
Definition: tests.c:2423
static void test_ecmult_multi(secp256k1_scratch *scratch, secp256k1_ecmult_multi_func ecmult_multi)
Definition: tests.c:4969
static void run_hsort_tests(void)
Definition: tests.c:3936
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:6663
static void test_hsort_is_sorted(unsigned char *elements, size_t n, size_t len)
Definition: tests.c:3886
static void run_gej(void)
Definition: tests.c:4362
static const struct tf_test_entry tests_integer[]
Definition: tests.c:8170
static void run_ge(void)
Definition: tests.c:4344
#define MAX_ELEMENT_LEN
Definition: tests.c:3906
static void ge_storage_cmov_test(void)
Definition: tests.c:8107
static const secp256k1_scalar scalar_minus_one
Definition: tests.c:3561
static void fe_storage_cmov_test(void)
Definition: tests.c:8049
static void test_ec_combine(void)
Definition: tests.c:4398
static void test_secp256k1_pippenger_bucket_window_inv(void)
Definition: tests.c:5376
static void test_ecmult_gen_edge_cases(void)
Definition: tests.c:5939
static void run_ctz_tests(void)
Definition: tests.c:661
static void test_sort_helper(secp256k1_pubkey *pk, size_t *pk_order, size_t n_pk)
Definition: tests.c:6958
static 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:5396
static void run_scalar_tests(void)
Definition: tests.c:2487
static void test_random_pubkeys(void)
Definition: tests.c:6851
static void test_gej_cmov(const secp256k1_gej *a, const secp256k1_gej *b)
Definition: tests.c:4354
static void test_heap_swap(void)
Definition: tests.c:3873
static void test_sqrt(const secp256k1_fe *a, const secp256k1_fe *k)
Definition: tests.c:3509
static void scalar_cmov_test(void)
Definition: tests.c:8079
static const struct tf_test_entry tests_hash[]
Definition: tests.c:8179
static void run_ecmult_gen_blind(void)
Definition: tests.c:5957
static void test_ecdsa_end_to_end(void)
Definition: tests.c:6708
static const struct tf_test_entry tests_ecmult[]
Definition: tests.c:8209
static void run_sha256_known_output_tests(void)
Definition: tests.c:682
static void test_ecmult_target(const secp256k1_scalar *target, int mode)
Definition: tests.c:4671
#define NUM
Definition: tests.c:3905
#define CHECK_ERROR(ctx, expr)
Definition: tests.c:86
static void run_ecdsa_end_to_end(void)
Definition: tests.c:7120
static int ecmult_multi_callback(secp256k1_scalar *sc, secp256k1_ge *pt, size_t idx, void *cbdata)
Definition: tests.c:4954
static void ecmult_const_mult_xonly(void)
Definition: tests.c:4859
static void run_proper_context_tests(int use_prealloc)
Definition: tests.c:241
static const struct tf_test_entry tests_general[]
Definition: tests.c:8158
static void test_fe_mul(const secp256k1_fe *a, const secp256k1_fe *b, int use_sqr)
Definition: tests.c:3416
static void test_group_decompress(const secp256k1_fe *x)
Definition: tests.c:4427
static void test_scalar_check_overflow(void)
Definition: tests.c:2440
static void test_ecmult_constants_2bit(void)
Definition: tests.c:5761
static void run_cmov_tests(void)
Definition: tests.c:8139
static void permute(size_t *arr, size_t n)
Definition: tests.c:6971
static void sha256_transform_ivreset(uint32_t *s, const unsigned char *chunk, size_t blocks)
Definition: tests.c:509
static void run_sha256_multi_block_compression_tests(void)
Definition: tests.c:568
static const struct tf_test_entry tests_scalar[]
Definition: tests.c:8188
static void test_initialized_inf(void)
Definition: tests.c:4224
static void run_ecdsa_der_parse(void)
Definition: tests.c:7372
static void ecmult_const_random_mult(void)
Definition: tests.c:4742
static void sha256_transform_batch4(uint32_t *s, const unsigned char *chunk, size_t blocks)
Definition: tests.c:517
static void test_scalar_split(const secp256k1_scalar *full)
Definition: tests.c:5967
static void run_field_convert(void)
Definition: tests.c:3156
static int test_ecdsa_der_parse(const unsigned char *sig, size_t siglen, int certainly_der, int certainly_not_der)
Definition: tests.c:7127
static void run_ec_illegal_argument_tests(void)
Definition: tests.c:166
static void run_ecdsa_wycheproof(void)
Definition: tests.c:7907
static void test_ecmult_constants_sha(uint32_t prefix, size_t iter, const unsigned char *expected32)
Definition: tests.c:5805
static void invalid_sha256_compression(uint32_t *s, const unsigned char *msg, size_t rounds)
Definition: tests.c:449
static 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:5477
static void run_all_static_context_tests(void)
Definition: tests.c:235
static void sha256_transform_noadvance(uint32_t *s, const unsigned char *chunk, size_t blocks)
Definition: tests.c:496
static void run_sqrt(void)
Definition: tests.c:3523
static void sha256_transform_corrupt(uint32_t *s, const unsigned char *chunk, size_t blocks)
Definition: tests.c:522
static void run_modinv_tests(void)
Definition: tests.c:1304
static const secp256k1_scalar scalars_near_split_bounds[20]
Definition: tests.c:4648
static void uint16_to_signed30(secp256k1_modinv32_signed30 *out, const uint16_t *in)
Definition: tests.c:1090
static void run_xoshiro256pp_tests(void)
Definition: tests.c:97
static void run_wnaf(void)
Definition: tests.c:5703
static void run_ecmult_multi_tests(void)
Definition: tests.c:5542
static void run_selftest_tests(void)
Definition: tests.c:126
static int coprime(const uint16_t *a, const uint16_t *b)
Definition: tests.c:1274
static void run_sqr(void)
Definition: tests.c:3480
static int context_eq(const secp256k1_context *a, const secp256k1_context *b)
Definition: tests.c:138
static void test_ecmult_multi_batch_size_helper(void)
Definition: tests.c:5429
static void sha256_transform_short(uint32_t *s, const unsigned char *chunk, size_t blocks)
Definition: tests.c:504
static void run_endomorphism_tests(void)
Definition: tests.c:5994
static void run_scratch_tests(void)
Definition: tests.c:367
static void test_ecdsa_wycheproof(void)
Wycheproof tests.
Definition: tests.c:7876
static void run_ecmult_near_split_bound(void)
Definition: tests.c:4709
static void run_ecdsa_edge_cases(void)
Definition: tests.c:7520
static void fe_cmov_test(void)
Definition: tests.c:8019
static void run_group_decompress(void)
Definition: tests.c:4462
static void ecmult_const_mult_zero_one(void)
Definition: tests.c:4790
static int test_ecmult_accumulate_cb(secp256k1_scalar *sc, secp256k1_ge *pt, size_t idx, void *data)
Definition: tests.c:5722
static void ecmult_const_edges(void)
Definition: tests.c:4832
static void run_sha256_initialize_midstate_tests(void)
Definition: tests.c:972
static void ecmult_const_chain_multiply(void)
Definition: tests.c:4914
static void run_ecmult_pre_g(void)
Definition: tests.c:4523
static int ecmult_multi_false_callback(secp256k1_scalar *sc, secp256k1_ge *pt, size_t idx, void *cbdata)
Definition: tests.c:4961
static void test_sha256_eq(const secp256k1_sha256 *sha1, const secp256k1_sha256 *sha2)
Definition: tests.c:846
static void test_pre_g_table(const secp256k1_ge_storage *pre_g, size_t n)
Definition: tests.c:4473
static void test_hsort(size_t element_len)
Definition: tests.c:3907
static void test_sort_api(void)
Definition: tests.c:6982
static void run_invalid_scratch_space_tests(void)
Definition: tests.c:434
static int setup(void)
Definition: tests.c:8289
static secp256k1_context * STATIC_CTX
Definition: tests.c:49
static void test_fixed_wnaf(const secp256k1_scalar *number, int w)
Definition: tests.c:5603
static void test_inverse_scalar(secp256k1_scalar *out, const secp256k1_scalar *x, int var)
Definition: tests.c:3578
static void run_ecdsa_der_parse_long_form(void)
Definition: tests.c:7458
static void test_ecmult_gen_blind(void)
Definition: tests.c:5902
static void run_ecmult_gen_ge(void)
Definition: tests.c:5883
static void run_secp256k1_memczero_test(void)
Definition: tests.c:7939
static int own_transform_called
Definition: tests.c:453
static void run_fe_mul(void)
Definition: tests.c:3459
#define SECP256K1_EC_PARSE_TEST_NXVALID
static void damage_array(unsigned char *sig, size_t *len)
Definition: tests.c:7199
static void ecdsa_ctx_sha256(void)
Definition: tests.c:7852
static const secp256k1_fe fe_minus_one
Definition: tests.c:3566
static void run_rfc6979_hmac_sha256_tests(void)
Definition: tests.c:906
static uint64_t modinv2p64(uint64_t x)
Definition: tests.c:989
static void testutil_random_fe_test(secp256k1_fe *x)
Definition: testutil.h:63
static void testutil_random_pubkey_test(secp256k1_pubkey *pk)
Definition: testutil.h:123
static void testutil_random_gej_y_magnitude(secp256k1_gej *gej)
Definition: testutil.h:91
static const unsigned char secp256k1_group_order_bytes[32]
Definition: testutil.h:24
static void testutil_random_fe_non_zero(secp256k1_fe *nz)
Definition: testutil.h:41
static void testutil_random_scalar_order(secp256k1_scalar *num)
Definition: testutil.h:142
#define DEFINE_SHA256_TRANSFORM_PROBE(name)
Definition: testutil.h:15
static void testutil_random_gej_test(secp256k1_gej *gej)
Definition: testutil.h:117
static void testutil_random_scalar_order_test(secp256k1_scalar *num)
Definition: testutil.h:129
static void testutil_random_scalar_order_b32(unsigned char *b32)
Definition: testutil.h:155
static void testutil_random_fe(secp256k1_fe *x)
Definition: testutil.h:31
static void testutil_random_fe_non_zero_test(secp256k1_fe *fe)
Definition: testutil.h:73
static void testutil_random_gej_x_magnitude(secp256k1_gej *gej)
Definition: testutil.h:87
static void testutil_random_fe_magnitude(secp256k1_fe *fe, int m)
Definition: testutil.h:47
static void testutil_random_ge_x_magnitude(secp256k1_ge *ge)
Definition: testutil.h:79
static void testutil_random_gej_z_magnitude(secp256k1_gej *gej)
Definition: testutil.h:95
static void testutil_random_ge_test(secp256k1_ge *ge)
Definition: testutil.h:99
static void testutil_random_ge_y_magnitude(secp256k1_ge *ge)
Definition: testutil.h:83
static void testutil_random_ge_jacobian_test(secp256k1_gej *gej, const secp256k1_ge *ge)
Definition: testutil.h:110
int COUNT
Definition: unit_test.c:28
static int tf_init(struct tf_framework *tf, int argc, char **argv)
Definition: unit_test.c:354
static int tf_run(struct tf_framework *tf)
Definition: unit_test.c:416
#define CASE1(name)
Definition: unit_test.h:27
#define CASE(name)
Definition: unit_test.h:26
#define MAKE_TEST_MODULE(name)
Definition: unit_test.h:29
#define expect(bit)