Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
aes128.hpp
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
7#pragma once
8
13
14#include "sparse.hpp"
15#include "types.hpp"
16
18static constexpr uint64_t AES_BASE = 9;
19static constexpr uint64_t aes_normalization_table[AES_BASE]{
20 1, 0, 0, 0, 0, 0, 0, 0, 0,
21};
22
24{
25 const auto sparse = numeric::map_into_sparse_form<AES_BASE>(uint64_t(key[0]));
26 return { bb::fr(sparse), bb::fr(0) };
27}
28
29inline BasicTable generate_aes_sparse_table(BasicTableId id, const size_t table_index)
30{
31 BasicTable table;
32 table.id = id;
33 table.table_index = table_index;
34 size_t table_size = 256;
35 table.use_twin_keys = true;
36 for (uint64_t i = 0; i < table_size; ++i) {
37 uint64_t left = i;
38 const auto right = numeric::map_into_sparse_form<AES_BASE>((uint8_t)i);
39 table.column_1.emplace_back(bb::fr(left));
40 table.column_2.emplace_back(bb::fr(0));
41 table.column_3.emplace_back(bb::fr(right));
42 }
44
45 table.column_1_step_size = bb::fr(256);
46 table.column_2_step_size = bb::fr(0);
47 table.column_3_step_size = bb::fr(0);
48 return table;
49}
50
52{
53 const auto byte = numeric::map_from_sparse_form<AES_BASE>(key[0]);
54 return { bb::fr(numeric::map_into_sparse_form<AES_BASE>(byte)), bb::fr(0) };
55}
56
58{
59 BasicTable table;
60 table.id = id;
61 table.table_index = table_index;
62 for (uint64_t i = 0; i < AES_BASE; ++i) {
63 uint64_t i_raw = i * AES_BASE * AES_BASE * AES_BASE;
64 uint64_t i_normalized = ((i & 1UL) == 1UL) * AES_BASE * AES_BASE * AES_BASE;
65 for (uint64_t j = 0; j < AES_BASE; ++j) {
66 uint64_t j_raw = j * AES_BASE * AES_BASE;
67 uint64_t j_normalized = ((j & 1UL) == 1UL) * AES_BASE * AES_BASE;
68 for (uint64_t k = 0; k < AES_BASE; ++k) {
69 uint64_t k_raw = k * AES_BASE;
70 uint64_t k_normalized = ((k & 1UL) == 1UL) * AES_BASE;
71 for (uint64_t m = 0; m < AES_BASE; ++m) {
72 uint64_t m_raw = m;
73 uint64_t m_normalized = ((m & 1UL) == 1UL);
74 uint64_t left = i_raw + j_raw + k_raw + m_raw;
75 uint64_t right = i_normalized + j_normalized + k_normalized + m_normalized;
76 table.column_1.emplace_back(left);
77 table.column_2.emplace_back(right);
78 table.column_3.emplace_back(bb::fr(0));
79 }
80 }
81 }
82 }
83 table.use_twin_keys = false;
85
86 table.column_1_step_size = bb::fr(6561);
87 table.column_2_step_size = bb::fr(6561);
88 table.column_3_step_size = bb::fr(0);
89 return table;
90}
91
93{
94 const size_t num_entries = 2;
95 std::vector<bb::fr> column_1_coefficients;
96 std::vector<bb::fr> column_2_coefficients;
97 std::vector<bb::fr> column_3_coefficients;
98
99 for (size_t i = 0; i < num_entries; ++i) {
100 column_1_coefficients.emplace_back(bb::fr(AES_BASE).pow(4 * i));
101 column_2_coefficients.emplace_back(bb::fr(AES_BASE).pow(4 * i));
102 column_3_coefficients.emplace_back(0);
103 }
104
105 MultiTable table(column_1_coefficients, column_2_coefficients, column_3_coefficients);
106
107 table.id = id;
108 for (size_t i = 0; i < num_entries; ++i) {
109 table.slice_sizes.emplace_back(AES_BASE * AES_BASE * AES_BASE * AES_BASE);
110 table.basic_table_ids.emplace_back(AES_SPARSE_NORMALIZE);
112 }
113 return table;
114}
115
117{
118 const size_t num_entries = 16;
119
120 MultiTable table(256, 0, 0, num_entries);
121
122 table.id = id;
123 for (size_t i = 0; i < num_entries; ++i) {
124 table.slice_sizes.emplace_back(256);
125 table.basic_table_ids.emplace_back(AES_SPARSE_MAP);
126 table.get_table_values.emplace_back(&sparse_tables::get_sparse_table_with_rotation_values<AES_BASE, 0>);
127 }
128 return table;
129}
130
132{
133 const auto byte = numeric::map_from_sparse_form<AES_BASE>(key[0]);
134 uint8_t sbox_value = crypto::aes128_sbox[(uint8_t)byte];
135 uint8_t swizzled = ((uint8_t)(sbox_value << 1) ^ (uint8_t)(((sbox_value >> 7) & 1) * 0x1b));
136 return { bb::fr(numeric::map_into_sparse_form<AES_BASE>(sbox_value)),
137 bb::fr(numeric::map_into_sparse_form<AES_BASE>((uint8_t)(sbox_value ^ swizzled))) };
138}
139
140inline BasicTable generate_aes_sbox_table(BasicTableId id, const size_t table_index)
141{
142 BasicTable table;
143 table.id = id;
144 table.table_index = table_index;
145 size_t table_size = 256;
146 table.use_twin_keys = false;
147 for (uint64_t i = 0; i < table_size; ++i) {
148 const auto first = numeric::map_into_sparse_form<AES_BASE>((uint8_t)i);
149 uint8_t sbox_value = crypto::aes128_sbox[(uint8_t)i];
150 uint8_t swizzled = ((uint8_t)(sbox_value << 1) ^ (uint8_t)(((sbox_value >> 7) & 1) * 0x1b));
151 const auto second = numeric::map_into_sparse_form<AES_BASE>(sbox_value);
152 const auto third = numeric::map_into_sparse_form<AES_BASE>((uint8_t)(sbox_value ^ swizzled));
153
154 table.column_1.emplace_back(bb::fr(first));
155 table.column_2.emplace_back(bb::fr(second));
156 table.column_3.emplace_back(bb::fr(third));
157 }
159
160 table.column_1_step_size = bb::fr(0);
161 table.column_2_step_size = bb::fr(0);
162 table.column_3_step_size = bb::fr(0);
163 return table;
164}
165
167{
168 const size_t num_entries = 1;
169
170 MultiTable table(0, 0, 0, 1);
171
172 table.id = id;
173 for (size_t i = 0; i < num_entries; ++i) {
174 table.slice_sizes.emplace_back(numeric::pow64(AES_BASE, 8));
175 table.basic_table_ids.emplace_back(AES_SBOX_MAP);
177 }
178 return table;
179}
180} // namespace bb::plookup::aes128_tables
constexpr uint64_t pow64(const uint64_t input, const uint64_t exponent)
Definition pow.hpp:13
MultiTable get_aes_input_table(const MultiTableId id=AES_INPUT)
Definition aes128.hpp:116
std::array< bb::fr, 2 > get_aes_sbox_values_from_key(const std::array< uint64_t, 2 > key)
Definition aes128.hpp:131
std::array< bb::fr, 2 > get_aes_sparse_values_from_key(const std::array< uint64_t, 2 > key)
Definition aes128.hpp:23
BasicTable generate_aes_sparse_normalization_table(BasicTableId id, const size_t table_index)
Definition aes128.hpp:57
BasicTable generate_aes_sparse_table(BasicTableId id, const size_t table_index)
Definition aes128.hpp:29
MultiTable get_aes_normalization_table(const MultiTableId id=AES_NORMALIZE)
Definition aes128.hpp:92
std::array< bb::fr, 2 > get_aes_sparse_normalization_values_from_key(const std::array< uint64_t, 2 > key)
Definition aes128.hpp:51
BasicTable generate_aes_sbox_table(BasicTableId id, const size_t table_index)
Definition aes128.hpp:140
MultiTable get_aes_sbox_table(const MultiTableId id=AES_SBOX)
Definition aes128.hpp:166
@ AES_SBOX_MAP
Definition types.hpp:24
@ AES_SPARSE_MAP
Definition types.hpp:23
@ AES_SPARSE_NORMALIZE
Definition types.hpp:25
@ AES_NORMALIZE
Definition types.hpp:97
field< Bn254FrParams > fr
Definition fr.hpp:174
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
A basic table from which we can perform lookups (for example, an xor table)
Definition types.hpp:348
std::vector< bb::fr > column_3
Definition types.hpp:383
std::vector< bb::fr > column_2
Definition types.hpp:382
std::array< bb::fr, 2 >(* get_values_from_key)(const std::array< uint64_t, 2 >)
Definition types.hpp:391
std::vector< bb::fr > column_1
Definition types.hpp:381
Container for managing multiple BasicTables plus the data needed to combine basic table outputs (e....
Definition types.hpp:154
std::vector< BasicTableId > basic_table_ids
Definition types.hpp:160
std::vector< uint64_t > slice_sizes
Definition types.hpp:161
std::vector< table_out(*)(table_in)> get_table_values
Definition types.hpp:168