1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
24using ::testing::NiceMock;
25using ::testing::TestWithParam;
27using tracegen::FieldGreaterThanTraceBuilder;
28using tracegen::RangeCheckTraceBuilder;
29using tracegen::TestTraceContainer;
31using simulation::DeduplicatingEventEmitter;
32using simulation::EventEmitter;
33using simulation::FieldGreaterThan;
34using simulation::FieldGreaterThanEvent;
35using simulation::MockRangeCheck;
36using simulation::RangeCheck;
37using simulation::RangeCheckEvent;
38using simulation::U256Decomposition;
46TEST(FieldGreaterThanConstrainingTest, EmptyRow)
63 GtTestParams{ 27, 0,
true },
64 GtTestParams{ TWO_POW_128, 0,
true },
65 GtTestParams{ -1, 0,
true },
67 GtTestParams{ 27, 27,
false },
68 GtTestParams{ TWO_POW_128, TWO_POW_128,
false },
69 GtTestParams{ -1, -1,
false },
71 GtTestParams{ 0, 1,
false },
72 GtTestParams{ 0, TWO_POW_128,
false },
73 GtTestParams{ 0, -1,
false },
75 GtTestParams{ 0, 0,
false },
76 GtTestParams{ 1, 0,
true },
78 GtTestParams{ -1, 1,
true },
79 GtTestParams{ -2, -1,
false },
81 GtTestParams{ TWO_POW_128 - 1, TWO_POW_128,
false },
82 GtTestParams{ TWO_POW_128, TWO_POW_128 - 1,
true }
87 DecTestParams{ 0, { .lo = 0, .hi = 0 } },
88 DecTestParams{ 1, { .lo = 1, .hi = 0 } },
90 DecTestParams{
uint256_t(1) << 128, { .lo = 0, .hi = 1 } },
100class GtBasicTest :
public TestWithParam<GtTestParams> {};
102TEST_P(GtBasicTest, BasicComparison)
104 const auto& param = GetParam();
107 DeduplicatingEventEmitter<FieldGreaterThanEvent>
event_emitter;
108 FieldGreaterThan field_gt_simulator(range_check,
event_emitter);
110 EXPECT_EQ(field_gt_simulator.ff_gt(param.a, param.b), param.expected_result);
112 TestTraceContainer
trace({
113 { { C::precomputed_first_row, 1 } },
116 FieldGreaterThanTraceBuilder
builder;
119 check_relation<ff_gt>(trace);
124class DecBasicTest :
public TestWithParam<DecTestParams> {};
126TEST_P(DecBasicTest, BasicDecomposition)
128 const auto& param = GetParam();
131 DeduplicatingEventEmitter<FieldGreaterThanEvent>
event_emitter;
132 FieldGreaterThan field_gt_simulator(range_check,
event_emitter);
134 EXPECT_EQ(field_gt_simulator.canon_dec(param.a), param.expected_result);
136 TestTraceContainer
trace({
137 { { C::precomputed_first_row, 1 } },
140 FieldGreaterThanTraceBuilder
builder;
143 check_relation<ff_gt>(trace);
148class GtInteractionTests :
public TestWithParam<GtTestParams> {};
150TEST_P(GtInteractionTests, InteractionsWithRangeCheck)
152 const auto& param = GetParam();
156 DeduplicatingEventEmitter<FieldGreaterThanEvent>
event_emitter;
157 FieldGreaterThan field_gt_simulator(range_check,
event_emitter);
159 EXPECT_EQ(field_gt_simulator.ff_gt(param.a, param.b), param.expected_result);
161 TestTraceContainer
trace({
162 { { C::precomputed_first_row, 1 } },
165 FieldGreaterThanTraceBuilder
builder;
175 check_relation<ff_gt>(trace);
178INSTANTIATE_TEST_SUITE_P(FieldGreaterThanConstrainingTest, GtInteractionTests, ::testing::ValuesIn(comparison_tests));
180class DecInteractionTests :
public TestWithParam<DecTestParams> {};
182TEST_P(DecInteractionTests, InteractionsWithRangeCheck)
184 const auto& param = GetParam();
188 DeduplicatingEventEmitter<FieldGreaterThanEvent>
event_emitter;
189 FieldGreaterThan field_gt_simulator(range_check,
event_emitter);
191 EXPECT_EQ(field_gt_simulator.canon_dec(param.a), param.expected_result);
193 TestTraceContainer
trace({
194 { { C::precomputed_first_row, 1 } },
197 FieldGreaterThanTraceBuilder
builder;
207 check_relation<ff_gt>(trace);
212 ::testing::ValuesIn(decomposition_tests));
214TEST(FieldGreaterThanConstrainingTest, NegativeManipulatedDecompositions)
217 DeduplicatingEventEmitter<FieldGreaterThanEvent>
event_emitter;
218 FieldGreaterThan field_gt_simulator(range_check,
event_emitter);
220 field_gt_simulator.ff_gt(0, 0);
222 TestTraceContainer
trace({
223 { { C::precomputed_first_row, 1 } },
226 FieldGreaterThanTraceBuilder
builder;
228 check_relation<ff_gt>(trace);
230 trace.
set(Column::ff_gt_a_lo, 1, 1);
231 trace.
set(Column::ff_gt_b_hi, 1, 1);
239TEST(FieldGreaterThanConstrainingTest, NegativeManipulatedComparisonsWithP)
242 DeduplicatingEventEmitter<FieldGreaterThanEvent>
event_emitter;
243 FieldGreaterThan field_gt_simulator(range_check,
event_emitter);
245 field_gt_simulator.ff_gt(0, 0);
247 TestTraceContainer
trace({
248 { { C::precomputed_first_row, 1 } },
251 FieldGreaterThanTraceBuilder
builder;
253 check_relation<ff_gt>(trace);
260 trace.
set(Column::ff_gt_a_lo, 1, p_lo);
261 trace.
set(Column::ff_gt_a_hi, 1, p_hi);
262 trace.
set(Column::ff_gt_b_lo, 1, p_lo);
263 trace.
set(Column::ff_gt_b_hi, 1, p_hi);
265 trace.
set(Column::ff_gt_p_sub_a_hi, 1, p_lo - 1);
266 trace.
set(Column::ff_gt_p_sub_a_lo, 1, p_hi - 1);
267 trace.
set(Column::ff_gt_p_sub_b_hi, 1, p_lo - 1);
268 trace.
set(Column::ff_gt_p_sub_b_lo, 1, p_hi - 1);
280TEST(FieldGreaterThanConstrainingTest, NegativeLessRangeChecks)
283 DeduplicatingEventEmitter<FieldGreaterThanEvent>
event_emitter;
284 FieldGreaterThan field_gt_simulator(range_check,
event_emitter);
286 field_gt_simulator.ff_gt(0, 0);
288 TestTraceContainer
trace({
289 { { C::precomputed_first_row, 1 } },
292 FieldGreaterThanTraceBuilder
builder;
294 check_relation<ff_gt>(trace);
296 trace.
set(Column::ff_gt_cmp_rng_ctr, 1, 3);
297 trace.
set(Column::ff_gt_cmp_rng_ctr, 2, 0);
305TEST(FieldGreaterThanConstrainingTest, NegativeRangeCheckCtrInitInDec)
308 DeduplicatingEventEmitter<FieldGreaterThanEvent>
event_emitter;
309 FieldGreaterThan field_gt_simulator(range_check,
event_emitter);
311 field_gt_simulator.canon_dec(0);
313 TestTraceContainer
trace({
314 { { C::precomputed_first_row, 1 } },
317 FieldGreaterThanTraceBuilder
builder;
319 check_relation<ff_gt>(trace);
321 trace.
set(Column::ff_gt_cmp_rng_ctr, 1, 4);
322 trace.
set(Column::ff_gt_cmp_rng_ctr, 2, 2);
330TEST(FieldGreaterThanConstrainingTest, NegativeSelectorConsistency)
333 DeduplicatingEventEmitter<FieldGreaterThanEvent>
event_emitter;
334 FieldGreaterThan field_gt_simulator(range_check,
event_emitter);
336 field_gt_simulator.ff_gt(0, 0);
338 TestTraceContainer
trace({
339 { { C::precomputed_first_row, 1 } },
342 FieldGreaterThanTraceBuilder
builder;
344 check_relation<ff_gt>(trace);
353TEST(FieldGreaterThanConstrainingTest, NegativeEraseShift)
356 DeduplicatingEventEmitter<FieldGreaterThanEvent>
event_emitter;
357 FieldGreaterThan field_gt_simulator(range_check,
event_emitter);
359 field_gt_simulator.ff_gt(42, 27);
361 TestTraceContainer
trace({
362 { { C::precomputed_first_row, 1 } },
365 FieldGreaterThanTraceBuilder
builder;
367 check_relation<ff_gt>(trace);
369 trace.
set(Column::ff_gt_a_lo, 2, 0);
370 trace.
set(Column::ff_gt_a_hi, 2, 0);
371 trace.
set(Column::ff_gt_p_sub_a_lo, 2, 0);
372 trace.
set(Column::ff_gt_p_sub_a_hi, 2, 0);
373 trace.
set(Column::ff_gt_b_lo, 2, 0);
374 trace.
set(Column::ff_gt_b_hi, 2, 0);
375 trace.
set(Column::ff_gt_p_sub_b_lo, 2, 0);
376 trace.
set(Column::ff_gt_p_sub_b_hi, 2, 1);
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessageRegex)
INSTANTIATE_TEST_SUITE_P(All, KernelIOTamperingTests, testing::Values(KernelIOField::PAIRING_INPUTS, KernelIOField::ACCUMULATOR_HASH, KernelIOField::KERNEL_RETURN_DATA, KernelIOField::APP_RETURN_DATA, KernelIOField::ECC_OP_HASH), [](const testing::TestParamInfo< KernelIOField > &info) { switch(info.param) { case KernelIOField::PAIRING_INPUTS:return "PairingInputs";case KernelIOField::ACCUMULATOR_HASH:return "AccumulatorHash";case KernelIOField::KERNEL_RETURN_DATA:return "KernelReturnData";case KernelIOField::APP_RETURN_DATA:return "AppReturnData";case KernelIOField::ECC_OP_HASH:return "EccOpHash";} return "Unknown";})
TEST_P(KernelIOTamperingTests, CausesVerificationFailure)
static constexpr size_t SR_P_SUB_B_LO
static constexpr size_t SR_RNG_CTR_GT_INIT
static constexpr size_t SR_RNG_CTR_DECREMENT
static constexpr size_t SR_P_SUB_A_LO
static constexpr size_t SR_B_DECOMPOSITION
static constexpr size_t SR_SHIFT_RES_TO_P_SUB_B_LO
static constexpr size_t SR_SHIFT_P_SUB_B_TO_B_LO
static constexpr size_t SR_P_SUB_B_HI
static constexpr size_t SR_SHIFT_B_TO_P_SUB_A_HI
static constexpr size_t SR_SHIFT_P_SUB_B_TO_B_HI
static constexpr size_t SR_SHIFT_P_SUB_A_TO_A_LO
static constexpr size_t SR_SHIFT_B_TO_P_SUB_A_LO
static constexpr size_t SR_P_SUB_A_HI
static constexpr size_t SR_A_DECOMPOSITION
static constexpr size_t SR_SHIFT_RES_TO_P_SUB_B_HI
static constexpr size_t SR_TRACE_CONTINUITY
static std::string get_subrelation_label(size_t index)
static constexpr size_t SR_SHIFT_P_SUB_A_TO_A_HI
static constexpr size_t SR_RNG_CTR_DEC_INIT
void process(const simulation::EventEmitterInterface< simulation::AluEvent >::Container &events, TraceContainer &trace)
Process the ALU events and populate the ALU relevant columns in the trace.
void process(const simulation::EventEmitterInterface< simulation::RangeCheckEvent >::Container &events, TraceContainer &trace)
Processes range check events and populates the trace with decomposed value columns.
uint32_t get_num_rows() const
void set(Column col, uint32_t row, const FF &value, bool use_atomic_limbs=false)
RangeCheckTraceBuilder range_check_builder
EventEmitter< RangeCheckEvent > range_check_event_emitter
EventEmitter< DataCopyEvent > event_emitter
void check_interaction(tracegen::TestTraceContainer &trace)
TEST(AvmFixedVKTests, FixedVKCommitments)
Test that the fixed VK commitments agree with the ones computed from precomputed columns.
U256Decomposition decompose_256(const uint256_t &x)
TestTraceContainer empty_trace()
lookup_settings< lookup_ff_gt_a_lo_range_settings_ > lookup_ff_gt_a_lo_range_settings
lookup_settings< lookup_ff_gt_a_hi_range_settings_ > lookup_ff_gt_a_hi_range_settings
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
unsigned __int128 uint128_t
static constexpr uint256_t modulus