Skip to content

Commit 3e0b0cf

Browse files
committed
make one ecmult_multi out of two
1 parent 1eb03ce commit 3e0b0cf

File tree

1 file changed

+42
-30
lines changed

1 file changed

+42
-30
lines changed

src/modules/bulletproofs/bulletproofs_pp_norm_product_impl.h

+42-30
Original file line numberDiff line numberDiff line change
@@ -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 */
484507
int 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

Comments
 (0)