Skip to content

Commit 926836a

Browse files
committed
Make secp256k1_fe_sqrt constant time
1 parent e2a8e92 commit 926836a

File tree

6 files changed

+24
-14
lines changed

6 files changed

+24
-14
lines changed

src/bench_internal.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -181,12 +181,12 @@ void bench_field_inverse_var(void* arg) {
181181
}
182182
}
183183

184-
void bench_field_sqrt_var(void* arg) {
184+
void bench_field_sqrt(void* arg) {
185185
int i;
186186
bench_inv_t *data = (bench_inv_t*)arg;
187187

188188
for (i = 0; i < 20000; i++) {
189-
secp256k1_fe_sqrt_var(&data->fe_x, &data->fe_x);
189+
secp256k1_fe_sqrt(&data->fe_x, &data->fe_x);
190190
secp256k1_fe_add(&data->fe_x, &data->fe_y);
191191
}
192192
}
@@ -357,7 +357,7 @@ int main(int argc, char **argv) {
357357
if (have_flag(argc, argv, "field") || have_flag(argc, argv, "mul")) run_benchmark("field_mul", bench_field_mul, bench_setup, NULL, &data, 10, 200000);
358358
if (have_flag(argc, argv, "field") || have_flag(argc, argv, "inverse")) run_benchmark("field_inverse", bench_field_inverse, bench_setup, NULL, &data, 10, 20000);
359359
if (have_flag(argc, argv, "field") || have_flag(argc, argv, "inverse")) run_benchmark("field_inverse_var", bench_field_inverse_var, bench_setup, NULL, &data, 10, 20000);
360-
if (have_flag(argc, argv, "field") || have_flag(argc, argv, "sqrt")) run_benchmark("field_sqrt_var", bench_field_sqrt_var, bench_setup, NULL, &data, 10, 20000);
360+
if (have_flag(argc, argv, "field") || have_flag(argc, argv, "sqrt")) run_benchmark("field_sqrt", bench_field_sqrt, bench_setup, NULL, &data, 10, 20000);
361361

362362
if (have_flag(argc, argv, "group") || have_flag(argc, argv, "double")) run_benchmark("group_double_var", bench_group_double_var, bench_setup, NULL, &data, 10, 200000);
363363
if (have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_var", bench_group_add_var, bench_setup, NULL, &data, 10, 200000);

src/field.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ static int secp256k1_fe_is_zero(const secp256k1_fe *a);
5757
static int secp256k1_fe_is_odd(const secp256k1_fe *a);
5858

5959
/** Compare two field elements. Requires magnitude-1 inputs. */
60+
static int secp256k1_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b);
61+
62+
/** Same as secp256k1_fe_equal, but may be variable time. */
6063
static int secp256k1_fe_equal_var(const secp256k1_fe *a, const secp256k1_fe *b);
6164

6265
/** Compare two field elements. Requires both inputs to be normalized */
@@ -92,7 +95,7 @@ static void secp256k1_fe_sqr(secp256k1_fe *r, const secp256k1_fe *a);
9295
* The input's magnitude can be at most 8. The output magnitude is 1 (but not
9396
* guaranteed to be normalized). The result in r will always be a square
9497
* itself. */
95-
static int secp256k1_fe_sqrt_var(secp256k1_fe *r, const secp256k1_fe *a);
98+
static int secp256k1_fe_sqrt(secp256k1_fe *r, const secp256k1_fe *a);
9699

97100
/** Checks whether a field element is a quadratic residue. */
98101
static int secp256k1_fe_is_quad_var(const secp256k1_fe *a);

src/field_impl.h

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,21 @@
2121
#error "Please select field implementation"
2222
#endif
2323

24+
SECP256K1_INLINE static int secp256k1_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b) {
25+
secp256k1_fe na;
26+
secp256k1_fe_negate(&na, a, 1);
27+
secp256k1_fe_add(&na, b);
28+
return secp256k1_fe_normalizes_to_zero(&na);
29+
}
30+
2431
SECP256K1_INLINE static int secp256k1_fe_equal_var(const secp256k1_fe *a, const secp256k1_fe *b) {
2532
secp256k1_fe na;
2633
secp256k1_fe_negate(&na, a, 1);
2734
secp256k1_fe_add(&na, b);
2835
return secp256k1_fe_normalizes_to_zero_var(&na);
2936
}
3037

