|
use algebra_core::Field;
|
|
use core::borrow::Borrow;
|
|
use r1cs_core::{Namespace, SynthesisError};
|
|
use r1cs_std::prelude::*;
|
|
|
|
use crate::nizk::NIZK;
|
|
|
|
pub trait NIZKVerifierGadget<N: NIZK, ConstraintF: Field> {
|
|
type PreparedVerificationKeyVar;
|
|
type VerificationKeyVar: AllocVar<N::VerificationParameters, ConstraintF>
|
|
+ ToBytesGadget<ConstraintF>;
|
|
type ProofVar: AllocVar<N::Proof, ConstraintF>;
|
|
|
|
/// Optionally allocates `N::Proof` in `cs` without performing
|
|
/// subgroup checks.
|
|
///
|
|
/// The default implementation doesn't omit these checks.
|
|
fn new_proof_unchecked<T: Borrow<N::Proof>>(
|
|
cs: impl Into<Namespace<ConstraintF>>,
|
|
f: impl FnOnce() -> Result<T, SynthesisError>,
|
|
mode: AllocationMode,
|
|
) -> Result<Self::ProofVar, SynthesisError> {
|
|
Self::ProofVar::new_variable(cs, f, mode)
|
|
}
|
|
|
|
/// Optionally allocates `N::VerificationParameters` in `cs`
|
|
/// without performing subgroup checks.
|
|
///
|
|
/// The default implementation doesn't omit these checks.
|
|
fn new_verification_key_unchecked<T: Borrow<N::VerificationParameters>>(
|
|
cs: impl Into<Namespace<ConstraintF>>,
|
|
f: impl FnOnce() -> Result<T, SynthesisError>,
|
|
mode: AllocationMode,
|
|
) -> Result<Self::VerificationKeyVar, SynthesisError> {
|
|
Self::VerificationKeyVar::new_variable(cs, f, mode)
|
|
}
|
|
|
|
fn verify<'a, T: 'a + ToBitsGadget<ConstraintF> + ?Sized>(
|
|
verification_key: &Self::VerificationKeyVar,
|
|
input: impl IntoIterator<Item = &'a T>,
|
|
proof: &Self::ProofVar,
|
|
) -> Result<(), SynthesisError> {
|
|
Self::conditional_verify(verification_key, input, proof, &Boolean::constant(true))
|
|
}
|
|
|
|
fn conditional_verify<'a, T: 'a + ToBitsGadget<ConstraintF> + ?Sized>(
|
|
verification_key: &Self::VerificationKeyVar,
|
|
input: impl IntoIterator<Item = &'a T>,
|
|
proof: &Self::ProofVar,
|
|
condition: &Boolean<ConstraintF>,
|
|
) -> Result<(), SynthesisError>;
|
|
|
|
fn conditional_verify_prepared<'a, T: 'a + ToBitsGadget<ConstraintF> + ?Sized>(
|
|
prepared_verification_key: &Self::PreparedVerificationKeyVar,
|
|
input: impl IntoIterator<Item = &'a T>,
|
|
proof: &Self::ProofVar,
|
|
condition: &Boolean<ConstraintF>,
|
|
) -> Result<(), SynthesisError>;
|
|
}
|