37 using InnerFF =
typename InnerFlavor::FF;
38 static constexpr size_t FIRST_WITNESS_INDEX = InnerFlavor::NUM_PRECOMPUTED_ENTITIES;
41 auto num_public_inputs = inner_prover.prover_instance->num_public_inputs();
42 inner_prover.transcript->deserialize_full_transcript(num_public_inputs);
47 InnerFF random_value = InnerFF::random_element();
50 if constexpr (!InnerFlavor::HasZK) {
51 inner_prover.transcript->sumcheck_univariates[0].value_at(0) += random_value;
52 inner_prover.transcript->sumcheck_univariates[0].value_at(1) -= random_value;
54 inner_prover.transcript->zk_sumcheck_univariates[0].value_at(0) += random_value;
55 inner_prover.transcript->zk_sumcheck_univariates[0].value_at(1) -= random_value;
63 inner_prover.transcript->sumcheck_evaluations[FIRST_WITNESS_INDEX] = InnerFF::random_element();
68 inner_prover.transcript->z_perm_comm = inner_prover.transcript->z_perm_comm * InnerFF::random_element();
72 InnerFF random_scalar = InnerFF::random_element();
74 inner_prover.transcript->gemini_fold_comms[0] = inner_prover.transcript->gemini_fold_comms[0] * random_scalar;
75 inner_prover.transcript->gemini_fold_evals[0] *= 0;
89 inner_prover.transcript->serialize_full_transcript();
90 size_t num_frs = InnerFlavor::PROOF_LENGTH_WITHOUT_PUB_INPUTS() + num_public_inputs;
93 num_frs -= IPA_PROOF_LENGTH;
95 inner_prover.transcript->test_set_proof_parsing_state(0, num_frs);
98 inner_proof = inner_prover.export_proof();
109 using Commitment =
typename InnerFlavor::Curve::AffineElement;
110 using FF =
typename InnerFlavor::FF;
111 using ProofFF =
typename ProofType::value_type;
118 constexpr size_t FRS_PER_POINT = Commitment::PUBLIC_INPUTS_SIZE;
119 constexpr size_t NUM_LIMB_BITS = bb::stdlib::NUM_LIMB_BITS_IN_FIELD_SIMULATION;
121 if (inner_proof.size() >= FRS_PER_POINT) {
124 std::copy_n(inner_proof.begin(), FRS_PER_POINT, p0_limbs.begin());
125 Commitment P0 = Commitment::reconstruct_from_public(p0_limbs);
128 Commitment tampered_point = P0 + Commitment::one();
131 if constexpr (FRS_PER_POINT == 8) {
136 inner_proof[0] = ProofFF(x_val & LIMB_MASK);
137 inner_proof[1] = ProofFF((x_val >> NUM_LIMB_BITS) & LIMB_MASK);
138 inner_proof[2] = ProofFF((x_val >> (2 * NUM_LIMB_BITS)) & LIMB_MASK);
139 inner_proof[3] = ProofFF((x_val >> (3 * NUM_LIMB_BITS)) & LIMB_MASK);
142 inner_proof[4] = ProofFF(y_val & LIMB_MASK);
143 inner_proof[5] = ProofFF((y_val >> NUM_LIMB_BITS) & LIMB_MASK);
144 inner_proof[6] = ProofFF((y_val >> (2 * NUM_LIMB_BITS)) & LIMB_MASK);
145 inner_proof[7] = ProofFF((y_val >> (3 * NUM_LIMB_BITS)) & LIMB_MASK);
146 }
else if constexpr (FRS_PER_POINT == 2) {
148 inner_proof[0] = ProofFF(tampered_point.x);
149 inner_proof[1] = ProofFF(tampered_point.y);
151 static_assert(FRS_PER_POINT == 8 || FRS_PER_POINT == 2,
152 "Unsupported curve: FRS_PER_POINT must be 8 (BN254) or 2 (Grumpkin)");
157 static constexpr size_t num_frs_comm = FrCodec::calc_num_fields<Commitment>();
158 size_t offset = inner_proof.size() - num_frs_comm;
160 auto element_frs = std::span{ inner_proof }.subspan(
offset, num_frs_comm);
161 auto last_commitment = NativeTranscript::deserialize<Commitment>(element_frs);
162 last_commitment = last_commitment *
FF(2);
164 std::copy(last_commitment_reserialized.begin(),
165 last_commitment_reserialized.end(),
void tamper_with_proof(InnerProver &inner_prover, ProofType &inner_proof, TamperType type)
Test method that provides several ways to tamper with a proof. TODO(https://github....