@@ -3118,7 +3118,7 @@ void test_ecmult_multi_batching(void) {
31183118 data .pt = pt ;
31193119 secp256k1_gej_neg (& r2 , & r2 );
31203120
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
31223122 * ecmult_mult_simple algorithm which doesn't require a scratch space. */
31233123 scratch = secp256k1_scratch_create (& ctx -> error_callback , 0 );
31243124 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) {
52925292 CHECK (memcmp (buf1 , buf2 , sizeof (buf1 )) == 0 );
52935293}
52945294
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+
52955450int main (int argc , char * * argv ) {
52965451 unsigned char seed16 [16 ] = {0 };
52975452 unsigned char run32 [32 ] = {0 };
@@ -5431,6 +5586,8 @@ int main(int argc, char **argv) {
54315586 /* util tests */
54325587 run_memczero_test ();
54335588
5589+ run_cmov_tests ();
5590+
54345591 secp256k1_rand256 (run32 );
54355592 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 ]);
54365593
0 commit comments