3#include "../../common/assert.hpp"
4#include "./affine_element.hpp"
5#include "./element.hpp"
7#include "barretenberg/common/constexpr_utils.hpp"
8#include "barretenberg/crypto/blake3s/blake3s.hpp"
29template <
typename _coordinate_field,
typename _subgroup_field,
typename GroupParams>
class group {
32 using coordinate_field = _coordinate_field;
33 using subgroup_field = _subgroup_field;
36 using Fq = coordinate_field;
37 using Fr = subgroup_field;
38 static constexpr bool USE_ENDOMORPHISM = GroupParams::USE_ENDOMORPHISM;
39 static constexpr bool has_a = GroupParams::has_a;
41 static constexpr element one{ GroupParams::one_x, GroupParams::one_y, coordinate_field::one() };
42 static constexpr element point_at_infinity = one.set_infinity();
43 static constexpr affine_element affine_one{ GroupParams::one_x, GroupParams::one_y };
44 static constexpr affine_element affine_point_at_infinity = affine_one.set_infinity();
45 static constexpr coordinate_field curve_a = GroupParams::a;
46 static constexpr coordinate_field curve_b = GroupParams::b;
83 const std::vector<uint8_t>& domain_separator_bytes,
84 const size_t num_generators,
85 const size_t starting_index = 0)
87 std::vector<affine_element> result;
88 const auto domain_hash = blake3::blake3s_constexpr(&domain_separator_bytes[0], domain_separator_bytes.size());
89 std::vector<uint8_t> generator_preimage;
90 generator_preimage.reserve(64);
91 std::copy(domain_hash.begin(), domain_hash.end(), std::back_inserter(generator_preimage));
92 for (
size_t i = 0; i < 32; ++i) {
93 generator_preimage.emplace_back(0);
95 for (
size_t i = starting_index; i < starting_index + num_generators; ++i) {
96 auto generator_index =
static_cast<uint32_t
>(i);
98 generator_preimage[32] =
static_cast<uint8_t
>(generator_index >> 24);
99 generator_preimage[33] =
static_cast<uint8_t
>((generator_index >> 16) & mask);
100 generator_preimage[34] =
static_cast<uint8_t
>((generator_index >> 8) & mask);
101 generator_preimage[35] =
static_cast<uint8_t
>(generator_index & mask);
107 inline static constexpr std::vector<affine_element>
derive_generators(
const std::string_view& domain_separator,
108 const size_t num_generators,
109 const size_t starting_index = 0)
111 std::vector<uint8_t> domain_bytes;
112 for (
char i : domain_separator) {
113 domain_bytes.emplace_back(
static_cast<unsigned char>(i));
118 BBERG_INLINE
static void conditional_negate_affine(
const affine_element* src,
125#ifdef DISABLE_SHENANIGANS
126#include "group_impl_int128.tcc"
128#include "group_impl_asm.tcc"
Definition: affine_element.hpp:11
static constexpr affine_element hash_to_curve(const std::vector< uint8_t > &seed, uint8_t attempt_count=0) noexcept
Hash a seed buffer into a point.
Definition: affine_element_impl.hpp:224
element class. Implements ecc group arithmetic using Jacobian coordinates See https://hyperelliptic....
Definition: element.hpp:27
group class. Represents an elliptic curve group element. Group is parametrised by coordinate_field an...
Definition: group.hpp:29
static constexpr std::vector< affine_element > derive_generators(const std::vector< uint8_t > &domain_separator_bytes, const size_t num_generators, const size_t starting_index=0)
Derives generator points via hash-to-curve.
Definition: group.hpp:82
constexpr_utils defines some helper methods that perform some stl-equivalent operations but in a cons...
Definition: constexpr_utils.hpp:16