1#include "../biggroup/biggroup.hpp"
2#include "../bigfield/bigfield.hpp"
3#include "../bool/bool.hpp"
4#include "../field/field.hpp"
39template <
typename _Curve,
bool _use_bigfield = false>
struct TestType {
44 typename std::conditional<_use_bigfield, typename Curve::g1_bigfr_ct, typename Curve::Group>::type;
47 typename std::conditional<_use_bigfield, typename Curve::bigfr_ct, typename Curve::ScalarField>::type;
57 using fq =
typename Curve::BaseFieldNative;
58 using fr =
typename Curve::ScalarFieldNative;
59 using g1 =
typename Curve::GroupNative;
69 info(
"num gates = ",
builder.get_num_finalized_gates_inefficient());
79 return e.get_value().is_point_at_infinity();
81 return e.is_point_at_infinity().get_value();
98 using Fq =
typename element_ct::BaseField;
118 if (even &&
uint256_t(scalar_native).get_bit(0)) {
119 scalar_native -=
fr(1);
129 if (even &&
uint256_t(scalar_native).get_bit(0)) {
130 scalar_native -=
fr(1);
148 scalar_u256 = scalar_u256 >> (256 - num_bits);
150 fr scalar_native(scalar_u256);
153 scalar_ct_val = scalar_ct::from_witness(
builder, scalar_native);
167 a.set_origin_tag(next_submitted_value_origin_tag);
169 EXPECT_EQ(
a.get_origin_tag(), next_submitted_value_origin_tag);
174 auto x = element_ct::BaseField::from_witness(&
builder, input_c.
x);
175 auto y = element_ct::BaseField::from_witness(&
builder, input_c.
y);
178 x.set_origin_tag(submitted_value_origin_tag);
179 y.set_origin_tag(challenge_origin_tag);
186 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
191 auto x_death = element_ct::BaseField::from_witness(&
builder, input_b.
x);
192 auto y_normal = element_ct::BaseField::from_witness(&
builder, input_b.
y);
194 x_death.set_origin_tag(instant_death_tag);
196 y_normal.set_origin_tag(constant_tag);
197 pif_normal.set_origin_tag(constant_tag);
200 element_ct b(x_death, y_normal, pif_normal,
false);
202 EXPECT_THROW(
b +
b, std::runtime_error);
216 for (
size_t i = 0; i < 3; ++i) {
221 point.assert_coordinates_in_field();
236 auto x_coord = element_ct::BaseField::from_witness(&
builder, valid_point.
x);
237 auto y_coord = element_ct::BaseField::from_witness(&
builder, valid_point.
y);
242 x_coord.binary_basis_limbs[3].maximum_value =
uint256_t(1) << 68;
247 point.assert_coordinates_in_field();
258 auto x_coord = element_ct::BaseField::from_witness(&
builder, valid_point.
x);
259 auto y_coord = element_ct::BaseField::from_witness(&
builder, valid_point.
y);
264 y_coord.binary_basis_limbs[3].maximum_value =
uint256_t(1) << 68;
269 point.assert_coordinates_in_field();
280 size_t num_repetitions = 10;
281 for (
size_t i = 0; i < num_repetitions; ++i) {
286 a.set_origin_tag(submitted_value_origin_tag);
287 b.set_origin_tag(challenge_origin_tag);
289 uint64_t before =
builder.get_num_finalized_gates_inefficient();
291 uint64_t after =
builder.get_num_finalized_gates_inefficient();
294 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
295 if (i == num_repetitions - 1) {
296 benchmark_info(Builder::NAME_STRING,
"Biggroup",
"ADD",
"Gate Count", after - before);
301 uint256_t c_x_u256 = c.x().get_value().lo;
302 uint256_t c_y_u256 = c.y().get_value().lo;
304 fq c_x_result(c_x_u256);
305 fq c_y_result(c_y_u256);
307 EXPECT_EQ(c_x_result, c_expected.
x);
308 EXPECT_EQ(c_y_result, c_expected.
y);
317 size_t num_repetitions = 10;
318 for (
size_t i = 0; i < num_repetitions; ++i) {
329 EXPECT_EQ(
fq(result_x), expected.
x);
330 EXPECT_EQ(
fq(result_y), expected.
y);
338 size_t num_repetitions = 1;
339 for (
size_t i = 0; i < num_repetitions; ++i) {
351 a.set_origin_tag(submitted_value_origin_tag);
352 b.set_origin_tag(challenge_origin_tag);
353 a_alternate.set_origin_tag(next_challenge_tag);
355 const auto second_round_challenge_tag =
357 a_negated.set_origin_tag(second_round_challenge_tag);
367 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
368 EXPECT_EQ(d.get_origin_tag(), first_two_merged_tag);
369 EXPECT_EQ(e.get_origin_tag(), challenge_origin_tag);
370 EXPECT_EQ(f.get_origin_tag(), submitted_value_origin_tag);
371 EXPECT_EQ(g.get_origin_tag(), first_and_third_merged_tag);
372 EXPECT_EQ(h.get_origin_tag(),
OriginTag(submitted_value_origin_tag, second_round_challenge_tag));
381 EXPECT_EQ(c.get_value(), c_expected);
382 EXPECT_EQ(d.get_value(), d_expected);
383 EXPECT_EQ(e.get_value(), e_expected);
384 EXPECT_EQ(f.get_value(), f_expected);
385 EXPECT_EQ(g.get_value(), g_expected);
386 EXPECT_EQ(h.get_value(), h_expected);
398 size_t num_repetitions = 5;
399 for (
size_t i = 0; i < num_repetitions; ++i) {
405 input_a.set_origin_tag(submitted_value_origin_tag);
406 input_b.set_origin_tag(challenge_origin_tag);
408 auto standard_a = input_a.get_standard_form();
409 auto standard_b = input_b.get_standard_form();
412 EXPECT_EQ(standard_a.get_origin_tag(), submitted_value_origin_tag);
413 EXPECT_EQ(standard_b.get_origin_tag(), challenge_origin_tag);
418 fq standard_a_x = standard_a.x().get_value().lo;
419 fq standard_a_y = standard_a.y().get_value().lo;
421 fq standard_b_x = standard_b.x().get_value().lo;
422 fq standard_b_y = standard_b.y().get_value().lo;
425 EXPECT_EQ(standard_a_x, 0);
426 EXPECT_EQ(standard_a_y, 0);
427 EXPECT_EQ(standard_b_x, 0);
428 EXPECT_EQ(standard_b_y, 0);
437 size_t num_repetitions = 10;
438 for (
size_t i = 0; i < num_repetitions; ++i) {
443 a.set_origin_tag(submitted_value_origin_tag);
444 b.set_origin_tag(challenge_origin_tag);
449 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
453 uint256_t c_x_u256 = c.x().get_value().lo;
454 uint256_t c_y_u256 = c.y().get_value().lo;
456 fq c_x_result(c_x_u256);
457 fq c_y_result(c_y_u256);
459 EXPECT_EQ(c_x_result, c_expected.
x);
460 EXPECT_EQ(c_y_result, c_expected.
y);
469 size_t num_repetitions = 10;
470 for (
size_t i = 0; i < num_repetitions; ++i) {
480 EXPECT_EQ(
fq(result_x), expected.
x);
481 EXPECT_EQ(
fq(result_y), expected.
y);
489 size_t num_repetitions = 1;
490 for (
size_t i = 0; i < num_repetitions; ++i) {
502 a.set_origin_tag(submitted_value_origin_tag);
503 b.set_origin_tag(challenge_origin_tag);
504 a_alternate.set_origin_tag(next_challenge_tag);
506 const auto second_round_challenge_tag =
508 a_negated.set_origin_tag(second_round_challenge_tag);
518 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
519 EXPECT_EQ(d.get_origin_tag(), first_two_merged_tag);
520 EXPECT_EQ(e.get_origin_tag(), challenge_origin_tag);
521 EXPECT_EQ(f.get_origin_tag(), submitted_value_origin_tag);
522 EXPECT_EQ(g.get_origin_tag(), first_and_third_merged_tag);
523 EXPECT_EQ(h.get_origin_tag(),
OriginTag(submitted_value_origin_tag, second_round_challenge_tag));
532 EXPECT_EQ(c.get_value(), c_expected);
533 EXPECT_EQ(d.get_value(), d_expected);
534 EXPECT_EQ(e.get_value(), e_expected);
535 EXPECT_EQ(f.get_value(), f_expected);
536 EXPECT_EQ(g.get_value(), g_expected);
537 EXPECT_EQ(h.get_value(), h_expected);
547 size_t num_repetitions = 10;
548 for (
size_t i = 0; i < num_repetitions; ++i) {
555 uint256_t result_x = result.x().get_value().lo;
556 uint256_t result_y = result.y().get_value().lo;
558 EXPECT_EQ(
fq(result_x), expected.
x);
559 EXPECT_EQ(
fq(result_y), expected.
y);
568 size_t num_repetitions = 10;
569 for (
size_t i = 0; i < num_repetitions; ++i) {
573 element_ct result =
a.checked_unconditional_subtract(
b);
576 uint256_t result_x = result.x().get_value().lo;
577 uint256_t result_y = result.y().get_value().lo;
579 EXPECT_EQ(
fq(result_x), expected.
x);
580 EXPECT_EQ(
fq(result_y), expected.
y);
589 size_t num_repetitions = 10;
590 for (
size_t i = 0; i < num_repetitions; ++i) {
602 uint256_t diff_x = diff.x().get_value().lo;
603 uint256_t diff_y = diff.y().get_value().lo;
605 EXPECT_EQ(
fq(sum_x), expected_sum.
x);
606 EXPECT_EQ(
fq(sum_y), expected_sum.
y);
607 EXPECT_EQ(
fq(diff_x), expected_diff.
x);
608 EXPECT_EQ(
fq(diff_y), expected_diff.
y);
616 size_t num_repetitions = 10;
617 for (
size_t i = 0; i < num_repetitions; ++i) {
620 a.set_origin_tag(submitted_value_origin_tag);
625 EXPECT_EQ(c.get_origin_tag(), submitted_value_origin_tag);
629 uint256_t c_x_u256 = c.x().get_value().lo;
630 uint256_t c_y_u256 = c.y().get_value().lo;
632 fq c_x_result(c_x_u256);
633 fq c_y_result(c_y_u256);
635 EXPECT_EQ(c_x_result, c_expected.
x);
636 EXPECT_EQ(c_y_result, c_expected.
y);
649 a_infinity.set_origin_tag(submitted_value_origin_tag);
651 element_ct result_infinity = a_infinity.dbl();
654 EXPECT_EQ(result_infinity.get_origin_tag(), submitted_value_origin_tag);
663 a_normal.set_origin_tag(submitted_value_origin_tag);
668 EXPECT_EQ(result_normal.get_origin_tag(), submitted_value_origin_tag);
675 uint256_t result_x = result_normal.x().get_value().lo;
676 uint256_t result_y = result_normal.y().get_value().lo;
677 fq expected_x(result_x);
678 fq expected_y(result_y);
679 EXPECT_EQ(expected_x, expected_normal.
x);
680 EXPECT_EQ(expected_y, expected_normal.
y);
697 auto x_coord = element_ct::BaseField::from_witness(&
builder, test_point.
x);
698 auto y_coord = element_ct::BaseField::from_witness(&
builder,
fq(0));
703 a.set_origin_tag(submitted_value_origin_tag);
714 size_t num_repetitions = 5;
715 for (
size_t i = 0; i < num_repetitions; ++i) {
724 uint256_t dbl_x = doubled.x().get_value().lo;
725 uint256_t dbl_y = doubled.y().get_value().lo;
727 EXPECT_EQ(
fq(sum_x),
fq(dbl_x));
728 EXPECT_EQ(
fq(sum_y),
fq(dbl_y));
738 size_t num_repetitions = 5;
739 for (
size_t i = 0; i < num_repetitions; ++i) {
747 uint256_t result_x = result.x().get_value().lo;
748 uint256_t result_y = result.y().get_value().lo;
749 uint256_t expected_x = expected.x().get_value().lo;
750 uint256_t expected_y = expected.y().get_value().lo;
752 EXPECT_EQ(
fq(result_x),
fq(expected_x));
753 EXPECT_EQ(
fq(result_y),
fq(expected_y));
763 size_t num_repetitions = 10;
764 for (
size_t i = 0; i < num_repetitions; ++i) {
770 auto acc = element_ct::chain_add_start(
a,
b);
771 auto acc_out = element_ct::chain_add(c, acc);
772 element_ct result = element_ct::chain_add_end(acc_out);
776 uint256_t result_x = result.x().get_value().lo;
777 uint256_t result_y = result.y().get_value().lo;
778 EXPECT_EQ(
fq(result_x), expected.
x);
779 EXPECT_EQ(
fq(result_y), expected.
y);
782 auto lambda_prev = (input_b.y - input_a.y) / (input_b.x - input_a.x);
783 auto x3_prev = lambda_prev * lambda_prev - input_b.x - input_a.x;
784 auto y3_prev = lambda_prev * (input_a.x - x3_prev) - input_a.y;
785 auto lambda = (y3_prev - input_c.y) / (x3_prev - input_c.x);
786 auto x3 = lambda * lambda - x3_prev - input_c.x;
788 uint256_t x3_u256 = acc_out.x3_prev.get_value().lo;
789 uint256_t lambda_u256 = acc_out.lambda_prev.get_value().lo;
791 fq x3_result(x3_u256);
792 fq lambda_result(lambda_u256);
794 EXPECT_EQ(x3_result, x3);
795 EXPECT_EQ(lambda_result, lambda);
804 size_t num_repetitions = 10;
805 for (
size_t i = 0; i < num_repetitions; ++i) {
810 for (
size_t j = 0; j < i; ++j) {
815 typename element_ct::chain_add_accumulator add_1 =
816 element_ct::chain_add_start(add_1_big_0, add_2_big_0);
817 to_add.emplace_back(add_1);
819 acc_big.multiple_montgomery_ladder(to_add);
828 size_t num_repetitions = 10;
829 for (
size_t i = 0; i < num_repetitions; ++i) {
837 uint256_t x_after = normalized.x().get_value().lo;
838 uint256_t y_after = normalized.y().get_value().lo;
840 EXPECT_EQ(
fq(x_before),
fq(x_after));
841 EXPECT_EQ(
fq(y_before),
fq(y_after));
849 size_t num_repetitions = 10;
850 for (
size_t i = 0; i < num_repetitions; ++i) {
858 uint256_t x_after = reduced.x().get_value().lo;
859 uint256_t y_after = reduced.y().get_value().lo;
861 EXPECT_EQ(
fq(x_before),
fq(x_after));
862 EXPECT_EQ(
fq(y_before),
fq(y_after));
880 EXPECT_EQ(
fq(neg_x), expected.
x);
881 EXPECT_EQ(
fq(neg_y), expected.
y);
890 size_t num_repetitions = 10;
891 for (
size_t i = 0; i < num_repetitions; ++i) {
894 a.set_origin_tag(submitted_value_origin_tag);
905 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
908 EXPECT_EQ(c.get_value(), c_expected);
918 size_t num_repetitions = 10;
919 for (
size_t i = 0; i < num_repetitions; ++i) {
928 a.set_origin_tag(submitted_value_origin_tag);
929 b.set_origin_tag(challenge_origin_tag);
935 EXPECT_EQ(c.get_origin_tag(), first_second_third_merged_tag);
938 EXPECT_EQ(c.get_value(), c_expected);
948 size_t num_repetitions = 10;
949 for (
size_t i = 0; i < num_repetitions; ++i) {
955 a.set_origin_tag(submitted_value_origin_tag);
956 b.set_origin_tag(challenge_origin_tag);
958 a.incomplete_assert_equal(
b,
"elements don't match");
965 size_t num_repetitions = 10;
966 for (
size_t i = 0; i < num_repetitions; ++i) {
973 a.set_origin_tag(submitted_value_origin_tag);
974 b.set_origin_tag(challenge_origin_tag);
976 a.incomplete_assert_equal(
b,
"elements don't match");
986 a.incomplete_assert_equal(
a,
"self assertion test");
1000 while (input_a == input_b) {
1001 input_b = element::random_element();
1007 a.set_origin_tag(submitted_value_origin_tag);
1008 b.set_origin_tag(challenge_origin_tag);
1010 a.incomplete_assert_equal(
b,
"elements don't match");
1014 EXPECT_EQ(
builder.failed(),
true);
1015 EXPECT_EQ(
builder.err(),
"elements don't match (x coordinate)");
1026 input_b.
y = -input_a.
y;
1029 auto x_coord = element_ct::BaseField::from_witness(&
builder, input_a.
x);
1030 auto y_coord_a = element_ct::BaseField::from_witness(&
builder, input_a.
y);
1031 auto y_coord_b = element_ct::BaseField::from_witness(&
builder, input_b.
y);
1038 a.set_origin_tag(submitted_value_origin_tag);
1039 b.set_origin_tag(challenge_origin_tag);
1041 a.incomplete_assert_equal(
b,
"elements don't match");
1044 EXPECT_EQ(
builder.failed(),
true);
1045 EXPECT_EQ(
builder.err(),
"elements don't match (y coordinate)");
1057 a.incomplete_assert_equal(
b,
"infinity flag mismatch test");
1059 EXPECT_EQ(
builder.failed(),
true);
1062 EXPECT_EQ(
builder.err(),
"infinity flag mismatch test (x coordinate)");
1064 EXPECT_EQ(
builder.err(),
"infinity flag mismatch test (infinity flag)");
1072 size_t max_num_bits = 254;
1078 scalar_raw = scalar_raw >> (256 -
length);
1080 scalar_val =
fr(scalar_raw);
1083 if (scalar_val ==
fr(0)) {
1088 scalar.set_origin_tag(submitted_value_origin_tag);
1089 auto naf = element_ct::compute_naf(scalar,
length);
1091 for (
const auto& bit : naf) {
1093 EXPECT_EQ(bit.get_origin_tag(), submitted_value_origin_tag);
1096 fr reconstructed_val(0);
1097 for (
size_t i = 0; i <
length; i++) {
1100 reconstructed_val -=
fr(naf[
length].get_value());
1101 EXPECT_EQ(scalar_val, reconstructed_val);
1118 scalar.set_origin_tag(submitted_value_origin_tag);
1119 auto naf = element_ct::compute_naf(scalar,
length);
1121 for (
const auto& bit : naf) {
1123 EXPECT_EQ(bit.get_origin_tag(), submitted_value_origin_tag);
1127 fr reconstructed_val(0);
1129 for (
size_t i = 0; i <
length; i++) {
1131 reconstructed_u256 +=
1134 reconstructed_val -=
fr(naf[
length].get_value());
1135 EXPECT_EQ(scalar_val, reconstructed_val);
1151 scalar_raw = (scalar_raw >> 136) << 136;
1152 fr scalar_val =
fr(scalar_raw);
1154 scalar.set_origin_tag(submitted_value_origin_tag);
1160 auto naf = element_ct::compute_naf(scalar,
length);
1163 for (
const auto& bit : naf) {
1164 EXPECT_EQ(bit.get_origin_tag(), submitted_value_origin_tag);
1168 fr reconstructed_val(0);
1169 for (
size_t i = 0; i <
length; i++) {
1172 reconstructed_val -=
fr(naf[
length].get_value());
1174 EXPECT_EQ(scalar_val, reconstructed_val);
1181 size_t num_repetitions = 1;
1182 for (
size_t i = 0; i < num_repetitions; ++i) {
1187 x.set_origin_tag(challenge_origin_tag);
1188 P.set_origin_tag(submitted_value_origin_tag);
1196 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1197 fq c_x_result(c.x().get_value().lo);
1198 fq c_y_result(c.y().get_value().lo);
1200 EXPECT_EQ(c_x_result, c_expected.
x);
1201 EXPECT_EQ(c_y_result, c_expected.
y);
1214 x.set_origin_tag(challenge_origin_tag);
1215 P.set_origin_tag(submitted_value_origin_tag);
1221 EXPECT_EQ(result.get_origin_tag(), first_two_merged_tag);
1225 bool expected_is_inf = expected.is_point_at_infinity();
1227 EXPECT_EQ(result_is_inf, expected_is_inf);
1230 if (!expected_is_inf) {
1231 uint256_t result_x = result.x().get_value().lo;
1232 uint256_t result_y = result.y().get_value().lo;
1234 EXPECT_EQ(
fq(result_x), expected.x);
1235 EXPECT_EQ(
fq(result_y), expected.y);
1245 run_mul_and_check(P, x, expected_infinity);
1251 P = element_ct::constant_infinity(&
builder);
1253 input.self_set_infinity();
1254 P = element_ct::from_witness(&
builder, input);
1259 run_mul_and_check(P, x, expected_infinity);
1266 run_mul_and_check(P, one, input);
1271 fr neg_one = -
fr(1);
1275 run_mul_and_check(P, neg_one_ct, expected);
1285 std::vector<size_t> test_lengths = { 2, 3, 10, 11, 31, 32, 63, 64, 127, 128, 252, 253 };
1287 for (
size_t i : test_lengths) {
1292 scalar_raw = scalar_raw >> (256 - i);
1293 fr scalar =
fr(scalar_raw);
1296 if (scalar ==
fr(0)) {
1304 x.set_origin_tag(challenge_origin_tag);
1305 P.set_origin_tag(submitted_value_origin_tag);
1314 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1315 fq c_x_result(c.x().get_value().lo);
1316 fq c_y_result(c.y().get_value().lo);
1318 EXPECT_EQ(c_x_result, c_expected.
x);
1320 EXPECT_EQ(c_y_result, c_expected.
y);
1335 points[0] = element::infinity();
1336 points[1] = element::random_element();
1338 std::vector<size_t> gates(2);
1341 bool expect_infinity =
true;
1343 for (
auto [point, num_gates] :
zip_view(points, gates)) {
1346 const size_t max_num_bits = 128;
1350 scalar_raw = scalar_raw >> (256 - max_num_bits);
1351 fr scalar =
fr(scalar_raw);
1357 x.set_origin_tag(challenge_origin_tag);
1358 P.set_origin_tag(submitted_value_origin_tag);
1361 element_ct c = P.scalar_mul(x, max_num_bits);
1363 num_gates =
builder.get_num_finalized_gates_inefficient();
1365 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1370 expect_infinity =
false;
1374 EXPECT_GT(gates[0], gates[1]);
1380 size_t num_repetitions = 1;
1381 for (
size_t i = 0; i < num_repetitions; ++i) {
1386 if ((
uint256_t(scalar_a).get_bit(0) & 1) == 1) {
1389 if ((
uint256_t(scalar_b).get_bit(0) & 1) == 0) {
1398 P_a.set_origin_tag(submitted_value_origin_tag);
1399 x_a.set_origin_tag(challenge_origin_tag);
1400 P_b.set_origin_tag(next_submitted_value_origin_tag);
1401 x_b.set_origin_tag(next_challenge_tag);
1403 element_ct c = element_ct::batch_mul({ P_a, P_b }, { x_a, x_b });
1406 EXPECT_EQ(c.get_origin_tag(), first_to_fourth_merged_tag);
1410 fq c_x_result(c.x().get_value().lo);
1411 fq c_y_result(c.y().get_value().lo);
1413 EXPECT_EQ(c_x_result, expected.
x);
1414 EXPECT_EQ(c_y_result, expected.
y);
1422 size_t num_repetitions = 1;
1423 for (
size_t i = 0; i < num_repetitions; ++i) {
1429 const size_t max_num_bits = 128;
1431 scalar_raw_a = scalar_raw_a >> (256 - max_num_bits);
1432 fr scalar_a =
fr(scalar_raw_a);
1435 scalar_raw_b = scalar_raw_b >> (256 - max_num_bits);
1436 fr scalar_b =
fr(scalar_raw_b);
1444 P_a.set_origin_tag(submitted_value_origin_tag);
1445 x_a.set_origin_tag(challenge_origin_tag);
1446 P_b.set_origin_tag(next_submitted_value_origin_tag);
1447 x_b.set_origin_tag(next_challenge_tag);
1449 element_ct c = element_ct::batch_mul({ P_a, P_b }, { x_a, x_b }, 128);
1452 EXPECT_EQ(c.get_origin_tag(), first_to_fourth_merged_tag);
1456 fq c_x_result(c.x().get_value().lo);
1457 fq c_y_result(c.y().get_value().lo);
1459 EXPECT_EQ(c_x_result, expected.
x);
1460 EXPECT_EQ(c_y_result, expected.
y);
1483 std::vector<fr> input_scalars = { scalar_a, scalar_b, scalar_c };
1489 for (
size_t i = 0; i < 3; ++i) {
1491 point.set_origin_tag(
OriginTag(0, i,
true));
1492 tag_union =
OriginTag(tag_union, point.get_origin_tag());
1494 const scalar_ct scalar = scalar_ct::from_witness(&
builder, input_scalars[i]);
1495 scalar.set_origin_tag(
OriginTag(0, i,
false));
1496 tag_union =
OriginTag(tag_union, scalar.get_origin_tag());
1498 scalars.emplace_back(scalar);
1499 points.emplace_back(point);
1504 const auto get_128_bit_scalar = []() {
1508 fr scalar(scalar_u256);
1511 fr masking_scalar = get_128_bit_scalar();
1512 scalar_ct masking_scalar_ct = scalar_ct::from_witness(&
builder, masking_scalar);
1520 EXPECT_EQ(c.get_origin_tag(), tag_union);
1526 fq c_x_result(c.x().get_value().lo);
1527 fq c_y_result(c.y().get_value().lo);
1529 EXPECT_EQ(c_x_result, expected.
x);
1530 EXPECT_EQ(c_y_result, expected.
y);
1549 std::vector<fr> input_scalars = { scalar_a, scalar_b, scalar_c };
1553 for (
size_t i = 0; i < 3; ++i) {
1555 points.emplace_back(point);
1557 const scalar_ct scalar = scalar_ct::from_witness(&
builder, input_scalars[i]);
1558 scalars.emplace_back(scalar);
1563 element_ct::batch_mul(points, scalars, 4,
false);
1566 EXPECT_EQ(
builder.err(),
"bigfield: prime limb diff is zero, but expected non-zero");
1572 size_t num_repetitions = 1;
1573 for (
size_t i = 0; i < num_repetitions; ++i) {
1575 if ((
uint256_t(scalar_a).get_bit(0) & 1) == 1) {
1581 P_a.set_origin_tag(submitted_value_origin_tag);
1585 x_a.set_origin_tag(challenge_origin_tag);
1589 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1591 fq c_x_result(c.x().get_value().lo);
1592 fq c_y_result(c.y().get_value().lo);
1594 EXPECT_EQ(c_x_result, expected.
x);
1595 EXPECT_EQ(c_y_result, expected.
y);
1603 const bool short_scalars =
false,
1604 const bool with_edgecases =
false)
1613 const bool short_scalars =
false,
1614 const bool with_edgecases =
false)
1618 const size_t num_points = point_types.size();
1620 std::vector<fr> scalars;
1624 for (
size_t i = 0; i < num_points; ++i) {
1626 if (short_scalars) {
1628 scalars.push_back(input_scalar);
1629 circuit_scalars.push_back(x);
1632 scalars.push_back(input_scalar);
1633 circuit_scalars.push_back(x);
1638 points.push_back(input_point);
1639 circuit_points.push_back(P);
1644 for (
size_t i = 0; i < num_points; ++i) {
1646 circuit_points[i].set_origin_tag(
OriginTag(0, i,
true));
1647 tag_union =
OriginTag(tag_union, circuit_points[i].get_origin_tag());
1650 circuit_scalars[i].set_origin_tag(
OriginTag(0, i,
false));
1651 tag_union =
OriginTag(tag_union, circuit_scalars[i].get_origin_tag());
1655 const auto get_128_bit_scalar = []() {
1659 fr scalar(scalar_u256);
1662 fr masking_scalar = with_edgecases ? get_128_bit_scalar() :
fr(1);
1666 element_ct result_point = element_ct::batch_mul(
1667 circuit_points, circuit_scalars, 0, with_edgecases, masking_scalar_ct);
1670 EXPECT_EQ(result_point.get_origin_tag(), tag_union);
1674 for (
size_t i = 0; i < num_points; ++i) {
1675 expected_point += (
element(points[i]) * scalars[i]);
1678 expected_point = expected_point.normalize();
1679 fq result_x(result_point.x().get_value().lo);
1680 fq result_y(result_point.y().get_value().lo);
1682 EXPECT_EQ(result_x, expected_point.x);
1683 EXPECT_EQ(result_y, expected_point.y);
1690 const size_t num_points = 5;
1693 std::vector<fr> scalars;
1694 for (
size_t i = 0; i < num_points; ++i) {
1703 for (
size_t i = 0; i < num_points; ++i) {
1704 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1707 circuit_points[i].set_origin_tag(
OriginTag(0, i,
true));
1708 tag_union =
OriginTag(tag_union, circuit_points[i].get_origin_tag());
1709 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1712 circuit_scalars[i].set_origin_tag(
OriginTag(0, i,
false));
1713 tag_union =
OriginTag(tag_union, circuit_scalars[i].get_origin_tag());
1716 element_ct result_point = element_ct::batch_mul(circuit_points, circuit_scalars);
1719 EXPECT_EQ(result_point.get_origin_tag(), tag_union);
1723 for (
size_t i = 0; i < num_points; ++i) {
1724 expected_point += (
element(points[i]) * scalars[i]);
1727 expected_point = expected_point.normalize();
1728 fq result_x(result_point.x().get_value().lo);
1729 fq result_y(result_point.y().get_value().lo);
1731 EXPECT_EQ(result_x, expected_point.x);
1732 EXPECT_EQ(result_y, expected_point.y);
1739 const size_t num_points = 5;
1742 std::vector<fr> scalars;
1743 for (
size_t i = 0; i < num_points; ++i) {
1753 for (
size_t i = 0; i < num_points; ++i) {
1754 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1757 circuit_points[i].set_origin_tag(
OriginTag(0, i,
true));
1758 tag_union =
OriginTag(tag_union, circuit_points[i].get_origin_tag());
1759 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1762 circuit_scalars[i].set_origin_tag(
OriginTag(0, i,
false));
1763 tag_union =
OriginTag(tag_union, circuit_scalars[i].get_origin_tag());
1767 element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1770 EXPECT_EQ(result_point2.get_origin_tag(), tag_union);
1773 for (
size_t i = 0; i < num_points; ++i) {
1774 expected_point += (
element(points[i]) * scalars[i]);
1777 expected_point = expected_point.normalize();
1779 fq result2_x(result_point2.x().get_value().lo);
1780 fq result2_y(result_point2.y().get_value().lo);
1782 EXPECT_EQ(result2_x, expected_point.x);
1783 EXPECT_EQ(result2_y, expected_point.y);
1790 const auto test_repeated_points = [](
const uint32_t num_points) {
1792 info(
"num points: ", num_points);
1794 std::vector<fr> scalars;
1795 for (
size_t idx = 0; idx < num_points; idx++) {
1797 scalars.push_back(1);
1801 ASSERT_EQ(points.size(), scalars.size());
1808 for (
size_t i = 0; i < num_points; ++i) {
1809 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1812 circuit_points[i].set_origin_tag(
1814 tag_union =
OriginTag(tag_union, circuit_points[i].get_origin_tag());
1815 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1818 circuit_scalars[i].set_origin_tag(
1820 tag_union =
OriginTag(tag_union, circuit_scalars[i].get_origin_tag());
1823 element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1826 EXPECT_EQ(result_point.get_origin_tag(), tag_union);
1828 auto expected_point = element::infinity();
1829 for (
const auto& point : points) {
1830 expected_point += point;
1832 expected_point = expected_point.normalize();
1834 fq result_x(result_point.x().get_value().lo);
1835 fq result_y(result_point.y().get_value().lo);
1837 EXPECT_EQ(result_x, expected_point.x);
1838 EXPECT_EQ(result_y, expected_point.y);
1842 test_repeated_points(2);
1843 test_repeated_points(3);
1844 test_repeated_points(4);
1845 test_repeated_points(5);
1846 test_repeated_points(6);
1847 test_repeated_points(7);
1856 std::vector<fr> scalars;
1857 scalars.push_back(1);
1858 scalars.push_back(1);
1861 ASSERT_EQ(points.size(), scalars.size());
1862 const size_t num_points = points.size();
1869 for (
size_t i = 0; i < num_points; ++i) {
1870 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1873 circuit_points[i].set_origin_tag(
1875 tag_union =
OriginTag(tag_union, circuit_points[i].get_origin_tag());
1876 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1879 circuit_scalars[i].set_origin_tag(
1881 tag_union =
OriginTag(tag_union, circuit_scalars[i].get_origin_tag());
1885 element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1888 EXPECT_EQ(result_point.get_origin_tag(), tag_union);
1890 element expected_point = points[1];
1891 expected_point = expected_point.normalize();
1893 fq result_x(result_point.x().get_value().lo);
1894 fq result_y(result_point.y().get_value().lo);
1896 EXPECT_EQ(result_x, expected_point.x);
1897 EXPECT_EQ(result_y, expected_point.y);
1906 std::vector<fr> scalars;
1907 scalars.push_back(0);
1908 scalars.push_back(1);
1911 ASSERT_EQ(points.size(), scalars.size());
1912 const size_t num_points = points.size();
1918 for (
size_t i = 0; i < num_points; ++i) {
1919 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1922 circuit_points[i].set_origin_tag(
1924 tag_union =
OriginTag(tag_union, circuit_points[i].get_origin_tag());
1925 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1928 circuit_scalars[i].set_origin_tag(
1930 tag_union =
OriginTag(tag_union, circuit_scalars[i].get_origin_tag());
1934 element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1937 EXPECT_EQ(result_point.get_origin_tag(), tag_union);
1939 element expected_point = points[1];
1940 expected_point = expected_point.normalize();
1942 fq result_x(result_point.x().get_value().lo);
1943 fq result_y(result_point.y().get_value().lo);
1945 EXPECT_EQ(result_x, expected_point.x);
1946 EXPECT_EQ(result_y, expected_point.y);
1957 std::vector<fr> scalars;
1959 for (
size_t i = 0; i < 5; ++i) {
1967 for (
size_t i = 0; i < points.size(); ++i) {
1968 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1969 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1972 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1984 std::vector<fr> scalars;
1986 for (
size_t i = 0; i < 5; ++i) {
1994 for (
size_t i = 0; i < points.size(); ++i) {
1995 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1996 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1999 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
2011 std::vector<fr> scalars;
2013 for (
size_t i = 0; i < 6; ++i) {
2022 for (
size_t i = 0; i < points.size(); ++i) {
2023 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
2024 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
2027 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
2030 element expected = element::infinity();
2031 for (
size_t i = 0; i < points.size(); ++i) {
2032 expected += (
element(points[i]) * scalars[i]);
2036 uint256_t result_x = result.x().get_value().lo;
2037 uint256_t result_y = result.y().get_value().lo;
2039 EXPECT_EQ(
fq(result_x), expected_affine.
x);
2040 EXPECT_EQ(
fq(result_y), expected_affine.
y);
2050 std::vector<fr> scalars;
2052 for (
size_t i = 0; i < 6; ++i) {
2061 for (
size_t i = 0; i < points.size(); ++i) {
2062 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
2063 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
2066 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
2069 element expected = element::infinity();
2070 for (
size_t i = 0; i < points.size(); ++i) {
2071 if (!points[i].is_point_at_infinity()) {
2072 expected += (
element(points[i]) * scalars[i]);
2077 uint256_t result_x = result.x().get_value().lo;
2078 uint256_t result_y = result.y().get_value().lo;
2080 EXPECT_EQ(
fq(result_x), expected_affine.
x);
2081 EXPECT_EQ(
fq(result_y), expected_affine.
y);
2091 std::vector<fr> scalars;
2098 points.push_back(P);
2099 scalars.push_back(scalar);
2100 points.push_back(neg_P);
2101 scalars.push_back(scalar);
2104 for (
size_t i = 0; i < 3; ++i) {
2112 for (
size_t i = 0; i < points.size(); ++i) {
2113 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
2114 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
2117 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
2120 element expected = element::infinity();
2121 for (
size_t i = 0; i < points.size(); ++i) {
2122 expected += (
element(points[i]) * scalars[i]);
2126 uint256_t result_x = result.x().get_value().lo;
2127 uint256_t result_y = result.y().get_value().lo;
2129 EXPECT_EQ(
fq(result_x), expected_affine.
x);
2130 EXPECT_EQ(
fq(result_y), expected_affine.
y);
2140 std::vector<fr> scalars_native;
2145 for (
size_t i = 0; i < 3; ++i) {
2148 points_native.push_back(point);
2149 scalars_native.push_back(scalar);
2150 circuit_points.push_back(point_ct);
2155 for (
size_t i = 0; i < 3; ++i) {
2158 points_native.push_back(point);
2159 scalars_native.push_back(scalar);
2160 circuit_points.push_back(point_ct);
2165 for (
size_t i = 0; i < 4; ++i) {
2168 points_native.push_back(point);
2169 scalars_native.push_back(scalar);
2170 circuit_points.push_back(
element_ct(point.x, point.y));
2171 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalar));
2175 for (
size_t i = 0; i < 4; ++i) {
2178 points_native.push_back(point);
2179 scalars_native.push_back(scalar);
2180 circuit_points.push_back(point_ct);
2184 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars);
2187 element expected = element::infinity();
2188 for (
size_t i = 0; i < points_native.size(); ++i) {
2189 expected += (
element(points_native[i]) * scalars_native[i]);
2193 uint256_t result_x = result.x().get_value().lo;
2194 uint256_t result_y = result.y().get_value().lo;
2196 EXPECT_EQ(
fq(result_x), expected_affine.
x);
2197 EXPECT_EQ(
fq(result_y), expected_affine.
y);
2207 std::vector<fr> scalars;
2208 constexpr size_t num_points = 20;
2210 for (
size_t i = 0; i < num_points; ++i) {
2218 for (
size_t i = 0; i < points.size(); ++i) {
2219 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
2220 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
2223 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars);
2226 element expected = element::infinity();
2227 for (
size_t i = 0; i < points.size(); ++i) {
2228 expected += (
element(points[i]) * scalars[i]);
2232 uint256_t result_x = result.x().get_value().lo;
2233 uint256_t result_y = result.y().get_value().lo;
2235 EXPECT_EQ(
fq(result_x), expected_affine.
x);
2236 EXPECT_EQ(
fq(result_y), expected_affine.
y);
2251 EXPECT_EQ(
fq(inf.x().get_value().lo),
fq(0));
2252 EXPECT_EQ(
fq(inf.y().get_value().lo),
fq(0));
2264 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2265 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2275 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2276 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2286 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2287 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2296 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2297 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2318 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2319 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2333 EXPECT_EQ(
fq(result.x().get_value().lo), input_a.
x);
2334 EXPECT_EQ(
fq(result.y().get_value().lo), input_a.
y);
2348 EXPECT_EQ(
fq(result.x().get_value().lo), input.
x);
2349 EXPECT_EQ(
fq(result.y().get_value().lo), input.
y);
2367 element_ct result =
a.conditional_select(inf, pred);
2370 EXPECT_EQ(
fq(result.x().get_value().lo), input_a.
x);
2371 EXPECT_EQ(
fq(result.y().get_value().lo), input_a.
y);
2377 element_ct result =
a.conditional_select(inf, pred);
2386 element_ct result = inf.conditional_select(inf2, pred);
2404 element_ct result = inf.conditional_negate(pred);
2407 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2408 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2414 element_ct result = inf.conditional_negate(pred);
2433 EXPECT_EQ(
fq(P.x().get_value().lo),
fq(0));
2434 EXPECT_EQ(
fq(P.y().get_value().lo),
fq(0));
2438 element_ct standardized = P.get_standard_form();
2440 EXPECT_EQ(
fq(standardized.x().get_value().lo),
fq(0));
2441 EXPECT_EQ(
fq(standardized.y().get_value().lo),
fq(0));
2452 auto x_zero = element_ct::BaseField::from_witness(&
builder,
fq(0));
2453 auto y_zero = element_ct::BaseField::from_witness(&
builder,
fq(0));
2475 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2476 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2487 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2488 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2515 element_ct::from_witness(&
builder, P),
2516 element_ct::from_witness(&
builder, Q),
2517 element_ct::from_witness(&
builder, P),
2518 element_ct::from_witness(&
builder, Q),
2522 scalar_ct::from_witness(&
builder,
b),
2523 scalar_ct::from_witness(&
builder, -
a),
2524 scalar_ct::from_witness(&
builder, -
b) };
2526 element_ct result = element_ct::batch_mul(points, scalars, 0,
true);
2529 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2530 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2548 EXPECT_EQ(
fq(result.x().get_value().lo), input.
x);
2549 EXPECT_EQ(
fq(result.y().get_value().lo), input.
y);
2554 EXPECT_EQ(
fq(result2.x().get_value().lo), input.
x);
2555 EXPECT_EQ(
fq(result2.y().get_value().lo), input.
y);
2576 EXPECT_EQ(
fq(result.x().get_value().lo), input2.
x);
2577 EXPECT_EQ(
fq(result.y().get_value().lo), input2.
y);
2581 EXPECT_EQ(
fq(result2.x().get_value().lo), input2.
x);
2582 EXPECT_EQ(
fq(result2.y().get_value().lo), input2.
y);
2616 TestFixture::test_basic_tag_logic();
2621 TestFixture::test_assert_coordinates_in_field();
2627 TestFixture::test_add();
2637 TestFixture::test_add_points_at_infinity();
2641 TestFixture::test_standard_form_of_point_at_infinity();
2647 TestFixture::test_sub();
2657 TestFixture::test_sub_points_at_infinity();
2661 TestFixture::test_dbl();
2669 TestFixture::test_dbl_with_infinity();
2674 GTEST_SKIP() <<
"mega builder does not support this edge case";
2676 TestFixture::test_dbl_with_y_zero();
2681 TestFixture::test_add_equals_dbl();
2685 TestFixture::test_sub_neg_equals_double();
2692 GTEST_SKIP() <<
"mega builder does not implement chain_add function";
2694 TestFixture::test_chain_add();
2700 GTEST_SKIP() <<
"mega builder does not implement chain_add function";
2717 GTEST_SKIP() <<
"mega builder does not implement multiple_montgomery_ladder function";
2719 TestFixture::test_multiple_montgomery_ladder();
2726 TestFixture::test_normalize();
2736 TestFixture::test_reduce();
2801 TestFixture::test_checked_unconditional_add_sub();
2812 TestFixture::test_conditional_negate();
2823 TestFixture::test_conditional_select();
2837 TestFixture::test_incomplete_assert_equal();
2841 TestFixture::test_incomplete_assert_equal_failure();
2847 size_t num_repetitions = 1;
2848 for (
size_t i = 0; i < num_repetitions; i++) {
2849 TestFixture::test_compute_naf();
2852 GTEST_SKIP() <<
"mega builder does not implement compute_naf function";
2859 TestFixture::test_compute_naf_zero();
2861 GTEST_SKIP() <<
"mega builder does not implement compute_naf function";
2868 TestFixture::test_compute_naf_overflow_lower_half();
2870 GTEST_SKIP() <<
"mega builder does not implement compute_naf function";
2876 TestFixture::test_mul();
2886 TestFixture::test_mul_edge_cases();
2898 GTEST_SKIP() <<
"mega builder does not implement scalar_mul function";
2900 TestFixture::test_short_scalar_mul_with_bit_lengths();
2907 GTEST_SKIP() <<
"mega builder does not implement scalar_mul function";
2909 TestFixture::test_short_scalar_mul_infinity();
2917 TestFixture::test_helper_batch_mul(1);
2923 TestFixture::test_helper_batch_mul(2);
2927 TestFixture::test_helper_batch_mul(2,
true);
2931 TestFixture::test_helper_batch_mul(2,
false,
true);
2935 TestFixture::test_helper_batch_mul(2,
true,
true);
2946 TestFixture::test_helper_batch_mul(3);
2952 TestFixture::test_helper_batch_mul(4);
2958 TestFixture::test_helper_batch_mul(5);
2962 TestFixture::test_helper_batch_mul(5,
false,
true);
2966 TestFixture::test_helper_batch_mul(5,
true);
2970 TestFixture::test_helper_batch_mul(5,
true,
true);
2974 TestFixture::test_helper_batch_mul(
2982 TestFixture::test_helper_batch_mul(6);
2987 TestFixture::test_twin_mul();
2992 TestFixture::test_twin_mul_with_infinity();
2997 TestFixture::test_batch_mul_linearly_dependent_generators();
3003 GTEST_SKIP() <<
"this failure test is designed for ultra builder only";
3005 TestFixture::test_batch_mul_linearly_dependent_generators_failure();
3011 TestFixture::test_one();
3016 TestFixture::test_batch_mul();
3021 TestFixture::test_batch_mul_edgecase_equivalence();
3025 TestFixture::test_batch_mul_edge_case_set1();
3030 TestFixture::test_batch_mul_edge_case_set2();
3036 TestFixture::test_batch_mul_all_infinity();
3041 TestFixture::test_batch_mul_all_zero_scalars();
3046 TestFixture::test_batch_mul_mixed_zero_scalars();
3051 TestFixture::test_batch_mul_mixed_infinity();
3056 TestFixture::test_batch_mul_cancellation();
3061 TestFixture::test_batch_mul_mixed_constant_witness();
3066 TestFixture::test_batch_mul_large_number_of_points();
3072 TestFixture::test_infinity_canonical_representation();
3077 TestFixture::test_infinity_chained_operations();
3082 TestFixture::test_conditional_select_with_infinity();
3087 TestFixture::test_conditional_negate_with_infinity();
3092 TestFixture::test_get_standard_form_normalizes_infinity();
3097 TestFixture::test_infinity_auto_detection_in_constructor();
3102 TestFixture::test_scalar_mul_infinity_edge_cases();
3107 TestFixture::test_batch_mul_complete_cancellation();
3112 TestFixture::test_add_constant_infinity();
3117 TestFixture::test_witness_infinity_from_operations();
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessageRegex)
stdlib_biggroup< TestType< stdlib::bn254< bb::UltraCircuitBuilder >, false > > bn254_with_ultra
stdlib_biggroup< TestType< stdlib::bn254< bb::UltraCircuitBuilder >, true > > bn254_with_ultra_scalar_bigfield
stdlib_biggroup< TestType< stdlib::secp256r1< bb::UltraCircuitBuilder >, true > > secp256r1_with_ultra
constexpr InputType operator!(InputType type)
stdlib_biggroup< TestType< stdlib::bn254< bb::MegaCircuitBuilder >, false > > bn254_with_mega
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
constexpr void self_set_infinity() noexcept
static constexpr affine_element infinity()
static constexpr affine_element one() noexcept
BB_INLINE constexpr void self_set_infinity() noexcept
group_elements::affine_element< Fq, Fr, Params > affine_element
static constexpr element one
group_elements::element< Fq, Fr, Params > element
virtual uint64_t get_random_uint64()=0
virtual uint8_t get_random_uint8()=0
virtual uint256_t get_random_uint256()=0
constexpr uint64_t get_msb() const
Implements boolean logic in-circuit.
void set_origin_tag(const OriginTag &new_tag) const
static auto checked_unconditional_add_sub(const element< C, Fq, Fr, G > &elem1, const element< C, Fq, Fr, G > &elem2)
static field_t from_witness(Builder *ctx, const bb::fr &input)
static void test_checked_unconditional_add_sub(InputType a_type=InputType::WITNESS, InputType b_type=InputType::WITNESS)
static void test_sub_points_at_infinity()
static void test_sub_neg_equals_double()
static void test_helper_batch_mul(std::vector< InputType > point_types, std::vector< InputType > scalar_types, const bool short_scalars=false, const bool with_edgecases=false)
static void test_conditional_negate(InputType point_type=InputType::WITNESS, InputType predicate_type=InputType::WITNESS)
static void test_batch_mul_edgecase_equivalence()
static void test_reduce(InputType point_type=InputType::WITNESS)
static void test_twin_mul()
static void test_witness_infinity_from_operations()
static void test_add_points_at_infinity()
static void test_chain_add(InputType a_type=InputType::WITNESS, InputType b_type=InputType::WITNESS, InputType c_type=InputType::WITNESS)
static void test_conditional_negate_with_infinity()
static void test_compute_naf()
typename g1::element element
static void test_multiple_montgomery_ladder()
static void test_batch_mul_cancellation()
static void test_add_constant_infinity()
static void test_dbl_with_infinity()
static std::pair< affine_element, element_ct > get_random_constant_point(Builder *builder)
static void test_compute_naf_zero()
static void test_mul(InputType scalar_type=InputType::WITNESS, InputType point_type=InputType::WITNESS)
static void test_batch_mul_mixed_infinity()
typename Curve::ScalarFieldNative fr
static void test_batch_mul_edge_case_set2()
static std::pair< fr, scalar_ct > get_random_constant_scalar(Builder *builder, bool even=false)
static void test_get_standard_form_normalizes_infinity()
typename TestType::element_ct element_ct
static void test_assert_coordinates_in_field()
static std::pair< affine_element, element_ct > get_random_witness_point(Builder *builder)
static void test_infinity_auto_detection_in_constructor()
static void test_mul_edge_cases(InputType scalar_type=InputType::WITNESS, InputType point_type=InputType::WITNESS)
typename g1::affine_element affine_element
typename TestType::Curve Curve
static std::pair< fr, scalar_ct > get_random_witness_scalar(Builder *builder, bool even=false)
static void test_batch_mul_linearly_dependent_generators()
static void test_conditional_select(InputType a_type=InputType::WITNESS, InputType b_type=InputType::WITNESS, InputType predicate_type=InputType::WITNESS)
static void test_basic_tag_logic()
static void test_add(InputType a_type=InputType::WITNESS, InputType b_type=InputType::WITNESS)
typename Curve::Builder Builder
static void test_conditional_select_with_infinity()
static void test_incomplete_assert_equal()
static void test_batch_mul_mixed_constant_witness()
static void test_twin_mul_with_infinity()
static void test_unary_negate(InputType a_type=InputType::WITNESS)
typename TestType::scalar_ct scalar_ct
stdlib::bool_t< Builder > bool_ct
static std::pair< fr, scalar_ct > get_random_scalar(Builder *builder, InputType type, bool even=false)
static void test_batch_mul_edge_case_set1()
static void test_checked_unconditional_subtract(InputType a_type=InputType::WITNESS, InputType b_type=InputType::WITNESS)
static void test_short_scalar_mul_with_bit_lengths()
static void test_short_scalar_mul_infinity()
static void test_dbl(InputType a_type=InputType::WITNESS)
static void test_normalize(InputType point_type=InputType::WITNESS)
static void test_infinity_chained_operations()
static void test_incomplete_assert_equal_failure()
static bool is_infinity(const element_ct &e)
static std::pair< fr, scalar_ct > get_random_short_scalar(Builder *builder, InputType type, size_t num_bits)
stdlib::witness_t< Builder > witness_ct
static void test_standard_form_of_point_at_infinity()
Check that converting a point at infinity into standard form ensures the coordinates are zeroes.
typename Curve::GroupNative g1
static void test_scalar_mul_infinity_edge_cases()
typename Curve::BaseFieldNative fq
static void test_batch_mul_mixed_zero_scalars()
static void test_add_assign(InputType a_type=InputType::WITNESS, InputType b_type=InputType::WITNESS)
static std::pair< affine_element, element_ct > get_random_point(Builder *builder, InputType type)
static void test_batch_mul_large_number_of_points()
static void test_dbl_with_y_zero()
static void test_sub_assign(InputType a_type=InputType::WITNESS, InputType b_type=InputType::WITNESS)
static void test_batch_mul()
static void test_batch_mul_all_zero_scalars()
static void test_compute_naf_overflow_lower_half()
static void test_batch_mul_complete_cancellation()
static void test_add_equals_dbl()
static void test_helper_batch_mul(size_t num_points, const bool short_scalars=false, const bool with_edgecases=false)
static void test_sub(InputType a_type=InputType::WITNESS, InputType b_type=InputType::WITNESS)
static void test_batch_mul_linearly_dependent_generators_failure()
static constexpr auto EXPECT_CIRCUIT_CORRECTNESS
static void test_infinity_canonical_representation()
static void test_batch_mul_all_infinity()
static void test_checked_unconditional_add(InputType a_type=InputType::WITNESS, InputType b_type=InputType::WITNESS)
void benchmark_info(Args...)
Info used to store circuit statistics during CI/CD with concrete structure. Writes straight to log.
uint8_t const size_t length
uintx< uint256_t > uint512_t
RNG & get_debug_randomness(bool reset, std::uint_fast64_t seed)
Entry point for Barretenberg command-line interface.
TYPED_TEST_SUITE(CommitmentKeyTest, Curves)
Inner sum(Cont< Inner, Args... > const &in)
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
This file contains part of the logic for the Origin Tag mechanism that tracks the use of in-circuit p...
#define STANDARD_TESTING_TAGS
typename std::conditional< _use_bigfield, typename Curve::g1_bigfr_ct, typename Curve::Group >::type element_ct
typename std::conditional< _use_bigfield, typename Curve::bigfr_ct, typename Curve::ScalarField >::type scalar_ct
static const bool use_bigfield
static OriginTag constant()
static constexpr uint256_t modulus
static field random_element(numeric::RNG *engine=nullptr) noexcept
BB_INLINE constexpr field reduce() const noexcept
static constexpr field zero()
#define HEAVY_TYPED_TEST(x, y)