@@ -3129,7 +3129,7 @@ void test_ecmult_multi_batching(void) {
31293129 data .pt = pt ;
31303130 secp256k1_gej_neg (& r2 , & r2 );
31313131
3132- /* Test with empty scratch space. It should compute the correct result using
3132+ /* Test with empty scratch space. It should compute the correct result using
31333133 * ecmult_mult_simple algorithm which doesn't require a scratch space. */
31343134 scratch = secp256k1_scratch_create (& ctx -> error_callback , 0 );
31353135 CHECK (secp256k1_ecmult_multi_var (& ctx -> error_callback , & ctx -> ecmult_ctx , scratch , & r , & scG , ecmult_multi_callback , & data , n_points ));
@@ -5303,6 +5303,168 @@ void run_memczero_test(void) {
53035303 CHECK (memcmp (buf1 , buf2 , sizeof (buf1 )) == 0 );
53045304}
53055305
5306+ void int_cmov_test (void ) {
5307+ int r = INT_MIN ;
5308+ int a = 0 ;
5309+
5310+ secp256k1_int_cmov (& r , & a , 0 );
5311+ CHECK (r == INT_MIN );
5312+
5313+ r = 0 ; a = INT_MIN ;
5314+ secp256k1_int_cmov (& r , & a , 1 );
5315+ CHECK (r == INT_MIN );
5316+
5317+ a = INT_MAX ;
5318+ secp256k1_int_cmov (& r , & a , 1 );
5319+ CHECK (r == INT_MAX );
5320+
5321+ a = 0 ;
5322+ secp256k1_int_cmov (& r , & a , 0 );
5323+ CHECK (r == INT_MAX );
5324+
5325+ secp256k1_int_cmov (& r , & a , 1 );
5326+ CHECK (r == 0 );
5327+
5328+ a = 1 ;
5329+ secp256k1_int_cmov (& r , & a , 1 );
5330+ CHECK (r == 1 );
5331+
5332+ r = 1 ; a = 0 ;
5333+ secp256k1_int_cmov (& r , & a , 0 );
5334+ CHECK (r == 1 );
5335+
5336+ }
5337+
5338+ void fe_cmov_test (void ) {
5339+ static const secp256k1_fe zero = SECP256K1_FE_CONST (0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 );
5340+ static const secp256k1_fe one = SECP256K1_FE_CONST (0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 );
5341+ static const secp256k1_fe max = SECP256K1_FE_CONST (
5342+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL ,
5343+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL
5344+ );
5345+ secp256k1_fe r = max ;
5346+ secp256k1_fe a = zero ;
5347+
5348+ secp256k1_fe_cmov (& r , & a , 0 );
5349+ CHECK (memcmp (& r , & max , sizeof (r )) == 0 );
5350+
5351+ r = zero ; a = max ;
5352+ secp256k1_fe_cmov (& r , & a , 1 );
5353+ CHECK (memcmp (& r , & max , sizeof (r )) == 0 );
5354+
5355+ a = zero ;
5356+ secp256k1_fe_cmov (& r , & a , 1 );
5357+ CHECK (memcmp (& r , & zero , sizeof (r )) == 0 );
5358+
5359+ a = one ;
5360+ secp256k1_fe_cmov (& r , & a , 1 );
5361+ CHECK (memcmp (& r , & one , sizeof (r )) == 0 );
5362+
5363+ r = one ; a = zero ;
5364+ secp256k1_fe_cmov (& r , & a , 0 );
5365+ CHECK (memcmp (& r , & one , sizeof (r )) == 0 );
5366+ }
5367+
5368+ void fe_storage_cmov_test (void ) {
5369+ static const secp256k1_fe_storage zero = SECP256K1_FE_STORAGE_CONST (0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 );
5370+ static const secp256k1_fe_storage one = SECP256K1_FE_STORAGE_CONST (0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 );
5371+ static const secp256k1_fe_storage max = SECP256K1_FE_STORAGE_CONST (
5372+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL ,
5373+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL
5374+ );
5375+ secp256k1_fe_storage r = max ;
5376+ secp256k1_fe_storage a = zero ;
5377+
5378+ secp256k1_fe_storage_cmov (& r , & a , 0 );
5379+ CHECK (memcmp (& r , & max , sizeof (r )) == 0 );
5380+
5381+ r = zero ; a = max ;
5382+ secp256k1_fe_storage_cmov (& r , & a , 1 );
5383+ CHECK (memcmp (& r , & max , sizeof (r )) == 0 );
5384+
5385+ a = zero ;
5386+ secp256k1_fe_storage_cmov (& r , & a , 1 );
5387+ CHECK (memcmp (& r , & zero , sizeof (r )) == 0 );
5388+
5389+ a = one ;
5390+ secp256k1_fe_storage_cmov (& r , & a , 1 );
5391+ CHECK (memcmp (& r , & one , sizeof (r )) == 0 );
5392+
5393+ r = one ; a = zero ;
5394+ secp256k1_fe_storage_cmov (& r , & a , 0 );
5395+ CHECK (memcmp (& r , & one , sizeof (r )) == 0 );
5396+ }
5397+
5398+ void scalar_cmov_test (void ) {
5399+ static const secp256k1_scalar zero = SECP256K1_SCALAR_CONST (0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 );
5400+ static const secp256k1_scalar one = SECP256K1_SCALAR_CONST (0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 );
5401+ static const secp256k1_scalar max = SECP256K1_SCALAR_CONST (
5402+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL ,
5403+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL
5404+ );
5405+ secp256k1_scalar r = max ;
5406+ secp256k1_scalar a = zero ;
5407+
5408+ secp256k1_scalar_cmov (& r , & a , 0 );
5409+ CHECK (memcmp (& r , & max , sizeof (r )) == 0 );
5410+
5411+ r = zero ; a = max ;
5412+ secp256k1_scalar_cmov (& r , & a , 1 );
5413+ CHECK (memcmp (& r , & max , sizeof (r )) == 0 );
5414+
5415+ a = zero ;
5416+ secp256k1_scalar_cmov (& r , & a , 1 );
5417+ CHECK (memcmp (& r , & zero , sizeof (r )) == 0 );
5418+
5419+ a = one ;
5420+ secp256k1_scalar_cmov (& r , & a , 1 );
5421+ CHECK (memcmp (& r , & one , sizeof (r )) == 0 );
5422+
5423+ r = one ; a = zero ;
5424+ secp256k1_scalar_cmov (& r , & a , 0 );
5425+ CHECK (memcmp (& r , & one , sizeof (r )) == 0 );
5426+ }
5427+
5428+ void ge_storage_cmov_test (void ) {
5429+ 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 );
5430+ 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 );
5431+ static const secp256k1_ge_storage max = SECP256K1_GE_STORAGE_CONST (
5432+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL ,
5433+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL ,
5434+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL ,
5435+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL
5436+ );
5437+ secp256k1_ge_storage r = max ;
5438+ secp256k1_ge_storage a = zero ;
5439+
5440+ secp256k1_ge_storage_cmov (& r , & a , 0 );
5441+ CHECK (memcmp (& r , & max , sizeof (r )) == 0 );
5442+
5443+ r = zero ; a = max ;
5444+ secp256k1_ge_storage_cmov (& r , & a , 1 );
5445+ CHECK (memcmp (& r , & max , sizeof (r )) == 0 );
5446+
5447+ a = zero ;
5448+ secp256k1_ge_storage_cmov (& r , & a , 1 );
5449+ CHECK (memcmp (& r , & zero , sizeof (r )) == 0 );
5450+
5451+ a = one ;
5452+ secp256k1_ge_storage_cmov (& r , & a , 1 );
5453+ CHECK (memcmp (& r , & one , sizeof (r )) == 0 );
5454+
5455+ r = one ; a = zero ;
5456+ secp256k1_ge_storage_cmov (& r , & a , 0 );
5457+ CHECK (memcmp (& r , & one , sizeof (r )) == 0 );
5458+ }
5459+
5460+ void run_cmov_tests (void ) {
5461+ int_cmov_test ();
5462+ fe_cmov_test ();
5463+ fe_storage_cmov_test ();
5464+ scalar_cmov_test ();
5465+ ge_storage_cmov_test ();
5466+ }
5467+
53065468int main (int argc , char * * argv ) {
53075469 unsigned char seed16 [16 ] = {0 };
53085470 unsigned char run32 [32 ] = {0 };
@@ -5442,6 +5604,8 @@ int main(int argc, char **argv) {
54425604 /* util tests */
54435605 run_memczero_test ();
54445606
5607+ run_cmov_tests ();
5608+
54455609 secp256k1_rand256 (run32 );
54465610 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 ]);
54475611
0 commit comments