use crate::error::DoryError;
use crate::messages::*;
use crate::primitives::arithmetic::Group;
use std::marker::PhantomData;
#[derive(Clone, Debug, PartialEq)]
#[allow(missing_docs)]
pub struct DoryProof<G1: Group, G2, GT> {
pub vmv_message: VMVMessage<G1, GT>,
pub first_messages: Vec<FirstReduceMessage<G1, G2, GT>>,
pub second_messages: Vec<SecondReduceMessage<G1, G2, GT>>,
pub final_message: Option<ScalarProductMessage<G1, G2>>,
pub nu: usize,
pub sigma: usize,
#[cfg(feature = "zk")]
pub e2: Option<G2>,
#[cfg(feature = "zk")]
pub y_com: Option<G1>,
#[cfg(feature = "zk")]
pub sigma1_proof: Option<Sigma1Proof<G1, G2, G1::Scalar>>,
#[cfg(feature = "zk")]
pub sigma2_proof: Option<Sigma2Proof<G1::Scalar, GT>>,
#[cfg(feature = "zk")]
pub scalar_product_proof: Option<ScalarProductProof<G1, G2, G1::Scalar, GT>>,
}
#[derive(Clone, Copy)]
pub enum ProofMode<'a, G1: Group, G2, GT> {
Transparent(&'a ScalarProductMessage<G1, G2>, PhantomData<&'a GT>),
#[cfg(feature = "zk")]
Zk {
e2: &'a G2,
y_com: &'a G1,
sigma1: &'a Sigma1Proof<G1, G2, G1::Scalar>,
sigma2: &'a Sigma2Proof<G1::Scalar, GT>,
scalar_product: &'a ScalarProductProof<G1, G2, G1::Scalar, GT>,
},
}
impl<G1: Group, G2, GT> DoryProof<G1, G2, GT> {
pub fn mode(&self) -> Result<ProofMode<'_, G1, G2, GT>, DoryError> {
#[cfg(feature = "zk")]
{
if let (Some(e2), Some(y_com), Some(sigma1), Some(sigma2), Some(scalar_product)) = (
&self.e2,
&self.y_com,
&self.sigma1_proof,
&self.sigma2_proof,
&self.scalar_product_proof,
) {
return if self.final_message.is_none() {
Ok(ProofMode::Zk {
e2,
y_com,
sigma1,
sigma2,
scalar_product,
})
} else {
Err(DoryError::InvalidProof)
};
}
if self.e2.is_some()
|| self.y_com.is_some()
|| self.sigma1_proof.is_some()
|| self.sigma2_proof.is_some()
|| self.scalar_product_proof.is_some()
{
return Err(DoryError::InvalidProof);
}
}
self.final_message
.as_ref()
.map(|msg| ProofMode::Transparent(msg, PhantomData))
.ok_or(DoryError::InvalidProof)
}
}