@@ -174,6 +174,8 @@ static void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context *ctx, secp25
174
174
if (EXPECT (first , 0 )) {
175
175
/* If this is the first table lookup, we can skip addition. */
176
176
secp256k1_gej_set_ge (r , & add );
177
+ /* Give the entry a random Z coordinate to blind intermediary results. */
178
+ secp256k1_gej_rescale (r , & ctx -> proj_blind );
177
179
first = 0 ;
178
180
} else {
179
181
secp256k1_gej_add_ge (r , r , & add );
@@ -202,6 +204,7 @@ static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context *ctx, const
202
204
secp256k1_scalar base_offset , negone ;
203
205
unsigned i ;
204
206
secp256k1_gej gb ;
207
+ secp256k1_fe f ;
205
208
unsigned char nonce32 [32 ];
206
209
secp256k1_rfc6979_hmac_sha256 rng ;
207
210
unsigned char keydata [64 ] = {0 };
@@ -219,6 +222,7 @@ static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context *ctx, const
219
222
secp256k1_ge_neg (& ctx -> final_point_add , & secp256k1_ge_const_g );
220
223
ctx -> scalar_offset = secp256k1_scalar_one ;
221
224
secp256k1_scalar_add (& ctx -> scalar_offset , & ctx -> scalar_offset , & base_offset );
225
+ ctx -> proj_blind = secp256k1_fe_one ;
222
226
}
223
227
/* The prior blinding value (if not reset) is chained forward by including it in the hash. */
224
228
secp256k1_scalar_get_b32 (nonce32 , & ctx -> scalar_offset );
@@ -233,7 +237,11 @@ static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context *ctx, const
233
237
secp256k1_rfc6979_hmac_sha256_initialize (& rng , keydata , seed32 ? 64 : 32 );
234
238
memset (keydata , 0 , sizeof (keydata ));
235
239
236
- /* TODO: reintroduce projective blinding. */
240
+ /* Compute projective blinding factor (cannot be 0). */
241
+ secp256k1_rfc6979_hmac_sha256_generate (& rng , nonce32 , 32 );
242
+ secp256k1_fe_set_b32 (& f , nonce32 );
243
+ secp256k1_fe_cmov (& f , & secp256k1_fe_one , secp256k1_fe_is_zero (& f ));
244
+ ctx -> proj_blind = f ;
237
245
238
246
/* For a random blinding value b, set scalar_offset=base_offset-n, final_point_add=bG */
239
247
secp256k1_rfc6979_hmac_sha256_generate (& rng , nonce32 , 32 );
0 commit comments