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