barretenberg
Loading...
Searching...
No Matches
aes128.hpp
1#pragma once
2
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"
7
8#include "sparse.hpp"
9#include "types.hpp"
10
11namespace plookup {
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,
16};
17
18inline std::array<barretenberg::fr, 2> get_aes_sparse_values_from_key(const std::array<uint64_t, 2> key)
19{
20 const auto sparse = numeric::map_into_sparse_form<AES_BASE>(uint64_t(key[0]));
21 return { barretenberg::fr(sparse), barretenberg::fr(0) };
22}
23
24inline BasicTable generate_aes_sparse_table(BasicTableId id, const size_t table_index)
25{
26 BasicTable table;
27 table.id = id;
28 table.table_index = table_index;
29 table.size = 256;
30 table.use_twin_keys = true;
31 for (uint64_t i = 0; i < table.size; ++i) {
32 uint64_t left = i;
33 const auto right = numeric::map_into_sparse_form<AES_BASE>((uint8_t)i);
34 table.column_1.emplace_back(barretenberg::fr(left));
35 table.column_2.emplace_back(barretenberg::fr(0));
36 table.column_3.emplace_back(barretenberg::fr(right));
37 }
38 table.get_values_from_key = &get_aes_sparse_values_from_key;
39
40 table.column_1_step_size = barretenberg::fr(256);
41 table.column_2_step_size = barretenberg::fr(0);
42 table.column_3_step_size = barretenberg::fr(0);
43 return table;
44}
45
46inline std::array<barretenberg::fr, 2> get_aes_sparse_normalization_values_from_key(const std::array<uint64_t, 2> key)
47{
48 const auto byte = numeric::map_from_sparse_form<AES_BASE>(key[0]);
49 return { barretenberg::fr(numeric::map_into_sparse_form<AES_BASE>(byte)), barretenberg::fr(0) };
50}
51
52inline BasicTable generate_aes_sparse_normalization_table(BasicTableId id, const size_t table_index)
53{
54 BasicTable table;
55 table.id = id;
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) {
67 uint64_t m_raw = 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);
73 table.column_3.emplace_back(barretenberg::fr(0));
74 }
75 }
76 }
77 }
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;
81
82 table.column_1_step_size = barretenberg::fr(6561);
83 table.column_2_step_size = barretenberg::fr(6561);
84 table.column_3_step_size = barretenberg::fr(0);
85 return table;
86}
87
88inline MultiTable get_aes_normalization_table(const MultiTableId id = AES_NORMALIZE)
89{
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;
94
95 for (size_t i = 0; i < num_entries; ++i) {
96 column_1_coefficients.emplace_back(barretenberg::fr(AES_BASE).pow(4 * i));
97 column_2_coefficients.emplace_back(barretenberg::fr(AES_BASE).pow(4 * i));
98 column_3_coefficients.emplace_back(0);
99 }
100
101 MultiTable table(column_1_coefficients, column_2_coefficients, column_3_coefficients);
102
103 table.id = id;
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);
108 }
109 return table;
110}
111
112inline MultiTable get_aes_input_table(const MultiTableId id = AES_INPUT)
113{
114 const size_t num_entries = 16;
115
116 MultiTable table(256, 0, 0, num_entries);
117
118 table.id = id;
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>);
123 }
124 return table;
125}
126
127inline std::array<barretenberg::fr, 2> get_aes_sbox_values_from_key(const std::array<uint64_t, 2> key)
128{
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))) };
134}
135
136inline BasicTable generate_aes_sbox_table(BasicTableId id, const size_t table_index)
137{
138 BasicTable table;
139 table.id = id;
140 table.table_index = table_index;
141 table.size = 256;
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));
149
150 table.column_1.emplace_back(barretenberg::fr(first));
151 table.column_2.emplace_back(barretenberg::fr(second));
152 table.column_3.emplace_back(barretenberg::fr(third));
153 }
154 table.get_values_from_key = get_aes_sbox_values_from_key;
155
156 table.column_1_step_size = barretenberg::fr(0);
157 table.column_2_step_size = barretenberg::fr(0);
158 table.column_3_step_size = barretenberg::fr(0);
159 return table;
160}
161
162inline MultiTable get_aes_sbox_table(const MultiTableId id = AES_SBOX)
163{
164 const size_t num_entries = 1;
165
166 MultiTable table(0, 0, 0, 1);
167
168 table.id = id;
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);
173 }
174 return table;
175}
176} // namespace aes128_tables
177} // namespace plookup