33 static constexpr size_t kNCounters = CborConstants::kNCounters;
34 static constexpr size_t kIndexBits = CborConstants::kIndexBits;
35 using counters = std::array<size_t, kNCounters>;
36 using vindex = std::array<Elt, kIndexBits>;
39 Elt encoded_sel_header;
42 size_t slen_next_debug;
54 using v8 = std::array<Elt, 8>;
56 explicit CborWitness(
const Field& F) : f_(F) {}
59 vindex index(
size_t j)
const {
62 for (
size_t i = 0; i < kIndexBits; ++i) {
63 r[i] = F.of_scalar((j >> i) & 1);
68 void fill_witnesses(
size_t n,
size_t input_len,
const uint8_t bytes[],
76 size_t top_level_items;
83 for (
size_t i = 0; i < n; ++i) {
85 bool header = (slen == 1);
86 cc = counters_next(bytes[i], header,
88 (i + 1) < n ? bytes[i + 1] : 0, cc,
90 proofs::check(!overflow,
"!overflow");
91 slen = next_slen(slen, n, bytes, i);
94 top_level_items = (n + 1) - cc[0];
99 counters cc{{top_level_items}};
100 Elt prod_parse = F.one();
101 Elt prod_decode = F.one();
104 for (
size_t i = 0; i < n; ++i) {
106 bool header = (slen == 1);
111 proofs::check(input_len <= n,
"input_len <= n");
112 if (i + input_len < n) {
113 proofs::check(bytes[i] == 0,
"bytes[i] == 0");
117 for (
size_t j = 0; j < 8; ++j) {
118 in[i][j] = F.of_scalar((bytes[i] >> j) & 1);
122 F.mul(prod_decode, F.znz_indicator(F.as_counter(slen - 1)));
126 size_t isel = kNCounters;
127 for (
size_t l = kNCounters; l-- > 0;) {
130 F.mul(prod_parse, F.znz_indicator(F.as_counter(cc[l])));
137 cc = counters_next(bytes[i], header,
139 (i + 1) < n ? bytes[i + 1] : 0, cc,
141 proofs::check(!overflow,
"!overflow");
143 gw.cc0_counter = F.as_counter(cc[0]);
148 size_t slen_next = next_slen(slen, n, bytes, i);
149 pw[i].slen_next_debug = slen_next;
152 pw[i].encoded_sel_header =
153 cbor_plucker_point<Field, kNCounters>()(header, isel, F);
154 pw[i].isel_debug = isel;
160 gw.invprod_decode = F.invertf(prod_decode);
161 gw.invprod_parse = F.invertf(prod_parse);
166 static size_t next_slen(
size_t slen,
size_t n,
const uint8_t bytes[],
168 size_t slenm1 = slen - 1;
169 bool header = (slenm1 == 0);
172 return item_length(bytes[i],
true, bytes[i + 1]);
174 return item_length(bytes[i],
false, 0);
182 static size_t item_length(uint8_t b,
bool valid_nextb, uint8_t nextb) {
183 size_t type = (b >> 5) & 0x7u;
184 size_t count = b & 0x1Fu;
185 bool count0_23 = (count < 24);
186 bool count24 = (count == 24);
187 bool count25 = (count == 25);
188 bool count26 = (count == 26);
189 bool count27 = (count == 27);
197 }
else if (count24) {
199 }
else if (count25) {
201 }
else if (count26) {
203 }
else if (count27) {
206 check(
false,
"unwitnessed count (atom)");
214 }
else if (count24) {
217 check(
false,
"unwitnessed count (item)");
225 }
else if (count24) {
229 check(
false,
"invalid nextb");
233 check(
false,
"unwitnessed count (bytes)");
238 check(
false,
"unwitnessed special");
242 check(
false,
"can't happen");
247 static size_t decode_count(
size_t count_in_header,
bool have_nextb,
249 if (count_in_header < 24) {
250 return count_in_header;
251 }
else if (count_in_header == 24) {
255 check(
false,
"!have_nextb");
258 check(
false,
"count > 24");
263 static counters counters_next(uint8_t b,
bool header,
bool have_nextb,
264 uint8_t nextb,
const counters& c,
266 size_t type = (b >> 5) & 0x7u;
267 size_t count_in_header = b & 0x1Fu;
268 bool tagp = (type == 6);
269 bool arrayp = (type == 4);
270 bool mapp = (type == 5);
275 for (
size_t l = kNCounters; l-- > 0;) {
281 if (l + 1 < kNCounters) {
287 if (l + 1 < kNCounters) {
288 c1[l + 1] = decode_count(count_in_header, have_nextb, nextb);
293 if (l + 1 < kNCounters) {
294 c1[l + 1] = 2 * decode_count(count_in_header, have_nextb, nextb);