Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
group.hpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: Planned, auditors: [], commit: }
3// external_1: { status: not started, auditors: [], commit: }
4// external_2: { status: not started, auditors: [], commit: }
5// =====================
6
7#pragma once
8
9#include "../../common/assert.hpp"
10#include "./affine_element.hpp"
11#include "./element.hpp"
12#include "./wnaf.hpp"
15#include <array>
16#include <cinttypes>
17#include <cstdint>
18#include <cstdio>
19#include <cstdlib>
20
21namespace bb {
22
36template <typename Fq_, typename Fr_, typename Params> class group {
37 public:
38 // Allow using group::Fq and group::Fr
39 using Fq = Fq_;
40 using Fr = Fr_;
43 static constexpr bool USE_ENDOMORPHISM = Params::USE_ENDOMORPHISM;
44 static constexpr bool has_a = Params::has_a;
45
46 static constexpr element one{ Params::one_x, Params::one_y, Fq::one() };
48 static constexpr affine_element affine_one{ Params::one_x, Params::one_y };
50 static constexpr Fq curve_a = Params::a;
51 static constexpr Fq curve_b = Params::b;
52
87 inline static std::vector<affine_element> derive_generators(const std::vector<uint8_t>& domain_separator_bytes,
88 const size_t num_generators,
89 const size_t starting_index = 0)
90 {
91 // Safety: domain_separator_bytes is indexed via &domain_separator_bytes[0] below.
92 // An empty domain separator would be UB and also defeats domain separation.
93 BB_ASSERT(!domain_separator_bytes.empty(), "derive_generators: domain_separator_bytes must be non-empty");
94
95 // We serialize the generator index into 4 bytes (uint32_t). Ensure we never silently truncate.
96 if (num_generators > 0) {
97 BB_ASSERT(starting_index <= static_cast<size_t>(UINT32_MAX),
98 "derive_generators: starting_index exceeds uint32 range");
99 BB_ASSERT(num_generators - 1 <= static_cast<size_t>(UINT32_MAX) - starting_index,
100 "derive_generators: starting_index + num_generators exceeds uint32 range");
101 }
102
104 const auto domain_hash = blake3::blake3s_constexpr(&domain_separator_bytes[0], domain_separator_bytes.size());
105 std::vector<uint8_t> generator_preimage;
106 generator_preimage.reserve(64);
107 std::copy(domain_hash.begin(), domain_hash.end(), std::back_inserter(generator_preimage));
108 for (size_t i = 0; i < 32; ++i) {
109 generator_preimage.emplace_back(0);
110 }
111 for (size_t i = starting_index; i < starting_index + num_generators; ++i) {
112 auto generator_index = static_cast<uint32_t>(i);
113 uint32_t mask = 0xff;
114 generator_preimage[32] = static_cast<uint8_t>(generator_index >> 24);
115 generator_preimage[33] = static_cast<uint8_t>((generator_index >> 16) & mask);
116 generator_preimage[34] = static_cast<uint8_t>((generator_index >> 8) & mask);
117 generator_preimage[35] = static_cast<uint8_t>(generator_index & mask);
118 result.push_back(affine_element::hash_to_curve(generator_preimage));
119 }
120 return result;
121 }
122
123 inline static std::vector<affine_element> derive_generators(const std::string_view& domain_separator,
124 const size_t num_generators,
125 const size_t starting_index = 0)
126 {
127 std::vector<uint8_t> domain_bytes;
128 for (char i : domain_separator) {
129 domain_bytes.emplace_back(static_cast<unsigned char>(i));
130 }
131 return derive_generators(domain_bytes, num_generators, starting_index);
132 }
133
135 affine_element* dest,
136 uint64_t predicate);
137};
138
139} // namespace bb
140
141#ifdef DISABLE_ASM
142#include "group_impl_int128.tcc"
143#else
144#include "group_impl_asm.tcc"
145#endif
#define BB_ASSERT(expression,...)
Definition assert.hpp:70
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.
constexpr affine_element set_infinity() const noexcept
element class. Implements ecc group arithmetic using Jacobian coordinates See https://hyperelliptic....
Definition element.hpp:33
BB_INLINE constexpr element set_infinity() const noexcept
group class. Represents an elliptic curve group element. Group is parametrised by Fq and Fr
Definition group.hpp:36
static constexpr element one
Definition group.hpp:46
static constexpr affine_element affine_one
Definition group.hpp:48
static constexpr element point_at_infinity
Definition group.hpp:47
Fq_ Fq
Definition group.hpp:39
static constexpr Fq curve_b
Definition group.hpp:51
Fr_ Fr
Definition group.hpp:40
static std::vector< affine_element > derive_generators(const std::string_view &domain_separator, const size_t num_generators, const size_t starting_index=0)
Definition group.hpp:123
static constexpr bool USE_ENDOMORPHISM
Definition group.hpp:43
static constexpr Fq curve_a
Definition group.hpp:50
static constexpr bool has_a
Definition group.hpp:44
static constexpr affine_element affine_point_at_infinity
Definition group.hpp:49
static 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:87
static BB_INLINE void conditional_negate_affine(const affine_element *src, affine_element *dest, uint64_t predicate)
#define BB_INLINE
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
constexpr std::array< uint8_t, BLAKE3_OUT_LEN > blake3s_constexpr(const uint8_t *input, size_t input_size)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
static constexpr field one()