use ark_serialize::SerializationError;
use ark_std::{
fmt,
string::{String, ToString},
vec::Vec,
};
#[derive(Clone, Eq, PartialEq)]
pub enum ProofError {
VerificationError,
FormatError,
WrongNumBlindingFactors,
InvalidBitsize,
InvalidAggregation,
InvalidGeneratorsLength,
ProvingError(MPCError),
SerializationError(String),
}
impl fmt::Debug for ProofError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ProofError::VerificationError => write!(f, "Proof verification failed."),
ProofError::FormatError => write!(f, "Proof data could not be parsed."),
ProofError::WrongNumBlindingFactors => {
write!(f, "Wrong number of blinding factors supplied.")
}
ProofError::InvalidBitsize => write!(f, "Invalid bitsize, must have n = 8,16,32,64."),
ProofError::InvalidAggregation => {
write!(f, "Invalid aggregation size, m must be a power of 2.")
}
ProofError::InvalidGeneratorsLength => {
write!(f, "Invalid generators size, too few generators for proof")
}
ProofError::ProvingError(e) => {
write!(f, "Internal error during proof creation: {:?}", e)
}
ProofError::SerializationError(e) => {
write!(f, "Serialization error: {}", e)
}
}
}
}
impl fmt::Display for ProofError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?}", self)
}
}
impl From<MPCError> for ProofError {
fn from(e: MPCError) -> ProofError {
match e {
MPCError::InvalidBitsize => ProofError::InvalidBitsize,
MPCError::InvalidAggregation => ProofError::InvalidAggregation,
MPCError::InvalidGeneratorsLength => ProofError::InvalidGeneratorsLength,
_ => ProofError::ProvingError(e),
}
}
}
#[derive(Clone, Eq, PartialEq)]
pub enum MPCError {
MaliciousDealer,
InvalidBitsize,
InvalidAggregation,
InvalidGeneratorsLength,
WrongNumBitCommitments,
WrongNumPolyCommitments,
WrongNumProofShares,
MalformedProofShares {
bad_shares: Vec<usize>,
},
}
impl fmt::Debug for MPCError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
MPCError::MaliciousDealer => write!(f, "Dealer gave a malicious challenge value."),
MPCError::InvalidBitsize => write!(f, "Invalid bitsize, must have n = 8,16,32,64"),
MPCError::InvalidAggregation => {
write!(f, "Invalid aggregation size, m must be a power of 2")
}
MPCError::InvalidGeneratorsLength => {
write!(f, "Invalid generators size, too few generators for proof")
}
MPCError::WrongNumBitCommitments => write!(f, "Wrong number of value commitments"),
MPCError::WrongNumPolyCommitments => write!(f, "Wrong number of value commitments"),
MPCError::WrongNumProofShares => write!(f, "Wrong number of proof shares"),
MPCError::MalformedProofShares { bad_shares } => {
write!(f, "Malformed proof shares from parties {:?}", bad_shares)
}
}
}
}
impl fmt::Display for MPCError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?}", self)
}
}
#[cfg(feature = "yoloproofs")]
#[derive(Clone, Eq, PartialEq)]
pub enum R1CSError {
InvalidGeneratorsLength,
FormatError,
VerificationError,
MissingAssignment,
GadgetError {
description: String,
},
}
impl fmt::Debug for R1CSError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
R1CSError::InvalidGeneratorsLength => {
write!(f, "Invalid generators size, too few generators for proof")
}
R1CSError::FormatError => write!(f, "Proof data could not be parsed."),
R1CSError::VerificationError => write!(f, "R1CSProof did not verify correctly."),
R1CSError::MissingAssignment => write!(f, "Variable does not have a value assignment."),
R1CSError::GadgetError { description } => write!(f, "Gadget error: {}", description),
}
}
}
impl fmt::Display for R1CSError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?}", self)
}
}
#[cfg(feature = "yoloproofs")]
impl From<ProofError> for R1CSError {
fn from(e: ProofError) -> R1CSError {
match e {
ProofError::InvalidGeneratorsLength => R1CSError::InvalidGeneratorsLength,
ProofError::FormatError => R1CSError::FormatError,
ProofError::VerificationError => R1CSError::VerificationError,
_ => panic!("unexpected error type in conversion"),
}
}
}
impl From<ark_std::io::Error> for ProofError {
fn from(e: ark_std::io::Error) -> ProofError {
ProofError::SerializationError(e.to_string())
}
}
impl From<SerializationError> for ProofError {
fn from(_: ark_serialize::SerializationError) -> ProofError {
ProofError::FormatError
}
}