Coverage Report

Created: 2025-11-09 07:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/spdm-rs/spdmlib/src/responder/error_rsp.rs
Line
Count
Source
1
// Copyright (c) 2020 Intel Corporation
2
//
3
// SPDX-License-Identifier: Apache-2.0 or MIT
4
5
use crate::common::SpdmCodec;
6
use crate::error::SpdmResult;
7
use crate::error::SPDM_STATUS_INVALID_MSG_FIELD;
8
use crate::message::*;
9
use crate::responder::*;
10
11
impl ResponderContext {
12
0
    pub fn write_spdm_error(
13
0
        &mut self,
14
0
        error_code: SpdmErrorCode,
15
0
        error_data: u8,
16
0
        writer: &mut Writer,
17
0
    ) {
18
0
        let error = SpdmMessage {
19
0
            header: SpdmMessageHeader {
20
0
                version: self.common.negotiate_info.spdm_version_sel,
21
0
                request_response_code: SpdmRequestResponseCode::SpdmResponseError,
22
0
            },
23
0
            payload: SpdmMessagePayload::SpdmErrorResponse(SpdmErrorResponsePayload {
24
0
                error_code,
25
0
                error_data,
26
0
                extended_data: SpdmErrorResponseExtData::SpdmErrorExtDataNone(
27
0
                    SpdmErrorResponseNoneExtData {},
28
0
                ),
29
0
            }),
30
0
        };
31
0
        writer.clear();
32
0
        let _ = error.spdm_encode(&mut self.common, writer);
33
0
    }
34
}
35
36
impl ResponderContext {
37
0
    pub fn handle_error_request<'a>(
38
0
        &mut self,
39
0
        error_code: SpdmErrorCode,
40
0
        bytes: &[u8],
41
0
        writer: &'a mut Writer,
42
0
    ) -> (SpdmResult, Option<&'a [u8]>) {
43
0
        let (_, rsp_slice) = self.write_error_response(error_code, bytes, writer);
44
0
        (Ok(()), rsp_slice)
45
0
    }
46
47
0
    pub fn write_error_response<'a>(
48
0
        &mut self,
49
0
        error_code: SpdmErrorCode,
50
0
        bytes: &[u8],
51
0
        writer: &'a mut Writer,
52
0
    ) -> (SpdmResult, Option<&'a [u8]>) {
53
0
        let mut reader = Reader::init(bytes);
54
0
        let message_header = SpdmMessageHeader::read(&mut reader);
55
0
        if let Some(message_header) = message_header {
56
0
            if message_header.version != self.common.negotiate_info.spdm_version_sel {
57
0
                self.write_spdm_error(SpdmErrorCode::SpdmErrorVersionMismatch, 0, writer);
58
0
                return (
59
0
                    Err(SPDM_STATUS_INVALID_MSG_FIELD),
60
0
                    Some(writer.used_slice()),
61
0
                );
62
0
            }
63
0
            let error_data = if error_code == SpdmErrorCode::SpdmErrorUnsupportedRequest {
64
0
                message_header.request_response_code.get_u8()
65
            } else {
66
0
                0u8
67
            };
68
0
            self.write_spdm_error(error_code, error_data, writer);
69
        } else {
70
0
            self.write_spdm_error(SpdmErrorCode::SpdmErrorInvalidRequest, 0, writer);
71
0
            return (
72
0
                Err(SPDM_STATUS_INVALID_MSG_FIELD),
73
0
                Some(writer.used_slice()),
74
0
            );
75
        }
76
77
0
        (Ok(()), Some(writer.used_slice()))
78
0
    }
79
}