7 #ifndef SECP256K1_MODULE_BULLETPROOF_CIRCUIT_COMPRESS_IMPL
8 #define SECP256K1_MODULE_BULLETPROOF_CIRCUIT_COMPRESS_IMPL
37 secp256k1_scalar_add(
r,
b,
b);
38 secp256k1_scalar_negate(
r,
r);
41 secp256k1_scalar_negate(
r,
b);
44 secp256k1_scalar_clear(
r);
50 secp256k1_scalar_add(
r,
b,
b);
53 secp256k1_scalar_mul(
r, &a->
scal,
b);
59 secp256k1_scalar_mul(&mul, &a->
scal,
b);
60 CHECK(secp256k1_scalar_eq(&mul,
r));
67 secp256k1_scalar_clear(
r);
68 for (j = 0; j < row->
size; j++) {
71 secp256k1_scalar_add(
r,
r, &term);
76 return secp256k1_scratch_allocate_frame(
96 secp256k1_scalar_sqr(&zsqr, z);
97 secp256k1_scalar_mul(&ret->
zn[0], &zsqr, z);
99 secp256k1_scalar_mul(&ret->
zn[i], &ret->
zn[i - 1], z);
103 secp256k1_scalar_set_int(&yinvn, 1);
104 secp256k1_scalar_clear(&ret->
c_sum);
106 for (i = 0; i < circ->
n_gates; i++) {
108 secp256k1_wmatrix_row_compress(&wl, &circ->
wl[i], ret->
zn);
111 if (i < circ->n_bits) {
112 secp256k1_scalar_negate(&ret->
wr[i], z);
114 secp256k1_scalar_mul(&wl, &wl, &yinvn);
115 secp256k1_scalar_add(&wl, &wl, z);
117 secp256k1_scalar_mul(&ret->
wl_wo[i], &wl, x);
118 secp256k1_scalar_add(&ret->
wl_wo[i], &ret->
wl_wo[i], &zsqr);
121 secp256k1_scalar_mul(&wl, &wl, &zyn);
122 secp256k1_scalar_negate(&wl, &wl);
124 secp256k1_scalar_add(&ret->
c_sum, &ret->
c_sum, &wl);
125 secp256k1_scalar_add(&ret->
c_sum, &ret->
c_sum, &zyn);
126 secp256k1_scalar_mul(&zyn, &zyn, y);
128 secp256k1_wmatrix_row_compress(&ret->
wr[i], &circ->
wr[i], ret->
zn);
129 secp256k1_wmatrix_row_compress(&ret->
wl_wo[i], &circ->
wo[i], ret->
zn);
131 secp256k1_scalar_mul(&tmp, &wl, x);
132 secp256k1_scalar_add(&tmp, &tmp, &ret->
wl_wo[i]);
133 secp256k1_scalar_mul(&ret->
wl_wo[i], &tmp, &yinvn);
135 secp256k1_scalar_mul(&ret->
wr[i], &ret->
wr[i], &yinvn);
137 secp256k1_scalar_mul(&tmp, &wl, &ret->
wr[i]);
138 secp256k1_scalar_add(&ret->
c_sum, &ret->
c_sum, &tmp);
141 secp256k1_scalar_mul(&yinvn, &yinvn, yinv);
144 secp256k1_scalar_sqr(&tmp, x);
146 secp256k1_wmatrix_row_compress(&ret->
wv[i], &circ->
wv[i], ret->
zn);
147 secp256k1_scalar_mul(&ret->
wv[i], &ret->
wv[i], &tmp);
152 secp256k1_fast_scalar_mul(&term, &circ->
c[i], &ret->
zn[i]);
153 secp256k1_scalar_add(&ret->
c_sum, &ret->
c_sum, &term);
155 secp256k1_scalar_mul(&ret->
c_sum, &ret->
c_sum, &tmp);
161 int ret = secp256k1_scratch_allocate_frame(
185 for (i = 0; i < circ->
n_gates; i++) {
186 secp256k1_scalar_chacha20(&ret->
l3[i], &ret->
r3[i], nonce, 4 + i);
197 secp256k1_scalar_sqr(&zsqr, z);
198 secp256k1_scalar_mul(&ret->
zn[0], &zsqr, z);
200 secp256k1_scalar_mul(&ret->
zn[i], &ret->
zn[i - 1], z);
203 secp256k1_scalar_set_int(&yinvn, 1);
204 secp256k1_scalar_set_int(&yn, 1);
206 for (i = 0; i < circ->
n_gates; i++) {
209 secp256k1_wmatrix_row_compress(&wl, &circ->
wl[i], ret->
zn);
210 secp256k1_wmatrix_row_compress(&wr, &circ->
wr[i], ret->
zn);
211 secp256k1_wmatrix_row_compress(&wo, &circ->
wo[i], ret->
zn);
215 if (i < circ->n_bits) {
218 secp256k1_scalar_negate(&tmp, z);
219 secp256k1_scalar_add(&wr, &wr, &tmp);
221 secp256k1_scalar_mul(&tmp, &yn, z);
222 secp256k1_scalar_add(&wl, &wl, &tmp);
224 secp256k1_scalar_mul(&tmp, &tmp, z);
225 secp256k1_scalar_add(&wo, &wo, &tmp);
227 secp256k1_scalar_mul(&wr, &wr, &yinvn);
231 secp256k1_scalar_mul(&ret->
r3[i], &ret->
r3[i], &yn);
233 if (i < assn->n_gates) {
234 secp256k1_scalar_add(&ret->
l1[i], &wr, &assn->
al[i]);
237 secp256k1_scalar_negate(&ret->
r0[i], &yn);
238 secp256k1_scalar_add(&ret->
r0[i], &ret->
r0[i], &wo);
240 if (i < assn->n_gates) {
241 secp256k1_scalar_mul(&ret->
r1[i], &assn->
ar[i], &yn);
242 secp256k1_scalar_add(&ret->
r1[i], &ret->
r1[i], &wl);
247 secp256k1_scalar_mul(&yn, &yn, y);
248 secp256k1_scalar_mul(&yinvn, &yinvn, yinv);
252 secp256k1_wmatrix_row_compress(&ret->
wv[i], &circ->
wv[i], ret->
zn);