1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
35using ::testing::Return;
36using ::testing::StrictMock;
38using simulation::Bitwise;
39using simulation::BitwiseEvent;
40using simulation::EventEmitter;
41using simulation::FakeBitwise;
42using simulation::FakeGreaterThan;
43using simulation::FieldGreaterThan;
44using simulation::FieldGreaterThanEvent;
45using simulation::GreaterThan;
46using simulation::GreaterThanEvent;
47using simulation::MemoryStore;
48using simulation::MockExecutionIdManager;
49using simulation::RangeCheck;
50using simulation::RangeCheckEvent;
51using simulation::Sha256;
52using simulation::Sha256CompressionEvent;
54using tracegen::BitwiseTraceBuilder;
55using tracegen::GreaterThanTraceBuilder;
56using tracegen::PrecomputedTraceBuilder;
57using tracegen::Sha256TraceBuilder;
58using tracegen::TestTraceContainer;
65TEST(Sha256ConstrainingTest, EmptyRow)
74TEST(Sha256ConstrainingTest, Basic)
82 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
85 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
87 for (uint32_t i = 0; i < 8; ++i) {
88 mem.
set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
91 std::array<uint32_t, 16> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
93 for (uint32_t i = 0; i < 16; ++i) {
94 mem.
set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
99 sha256_gadget.compression(
mem, state_addr, input_addr, output_addr);
100 sha256_gadget.compression(
mem, state_addr, input_addr, output_addr);
101 TestTraceContainer
trace;
102 trace.
set(C::precomputed_first_row, 0, 1);
104 const auto sha256_event_container = sha256_event_emitter.dump_events();
107 check_relation<sha256>(
trace);
110TEST(Sha256ConstrainingTest, Interaction)
117 EventEmitter<FieldGreaterThanEvent> field_gt_event_emitter;
121 FieldGreaterThan
field_gt(range_check, field_gt_event_emitter);
126 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
129 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
131 for (uint32_t i = 0; i < 8; ++i) {
132 mem.
set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
135 std::array<uint32_t, 16> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
137 for (uint32_t i = 0; i < 16; ++i) {
138 mem.
set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
142 sha256_gadget.compression(
mem, state_addr, input_addr, output_addr);
144 TestTraceContainer
trace;
151 BitwiseTraceBuilder bitwise_builder;
157 builder.process(sha256_event_emitter.get_events(),
trace);
213 check_relation<sha256>(
trace);
220TEST(Sha256MemoryConstrainingTest, Basic)
227 EventEmitter<FieldGreaterThanEvent> field_gt_event_emitter;
231 FieldGreaterThan
field_gt(range_check, field_gt_event_emitter);
235 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
238 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
240 for (uint32_t i = 0; i < 8; ++i) {
241 mem.
set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
244 std::array<uint32_t, 16> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
246 for (uint32_t i = 0; i < 16; ++i) {
247 mem.
set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
252 sha256_gadget.compression(
mem, state_addr, input_addr, output_addr);
253 sha256_gadget.compression(
mem, state_addr, input_addr, output_addr);
254 TestTraceContainer
trace;
255 trace.
set(C::precomputed_first_row, 0, 1);
258 const auto sha256_event_container = sha256_event_emitter.dump_events();
263 check_relation<sha256_mem>(
trace);
264 check_relation<sha256>(
trace);
271TEST(Sha256MemoryConstrainingTest, SimpleOutOfRangeMemoryAddresses)
278 EventEmitter<FieldGreaterThanEvent> field_gt_event_emitter;
282 FieldGreaterThan
field_gt(range_check, field_gt_event_emitter);
286 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
294 ".*Memory address out of range.*");
295 TestTraceContainer
trace;
296 trace.
set(C::precomputed_first_row, 0, 1);
299 const auto sha256_event_container = sha256_event_emitter.dump_events();
304 check_relation<sha256_mem>(
trace);
305 check_relation<sha256>(
trace);
312TEST(Sha256MemoryConstrainingTest, MultiOutOfRangeMemoryAddresses)
319 EventEmitter<FieldGreaterThanEvent> field_gt_event_emitter;
323 FieldGreaterThan
field_gt(range_check, field_gt_event_emitter);
327 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
335 ".*Memory address out of range.*");
336 TestTraceContainer
trace;
337 trace.
set(C::precomputed_first_row, 0, 1);
340 const auto sha256_event_container = sha256_event_emitter.dump_events();
345 check_relation<sha256_mem>(
trace);
346 check_relation<sha256>(
trace);
353TEST(Sha256MemoryConstrainingTest, InvalidStateTagErr)
360 EventEmitter<FieldGreaterThanEvent> field_gt_event_emitter;
364 FieldGreaterThan
field_gt(range_check, field_gt_event_emitter);
368 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
373 for (uint32_t i = 0; i < 7; ++i) {
374 mem.
set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
377 mem.
set(state_addr + 7, MemoryValue::from<uint64_t>(7));
383 ".*Invalid tag for sha256 state values.*");
384 TestTraceContainer
trace;
385 trace.
set(C::precomputed_first_row, 0, 1);
388 const auto sha256_event_container = sha256_event_emitter.dump_events();
393 check_relation<sha256_mem>(
trace);
394 check_relation<sha256>(
trace);
401TEST(Sha256MemoryConstrainingTest, InvalidInputTagErr)
408 EventEmitter<FieldGreaterThanEvent> field_gt_event_emitter;
412 FieldGreaterThan
field_gt(range_check, field_gt_event_emitter);
416 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
419 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
421 for (uint32_t i = 0; i < 8; ++i) {
422 mem.
set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
425 std::array<uint32_t, 14> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };
427 for (uint32_t i = 0; i < 14; ++i) {
428 mem.
set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
430 mem.
set(input_addr + 14, MemoryValue::from<uint64_t>(14));
431 mem.
set(input_addr + 15, MemoryValue::from<uint64_t>(15));
435 ".*Invalid tag for sha256 input values.*");
436 TestTraceContainer
trace;
437 trace.
set(C::precomputed_first_row, 0, 1);
440 const auto sha256_event_container = sha256_event_emitter.dump_events();
444 if (getenv(
"AVM_DEBUG") !=
nullptr) {
445 InteractiveDebugger debugger(
trace);
449 check_relation<sha256_mem>(
trace);
450 check_relation<sha256>(
trace);
457TEST(Sha256MemoryConstrainingTest, PropagateError)
464 EventEmitter<FieldGreaterThanEvent> field_gt_event_emitter;
466 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
469 FieldGreaterThan
field_gt(range_check, field_gt_event_emitter);
480 TestTraceContainer
trace({
482 { C::precomputed_first_row, 1 },
484 { C::execution_sel, 1 },
486 { C::execution_sel_execute_sha256_compression, 1 },
487 { C::execution_rop_0_, output_addr },
488 { C::execution_rop_1_, state_addr },
489 { C::execution_rop_2_, input_addr },
490 { C::execution_sel_opcode_error, 1 },
494 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
495 for (uint32_t i = 0; i < state.size(); ++i) {
496 mem.
set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
499 { C::memory_sel, 1 },
501 { C::memory_address, state_addr + i },
502 { C::memory_value, state[i] },
508 std::array<uint32_t, 13> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
509 for (uint32_t i = 0; i < input.size(); ++i) {
510 mem.
set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
513 { C::memory_sel, 1 },
515 { C::memory_address, input_addr + i },
516 { C::memory_value, input[i] },
522 mem.
set(input_addr + 13, MemoryValue::from<uint64_t>(13));
523 trace.
set(state.size() + input.size(),
525 { C::memory_sel, 1 },
527 { C::memory_address, input_addr + 13 },
528 { C::memory_value, 13 },
532 EXPECT_THROW(sha256_gadget.compression(
mem, state_addr, input_addr, output_addr),
536 const auto sha256_event_container = sha256_event_emitter.dump_events();
546 if (getenv(
"AVM_DEBUG") !=
nullptr) {
547 InteractiveDebugger debugger(
trace);
551 check_relation<sha256_mem>(
trace);
552 check_relation<sha256>(
trace);
553 check_all_interactions<Sha256TraceBuilder>(
trace);
556TEST(Sha256MemoryConstrainingTest, Complex)
563 EventEmitter<FieldGreaterThanEvent> field_gt_event_emitter;
565 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
569 FieldGreaterThan
field_gt(range_check, field_gt_event_emitter);
580 TestTraceContainer
trace({
582 { C::precomputed_first_row, 1 },
584 { C::execution_sel, 1 },
586 { C::execution_sel_execute_sha256_compression, 1 },
588 { C::execution_rop_1_, state_addr },
589 { C::execution_rop_2_, input_addr },
590 { C::execution_sel_opcode_error, 1 },
594 { C::execution_sel, 1 },
596 { C::execution_sel_execute_sha256_compression, 1 },
597 { C::execution_rop_0_, output_addr },
598 { C::execution_rop_1_, state_addr },
599 { C::execution_rop_2_, input_addr },
603 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
604 for (uint32_t i = 0; i < state.size(); ++i) {
605 mem.
set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
608 { C::memory_sel, 1 },
609 { C::memory_clk, 1 },
611 { C::memory_address, state_addr + i },
612 { C::memory_value, state[i] },
618 std::array<uint32_t, 16> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
619 for (uint32_t i = 0; i < input.size(); ++i) {
620 mem.
set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
623 { C::memory_sel, 1 },
624 { C::memory_clk, 1 },
626 { C::memory_address, input_addr + i },
627 { C::memory_value, input[i] },
634 for (uint32_t i = 0; i < expected_output.size(); ++i) {
635 mem.
set(output_addr + i, MemoryValue::from<uint32_t>(expected_output[i]));
636 trace.
set(i + state.size() + input.size(),
638 { C::memory_sel, 1 },
639 { C::memory_clk, 1 },
640 { C::memory_space_id, mem.get_space_id() },
641 { C::memory_address, output_addr + i },
642 { C::memory_value, expected_output[i] },
643 { C::memory_tag, static_cast<uint8_t>(MemoryTag::U32) },
650 sha256_gadget.compression(
mem, state_addr, input_addr, output_addr);
653 const auto sha256_event_container = sha256_event_emitter.dump_events();
663 BitwiseTraceBuilder bitwise_builder;
666 if (getenv(
"AVM_DEBUG") !=
nullptr) {
667 InteractiveDebugger debugger(
trace);
671 check_relation<sha256_mem>(
trace);
672 check_relation<sha256>(
trace);
673 check_all_interactions<Sha256TraceBuilder>(
trace);
#define AVM_HIGHEST_MEM_ADDRESS
uint32_t get_space_id() const override
void set(MemoryAddress index, MemoryValue value) override
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
NoopEventEmitter< BitwiseEvent > bitwise_event_emitter
NiceMock< MockFieldGreaterThan > field_gt