Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
aes128_constraint.cpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: not started, auditors: [], date: YYYY-MM-DD }
3// external_1: { status: not started, auditors: [], date: YYYY-MM-DD }
4// external_2: { status: not started, auditors: [], date: YYYY-MM-DD }
5// =====================
6
10#include <cstdint>
11#include <cstdio>
12#include <span>
13
14using namespace bb;
15
16namespace acir_format {
17
18template <typename Builder> void create_aes128_constraints(Builder& builder, const AES128Constraint& constraint)
19{
20
22
23 // Packs 16 bytes from the inputs (plaintext, iv, key) into a field element
24 const auto convert_input =
26 field_ct converted = 0;
27 for (size_t i = 0; i < 16 - padding; ++i) {
28 converted *= 256;
29 field_ct byte = to_field_ct(inputs[i], builder);
30 converted += byte;
31 }
32 for (size_t i = 0; i < padding; ++i) {
33 converted *= 256;
34 field_ct byte = padding;
35 converted += byte;
36 }
37 return converted;
38 };
39
40 // Packs 16 bytes from the outputs (witness indexes) into a field element for comparison
41 const auto convert_output = [&](std::span<const uint32_t, 16> outputs) {
42 field_ct converted = 0;
43 for (const auto& output : outputs) {
44 converted *= 256;
46 converted += byte;
47 }
48 return converted;
49 };
50
51 const size_t padding_size = 16 - constraint.inputs.size() % 16;
52
53 // Perform the conversions from array of bytes to field elements
54 std::vector<field_ct> converted_inputs;
55 for (size_t i = 0; i < constraint.inputs.size(); i += 16) {
56 field_ct to_add;
57 if (i + 16 > constraint.inputs.size()) {
58 to_add =
59 convert_input(std::span<const WitnessOrConstant<bb::fr>, std::dynamic_extent>{ &constraint.inputs[i],
60 16 - padding_size },
61 padding_size,
62 builder);
63 } else {
64 to_add =
65 convert_input(std::span<const WitnessOrConstant<bb::fr>, 16>{ &constraint.inputs[i], 16 }, 0, builder);
66 }
67 converted_inputs.emplace_back(to_add);
68 }
69
70 std::vector<field_ct> converted_outputs;
71 for (size_t i = 0; i < constraint.outputs.size(); i += 16) {
72 std::span<const uint32_t, 16> outputs{ &constraint.outputs[i], 16 };
73 converted_outputs.emplace_back(convert_output(outputs));
74 }
75
76 const std::vector<field_ct> output_bytes = bb::stdlib::aes128::encrypt_buffer_cbc<Builder>(
77 converted_inputs, convert_input(constraint.iv, 0, builder), convert_input(constraint.key, 0, builder));
78
79 for (size_t i = 0; i < output_bytes.size(); ++i) {
80 builder.assert_equal(output_bytes[i].normalize().witness_index, converted_outputs[i].normalize().witness_index);
81 }
82}
83
85 const AES128Constraint& constraint);
86
88 const AES128Constraint& constraint);
89
90} // namespace acir_format
static field_t from_witness_index(Builder *ctx, uint32_t witness_index)
Definition field.cpp:59
AluTraceBuilder builder
Definition alu.test.cpp:123
template void create_aes128_constraints< MegaCircuitBuilder >(MegaCircuitBuilder &builder, const AES128Constraint &constraint)
template void create_aes128_constraints< UltraCircuitBuilder >(UltraCircuitBuilder &builder, const AES128Constraint &constraint)
void create_aes128_constraints(Builder &builder, const AES128Constraint &constraint)
bb::stdlib::field_t< Builder > to_field_ct(const WitnessOrConstant< FF > &input, Builder &builder)
Entry point for Barretenberg command-line interface.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::array< WitnessOrConstant< bb::fr >, 16 > iv
std::vector< uint32_t > outputs
std::vector< WitnessOrConstant< bb::fr > > inputs
std::array< WitnessOrConstant< bb::fr >, 16 > key