Skip to content

Commit b081f7e

Browse files
committed
Add secp256k1_fe_add_int function
1 parent 09b1d46 commit b081f7e

File tree

5 files changed

+43
-3
lines changed

5 files changed

+43
-3
lines changed

src/field.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe *a);
8585
* as an argument. The magnitude of the output is one higher. */
8686
static void secp256k1_fe_negate(secp256k1_fe *r, const secp256k1_fe *a, int m);
8787

88+
/** Adds a small integer (up to 0x7FFF) to r. The resulting magnitude increases by one. */
89+
static void secp256k1_fe_add_int(secp256k1_fe *r, int a);
90+
8891
/** Multiplies the passed field element with a small integer constant. Multiplies the magnitude by that
8992
* small integer. */
9093
static void secp256k1_fe_mul_int(secp256k1_fe *r, int a);

src/field_10x26_impl.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,20 @@ SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe *r, const secp256k1_f
482482
#endif
483483
}
484484

485+
SECP256K1_INLINE static void secp256k1_fe_add_int(secp256k1_fe *r, int a) {
486+
#ifdef VERIFY
487+
secp256k1_fe_verify(r);
488+
VERIFY_CHECK(a >= 0);
489+
VERIFY_CHECK(a <= 0x7FFF);
490+
#endif
491+
r->n[0] += a;
492+
#ifdef VERIFY
493+
r->magnitude += 1;
494+
r->normalized = 0;
495+
secp256k1_fe_verify(r);
496+
#endif
497+
}
498+
485499
#if defined(USE_EXTERNAL_ASM)
486500

487501
/* External assembler implementation */

src/field_5x52_impl.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,20 @@ SECP256K1_INLINE static void secp256k1_fe_mul_int(secp256k1_fe *r, int a) {
425425
#endif
426426
}
427427

428+
SECP256K1_INLINE static void secp256k1_fe_add_int(secp256k1_fe *r, int a) {
429+
#ifdef VERIFY
430+
secp256k1_fe_verify(r);
431+
VERIFY_CHECK(a >= 0);
432+
VERIFY_CHECK(a <= 0x7FFF);
433+
#endif
434+
r->n[0] += a;
435+
#ifdef VERIFY
436+
r->magnitude += 1;
437+
r->normalized = 0;
438+
secp256k1_fe_verify(r);
439+
#endif
440+
}
441+
428442
SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe *r, const secp256k1_fe *a) {
429443
#ifdef VERIFY
430444
secp256k1_fe_verify(a);

src/group_impl.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ static int secp256k1_ge_set_xo_var(secp256k1_ge *r, const secp256k1_fe *x, int o
227227
secp256k1_fe_sqr(&x2, x);
228228
secp256k1_fe_mul(&x3, x, &x2);
229229
r->infinity = 0;
230-
secp256k1_fe_add(&x3, &secp256k1_fe_const_b);
230+
secp256k1_fe_add_int(&x3, SECP256K1_B);
231231
if (!secp256k1_fe_sqrt(&r->y, &x3)) {
232232
return 0;
233233
}
@@ -282,7 +282,7 @@ static int secp256k1_ge_is_valid_var(const secp256k1_ge *a) {
282282
/* y^2 = x^3 + 7 */
283283
secp256k1_fe_sqr(&y2, &a->y);
284284
secp256k1_fe_sqr(&x3, &a->x); secp256k1_fe_mul(&x3, &x3, &a->x);
285-
secp256k1_fe_add(&x3, &secp256k1_fe_const_b);
285+
secp256k1_fe_add_int(&x3, SECP256K1_B);
286286
secp256k1_fe_normalize_weak(&x3);
287287
return secp256k1_fe_equal_var(&y2, &x3);
288288
}

src/tests.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3093,6 +3093,7 @@ static void run_field_misc(void) {
30933093
secp256k1_fe y;
30943094
secp256k1_fe z;
30953095
secp256k1_fe q;
3096+
int v;
30963097
secp256k1_fe fe5 = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 5);
30973098
int i, j;
30983099
for (i = 0; i < 1000 * COUNT; i++) {
@@ -3103,6 +3104,14 @@ static void run_field_misc(void) {
31033104
random_fe_test(&x);
31043105
}
31053106
random_fe_non_zero(&y);
3107+
v = secp256k1_testrand_bits(15);
3108+
/* Test that fe_add_int is equivalent to fe_set_int + fe_add. */
3109+
secp256k1_fe_set_int(&q, v); /* q = v */
3110+
z = x; /* z = x */
3111+
secp256k1_fe_add(&z, &q); /* z = x+v */
3112+
q = x; /* q = x */
3113+
secp256k1_fe_add_int(&q, v); /* q = x+v */
3114+
CHECK(check_fe_equal(&q, &z));
31063115
/* Test the fe equality and comparison operations. */
31073116
CHECK(secp256k1_fe_cmp_var(&x, &x) == 0);
31083117
CHECK(secp256k1_fe_equal_var(&x, &x));
@@ -3371,7 +3380,7 @@ static void test_inverse_field(secp256k1_fe* out, const secp256k1_fe* x, int var
33713380
(var ? secp256k1_fe_inv_var : secp256k1_fe_inv)(&r, &r); /* r = 1/(x-1) */
33723381
secp256k1_fe_add(&l, &fe_minus_one); /* l = 1/x-1 */
33733382
(var ? secp256k1_fe_inv_var : secp256k1_fe_inv)(&l, &l); /* l = 1/(1/x-1) */
3374-
secp256k1_fe_add(&l, &secp256k1_fe_one); /* l = 1/(1/x-1)+1 */
3383+
secp256k1_fe_add_int(&l, 1); /* l = 1/(1/x-1)+1 */
33753384
secp256k1_fe_add(&l, &r); /* l = 1/(1/x-1)+1 + 1/(x-1) */
33763385
CHECK(secp256k1_fe_normalizes_to_zero_var(&l)); /* l == 0 */
33773386
}

0 commit comments

Comments
 (0)