Coverage Report

Created: 2026-09-14 06:27

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