34 using EltW =
typename LogicCircuit::EltW;
35 using BitW =
typename LogicCircuit::BitW;
36 using Nat =
typename Field::N;
39 using v8 =
typename LogicCircuit::v8;
40 using v256 =
typename LogicCircuit::v256;
44 using ShaBlockWitness =
typename Flatsha::BlockWitness;
45 using sha_packed_v32 =
typename Flatsha::packed_v32;
46 using vind =
typename LogicCircuit::template bitvec<kJWTIndexBits>;
57 EcdsaWitness jwt_sig_;
58 v8 preimage_[64 * kMaxJWTSHABlocks];
60 ShaBlockWitness sha_[kMaxJWTSHABlocks];
62 std::vector<vind> attr_ind_;
63 std::vector<v8> attr_id_len_;
64 std::vector<v8> attr_value_len_;
65 vind payload_ind_, payload_len_;
72 for (
size_t i = 0; i < 64 * kMaxJWTSHABlocks; ++i) {
73 preimage_[i] = lc.template vinput<8>();
75 e_bits_ = lc.template vinput<256>();
76 for (
size_t j = 0; j < kMaxJWTSHABlocks; ++j) {
79 nb_ = lc.template vinput<8>();
81 for (
size_t j = 0; j < na; ++j) {
82 attr_ind_.push_back(lc.template vinput<kJWTIndexBits>());
83 attr_id_len_.push_back(lc.template vinput<8>());
84 attr_value_len_.push_back(lc.template vinput<8>());
86 payload_ind_ = lc.template vinput<kJWTIndexBits>();
87 payload_len_ = lc.template vinput<kJWTIndexBits>();
91 explicit JWT(
const LogicCircuit& lc,
const EC& ec,
const Nat& order)
92 : lc_(lc), ec_(ec), order_(order), sha_(lc), r_(lc) {}
106 void assert_jwt_attributes(EltW pkX, EltW pkY,
109 Ecdsa ecc(lc_, ec_, order_);
111 ecc.verify_signature3(pkX, pkY, vw.e_, vw.jwt_sig_);
113 sha_.assert_message_hash(kMaxJWTSHABlocks, vw.nb_, vw.preimage_, vw.e_bits_,
115 lc_.vassert_is_bit(vw.e_bits_);
118 auto twok = lc_.one();
119 auto est = lc_.konst(0);
120 for (
size_t i = 0; i < 256; ++i) {
121 est = lc_.axpy(&est, twok, lc_.eval(vw.e_bits_[i]));
122 lc_.f_.add(twok, twok);
124 lc_.assert_eq(&est, vw.e_);
127 const v8 zz = lc_.template vbit<8>(0);
128 std::vector<v8> shift_buf(64 * kMaxJWTSHABlocks);
131 r_.shift(vw.payload_ind_, 64 * (kMaxJWTSHABlocks - 2), shift_buf.data(),
132 64 * kMaxJWTSHABlocks, vw.preimage_, zz, 3);
136 std::vector<v8> dec_buf(64 * kMaxJWTSHABlocks);
137 Base64Decoder<LogicCircuit> b64(lc_);
138 b64.base64_rawurl_decode_len(shift_buf.data(), dec_buf.data(),
139 64 * (kMaxJWTSHABlocks - 2), vw.payload_len_);
144 for (
size_t i = 0; i < vw.attr_ind_.size(); ++i) {
145 v8 B[32 + 3 + 64 + 1];
148 r_.shift(vw.attr_ind_[i], 100, B, dec_buf.size(), dec_buf.data(), zz, 3);
149 assert_string_eq(32, vw.attr_id_len_[i], B, oa[i].attr);
151 r_.shift(vw.attr_id_len_[i], 100, B, 100, B, zz, 3);
152 uint8_t sep[3] = {
'"',
':',
'"'};
153 for (
size_t j = 0; j < 3; ++j) {
154 auto want_j = lc_.template vbit<8>(sep[j]);
155 lc_.vassert_eq(&B[j], want_j);
158 auto three = lc_.template vbit<2>(3);
159 r_.shift(three, 100, B, 100, B, zz, 3);
161 assert_string_eq(64, vw.attr_value_len_[i], B, oa[i].v1);
163 r_.shift(vw.attr_value_len_[i], 100, B, 100, B, zz, 3);
165 auto end_quote = lc_.template vbit<8>(
'"');
166 lc_.vassert_eq(&B[0], end_quote);
170 void assert_string_eq(
size_t max,
const v8& len,
const v8 got[],
171 const v8 want[])
const {
172 for (
size_t j = 0; j < max; ++j) {
173 auto ll = lc_.vlt(j, len);
174 auto same = lc_.eq(8, got[j].data(), want[j].data());
175 lc_.assert_implies(&ll, same);
180 const LogicCircuit& lc_;
184 Routing<LogicCircuit> r_;