18 testing::Types<UltraFlavor, UltraZKFlavor, UltraKeccakFlavor, UltraKeccakZKFlavor, UltraRollupFlavor>;
48 auto x1_idx =
builder.add_variable(x);
49 auto y1_idx =
builder.add_variable(y);
52 auto y2_idx =
builder.add_variable(y);
53 auto x2_idx =
builder.add_variable(x);
56 builder.create_add_gate({ x1_idx, y1_idx,
builder.zero_idx(), 1, 1, 0, 0 });
57 builder.create_add_gate({ y2_idx, x2_idx,
builder.zero_idx(), 1, 1, 0, 0 });
60 auto first_tag =
builder.get_new_tag();
61 auto second_tag =
builder.get_new_tag();
62 builder.set_tau_transposition(first_tag, second_tag);
65 builder.assign_tag(x1_idx, first_tag);
66 builder.assign_tag(y1_idx, first_tag);
67 builder.assign_tag(y2_idx, second_tag);
68 builder.assign_tag(x2_idx, second_tag);
70 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(
builder);
71 TestFixture::prove_and_verify(
builder,
true);
93 auto add_equal_pair = [&](
fr value) {
96 builder.assert_equal(idx1, idx2);
101 auto [x1_idx, x1_copy_idx] = add_equal_pair(x);
102 auto [y1_idx, y1_copy_idx] = add_equal_pair(y);
103 auto [x2_idx, x2_copy_idx] = add_equal_pair(x);
104 auto [y2_idx, y2_copy_idx] = add_equal_pair(y);
107 auto first_tag =
builder.get_new_tag();
108 auto second_tag =
builder.get_new_tag();
109 builder.set_tau_transposition(first_tag, second_tag);
112 builder.assign_tag(x1_idx, first_tag);
113 builder.assign_tag(y1_idx, first_tag);
114 builder.assign_tag(x2_idx, second_tag);
115 builder.assign_tag(y2_idx, second_tag);
118 builder.create_add_gate({ x1_copy_idx, x1_idx,
builder.zero_idx(), 1, -1, 0, 0 });
119 builder.create_add_gate({ y1_idx, y2_idx,
builder.zero_idx(), 1, -1, 0, 0 });
120 builder.create_add_gate({ x2_idx, x2_copy_idx,
builder.zero_idx(), 1, -1, 0, 0 });
122 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(
builder);
123 TestFixture::prove_and_verify(
builder,
true);
147 auto x1_idx =
builder.add_variable(x);
148 auto y1_idx =
builder.add_variable(y);
151 auto y2_idx =
builder.add_variable(y);
152 auto x_plus_1_idx =
builder.add_variable(x + 1);
155 builder.create_add_gate({ x1_idx, y1_idx,
builder.zero_idx(), 1, 1, 0, 0 });
156 builder.create_add_gate({ y2_idx, x_plus_1_idx,
builder.zero_idx(), 1, 1, 0, -1 });
158 auto first_tag =
builder.get_new_tag();
159 auto second_tag =
builder.get_new_tag();
160 builder.set_tau_transposition(first_tag, second_tag);
162 builder.assign_tag(x1_idx, first_tag);
163 builder.assign_tag(y1_idx, first_tag);
164 builder.assign_tag(y2_idx, second_tag);
165 builder.assign_tag(x_plus_1_idx, second_tag);
167 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(
builder);
168 TestFixture::prove_and_verify(
builder,
false);
177 auto x1_idx =
builder.add_variable(x);
178 auto y1_idx =
builder.add_variable(y);
179 auto y2_idx =
builder.add_variable(y);
180 auto x_plus_1_idx =
builder.add_variable(x + 1);
182 builder.create_add_gate({ x1_idx, y1_idx,
builder.zero_idx(), 1, 1, 0, 0 });
183 builder.create_add_gate({ y2_idx, x_plus_1_idx,
builder.zero_idx(), 1, 1, 0, -1 });
185 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(
builder);
186 TestFixture::prove_and_verify(
builder,
true);
215 using Prover = TestFixture::Prover;
223 uint32_t a_idx =
builder.add_variable(
a);
224 uint32_t a_copy_idx =
builder.add_variable(
a);
225 uint32_t b_idx =
builder.add_variable(
b);
226 uint32_t c_idx =
builder.add_variable(c);
228 builder.create_add_gate({ a_idx, b_idx, c_idx, 1, 1, -1, 0 });
229 builder.create_add_gate({ a_copy_idx, b_idx, c_idx, 1, 1, -1, 0 });
230 builder.assert_equal(a_copy_idx, a_idx);
232 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(
builder);
237 Prover prover(prover_instance, verification_key);
238 auto proof = prover.construct_proof();
239 auto& z_perm = prover_instance->polynomials.z_perm;
243 prover_instance->polynomials, prover_instance->relation_parameters,
"UltraPermutation - Before Tampering");
244 EXPECT_TRUE(permutation_relation_failures.empty());
247 for (
size_t i = z_perm.start_index(); i < z_perm.end_index(); ++i) {
248 z_perm.at(i) =
fr(0);
250 prover_instance->polynomials.set_shifted();
252 prover_instance->polynomials,
253 prover_instance->relation_parameters,
254 "UltraPermutation - After zeroing out z_perm");
256 EXPECT_FALSE(tampered_permutation_relation_failures.empty());
281 using Prover = TestFixture::Prover;
289 uint32_t a_idx =
builder.add_variable(
a);
290 uint32_t a_copy_idx =
builder.add_variable(
a);
291 uint32_t b_idx =
builder.add_variable(
b);
292 uint32_t c_idx =
builder.add_variable(c);
294 builder.create_add_gate({ a_idx, b_idx, c_idx, 1, 1, -1, 0 });
295 builder.create_add_gate({ a_copy_idx, b_idx, c_idx, 1, 1, -1, 0 });
296 builder.assert_equal(a_copy_idx, a_idx);
298 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(
builder);
303 Prover prover(prover_instance, verification_key);
304 auto proof = prover.construct_proof();
308 prover_instance->polynomials, prover_instance->relation_parameters,
"UltraPermutation - Before Tampering");
309 EXPECT_TRUE(permutation_relation_failures.empty());
312 auto& z_perm = prover_instance->polynomials.z_perm;
313 auto last_valid_index = z_perm.end_index();
314 auto& z_perm_shift = prover_instance->polynomials.z_perm_shift;
316 prover_instance->polynomials.z_perm = z_perm.full();
317 prover_instance->polynomials.z_perm_shift = z_perm_shift.full();
319 ASSERT_EQ(prover_instance->polynomials.lagrange_last.at(last_valid_index - 1),
fr(1));
320 ASSERT_EQ(prover_instance->polynomials.z_perm.at(last_valid_index),
fr(0));
321 ASSERT_EQ(prover_instance->polynomials.z_perm_shift.at(last_valid_index - 1),
fr(0));
323 prover_instance->polynomials.z_perm_shift.at(last_valid_index - 1) +=
fr(1);
330 prover_instance->polynomials,
331 prover_instance->relation_parameters,
332 "UltraPermutation - After incrementing z_perm_shift where lagrange_last is 1");
333 EXPECT_FALSE(tampered_permutation_relation_failures.empty());
335 ASSERT_EQ(tampered_permutation_relation_failures[1], last_valid_index - 1);
354 using Prover =
typename TestFixture::Prover;
363 uint32_t a_idx =
builder.add_variable(
a);
364 uint32_t a_copy_idx =
builder.add_variable(
a);
365 uint32_t b_idx =
builder.add_variable(
b);
366 uint32_t c_idx =
builder.add_variable(c);
369 builder.create_add_gate({ a_idx, b_idx, c_idx, 1, 1, -1, 0 });
370 builder.create_add_gate({ a_copy_idx, b_idx, c_idx, 1, 1, -1, 0 });
372 builder.assert_equal(a_copy_idx, a_idx);
374 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(
builder);
380 Prover prover(prover_instance, verification_key);
381 auto proof = prover.construct_proof();
385 prover_instance->polynomials, prover_instance->relation_parameters,
"Permutation Relation - Before Tampering");
386 ASSERT_TRUE(permutation_relation_failures.empty());
391 auto& sigma_1 = prover_instance->polynomials.sigma_1;
392 auto& id_1 = prover_instance->polynomials.id_1;
395 size_t row_to_corrupt = 0;
396 for (
size_t row = 1; row < sigma_1.size(); ++row) {
397 if (sigma_1.at(row) != id_1.at(row)) {
398 row_to_corrupt = row;
399 vinfo(
"Found copy cycle at row ", row,
"; will corrupt this one");
403 ASSERT_NE(row_to_corrupt, 0) <<
"No copy cycle found in sigma_1!";
405 fr original_value = sigma_1.at(row_to_corrupt);
406 sigma_1.at(row_to_corrupt) = original_value +
fr(1);
412 prover_instance->polynomials,
413 prover_instance->relation_parameters,
414 "Permutation Relation - After corrupting sigma_1");
416 ASSERT_TRUE(failures_of_tampered_instance.at(0));
422 auto& z_perm = prover_instance->polynomials.z_perm;
423 auto z_perm_before = z_perm.at(row_to_corrupt + 1);
426 size_t real_circuit_size = prover_instance->get_final_active_wire_idx() + 1;
427 compute_grand_product<Flavor, UltraPermutationRelation<fr>>(
428 prover_instance->polynomials, prover_instance->relation_parameters, real_circuit_size);
429 prover_instance->polynomials.set_shifted();
432 auto z_perm_after = z_perm.at(row_to_corrupt + 1);
433 ASSERT_NE(z_perm_before, z_perm_after) <<
"z_perm should change after recomputing with corrupted sigma";
437 prover_instance->polynomials,
438 prover_instance->relation_parameters,
439 "Permutation Relation - After corrupting sigma_1 and recomputing z_perm");
441 ASSERT_EQ(failures_of_tampered_instance.at(0), real_circuit_size - 1)
442 <<
"Expected failure at row " << (real_circuit_size - 1) <<
" (the recomputation boundary)";
461 using Prover =
typename TestFixture::Prover;
466 fr public_value =
fr(314159);
467 auto pub_var =
builder.add_public_variable(public_value);
471 auto private_var =
builder.add_variable(private_val);
472 auto result_var =
builder.add_variable(public_value + private_val);
473 builder.create_add_gate({ pub_var, private_var, result_var, 1, 1, -1, 0 });
475 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(
builder);
481 Prover prover(prover_instance, verification_key);
482 auto proof = prover.construct_proof();
486 prover_instance->polynomials, prover_instance->relation_parameters,
"Permutation Relation - Before Tampering");
487 ASSERT_TRUE(permutation_relation_failures.empty());
490 fr original_delta = prover_instance->relation_parameters.public_input_delta;
496 fr tampered_public_val =
fr(99999);
497 std::vector<fr> tampered_public_inputs = { tampered_public_val };
498 fr tampered_delta = compute_public_input_delta<Flavor>(tampered_public_inputs,
499 prover_instance->relation_parameters.beta,
500 prover_instance->relation_parameters.gamma,
501 prover_instance->pub_inputs_offset());
504 ASSERT_NE(original_delta, tampered_delta) <<
"Tampered delta should differ from original";
507 prover_instance->relation_parameters.public_input_delta = tampered_delta;
511 prover_instance->polynomials,
512 prover_instance->relation_parameters,
513 "Permutation Relation - After tampering with public_input_delta");
516 ASSERT_TRUE(failures_of_tampered_instance.contains(0)) <<
"Expected subrelation 0 to fail";
517 size_t final_active_wire_idx = prover_instance->get_final_active_wire_idx();
518 ASSERT_TRUE(failures_of_tampered_instance.at(0) == final_active_wire_idx);