@@ -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,161 @@ 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_MAX ;
5308+ int a = 0 ;
5309+
5310+ secp256k1_int_cmov (& r , & a , 0 );
5311+ CHECK (r == INT_MAX );
5312+
5313+ r = 0 ; a = INT_MAX ;
5314+ secp256k1_int_cmov (& r , & a , 1 );
5315+ CHECK (r == INT_MAX );
5316+
5317+ a = 0 ;
5318+ secp256k1_int_cmov (& r , & a , 1 );
5319+ CHECK (r == 0 );
5320+
5321+ a = 1 ;
5322+ secp256k1_int_cmov (& r , & a , 1 );
5323+ CHECK (r == 1 );
5324+
5325+ r = 1 ; a = 0 ;
5326+ secp256k1_int_cmov (& r , & a , 0 );
5327+ CHECK (r == 1 );
5328+
5329+ }
5330+
5331+ void fe_cmov_test (void ) {
5332+ static const secp256k1_fe zero = SECP256K1_FE_CONST (0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 );
5333+ static const secp256k1_fe one = SECP256K1_FE_CONST (0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 );
5334+ static const secp256k1_fe max = SECP256K1_FE_CONST (
5335+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL ,
5336+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL
5337+ );
5338+ secp256k1_fe r = max ;
5339+ secp256k1_fe a = zero ;
5340+
5341+ secp256k1_fe_cmov (& r , & a , 0 );
5342+ CHECK (memcmp (& r , & max , sizeof (r )) == 0 );
5343+
5344+ r = zero ; a = max ;
5345+ secp256k1_fe_cmov (& r , & a , 1 );
5346+ CHECK (memcmp (& r , & max , sizeof (r )) == 0 );
5347+
5348+ a = zero ;
5349+ secp256k1_fe_cmov (& r , & a , 1 );
5350+ CHECK (memcmp (& r , & zero , sizeof (r )) == 0 );
5351+
5352+ a = one ;
5353+ secp256k1_fe_cmov (& r , & a , 1 );
5354+ CHECK (memcmp (& r , & one , sizeof (r )) == 0 );
5355+
5356+ r = one ; a = zero ;
5357+ secp256k1_fe_cmov (& r , & a , 0 );
5358+ CHECK (memcmp (& r , & one , sizeof (r )) == 0 );
5359+ }
5360+
5361+ void fe_storage_cmov_test (void ) {
5362+ static const secp256k1_fe_storage zero = SECP256K1_FE_STORAGE_CONST (0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 );
5363+ static const secp256k1_fe_storage one = SECP256K1_FE_STORAGE_CONST (0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 );
5364+ static const secp256k1_fe_storage max = SECP256K1_FE_STORAGE_CONST (
5365+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL ,
5366+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL
5367+ );
5368+ secp256k1_fe_storage r = max ;
5369+ secp256k1_fe_storage a = zero ;
5370+
5371+ secp256k1_fe_storage_cmov (& r , & a , 0 );
5372+ CHECK (memcmp (& r , & max , sizeof (r )) == 0 );
5373+
5374+ r = zero ; a = max ;
5375+ secp256k1_fe_storage_cmov (& r , & a , 1 );
5376+ CHECK (memcmp (& r , & max , sizeof (r )) == 0 );
5377+
5378+ a = zero ;
5379+ secp256k1_fe_storage_cmov (& r , & a , 1 );
5380+ CHECK (memcmp (& r , & zero , sizeof (r )) == 0 );
5381+
5382+ a = one ;
5383+ secp256k1_fe_storage_cmov (& r , & a , 1 );
5384+ CHECK (memcmp (& r , & one , sizeof (r )) == 0 );
5385+
5386+ r = one ; a = zero ;
5387+ secp256k1_fe_storage_cmov (& r , & a , 0 );
5388+ CHECK (memcmp (& r , & one , sizeof (r )) == 0 );
5389+ }
5390+
5391+ void scalar_cmov_test (void ) {
5392+ static const secp256k1_scalar zero = SECP256K1_SCALAR_CONST (0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 );
5393+ static const secp256k1_scalar one = SECP256K1_SCALAR_CONST (0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 );
5394+ static const secp256k1_scalar max = SECP256K1_SCALAR_CONST (
5395+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL ,
5396+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL
5397+ );
5398+ secp256k1_scalar r = max ;
5399+ secp256k1_scalar a = zero ;
5400+
5401+ secp256k1_scalar_cmov (& r , & a , 0 );
5402+ CHECK (memcmp (& r , & max , sizeof (r )) == 0 );
5403+
5404+ r = zero ; a = max ;
5405+ secp256k1_scalar_cmov (& r , & a , 1 );
5406+ CHECK (memcmp (& r , & max , sizeof (r )) == 0 );
5407+
5408+ a = zero ;
5409+ secp256k1_scalar_cmov (& r , & a , 1 );
5410+ CHECK (memcmp (& r , & zero , sizeof (r )) == 0 );
5411+
5412+ a = one ;
5413+ secp256k1_scalar_cmov (& r , & a , 1 );
5414+ CHECK (memcmp (& r , & one , sizeof (r )) == 0 );
5415+
5416+ r = one ; a = zero ;
5417+ secp256k1_scalar_cmov (& r , & a , 0 );
5418+ CHECK (memcmp (& r , & one , sizeof (r )) == 0 );
5419+ }
5420+
5421+ void ge_storage_cmov_test (void ) {
5422+ 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 );
5423+ 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 );
5424+ static const secp256k1_ge_storage max = SECP256K1_GE_STORAGE_CONST (
5425+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL ,
5426+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL ,
5427+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL ,
5428+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL
5429+ );
5430+ secp256k1_ge_storage r = max ;
5431+ secp256k1_ge_storage a = zero ;
5432+
5433+ secp256k1_ge_storage_cmov (& r , & a , 0 );
5434+ CHECK (memcmp (& r , & max , sizeof (r )) == 0 );
5435+
5436+ r = zero ; a = max ;
5437+ secp256k1_ge_storage_cmov (& r , & a , 1 );
5438+ CHECK (memcmp (& r , & max , sizeof (r )) == 0 );
5439+
5440+ a = zero ;
5441+ secp256k1_ge_storage_cmov (& r , & a , 1 );
5442+ CHECK (memcmp (& r , & zero , sizeof (r )) == 0 );
5443+
5444+ a = one ;
5445+ secp256k1_ge_storage_cmov (& r , & a , 1 );
5446+ CHECK (memcmp (& r , & one , sizeof (r )) == 0 );
5447+
5448+ r = one ; a = zero ;
5449+ secp256k1_ge_storage_cmov (& r , & a , 0 );
5450+ CHECK (memcmp (& r , & one , sizeof (r )) == 0 );
5451+ }
5452+
5453+ void run_cmov_tests (void ) {
5454+ int_cmov_test ();
5455+ fe_cmov_test ();
5456+ fe_storage_cmov_test ();
5457+ scalar_cmov_test ();
5458+ ge_storage_cmov_test ();
5459+ }
5460+
53065461int main (int argc , char * * argv ) {
53075462 unsigned char seed16 [16 ] = {0 };
53085463 unsigned char run32 [32 ] = {0 };
@@ -5442,6 +5597,8 @@ int main(int argc, char **argv) {
54425597 /* util tests */
54435598 run_memczero_test ();
54445599
5600+ run_cmov_tests ();
5601+
54455602 secp256k1_rand256 (run32 );
54465603 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 ]);
54475604
0 commit comments