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_requester_lib.h"
9 : #include "internal/libspdm_secured_message_lib.h"
10 :
11 : #if LIBSPDM_ENABLE_CAPABILITY_PSK_CAP
12 :
13 : static uint8_t m_libspdm_dummy_key_buffer[LIBSPDM_MAX_AEAD_KEY_SIZE];
14 : static uint8_t m_libspdm_dummy_salt_buffer[LIBSPDM_MAX_AEAD_IV_SIZE];
15 :
16 : static size_t m_libspdm_local_buffer_size;
17 : static uint8_t m_libspdm_local_buffer[LIBSPDM_MAX_MESSAGE_TH_BUFFER_SIZE];
18 :
19 34 : static void libspdm_secured_message_set_dummy_finished_key(
20 : void *spdm_secured_message_context)
21 : {
22 34 : }
23 :
24 33 : void libspdm_secured_message_set_response_handshake_encryption_key(
25 : void *spdm_secured_message_context, const void *key, size_t key_size)
26 : {
27 : libspdm_secured_message_context_t *secured_message_context;
28 :
29 33 : secured_message_context = spdm_secured_message_context;
30 33 : LIBSPDM_ASSERT(key_size == secured_message_context->aead_key_size);
31 33 : libspdm_copy_mem(secured_message_context->handshake_secret.response_handshake_encryption_key,
32 : sizeof(secured_message_context->handshake_secret.
33 : response_handshake_encryption_key),
34 : key, secured_message_context->aead_key_size);
35 33 : }
36 :
37 33 : void libspdm_secured_message_set_response_handshake_salt(
38 : void *spdm_secured_message_context, const void *salt,
39 : size_t salt_size)
40 : {
41 : libspdm_secured_message_context_t *secured_message_context;
42 :
43 33 : secured_message_context = spdm_secured_message_context;
44 33 : LIBSPDM_ASSERT(salt_size == secured_message_context->aead_iv_size);
45 33 : libspdm_copy_mem(secured_message_context->handshake_secret.response_handshake_salt,
46 : sizeof(secured_message_context->handshake_secret.response_handshake_salt),
47 : salt, secured_message_context->aead_iv_size);
48 33 : }
49 :
50 34 : libspdm_return_t libspdm_requester_psk_finish_test_send_message(void *spdm_context,
51 : size_t request_size,
52 : const void *request,
53 : uint64_t timeout)
54 : {
55 : libspdm_test_context_t *spdm_test_context;
56 :
57 34 : spdm_test_context = libspdm_get_test_context();
58 34 : switch (spdm_test_context->case_id) {
59 1 : case 0x1:
60 1 : return LIBSPDM_STATUS_SEND_FAIL;
61 1 : case 0x2:
62 1 : return LIBSPDM_STATUS_SUCCESS;
63 0 : case 0x3:
64 0 : return LIBSPDM_STATUS_SUCCESS;
65 1 : case 0x4:
66 1 : return LIBSPDM_STATUS_SUCCESS;
67 1 : case 0x5:
68 1 : return LIBSPDM_STATUS_SUCCESS;
69 2 : case 0x6:
70 2 : return LIBSPDM_STATUS_SUCCESS;
71 1 : case 0x7:
72 1 : return LIBSPDM_STATUS_SUCCESS;
73 2 : case 0x8:
74 2 : return LIBSPDM_STATUS_SUCCESS;
75 2 : case 0x9:
76 2 : return LIBSPDM_STATUS_SUCCESS;
77 18 : case 0xA:
78 18 : return LIBSPDM_STATUS_SUCCESS;
79 1 : case 0xB:
80 1 : return LIBSPDM_STATUS_SUCCESS;
81 0 : case 0xC:
82 0 : return LIBSPDM_STATUS_SUCCESS;
83 1 : case 0xD:
84 1 : return LIBSPDM_STATUS_SUCCESS;
85 0 : case 0xE:
86 0 : return LIBSPDM_STATUS_SUCCESS;
87 1 : case 0xF:
88 1 : return LIBSPDM_STATUS_SUCCESS;
89 2 : case 0x10:
90 : case 0x11:
91 : {
92 : libspdm_return_t status;
93 : uint8_t *decoded_message;
94 : size_t decoded_message_size;
95 : uint32_t session_id;
96 : uint32_t *message_session_id;
97 : bool is_app_message;
98 : libspdm_session_info_t *session_info;
99 : uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
100 :
101 2 : message_session_id = NULL;
102 2 : session_id = 0xFFFFFFFF;
103 2 : decoded_message = (uint8_t *) &m_libspdm_local_buffer[0];
104 2 : decoded_message_size = sizeof(m_libspdm_local_buffer);
105 :
106 2 : session_info = libspdm_get_session_info_via_session_id(spdm_context, session_id);
107 2 : if (session_info == NULL) {
108 0 : return LIBSPDM_STATUS_SEND_FAIL;
109 : }
110 :
111 2 : memcpy(message_buffer, request, request_size);
112 :
113 2 : ((libspdm_secured_message_context_t *)(session_info->secured_message_context))
114 2 : ->handshake_secret.request_handshake_sequence_number--;
115 2 : m_libspdm_local_buffer_size = 0;
116 2 : libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message, &decoded_message_size);
117 2 : status = libspdm_transport_test_decode_message(
118 : spdm_context,
119 : &message_session_id, &is_app_message, true, request_size, message_buffer,
120 : &decoded_message_size, (void **)&decoded_message);
121 2 : if (LIBSPDM_STATUS_IS_ERROR(status)) {
122 0 : return LIBSPDM_STATUS_SEND_FAIL;
123 : }
124 2 : libspdm_copy_mem(&m_libspdm_local_buffer[m_libspdm_local_buffer_size],
125 : sizeof(m_libspdm_local_buffer) - m_libspdm_local_buffer_size,
126 : decoded_message, decoded_message_size);
127 2 : m_libspdm_local_buffer_size += decoded_message_size;
128 : }
129 2 : return LIBSPDM_STATUS_SUCCESS;
130 0 : default:
131 0 : return LIBSPDM_STATUS_SEND_FAIL;
132 : }
133 : }
134 :
135 33 : libspdm_return_t libspdm_requester_psk_finish_test_receive_message(
136 : void *spdm_context, size_t *response_size,
137 : void **response, uint64_t timeout)
138 : {
139 : libspdm_test_context_t *spdm_test_context;
140 :
141 33 : spdm_test_context = libspdm_get_test_context();
142 33 : switch (spdm_test_context->case_id) {
143 0 : case 0x1:
144 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
145 :
146 1 : case 0x2: {
147 : spdm_psk_finish_response_t *spdm_response;
148 : size_t spdm_response_size;
149 : size_t transport_header_size;
150 : uint32_t session_id;
151 : libspdm_session_info_t *session_info;
152 : uint8_t *scratch_buffer;
153 : size_t scratch_buffer_size;
154 :
155 1 : session_id = 0xFFFFFFFF;
156 1 : spdm_response_size = sizeof(spdm_psk_finish_response_t);
157 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
158 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
159 :
160 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
161 1 : spdm_response->header.request_response_code =
162 : SPDM_PSK_FINISH_RSP;
163 1 : spdm_response->header.param1 = 0;
164 1 : spdm_response->header.param2 = 0;
165 :
166 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
167 : * transport_message is always in sender buffer. */
168 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
169 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
170 : scratch_buffer_size - transport_header_size,
171 : spdm_response, spdm_response_size);
172 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
173 1 : libspdm_transport_test_encode_message(spdm_context, &session_id,
174 : false, false, spdm_response_size,
175 : spdm_response, response_size,
176 : response);
177 1 : session_info = libspdm_get_session_info_via_session_id(
178 : spdm_context, session_id);
179 1 : if (session_info == NULL) {
180 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
181 : }
182 : /* WALKAROUND: If just use single context to encode message and then decode message */
183 : ((libspdm_secured_message_context_t
184 1 : *)(session_info->secured_message_context))
185 1 : ->handshake_secret.response_handshake_sequence_number--;
186 : }
187 1 : return LIBSPDM_STATUS_SUCCESS;
188 :
189 0 : case 0x3: {
190 : spdm_psk_finish_response_t *spdm_response;
191 : size_t spdm_response_size;
192 : size_t transport_header_size;
193 : uint32_t session_id;
194 : libspdm_session_info_t *session_info;
195 : uint8_t *scratch_buffer;
196 : size_t scratch_buffer_size;
197 :
198 0 : session_id = 0xFFFFFFFF;
199 0 : spdm_response_size = sizeof(spdm_psk_finish_response_t);
200 0 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
201 0 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
202 :
203 0 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
204 0 : spdm_response->header.request_response_code =
205 : SPDM_PSK_FINISH_RSP;
206 0 : spdm_response->header.param1 = 0;
207 0 : spdm_response->header.param2 = 0;
208 :
209 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
210 : * transport_message is always in sender buffer. */
211 0 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
212 0 : libspdm_copy_mem (scratch_buffer + transport_header_size,
213 : scratch_buffer_size - transport_header_size,
214 : spdm_response, spdm_response_size);
215 0 : spdm_response = (void *)(scratch_buffer + transport_header_size);
216 0 : libspdm_transport_test_encode_message(spdm_context, &session_id,
217 : false, false, spdm_response_size,
218 : spdm_response, response_size,
219 : response);
220 0 : session_info = libspdm_get_session_info_via_session_id(
221 : spdm_context, session_id);
222 0 : if (session_info == NULL) {
223 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
224 : }
225 : ((libspdm_secured_message_context_t
226 0 : *)(session_info->secured_message_context))
227 0 : ->handshake_secret.response_handshake_sequence_number--;
228 : }
229 0 : return LIBSPDM_STATUS_SUCCESS;
230 :
231 1 : case 0x4: {
232 : spdm_error_response_t *spdm_response;
233 : size_t spdm_response_size;
234 : size_t transport_header_size;
235 : uint32_t session_id;
236 : libspdm_session_info_t *session_info;
237 : uint8_t *scratch_buffer;
238 : size_t scratch_buffer_size;
239 :
240 1 : spdm_response_size = sizeof(spdm_error_response_t);
241 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
242 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
243 :
244 1 : session_id = 0xFFFFFFFF;
245 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
246 1 : spdm_response->header.request_response_code = SPDM_ERROR;
247 1 : spdm_response->header.param1 = SPDM_ERROR_CODE_INVALID_REQUEST;
248 1 : spdm_response->header.param2 = 0;
249 :
250 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
251 : * transport_message is always in sender buffer. */
252 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
253 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
254 : scratch_buffer_size - transport_header_size,
255 : spdm_response, spdm_response_size);
256 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
257 1 : libspdm_transport_test_encode_message(spdm_context, &session_id,
258 : false, false,
259 : spdm_response_size,
260 : spdm_response,
261 : response_size, response);
262 1 : session_info = libspdm_get_session_info_via_session_id(
263 : spdm_context, session_id);
264 1 : if (session_info == NULL) {
265 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
266 : }
267 : ((libspdm_secured_message_context_t
268 1 : *)(session_info->secured_message_context))
269 1 : ->handshake_secret.response_handshake_sequence_number--;
270 : }
271 1 : return LIBSPDM_STATUS_SUCCESS;
272 :
273 1 : case 0x5: {
274 : spdm_error_response_t *spdm_response;
275 : size_t spdm_response_size;
276 : size_t transport_header_size;
277 : uint32_t session_id;
278 : libspdm_session_info_t *session_info;
279 : uint8_t *scratch_buffer;
280 : size_t scratch_buffer_size;
281 :
282 1 : spdm_response_size = sizeof(spdm_error_response_t);
283 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
284 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
285 :
286 1 : session_id = 0xFFFFFFFF;
287 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
288 1 : spdm_response->header.request_response_code = SPDM_ERROR;
289 1 : spdm_response->header.param1 = SPDM_ERROR_CODE_BUSY;
290 1 : spdm_response->header.param2 = 0;
291 :
292 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
293 : * transport_message is always in sender buffer. */
294 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
295 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
296 : scratch_buffer_size - transport_header_size,
297 : spdm_response, spdm_response_size);
298 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
299 1 : libspdm_transport_test_encode_message(spdm_context, &session_id,
300 : false, false,
301 : spdm_response_size,
302 : spdm_response,
303 : response_size, response);
304 1 : session_info = libspdm_get_session_info_via_session_id(
305 : spdm_context, session_id);
306 1 : if (session_info == NULL) {
307 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
308 : }
309 : ((libspdm_secured_message_context_t
310 1 : *)(session_info->secured_message_context))
311 1 : ->handshake_secret.response_handshake_sequence_number--;
312 : }
313 1 : return LIBSPDM_STATUS_SUCCESS;
314 :
315 2 : case 0x6: {
316 : static size_t sub_index1 = 0;
317 2 : if (sub_index1 == 0) {
318 : spdm_error_response_t *spdm_response;
319 : size_t spdm_response_size;
320 : size_t transport_header_size;
321 : uint32_t session_id;
322 : libspdm_session_info_t *session_info;
323 : uint8_t *scratch_buffer;
324 : size_t scratch_buffer_size;
325 :
326 1 : spdm_response_size = sizeof(spdm_error_response_t);
327 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
328 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
329 :
330 1 : session_id = 0xFFFFFFFF;
331 1 : spdm_response->header.spdm_version =
332 : SPDM_MESSAGE_VERSION_11;
333 1 : spdm_response->header.request_response_code = SPDM_ERROR;
334 1 : spdm_response->header.param1 = SPDM_ERROR_CODE_BUSY;
335 1 : spdm_response->header.param2 = 0;
336 :
337 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
338 : * transport_message is always in sender buffer. */
339 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
340 : &scratch_buffer_size);
341 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
342 : scratch_buffer_size - transport_header_size,
343 : spdm_response, spdm_response_size);
344 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
345 1 : libspdm_transport_test_encode_message(
346 : spdm_context, &session_id, false, false,
347 : spdm_response_size, spdm_response,
348 : response_size, response);
349 1 : sub_index1++;
350 1 : session_info = libspdm_get_session_info_via_session_id(
351 : spdm_context, session_id);
352 1 : if (session_info == NULL) {
353 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
354 : }
355 : ((libspdm_secured_message_context_t
356 1 : *)(session_info->secured_message_context))
357 : ->handshake_secret
358 1 : .response_handshake_sequence_number--;
359 1 : } else if (sub_index1 == 1) {
360 : spdm_psk_finish_response_t *spdm_response;
361 : size_t spdm_response_size;
362 : size_t transport_header_size;
363 : uint32_t session_id;
364 : libspdm_session_info_t *session_info;
365 : uint8_t *scratch_buffer;
366 : size_t scratch_buffer_size;
367 :
368 1 : session_id = 0xFFFFFFFF;
369 1 : spdm_response_size = sizeof(spdm_psk_finish_response_t);
370 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
371 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
372 :
373 1 : spdm_response->header.spdm_version =
374 : SPDM_MESSAGE_VERSION_11;
375 1 : spdm_response->header.request_response_code =
376 : SPDM_PSK_FINISH_RSP;
377 1 : spdm_response->header.param1 = 0;
378 1 : spdm_response->header.param2 = 0;
379 :
380 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
381 : * transport_message is always in sender buffer. */
382 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
383 : &scratch_buffer_size);
384 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
385 : scratch_buffer_size - transport_header_size,
386 : spdm_response, spdm_response_size);
387 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
388 1 : libspdm_transport_test_encode_message(
389 : spdm_context, &session_id, false, false,
390 : spdm_response_size, spdm_response, response_size,
391 : response);
392 1 : session_info = libspdm_get_session_info_via_session_id(
393 : spdm_context, session_id);
394 1 : if (session_info == NULL) {
395 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
396 : }
397 : ((libspdm_secured_message_context_t
398 1 : *)(session_info->secured_message_context))
399 : ->handshake_secret
400 1 : .response_handshake_sequence_number--;
401 : }
402 : }
403 2 : return LIBSPDM_STATUS_SUCCESS;
404 :
405 1 : case 0x7: {
406 : spdm_error_response_t *spdm_response;
407 : size_t spdm_response_size;
408 : size_t transport_header_size;
409 : uint32_t session_id;
410 : libspdm_session_info_t *session_info;
411 : uint8_t *scratch_buffer;
412 : size_t scratch_buffer_size;
413 :
414 1 : spdm_response_size = sizeof(spdm_error_response_t);
415 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
416 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
417 :
418 1 : session_id = 0xFFFFFFFF;
419 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_10;
420 1 : spdm_response->header.request_response_code = SPDM_ERROR;
421 1 : spdm_response->header.param1 = SPDM_ERROR_CODE_REQUEST_RESYNCH;
422 1 : spdm_response->header.param2 = 0;
423 :
424 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
425 : * transport_message is always in sender buffer. */
426 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
427 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
428 : scratch_buffer_size - transport_header_size,
429 : spdm_response, spdm_response_size);
430 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
431 1 : libspdm_transport_test_encode_message(spdm_context, &session_id,
432 : false, false,
433 : spdm_response_size,
434 : spdm_response,
435 : response_size, response);
436 1 : session_info = libspdm_get_session_info_via_session_id(
437 : spdm_context, session_id);
438 1 : if (session_info == NULL) {
439 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
440 : }
441 : ((libspdm_secured_message_context_t
442 1 : *)(session_info->secured_message_context))
443 1 : ->handshake_secret.response_handshake_sequence_number--;
444 : }
445 1 : return LIBSPDM_STATUS_SUCCESS;
446 :
447 2 : case 0x8: {
448 : spdm_error_response_data_response_not_ready_t *spdm_response;
449 : size_t spdm_response_size;
450 : size_t transport_header_size;
451 : uint32_t session_id;
452 : libspdm_session_info_t *session_info;
453 : uint8_t *scratch_buffer;
454 : size_t scratch_buffer_size;
455 :
456 2 : spdm_response_size = sizeof(spdm_error_response_data_response_not_ready_t);
457 2 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
458 2 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
459 :
460 2 : session_id = 0xFFFFFFFF;
461 2 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
462 2 : spdm_response->header.request_response_code = SPDM_ERROR;
463 2 : spdm_response->header.param1 =
464 : SPDM_ERROR_CODE_RESPONSE_NOT_READY;
465 2 : spdm_response->header.param2 = 0;
466 2 : spdm_response->extend_error_data.rd_exponent = 1;
467 2 : spdm_response->extend_error_data.rd_tm = 2;
468 2 : spdm_response->extend_error_data.request_code = SPDM_PSK_FINISH;
469 2 : spdm_response->extend_error_data.token = 0;
470 :
471 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
472 : * transport_message is always in sender buffer. */
473 2 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
474 2 : libspdm_copy_mem (scratch_buffer + transport_header_size,
475 : scratch_buffer_size - transport_header_size,
476 : spdm_response, spdm_response_size);
477 2 : spdm_response = (void *)(scratch_buffer + transport_header_size);
478 2 : libspdm_transport_test_encode_message(spdm_context, &session_id,
479 : false, false,
480 : spdm_response_size,
481 : spdm_response,
482 : response_size, response);
483 2 : session_info = libspdm_get_session_info_via_session_id(
484 : spdm_context, session_id);
485 2 : if (session_info == NULL) {
486 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
487 : }
488 : ((libspdm_secured_message_context_t
489 2 : *)(session_info->secured_message_context))
490 2 : ->handshake_secret.response_handshake_sequence_number--;
491 : }
492 2 : return LIBSPDM_STATUS_SUCCESS;
493 :
494 2 : case 0x9: {
495 : static size_t sub_index2 = 0;
496 2 : if (sub_index2 == 0) {
497 : spdm_error_response_data_response_not_ready_t
498 : *spdm_response;
499 : size_t spdm_response_size;
500 : size_t transport_header_size;
501 : uint32_t session_id;
502 : libspdm_session_info_t *session_info;
503 : uint8_t *scratch_buffer;
504 : size_t scratch_buffer_size;
505 :
506 1 : spdm_response_size = sizeof(spdm_error_response_data_response_not_ready_t);
507 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
508 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
509 :
510 1 : session_id = 0xFFFFFFFF;
511 1 : spdm_response->header.spdm_version =
512 : SPDM_MESSAGE_VERSION_11;
513 1 : spdm_response->header.request_response_code = SPDM_ERROR;
514 1 : spdm_response->header.param1 =
515 : SPDM_ERROR_CODE_RESPONSE_NOT_READY;
516 1 : spdm_response->header.param2 = 0;
517 1 : spdm_response->extend_error_data.rd_exponent = 1;
518 1 : spdm_response->extend_error_data.rd_tm = 2;
519 1 : spdm_response->extend_error_data.request_code =
520 : SPDM_PSK_FINISH;
521 1 : spdm_response->extend_error_data.token = 1;
522 :
523 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
524 : * transport_message is always in sender buffer. */
525 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
526 : &scratch_buffer_size);
527 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
528 : scratch_buffer_size - transport_header_size,
529 : spdm_response, spdm_response_size);
530 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
531 1 : libspdm_transport_test_encode_message(
532 : spdm_context, &session_id, false, false,
533 : spdm_response_size, spdm_response,
534 : response_size, response);
535 1 : sub_index2++;
536 1 : session_info = libspdm_get_session_info_via_session_id(
537 : spdm_context, session_id);
538 1 : if (session_info == NULL) {
539 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
540 : }
541 : ((libspdm_secured_message_context_t
542 1 : *)(session_info->secured_message_context))
543 : ->handshake_secret
544 1 : .response_handshake_sequence_number--;
545 1 : } else if (sub_index2 == 1) {
546 : spdm_psk_finish_response_t *spdm_response;
547 : size_t spdm_response_size;
548 : size_t transport_header_size;
549 : uint32_t session_id;
550 : libspdm_session_info_t *session_info;
551 : uint8_t *scratch_buffer;
552 : size_t scratch_buffer_size;
553 :
554 1 : session_id = 0xFFFFFFFF;
555 1 : spdm_response_size = sizeof(spdm_psk_finish_response_t);
556 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
557 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
558 :
559 1 : spdm_response->header.spdm_version =
560 : SPDM_MESSAGE_VERSION_11;
561 1 : spdm_response->header.request_response_code =
562 : SPDM_PSK_FINISH_RSP;
563 1 : spdm_response->header.param1 = 0;
564 1 : spdm_response->header.param2 = 0;
565 :
566 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
567 : * transport_message is always in sender buffer. */
568 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
569 : &scratch_buffer_size);
570 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
571 : scratch_buffer_size - transport_header_size,
572 : spdm_response, spdm_response_size);
573 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
574 1 : libspdm_transport_test_encode_message(
575 : spdm_context, &session_id, false, false,
576 : spdm_response_size, spdm_response, response_size,
577 : response);
578 1 : session_info = libspdm_get_session_info_via_session_id(
579 : spdm_context, session_id);
580 1 : if (session_info == NULL) {
581 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
582 : }
583 : ((libspdm_secured_message_context_t
584 1 : *)(session_info->secured_message_context))
585 : ->handshake_secret
586 1 : .response_handshake_sequence_number--;
587 : }
588 : }
589 2 : return LIBSPDM_STATUS_SUCCESS;
590 :
591 18 : case 0xA:
592 : {
593 : static uint16_t error_code = LIBSPDM_ERROR_CODE_RESERVED_00;
594 :
595 : spdm_error_response_t *spdm_response;
596 : size_t spdm_response_size;
597 : size_t transport_header_size;
598 : uint32_t session_id;
599 : libspdm_session_info_t *session_info;
600 : uint8_t *scratch_buffer;
601 : size_t scratch_buffer_size;
602 :
603 18 : session_id = 0xFFFFFFFF;
604 :
605 18 : spdm_response_size = sizeof(spdm_error_response_t);
606 18 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
607 18 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
608 :
609 18 : if(error_code <= 0xff) {
610 18 : libspdm_zero_mem (spdm_response, spdm_response_size);
611 18 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
612 18 : spdm_response->header.request_response_code = SPDM_ERROR;
613 18 : spdm_response->header.param1 = (uint8_t) error_code;
614 18 : spdm_response->header.param2 = 0;
615 :
616 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
617 : * transport_message is always in sender buffer. */
618 18 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
619 : &scratch_buffer_size);
620 18 : libspdm_copy_mem (scratch_buffer + transport_header_size,
621 : scratch_buffer_size - transport_header_size,
622 : spdm_response, spdm_response_size);
623 18 : spdm_response = (void *)(scratch_buffer + transport_header_size);
624 18 : libspdm_transport_test_encode_message (spdm_context, &session_id, false, false,
625 : spdm_response_size, spdm_response,
626 : response_size, response);
627 18 : session_info = libspdm_get_session_info_via_session_id (spdm_context, session_id);
628 18 : ((libspdm_secured_message_context_t*)(session_info->secured_message_context))->
629 18 : handshake_secret.response_handshake_sequence_number--;
630 : }
631 :
632 18 : error_code++;
633 18 : if(error_code == SPDM_ERROR_CODE_BUSY) { /*busy is treated in cases 5 and 6*/
634 1 : error_code = SPDM_ERROR_CODE_UNEXPECTED_REQUEST;
635 : }
636 18 : if(error_code == LIBSPDM_ERROR_CODE_RESERVED_0D) { /*skip some reserved error codes (0d to 3e)*/
637 1 : error_code = LIBSPDM_ERROR_CODE_RESERVED_3F;
638 : }
639 18 : if(error_code == SPDM_ERROR_CODE_RESPONSE_NOT_READY) { /*skip response not ready, request resync, and some reserved codes (44 to fc)*/
640 1 : error_code = LIBSPDM_ERROR_CODE_RESERVED_FD;
641 : }
642 : }
643 18 : return LIBSPDM_STATUS_SUCCESS;
644 1 : case 0xB: {
645 : spdm_psk_finish_response_t *spdm_response;
646 : size_t spdm_response_size;
647 : size_t transport_header_size;
648 : uint32_t session_id;
649 : libspdm_session_info_t *session_info;
650 : uint8_t *scratch_buffer;
651 : size_t scratch_buffer_size;
652 :
653 1 : session_id = 0xFFFFFFFF;
654 1 : spdm_response_size = sizeof(spdm_psk_finish_response_t);
655 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
656 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
657 :
658 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
659 1 : spdm_response->header.request_response_code =
660 : SPDM_PSK_FINISH_RSP;
661 1 : spdm_response->header.param1 = 0;
662 1 : spdm_response->header.param2 = 0;
663 :
664 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
665 : * transport_message is always in sender buffer. */
666 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
667 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
668 : scratch_buffer_size - transport_header_size,
669 : spdm_response, spdm_response_size);
670 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
671 1 : libspdm_transport_test_encode_message(spdm_context, &session_id,
672 : false, false, spdm_response_size,
673 : spdm_response, response_size,
674 : response);
675 1 : session_info = libspdm_get_session_info_via_session_id(
676 : spdm_context, session_id);
677 1 : if (session_info == NULL) {
678 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
679 : }
680 : /* WALKAROUND: If just use single context to encode message and then decode message */
681 : ((libspdm_secured_message_context_t
682 1 : *)(session_info->secured_message_context))
683 1 : ->handshake_secret.response_handshake_sequence_number--;
684 : }
685 1 : return LIBSPDM_STATUS_SUCCESS;
686 :
687 0 : case 0xC: {
688 : spdm_psk_finish_response_t *spdm_response;
689 : size_t spdm_response_size;
690 : size_t transport_header_size;
691 : uint32_t session_id;
692 : libspdm_session_info_t *session_info;
693 : uint8_t *scratch_buffer;
694 : size_t scratch_buffer_size;
695 :
696 0 : session_id = 0xFFFFFFFF;
697 0 : spdm_response_size = sizeof(spdm_psk_finish_response_t);
698 0 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
699 0 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
700 :
701 0 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
702 0 : spdm_response->header.request_response_code =
703 : SPDM_PSK_FINISH_RSP;
704 0 : spdm_response->header.param1 = 0;
705 0 : spdm_response->header.param2 = 0;
706 :
707 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
708 : * transport_message is always in sender buffer. */
709 0 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
710 0 : libspdm_copy_mem (scratch_buffer + transport_header_size,
711 : scratch_buffer_size - transport_header_size,
712 : spdm_response, spdm_response_size);
713 0 : spdm_response = (void *)(scratch_buffer + transport_header_size);
714 0 : libspdm_transport_test_encode_message(spdm_context, &session_id,
715 : false, false, spdm_response_size,
716 : spdm_response, response_size,
717 : response);
718 0 : session_info = libspdm_get_session_info_via_session_id(
719 : spdm_context, session_id);
720 0 : if (session_info == NULL) {
721 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
722 : }
723 : /* WALKAROUND: If just use single context to encode message and then decode message */
724 : ((libspdm_secured_message_context_t
725 0 : *)(session_info->secured_message_context))
726 0 : ->handshake_secret.response_handshake_sequence_number--;
727 : }
728 0 : return LIBSPDM_STATUS_SUCCESS;
729 :
730 1 : case 0xD: {
731 : spdm_psk_finish_response_t *spdm_response;
732 : size_t spdm_response_size;
733 : size_t transport_header_size;
734 : uint32_t session_id;
735 : libspdm_session_info_t *session_info;
736 : uint8_t *scratch_buffer;
737 : size_t scratch_buffer_size;
738 :
739 1 : session_id = 0xFFFFFFFF;
740 1 : spdm_response_size = sizeof(spdm_psk_finish_response_t);
741 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
742 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
743 :
744 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
745 1 : spdm_response->header.request_response_code =
746 : SPDM_FINISH_RSP; /*wrong response code*/
747 1 : spdm_response->header.param1 = 0;
748 1 : spdm_response->header.param2 = 0;
749 :
750 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
751 : * transport_message is always in sender buffer. */
752 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
753 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
754 : scratch_buffer_size - transport_header_size,
755 : spdm_response, spdm_response_size);
756 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
757 1 : libspdm_transport_test_encode_message(spdm_context, &session_id,
758 : false, false, spdm_response_size,
759 : spdm_response, response_size,
760 : response);
761 1 : session_info = libspdm_get_session_info_via_session_id(
762 : spdm_context, session_id);
763 1 : if (session_info == NULL) {
764 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
765 : }
766 : /* WALKAROUND: If just use single context to encode message and then decode message */
767 : ((libspdm_secured_message_context_t
768 1 : *)(session_info->secured_message_context))
769 1 : ->handshake_secret.response_handshake_sequence_number--;
770 : }
771 1 : return LIBSPDM_STATUS_SUCCESS;
772 :
773 0 : case 0xE: {
774 : spdm_psk_finish_response_t *spdm_response;
775 : size_t spdm_response_size;
776 : size_t transport_header_size;
777 : uint32_t session_id;
778 : libspdm_session_info_t *session_info;
779 : uint8_t *scratch_buffer;
780 : size_t scratch_buffer_size;
781 :
782 0 : session_id = 0xFFFFFFFF;
783 0 : spdm_response_size = sizeof(spdm_psk_finish_response_t);
784 0 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
785 0 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
786 :
787 0 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
788 0 : spdm_response->header.request_response_code =
789 : SPDM_PSK_FINISH_RSP;
790 0 : spdm_response->header.param1 = 0;
791 0 : spdm_response->header.param2 = 0;
792 :
793 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
794 : * transport_message is always in sender buffer. */
795 0 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
796 0 : libspdm_copy_mem (scratch_buffer + transport_header_size,
797 : scratch_buffer_size - transport_header_size,
798 : spdm_response, spdm_response_size);
799 0 : spdm_response = (void *)(scratch_buffer + transport_header_size);
800 0 : libspdm_transport_test_encode_message(spdm_context, &session_id,
801 : false, false, spdm_response_size,
802 : spdm_response, response_size,
803 : response);
804 0 : session_info = libspdm_get_session_info_via_session_id(
805 : spdm_context, session_id);
806 0 : if (session_info == NULL) {
807 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
808 : }
809 : /* WALKAROUND: If just use single context to encode message and then decode message */
810 : ((libspdm_secured_message_context_t
811 0 : *)(session_info->secured_message_context))
812 0 : ->handshake_secret.response_handshake_sequence_number--;
813 : }
814 0 : return LIBSPDM_STATUS_SUCCESS;
815 :
816 1 : case 0xF: {
817 : spdm_error_response_t *spdm_response;
818 : size_t spdm_response_size;
819 : size_t transport_header_size;
820 : uint32_t session_id;
821 : libspdm_session_info_t *session_info;
822 : uint8_t *scratch_buffer;
823 : size_t scratch_buffer_size;
824 :
825 1 : session_id = 0xFFFFFFFF;
826 :
827 1 : spdm_response_size = sizeof(spdm_error_response_t);
828 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
829 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
830 :
831 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
832 1 : spdm_response->header.request_response_code = SPDM_ERROR;
833 1 : spdm_response->header.param1 = SPDM_ERROR_CODE_DECRYPT_ERROR;
834 1 : spdm_response->header.param2 = 0;
835 :
836 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
837 : * transport_message is always in sender buffer. */
838 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
839 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
840 : scratch_buffer_size - transport_header_size,
841 : spdm_response, spdm_response_size);
842 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
843 1 : libspdm_transport_test_encode_message(spdm_context, &session_id,
844 : false, false,
845 : spdm_response_size,
846 : spdm_response,
847 : response_size, response);
848 1 : session_info = libspdm_get_session_info_via_session_id(
849 : spdm_context, session_id);
850 1 : if (session_info == NULL) {
851 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
852 : }
853 : ((libspdm_secured_message_context_t
854 1 : *)(session_info->secured_message_context))
855 1 : ->handshake_secret.response_handshake_sequence_number--;
856 : }
857 1 : return LIBSPDM_STATUS_SUCCESS;
858 :
859 1 : case 0x10: {
860 : spdm_psk_finish_response_t *spdm_response;
861 : size_t spdm_response_size;
862 : size_t transport_header_size;
863 : uint32_t session_id;
864 : libspdm_session_info_t *session_info;
865 : uint8_t *scratch_buffer;
866 : size_t scratch_buffer_size;
867 :
868 1 : session_id = 0xFFFFFFFF;
869 1 : spdm_response_size = sizeof(spdm_psk_finish_response_t);
870 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
871 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
872 :
873 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
874 1 : spdm_response->header.request_response_code =
875 : SPDM_PSK_FINISH_RSP;
876 1 : spdm_response->header.param1 = 0;
877 1 : spdm_response->header.param2 = 0;
878 :
879 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
880 : * transport_message is always in sender buffer. */
881 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
882 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
883 : scratch_buffer_size - transport_header_size,
884 : spdm_response, spdm_response_size);
885 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
886 :
887 1 : libspdm_copy_mem(&m_libspdm_local_buffer[m_libspdm_local_buffer_size],
888 : sizeof(m_libspdm_local_buffer) - m_libspdm_local_buffer_size,
889 : spdm_response, spdm_response_size);
890 1 : m_libspdm_local_buffer_size += spdm_response_size;
891 :
892 1 : libspdm_transport_test_encode_message(spdm_context, &session_id,
893 : false, false, spdm_response_size,
894 : spdm_response, response_size,
895 : response);
896 1 : session_info = libspdm_get_session_info_via_session_id(spdm_context, session_id);
897 1 : if (session_info == NULL) {
898 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
899 : }
900 : /* WALKAROUND: If just use single context to encode message and then decode message */
901 1 : ((libspdm_secured_message_context_t*)(session_info->secured_message_context))
902 1 : ->handshake_secret.response_handshake_sequence_number--;
903 : }
904 1 : return LIBSPDM_STATUS_SUCCESS;
905 :
906 1 : case 0x11: {
907 : spdm_psk_finish_response_t *spdm_response;
908 : size_t spdm_response_size;
909 : size_t transport_header_size;
910 : uint32_t session_id;
911 : libspdm_session_info_t *session_info;
912 : uint8_t *scratch_buffer;
913 : size_t scratch_buffer_size;
914 : uint16_t opaque_data_size;
915 : uint8_t *ptr;
916 :
917 1 : session_id = 0xFFFFFFFF;
918 1 : opaque_data_size = 8;
919 1 : spdm_response_size = sizeof(spdm_psk_finish_response_t) + sizeof(uint16_t) + opaque_data_size;
920 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
921 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
922 :
923 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_14;
924 1 : spdm_response->header.request_response_code =
925 : SPDM_PSK_FINISH_RSP;
926 1 : spdm_response->header.param1 = 0;
927 1 : spdm_response->header.param2 = 0;
928 1 : ptr = (uint8_t *)spdm_response + sizeof(spdm_psk_finish_response_t);
929 1 : libspdm_write_uint16(ptr, opaque_data_size);
930 :
931 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
932 : * transport_message is always in sender buffer. */
933 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
934 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
935 : scratch_buffer_size - transport_header_size,
936 : spdm_response, spdm_response_size);
937 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
938 :
939 1 : libspdm_copy_mem(&m_libspdm_local_buffer[m_libspdm_local_buffer_size],
940 : sizeof(m_libspdm_local_buffer) - m_libspdm_local_buffer_size,
941 : spdm_response, spdm_response_size);
942 1 : m_libspdm_local_buffer_size += spdm_response_size;
943 :
944 1 : libspdm_transport_test_encode_message(spdm_context, &session_id,
945 : false, false, spdm_response_size,
946 : spdm_response, response_size,
947 : response);
948 1 : session_info = libspdm_get_session_info_via_session_id(spdm_context, session_id);
949 1 : if (session_info == NULL) {
950 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
951 : }
952 : /* WALKAROUND: If just use single context to encode message and then decode message */
953 1 : ((libspdm_secured_message_context_t*)(session_info->secured_message_context))
954 1 : ->handshake_secret.response_handshake_sequence_number--;
955 : }
956 1 : return LIBSPDM_STATUS_SUCCESS;
957 :
958 0 : default:
959 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
960 : }
961 : }
962 :
963 : /**
964 : * Test 1: when no PSK_FINISH_RSP message is received, and the client returns
965 : * a device error.
966 : * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR.
967 : **/
968 1 : void libspdm_test_requester_psk_finish_case1(void **state)
969 : {
970 : libspdm_return_t status;
971 : libspdm_test_context_t *spdm_test_context;
972 : libspdm_context_t *spdm_context;
973 : uint32_t session_id;
974 : void *data;
975 : size_t data_size;
976 : void *hash;
977 : size_t hash_size;
978 : libspdm_session_info_t *session_info;
979 :
980 1 : spdm_test_context = *state;
981 1 : spdm_context = spdm_test_context->spdm_context;
982 1 : spdm_test_context->case_id = 0x1;
983 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
984 : SPDM_VERSION_NUMBER_SHIFT_BIT;
985 1 : spdm_context->connection_info.connection_state =
986 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
987 1 : spdm_context->connection_info.capability.flags |=
988 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
989 1 : spdm_context->connection_info.capability.flags |=
990 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
991 1 : spdm_context->connection_info.capability.flags |=
992 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
993 1 : spdm_context->local_context.capability.flags |=
994 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
995 1 : spdm_context->local_context.capability.flags |=
996 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
997 1 : spdm_context->local_context.capability.flags |=
998 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
999 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
1000 : m_libspdm_use_asym_algo, &data,
1001 : &data_size, &hash, &hash_size);
1002 1 : libspdm_reset_message_a(spdm_context);
1003 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1004 : m_libspdm_use_hash_algo;
1005 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1006 : m_libspdm_use_asym_algo;
1007 1 : spdm_context->connection_info.algorithm.dhe_named_group =
1008 : m_libspdm_use_dhe_algo;
1009 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
1010 : m_libspdm_use_aead_algo;
1011 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1012 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
1013 : data_size;
1014 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
1015 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
1016 : data, data_size);
1017 : #endif
1018 :
1019 1 : session_id = 0xFFFFFFFF;
1020 1 : session_info = &spdm_context->session_info[0];
1021 1 : libspdm_session_info_init(spdm_context, session_info, session_id, true);
1022 1 : libspdm_session_info_set_psk_hint(session_info,
1023 : LIBSPDM_TEST_PSK_HINT_STRING,
1024 : sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
1025 1 : libspdm_secured_message_set_session_state(
1026 : session_info->secured_message_context,
1027 : LIBSPDM_SESSION_STATE_HANDSHAKING);
1028 1 : libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
1029 :
1030 1 : status = libspdm_send_receive_psk_finish(spdm_context, session_id);
1031 1 : assert_int_equal(status, LIBSPDM_STATUS_SEND_FAIL);
1032 1 : free(data);
1033 1 : }
1034 :
1035 : /**
1036 : * Test 2: receiving a correct PSK_FINISH_RSP message.
1037 : * Expected behavior: client returns a Status of RETURN_SUCCESS and
1038 : * session is established.
1039 : **/
1040 1 : void libspdm_test_requester_psk_finish_case2(void **state)
1041 : {
1042 : libspdm_return_t status;
1043 : libspdm_test_context_t *spdm_test_context;
1044 : libspdm_context_t *spdm_context;
1045 : uint32_t session_id;
1046 : void *data;
1047 : size_t data_size;
1048 : void *hash;
1049 : size_t hash_size;
1050 : libspdm_session_info_t *session_info;
1051 :
1052 1 : spdm_test_context = *state;
1053 1 : spdm_context = spdm_test_context->spdm_context;
1054 1 : spdm_test_context->case_id = 0x2;
1055 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
1056 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1057 1 : spdm_context->connection_info.connection_state =
1058 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1059 1 : spdm_context->connection_info.capability.flags |=
1060 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
1061 1 : spdm_context->connection_info.capability.flags |=
1062 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
1063 1 : spdm_context->connection_info.capability.flags |=
1064 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
1065 1 : spdm_context->local_context.capability.flags |=
1066 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
1067 1 : spdm_context->local_context.capability.flags |=
1068 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
1069 1 : spdm_context->local_context.capability.flags |=
1070 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
1071 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
1072 : m_libspdm_use_asym_algo, &data,
1073 : &data_size, &hash, &hash_size);
1074 1 : libspdm_reset_message_a(spdm_context);
1075 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1076 : m_libspdm_use_hash_algo;
1077 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1078 : m_libspdm_use_asym_algo;
1079 1 : spdm_context->connection_info.algorithm.dhe_named_group =
1080 : m_libspdm_use_dhe_algo;
1081 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
1082 : m_libspdm_use_aead_algo;
1083 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1084 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
1085 : data_size;
1086 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
1087 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
1088 : data, data_size);
1089 : #endif
1090 :
1091 1 : session_id = 0xFFFFFFFF;
1092 1 : session_info = &spdm_context->session_info[0];
1093 1 : libspdm_session_info_init(spdm_context, session_info, session_id, true);
1094 1 : libspdm_session_info_set_psk_hint(session_info,
1095 : LIBSPDM_TEST_PSK_HINT_STRING,
1096 : sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
1097 1 : libspdm_secured_message_set_session_state(
1098 : session_info->secured_message_context,
1099 : LIBSPDM_SESSION_STATE_HANDSHAKING);
1100 1 : libspdm_set_mem(m_libspdm_dummy_key_buffer,
1101 : ((libspdm_secured_message_context_t
1102 1 : *)(session_info->secured_message_context))
1103 : ->aead_key_size,
1104 : (uint8_t)(0xFF));
1105 1 : libspdm_secured_message_set_response_handshake_encryption_key(
1106 : session_info->secured_message_context, m_libspdm_dummy_key_buffer,
1107 : ((libspdm_secured_message_context_t
1108 1 : *)(session_info->secured_message_context))
1109 : ->aead_key_size);
1110 1 : libspdm_set_mem(m_libspdm_dummy_salt_buffer,
1111 : ((libspdm_secured_message_context_t
1112 1 : *)(session_info->secured_message_context))
1113 : ->aead_iv_size,
1114 : (uint8_t)(0xFF));
1115 1 : libspdm_secured_message_set_response_handshake_salt(
1116 : session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
1117 : ((libspdm_secured_message_context_t
1118 1 : *)(session_info->secured_message_context))
1119 : ->aead_iv_size);
1120 : ((libspdm_secured_message_context_t *)(session_info
1121 1 : ->secured_message_context))
1122 1 : ->handshake_secret.response_handshake_sequence_number = 0;
1123 1 : libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
1124 :
1125 1 : status = libspdm_send_receive_psk_finish(spdm_context, session_id);
1126 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1127 1 : assert_int_equal(
1128 : libspdm_secured_message_get_session_state(
1129 : spdm_context->session_info[0].secured_message_context),
1130 : LIBSPDM_SESSION_STATE_ESTABLISHED);
1131 1 : free(data);
1132 1 : }
1133 :
1134 : /**
1135 : * Test 3: requester state has not been negotiated, as if GET_VERSION,
1136 : * GET_CAPABILITIES and NEGOTIATE_ALGORITHMS had not been exchanged.
1137 : * Expected behavior: client returns a Status of RETURN_UNSUPPORTED.
1138 : **/
1139 1 : void libspdm_test_requester_psk_finish_case3(void **state)
1140 : {
1141 : libspdm_return_t status;
1142 : libspdm_test_context_t *spdm_test_context;
1143 : libspdm_context_t *spdm_context;
1144 : uint32_t session_id;
1145 : void *data;
1146 : size_t data_size;
1147 : void *hash;
1148 : size_t hash_size;
1149 : libspdm_session_info_t *session_info;
1150 :
1151 1 : spdm_test_context = *state;
1152 1 : spdm_context = spdm_test_context->spdm_context;
1153 1 : spdm_test_context->case_id = 0x3;
1154 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
1155 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1156 1 : spdm_context->connection_info.connection_state =
1157 : LIBSPDM_CONNECTION_STATE_NOT_STARTED;
1158 1 : spdm_context->connection_info.capability.flags |=
1159 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
1160 1 : spdm_context->connection_info.capability.flags |=
1161 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
1162 1 : spdm_context->connection_info.capability.flags |=
1163 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
1164 1 : spdm_context->local_context.capability.flags |=
1165 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
1166 1 : spdm_context->local_context.capability.flags |=
1167 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
1168 1 : spdm_context->local_context.capability.flags |=
1169 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
1170 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
1171 : m_libspdm_use_asym_algo, &data,
1172 : &data_size, &hash, &hash_size);
1173 1 : libspdm_reset_message_a(spdm_context);
1174 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1175 : m_libspdm_use_hash_algo;
1176 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1177 : m_libspdm_use_asym_algo;
1178 1 : spdm_context->connection_info.algorithm.dhe_named_group =
1179 : m_libspdm_use_dhe_algo;
1180 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
1181 : m_libspdm_use_aead_algo;
1182 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1183 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
1184 : data_size;
1185 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
1186 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
1187 : data, data_size);
1188 : #endif
1189 :
1190 1 : session_id = 0xFFFFFFFF;
1191 1 : session_info = &spdm_context->session_info[0];
1192 1 : libspdm_session_info_init(spdm_context, session_info, session_id, true);
1193 1 : libspdm_session_info_set_psk_hint(session_info,
1194 : LIBSPDM_TEST_PSK_HINT_STRING,
1195 : sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
1196 1 : libspdm_secured_message_set_session_state(
1197 : session_info->secured_message_context,
1198 : LIBSPDM_SESSION_STATE_HANDSHAKING);
1199 1 : libspdm_set_mem(m_libspdm_dummy_key_buffer,
1200 : ((libspdm_secured_message_context_t
1201 1 : *)(session_info->secured_message_context))
1202 : ->aead_key_size,
1203 : (uint8_t)(0xFF));
1204 1 : libspdm_secured_message_set_response_handshake_encryption_key(
1205 : session_info->secured_message_context, m_libspdm_dummy_key_buffer,
1206 : ((libspdm_secured_message_context_t
1207 1 : *)(session_info->secured_message_context))
1208 : ->aead_key_size);
1209 1 : libspdm_set_mem(m_libspdm_dummy_salt_buffer,
1210 : ((libspdm_secured_message_context_t
1211 1 : *)(session_info->secured_message_context))
1212 : ->aead_iv_size,
1213 : (uint8_t)(0xFF));
1214 1 : libspdm_secured_message_set_response_handshake_salt(
1215 : session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
1216 : ((libspdm_secured_message_context_t
1217 1 : *)(session_info->secured_message_context))
1218 : ->aead_iv_size);
1219 : ((libspdm_secured_message_context_t *)(session_info
1220 1 : ->secured_message_context))
1221 1 : ->handshake_secret.response_handshake_sequence_number = 0;
1222 1 : libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
1223 :
1224 1 : status = libspdm_send_receive_psk_finish(spdm_context, session_id);
1225 1 : assert_int_equal(status, LIBSPDM_STATUS_INVALID_STATE_LOCAL);
1226 1 : free(data);
1227 1 : }
1228 :
1229 : /**
1230 : * Test 4: the requester is setup correctly, but receives an ERROR message
1231 : * indicating InvalidParameters.
1232 : * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR.
1233 : **/
1234 1 : void libspdm_test_requester_psk_finish_case4(void **state)
1235 : {
1236 : libspdm_return_t status;
1237 : libspdm_test_context_t *spdm_test_context;
1238 : libspdm_context_t *spdm_context;
1239 : uint32_t session_id;
1240 : void *data;
1241 : size_t data_size;
1242 : void *hash;
1243 : size_t hash_size;
1244 : libspdm_session_info_t *session_info;
1245 :
1246 1 : spdm_test_context = *state;
1247 1 : spdm_context = spdm_test_context->spdm_context;
1248 1 : spdm_test_context->case_id = 0x4;
1249 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
1250 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1251 1 : spdm_context->connection_info.connection_state =
1252 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1253 1 : spdm_context->connection_info.capability.flags |=
1254 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
1255 1 : spdm_context->connection_info.capability.flags |=
1256 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
1257 1 : spdm_context->connection_info.capability.flags |=
1258 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
1259 1 : spdm_context->local_context.capability.flags |=
1260 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
1261 1 : spdm_context->local_context.capability.flags |=
1262 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
1263 1 : spdm_context->local_context.capability.flags |=
1264 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
1265 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
1266 : m_libspdm_use_asym_algo, &data,
1267 : &data_size, &hash, &hash_size);
1268 1 : libspdm_reset_message_a(spdm_context);
1269 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1270 : m_libspdm_use_hash_algo;
1271 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1272 : m_libspdm_use_asym_algo;
1273 1 : spdm_context->connection_info.algorithm.dhe_named_group =
1274 : m_libspdm_use_dhe_algo;
1275 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
1276 : m_libspdm_use_aead_algo;
1277 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1278 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
1279 : data_size;
1280 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
1281 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
1282 : data, data_size);
1283 : #endif
1284 :
1285 1 : session_id = 0xFFFFFFFF;
1286 1 : session_info = &spdm_context->session_info[0];
1287 1 : libspdm_session_info_init(spdm_context, session_info, session_id, true);
1288 1 : libspdm_session_info_set_psk_hint(session_info,
1289 : LIBSPDM_TEST_PSK_HINT_STRING,
1290 : sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
1291 1 : libspdm_secured_message_set_session_state(
1292 : session_info->secured_message_context,
1293 : LIBSPDM_SESSION_STATE_HANDSHAKING);
1294 1 : libspdm_set_mem(m_libspdm_dummy_key_buffer,
1295 : ((libspdm_secured_message_context_t
1296 1 : *)(session_info->secured_message_context))
1297 : ->aead_key_size,
1298 : (uint8_t)(0xFF));
1299 1 : libspdm_secured_message_set_response_handshake_encryption_key(
1300 : session_info->secured_message_context, m_libspdm_dummy_key_buffer,
1301 : ((libspdm_secured_message_context_t
1302 1 : *)(session_info->secured_message_context))
1303 : ->aead_key_size);
1304 1 : libspdm_set_mem(m_libspdm_dummy_salt_buffer,
1305 : ((libspdm_secured_message_context_t
1306 1 : *)(session_info->secured_message_context))
1307 : ->aead_iv_size,
1308 : (uint8_t)(0xFF));
1309 1 : libspdm_secured_message_set_response_handshake_salt(
1310 : session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
1311 : ((libspdm_secured_message_context_t
1312 1 : *)(session_info->secured_message_context))
1313 : ->aead_iv_size);
1314 : ((libspdm_secured_message_context_t *)(session_info
1315 1 : ->secured_message_context))
1316 1 : ->handshake_secret.response_handshake_sequence_number = 0;
1317 1 : libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
1318 :
1319 1 : status = libspdm_send_receive_psk_finish(spdm_context, session_id);
1320 1 : assert_int_equal(status, LIBSPDM_STATUS_ERROR_PEER);
1321 1 : assert_int_equal(spdm_context->session_info->session_id, INVALID_SESSION_ID);
1322 1 : free(data);
1323 1 : }
1324 :
1325 : /**
1326 : * Test 5: the requester is setup correctly, but receives an ERROR message
1327 : * indicating the Busy status of the responder.
1328 : * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR.
1329 : **/
1330 1 : void libspdm_test_requester_psk_finish_case5(void **state)
1331 : {
1332 : libspdm_return_t status;
1333 : libspdm_test_context_t *spdm_test_context;
1334 : libspdm_context_t *spdm_context;
1335 : uint32_t session_id;
1336 : void *data;
1337 : size_t data_size;
1338 : void *hash;
1339 : size_t hash_size;
1340 : libspdm_session_info_t *session_info;
1341 :
1342 1 : spdm_test_context = *state;
1343 1 : spdm_context = spdm_test_context->spdm_context;
1344 1 : spdm_test_context->case_id = 0x5;
1345 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
1346 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1347 1 : spdm_context->connection_info.connection_state =
1348 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1349 1 : spdm_context->connection_info.capability.flags |=
1350 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
1351 1 : spdm_context->connection_info.capability.flags |=
1352 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
1353 1 : spdm_context->connection_info.capability.flags |=
1354 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
1355 1 : spdm_context->local_context.capability.flags |=
1356 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
1357 1 : spdm_context->local_context.capability.flags |=
1358 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
1359 1 : spdm_context->local_context.capability.flags |=
1360 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
1361 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
1362 : m_libspdm_use_asym_algo, &data,
1363 : &data_size, &hash, &hash_size);
1364 1 : libspdm_reset_message_a(spdm_context);
1365 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1366 : m_libspdm_use_hash_algo;
1367 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1368 : m_libspdm_use_asym_algo;
1369 1 : spdm_context->connection_info.algorithm.dhe_named_group =
1370 : m_libspdm_use_dhe_algo;
1371 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
1372 : m_libspdm_use_aead_algo;
1373 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1374 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
1375 : data_size;
1376 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
1377 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
1378 : data, data_size);
1379 : #endif
1380 :
1381 1 : session_id = 0xFFFFFFFF;
1382 1 : session_info = &spdm_context->session_info[0];
1383 1 : libspdm_session_info_init(spdm_context, session_info, session_id, true);
1384 1 : libspdm_session_info_set_psk_hint(session_info,
1385 : LIBSPDM_TEST_PSK_HINT_STRING,
1386 : sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
1387 1 : libspdm_secured_message_set_session_state(
1388 : session_info->secured_message_context,
1389 : LIBSPDM_SESSION_STATE_HANDSHAKING);
1390 1 : libspdm_set_mem(m_libspdm_dummy_key_buffer,
1391 : ((libspdm_secured_message_context_t
1392 1 : *)(session_info->secured_message_context))
1393 : ->aead_key_size,
1394 : (uint8_t)(0xFF));
1395 1 : libspdm_secured_message_set_response_handshake_encryption_key(
1396 : session_info->secured_message_context, m_libspdm_dummy_key_buffer,
1397 : ((libspdm_secured_message_context_t
1398 1 : *)(session_info->secured_message_context))
1399 : ->aead_key_size);
1400 1 : libspdm_set_mem(m_libspdm_dummy_salt_buffer,
1401 : ((libspdm_secured_message_context_t
1402 1 : *)(session_info->secured_message_context))
1403 : ->aead_iv_size,
1404 : (uint8_t)(0xFF));
1405 1 : libspdm_secured_message_set_response_handshake_salt(
1406 : session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
1407 : ((libspdm_secured_message_context_t
1408 1 : *)(session_info->secured_message_context))
1409 : ->aead_iv_size);
1410 : ((libspdm_secured_message_context_t *)(session_info
1411 1 : ->secured_message_context))
1412 1 : ->handshake_secret.response_handshake_sequence_number = 0;
1413 1 : libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
1414 :
1415 1 : status = libspdm_send_receive_psk_finish(spdm_context, session_id);
1416 1 : assert_int_equal(status, LIBSPDM_STATUS_BUSY_PEER);
1417 1 : free(data);
1418 1 : }
1419 :
1420 : /**
1421 : * Test 6: the requester is setup correctly, but, on the first try, receiving
1422 : * a Busy ERROR message, and, on retry, receiving a correct PSK_FINISH_RSP
1423 : * message.
1424 : * Expected behavior: client returns a Status of RETURN_SUCCESS and session
1425 : * is established.
1426 : **/
1427 1 : void libspdm_test_requester_psk_finish_case6(void **state)
1428 : {
1429 : libspdm_return_t status;
1430 : libspdm_test_context_t *spdm_test_context;
1431 : libspdm_context_t *spdm_context;
1432 : uint32_t session_id;
1433 : void *data;
1434 : size_t data_size;
1435 : void *hash;
1436 : size_t hash_size;
1437 : libspdm_session_info_t *session_info;
1438 :
1439 1 : spdm_test_context = *state;
1440 1 : spdm_context = spdm_test_context->spdm_context;
1441 1 : spdm_test_context->case_id = 0x6;
1442 1 : spdm_context->retry_times = 3;
1443 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
1444 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1445 1 : spdm_context->connection_info.connection_state =
1446 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1447 1 : spdm_context->connection_info.capability.flags |=
1448 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
1449 1 : spdm_context->connection_info.capability.flags |=
1450 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
1451 1 : spdm_context->connection_info.capability.flags |=
1452 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
1453 1 : spdm_context->local_context.capability.flags |=
1454 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
1455 1 : spdm_context->local_context.capability.flags |=
1456 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
1457 1 : spdm_context->local_context.capability.flags |=
1458 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
1459 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
1460 : m_libspdm_use_asym_algo, &data,
1461 : &data_size, &hash, &hash_size);
1462 1 : libspdm_reset_message_a(spdm_context);
1463 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1464 : m_libspdm_use_hash_algo;
1465 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1466 : m_libspdm_use_asym_algo;
1467 1 : spdm_context->connection_info.algorithm.dhe_named_group =
1468 : m_libspdm_use_dhe_algo;
1469 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
1470 : m_libspdm_use_aead_algo;
1471 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1472 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
1473 : data_size;
1474 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
1475 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
1476 : data, data_size);
1477 : #endif
1478 :
1479 1 : session_id = 0xFFFFFFFF;
1480 1 : session_info = &spdm_context->session_info[0];
1481 1 : libspdm_session_info_init(spdm_context, session_info, session_id, true);
1482 1 : libspdm_session_info_set_psk_hint(session_info,
1483 : LIBSPDM_TEST_PSK_HINT_STRING,
1484 : sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
1485 1 : libspdm_secured_message_set_session_state(
1486 : session_info->secured_message_context,
1487 : LIBSPDM_SESSION_STATE_HANDSHAKING);
1488 1 : libspdm_set_mem(m_libspdm_dummy_key_buffer,
1489 : ((libspdm_secured_message_context_t
1490 1 : *)(session_info->secured_message_context))
1491 : ->aead_key_size,
1492 : (uint8_t)(0xFF));
1493 1 : libspdm_secured_message_set_response_handshake_encryption_key(
1494 : session_info->secured_message_context, m_libspdm_dummy_key_buffer,
1495 : ((libspdm_secured_message_context_t
1496 1 : *)(session_info->secured_message_context))
1497 : ->aead_key_size);
1498 1 : libspdm_set_mem(m_libspdm_dummy_salt_buffer,
1499 : ((libspdm_secured_message_context_t
1500 1 : *)(session_info->secured_message_context))
1501 : ->aead_iv_size,
1502 : (uint8_t)(0xFF));
1503 1 : libspdm_secured_message_set_response_handshake_salt(
1504 : session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
1505 : ((libspdm_secured_message_context_t
1506 1 : *)(session_info->secured_message_context))
1507 : ->aead_iv_size);
1508 : ((libspdm_secured_message_context_t *)(session_info
1509 1 : ->secured_message_context))
1510 1 : ->handshake_secret.response_handshake_sequence_number = 0;
1511 1 : libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
1512 :
1513 1 : status = libspdm_send_receive_psk_finish(spdm_context, session_id);
1514 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1515 1 : assert_int_equal(
1516 : libspdm_secured_message_get_session_state(
1517 : spdm_context->session_info[0].secured_message_context),
1518 : LIBSPDM_SESSION_STATE_ESTABLISHED);
1519 1 : free(data);
1520 1 : }
1521 :
1522 : /**
1523 : * Test 7: the requester is setup correctly, but receives an ERROR message
1524 : * indicating the RequestResynch status of the responder.
1525 : * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, and the
1526 : * communication is reset to expect a new GET_VERSION message.
1527 : **/
1528 1 : void libspdm_test_requester_psk_finish_case7(void **state)
1529 : {
1530 : libspdm_return_t status;
1531 : libspdm_test_context_t *spdm_test_context;
1532 : libspdm_context_t *spdm_context;
1533 : uint32_t session_id;
1534 : void *data;
1535 : size_t data_size;
1536 : void *hash;
1537 : size_t hash_size;
1538 : libspdm_session_info_t *session_info;
1539 :
1540 1 : spdm_test_context = *state;
1541 1 : spdm_context = spdm_test_context->spdm_context;
1542 1 : spdm_test_context->case_id = 0x7;
1543 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
1544 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1545 1 : spdm_context->connection_info.connection_state =
1546 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1547 1 : spdm_context->connection_info.capability.flags |=
1548 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
1549 1 : spdm_context->connection_info.capability.flags |=
1550 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
1551 1 : spdm_context->connection_info.capability.flags |=
1552 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
1553 1 : spdm_context->local_context.capability.flags |=
1554 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
1555 1 : spdm_context->local_context.capability.flags |=
1556 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
1557 1 : spdm_context->local_context.capability.flags |=
1558 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
1559 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
1560 : m_libspdm_use_asym_algo, &data,
1561 : &data_size, &hash, &hash_size);
1562 1 : libspdm_reset_message_a(spdm_context);
1563 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1564 : m_libspdm_use_hash_algo;
1565 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1566 : m_libspdm_use_asym_algo;
1567 1 : spdm_context->connection_info.algorithm.dhe_named_group =
1568 : m_libspdm_use_dhe_algo;
1569 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
1570 : m_libspdm_use_aead_algo;
1571 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1572 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
1573 : data_size;
1574 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
1575 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
1576 : data, data_size);
1577 : #endif
1578 :
1579 1 : session_id = 0xFFFFFFFF;
1580 1 : session_info = &spdm_context->session_info[0];
1581 1 : libspdm_session_info_init(spdm_context, session_info, session_id, true);
1582 1 : libspdm_session_info_set_psk_hint(session_info,
1583 : LIBSPDM_TEST_PSK_HINT_STRING,
1584 : sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
1585 1 : libspdm_secured_message_set_session_state(
1586 : session_info->secured_message_context,
1587 : LIBSPDM_SESSION_STATE_HANDSHAKING);
1588 1 : libspdm_set_mem(m_libspdm_dummy_key_buffer,
1589 : ((libspdm_secured_message_context_t
1590 1 : *)(session_info->secured_message_context))
1591 : ->aead_key_size,
1592 : (uint8_t)(0xFF));
1593 1 : libspdm_secured_message_set_response_handshake_encryption_key(
1594 : session_info->secured_message_context, m_libspdm_dummy_key_buffer,
1595 : ((libspdm_secured_message_context_t
1596 1 : *)(session_info->secured_message_context))
1597 : ->aead_key_size);
1598 1 : libspdm_set_mem(m_libspdm_dummy_salt_buffer,
1599 : ((libspdm_secured_message_context_t
1600 1 : *)(session_info->secured_message_context))
1601 : ->aead_iv_size,
1602 : (uint8_t)(0xFF));
1603 1 : libspdm_secured_message_set_response_handshake_salt(
1604 : session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
1605 : ((libspdm_secured_message_context_t
1606 1 : *)(session_info->secured_message_context))
1607 : ->aead_iv_size);
1608 : ((libspdm_secured_message_context_t *)(session_info
1609 1 : ->secured_message_context))
1610 1 : ->handshake_secret.response_handshake_sequence_number = 0;
1611 1 : libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
1612 :
1613 1 : status = libspdm_send_receive_psk_finish(spdm_context, session_id);
1614 1 : assert_int_equal(status, LIBSPDM_STATUS_RESYNCH_PEER);
1615 1 : assert_int_equal(spdm_context->connection_info.connection_state,
1616 : LIBSPDM_CONNECTION_STATE_NOT_STARTED);
1617 1 : free(data);
1618 1 : }
1619 :
1620 : /**
1621 : * Test 8: the requester is setup correctly, but receives an ERROR message
1622 : * indicating the ResponseNotReady status of the responder.
1623 : * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR.
1624 : **/
1625 1 : void libspdm_test_requester_psk_finish_case8(void **state)
1626 : {
1627 : libspdm_return_t status;
1628 : libspdm_test_context_t *spdm_test_context;
1629 : libspdm_context_t *spdm_context;
1630 : uint32_t session_id;
1631 : void *data;
1632 : size_t data_size;
1633 : void *hash;
1634 : size_t hash_size;
1635 : libspdm_session_info_t *session_info;
1636 :
1637 1 : spdm_test_context = *state;
1638 1 : spdm_context = spdm_test_context->spdm_context;
1639 1 : spdm_test_context->case_id = 0x8;
1640 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
1641 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1642 1 : spdm_context->connection_info.connection_state =
1643 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1644 1 : spdm_context->connection_info.capability.flags |=
1645 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
1646 1 : spdm_context->connection_info.capability.flags |=
1647 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
1648 1 : spdm_context->connection_info.capability.flags |=
1649 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
1650 1 : spdm_context->local_context.capability.flags |=
1651 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
1652 1 : spdm_context->local_context.capability.flags |=
1653 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
1654 1 : spdm_context->local_context.capability.flags |=
1655 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
1656 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
1657 : m_libspdm_use_asym_algo, &data,
1658 : &data_size, &hash, &hash_size);
1659 1 : libspdm_reset_message_a(spdm_context);
1660 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1661 : m_libspdm_use_hash_algo;
1662 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1663 : m_libspdm_use_asym_algo;
1664 1 : spdm_context->connection_info.algorithm.dhe_named_group =
1665 : m_libspdm_use_dhe_algo;
1666 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
1667 : m_libspdm_use_aead_algo;
1668 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1669 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
1670 : data_size;
1671 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
1672 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
1673 : data, data_size);
1674 : #endif
1675 :
1676 1 : session_id = 0xFFFFFFFF;
1677 1 : session_info = &spdm_context->session_info[0];
1678 1 : libspdm_session_info_init(spdm_context, session_info, session_id, true);
1679 1 : libspdm_session_info_set_psk_hint(session_info,
1680 : LIBSPDM_TEST_PSK_HINT_STRING,
1681 : sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
1682 1 : libspdm_secured_message_set_session_state(
1683 : session_info->secured_message_context,
1684 : LIBSPDM_SESSION_STATE_HANDSHAKING);
1685 1 : libspdm_set_mem(m_libspdm_dummy_key_buffer,
1686 : ((libspdm_secured_message_context_t
1687 1 : *)(session_info->secured_message_context))
1688 : ->aead_key_size,
1689 : (uint8_t)(0xFF));
1690 1 : libspdm_secured_message_set_response_handshake_encryption_key(
1691 : session_info->secured_message_context, m_libspdm_dummy_key_buffer,
1692 : ((libspdm_secured_message_context_t
1693 1 : *)(session_info->secured_message_context))
1694 : ->aead_key_size);
1695 1 : libspdm_set_mem(m_libspdm_dummy_salt_buffer,
1696 : ((libspdm_secured_message_context_t
1697 1 : *)(session_info->secured_message_context))
1698 : ->aead_iv_size,
1699 : (uint8_t)(0xFF));
1700 1 : libspdm_secured_message_set_response_handshake_salt(
1701 : session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
1702 : ((libspdm_secured_message_context_t
1703 1 : *)(session_info->secured_message_context))
1704 : ->aead_iv_size);
1705 : ((libspdm_secured_message_context_t *)(session_info
1706 1 : ->secured_message_context))
1707 1 : ->handshake_secret.response_handshake_sequence_number = 0;
1708 1 : libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
1709 :
1710 1 : status = libspdm_send_receive_psk_finish(spdm_context, session_id);
1711 1 : assert_int_equal(status, LIBSPDM_STATUS_NOT_READY_PEER);
1712 1 : free(data);
1713 1 : }
1714 :
1715 : /**
1716 : * Test 9: the requester is setup correctly, but, on the first try, receiving
1717 : * a ResponseNotReady ERROR message, and, on retry, receiving a correct
1718 : * PSK_FINISH_RSP message.
1719 : * Expected behavior: client returns a Status of RETURN_SUCCESS and session
1720 : * is established.
1721 : **/
1722 1 : void libspdm_test_requester_psk_finish_case9(void **state)
1723 : {
1724 : libspdm_return_t status;
1725 : libspdm_test_context_t *spdm_test_context;
1726 : libspdm_context_t *spdm_context;
1727 : uint32_t session_id;
1728 : void *data;
1729 : size_t data_size;
1730 : void *hash;
1731 : size_t hash_size;
1732 : libspdm_session_info_t *session_info;
1733 :
1734 1 : spdm_test_context = *state;
1735 1 : spdm_context = spdm_test_context->spdm_context;
1736 1 : spdm_test_context->case_id = 0x9;
1737 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
1738 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1739 1 : spdm_context->connection_info.connection_state =
1740 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1741 1 : spdm_context->connection_info.capability.flags |=
1742 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
1743 1 : spdm_context->connection_info.capability.flags |=
1744 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
1745 1 : spdm_context->connection_info.capability.flags |=
1746 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
1747 1 : spdm_context->local_context.capability.flags |=
1748 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
1749 1 : spdm_context->local_context.capability.flags |=
1750 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
1751 1 : spdm_context->local_context.capability.flags |=
1752 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
1753 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
1754 : m_libspdm_use_asym_algo, &data,
1755 : &data_size, &hash, &hash_size);
1756 1 : libspdm_reset_message_a(spdm_context);
1757 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1758 : m_libspdm_use_hash_algo;
1759 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1760 : m_libspdm_use_asym_algo;
1761 1 : spdm_context->connection_info.algorithm.dhe_named_group =
1762 : m_libspdm_use_dhe_algo;
1763 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
1764 : m_libspdm_use_aead_algo;
1765 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1766 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
1767 : data_size;
1768 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
1769 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
1770 : data, data_size);
1771 : #endif
1772 :
1773 1 : session_id = 0xFFFFFFFF;
1774 1 : session_info = &spdm_context->session_info[0];
1775 1 : libspdm_session_info_init(spdm_context, session_info, session_id, true);
1776 1 : libspdm_session_info_set_psk_hint(session_info,
1777 : LIBSPDM_TEST_PSK_HINT_STRING,
1778 : sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
1779 1 : libspdm_secured_message_set_session_state(
1780 : session_info->secured_message_context,
1781 : LIBSPDM_SESSION_STATE_HANDSHAKING);
1782 1 : libspdm_set_mem(m_libspdm_dummy_key_buffer,
1783 : ((libspdm_secured_message_context_t
1784 1 : *)(session_info->secured_message_context))
1785 : ->aead_key_size,
1786 : (uint8_t)(0xFF));
1787 1 : libspdm_secured_message_set_response_handshake_encryption_key(
1788 : session_info->secured_message_context, m_libspdm_dummy_key_buffer,
1789 : ((libspdm_secured_message_context_t
1790 1 : *)(session_info->secured_message_context))
1791 : ->aead_key_size);
1792 1 : libspdm_set_mem(m_libspdm_dummy_salt_buffer,
1793 : ((libspdm_secured_message_context_t
1794 1 : *)(session_info->secured_message_context))
1795 : ->aead_iv_size,
1796 : (uint8_t)(0xFF));
1797 1 : libspdm_secured_message_set_response_handshake_salt(
1798 : session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
1799 : ((libspdm_secured_message_context_t
1800 1 : *)(session_info->secured_message_context))
1801 : ->aead_iv_size);
1802 : ((libspdm_secured_message_context_t *)(session_info
1803 1 : ->secured_message_context))
1804 1 : ->handshake_secret.response_handshake_sequence_number = 0;
1805 1 : libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
1806 :
1807 1 : status = libspdm_send_receive_psk_finish(spdm_context, session_id);
1808 : if (LIBSPDM_RESPOND_IF_READY_SUPPORT) {
1809 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1810 1 : assert_int_equal(
1811 : libspdm_secured_message_get_session_state(
1812 : spdm_context->session_info[0].secured_message_context),
1813 : LIBSPDM_SESSION_STATE_ESTABLISHED);
1814 : } else {
1815 : assert_int_equal(status, LIBSPDM_STATUS_NOT_READY_PEER);
1816 : }
1817 :
1818 1 : free(data);
1819 1 : }
1820 :
1821 : /**
1822 : * Test 10: receiving an unexpected ERROR message from the responder.
1823 : * There are tests for all named codes, including some reserved ones
1824 : * (namely, 0x00, 0x0b, 0x0c, 0x3f, 0xfd, 0xfe).
1825 : * However, for having specific test cases, it is excluded from this case:
1826 : * Busy (0x03), ResponseNotReady (0x42), and RequestResync (0x43).
1827 : * Expected behavior: client returns a status of RETURN_DEVICE_ERROR.
1828 : **/
1829 1 : void libspdm_test_requester_psk_finish_case10(void **state) {
1830 : libspdm_return_t status;
1831 : libspdm_test_context_t *spdm_test_context;
1832 : libspdm_context_t *spdm_context;
1833 : uint32_t session_id;
1834 : void *data;
1835 : size_t data_size;
1836 : void *hash;
1837 : size_t hash_size;
1838 : libspdm_session_info_t *session_info;
1839 : uint16_t error_code;
1840 :
1841 1 : spdm_test_context = *state;
1842 1 : spdm_context = spdm_test_context->spdm_context;
1843 1 : spdm_test_context->case_id = 0xA;
1844 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
1845 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1846 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
1847 1 : spdm_context->connection_info.capability.flags |=
1848 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
1849 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
1850 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
1851 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
1852 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
1853 1 : libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
1854 : m_libspdm_use_asym_algo,
1855 : &data, &data_size,
1856 : &hash, &hash_size);
1857 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
1858 1 : spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
1859 1 : spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
1860 1 : spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
1861 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1862 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
1863 : data_size;
1864 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
1865 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
1866 : data, data_size);
1867 : #endif
1868 :
1869 1 : error_code = LIBSPDM_ERROR_CODE_RESERVED_00;
1870 19 : while(error_code <= 0xff) {
1871 18 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1872 18 : libspdm_reset_message_a(spdm_context);
1873 :
1874 18 : session_id = 0xFFFFFFFF;
1875 18 : session_info = &spdm_context->session_info[0];
1876 18 : libspdm_session_info_init (spdm_context, session_info, session_id, true);
1877 18 : libspdm_session_info_set_psk_hint(session_info,
1878 : LIBSPDM_TEST_PSK_HINT_STRING,
1879 : sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
1880 18 : libspdm_secured_message_set_session_state (session_info->secured_message_context,
1881 : LIBSPDM_SESSION_STATE_HANDSHAKING);
1882 18 : libspdm_set_mem (m_libspdm_dummy_key_buffer,
1883 18 : ((libspdm_secured_message_context_t*)(session_info->secured_message_context))->aead_key_size,
1884 : (uint8_t)(0xFF));
1885 18 : libspdm_secured_message_set_response_handshake_encryption_key (
1886 : session_info->secured_message_context, m_libspdm_dummy_key_buffer,
1887 18 : ((libspdm_secured_message_context_t*)(session_info->secured_message_context))->aead_key_size);
1888 18 : libspdm_set_mem (m_libspdm_dummy_salt_buffer,
1889 18 : ((libspdm_secured_message_context_t*)(session_info->secured_message_context))->aead_iv_size,
1890 : (uint8_t)(0xFF));
1891 18 : libspdm_secured_message_set_response_handshake_salt (session_info->secured_message_context,
1892 : m_libspdm_dummy_salt_buffer,
1893 : ((libspdm_secured_message_context_t*)(
1894 18 : session_info->
1895 : secured_message_context))->aead_iv_size);
1896 18 : ((libspdm_secured_message_context_t*)(session_info->secured_message_context))->
1897 : handshake_secret
1898 18 : .response_handshake_sequence_number = 0;
1899 18 : libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
1900 :
1901 18 : status = libspdm_send_receive_psk_finish (spdm_context, session_id);
1902 18 : if(error_code != SPDM_ERROR_CODE_DECRYPT_ERROR) {
1903 17 : LIBSPDM_ASSERT_INT_EQUAL_CASE (status, LIBSPDM_STATUS_ERROR_PEER, error_code);
1904 : } else {
1905 1 : LIBSPDM_ASSERT_INT_EQUAL_CASE (status, LIBSPDM_STATUS_SESSION_MSG_ERROR, error_code);
1906 : }
1907 :
1908 18 : error_code++;
1909 18 : if(error_code == SPDM_ERROR_CODE_BUSY) { /*busy is treated in cases 5 and 6*/
1910 1 : error_code = SPDM_ERROR_CODE_UNEXPECTED_REQUEST;
1911 : }
1912 18 : if(error_code == LIBSPDM_ERROR_CODE_RESERVED_0D) { /*skip some reserved error codes (0d to 3e)*/
1913 1 : error_code = LIBSPDM_ERROR_CODE_RESERVED_3F;
1914 : }
1915 18 : if(error_code == SPDM_ERROR_CODE_RESPONSE_NOT_READY) { /*skip response not ready, request resync, and some reserved codes (44 to fc)*/
1916 1 : error_code = LIBSPDM_ERROR_CODE_RESERVED_FD;
1917 : }
1918 : }
1919 :
1920 1 : free(data);
1921 1 : }
1922 :
1923 1 : void libspdm_test_requester_psk_finish_case11(void **state)
1924 : {
1925 : libspdm_return_t status;
1926 : libspdm_test_context_t *spdm_test_context;
1927 : libspdm_context_t *spdm_context;
1928 : uint32_t session_id;
1929 : void *data;
1930 : size_t data_size;
1931 : void *hash;
1932 : size_t hash_size;
1933 : libspdm_session_info_t *session_info;
1934 :
1935 1 : spdm_test_context = *state;
1936 1 : spdm_context = spdm_test_context->spdm_context;
1937 1 : spdm_test_context->case_id = 0xB;
1938 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
1939 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1940 1 : spdm_context->connection_info.connection_state =
1941 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1942 1 : spdm_context->connection_info.capability.flags |=
1943 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
1944 1 : spdm_context->connection_info.capability.flags |=
1945 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
1946 1 : spdm_context->connection_info.capability.flags |=
1947 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
1948 1 : spdm_context->local_context.capability.flags |=
1949 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
1950 1 : spdm_context->local_context.capability.flags |=
1951 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
1952 1 : spdm_context->local_context.capability.flags |=
1953 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
1954 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
1955 : m_libspdm_use_asym_algo, &data,
1956 : &data_size, &hash, &hash_size);
1957 1 : libspdm_reset_message_a(spdm_context);
1958 :
1959 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1960 : m_libspdm_use_hash_algo;
1961 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1962 : m_libspdm_use_asym_algo;
1963 1 : spdm_context->connection_info.algorithm.dhe_named_group =
1964 : m_libspdm_use_dhe_algo;
1965 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
1966 : m_libspdm_use_aead_algo;
1967 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1968 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
1969 : data_size;
1970 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
1971 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
1972 : data, data_size);
1973 : #endif
1974 :
1975 1 : session_id = 0xFFFFFFFF;
1976 1 : session_info = &spdm_context->session_info[0];
1977 1 : libspdm_session_info_init(spdm_context, session_info, session_id, true);
1978 1 : libspdm_session_info_set_psk_hint(session_info,
1979 : LIBSPDM_TEST_PSK_HINT_STRING,
1980 : sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
1981 1 : libspdm_secured_message_set_session_state(
1982 : session_info->secured_message_context,
1983 : LIBSPDM_SESSION_STATE_HANDSHAKING);
1984 1 : libspdm_set_mem(m_libspdm_dummy_key_buffer,
1985 : ((libspdm_secured_message_context_t
1986 1 : *)(session_info->secured_message_context))
1987 : ->aead_key_size,
1988 : (uint8_t)(0xFF));
1989 1 : libspdm_secured_message_set_response_handshake_encryption_key(
1990 : session_info->secured_message_context, m_libspdm_dummy_key_buffer,
1991 : ((libspdm_secured_message_context_t
1992 1 : *)(session_info->secured_message_context))
1993 : ->aead_key_size);
1994 1 : libspdm_set_mem(m_libspdm_dummy_salt_buffer,
1995 : ((libspdm_secured_message_context_t
1996 1 : *)(session_info->secured_message_context))
1997 : ->aead_iv_size,
1998 : (uint8_t)(0xFF));
1999 1 : libspdm_secured_message_set_response_handshake_salt(
2000 : session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
2001 : ((libspdm_secured_message_context_t
2002 1 : *)(session_info->secured_message_context))
2003 : ->aead_iv_size);
2004 : ((libspdm_secured_message_context_t *)(session_info
2005 1 : ->secured_message_context))
2006 1 : ->handshake_secret.response_handshake_sequence_number = 0;
2007 1 : libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
2008 :
2009 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
2010 : session_info->session_transcript.message_m.buffer_size =
2011 : session_info->session_transcript.message_m.max_buffer_size;
2012 : spdm_context->transcript.message_b.buffer_size =
2013 : spdm_context->transcript.message_b.max_buffer_size;
2014 : spdm_context->transcript.message_c.buffer_size =
2015 : spdm_context->transcript.message_c.max_buffer_size;
2016 : spdm_context->transcript.message_mut_b.buffer_size =
2017 : spdm_context->transcript.message_mut_b.max_buffer_size;
2018 : spdm_context->transcript.message_mut_c.buffer_size =
2019 : spdm_context->transcript.message_mut_c.max_buffer_size;
2020 : #endif
2021 :
2022 1 : status = libspdm_send_receive_psk_finish(spdm_context, session_id);
2023 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
2024 1 : assert_int_equal(
2025 : libspdm_secured_message_get_session_state(
2026 : spdm_context->session_info[0].secured_message_context),
2027 : LIBSPDM_SESSION_STATE_ESTABLISHED);
2028 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
2029 : assert_int_equal(session_info->session_transcript.message_m.buffer_size, 0);
2030 : assert_int_equal(spdm_context->transcript.message_b.buffer_size, 0);
2031 : assert_int_equal(spdm_context->transcript.message_c.buffer_size, 0);
2032 : assert_int_equal(spdm_context->transcript.message_mut_b.buffer_size, 0);
2033 : assert_int_equal(spdm_context->transcript.message_mut_c.buffer_size, 0);
2034 : #endif
2035 1 : free(data);
2036 1 : }
2037 :
2038 : /**
2039 : * Test 12: requester is not setup correctly to support pre-shared keys
2040 : * (no capabilities). The responder would attempt to return a correct
2041 : * PSK_FINISH_RSP message.
2042 : * Expected behavior: client returns a Status of RETURN_UNSUPPORTED.
2043 : **/
2044 1 : void libspdm_test_requester_psk_finish_case12(void **state)
2045 : {
2046 : libspdm_return_t status;
2047 : libspdm_test_context_t *spdm_test_context;
2048 : libspdm_context_t *spdm_context;
2049 : uint32_t session_id;
2050 : void *data;
2051 : size_t data_size;
2052 : void *hash;
2053 : size_t hash_size;
2054 : libspdm_session_info_t *session_info;
2055 :
2056 1 : spdm_test_context = *state;
2057 1 : spdm_context = spdm_test_context->spdm_context;
2058 1 : spdm_test_context->case_id = 0xC;
2059 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
2060 : SPDM_VERSION_NUMBER_SHIFT_BIT;
2061 1 : spdm_context->connection_info.connection_state =
2062 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
2063 : /*no PSK capabilities*/
2064 1 : spdm_context->connection_info.capability.flags &=
2065 : ~(SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP);
2066 1 : spdm_context->connection_info.capability.flags |=
2067 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
2068 1 : spdm_context->connection_info.capability.flags |=
2069 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
2070 1 : spdm_context->local_context.capability.flags |=
2071 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
2072 1 : spdm_context->local_context.capability.flags |=
2073 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
2074 1 : spdm_context->local_context.capability.flags |=
2075 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
2076 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
2077 : m_libspdm_use_asym_algo, &data,
2078 : &data_size, &hash, &hash_size);
2079 1 : spdm_context->transcript.message_a.buffer_size = 0;
2080 1 : spdm_context->connection_info.algorithm.base_hash_algo =
2081 : m_libspdm_use_hash_algo;
2082 1 : spdm_context->connection_info.algorithm.base_asym_algo =
2083 : m_libspdm_use_asym_algo;
2084 1 : spdm_context->connection_info.algorithm.dhe_named_group =
2085 : m_libspdm_use_dhe_algo;
2086 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
2087 : m_libspdm_use_aead_algo;
2088 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
2089 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
2090 : data_size;
2091 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
2092 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
2093 : data, data_size);
2094 : #endif
2095 :
2096 1 : session_id = 0xFFFFFFFF;
2097 1 : session_info = &spdm_context->session_info[0];
2098 1 : libspdm_session_info_init(spdm_context, session_info, session_id, true);
2099 1 : libspdm_session_info_set_psk_hint(session_info,
2100 : LIBSPDM_TEST_PSK_HINT_STRING,
2101 : sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
2102 1 : libspdm_secured_message_set_session_state(
2103 : session_info->secured_message_context,
2104 : LIBSPDM_SESSION_STATE_HANDSHAKING);
2105 1 : libspdm_set_mem(m_libspdm_dummy_key_buffer,
2106 : ((libspdm_secured_message_context_t
2107 1 : *)(session_info->secured_message_context))
2108 : ->aead_key_size,
2109 : (uint8_t)(0xFF));
2110 1 : libspdm_secured_message_set_response_handshake_encryption_key(
2111 : session_info->secured_message_context, m_libspdm_dummy_key_buffer,
2112 : ((libspdm_secured_message_context_t
2113 1 : *)(session_info->secured_message_context))
2114 : ->aead_key_size);
2115 1 : libspdm_set_mem(m_libspdm_dummy_salt_buffer,
2116 : ((libspdm_secured_message_context_t
2117 1 : *)(session_info->secured_message_context))
2118 : ->aead_iv_size,
2119 : (uint8_t)(0xFF));
2120 1 : libspdm_secured_message_set_response_handshake_salt(
2121 : session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
2122 : ((libspdm_secured_message_context_t
2123 1 : *)(session_info->secured_message_context))
2124 : ->aead_iv_size);
2125 : ((libspdm_secured_message_context_t *)(session_info
2126 1 : ->secured_message_context))
2127 1 : ->handshake_secret.response_handshake_sequence_number = 0;
2128 1 : libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
2129 :
2130 1 : status = libspdm_send_receive_psk_finish(spdm_context, session_id);
2131 1 : assert_int_equal(status, LIBSPDM_STATUS_UNSUPPORTED_CAP);
2132 1 : free(data);
2133 1 : }
2134 :
2135 : /**
2136 : * Test 13: receiving an incorrect FINISH_RSP message, with wrong response
2137 : * code, but all other field correct.
2138 : * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR.
2139 : **/
2140 1 : void libspdm_test_requester_psk_finish_case13(void **state)
2141 : {
2142 : libspdm_return_t status;
2143 : libspdm_test_context_t *spdm_test_context;
2144 : libspdm_context_t *spdm_context;
2145 : uint32_t session_id;
2146 : void *data;
2147 : size_t data_size;
2148 : void *hash;
2149 : size_t hash_size;
2150 : libspdm_session_info_t *session_info;
2151 :
2152 1 : spdm_test_context = *state;
2153 1 : spdm_context = spdm_test_context->spdm_context;
2154 1 : spdm_test_context->case_id = 0xD;
2155 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
2156 : SPDM_VERSION_NUMBER_SHIFT_BIT;
2157 1 : spdm_context->connection_info.connection_state =
2158 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
2159 : /*no PSK capabilities*/
2160 1 : spdm_context->connection_info.capability.flags |=
2161 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
2162 1 : spdm_context->connection_info.capability.flags |=
2163 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
2164 1 : spdm_context->connection_info.capability.flags |=
2165 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
2166 1 : spdm_context->local_context.capability.flags |=
2167 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
2168 1 : spdm_context->local_context.capability.flags |=
2169 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
2170 1 : spdm_context->local_context.capability.flags |=
2171 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
2172 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
2173 : m_libspdm_use_asym_algo, &data,
2174 : &data_size, &hash, &hash_size);
2175 1 : spdm_context->transcript.message_a.buffer_size = 0;
2176 1 : spdm_context->connection_info.algorithm.base_hash_algo =
2177 : m_libspdm_use_hash_algo;
2178 1 : spdm_context->connection_info.algorithm.base_asym_algo =
2179 : m_libspdm_use_asym_algo;
2180 1 : spdm_context->connection_info.algorithm.dhe_named_group =
2181 : m_libspdm_use_dhe_algo;
2182 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
2183 : m_libspdm_use_aead_algo;
2184 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
2185 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
2186 : data_size;
2187 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
2188 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
2189 : data, data_size);
2190 : #endif
2191 :
2192 1 : session_id = 0xFFFFFFFF;
2193 1 : session_info = &spdm_context->session_info[0];
2194 1 : libspdm_session_info_init(spdm_context, session_info, session_id, true);
2195 1 : libspdm_session_info_set_psk_hint(session_info,
2196 : LIBSPDM_TEST_PSK_HINT_STRING,
2197 : sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
2198 1 : libspdm_secured_message_set_session_state(
2199 : session_info->secured_message_context,
2200 : LIBSPDM_SESSION_STATE_HANDSHAKING);
2201 1 : libspdm_set_mem(m_libspdm_dummy_key_buffer,
2202 : ((libspdm_secured_message_context_t
2203 1 : *)(session_info->secured_message_context))
2204 : ->aead_key_size,
2205 : (uint8_t)(0xFF));
2206 1 : libspdm_secured_message_set_response_handshake_encryption_key(
2207 : session_info->secured_message_context, m_libspdm_dummy_key_buffer,
2208 : ((libspdm_secured_message_context_t
2209 1 : *)(session_info->secured_message_context))
2210 : ->aead_key_size);
2211 1 : libspdm_set_mem(m_libspdm_dummy_salt_buffer,
2212 : ((libspdm_secured_message_context_t
2213 1 : *)(session_info->secured_message_context))
2214 : ->aead_iv_size,
2215 : (uint8_t)(0xFF));
2216 1 : libspdm_secured_message_set_response_handshake_salt(
2217 : session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
2218 : ((libspdm_secured_message_context_t
2219 1 : *)(session_info->secured_message_context))
2220 : ->aead_iv_size);
2221 : ((libspdm_secured_message_context_t *)(session_info
2222 1 : ->secured_message_context))
2223 1 : ->handshake_secret.response_handshake_sequence_number = 0;
2224 1 : libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
2225 :
2226 1 : status = libspdm_send_receive_psk_finish(spdm_context, session_id);
2227 1 : assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
2228 1 : free(data);
2229 1 : }
2230 :
2231 : /**
2232 : * Test 14: requester is not setup correctly by not initializing a
2233 : * session during PSK_EXCHANGE. The responder would attempt to
2234 : * return a correct PSK_FINISH_RSP message.
2235 : * Expected behavior: client returns a Status of RETURN_UNSUPPORTED.
2236 : **/
2237 1 : void libspdm_test_requester_psk_finish_case14(void **state)
2238 : {
2239 : libspdm_return_t status;
2240 : libspdm_test_context_t *spdm_test_context;
2241 : libspdm_context_t *spdm_context;
2242 : uint32_t session_id;
2243 : void *data;
2244 : size_t data_size;
2245 : void *hash;
2246 : size_t hash_size;
2247 : libspdm_session_info_t *session_info;
2248 :
2249 1 : spdm_test_context = *state;
2250 1 : spdm_context = spdm_test_context->spdm_context;
2251 1 : spdm_test_context->case_id = 0xE;
2252 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
2253 : SPDM_VERSION_NUMBER_SHIFT_BIT;
2254 1 : spdm_context->connection_info.connection_state =
2255 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
2256 : /*no PSK capabilities*/
2257 1 : spdm_context->connection_info.capability.flags |=
2258 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
2259 1 : spdm_context->connection_info.capability.flags |=
2260 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
2261 1 : spdm_context->connection_info.capability.flags |=
2262 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
2263 1 : spdm_context->local_context.capability.flags |=
2264 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
2265 1 : spdm_context->local_context.capability.flags |=
2266 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
2267 1 : spdm_context->local_context.capability.flags |=
2268 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
2269 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
2270 : m_libspdm_use_asym_algo, &data,
2271 : &data_size, &hash, &hash_size);
2272 1 : spdm_context->transcript.message_a.buffer_size = 0;
2273 1 : spdm_context->connection_info.algorithm.base_hash_algo =
2274 : m_libspdm_use_hash_algo;
2275 1 : spdm_context->connection_info.algorithm.base_asym_algo =
2276 : m_libspdm_use_asym_algo;
2277 1 : spdm_context->connection_info.algorithm.dhe_named_group =
2278 : m_libspdm_use_dhe_algo;
2279 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
2280 : m_libspdm_use_aead_algo;
2281 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
2282 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
2283 : data_size;
2284 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
2285 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
2286 : data, data_size);
2287 : #endif
2288 :
2289 1 : session_id = 0xFFFFFFFF;
2290 1 : session_info = &spdm_context->session_info[0];
2291 1 : libspdm_session_info_init(spdm_context, session_info, session_id, true);
2292 1 : libspdm_session_info_set_psk_hint(session_info,
2293 : LIBSPDM_TEST_PSK_HINT_STRING,
2294 : sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
2295 1 : libspdm_secured_message_set_session_state(
2296 : session_info->secured_message_context,
2297 : LIBSPDM_SESSION_STATE_NOT_STARTED);
2298 1 : libspdm_set_mem(m_libspdm_dummy_key_buffer,
2299 : ((libspdm_secured_message_context_t
2300 1 : *)(session_info->secured_message_context))
2301 : ->aead_key_size,
2302 : (uint8_t)(0xFF));
2303 1 : libspdm_secured_message_set_response_handshake_encryption_key(
2304 : session_info->secured_message_context, m_libspdm_dummy_key_buffer,
2305 : ((libspdm_secured_message_context_t
2306 1 : *)(session_info->secured_message_context))
2307 : ->aead_key_size);
2308 1 : libspdm_set_mem(m_libspdm_dummy_salt_buffer,
2309 : ((libspdm_secured_message_context_t
2310 1 : *)(session_info->secured_message_context))
2311 : ->aead_iv_size,
2312 : (uint8_t)(0xFF));
2313 1 : libspdm_secured_message_set_response_handshake_salt(
2314 : session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
2315 : ((libspdm_secured_message_context_t
2316 1 : *)(session_info->secured_message_context))
2317 : ->aead_iv_size);
2318 : ((libspdm_secured_message_context_t *)(session_info
2319 1 : ->secured_message_context))
2320 1 : ->handshake_secret.response_handshake_sequence_number = 0;
2321 1 : libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
2322 :
2323 1 : status = libspdm_send_receive_psk_finish(spdm_context, session_id);
2324 1 : assert_int_equal(status, LIBSPDM_STATUS_INVALID_STATE_LOCAL);
2325 1 : free(data);
2326 1 : }
2327 :
2328 : /**
2329 : * Test 15 the requester is setup correctly, but receives an ERROR with SPDM_ERROR_CODE_DECRYPT_ERROR.
2330 : * Expected behavior: client returns a Status of INVALID_SESSION_ID and free the session ID.
2331 : **/
2332 1 : void libspdm_test_requester_psk_finish_case15(void **state)
2333 : {
2334 : libspdm_return_t status;
2335 : libspdm_test_context_t *spdm_test_context;
2336 : libspdm_context_t *spdm_context;
2337 : uint32_t session_id;
2338 : void *data;
2339 : size_t data_size;
2340 : void *hash;
2341 : size_t hash_size;
2342 : libspdm_session_info_t *session_info;
2343 :
2344 1 : spdm_test_context = *state;
2345 1 : spdm_context = spdm_test_context->spdm_context;
2346 1 : spdm_test_context->case_id = 0xF;
2347 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
2348 : SPDM_VERSION_NUMBER_SHIFT_BIT;
2349 1 : spdm_context->connection_info.connection_state =
2350 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
2351 1 : spdm_context->connection_info.capability.flags |=
2352 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
2353 1 : spdm_context->connection_info.capability.flags |=
2354 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
2355 1 : spdm_context->connection_info.capability.flags |=
2356 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
2357 1 : spdm_context->local_context.capability.flags |=
2358 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
2359 1 : spdm_context->local_context.capability.flags |=
2360 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
2361 1 : spdm_context->local_context.capability.flags |=
2362 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
2363 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
2364 : m_libspdm_use_asym_algo, &data,
2365 : &data_size, &hash, &hash_size);
2366 1 : libspdm_reset_message_a(spdm_context);
2367 1 : spdm_context->connection_info.algorithm.base_hash_algo =
2368 : m_libspdm_use_hash_algo;
2369 1 : spdm_context->connection_info.algorithm.base_asym_algo =
2370 : m_libspdm_use_asym_algo;
2371 1 : spdm_context->connection_info.algorithm.dhe_named_group =
2372 : m_libspdm_use_dhe_algo;
2373 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
2374 : m_libspdm_use_aead_algo;
2375 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
2376 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
2377 : data_size;
2378 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
2379 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
2380 : data, data_size);
2381 : #endif
2382 :
2383 1 : session_id = 0xFFFFFFFF;
2384 1 : session_info = &spdm_context->session_info[0];
2385 1 : libspdm_session_info_init(spdm_context, session_info, session_id, true);
2386 1 : libspdm_session_info_set_psk_hint(session_info,
2387 : LIBSPDM_TEST_PSK_HINT_STRING,
2388 : sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
2389 1 : libspdm_secured_message_set_session_state(
2390 : session_info->secured_message_context,
2391 : LIBSPDM_SESSION_STATE_HANDSHAKING);
2392 1 : libspdm_set_mem(m_libspdm_dummy_key_buffer,
2393 : ((libspdm_secured_message_context_t
2394 1 : *)(session_info->secured_message_context))
2395 : ->aead_key_size,
2396 : (uint8_t)(0xFF));
2397 1 : libspdm_secured_message_set_response_handshake_encryption_key(
2398 : session_info->secured_message_context, m_libspdm_dummy_key_buffer,
2399 : ((libspdm_secured_message_context_t
2400 1 : *)(session_info->secured_message_context))
2401 : ->aead_key_size);
2402 1 : libspdm_set_mem(m_libspdm_dummy_salt_buffer,
2403 : ((libspdm_secured_message_context_t
2404 1 : *)(session_info->secured_message_context))
2405 : ->aead_iv_size,
2406 : (uint8_t)(0xFF));
2407 1 : libspdm_secured_message_set_response_handshake_salt(
2408 : session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
2409 : ((libspdm_secured_message_context_t
2410 1 : *)(session_info->secured_message_context))
2411 : ->aead_iv_size);
2412 : ((libspdm_secured_message_context_t *)(session_info
2413 1 : ->secured_message_context))
2414 1 : ->handshake_secret.response_handshake_sequence_number = 0;
2415 1 : libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
2416 :
2417 1 : status = libspdm_send_receive_psk_finish(spdm_context, session_id);
2418 1 : assert_int_equal(status, LIBSPDM_STATUS_SESSION_MSG_ERROR);
2419 1 : assert_int_equal(spdm_context->session_info->session_id, INVALID_SESSION_ID);
2420 1 : free(data);
2421 1 : }
2422 :
2423 : /**
2424 : * Test 16: a request message is successfully sent and a response message is successfully received.
2425 : * Expected Behavior: requester returns the status RETURN_SUCCESS and a PSK_FINISH_RSP message is
2426 : * received, buffer F appends the exchanged PSK_FINISH and PSK_FINISH_RSP messages.
2427 : **/
2428 1 : void libspdm_test_requester_psk_finish_case16(void **state)
2429 : {
2430 : libspdm_return_t status;
2431 : libspdm_test_context_t *spdm_test_context;
2432 : libspdm_context_t *spdm_context;
2433 : uint32_t session_id;
2434 : void *data;
2435 : size_t data_size;
2436 : void *hash;
2437 : size_t hash_size;
2438 : libspdm_session_info_t *session_info;
2439 :
2440 1 : spdm_test_context = *state;
2441 1 : spdm_context = spdm_test_context->spdm_context;
2442 1 : spdm_test_context->case_id = 0x10;
2443 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
2444 : SPDM_VERSION_NUMBER_SHIFT_BIT;
2445 1 : spdm_context->connection_info.connection_state =
2446 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
2447 1 : spdm_context->connection_info.capability.flags |=
2448 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
2449 1 : spdm_context->connection_info.capability.flags |=
2450 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
2451 1 : spdm_context->connection_info.capability.flags |=
2452 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
2453 1 : spdm_context->local_context.capability.flags |=
2454 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
2455 1 : spdm_context->local_context.capability.flags |=
2456 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
2457 1 : spdm_context->local_context.capability.flags |=
2458 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
2459 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
2460 : m_libspdm_use_asym_algo, &data,
2461 : &data_size, &hash, &hash_size);
2462 1 : libspdm_reset_message_a(spdm_context);
2463 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
2464 1 : spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
2465 1 : spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
2466 1 : spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
2467 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
2468 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
2469 : data_size;
2470 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
2471 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
2472 : data, data_size);
2473 : #endif
2474 :
2475 :
2476 1 : session_id = 0xFFFFFFFF;
2477 1 : session_info = &spdm_context->session_info[0];
2478 1 : libspdm_session_info_init(spdm_context, session_info, session_id, true);
2479 1 : libspdm_session_info_set_psk_hint(session_info,
2480 : LIBSPDM_TEST_PSK_HINT_STRING,
2481 : sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
2482 1 : libspdm_secured_message_set_session_state(
2483 : session_info->secured_message_context,
2484 : LIBSPDM_SESSION_STATE_HANDSHAKING);
2485 1 : libspdm_set_mem(m_libspdm_dummy_key_buffer,
2486 1 : ((libspdm_secured_message_context_t*)(session_info->secured_message_context))
2487 : ->aead_key_size, (uint8_t)(0xFF));
2488 1 : libspdm_secured_message_set_response_handshake_encryption_key(
2489 : session_info->secured_message_context, m_libspdm_dummy_key_buffer,
2490 1 : ((libspdm_secured_message_context_t*)(session_info->secured_message_context))
2491 : ->aead_key_size);
2492 1 : libspdm_set_mem(m_libspdm_dummy_salt_buffer,
2493 1 : ((libspdm_secured_message_context_t*)(session_info->secured_message_context))
2494 : ->aead_iv_size, (uint8_t)(0xFF));
2495 1 : libspdm_secured_message_set_response_handshake_salt(
2496 : session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
2497 1 : ((libspdm_secured_message_context_t*)(session_info->secured_message_context))
2498 : ->aead_iv_size);
2499 1 : ((libspdm_secured_message_context_t *)(session_info->secured_message_context))
2500 1 : ->handshake_secret.response_handshake_sequence_number = 0;
2501 1 : ((libspdm_secured_message_context_t *)(session_info->secured_message_context))
2502 1 : ->handshake_secret.request_handshake_sequence_number = 0;
2503 1 : libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
2504 :
2505 1 : status = libspdm_send_receive_psk_finish(spdm_context, session_id);
2506 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
2507 1 : assert_int_equal(
2508 : libspdm_secured_message_get_session_state(
2509 : spdm_context->session_info[0].secured_message_context),
2510 : LIBSPDM_SESSION_STATE_ESTABLISHED);
2511 :
2512 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
2513 : assert_int_equal(spdm_context->session_info[0].session_transcript.message_f.buffer_size,
2514 : m_libspdm_local_buffer_size);
2515 : LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "m_libspdm_local_buffer (0x%x):\n",
2516 : m_libspdm_local_buffer_size));
2517 : libspdm_dump_hex(m_libspdm_local_buffer, m_libspdm_local_buffer_size);
2518 : assert_memory_equal(spdm_context->session_info[0].session_transcript.message_f.buffer,
2519 : m_libspdm_local_buffer, m_libspdm_local_buffer_size);
2520 : #endif
2521 1 : free(data);
2522 1 : }
2523 :
2524 : /**
2525 : * Test 17: SPDM version 1.4, with OpaqueData
2526 : * Expected Behavior: requester returns the status RETURN_SUCCESS and a PSK_FINISH_RSP message is
2527 : * received.
2528 : **/
2529 1 : void libspdm_test_requester_psk_finish_case17(void **state)
2530 : {
2531 : libspdm_return_t status;
2532 : libspdm_test_context_t *spdm_test_context;
2533 : libspdm_context_t *spdm_context;
2534 : uint32_t session_id;
2535 : void *data;
2536 : size_t data_size;
2537 : void *hash;
2538 : size_t hash_size;
2539 : libspdm_session_info_t *session_info;
2540 :
2541 1 : spdm_test_context = *state;
2542 1 : spdm_context = spdm_test_context->spdm_context;
2543 1 : spdm_test_context->case_id = 0x11;
2544 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_14 <<
2545 : SPDM_VERSION_NUMBER_SHIFT_BIT;
2546 1 : spdm_context->connection_info.connection_state =
2547 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
2548 1 : spdm_context->connection_info.capability.flags |=
2549 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
2550 1 : spdm_context->connection_info.capability.flags |=
2551 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
2552 1 : spdm_context->connection_info.capability.flags |=
2553 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
2554 1 : spdm_context->local_context.capability.flags |=
2555 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
2556 1 : spdm_context->local_context.capability.flags |=
2557 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
2558 1 : spdm_context->local_context.capability.flags |=
2559 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
2560 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
2561 : m_libspdm_use_asym_algo, &data,
2562 : &data_size, &hash, &hash_size);
2563 1 : libspdm_reset_message_a(spdm_context);
2564 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
2565 1 : spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
2566 1 : spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
2567 1 : spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
2568 :
2569 1 : session_id = 0xFFFFFFFF;
2570 1 : session_info = &spdm_context->session_info[0];
2571 1 : libspdm_session_info_init(spdm_context, session_info, session_id, true);
2572 1 : libspdm_session_info_set_psk_hint(session_info,
2573 : LIBSPDM_TEST_PSK_HINT_STRING,
2574 : sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
2575 1 : libspdm_secured_message_set_session_state(
2576 : session_info->secured_message_context,
2577 : LIBSPDM_SESSION_STATE_HANDSHAKING);
2578 1 : libspdm_set_mem(m_libspdm_dummy_key_buffer,
2579 1 : ((libspdm_secured_message_context_t*)(session_info->secured_message_context))
2580 : ->aead_key_size, (uint8_t)(0xFF));
2581 1 : libspdm_secured_message_set_response_handshake_encryption_key(
2582 : session_info->secured_message_context, m_libspdm_dummy_key_buffer,
2583 1 : ((libspdm_secured_message_context_t*)(session_info->secured_message_context))
2584 : ->aead_key_size);
2585 1 : libspdm_set_mem(m_libspdm_dummy_salt_buffer,
2586 1 : ((libspdm_secured_message_context_t*)(session_info->secured_message_context))
2587 : ->aead_iv_size, (uint8_t)(0xFF));
2588 1 : libspdm_secured_message_set_response_handshake_salt(
2589 : session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
2590 1 : ((libspdm_secured_message_context_t*)(session_info->secured_message_context))
2591 : ->aead_iv_size);
2592 1 : ((libspdm_secured_message_context_t *)(session_info->secured_message_context))
2593 1 : ->handshake_secret.response_handshake_sequence_number = 0;
2594 1 : ((libspdm_secured_message_context_t *)(session_info->secured_message_context))
2595 1 : ->handshake_secret.request_handshake_sequence_number = 0;
2596 1 : libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
2597 :
2598 1 : status = libspdm_send_receive_psk_finish(spdm_context, session_id);
2599 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
2600 1 : assert_int_equal(
2601 : libspdm_secured_message_get_session_state(
2602 : spdm_context->session_info[0].secured_message_context),
2603 : LIBSPDM_SESSION_STATE_ESTABLISHED);
2604 :
2605 1 : free(data);
2606 1 : }
2607 :
2608 1 : int libspdm_requester_psk_finish_test_main(void)
2609 : {
2610 1 : const struct CMUnitTest spdm_requester_psk_finish_tests[] = {
2611 : /* SendRequest failed*/
2612 : cmocka_unit_test(libspdm_test_requester_psk_finish_case1),
2613 : /* Successful response*/
2614 : cmocka_unit_test(libspdm_test_requester_psk_finish_case2),
2615 : /* connection_state check failed*/
2616 : cmocka_unit_test(libspdm_test_requester_psk_finish_case3),
2617 : /* Error response: SPDM_ERROR_CODE_INVALID_REQUEST*/
2618 : cmocka_unit_test(libspdm_test_requester_psk_finish_case4),
2619 : /* Always SPDM_ERROR_CODE_BUSY*/
2620 : cmocka_unit_test(libspdm_test_requester_psk_finish_case5),
2621 : /* SPDM_ERROR_CODE_BUSY + Successful response*/
2622 : cmocka_unit_test(libspdm_test_requester_psk_finish_case6),
2623 : /* Error response: SPDM_ERROR_CODE_REQUEST_RESYNCH*/
2624 : cmocka_unit_test(libspdm_test_requester_psk_finish_case7),
2625 : /* Always SPDM_ERROR_CODE_RESPONSE_NOT_READY*/
2626 : cmocka_unit_test(libspdm_test_requester_psk_finish_case8),
2627 : /* SPDM_ERROR_CODE_RESPONSE_NOT_READY + Successful response*/
2628 : cmocka_unit_test(libspdm_test_requester_psk_finish_case9),
2629 : /* Unexpected errors*/
2630 : cmocka_unit_test(libspdm_test_requester_psk_finish_case10),
2631 : /* Buffer reset*/
2632 : cmocka_unit_test(libspdm_test_requester_psk_finish_case11),
2633 : /* No correct setup*/
2634 : cmocka_unit_test(libspdm_test_requester_psk_finish_case12),
2635 : /* Wrong response code*/
2636 : cmocka_unit_test(libspdm_test_requester_psk_finish_case13),
2637 : /* Uninitialized session*/
2638 : cmocka_unit_test(libspdm_test_requester_psk_finish_case14),
2639 : /* Error response: SPDM_ERROR_CODE_DECRYPT_ERROR*/
2640 : cmocka_unit_test(libspdm_test_requester_psk_finish_case15),
2641 : /* Buffer verification*/
2642 : cmocka_unit_test(libspdm_test_requester_psk_finish_case16),
2643 : /* SPDM 1.4 with OpaqueData */
2644 : cmocka_unit_test(libspdm_test_requester_psk_finish_case17),
2645 : };
2646 :
2647 1 : libspdm_test_context_t test_context = {
2648 : LIBSPDM_TEST_CONTEXT_VERSION,
2649 : true,
2650 : libspdm_requester_psk_finish_test_send_message,
2651 : libspdm_requester_psk_finish_test_receive_message,
2652 : };
2653 :
2654 1 : libspdm_setup_test_context(&test_context);
2655 :
2656 1 : return cmocka_run_group_tests(spdm_requester_psk_finish_tests,
2657 : libspdm_unit_test_group_setup,
2658 : libspdm_unit_test_group_teardown);
2659 : }
2660 :
2661 : #endif /* LIBSPDM_ENABLE_CAPABILITY_PSK_CAP*/
|