Line data Source code
1 : /**
2 : * Copyright Notice:
3 : * Copyright 2021-2022 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_requester_lib.h"
9 : #include "internal/libspdm_secured_message_lib.h"
10 :
11 : #if LIBSPDM_ENABLE_CAPABILITY_SET_CERT_CAP
12 :
13 6 : libspdm_return_t libspdm_requester_set_certificate_test_send_message(
14 : void *spdm_context, size_t request_size, const void *request,
15 : uint64_t timeout)
16 : {
17 : libspdm_test_context_t *spdm_test_context;
18 : uint32_t *session_id;
19 : libspdm_session_info_t *session_info;
20 : bool is_app_message;
21 : uint8_t *app_message;
22 : size_t app_message_size;
23 : uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
24 : spdm_set_certificate_request_t *spdm_request;
25 :
26 6 : memcpy(message_buffer, request, request_size);
27 6 : libspdm_transport_test_decode_message(spdm_context, &session_id, &is_app_message, true,
28 : request_size, message_buffer, &app_message_size,
29 : (void **)&app_message);
30 :
31 6 : spdm_test_context = libspdm_get_test_context();
32 6 : switch (spdm_test_context->case_id) {
33 1 : case 0x1:
34 1 : return LIBSPDM_STATUS_SEND_FAIL;
35 1 : case 0x2:
36 1 : spdm_request = (spdm_set_certificate_request_t *)app_message;
37 :
38 1 : assert_int_equal(spdm_request->header.spdm_version, SPDM_MESSAGE_VERSION_12);
39 1 : assert_int_equal(spdm_request->header.request_response_code, SPDM_SET_CERTIFICATE);
40 1 : assert_int_equal(spdm_request->header.param1 & SPDM_SET_CERTIFICATE_REQUEST_SLOT_ID_MASK,
41 : 0);
42 1 : assert_int_equal(spdm_request->header.param2, 0);
43 :
44 1 : return LIBSPDM_STATUS_SUCCESS;
45 0 : case 0x3:
46 0 : assert_true(false);
47 :
48 0 : return LIBSPDM_STATUS_SUCCESS;
49 0 : case 0x4:
50 0 : return LIBSPDM_STATUS_SUCCESS;
51 1 : case 0x5:
52 1 : session_id = NULL;
53 1 : session_info = libspdm_get_session_info_via_session_id(spdm_context, 0xFFFFFFFF);
54 1 : if (session_info == NULL) {
55 0 : return LIBSPDM_STATUS_SEND_FAIL;
56 : }
57 1 : LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "Request (0x%zx):\n", request_size));
58 1 : libspdm_dump_hex(request, request_size);
59 :
60 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&app_message, &app_message_size);
61 1 : libspdm_transport_test_decode_message(
62 : spdm_context, &session_id, &is_app_message,
63 : false, request_size, message_buffer,
64 : &app_message_size, (void **)&app_message);
65 :
66 : /* WALKAROUND: If just use single context to encode
67 : * message and then decode message */
68 : ((libspdm_secured_message_context_t
69 1 : *)(session_info->secured_message_context))
70 1 : ->application_secret.request_data_sequence_number--;
71 :
72 1 : return LIBSPDM_STATUS_SUCCESS;
73 1 : case 0x6:
74 1 : spdm_request = (spdm_set_certificate_request_t *)app_message;
75 :
76 1 : assert_int_equal(spdm_request->header.spdm_version, SPDM_MESSAGE_VERSION_12);
77 1 : assert_int_equal(spdm_request->header.request_response_code, SPDM_SET_CERTIFICATE);
78 1 : assert_int_equal(spdm_request->header.param1 & SPDM_SET_CERTIFICATE_REQUEST_SLOT_ID_MASK,
79 : 0);
80 1 : assert_int_equal(spdm_request->header.param2, 0);
81 :
82 1 : return LIBSPDM_STATUS_SUCCESS;
83 1 : case 0x7:
84 1 : spdm_request = (spdm_set_certificate_request_t *)app_message;
85 :
86 1 : assert_int_equal(spdm_request->header.spdm_version, SPDM_MESSAGE_VERSION_13);
87 1 : assert_int_equal(spdm_request->header.request_response_code, SPDM_SET_CERTIFICATE);
88 1 : assert_int_equal(spdm_request->header.param1 & SPDM_SET_CERTIFICATE_REQUEST_SLOT_ID_MASK,
89 : 0);
90 1 : assert_int_equal((spdm_request->header.param1 &
91 : SPDM_SET_CERTIFICATE_REQUEST_ATTRIBUTES_CERT_MODEL_MASK) >>
92 : SPDM_SET_CERTIFICATE_REQUEST_ATTRIBUTES_CERT_MODEL_OFFSET,
93 : SPDM_CERTIFICATE_INFO_CERT_MODEL_NONE);
94 1 : assert_int_equal(spdm_request->header.param1 &
95 : SPDM_SET_CERTIFICATE_REQUEST_ATTRIBUTES_ERASE,
96 : SPDM_SET_CERTIFICATE_REQUEST_ATTRIBUTES_ERASE);
97 1 : assert_int_equal(spdm_request->header.param2, 0);
98 :
99 1 : return LIBSPDM_STATUS_SUCCESS;
100 0 : case 0x8:
101 0 : assert_true(false);
102 0 : return LIBSPDM_STATUS_SEND_FAIL;
103 1 : case 0x9:
104 1 : spdm_request = (spdm_set_certificate_request_t *)app_message;
105 :
106 1 : assert_int_equal(spdm_request->header.spdm_version, SPDM_MESSAGE_VERSION_13);
107 1 : assert_int_equal(spdm_request->header.request_response_code, SPDM_SET_CERTIFICATE);
108 1 : assert_int_equal(spdm_request->header.param1 & SPDM_SET_CERTIFICATE_REQUEST_SLOT_ID_MASK,
109 : 3);
110 1 : assert_int_equal((spdm_request->header.param1 &
111 : SPDM_SET_CERTIFICATE_REQUEST_ATTRIBUTES_CERT_MODEL_MASK) >>
112 : SPDM_SET_CERTIFICATE_REQUEST_ATTRIBUTES_CERT_MODEL_OFFSET,
113 : SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT);
114 1 : assert_int_equal(spdm_request->header.param2, 1);
115 :
116 1 : return LIBSPDM_STATUS_SUCCESS;
117 :
118 0 : default:
119 0 : return LIBSPDM_STATUS_SEND_FAIL;
120 : }
121 : }
122 :
123 5 : libspdm_return_t libspdm_requester_set_certificate_test_receive_message(
124 : void *spdm_context, size_t *response_size,
125 : void **response, uint64_t timeout)
126 : {
127 : libspdm_test_context_t *spdm_test_context;
128 :
129 5 : spdm_test_context = libspdm_get_test_context();
130 5 : switch (spdm_test_context->case_id) {
131 0 : case 0x1:
132 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
133 :
134 1 : case 0x2: {
135 : spdm_set_certificate_response_t *spdm_response;
136 : size_t spdm_response_size;
137 : size_t transport_header_size;
138 :
139 1 : spdm_response_size = sizeof(spdm_set_certificate_response_t);
140 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
141 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
142 :
143 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_12;
144 1 : spdm_response->header.request_response_code = SPDM_SET_CERTIFICATE_RSP;
145 1 : spdm_response->header.param1 = 0;
146 1 : spdm_response->header.param2 = 0;
147 :
148 1 : libspdm_transport_test_encode_message(spdm_context, NULL, false,
149 : false, spdm_response_size,
150 : spdm_response, response_size,
151 : response);
152 : }
153 1 : return LIBSPDM_STATUS_SUCCESS;
154 :
155 0 : case 0x3: {
156 : spdm_set_certificate_response_t *spdm_response;
157 : size_t spdm_response_size;
158 : size_t transport_header_size;
159 :
160 0 : spdm_response_size = sizeof(spdm_set_certificate_response_t);
161 0 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
162 0 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
163 :
164 0 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_12;
165 0 : spdm_response->header.request_response_code = SPDM_SET_CERTIFICATE_RSP;
166 0 : spdm_response->header.param1 = 0;
167 0 : spdm_response->header.param2 = 0;
168 :
169 0 : libspdm_transport_test_encode_message(spdm_context, NULL, false,
170 : false, spdm_response_size,
171 : spdm_response, response_size,
172 : response);
173 : }
174 0 : return LIBSPDM_STATUS_SUCCESS;
175 :
176 0 : case 0x4: {
177 : spdm_set_certificate_response_t *spdm_response;
178 : size_t spdm_response_size;
179 : size_t transport_header_size;
180 :
181 0 : spdm_response_size = sizeof(spdm_set_certificate_response_t);
182 0 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
183 0 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
184 :
185 0 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_12;
186 0 : spdm_response->header.request_response_code = SPDM_SET_CERTIFICATE_RSP;
187 0 : spdm_response->header.param1 = 1;
188 0 : spdm_response->header.param2 = 0;
189 :
190 0 : libspdm_transport_test_encode_message(spdm_context, NULL, false,
191 : false, spdm_response_size,
192 : spdm_response, response_size,
193 : response);
194 : }
195 0 : return LIBSPDM_STATUS_SUCCESS;
196 :
197 1 : case 0x05: {
198 : spdm_set_certificate_response_t *spdm_response;
199 : size_t spdm_response_size;
200 : size_t transport_header_size;
201 : uint32_t session_id;
202 : libspdm_session_info_t *session_info;
203 : uint8_t *scratch_buffer;
204 : size_t scratch_buffer_size;
205 :
206 1 : session_id = 0xFFFFFFFF;
207 :
208 1 : spdm_response_size = sizeof(spdm_set_certificate_response_t);
209 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
210 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
211 :
212 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_12;
213 1 : spdm_response->header.request_response_code = SPDM_SET_CERTIFICATE_RSP;
214 : /*slot id is 1*/
215 1 : spdm_response->header.param1 = 1;
216 1 : spdm_response->header.param2 = 0;
217 :
218 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
219 : * transport_message is always in sender buffer. */
220 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
221 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
222 : scratch_buffer_size - transport_header_size,
223 : spdm_response, spdm_response_size);
224 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
225 1 : libspdm_transport_test_encode_message(spdm_context, &session_id, false,
226 : false, spdm_response_size,
227 : spdm_response, response_size,
228 : response);
229 1 : session_info = libspdm_get_session_info_via_session_id(
230 : spdm_context, session_id);
231 1 : if (session_info == NULL) {
232 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
233 : }
234 : /* WALKAROUND: If just use single context to encode message and then decode message */
235 : ((libspdm_secured_message_context_t
236 1 : *)(session_info->secured_message_context))
237 1 : ->application_secret.response_data_sequence_number--;
238 : }
239 1 : return LIBSPDM_STATUS_SUCCESS;
240 :
241 1 : case 0x6: {
242 : spdm_set_certificate_response_t *spdm_response;
243 : size_t spdm_response_size;
244 : size_t transport_header_size;
245 :
246 1 : spdm_response_size = sizeof(spdm_set_certificate_response_t);
247 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
248 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
249 :
250 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_12;
251 1 : spdm_response->header.request_response_code = SPDM_ERROR;
252 1 : spdm_response->header.param1 = SPDM_ERROR_CODE_RESET_REQUIRED;
253 1 : spdm_response->header.param2 = 0;
254 :
255 1 : libspdm_transport_test_encode_message(spdm_context, NULL, false,
256 : false, spdm_response_size,
257 : spdm_response, response_size,
258 : response);
259 : }
260 1 : return LIBSPDM_STATUS_SUCCESS;
261 :
262 1 : case 0x7: {
263 : spdm_set_certificate_response_t *spdm_response;
264 : size_t spdm_response_size;
265 : size_t transport_header_size;
266 :
267 1 : spdm_response_size = sizeof(spdm_set_certificate_response_t);
268 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
269 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
270 :
271 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
272 1 : spdm_response->header.request_response_code = SPDM_SET_CERTIFICATE_RSP;
273 1 : spdm_response->header.param1 = 0;
274 1 : spdm_response->header.param2 = 0;
275 :
276 1 : libspdm_transport_test_encode_message(spdm_context, NULL, false,
277 : false, spdm_response_size,
278 : spdm_response, response_size,
279 : response);
280 : }
281 1 : return LIBSPDM_STATUS_SUCCESS;
282 :
283 0 : case 0x8:
284 0 : assert_true(false);
285 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
286 :
287 1 : case 0x9: {
288 : spdm_set_certificate_response_t *spdm_response;
289 : size_t spdm_response_size;
290 : size_t transport_header_size;
291 :
292 1 : spdm_response_size = sizeof(spdm_set_certificate_response_t);
293 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
294 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
295 :
296 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
297 1 : spdm_response->header.request_response_code = SPDM_SET_CERTIFICATE_RSP;
298 1 : spdm_response->header.param1 = 3;
299 1 : spdm_response->header.param2 = 0;
300 :
301 1 : libspdm_transport_test_encode_message(spdm_context, NULL, false,
302 : false, spdm_response_size,
303 : spdm_response, response_size,
304 : response);
305 : }
306 1 : return LIBSPDM_STATUS_SUCCESS;
307 :
308 0 : default:
309 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
310 : }
311 : }
312 :
313 :
314 : /**
315 : * Test 1: message could not be sent
316 : * Expected Behavior: get a RETURN_DEVICE_ERROR return code
317 : **/
318 1 : void libspdm_test_requester_set_certificate_case1(void **state)
319 : {
320 : libspdm_return_t status;
321 : libspdm_test_context_t *spdm_test_context;
322 : libspdm_context_t *spdm_context;
323 :
324 : void *data;
325 : size_t data_size;
326 :
327 1 : spdm_test_context = *state;
328 1 : spdm_context = spdm_test_context->spdm_context;
329 1 : spdm_test_context->case_id = 0x1;
330 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
331 : SPDM_VERSION_NUMBER_SHIFT_BIT;
332 :
333 1 : spdm_context->connection_info.connection_state =
334 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
335 1 : spdm_context->connection_info.capability.flags |=
336 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
337 :
338 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
339 : m_libspdm_use_asym_algo,
340 : &data, &data_size, NULL, NULL);
341 :
342 1 : status = libspdm_set_certificate(spdm_context, NULL, 0, data, data_size);
343 :
344 1 : assert_int_equal(status, LIBSPDM_STATUS_SEND_FAIL);
345 1 : free(data);
346 1 : }
347 :
348 : /**
349 : * Test 2: Successful response to set certificate for slot 0
350 : * Expected Behavior: get a RETURN_SUCCESS return code
351 : **/
352 1 : void libspdm_test_requester_set_certificate_case2(void **state)
353 : {
354 : libspdm_return_t status;
355 : libspdm_test_context_t *spdm_test_context;
356 : libspdm_context_t *spdm_context;
357 :
358 : void *data;
359 : size_t data_size;
360 :
361 1 : spdm_test_context = *state;
362 1 : spdm_context = spdm_test_context->spdm_context;
363 1 : spdm_test_context->case_id = 0x2;
364 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
365 : SPDM_VERSION_NUMBER_SHIFT_BIT;
366 :
367 1 : spdm_context->connection_info.connection_state =
368 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
369 1 : spdm_context->connection_info.capability.flags |=
370 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
371 :
372 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
373 : m_libspdm_use_asym_algo,
374 : &data, &data_size, NULL, NULL);
375 :
376 1 : status = libspdm_set_certificate(spdm_context, NULL, 0, data, data_size);
377 :
378 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
379 1 : free(data);
380 1 : }
381 :
382 : /**
383 : * Test 3: Unsuccessful response to set certificate for slot 0, because cert_chain is NULL.
384 : * Expected Behavior: get a LIBSPDM_STATUS_INVALID_PARAMETER return code
385 : **/
386 1 : void libspdm_test_requester_set_certificate_case3(void **state)
387 : {
388 : libspdm_return_t status;
389 : libspdm_test_context_t *spdm_test_context;
390 : libspdm_context_t *spdm_context;
391 :
392 1 : spdm_test_context = *state;
393 1 : spdm_context = spdm_test_context->spdm_context;
394 1 : spdm_test_context->case_id = 0x3;
395 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
396 : SPDM_VERSION_NUMBER_SHIFT_BIT;
397 :
398 1 : spdm_context->connection_info.connection_state =
399 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
400 1 : spdm_context->connection_info.capability.flags |=
401 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
402 :
403 1 : status = libspdm_set_certificate(spdm_context, NULL, 0, NULL, 0);
404 :
405 1 : assert_int_equal(status, LIBSPDM_STATUS_INVALID_PARAMETER);
406 1 : }
407 :
408 : /**
409 : * Test 5: Successful response to set certificate for slot 1 in secure session
410 : * Expected Behavior: get a RETURN_SUCCESS return code
411 : **/
412 1 : void libspdm_test_requester_set_certificate_case5(void **state)
413 : {
414 : libspdm_return_t status;
415 : libspdm_test_context_t *spdm_test_context;
416 : libspdm_context_t *spdm_context;
417 : uint32_t session_id;
418 : libspdm_session_info_t *session_info;
419 :
420 : void *data;
421 : size_t data_size;
422 :
423 1 : spdm_test_context = *state;
424 1 : spdm_context = spdm_test_context->spdm_context;
425 1 : spdm_test_context->case_id = 0x05;
426 1 : spdm_context->connection_info.connection_state =
427 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
428 :
429 1 : spdm_context->connection_info.capability.flags |=
430 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
431 1 : spdm_context->connection_info.capability.flags |=
432 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
433 1 : spdm_context->connection_info.capability.flags |=
434 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
435 1 : spdm_context->connection_info.capability.flags |=
436 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
437 1 : spdm_context->local_context.capability.flags |=
438 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
439 1 : spdm_context->local_context.capability.flags |=
440 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
441 1 : spdm_context->local_context.capability.flags |=
442 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
443 1 : spdm_context->connection_info.capability.flags |=
444 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
445 1 : spdm_context->connection_info.algorithm.dhe_named_group =
446 : m_libspdm_use_dhe_algo;
447 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
448 : m_libspdm_use_aead_algo;
449 :
450 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
451 : m_libspdm_use_asym_algo, &data,
452 : &data_size, NULL, NULL);
453 :
454 1 : session_id = 0xFFFFFFFF;
455 1 : session_info = &spdm_context->session_info[0];
456 1 : libspdm_session_info_init(spdm_context, session_info, session_id, true);
457 1 : libspdm_secured_message_set_session_state(session_info->secured_message_context,
458 : LIBSPDM_SESSION_STATE_ESTABLISHED);
459 :
460 : /* slot id is 1*/
461 1 : status = libspdm_set_certificate(spdm_context, &session_id, 1, data, data_size);
462 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
463 :
464 1 : free(data);
465 1 : }
466 :
467 : /**
468 : * Test 6: Successful response to set certificate for slot 0 with a reset required
469 : * Expected Behavior: get a RETURN_SUCCESS return code
470 : **/
471 1 : void libspdm_test_requester_set_certificate_case6(void **state)
472 : {
473 : libspdm_return_t status;
474 : libspdm_test_context_t *spdm_test_context;
475 : libspdm_context_t *spdm_context;
476 :
477 : void *data;
478 : size_t data_size;
479 :
480 1 : spdm_test_context = *state;
481 1 : spdm_context = spdm_test_context->spdm_context;
482 1 : spdm_test_context->case_id = 0x6;
483 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
484 : SPDM_VERSION_NUMBER_SHIFT_BIT;
485 :
486 1 : spdm_context->connection_info.connection_state =
487 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
488 1 : spdm_context->connection_info.capability.flags |=
489 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP |
490 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_INSTALL_RESET_CAP;
491 :
492 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
493 : m_libspdm_use_asym_algo,
494 : &data, &data_size, NULL, NULL);
495 :
496 1 : status = libspdm_set_certificate(spdm_context, NULL, 0, data, data_size);
497 :
498 1 : assert_int_equal(status, LIBSPDM_STATUS_RESET_REQUIRED_PEER);
499 1 : free(data);
500 1 : }
501 :
502 : /**
503 : * Test 7: Successful response to erase certificate for slot 0
504 : * Expected Behavior: get a RETURN_SUCCESS return code
505 : **/
506 1 : void libspdm_test_requester_set_certificate_case7(void **state)
507 : {
508 : libspdm_return_t status;
509 : libspdm_test_context_t *spdm_test_context;
510 : libspdm_context_t *spdm_context;
511 :
512 1 : spdm_test_context = *state;
513 1 : spdm_context = spdm_test_context->spdm_context;
514 1 : spdm_test_context->case_id = 0x7;
515 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
516 : SPDM_VERSION_NUMBER_SHIFT_BIT;
517 :
518 1 : spdm_context->connection_info.connection_state =
519 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
520 1 : spdm_context->connection_info.capability.flags |=
521 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
522 :
523 1 : status = libspdm_set_certificate_ex(spdm_context, NULL, 0, NULL, 0,
524 : SPDM_SET_CERTIFICATE_REQUEST_ATTRIBUTES_ERASE, 0);
525 :
526 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
527 1 : }
528 :
529 : /**
530 : * Test 8: Illegal combination of MULTI_KEY_CONN_RSP = true, Erase = false, and SetCertModel = 0.
531 : * Expected Behavior: function returns LIBSPDM_STATUS_INVALID_PARAMETER.
532 : **/
533 1 : void libspdm_test_requester_set_certificate_case8(void **state)
534 : {
535 : libspdm_return_t status;
536 : libspdm_test_context_t *spdm_test_context;
537 : libspdm_context_t *spdm_context;
538 :
539 : void *data;
540 : size_t data_size;
541 :
542 1 : spdm_test_context = *state;
543 1 : spdm_context = spdm_test_context->spdm_context;
544 1 : spdm_test_context->case_id = 0x8;
545 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
546 : SPDM_VERSION_NUMBER_SHIFT_BIT;
547 :
548 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
549 1 : spdm_context->connection_info.capability.flags |=
550 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
551 1 : spdm_context->connection_info.multi_key_conn_rsp = true;
552 :
553 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
554 : m_libspdm_use_asym_algo,
555 : &data, &data_size, NULL, NULL);
556 :
557 1 : status = libspdm_set_certificate_ex(spdm_context, NULL, 0, data, data_size,
558 : (SPDM_CERTIFICATE_INFO_CERT_MODEL_NONE <<
559 : SPDM_SET_CERTIFICATE_REQUEST_ATTRIBUTES_CERT_MODEL_OFFSET),
560 : 1);
561 :
562 1 : assert_int_equal(status, LIBSPDM_STATUS_INVALID_PARAMETER);
563 1 : }
564 :
565 : /**
566 : * Test 9: Set MULTI_KEY_CONN_RSP = true, Erase = false, and SetCertModel = DeviceCert.
567 : * Expected Behavior: function returns LIBSPDM_STATUS_SUCCESS.
568 : **/
569 1 : void libspdm_test_requester_set_certificate_case9(void **state)
570 : {
571 : libspdm_return_t status;
572 : libspdm_test_context_t *spdm_test_context;
573 : libspdm_context_t *spdm_context;
574 :
575 : void *data;
576 : size_t data_size;
577 :
578 1 : spdm_test_context = *state;
579 1 : spdm_context = spdm_test_context->spdm_context;
580 1 : spdm_test_context->case_id = 0x9;
581 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
582 : SPDM_VERSION_NUMBER_SHIFT_BIT;
583 :
584 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
585 1 : spdm_context->connection_info.capability.flags |=
586 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
587 1 : spdm_context->connection_info.multi_key_conn_rsp = true;
588 :
589 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
590 : m_libspdm_use_asym_algo,
591 : &data, &data_size, NULL, NULL);
592 :
593 1 : status = libspdm_set_certificate_ex(spdm_context, NULL, 3, data, data_size,
594 : (SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT <<
595 : SPDM_SET_CERTIFICATE_REQUEST_ATTRIBUTES_CERT_MODEL_OFFSET),
596 : 1);
597 :
598 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
599 1 : }
600 :
601 1 : int libspdm_requester_set_certificate_test_main(void)
602 : {
603 1 : const struct CMUnitTest spdm_requester_set_certificate_tests[] = {
604 : /* SendRequest failed*/
605 : cmocka_unit_test(libspdm_test_requester_set_certificate_case1),
606 : /* Successful response to set certificate*/
607 : cmocka_unit_test(libspdm_test_requester_set_certificate_case2),
608 : /* Set null cert_chain for slot 0*/
609 : cmocka_unit_test(libspdm_test_requester_set_certificate_case3),
610 : /* Successful response to set certificate for slot 1 in secure session*/
611 : cmocka_unit_test(libspdm_test_requester_set_certificate_case5),
612 : /* Successful response to set certificate with a reset required */
613 : cmocka_unit_test(libspdm_test_requester_set_certificate_case6),
614 : /* Successful response to erase certificate*/
615 : cmocka_unit_test(libspdm_test_requester_set_certificate_case7),
616 : cmocka_unit_test(libspdm_test_requester_set_certificate_case8),
617 : cmocka_unit_test(libspdm_test_requester_set_certificate_case9),
618 : };
619 :
620 1 : libspdm_test_context_t test_context = {
621 : LIBSPDM_TEST_CONTEXT_VERSION,
622 : true,
623 : libspdm_requester_set_certificate_test_send_message,
624 : libspdm_requester_set_certificate_test_receive_message,
625 : };
626 :
627 1 : libspdm_setup_test_context(&test_context);
628 :
629 1 : return cmocka_run_group_tests(spdm_requester_set_certificate_tests,
630 : libspdm_unit_test_group_setup,
631 : libspdm_unit_test_group_teardown);
632 : }
633 :
634 : #endif /* LIBSPDM_ENABLE_CAPABILITY_SET_CERT_CAP*/
|