| 53 | |
| 54 | impl<E: Pairing> Proof<E> { |
| 55 | pub fn verify<'a>( |
| 56 | &self, |
| 57 | message: E::ScalarField, |
| 58 | output: &Output<E>, |
| 59 | public_key: impl Into<&'a E::G2Affine>, |
| 60 | params: impl Into<PreparedSetupParams<E>>, |
| 61 | ) -> Result<(), SyraError> { |
| 62 | let params = params.into(); |
| 63 | let prep_0 = E::G1Prepared::from(self.0); |
| 64 | let prep_1 = E::G2Prepared::from(self.1); |
| 65 | if E::pairing(prep_0.clone(), (params.g_hat * message) + public_key.into()) |
| 66 | != params.pairing |
| 67 | { |
| 68 | return Err(SyraError::InvalidProof); |
| 69 | } |
| 70 | if E::pairing(prep_0.clone(), params.g_hat) != output.0 { |
| 71 | return Err(SyraError::InvalidProof); |
| 72 | } |
| 73 | if !E::multi_pairing( |
| 74 | [E::G1Prepared::from(params.g), prep_0], |
| 75 | [prep_1, params.g_hat.into_group().neg().into().into()], |
| 76 | ) |
| 77 | .is_zero() |
| 78 | { |
| 79 | return Err(SyraError::InvalidProof); |
| 80 | } |
| 81 | Ok(()) |
| 82 | } |
| 83 | } |
| 84 | |
| 85 | #[cfg(test)] |