#[derive(Debug, thiserror::Error)]
pub enum ProofPreparationError {
#[error("claims processing failed: {0}")]
Claims(String),
#[error("proof processing failed: {0}")]
Proof(String),
#[error("{0}")]
Other(String),
}
#[derive(Debug, thiserror::Error)]
pub enum ProofValidationError {
#[error("invalid input data: {0}")]
InvalidInputData(String),
#[error(transparent)]
Preparation(#[from] ProofPreparationError),
#[error("invalid proof")]
InvalidProof,
#[error("invalid proof options")]
InvalidProofOptions,
#[error("unknown key")]
UnknownKey,
#[error("invalid key")]
InvalidKey,
#[error("missing public key")]
MissingPublicKey,
#[error("ambiguous public key")]
AmbiguousPublicKey,
#[error("unsupported key controller `{0}`")]
UnsupportedKeyController(String),
#[error("key controller `{0}` not found")]
KeyControllerNotFound(String),
#[error("invalid key controller")]
InvalidKeyController,
#[error("invalid use of key")]
InvalidKeyUse,
#[error("missing signature algorithm")]
MissingAlgorithm,
#[error("missing signature")]
MissingSignature,
#[error("invalid signature")]
InvalidSignature,
#[error("invalid verification method: {0}")]
InvalidVerificationMethod(String),
#[error("{0}")]
Other(String),
}
impl ProofValidationError {
pub fn other(e: impl ToString) -> Self {
Self::Other(e.to_string())
}
}
#[derive(Debug, thiserror::Error, PartialEq)]
pub enum InvalidProof {
#[error("missing proof")]
Missing,
#[error("invalid signature")]
Signature,
#[error("key mismatch")]
KeyMismatch,
#[error("algorithm mismatch")]
AlgorithmMismatch,
#[error("{0}")]
Other(String),
}
impl From<std::convert::Infallible> for ProofValidationError {
fn from(_value: std::convert::Infallible) -> Self {
unreachable!()
}
}
pub type ProofValidity = Result<(), InvalidProof>;
pub trait ValidateProof<V, T> {
#[allow(async_fn_in_trait)]
async fn validate_proof<'a>(
&'a self,
verifier: &'a V,
claims: &'a T,
) -> Result<ProofValidity, ProofValidationError>;
}
impl<V, T, P: ValidateProof<V, T>> ValidateProof<V, T> for Vec<P> {
async fn validate_proof<'a>(
&'a self,
verifier: &'a V,
claims: &'a T,
) -> Result<ProofValidity, ProofValidationError> {
if self.is_empty() {
Ok(Err(InvalidProof::Missing))
} else {
for p in self {
if let Err(e) = p.validate_proof(verifier, claims).await? {
return Ok(Err(e));
}
}
Ok(Ok(()))
}
}
}