72 keccakf1600_event.
src_addr = src_addr;
81 bool src_out_of_range =
gt.gt(
static_cast<uint128_t>(src_addr),
static_cast<uint128_t>(HIGHEST_SLICE_ADDRESS));
88 if (src_out_of_range) {
91 if (dst_out_of_range) {
105 src_mem_values[k] = mem_val;
112 format(
"Read slice tag invalid - addr: ", addr,
" tag: ",
static_cast<uint32_t
>(
tag)));
122 state_input_values[k % 5][k / 5] = src_mem_values[k];
131 for (
size_t i = 0; i < 5; ++i) {
132 MemoryValue xor_accumulator = state_input_values[i][0];
133 for (
size_t j = 0; j < 4; ++j) {
134 xor_accumulator =
bitwise.xor_op(xor_accumulator, state_input_values[i][j + 1]);
135 theta_xor_values[i][j] = xor_accumulator;
141 for (
size_t i = 0; i < 5; ++i) {
142 theta_xor_row_rotl1_values.at(i) = unconstrained_rotate_left(theta_xor_values[i][3], 1);
147 for (
size_t i = 0; i < 5; ++i) {
148 theta_combined_xor_values.at(i) =
149 bitwise.xor_op(theta_xor_values[(i + 4) % 5][3], theta_xor_row_rotl1_values.at((i + 1) % 5));
154 for (
size_t i = 0; i < 5; ++i) {
155 for (
size_t j = 0; j < 5; ++j) {
156 state_theta_values[i][j] =
157 bitwise.xor_op(state_input_values[i][j], theta_combined_xor_values.at(i));
168 for (
size_t i = 0; i < 5; ++i) {
169 for (
size_t j = 0; j < 5; ++j) {
172 state_rho_values[i][j] = unconstrained_rotate_left(state_theta_values[i][j],
len);
173 if (
len > 0 &&
len <= 32) {
174 range_check.assert_range(state_theta_values[i][j].as<uint64_t>() >> (64 -
len),
len);
175 }
else if (
len > 32) {
176 range_check.assert_range(state_theta_values[i][j].as<uint64_t>() & ((1U << (64 -
len)) - 1),
186 for (
size_t i = 0; i < 5; ++i) {
187 for (
size_t j = 0; j < 5; ++j) {
189 state_pi_not_values[i][j] = ~state_pi_values[i][j];
197 for (
size_t i = 0; i < 5; ++i) {
198 for (
size_t j = 0; j < 5; ++j) {
199 state_pi_and_values[i][j] =
200 bitwise.and_op(state_pi_not_values[(i + 1) % 5][j], state_pi_values[(i + 2) % 5][j]);
201 state_chi_values[i][j] =
bitwise.xor_op(state_pi_values[i][j], state_pi_and_values[i][j]);
210 rounds_data.at(round_idx) = {
211 .state = two_dim_array_to_uint64(state_input_values),
212 .theta_xor = two_dim_array_to_uint64(theta_xor_values),
213 .theta_xor_row_rotl1 = array_to_uint64(theta_xor_row_rotl1_values),
214 .theta_combined_xor = array_to_uint64(theta_combined_xor_values),
215 .state_theta = two_dim_array_to_uint64(state_theta_values),
216 .state_rho = two_dim_array_to_uint64(state_rho_values),
217 .state_pi_not = two_dim_array_to_uint64(state_pi_not_values),
218 .state_pi_and = two_dim_array_to_uint64(state_pi_and_values),
219 .state_chi = two_dim_array_to_uint64(state_chi_values),
220 .state_iota_00 = iota_00_value.
as<uint64_t>(),
223 state_input_values = state_chi_values;
224 state_input_values[0][0] = iota_00_value;
228 for (
size_t i = 0; i < 5; i++) {
229 for (
size_t j = 0; j < 5; j++) {
234 keccakf1600_event.
rounds = rounds_data;
void permutation(MemoryInterface &memory, MemoryAddress dst_addr, MemoryAddress src_addr) override
Permutation Keccak-f[1600] consisting in AVM_KECCAKF1600_NUM_ROUNDS (24) rounds and a state of 25 64-...