@@ -126,30 +126,45 @@ static void secp256k1_ge_set_gej_var(secp256k1_ge *r, secp256k1_gej *a) {
126126 r -> y = a -> y ;
127127}
128128
129- static void secp256k1_ge_set_all_gej_var (secp256k1_ge * r , const secp256k1_gej * a , size_t len , const secp256k1_callback * cb ) {
130- secp256k1_fe * az ;
131- secp256k1_fe * azi ;
129+ static void secp256k1_ge_set_all_gej_var (secp256k1_ge * r , const secp256k1_gej * a , size_t len ) {
130+ secp256k1_fe u ;
132131 size_t i ;
133- size_t count = 0 ;
134- az = ( secp256k1_fe * ) checked_malloc ( cb , sizeof ( secp256k1_fe ) * len );
132+ size_t last_i = SIZE_MAX ;
133+
135134 for (i = 0 ; i < len ; i ++ ) {
136135 if (!a [i ].infinity ) {
137- az [count ++ ] = a [i ].z ;
136+ /* Use destination's x coordinates as scratch space */
137+ if (last_i == SIZE_MAX ) {
138+ r [i ].x = a [i ].z ;
139+ } else {
140+ secp256k1_fe_mul (& r [i ].x , & r [last_i ].x , & a [i ].z );
141+ }
142+ last_i = i ;
138143 }
139144 }
145+ if (last_i == SIZE_MAX ) {
146+ return ;
147+ }
148+ secp256k1_fe_inv_var (& u , & r [last_i ].x );
140149
141- azi = (secp256k1_fe * )checked_malloc (cb , sizeof (secp256k1_fe ) * count );
142- secp256k1_fe_inv_all_var (azi , az , count );
143- free (az );
150+ i = last_i ;
151+ while (i > 0 ) {
152+ i -- ;
153+ if (!a [i ].infinity ) {
154+ secp256k1_fe_mul (& r [last_i ].x , & r [i ].x , & u );
155+ secp256k1_fe_mul (& u , & u , & a [last_i ].z );
156+ last_i = i ;
157+ }
158+ }
159+ VERIFY_CHECK (!a [last_i ].infinity );
160+ r [last_i ].x = u ;
144161
145- count = 0 ;
146162 for (i = 0 ; i < len ; i ++ ) {
147163 r [i ].infinity = a [i ].infinity ;
148164 if (!a [i ].infinity ) {
149- secp256k1_ge_set_gej_zinv (& r [i ], & a [i ], & azi [ count ++ ] );
165+ secp256k1_ge_set_gej_zinv (& r [i ], & a [i ], & r [ i ]. x );
150166 }
151167 }
152- free (azi );
153168}
154169
155170static void secp256k1_ge_set_table_gej_var (secp256k1_ge * r , const secp256k1_gej * a , const secp256k1_fe * zr , size_t len ) {
0 commit comments