barretenberg
Loading...
Searching...
No Matches
blake2s.hpp
1#pragma once
2
3#include "barretenberg/numeric/bitop/rotate.hpp"
4
5#include "sparse.hpp"
6#include "types.hpp"
7
8namespace plookup {
9namespace blake2s_tables {
10
11static constexpr size_t BITS_IN_LAST_SLICE = 5UL;
12static constexpr size_t SIZE_OF_LAST_SLICE = (1UL << BITS_IN_LAST_SLICE);
13
19template <uint64_t bits_per_slice, uint64_t num_rotated_output_bits, bool filter = false>
20inline std::array<barretenberg::fr, 2> get_xor_rotate_values_from_key(const std::array<uint64_t, 2> key)
21{
22 uint64_t filtered_key0 = filter ? key[0] & 3ULL : key[0];
23 uint64_t filtered_key1 = filter ? key[1] & 3ULL : key[1];
24 return { uint256_t(numeric::rotate32(uint32_t(filtered_key0) ^ uint32_t(filtered_key1),
25 uint32_t(num_rotated_output_bits))),
26 0ULL };
27}
28
32template <uint64_t bits_per_slice, uint64_t num_rotated_output_bits, bool filter = false>
33inline BasicTable generate_xor_rotate_table(BasicTableId id, const size_t table_index)
34{
35 const uint64_t base = 1UL << bits_per_slice;
36 BasicTable table;
37 table.id = id;
38 table.table_index = table_index;
39 table.size = base * base;
40 table.use_twin_keys = true;
41
42 for (uint64_t i = 0; i < base; ++i) {
43 for (uint64_t j = 0; j < base; ++j) {
44 table.column_1.emplace_back(i);
45 table.column_2.emplace_back(j);
46 uint64_t i_copy = i;
47 uint64_t j_copy = j;
48 if (filter) {
49 i_copy &= 3ULL;
50 j_copy &= 3ULL;
51 }
52 table.column_3.emplace_back(
53 uint256_t(numeric::rotate32(uint32_t(i_copy) ^ uint32_t(j_copy), uint32_t(num_rotated_output_bits))));
54 }
55 }
56
57 table.get_values_from_key = &get_xor_rotate_values_from_key<bits_per_slice, num_rotated_output_bits, filter>;
58
59 table.column_1_step_size = base;
60 table.column_2_step_size = base;
61 table.column_3_step_size = base;
62
63 return table;
64}
65
90inline MultiTable get_blake2s_xor_table(const MultiTableId id = BLAKE_XOR)
91{
92 const size_t num_entries = (32 + 2) / 6 + 1;
93 const uint64_t base = 1 << 6;
94 MultiTable table(base, base, base, num_entries);
95
96 table.id = id;
97 for (size_t i = 0; i < num_entries - 1; ++i) {
98 table.slice_sizes.emplace_back(base);
99 table.lookup_ids.emplace_back(BLAKE_XOR_ROTATE0);
100 table.get_table_values.emplace_back(&get_xor_rotate_values_from_key<6, 0>);
101 }
102
103 table.slice_sizes.emplace_back(SIZE_OF_LAST_SLICE);
104 table.lookup_ids.emplace_back(BLAKE_XOR_ROTATE0_SLICE5_MOD4);
105 table.get_table_values.emplace_back(&get_xor_rotate_values_from_key<BITS_IN_LAST_SLICE, 0, true>);
106
107 return table;
108}
109
113inline MultiTable get_blake2s_xor_rotate_16_table(const MultiTableId id = BLAKE_XOR_ROTATE_16)
114{
115 const uint64_t base = 1 << 6;
116 constexpr barretenberg::fr coefficient_16 = barretenberg::fr(1) / barretenberg::fr(1 << 16);
117
118 std::vector<barretenberg::fr> column_1_coefficients{ barretenberg::fr(1), barretenberg::fr(1 << 6),
119 barretenberg::fr(1 << 12), barretenberg::fr(1 << 18),
120 barretenberg::fr(1 << 24), barretenberg::fr(1 << 30) };
121
122 std::vector<barretenberg::fr> column_3_coefficients{ barretenberg::fr(1),
123 barretenberg::fr(1 << 6),
124 coefficient_16,
125 coefficient_16 * barretenberg::fr(1 << 2),
126 coefficient_16 * barretenberg::fr(1 << 8),
127 coefficient_16 * barretenberg::fr(1 << 14) };
128
129 MultiTable table(column_1_coefficients, column_1_coefficients, column_3_coefficients);
130
131 table.id = id;
132 table.slice_sizes = { base, base, base, base, base, SIZE_OF_LAST_SLICE };
133 table.lookup_ids = { BLAKE_XOR_ROTATE0, BLAKE_XOR_ROTATE0, BLAKE_XOR_ROTATE4,
134 BLAKE_XOR_ROTATE0, BLAKE_XOR_ROTATE0, BLAKE_XOR_ROTATE0_SLICE5_MOD4 };
135
136 table.get_table_values.emplace_back(&get_xor_rotate_values_from_key<6, 0>);
137 table.get_table_values.emplace_back(&get_xor_rotate_values_from_key<6, 0>);
138 table.get_table_values.emplace_back(&get_xor_rotate_values_from_key<6, 4>);
139 table.get_table_values.emplace_back(&get_xor_rotate_values_from_key<6, 0>);
140 table.get_table_values.emplace_back(&get_xor_rotate_values_from_key<6, 0>);
141 table.get_table_values.emplace_back(&get_xor_rotate_values_from_key<BITS_IN_LAST_SLICE, 0, true>);
142
143 return table;
144}
145
149inline MultiTable get_blake2s_xor_rotate_8_table(const MultiTableId id = BLAKE_XOR_ROTATE_8)
150{
151 const uint64_t base = 1 << 6;
152 constexpr barretenberg::fr coefficient_24 = barretenberg::fr(1) / barretenberg::fr(1 << 24);
153
154 std::vector<barretenberg::fr> column_1_coefficients{ barretenberg::fr(1), barretenberg::fr(1 << 6),
155 barretenberg::fr(1 << 12), barretenberg::fr(1 << 18),
156 barretenberg::fr(1 << 24), barretenberg::fr(1 << 30) };
157
158 std::vector<barretenberg::fr> column_3_coefficients{ barretenberg::fr(1),
159 coefficient_24,
160 coefficient_24 * barretenberg::fr(1 << 4),
161 coefficient_24 * barretenberg::fr(1 << (4 + 6)),
162 coefficient_24 * barretenberg::fr(1 << (4 + 12)),
163 coefficient_24 * barretenberg::fr(1 << (4 + 18)) };
164
165 MultiTable table(column_1_coefficients, column_1_coefficients, column_3_coefficients);
166
167 table.id = id;
168 table.slice_sizes = { base, base, base, base, base, SIZE_OF_LAST_SLICE };
169 table.lookup_ids = { BLAKE_XOR_ROTATE0, BLAKE_XOR_ROTATE2, BLAKE_XOR_ROTATE0,
170 BLAKE_XOR_ROTATE0, BLAKE_XOR_ROTATE0, BLAKE_XOR_ROTATE0_SLICE5_MOD4 };
171
172 table.get_table_values.emplace_back(&get_xor_rotate_values_from_key<6, 0>);
173 table.get_table_values.emplace_back(&get_xor_rotate_values_from_key<6, 2>);
174 table.get_table_values.emplace_back(&get_xor_rotate_values_from_key<6, 0>);
175 table.get_table_values.emplace_back(&get_xor_rotate_values_from_key<6, 0>);
176 table.get_table_values.emplace_back(&get_xor_rotate_values_from_key<6, 0>);
177 table.get_table_values.emplace_back(&get_xor_rotate_values_from_key<BITS_IN_LAST_SLICE, 0, true>);
178
179 return table;
180}
181
185inline MultiTable get_blake2s_xor_rotate_7_table(const MultiTableId id = BLAKE_XOR_ROTATE_7)
186{
187 const uint64_t base = 1 << 6;
188 constexpr barretenberg::fr coefficient_25 = barretenberg::fr(1) / barretenberg::fr(1 << 25);
189
190 std::vector<barretenberg::fr> column_1_coefficients{ barretenberg::fr(1), barretenberg::fr(1 << 6),
191 barretenberg::fr(1 << 12), barretenberg::fr(1 << 18),
192 barretenberg::fr(1 << 24), barretenberg::fr(1 << 30) };
193
194 std::vector<barretenberg::fr> column_3_coefficients{ barretenberg::fr(1),
195 coefficient_25,
196 coefficient_25 * barretenberg::fr(1 << 5),
197 coefficient_25 * barretenberg::fr(1 << (5 + 6)),
198 coefficient_25 * barretenberg::fr(1 << (5 + 12)),
199 coefficient_25 * barretenberg::fr(1 << (5 + 18)) };
200
201 MultiTable table(column_1_coefficients, column_1_coefficients, column_3_coefficients);
202
203 table.id = id;
204 table.slice_sizes = { base, base, base, base, base, SIZE_OF_LAST_SLICE };
205 table.lookup_ids = { BLAKE_XOR_ROTATE0, BLAKE_XOR_ROTATE1, BLAKE_XOR_ROTATE0,
206 BLAKE_XOR_ROTATE0, BLAKE_XOR_ROTATE0, BLAKE_XOR_ROTATE0_SLICE5_MOD4 };
207
208 table.get_table_values.emplace_back(&get_xor_rotate_values_from_key<6, 0>);
209 table.get_table_values.emplace_back(&get_xor_rotate_values_from_key<6, 1>);
210 table.get_table_values.emplace_back(&get_xor_rotate_values_from_key<6, 0>);
211 table.get_table_values.emplace_back(&get_xor_rotate_values_from_key<6, 0>);
212 table.get_table_values.emplace_back(&get_xor_rotate_values_from_key<6, 0>);
213 table.get_table_values.emplace_back(&get_xor_rotate_values_from_key<BITS_IN_LAST_SLICE, 0, true>);
214
215 return table;
216}
217
218} // namespace blake2s_tables
219} // namespace plookup
Definition: uint256.hpp:25