31template <
typename Bigfield>
void fix_bigfield(
const Bigfield& bf)
40void fix_biggroup_element(
const element_ct& point)
42 fix_bigfield(point.x());
43 fix_bigfield(point.y());
57constexpr size_t EXPECTED_ECDSA_MUL_ONE_GATE_VARS = 10;
62 size_t expected_one_gate)
68 fix_biggroup_element(pubkey);
72 auto output = element_ct::secp256r1_ecdsa_mul(pubkey, u1, u2);
73 fix_biggroup_element(output.result);
78 auto variables_in_one_gate = graph.get_variables_in_one_gate();
79 EXPECT_EQ(variables_in_one_gate.size(), expected_one_gate);
90TEST(boomerang_secp256r1, fixed_base_mul)
93 auto scalar = secp256r1_ct::ScalarFieldNative::random_element(&
engine);
97 auto output = element_ct::secp256r1_fixed_base_mul(u);
98 fix_biggroup_element(output);
103 auto variables_in_one_gate = graph.get_variables_in_one_gate();
104 EXPECT_EQ(variables_in_one_gate.size(), 0);
110TEST(boomerang_secp256r1, ecdsa_mul)
113 auto u1 = FrN::random_element(&
engine);
114 auto u2 = FrN::random_element(&
engine);
115 auto pk_scalar = FrN::random_element(&
engine);
117 run_ecdsa_mul_circuit_and_check(u1, u2, pk, EXPECTED_ECDSA_MUL_ONE_GATE_VARS);
126TEST(boomerang_secp256r1, fixed_base_mul_u_zero)
131 auto output = element_ct::secp256r1_fixed_base_mul(u);
132 fix_biggroup_element(output);
137 auto variables_in_one_gate = graph.get_variables_in_one_gate();
138 EXPECT_EQ(variables_in_one_gate.size(), 0);
148TEST(boomerang_secp256r1, two_ecdsa_muls_in_same_builder)
152 auto build_one = [&] {
153 auto pk_scalar = FrN::random_element(&
engine);
158 fix_biggroup_element(pubkey);
161 auto out = element_ct::secp256r1_ecdsa_mul(pubkey, u1, u2);
162 fix_biggroup_element(
out.result);
170 auto variables_in_one_gate = graph.get_variables_in_one_gate();
171 EXPECT_EQ(variables_in_one_gate.size(), 2 * EXPECTED_ECDSA_MUL_ONE_GATE_VARS);
185TEST(boomerang_secp256r1, ecdsa_mul_edge_cases)
188 auto pk_scalar = FrN::random_element(&
engine);
190 auto random_u = [&] {
return FrN::random_element(&
engine); };
192 run_ecdsa_mul_circuit_and_check(random_u(), FrN::zero(), pk, EXPECTED_ECDSA_MUL_ONE_GATE_VARS);
193 run_ecdsa_mul_circuit_and_check(random_u(), FrN::one(), pk, EXPECTED_ECDSA_MUL_ONE_GATE_VARS);
194 run_ecdsa_mul_circuit_and_check(random_u(), -FrN::one(), pk, EXPECTED_ECDSA_MUL_ONE_GATE_VARS);
195 run_ecdsa_mul_circuit_and_check(FrN::zero(), random_u(), pk, EXPECTED_ECDSA_MUL_ONE_GATE_VARS);
196 run_ecdsa_mul_circuit_and_check(FrN::zero(), FrN::zero(), pk, EXPECTED_ECDSA_MUL_ONE_GATE_VARS);
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
static void fix_witness_in_place(const bigfield &bf)
static bigfield from_witness(Builder *ctx, const bb::field< T > &input)
secp256r1_ct::Group element_ct
RNG & get_debug_randomness(bool reset, std::uint_fast64_t seed)
Entry point for Barretenberg command-line interface.
UltraCircuitBuilder_< UltraExecutionTraceBlocks > UltraCircuitBuilder
TEST(BoomerangMegaCircuitBuilder, BasicCircuit)
UltraStaticAnalyzer StaticAnalyzer
bb::VectorAffineElementPushSpan< BaseParams > out
element< CircuitType, BaseField, ScalarField, GroupNative > Group
bigfield< CircuitType, typename ::bb::secp256r1::FrParams > ScalarField
GroupNative::affine_element AffineElementNative
::bb::secp256r1::fr ScalarFieldNative