/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 | | } |