@@ -3118,7 +3118,7 @@ void test_ecmult_multi_batching(void) {
3118
3118
data .pt = pt ;
3119
3119
secp256k1_gej_neg (& r2 , & r2 );
3120
3120
3121
- /* Test with empty scratch space. It should compute the correct result using
3121
+ /* Test with empty scratch space. It should compute the correct result using
3122
3122
* ecmult_mult_simple algorithm which doesn't require a scratch space. */
3123
3123
scratch = secp256k1_scratch_create (& ctx -> error_callback , 0 );
3124
3124
CHECK (secp256k1_ecmult_multi_var (& ctx -> error_callback , & ctx -> ecmult_ctx , scratch , & r , & scG , ecmult_multi_callback , & data , n_points ));
@@ -5292,6 +5292,161 @@ void run_memczero_test(void) {
5292
5292
CHECK (memcmp (buf1 , buf2 , sizeof (buf1 )) == 0 );
5293
5293
}
5294
5294
5295
+ void int_cmov_test (void ) {
5296
+ int r = INT_MAX ;
5297
+ int a = 0 ;
5298
+
5299
+ secp256k1_int_cmov (& r , & a , 0 );
5300
+ CHECK (r == INT_MAX );
5301
+
5302
+ r = 0 ; a = INT_MAX ;
5303
+ secp256k1_int_cmov (& r , & a , 1 );
5304
+ CHECK (r == INT_MAX );
5305
+
5306
+ a = 0 ;
5307
+ secp256k1_int_cmov (& r , & a , 1 );
5308
+ CHECK (r == 0 );
5309
+
5310
+ a = 1 ;
5311
+ secp256k1_int_cmov (& r , & a , 1 );
5312
+ CHECK (r == 1 );
5313
+
5314
+ r = 1 ; a = 0 ;
5315
+ secp256k1_int_cmov (& r , & a , 0 );
5316
+ CHECK (r == 1 );
5317
+
5318
+ }
5319
+
5320
+ void fe_cmov_test (void ) {
5321
+ static const secp256k1_fe zero = SECP256K1_FE_CONST (0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 );
5322
+ static const secp256k1_fe one = SECP256K1_FE_CONST (0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 );
5323
+ static const secp256k1_fe max = SECP256K1_FE_CONST (
5324
+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL ,
5325
+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL
5326
+ );
5327
+ secp256k1_fe r = max ;
5328
+ secp256k1_fe a = zero ;
5329
+
5330
+ secp256k1_fe_cmov (& r , & a , 0 );
5331
+ CHECK (memcmp (& r , & max , sizeof (r )) == 0 );
5332
+
5333
+ r = zero ; a = max ;
5334
+ secp256k1_fe_cmov (& r , & a , 1 );
5335
+ CHECK (memcmp (& r , & max , sizeof (r )) == 0 );
5336
+
5337
+ a = zero ;
5338
+ secp256k1_fe_cmov (& r , & a , 1 );
5339
+ CHECK (memcmp (& r , & zero , sizeof (r )) == 0 );
5340
+
5341
+ a = one ;
5342
+ secp256k1_fe_cmov (& r , & a , 1 );
5343
+ CHECK (memcmp (& r , & one , sizeof (r )) == 0 );
5344
+
5345
+ r = one ; a = zero ;
5346
+ secp256k1_fe_cmov (& r , & a , 0 );
5347
+ CHECK (memcmp (& r , & one , sizeof (r )) == 0 );
5348
+ }
5349
+
5350
+ void fe_storage_cmov_test (void ) {
5351
+ static const secp256k1_fe_storage zero = SECP256K1_FE_STORAGE_CONST (0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 );
5352
+ static const secp256k1_fe_storage one = SECP256K1_FE_STORAGE_CONST (0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 );
5353
+ static const secp256k1_fe_storage max = SECP256K1_FE_STORAGE_CONST (
5354
+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL ,
5355
+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL
5356
+ );
5357
+ secp256k1_fe_storage r = max ;
5358
+ secp256k1_fe_storage a = zero ;
5359
+
5360
+ secp256k1_fe_storage_cmov (& r , & a , 0 );
5361
+ CHECK (memcmp (& r , & max , sizeof (r )) == 0 );
5362
+
5363
+ r = zero ; a = max ;
5364
+ secp256k1_fe_storage_cmov (& r , & a , 1 );
5365
+ CHECK (memcmp (& r , & max , sizeof (r )) == 0 );
5366
+
5367
+ a = zero ;
5368
+ secp256k1_fe_storage_cmov (& r , & a , 1 );
5369
+ CHECK (memcmp (& r , & zero , sizeof (r )) == 0 );
5370
+
5371
+ a = one ;
5372
+ secp256k1_fe_storage_cmov (& r , & a , 1 );
5373
+ CHECK (memcmp (& r , & one , sizeof (r )) == 0 );
5374
+
5375
+ r = one ; a = zero ;
5376
+ secp256k1_fe_storage_cmov (& r , & a , 0 );
5377
+ CHECK (memcmp (& r , & one , sizeof (r )) == 0 );
5378
+ }
5379
+
5380
+ void scalar_cmov_test (void ) {
5381
+ static const secp256k1_scalar zero = SECP256K1_SCALAR_CONST (0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 );
5382
+ static const secp256k1_scalar one = SECP256K1_SCALAR_CONST (0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 );
5383
+ static const secp256k1_scalar max = SECP256K1_SCALAR_CONST (
5384
+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL ,
5385
+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL
5386
+ );
5387
+ secp256k1_scalar r = max ;
5388
+ secp256k1_scalar a = zero ;
5389
+
5390
+ secp256k1_scalar_cmov (& r , & a , 0 );
5391
+ CHECK (memcmp (& r , & max , sizeof (r )) == 0 );
5392
+
5393
+ r = zero ; a = max ;
5394
+ secp256k1_scalar_cmov (& r , & a , 1 );
5395
+ CHECK (memcmp (& r , & max , sizeof (r )) == 0 );
5396
+
5397
+ a = zero ;
5398
+ secp256k1_scalar_cmov (& r , & a , 1 );
5399
+ CHECK (memcmp (& r , & zero , sizeof (r )) == 0 );
5400
+
5401
+ a = one ;
5402
+ secp256k1_scalar_cmov (& r , & a , 1 );
5403
+ CHECK (memcmp (& r , & one , sizeof (r )) == 0 );
5404
+
5405
+ r = one ; a = zero ;
5406
+ secp256k1_scalar_cmov (& r , & a , 0 );
5407
+ CHECK (memcmp (& r , & one , sizeof (r )) == 0 );
5408
+ }
5409
+
5410
+ void ge_storage_cmov_test (void ) {
5411
+ 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 );
5412
+ 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 );
5413
+ static const secp256k1_ge_storage max = SECP256K1_GE_STORAGE_CONST (
5414
+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL ,
5415
+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL ,
5416
+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL ,
5417
+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL
5418
+ );
5419
+ secp256k1_ge_storage r = max ;
5420
+ secp256k1_ge_storage a = zero ;
5421
+
5422
+ secp256k1_ge_storage_cmov (& r , & a , 0 );
5423
+ CHECK (memcmp (& r , & max , sizeof (r )) == 0 );
5424
+
5425
+ r = zero ; a = max ;
5426
+ secp256k1_ge_storage_cmov (& r , & a , 1 );
5427
+ CHECK (memcmp (& r , & max , sizeof (r )) == 0 );
5428
+
5429
+ a = zero ;
5430
+ secp256k1_ge_storage_cmov (& r , & a , 1 );
5431
+ CHECK (memcmp (& r , & zero , sizeof (r )) == 0 );
5432
+
5433
+ a = one ;
5434
+ secp256k1_ge_storage_cmov (& r , & a , 1 );
5435
+ CHECK (memcmp (& r , & one , sizeof (r )) == 0 );
5436
+
5437
+ r = one ; a = zero ;
5438
+ secp256k1_ge_storage_cmov (& r , & a , 0 );
5439
+ CHECK (memcmp (& r , & one , sizeof (r )) == 0 );
5440
+ }
5441
+
5442
+ void run_cmov_tests (void ) {
5443
+ int_cmov_test ();
5444
+ fe_cmov_test ();
5445
+ fe_storage_cmov_test ();
5446
+ scalar_cmov_test ();
5447
+ ge_storage_cmov_test ();
5448
+ }
5449
+
5295
5450
int main (int argc , char * * argv ) {
5296
5451
unsigned char seed16 [16 ] = {0 };
5297
5452
unsigned char run32 [32 ] = {0 };
@@ -5431,6 +5586,8 @@ int main(int argc, char **argv) {
5431
5586
/* util tests */
5432
5587
run_memczero_test ();
5433
5588
5589
+ run_cmov_tests ();
5590
+
5434
5591
secp256k1_rand256 (run32 );
5435
5592
printf ("random run = %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n" , run32 [0 ], run32 [1 ], run32 [2 ], run32 [3 ], run32 [4 ], run32 [5 ], run32 [6 ], run32 [7 ], run32 [8 ], run32 [9 ], run32 [10 ], run32 [11 ], run32 [12 ], run32 [13 ], run32 [14 ], run32 [15 ]);
5436
5593
0 commit comments