40 using EltW =
typename LogicCircuit::EltW;
41 using Elt =
typename LogicCircuit::Elt;
42 using Nat =
typename Field::N;
46 using v8 =
typename LogicCircuit::v8;
47 using v32 =
typename LogicCircuit::v32;
48 static constexpr size_t kIndexBits = 5;
49 static constexpr size_t kMaxSHABlocks = 3;
50 static constexpr size_t kMaxMsoLen = kMaxSHABlocks * 64 - 9;
52 using vind =
typename LogicCircuit::template bitvec<kIndexBits>;
55 using ShaBlockWitness =
typename Flatsha::BlockWitness;
57 const LogicCircuit& lc_;
68 EcdsaWitness dpk_sig_;
70 v8 in_[64 * kMaxSHABlocks];
72 ShaBlockWitness sig_sha_[kMaxSHABlocks];
82 nb_ = lc.template vinput<8>();
85 for (
size_t i = 0; i < 64 * kMaxSHABlocks; ++i) {
86 in_[i] = lc.template vinput<8>();
88 for (
size_t j = 0; j < kMaxSHABlocks; j++) {
98 void input(
const LogicCircuit& lc) {
99 ind = lc.template vinput<8>();
100 len = lc.template vinput<8>();
101 for (
size_t j = 0; j < 32; ++j) {
102 v1[j] = lc.template vinput<8>();
107 EltW repack(
const v8 in[],
size_t ind)
const {
108 EltW h = lc_.konst(0);
109 EltW base = lc_.konst(0x2);
110 for (
size_t i = 0; i < 32; ++i) {
111 for (
size_t j = 0; j < 8; ++j) {
112 auto t = lc_.mul(&h, base);
113 auto tin = lc_.eval(in[ind + i][7 - j]);
114 h = lc_.add(&tin, t);
120 explicit PtrCred(
const LogicCircuit& lc,
const EC& ec,
const Nat& order)
121 : lc_(lc), ec_(ec), order_(order), sha_(lc), r_(lc) {}
123 void assert_credential(EltW pkX, EltW pkY, EltW hash_tr,
125 const v8 now[],
const Witness& vw)
const {
126 Ecdsa ecc(lc_, ec_, order_);
128 ecc.verify_signature3(pkX, pkY, vw.e_, vw.sig_);
129 ecc.verify_signature3(vw.dpkx_, vw.dpky_, hash_tr, vw.dpk_sig_);
130 sha_.assert_message(kMaxSHABlocks, vw.nb_, vw.in_, vw.sig_sha_);
132 const Memcmp<LogicCircuit> CMP(lc_);
134 lc_.assert1(CMP.leq(kDateLen, &vw.in_[84], &now[0]));
137 lc_.assert1(CMP.leq(kDateLen, &now[0], &vw.in_[92]));
140 EltW dpkx = repack(vw.in_, 100);
141 EltW dpky = repack(vw.in_, 132);
142 lc_.assert_eq(&dpkx, vw.dpkx_);
143 lc_.assert_eq(&dpky, vw.dpky_);
146 const v8 zz = lc_.template vbit<8>(0xff);
147 std::vector<v8> cmp_buf(32);
148 for (
size_t ai = 0; ai < kNumAttr; ++ai) {
149 r_.shift(oa[ai].ind, 32, &cmp_buf[0], kMaxMsoLen, vw.in_, zz, 3);
150 assert_attribute(32, oa[ai].len, &cmp_buf[0], &oa[ai].v1[0]);
157 void assert_attribute(
size_t max,
const v8& vlen,
const v8 got[],
158 const v8 want[])
const {
159 for (
size_t j = 0; j < max; ++j) {
160 auto ll = lc_.vlt(j, vlen);
161 auto cmp = lc_.veq(got[j], want[j]);
162 lc_.assert_implies(&ll, cmp);