Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
generator_data.test.cpp
Go to the documentation of this file.
1#include "generator_data.hpp"
3#include <gtest/gtest.h>
4#include <vector>
5
6namespace bb::crypto {
7
8TEST(GeneratorContext, DeriveDefaultGenerators)
9{
11 std::vector<grumpkin::g1::affine_element> expected_default_generators;
12
13 expected_default_generators.emplace_back(grumpkin::g1::affine_element(
14 { fr(uint256_t("083e7911d835097629f0067531fc15cafd79a89beecb39903f69572c636f4a5a")),
15 fr(uint256_t("1a7f5efaad7f315c25a918f30cc8d7333fccab7ad7c90f14de81bcc528f9935d")) }));
16 expected_default_generators.emplace_back(grumpkin::g1::affine_element(
17 { fr(uint256_t("054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402")),
18 fr(uint256_t("209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126")) }));
19 expected_default_generators.emplace_back(grumpkin::g1::affine_element(
20 { fr(uint256_t("1c44f2a5207c81c28a8321a5815ce8b1311024bbed131819bbdaf5a2ada84748")),
21 fr(uint256_t("03aaee36e6422a1d0191632ac6599ae9eba5ac2c17a8c920aa3caf8b89c5f8a8")) }));
22 expected_default_generators.emplace_back(grumpkin::g1::affine_element(
23 { fr(uint256_t("26d8b1160c6821a30c65f6cb47124afe01c29f4338f44d4a12c9fccf22fb6fb2")),
24 fr(uint256_t("05c70c3b9c0d25a4c100e3a27bf3cc375f8af8cdd9498ec4089a823d7464caff")) }));
25 expected_default_generators.emplace_back(grumpkin::g1::affine_element(
26 { fr(uint256_t("20ed9c6a1d27271c4498bfce0578d59db1adbeaa8734f7facc097b9b994fcf6e")),
27 fr(uint256_t("29cd7d370938b358c62c4a00f73a0d10aba7e5aaa04704a0713f891ebeb92371")) }));
28 expected_default_generators.emplace_back(grumpkin::g1::affine_element(
29 { fr(uint256_t("0224a8abc6c8b8d50373d64cd2a1ab1567bf372b3b1f7b861d7f01257052d383")),
30 fr(uint256_t("2358629b90eafb299d6650a311e79914b0215eb0a790810b26da5a826726d711")) }));
31 expected_default_generators.emplace_back(grumpkin::g1::affine_element(
32 { fr(uint256_t("0f106f6d46bc904a5290542490b2f238775ff3c445b2f8f704c466655f460a2a")),
33 fr(uint256_t("29ab84d472f1d33f42fe09c47b8f7710f01920d6155250126731e486877bcf27")) }));
34 expected_default_generators.emplace_back(grumpkin::g1::affine_element(
35 { fr(uint256_t("0298f2e42249f0519c8a8abd91567ebe016e480f219b8c19461d6a595cc33696")),
36 fr(uint256_t("035bec4b8520a4ece27bd5aafabee3dfe1390d7439c419a8c55aceb207aac83b")) }));
37
38 EXPECT_EQ(default_generators.size(), expected_default_generators.size());
39 for (size_t i = 0; i < default_generators.size(); ++i) {
40 EXPECT_EQ(default_generators[i], expected_default_generators[i]);
41 }
42
43 // Verifies that the hard-coded precomputed generators match the derivation
45 bb::detail::DomainSeparator("DEFAULT_DOMAIN_SEPARATOR"),
47}
48
49// Tests generator_data<Grumpkin>::get() for different domain separators, num_generators, and offsets.
50TEST(GeneratorContext, GeneratorDataGetVariousCases)
51{
53
54 constexpr size_t default_num_generators = generator_data<curve::Grumpkin>::DEFAULT_NUM_GENERATORS; // 8
55 constexpr std::string_view default_domain_separator =
57 constexpr std::string_view domain_separator = "TEST_DOMAIN_SEPARATOR"; // custom non-default domain
58
59 // Choose (n, offset) pairs that hit reach various branches in get(): (1) n+offset < 8, (2) n+offset == 8,
60 // (3)n+offset > 8
61 struct Case {
62 size_t num_generators;
63 size_t offset;
64 };
65 constexpr std::array<Case, 3> cases{ { { 5, 0 }, { 6, 2 }, { 9, 1 } } };
66
67 // Test both default and non-default domain separators
68 constexpr std::array<std::string_view, 2> domains{ { default_domain_separator, domain_separator } };
69
70 for (auto domain : domains) {
71 for (auto test_case : cases) {
72 const size_t num_generators = test_case.num_generators;
73 const size_t offset = test_case.offset;
74
75 // Compute generators using get()
76 auto generators = generator_d.get(num_generators, offset, domain);
77 ASSERT_EQ(generators.size(), num_generators);
78
79 auto derived_generators =
80 grumpkin::g1::derive_generators(domain, num_generators + offset, /*starting_index=*/0);
81 ASSERT_EQ(derived_generators.size(), num_generators + offset);
82
83 for (size_t i = 0; i < num_generators; ++i) {
84 EXPECT_EQ(generators[i], derived_generators[offset + i]);
85 }
86
87 const bool is_default_domain = (domain == default_domain_separator);
88
89 // For default-domain and num_generators + offset <= default_num_generators, the values must match
90 // precomputed_generators.
91 if (is_default_domain && (num_generators + offset <= default_num_generators)) {
93 ASSERT_GE(default_generators.size(), num_generators + offset);
94
95 for (size_t i = 0; i < num_generators; ++i) {
96 EXPECT_EQ(generators[i], default_generators[offset + i]);
97 }
98 }
99 }
100 }
101}
102
103} // namespace bb::crypto
class that stores precomputed generators used for Pedersen commitments and Pedersen hashes
GeneratorView get(const size_t num_generators, const size_t generator_offset=0, const std::string_view domain_separator=DEFAULT_DOMAIN_SEPARATOR) const
Return a view of num_generators generators for a given domain_separator, starting at generator index ...
group class. Represents an elliptic curve group element. Group is parametrised by Fq and Fr
Definition group.hpp:36
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
ssize_t offset
Definition engine.cpp:52
bool check_precomputed_generators()
field< Bn254FrParams > fr
Definition fr.hpp:155
TEST(BoomerangMegaCircuitBuilder, BasicCircuit)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13