6#include <gtest/gtest.h>
11template <
typename G_>
class TestElement :
public testing::Test {
14 using element =
typename G::element;
15 using affine_element =
typename G::affine_element;
16 using Fr =
typename G::Fr;
17 using Fq =
typename G::Fq;
19 static void test_random_element()
21 element result = element::random_element();
22 EXPECT_EQ(result.on_curve(),
true);
25 static void test_random_affine_element()
27 affine_element result = element::random_element();
28 EXPECT_EQ(result.on_curve(),
true);
31 static void test_on_curve()
33 for (
size_t i = 0; i < 100; ++i) {
34 element test = element::random_element();
35 EXPECT_EQ(test.on_curve(),
true);
36 affine_element affine_test = element::random_element();
37 EXPECT_EQ(affine_test.on_curve(),
true);
43 element a = element::random_element();
46 EXPECT_EQ(
a ==
b,
true);
47 EXPECT_EQ(
a ==
a,
true);
49 b.self_set_infinity();
51 EXPECT_EQ(
a ==
b,
false);
52 element c = element::random_element();
54 EXPECT_EQ(
a == c,
false);
56 a.self_set_infinity();
58 EXPECT_EQ(
a ==
b,
true);
61 static void test_check_group_modulus()
64 element result = G::one * exponent;
67 EXPECT_EQ(result.on_curve(),
true);
68 EXPECT_EQ(result == G::one,
true);
71 static void test_add_exception_test_infinity()
73 element lhs = element::random_element();
81 EXPECT_EQ(result.is_point_at_infinity(),
true);
85 rhs_b.self_set_infinity();
89 EXPECT_EQ(lhs == result,
true);
91 lhs.self_set_infinity();
94 EXPECT_EQ(rhs == result,
true);
97 static void test_add_exception_test_dbl()
99 element lhs = element::random_element();
107 expected = lhs.dbl();
109 EXPECT_EQ(result == expected,
true);
112 static void test_add_dbl_consistency()
114 element a = element::random_element();
115 element b = element::random_element();
127 dbl_result =
a.dbl();
129 EXPECT_EQ(add_result == dbl_result,
true);
132 static void test_add_dbl_consistency_repeated()
134 element a = element::random_element();
152 EXPECT_EQ(result == expected,
true);
155 static void test_mixed_add_exception_test_infinity()
158 affine_element
rhs = element::random_element();
165 EXPECT_EQ(result.is_point_at_infinity(),
true);
167 lhs.self_set_infinity();
172 EXPECT_EQ(rhs_c == result,
true);
175 static void test_mixed_add_exception_test_dbl()
177 affine_element
rhs = element::random_element();
185 expected = lhs.dbl();
187 EXPECT_EQ(result == expected,
true);
190 static void test_add_mixed_add_consistency_check()
192 affine_element
rhs = element::random_element();
193 element lhs = element::random_element();
199 add_result = lhs + rhs_b;
200 mixed_add_result = lhs +
rhs;
202 EXPECT_EQ(add_result == mixed_add_result,
true);
205 static void test_batch_normalize()
211 element a = element::random_element();
212 element b = element::random_element();
214 normalized[i] = points[i];
216 element::batch_normalize(&normalized[0], num_points);
223 zz = points[i].z.
sqr();
224 zzz = points[i].z * zz;
225 result_x = normalized[i].x * zz;
226 result_y = normalized[i].y * zzz;
228 EXPECT_EQ((result_x == points[i].x),
true);
229 EXPECT_EQ((result_y == points[i].y),
true);
234 static void test_batch_normalize_with_infinity()
240 points[i] = element::infinity();
242 element a = element::random_element();
243 element b = element::random_element();
248 element::batch_normalize(&normalized[0], num_points);
252 EXPECT_TRUE(normalized[i].is_point_at_infinity());
254 Fq zz = points[i].z.
sqr();
255 Fq zzz = points[i].z * zz;
256 EXPECT_EQ(normalized[i].x * zz, points[i].x);
257 EXPECT_EQ(normalized[i].y * zzz, points[i].y);
262 static void test_group_exponentiation_zero_and_one()
264 affine_element result = G::one *
Fr::zero();
266 EXPECT_EQ(result.is_point_at_infinity(),
true);
270 EXPECT_EQ(result == G::affine_one,
true);
273 static void test_group_exponentiation_consistency_check()
281 affine_element input = G::affine_one;
282 affine_element result = input *
a;
285 affine_element expected = input * c;
287 EXPECT_EQ(result == expected,
true);
290 static void test_infinity()
292 affine_element inf_affine = affine_element::infinity();
293 EXPECT_EQ(inf_affine.is_point_at_infinity(),
true);
295 element inf_element = element::infinity();
296 EXPECT_EQ(inf_element.is_point_at_infinity(),
true);
299 static void test_infinity_canonical_form()
303 const affine_element inf_from_factory = affine_element::infinity();
304 const affine_element inf_from_random = affine_element(element::random_element()).set_infinity();
306 EXPECT_TRUE(inf_from_factory.is_point_at_infinity());
307 EXPECT_TRUE(inf_from_random.is_point_at_infinity());
309 EXPECT_EQ(inf_from_factory.y,
Fq::zero());
310 EXPECT_EQ(inf_from_random.y,
Fq::zero());
311 EXPECT_EQ(inf_from_factory.x, inf_from_random.x);
312 EXPECT_EQ(inf_from_factory.y, inf_from_random.y);
316 const element inf_elem_factory = element::infinity();
317 const element inf_elem_zero = element::zero();
318 const element inf_elem_set = element::random_element().set_infinity();
320 EXPECT_TRUE(inf_elem_factory.is_point_at_infinity());
321 EXPECT_TRUE(inf_elem_zero.is_point_at_infinity());
322 EXPECT_TRUE(inf_elem_set.is_point_at_infinity());
324 for (
const element& e : { inf_elem_factory, inf_elem_zero, inf_elem_set }) {
327 EXPECT_EQ(e.x, inf_elem_factory.x);
331 static void test_straus_msm_matches_naive_sum()
333 for (
size_t n = 1; n <= 16; ++n) {
335 std::vector<Fr> scalars(n);
336 for (
size_t i = 0; i < n; ++i) {
337 points[i] = affine_element(element::random_element());
340 element naive = element::infinity();
341 for (
size_t i = 0; i < n; ++i) {
342 naive += points[i] * scalars[i];
344 element strauss = element::straus_msm(points, scalars);
345 EXPECT_EQ(strauss == naive,
true) <<
"straus_msm mismatch at n=" << n;
349 static void test_straus_msm_truncates_to_shorter_input()
352 affine_element(element::random_element()),
353 affine_element(element::random_element()) };
356 element expected = (points[0] * scalars[0]) + (points[1] * scalars[1]);
357 EXPECT_EQ(element::straus_msm(points, scalars) == expected,
true);
361 EXPECT_EQ(element::straus_msm(fewer_points, extra_scalars) == expected,
true);
364 static void test_straus_msm_edge_cases()
367 EXPECT_EQ(element::straus_msm({}, {}).is_point_at_infinity(),
true);
371 affine_element(element::random_element()) };
373 EXPECT_EQ(element::straus_msm(points, zeros).is_point_at_infinity(),
true);
379 affine_element(element::random_element()),
380 affine_element::infinity(),
381 affine_element(element::random_element()),
384 element expected = mixed_points[0] * s0 + mixed_points[2] * s2;
385 EXPECT_EQ(element::straus_msm(mixed_points, mixed_scalars) == expected,
true);
388 static void test_derive_generators()
390 constexpr size_t num_generators = 128;
391 auto result = G::derive_generators(
"test generators", num_generators);
393 const auto is_unique = [&result](
const affine_element& y,
const size_t j) {
394 for (
size_t i = 0; i < result.size(); ++i) {
395 if ((i != j) && result[i] == y) {
402 for (
size_t k = 0; k < num_generators; ++k) {
403 EXPECT_EQ(is_unique(result[k], k),
true);
404 EXPECT_EQ(result[k].on_curve(),
true);
409using TestTypes = testing::Types<bb::g1, bb::g2, grumpkin::g1, secp256k1::g1, secp256r1::g1>;
416 TestFixture::test_random_element();
421 TestFixture::test_random_affine_element();
426 TestFixture::test_on_curve();
431 TestFixture::test_eq();
436 TestFixture::test_check_group_modulus();
441 TestFixture::test_add_exception_test_infinity();
446 TestFixture::test_add_exception_test_dbl();
451 TestFixture::test_add_dbl_consistency();
456 TestFixture::test_add_dbl_consistency_repeated();
461 TestFixture::test_mixed_add_exception_test_infinity();
466 TestFixture::test_mixed_add_exception_test_dbl();
471 TestFixture::test_add_mixed_add_consistency_check();
476 TestFixture::test_batch_normalize();
481 TestFixture::test_batch_normalize_with_infinity();
486 TestFixture::test_group_exponentiation_zero_and_one();
491 TestFixture::test_group_exponentiation_consistency_check();
496 TestFixture::test_infinity();
501 TestFixture::test_infinity_canonical_form();
507 TestFixture::test_derive_generators();
514 TestFixture::test_straus_msm_matches_naive_sum();
521 TestFixture::test_straus_msm_truncates_to_shorter_input();
528 TestFixture::test_straus_msm_edge_cases();
#define G(r, i, a, b, c, d)
std::conditional_t< IsGoblinBigGroup< C, Fq, Fr, G >, element_goblin::goblin_element< C, goblin_field< C >, Fr, G >, element_default::element< C, Fq, Fr, G > > element
element wraps either element_default::element or element_goblin::goblin_element depending on parametr...
Entry point for Barretenberg command-line interface.
TYPED_TEST_SUITE(CommitmentKeyTest, Curves)
TYPED_TEST(CommitmentKeyTest, CommitToZeroPoly)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
testing::Types< VKTestParams< UltraFlavor, stdlib::recursion::honk::DefaultIO< UltraCircuitBuilder > >, VKTestParams< UltraFlavor, stdlib::recursion::honk::RollupIO >, VKTestParams< UltraKeccakFlavor, stdlib::recursion::honk::DefaultIO< UltraCircuitBuilder > >, VKTestParams< MegaFlavor, stdlib::recursion::honk::DefaultIO< MegaCircuitBuilder > > > TestTypes
static constexpr field one()
static field random_element(numeric::RNG *engine=nullptr) noexcept
BB_INLINE constexpr field sqr() const noexcept
static constexpr field zero()