30 uint8_t config = Data[0];
31 bool key_as_witness = (config & 0x01) != 0;
32 bool iv_as_witness = (config & 0x02) != 0;
35 std::vector<uint8_t> key_vec(Data + 1, Data + 17);
38 std::vector<uint8_t> iv_vec(Data + 17, Data + 33);
41 size_t data_offset = 33;
42 size_t num_blocks = (Size > data_offset) ? (Size - data_offset) / 17 : 1;
46 std::vector<uint8_t> block_config;
47 for (
size_t i = 0; i < num_blocks; ++i) {
48 if (data_offset + i < Size) {
49 block_config.push_back(Data[data_offset + i]);
51 block_config.push_back(0);
55 std::vector<uint8_t> input_vec;
56 size_t input_start = data_offset + num_blocks;
57 for (
size_t i = 0; i < num_blocks * 16; ++i) {
58 if (input_start + i < Size) {
59 input_vec.push_back(Data[input_start + i]);
61 input_vec.push_back(0);
65 const auto convert_bytes = [](
const std::vector<uint8_t>&
data) {
67 for (uint64_t i = 0; i < 16; ++i) {
74 for (
size_t i = 0; i < num_blocks; ++i) {
75 auto block_start = std::next(input_vec.begin(),
static_cast<ptrdiff_t
>(i * 16));
76 auto block_end = std::next(input_vec.begin(),
static_cast<ptrdiff_t
>((i + 1) * 16));
77 std::vector<uint8_t> block(block_start, block_end);
78 bool as_witness = (block_config[i] & 0x01) != 0;
88 std::vector<uint8_t> circuit_bytes;
89 for (
const auto& field_elem : circuit_output) {
91 std::vector<uint8_t> block_bytes;
92 for (uint64_t i = 15; i !=
static_cast<uint64_t
>(-1); --i) {
93 block_bytes.push_back(
static_cast<uint8_t
>((
value >> (i * 8)) & 0xFF));
95 circuit_bytes.insert(circuit_bytes.end(), block_bytes.begin(), block_bytes.end());
99 std::vector<uint8_t> ref_input = input_vec;
100 std::vector<uint8_t> ref_iv = iv_vec;
104 if (circuit_bytes.size() != ref_input.size()) {
106 assert(
false &&
"Circuit and reference output sizes don't match");
110 for (
size_t i = 0; i < circuit_bytes.size(); ++i) {
111 if (circuit_bytes[i] != ref_input[i]) {
113 assert(
false &&
"Circuit output doesn't match reference implementation");