@@ -173,34 +173,46 @@ void static secp256k1_ecmult_gen(secp256k1_gej_t *r, const secp256k1_num_t *gn)
173173void static secp256k1_ecmult (secp256k1_gej_t * r , const secp256k1_gej_t * a , const secp256k1_num_t * na , const secp256k1_num_t * ng ) {
174174 const secp256k1_ecmult_consts_t * c = secp256k1_ecmult_consts ;
175175
176+ #ifdef USE_ENDOMORPHISM
176177 secp256k1_num_t na_1 , na_lam ;
177- secp256k1_num_t ng_1 , ng_128 ;
178178 secp256k1_num_init (& na_1 );
179179 secp256k1_num_init (& na_lam );
180- secp256k1_num_init (& ng_1 );
181- secp256k1_num_init (& ng_128 );
182-
183180 // split na into na_1 and na_lam (where na = na_1 + na_lam*lambda, and na_1 and na_lam are ~128 bit)
184181 secp256k1_gej_split_exp (& na_1 , & na_lam , na );
185- // split ng into ng_1 and ng_128 (where gn = gn_1 + gn_128*2^128, and gn_1 and gn_128 are ~128 bit)
186- secp256k1_num_split (& ng_1 , & ng_128 , ng , 128 );
187182
188- // build wnaf representation for na_1, na_lam, ng_1, ng_128
183+ // build wnaf representation for na_1 and na_lam.
189184 int wnaf_na_1 [129 ]; int bits_na_1 = secp256k1_ecmult_wnaf (wnaf_na_1 , & na_1 , WINDOW_A );
190185 int wnaf_na_lam [129 ]; int bits_na_lam = secp256k1_ecmult_wnaf (wnaf_na_lam , & na_lam , WINDOW_A );
191- int wnaf_ng_1 [ 129 ]; int bits_ng_1 = secp256k1_ecmult_wnaf ( wnaf_ng_1 , & ng_1 , WINDOW_G ) ;
192- int wnaf_ng_128 [ 129 ]; int bits_ng_128 = secp256k1_ecmult_wnaf ( wnaf_ng_128 , & ng_128 , WINDOW_G ) ;
186+ int bits = bits_na_1 ;
187+ if ( bits_na_lam > bits ) bits = bits_na_lam ;
193188
194189 // calculate a_lam = a*lambda
195190 secp256k1_gej_t a_lam ; secp256k1_gej_mul_lambda (& a_lam , a );
196191
197- // calculate odd multiples of a and a_lam
198- secp256k1_gej_t pre_a_1 [ECMULT_TABLE_SIZE (WINDOW_A )], pre_a_lam [ECMULT_TABLE_SIZE (WINDOW_A )];
199- secp256k1_ecmult_table_precomp_gej (pre_a_1 , a , WINDOW_A );
192+ // calculate odd multiples of a_lam
193+ secp256k1_gej_t pre_a_lam [ECMULT_TABLE_SIZE (WINDOW_A )];
200194 secp256k1_ecmult_table_precomp_gej (pre_a_lam , & a_lam , WINDOW_A );
195+ #else
196+ // build wnaf representation for na.
197+ int wnaf_na [257 ]; int bits_na = secp256k1_ecmult_wnaf (wnaf_na , na , WINDOW_A );
198+ int bits = bits_na ;
199+ #endif
201200
202- int bits = bits_na_1 ;
203- if (bits_na_lam > bits ) bits = bits_na_lam ;
201+ // calculate odd multiples of a
202+ secp256k1_gej_t pre_a [ECMULT_TABLE_SIZE (WINDOW_A )];
203+ secp256k1_ecmult_table_precomp_gej (pre_a , a , WINDOW_A );
204+
205+ // Splitted G factors.
206+ secp256k1_num_t ng_1 , ng_128 ;
207+ secp256k1_num_init (& ng_1 );
208+ secp256k1_num_init (& ng_128 );
209+
210+ // split ng into ng_1 and ng_128 (where gn = gn_1 + gn_128*2^128, and gn_1 and gn_128 are ~128 bit)
211+ secp256k1_num_split (& ng_1 , & ng_128 , ng , 128 );
212+
213+ // Build wnaf representation for ng_1 and ng_128
214+ int wnaf_ng_1 [129 ]; int bits_ng_1 = secp256k1_ecmult_wnaf (wnaf_ng_1 , & ng_1 , WINDOW_G );
215+ int wnaf_ng_128 [129 ]; int bits_ng_128 = secp256k1_ecmult_wnaf (wnaf_ng_128 , & ng_128 , WINDOW_G );
204216 if (bits_ng_1 > bits ) bits = bits_ng_1 ;
205217 if (bits_ng_128 > bits ) bits = bits_ng_128 ;
206218
@@ -211,14 +223,21 @@ void static secp256k1_ecmult(secp256k1_gej_t *r, const secp256k1_gej_t *a, const
211223 for (int i = bits - 1 ; i >=0 ; i -- ) {
212224 secp256k1_gej_double (r , r );
213225 int n ;
226+ #ifdef USE_ENDOMORPHISM
214227 if (i < bits_na_1 && (n = wnaf_na_1 [i ])) {
215- ECMULT_TABLE_GET_GEJ (& tmpj , pre_a_1 , n , WINDOW_A );
228+ ECMULT_TABLE_GET_GEJ (& tmpj , pre_a , n , WINDOW_A );
216229 secp256k1_gej_add (r , r , & tmpj );
217230 }
218231 if (i < bits_na_lam && (n = wnaf_na_lam [i ])) {
219232 ECMULT_TABLE_GET_GEJ (& tmpj , pre_a_lam , n , WINDOW_A );
220233 secp256k1_gej_add (r , r , & tmpj );
221234 }
235+ #else
236+ if (i < bits_na && (n = wnaf_na [i ])) {
237+ ECMULT_TABLE_GET_GEJ (& tmpj , pre_a , n , WINDOW_A );
238+ secp256k1_gej_add (r , r , & tmpj );
239+ }
240+ #endif
222241 if (i < bits_ng_1 && (n = wnaf_ng_1 [i ])) {
223242 ECMULT_TABLE_GET_GE (& tmpa , c -> pre_g , n , WINDOW_G );
224243 secp256k1_gej_add_ge (r , r , & tmpa );
@@ -229,8 +248,10 @@ void static secp256k1_ecmult(secp256k1_gej_t *r, const secp256k1_gej_t *a, const
229248 }
230249 }
231250
251+ #ifdef USE_ENDOMORPHISM
232252 secp256k1_num_free (& na_1 );
233253 secp256k1_num_free (& na_lam );
254+ #endif
234255 secp256k1_num_free (& ng_1 );
235256 secp256k1_num_free (& ng_128 );
236257}
0 commit comments