Skip to content

Commit caa0ad6

Browse files
committed
group: add gej_eq_var
1 parent 37ba744 commit caa0ad6

File tree

4 files changed

+37
-34
lines changed

4 files changed

+37
-34
lines changed

src/bench_ecmult.c

+1-3
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,7 @@ static void bench_ecmult_teardown_helper(bench_data* data, size_t* seckey_offset
8484
}
8585
}
8686
secp256k1_ecmult_gen(&data->ctx->ecmult_gen_ctx, &tmp, &sum_scalars);
87-
secp256k1_gej_neg(&tmp, &tmp);
88-
secp256k1_gej_add_var(&tmp, &tmp, &sum_output, NULL);
89-
CHECK(secp256k1_gej_is_infinity(&tmp));
87+
CHECK(secp256k1_gej_eq_var(&tmp, &sum_output));
9088
}
9189

9290
static void bench_ecmult_setup(void* arg) {

src/group.h

+3
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@ static void secp256k1_gej_set_infinity(secp256k1_gej *r);
9797
/** Set a group element (jacobian) equal to another which is given in affine coordinates. */
9898
static void secp256k1_gej_set_ge(secp256k1_gej *r, const secp256k1_ge *a);
9999

100+
/** Check two group elements (jacobian) for equality in variable time. */
101+
static int secp256k1_gej_eq_var(const secp256k1_gej *a, const secp256k1_gej *b);
102+
100103
/** Compare the X coordinate of a group element (jacobian). */
101104
static int secp256k1_gej_eq_x_var(const secp256k1_fe *x, const secp256k1_gej *a);
102105

src/group_impl.h

+7
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,13 @@ static void secp256k1_gej_set_ge(secp256k1_gej *r, const secp256k1_ge *a) {
236236
secp256k1_fe_set_int(&r->z, 1);
237237
}
238238

239+
static int secp256k1_gej_eq_var(const secp256k1_gej *a, const secp256k1_gej *b) {
240+
secp256k1_gej tmp;
241+
secp256k1_gej_neg(&tmp, a);
242+
secp256k1_gej_add_var(&tmp, &tmp, b, NULL);
243+
return secp256k1_gej_is_infinity(&tmp);
244+
}
245+
239246
static int secp256k1_gej_eq_x_var(const secp256k1_fe *x, const secp256k1_gej *a) {
240247
secp256k1_fe r, r2;
241248
VERIFY_CHECK(!a->infinity);

src/tests.c

+26-31
Original file line numberDiff line numberDiff line change
@@ -3872,6 +3872,22 @@ void run_gej(void) {
38723872
test_gej_cmov(&a, &b);
38733873
test_gej_cmov(&b, &a);
38743874
}
3875+
3876+
/* Tests for secp256k1_gej_eq_var */
3877+
for (i = 0; i < count; i++) {
3878+
secp256k1_fe fe;
3879+
random_gej_test(&a);
3880+
random_gej_test(&b);
3881+
CHECK(!secp256k1_gej_eq_var(&a, &b));
3882+
3883+
b = a;
3884+
random_field_element_test(&fe);
3885+
if (secp256k1_fe_is_zero(&fe)) {
3886+
continue;
3887+
}
3888+
secp256k1_gej_rescale(&a, &fe);
3889+
CHECK(secp256k1_gej_eq_var(&a, &b));
3890+
}
38753891
}
38763892

38773893
void test_ec_combine(void) {
@@ -4077,17 +4093,12 @@ void run_ecmult_chain(void) {
40774093
0xB95CBCA2, 0xC77DA786, 0x539BE8FD, 0x53354D2D,
40784094
0x3B4F566A, 0xE6580454, 0x07ED6015, 0xEE1B2A88
40794095
);
4080-
4081-
secp256k1_gej_neg(&rp, &rp);
4082-
secp256k1_gej_add_var(&rp, &rp, &x, NULL);
4083-
CHECK(secp256k1_gej_is_infinity(&rp));
4096+
CHECK(secp256k1_gej_eq_var(&rp, &x));
40844097
}
40854098
}
40864099
/* redo the computation, but directly with the resulting ae and ge coefficients: */
40874100
secp256k1_ecmult(&x2, &a, &ae, &ge);
4088-
secp256k1_gej_neg(&x2, &x2);
4089-
secp256k1_gej_add_var(&x2, &x2, &x, NULL);
4090-
CHECK(secp256k1_gej_is_infinity(&x2));
4101+
CHECK(secp256k1_gej_eq_var(&x, &x2));
40914102
}
40924103

