/src/vtpm-td/deps/spdm-rs/spdmlib/src/message/encapsulated.rs
Line | Count | Source |
1 | | // Copyright (c) 2023 Intel Corporation |
2 | | // |
3 | | // SPDX-License-Identifier: Apache-2.0 or MIT |
4 | | |
5 | | use crate::common; |
6 | | use crate::common::spdm_codec::SpdmCodec; |
7 | | use crate::error::{SpdmStatus, SPDM_STATUS_BUFFER_FULL}; |
8 | | use crate::protocol::SpdmVersion; |
9 | | use codec::{enum_builder, u24, Codec, Reader, Writer}; |
10 | | |
11 | | pub const ENCAPSULATED_RESPONSE_ACK_HEADER_SIZE: usize = 8; |
12 | | |
13 | | #[derive(Debug, Clone, Default)] |
14 | | pub struct SpdmGetEncapsulatedRequestPayload {} |
15 | | |
16 | | impl SpdmCodec for SpdmGetEncapsulatedRequestPayload { |
17 | 0 | fn spdm_encode( |
18 | 0 | &self, |
19 | 0 | _context: &mut common::SpdmContext, |
20 | 0 | bytes: &mut Writer, |
21 | 0 | ) -> Result<usize, SpdmStatus> { |
22 | 0 | let mut cnt = 0usize; |
23 | 0 | cnt += 0u8.encode(bytes).map_err(|_| SPDM_STATUS_BUFFER_FULL)?; // param1 |
24 | 0 | cnt += 0u8.encode(bytes).map_err(|_| SPDM_STATUS_BUFFER_FULL)?; // param2 |
25 | 0 | Ok(cnt) |
26 | 0 | } |
27 | | |
28 | 0 | fn spdm_read( |
29 | 0 | _context: &mut common::SpdmContext, |
30 | 0 | r: &mut Reader, |
31 | 0 | ) -> Option<SpdmGetEncapsulatedRequestPayload> { |
32 | 0 | u8::read(r)?; // param1 |
33 | 0 | u8::read(r)?; // param2 |
34 | | |
35 | 0 | Some(SpdmGetEncapsulatedRequestPayload {}) |
36 | 0 | } |
37 | | } |
38 | | |
39 | | #[derive(Debug, Clone, Default)] |
40 | | pub struct SpdmEncapsulatedRequestPayload { |
41 | | pub request_id: u8, |
42 | | } |
43 | | |
44 | | impl SpdmCodec for SpdmEncapsulatedRequestPayload { |
45 | 0 | fn spdm_encode( |
46 | 0 | &self, |
47 | 0 | _context: &mut common::SpdmContext, |
48 | 0 | bytes: &mut Writer, |
49 | 0 | ) -> Result<usize, SpdmStatus> { |
50 | 0 | let mut cnt = 0usize; |
51 | 0 | cnt += self |
52 | 0 | .request_id |
53 | 0 | .encode(bytes) |
54 | 0 | .map_err(|_| SPDM_STATUS_BUFFER_FULL)?; // param1 |
55 | 0 | cnt += 0u8.encode(bytes).map_err(|_| SPDM_STATUS_BUFFER_FULL)?; // param2 |
56 | 0 | Ok(cnt) |
57 | 0 | } |
58 | | |
59 | 0 | fn spdm_read( |
60 | 0 | _context: &mut common::SpdmContext, |
61 | 0 | r: &mut Reader, |
62 | 0 | ) -> Option<SpdmEncapsulatedRequestPayload> { |
63 | 0 | let request_id = u8::read(r)?; // param1 |
64 | 0 | u8::read(r)?; // param2 |
65 | | |
66 | 0 | Some(SpdmEncapsulatedRequestPayload { request_id }) |
67 | 0 | } |
68 | | } |
69 | | |
70 | | #[derive(Debug, Clone, Default)] |
71 | | pub struct SpdmDeliverEncapsulatedResponsePayload { |
72 | | pub request_id: u8, |
73 | | } |
74 | | |
75 | | impl SpdmCodec for SpdmDeliverEncapsulatedResponsePayload { |
76 | 0 | fn spdm_encode( |
77 | 0 | &self, |
78 | 0 | _context: &mut common::SpdmContext, |
79 | 0 | bytes: &mut Writer, |
80 | 0 | ) -> Result<usize, SpdmStatus> { |
81 | 0 | let mut cnt = 0usize; |
82 | 0 | cnt += self |
83 | 0 | .request_id |
84 | 0 | .encode(bytes) |
85 | 0 | .map_err(|_| SPDM_STATUS_BUFFER_FULL)?; // param1 |
86 | 0 | cnt += 0u8.encode(bytes).map_err(|_| SPDM_STATUS_BUFFER_FULL)?; // param2 |
87 | 0 | Ok(cnt) |
88 | 0 | } |
89 | | |
90 | 0 | fn spdm_read( |
91 | 0 | _context: &mut common::SpdmContext, |
92 | 0 | r: &mut Reader, |
93 | 0 | ) -> Option<SpdmDeliverEncapsulatedResponsePayload> { |
94 | 0 | let request_id = u8::read(r)?; // param1 |
95 | 0 | u8::read(r)?; // param2 |
96 | | |
97 | 0 | Some(SpdmDeliverEncapsulatedResponsePayload { request_id }) |
98 | 0 | } |
99 | | } |
100 | | |
101 | | #[derive(Debug, Clone, Default)] |
102 | | pub struct SpdmEncapsulatedResponseAckPayload { |
103 | | pub request_id: u8, |
104 | | pub payload_type: SpdmEncapsulatedResponseAckPayloadType, |
105 | | pub ack_request_id: u8, |
106 | | } |
107 | | |
108 | | impl SpdmCodec for SpdmEncapsulatedResponseAckPayload { |
109 | 0 | fn spdm_encode( |
110 | 0 | &self, |
111 | 0 | context: &mut common::SpdmContext, |
112 | 0 | bytes: &mut Writer, |
113 | 0 | ) -> Result<usize, SpdmStatus> { |
114 | 0 | let mut cnt = 0usize; |
115 | 0 | cnt += self |
116 | 0 | .request_id |
117 | 0 | .encode(bytes) |
118 | 0 | .map_err(|_| SPDM_STATUS_BUFFER_FULL)?; // param1 |
119 | 0 | cnt += self |
120 | 0 | .payload_type |
121 | 0 | .encode(bytes) |
122 | 0 | .map_err(|_| SPDM_STATUS_BUFFER_FULL)?; // param2 |
123 | | |
124 | 0 | if context.negotiate_info.spdm_version_sel >= SpdmVersion::SpdmVersion12 { |
125 | 0 | cnt += self |
126 | 0 | .ack_request_id |
127 | 0 | .encode(bytes) |
128 | 0 | .map_err(|_| SPDM_STATUS_BUFFER_FULL)?; |
129 | 0 | cnt += u24::new(0) |
130 | 0 | .encode(bytes) |
131 | 0 | .map_err(|_| SPDM_STATUS_BUFFER_FULL)?; // reserved |
132 | 0 | } |
133 | | |
134 | 0 | Ok(cnt) |
135 | 0 | } |
136 | | |
137 | 0 | fn spdm_read( |
138 | 0 | context: &mut common::SpdmContext, |
139 | 0 | r: &mut Reader, |
140 | 0 | ) -> Option<SpdmEncapsulatedResponseAckPayload> { |
141 | 0 | let request_id = u8::read(r)?; // param1 |
142 | 0 | let payload_type = SpdmEncapsulatedResponseAckPayloadType::read(r)?; // param2 |
143 | 0 | let mut ack_request_id = 0; |
144 | | |
145 | 0 | if context.negotiate_info.spdm_version_sel >= SpdmVersion::SpdmVersion12 { |
146 | 0 | ack_request_id = u8::read(r)?; |
147 | 0 | let _ = u24::read(r)?; // reserved |
148 | 0 | } |
149 | | |
150 | 0 | Some(SpdmEncapsulatedResponseAckPayload { |
151 | 0 | request_id, |
152 | 0 | payload_type, |
153 | 0 | ack_request_id, |
154 | 0 | }) |
155 | 0 | } |
156 | | } |
157 | | |
158 | | enum_builder! { |
159 | | @U8 |
160 | | EnumName: SpdmEncapsulatedResponseAckPayloadType; |
161 | | EnumVal{ |
162 | | Absent => 0, |
163 | | Present => 1, |
164 | | ReqSlotNumber => 2 |
165 | | } |
166 | | } |
167 | | impl Default for SpdmEncapsulatedResponseAckPayloadType { |
168 | 0 | fn default() -> SpdmEncapsulatedResponseAckPayloadType { |
169 | 0 | SpdmEncapsulatedResponseAckPayloadType::Absent |
170 | 0 | } |
171 | | } |
172 | | |
173 | | #[cfg(test)] |
174 | | #[path = "mod_test.common.inc.rs"] |
175 | | mod testlib; |
176 | | |
177 | | #[cfg(test)] |
178 | | #[path = "encapsulated_test.rs"] |
179 | | mod encapsulated_test; |