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