32 static constexpr size_t kNCounters = CborConstants::kNCounters;
33 static constexpr size_t kIndexBits = CborConstants::kIndexBits;
34 using counters = std::array<size_t, kNCounters>;
35 using vindex = std::array<Elt, kIndexBits>;
38 Elt encoded_sel_header;
41 size_t slen_next_debug;
53 using v8 = std::array<Elt, 8>;
55 explicit CborWitness(
const Field& F) : f_(F) {}
58 vindex index(
size_t j)
const {
61 for (
size_t i = 0; i < kIndexBits; ++i) {
62 r[i] = F.of_scalar((j >> i) & 1);
67 void fill_witnesses(
size_t n,
size_t input_len,
const uint8_t bytes[],
75 size_t top_level_items;
82 for (
size_t i = 0; i < n; ++i) {
84 bool header = (slen == 1);
85 cc = counters_next(bytes[i], header,
87 (i + 1) < n ? bytes[i + 1] : 0, cc,
89 proofs::check(!overflow,
"!overflow");
90 slen = next_slen(slen, n, bytes, i);
93 top_level_items = (n + 1) - cc[0];
98 counters cc{{top_level_items}};
99 Elt prod_parse = F.one();
100 Elt prod_decode = F.one();
103 for (
size_t i = 0; i < n; ++i) {
105 bool header = (slen == 1);
110 proofs::check(input_len <= n,
"input_len <= n");
111 if (i + input_len < n) {
112 proofs::check(bytes[i] == 0,
"bytes[i] == 0");
116 for (
size_t j = 0; j < 8; ++j) {
117 in[i][j] = F.of_scalar((bytes[i] >> j) & 1);
121 F.mul(prod_decode, F.of_scalar(slen - 1));
125 size_t isel = kNCounters;
126 for (
size_t l = kNCounters; l-- > 0;) {
129 F.mul(prod_parse, F.of_scalar(cc[l]));
136 cc = counters_next(bytes[i], header,
138 (i + 1) < n ? bytes[i + 1] : 0, cc,
140 proofs::check(!overflow,
"!overflow");
142 gw.cc0 = F.of_scalar(cc[0]);
147 size_t slen_next = next_slen(slen, n, bytes, i);
148 pw[i].slen_next_debug = slen_next;
151 pw[i].encoded_sel_header =
152 cbor_plucker_point<Field, kNCounters>()(header, isel, F);
153 pw[i].isel_debug = isel;
159 gw.invprod_decode = F.invertf(prod_decode);
160 gw.invprod_parse = F.invertf(prod_parse);
165 static size_t next_slen(
size_t slen,
size_t n,
const uint8_t bytes[],
167 size_t slenm1 = slen - 1;
168 bool header = (slenm1 == 0);
171 return item_length(bytes[i],
true, bytes[i + 1]);
173 return item_length(bytes[i],
false, 0);
181 static size_t item_length(uint8_t b,
bool valid_nextb, uint8_t nextb) {
182 size_t type = (b >> 5) & 0x7u;
183 size_t count = b & 0x1Fu;
184 bool count0_23 = (count < 24);
185 bool count24 = (count == 24);
195 }
else if (count24) {
198 check(
false,
"unwitnessed count (atom)");
206 }
else if (count24) {
210 check(
false,
"invalid nextb");
214 check(
false,
"unwitnessed count (bytes)");
219 check(
false,
"unwitnessed special");
223 check(
false,
"can't happen");
228 static size_t decode_count(
size_t count_in_header,
bool have_nextb,
230 if (count_in_header < 24) {
231 return count_in_header;
232 }
else if (count_in_header == 24) {
236 check(
false,
"!have_nextb");
239 check(
false,
"count > 24");
244 static counters counters_next(uint8_t b,
bool header,
bool have_nextb,
245 uint8_t nextb,
const counters& c,
247 size_t type = (b >> 5) & 0x7u;
248 size_t count_in_header = b & 0x1Fu;
249 bool tagp = (type == 6);
250 bool arrayp = (type == 4);
251 bool mapp = (type == 5);
256 for (
size_t l = kNCounters; l-- > 0;) {
262 if (l + 1 < kNCounters) {
268 if (l + 1 < kNCounters) {
269 c1[l + 1] = decode_count(count_in_header, have_nextb, nextb);
274 if (l + 1 < kNCounters) {
275 c1[l + 1] = 2 * decode_count(count_in_header, have_nextb, nextb);