Randomize the Groth16 proof as per algorithm 2 of the paper. Can alternatively use `rerandomize_proof` from `ark_groth16`
(
mut proof: Proof<E>,
r_prime: &E::ScalarField,
vk: &VerifyingKey<E>,
encryption_key: &EncryptionKey<E>,
rng: &mut R,
)
| 107 | /// Randomize the Groth16 proof as per algorithm 2 of the paper. Can alternatively use |
| 108 | /// `rerandomize_proof` from `ark_groth16` |
| 109 | pub fn randomize_proof<E: Pairing, R: Rng>( |
| 110 | mut proof: Proof<E>, |
| 111 | r_prime: &E::ScalarField, |
| 112 | vk: &VerifyingKey<E>, |
| 113 | encryption_key: &EncryptionKey<E>, |
| 114 | rng: &mut R, |
| 115 | ) -> Result<Proof<E>, SaverError> { |
| 116 | let (z1, z2) = ( |
| 117 | non_zero_random::<E::ScalarField, R>(rng), |
| 118 | non_zero_random::<E::ScalarField, R>(rng), |
| 119 | ); |
| 120 | let z1_inv = z1.inverse().unwrap(); |
| 121 | let z1z2 = z1 * z2; |
| 122 | |
| 123 | // proof.c = proof.c + proof.A * z1z2 + r' * P_2 |
| 124 | let mut c = proof.c.into_group(); |
| 125 | c.add_assign(proof.a.mul_bigint(z1z2.into_bigint())); |
| 126 | c.add_assign(encryption_key.P_2.mul_bigint(r_prime.into_bigint())); |
| 127 | proof.c = c.into_affine(); |
| 128 | |
| 129 | let mut b = proof.b.mul_bigint(z1_inv.into_bigint()); |
| 130 | b.add_assign(vk.delta_g2.mul(z2)); |
| 131 | proof.b = b.into_affine(); |
| 132 | |
| 133 | proof.a = proof.a.mul_bigint(z1.into_bigint()).into_affine(); |
| 134 | |
| 135 | Ok(proof) |
| 136 | } |
| 137 | |
| 138 | pub fn verify_proof<E: Pairing>( |
| 139 | pvk: &PreparedVerifyingKey<E>, |
no test coverage detected