@@ -261,41 +261,56 @@ SECP256K1_INLINE static void secp256k1_rangeproof_serialize_point(unsigned char*
261
261
secp256k1_fe_get_b32 (data + 1 , & pointx );
262
262
}
263
263
264
- SECP256K1_INLINE static int secp256k1_rangeproof_genrand (secp256k1_scalar * sec , secp256k1_scalar * s , unsigned char * message ,
265
- size_t * rsizes , size_t rings , const unsigned char * nonce , const secp256k1_ge * commit , const unsigned char * proof , size_t len , const secp256k1_ge * genp ) {
266
- unsigned char tmp [32 ];
264
+ SECP256K1_INLINE static void secp256k1_rangeproof_init_rng (
265
+ secp256k1_rfc6979_hmac_sha256 * rng ,
266
+ const unsigned char * nonce ,
267
+ const secp256k1_ge * commit ,
268
+ const unsigned char * proof ,
269
+ const size_t len ,
270
+ const secp256k1_ge * genp
271
+ ) {
267
272
unsigned char rngseed [32 + 33 + 33 + 10 ];
268
- secp256k1_rfc6979_hmac_sha256 rng ;
273
+ VERIFY_CHECK (len <= 10 );
274
+
275
+ memcpy (rngseed , nonce , 32 );
276
+ secp256k1_rangeproof_serialize_point (rngseed + 32 , commit );
277
+ secp256k1_rangeproof_serialize_point (rngseed + 32 + 33 , genp );
278
+ memcpy (rngseed + 33 + 33 + 32 , proof , len );
279
+ secp256k1_rfc6979_hmac_sha256_initialize (rng , rngseed , 32 + 33 + 33 + len );
280
+ }
281
+
282
+ SECP256K1_INLINE static int secp256k1_rangeproof_genrand (
283
+ secp256k1_scalar * sec ,
284
+ secp256k1_scalar * s ,
285
+ unsigned char * message ,
286
+ const secp256k1_rangeproof_header * header ,
287
+ secp256k1_rfc6979_hmac_sha256 * rng
288
+ ) {
289
+ unsigned char tmp [32 ];
269
290
secp256k1_scalar acc ;
270
291
int overflow ;
271
292
int ret ;
272
293
size_t i ;
273
294
size_t j ;
274
295
int b ;
275
296
size_t npub ;
276
- VERIFY_CHECK (len <= 10 );
277
- memcpy (rngseed , nonce , 32 );
278
- secp256k1_rangeproof_serialize_point (rngseed + 32 , commit );
279
- secp256k1_rangeproof_serialize_point (rngseed + 32 + 33 , genp );
280
- memcpy (rngseed + 33 + 33 + 32 , proof , len );
281
- secp256k1_rfc6979_hmac_sha256_initialize (& rng , rngseed , 32 + 33 + 33 + len );
282
297
secp256k1_scalar_clear (& acc );
283
298
npub = 0 ;
284
299
ret = 1 ;
285
- for (i = 0 ; i < rings ; i ++ ) {
286
- if (i < rings - 1 ) {
287
- secp256k1_rfc6979_hmac_sha256_generate (& rng , tmp , 32 );
300
+ for (i = 0 ; i < header -> n_rings ; i ++ ) {
301
+ if (i < header -> n_rings - 1 ) {
302
+ secp256k1_rfc6979_hmac_sha256_generate (rng , tmp , 32 );
288
303
do {
289
- secp256k1_rfc6979_hmac_sha256_generate (& rng , tmp , 32 );
304
+ secp256k1_rfc6979_hmac_sha256_generate (rng , tmp , 32 );
290
305
secp256k1_scalar_set_b32 (& sec [i ], tmp , & overflow );
291
306
} while (overflow || secp256k1_scalar_is_zero (& sec [i ]));
292
307
secp256k1_scalar_add (& acc , & acc , & sec [i ]);
293
308
} else {
294
309
secp256k1_scalar_negate (& acc , & acc );
295
310
sec [i ] = acc ;
296
311
}
297
- for (j = 0 ; j < rsizes [i ]; j ++ ) {
298
- secp256k1_rfc6979_hmac_sha256_generate (& rng , tmp , 32 );
312
+ for (j = 0 ; j < header -> rsizes [i ]; j ++ ) {
313
+ secp256k1_rfc6979_hmac_sha256_generate (rng , tmp , 32 );
299
314
if (message ) {
300
315
for (b = 0 ; b < 32 ; b ++ ) {
301
316
tmp [b ] ^= message [(i * 4 + j ) * 32 + b ];
@@ -307,7 +322,7 @@ SECP256K1_INLINE static int secp256k1_rangeproof_genrand(secp256k1_scalar *sec,
307
322
npub ++ ;
308
323
}
309
324
}
310
- secp256k1_rfc6979_hmac_sha256_finalize (& rng );
325
+ secp256k1_rfc6979_hmac_sha256_finalize (rng );
311
326
secp256k1_scalar_clear (& acc );
312
327
memset (tmp , 0 , 32 );
313
328
return ret ;
@@ -328,6 +343,7 @@ SECP256K1_INLINE static int secp256k1_rangeproof_sign_impl(const secp256k1_ecmul
328
343
unsigned char tmp [33 ];
329
344
unsigned char * signs ; /* Location of sign flags in the proof. */
330
345
uint64_t v ;
346
+ secp256k1_rfc6979_hmac_sha256 genrand_rng ;
331
347
secp256k1_borromean_sz_closure secidx_closure ;
332
348
size_t len ; /* Number of bytes used so far. */
333
349
size_t i ;
@@ -389,7 +405,8 @@ SECP256K1_INLINE static int secp256k1_rangeproof_sign_impl(const secp256k1_ecmul
389
405
}
390
406
prep [idx ] = 128 ;
391
407
}
392
- if (!secp256k1_rangeproof_genrand (sec , s , prep , header .rsizes , header .n_rings , nonce , commit , proof , len , genp )) {
408
+ secp256k1_rangeproof_init_rng (& genrand_rng , nonce , commit , proof , len , genp );
409
+ if (!secp256k1_rangeproof_genrand (sec , s , prep , & header , & genrand_rng )) {
393
410
return 0 ;
394
411
}
395
412
memset (prep , 0 , 4096 );
@@ -481,6 +498,7 @@ SECP256K1_INLINE static void secp256k1_rangeproof_ch32xor(unsigned char *x, cons
481
498
SECP256K1_INLINE static int secp256k1_rangeproof_rewind_inner (secp256k1_scalar * blind , uint64_t * v ,
482
499
unsigned char * m , size_t * mlen , secp256k1_scalar * ev , secp256k1_scalar * s ,
483
500
secp256k1_rangeproof_header * header , const unsigned char * nonce , const secp256k1_ge * commit , const unsigned char * proof , size_t len , const secp256k1_ge * genp ) {
501
+ secp256k1_rfc6979_hmac_sha256 genrand_rng ;
484
502
secp256k1_scalar s_orig [128 ];
485
503
secp256k1_scalar sec [32 ];
486
504
secp256k1_scalar stmp ;
@@ -496,7 +514,10 @@ SECP256K1_INLINE static int secp256k1_rangeproof_rewind_inner(secp256k1_scalar *
496
514
size_t npub ;
497
515
memset (prep , 0 , 4096 );
498
516
/* Reconstruct the provers random values. */
499
- secp256k1_rangeproof_genrand (sec , s_orig , prep , header -> rsizes , header -> n_rings , nonce , commit , proof , len , genp );
517
+ secp256k1_rangeproof_init_rng (& genrand_rng , nonce , commit , proof , len , genp );
518
+ if (!secp256k1_rangeproof_genrand (sec , s_orig , prep , header , & genrand_rng )) {
519
+ return 0 ;
520
+ }
500
521
* v = UINT64_MAX ;
501
522
secp256k1_scalar_clear (blind );
502
523
if (header -> n_rings == 1 && header -> rsizes [0 ] == 1 ) {
0 commit comments