33 using EltW =
typename LogicCircuit::EltW;
34 using BitW =
typename LogicCircuit::BitW;
35 using Elt =
typename LogicCircuit::Elt;
36 using Nat =
typename Field::N;
37 static constexpr size_t kBits = EC::kBits;
38 using Bitvec =
typename LogicCircuit::v256;
44 EltW rx_inv, s_inv, pk_inv;
46 EltW int_x[kBits - 1];
47 EltW int_y[kBits - 1];
48 EltW int_z[kBits - 1];
56 for (
size_t i = 0; i < 8; ++i) {
59 for (
size_t i = 0; i < kBits; ++i) {
70 VerifyCircuit(
const LogicCircuit& lc,
const EC& ec,
const Nat& order)
71 : lc_(lc), ec_(ec), k2_(lc_.elt(2)), k3_(lc_.elt(3)) {
73 for (
size_t i = 0; i < ec.kBits; ++i) {
74 bits_n_[i] = lc_.bit(order.bit(i));
103 void verify_signature3(EltW pk_x, EltW pk_y, EltW e,
const Witness& w)
const {
104 EltW zero = lc_.konst(lc_.zero());
105 EltW one = lc_.konst(lc_.one());
106 EltW gx = lc_.konst(ec_.gx_), gy = lc_.konst(ec_.gy_);
122 EltW est = zero, rst = zero, sst = zero;
125 EltW ax = zero, ay = one, az = zero;
131 EltW cg_pkx, cg_pky, cg_pkz;
132 EltW cr_pkx, cr_pky, cr_pkz;
133 EltW cr_gx, cr_gy, cr_gz;
134 EltW cr_g_pkx, cr_g_pky, cr_g_pkz;
135 addE(cg_pkx, cg_pky, cg_pkz, gx, gy, one, pk_x, pk_y, one);
136 addE(cr_gx, cr_gy, cr_gz, w.rx, w.ry, one, gx, gy, one);
137 addE(cr_pkx, cr_pky, cr_pkz, w.rx, w.ry, one, pk_x, pk_y, one);
138 addE(cr_g_pkx, cr_g_pky, cr_g_pkz, gx, gy, one, w.pre[RPK_X], w.pre[RPK_Y],
140 point_equality(cg_pkx, cg_pky, cg_pkz, w.pre[GPK_X], w.pre[GPK_Y]);
141 point_equality(cr_gx, cr_gy, cr_gz, w.pre[GR_X], w.pre[GR_Y]);
142 point_equality(cr_pkx, cr_pky, cr_pkz, w.pre[RPK_X], w.pre[RPK_Y]);
143 point_equality(cr_g_pkx, cr_g_pky, cr_g_pkz, w.pre[GRPK_X], w.pre[GRPK_Y]);
145 EltW arr_x[] = {zero, gx, pk_x, w.pre[GPK_X],
146 w.rx, w.pre[GR_X], w.pre[RPK_X], w.pre[GRPK_X]};
147 EltW arr_y[] = {one, gy, pk_y, w.pre[GPK_Y],
148 w.ry, w.pre[GR_Y], w.pre[RPK_Y], w.pre[GRPK_Y]};
149 EltW arr_z[] = {zero, one, one, one, one, one, one, one};
150 EltW arr_e[] = {zero, one, zero, one, zero, one, zero, one};
151 EltW arr_r[] = {zero, zero, one, one, zero, zero, one, one};
152 EltW arr_s[] = {zero, zero, zero, zero, one, one, one, one};
157 EltW arr_v[] = {zero, zero, zero, zero, zero, zero, zero, zero, one};
159 EltMuxer<LogicCircuit, 8> xx(lc_, arr_x);
160 EltMuxer<LogicCircuit, 8> yy(lc_, arr_y);
161 EltMuxer<LogicCircuit, 8> zz(lc_, arr_z);
162 EltMuxer<LogicCircuit, 8> ee(lc_, arr_e);
163 EltMuxer<LogicCircuit, 8> rr(lc_, arr_r);
164 EltMuxer<LogicCircuit, 8> ss(lc_, arr_s);
165 EltMuxer<LogicCircuit, 9, 8> vv(lc_, arr_v);
167 Bitvec r_bits, s_bits;
170 for (
size_t i = 0; i < kBits; ++i) {
173 EltW tx = xx.mux(w.bi[i]);
174 EltW ty = yy.mux(w.bi[i]);
175 EltW tz = zz.mux(w.bi[i]);
178 EltW e_bi = ee.mux(w.bi[i]);
179 EltW r_bi = rr.mux(w.bi[i]);
180 EltW s_bi = ss.mux(w.bi[i]);
181 auto k2 = lc_.konst(k2_);
182 est = lc_.add(&e_bi, lc_.mul(&k2, est));
183 rst = lc_.add(&r_bi, lc_.mul(&k2, rst));
184 sst = lc_.add(&s_bi, lc_.mul(&k2, sst));
185 r_bits[kBits - i - 1] = BitW(r_bi, ec_.f_);
186 s_bits[kBits - i - 1] = BitW(s_bi, ec_.f_);
189 EltW range = vv.mux(w.bi[i]);
195 doubleE(ax, ay, az, ax, ay, az);
197 addE(ax, ay, az, ax, ay, az, tx, ty, tz);
206 lc_.assert_eq(&ax, w.int_x[i]);
207 lc_.assert_eq(&ay, w.int_y[i]);
208 lc_.assert_eq(&az, w.int_z[i]);
222 lc_.assert_eq(&est, e);
223 lc_.assert_eq(&rst, w.rx);
226 is_on_curve(pk_x, pk_y);
227 is_on_curve(w.rx, w.ry);
232 assert_nonzero(w.rx, w.rx_inv);
233 assert_nonzero(sst, w.s_inv);
234 assert_nonzero(pk_x, w.pk_inv);
235 auto r_range = lc_.vlt(&r_bits, bits_n_);
236 auto s_range = lc_.vlt(&s_bits, bits_n_);
237 lc_.assert1(r_range);
238 lc_.assert1(s_range);
242 void assert_nonzero(EltW x, EltW witness)
const {
243 auto maybe_one = lc_.mul(&x, witness);
244 auto one = lc_.konst(lc_.one());
245 lc_.assert_eq(&maybe_one, one);
248 void point_equality(EltW x, EltW y, EltW z, EltW p_x, EltW p_y)
const {
249 lc_.assert_eq(&x, lc_.mul(&z, p_x));
250 lc_.assert_eq(&y, lc_.mul(&z, p_y));
253 void is_on_curve(EltW x, EltW y)
const {
255 auto yy = lc_.mul(&y, y);
256 auto xx = lc_.mul(&x, x);
257 auto xxx = lc_.mul(&x, xx);
258 auto ax = lc_.mul(ec_.a_, x);
259 auto b = lc_.konst(ec_.b_);
260 auto axb = lc_.add(&ax, b);
261 auto rhs = lc_.add(&axb, xxx);
262 lc_.assert_eq(&yy, rhs);
265 void addE(EltW& X3, EltW& Y3, EltW& Z3, EltW X1, EltW Y1, EltW Z1, EltW X2,
266 EltW Y2, EltW Z2)
const {
271 EltW t0 = lc_.mul(&X1, X2);
272 EltW t1 = lc_.mul(&Y1, Y2);
273 EltW t2 = lc_.mul(&Z1, Z2);
274 EltW t3 = lc_.add(&X1, Y1);
275 EltW t4 = lc_.add(&X2, Y2);
276 t3 = lc_.mul(&t3, t4);
277 t4 = lc_.add(&t0, t1);
278 t3 = lc_.sub(&t3, t4);
279 t4 = lc_.add(&X1, Z1);
280 EltW t5 = lc_.add(&X2, Z2);
281 t4 = lc_.mul(&t4, t5);
282 t5 = lc_.add(&t0, t2);
283 t4 = lc_.sub(&t4, t5);
284 t5 = lc_.add(&Y1, Z1);
285 EltW X3t = lc_.add(&Y2, Z2);
286 t5 = lc_.mul(&t5, X3t);
287 X3t = lc_.add(&t1, t2);
288 t5 = lc_.sub(&t5, X3t);
289 auto a = lc_.konst(ec_.a_);
290 EltW Z3t = lc_.mul(&a, t4);
291 auto k3b = lc_.konst(ec_.k3b);
292 X3t = lc_.mul(&k3b, t2);
293 Z3t = lc_.add(&X3t, Z3t);
294 X3t = lc_.sub(&t1, Z3t);
295 Z3t = lc_.add(&t1, Z3t);
296 EltW Y3t = lc_.mul(&X3t, Z3t);
297 t1 = lc_.add(&t0, t0);
298 t1 = lc_.add(&t1, t0);
299 t2 = lc_.mul(&a, t2);
300 t4 = lc_.mul(&k3b, t4);
301 t1 = lc_.add(&t1, t2);
302 t2 = lc_.sub(&t0, t2);
303 t2 = lc_.mul(&a, t2);
304 t4 = lc_.add(&t4, t2);
305 t0 = lc_.mul(&t1, t4);
306 Y3t = lc_.add(&Y3t, t0);
307 t0 = lc_.mul(&t5, t4);
308 X3t = lc_.mul(&t3, X3t);
309 X3t = lc_.sub(&X3t, t0);
310 t0 = lc_.mul(&t3, t1);
311 Z3t = lc_.mul(&t5, Z3t);
312 Z3t = lc_.add(&Z3t, t0);
319 void doubleE(EltW& X3, EltW& Y3, EltW& Z3, EltW X, EltW Y, EltW Z)
const {
325 EltW t0 = lc_.mul(&X, X);
326 EltW t1 = lc_.mul(&Y, Y);
327 EltW t2 = lc_.mul(&Z, Z);
328 EltW t3 = lc_.mul(&X, Y);
329 t3 = lc_.add(&t3, t3);
330 EltW Z3t = lc_.mul(&X, Z);
331 Z3t = lc_.add(&Z3t, Z3t);
332 auto a = lc_.konst(ec_.a_);
333 auto k3b = lc_.konst(ec_.k3b);
334 EltW X3t = lc_.mul(&a, Z3t);
335 EltW Y3t = lc_.mul(&k3b, t2);
336 Y3t = lc_.add(&X3t, Y3t);
337 X3t = lc_.sub(&t1, Y3t);
338 Y3t = lc_.add(&t1, Y3t);
339 Y3t = lc_.mul(&X3t, Y3t);
340 X3t = lc_.mul(&t3, X3t);
341 Z3t = lc_.mul(&k3b, Z3t);
342 t2 = lc_.mul(&a, t2);
343 t3 = lc_.sub(&t0, t2);
344 t3 = lc_.mul(&a, t3);
345 t3 = lc_.add(&t3, Z3t);
346 Z3t = lc_.add(&t0, t0);
347 t0 = lc_.add(&Z3t, t0);
348 t0 = lc_.add(&t0, t2);
349 t0 = lc_.mul(&t0, t3);
350 Y3t = lc_.add(&Y3t, t0);
352 t2 = lc_.add(&t2, t2);
353 t0 = lc_.mul(&t2, t3);
354 X3t = lc_.sub(&X3t, t0);
355 Z3t = lc_.mul(&t2, t1);
356 Z3t = lc_.add(&Z3t, Z3t);
357 Z3t = lc_.add(&Z3t, Z3t);
364 const LogicCircuit& lc_;