use cbc::cipher::block_padding::UnpadError;
#[cfg(feature = "wbindgen")]
use wasm_bindgen::JsValue;
use strum::IntoStaticStr;
use hmac::digest::MacError;
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Debug, IntoStaticStr, thiserror::Error)]
pub enum Error {
#[error("The provided data has an invalid length")]
InvalidLength,
#[error("The key length is invalid.")]
InvalidKeyLength,
#[error("The length of the FFI output buffer is invalid.")]
InvalidOutputLength,
#[error("The signature of the data blob does not match 0x0d0c.")]
InvalidSignature,
#[error("The MAC is invalid.")]
InvalidMac,
#[error("The operation cannot be done with this type.")]
InvalidDataType,
#[error("The data type is unknown.")]
UnknownType,
#[error("The data subtype is unknown.")]
UnknownSubtype,
#[error("The data type version is unknown.")]
UnknownVersion,
#[error("The data is invalid.")]
InvalidData,
#[error("A null pointer has been passed to the FFI interface.")]
NullPointer,
#[error("A cryptographic error occurred.")]
CryptoError,
#[error("An error with the Random Number Generator occurred.")]
RandomError,
#[error("Generic IO error: {0}")]
IoError(#[from] std::io::Error),
#[error("There wasn't enough share to regenerate the secret.")]
NotEnoughShares,
#[error("The version is not the same for all the data.")]
InconsistentVersion,
#[error("The length of the data to encrypt/decrypt during online encryption is not the same as the chunk size")]
InvalidChunkLength,
#[error("The mutex is poisoned and cannot be locked")]
PoisonedMutex,
}
impl Error {
pub fn error_code(&self) -> i64 {
match *self {
Error::InvalidLength => -1,
Error::InvalidKeyLength => -2,
Error::InvalidOutputLength => -3,
Error::InvalidSignature => -11,
Error::InvalidMac => -12,
Error::InvalidDataType => -13,
Error::UnknownType => -21,
Error::UnknownSubtype => -22,
Error::UnknownVersion => -23,
Error::InvalidData => -24,
Error::NullPointer => -31,
Error::CryptoError => -32,
Error::RandomError => -33,
Error::IoError(_) => -34,
Error::NotEnoughShares => -41,
Error::InconsistentVersion => -42,
Error::InvalidChunkLength => -43,
Error::PoisonedMutex => -44,
}
}
}
impl From<hmac::digest::InvalidLength> for Error {
fn from(_error: hmac::digest::InvalidLength) -> Error {
Error::InvalidKeyLength
}
}
impl From<MacError> for Error {
fn from(_error: MacError) -> Error {
Error::InvalidMac
}
}
impl From<UnpadError> for Error {
fn from(_error: UnpadError) -> Error {
Error::CryptoError
}
}
impl From<aead::Error> for Error {
fn from(_error: aead::Error) -> Error {
Error::InvalidMac
}
}
impl From<rand::Error> for Error {
fn from(_error: rand::Error) -> Error {
Error::RandomError
}
}
impl From<argon2::Error> for Error {
fn from(_error: argon2::Error) -> Self {
Error::CryptoError
}
}
#[cfg(feature = "wbindgen")]
impl From<Error> for JsValue {
fn from(error: Error) -> JsValue {
let js_error = js_sys::Error::new(&error.to_string());
js_error.set_name(error.into());
js_error.into()
}
}