Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
field_conversion.test.cpp
Go to the documentation of this file.
4#include <gtest/gtest.h>
5
7
8class FieldConversionTest : public ::testing::Test {
9 public:
10 template <typename T> void check_conversion(T x)
11 {
12 size_t len = FrCodec::calc_num_fields<T>();
13 auto frs = FrCodec::serialize_to_fields(x);
14 EXPECT_EQ(len, frs.size());
15 auto y = FrCodec::deserialize_from_fields<T>(frs);
16 EXPECT_EQ(x, y);
17 }
18};
19
23TEST_F(FieldConversionTest, FieldConversionUint32)
24{
25 auto x = static_cast<uint32_t>(1) << 31;
26 check_conversion(x);
27}
28
32TEST_F(FieldConversionTest, FieldConversionFr)
33{
34 bb::fr x1(std::string("9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789")); // 256 bits
35 check_conversion(x1);
36
37 bb::fr x2(bb::fr::modulus_minus_two); // modulus - 2
38 check_conversion(x2);
39}
40
45TEST_F(FieldConversionTest, FieldConversionGrumpkinFr)
46{
47 grumpkin::fr x1(std::string("9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789")); // 256 bits
48 check_conversion(x1);
49}
50
51namespace {
52bb::fq derive_bn254_y(bb::fq x)
53{
54 auto [found, y] = (x.sqr() * x + Bn254G1Params::b).sqrt();
55 EXPECT_TRUE(found);
56 return y;
57}
58} // namespace
59
64TEST_F(FieldConversionTest, FieldConversionBN254AffineElement)
65{
66 curve::BN254::AffineElement x1(1, derive_bn254_y(1));
67 check_conversion(x1);
68
70 check_conversion(x2);
71}
72
73namespace {
74bb::grumpkin::fq derive_grumpkin_y(bb::grumpkin::fq x)
75{
76 auto [found, y] = (x.sqr() * x + grumpkin::G1Params::b + x * grumpkin::G1Params::a).sqrt();
77 EXPECT_TRUE(found);
78 return y;
79}
80} // namespace
81
85TEST_F(FieldConversionTest, FieldConversionGrumpkinAffineElement)
86{
87 curve::Grumpkin::AffineElement x1(1, derive_grumpkin_y(1));
88 check_conversion(x1);
89
91 check_conversion(x2);
92}
93
98TEST_F(FieldConversionTest, FieldConversionArrayBn254Fr)
99{
100 std::array<bb::fr, 4> x1{ 1, 2, 3, 4 };
101 check_conversion(x1);
102
105 215215125,
106 102701750,
107 367032,
108 12985028,
109 bb::fr::modulus_minus_two - 125015028 };
110 check_conversion(x2);
111}
112
117TEST_F(FieldConversionTest, FieldConversionArrayGrumpkinFr)
118{
119 std::array<grumpkin::fr, 4> x1{ 1, 2, 3, 4 };
120 check_conversion(x1);
121
124 215215125,
125 102701750,
126 367032,
127 12985028,
129 check_conversion(x2);
130}
131
136TEST_F(FieldConversionTest, FieldConversionUnivariateBn254Fr)
137{
138 std::array<bb::fr, 4> x1_arr{ 1, 2, 3, 4 };
139 bb::Univariate<bb::fr, 4> x1{ x1_arr };
140 check_conversion(x1);
141}
142
147TEST_F(FieldConversionTest, FieldConversionUnivariateGrumpkinFr)
148{
149 std::array<grumpkin::fr, 4> x1_arr{ 1, 2, 3, 4 };
151 check_conversion(x1);
152}
153
158TEST_F(FieldConversionTest, ConvertChallengeGrumpkinFr)
159{
160 uint256_t chal_raw(std::string("9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789")); // 256 bits
161 bb::fr chal(chal_raw.slice(0, 136));
162 auto result = FrCodec::convert_challenge<grumpkin::fr>(chal);
163 auto expected = uint256_t(chal);
164 EXPECT_EQ(uint256_t(result), expected);
165}
166
167// ============================================================================
168// Additional FrCodec-specific tests
169// Note: Most rejection/acceptance tests are in stdlib/primitives/field/field_conversion.test.cpp
170// which tests both FrCodec and StdlibCodec together for consistency.
171// ============================================================================
172
177TEST_F(FieldConversionTest, AcceptCanonicalPointAtInfinity)
178{
179 // Test for BN254 points
180 {
181 std::vector<bb::fr> fr_vec = { bb::fr(0), bb::fr(0), bb::fr(0), bb::fr(0) };
182 auto point = FrCodec::deserialize_from_fields<curve::BN254::AffineElement>(fr_vec);
183 EXPECT_TRUE(point.is_point_at_infinity());
184 }
185
186 // Test for Grumpkin points
187 {
188 std::vector<bb::fr> fr_vec = { bb::fr(0), bb::fr(0) };
189 auto point = FrCodec::deserialize_from_fields<curve::Grumpkin::AffineElement>(fr_vec);
190 EXPECT_TRUE(point.is_point_at_infinity());
191 }
192}
193
198#ifndef __wasm__
199TEST_F(FieldConversionTest, RejectPointNotOnCurve)
200{
201 // Test for BN254: (1, 4) is not on the curve
202 {
203 std::vector<bb::fr> fr_vec = { bb::fr(1), bb::fr(0), bb::fr(4), bb::fr(0) };
204 EXPECT_THROW_OR_ABORT(FrCodec::deserialize_from_fields<curve::BN254::AffineElement>(fr_vec), "on_curve");
205 }
206
207 // Test for Grumpkin: (12, 100) is not on the curve
208 {
209 std::vector<bb::fr> fr_vec = { bb::fr(12), bb::fr(100) };
210 EXPECT_THROW_OR_ABORT(FrCodec::deserialize_from_fields<curve::Grumpkin::AffineElement>(fr_vec), "on_curve");
211 }
212}
213#endif
214
215} // namespace bb::field_conversion_tests
#define EXPECT_THROW_OR_ABORT(statement, matcher)
Definition assert.hpp:192
static std::vector< fr > serialize_to_fields(const T &val)
Conversion from transcript values to bb::frs.
A univariate polynomial represented by its values on {0, 1,..., domain_end - 1}.
typename Group::affine_element AffineElement
Definition bn254.hpp:22
typename Group::affine_element AffineElement
Definition grumpkin.hpp:63
constexpr uint256_t slice(uint64_t start, uint64_t end) const
TEST_F(FieldConversionTest, FieldConversionUint32)
Field conversion test for uint32_t.
field< Bn254FrParams > fr
Definition fr.hpp:174
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
uint8_t len
static constexpr fq b
Definition g1.hpp:29
BB_INLINE constexpr field sqr() const noexcept
static constexpr uint256_t modulus_minus_two
static constexpr bb::fr b
Definition grumpkin.hpp:29
static constexpr bb::fr a
Definition grumpkin.hpp:31