Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
keccakf1600_fixture.test.cpp
Go to the documentation of this file.
2
18
19#include <cstdint>
20#include <gmock/gmock.h>
21
22namespace bb::avm2::testing {
23
39
41 const std::function<void(MemorySimulator&, size_t)>& memory_init_fn,
42 const std::vector<MemoryAddress>& dst_addresses,
43 const std::vector<MemoryAddress>& src_addresses,
44 bool expect_error,
45 uint16_t space_id)
46{
47 KeccakF1600TraceBuilder keccak_builder;
48 BitwiseTraceBuilder bitwise_builder;
50 GreaterThanTraceBuilder greater_than_builder;
52 MemoryTraceBuilder memory_builder;
53
57 EventEmitter<simulation::MemoryEvent> memory_event_emitter;
62 FieldGreaterThanSimulator field_gt_simulator(range_check_simulator, field_gt_event_emitter);
63 GreaterThanSimulator greater_than_simulator(field_gt_simulator, range_check_simulator, greater_than_event_emitter);
64 BitwiseSimulator bitwise_simulator(bitwise_event_emitter);
65 KeccakSimulator keccak_simulator(
66 execution_id_manager, keccak_event_emitter, bitwise_simulator, range_check_simulator, greater_than_simulator);
67 MemorySimulator memory_simulator(space_id, range_check_simulator, execution_id_manager, memory_event_emitter);
68
69 for (size_t i = 0; i < src_addresses.size(); i++) {
70 memory_init_fn(memory_simulator, i);
71 if (expect_error) {
72 ASSERT_THROW(keccak_simulator.permutation(memory_simulator, dst_addresses.at(i), src_addresses.at(i)),
74 } else {
75 keccak_simulator.permutation(memory_simulator, dst_addresses.at(i), src_addresses.at(i));
76 }
77 }
78
79 const auto keccak_events = keccak_event_emitter.dump_events();
80
81 keccak_builder.process_permutation(keccak_events, trace);
82 keccak_builder.process_memory_slices(keccak_events, trace);
83 bitwise_builder.process(bitwise_event_emitter.dump_events(), trace);
85 greater_than_builder.process(greater_than_event_emitter.dump_events(), trace);
86 memory_builder.process(memory_event_emitter.dump_events(), trace);
89 3 * AVM_KECCAKF1600_STATE_SIZE * static_cast<uint32_t>(src_addresses.size()));
90}
91
93 const std::vector<MemoryAddress>& dst_addresses,
94 const std::vector<MemoryAddress>& src_addresses,
95 uint16_t space_id)
96{
98 trace,
99 [&](MemorySimulator& memory_simulator, size_t i) {
100 // Write in memory first to fill source values in memory.
101 // Standard Keccak layout: memory[(y * 5) + x] = A[x][y]
102 // Arbitrary values: 100 * i + j * 2^32 + k
103 for (size_t j = 0; j < 5; j++) {
104 for (size_t k = 0; k < 5; k++) {
105 memory_simulator.set(src_addresses[i] + static_cast<MemoryAddress>((k * 5) + j),
106 MemoryValue::from<uint64_t>((static_cast<uint64_t>(j) << 32) + k + (100 * i)));
107 }
108 }
109 },
110 dst_addresses,
111 src_addresses,
112 false,
113 space_id);
114}
115
119 size_t error_offset,
120 MemoryTag error_tag,
121 uint16_t space_id)
122{
124 trace,
125 [&](MemorySimulator& memory_simulator, size_t) {
126 // Write in memory first to fill source values in memory.
127 // Standard Keccak layout: memory[(y * 5) + x] = A[x][y]
128 // Arbitrary values: 100 + j * 2^32 + k
129 for (size_t j = 0; j < 5; j++) {
130 for (size_t k = 0; k < 5; k++) {
131 const size_t idx = (k * 5) + j;
132 if (idx == error_offset) {
133 memory_simulator.set(
134 src_address + static_cast<MemoryAddress>(idx),
135 MemoryValue::from_tag_truncating(error_tag, (static_cast<uint64_t>(j) << 32) + k + 100));
136 } else {
137 memory_simulator.set(src_address + static_cast<MemoryAddress>(idx),
138 MemoryValue::from<uint64_t>((static_cast<uint64_t>(j) << 32) + k + 100));
139 }
140 }
141 }
142 },
143 { dst_address },
144 { src_address },
145 true,
146 space_id);
147}
148
149// Helper function to generate a keccak trace with a slice error.
153 uint16_t space_id)
154{
155 // Precondition for this trace to make sense is that the src or dst slice is out of bounds.
158
160 trace,
161 [&]([[maybe_unused]] MemorySimulator& memory_simulator, size_t) {},
162 { dst_address },
163 { src_address },
164 true,
165 space_id);
166}
167
168} // namespace bb::avm2::testing
#define AVM_KECCAKF1600_STATE_SIZE
#define AVM_HIGHEST_MEM_ADDRESS
static TaggedValue from_tag_truncating(ValueTag tag, FF value)
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-...
void set(MemoryAddress index, MemoryValue value) override
Definition memory.cpp:12
void process(const simulation::EventEmitterInterface< simulation::BitwiseEvent >::Container &events, TraceContainer &trace)
void process(const simulation::EventEmitterInterface< simulation::GreaterThanEvent >::Container &events, TraceContainer &trace)
Definition gt_trace.cpp:11
void process_memory_slices(const simulation::EventEmitterInterface< simulation::KeccakF1600Event >::Container &events, TraceContainer &trace)
void process_permutation(const simulation::EventEmitterInterface< simulation::KeccakF1600Event >::Container &events, TraceContainer &trace)
void process(const simulation::EventEmitterInterface< simulation::MemoryEvent >::Container &events, TraceContainer &trace)
void process_keccak_round_constants(TraceContainer &trace)
void process_misc(TraceContainer &trace, const uint32_t num_rows=MAX_AVM_TRACE_SIZE)
void process(const simulation::EventEmitterInterface< simulation::RangeCheckEvent >::Container &events, TraceContainer &trace)
RangeCheckTraceBuilder range_check_builder
Definition alu.test.cpp:121
PrecomputedTraceBuilder precomputed_builder
Definition alu.test.cpp:120
ExecutionIdManager execution_id_manager
EventEmitter< RangeCheckEvent > range_check_event_emitter
TestTraceContainer trace
void generate_keccak_trace(TestTraceContainer &trace, const std::vector< MemoryAddress > &dst_addresses, const std::vector< MemoryAddress > &src_addresses, uint16_t space_id)
void generate_keccak_trace_with_slice_error(TestTraceContainer &trace, MemoryAddress dst_address, MemoryAddress src_address, uint16_t space_id)
void generate_keccak_trace_impl(TestTraceContainer &trace, const std::function< void(MemorySimulator &, size_t)> &memory_init_fn, const std::vector< MemoryAddress > &dst_addresses, const std::vector< MemoryAddress > &src_addresses, bool expect_error, uint16_t space_id)
void generate_keccak_trace_with_tag_error(TestTraceContainer &trace, MemoryAddress dst_address, MemoryAddress src_address, size_t error_offset, MemoryTag error_tag, uint16_t space_id)
uint32_t MemoryAddress
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
NoopEventEmitter< GreaterThanEvent > greater_than_event_emitter
NoopEventEmitter< FieldGreaterThanEvent > field_gt_event_emitter
NoopEventEmitter< BitwiseEvent > bitwise_event_emitter
NoopEventEmitter< KeccakF1600Event > keccak_event_emitter