56static int secp256k1_bulletproof_relation66_prove_impl(
const secp256k1_ecmult_context *ecmult_ctx, secp256k1_scratch *scratch,
unsigned char *proof,
size_t *plen,
const secp256k1_bulletproof_circuit_assignment *assn,
const secp256k1_ge *commitp,
const secp256k1_scalar *blinds,
size_t nc,
const secp256k1_ge *value_gen,
const secp256k1_bulletproof_circuit *circ,
const secp256k1_bulletproof_generators *gens,
const unsigned char *
nonce,
const unsigned char *extra_commit,
size_t extra_commit_len) {
59 secp256k1_sha256 sha256;
60 unsigned char commit[32] = {0};
61 secp256k1_scalar alpha, beta,
rho, mu;
62 secp256k1_scalar tau1, tau3, tau4, tau5, tau6, taux;
63 secp256k1_scalar t[7];
64 secp256k1_scalar tauv;
65 secp256k1_scalar x, xn, y, yinv, z;
67 secp256k1_gej aij, aoj, sj;
69 secp256k1_ge out_pt[8];
76 if (*plen < 64 + 256 + 1) {
89 if (extra_commit != NULL) {
90 secp256k1_sha256_initialize(&sha256);
91 secp256k1_sha256_write(&sha256, commit, 32);
92 secp256k1_sha256_write(&sha256, extra_commit, extra_commit_len);
93 secp256k1_sha256_finalize(&sha256, commit);
109 secp256k1_ecmult_const(&aij, gens->
blinding_gen, &alpha);
110 for (i = 0; i < circ->
n_bits; i++) {
111 secp256k1_ge aterm = gens->
gens[i + gens->
n/2];
113 secp256k1_ge_neg(&aterm, &aterm);
114 secp256k1_fe_cmov(&aterm.x, &gens->
gens[i].x, secp256k1_scalar_is_one(&assn->
al[i]));
115 secp256k1_fe_cmov(&aterm.y, &gens->
gens[i].y, secp256k1_scalar_is_one(&assn->
al[i]));
116 secp256k1_gej_add_ge(&aij, &aij, &aterm);
118 secp256k1_ge_set_gej(&tmpge, &aij);
120 secp256k1_gej_add_ge(&aij, &aij, &tmpge);
121 secp256k1_ge_set_gej(&tmpge, &aij);
123 secp256k1_gej_add_ge(&aij, &aij, &tmpge);
128 for (i = 0; i < circ->
n_gates; i++) {
132 secp256k1_ecmult_const(&termj, &gens->
gens[i], &comp_circ->
l3[i]);
133 secp256k1_ge_set_gej(&term, &termj);
134 secp256k1_gej_add_ge(&sj, &sj, &term);
135 secp256k1_ecmult_const(&termj, &gens->
gens[i + gens->
n/2], &comp_circ->
r3[i]);
136 secp256k1_ge_set_gej(&term, &termj);
137 secp256k1_gej_add_ge(&sj, &sj, &term);
141 secp256k1_ge_set_gej(&out_pt[0], &aij);
142 secp256k1_ge_set_gej(&out_pt[1], &aoj);
143 secp256k1_ge_set_gej(&out_pt[2], &sj);
146 secp256k1_scalar_set_b32(&y, commit, &overflow);
147 if (overflow || secp256k1_scalar_is_zero(&y)) {
152 secp256k1_scalar_set_b32(&z, commit, &overflow);
153 if (overflow || secp256k1_scalar_is_zero(&z)) {
157 secp256k1_scalar_inverse_var(&yinv, &y);
176 for (i = 0; i < 6; i++) {
177 secp256k1_scalar_clear(&t[i + 1]);
179 for (i = 0; i < circ->
n_gates; i++) {
182 if (i < assn->n_gates) {
185 secp256k1_scalar_clear(&ao);
189 secp256k1_scalar_mul(&tmp, &comp_circ->
l1[i], &comp_circ->
r0[i]);
190 secp256k1_scalar_add(&t[1], &t[1], &tmp);
192 secp256k1_scalar_mul(&tmp, &comp_circ->
l1[i], &comp_circ->
r1[i]);
193 secp256k1_scalar_add(&t[2], &t[2], &tmp);
194 secp256k1_scalar_mul(&tmp, &ao, &comp_circ->
r0[i]);
195 secp256k1_scalar_add(&t[2], &t[2], &tmp);
197 secp256k1_scalar_mul(&tmp, &ao, &comp_circ->
r1[i]);
198 secp256k1_scalar_add(&t[3], &t[3], &tmp);
199 secp256k1_scalar_mul(&tmp, &comp_circ->
l3[i], &comp_circ->
r0[i]);
200 secp256k1_scalar_add(&t[3], &t[3], &tmp);
202 secp256k1_scalar_mul(&tmp, &comp_circ->
l3[i], &comp_circ->
r1[i]);
203 secp256k1_scalar_add(&t[4], &t[4], &tmp);
204 secp256k1_scalar_mul(&tmp, &comp_circ->
l1[i], &comp_circ->
r3[i]);
205 secp256k1_scalar_add(&t[4], &t[4], &tmp);
207 secp256k1_scalar_mul(&tmp, &ao, &comp_circ->
r3[i]);
208 secp256k1_scalar_add(&t[5], &t[5], &tmp);
210 secp256k1_scalar_mul(&tmp, &comp_circ->
l3[i], &comp_circ->
r3[i]);
211 secp256k1_scalar_add(&t[6], &t[6], &tmp);
216 secp256k1_ge_set_gej(&out_pt[3], &aij);
219 secp256k1_ge_set_gej(&out_pt[4], &aij);
222 secp256k1_ge_set_gej(&out_pt[5], &aij);
225 secp256k1_ge_set_gej(&out_pt[6], &aij);
228 secp256k1_ge_set_gej(&out_pt[7], &aij);
232 secp256k1_scalar_set_b32(&x, commit, &overflow);
233 if (overflow || secp256k1_scalar_is_zero(&x)) {
238 secp256k1_scalar_mul(&alpha, &alpha, &x);
239 secp256k1_scalar_mul(&tau1, &tau1, &x);
241 secp256k1_scalar_sqr(&xn, &x);
242 secp256k1_scalar_mul(&beta, &beta, &xn);
243 secp256k1_scalar_clear(&tauv);
245 secp256k1_scalar zwv;
246 secp256k1_scalar_mul(&zwv, &comp_circ->
wv[i], &blinds[i]);
247 secp256k1_scalar_add(&tauv, &tauv, &zwv);
249 secp256k1_scalar_mul(&tauv, &tauv, &xn);
251 secp256k1_scalar_mul(&xn, &xn, &x);
252 secp256k1_scalar_mul(&
rho, &
rho, &xn);
253 secp256k1_scalar_mul(&tau3, &tau3, &xn);
255 secp256k1_scalar_mul(&xn, &xn, &x);
256 secp256k1_scalar_mul(&tau4, &tau4, &xn);
258 secp256k1_scalar_mul(&xn, &xn, &x);
259 secp256k1_scalar_mul(&tau5, &tau5, &xn);
261 secp256k1_scalar_mul(&xn, &xn, &x);
262 secp256k1_scalar_mul(&tau6, &tau6, &xn);
264 secp256k1_scalar_add(&taux, &tau1, &tauv);
265 secp256k1_scalar_add(&taux, &taux, &tau3);
266 secp256k1_scalar_add(&taux, &taux, &tau4);
267 secp256k1_scalar_add(&taux, &taux, &tau5);
268 secp256k1_scalar_add(&taux, &taux, &tau6);
270 secp256k1_scalar_add(&mu, &alpha, &beta);
271 secp256k1_scalar_add(&mu, &mu, &
rho);
274 secp256k1_scalar_negate(&mu, &mu);
275 secp256k1_scalar_negate(&taux, &taux);
278 secp256k1_scalar_get_b32(&proof[0], &taux);
279 secp256k1_scalar_get_b32(&proof[32], &mu);
283 secp256k1_sha256_initialize(&sha256);
284 secp256k1_sha256_write(&sha256, commit, 32);
285 secp256k1_sha256_write(&sha256, proof, 64);
286 secp256k1_sha256_finalize(&sha256, commit);
290 secp256k1_scalar_sqr(&abgh_data.
x2, &x);
292 abgh_data.
assn = assn;
293 *plen -= 64 + 256 + 1;
298 *plen += 64 + 256 + 1;
403static int secp256k1_bulletproof_relation66_verify_impl(
const secp256k1_ecmult_context *ecmult_ctx, secp256k1_scratch *scratch,
const unsigned char*
const* proof,
size_t n_proofs,
size_t plen,
const secp256k1_ge*
const* commitp,
size_t *nc,
const secp256k1_ge *value_gen,
const secp256k1_bulletproof_circuit*
const* circ,
const secp256k1_bulletproof_generators *gens,
const unsigned char **extra_commit,
size_t *extra_commit_len) {
410 if (plen < 64 + 256 + 1) {
416 for (i = 1; i < n_proofs; i++) {
435 for (i = 0; i < n_proofs; i++) {
436 secp256k1_sha256 sha256;
437 unsigned char randomizer82[32] = {0};
438 unsigned char commit[32] = {0};
439 secp256k1_scalar taux, mu;
447 { &ecmult_data[i].
age[0], 0 },
448 { &ecmult_data[i].
age[1], 1 },
449 { &ecmult_data[i].
age[2], 2 },
450 { &ecmult_data[i].
tge[0], 3 },
451 { &ecmult_data[i].
tge[1], 4 },
452 { &ecmult_data[i].
tge[2], 5 },
453 { &ecmult_data[i].
tge[3], 6 },
454 { &ecmult_data[i].
tge[4], 7 },
466 if (extra_commit != NULL && extra_commit[i] != NULL) {
467 secp256k1_sha256_initialize(&sha256);
468 secp256k1_sha256_write(&sha256, commit, 32);
469 secp256k1_sha256_write(&sha256, extra_commit[i], extra_commit_len[i]);
470 secp256k1_sha256_finalize(&sha256, commit);
477 for (point_idx = 0; point_idx <
sizeof(proof_points) /
sizeof(proof_points[0]); ++point_idx) {
488 secp256k1_scalar_set_b32(&y, commit, &overflow);
489 if (overflow || secp256k1_scalar_is_zero(&y)) {
494 ecmult_data[i].
y = y;
495 secp256k1_scalar_inverse_var(&ecmult_data[i].yinv, &y);
497 secp256k1_scalar_set_b32(&ecmult_data[i].z, commit, &overflow);
498 if (overflow || secp256k1_scalar_is_zero(&ecmult_data[i].z)) {
505 secp256k1_scalar_set_b32(&ecmult_data[i].x, commit, &overflow);
506 if (overflow || secp256k1_scalar_is_zero(&ecmult_data[i].x)) {
516 secp256k1_scalar_set_b32(&taux, &proof[i][0], &overflow);
522 secp256k1_scalar_set_b32(&mu, &proof[i][32], &overflow);
530 secp256k1_scalar_set_b32(&ecmult_data[i].t, &proof[i][64 + 256 + 1], &overflow);
538 secp256k1_sha256_initialize(&sha256);
539 secp256k1_sha256_write(&sha256, commit, 32);
540 secp256k1_sha256_write(&sha256, proof[i], 64);
541 secp256k1_sha256_finalize(&sha256, commit);
543 secp256k1_sha256_initialize(&sha256);
544 secp256k1_sha256_write(&sha256, commit, 32);
545 secp256k1_sha256_finalize(&sha256, randomizer82);
546 secp256k1_scalar_set_b32(&ecmult_data[i].randomizer82, randomizer82, &overflow);
547 if (overflow || secp256k1_scalar_is_zero(&ecmult_data[i].randomizer82)) {
554 ecmult_data[i].
count = 0;
560 ecmult_data[i].
commits = commitp[i];
569 secp256k1_scalar_mul(&taux, &taux, &ecmult_data[i].randomizer82);
570 secp256k1_scalar_add(&mu, &mu, &taux);
572 innp_ctx[i].
proof = &proof[i][64 + 256 + 1];
574 innp_ctx[i].
yinv = ecmult_data[i].
yinv;
575 memcpy(innp_ctx[i].commit, commit, 32);