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();
242 auto& z_perm = prover_instance->polynomials.z_perm;
246 prover_instance->polynomials, prover_instance->relation_parameters,
"UltraPermutation - Before Tampering");
247 EXPECT_TRUE(permutation_relation_failures.empty());
250 for (
size_t i = z_perm.start_index(); i < z_perm.end_index(); ++i) {
251 z_perm.at(i) =
fr(0);
253 prover_instance->polynomials.set_shifted();
255 prover_instance->polynomials,
256 prover_instance->relation_parameters,
257 "UltraPermutation - After zeroing out z_perm");
259 EXPECT_FALSE(tampered_permutation_relation_failures.empty());
286 using Prover = TestFixture::Prover;
294 uint32_t a_idx =
builder.add_variable(
a);
295 uint32_t a_copy_idx =
builder.add_variable(
a);
296 uint32_t b_idx =
builder.add_variable(
b);
297 uint32_t c_idx =
builder.add_variable(c);
299 builder.create_add_gate({ a_idx, b_idx, c_idx, 1, 1, -1, 0 });
300 builder.create_add_gate({ a_copy_idx, b_idx, c_idx, 1, 1, -1, 0 });
301 builder.assert_equal(a_copy_idx, a_idx);
303 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(
builder);
308 Prover prover(prover_instance, verification_key);
309 auto proof = prover.construct_proof();
313 prover_instance->polynomials, prover_instance->relation_parameters,
"UltraPermutation - Before Tampering");
314 EXPECT_TRUE(permutation_relation_failures.empty());
320 ASSERT_EQ(prover_instance->polynomials.lagrange_first[first_row],
fr(1))
321 <<
"lagrange_first should be 1 at row TRACE_OFFSET";
323 auto& z_perm = prover_instance->polynomials.z_perm;
324 auto& z_perm_shift = prover_instance->polynomials.z_perm_shift;
329 prover_instance->polynomials.z_perm = z_perm.full();
330 prover_instance->polynomials.z_perm_shift = z_perm_shift.full();
333 ASSERT_EQ(prover_instance->polynomials.z_perm[first_row],
fr(0));
336 prover_instance->polynomials.z_perm.at(first_row) =
fr(1);
340 prover_instance->polynomials,
341 prover_instance->relation_parameters,
342 "UltraPermutation - After setting z_perm != 0 at lagrange_first");
343 EXPECT_FALSE(tampered_failures.empty());
345 ASSERT_TRUE(tampered_failures.contains(2)) <<
"Expected sub-relation 2 (z_perm init) to fail";
346 ASSERT_EQ(tampered_failures.at(2), first_row) <<
"Expected failure at lagrange_first row";
371 using Prover = TestFixture::Prover;
379 uint32_t a_idx =
builder.add_variable(
a);
380 uint32_t a_copy_idx =
builder.add_variable(
a);
381 uint32_t b_idx =
builder.add_variable(
b);
382 uint32_t c_idx =
builder.add_variable(c);
384 builder.create_add_gate({ a_idx, b_idx, c_idx, 1, 1, -1, 0 });
385 builder.create_add_gate({ a_copy_idx, b_idx, c_idx, 1, 1, -1, 0 });
386 builder.assert_equal(a_copy_idx, a_idx);
388 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(
builder);
393 Prover prover(prover_instance, verification_key);
394 auto proof = prover.construct_proof();
398 prover_instance->polynomials, prover_instance->relation_parameters,
"UltraPermutation - Before Tampering");
399 EXPECT_TRUE(permutation_relation_failures.empty());
402 auto& z_perm = prover_instance->polynomials.z_perm;
403 auto last_valid_index = z_perm.end_index();
404 auto& z_perm_shift = prover_instance->polynomials.z_perm_shift;
406 prover_instance->polynomials.z_perm = z_perm.full();
407 prover_instance->polynomials.z_perm_shift = z_perm_shift.full();
409 ASSERT_EQ(prover_instance->polynomials.lagrange_last.at(last_valid_index - 1),
fr(1));
410 ASSERT_EQ(prover_instance->polynomials.z_perm.at(last_valid_index),
fr(0));
411 ASSERT_EQ(prover_instance->polynomials.z_perm_shift.at(last_valid_index - 1),
fr(0));
413 prover_instance->polynomials.z_perm_shift.at(last_valid_index - 1) +=
fr(1);
420 prover_instance->polynomials,
421 prover_instance->relation_parameters,
422 "UltraPermutation - After incrementing z_perm_shift where lagrange_last is 1");
423 EXPECT_FALSE(tampered_permutation_relation_failures.empty());
425 ASSERT_EQ(tampered_permutation_relation_failures[1], last_valid_index - 1);
444 using Prover =
typename TestFixture::Prover;
453 uint32_t a_idx =
builder.add_variable(
a);
454 uint32_t a_copy_idx =
builder.add_variable(
a);
455 uint32_t b_idx =
builder.add_variable(
b);
456 uint32_t c_idx =
builder.add_variable(c);
459 builder.create_add_gate({ a_idx, b_idx, c_idx, 1, 1, -1, 0 });
460 builder.create_add_gate({ a_copy_idx, b_idx, c_idx, 1, 1, -1, 0 });
462 builder.assert_equal(a_copy_idx, a_idx);
464 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(
builder);
470 Prover prover(prover_instance, verification_key);
471 auto proof = prover.construct_proof();
475 prover_instance->polynomials, prover_instance->relation_parameters,
"Permutation Relation - Before Tampering");
476 ASSERT_TRUE(permutation_relation_failures.empty());
481 auto& sigma_1 = prover_instance->polynomials.sigma_1;
482 auto& id_1 = prover_instance->polynomials.id_1;
485 size_t row_to_corrupt = 0;
486 for (
size_t row = 1; row < sigma_1.size(); ++row) {
487 if (sigma_1.at(row) != id_1.at(row)) {
488 row_to_corrupt = row;
489 vinfo(
"Found copy cycle at row ", row,
"; will corrupt this one");
493 ASSERT_NE(row_to_corrupt, 0) <<
"No copy cycle found in sigma_1!";
495 fr original_value = sigma_1.at(row_to_corrupt);
496 sigma_1.at(row_to_corrupt) = original_value +
fr(1);
502 prover_instance->polynomials,
503 prover_instance->relation_parameters,
504 "Permutation Relation - After corrupting sigma_1");
506 ASSERT_TRUE(failures_of_tampered_instance.at(0));
512 auto& z_perm = prover_instance->polynomials.z_perm;
513 auto z_perm_before = z_perm.at(row_to_corrupt + 1);
516 size_t real_circuit_size = prover_instance->get_final_active_wire_idx() + 1;
517 compute_grand_product<Flavor, UltraPermutationRelation<fr>>(
518 prover_instance->polynomials, prover_instance->relation_parameters, real_circuit_size);
519 prover_instance->polynomials.set_shifted();
522 auto z_perm_after = z_perm.at(row_to_corrupt + 1);
523 ASSERT_NE(z_perm_before, z_perm_after) <<
"z_perm should change after recomputing with corrupted sigma";
527 prover_instance->polynomials,
528 prover_instance->relation_parameters,
529 "Permutation Relation - After corrupting sigma_1 and recomputing z_perm");
531 ASSERT_EQ(failures_of_tampered_instance.at(0), real_circuit_size - 1)
532 <<
"Expected failure at row " << (real_circuit_size - 1) <<
" (the recomputation boundary)";
551 using Prover =
typename TestFixture::Prover;
556 fr public_value =
fr(314159);
557 auto pub_var =
builder.add_public_variable(public_value);
561 auto private_var =
builder.add_variable(private_val);
562 auto result_var =
builder.add_variable(public_value + private_val);
563 builder.create_add_gate({ pub_var, private_var, result_var, 1, 1, -1, 0 });
565 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(
builder);
571 Prover prover(prover_instance, verification_key);
572 auto proof = prover.construct_proof();
576 prover_instance->polynomials, prover_instance->relation_parameters,
"Permutation Relation - Before Tampering");
577 ASSERT_TRUE(permutation_relation_failures.empty());
580 fr original_delta = prover_instance->relation_parameters.public_input_delta;
586 fr tampered_public_val =
fr(99999);
587 std::vector<fr> tampered_public_inputs = { tampered_public_val };
588 fr tampered_delta = compute_public_input_delta<Flavor>(tampered_public_inputs,
589 prover_instance->relation_parameters.beta,
590 prover_instance->relation_parameters.gamma,
591 prover_instance->pub_inputs_offset());
594 ASSERT_NE(original_delta, tampered_delta) <<
"Tampered delta should differ from original";
597 prover_instance->relation_parameters.public_input_delta = tampered_delta;
601 prover_instance->polynomials,
602 prover_instance->relation_parameters,
603 "Permutation Relation - After tampering with public_input_delta");
606 ASSERT_TRUE(failures_of_tampered_instance.contains(0)) <<
"Expected subrelation 0 to fail";
607 size_t final_active_wire_idx = prover_instance->get_final_active_wire_idx();
608 ASSERT_TRUE(failures_of_tampered_instance.at(0) == final_active_wire_idx);