Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
bbapi_ecc.cpp
Go to the documentation of this file.
1
6
7namespace bb::bbapi {
8
10{
11 if (!point.on_curve()) {
12 BBAPI_ERROR(request, "Input point must be on the curve");
13 }
14 return { grumpkin::g1::element(point).mul_const_time(scalar).to_affine_const_time() };
15}
16
18{
19 if (!point_a.on_curve()) {
20 BBAPI_ERROR(request, "Input point_a must be on the curve");
21 }
22 if (!point_b.on_curve()) {
23 BBAPI_ERROR(request, "Input point_b must be on the curve");
24 }
25 return { point_a + point_b };
26}
27
29{
30 for (const auto& p : points) {
31 if (!p.on_curve()) {
32 BBAPI_ERROR(request, "Input point must be on the curve");
33 }
34 }
36 output.reserve(points.size());
37 for (const auto& p : points) {
38 output.emplace_back(grumpkin::g1::element(p).mul_const_time(scalar).to_affine_const_time());
39 }
40 return { std::move(output) };
41}
42
47
49{
50 auto bigint_input = from_buffer<uint512_t>(input.data());
51 uint512_t barretenberg_modulus(bb::fr::modulus);
52 uint512_t target_output = bigint_input % barretenberg_modulus;
53 return { bb::fr(target_output.lo) };
54}
55
57{
58 if (!point.on_curve()) {
59 BBAPI_ERROR(request, "Input point must be on the curve");
60 }
61 return { secp256k1::g1::element(point).mul_const_time(scalar).to_affine_const_time() };
62}
63
68
70{
71 auto bigint_input = from_buffer<uint512_t>(input.data());
72 uint512_t secp256k1_modulus(secp256k1::fr::modulus);
73 uint512_t target_output = bigint_input % secp256k1_modulus;
74 return { secp256k1::fr(target_output.lo) };
75}
76
78{
79 auto [is_sqr, root] = input.sqrt();
80 return { is_sqr, root };
81}
82
84{
85 auto [is_sqr, root] = input.sqrt();
86 return { is_sqr, root };
87}
88
90{
91 if (!point.on_curve()) {
92 BBAPI_ERROR(request, "Input point must be on the curve");
93 }
94 auto result = bb::g1::element(point).mul_const_time(scalar).to_affine_const_time();
95 if (!result.on_curve()) {
96 BBAPI_ERROR(request, "Output point must be on the curve");
97 }
98 return { result };
99}
100
102{
103 if (!point.on_curve()) {
104 BBAPI_ERROR(request, "Input point must be on the curve");
105 }
106 // BN254 G2 has cofactor h2 ≈ 2^254. An on-curve point may lie in a cofactor subgroup of order
107 // dividing h2 rather than the prime-order subgroup; we do not want to allow such points
108 // as inputs to bbapi.
109 if (!point.is_in_prime_subgroup()) {
110 BBAPI_ERROR(request, "Input point must lie in the prime-order subgroup");
111 }
112 auto result = point * scalar;
113 if (!result.on_curve()) {
114 BBAPI_ERROR(request, "Output point must be on the curve");
115 }
116 return { result };
117}
118
120{
121 return { point.on_curve() };
122}
123
125{
126 // Convert 32-byte array to uint256_t
127 uint256_t compressed_value = from_buffer<uint256_t>(compressed.data());
128 // Decompress the point
129 auto point = bb::g1::affine_element::from_compressed(compressed_value);
130 // Verify the decompressed point is on the curve
131 if (!point.on_curve()) {
132 BBAPI_ERROR(request, "Decompressed point is not on the curve");
133 }
134 return { point };
135}
136
137} // namespace bb::bbapi
Elliptic curve operations command definitions for the Barretenberg RPC API.
#define BBAPI_ERROR(request, msg)
Macro to set error in BBApiRequest and return default response.
element class. Implements ecc group arithmetic using Jacobian coordinates See https://hyperelliptic....
Definition element.hpp:35
constexpr affine_element< Fq, Fr, Params > to_affine_const_time() const noexcept
element mul_const_time(const Fr &scalar, numeric::RNG *engine=nullptr) const noexcept
Constant-time scalar multiplication intended for secret scalars (e.g. ECDSA / Schnorr nonces).
group_elements::element< Fq, Fr, Params > element
Definition group.hpp:43
#define BB_UNUSED
field< FrParams > fr
field< Bn254FrParams > fr
Definition fr.hpp:155
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
Response execute(BBApiRequest &request) &&
Definition bbapi_ecc.cpp:83
Response execute(BBApiRequest &request) &&
Definition bbapi_ecc.cpp:77
Response execute(BBApiRequest &request) &&
Response execute(BBApiRequest &request) &&
Response execute(BBApiRequest &request) &&
Definition bbapi_ecc.cpp:89
Response execute(BBApiRequest &request) &&
Response execute(BBApiRequest &request) &&
Definition bbapi_ecc.cpp:17
Response execute(BBApiRequest &request) &&
Definition bbapi_ecc.cpp:28
Response execute(BBApiRequest &request) &&
Definition bbapi_ecc.cpp:43
Response execute(BBApiRequest &request) &&
Definition bbapi_ecc.cpp:9
Response execute(BBApiRequest &request) &&
Definition bbapi_ecc.cpp:48
Response execute(BBApiRequest &request) &&
Definition bbapi_ecc.cpp:64
Response execute(BBApiRequest &request) &&
Definition bbapi_ecc.cpp:56
Response execute(BBApiRequest &request) &&
Definition bbapi_ecc.cpp:69
static constexpr uint256_t modulus
static field random_element(numeric::RNG *engine=nullptr) noexcept