use std::fmt;
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AlgorithmKind {
Hash,
SymmetricCipher,
SignatureSign,
SignatureVerify,
KeyDerivation,
RandomBytes,
}
impl fmt::Display for AlgorithmKind {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let s = match self {
AlgorithmKind::Hash => "hash",
AlgorithmKind::SymmetricCipher => "symmetric cipher",
AlgorithmKind::SignatureSign => "signature (sign)",
AlgorithmKind::SignatureVerify => "signature (verify)",
AlgorithmKind::KeyDerivation => "key derivation",
AlgorithmKind::RandomBytes => "random bytes",
};
f.write_str(s)
}
}
#[derive(Debug)]
pub enum Error {
AlgorithmNotPermitted {
kind: AlgorithmKind,
name: &'static str,
reason: &'static str,
},
InvalidInput(&'static str),
Verification(&'static str),
Backend(&'static str),
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Error::AlgorithmNotPermitted { kind, name, reason } => {
write!(
f,
"{kind} algorithm '{name}' not permitted by active CryptoProvider: {reason}"
)
},
Error::InvalidInput(s) => write!(f, "crypto: invalid input — {s}"),
Error::Verification(s) => write!(f, "crypto: verification failed — {s}"),
Error::Backend(s) => write!(f, "crypto: backend error — {s}"),
}
}
}
impl std::error::Error for Error {}
#[inline]
pub fn not_permitted(kind: AlgorithmKind, name: &'static str, reason: &'static str) -> Error {
Error::AlgorithmNotPermitted { kind, name, reason }
}