devolutions_crypto/
error.rs1use cbc::cipher::block_padding::UnpadError;
3
4#[cfg(feature = "wbindgen")]
5use wasm_bindgen::JsValue;
6
7use strum::IntoStaticStr;
8
9use hmac::digest::MacError;
10
11pub type Result<T> = std::result::Result<T, Error>;
12
13#[derive(Debug, IntoStaticStr, thiserror::Error)]
26pub enum Error {
27 #[error("The provided data has an invalid length")]
29 InvalidLength,
30 #[error("The key length is invalid.")]
32 InvalidKeyLength,
33 #[error("The length of the FFI output buffer is invalid.")]
35 InvalidOutputLength,
36 #[error("The signature of the data blob does not match 0x0d0c.")]
38 InvalidSignature,
39 #[error("The MAC is invalid.")]
41 InvalidMac,
42 #[error("The operation cannot be done with this type.")]
44 InvalidDataType,
45 #[error("The data type is unknown.")]
47 UnknownType,
48 #[error("The data subtype is unknown.")]
50 UnknownSubtype,
51 #[error("The data type version is unknown.")]
53 UnknownVersion,
54 #[error("The data is invalid.")]
56 InvalidData,
57 #[error("A null pointer has been passed to the FFI interface.")]
59 NullPointer,
60 #[error("A cryptographic error occurred.")]
62 CryptoError,
63 #[error("An error with the Random Number Generator occurred.")]
65 RandomError,
66 #[error("Generic IO error: {0}")]
68 IoError(#[from] std::io::Error),
69 #[error("There wasn't enough share to regenerate the secret.")]
71 NotEnoughShares,
72 #[error("The version is not the same for all the data.")]
74 InconsistentVersion,
75 #[error("The length of the data to encrypt/decrypt during online encryption is not the same as the chunk size")]
77 InvalidChunkLength,
78 #[error("The mutex is poisoned and cannot be locked")]
80 PoisonedMutex,
81}
82
83impl Error {
84 pub fn error_code(&self) -> i64 {
87 match *self {
88 Error::InvalidLength => -1,
89 Error::InvalidKeyLength => -2,
90 Error::InvalidOutputLength => -3,
91 Error::InvalidSignature => -11,
92 Error::InvalidMac => -12,
93 Error::InvalidDataType => -13,
94 Error::UnknownType => -21,
95 Error::UnknownSubtype => -22,
96 Error::UnknownVersion => -23,
97 Error::InvalidData => -24,
98 Error::NullPointer => -31,
99 Error::CryptoError => -32,
100 Error::RandomError => -33,
101 Error::IoError(_) => -34,
102 Error::NotEnoughShares => -41,
103 Error::InconsistentVersion => -42,
104 Error::InvalidChunkLength => -43,
105 Error::PoisonedMutex => -44,
106 }
107 }
108}
109
110impl From<hmac::digest::InvalidLength> for Error {
111 fn from(_error: hmac::digest::InvalidLength) -> Error {
112 Error::InvalidKeyLength
113 }
114}
115
116impl From<MacError> for Error {
117 fn from(_error: MacError) -> Error {
118 Error::InvalidMac
119 }
120}
121
122impl From<UnpadError> for Error {
123 fn from(_error: UnpadError) -> Error {
124 Error::CryptoError
125 }
126}
127
128impl From<aead::Error> for Error {
129 fn from(_error: aead::Error) -> Error {
130 Error::InvalidMac
131 }
132}
133
134impl From<rand::Error> for Error {
135 fn from(_error: rand::Error) -> Error {
136 Error::RandomError
137 }
138}
139
140impl From<argon2::Error> for Error {
141 fn from(_error: argon2::Error) -> Self {
142 Error::CryptoError
143 }
144}
145
146#[cfg(feature = "wbindgen")]
147impl From<Error> for JsValue {
148 fn from(error: Error) -> JsValue {
149 let js_error = js_sys::Error::new(&error.to_string());
150
151 js_error.set_name(error.into());
152 js_error.into()
153 }
154}