11 if (!point.on_curve()) {
12 BBAPI_ERROR(request,
"Input point must be on the curve");
19 if (!point_a.on_curve()) {
20 BBAPI_ERROR(request,
"Input point_a must be on the curve");
22 if (!point_b.on_curve()) {
23 BBAPI_ERROR(request,
"Input point_b must be on the curve");
25 return { point_a + point_b };
30 for (
const auto& p : points) {
32 BBAPI_ERROR(request,
"Input point must be on the curve");
36 output.reserve(points.size());
37 for (
const auto& p : points) {
50 auto bigint_input = from_buffer<uint512_t>(input.data());
52 uint512_t target_output = bigint_input % barretenberg_modulus;
58 if (!point.on_curve()) {
59 BBAPI_ERROR(request,
"Input point must be on the curve");
71 auto bigint_input = from_buffer<uint512_t>(input.data());
73 uint512_t target_output = bigint_input % secp256k1_modulus;
79 auto [is_sqr, root] = input.sqrt();
80 return { is_sqr, root };
85 auto [is_sqr, root] = input.sqrt();
86 return { is_sqr, root };
91 if (!point.on_curve()) {
92 BBAPI_ERROR(request,
"Input point must be on the curve");
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");
103 if (!point.on_curve()) {
104 BBAPI_ERROR(request,
"Input point must be on the curve");
109 if (!point.is_in_prime_subgroup()) {
110 BBAPI_ERROR(request,
"Input point must lie in the prime-order subgroup");
112 auto result = point * scalar;
113 if (!result.on_curve()) {
114 BBAPI_ERROR(request,
"Output point must be on the curve");
121 return { point.on_curve() };
127 uint256_t compressed_value = from_buffer<uint256_t>(compressed.data());
129 auto point = bb::g1::affine_element::from_compressed(compressed_value);
131 if (!point.on_curve()) {
132 BBAPI_ERROR(request,
"Decompressed point is not on the curve");
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....
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
field< Bn254FrParams > fr
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Response execute(BBApiRequest &request) &&
Response execute(BBApiRequest &request) &&
Response execute(BBApiRequest &request) &&
Response execute(BBApiRequest &request) &&
Response execute(BBApiRequest &request) &&
Response execute(BBApiRequest &request) &&
Response execute(BBApiRequest &request) &&
Response execute(BBApiRequest &request) &&
Response execute(BBApiRequest &request) &&
Response execute(BBApiRequest &request) &&
Response execute(BBApiRequest &request) &&
Response execute(BBApiRequest &request) &&
Response execute(BBApiRequest &request) &&
Response execute(BBApiRequest &request) &&
static constexpr uint256_t modulus
static field random_element(numeric::RNG *engine=nullptr) noexcept