@@ -468,6 +468,7 @@ static int ec_mult_verify_cb2(secp256k1_scalar *sc, secp256k1_ge *pt, size_t idx
468468 if (idx == 0 ) {
469469 * pt = * data -> asset_genp ;
470470 * sc = * data -> v ;
471+ secp256k1_scalar_negate (sc , sc );
471472 return 1 ;
472473 }
473474 idx -= 1 ;
@@ -477,9 +478,31 @@ static int ec_mult_verify_cb2(secp256k1_scalar *sc, secp256k1_ge *pt, size_t idx
477478 * sc = data -> s_h [idx - data -> g_vec_len ];
478479 }
479480 * pt = data -> g_vec [idx ];
481+ secp256k1_scalar_negate (sc , sc );
480482 return 1 ;
481483}
482484
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+
483506/* Verify the proof */
484507int secp256k1_bulletproofs_pp_rangeproof_norm_product_verify (
485508 const secp256k1_context * ctx ,
@@ -497,7 +520,7 @@ int secp256k1_bulletproofs_pp_rangeproof_norm_product_verify(
497520) {
498521 secp256k1_scalar q , r , v , n , l , r_inv , h_c ;
499522 secp256k1_scalar * es , * s_g , * s_h , * r_inv_pows ;
500- secp256k1_gej res1 , res2 ;
523+ secp256k1_gej res ;
501524 size_t i = 0 , scratch_checkpoint ;
502525 int overflow ;
503526 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(
569592 secp256k1_scalar_add (& v , & v , & h_c );
570593
571594 {
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 )) {
597612 return 0 ;
598613 }
599614 }
600615
601616 secp256k1_scratch_apply_checkpoint (& ctx -> error_callback , scratch , scratch_checkpoint );
602617
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 );
607619}
608620#endif
0 commit comments