reallyme_crypto/operations/
error.rs1use thiserror::Error;
6
7#[derive(Debug, Error, Clone, Copy, PartialEq, Eq)]
14#[non_exhaustive]
15pub enum OperationError {
16 #[error("primitive operation failure: {reason}")]
18 Primitive {
19 reason: PrimitiveErrorReason,
21 },
22 #[error("provider operation failure: {reason}")]
24 Provider {
25 reason: ProviderErrorReason,
27 },
28 #[error("backend operation failure: {reason}")]
30 Backend {
31 reason: BackendErrorReason,
33 },
34}
35
36#[derive(Debug, Clone, Copy, PartialEq, Eq)]
38#[non_exhaustive]
39pub enum PrimitiveErrorReason {
40 MissingAlgorithm,
42 MissingOperation,
44 InvalidKey,
46 InvalidPublicKey,
48 InvalidPrivateKey,
50 MalformedCiphertext,
52 InvalidParameter,
54 InvalidLength,
56 LengthOverflow,
58 VerificationFailed,
60 InvalidSharedSecret,
62 ResourceLimitExceeded,
64}
65
66impl core::fmt::Display for PrimitiveErrorReason {
67 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
68 let reason = match self {
69 PrimitiveErrorReason::MissingAlgorithm => "missing algorithm",
70 PrimitiveErrorReason::MissingOperation => "missing operation",
71 PrimitiveErrorReason::InvalidKey => "invalid key",
72 PrimitiveErrorReason::InvalidPublicKey => "invalid public key",
73 PrimitiveErrorReason::InvalidPrivateKey => "invalid private key",
74 PrimitiveErrorReason::MalformedCiphertext => "malformed ciphertext",
75 PrimitiveErrorReason::InvalidParameter => "invalid parameter",
76 PrimitiveErrorReason::InvalidLength => "invalid length",
77 PrimitiveErrorReason::LengthOverflow => "length overflow",
78 PrimitiveErrorReason::VerificationFailed => "verification failed",
79 PrimitiveErrorReason::InvalidSharedSecret => "invalid shared secret",
80 PrimitiveErrorReason::ResourceLimitExceeded => "resource limit exceeded",
81 };
82 write!(f, "{reason}")
83 }
84}
85
86#[derive(Debug, Clone, Copy, PartialEq, Eq)]
88#[non_exhaustive]
89pub enum ProviderErrorReason {
90 UnsupportedAlgorithm,
92 ProviderUnavailable,
94 RandomnessUnavailable,
96 FallbackProhibited,
98 PlatformUnavailable,
100 KeyExists,
102 KeyNotFound,
104 AccessDenied,
106 UserAuthenticationRequired,
108 UserCanceled,
110 HardwareUnavailable,
112 HardwareRejectedKey,
114}
115
116impl core::fmt::Display for ProviderErrorReason {
117 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
118 let reason = match self {
119 ProviderErrorReason::UnsupportedAlgorithm => "unsupported algorithm",
120 ProviderErrorReason::ProviderUnavailable => "provider unavailable",
121 ProviderErrorReason::RandomnessUnavailable => "provider randomness unavailable",
122 ProviderErrorReason::FallbackProhibited => "fallback prohibited",
123 ProviderErrorReason::PlatformUnavailable => "platform unavailable",
124 ProviderErrorReason::KeyExists => "key exists",
125 ProviderErrorReason::KeyNotFound => "key not found",
126 ProviderErrorReason::AccessDenied => "access denied",
127 ProviderErrorReason::UserAuthenticationRequired => "user authentication required",
128 ProviderErrorReason::UserCanceled => "user canceled",
129 ProviderErrorReason::HardwareUnavailable => "hardware unavailable",
130 ProviderErrorReason::HardwareRejectedKey => "hardware rejected key",
131 };
132 write!(f, "{reason}")
133 }
134}
135
136#[derive(Debug, Clone, Copy, PartialEq, Eq)]
138#[non_exhaustive]
139pub enum BackendErrorReason {
140 InvalidOutput,
142 PanicContained,
144 Internal,
146}
147
148impl core::fmt::Display for BackendErrorReason {
149 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
150 let reason = match self {
151 BackendErrorReason::InvalidOutput => "invalid output",
152 BackendErrorReason::PanicContained => "panic contained",
153 BackendErrorReason::Internal => "internal failure",
154 };
155 write!(f, "{reason}")
156 }
157}