Skip to content

Commit 4e176ad

Browse files
committed
Abstract out verify logic for fe_is_square_var
1 parent 4371f98 commit 4e176ad

File tree

4 files changed

+18
-11
lines changed

4 files changed

+18
-11
lines changed

src/field.h

+5-1
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ static const secp256k1_fe secp256k1_const_beta = SECP256K1_FE_CONST(
100100
# define secp256k1_fe_get_bounds secp256k1_fe_impl_get_bounds
101101
# define secp256k1_fe_half secp256k1_fe_impl_half
102102
# define secp256k1_fe_add_int secp256k1_fe_impl_add_int
103+
# define secp256k1_fe_is_square_var secp256k1_fe_impl_is_square_var
103104
#endif /* !defined(VERIFY) */
104105

105106
/** Normalize a field element.
@@ -321,7 +322,10 @@ static void secp256k1_fe_half(secp256k1_fe *r);
321322
* internal overflows. */
322323
static void secp256k1_fe_get_bounds(secp256k1_fe *r, int m);
323324

324-
/** Determine whether a is a square (modulo p). */
325+
/** Determine whether a is a square (modulo p).
326+
*
327+
* On input, a must be a valid field element.
328+
*/
325329
static int secp256k1_fe_is_square_var(const secp256k1_fe *a);
326330

327331
/** Check invariants on a field element (no-op unless VERIFY is enabled). */

src/field_10x26_impl.h

+1-5
Original file line numberDiff line numberDiff line change
@@ -1215,7 +1215,7 @@ static void secp256k1_fe_impl_inv_var(secp256k1_fe *r, const secp256k1_fe *x) {
12151215
secp256k1_fe_from_signed30(r, &s);
12161216
}
12171217

1218-
static int secp256k1_fe_is_square_var(const secp256k1_fe *x) {
1218+
static int secp256k1_fe_impl_is_square_var(const secp256k1_fe *x) {
12191219
secp256k1_fe tmp;
12201220
secp256k1_modinv32_signed30 s;
12211221
int jac, ret;
@@ -1233,10 +1233,6 @@ static int secp256k1_fe_is_square_var(const secp256k1_fe *x) {
12331233
secp256k1_fe dummy;
12341234
ret = secp256k1_fe_sqrt(&dummy, &tmp);
12351235
} else {
1236-
#ifdef VERIFY
1237-
secp256k1_fe dummy;
1238-
VERIFY_CHECK(jac == 2*secp256k1_fe_sqrt(&dummy, &tmp) - 1);
1239-
#endif
12401236
ret = jac >= 0;
12411237
}
12421238
return ret;

src/field_5x52_impl.h

+1-5
Original file line numberDiff line numberDiff line change
@@ -504,7 +504,7 @@ static void secp256k1_fe_impl_inv_var(secp256k1_fe *r, const secp256k1_fe *x) {
504504
secp256k1_fe_from_signed62(r, &s);
505505
}
506506

507-
static int secp256k1_fe_is_square_var(const secp256k1_fe *x) {
507+
static int secp256k1_fe_impl_is_square_var(const secp256k1_fe *x) {
508508
secp256k1_fe tmp;
509509
secp256k1_modinv64_signed62 s;
510510
int jac, ret;
@@ -522,10 +522,6 @@ static int secp256k1_fe_is_square_var(const secp256k1_fe *x) {
522522
secp256k1_fe dummy;
523523
ret = secp256k1_fe_sqrt(&dummy, &tmp);
524524
} else {
525-
#ifdef VERIFY
526-
secp256k1_fe dummy;
527-
VERIFY_CHECK(jac == 2*secp256k1_fe_sqrt(&dummy, &tmp) - 1);
528-
#endif
529525
ret = jac >= 0;
530526
}
531527
return ret;

src/field_impl.h

+11
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,17 @@ SECP256K1_INLINE static void secp256k1_fe_inv_var(secp256k1_fe *r, const secp256
384384
secp256k1_fe_verify(r);
385385
}
386386

387+
static int secp256k1_fe_impl_is_square_var(const secp256k1_fe *x);
388+
SECP256K1_INLINE static int secp256k1_fe_is_square_var(const secp256k1_fe *x) {
389+
int ret;
390+
secp256k1_fe tmp = *x, sqrt;
391+
secp256k1_fe_verify(x);
392+
ret = secp256k1_fe_impl_is_square_var(x);
393+
secp256k1_fe_normalize_weak(&tmp);
394+
VERIFY_CHECK(ret == secp256k1_fe_sqrt(&sqrt, &tmp));
395+
return ret;
396+
}
397+
387398
static void secp256k1_fe_impl_get_bounds(secp256k1_fe* r, int m);
388399
SECP256K1_INLINE static void secp256k1_fe_get_bounds(secp256k1_fe* r, int m) {
389400
VERIFY_CHECK(m >= 0);

0 commit comments

Comments
 (0)