Skip to content

Commit 36b305a

Browse files
committed
Verify the result of GMP modular inverse using non-GMP code
1 parent 0cbc860 commit 36b305a

File tree

2 files changed

+13
-1
lines changed

2 files changed

+13
-1
lines changed

src/field_impl.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,10 @@ static void secp256k1_fe_inv_var(secp256k1_fe_t *r, const secp256k1_fe_t *a) {
212212
secp256k1_fe_inv(r, a);
213213
#elif defined(USE_FIELD_INV_NUM)
214214
secp256k1_num_t n, m;
215+
static const secp256k1_fe_t negone = SECP256K1_FE_CONST(
216+
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
217+
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFC2E
218+
);
215219
/* secp256k1 field prime, value p defined in "Standards for Efficient Cryptography" (SEC2) 2.7.1. */
216220
static const unsigned char prime[32] = {
217221
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
@@ -228,6 +232,10 @@ static void secp256k1_fe_inv_var(secp256k1_fe_t *r, const secp256k1_fe_t *a) {
228232
secp256k1_num_mod_inverse(&n, &n, &m);
229233
secp256k1_num_get_bin(b, 32, &n);
230234
VERIFY_CHECK(secp256k1_fe_set_b32(r, b));
235+
/* Verify the result is the (unique) valid inverse using non-GMP code. */
236+
secp256k1_fe_mul(&c, &c, r);
237+
secp256k1_fe_add(&c, &negone);
238+
CHECK(secp256k1_fe_normalizes_to_zero_var(&c));
231239
#else
232240
#error "Please select field inverse implementation"
233241
#endif

src/scalar_impl.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,12 +240,16 @@ static void secp256k1_scalar_inverse_var(secp256k1_scalar_t *r, const secp256k1_
240240
#elif defined(USE_SCALAR_INV_NUM)
241241
unsigned char b[32];
242242
secp256k1_num_t n, m;
243-
secp256k1_scalar_get_b32(b, x);
243+
secp256k1_scalar_t t = *x;
244+
secp256k1_scalar_get_b32(b, &t);
244245
secp256k1_num_set_bin(&n, b, 32);
245246
secp256k1_scalar_order_get_num(&m);
246247
secp256k1_num_mod_inverse(&n, &n, &m);
247248
secp256k1_num_get_bin(b, 32, &n);
248249
secp256k1_scalar_set_b32(r, b, NULL);
250+
/* Verify that the inverse was computed correctly, without GMP code. */
251+
secp256k1_scalar_mul(&t, &t, r);
252+
CHECK(secp256k1_scalar_is_one(&t));
249253
#else
250254
#error "Please select scalar inverse implementation"
251255
#endif

0 commit comments

Comments
 (0)