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};
153 EltW arr_v[] = {one, one, one, one, one, one, one, one};
155 EltMuxer<LogicCircuit, 3> xx(lc_, arr_x);
156 EltMuxer<LogicCircuit, 3> yy(lc_, arr_y);
157 EltMuxer<LogicCircuit, 3> zz(lc_, arr_z);
158 EltMuxer<LogicCircuit, 3> ee(lc_, arr_e);
159 EltMuxer<LogicCircuit, 3> rr(lc_, arr_r);
160 EltMuxer<LogicCircuit, 3> ss(lc_, arr_s);
161 EltMuxer<LogicCircuit, 3> vv(lc_, arr_v);
163 Bitvec r_bits, s_bits;
166 for (
size_t i = 0; i < kBits; ++i) {
169 EltW tx = xx.mux(w.bi[i]);
170 EltW ty = yy.mux(w.bi[i]);
171 EltW tz = zz.mux(w.bi[i]);
174 EltW e_bi = ee.mux(w.bi[i]);
175 EltW r_bi = rr.mux(w.bi[i]);
176 EltW s_bi = ss.mux(w.bi[i]);
177 auto k2 = lc_.konst(k2_);
178 est = lc_.add(&e_bi, lc_.mul(&k2, est));
179 rst = lc_.add(&r_bi, lc_.mul(&k2, rst));
180 sst = lc_.add(&s_bi, lc_.mul(&k2, sst));
181 r_bits[kBits - i - 1] = BitW(r_bi, ec_.f_);
182 s_bits[kBits - i - 1] = BitW(s_bi, ec_.f_);
185 EltW range = vv.mux(w.bi[i]);
186 lc_.assert_eq(&range, one);
191 doubleE(ax, ay, az, ax, ay, az);
193 addE(ax, ay, az, ax, ay, az, tx, ty, tz);
202 lc_.assert_eq(&ax, w.int_x[i]);
203 lc_.assert_eq(&ay, w.int_y[i]);
204 lc_.assert_eq(&az, w.int_z[i]);
218 lc_.assert_eq(&est, e);
219 lc_.assert_eq(&rst, w.rx);
222 is_on_curve(pk_x, pk_y);
223 is_on_curve(w.rx, w.ry);
228 assert_nonzero(w.rx, w.rx_inv);
229 assert_nonzero(sst, w.s_inv);
230 assert_nonzero(pk_x, w.pk_inv);
231 auto r_range = lc_.vlt(&r_bits, bits_n_);
232 auto s_range = lc_.vlt(&s_bits, bits_n_);
233 lc_.assert1(r_range);
234 lc_.assert1(s_range);
238 void assert_nonzero(EltW x, EltW witness)
const {
239 auto maybe_one = lc_.mul(&x, witness);
240 auto one = lc_.konst(lc_.one());
241 lc_.assert_eq(&maybe_one, one);
244 void point_equality(EltW x, EltW y, EltW z, EltW p_x, EltW p_y)
const {
245 lc_.assert_eq(&x, lc_.mul(&z, p_x));
246 lc_.assert_eq(&y, lc_.mul(&z, p_y));
249 void is_on_curve(EltW x, EltW y)
const {
251 auto yy = lc_.mul(&y, y);
252 auto xx = lc_.mul(&x, x);
253 auto xxx = lc_.mul(&x, xx);
254 auto ax = lc_.mul(ec_.a_, x);
255 auto b = lc_.konst(ec_.b_);
256 auto axb = lc_.add(&ax, b);
257 auto rhs = lc_.add(&axb, xxx);
258 lc_.assert_eq(&yy, rhs);
261 void addE(EltW& X3, EltW& Y3, EltW& Z3, EltW X1, EltW Y1, EltW Z1, EltW X2,
262 EltW Y2, EltW Z2)
const {
267 EltW t0 = lc_.mul(&X1, X2);
268 EltW t1 = lc_.mul(&Y1, Y2);
269 EltW t2 = lc_.mul(&Z1, Z2);
270 EltW t3 = lc_.add(&X1, Y1);
271 EltW t4 = lc_.add(&X2, Y2);
272 t3 = lc_.mul(&t3, t4);
273 t4 = lc_.add(&t0, t1);
274 t3 = lc_.sub(&t3, t4);
275 t4 = lc_.add(&X1, Z1);
276 EltW t5 = lc_.add(&X2, Z2);
277 t4 = lc_.mul(&t4, t5);
278 t5 = lc_.add(&t0, t2);
279 t4 = lc_.sub(&t4, t5);
280 t5 = lc_.add(&Y1, Z1);
281 EltW X3t = lc_.add(&Y2, Z2);
282 t5 = lc_.mul(&t5, X3t);
283 X3t = lc_.add(&t1, t2);
284 t5 = lc_.sub(&t5, X3t);
285 auto a = lc_.konst(ec_.a_);
286 EltW Z3t = lc_.mul(&a, t4);
287 auto k3b = lc_.konst(ec_.k3b);
288 X3t = lc_.mul(&k3b, t2);
289 Z3t = lc_.add(&X3t, Z3t);
290 X3t = lc_.sub(&t1, Z3t);
291 Z3t = lc_.add(&t1, Z3t);
292 EltW Y3t = lc_.mul(&X3t, Z3t);
293 t1 = lc_.add(&t0, t0);
294 t1 = lc_.add(&t1, t0);
295 t2 = lc_.mul(&a, t2);
296 t4 = lc_.mul(&k3b, t4);
297 t1 = lc_.add(&t1, t2);
298 t2 = lc_.sub(&t0, t2);
299 t2 = lc_.mul(&a, t2);
300 t4 = lc_.add(&t4, t2);
301 t0 = lc_.mul(&t1, t4);
302 Y3t = lc_.add(&Y3t, t0);
303 t0 = lc_.mul(&t5, t4);
304 X3t = lc_.mul(&t3, X3t);
305 X3t = lc_.sub(&X3t, t0);
306 t0 = lc_.mul(&t3, t1);
307 Z3t = lc_.mul(&t5, Z3t);
308 Z3t = lc_.add(&Z3t, t0);
315 void doubleE(EltW& X3, EltW& Y3, EltW& Z3, EltW X, EltW Y, EltW Z)
const {
321 EltW t0 = lc_.mul(&X, X);
322 EltW t1 = lc_.mul(&Y, Y);
323 EltW t2 = lc_.mul(&Z, Z);
324 EltW t3 = lc_.mul(&X, Y);
325 t3 = lc_.add(&t3, t3);
326 EltW Z3t = lc_.mul(&X, Z);
327 Z3t = lc_.add(&Z3t, Z3t);
328 auto a = lc_.konst(ec_.a_);
329 auto k3b = lc_.konst(ec_.k3b);
330 EltW X3t = lc_.mul(&a, Z3t);
331 EltW Y3t = lc_.mul(&k3b, t2);
332 Y3t = lc_.add(&X3t, Y3t);
333 X3t = lc_.sub(&t1, Y3t);
334 Y3t = lc_.add(&t1, Y3t);
335 Y3t = lc_.mul(&X3t, Y3t);
336 X3t = lc_.mul(&t3, X3t);
337 Z3t = lc_.mul(&k3b, Z3t);
338 t2 = lc_.mul(&a, t2);
339 t3 = lc_.sub(&t0, t2);
340 t3 = lc_.mul(&a, t3);
341 t3 = lc_.add(&t3, Z3t);
342 Z3t = lc_.add(&t0, t0);
343 t0 = lc_.add(&Z3t, t0);
344 t0 = lc_.add(&t0, t2);
345 t0 = lc_.mul(&t0, t3);
346 Y3t = lc_.add(&Y3t, t0);
348 t2 = lc_.add(&t2, t2);
349 t0 = lc_.mul(&t2, t3);
350 X3t = lc_.sub(&X3t, t0);
351 Z3t = lc_.mul(&t2, t1);
352 Z3t = lc_.add(&Z3t, Z3t);
353 Z3t = lc_.add(&Z3t, Z3t);
360 const LogicCircuit& lc_;