45 constexpr static size_t kMaxSHABlocks = SHABlocks;
46 using EltW =
typename LogicCircuit::EltW;
47 using BitW =
typename LogicCircuit::BitW;
48 using Nat =
typename Field::N;
51 using v8 =
typename LogicCircuit::v8;
52 using v256 =
typename LogicCircuit::v256;
56 using ShaBlockWitness =
typename Flatsha::BlockWitness;
57 using sha_packed_v32 =
typename Flatsha::packed_v32;
58 using vind =
typename LogicCircuit::template bitvec<kJWTIndexBits>;
64 void input(
const LogicCircuit& lc) {
65 for (
size_t i = 0; i < 128; ++i) {
66 pattern[i] = lc.template vinput<8>();
68 len = lc.template vinput<8>();
74 EltW e_, dpkx_, dpky_;
75 EcdsaWitness jwt_sig_, kb_sig_;
76 v8 preimage_[64 * kMaxSHABlocks];
78 ShaBlockWitness sha_[kMaxSHABlocks];
80 std::vector<vind> attr_ind_;
81 vind payload_ind_, payload_len_;
89 for (
size_t i = 0; i < 64 * kMaxSHABlocks; ++i) {
90 preimage_[i] = lc.template vinput<8>();
92 e_bits_ = lc.template vinput<256>();
93 for (
size_t j = 0; j < kMaxSHABlocks; ++j) {
96 nb_ = lc.template vinput<8>();
98 for (
size_t j = 0; j < na; ++j) {
99 attr_ind_.push_back(lc.template vinput<kJWTIndexBits>());
101 payload_ind_ = lc.template vinput<kJWTIndexBits>();
102 payload_len_ = lc.template vinput<kJWTIndexBits>();
106 explicit JWT(
const LogicCircuit& lc,
const EC& ec,
const Nat& order)
107 : lc_(lc), ec_(ec), order_(order), sha_(lc), r_(lc) {
108 check(1 << kJWTIndexBits > kMaxSHABlocks * 64 - 9,
109 "JWT index bits too small");
124 void assert_jwt_attributes(EltW pkX, EltW pkY,
128 Ecdsa ecc(lc_, ec_, order_);
130 ecc.verify_signature3(pkX, pkY, vw.e_, vw.jwt_sig_);
131 ecc.verify_signature3(vw.dpkx_, vw.dpky_, e2, vw.kb_sig_);
133 sha_.assert_message_hash(kMaxSHABlocks, vw.nb_, vw.preimage_, vw.e_bits_,
135 lc_.vassert_is_bit(vw.e_bits_);
138 auto twok = lc_.one();
139 auto est = lc_.konst(0);
140 for (
size_t i = 0; i < 256; ++i) {
141 est = lc_.axpy(&est, twok, lc_.eval(vw.e_bits_[i]));
142 lc_.f_.add(twok, twok);
144 lc_.assert_eq(&est, vw.e_);
147 const v8 zz = lc_.template vbit<8>(0);
148 std::vector<v8> shift_buf(64 * kMaxSHABlocks);
151 r_.shift(vw.payload_ind_, 64 * (kMaxSHABlocks - 2), shift_buf.data(),
152 64 * kMaxSHABlocks, vw.preimage_, zz, 3);
156 std::vector<v8> dec_buf(64 * kMaxSHABlocks);
157 Base64Decoder<LogicCircuit> b64(lc_);
158 b64.base64_rawurl_decode_len(shift_buf.data(), dec_buf.data(),
159 64 * (kMaxSHABlocks - 2), vw.payload_len_);
164 for (
size_t i = 0; i < vw.attr_ind_.size(); ++i) {
168 r_.shift(vw.attr_ind_[i], 128, B, dec_buf.size(), dec_buf.data(), zz, 3);
169 assert_string_eq(128, oa[i].len, B, oa[i].pattern);
173 void assert_string_eq(
size_t max,
const v8& len,
const v8 got[],
174 const v8 want[])
const {
175 for (
size_t j = 0; j < max; ++j) {
176 auto ll = lc_.vlt(j, len);
177 auto same = lc_.eq(8, got[j].data(), want[j].data());
178 lc_.assert_implies(&ll, same);
183 const LogicCircuit& lc_;
187 Routing<LogicCircuit> r_;