40934104
void test_point_times_order(const secp256k1_gej *point) {
@@ -4380,33 +4391,25 @@ void test_ecmult_multi(secp256k1_scratch *scratch, secp256k1_ecmult_multi_func e
43804391
/* only G scalar */
43814392
secp256k1_ecmult(&r2, &ptgj, &szero, &sc[0]);
43824393
CHECK(ecmult_multi(&ctx->error_callback, scratch, &r, &sc[0], ecmult_multi_callback, &data, 0));
4383-
secp256k1_gej_neg(&r2, &r2);
4384-
secp256k1_gej_add_var(&r, &r, &r2, NULL);
4385-
CHECK(secp256k1_gej_is_infinity(&r));
4394+
CHECK(secp256k1_gej_eq_var(&r, &r2));
43864395

43874396
/* 1-point */
43884397
secp256k1_ecmult(&r2, &ptgj, &sc[0], &szero);
43894398
CHECK(ecmult_multi(&ctx->error_callback, scratch, &r, &szero, ecmult_multi_callback, &data, 1));
4390-
secp256k1_gej_neg(&r2, &r2);
4391-
secp256k1_gej_add_var(&r, &r, &r2, NULL);
4392-
CHECK(secp256k1_gej_is_infinity(&r));
4399+
CHECK(secp256k1_gej_eq_var(&r, &r2));
43934400

43944401
/* Try to multiply 1 point, but callback returns false */
43954402
CHECK(!ecmult_multi(&ctx->error_callback, scratch, &r, &szero, ecmult_multi_false_callback, &data, 1));
43964403

43974404
/* 2-point */
43984405
secp256k1_ecmult(&r2, &ptgj, &sc[0], &sc[1]);
43994406
CHECK(ecmult_multi(&ctx->error_callback, scratch, &r, &szero, ecmult_multi_callback, &data, 2));
4400-
secp256k1_gej_neg(&r2, &r2);
4401-
secp256k1_gej_add_var(&r, &r, &r2, NULL);
4402-
CHECK(secp256k1_gej_is_infinity(&r));
4407+
CHECK(secp256k1_gej_eq_var(&r, &r2));
44034408

44044409
/* 2-point with G scalar */
44054410
secp256k1_ecmult(&r2, &ptgj, &sc[0], &sc[1]);
44064411
CHECK(ecmult_multi(&ctx->error_callback, scratch, &r, &sc[1], ecmult_multi_callback, &data, 1));
4407-
secp256k1_gej_neg(&r2, &r2);
4408-
secp256k1_gej_add_var(&r, &r, &r2, NULL);
4409-
CHECK(secp256k1_gej_is_infinity(&r));
4412+
CHECK(secp256k1_gej_eq_var(&r, &r2));
44104413
}
44114414

44124415
/* Check infinite outputs of various forms */
@@ -4491,9 +4494,7 @@ void test_ecmult_multi(secp256k1_scratch *scratch, secp256k1_ecmult_multi_func e
44914494

44924495
secp256k1_ecmult(&r2, &r, &sc[0], &szero);
44934496
CHECK(ecmult_multi(&ctx->error_callback, scratch, &r, &szero, ecmult_multi_callback, &data, 20));
4494-
secp256k1_gej_neg(&r2, &r2);
4495-
secp256k1_gej_add_var(&r, &r, &r2, NULL);
4496-
CHECK(secp256k1_gej_is_infinity(&r));
4497+
CHECK(secp256k1_gej_eq_var(&r, &r2));
44974498
}
44984499

44994500
/* Check random scalars, constant point */
@@ -4514,9 +4515,7 @@ void test_ecmult_multi(secp256k1_scratch *scratch, secp256k1_ecmult_multi_func e
45144515
secp256k1_gej_set_ge(&p0j, &pt[0]);
45154516
secp256k1_ecmult(&r2, &p0j, &rs, &szero);
45164517
CHECK(ecmult_multi(&ctx->error_callback, scratch, &r, &szero, ecmult_multi_callback, &data, 20));
4517-
secp256k1_gej_neg(&r2, &r2);
4518-
secp256k1_gej_add_var(&r, &r, &r2, NULL);
4519-
CHECK(secp256k1_gej_is_infinity(&r));
4518+
CHECK(secp256k1_gej_eq_var(&r, &r2));
45204519
}
45214520

45224521
/* Sanity check that zero scalars don't cause problems */
@@ -4578,9 +4577,7 @@ void test_ecmult_multi(secp256k1_scratch *scratch, secp256k1_ecmult_multi_func e
45784577

45794578
secp256k1_ecmult(&expected, &ptgj, &tmp1, &szero);
45804579
CHECK(ecmult_multi(&ctx->error_callback, scratch, &actual, &szero, ecmult_multi_callback, &data, 2));
4581-
secp256k1_gej_neg(&expected, &expected);
4582-
secp256k1_gej_add_var(&actual, &actual, &expected, NULL);
4583-
CHECK(secp256k1_gej_is_infinity(&actual));
4580+
CHECK(secp256k1_gej_eq_var(&actual, &expected));
45844581
}
45854582
}
45864583
}
@@ -4750,9 +4747,7 @@ int test_ecmult_multi_random(secp256k1_scratch *scratch) {
47504747
CHECK(ecmult_multi(&ctx->error_callback, scratch, &computed, g_scalar_ptr, ecmult_multi_callback, &data, filled));
47514748
mults += num_nonzero + g_nonzero;
47524749
/* Compare with expected result. */
4753-
secp256k1_gej_neg(&computed, &computed);
4754-
secp256k1_gej_add_var(&computed, &computed, &expected, NULL);
4755-
CHECK(secp256k1_gej_is_infinity(&computed));
4750+
CHECK(secp256k1_gej_eq_var(&computed, &expected));
47564751
return mults;
47574752
}
47584753

0 commit comments

Comments
 (0)