7 #ifndef _SECP256K1_ECMULT_IMPL_H_
8 #define _SECP256K1_ECMULT_IMPL_H_
19 #ifdef USE_ENDOMORPHISM
40 for (
int i=1; i<(1 << (w-2)); i++)
41 secp256k1_gej_add_var(&pre[i], &d, &pre[i-1]);
45 const int table_size = 1 << (w-2);
49 for (
int i=1; i<table_size; i++) {
50 secp256k1_gej_add_var(&prej[i], &d, &prej[i-1]);
52 secp256k1_ge_set_all_gej_var(table_size, pre, prej);
56 #define ECMULT_TABLE_SIZE(w) (1 << ((w)-2))
60 #define ECMULT_TABLE_GET(r,pre,n,w,neg) do { \
61 VERIFY_CHECK(((n) & 1) == 1); \
62 VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \
63 VERIFY_CHECK((n) <= ((1 << ((w)-1)) - 1)); \
65 *(r) = (pre)[((n)-1)/2]; \
67 (neg)((r), &(pre)[(-(n)-1)/2]); \
70 #define ECMULT_TABLE_GET_GEJ(r,pre,n,w) ECMULT_TABLE_GET((r),(pre),(n),(w),secp256k1_gej_neg)
71 #define ECMULT_TABLE_GET_GE(r,pre,n,w) ECMULT_TABLE_GET((r),(pre),(n),(w),secp256k1_ge_neg)
76 #ifdef USE_ENDOMORPHISM
83 static void secp256k1_ecmult_start(
void) {
84 if (secp256k1_ecmult_consts != NULL)
92 #ifdef USE_ENDOMORPHISM
95 for (
int i=0; i<128; i++)
96 secp256k1_gej_double_var(&g_128j, &g_128j);
99 secp256k1_ecmult_table_precomp_ge_var(ret->
pre_g, &gj,
WINDOW_G);
101 #ifdef USE_ENDOMORPHISM
102 secp256k1_ecmult_table_precomp_ge_var(ret->pre_g_128, &g_128j,
WINDOW_G);
105 secp256k1_ecmult_consts = ret;
108 static void secp256k1_ecmult_stop(
void) {
109 if (secp256k1_ecmult_consts == NULL)
113 secp256k1_ecmult_consts = NULL;
128 if (secp256k1_scalar_get_bits(&s, 255, 1)) {
129 secp256k1_scalar_negate(&s, &s);
136 if (secp256k1_scalar_get_bits(&s, bit, 1) == 0) {
140 while (set_bits < bit) {
141 wnaf[set_bits++] = 0;
144 if (bit + now > 256) {
147 int word = secp256k1_scalar_get_bits_var(&s, bit, now);
148 if (word & (1 << (w-1))) {
149 secp256k1_scalar_add_bit(&s, bit + w);
150 wnaf[set_bits++] = sign * (word - (1 << w));
152 wnaf[set_bits++] = sign * word;
162 #ifdef USE_ENDOMORPHISM
165 secp256k1_scalar_split_lambda_var(&na_1, &na_lam, na);
168 int wnaf_na_1[130];
int bits_na_1 = secp256k1_ecmult_wnaf(wnaf_na_1, &na_1,
WINDOW_A);
169 int wnaf_na_lam[130];
int bits_na_lam = secp256k1_ecmult_wnaf(wnaf_na_lam, &na_lam,
WINDOW_A);
172 int bits = bits_na_1;
173 if (bits_na_lam > bits) bits = bits_na_lam;
176 int wnaf_na[256];
int bits_na = secp256k1_ecmult_wnaf(wnaf_na, na,
WINDOW_A);
182 secp256k1_ecmult_table_precomp_gej_var(pre_a, a,
WINDOW_A);
184 #ifdef USE_ENDOMORPHISM
187 secp256k1_gej_mul_lambda(&pre_a_lam[i], &pre_a[i]);
193 secp256k1_scalar_split_128(&ng_1, &ng_128, ng);
196 int wnaf_ng_1[129];
int bits_ng_1 = secp256k1_ecmult_wnaf(wnaf_ng_1, &ng_1,
WINDOW_G);
197 int wnaf_ng_128[129];
int bits_ng_128 = secp256k1_ecmult_wnaf(wnaf_ng_128, &ng_128,
WINDOW_G);
198 if (bits_ng_1 > bits) bits = bits_ng_1;
199 if (bits_ng_128 > bits) bits = bits_ng_128;
201 int wnaf_ng[257];
int bits_ng = secp256k1_ecmult_wnaf(wnaf_ng, ng,
WINDOW_G);
202 if (bits_ng > bits) bits = bits_ng;
205 secp256k1_gej_set_infinity(
r);
209 for (
int i=bits-1; i>=0; i--) {
210 secp256k1_gej_double_var(
r,
r);
212 #ifdef USE_ENDOMORPHISM
213 if (i < bits_na_1 && (n = wnaf_na_1[i])) {
215 secp256k1_gej_add_var(
r,
r, &tmpj);
217 if (i < bits_na_lam && (n = wnaf_na_lam[i])) {
219 secp256k1_gej_add_var(
r,
r, &tmpj);
221 if (i < bits_ng_1 && (n = wnaf_ng_1[i])) {
223 secp256k1_gej_add_ge_var(
r,
r, &tmpa);
225 if (i < bits_ng_128 && (n = wnaf_ng_128[i])) {
227 secp256k1_gej_add_ge_var(
r,
r, &tmpa);
230 if (i < bits_na && (n = wnaf_na[i])) {
232 secp256k1_gej_add_var(
r,
r, &tmpj);
234 if (i < bits_ng && (n = wnaf_ng[i])) {
236 secp256k1_gej_add_ge_var(
r,
r, &tmpa);