Line data Source code
1 : /**
2 : * Copyright Notice:
3 : * Copyright 2021-2026 DMTF. All rights reserved.
4 : * License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
5 : **/
6 :
7 : #include "spdm_unit_test.h"
8 : #include "internal/libspdm_responder_lib.h"
9 :
10 : #if LIBSPDM_ENABLE_CAPABILITY_ENCAP_CAP
11 :
12 : static spdm_get_encapsulated_request_request_t m_libspdm_encapsulated_request_t1 = {
13 : {SPDM_MESSAGE_VERSION_11, SPDM_GET_ENCAPSULATED_REQUEST, 0, 0}
14 : };
15 : static size_t m_libspdm_encapsulated_request_t1_size = sizeof(m_libspdm_encapsulated_request_t1);
16 :
17 : static spdm_get_encapsulated_request_request_t m_libspdm_encapsulated_request_t2 = {
18 : {SPDM_MESSAGE_VERSION_13, SPDM_GET_ENCAPSULATED_REQUEST, 0, 0}
19 : };
20 : static size_t m_libspdm_encapsulated_request_t2_size = sizeof(m_libspdm_encapsulated_request_t2);
21 :
22 : static spdm_deliver_encapsulated_response_request_t m_libspdm_m_deliver_encapsulated_response_request_t1 =
23 : {
24 : {SPDM_MESSAGE_VERSION_11, SPDM_DELIVER_ENCAPSULATED_RESPONSE, 0, 0}
25 : };
26 : static size_t m_libspdm_m_deliver_encapsulated_response_request_t1_size =
27 : sizeof(m_libspdm_m_deliver_encapsulated_response_request_t1);
28 :
29 : static uint8_t m_libspdm_local_certificate_chain[LIBSPDM_MAX_CERT_CHAIN_SIZE];
30 :
31 : static spdm_deliver_encapsulated_response_request_t m_libspdm_m_deliver_encapsulated_response_request_t2 =
32 : {
33 : {SPDM_MESSAGE_VERSION_12, SPDM_DELIVER_ENCAPSULATED_RESPONSE, 0xFF, 0}
34 : };
35 : static size_t m_libspdm_m_deliver_encapsulated_response_request_t2_size =
36 : sizeof(m_libspdm_m_deliver_encapsulated_response_request_t2);
37 :
38 : #if (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT)
39 1 : static void rsp_encapsulated_request_case1(void **State)
40 : {
41 : libspdm_return_t status;
42 : libspdm_test_context_t *spdm_test_context;
43 : spdm_encapsulated_request_response_t *spdm_response_requester;
44 : spdm_get_digest_request_t *spdm_get_digests_request;
45 : libspdm_context_t *spdm_context;
46 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
47 : size_t data_size;
48 : void *data;
49 : size_t response_size;
50 :
51 1 : spdm_test_context = *State;
52 1 : spdm_context = spdm_test_context->spdm_context;
53 1 : spdm_test_context->case_id = 0x1;
54 :
55 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
56 :
57 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
58 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
59 1 : spdm_context->encap_context.request_op_code_count =
60 : LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
61 1 : spdm_context->encap_context.current_request_op_code = 0;
62 1 : spdm_context->encap_context.request_op_code_sequence[0] = SPDM_GET_DIGESTS;
63 1 : spdm_context->encap_context.request_id = 0;
64 :
65 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
66 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
67 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
68 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
69 : SPDM_VERSION_NUMBER_SHIFT_BIT;
70 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
71 : m_libspdm_use_asym_algo, &data,
72 : &data_size,
73 : NULL, NULL);
74 1 : spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
75 1 : spdm_context->local_context.local_cert_chain_provision[0] = data;
76 1 : spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
77 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
78 1 : libspdm_reset_message_b(spdm_context);
79 :
80 1 : response_size = sizeof(response);
81 1 : status = libspdm_get_response_encapsulated_request(spdm_context,
82 : m_libspdm_encapsulated_request_t1_size,
83 : &m_libspdm_encapsulated_request_t1,
84 : &response_size,
85 : response);
86 :
87 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
88 1 : assert_int_equal(response_size,
89 : sizeof(spdm_encapsulated_request_response_t) + sizeof(spdm_digest_response_t));
90 1 : spdm_response_requester = (void *)response;
91 :
92 1 : assert_int_equal(spdm_response_requester->header.spdm_version, SPDM_MESSAGE_VERSION_11);
93 1 : assert_int_equal(spdm_response_requester->header.request_response_code,
94 : SPDM_ENCAPSULATED_REQUEST);
95 1 : assert_int_equal(spdm_response_requester->header.param1, 0x1);
96 1 : assert_int_equal(spdm_response_requester->header.param2, 0);
97 :
98 1 : spdm_get_digests_request = (spdm_get_digest_request_t *)(spdm_response_requester + 1);
99 1 : assert_int_equal(spdm_get_digests_request->header.spdm_version, SPDM_MESSAGE_VERSION_11);
100 1 : assert_int_equal(spdm_get_digests_request->header.request_response_code, SPDM_GET_DIGESTS);
101 1 : assert_int_equal(spdm_get_digests_request->header.param1, 0);
102 1 : assert_int_equal(spdm_get_digests_request->header.param2, 0);
103 :
104 1 : free(data);
105 1 : }
106 :
107 1 : static void rsp_encapsulated_request_case2(void **State)
108 : {
109 : libspdm_return_t status;
110 : libspdm_test_context_t *spdm_test_context;
111 : spdm_encapsulated_request_response_t *spdm_response_requester;
112 : spdm_get_certificate_request_t *spdm_get_certificate_request;
113 : libspdm_context_t *spdm_context;
114 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
115 : size_t data_size;
116 : void *data;
117 : size_t response_size;
118 :
119 1 : spdm_test_context = *State;
120 1 : spdm_context = spdm_test_context->spdm_context;
121 1 : spdm_test_context->case_id = 0x2;
122 :
123 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
124 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
125 1 : spdm_context->encap_context.request_op_code_count =
126 : LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
127 1 : spdm_context->encap_context.current_request_op_code = 0;
128 1 : spdm_context->encap_context.request_op_code_sequence[0] = SPDM_GET_CERTIFICATE;
129 1 : spdm_context->encap_context.request_id = 0;
130 :
131 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
132 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
133 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
134 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
135 : SPDM_VERSION_NUMBER_SHIFT_BIT;
136 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
137 : m_libspdm_use_asym_algo, &data,
138 : &data_size,
139 : NULL, NULL);
140 1 : spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
141 1 : spdm_context->local_context.local_cert_chain_provision[0] = data;
142 1 : spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
143 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
144 1 : libspdm_reset_message_b(spdm_context);
145 :
146 1 : response_size = sizeof(response);
147 :
148 1 : status = libspdm_get_response_encapsulated_request(spdm_context,
149 : m_libspdm_encapsulated_request_t1_size,
150 : &m_libspdm_encapsulated_request_t1,
151 : &response_size,
152 : response);
153 :
154 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
155 1 : assert_int_equal(response_size,
156 : sizeof(spdm_encapsulated_request_response_t) +
157 : sizeof(spdm_certificate_response_t));
158 1 : spdm_response_requester = (void *)response;
159 1 : assert_int_equal(spdm_response_requester->header.spdm_version, SPDM_MESSAGE_VERSION_11);
160 1 : assert_int_equal(spdm_response_requester->header.request_response_code,
161 : SPDM_ENCAPSULATED_REQUEST);
162 1 : assert_int_equal(spdm_response_requester->header.param1, 0x1);
163 1 : assert_int_equal(spdm_response_requester->header.param2, 0);
164 :
165 1 : spdm_get_certificate_request = (spdm_get_certificate_request_t *)(spdm_response_requester + 1);
166 1 : assert_int_equal(spdm_get_certificate_request->header.spdm_version, SPDM_MESSAGE_VERSION_11);
167 1 : assert_int_equal(spdm_get_certificate_request->header.request_response_code,
168 : SPDM_GET_CERTIFICATE);
169 1 : assert_int_equal(spdm_get_certificate_request->header.param1, 0);
170 1 : assert_int_equal(spdm_get_certificate_request->header.param2, 0);
171 1 : assert_int_equal(spdm_get_certificate_request->offset, 0);
172 :
173 1 : const size_t length = spdm_context->local_context.capability.max_spdm_msg_size -
174 : sizeof(spdm_deliver_encapsulated_response_request_t) -
175 : sizeof(spdm_get_certificate_request_t);
176 :
177 1 : assert_int_equal(spdm_get_certificate_request->length, length);
178 1 : free(data);
179 1 : }
180 :
181 1 : static void rsp_encapsulated_request_case3(void **State)
182 : {
183 : libspdm_return_t status;
184 : libspdm_test_context_t *spdm_test_context;
185 : spdm_error_response_t *spdm_response_requester;
186 : libspdm_context_t *spdm_context;
187 : size_t response_size;
188 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
189 : uint8_t m_local_certificate_chain[LIBSPDM_MAX_CERT_CHAIN_SIZE];
190 :
191 1 : spdm_test_context = *State;
192 1 : spdm_context = spdm_test_context->spdm_context;
193 1 : spdm_test_context->case_id = 0x3;
194 :
195 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
196 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
197 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
198 :
199 1 : spdm_context->encap_context.current_request_op_code = 0;
200 1 : spdm_context->encap_context.request_id = 0;
201 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
202 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
203 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
204 1 : spdm_context->local_context.local_cert_chain_provision[0] = m_local_certificate_chain;
205 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
206 : sizeof(m_local_certificate_chain);
207 1 : libspdm_set_mem(m_local_certificate_chain, sizeof(m_local_certificate_chain), (uint8_t)(0xFF));
208 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
209 : SPDM_VERSION_NUMBER_SHIFT_BIT;
210 :
211 1 : response_size = sizeof(response);
212 1 : status = libspdm_get_response_encapsulated_request(spdm_context,
213 : m_libspdm_encapsulated_request_t1_size,
214 : &m_libspdm_encapsulated_request_t1,
215 : &response_size,
216 : response);
217 :
218 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
219 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
220 1 : spdm_response_requester = (void *)response;
221 1 : assert_int_equal(spdm_response_requester->header.spdm_version, SPDM_MESSAGE_VERSION_11);
222 1 : assert_int_equal(spdm_response_requester->header.request_response_code, SPDM_ERROR);
223 1 : assert_int_equal(spdm_response_requester->header.param1, SPDM_ERROR_CODE_UNEXPECTED_REQUEST);
224 1 : assert_int_equal(spdm_response_requester->header.param2, 0);
225 1 : }
226 :
227 1 : static void rsp_encapsulated_request_case4(void **State)
228 : {
229 : libspdm_return_t status;
230 : libspdm_test_context_t *spdm_test_context;
231 : spdm_error_response_t *spdm_response_requester;
232 : libspdm_context_t *spdm_context;
233 : size_t response_size;
234 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
235 : uint8_t m_local_certificate_chain[LIBSPDM_MAX_CERT_CHAIN_SIZE];
236 :
237 1 : spdm_test_context = *State;
238 1 : spdm_context = spdm_test_context->spdm_context;
239 1 : spdm_test_context->case_id = 0x4;
240 :
241 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NEED_RESYNC;
242 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
243 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
244 :
245 1 : spdm_context->encap_context.current_request_op_code = SPDM_GET_DIGESTS;
246 :
247 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
248 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
249 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
250 1 : spdm_context->local_context.local_cert_chain_provision[0] = m_local_certificate_chain;
251 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
252 : sizeof(m_local_certificate_chain);
253 1 : libspdm_set_mem(m_local_certificate_chain, sizeof(m_local_certificate_chain), (uint8_t)(0xFF));
254 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
255 : SPDM_VERSION_NUMBER_SHIFT_BIT;
256 :
257 1 : response_size = sizeof(response);
258 1 : status = libspdm_get_response_encapsulated_request(spdm_context,
259 : m_libspdm_encapsulated_request_t1_size,
260 : &m_libspdm_encapsulated_request_t1,
261 : &response_size,
262 : response);
263 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
264 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
265 1 : spdm_response_requester = (void *)response;
266 1 : assert_int_equal(spdm_response_requester->header.spdm_version, SPDM_MESSAGE_VERSION_11);
267 1 : assert_int_equal(spdm_response_requester->header.request_response_code, SPDM_ERROR);
268 1 : assert_int_equal(spdm_response_requester->header.param1, SPDM_ERROR_CODE_REQUEST_RESYNCH);
269 1 : assert_int_equal(spdm_response_requester->header.param2, 0);
270 1 : }
271 : #endif /* (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT) */
272 :
273 : #if (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_SEND_CHALLENGE_SUPPORT)
274 1 : static void rsp_encapsulated_request_case5(void **State)
275 : {
276 : libspdm_return_t status;
277 : libspdm_test_context_t *spdm_test_context;
278 : spdm_encapsulated_request_response_t *spdm_response_requester;
279 : libspdm_context_t *spdm_context;
280 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
281 : size_t data_size;
282 : void *data;
283 : size_t response_size;
284 :
285 1 : spdm_test_context = *State;
286 1 : spdm_context = spdm_test_context->spdm_context;
287 1 : spdm_test_context->case_id = 0x5;
288 :
289 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
290 1 : spdm_context->connection_info.capability.flags = 0;
291 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
292 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
293 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
294 1 : spdm_context->encap_context.request_op_code_count =
295 : LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
296 1 : spdm_context->encap_context.current_request_op_code = 0;
297 1 : spdm_context->encap_context.request_op_code_sequence[0] = SPDM_CHALLENGE;
298 1 : spdm_context->encap_context.request_id = 0;
299 :
300 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
301 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
302 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
303 : SPDM_VERSION_NUMBER_SHIFT_BIT;
304 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
305 : m_libspdm_use_asym_algo, &data,
306 : &data_size,
307 : NULL, NULL);
308 1 : spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
309 1 : spdm_context->local_context.local_cert_chain_provision[0] = data;
310 1 : spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
311 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
312 1 : libspdm_reset_message_b(spdm_context);
313 :
314 1 : response_size = sizeof(response);
315 1 : status = libspdm_get_response_encapsulated_request(spdm_context,
316 : m_libspdm_encapsulated_request_t1_size,
317 : &m_libspdm_encapsulated_request_t1,
318 : &response_size,
319 : response);
320 :
321 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
322 1 : assert_int_equal(response_size,
323 : sizeof(spdm_encapsulated_request_response_t) +
324 : sizeof(spdm_challenge_request_t));
325 1 : spdm_response_requester = (void *)response;
326 1 : assert_int_equal(spdm_response_requester->header.spdm_version, SPDM_MESSAGE_VERSION_11);
327 1 : assert_int_equal(spdm_response_requester->header.request_response_code,
328 : SPDM_ENCAPSULATED_REQUEST);
329 1 : assert_int_equal(spdm_response_requester->header.param1, 0x1);
330 1 : assert_int_equal(spdm_response_requester->header.param2, 0);
331 1 : free(data);
332 1 : }
333 : #endif /* LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_SEND_CHALLENGE_SUPPORT) */
334 :
335 1 : static void rsp_encapsulated_request_case6(void **State)
336 : {
337 : libspdm_return_t status;
338 : libspdm_test_context_t *spdm_test_context;
339 : spdm_encapsulated_request_response_t *spdm_response_requester;
340 : libspdm_context_t *spdm_context;
341 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
342 : size_t data_size;
343 : void *data;
344 : size_t response_size;
345 : uint32_t session_id;
346 : libspdm_session_info_t *session_info;
347 :
348 1 : spdm_test_context = *State;
349 1 : spdm_context = spdm_test_context->spdm_context;
350 1 : spdm_test_context->case_id = 0x6;
351 :
352 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
353 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
354 1 : spdm_context->connection_info.capability.flags |=
355 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_UPD_CAP;
356 1 : spdm_context->local_context.capability.flags |=
357 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_UPD_CAP;
358 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
359 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
360 1 : spdm_context->encap_context.request_op_code_count =
361 : LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
362 1 : spdm_context->encap_context.current_request_op_code = 0;
363 1 : spdm_context->encap_context.request_op_code_sequence[0] = SPDM_KEY_UPDATE;
364 1 : spdm_context->encap_context.request_id = 0;
365 :
366 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
367 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
368 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
369 : SPDM_VERSION_NUMBER_SHIFT_BIT;
370 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
371 : m_libspdm_use_asym_algo, &data,
372 : &data_size,
373 : NULL, NULL);
374 1 : spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
375 1 : spdm_context->local_context.local_cert_chain_provision[0] = data;
376 1 : spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
377 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
378 1 : libspdm_reset_message_b(spdm_context);
379 :
380 1 : session_id = 0xFFFFFFFF;
381 1 : spdm_context->latest_session_id = session_id;
382 1 : spdm_context->last_spdm_request_session_id_valid = true;
383 1 : spdm_context->last_spdm_request_session_id = session_id;
384 1 : session_info = &spdm_context->session_info[0];
385 1 : libspdm_session_info_init(spdm_context, session_info, session_id,
386 : SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
387 1 : libspdm_secured_message_set_session_state(session_info->secured_message_context,
388 : LIBSPDM_SESSION_STATE_ESTABLISHED);
389 :
390 1 : response_size = sizeof(response);
391 1 : status = libspdm_get_response_encapsulated_request(spdm_context,
392 : m_libspdm_encapsulated_request_t1_size,
393 : &m_libspdm_encapsulated_request_t1,
394 : &response_size,
395 : response);
396 :
397 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
398 1 : assert_int_equal(response_size,
399 : sizeof(spdm_encapsulated_request_response_t) +
400 : sizeof(spdm_key_update_response_t));
401 1 : spdm_response_requester = (void *)response;
402 1 : assert_int_equal(spdm_response_requester->header.request_response_code,
403 : SPDM_ENCAPSULATED_REQUEST);
404 1 : assert_int_equal(spdm_response_requester->header.param1,
405 : 0x1);
406 1 : assert_int_equal(spdm_response_requester->header.param2, 0);
407 1 : free(data);
408 1 : }
409 :
410 1 : static void rsp_encapsulated_request_case7(void **State)
411 : {
412 : libspdm_return_t status;
413 : libspdm_test_context_t *spdm_test_context;
414 : spdm_error_response_t *spdm_response_requester;
415 : libspdm_context_t *spdm_context;
416 : size_t response_size;
417 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
418 : uint8_t m_local_certificate_chain[LIBSPDM_MAX_CERT_CHAIN_SIZE];
419 :
420 1 : spdm_test_context = *State;
421 1 : spdm_context = spdm_test_context->spdm_context;
422 1 : spdm_test_context->case_id = 0x7;
423 :
424 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
425 : SPDM_VERSION_NUMBER_SHIFT_BIT;
426 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
427 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
428 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
429 :
430 1 : spdm_context->encap_context.current_request_op_code = 0;
431 1 : spdm_context->encap_context.request_id = 0;
432 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
433 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
434 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
435 1 : spdm_context->local_context.local_cert_chain_provision[0] = m_local_certificate_chain;
436 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
437 : sizeof(m_local_certificate_chain);
438 1 : libspdm_set_mem(m_local_certificate_chain, sizeof(m_local_certificate_chain), 0xFF);
439 :
440 1 : response_size = sizeof(response);
441 1 : status = libspdm_get_response_encapsulated_request(spdm_context,
442 : m_libspdm_encapsulated_request_t1_size,
443 : &m_libspdm_encapsulated_request_t1,
444 : &response_size,
445 : response);
446 :
447 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
448 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
449 1 : spdm_response_requester = (void *)response;
450 1 : assert_int_equal(spdm_response_requester->header.request_response_code, SPDM_ERROR);
451 1 : assert_int_equal(spdm_response_requester->header.param1, SPDM_ERROR_CODE_NO_PENDING_REQUESTS);
452 1 : assert_int_equal(spdm_response_requester->header.param2, 0);
453 1 : }
454 :
455 : #if LIBSPDM_SEND_GET_ENDPOINT_INFO_SUPPORT
456 0 : static libspdm_return_t get_endpoint_info_callback_encap_response (
457 : void *spdm_context,
458 : uint8_t subcode,
459 : uint8_t param2,
460 : uint8_t request_attributes,
461 : uint32_t endpoint_info_size,
462 : const void *endpoint_info)
463 : {
464 : /* should never reach here */
465 0 : LIBSPDM_ASSERT (0);
466 0 : return LIBSPDM_STATUS_UNSUPPORTED_CAP;
467 : }
468 :
469 1 : static void rsp_encapsulated_request_case8(void **State)
470 : {
471 : libspdm_return_t status;
472 : libspdm_test_context_t *spdm_test_context;
473 : spdm_encapsulated_request_response_t *spdm_response_requester;
474 : libspdm_context_t *spdm_context;
475 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
476 : size_t data_size;
477 : void *data;
478 : size_t response_size;
479 : uint32_t session_id;
480 : libspdm_session_info_t *session_info;
481 :
482 1 : spdm_test_context = *State;
483 1 : spdm_context = spdm_test_context->spdm_context;
484 1 : spdm_test_context->case_id = 0x6;
485 :
486 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
487 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
488 1 : spdm_context->connection_info.capability.flags |=
489 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_EP_INFO_CAP_SIG;
490 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
491 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
492 1 : spdm_context->encap_context.request_op_code_count =
493 : LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
494 1 : spdm_context->encap_context.current_request_op_code = 0;
495 1 : spdm_context->encap_context.request_op_code_sequence[0] = SPDM_GET_ENDPOINT_INFO;
496 1 : spdm_context->encap_context.request_id = 0;
497 :
498 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
499 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
500 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
501 : SPDM_VERSION_NUMBER_SHIFT_BIT;
502 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
503 : m_libspdm_use_req_asym_algo, &data,
504 : &data_size,
505 : NULL, NULL);
506 1 : spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
507 1 : spdm_context->local_context.local_cert_chain_provision[0] = data;
508 1 : spdm_context->connection_info.algorithm.req_base_asym_alg = m_libspdm_use_req_asym_algo;
509 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
510 1 : spdm_context->get_endpoint_info_callback = get_endpoint_info_callback_encap_response;
511 :
512 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
513 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
514 : data_size;
515 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
516 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
517 : data, data_size);
518 : #else
519 1 : libspdm_hash_all(
520 : spdm_context->connection_info.algorithm.base_hash_algo,
521 : data, data_size,
522 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
523 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
524 1 : libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
525 1 : libspdm_get_leaf_cert_public_key_from_cert_chain(
526 : spdm_context->connection_info.algorithm.base_hash_algo,
527 : spdm_context->connection_info.algorithm.base_asym_algo,
528 : data, data_size,
529 : &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
530 : #endif
531 :
532 1 : session_id = 0xFFFFFFFF;
533 1 : spdm_context->latest_session_id = session_id;
534 1 : spdm_context->last_spdm_request_session_id_valid = true;
535 1 : spdm_context->last_spdm_request_session_id = session_id;
536 1 : session_info = &spdm_context->session_info[0];
537 1 : libspdm_session_info_init(spdm_context, session_info, session_id,
538 : SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
539 1 : libspdm_secured_message_set_session_state(session_info->secured_message_context,
540 : LIBSPDM_SESSION_STATE_ESTABLISHED);
541 :
542 1 : libspdm_reset_message_a(spdm_context);
543 1 : libspdm_reset_message_encap_e(spdm_context, session_info);
544 :
545 1 : response_size = sizeof(response);
546 1 : status = libspdm_get_response_encapsulated_request(spdm_context,
547 : m_libspdm_encapsulated_request_t2_size,
548 : &m_libspdm_encapsulated_request_t2,
549 : &response_size,
550 : response);
551 :
552 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
553 :
554 1 : assert_int_equal(response_size,
555 : sizeof(spdm_encapsulated_request_response_t) +
556 : sizeof(spdm_get_endpoint_info_request_t) +
557 : SPDM_NONCE_SIZE);
558 1 : spdm_response_requester = (void *)response;
559 1 : assert_int_equal(spdm_response_requester->header.request_response_code,
560 : SPDM_ENCAPSULATED_REQUEST);
561 1 : assert_int_equal(spdm_response_requester->header.param1, 0x1);
562 1 : assert_int_equal(spdm_response_requester->header.param2, 0);
563 1 : free(data);
564 1 : }
565 : #endif /* LIBSPDM_SEND_GET_ENDPOINT_INFO_SUPPORT */
566 :
567 1 : static void rsp_encapsulated_response_ack_case1(void **State)
568 : {
569 : libspdm_return_t status;
570 : libspdm_test_context_t *spdm_test_context;
571 : libspdm_context_t *spdm_context;
572 : spdm_deliver_encapsulated_response_request_t *spdm_response_requester;
573 : spdm_digest_response_t *spdm_response_requester_digest;
574 : uint8_t temp_buf[LIBSPDM_MAX_SPDM_MSG_SIZE];
575 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
576 : size_t spdm_response_requester_size;
577 : size_t spdm_response_requester_digest_size;
578 : size_t data_size;
579 : size_t response_size;
580 : uint8_t *digest;
581 : void *data;
582 :
583 1 : spdm_test_context = *State;
584 1 : spdm_context = spdm_test_context->spdm_context;
585 :
586 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
587 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
588 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
589 1 : spdm_context->encap_context.request_op_code_count =
590 : LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
591 :
592 1 : spdm_context->encap_context.current_request_op_code = SPDM_GET_DIGESTS;
593 1 : spdm_context->encap_context.request_op_code_sequence[0] = SPDM_GET_DIGESTS;
594 :
595 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
596 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
597 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
598 : SPDM_VERSION_NUMBER_SHIFT_BIT;
599 1 : spdm_context->encap_context.request_id = 0;
600 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
601 : m_libspdm_use_asym_algo, &data,
602 : &data_size,
603 : NULL, NULL);
604 1 : spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
605 1 : spdm_context->local_context.local_cert_chain_provision[0] = data;
606 1 : spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
607 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
608 1 : libspdm_reset_message_b(spdm_context);
609 :
610 1 : spdm_response_requester_size = sizeof(spdm_digest_response_t) +
611 1 : libspdm_get_hash_size(m_libspdm_use_hash_algo) +
612 : sizeof(spdm_deliver_encapsulated_response_request_t);
613 :
614 1 : spdm_response_requester = (void *)temp_buf;
615 1 : libspdm_copy_mem(spdm_response_requester,
616 : sizeof(temp_buf),
617 : &m_libspdm_m_deliver_encapsulated_response_request_t1,
618 : m_libspdm_m_deliver_encapsulated_response_request_t1_size);
619 :
620 1 : spdm_response_requester_digest_size = sizeof(spdm_digest_response_t) +
621 1 : libspdm_get_hash_size(m_libspdm_use_hash_algo);
622 1 : spdm_response_requester_digest =
623 : (void *)(temp_buf + sizeof(spdm_deliver_encapsulated_response_request_t));
624 1 : spdm_response_requester_digest->header.spdm_version = SPDM_MESSAGE_VERSION_11;
625 1 : spdm_response_requester_digest->header.param1 = 0;
626 1 : spdm_response_requester_digest->header.request_response_code = SPDM_DIGESTS;
627 1 : spdm_response_requester_digest->header.param2 = 0;
628 :
629 1 : digest = (void *)(spdm_response_requester_digest + 1);
630 1 : libspdm_hash_all(m_libspdm_use_hash_algo, m_libspdm_local_certificate_chain,
631 : sizeof(m_libspdm_local_certificate_chain), &digest[0]);
632 1 : spdm_response_requester_digest->header.param2 |= (0x01 << 0);
633 :
634 1 : libspdm_set_mem(m_libspdm_local_certificate_chain,
635 : sizeof(m_libspdm_local_certificate_chain),
636 : (uint8_t)(0xFF));
637 :
638 1 : libspdm_copy_mem(spdm_response_requester + 1,
639 : spdm_response_requester_digest_size,
640 : spdm_response_requester_digest,
641 : spdm_response_requester_digest_size);
642 :
643 1 : response_size = sizeof(response);
644 1 : status = libspdm_get_response_encapsulated_response_ack(spdm_context,
645 : spdm_response_requester_size,
646 : spdm_response_requester, &response_size,
647 : response);
648 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
649 1 : free(data);
650 1 : }
651 :
652 1 : static void rsp_encapsulated_response_ack_case2(void **State)
653 : {
654 : libspdm_return_t status;
655 : libspdm_test_context_t *spdm_test_context;
656 : libspdm_context_t *spdm_context;
657 : spdm_deliver_encapsulated_response_request_t *spdm_response_requester;
658 : spdm_certificate_response_t *spdm_response_requester_certificate;
659 : uint8_t temp_buf[LIBSPDM_MAX_SPDM_MSG_SIZE];
660 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
661 : size_t spdm_response_requester_size;
662 : size_t data_size;
663 : size_t response_size;
664 : void *data;
665 : uint16_t portion_length;
666 : uint16_t remainder_length;
667 : static size_t calling_index = 0;
668 :
669 : static void *libspdm_local_certificate_chain;
670 : static size_t libspdm_local_certificate_chain_size;
671 :
672 1 : spdm_test_context = *State;
673 1 : spdm_context = spdm_test_context->spdm_context;
674 :
675 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
676 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
677 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
678 1 : spdm_context->encap_context.request_op_code_count =
679 : LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
680 :
681 1 : spdm_context->encap_context.current_request_op_code = SPDM_GET_CERTIFICATE;
682 1 : spdm_context->encap_context.request_op_code_sequence[0] = SPDM_GET_CERTIFICATE;
683 :
684 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
685 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
686 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
687 : SPDM_VERSION_NUMBER_SHIFT_BIT;
688 1 : spdm_context->encap_context.request_id = 0;
689 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
690 : m_libspdm_use_asym_algo, &data,
691 : &data_size,
692 : NULL, NULL);
693 1 : spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
694 1 : spdm_context->local_context.local_cert_chain_provision[0] = data;
695 1 : spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
696 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
697 1 : libspdm_reset_message_b(spdm_context);
698 :
699 1 : spdm_response_requester = (void *)temp_buf;
700 1 : libspdm_copy_mem(spdm_response_requester,
701 : sizeof(temp_buf),
702 : &m_libspdm_m_deliver_encapsulated_response_request_t1,
703 : m_libspdm_m_deliver_encapsulated_response_request_t1_size);
704 :
705 1 : spdm_response_requester_certificate =
706 : (void *)(temp_buf + sizeof(spdm_deliver_encapsulated_response_request_t));
707 :
708 1 : libspdm_read_responder_public_certificate_chain(
709 : m_libspdm_use_hash_algo, m_libspdm_use_asym_algo,
710 : &libspdm_local_certificate_chain,
711 : &libspdm_local_certificate_chain_size, NULL, NULL);
712 :
713 1 : portion_length = LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN;
714 1 : remainder_length = (uint16_t)(libspdm_local_certificate_chain_size -
715 1 : (LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN * (calling_index + 1)));
716 :
717 1 : spdm_response_requester_certificate->header.spdm_version = SPDM_MESSAGE_VERSION_11;
718 1 : spdm_response_requester_certificate->header.request_response_code = SPDM_CERTIFICATE;
719 1 : spdm_response_requester_certificate->header.param1 = 0;
720 1 : spdm_response_requester_certificate->header.param2 = 0;
721 1 : spdm_response_requester_certificate->portion_length = portion_length;
722 1 : spdm_response_requester_certificate->remainder_length = remainder_length;
723 :
724 1 : libspdm_copy_mem(spdm_response_requester_certificate + 1,
725 : sizeof(temp_buf) - sizeof(*spdm_response_requester_certificate),
726 1 : (uint8_t *)libspdm_local_certificate_chain +
727 1 : LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN * calling_index,
728 : portion_length);
729 :
730 1 : free(libspdm_local_certificate_chain);
731 :
732 1 : response_size = sizeof(response);
733 1 : spdm_response_requester_size = sizeof(spdm_certificate_response_t) + portion_length +
734 : sizeof(spdm_deliver_encapsulated_response_request_t);
735 1 : status = libspdm_get_response_encapsulated_response_ack(spdm_context,
736 : spdm_response_requester_size,
737 : spdm_response_requester, &response_size,
738 : response);
739 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
740 1 : free(data);
741 1 : }
742 :
743 1 : static void rsp_encapsulated_response_ack_case3(void **State)
744 : {
745 : libspdm_return_t status;
746 : libspdm_test_context_t *spdm_test_context;
747 : libspdm_context_t *spdm_context;
748 : spdm_deliver_encapsulated_response_request_t *spdm_response_requester;
749 : spdm_key_update_response_t *spdm_response_requester_key_update;
750 : uint8_t temp_buf[LIBSPDM_MAX_SPDM_MSG_SIZE];
751 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
752 : size_t spdm_response_requester_size;
753 : size_t data_size;
754 : size_t response_size;
755 : void *data;
756 : uint32_t session_id;
757 : libspdm_session_info_t *session_info;
758 :
759 1 : spdm_test_context = *State;
760 1 : spdm_context = spdm_test_context->spdm_context;
761 :
762 1 : spdm_context->last_spdm_request_session_id_valid = true;
763 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
764 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
765 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
766 1 : spdm_context->encap_context.request_op_code_count =
767 : LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
768 :
769 1 : spdm_context->encap_context.current_request_op_code = SPDM_KEY_UPDATE;
770 1 : spdm_context->encap_context.request_op_code_sequence[0] = SPDM_KEY_UPDATE;
771 :
772 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
773 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
774 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
775 : SPDM_VERSION_NUMBER_SHIFT_BIT;
776 1 : spdm_context->encap_context.request_id = 0;
777 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
778 : m_libspdm_use_asym_algo, &data,
779 : &data_size,
780 : NULL, NULL);
781 1 : spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
782 1 : spdm_context->local_context.local_cert_chain_provision[0] = data;
783 1 : spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
784 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
785 :
786 1 : libspdm_reset_message_b(spdm_context);
787 :
788 1 : session_id = 0xFFFFFFFF;
789 1 : spdm_context->latest_session_id = session_id;
790 1 : spdm_context->last_spdm_request_session_id_valid = true;
791 1 : spdm_context->last_spdm_request_session_id = session_id;
792 1 : session_info = &spdm_context->session_info[0];
793 1 : libspdm_session_info_init(spdm_context, session_info, session_id,
794 : SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
795 1 : libspdm_secured_message_set_session_state(session_info->secured_message_context,
796 : LIBSPDM_SESSION_STATE_ESTABLISHED);
797 :
798 1 : spdm_context->encap_context.last_encap_request_header.spdm_version = SPDM_MESSAGE_VERSION_11;
799 1 : spdm_context->encap_context.last_encap_request_header.request_response_code =
800 : SPDM_KEY_UPDATE_ACK;
801 1 : spdm_context->encap_context.last_encap_request_header.param1 =
802 : SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
803 1 : spdm_context->encap_context.last_encap_request_header.param2 = 0;
804 :
805 1 : spdm_response_requester = (void *)temp_buf;
806 1 : libspdm_copy_mem(spdm_response_requester,
807 : sizeof(temp_buf),
808 : &m_libspdm_m_deliver_encapsulated_response_request_t1,
809 : m_libspdm_m_deliver_encapsulated_response_request_t1_size);
810 :
811 1 : spdm_response_requester_key_update =
812 : (void *)(temp_buf + sizeof(spdm_deliver_encapsulated_response_request_t));
813 :
814 1 : spdm_response_requester_key_update->header.spdm_version = SPDM_MESSAGE_VERSION_11;
815 1 : spdm_response_requester_key_update->header.request_response_code = SPDM_KEY_UPDATE_ACK;
816 1 : spdm_response_requester_key_update->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
817 1 : spdm_response_requester_key_update->header.param2 = 0;
818 :
819 1 : response_size = sizeof(response);
820 1 : spdm_response_requester_size = sizeof(spdm_key_update_response_t) +
821 : sizeof(spdm_deliver_encapsulated_response_request_t);
822 1 : status = libspdm_get_response_encapsulated_response_ack(spdm_context,
823 : spdm_response_requester_size,
824 : spdm_response_requester, &response_size,
825 : response);
826 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
827 1 : free(data);
828 1 : }
829 :
830 1 : static void rsp_encapsulated_response_ack_case4(void **State)
831 : {
832 : libspdm_return_t status;
833 : spdm_encapsulated_request_response_t *spdm_response_requester;
834 : libspdm_test_context_t *spdm_test_context;
835 : libspdm_context_t *spdm_context;
836 : size_t response_size;
837 1 : spdm_test_context = *State;
838 1 : spdm_context = spdm_test_context->spdm_context;
839 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
840 :
841 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
842 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
843 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
844 1 : spdm_context->encap_context.request_op_code_count =
845 : LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
846 1 : spdm_context->encap_context.current_request_op_code = 0;
847 1 : libspdm_reset_message_b(spdm_context);
848 :
849 1 : response_size = sizeof(response);
850 1 : status = libspdm_get_response_encapsulated_response_ack(spdm_context,
851 : m_libspdm_m_deliver_encapsulated_response_request_t1_size,
852 : &m_libspdm_m_deliver_encapsulated_response_request_t1,
853 : &response_size,
854 : response);
855 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
856 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
857 1 : spdm_response_requester = (void *)response;
858 1 : assert_int_equal(spdm_response_requester->header.request_response_code, SPDM_ERROR);
859 1 : assert_int_equal(spdm_response_requester->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
860 1 : assert_int_equal(spdm_response_requester->header.param2, 0);
861 1 : }
862 :
863 1 : static void rsp_encapsulated_response_ack_case5(void **State)
864 : {
865 : libspdm_return_t status;
866 : spdm_encapsulated_request_response_t *spdm_response_requester;
867 : libspdm_test_context_t *spdm_test_context;
868 : libspdm_context_t *spdm_context;
869 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
870 : size_t response_size;
871 1 : spdm_test_context = *State;
872 1 : spdm_context = spdm_test_context->spdm_context;
873 :
874 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
875 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
876 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
877 1 : spdm_context->encap_context.request_op_code_count =
878 : LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
879 1 : spdm_context->encap_context.current_request_op_code = 0;
880 :
881 1 : response_size = sizeof(response);
882 1 : status = libspdm_get_response_encapsulated_response_ack(spdm_context,
883 : m_libspdm_m_deliver_encapsulated_response_request_t1_size,
884 : &m_libspdm_m_deliver_encapsulated_response_request_t1,
885 : &response_size,
886 : response);
887 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
888 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
889 1 : spdm_response_requester = (void *)response;
890 1 : assert_int_equal(spdm_response_requester->header.request_response_code, SPDM_ERROR);
891 1 : assert_int_equal(spdm_response_requester->header.param1, SPDM_ERROR_CODE_UNEXPECTED_REQUEST);
892 1 : assert_int_equal(spdm_response_requester->header.param2, 0);
893 1 : }
894 :
895 1 : static void rsp_encapsulated_response_ack_case6(void **State)
896 : {
897 : libspdm_return_t status;
898 : spdm_encapsulated_request_response_t *spdm_response_requester;
899 : libspdm_test_context_t *spdm_test_context;
900 : libspdm_context_t *spdm_context;
901 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
902 : size_t response_size;
903 : size_t data_size;
904 : void *data;
905 :
906 1 : spdm_test_context = *State;
907 1 : spdm_context = spdm_test_context->spdm_context;
908 :
909 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NEED_RESYNC;
910 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
911 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
912 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
913 1 : spdm_context->encap_context.request_op_code_count =
914 : LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
915 :
916 1 : status = libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
917 : m_libspdm_use_asym_algo, &data,
918 : &data_size,
919 : NULL, NULL);
920 1 : spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
921 1 : spdm_context->local_context.local_cert_chain_provision[0] = data;
922 1 : spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
923 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
924 :
925 1 : response_size = sizeof(response);
926 1 : status = libspdm_get_response_encapsulated_response_ack(spdm_context,
927 : m_libspdm_m_deliver_encapsulated_response_request_t1_size,
928 : &m_libspdm_m_deliver_encapsulated_response_request_t1,
929 : &response_size,
930 : response);
931 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
932 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
933 1 : spdm_response_requester = (void *)response;
934 1 : assert_int_equal(spdm_response_requester->header.request_response_code, SPDM_ERROR);
935 1 : assert_int_equal(spdm_response_requester->header.param1, SPDM_ERROR_CODE_REQUEST_RESYNCH);
936 1 : assert_int_equal(spdm_response_requester->header.param2, 0);
937 1 : }
938 :
939 1 : static void rsp_encapsulated_response_ack_case7(void **State)
940 : {
941 : libspdm_return_t status;
942 : libspdm_test_context_t *spdm_test_context;
943 : libspdm_context_t *spdm_context;
944 : spdm_deliver_encapsulated_response_request_t *spdm_response_requester;
945 : spdm_certificate_response_t *spdm_response_requester_certificate;
946 : uint8_t temp_buf[LIBSPDM_MAX_SPDM_MSG_SIZE];
947 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
948 : size_t spdm_response_requester_size;
949 : size_t data_size;
950 : size_t response_size;
951 : void *data;
952 : uint16_t portion_length;
953 : uint16_t remainder_length;
954 : static size_t calling_index = 0;
955 :
956 : static void *libspdm_local_certificate_chain;
957 : static size_t libspdm_local_certificate_chain_size;
958 :
959 1 : spdm_test_context = *State;
960 1 : spdm_context = spdm_test_context->spdm_context;
961 :
962 1 : spdm_context->encap_context.request_id = 0xFF;
963 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
964 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
965 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
966 1 : spdm_context->encap_context.request_op_code_count =
967 : LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
968 :
969 1 : spdm_context->encap_context.current_request_op_code = SPDM_GET_CERTIFICATE;
970 1 : spdm_context->encap_context.request_op_code_sequence[0] = SPDM_GET_CERTIFICATE;
971 :
972 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
973 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
974 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
975 : SPDM_VERSION_NUMBER_SHIFT_BIT;
976 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
977 : m_libspdm_use_asym_algo, &data,
978 : &data_size,
979 : NULL, NULL);
980 1 : spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
981 1 : spdm_context->local_context.local_cert_chain_provision[0] = data;
982 1 : spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
983 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
984 1 : libspdm_reset_message_b(spdm_context);
985 :
986 1 : spdm_response_requester = (void *)temp_buf;
987 1 : libspdm_copy_mem(spdm_response_requester,
988 : sizeof(temp_buf),
989 : &m_libspdm_m_deliver_encapsulated_response_request_t1,
990 : m_libspdm_m_deliver_encapsulated_response_request_t1_size);
991 :
992 1 : spdm_response_requester_certificate =
993 : (void *)(temp_buf + sizeof(spdm_deliver_encapsulated_response_request_t));
994 :
995 1 : libspdm_read_responder_public_certificate_chain(
996 : m_libspdm_use_hash_algo, m_libspdm_use_asym_algo,
997 : &libspdm_local_certificate_chain,
998 : &libspdm_local_certificate_chain_size, NULL, NULL);
999 :
1000 1 : portion_length = LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN;
1001 1 : remainder_length = (uint16_t)(libspdm_local_certificate_chain_size -
1002 1 : (LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN * (calling_index + 1)));
1003 :
1004 1 : spdm_response_requester_certificate->header.spdm_version = SPDM_MESSAGE_VERSION_11;
1005 1 : spdm_response_requester_certificate->header.request_response_code = SPDM_CERTIFICATE;
1006 1 : spdm_response_requester_certificate->header.param1 = 0;
1007 1 : spdm_response_requester_certificate->header.param2 = 0;
1008 1 : spdm_response_requester_certificate->portion_length = portion_length;
1009 1 : spdm_response_requester_certificate->remainder_length = remainder_length;
1010 :
1011 1 : libspdm_copy_mem(spdm_response_requester_certificate + 1,
1012 : sizeof(temp_buf) - sizeof(*spdm_response_requester_certificate),
1013 1 : (uint8_t *)libspdm_local_certificate_chain +
1014 1 : LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN * calling_index,
1015 : portion_length);
1016 :
1017 1 : free(libspdm_local_certificate_chain);
1018 :
1019 1 : response_size = sizeof(response);
1020 1 : spdm_response_requester_size = sizeof(spdm_certificate_response_t) + portion_length +
1021 : sizeof(spdm_deliver_encapsulated_response_request_t);
1022 1 : status = libspdm_get_response_encapsulated_response_ack(spdm_context,
1023 : spdm_response_requester_size,
1024 : spdm_response_requester, &response_size,
1025 : response);
1026 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1027 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
1028 1 : spdm_response_requester = (void *)response;
1029 1 : assert_int_equal(spdm_response_requester->header.request_response_code, SPDM_ERROR);
1030 1 : assert_int_equal(spdm_response_requester->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
1031 1 : assert_int_equal(spdm_response_requester->header.param2, 0);
1032 1 : free(data);
1033 1 : }
1034 :
1035 1 : static void rsp_encapsulated_response_ack_case8(void **State)
1036 : {
1037 : libspdm_return_t status;
1038 : libspdm_test_context_t *spdm_test_context;
1039 : libspdm_context_t *spdm_context;
1040 : spdm_encapsulated_response_ack_response_t *spdm_response;
1041 : spdm_deliver_encapsulated_response_request_t *spdm_response_requester;
1042 : spdm_digest_response_t *spdm_response_requester_digest;
1043 : uint8_t temp_buf[LIBSPDM_MAX_SPDM_MSG_SIZE];
1044 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1045 : size_t spdm_response_requester_size;
1046 : size_t spdm_response_requester_digest_size;
1047 : size_t data_size;
1048 : size_t response_size;
1049 : uint8_t *digest;
1050 : void *data;
1051 :
1052 1 : spdm_test_context = *State;
1053 1 : spdm_context = spdm_test_context->spdm_context;
1054 :
1055 1 : spdm_context->encap_context.request_id = 0xFF;
1056 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
1057 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
1058 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
1059 1 : spdm_context->encap_context.request_op_code_count =
1060 : LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
1061 :
1062 1 : spdm_context->encap_context.current_request_op_code = SPDM_GET_DIGESTS;
1063 1 : spdm_context->encap_context.request_op_code_sequence[0] = SPDM_GET_DIGESTS;
1064 :
1065 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1066 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
1067 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
1068 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1069 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
1070 : m_libspdm_use_asym_algo, &data,
1071 : &data_size,
1072 : NULL, NULL);
1073 1 : spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
1074 1 : spdm_context->local_context.local_cert_chain_provision[0] = data;
1075 1 : spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
1076 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
1077 1 : libspdm_reset_message_b(spdm_context);
1078 :
1079 1 : spdm_response_requester_size = sizeof(spdm_digest_response_t) +
1080 1 : libspdm_get_hash_size(m_libspdm_use_hash_algo) +
1081 : sizeof(spdm_deliver_encapsulated_response_request_t);
1082 :
1083 1 : spdm_response_requester = (void *)temp_buf;
1084 1 : libspdm_copy_mem(spdm_response_requester,
1085 : sizeof(temp_buf),
1086 : &m_libspdm_m_deliver_encapsulated_response_request_t2,
1087 : m_libspdm_m_deliver_encapsulated_response_request_t2_size);
1088 :
1089 1 : spdm_response_requester_digest_size = sizeof(spdm_digest_response_t) +
1090 1 : libspdm_get_hash_size(m_libspdm_use_hash_algo);
1091 1 : spdm_response_requester_digest =
1092 : (void *)(temp_buf + sizeof(spdm_deliver_encapsulated_response_request_t));
1093 1 : spdm_response_requester_digest->header.spdm_version = SPDM_MESSAGE_VERSION_12;
1094 1 : spdm_response_requester_digest->header.param1 = 0;
1095 1 : spdm_response_requester_digest->header.request_response_code = SPDM_DIGESTS;
1096 1 : spdm_response_requester_digest->header.param2 = 0;
1097 :
1098 1 : digest = (void *)(spdm_response_requester_digest + 1);
1099 1 : libspdm_hash_all(m_libspdm_use_hash_algo, m_libspdm_local_certificate_chain,
1100 : sizeof(m_libspdm_local_certificate_chain), &digest[0]);
1101 1 : spdm_response_requester_digest->header.param2 |= (0x01 << 0);
1102 :
1103 1 : libspdm_set_mem(m_libspdm_local_certificate_chain,
1104 : sizeof(m_libspdm_local_certificate_chain),
1105 : (uint8_t)(0xFF));
1106 :
1107 1 : libspdm_copy_mem(spdm_response_requester + 1,
1108 : spdm_response_requester_digest_size,
1109 : spdm_response_requester_digest,
1110 : spdm_response_requester_digest_size);
1111 :
1112 1 : response_size = sizeof(response);
1113 1 : status = libspdm_get_response_encapsulated_response_ack(spdm_context,
1114 : spdm_response_requester_size,
1115 : spdm_response_requester, &response_size,
1116 : response);
1117 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1118 1 : assert_int_equal(response_size, sizeof(spdm_encapsulated_response_ack_response_t));
1119 1 : spdm_response = (void *)response;
1120 1 : assert_int_equal(spdm_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
1121 1 : assert_int_equal(spdm_response->header.request_response_code, SPDM_ENCAPSULATED_RESPONSE_ACK);
1122 1 : assert_int_equal(spdm_response->header.param1, 0);
1123 1 : assert_int_equal(spdm_response->header.param2,
1124 : SPDM_ENCAPSULATED_RESPONSE_ACK_RESPONSE_PAYLOAD_TYPE_ABSENT);
1125 1 : assert_int_equal(spdm_response->ack_request_id,
1126 : m_libspdm_m_deliver_encapsulated_response_request_t2.header.param1);
1127 1 : free(data);
1128 1 : }
1129 :
1130 : /**
1131 : * Test 9: In an encapsulated request flow, a Responder issue an encapsulated request that can take up to CT time to
1132 : * fulfill, then the Requester deliver an encapsulated ERROR message with a ResponseNotReady error code.
1133 : * Expected behavior: the Responder shall not encapsulate another request by setting Param2 in ENCAPSULATED_RESPONSE_ACK
1134 : * to a value of zero.
1135 : **/
1136 1 : static void rsp_encapsulated_response_ack_case9(void **State)
1137 : {
1138 : libspdm_return_t status;
1139 : libspdm_test_context_t *spdm_test_context;
1140 : libspdm_context_t *spdm_context;
1141 : spdm_encapsulated_response_ack_response_t *spdm_response;
1142 : spdm_deliver_encapsulated_response_request_t *spdm_request;
1143 : spdm_error_response_data_response_not_ready_t *EncapsulatedResponse;
1144 : uint8_t temp_buf[LIBSPDM_MAX_SPDM_MSG_SIZE];
1145 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1146 : size_t spdm_request_size;
1147 : size_t EncapsulatedResponse_size;
1148 : size_t response_size;
1149 :
1150 1 : spdm_test_context = *State;
1151 1 : spdm_context = spdm_test_context->spdm_context;
1152 :
1153 1 : spdm_context->encap_context.request_id = 0xFF;
1154 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
1155 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
1156 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
1157 1 : spdm_context->encap_context.request_op_code_count =
1158 : LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
1159 :
1160 1 : spdm_context->encap_context.current_request_op_code = SPDM_GET_DIGESTS;
1161 1 : spdm_context->encap_context.request_op_code_sequence[0] = SPDM_GET_DIGESTS;
1162 :
1163 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1164 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
1165 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
1166 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1167 1 : libspdm_reset_message_b(spdm_context);
1168 :
1169 1 : spdm_request_size = sizeof(spdm_deliver_encapsulated_response_request_t) +
1170 : sizeof(spdm_error_response_data_response_not_ready_t);
1171 :
1172 1 : spdm_request = (void *)temp_buf;
1173 1 : libspdm_copy_mem(spdm_request,
1174 : sizeof(temp_buf),
1175 : &m_libspdm_m_deliver_encapsulated_response_request_t2,
1176 : m_libspdm_m_deliver_encapsulated_response_request_t2_size);
1177 :
1178 1 : EncapsulatedResponse_size = sizeof(spdm_error_response_data_response_not_ready_t);
1179 1 : EncapsulatedResponse =
1180 : (void *)(temp_buf + sizeof(spdm_deliver_encapsulated_response_request_t));
1181 1 : EncapsulatedResponse->header.spdm_version = SPDM_MESSAGE_VERSION_12;
1182 1 : EncapsulatedResponse->header.request_response_code = SPDM_ERROR;
1183 1 : EncapsulatedResponse->header.param1 = SPDM_ERROR_CODE_RESPONSE_NOT_READY;
1184 1 : EncapsulatedResponse->header.param2 = 0;
1185 1 : EncapsulatedResponse->extend_error_data.rd_exponent = 1;
1186 1 : EncapsulatedResponse->extend_error_data.rd_tm = 1;
1187 1 : EncapsulatedResponse->extend_error_data.request_code = SPDM_GET_DIGESTS;
1188 1 : EncapsulatedResponse->extend_error_data.token = 0;
1189 :
1190 1 : libspdm_copy_mem(spdm_request + 1,
1191 : EncapsulatedResponse_size,
1192 : EncapsulatedResponse,
1193 : EncapsulatedResponse_size);
1194 :
1195 1 : response_size = sizeof(response);
1196 1 : status = libspdm_get_response_encapsulated_response_ack(spdm_context,
1197 : spdm_request_size,
1198 : spdm_request, &response_size,
1199 : response);
1200 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1201 1 : assert_int_equal(response_size, sizeof(spdm_encapsulated_response_ack_response_t));
1202 1 : spdm_response = (void *)response;
1203 1 : assert_int_equal(spdm_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
1204 1 : assert_int_equal(spdm_response->header.request_response_code,
1205 : SPDM_ENCAPSULATED_RESPONSE_ACK);
1206 1 : assert_int_equal(spdm_response->header.param1, 0);
1207 1 : assert_int_equal(spdm_response->header.param2,
1208 : SPDM_ENCAPSULATED_RESPONSE_ACK_RESPONSE_PAYLOAD_TYPE_ABSENT);
1209 1 : assert_int_equal(spdm_response->ack_request_id,
1210 : m_libspdm_m_deliver_encapsulated_response_request_t2.header.param1);
1211 1 : }
1212 :
1213 1 : int libspdm_rsp_encapsulated_request_test(void)
1214 : {
1215 1 : const struct CMUnitTest test_cases[] = {
1216 : #if (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT)
1217 : /*Success Case request_op_code_sequence: SPDM_GET_DIGESTS*/
1218 : cmocka_unit_test(rsp_encapsulated_request_case1),
1219 : /*Success Case current_request_op_code: SPDM_GET_CERTIFICATE */
1220 : cmocka_unit_test(rsp_encapsulated_request_case2),
1221 : /*response_state : LIBSPDM_RESPONSE_STATE_NORMAL with UnexpectedRequest error. */
1222 : cmocka_unit_test(rsp_encapsulated_request_case3),
1223 : /*response_state : LIBSPDM_RESPONSE_STATE_NEED_RESYNC */
1224 : cmocka_unit_test(rsp_encapsulated_request_case4),
1225 : #endif /* (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT) */
1226 : #if (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_SEND_CHALLENGE_SUPPORT)
1227 : /*Success Case current_request_op_code: SPDM_CHALLENGE */
1228 : cmocka_unit_test(rsp_encapsulated_request_case5),
1229 : #endif
1230 : /* Success Case current_request_op_code: SPDM_KEY_UPDATE */
1231 : cmocka_unit_test(rsp_encapsulated_request_case6),
1232 : /*response_state : LIBSPDM_RESPONSE_STATE_NORMAL with NoPendingRequests error. */
1233 : cmocka_unit_test(rsp_encapsulated_request_case7),
1234 : #if LIBSPDM_SEND_GET_ENDPOINT_INFO_SUPPORT
1235 : /* Success Case current_request_op_code: SPDM_GET_ENDPOINT_INFO */
1236 : cmocka_unit_test(rsp_encapsulated_request_case8),
1237 : #endif /* LIBSPDM_SEND_GET_ENDPOINT_INFO_SUPPORT */
1238 :
1239 : #if (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT)
1240 : /*Success Case current_request_op_code: SPDM_GET_DIGESTS*/
1241 : cmocka_unit_test(rsp_encapsulated_response_ack_case1),
1242 : /*Success Case current_request_op_code: SPDM_GET_CERTIFICATE*/
1243 : cmocka_unit_test(rsp_encapsulated_response_ack_case2),
1244 : #endif
1245 : /* Success Case current_request_op_code: SPDM_KEY_UPDATE */
1246 : cmocka_unit_test(rsp_encapsulated_response_ack_case3),
1247 : /* current_request_op_code: NULL */
1248 : cmocka_unit_test(rsp_encapsulated_response_ack_case4),
1249 : /*response_state : LIBSPDM_RESPONSE_STATE_NORMAL */
1250 : cmocka_unit_test(rsp_encapsulated_response_ack_case5),
1251 : /*response_state : LIBSPDM_RESPONSE_STATE_NEED_RESYNC */
1252 : cmocka_unit_test(rsp_encapsulated_response_ack_case6),
1253 : #if (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT)
1254 : /*spdm_request->header.param1 != spdm_context->encap_context.request_id */
1255 : cmocka_unit_test(rsp_encapsulated_response_ack_case7),
1256 : /*Success Case When version is greater than V1.2 */
1257 : cmocka_unit_test(rsp_encapsulated_response_ack_case8),
1258 : #endif
1259 : /*When the Requester delivers an encapsulated ERROR message with a ResponseNotReady error code*/
1260 : cmocka_unit_test(rsp_encapsulated_response_ack_case9),
1261 : };
1262 :
1263 1 : libspdm_test_context_t test_context = {
1264 : LIBSPDM_TEST_CONTEXT_VERSION,
1265 : false,
1266 : };
1267 :
1268 1 : libspdm_setup_test_context(&test_context);
1269 :
1270 1 : return cmocka_run_group_tests(test_cases,
1271 : libspdm_unit_test_group_setup,
1272 : libspdm_unit_test_group_teardown);
1273 : }
1274 :
1275 : #endif /* LIBSPDM_ENABLE_CAPABILITY_ENCAP_CAP */
|