51 auto x1_idx =
builder.add_variable(x);
52 auto y1_idx =
builder.add_variable(y);
55 auto y2_idx =
builder.add_variable(y);
56 auto x2_idx =
builder.add_variable(x);
59 builder.create_add_gate({ x1_idx, y1_idx,
builder.zero_idx(), 1, 1, 0, 0 });
60 builder.create_add_gate({ y2_idx, x2_idx,
builder.zero_idx(), 1, 1, 0, 0 });
63 auto first_tag =
builder.get_new_tag();
64 auto second_tag =
builder.get_new_tag();
65 builder.set_tau_transposition(first_tag, second_tag);
68 builder.assign_tag(x1_idx, first_tag);
69 builder.assign_tag(y1_idx, first_tag);
70 builder.assign_tag(y2_idx, second_tag);
71 builder.assign_tag(x2_idx, second_tag);
73 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(
builder);
74 TestFixture::prove_and_verify(
builder,
true);
96 auto add_equal_pair = [&](
fr value) {
99 builder.assert_equal(idx1, idx2);
104 auto [x1_idx, x1_copy_idx] = add_equal_pair(x);
105 auto [y1_idx, y1_copy_idx] = add_equal_pair(y);
106 auto [x2_idx, x2_copy_idx] = add_equal_pair(x);
107 auto [y2_idx, y2_copy_idx] = add_equal_pair(y);
110 auto first_tag =
builder.get_new_tag();
111 auto second_tag =
builder.get_new_tag();
112 builder.set_tau_transposition(first_tag, second_tag);
115 builder.assign_tag(x1_idx, first_tag);
116 builder.assign_tag(y1_idx, first_tag);
117 builder.assign_tag(x2_idx, second_tag);
118 builder.assign_tag(y2_idx, second_tag);
121 builder.create_add_gate({ x1_copy_idx, x1_idx,
builder.zero_idx(), 1, -1, 0, 0 });
122 builder.create_add_gate({ y1_idx, y2_idx,
builder.zero_idx(), 1, -1, 0, 0 });
123 builder.create_add_gate({ x2_idx, x2_copy_idx,
builder.zero_idx(), 1, -1, 0, 0 });
125 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(
builder);
126 TestFixture::prove_and_verify(
builder,
true);
150 auto x1_idx =
builder.add_variable(x);
151 auto y1_idx =
builder.add_variable(y);
154 auto y2_idx =
builder.add_variable(y);
155 auto x_plus_1_idx =
builder.add_variable(x + 1);
158 builder.create_add_gate({ x1_idx, y1_idx,
builder.zero_idx(), 1, 1, 0, 0 });
159 builder.create_add_gate({ y2_idx, x_plus_1_idx,
builder.zero_idx(), 1, 1, 0, -1 });
161 auto first_tag =
builder.get_new_tag();
162 auto second_tag =
builder.get_new_tag();
163 builder.set_tau_transposition(first_tag, second_tag);
165 builder.assign_tag(x1_idx, first_tag);
166 builder.assign_tag(y1_idx, first_tag);
167 builder.assign_tag(y2_idx, second_tag);
168 builder.assign_tag(x_plus_1_idx, second_tag);
170 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(
builder);
171 TestFixture::prove_and_verify(
builder,
false);
180 auto x1_idx =
builder.add_variable(x);
181 auto y1_idx =
builder.add_variable(y);
182 auto y2_idx =
builder.add_variable(y);
183 auto x_plus_1_idx =
builder.add_variable(x + 1);
185 builder.create_add_gate({ x1_idx, y1_idx,
builder.zero_idx(), 1, 1, 0, 0 });
186 builder.create_add_gate({ y2_idx, x_plus_1_idx,
builder.zero_idx(), 1, 1, 0, -1 });
188 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(
builder);
189 TestFixture::prove_and_verify(
builder,
true);
218 using Prover = TestFixture::Prover;
226 uint32_t a_idx =
builder.add_variable(
a);
227 uint32_t a_copy_idx =
builder.add_variable(
a);
228 uint32_t b_idx =
builder.add_variable(
b);
229 uint32_t c_idx =
builder.add_variable(c);
231 builder.create_add_gate({ a_idx, b_idx, c_idx, 1, 1, -1, 0 });
232 builder.create_add_gate({ a_copy_idx, b_idx, c_idx, 1, 1, -1, 0 });
233 builder.assert_equal(a_copy_idx, a_idx);
235 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(
builder);
240 Prover prover(prover_instance, verification_key);
241 auto proof = prover.construct_proof();
244 prover_instance->polynomials, prover_instance->relation_parameters,
"UltraPermutation - Before Tampering");
245 EXPECT_TRUE(permutation_relation_failures.empty());
249 auto& z_perm_mut = prover_instance->polynomials.z_perm();
250 for (
size_t i = z_perm_mut.start_index(); i < z_perm_mut.end_index(); ++i) {
251 z_perm_mut.at(i) =
fr(0);
254 prover_instance->polynomials.set_shifted();
256 prover_instance->polynomials,
257 prover_instance->relation_parameters,
258 "UltraPermutation - After zeroing out z_perm");
260 EXPECT_FALSE(tampered_permutation_relation_failures.empty());
287 using Prover = TestFixture::Prover;
295 uint32_t a_idx =
builder.add_variable(
a);
296 uint32_t a_copy_idx =
builder.add_variable(
a);
297 uint32_t b_idx =
builder.add_variable(
b);
298 uint32_t c_idx =
builder.add_variable(c);
300 builder.create_add_gate({ a_idx, b_idx, c_idx, 1, 1, -1, 0 });
301 builder.create_add_gate({ a_copy_idx, b_idx, c_idx, 1, 1, -1, 0 });
302 builder.assert_equal(a_copy_idx, a_idx);
304 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(
builder);
309 Prover prover(prover_instance, verification_key);
310 auto proof = prover.construct_proof();
314 prover_instance->polynomials, prover_instance->relation_parameters,
"UltraPermutation - Before Tampering");
315 EXPECT_TRUE(permutation_relation_failures.empty());
321 ASSERT_EQ(prover_instance->polynomials.lagrange_first()[first_row],
fr(1))
322 <<
"lagrange_first should be 1 at row TRACE_OFFSET";
324 auto& z_perm = prover_instance->polynomials.z_perm();
325 auto& z_perm_shift = prover_instance->polynomials.z_perm_shift();
330 prover_instance->polynomials.z_perm() = z_perm.full();
331 prover_instance->polynomials.z_perm_shift() = z_perm_shift.full();
334 ASSERT_EQ(prover_instance->polynomials.z_perm()[first_row],
fr(0));
337 prover_instance->polynomials.z_perm().at(first_row) =
fr(1);
341 prover_instance->polynomials,
342 prover_instance->relation_parameters,
343 "UltraPermutation - After setting z_perm != 0 at lagrange_first");
344 EXPECT_FALSE(tampered_failures.empty());
346 ASSERT_TRUE(tampered_failures.contains(2)) <<
"Expected sub-relation 2 (z_perm init) to fail";
347 ASSERT_EQ(tampered_failures.at(2), first_row) <<
"Expected failure at lagrange_first row";
372 using Prover = TestFixture::Prover;
380 uint32_t a_idx =
builder.add_variable(
a);
381 uint32_t a_copy_idx =
builder.add_variable(
a);
382 uint32_t b_idx =
builder.add_variable(
b);
383 uint32_t c_idx =
builder.add_variable(c);
385 builder.create_add_gate({ a_idx, b_idx, c_idx, 1, 1, -1, 0 });
386 builder.create_add_gate({ a_copy_idx, b_idx, c_idx, 1, 1, -1, 0 });
387 builder.assert_equal(a_copy_idx, a_idx);
389 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(
builder);
394 Prover prover(prover_instance, verification_key);
395 auto proof = prover.construct_proof();
399 prover_instance->polynomials, prover_instance->relation_parameters,
"UltraPermutation - Before Tampering");
400 EXPECT_TRUE(permutation_relation_failures.empty());
403 auto& z_perm = prover_instance->polynomials.z_perm();
404 auto last_valid_index = z_perm.end_index();
405 auto& z_perm_shift = prover_instance->polynomials.z_perm_shift();
407 prover_instance->polynomials.z_perm() = z_perm.full();
408 prover_instance->polynomials.z_perm_shift() = z_perm_shift.full();
410 ASSERT_EQ(prover_instance->polynomials.lagrange_last().at(last_valid_index - 1),
fr(1));
411 ASSERT_EQ(prover_instance->polynomials.z_perm().at(last_valid_index),
fr(0));
412 ASSERT_EQ(prover_instance->polynomials.z_perm_shift().at(last_valid_index - 1),
fr(0));
414 prover_instance->polynomials.z_perm_shift().at(last_valid_index - 1) +=
fr(1);
421 prover_instance->polynomials,
422 prover_instance->relation_parameters,
423 "UltraPermutation - After incrementing z_perm_shift where lagrange_last is 1");
424 EXPECT_FALSE(tampered_permutation_relation_failures.empty());
426 ASSERT_EQ(tampered_permutation_relation_failures[1], last_valid_index - 1);
445 using Prover =
typename TestFixture::Prover;
454 uint32_t a_idx =
builder.add_variable(
a);
455 uint32_t a_copy_idx =
builder.add_variable(
a);
456 uint32_t b_idx =
builder.add_variable(
b);
457 uint32_t c_idx =
builder.add_variable(c);
460 builder.create_add_gate({ a_idx, b_idx, c_idx, 1, 1, -1, 0 });
461 builder.create_add_gate({ a_copy_idx, b_idx, c_idx, 1, 1, -1, 0 });
463 builder.assert_equal(a_copy_idx, a_idx);
465 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(
builder);
471 Prover prover(prover_instance, verification_key);
472 auto proof = prover.construct_proof();
476 prover_instance->polynomials, prover_instance->relation_parameters,
"Permutation Relation - Before Tampering");
477 ASSERT_TRUE(permutation_relation_failures.empty());
482 auto& sigma_1 = prover_instance->polynomials.sigma_1();
483 auto& id_1 = prover_instance->polynomials.id_1();
486 size_t row_to_corrupt = 0;
487 for (
size_t row = 1; row < sigma_1.size(); ++row) {
488 if (sigma_1.at(row) != id_1.at(row)) {
489 row_to_corrupt = row;
490 vinfo(
"Found copy cycle at row ", row,
"; will corrupt this one");
494 ASSERT_NE(row_to_corrupt, 0) <<
"No copy cycle found in sigma_1!";
496 fr original_value = sigma_1.at(row_to_corrupt);
497 sigma_1.at(row_to_corrupt) = original_value +
fr(1);
503 prover_instance->polynomials,
504 prover_instance->relation_parameters,
505 "Permutation Relation - After corrupting sigma_1");
507 ASSERT_TRUE(failures_of_tampered_instance.at(0));
513 auto& z_perm = prover_instance->polynomials.z_perm();
514 auto z_perm_before = z_perm.at(row_to_corrupt + 1);
517 size_t real_circuit_size = prover_instance->get_final_active_wire_idx() + 1;
518 compute_grand_product<Flavor, UltraPermutationRelation<fr>>(
519 prover_instance->polynomials, prover_instance->relation_parameters, real_circuit_size);
520 prover_instance->polynomials.set_shifted();
523 auto z_perm_after = z_perm.at(row_to_corrupt + 1);
524 ASSERT_NE(z_perm_before, z_perm_after) <<
"z_perm should change after recomputing with corrupted sigma";
528 prover_instance->polynomials,
529 prover_instance->relation_parameters,
530 "Permutation Relation - After corrupting sigma_1 and recomputing z_perm");
532 ASSERT_EQ(failures_of_tampered_instance.at(0), real_circuit_size - 1)
533 <<
"Expected failure at row " << (real_circuit_size - 1) <<
" (the recomputation boundary)";
552 using Prover =
typename TestFixture::Prover;
557 fr public_value =
fr(314159);
558 auto pub_var =
builder.add_public_variable(public_value);
562 auto private_var =
builder.add_variable(private_val);
563 auto result_var =
builder.add_variable(public_value + private_val);
564 builder.create_add_gate({ pub_var, private_var, result_var, 1, 1, -1, 0 });
566 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(
builder);
572 Prover prover(prover_instance, verification_key);
573 auto proof = prover.construct_proof();
577 prover_instance->polynomials, prover_instance->relation_parameters,
"Permutation Relation - Before Tampering");
578 ASSERT_TRUE(permutation_relation_failures.empty());
581 fr original_delta = prover_instance->relation_parameters.public_input_delta;
587 fr tampered_public_val =
fr(99999);
588 std::vector<fr> tampered_public_inputs = { tampered_public_val };
589 fr tampered_delta = compute_public_input_delta<Flavor>(tampered_public_inputs,
590 prover_instance->relation_parameters.beta,
591 prover_instance->relation_parameters.gamma,
592 prover_instance->pub_inputs_offset());
595 ASSERT_NE(original_delta, tampered_delta) <<
"Tampered delta should differ from original";
598 prover_instance->relation_parameters.public_input_delta = tampered_delta;
602 prover_instance->polynomials,
603 prover_instance->relation_parameters,
604 "Permutation Relation - After tampering with public_input_delta");
607 ASSERT_TRUE(failures_of_tampered_instance.contains(0)) <<
"Expected subrelation 0 to fail";
608 size_t final_active_wire_idx = prover_instance->get_final_active_wire_idx();
609 ASSERT_TRUE(failures_of_tampered_instance.at(0) == final_active_wire_idx);