18static constexpr uint64_t AES_BASE = 9;
28 const auto byte = numeric::map_from_sparse_form<AES_BASE>(
key[0]);
29 return {
bb::fr(numeric::map_into_sparse_form<AES_BASE>(
byte)),
bb::fr(0) };
66 for (uint64_t i = 0; i < AES_BASE; ++i) {
68 uint64_t i_raw = i * AES_BASE * AES_BASE * AES_BASE;
70 uint64_t i_normalized = ((i & 1UL) == 1UL) * AES_BASE * AES_BASE * AES_BASE;
71 for (uint64_t j = 0; j < AES_BASE; ++j) {
73 uint64_t j_raw = j * AES_BASE * AES_BASE;
75 uint64_t j_normalized = ((j & 1UL) == 1UL) * AES_BASE * AES_BASE;
76 for (uint64_t k = 0; k < AES_BASE; ++k) {
78 uint64_t k_raw = k * AES_BASE;
80 uint64_t k_normalized = ((k & 1UL) == 1UL) * AES_BASE;
81 for (uint64_t m = 0; m < AES_BASE; ++m) {
85 uint64_t m_normalized = ((m & 1UL) == 1UL);
87 uint64_t left = i_raw + j_raw + k_raw + m_raw;
89 uint64_t right = i_normalized + j_normalized + k_normalized + m_normalized;
118 const size_t num_entries = 2;
119 std::vector<bb::fr> column_1_coefficients;
120 std::vector<bb::fr> column_2_coefficients;
121 std::vector<bb::fr> column_3_coefficients;
124 for (
size_t i = 0; i < num_entries; ++i) {
125 column_1_coefficients.emplace_back(
bb::fr(AES_BASE).pow(4 * i));
126 column_2_coefficients.emplace_back(
bb::fr(AES_BASE).pow(4 * i));
127 column_3_coefficients.emplace_back(0);
130 MultiTable table(column_1_coefficients, column_2_coefficients, column_3_coefficients);
133 for (
size_t i = 0; i < num_entries; ++i) {
134 table.
slice_sizes.emplace_back(AES_BASE * AES_BASE * AES_BASE * AES_BASE);
167 const size_t num_entries = 16;
172 for (
size_t i = 0; i < num_entries; ++i) {
175 table.
get_table_values.emplace_back(&sparse_tables::get_sparse_table_with_rotation_values<AES_BASE, 0>);
206 const auto byte = numeric::map_from_sparse_form<AES_BASE>(
key[0]);
208 uint8_t sbox_value = crypto::aes128_sbox[(uint8_t)
byte];
211 uint8_t swizzled = ((uint8_t)(sbox_value << 1) ^ (uint8_t)(((sbox_value >> 7) & 1) * 0x1b));
214 return {
bb::fr(numeric::map_into_sparse_form<AES_BASE>(sbox_value)),
215 bb::fr(numeric::map_into_sparse_form<AES_BASE>((uint8_t)(sbox_value ^ swizzled))) };
246 size_t table_size = 256;
248 for (uint64_t i = 0; i < table_size; ++i) {
249 const auto first = numeric::map_into_sparse_form<AES_BASE>((uint8_t)i);
250 uint8_t sbox_value = crypto::aes128_sbox[(uint8_t)i];
251 uint8_t swizzled = ((uint8_t)(sbox_value << 1) ^ (uint8_t)(((sbox_value >> 7) & 1) * 0x1b));
252 const auto second = numeric::map_into_sparse_form<AES_BASE>(sbox_value);
253 const auto third = numeric::map_into_sparse_form<AES_BASE>((uint8_t)(sbox_value ^ swizzled));
269 const size_t num_entries = 1;
274 for (
size_t i = 0; i < num_entries; ++i) {
constexpr uint64_t pow64(const uint64_t input, const uint64_t exponent)
MultiTable get_aes_input_table(const MultiTableId id=AES_INPUT)
Creates a MultiTable for converting a 128-bit AES input block into 16 sparse-form bytes.
std::array< bb::fr, 2 > get_aes_sbox_values_from_key(const std::array< uint64_t, 2 > key)
Computes AES S-box substitution and a derived value for MixColumns, returning both in sparse form.
BasicTable generate_aes_sparse_normalization_table(BasicTableId id, const size_t table_index)
Generates a BasicTable for normalizing 4 sparse digits back to valid sparse form.
MultiTable get_aes_normalization_table(const MultiTableId id=AES_NORMALIZE)
Creates a MultiTable for normalizing 8 sparse digits back to binary digits.
std::array< bb::fr, 2 > get_aes_sparse_normalization_values_from_key(const std::array< uint64_t, 2 > key)
Normalizes the sparse form by mapping from sparse form to bytes and back to sparse form.
BasicTable generate_aes_sbox_table(BasicTableId id, const size_t table_index)
Generates a plookup table for AES S-box substitution with precomputed MixColumns values.
MultiTable get_aes_sbox_table(const MultiTableId id=AES_SBOX)
field< Bn254FrParams > fr
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
A basic table from which we can perform lookups (for example, an xor table)
bb::fr column_2_step_size
bb::fr column_1_step_size
std::vector< bb::fr > column_3
std::vector< bb::fr > column_2
std::array< bb::fr, 2 >(* get_values_from_key)(const std::array< uint64_t, 2 >)
std::vector< bb::fr > column_1
bb::fr column_3_step_size
Container for managing multiple BasicTables plus the data needed to combine basic table outputs (e....
std::vector< BasicTableId > basic_table_ids
std::vector< uint64_t > slice_sizes
std::vector< table_out(*)(table_in)> get_table_values