@@ -32,11 +32,43 @@ static int COUNT = 64;
32
32
static secp256k1_context * CTX = NULL ;
33
33
static secp256k1_context * STATIC_CTX = NULL ;
34
34
35
+ static int all_bytes_equal (const void * s , unsigned char value , size_t n ) {
36
+ const unsigned char * p = s ;
37
+ size_t i ;
38
+
39
+ for (i = 0 ; i < n ; i ++ ) {
40
+ if (p [i ] != value ) {
41
+ return 0 ;
42
+ }
43
+ }
44
+ return 1 ;
45
+ }
46
+
47
+ /* TODO Use CHECK_ILLEGAL(_VOID) everywhere and get rid of the uncounting callback */
48
+ /* CHECK that expr_or_stmt calls the illegal callback of ctx exactly once
49
+ *
50
+ * For checking functions that use ARG_CHECK_VOID */
51
+ #define CHECK_ILLEGAL_VOID (ctx , expr_or_stmt ) do { \
52
+ int32_t _calls_to_illegal_callback = 0; \
53
+ secp256k1_callback _saved_illegal_cb = ctx->illegal_callback; \
54
+ secp256k1_context_set_illegal_callback(ctx, \
55
+ counting_illegal_callback_fn, &_calls_to_illegal_callback); \
56
+ { expr_or_stmt; } \
57
+ ctx->illegal_callback = _saved_illegal_cb; \
58
+ CHECK(_calls_to_illegal_callback == 1); \
59
+ } while(0);
60
+
61
+ /* CHECK that expr calls the illegal callback of ctx exactly once and that expr == 0
62
+ *
63
+ * For checking functions that use ARG_CHECK */
64
+ #define CHECK_ILLEGAL (ctx , expr ) CHECK_ILLEGAL_VOID(ctx, CHECK((expr) == 0))
65
+
35
66
static void counting_illegal_callback_fn (const char * str , void * data ) {
36
67
/* Dummy callback function that just counts. */
37
68
int32_t * p ;
38
69
(void )str ;
39
70
p = data ;
71
+ CHECK (* p != INT32_MAX );
40
72
(* p )++ ;
41
73
}
42
74
@@ -45,6 +77,7 @@ static void uncounting_illegal_callback_fn(const char* str, void* data) {
45
77
int32_t * p ;
46
78
(void )str ;
47
79
p = data ;
80
+ CHECK (* p != INT32_MIN );
48
81
(* p )-- ;
49
82
}
50
83
@@ -229,31 +262,61 @@ static void run_ec_illegal_argument_tests(void) {
229
262
secp256k1_context_set_illegal_callback (CTX , NULL , NULL );
230
263
}
231
264
232
- static void run_static_context_tests (void ) {
233
- int32_t dummy = 0 ;
234
-
265
+ static void run_static_context_tests (int use_prealloc ) {
235
266
/* Check that deprecated secp256k1_context_no_precomp is an alias to secp256k1_context_static. */
236
267
CHECK (secp256k1_context_no_precomp == secp256k1_context_static );
237
268
238
- /* check if sizes for cloning are consistent */
239
- CHECK ( secp256k1_context_preallocated_clone_size ( STATIC_CTX ) >= sizeof ( secp256k1_context )) ;
269
+ {
270
+ unsigned char seed [ 32 ] = { 0x17 } ;
240
271
241
- /* Verify that setting and resetting illegal callback works */
242
- secp256k1_context_set_illegal_callback (STATIC_CTX , counting_illegal_callback_fn , & dummy );
243
- CHECK (STATIC_CTX -> illegal_callback .fn == counting_illegal_callback_fn );
244
- secp256k1_context_set_illegal_callback (STATIC_CTX , NULL , NULL );
245
- CHECK (STATIC_CTX -> illegal_callback .fn == secp256k1_default_illegal_callback_fn );
272
+ /* Randomizing secp256k1_context_static is not supported. */
273
+ CHECK_ILLEGAL (STATIC_CTX , secp256k1_context_randomize (STATIC_CTX , seed ));
274
+ CHECK_ILLEGAL (STATIC_CTX , secp256k1_context_randomize (STATIC_CTX , NULL ));
275
+
276
+ /* Destroying or cloning secp256k1_context_static is not supported. */
277
+ if (use_prealloc ) {
278
+ CHECK_ILLEGAL (STATIC_CTX , secp256k1_context_preallocated_clone_size (STATIC_CTX ));
279
+ {
280
+ secp256k1_context * my_static_ctx = malloc (sizeof (* STATIC_CTX ));
281
+ CHECK (my_static_ctx != NULL );
282
+ memset (my_static_ctx , 0x2a , sizeof (* my_static_ctx ));
283
+ CHECK_ILLEGAL (STATIC_CTX , secp256k1_context_preallocated_clone (STATIC_CTX , my_static_ctx ));
284
+ CHECK (all_bytes_equal (my_static_ctx , 0x2a , sizeof (* my_static_ctx )));
285
+ free (my_static_ctx );
286
+ }
287
+ CHECK_ILLEGAL_VOID (STATIC_CTX , secp256k1_context_preallocated_destroy (STATIC_CTX ));
288
+ } else {
289
+ CHECK_ILLEGAL (STATIC_CTX , secp256k1_context_clone (STATIC_CTX ));
290
+ CHECK_ILLEGAL_VOID (STATIC_CTX , secp256k1_context_destroy (STATIC_CTX ));
291
+ }
292
+ }
293
+
294
+ {
295
+ /* Verify that setting and resetting illegal callback works */
296
+ int32_t dummy = 0 ;
297
+ secp256k1_context_set_illegal_callback (STATIC_CTX , counting_illegal_callback_fn , & dummy );
298
+ CHECK (STATIC_CTX -> illegal_callback .fn == counting_illegal_callback_fn );
299
+ CHECK (STATIC_CTX -> illegal_callback .data == & dummy );
300
+ secp256k1_context_set_illegal_callback (STATIC_CTX , NULL , NULL );
301
+ CHECK (STATIC_CTX -> illegal_callback .fn == secp256k1_default_illegal_callback_fn );
302
+ CHECK (STATIC_CTX -> illegal_callback .data == NULL );
303
+ }
246
304
}
247
305
248
306
static void run_proper_context_tests (int use_prealloc ) {
249
307
int32_t dummy = 0 ;
250
- secp256k1_context * my_ctx ;
308
+ secp256k1_context * my_ctx , * my_ctx_fresh ;
251
309
void * my_ctx_prealloc = NULL ;
310
+ unsigned char seed [32 ] = {0x17 };
252
311
253
312
secp256k1_gej pubj ;
254
313
secp256k1_ge pub ;
255
314
secp256k1_scalar msg , key , nonce ;
256
315
secp256k1_scalar sigr , sigs ;
316
+
317
+ /* Fresh reference context for comparison */
318
+ my_ctx_fresh = secp256k1_context_create (SECP256K1_CONTEXT_NONE );
319
+
257
320
if (use_prealloc ) {
258
321
my_ctx_prealloc = malloc (secp256k1_context_preallocated_size (SECP256K1_CONTEXT_NONE ));
259
322
CHECK (my_ctx_prealloc != NULL );
@@ -262,6 +325,13 @@ static void run_proper_context_tests(int use_prealloc) {
262
325
my_ctx = secp256k1_context_create (SECP256K1_CONTEXT_NONE );
263
326
}
264
327
328
+ /* Randomize and reset randomization */
329
+ CHECK (context_eq (my_ctx , my_ctx_fresh ));
330
+ CHECK (secp256k1_context_randomize (my_ctx , seed ) == 1 );
331
+ CHECK (!context_eq (my_ctx , my_ctx_fresh ));
332
+ CHECK (secp256k1_context_randomize (my_ctx , NULL ) == 1 );
333
+ CHECK (context_eq (my_ctx , my_ctx_fresh ));
334
+
265
335
/* set error callback (to a function that still aborts in case malloc() fails in secp256k1_context_clone() below) */
266
336
secp256k1_context_set_error_callback (my_ctx , secp256k1_default_illegal_callback_fn , NULL );
267
337
CHECK (my_ctx -> error_callback .fn != secp256k1_default_error_callback_fn );
@@ -276,16 +346,33 @@ static void run_proper_context_tests(int use_prealloc) {
276
346
277
347
if (use_prealloc ) {
278
348
/* clone into a non-preallocated context and then again into a new preallocated one. */
279
- ctx_tmp = my_ctx ; my_ctx = secp256k1_context_clone (my_ctx ); secp256k1_context_preallocated_destroy (ctx_tmp );
280
- free (my_ctx_prealloc ); my_ctx_prealloc = malloc (secp256k1_context_preallocated_size (SECP256K1_CONTEXT_NONE )); CHECK (my_ctx_prealloc != NULL );
281
- ctx_tmp = my_ctx ; my_ctx = secp256k1_context_preallocated_clone (my_ctx , my_ctx_prealloc ); secp256k1_context_destroy (ctx_tmp );
349
+ ctx_tmp = my_ctx ;
350
+ my_ctx = secp256k1_context_clone (my_ctx );
351
+ CHECK (context_eq (ctx_tmp , my_ctx ));
352
+ secp256k1_context_preallocated_destroy (ctx_tmp );
353
+
354
+ free (my_ctx_prealloc );
355
+ my_ctx_prealloc = malloc (secp256k1_context_preallocated_size (SECP256K1_CONTEXT_NONE ));
356
+ CHECK (my_ctx_prealloc != NULL );
357
+ ctx_tmp = my_ctx ;
358
+ my_ctx = secp256k1_context_preallocated_clone (my_ctx , my_ctx_prealloc );
359
+ CHECK (context_eq (ctx_tmp , my_ctx ));
360
+ secp256k1_context_destroy (ctx_tmp );
282
361
} else {
283
362
/* clone into a preallocated context and then again into a new non-preallocated one. */
284
363
void * prealloc_tmp ;
285
364
286
- prealloc_tmp = malloc (secp256k1_context_preallocated_size (SECP256K1_CONTEXT_NONE )); CHECK (prealloc_tmp != NULL );
287
- ctx_tmp = my_ctx ; my_ctx = secp256k1_context_preallocated_clone (my_ctx , prealloc_tmp ); secp256k1_context_destroy (ctx_tmp );
288
- ctx_tmp = my_ctx ; my_ctx = secp256k1_context_clone (my_ctx ); secp256k1_context_preallocated_destroy (ctx_tmp );
365
+ prealloc_tmp = malloc (secp256k1_context_preallocated_size (SECP256K1_CONTEXT_NONE ));
366
+ CHECK (prealloc_tmp != NULL );
367
+ ctx_tmp = my_ctx ;
368
+ my_ctx = secp256k1_context_preallocated_clone (my_ctx , prealloc_tmp );
369
+ CHECK (context_eq (ctx_tmp , my_ctx ));
370
+ secp256k1_context_destroy (ctx_tmp );
371
+
372
+ ctx_tmp = my_ctx ;
373
+ my_ctx = secp256k1_context_clone (my_ctx );
374
+ CHECK (context_eq (ctx_tmp , my_ctx ));
375
+ secp256k1_context_preallocated_destroy (ctx_tmp );
289
376
free (prealloc_tmp );
290
377
}
291
378
}
@@ -296,12 +383,16 @@ static void run_proper_context_tests(int use_prealloc) {
296
383
/* And that it resets back to default. */
297
384
secp256k1_context_set_error_callback (my_ctx , NULL , NULL );
298
385
CHECK (my_ctx -> error_callback .fn == secp256k1_default_error_callback_fn );
386
+ CHECK (context_eq (my_ctx , my_ctx_fresh ));
299
387
300
388
/* Verify that setting and resetting illegal callback works */
301
389
secp256k1_context_set_illegal_callback (my_ctx , counting_illegal_callback_fn , & dummy );
302
390
CHECK (my_ctx -> illegal_callback .fn == counting_illegal_callback_fn );
391
+ CHECK (my_ctx -> illegal_callback .data == & dummy );
303
392
secp256k1_context_set_illegal_callback (my_ctx , NULL , NULL );
304
393
CHECK (my_ctx -> illegal_callback .fn == secp256k1_default_illegal_callback_fn );
394
+ CHECK (my_ctx -> illegal_callback .data == NULL );
395
+ CHECK (context_eq (my_ctx , my_ctx_fresh ));
305
396
306
397
/*** attempt to use them ***/
307
398
random_scalar_order_test (& msg );
@@ -327,6 +418,8 @@ static void run_proper_context_tests(int use_prealloc) {
327
418
} else {
328
419
secp256k1_context_destroy (my_ctx );
329
420
}
421
+ secp256k1_context_destroy (my_ctx_fresh );
422
+
330
423
/* Defined as no-op. */
331
424
secp256k1_context_destroy (NULL );
332
425
secp256k1_context_preallocated_destroy (NULL );
@@ -7389,9 +7482,8 @@ int main(int argc, char **argv) {
7389
7482
run_selftest_tests ();
7390
7483
7391
7484
/* context tests */
7392
- run_proper_context_tests (0 );
7393
- run_proper_context_tests (1 );
7394
- run_static_context_tests ();
7485
+ run_proper_context_tests (0 ); run_proper_context_tests (1 );
7486
+ run_static_context_tests (0 ); run_static_context_tests (1 );
7395
7487
run_deprecated_context_flags_test ();
7396
7488
7397
7489
/* scratch tests */
0 commit comments