xref: /webrtc/dtls/src/error.rs (revision 603f4064)
1 use thiserror::Error;
2 
3 use rcgen::RcgenError;
4 use std::io;
5 use std::string::FromUtf8Error;
6 use tokio::sync::mpsc::error::SendError as MpscSendError;
7 use util::KeyingMaterialExporterError;
8 
9 pub type Result<T> = std::result::Result<T, Error>;
10 
11 #[derive(Debug, Error, PartialEq)]
12 #[non_exhaustive]
13 pub enum Error {
14     #[error("conn is closed")]
15     ErrConnClosed,
16     #[error("read/write timeout")]
17     ErrDeadlineExceeded,
18     #[error("buffer is too small")]
19     ErrBufferTooSmall,
20     #[error("context is not supported for export_keying_material")]
21     ErrContextUnsupported,
22     #[error("packet is too short")]
23     ErrDtlspacketInvalidLength,
24     #[error("handshake is in progress")]
25     ErrHandshakeInProgress,
26     #[error("invalid content type")]
27     ErrInvalidContentType,
28     #[error("invalid mac")]
29     ErrInvalidMac,
30     #[error("packet length and declared length do not match")]
31     ErrInvalidPacketLength,
32     #[error("export_keying_material can not be used with a reserved label")]
33     ErrReservedExportKeyingMaterial,
34     #[error("client sent certificate verify but we have no certificate to verify")]
35     ErrCertificateVerifyNoCertificate,
36     #[error("client+server do not support any shared cipher suites")]
37     ErrCipherSuiteNoIntersection,
38     #[error("server hello can not be created without a cipher suite")]
39     ErrCipherSuiteUnset,
40     #[error("client sent certificate but did not verify it")]
41     ErrClientCertificateNotVerified,
42     #[error("server required client verification, but got none")]
43     ErrClientCertificateRequired,
44     #[error("server responded with SRTP Profile we do not support")]
45     ErrClientNoMatchingSrtpProfile,
46     #[error("client required Extended Master Secret extension, but server does not support it")]
47     ErrClientRequiredButNoServerEms,
48     #[error("server hello can not be created without a compression method")]
49     ErrCompressionMethodUnset,
50     #[error("client+server cookie does not match")]
51     ErrCookieMismatch,
52     #[error("cookie must not be longer then 255 bytes")]
53     ErrCookieTooLong,
54     #[error("PSK Identity Hint provided but PSK is nil")]
55     ErrIdentityNoPsk,
56     #[error("no certificate provided")]
57     ErrInvalidCertificate,
58     #[error("cipher spec invalid")]
59     ErrInvalidCipherSpec,
60     #[error("invalid or unknown cipher suite")]
61     ErrInvalidCipherSuite,
62     #[error("unable to determine if ClientKeyExchange is a public key or PSK Identity")]
63     ErrInvalidClientKeyExchange,
64     #[error("invalid or unknown compression method")]
65     ErrInvalidCompressionMethod,
66     #[error("ECDSA signature contained zero or negative values")]
67     ErrInvalidEcdsasignature,
68     #[error("invalid or unknown elliptic curve type")]
69     ErrInvalidEllipticCurveType,
70     #[error("invalid extension type")]
71     ErrInvalidExtensionType,
72     #[error("invalid hash algorithm")]
73     ErrInvalidHashAlgorithm,
74     #[error("invalid named curve")]
75     ErrInvalidNamedCurve,
76     #[error("invalid private key type")]
77     ErrInvalidPrivateKey,
78     #[error("named curve and private key type does not match")]
79     ErrNamedCurveAndPrivateKeyMismatch,
80     #[error("invalid server name format")]
81     ErrInvalidSniFormat,
82     #[error("invalid signature algorithm")]
83     ErrInvalidSignatureAlgorithm,
84     #[error("expected and actual key signature do not match")]
85     ErrKeySignatureMismatch,
86     #[error("Conn can not be created with a nil nextConn")]
87     ErrNilNextConn,
88     #[error("connection can not be created, no CipherSuites satisfy this Config")]
89     ErrNoAvailableCipherSuites,
90     #[error("connection can not be created, no SignatureScheme satisfy this Config")]
91     ErrNoAvailableSignatureSchemes,
92     #[error("no certificates configured")]
93     ErrNoCertificates,
94     #[error("no config provided")]
95     ErrNoConfigProvided,
96     #[error("client requested zero or more elliptic curves that are not supported by the server")]
97     ErrNoSupportedEllipticCurves,
98     #[error("unsupported protocol version")]
99     ErrUnsupportedProtocolVersion,
100     #[error("Certificate and PSK provided")]
101     ErrPskAndCertificate,
102     #[error("PSK and PSK Identity Hint must both be set for client")]
103     ErrPskAndIdentityMustBeSetForClient,
104     #[error("SRTP support was requested but server did not respond with use_srtp extension")]
105     ErrRequestedButNoSrtpExtension,
106     #[error("Certificate is mandatory for server")]
107     ErrServerMustHaveCertificate,
108     #[error("client requested SRTP but we have no matching profiles")]
109     ErrServerNoMatchingSrtpProfile,
110     #[error(
111         "server requires the Extended Master Secret extension, but the client does not support it"
112     )]
113     ErrServerRequiredButNoClientEms,
114     #[error("expected and actual verify data does not match")]
115     ErrVerifyDataMismatch,
116     #[error("handshake message unset, unable to marshal")]
117     ErrHandshakeMessageUnset,
118     #[error("invalid flight number")]
119     ErrInvalidFlight,
120     #[error("unable to generate key signature, unimplemented")]
121     ErrKeySignatureGenerateUnimplemented,
122     #[error("unable to verify key signature, unimplemented")]
123     ErrKeySignatureVerifyUnimplemented,
124     #[error("data length and declared length do not match")]
125     ErrLengthMismatch,
126     #[error("buffer not long enough to contain nonce")]
127     ErrNotEnoughRoomForNonce,
128     #[error("feature has not been implemented yet")]
129     ErrNotImplemented,
130     #[error("sequence number overflow")]
131     ErrSequenceNumberOverflow,
132     #[error("unable to marshal fragmented handshakes")]
133     ErrUnableToMarshalFragmented,
134     #[error("invalid state machine transition")]
135     ErrInvalidFsmTransition,
136     #[error("ApplicationData with epoch of 0")]
137     ErrApplicationDataEpochZero,
138     #[error("unhandled contentType")]
139     ErrUnhandledContextType,
140     #[error("context canceled")]
141     ErrContextCanceled,
142     #[error("empty fragment")]
143     ErrEmptyFragment,
144     #[error("Alert is Fatal or Close Notify")]
145     ErrAlertFatalOrClose,
146 
147     #[error(
148         "Fragment buffer overflow. New size {new_size} is greater than specified max {max_size}"
149     )]
150     ErrFragmentBufferOverflow { new_size: usize, max_size: usize },
151 
152     #[error("{0}")]
153     Io(#[source] IoError),
154     #[error("{0}")]
155     Util(#[from] util::Error),
156     #[error("utf8: {0}")]
157     Utf8(#[from] FromUtf8Error),
158     #[error("{0}")]
159     Sec1(#[source] sec1::Error),
160     #[error("{0}")]
161     P256(#[source] P256Error),
162     #[error("{0}")]
163     RcGen(#[from] RcgenError),
164     #[error("mpsc send: {0}")]
165     MpscSend(String),
166     #[error("keying material: {0}")]
167     KeyingMaterial(#[from] KeyingMaterialExporterError),
168 
169     #[allow(non_camel_case_types)]
170     #[error("{0}")]
171     Other(String),
172 }
173 
174 #[derive(Debug, Error)]
175 #[error("io error: {0}")]
176 pub struct IoError(#[from] pub io::Error);
177 
178 // Workaround for wanting PartialEq for io::Error.
179 impl PartialEq for IoError {
180     fn eq(&self, other: &Self) -> bool {
181         self.0.kind() == other.0.kind()
182     }
183 }
184 
185 impl From<io::Error> for Error {
186     fn from(e: io::Error) -> Self {
187         Error::Io(IoError(e))
188     }
189 }
190 
191 impl From<sec1::Error> for Error {
192     fn from(e: sec1::Error) -> Self {
193         Error::Sec1(e)
194     }
195 }
196 
197 #[derive(Debug, Error)]
198 #[error("{0}")]
199 pub struct P256Error(#[source] p256::elliptic_curve::Error);
200 
201 impl PartialEq for P256Error {
202     fn eq(&self, _: &Self) -> bool {
203         false
204     }
205 }
206 
207 impl From<p256::elliptic_curve::Error> for Error {
208     fn from(e: p256::elliptic_curve::Error) -> Self {
209         Error::P256(P256Error(e))
210     }
211 }
212 
213 impl From<block_modes::InvalidKeyIvLength> for Error {
214     fn from(e: block_modes::InvalidKeyIvLength) -> Self {
215         Error::Other(e.to_string())
216     }
217 }
218 impl From<block_modes::BlockModeError> for Error {
219     fn from(e: block_modes::BlockModeError) -> Self {
220         Error::Other(e.to_string())
221     }
222 }
223 
224 // Because Tokio SendError is parameterized, we sadly lose the backtrace.
225 impl<T> From<MpscSendError<T>> for Error {
226     fn from(e: MpscSendError<T>) -> Self {
227         Error::MpscSend(e.to_string())
228     }
229 }
230