1use core::convert::Infallible;
7use core::error::Error;
8use core::fmt::Debug;
9
10use displaydoc::Display;
11
12#[derive(Clone, Copy, Display, Eq, Hash, Ord, PartialEq, PartialOrd)]
14pub enum InternalError {
15 HashToScalar,
17 HkdfError,
19 HmacError,
21 KsfError,
23 KemError,
25 SealOpenHmacError,
28 IncompatibleEnvelopeModeError,
31 OprfError(voprf::Error),
33 OprfInternalError(voprf::InternalError),
35}
36
37impl Debug for InternalError {
38 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
39 match self {
40 Self::HashToScalar => f.debug_tuple("HashToScalar").finish(),
41 Self::HkdfError => f.debug_tuple("HkdfError").finish(),
42 Self::HmacError => f.debug_tuple("HmacError").finish(),
43 Self::KsfError => f.debug_tuple("KsfError").finish(),
44 Self::KemError => f.debug_tuple("KemError").finish(),
45 Self::SealOpenHmacError => f.debug_tuple("SealOpenHmacError").finish(),
46 Self::IncompatibleEnvelopeModeError => {
47 f.debug_tuple("IncompatibleEnvelopeModeError").finish()
48 }
49 Self::OprfError(error) => f.debug_tuple("OprfError").field(error).finish(),
50 Self::OprfInternalError(error) => {
51 f.debug_tuple("OprfInternalError").field(error).finish()
52 }
53 }
54 }
55}
56
57impl Error for InternalError {}
58
59impl From<voprf::Error> for InternalError {
60 fn from(voprf_error: voprf::Error) -> Self {
61 Self::OprfError(voprf_error)
62 }
63}
64
65impl From<voprf::Error> for ProtocolError {
66 fn from(voprf_error: voprf::Error) -> Self {
67 Self::LibraryError(InternalError::OprfError(voprf_error))
68 }
69}
70
71impl From<voprf::InternalError> for ProtocolError {
72 fn from(voprf_error: voprf::InternalError) -> Self {
73 Self::LibraryError(InternalError::OprfInternalError(voprf_error))
74 }
75}
76
77#[derive(Clone, Copy, Display, Eq, Hash, Ord, PartialEq, PartialOrd)]
79pub enum ProtocolError<T = Infallible> {
80 LibraryError(InternalError),
82 InvalidLoginError,
84 SerializationError,
86 #[allow(clippy::doc_markdown, unused_assignments)]
88 SizeError {
89 name: &'static str,
91 len: usize,
93 actual_len: usize,
95 },
96 ReflectedValueError,
99 Custom(T),
101}
102
103impl<T: Debug> Debug for ProtocolError<T> {
104 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
105 match self {
106 Self::LibraryError(pake_error) => {
107 f.debug_tuple("LibraryError").field(pake_error).finish()
108 }
109 Self::InvalidLoginError => f.debug_tuple("InvalidLoginError").finish(),
110 Self::SerializationError => f.debug_tuple("SerializationError").finish(),
111 Self::SizeError {
112 name,
113 len,
114 actual_len,
115 } => f
116 .debug_struct("SizeError")
117 .field("name", name)
118 .field("len", len)
119 .field("actual_len", actual_len)
120 .finish(),
121 Self::ReflectedValueError => f.debug_tuple("ReflectedValueError").finish(),
122 Self::Custom(custom) => f.debug_tuple("Custom").field(custom).finish(),
123 }
124 }
125}
126
127impl<T: Error> Error for ProtocolError<T> {}
128
129impl<T> From<InternalError> for ProtocolError<T> {
132 fn from(e: InternalError) -> ProtocolError<T> {
133 Self::LibraryError(e)
134 }
135}
136
137impl<T> From<Infallible> for ProtocolError<T> {
141 fn from(_: Infallible) -> Self {
142 unreachable!()
143 }
144}
145
146impl ProtocolError {
147 pub fn into_custom<T>(self) -> ProtocolError<T> {
149 match self {
150 Self::LibraryError(internal_error) => ProtocolError::LibraryError(internal_error),
151 Self::InvalidLoginError => ProtocolError::InvalidLoginError,
152 Self::SerializationError => ProtocolError::SerializationError,
153 Self::SizeError {
154 name,
155 len,
156 actual_len,
157 } => ProtocolError::SizeError {
158 name,
159 len,
160 actual_len,
161 },
162 Self::ReflectedValueError => ProtocolError::ReflectedValueError,
163 Self::Custom(infallible) => match infallible {},
164 }
165 }
166}