@@ -468,6 +468,7 @@ static int ec_mult_verify_cb2(secp256k1_scalar *sc, secp256k1_ge *pt, size_t idx
468
468
if (idx == 0 ) {
469
469
* pt = * data -> asset_genp ;
470
470
* sc = * data -> v ;
471
+ secp256k1_scalar_negate (sc , sc );
471
472
return 1 ;
472
473
}
473
474
idx -= 1 ;
@@ -477,9 +478,31 @@ static int ec_mult_verify_cb2(secp256k1_scalar *sc, secp256k1_ge *pt, size_t idx
477
478
* sc = data -> s_h [idx - data -> g_vec_len ];
478
479
}
479
480
* pt = data -> g_vec [idx ];
481
+ secp256k1_scalar_negate (sc , sc );
480
482
return 1 ;
481
483
}
482
484
485
+ typedef struct ec_mult_verify_cb_data3 {
486
+ const ec_mult_verify_cb_data1 * cb_data1 ;
487
+ const ec_mult_verify_cb_data2 * cb_data2 ;
488
+ size_t idx2 ;
489
+ } ec_mult_verify_cb_data3 ;
490
+
491
+ static int ec_mult_verify_cb3 (secp256k1_scalar * sc , secp256k1_ge * pt , size_t idx , void * cbdata ) {
492
+ ec_mult_verify_cb_data3 * data = (ec_mult_verify_cb_data3 * ) cbdata ;
493
+ if (idx < data -> idx2 ) {
494
+ if (!ec_mult_verify_cb1 (sc , pt , idx , (void * )data -> cb_data1 )) {
495
+ return 0 ;
496
+ }
497
+ } else {
498
+ if (!ec_mult_verify_cb2 (sc , pt , idx - data -> idx2 , (void * )data -> cb_data2 )) {
499
+ return 0 ;
500
+ }
501
+ }
502
+ return 1 ;
503
+ }
504
+
505
+
483
506
/* Verify the proof */
484
507
int secp256k1_bulletproofs_pp_rangeproof_norm_product_verify (
485
508
const secp256k1_context * ctx ,
@@ -497,7 +520,7 @@ int secp256k1_bulletproofs_pp_rangeproof_norm_product_verify(
497
520
) {
498
521
secp256k1_scalar q , r , v , n , l , r_inv , h_c ;
499
522
secp256k1_scalar * es , * s_g , * s_h , * r_inv_pows ;
500
- secp256k1_gej res1 , res2 ;
523
+ secp256k1_gej res ;
501
524
size_t i = 0 , scratch_checkpoint ;
502
525
int overflow ;
503
526
size_t log_n = secp256k1_bulletproofs_pp_log2 (g_len ), log_m = secp256k1_bulletproofs_pp_log2 (c_vec_len );
@@ -569,40 +592,29 @@ int secp256k1_bulletproofs_pp_rangeproof_norm_product_verify(
569
592
secp256k1_scalar_add (& v , & v , & h_c );
570
593
571
594
{
572
- ec_mult_verify_cb_data1 data ;
573
- secp256k1_gej temp1 , temp2 ;
574
- secp256k1_scalar one ;
575
- data .proof = proof ;
576
- data .commit = commit ;
577
- data .challenges = es ;
578
-
579
- secp256k1_gej_set_ge (& temp2 , commit );
580
- secp256k1_scalar_set_int (& one , 1 );
581
- secp256k1_ecmult (& temp1 , & temp2 , & one , NULL );
582
-
583
- if (!secp256k1_ecmult_multi_var (& ctx -> error_callback , scratch , & res1 , NULL , ec_mult_verify_cb1 , & data , 2 * n_rounds + 1 )) {
584
- return 0 ;
585
- }
586
- }
587
- {
588
- ec_mult_verify_cb_data2 data ;
589
- data .g_vec = g_vec -> gens ;
590
- data .g_vec_len = g_len ;
591
- data .s_g = s_g ;
592
- data .s_h = s_h ;
593
- data .v = & v ;
594
- data .asset_genp = asset_genp ;
595
-
596
- if (!secp256k1_ecmult_multi_var (& ctx -> error_callback , scratch , & res2 , NULL , ec_mult_verify_cb2 , & data , g_len + h_len + 1 )) {
595
+ ec_mult_verify_cb_data1 data1 ;
596
+ ec_mult_verify_cb_data2 data2 ;
597
+ ec_mult_verify_cb_data3 data3 ;
598
+ data1 .proof = proof ;
599
+ data1 .commit = commit ;
600
+ data1 .challenges = es ;
601
+ data2 .g_vec = g_vec -> gens ;
602
+ data2 .g_vec_len = g_len ;
603
+ data2 .s_g = s_g ;
604
+ data2 .s_h = s_h ;
605
+ data2 .v = & v ;
606
+ data2 .asset_genp = asset_genp ;
607
+ data3 .cb_data1 = & data1 ;
608
+ data3 .cb_data2 = & data2 ;
609
+ data3 .idx2 = 2 * n_rounds + 1 ;
610
+
611
+ if (!secp256k1_ecmult_multi_var (& ctx -> error_callback , scratch , & res , NULL , ec_mult_verify_cb3 , & data3 , 2 * n_rounds + 1 + g_len + h_len + 1 )) {
597
612
return 0 ;
598
613
}
599
614
}
600
615
601
616
secp256k1_scratch_apply_checkpoint (& ctx -> error_callback , scratch , scratch_checkpoint );
602
617
603
- /* res1 and res2 should be equal. Could not find a simpler way to compare them */
604
- secp256k1_gej_neg (& res1 , & res1 );
605
- secp256k1_gej_add_var (& res1 , & res1 , & res2 , NULL );
606
- return secp256k1_gej_is_infinity (& res1 );
618
+ return secp256k1_gej_is_infinity (& res );
607
619
}
608
620
#endif
0 commit comments