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
38template <typename Fq_, typename Fr_, typename Params> class group {
39 public:
40 // Allow using group::Fq and group::Fr
41 using Fq = Fq_;
42 using Fr = Fr_;
45 static constexpr bool USE_ENDOMORPHISM = Params::USE_ENDOMORPHISM;
46 static constexpr bool has_a = Params::has_a;
47
48 static constexpr element one{ Params::one_x, Params::one_y, Fq::one() };
50 static constexpr affine_element affine_one{ Params::one_x, Params::one_y };
52 static constexpr Fq curve_a = Params::a;
53 static constexpr Fq curve_b = Params::b;
54
92 inline static std::vector<affine_element> derive_generators(const std::vector<uint8_t>& domain_separator_bytes,
93 const size_t num_generators,
94 const size_t starting_index = 0)
95 {
96 // Safety: domain_separator_bytes is indexed via &domain_separator_bytes[0] below.
97 // An empty domain separator would be UB and also defeats domain separation.
98 BB_ASSERT(!domain_separator_bytes.empty(), "derive_generators: domain_separator_bytes must be non-empty");
99
100 // We serialize the generator index into 4 bytes (uint32_t). Ensure we never silently truncate.
101 if (num_generators > 0) {
102 BB_ASSERT(starting_index <= static_cast<size_t>(UINT32_MAX),
103 "derive_generators: starting_index exceeds uint32 range");
104 BB_ASSERT(num_generators - 1 <= static_cast<size_t>(UINT32_MAX) - starting_index,
105 "derive_generators: starting_index + num_generators exceeds uint32 range");
106 }
107
109 const auto domain_hash = blake3::blake3s_constexpr(&domain_separator_bytes[0], domain_separator_bytes.size());
110 std::vector<uint8_t> generator_preimage;
111 generator_preimage.reserve(64);
112 std::copy(domain_hash.begin(), domain_hash.end(), std::back_inserter(generator_preimage));
113 for (size_t i = 0; i < 32; ++i) {
114 generator_preimage.emplace_back(0);
115 }
116 for (size_t i = starting_index; i < starting_index + num_generators; ++i) {
117 auto generator_index = static_cast<uint32_t>(i);
118 uint32_t mask = 0xff;
119 generator_preimage[32] = static_cast<uint8_t>(generator_index >> 24);
120 generator_preimage[33] = static_cast<uint8_t>((generator_index >> 16) & mask);
121 generator_preimage[34] = static_cast<uint8_t>((generator_index >> 8) & mask);
122 generator_preimage[35] = static_cast<uint8_t>(generator_index & mask);
123 result.push_back(affine_element::hash_to_curve(generator_preimage));
124 }
125 return result;
126 }
127
128 inline static std::vector<affine_element> derive_generators(const std::string_view& domain_separator,
129 const size_t num_generators,
130 const size_t starting_index = 0)
131 {
132 std::vector<uint8_t> domain_bytes;
133 for (char i : domain_separator) {
134 domain_bytes.emplace_back(static_cast<unsigned char>(i));
135 }
136 return derive_generators(domain_bytes, num_generators, starting_index);
137 }
138};
139
140} // namespace bb
#define BB_ASSERT(expression,...)
Definition assert.hpp:70
static 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:35
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:38
static constexpr element one
Definition group.hpp:48
static constexpr affine_element affine_one
Definition group.hpp:50
static constexpr element point_at_infinity
Definition group.hpp:49
Fq_ Fq
Definition group.hpp:41
static constexpr Fq curve_b
Definition group.hpp:53
Fr_ Fr
Definition group.hpp:42
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:128
static constexpr bool USE_ENDOMORPHISM
Definition group.hpp:45
static constexpr Fq curve_a
Definition group.hpp:52
static constexpr bool has_a
Definition group.hpp:46
static constexpr affine_element affine_point_at_infinity
Definition group.hpp:51
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:92
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()