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: not started, auditors: [], date: YYYY-MM-DD }
3// external_1: { status: not started, auditors: [], date: YYYY-MM-DD }
4// external_2: { status: not started, auditors: [], date: YYYY-MM-DD }
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 {
92 const auto domain_hash = blake3::blake3s_constexpr(&domain_separator_bytes[0], domain_separator_bytes.size());
93 std::vector<uint8_t> generator_preimage;
94 generator_preimage.reserve(64);
95 std::copy(domain_hash.begin(), domain_hash.end(), std::back_inserter(generator_preimage));
96 for (size_t i = 0; i < 32; ++i) {
97 generator_preimage.emplace_back(0);
98 }
99 for (size_t i = starting_index; i < starting_index + num_generators; ++i) {
100 auto generator_index = static_cast<uint32_t>(i);
101 uint32_t mask = 0xff;
102 generator_preimage[32] = static_cast<uint8_t>(generator_index >> 24);
103 generator_preimage[33] = static_cast<uint8_t>((generator_index >> 16) & mask);
104 generator_preimage[34] = static_cast<uint8_t>((generator_index >> 8) & mask);
105 generator_preimage[35] = static_cast<uint8_t>(generator_index & mask);
106 result.push_back(affine_element::hash_to_curve(generator_preimage));
107 }
108 return result;
109 }
110
111 inline static std::vector<affine_element> derive_generators(const std::string_view& domain_separator,
112 const size_t num_generators,
113 const size_t starting_index = 0)
114 {
115 std::vector<uint8_t> domain_bytes;
116 for (char i : domain_separator) {
117 domain_bytes.emplace_back(static_cast<unsigned char>(i));
118 }
119 return derive_generators(domain_bytes, num_generators, starting_index);
120 }
121
123 affine_element* dest,
124 uint64_t predicate);
125};
126
127} // namespace bb
128
129#ifdef DISABLE_ASM
130#include "group_impl_int128.tcc"
131#else
132#include "group_impl_asm.tcc"
133#endif
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:111
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.
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()