4#include <fuzzer/FuzzedDataProvider.h>
61 for (
size_t i = 0; i < 4; ++i) {
65 return Fq(limbs[0], limbs[1], limbs[2], limbs[3]);
72 switch (choose_mutation) {
76 uint32_t
offset =
static_cast<uint32_t
>(offset_dist(rng));
119 auto read_point = [](
const uint8_t* src) ->
AffinePoint {
120 bool is_point_at_infinity =
121 std::all_of(src, src + (
sizeof(
Fq) * 2), [](uint8_t val) {
return val == 255; });
122 if (is_point_at_infinity) {
163 int choice = dist(rng);
168 Fq rand_scalar = random_fq_scalar(rng);
174 FF rand_x =
FF(random_fq_scalar(rng));
175 FF rand_y =
FF(random_fq_scalar(rng));
192 std::swap(input.
p, input.
q);
197 input.
p = input.
q *
Fq(-1);
202 input.
scalar = random_fq_scalar(rng);
214 size_t addr_index = addr_dist(rng);
215 input.
addresses[addr_index] = mutate_memory_address(input.
addresses[addr_index], rng);
237 info(
"Input size too small");
281 }
catch (std::exception& e) {
305 "Mul result infinity flag mismatch");
310 { Column::execution_context_id, 0 },
312 { Column::execution_register_0_, point_p.
x() },
313 { Column::execution_register_1_, point_p.
y() },
314 { Column::execution_register_2_, point_p.
is_infinity() ?
FF(1) :
FF(0) },
316 { Column::execution_register_3_, point_q.
x() },
317 { Column::execution_register_4_, point_q.
y() },
318 { Column::execution_register_5_, point_q.
is_infinity() ?
FF(1) :
FF(0) },
320 { Column::execution_rop_6_, input.
addresses[6] },
321 { Column::execution_sel_exec_dispatch_ecc_add, 1 },
322 { Column::execution_sel_opcode_error, error ? 1 : 0 },
341 if (getenv(
"AVM_DEBUG") !=
nullptr) {
342 info(
"Debugging trace:");
347 check_relation<ecc_rel>(
trace);
348 check_relation<scalar_mul_rel>(
trace);
349 check_all_interactions<EccTraceBuilder>(
trace);
350 check_interaction<ExecutionTraceBuilder, bb::avm2::perm_execution_dispatch_to_ecc_add_settings>(
trace);
#define BB_ASSERT(expression,...)
FieldGreaterThan field_gt
EventEmitter< simulation::FieldGreaterThanEvent > field_gt_emitter
EventEmitter< simulation::RangeCheckEvent > range_check_emitter
void run(uint32_t starting_row=0)
constexpr bool is_infinity() const noexcept
constexpr const BaseField & x() const noexcept
constexpr const BaseField & y() const noexcept
static TaggedValue from_tag(ValueTag tag, FF value)
EventEmitter< Event >::Container dump_events()
std::unique_ptr< MemoryInterface > make_memory(uint16_t space_id) override
void set(MemoryAddress index, MemoryValue value) override
const MemoryValue & get(MemoryAddress index) const override
void process(const simulation::EventEmitterInterface< simulation::FieldGreaterThanEvent >::Container &events, TraceContainer &trace)
Processes FieldGreaterThanEvent events and generates trace rows for the ff_gt gadget.
void process(const simulation::EventEmitterInterface< simulation::GreaterThanEvent >::Container &events, TraceContainer &trace)
Process the greater-than events and populate the relevant columns in the trace.
void process_misc(TraceContainer &trace, const uint32_t num_rows=PRECOMPUTED_TRACE_SIZE)
Populate miscellaneous precomputed columns: first_row selector and idx (row index).
void process(const simulation::EventEmitterInterface< simulation::RangeCheckEvent >::Container &events, TraceContainer &trace)
Processes range check events and populates the trace with decomposed value columns.
void process(const simulation::EventEmitterInterface< simulation::ToRadixEvent >::Container &events, TraceContainer &trace)
Processes the non-memory aware to_radix subtrace ingesting ToRadixEvent events. The populated number ...
static constexpr affine_element infinity()
constexpr bool on_curve() const noexcept
static constexpr affine_element one() noexcept
static void serialize_to_buffer(const affine_element &value, uint8_t *buffer, bool write_x_first=false)
Serialize the point to the given buffer.
RangeCheckTraceBuilder range_check_builder
PrecomputedTraceBuilder precomputed_builder
FieldGreaterThanTraceBuilder field_gt_builder
GreaterThanTraceBuilder gt_builder
ExecutionIdManager execution_id_manager
const std::vector< MemoryValue > data
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
size_t LLVMFuzzerCustomMutator(uint8_t *data, size_t size, size_t max_size, unsigned int seed)
std::unique_ptr< uint8_t[]> buffer
AVM range check gadget for witness generation.
StandardAffinePoint< AvmFlavorSettings::EmbeddedCurve::AffineElement > EmbeddedCurvePoint
AvmFlavorSettings::G1::Fq Fq
grumpkin::g1::affine_element AffinePoint
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept