@@ -4463,25 +4463,74 @@ static void ecmult_const_commutativity(void) {
4463
4463
}
4464
4464
4465
4465
static void ecmult_const_mult_zero_one (void ) {
4466
+ secp256k1_scalar s ;
4466
4467
secp256k1_scalar negone ;
4467
4468
secp256k1_gej res1 ;
4468
4469
secp256k1_ge res2 ;
4469
4470
secp256k1_ge point ;
4470
- secp256k1_scalar_negate ( & negone , & secp256k1_scalar_one ) ;
4471
+ secp256k1_ge inf ;
4471
4472
4473
+ random_scalar_order_test (& s );
4474
+ secp256k1_scalar_negate (& negone , & secp256k1_scalar_one );
4472
4475
random_group_element_test (& point );
4476
+ secp256k1_ge_set_infinity (& inf );
4477
+
4478
+ /* 0*point */
4473
4479
secp256k1_ecmult_const (& res1 , & point , & secp256k1_scalar_zero );
4474
- secp256k1_ge_set_gej (& res2 , & res1 );
4475
- CHECK (secp256k1_ge_is_infinity (& res2 ));
4480
+ CHECK (secp256k1_gej_is_infinity (& res1 ));
4481
+
4482
+ /* s*inf */
4483
+ secp256k1_ecmult_const (& res1 , & inf , & s );
4484
+ CHECK (secp256k1_gej_is_infinity (& res1 ));
4485
+
4486
+ /* 1*point */
4476
4487
secp256k1_ecmult_const (& res1 , & point , & secp256k1_scalar_one );
4477
4488
secp256k1_ge_set_gej (& res2 , & res1 );
4478
4489
ge_equals_ge (& res2 , & point );
4490
+
4491
+ /* -1*point */
4479
4492
secp256k1_ecmult_const (& res1 , & point , & negone );
4480
4493
secp256k1_gej_neg (& res1 , & res1 );
4481
4494
secp256k1_ge_set_gej (& res2 , & res1 );
4482
4495
ge_equals_ge (& res2 , & point );
4483
4496
}
4484
4497
4498
+ static void ecmult_const_check_result (const secp256k1_ge * A , const secp256k1_scalar * q , const secp256k1_gej * res ) {
4499
+ secp256k1_gej pointj , res2j ;
4500
+ secp256k1_ge res2 ;
4501
+ secp256k1_gej_set_ge (& pointj , A );
4502
+ secp256k1_ecmult (& res2j , & pointj , q , & secp256k1_scalar_zero );
4503
+ secp256k1_ge_set_gej (& res2 , & res2j );
4504
+ ge_equals_gej (& res2 , res );
4505
+ }
4506
+
4507
+ static void ecmult_const_edges (void ) {
4508
+ secp256k1_scalar q ;
4509
+ secp256k1_ge point ;
4510
+ secp256k1_gej res ;
4511
+ size_t i ;
4512
+ size_t cases = 1 + sizeof (scalars_near_split_bounds ) / sizeof (scalars_near_split_bounds [0 ]);
4513
+
4514
+ /* We are trying to reach the following edge cases (variables are defined as
4515
+ * in ecmult_const_impl.h):
4516
+ * 1. i = 0: s = 0 <=> q = -K
4517
+ * 2. i > 0: v1, v2 large values
4518
+ * <=> s1, s2 large values
4519
+ * <=> s = scalars_near_split_bounds[i]
4520
+ * <=> q = 2*scalars_near_split_bounds[i] - K
4521
+ */
4522
+ for (i = 0 ; i < cases ; ++ i ) {
4523
+ secp256k1_scalar_negate (& q , & secp256k1_ecmult_const_K );
4524
+ if (i > 0 ) {
4525
+ secp256k1_scalar_add (& q , & q , & scalars_near_split_bounds [i - 1 ]);
4526
+ secp256k1_scalar_add (& q , & q , & scalars_near_split_bounds [i - 1 ]);
4527
+ }
4528
+ random_group_element_test (& point );
4529
+ secp256k1_ecmult_const (& res , & point , & q );
4530
+ ecmult_const_check_result (& point , & q , & res );
4531
+ }
4532
+ }
4533
+
4485
4534
static void ecmult_const_mult_xonly (void ) {
4486
4535
int i ;
4487
4536
@@ -4565,6 +4614,7 @@ static void ecmult_const_chain_multiply(void) {
4565
4614
4566
4615
static void run_ecmult_const_tests (void ) {
4567
4616
ecmult_const_mult_zero_one ();
4617
+ ecmult_const_edges ();
4568
4618
ecmult_const_random_mult ();
4569
4619
ecmult_const_commutativity ();
4570
4620
ecmult_const_chain_multiply ();
0 commit comments