Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 9054994

Browse files
committedApr 5, 2024·
Optimization: Precompute scalar -1/2
1 parent dafb392 commit 9054994

File tree

4 files changed

+29
-4
lines changed

4 files changed

+29
-4
lines changed
 

‎src/ecmult_gen_impl.h

+3-4
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,9 @@ static void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context *ctx
3636
static void secp256k1_ecmult_gen_scalar_diff(secp256k1_scalar* diff) {
3737
int i;
3838

39-
/* Compute scalar -1/2. */
40-
secp256k1_scalar neghalf = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 2);
41-
secp256k1_scalar_inverse_var(&neghalf, &neghalf);
42-
secp256k1_scalar_negate(&neghalf, &neghalf);
39+
/* neghalf = -1/2. */
40+
secp256k1_scalar neghalf;
41+
secp256k1_scalar_set_neghalf(&neghalf);
4342

4443
/* Compute offset = 2^(COMB_BITS - 1). */
4544
secp256k1_scalar_set_int(diff, 1);

‎src/scalar.h

+3
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ static int secp256k1_scalar_set_b32_seckey(secp256k1_scalar *r, const unsigned c
4242
/** Set a scalar to an unsigned integer. */
4343
static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v);
4444

45+
/** Set a scalar to -1/2. */
46+
static void secp256k1_scalar_set_neghalf(secp256k1_scalar *r);
47+
4548
/** Convert a scalar to a byte array. */
4649
static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a);
4750

‎src/scalar_impl.h

+14
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,20 @@
2727
static const secp256k1_scalar secp256k1_scalar_one = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1);
2828
static const secp256k1_scalar secp256k1_scalar_zero = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0);
2929

30+
static void secp256k1_scalar_set_neghalf(secp256k1_scalar *r) {
31+
#if defined(EXHAUSTIVE_TEST_ORDER)
32+
secp256k1_scalar_set_int(r, 2);
33+
secp256k1_scalar_inverse_var(r, r);
34+
secp256k1_scalar_negate(r, r);
35+
#else
36+
static const secp256k1_scalar neghalf = SECP256K1_SCALAR_CONST(
37+
0x7fffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x5d576e73, 0x57a4501d, 0xdfe92f46, 0x681b20a0);
38+
*r = neghalf;
39+
#endif
40+
41+
SECP256K1_SCALAR_VERIFY(r);
42+
}
43+
3044
static int secp256k1_scalar_set_b32_seckey(secp256k1_scalar *r, const unsigned char *bin) {
3145
int overflow;
3246
secp256k1_scalar_set_b32(r, bin, &overflow);

‎src/tests.c

+9
Original file line numberDiff line numberDiff line change
@@ -2321,6 +2321,15 @@ static void run_scalar_tests(void) {
23212321
CHECK(secp256k1_scalar_eq(&one, &secp256k1_scalar_one));
23222322
}
23232323

2324+
{
2325+
/* Test secp256k1_scalar_set_neghalf. */
2326+
secp256k1_scalar s;
2327+
secp256k1_scalar_set_neghalf(&s);
2328+
secp256k1_scalar_add(&s, &s, &s);
2329+
secp256k1_scalar_negate(&s, &s);
2330+
CHECK(secp256k1_scalar_is_one(&s));
2331+
}
2332+
23242333
{
23252334
/* (-1)+1 should be zero. */
23262335
secp256k1_scalar o;

0 commit comments

Comments
 (0)
Please sign in to comment.