32class MdocRevocationList {
33 using EltW =
typename LogicCircuit::EltW;
36 explicit MdocRevocationList(
const LogicCircuit& lc) : lc_(lc) {}
40 void assert_not_on_list(EltW list[],
size_t list_size,
41 EltW
id, EltW prodinv)
const {
43 lc_.mul(0, list_size, [&](
size_t i) {
return lc_.sub(&list[i],
id); });
44 EltW want_one = lc_.mul(&prod, prodinv);
45 lc_.assert_eq(&want_one, lc_.konst(lc_.one()));
48 const LogicCircuit& lc_;
60class MdocRevocationSpan {
61 using EltW =
typename LogicCircuit::EltW;
62 using Nat =
typename Field::N;
65 using v8 =
typename LogicCircuit::v8;
66 using v256 =
typename LogicCircuit::v256;
70 using ShaBlockWitness =
typename Flatsha::BlockWitness;
71 using sha_packed_v32 =
typename Flatsha::packed_v32;
77 EcdsaWitness rev_sig_;
81 ShaBlockWitness sha_[2];
88 for (
size_t i = 0; i < 64 * 2; ++i) {
89 preimage_[i] = lc.template vinput<8>();
91 id_bits_ = lc.template vinput<256>();
92 e_bits_ = lc.template vinput<256>();
93 for (
size_t j = 0; j < 2; j++) {
99 explicit MdocRevocationSpan(
const LogicCircuit& lc,
const EC& ec,
101 : lc_(lc), ec_(ec), order_(order), sha_(lc) {}
107 void assert_not_on_list(EltW craPkx, EltW craPkY,
108 EltW
id, Witness& vw)
const {
109 Ecdsa ecc(lc_, ec_, order_);
111 ecc.verify_signature3(craPkx, craPkY, vw.e_, vw.rev_sig_);
113 lc_.vassert_is_bit(vw.e_bits_);
114 lc_.vassert_is_bit(vw.id_bits_);
117 auto two = lc_.template vbit<8>(2);
118 sha_.assert_message_hash(2, two, vw.preimage_, vw.e_bits_, vw.sha_);
121 auto twok = lc_.one();
122 auto est = lc_.konst(0);
123 for (
size_t i = 0; i < 256; ++i) {
124 est = lc_.axpy(&est, twok, lc_.eval(vw.e_bits_[i]));
125 lc_.f_.add(twok, twok);
127 lc_.assert_eq(&est, vw.e_);
131 for (
size_t i = 0; i < 256; ++i) {
132 ll[i] = vw.preimage_[8 + i / 8][i % 8];
133 rr[i] = vw.preimage_[40 + i / 8][i % 8];
135 lc_.assert1(lc_.vlt(&ll, vw.id_bits_));
136 lc_.assert1(lc_.vlt(&vw.id_bits_, rr));
139 const LogicCircuit& lc_;