3030/** Fill a table 'prej' with precomputed odd multiples of a. Prej will contain
3131 * the values [1*a,3*a,...,(2*n-1)*a], so it space for n values. zr[0] will
3232 * contain prej[0].z / a.z. The other zr[i] values = prej[i].z / prej[i-1].z.
33+ * Prej's Z values are undefined, except for the last value.
3334 */
3435static void secp256k1_ecmult_odd_multiples_table (int n , secp256k1_gej_t * prej , secp256k1_fe_t * zr , const secp256k1_gej_t * a ) {
3536 secp256k1_gej_t d ;
37+ secp256k1_ge_t a_ge , d_ge ;
3638 int i ;
3739
3840 VERIFY_CHECK (!a -> infinity );
3941
40- prej [0 ] = * a ;
41- secp256k1_gej_double_var (& d , & prej [0 ], NULL );
42- secp256k1_fe_set_int (zr , 1 );
42+ secp256k1_gej_double_var (& d , a , NULL );
43+
44+ /*
45+ * Perform the additions on an isomorphism where 'd' is affine: drop the z coordinate
46+ * of 'd', and scale the 1P starting value's x/y coordinates without changing its z.
47+ */
48+ d_ge .x = d .x ;
49+ d_ge .y = d .y ;
50+ d_ge .infinity = 0 ;
51+
52+ secp256k1_ge_set_gej_zinv (& a_ge , a , & d .z );
53+ prej [0 ].x = a_ge .x ;
54+ prej [0 ].y = a_ge .y ;
55+ prej [0 ].z = a -> z ;
56+ prej [0 ].infinity = 0 ;
57+
58+ zr [0 ] = d .z ;
4359 for (i = 1 ; i < n ; i ++ ) {
44- secp256k1_gej_add_var (& prej [i ], & prej [i - 1 ], & d , & zr [i ]);
60+ secp256k1_gej_add_ge_var (& prej [i ], & prej [i - 1 ], & d_ge , & zr [i ]);
4561 }
62+
63+ /*
64+ * Each point in 'prej' has a z coordinate too small by a factor of 'd.z'. Only
65+ * the final point's z coordinate is actually used though, so just update that.
66+ */
67+ secp256k1_fe_mul (& prej [n - 1 ].z , & prej [n - 1 ].z , & d .z );
4668}
4769
4870/** Fill a table 'pre' with precomputed odd multiples of a.
@@ -319,11 +341,11 @@ static void secp256k1_ecmult(const secp256k1_ecmult_context_t *ctx, secp256k1_ge
319341#ifdef USE_ENDOMORPHISM
320342 if (i < bits_na_1 && (n = wnaf_na_1 [i ])) {
321343 ECMULT_TABLE_GET_GE (& tmpa , pre_a , n , WINDOW_A );
322- secp256k1_gej_add_ge_var (r , r , & tmpa );
344+ secp256k1_gej_add_ge_var (r , r , & tmpa , NULL );
323345 }
324346 if (i < bits_na_lam && (n = wnaf_na_lam [i ])) {
325347 ECMULT_TABLE_GET_GE (& tmpa , pre_a_lam , n , WINDOW_A );
326- secp256k1_gej_add_ge_var (r , r , & tmpa );
348+ secp256k1_gej_add_ge_var (r , r , & tmpa , NULL );
327349 }
328350 if (i < bits_ng_1 && (n = wnaf_ng_1 [i ])) {
329351 ECMULT_TABLE_GET_GE_STORAGE (& tmpa , * ctx -> pre_g , n , WINDOW_G );
@@ -336,7 +358,7 @@ static void secp256k1_ecmult(const secp256k1_ecmult_context_t *ctx, secp256k1_ge
336358#else
337359 if (i < bits_na && (n = wnaf_na [i ])) {
338360 ECMULT_TABLE_GET_GE (& tmpa , pre_a , n , WINDOW_A );
339- secp256k1_gej_add_ge_var (r , r , & tmpa );
361+ secp256k1_gej_add_ge_var (r , r , & tmpa , NULL );
340362 }
341363 if (i < bits_ng && (n = wnaf_ng [i ])) {
342364 ECMULT_TABLE_GET_GE_STORAGE (& tmpa , * ctx -> pre_g , n , WINDOW_G );
0 commit comments