72 keccakf1600_event.
src_addr = src_addr;
78 bool src_out_of_range = src_addr > HIGHEST_SLICE_ADDRESS;
79 bool dst_out_of_range =
dst_addr > HIGHEST_SLICE_ADDRESS;
82 src_out_of_range ? src_addr - HIGHEST_SLICE_ADDRESS - 1 : HIGHEST_SLICE_ADDRESS - src_addr;
84 dst_out_of_range ?
dst_addr - HIGHEST_SLICE_ADDRESS - 1 : HIGHEST_SLICE_ADDRESS -
dst_addr;
98 if (src_out_of_range) {
101 if (dst_out_of_range) {
112 for (
size_t i = 0; i < 5; i++) {
113 for (
size_t j = 0; j < 5; j++) {
114 const auto addr = src_addr +
static_cast<MemoryAddress>((i * 5) + j);
117 src_mem_values[i][j] = mem_val;
124 format(
"Read slice tag invalid - addr: ", addr,
" tag: ",
static_cast<uint32_t
>(tag)));
139 for (
size_t i = 0; i < 5; ++i) {
140 MemoryValue xor_accumulator = state_input_values[i][0];
141 for (
size_t j = 0; j < 4; ++j) {
142 xor_accumulator =
bitwise.xor_op(xor_accumulator, state_input_values[i][j + 1]);
143 theta_xor_values[i][j] = xor_accumulator;
149 for (
size_t i = 0; i < 5; ++i) {
150 theta_xor_row_rotl1_values.at(i) = unconstrained_rotate_left(theta_xor_values[i][3], 1);
155 for (
size_t i = 0; i < 5; ++i) {
156 theta_combined_xor_values.at(i) =
157 bitwise.xor_op(theta_xor_values[(i + 4) % 5][3], theta_xor_row_rotl1_values.at((i + 1) % 5));
162 for (
size_t i = 0; i < 5; ++i) {
163 for (
size_t j = 0; j < 5; ++j) {
164 state_theta_values[i][j] =
165 bitwise.xor_op(state_input_values[i][j], theta_combined_xor_values.at(i));
176 for (
size_t i = 0; i < 5; ++i) {
177 for (
size_t j = 0; j < 5; ++j) {
180 state_rho_values[i][j] = unconstrained_rotate_left(state_theta_values[i][j],
len);
181 if (
len > 0 &&
len <= 32) {
182 range_check.assert_range(state_theta_values[i][j].as<uint64_t>() >> (64 -
len),
len);
183 }
else if (
len > 32) {
184 range_check.assert_range(state_theta_values[i][j].as<uint64_t>() & ((1U << (64 -
len)) - 1),
194 for (
size_t i = 0; i < 5; ++i) {
195 for (
size_t j = 0; j < 5; ++j) {
197 state_pi_not_values[i][j] = ~state_pi_values[i][j];
205 for (
size_t i = 0; i < 5; ++i) {
206 for (
size_t j = 0; j < 5; ++j) {
207 state_pi_and_values[i][j] =
208 bitwise.and_op(state_pi_not_values[(i + 1) % 5][j], state_pi_values[(i + 2) % 5][j]);
209 state_chi_values[i][j] =
bitwise.xor_op(state_pi_values[i][j], state_pi_and_values[i][j]);
218 rounds_data.at(round_idx) = {
219 .state = two_dim_array_to_uint64(state_input_values),
220 .theta_xor = two_dim_array_to_uint64(theta_xor_values),
221 .theta_xor_row_rotl1 = array_to_uint64(theta_xor_row_rotl1_values),
222 .theta_combined_xor = array_to_uint64(theta_combined_xor_values),
223 .state_theta = two_dim_array_to_uint64(state_theta_values),
224 .state_rho = two_dim_array_to_uint64(state_rho_values),
225 .state_pi_not = two_dim_array_to_uint64(state_pi_not_values),
226 .state_pi_and = two_dim_array_to_uint64(state_pi_and_values),
227 .state_chi = two_dim_array_to_uint64(state_chi_values),
228 .state_iota_00 = iota_00_value.
as<uint64_t>(),
231 state_input_values = state_chi_values;
232 state_input_values[0][0] = iota_00_value;
236 for (
size_t i = 0; i < 5; i++) {
237 for (
size_t j = 0; j < 5; j++) {
242 keccakf1600_event.
rounds = rounds_data;