31-
static int secp256k1_fe_sqrt_var(secp256k1_fe *r, const secp256k1_fe *a) {
38+
static int secp256k1_fe_sqrt(secp256k1_fe *r, const secp256k1_fe *a) {
3239
/** Given that p is congruent to 3 mod 4, we can compute the square root of
3340
* a mod p as the (p+1)/4'th power of a.
3441
*
@@ -123,7 +130,7 @@ static int secp256k1_fe_sqrt_var(secp256k1_fe *r, const secp256k1_fe *a) {
123130
/* Check that a square root was actually calculated */
124131

125132
secp256k1_fe_sqr(&t1, r);
126-
return secp256k1_fe_equal_var(&t1, a);
133+
return secp256k1_fe_equal(&t1, a);
127134
}
128135

129136
static void secp256k1_fe_inv(secp256k1_fe *r, const secp256k1_fe *a) {
@@ -301,7 +308,7 @@ static int secp256k1_fe_is_quad_var(const secp256k1_fe *a) {
301308
return secp256k1_num_jacobi(&n, &m) >= 0;
302309
#else
303310
secp256k1_fe r;
304-
return secp256k1_fe_sqrt_var(&r, a) == 1;
311+
return secp256k1_fe_sqrt(&r, a);
305312
#endif
306313
}
307314

src/group.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ static void secp256k1_ge_set_xy(secp256k1_ge *r, const secp256k1_fe *x, const se
4747
* and a Y coordinate that is a quadratic residue modulo p. The return value
4848
* is true iff a coordinate with the given X coordinate exists.
4949
*/
50-
static int secp256k1_ge_set_xquad_var(secp256k1_ge *r, const secp256k1_fe *x);
50+
static int secp256k1_ge_set_xquad(secp256k1_ge *r, const secp256k1_fe *x);
5151

5252
/** Set a group element (affine) equal to the point with the given X coordinate, and given oddness
5353
* for Y. Return value indicates whether the result is valid. */

src/group_impl.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -163,19 +163,19 @@ static void secp256k1_ge_clear(secp256k1_ge *r) {
163163
secp256k1_fe_clear(&r->y);
164164
}
165165

166-
static int secp256k1_ge_set_xquad_var(secp256k1_ge *r, const secp256k1_fe *x) {
166+
static int secp256k1_ge_set_xquad(secp256k1_ge *r, const secp256k1_fe *x) {
167167
secp256k1_fe x2, x3, c;
168168
r->x = *x;
169169
secp256k1_fe_sqr(&x2, x);
170170
secp256k1_fe_mul(&x3, x, &x2);
171171
r->infinity = 0;
172172
secp256k1_fe_set_int(&c, 7);
173173
secp256k1_fe_add(&c, &x3);
174-
return secp256k1_fe_sqrt_var(&r->y, &c);
174+
return secp256k1_fe_sqrt(&r->y, &c);
175175
}
176176

177177
static int secp256k1_ge_set_xo_var(secp256k1_ge *r, const secp256k1_fe *x, int odd) {
178-
if (!secp256k1_ge_set_xquad_var(r, x)) {
178+
if (!secp256k1_ge_set_xquad(r, x)) {
179179
return 0;
180180
}
181181
secp256k1_fe_normalize_var(&r->y);

src/tests.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1574,7 +1574,7 @@ void random_fe_non_zero(secp256k1_fe *nz) {
15741574
void random_fe_non_square(secp256k1_fe *ns) {
15751575
secp256k1_fe r;
15761576
random_fe_non_zero(ns);
1577-
if (secp256k1_fe_sqrt_var(&r, ns)) {
1577+
if (secp256k1_fe_sqrt(&r, ns)) {
15781578
secp256k1_fe_negate(ns, ns, 1);
15791579
}
15801580
}
@@ -1769,7 +1769,7 @@ void run_sqr(void) {
17691769

17701770
void test_sqrt(const secp256k1_fe *a, const secp256k1_fe *k) {
17711771
secp256k1_fe r1, r2;
1772-
int v = secp256k1_fe_sqrt_var(&r1, a);
1772+
int v = secp256k1_fe_sqrt(&r1, a);
17731773
CHECK((v == 0) == (k == NULL));
17741774

17751775
if (k != NULL) {
@@ -2188,7 +2188,7 @@ void test_group_decompress(const secp256k1_fe* x) {
21882188

21892189
secp256k1_fe_normalize_var(&fex);
21902190

2191-
res_quad = secp256k1_ge_set_xquad_var(&ge_quad, &fex);
2191+
res_quad = secp256k1_ge_set_xquad(&ge_quad, &fex);
21922192
res_even = secp256k1_ge_set_xo_var(&ge_even, &fex, 0);
21932193
res_odd = secp256k1_ge_set_xo_var(&ge_odd, &fex, 1);
21942194

0 commit comments

Comments
 (0)