Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
graph_description_secp256r1.test.cpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: not started, auditors: [], commit: }
3// external_1: { status: not started, auditors: [], commit: }
4// external_2: { status: not started, auditors: [], commit: }
5// =====================
6
15
16using namespace bb;
17using namespace cdg;
18
19namespace {
21}
22
28
29namespace {
30
31template <typename Bigfield> void fix_bigfield(const Bigfield& bf)
32{
34}
35
40void fix_biggroup_element(const element_ct& point)
41{
42 fix_bigfield(point.x());
43 fix_bigfield(point.y());
44}
45
46// Variables-in-one-gate emitted by `secp256r1_ecdsa_mul` after `finalize_circuit()`.
47//
48// All 10 come from `T2_neg.conditional_select(T2, beta2_neg)` in `biggroup_secp256r1.hpp`. A
49// biggroup conditional_select expands to two bigfield `conditional_assign`s (one per coordinate),
50// each emitting 5 single-row arithmetic gates of the form
51// w_4 = w_o · (1 - cond) (q_arith=1, q_m=-1, q3=1, q4=-1; `cond` is the shared w_l)
52// — one per bigfield limb (4 binary basis + 1 prime basis). 2 coords × 5 limbs = 10.
53//
54// Each gate fully pins its `w_4`; the analyzer's "in one gate" heuristic is a known false positive
55// for this single-row conditional-assign pattern (raw scan confirms exactly 1 occurrence per var
56// in the trace). Input-independence verified by `ecdsa_mul_edge_cases`.
57constexpr size_t EXPECTED_ECDSA_MUL_ONE_GATE_VARS = 10;
58
59void run_ecdsa_mul_circuit_and_check(const secp256r1_ct::ScalarFieldNative& u1_native,
60 const secp256r1_ct::ScalarFieldNative& u2_native,
61 const secp256r1_ct::AffineElementNative& pubkey_native,
62 size_t expected_one_gate)
63{
65 element_ct pubkey = element_ct::from_witness(&builder, pubkey_native);
68 fix_biggroup_element(pubkey);
69 fix_bigfield(u1);
70 fix_bigfield(u2);
71
72 auto output = element_ct::secp256r1_ecdsa_mul(pubkey, u1, u2);
73 fix_biggroup_element(output.result);
74
75 builder.finalize_circuit();
76 EXPECT_TRUE(CircuitChecker::check(builder));
77 auto graph = StaticAnalyzer(builder);
78 auto variables_in_one_gate = graph.get_variables_in_one_gate();
79 EXPECT_EQ(variables_in_one_gate.size(), expected_one_gate);
80}
81
82} // namespace
83
90TEST(boomerang_secp256r1, fixed_base_mul)
91{
93 auto scalar = secp256r1_ct::ScalarFieldNative::random_element(&engine);
95 fix_bigfield(u);
96
97 auto output = element_ct::secp256r1_fixed_base_mul(u);
98 fix_biggroup_element(output);
99
100 builder.finalize_circuit();
101 EXPECT_TRUE(CircuitChecker::check(builder));
102 auto graph = StaticAnalyzer(builder);
103 auto variables_in_one_gate = graph.get_variables_in_one_gate();
104 EXPECT_EQ(variables_in_one_gate.size(), 0);
105}
106
110TEST(boomerang_secp256r1, ecdsa_mul)
111{
113 auto u1 = FrN::random_element(&engine);
114 auto u2 = FrN::random_element(&engine);
115 auto pk_scalar = FrN::random_element(&engine);
116 auto pk = secp256r1_ct::AffineElementNative(secp256r1_ct::GroupNative::one * pk_scalar);
117 run_ecdsa_mul_circuit_and_check(u1, u2, pk, EXPECTED_ECDSA_MUL_ONE_GATE_VARS);
118}
119
126TEST(boomerang_secp256r1, fixed_base_mul_u_zero)
127{
129 scalar_ct u = scalar_ct::from_witness(&builder, secp256r1_ct::ScalarFieldNative::zero());
130 fix_bigfield(u);
131 auto output = element_ct::secp256r1_fixed_base_mul(u);
132 fix_biggroup_element(output);
133
134 builder.finalize_circuit();
135 EXPECT_TRUE(CircuitChecker::check(builder));
136 auto graph = StaticAnalyzer(builder);
137 auto variables_in_one_gate = graph.get_variables_in_one_gate();
138 EXPECT_EQ(variables_in_one_gate.size(), 0);
139}
140
148TEST(boomerang_secp256r1, two_ecdsa_muls_in_same_builder)
149{
152 auto build_one = [&] {
153 auto pk_scalar = FrN::random_element(&engine);
154 auto pk = secp256r1_ct::AffineElementNative(secp256r1_ct::GroupNative::one * pk_scalar);
155 element_ct pubkey = element_ct::from_witness(&builder, pk);
156 scalar_ct u1 = scalar_ct::from_witness(&builder, FrN::random_element(&engine));
157 scalar_ct u2 = scalar_ct::from_witness(&builder, FrN::random_element(&engine));
158 fix_biggroup_element(pubkey);
159 fix_bigfield(u1);
160 fix_bigfield(u2);
161 auto out = element_ct::secp256r1_ecdsa_mul(pubkey, u1, u2);
162 fix_biggroup_element(out.result);
163 };
164 build_one();
165 build_one();
166
167 builder.finalize_circuit();
168 EXPECT_TRUE(CircuitChecker::check(builder));
169 auto graph = StaticAnalyzer(builder);
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);
172}
173
185TEST(boomerang_secp256r1, ecdsa_mul_edge_cases)
186{
188 auto pk_scalar = FrN::random_element(&engine);
189 auto pk = secp256r1_ct::AffineElementNative(secp256r1_ct::GroupNative::one * pk_scalar);
190 auto random_u = [&] { return FrN::random_element(&engine); };
191
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);
197}
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)
Definition bigfield.hpp:322
AluTraceBuilder builder
Definition alu.test.cpp:124
numeric::RNG & engine
secp256r1_ct::Group element_ct
RNG & get_debug_randomness(bool reset, std::uint_fast64_t seed)
Definition engine.cpp:245
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
UltraCircuitBuilder_< UltraExecutionTraceBlocks > UltraCircuitBuilder
TEST(BoomerangMegaCircuitBuilder, BasicCircuit)
Definition graph.cpp:21
UltraStaticAnalyzer StaticAnalyzer
Definition graph.hpp:190
bb::VectorAffineElementPushSpan< BaseParams > out
element< CircuitType, BaseField, ScalarField, GroupNative > Group
Definition secp256r1.hpp:31
bigfield< CircuitType, typename ::bb::secp256r1::FrParams > ScalarField
Definition secp256r1.hpp:29
GroupNative::affine_element AffineElementNative
Definition secp256r1.hpp:26
::bb::secp256r1::fr ScalarFieldNative
Definition secp256r1.hpp:22