/src/spdm-rs/spdmlib/src/error.rs
Line | Count | Source (jump to first uncovered line) |
1 | | // Copyright (c) 2023 Intel Corporation |
2 | | // |
3 | | // SPDX-License-Identifier: Apache-2.0 or MIT |
4 | | |
5 | | use core::{ |
6 | | convert::{TryFrom, TryInto}, |
7 | | fmt::{self, Debug}, |
8 | | }; |
9 | | |
10 | | /// Reference: https://github.com/DMTF/libspdm/blob/main/include/library/spdm_return_status.h |
11 | | #[repr(u8)] |
12 | | #[allow(dead_code)] |
13 | | #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] |
14 | | pub enum StatusSeverity { |
15 | | SUCCESS = 0, |
16 | | ERROR = 8, |
17 | | } |
18 | | |
19 | | impl Default for StatusSeverity { |
20 | 0 | fn default() -> Self { |
21 | 0 | Self::ERROR |
22 | 0 | } |
23 | | } |
24 | | |
25 | | impl TryFrom<u8> for StatusSeverity { |
26 | | type Error = (); |
27 | | |
28 | 0 | fn try_from(value: u8) -> core::result::Result<Self, Self::Error> { |
29 | 0 | match value { |
30 | 0 | 0 => Ok(Self::SUCCESS), |
31 | 0 | 8 => Ok(Self::ERROR), |
32 | 0 | _ => Err(()), |
33 | | } |
34 | 0 | } |
35 | | } |
36 | | |
37 | | #[repr(u16)] |
38 | | #[allow(dead_code)] |
39 | | #[allow(non_camel_case_types)] |
40 | | #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] |
41 | | pub enum StatusCodeCore { |
42 | | SUCCESS = 0, |
43 | | INVALID_PARAMETER = 1, |
44 | | UNSUPPORTED_CAP = 2, |
45 | | INVALID_STATE_LOCAL = 3, |
46 | | INVALID_STATE_PEER = 4, |
47 | | INVALID_MSG_FIELD = 5, |
48 | | INVALID_MSG_SIZE = 6, |
49 | | NEGOTIATION_FAIL = 7, |
50 | | BUSY_PEER = 8, |
51 | | NOT_READY_PEER = 9, |
52 | | ERROR_PEER = 10, |
53 | | RESYNCH_PEER = 11, |
54 | | BUFFER_FULL = 12, |
55 | | BUFFER_TOO_SMALL = 13, |
56 | | SESSION_NUMBER_EXCEED = 14, |
57 | | SESSION_MSG_ERROR = 15, |
58 | | ACQUIRE_FAIL = 16, |
59 | | SESSION_TRY_DISCARD_KEY_UPDATE = 17, |
60 | | |
61 | | // only in spdm-rs |
62 | | DECODE_AEAD_FAIL = 0xFE, |
63 | | } |
64 | | |
65 | | impl TryFrom<u16> for StatusCodeCore { |
66 | | type Error = (); |
67 | | |
68 | 0 | fn try_from(value: u16) -> core::result::Result<Self, Self::Error> { |
69 | 0 | match value { |
70 | 0 | 0 => Ok(Self::SUCCESS), |
71 | 0 | 1 => Ok(Self::INVALID_PARAMETER), |
72 | 0 | 2 => Ok(Self::UNSUPPORTED_CAP), |
73 | 0 | 3 => Ok(Self::INVALID_STATE_LOCAL), |
74 | 0 | 4 => Ok(Self::INVALID_STATE_PEER), |
75 | 0 | 5 => Ok(Self::INVALID_MSG_FIELD), |
76 | 0 | 6 => Ok(Self::INVALID_MSG_SIZE), |
77 | 0 | 7 => Ok(Self::NEGOTIATION_FAIL), |
78 | 0 | 8 => Ok(Self::BUSY_PEER), |
79 | 0 | 9 => Ok(Self::NOT_READY_PEER), |
80 | 0 | 10 => Ok(Self::ERROR_PEER), |
81 | 0 | 11 => Ok(Self::RESYNCH_PEER), |
82 | 0 | 12 => Ok(Self::BUFFER_FULL), |
83 | 0 | 13 => Ok(Self::BUFFER_TOO_SMALL), |
84 | 0 | 14 => Ok(Self::SESSION_NUMBER_EXCEED), |
85 | 0 | 15 => Ok(Self::SESSION_MSG_ERROR), |
86 | 0 | 16 => Ok(Self::ACQUIRE_FAIL), |
87 | 0 | 17 => Ok(Self::SESSION_TRY_DISCARD_KEY_UPDATE), |
88 | 0 | 0xFE => Ok(Self::DECODE_AEAD_FAIL), |
89 | 0 | _ => Err(()), |
90 | | } |
91 | 0 | } |
92 | | } |
93 | | |
94 | | impl Default for StatusCodeCore { |
95 | 0 | fn default() -> Self { |
96 | 0 | Self::INVALID_PARAMETER |
97 | 0 | } |
98 | | } |
99 | | |
100 | | #[repr(u16)] |
101 | | #[allow(dead_code)] |
102 | | #[allow(non_camel_case_types)] |
103 | | #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] |
104 | | pub enum StatusCodeCrypto { |
105 | | CRYPTO_ERROR = 0, |
106 | | VERIF_FAIL = 1, |
107 | | SEQUENCE_NUMBER_OVERFLOW = 2, |
108 | | VERIF_NO_AUTHORITY = 3, |
109 | | FIPS_SELF_TEST_FAIL = 4, |
110 | | } |
111 | | |
112 | | impl TryFrom<u16> for StatusCodeCrypto { |
113 | | type Error = (); |
114 | | |
115 | 0 | fn try_from(value: u16) -> core::result::Result<Self, Self::Error> { |
116 | 0 | match value { |
117 | 0 | 0 => Ok(Self::CRYPTO_ERROR), |
118 | 0 | 1 => Ok(Self::VERIF_FAIL), |
119 | 0 | 2 => Ok(Self::SEQUENCE_NUMBER_OVERFLOW), |
120 | 0 | 3 => Ok(Self::VERIF_NO_AUTHORITY), |
121 | 0 | 4 => Ok(Self::FIPS_SELF_TEST_FAIL), |
122 | 0 | _ => Err(()), |
123 | | } |
124 | 0 | } |
125 | | } |
126 | | |
127 | | impl Default for StatusCodeCrypto { |
128 | 0 | fn default() -> Self { |
129 | 0 | Self::CRYPTO_ERROR |
130 | 0 | } |
131 | | } |
132 | | |
133 | | #[repr(u16)] |
134 | | #[allow(dead_code)] |
135 | | #[allow(non_camel_case_types)] |
136 | | #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] |
137 | | pub enum StatusCodeCertParse { |
138 | | INVALID_CERT = 0, |
139 | | } |
140 | | |
141 | | impl TryFrom<u16> for StatusCodeCertParse { |
142 | | type Error = (); |
143 | | |
144 | 0 | fn try_from(value: u16) -> core::result::Result<Self, Self::Error> { |
145 | 0 | match value { |
146 | 0 | 0 => Ok(Self::INVALID_CERT), |
147 | 0 | _ => Err(()), |
148 | | } |
149 | 0 | } |
150 | | } |
151 | | |
152 | | impl Default for StatusCodeCertParse { |
153 | 0 | fn default() -> Self { |
154 | 0 | Self::INVALID_CERT |
155 | 0 | } |
156 | | } |
157 | | |
158 | | #[repr(u16)] |
159 | | #[allow(dead_code)] |
160 | | #[allow(non_camel_case_types)] |
161 | | #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] |
162 | | pub enum StatusCodeTransport { |
163 | | SEND_FAIL = 0, |
164 | | RECEIVE_FAIL = 1, |
165 | | |
166 | | // only in spdm-rs |
167 | | DECAP_FAIL = 0xFE, |
168 | | DECAP_APP_FAIL = 0xFD, |
169 | | ENCAP_FAIL = 0xFC, |
170 | | ENCAP_APP_FAIL = 0xFB, |
171 | | } |
172 | | |
173 | | impl TryFrom<u16> for StatusCodeTransport { |
174 | | type Error = (); |
175 | | |
176 | 0 | fn try_from(value: u16) -> core::result::Result<Self, Self::Error> { |
177 | 0 | match value { |
178 | 0 | 0 => Ok(Self::SEND_FAIL), |
179 | 0 | 1 => Ok(Self::RECEIVE_FAIL), |
180 | 0 | 0xFE => Ok(Self::DECAP_FAIL), |
181 | 0 | 0xFD => Ok(Self::DECAP_APP_FAIL), |
182 | 0 | 0xFC => Ok(Self::ENCAP_FAIL), |
183 | 0 | 0xFB => Ok(Self::ENCAP_APP_FAIL), |
184 | 0 | _ => Err(()), |
185 | | } |
186 | 0 | } |
187 | | } |
188 | | |
189 | | impl Default for StatusCodeTransport { |
190 | 0 | fn default() -> Self { |
191 | 0 | Self::SEND_FAIL |
192 | 0 | } |
193 | | } |
194 | | |
195 | | #[repr(u16)] |
196 | | #[allow(dead_code)] |
197 | | #[allow(non_camel_case_types)] |
198 | | #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] |
199 | | pub enum StatusCodeMeasCollect { |
200 | | MEAS_INVALID_INDEX = 0, |
201 | | MEAS_INTERNAL_ERROR = 1, |
202 | | } |
203 | | |
204 | | impl TryFrom<u16> for StatusCodeMeasCollect { |
205 | | type Error = (); |
206 | | |
207 | 0 | fn try_from(value: u16) -> core::result::Result<Self, Self::Error> { |
208 | 0 | match value { |
209 | 0 | 0 => Ok(Self::MEAS_INVALID_INDEX), |
210 | 0 | 1 => Ok(Self::MEAS_INTERNAL_ERROR), |
211 | 0 | _ => Err(()), |
212 | | } |
213 | 0 | } |
214 | | } |
215 | | |
216 | | impl Default for StatusCodeMeasCollect { |
217 | 0 | fn default() -> Self { |
218 | 0 | Self::MEAS_INTERNAL_ERROR |
219 | 0 | } |
220 | | } |
221 | | |
222 | | #[repr(u16)] |
223 | | #[allow(dead_code)] |
224 | | #[allow(non_camel_case_types)] |
225 | | #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] |
226 | | pub enum StatusCodeRNG { |
227 | | LOW_ENTROPY = 0, |
228 | | } |
229 | | |
230 | | impl TryFrom<u16> for StatusCodeRNG { |
231 | | type Error = (); |
232 | | |
233 | 0 | fn try_from(value: u16) -> core::result::Result<Self, Self::Error> { |
234 | 0 | match value { |
235 | 0 | 0 => Ok(Self::LOW_ENTROPY), |
236 | 0 | _ => Err(()), |
237 | | } |
238 | 0 | } |
239 | | } |
240 | | |
241 | | impl Default for StatusCodeRNG { |
242 | 0 | fn default() -> Self { |
243 | 0 | Self::LOW_ENTROPY |
244 | 0 | } |
245 | | } |
246 | | |
247 | | #[allow(dead_code)] |
248 | | #[allow(non_camel_case_types)] |
249 | | #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] |
250 | | pub enum StatusCode { |
251 | | SUCCESS, |
252 | | CORE(StatusCodeCore), |
253 | | CRYPTO(StatusCodeCrypto), |
254 | | CERT_PARSE(StatusCodeCertParse), |
255 | | TRANSPORT(StatusCodeTransport), |
256 | | MEAS_COLLECT(StatusCodeMeasCollect), |
257 | | RNG(StatusCodeRNG), |
258 | | } |
259 | | |
260 | | impl Default for StatusCode { |
261 | 0 | fn default() -> Self { |
262 | 0 | Self::CORE(StatusCodeCore::default()) |
263 | 0 | } |
264 | | } |
265 | | |
266 | | impl TryFrom<u24> for StatusCode { |
267 | | type Error = (); |
268 | | |
269 | 0 | fn try_from(value: u24) -> core::result::Result<Self, Self::Error> { |
270 | 0 | let source: u8 = ((value.get() & 0xFF_00_00) >> 16) as u8; |
271 | 0 | let code: u16 = (value.get() & 0x00_00_FF_FF) as u16; |
272 | 0 | match source { |
273 | 0 | 0 => Ok(StatusCode::SUCCESS), |
274 | 0 | 1 => Ok(StatusCode::CORE(StatusCodeCore::try_from(code)?)), |
275 | 0 | 2 => Ok(StatusCode::CRYPTO(StatusCodeCrypto::try_from(code)?)), |
276 | 0 | 3 => Ok(StatusCode::CERT_PARSE(StatusCodeCertParse::try_from(code)?)), |
277 | 0 | 4 => Ok(StatusCode::TRANSPORT(StatusCodeTransport::try_from(code)?)), |
278 | 0 | 5 => Ok(StatusCode::MEAS_COLLECT(StatusCodeMeasCollect::try_from( |
279 | 0 | code, |
280 | 0 | )?)), |
281 | 0 | 6 => Ok(StatusCode::RNG(StatusCodeRNG::try_from(code)?)), |
282 | 0 | _ => Err(()), |
283 | | } |
284 | 0 | } |
285 | | } |
286 | | |
287 | | impl TryInto<u24> for StatusCode { |
288 | | type Error = (); |
289 | | |
290 | 0 | fn try_into(self) -> Result<u24, Self::Error> { |
291 | 0 | match self { |
292 | 0 | StatusCode::SUCCESS => Ok(u24::new(0)), |
293 | 0 | StatusCode::CORE(c) => Ok(u24::new((1 << 16) as u32 + (c as u16) as u32)), |
294 | 0 | StatusCode::CRYPTO(c) => Ok(u24::new((2 << 16) as u32 + (c as u16) as u32)), |
295 | 0 | StatusCode::CERT_PARSE(c) => Ok(u24::new((3 << 16) as u32 + (c as u16) as u32)), |
296 | 0 | StatusCode::TRANSPORT(t) => Ok(u24::new((4 << 16) as u32 + (t as u16) as u32)), |
297 | 0 | StatusCode::MEAS_COLLECT(m) => Ok(u24::new((5 << 16) as u32 + (m as u16) as u32)), |
298 | 0 | StatusCode::RNG(r) => Ok(u24::new((6 << 16) as u32 + (r as u16) as u32)), |
299 | | } |
300 | 0 | } |
301 | | } |
302 | | |
303 | | pub const SPDM_ERROR_MESSAGE_DATA_MAX_LENGTH: usize = 36; // "SPDM error response message format": |
304 | | // 'SPDMVersion' (1B) + |
305 | | // 'RequestResponseCode' (1B) + |
306 | | // 'Param1' (1B) + |
307 | | // 'Param1' (1B) + |
308 | | // 'ExtendedErrorData' (0-32B) |
309 | | #[derive(Copy, Clone, Debug, PartialEq, Eq)] |
310 | | pub struct SpdmErrorMessageData { |
311 | | pub length: usize, |
312 | | pub data: [u8; SPDM_ERROR_MESSAGE_DATA_MAX_LENGTH], |
313 | | } |
314 | | impl Default for SpdmErrorMessageData { |
315 | 0 | fn default() -> Self { |
316 | 0 | SpdmErrorMessageData { |
317 | 0 | length: Default::default(), |
318 | 0 | data: [Default::default(); SPDM_ERROR_MESSAGE_DATA_MAX_LENGTH], |
319 | 0 | } |
320 | 0 | } |
321 | | } |
322 | | |
323 | | #[derive(Copy, Clone, Debug, Eq, Default)] |
324 | | pub struct SpdmStatus { |
325 | | pub severity: StatusSeverity, |
326 | | pub status_code: StatusCode, |
327 | | pub error_data: Option<SpdmErrorMessageData>, |
328 | | } |
329 | | impl PartialEq for SpdmStatus { |
330 | 0 | fn eq(&self, other: &Self) -> bool { |
331 | 0 | // SpdmStatus with same serverity and status_code but different error_data shall be |
332 | 0 | // considered as same SpdmStatus. |
333 | 0 | // Thus, do not care about the error_data here. |
334 | 0 | self.severity == other.severity && self.status_code == other.status_code |
335 | 0 | } |
336 | | } |
337 | | |
338 | | impl Codec for SpdmStatus { |
339 | 0 | fn encode(&self, bytes: &mut codec::Writer) -> Result<usize, codec::EncodeErr> { |
340 | 0 | let mut sc = 0u32; |
341 | 0 | sc += (((self.severity as u8) & 0x0F) as u32) << 28; |
342 | 0 | sc += <StatusCode as TryInto<u24>>::try_into(self.status_code) |
343 | 0 | .map_err(|_| codec::EncodeErr)? |
344 | 0 | .get(); |
345 | 0 | sc.encode(bytes)?; |
346 | 0 | Ok(4) |
347 | 0 | } |
348 | | |
349 | 0 | fn read(r: &mut codec::Reader) -> Option<Self> { |
350 | 0 | let sc = u32::read(r)?; |
351 | 0 | let severity = ((sc & 0xF0_00_00_00) >> 28) as u8; |
352 | 0 | let severity = StatusSeverity::try_from(severity).ok()?; |
353 | 0 | if (sc & 0x0F_00_00_00) != 0 { |
354 | 0 | return None; //the reserve field |
355 | 0 | } |
356 | 0 | let status_code = u24::new(sc & 0x00_FF_FF_FF); |
357 | 0 | let status_code = StatusCode::try_from(status_code).ok()?; |
358 | | |
359 | 0 | Some(Self { |
360 | 0 | severity, |
361 | 0 | status_code, |
362 | 0 | error_data: None, |
363 | 0 | }) |
364 | 0 | } |
365 | | } |
366 | | |
367 | | impl SpdmStatus { |
368 | | /// return the u32 encoding |
369 | 0 | pub fn get_u32(&self) -> u32 { |
370 | 0 | let mut r = [0u8; 4]; |
371 | 0 | let _ = self.encode(&mut Writer::init(&mut r)); |
372 | 0 | u32::from_le_bytes(r) |
373 | 0 | } |
374 | | |
375 | | /// get SpdmStatus structure from u32 value |
376 | 0 | pub fn from_u32(status: u32) -> Option<Self> { |
377 | 0 | Self::read_bytes(&status.to_le_bytes()) |
378 | 0 | } |
379 | | |
380 | | /// Returns true if severity is StatusSeverity::SUCCESS else it returns false. |
381 | 0 | pub fn spdm_status_is_success(&self) -> bool { |
382 | 0 | self.severity == StatusSeverity::SUCCESS |
383 | 0 | } |
384 | | |
385 | | /// Returns true if severity is StatusSeverity::ERROR else it returns false. |
386 | 0 | pub fn spdm_status_is_error(&self) -> bool { |
387 | 0 | self.severity == StatusSeverity::ERROR |
388 | 0 | } |
389 | | |
390 | 0 | pub fn spdm_status_set_error_data(&mut self, error_data: &[u8]) { |
391 | 0 | // Ensure the slice has no more data than SpdmErrorMessageData capacity |
392 | 0 | if error_data.len() <= SPDM_ERROR_MESSAGE_DATA_MAX_LENGTH { |
393 | 0 | let mut ed = SpdmErrorMessageData { |
394 | 0 | length: error_data.len(), |
395 | 0 | ..Default::default() |
396 | 0 | }; |
397 | 0 | ed.data[..ed.length].copy_from_slice(error_data); |
398 | 0 | self.error_data = Some(ed); |
399 | 0 | } else { |
400 | 0 | // Do not expect more data than SpdmErrorMessageData capacity. |
401 | 0 | self.error_data = None; |
402 | 0 | } |
403 | 0 | } |
404 | | } |
405 | | |
406 | | impl fmt::Display for SpdmStatus { |
407 | 0 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
408 | 0 | write!( |
409 | 0 | f, |
410 | 0 | "Severity: {:?}, Status: {:?}, Code: {})", |
411 | 0 | self.severity, |
412 | 0 | self.status_code, |
413 | 0 | self.get_u32() |
414 | 0 | ) |
415 | 0 | } |
416 | | } |
417 | | |
418 | | #[macro_export] |
419 | | macro_rules! spdm_return_status { |
420 | | ($severity:expr, $status_code:expr) => { |
421 | | SpdmStatus { |
422 | | severity: $severity, |
423 | | status_code: $status_code, |
424 | | error_data: None, |
425 | | } |
426 | | }; |
427 | | } |
428 | | |
429 | | use codec::{u24, Codec, Writer}; |
430 | | pub use spdm_return_status; |
431 | | |
432 | | pub const SPDM_STATUS_SUCCESS: SpdmStatus = |
433 | | spdm_return_status!(StatusSeverity::SUCCESS, StatusCode::SUCCESS); |
434 | | |
435 | | /* - Core Errors - */ |
436 | | |
437 | | /* The function input parameter is invalid. */ |
438 | | pub const SPDM_STATUS_INVALID_PARAMETER: SpdmStatus = spdm_return_status!( |
439 | | StatusSeverity::ERROR, |
440 | | StatusCode::CORE(StatusCodeCore::INVALID_STATE_LOCAL) |
441 | | ); |
442 | | |
443 | | /* Unable to complete operation due to unsupported capabilities by either the caller, the peer, |
444 | | * or both. */ |
445 | | pub const SPDM_STATUS_UNSUPPORTED_CAP: SpdmStatus = spdm_return_status!( |
446 | | StatusSeverity::ERROR, |
447 | | StatusCode::CORE(StatusCodeCore::UNSUPPORTED_CAP) |
448 | | ); |
449 | | |
450 | | /* Unable to complete operation due to caller's state. */ |
451 | | pub const SPDM_STATUS_INVALID_STATE_LOCAL: SpdmStatus = spdm_return_status!( |
452 | | StatusSeverity::ERROR, |
453 | | StatusCode::CORE(StatusCodeCore::INVALID_STATE_LOCAL) |
454 | | ); |
455 | | |
456 | | /* Unable to complete operation due to peer's state. */ |
457 | | pub const SPDM_STATUS_INVALID_STATE_PEER: SpdmStatus = spdm_return_status!( |
458 | | StatusSeverity::ERROR, |
459 | | StatusCode::CORE(StatusCodeCore::INVALID_STATE_PEER) |
460 | | ); |
461 | | |
462 | | /* The received message contains one or more invalid message fields. */ |
463 | | pub const SPDM_STATUS_INVALID_MSG_FIELD: SpdmStatus = spdm_return_status!( |
464 | | StatusSeverity::ERROR, |
465 | | StatusCode::CORE(StatusCodeCore::INVALID_MSG_FIELD) |
466 | | ); |
467 | | |
468 | | /* The received message's size is invalid. */ |
469 | | pub const SPDM_STATUS_INVALID_MSG_SIZE: SpdmStatus = spdm_return_status!( |
470 | | StatusSeverity::ERROR, |
471 | | StatusCode::CORE(StatusCodeCore::INVALID_MSG_SIZE) |
472 | | ); |
473 | | |
474 | | /* Unable to derive a common set of versions, algorithms, etc. */ |
475 | | pub const SPDM_STATUS_NEGOTIATION_FAIL: SpdmStatus = spdm_return_status!( |
476 | | StatusSeverity::ERROR, |
477 | | StatusCode::CORE(StatusCodeCore::NEGOTIATION_FAIL) |
478 | | ); |
479 | | |
480 | | /* Received a Busy error message. */ |
481 | | pub const SPDM_STATUS_BUSY_PEER: SpdmStatus = spdm_return_status!( |
482 | | StatusSeverity::ERROR, |
483 | | StatusCode::CORE(StatusCodeCore::BUSY_PEER) |
484 | | ); |
485 | | |
486 | | /* Received a NotReady error message. */ |
487 | | pub const SPDM_STATUS_NOT_READY_PEER: SpdmStatus = spdm_return_status!( |
488 | | StatusSeverity::ERROR, |
489 | | StatusCode::CORE(StatusCodeCore::NOT_READY_PEER) |
490 | | ); |
491 | | |
492 | | /* Received an unexpected error message. */ |
493 | | pub const SPDM_STATUS_ERROR_PEER: SpdmStatus = spdm_return_status!( |
494 | | StatusSeverity::ERROR, |
495 | | StatusCode::CORE(StatusCodeCore::ERROR_PEER) |
496 | | ); |
497 | | |
498 | | /* Received a RequestResynch error message. */ |
499 | | pub const SPDM_STATUS_RESYNCH_PEER: SpdmStatus = spdm_return_status!( |
500 | | StatusSeverity::ERROR, |
501 | | StatusCode::CORE(StatusCodeCore::RESYNCH_PEER) |
502 | | ); |
503 | | |
504 | | /* Unable to append new data to buffer due to resource exhaustion. */ |
505 | | pub const SPDM_STATUS_BUFFER_FULL: SpdmStatus = spdm_return_status!( |
506 | | StatusSeverity::ERROR, |
507 | | StatusCode::CORE(StatusCodeCore::BUFFER_FULL) |
508 | | ); |
509 | | |
510 | | /* Unable to return data because caller does not provide big enough buffer. */ |
511 | | pub const SPDM_STATUS_BUFFER_TOO_SMALL: SpdmStatus = spdm_return_status!( |
512 | | StatusSeverity::ERROR, |
513 | | StatusCode::CORE(StatusCodeCore::BUFFER_TOO_SMALL) |
514 | | ); |
515 | | |
516 | | /* Unable to allocate more session. */ |
517 | | pub const SPDM_STATUS_SESSION_NUMBER_EXCEED: SpdmStatus = spdm_return_status!( |
518 | | StatusSeverity::ERROR, |
519 | | StatusCode::CORE(StatusCodeCore::SESSION_NUMBER_EXCEED) |
520 | | ); |
521 | | |
522 | | /* Decrypt error from peer. */ |
523 | | pub const SPDM_STATUS_SESSION_MSG_ERROR: SpdmStatus = spdm_return_status!( |
524 | | StatusSeverity::ERROR, |
525 | | StatusCode::CORE(StatusCodeCore::SESSION_MSG_ERROR) |
526 | | ); |
527 | | |
528 | | /* Unable to acquire resource. */ |
529 | | pub const SPDM_STATUS_ACQUIRE_FAIL: SpdmStatus = spdm_return_status!( |
530 | | StatusSeverity::ERROR, |
531 | | StatusCode::CORE(StatusCodeCore::ACQUIRE_FAIL) |
532 | | ); |
533 | | |
534 | | /* Re-triable decrypt error from peer - must rollback to backup keys. */ |
535 | | pub const SPDM_STATUS_SESSION_TRY_DISCARD_KEY_UPDATE: SpdmStatus = spdm_return_status!( |
536 | | StatusSeverity::ERROR, |
537 | | StatusCode::CORE(StatusCodeCore::SESSION_TRY_DISCARD_KEY_UPDATE) |
538 | | ); |
539 | | |
540 | | /* Failed to decode AEAD. */ |
541 | | pub const SPDM_STATUS_DECODE_AEAD_FAIL: SpdmStatus = spdm_return_status!( |
542 | | StatusSeverity::ERROR, |
543 | | StatusCode::CORE(StatusCodeCore::DECODE_AEAD_FAIL) |
544 | | ); |
545 | | |
546 | | /* - Cryptography Errors - */ |
547 | | |
548 | | /* Generic failure originating from the cryptography module. */ |
549 | | pub const SPDM_STATUS_CRYPTO_ERROR: SpdmStatus = spdm_return_status!( |
550 | | StatusSeverity::ERROR, |
551 | | StatusCode::CRYPTO(StatusCodeCrypto::CRYPTO_ERROR) |
552 | | ); |
553 | | |
554 | | /* Verification of the provided signature digest, signature, or AEAD tag failed. */ |
555 | | pub const SPDM_STATUS_VERIF_FAIL: SpdmStatus = spdm_return_status!( |
556 | | StatusSeverity::ERROR, |
557 | | StatusCode::CRYPTO(StatusCodeCrypto::VERIF_FAIL) |
558 | | ); |
559 | | |
560 | | /* AEAD sequence number overflow. */ |
561 | | pub const SPDM_STATUS_SEQUENCE_NUMBER_OVERFLOW: SpdmStatus = spdm_return_status!( |
562 | | StatusSeverity::ERROR, |
563 | | StatusCode::CRYPTO(StatusCodeCrypto::SEQUENCE_NUMBER_OVERFLOW) |
564 | | ); |
565 | | |
566 | | /* Provided cert is valid but is not authoritative(mismatch the root cert). */ |
567 | | pub const SPDM_STATUS_VERIF_NO_AUTHORITY: SpdmStatus = spdm_return_status!( |
568 | | StatusSeverity::ERROR, |
569 | | StatusCode::CRYPTO(StatusCodeCrypto::VERIF_NO_AUTHORITY) |
570 | | ); |
571 | | |
572 | | /* FIPS self test failed. */ |
573 | | pub const SPDM_STATUS_FIPS_SELF_TEST_FAIL: SpdmStatus = spdm_return_status!( |
574 | | StatusSeverity::ERROR, |
575 | | StatusCode::CRYPTO(StatusCodeCrypto::FIPS_SELF_TEST_FAIL) |
576 | | ); |
577 | | |
578 | | /* - Certificate Parsing Errors - */ |
579 | | |
580 | | /* Certificate is malformed or does not comply to x.509 standard. */ |
581 | | pub const SPDM_STATUS_INVALID_CERT: SpdmStatus = spdm_return_status!( |
582 | | StatusSeverity::ERROR, |
583 | | StatusCode::CERT_PARSE(StatusCodeCertParse::INVALID_CERT) |
584 | | ); |
585 | | |
586 | | /* - Transport Errors - */ |
587 | | |
588 | | /* Unable to send message to peer. */ |
589 | | pub const SPDM_STATUS_SEND_FAIL: SpdmStatus = spdm_return_status!( |
590 | | StatusSeverity::ERROR, |
591 | | StatusCode::TRANSPORT(StatusCodeTransport::SEND_FAIL) |
592 | | ); |
593 | | |
594 | | /* Unable to receive message from peer. */ |
595 | | pub const SPDM_STATUS_RECEIVE_FAIL: SpdmStatus = spdm_return_status!( |
596 | | StatusSeverity::ERROR, |
597 | | StatusCode::TRANSPORT(StatusCodeTransport::RECEIVE_FAIL) |
598 | | ); |
599 | | |
600 | | /* Unable to decap transport buffer. */ |
601 | | pub const SPDM_STATUS_DECAP_FAIL: SpdmStatus = spdm_return_status!( |
602 | | StatusSeverity::ERROR, |
603 | | StatusCode::TRANSPORT(StatusCodeTransport::DECAP_FAIL) |
604 | | ); |
605 | | |
606 | | /* Unable to decap app buffer. */ |
607 | | pub const SPDM_STATUS_DECAP_APP_FAIL: SpdmStatus = spdm_return_status!( |
608 | | StatusSeverity::ERROR, |
609 | | StatusCode::TRANSPORT(StatusCodeTransport::DECAP_APP_FAIL) |
610 | | ); |
611 | | |
612 | | /* Unable to encap transport buffer. */ |
613 | | pub const SPDM_STATUS_ENCAP_FAIL: SpdmStatus = spdm_return_status!( |
614 | | StatusSeverity::ERROR, |
615 | | StatusCode::TRANSPORT(StatusCodeTransport::ENCAP_FAIL) |
616 | | ); |
617 | | |
618 | | /* Unable to encap app buffer. */ |
619 | | pub const SPDM_STATUS_ENCAP_APP_FAIL: SpdmStatus = spdm_return_status!( |
620 | | StatusSeverity::ERROR, |
621 | | StatusCode::TRANSPORT(StatusCodeTransport::ENCAP_APP_FAIL) |
622 | | ); |
623 | | |
624 | | /* - Measurement Collection Errors - */ |
625 | | |
626 | | /* Unable to collect measurement because of invalid index. */ |
627 | | pub const SPDM_STATUS_MEAS_INVALID_INDEX: SpdmStatus = spdm_return_status!( |
628 | | StatusSeverity::ERROR, |
629 | | StatusCode::MEAS_COLLECT(StatusCodeMeasCollect::MEAS_INVALID_INDEX) |
630 | | ); |
631 | | |
632 | | /* Unable to collect measurement because of internal error. */ |
633 | | pub const SPDM_STATUS_MEAS_INTERNAL_ERROR: SpdmStatus = spdm_return_status!( |
634 | | StatusSeverity::ERROR, |
635 | | StatusCode::MEAS_COLLECT(StatusCodeMeasCollect::MEAS_INTERNAL_ERROR) |
636 | | ); |
637 | | |
638 | | /* - Random Number Generation Errors - */ |
639 | | |
640 | | /* Unable to produce random number due to lack of entropy. */ |
641 | | pub const SPDM_STATUS_LOW_ENTROPY: SpdmStatus = spdm_return_status!( |
642 | | StatusSeverity::ERROR, |
643 | | StatusCode::RNG(StatusCodeRNG::LOW_ENTROPY) |
644 | | ); |
645 | | |
646 | | pub type SpdmResult<T = ()> = core::result::Result<T, SpdmStatus>; |