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