|
23 | 23 | #define ECDH_TABLE_GET_GE(r,pre,n,w) do { \
|
24 | 24 | int m; \
|
25 | 25 | int abs_n = (n) * (((n) > 0) * 2 - 1); \
|
| 26 | + int idx_n = abs_n / 2; \ |
26 | 27 | secp256k1_fe_t neg_y; \
|
27 | 28 | VERIFY_CHECK(((n) & 1) == 1); \
|
28 | 29 | VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \
|
29 | 30 | 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++) { \ |
31 | 34 | /* This loop is used to avoid secret data in array indices. See
|
32 | 35 | * 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); \ |
35 | 38 | } \
|
36 | 39 | (r)->infinity = 0; \
|
37 |
| - secp256k1_fe_normalize_weak(&(r)->x); \ |
38 |
| - secp256k1_fe_normalize_weak(&(r)->y); \ |
39 | 40 | secp256k1_fe_negate(&neg_y, &(r)->y, 1); \
|
40 | 41 | secp256k1_fe_cmov(&(r)->y, &neg_y, (n) != abs_n); \
|
41 | 42 | } while(0)
|
@@ -163,6 +164,9 @@ static void secp256k1_point_multiply(secp256k1_gej_t *r, const secp256k1_ge_t *a
|
163 | 164 | */
|
164 | 165 | secp256k1_gej_set_ge(r, a);
|
165 | 166 | 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 | + } |
166 | 170 | #ifdef USE_ENDOMORPHISM
|
167 | 171 | for (i = 0; i < ECMULT_TABLE_SIZE(WINDOW_A); i++) {
|
168 | 172 | secp256k1_ge_mul_lambda(&pre_a_lam[i], &pre_a[i]);
|
|
0 commit comments