Skip to content

Commit aa9f3a3

Browse files
jonasnicksipa
authored andcommitted
ecmult_const: add/improve tests
* add test case for a=infinity The corresponding ecmult_const branch was not tested before this commit. * add test for edge cases
1 parent 4d16e90 commit aa9f3a3

File tree

1 file changed

+53
-3
lines changed

1 file changed

+53
-3
lines changed

src/tests.c

+53-3
Original file line numberDiff line numberDiff line change
@@ -4463,25 +4463,74 @@ static void ecmult_const_commutativity(void) {
44634463
}
44644464

44654465
static void ecmult_const_mult_zero_one(void) {
4466+
secp256k1_scalar s;
44664467
secp256k1_scalar negone;
44674468
secp256k1_gej res1;
44684469
secp256k1_ge res2;
44694470
secp256k1_ge point;
4470-
secp256k1_scalar_negate(&negone, &secp256k1_scalar_one);
4471+
secp256k1_ge inf;
44714472

4473+
random_scalar_order_test(&s);
4474+
secp256k1_scalar_negate(&negone, &secp256k1_scalar_one);
44724475
random_group_element_test(&point);
4476+
secp256k1_ge_set_infinity(&inf);
4477+
4478+
/* 0*point */
44734479
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 */
44764487
secp256k1_ecmult_const(&res1, &point, &secp256k1_scalar_one);
44774488
secp256k1_ge_set_gej(&res2, &res1);
44784489
ge_equals_ge(&res2, &point);
4490+
4491+
/* -1*point */
44794492
secp256k1_ecmult_const(&res1, &point, &negone);
44804493
secp256k1_gej_neg(&res1, &res1);
44814494
secp256k1_ge_set_gej(&res2, &res1);
44824495
ge_equals_ge(&res2, &point);
44834496
}
44844497

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+
44854534
static void ecmult_const_mult_xonly(void) {
44864535
int i;
44874536

@@ -4565,6 +4614,7 @@ static void ecmult_const_chain_multiply(void) {
45654614

45664615
static void run_ecmult_const_tests(void) {
45674616
ecmult_const_mult_zero_one();
4617+
ecmult_const_edges();
45684618
ecmult_const_random_mult();
45694619
ecmult_const_commutativity();
45704620
ecmult_const_chain_multiply();

0 commit comments

Comments
 (0)