82
82
* contain prej[0].z / a.z. The other zr[i] values = prej[i].z / prej[i-1].z.
83
83
* Prej's Z values are undefined, except for the last value.
84
84
*/
85
- static void secp256k1_ecmult_odd_multiples_table (int n , secp256k1_gej * prej , secp256k1_fe * zr , const secp256k1_gej * a ) {
85
+ static void secp256k1_ecmult_odd_multiples_table (int n , secp256k1_ge * pre_a , secp256k1_fe * zr , secp256k1_gej * a ) {
86
86
secp256k1_gej d ;
87
87
secp256k1_ge a_ge , d_ge ;
88
88
int i ;
@@ -100,21 +100,19 @@ static void secp256k1_ecmult_odd_multiples_table(int n, secp256k1_gej *prej, sec
100
100
d_ge .infinity = 0 ;
101
101
102
102
secp256k1_ge_set_gej_zinv (& a_ge , a , & d .z );
103
- prej [0 ].x = a_ge .x ;
104
- prej [0 ].y = a_ge .y ;
105
- prej [0 ].z = a -> z ;
106
- prej [0 ].infinity = 0 ;
103
+ pre_a [0 ].x = a -> x = a_ge .x ;
104
+ pre_a [0 ].y = a -> y = a_ge .y ;
105
+ pre_a [0 ].infinity = 0 ;
107
106
108
107
zr [0 ] = d .z ;
109
108
for (i = 1 ; i < n ; i ++ ) {
110
- secp256k1_gej_add_ge_var (& prej [i ], & prej [i - 1 ], & d_ge , & zr [i ]);
109
+ secp256k1_gej_add_ge_var (a , a , & d_ge , & zr [i ]);
110
+ pre_a [i ].x = a -> x ;
111
+ pre_a [i ].y = a -> y ;
112
+ pre_a [i ].infinity = 0 ;
111
113
}
112
114
113
- /*
114
- * Each point in 'prej' has a z coordinate too small by a factor of 'd.z'. Only
115
- * the final point's z coordinate is actually used though, so just update that.
116
- */
117
- secp256k1_fe_mul (& prej [n - 1 ].z , & prej [n - 1 ].z , & d .z );
115
+ secp256k1_fe_mul (& a -> z , & a -> z , & d .z );
118
116
}
119
117
120
118
/** Fill a table 'pre' with precomputed odd multiples of a.
@@ -133,13 +131,14 @@ static void secp256k1_ecmult_odd_multiples_table(int n, secp256k1_gej *prej, sec
133
131
* happen once).
134
132
*/
135
133
static void secp256k1_ecmult_odd_multiples_table_globalz_windowa (secp256k1_ge * pre , secp256k1_fe * globalz , const secp256k1_gej * a ) {
136
- secp256k1_gej prej [ ECMULT_TABLE_SIZE ( WINDOW_A )] ;
134
+ secp256k1_gej tmp = * a ;
137
135
secp256k1_fe zr [ECMULT_TABLE_SIZE (WINDOW_A )];
138
136
139
137
/* Compute the odd multiples in Jacobian form. */
140
- secp256k1_ecmult_odd_multiples_table (ECMULT_TABLE_SIZE (WINDOW_A ), prej , zr , a );
138
+ secp256k1_ecmult_odd_multiples_table (ECMULT_TABLE_SIZE (WINDOW_A ), pre , zr , & tmp );
141
139
/* Bring them to the same Z denominator. */
142
- secp256k1_ge_globalz_set_table_gej (ECMULT_TABLE_SIZE (WINDOW_A ), pre , globalz , prej , zr );
140
+ * globalz = tmp .z ;
141
+ secp256k1_ge_globalz_fixup_table (ECMULT_TABLE_SIZE (WINDOW_A ), pre , zr );
143
142
}
144
143
145
144
static void secp256k1_ecmult_odd_multiples_table_storage_var (const int n , secp256k1_ge_storage * pre , const secp256k1_gej * a ) {
@@ -491,18 +490,21 @@ static void secp256k1_ecmult_strauss_wnaf(const secp256k1_ecmult_context *ctx, c
491
490
*/
492
491
if (no > 0 ) {
493
492
/* Compute the odd multiples in Jacobian form. */
494
- secp256k1_ecmult_odd_multiples_table (ECMULT_TABLE_SIZE (WINDOW_A ), state -> prej , state -> zr , & a [state -> ps [0 ].input_pos ]);
493
+ secp256k1_gej tmp = a [state -> ps [0 ].input_pos ];
494
+ secp256k1_ecmult_odd_multiples_table (ECMULT_TABLE_SIZE (WINDOW_A ), state -> pre_a , state -> zr , & tmp );
495
495
for (np = 1 ; np < no ; ++ np ) {
496
- secp256k1_gej tmp = a [state -> ps [np ].input_pos ];
496
+ secp256k1_fe lastz = tmp .z ;
497
+ tmp = a [state -> ps [np ].input_pos ];
497
498
#ifdef VERIFY
498
- secp256k1_fe_normalize_var (& ( state -> prej [( np - 1 ) * ECMULT_TABLE_SIZE ( WINDOW_A ) + ECMULT_TABLE_SIZE ( WINDOW_A ) - 1 ]. z ) );
499
+ secp256k1_fe_normalize_var (& lastz );
499
500
#endif
500
- secp256k1_gej_rescale (& tmp , & ( state -> prej [( np - 1 ) * ECMULT_TABLE_SIZE ( WINDOW_A ) + ECMULT_TABLE_SIZE ( WINDOW_A ) - 1 ]. z ) );
501
- secp256k1_ecmult_odd_multiples_table (ECMULT_TABLE_SIZE (WINDOW_A ), state -> prej + np * ECMULT_TABLE_SIZE (WINDOW_A ), state -> zr + np * ECMULT_TABLE_SIZE (WINDOW_A ), & tmp );
501
+ secp256k1_gej_rescale (& tmp , & lastz );
502
+ secp256k1_ecmult_odd_multiples_table (ECMULT_TABLE_SIZE (WINDOW_A ), state -> pre_a + np * ECMULT_TABLE_SIZE (WINDOW_A ), state -> zr + np * ECMULT_TABLE_SIZE (WINDOW_A ), & tmp );
502
503
secp256k1_fe_mul (state -> zr + np * ECMULT_TABLE_SIZE (WINDOW_A ), state -> zr + np * ECMULT_TABLE_SIZE (WINDOW_A ), & (a [state -> ps [np ].input_pos ].z ));
503
504
}
504
505
/* Bring them to the same Z denominator. */
505
- secp256k1_ge_globalz_set_table_gej (ECMULT_TABLE_SIZE (WINDOW_A ) * no , state -> pre_a , & Z , state -> prej , state -> zr );
506
+ Z = tmp .z ;
507
+ secp256k1_ge_globalz_fixup_table (ECMULT_TABLE_SIZE (WINDOW_A ) * no , state -> pre_a , state -> zr );
506
508
} else {
507
509
secp256k1_fe_set_int (& Z , 1 );
508
510
}
0 commit comments