Skip to content

Commit dc7558a

Browse files
peterdettmanapoelstra
authored andcommitted
Improve perf. of cmov-based table lookup
1 parent 7d87c78 commit dc7558a

File tree

2 files changed

+11
-5
lines changed

2 files changed

+11
-5
lines changed

src/ecdh_impl.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,20 @@
2323
#define ECDH_TABLE_GET_GE(r,pre,n,w) do { \
2424
int m; \
2525
int abs_n = (n) * (((n) > 0) * 2 - 1); \
26+
int idx_n = abs_n / 2; \
2627
secp256k1_fe_t neg_y; \
2728
VERIFY_CHECK(((n) & 1) == 1); \
2829
VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \
2930
VERIFY_CHECK((n) <= ((1 << ((w)-1)) - 1)); \
30-
for (m = 1; m < (1 << ((w) - 1)); m += 2) { \
31+
VERIFY_SETUP(secp256k1_fe_clear(&(r)->x)); \
32+
VERIFY_SETUP(secp256k1_fe_clear(&(r)->y)); \
33+
for (m = 0; m < ECMULT_TABLE_SIZE(w); m++) { \
3134
/* This loop is used to avoid secret data in array indices. See
3235
* the comment in ecmult_gen_impl.h for rationale. */ \
33-
secp256k1_fe_cmov(&(r)->x, &(pre)[(m - 1) / 2].x, m == abs_n); \
34-
secp256k1_fe_cmov(&(r)->y, &(pre)[(m - 1) / 2].y, m == abs_n); \
36+
secp256k1_fe_cmov(&(r)->x, &(pre)[m].x, m == idx_n); \
37+
secp256k1_fe_cmov(&(r)->y, &(pre)[m].y, m == idx_n); \
3538
} \
3639
(r)->infinity = 0; \
37-
secp256k1_fe_normalize_weak(&(r)->x); \
38-
secp256k1_fe_normalize_weak(&(r)->y); \
3940
secp256k1_fe_negate(&neg_y, &(r)->y, 1); \
4041
secp256k1_fe_cmov(&(r)->y, &neg_y, (n) != abs_n); \
4142
} while(0)
@@ -163,6 +164,9 @@ static void secp256k1_point_multiply(secp256k1_gej_t *r, const secp256k1_ge_t *a
163164
*/
164165
secp256k1_gej_set_ge(r, a);
165166
secp256k1_ecmult_odd_multiples_table_globalz_windowa(pre_a, &Z, r);
167+
for (i = 0; i < ECMULT_TABLE_SIZE(WINDOW_A); i++) {
168+
secp256k1_fe_normalize_weak(&pre_a[i].y);
169+
}
166170
#ifdef USE_ENDOMORPHISM
167171
for (i = 0; i < ECMULT_TABLE_SIZE(WINDOW_A); i++) {
168172
secp256k1_ge_mul_lambda(&pre_a_lam[i], &pre_a[i]);

src/util.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,10 @@
5757
/* Like DEBUG_CHECK(), but when VERIFY is defined instead of NDEBUG not defined. */
5858
#ifdef VERIFY
5959
#define VERIFY_CHECK CHECK
60+
#define VERIFY_SETUP(stmt) do { stmt; } while(0)
6061
#else
6162
#define VERIFY_CHECK(cond) do { (void)(cond); } while(0)
63+
#define VERIFY_SETUP(stmt)
6264
#endif
6365

6466
static SECP256K1_INLINE void *checked_malloc(size_t size) {

0 commit comments

Comments
 (0)