3#include "barretenberg/crypto/aes128/aes128.hpp"
4#include "barretenberg/numeric/bitop/rotate.hpp"
5#include "barretenberg/numeric/bitop/sparse_form.hpp"
6#include "barretenberg/numeric/uint256/uint256.hpp"
12namespace aes128_tables {
13static constexpr uint64_t AES_BASE = 9;
14static constexpr uint64_t aes_normalization_table[AES_BASE]{
15 1, 0, 0, 0, 0, 0, 0, 0, 0,
18inline std::array<barretenberg::fr, 2> get_aes_sparse_values_from_key(
const std::array<uint64_t, 2> key)
20 const auto sparse = numeric::map_into_sparse_form<AES_BASE>(uint64_t(key[0]));
24inline BasicTable generate_aes_sparse_table(BasicTableId
id,
const size_t table_index)
28 table.table_index = table_index;
30 table.use_twin_keys =
true;
31 for (uint64_t i = 0; i < table.size; ++i) {
33 const auto right = numeric::map_into_sparse_form<AES_BASE>((uint8_t)i);
38 table.get_values_from_key = &get_aes_sparse_values_from_key;
46inline std::array<barretenberg::fr, 2> get_aes_sparse_normalization_values_from_key(
const std::array<uint64_t, 2> key)
48 const auto byte = numeric::map_from_sparse_form<AES_BASE>(key[0]);
52inline BasicTable generate_aes_sparse_normalization_table(BasicTableId
id,
const size_t table_index)
56 table.table_index = table_index;
57 for (uint64_t i = 0; i < AES_BASE; ++i) {
58 uint64_t i_raw = i * AES_BASE * AES_BASE * AES_BASE;
59 uint64_t i_normalized = ((i & 1UL) == 1UL) * AES_BASE * AES_BASE * AES_BASE;
60 for (uint64_t j = 0; j < AES_BASE; ++j) {
61 uint64_t j_raw = j * AES_BASE * AES_BASE;
62 uint64_t j_normalized = ((j & 1UL) == 1UL) * AES_BASE * AES_BASE;
63 for (uint64_t k = 0; k < AES_BASE; ++k) {
64 uint64_t k_raw = k * AES_BASE;
65 uint64_t k_normalized = ((k & 1UL) == 1UL) * AES_BASE;
66 for (uint64_t m = 0; m < AES_BASE; ++m) {
68 uint64_t m_normalized = ((m & 1UL) == 1UL);
69 uint64_t left = i_raw + j_raw + k_raw + m_raw;
70 uint64_t right = i_normalized + j_normalized + k_normalized + m_normalized;
71 table.column_1.emplace_back(left);
72 table.column_2.emplace_back(right);
78 table.size = table.column_1.size();
79 table.use_twin_keys =
false;
80 table.get_values_from_key = &get_aes_sparse_normalization_values_from_key;
88inline MultiTable get_aes_normalization_table(
const MultiTableId
id = AES_NORMALIZE)
90 const size_t num_entries = 2;
91 std::vector<barretenberg::fr> column_1_coefficients;
92 std::vector<barretenberg::fr> column_2_coefficients;
93 std::vector<barretenberg::fr> column_3_coefficients;
95 for (
size_t i = 0; i < num_entries; ++i) {
98 column_3_coefficients.emplace_back(0);
101 MultiTable table(column_1_coefficients, column_2_coefficients, column_3_coefficients);
104 for (
size_t i = 0; i < num_entries; ++i) {
105 table.slice_sizes.emplace_back(AES_BASE * AES_BASE * AES_BASE * AES_BASE);
106 table.lookup_ids.emplace_back(AES_SPARSE_NORMALIZE);
107 table.get_table_values.emplace_back(&get_aes_sparse_normalization_values_from_key);
112inline MultiTable get_aes_input_table(
const MultiTableId
id = AES_INPUT)
114 const size_t num_entries = 16;
116 MultiTable table(256, 0, 0, num_entries);
119 for (
size_t i = 0; i < num_entries; ++i) {
120 table.slice_sizes.emplace_back(256);
121 table.lookup_ids.emplace_back(AES_SPARSE_MAP);
122 table.get_table_values.emplace_back(&sparse_tables::get_sparse_table_with_rotation_values<AES_BASE, 0>);
127inline std::array<barretenberg::fr, 2> get_aes_sbox_values_from_key(
const std::array<uint64_t, 2> key)
129 const auto byte = numeric::map_from_sparse_form<AES_BASE>(key[0]);
130 uint8_t sbox_value = crypto::aes128::sbox[(uint8_t)
byte];
131 uint8_t swizzled = ((uint8_t)(sbox_value << 1) ^ (uint8_t)(((sbox_value >> 7) & 1) * 0x1b));
132 return {
barretenberg::fr(numeric::map_into_sparse_form<AES_BASE>(sbox_value)),
133 barretenberg::fr(numeric::map_into_sparse_form<AES_BASE>((uint8_t)(sbox_value ^ swizzled))) };
136inline BasicTable generate_aes_sbox_table(BasicTableId
id,
const size_t table_index)
140 table.table_index = table_index;
142 table.use_twin_keys =
false;
143 for (uint64_t i = 0; i < table.size; ++i) {
144 const auto first = numeric::map_into_sparse_form<AES_BASE>((uint8_t)i);
145 uint8_t sbox_value = crypto::aes128::sbox[(uint8_t)i];
146 uint8_t swizzled = ((uint8_t)(sbox_value << 1) ^ (uint8_t)(((sbox_value >> 7) & 1) * 0x1b));
147 const auto second = numeric::map_into_sparse_form<AES_BASE>(sbox_value);
148 const auto third = numeric::map_into_sparse_form<AES_BASE>((uint8_t)(sbox_value ^ swizzled));
154 table.get_values_from_key = get_aes_sbox_values_from_key;
162inline MultiTable get_aes_sbox_table(
const MultiTableId
id = AES_SBOX)
164 const size_t num_entries = 1;
166 MultiTable table(0, 0, 0, 1);
169 for (
size_t i = 0; i < num_entries; ++i) {
170 table.slice_sizes.emplace_back(numeric::pow64(AES_BASE, 8));
171 table.lookup_ids.emplace_back(AES_SBOX_MAP);
172 table.get_table_values.emplace_back(&get_aes_sbox_values_from_key);