31 using Field =
typename EC::Field;
33 using Nat =
typename Field::N;
34 using Point =
typename EC::ECPoint;
35 using Scalar =
typename ScalarField::Elt;
38 constexpr static size_t kBits = EC::kBits;
39 const ScalarField& fn_;
51 VerifyWitness3(
const ScalarField& Fn,
const EC& ec) : fn_(Fn), ec_(ec) {}
54 filler.push_back(rx_);
55 filler.push_back(ry_);
56 filler.push_back(rx_inv_);
57 filler.push_back(s_inv_);
58 filler.push_back(pk_inv_);
59 for (
size_t i = 0; i < 8; ++i) {
60 filler.push_back(pre_[i]);
62 for (
size_t i = 0; i < kBits; ++i) {
63 filler.push_back(bi_[i]);
65 filler.push_back(int_x_[i]);
66 filler.push_back(int_y_[i]);
67 filler.push_back(int_z_[i]);
75 bool compute_witness(
const Elt pkX,
const Elt pkY,
const Nat e,
const Nat r,
77 const Field& F = ec_.f_;
78 const Scalar _s = fn_.invertf(fn_.to_montgomery(s));
79 const Scalar tms = fn_.negf(fn_.to_montgomery(s));
83 auto te_s = fn_.mulf(fn_.to_montgomery(e), _s);
84 auto tr_s = fn_.mulf(fn_.to_montgomery(r), _s);
85 const Nat nes = fn_.from_montgomery(te_s);
86 const Nat nrs = fn_.from_montgomery(tr_s);
87 Point bases[] = {ec_.generator(), Point(pkX, pkY, F.one())};
88 Nat scalars[] = {nes, nrs};
89 auto pr = ec_.scalar_multf(2, bases, scalars);
92 rx_ = F.to_montgomery(r);
96 if (rx_ != F.zero()) {
97 rx_inv_ = F.invertf(rx_);
98 check(F.mulf(rx_, rx_inv_) == F.one(),
"bad inv");
101 s_inv_ = F.to_montgomery(fn_.from_montgomery(tms));
102 if (s_inv_ != F.zero()) {
106 if (pkX != F.zero()) {
107 pk_inv_ = F.invertf(pkX);
110 const Nat nms = fn_.from_montgomery(tms);
113 const Elt one = F.one(), gX = ec_.gx_, gY = ec_.gy_;
114 const Elt lh[] = {gX, gY, gX, gY, pkX, pkY};
115 const Elt rh[] = {pkX, pkY, rx_, ry_, rx_, ry_};
117 for (
size_t i = 0; i < 3; ++i) {
118 ec_.addE(pre_[2 * i], pre_[2 * i + 1], zi,
119 lh[2 * i], lh[2 * i + 1], one,
120 rh[2 * i], rh[2 * i + 1], one);
126 if (zi != F.zero()) {
129 F.mul(pre_[2 * i], zi);
130 F.mul(pre_[2 * i + 1], zi);
133 ec_.addE(pre_[6], pre_[7], zi, pre_[2], pre_[3], one, pkX, pkY, one);
134 if (zi != F.zero()) {
140 Elt aX = F.zero(), aY = one, aZ = F.zero();
147 for (
size_t i = 0; i < kBits; ++i) {
148 b[i] = e.bit(kBits - i - 1) + 2 * r.bit(kBits - i - 1) +
149 4 * nms.bit(kBits - i - 1);
152 bi_[i] = F.subf(F.of_scalar(2 * b[i]), F.of_scalar(7));
155 ec_.doubleE(aX, aY, aZ, aX, aY, aZ);
159 ec_.addE(aX, aY, aZ, aX, aY, aZ, F.zero(), F.one(), F.zero());
162 ec_.addE(aX, aY, aZ, aX, aY, aZ, gX, gY, one);
165 ec_.addE(aX, aY, aZ, aX, aY, aZ, pkX, pkY, one);
168 ec_.addE(aX, aY, aZ, aX, aY, aZ, pre_[0], pre_[1], one);
171 ec_.addE(aX, aY, aZ, aX, aY, aZ, rx_, ry_, one);
174 ec_.addE(aX, aY, aZ, aX, aY, aZ, pre_[2], pre_[3], one);
177 ec_.addE(aX, aY, aZ, aX, aY, aZ, pre_[4], pre_[5], one);
180 ec_.addE(aX, aY, aZ, aX, aY, aZ, pre_[6], pre_[7], one);
189 if (aX != F.zero()) {
192 if (aZ != F.zero()) {