1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
36using ::testing::Return;
37using ::testing::StrictMock;
39using simulation::Bitwise;
40using simulation::BitwiseEvent;
41using simulation::DeduplicatingEventEmitter;
42using simulation::EventEmitter;
43using simulation::FieldGreaterThan;
44using simulation::FieldGreaterThanEvent;
45using simulation::GreaterThan;
46using simulation::GreaterThanEvent;
47using simulation::MemoryStore;
48using simulation::MockExecutionIdManager;
49using simulation::PureBitwise;
50using simulation::PureGreaterThan;
51using simulation::RangeCheck;
52using simulation::RangeCheckEvent;
53using simulation::Sha256;
54using simulation::Sha256CompressionEvent;
56using tracegen::BitwiseTraceBuilder;
57using tracegen::GreaterThanTraceBuilder;
58using tracegen::PrecomputedTraceBuilder;
59using tracegen::Sha256TraceBuilder;
60using tracegen::TestTraceContainer;
67TEST(Sha256ConstrainingTest, EmptyRow)
76TEST(Sha256ConstrainingTest, Basic)
84 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
87 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
89 for (uint32_t i = 0; i < 8; ++i) {
90 mem.
set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
93 std::array<uint32_t, 16> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
95 for (uint32_t i = 0; i < 16; ++i) {
96 mem.
set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
101 sha256_gadget.compression(
mem, state_addr, input_addr, output_addr);
102 sha256_gadget.compression(
mem, state_addr, input_addr, output_addr);
103 TestTraceContainer
trace;
104 trace.
set(C::precomputed_first_row, 0, 1);
106 const auto sha256_event_container = sha256_event_emitter.dump_events();
109 check_relation<sha256>(
trace);
112TEST(Sha256ConstrainingTest, Interaction)
128 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
131 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
133 for (uint32_t i = 0; i < 8; ++i) {
134 mem.
set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
137 std::array<uint32_t, 16> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
139 for (uint32_t i = 0; i < 16; ++i) {
140 mem.
set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
144 sha256_gadget.compression(
mem, state_addr, input_addr, output_addr);
146 TestTraceContainer
trace;
153 BitwiseTraceBuilder bitwise_builder;
215 check_relation<sha256>(
trace);
222TEST(Sha256MemoryConstrainingTest, Basic)
237 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
240 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
242 for (uint32_t i = 0; i < 8; ++i) {
243 mem.
set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
246 std::array<uint32_t, 16> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
248 for (uint32_t i = 0; i < 16; ++i) {
249 mem.
set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
254 sha256_gadget.compression(
mem, state_addr, input_addr, output_addr);
255 sha256_gadget.compression(
mem, state_addr, input_addr, output_addr);
256 TestTraceContainer
trace;
257 trace.
set(C::precomputed_first_row, 0, 1);
260 const auto sha256_event_container = sha256_event_emitter.dump_events();
265 check_relation<sha256_mem>(
trace);
266 check_relation<sha256>(
trace);
273TEST(Sha256MemoryConstrainingTest, SimpleOutOfRangeMemoryAddresses)
288 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
296 ".*Memory address out of range.*");
297 TestTraceContainer
trace;
298 trace.
set(C::precomputed_first_row, 0, 1);
301 const auto sha256_event_container = sha256_event_emitter.dump_events();
306 check_relation<sha256_mem>(
trace);
307 check_relation<sha256>(
trace);
314TEST(Sha256MemoryConstrainingTest, MultiOutOfRangeMemoryAddresses)
329 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
337 ".*Memory address out of range.*");
338 TestTraceContainer
trace;
339 trace.
set(C::precomputed_first_row, 0, 1);
342 const auto sha256_event_container = sha256_event_emitter.dump_events();
347 check_relation<sha256_mem>(
trace);
348 check_relation<sha256>(
trace);
355TEST(Sha256MemoryConstrainingTest, InvalidStateTagErr)
370 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
375 for (uint32_t i = 0; i < 7; ++i) {
376 mem.
set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
379 mem.
set(state_addr + 7, MemoryValue::from<uint64_t>(7));
385 ".*Invalid tag for sha256 state values.*");
386 TestTraceContainer
trace;
387 trace.
set(C::precomputed_first_row, 0, 1);
390 const auto sha256_event_container = sha256_event_emitter.dump_events();
395 check_relation<sha256_mem>(
trace);
396 check_relation<sha256>(
trace);
403TEST(Sha256MemoryConstrainingTest, InvalidInputTagErr)
418 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
421 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
423 for (uint32_t i = 0; i < 8; ++i) {
424 mem.
set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
427 std::array<uint32_t, 14> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };
429 for (uint32_t i = 0; i < 14; ++i) {
430 mem.
set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
432 mem.
set(input_addr + 14, MemoryValue::from<uint64_t>(14));
433 mem.
set(input_addr + 15, MemoryValue::from<uint64_t>(15));
437 ".*Invalid tag for sha256 input values.*");
438 TestTraceContainer
trace;
439 trace.
set(C::precomputed_first_row, 0, 1);
442 const auto sha256_event_container = sha256_event_emitter.dump_events();
446 if (getenv(
"AVM_DEBUG") !=
nullptr) {
447 InteractiveDebugger debugger(
trace);
451 check_relation<sha256_mem>(
trace);
452 check_relation<sha256>(
trace);
459TEST(Sha256MemoryConstrainingTest, PropagateError)
468 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
482 TestTraceContainer
trace({
484 { C::precomputed_first_row, 1 },
486 { C::execution_sel, 1 },
488 { C::execution_sel_exec_dispatch_sha256_compression, 1 },
489 { C::execution_rop_0_, output_addr },
490 { C::execution_rop_1_, state_addr },
491 { C::execution_rop_2_, input_addr },
492 { C::execution_sel_opcode_error, 1 },
496 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
497 for (uint32_t i = 0; i < state.size(); ++i) {
498 mem.
set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
501 { C::memory_sel, 1 },
503 { C::memory_address, state_addr + i },
504 { C::memory_value, state[i] },
510 std::array<uint32_t, 13> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
511 for (uint32_t i = 0; i < input.size(); ++i) {
512 mem.
set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
515 { C::memory_sel, 1 },
517 { C::memory_address, input_addr + i },
518 { C::memory_value, input[i] },
524 mem.
set(input_addr + 13, MemoryValue::from<uint64_t>(13));
525 trace.
set(state.size() + input.size(),
527 { C::memory_sel, 1 },
529 { C::memory_address, input_addr + 13 },
530 { C::memory_value, 13 },
534 EXPECT_THROW(sha256_gadget.compression(
mem, state_addr, input_addr, output_addr),
538 const auto sha256_event_container = sha256_event_emitter.dump_events();
548 if (getenv(
"AVM_DEBUG") !=
nullptr) {
549 InteractiveDebugger debugger(
trace);
553 check_relation<sha256_mem>(
trace);
554 check_relation<sha256>(
trace);
555 check_all_interactions<Sha256TraceBuilder>(
trace);
558TEST(Sha256MemoryConstrainingTest, Complex)
567 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
582 TestTraceContainer
trace({
584 { C::precomputed_first_row, 1 },
586 { C::execution_sel, 1 },
588 { C::execution_sel_exec_dispatch_sha256_compression, 1 },
590 { C::execution_rop_1_, state_addr },
591 { C::execution_rop_2_, input_addr },
592 { C::execution_sel_opcode_error, 1 },
596 { C::execution_sel, 1 },
598 { C::execution_sel_exec_dispatch_sha256_compression, 1 },
599 { C::execution_rop_0_, output_addr },
600 { C::execution_rop_1_, state_addr },
601 { C::execution_rop_2_, input_addr },
605 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
606 for (uint32_t i = 0; i < state.size(); ++i) {
607 mem.
set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
610 { C::memory_sel, 1 },
611 { C::memory_clk, 1 },
613 { C::memory_address, state_addr + i },
614 { C::memory_value, state[i] },
620 std::array<uint32_t, 16> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
621 for (uint32_t i = 0; i < input.size(); ++i) {
622 mem.
set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
625 { C::memory_sel, 1 },
626 { C::memory_clk, 1 },
628 { C::memory_address, input_addr + i },
629 { C::memory_value, input[i] },
636 for (uint32_t i = 0; i < expected_output.size(); ++i) {
637 mem.
set(output_addr + i, MemoryValue::from<uint32_t>(expected_output[i]));
638 trace.
set(i + state.size() + input.size(),
640 { C::memory_sel, 1 },
641 { C::memory_clk, 1 },
642 { C::memory_space_id, mem.get_space_id() },
643 { C::memory_address, output_addr + i },
644 { C::memory_value, expected_output[i] },
645 { C::memory_tag, static_cast<uint8_t>(MemoryTag::U32) },
653 sha256_gadget.compression(
mem, state_addr, input_addr, output_addr);
656 const auto sha256_event_container = sha256_event_emitter.dump_events();
666 BitwiseTraceBuilder bitwise_builder;
669 if (getenv(
"AVM_DEBUG") !=
nullptr) {
670 InteractiveDebugger debugger(
trace);
674 check_relation<sha256_mem>(
trace);
675 check_relation<sha256>(
trace);
676 check_all_interactions<Sha256TraceBuilder>(
trace);
#define AVM_HIGHEST_MEM_ADDRESS
void set(MemoryAddress index, MemoryValue value) override
uint16_t get_space_id() const override
void process(const simulation::EventEmitterInterface< simulation::AluEvent >::Container &events, TraceContainer &trace)
void process(const simulation::EventEmitterInterface< simulation::GreaterThanEvent >::Container &events, TraceContainer &trace)
void process_sha256_round_constants(TraceContainer &trace)
void process_misc(TraceContainer &trace, const uint32_t num_rows=MAX_AVM_TRACE_SIZE)
void set(Column col, uint32_t row, const FF &value)
PrecomputedTraceBuilder precomputed_builder
GreaterThanTraceBuilder gt_builder
EventEmitter< GreaterThanEvent > gt_event_emitter
ExecutionIdManager execution_id_manager
EventEmitter< RangeCheckEvent > range_check_event_emitter
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessage)
void check_interaction(tracegen::TestTraceContainer &trace)
TEST(TxExecutionConstrainingTest, WriteTreeValue)
std::array< uint32_t, 8 > sha256_block(const std::array< uint32_t, 8 > &h_init, const std::array< uint32_t, 16 > &input)
TestTraceContainer empty_trace()
lookup_settings< lookup_sha256_range_rhs_e_6_settings_ > lookup_sha256_range_rhs_e_6_settings
lookup_settings< lookup_sha256_range_comp_b_lhs_settings_ > lookup_sha256_range_comp_b_lhs_settings
lookup_settings< lookup_sha256_w_s_1_xor_1_settings_ > lookup_sha256_w_s_1_xor_1_settings
lookup_settings< lookup_sha256_range_comp_w_rhs_settings_ > lookup_sha256_range_comp_w_rhs_settings
lookup_settings< lookup_sha256_range_rhs_a_13_settings_ > lookup_sha256_range_rhs_a_13_settings
lookup_settings< lookup_sha256_range_rhs_e_11_settings_ > lookup_sha256_range_rhs_e_11_settings
lookup_settings< lookup_sha256_range_rhs_a_22_settings_ > lookup_sha256_range_rhs_a_22_settings
lookup_settings< lookup_sha256_range_comp_h_rhs_settings_ > lookup_sha256_range_comp_h_rhs_settings
lookup_settings< lookup_sha256_mem_check_input_addr_in_range_settings_ > lookup_sha256_mem_check_input_addr_in_range_settings
lookup_settings< lookup_sha256_maj_xor_0_settings_ > lookup_sha256_maj_xor_0_settings
lookup_settings< lookup_sha256_s_1_xor_0_settings_ > lookup_sha256_s_1_xor_0_settings
lookup_settings< lookup_sha256_w_s_0_xor_0_settings_ > lookup_sha256_w_s_0_xor_0_settings
lookup_settings< lookup_sha256_range_rhs_w_18_settings_ > lookup_sha256_range_rhs_w_18_settings
lookup_settings< lookup_sha256_w_s_1_xor_0_settings_ > lookup_sha256_w_s_1_xor_0_settings
lookup_settings< lookup_sha256_range_comp_w_lhs_settings_ > lookup_sha256_range_comp_w_lhs_settings
lookup_settings< lookup_sha256_s_1_xor_1_settings_ > lookup_sha256_s_1_xor_1_settings
lookup_settings< lookup_sha256_range_comp_b_rhs_settings_ > lookup_sha256_range_comp_b_rhs_settings
lookup_settings< lookup_sha256_range_rhs_w_10_settings_ > lookup_sha256_range_rhs_w_10_settings
lookup_settings< lookup_sha256_ch_xor_settings_ > lookup_sha256_ch_xor_settings
lookup_settings< lookup_sha256_range_comp_f_lhs_settings_ > lookup_sha256_range_comp_f_lhs_settings
lookup_settings< lookup_sha256_range_comp_c_rhs_settings_ > lookup_sha256_range_comp_c_rhs_settings
lookup_settings< lookup_sha256_range_comp_next_e_lhs_settings_ > lookup_sha256_range_comp_next_e_lhs_settings
lookup_settings< lookup_sha256_maj_and_0_settings_ > lookup_sha256_maj_and_0_settings
lookup_settings< lookup_sha256_range_comp_c_lhs_settings_ > lookup_sha256_range_comp_c_lhs_settings
lookup_settings< lookup_sha256_ch_and_0_settings_ > lookup_sha256_ch_and_0_settings
lookup_settings< lookup_sha256_maj_and_2_settings_ > lookup_sha256_maj_and_2_settings
lookup_settings< lookup_sha256_range_rhs_w_3_settings_ > lookup_sha256_range_rhs_w_3_settings
lookup_settings< lookup_sha256_round_constant_settings_ > lookup_sha256_round_constant_settings
lookup_settings< lookup_sha256_mem_check_state_addr_in_range_settings_ > lookup_sha256_mem_check_state_addr_in_range_settings
lookup_settings< lookup_sha256_range_comp_h_lhs_settings_ > lookup_sha256_range_comp_h_lhs_settings
lookup_settings< lookup_sha256_range_rhs_e_25_settings_ > lookup_sha256_range_rhs_e_25_settings
lookup_settings< lookup_sha256_range_comp_next_e_rhs_settings_ > lookup_sha256_range_comp_next_e_rhs_settings
lookup_settings< lookup_sha256_maj_xor_1_settings_ > lookup_sha256_maj_xor_1_settings
lookup_settings< lookup_sha256_range_comp_f_rhs_settings_ > lookup_sha256_range_comp_f_rhs_settings
lookup_settings< lookup_sha256_range_comp_next_a_lhs_settings_ > lookup_sha256_range_comp_next_a_lhs_settings
lookup_settings< lookup_sha256_s_0_xor_0_settings_ > lookup_sha256_s_0_xor_0_settings
lookup_settings< lookup_sha256_range_comp_g_lhs_settings_ > lookup_sha256_range_comp_g_lhs_settings
lookup_settings< lookup_sha256_w_s_0_xor_1_settings_ > lookup_sha256_w_s_0_xor_1_settings
lookup_settings< lookup_sha256_range_rhs_a_2_settings_ > lookup_sha256_range_rhs_a_2_settings
lookup_settings< lookup_sha256_range_comp_g_rhs_settings_ > lookup_sha256_range_comp_g_rhs_settings
lookup_settings< lookup_sha256_range_rhs_w_17_settings_ > lookup_sha256_range_rhs_w_17_settings
lookup_settings< lookup_sha256_s_0_xor_1_settings_ > lookup_sha256_s_0_xor_1_settings
lookup_settings< lookup_sha256_range_rhs_w_7_settings_ > lookup_sha256_range_rhs_w_7_settings
lookup_settings< lookup_sha256_range_comp_e_lhs_settings_ > lookup_sha256_range_comp_e_lhs_settings
lookup_settings< lookup_sha256_ch_and_1_settings_ > lookup_sha256_ch_and_1_settings
lookup_settings< lookup_sha256_maj_and_1_settings_ > lookup_sha256_maj_and_1_settings
lookup_settings< lookup_sha256_range_comp_a_lhs_settings_ > lookup_sha256_range_comp_a_lhs_settings
lookup_settings< lookup_sha256_mem_check_output_addr_in_range_settings_ > lookup_sha256_mem_check_output_addr_in_range_settings
lookup_settings< lookup_sha256_range_comp_next_a_rhs_settings_ > lookup_sha256_range_comp_next_a_rhs_settings
lookup_settings< lookup_sha256_range_rhs_w_19_settings_ > lookup_sha256_range_rhs_w_19_settings
lookup_settings< lookup_sha256_range_comp_d_rhs_settings_ > lookup_sha256_range_comp_d_rhs_settings
lookup_settings< lookup_sha256_range_comp_d_lhs_settings_ > lookup_sha256_range_comp_d_lhs_settings
lookup_settings< lookup_sha256_range_comp_a_rhs_settings_ > lookup_sha256_range_comp_a_rhs_settings
lookup_settings< lookup_sha256_range_comp_e_rhs_settings_ > lookup_sha256_range_comp_e_rhs_settings
Sha256Hash sha256(const ByteContainer &input)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
FieldGreaterThan field_gt
NoopEventEmitter< FieldGreaterThanEvent > field_gt_event_emitter
NoopEventEmitter< BitwiseEvent > bitwise_event_emitter