LCOV - code coverage report
Current view: top level - unit_test/test_spdm_requester - psk_finish.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 91.0 % 1121 1020
Test Date: 2025-09-14 08:11:04 Functions: 100.0 % 23 23

            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 :     if (!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            0 :         assert(false);
    1003              :     }
    1004            1 :     libspdm_reset_message_a(spdm_context);
    1005            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1006              :         m_libspdm_use_hash_algo;
    1007            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    1008              :         m_libspdm_use_asym_algo;
    1009            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
    1010              :         m_libspdm_use_dhe_algo;
    1011            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
    1012              :         m_libspdm_use_aead_algo;
    1013              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1014              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    1015              :         data_size;
    1016              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    1017              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    1018              :                      data, data_size);
    1019              : #endif
    1020              : 
    1021            1 :     session_id = 0xFFFFFFFF;
    1022            1 :     session_info = &spdm_context->session_info[0];
    1023            1 :     libspdm_session_info_init(spdm_context, session_info, session_id, true);
    1024            1 :     libspdm_session_info_set_psk_hint(session_info,
    1025              :                                       LIBSPDM_TEST_PSK_HINT_STRING,
    1026              :                                       sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
    1027            1 :     libspdm_secured_message_set_session_state(
    1028              :         session_info->secured_message_context,
    1029              :         LIBSPDM_SESSION_STATE_HANDSHAKING);
    1030            1 :     libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
    1031              : 
    1032            1 :     status = libspdm_send_receive_psk_finish(spdm_context, session_id);
    1033            1 :     assert_int_equal(status, LIBSPDM_STATUS_SEND_FAIL);
    1034            1 :     free(data);
    1035            1 : }
    1036              : 
    1037              : /**
    1038              :  * Test 2: receiving a correct PSK_FINISH_RSP message.
    1039              :  * Expected behavior: client returns a Status of RETURN_SUCCESS and
    1040              :  * session is established.
    1041              :  **/
    1042            1 : void libspdm_test_requester_psk_finish_case2(void **state)
    1043              : {
    1044              :     libspdm_return_t status;
    1045              :     libspdm_test_context_t *spdm_test_context;
    1046              :     libspdm_context_t *spdm_context;
    1047              :     uint32_t session_id;
    1048              :     void *data;
    1049              :     size_t data_size;
    1050              :     void *hash;
    1051              :     size_t hash_size;
    1052              :     libspdm_session_info_t *session_info;
    1053              : 
    1054            1 :     spdm_test_context = *state;
    1055            1 :     spdm_context = spdm_test_context->spdm_context;
    1056            1 :     spdm_test_context->case_id = 0x2;
    1057            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1058              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1059            1 :     spdm_context->connection_info.connection_state =
    1060              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1061            1 :     spdm_context->connection_info.capability.flags |=
    1062              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    1063            1 :     spdm_context->connection_info.capability.flags |=
    1064              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
    1065            1 :     spdm_context->connection_info.capability.flags |=
    1066              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
    1067            1 :     spdm_context->local_context.capability.flags |=
    1068              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    1069            1 :     spdm_context->local_context.capability.flags |=
    1070              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
    1071            1 :     spdm_context->local_context.capability.flags |=
    1072              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
    1073            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1074              :                                                          m_libspdm_use_asym_algo, &data,
    1075              :                                                          &data_size, &hash, &hash_size)) {
    1076            0 :         assert(false);
    1077              :     }
    1078            1 :     libspdm_reset_message_a(spdm_context);
    1079            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1080              :         m_libspdm_use_hash_algo;
    1081            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    1082              :         m_libspdm_use_asym_algo;
    1083            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
    1084              :         m_libspdm_use_dhe_algo;
    1085            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
    1086              :         m_libspdm_use_aead_algo;
    1087              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1088              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    1089              :         data_size;
    1090              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    1091              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    1092              :                      data, data_size);
    1093              : #endif
    1094              : 
    1095            1 :     session_id = 0xFFFFFFFF;
    1096            1 :     session_info = &spdm_context->session_info[0];
    1097            1 :     libspdm_session_info_init(spdm_context, session_info, session_id, true);
    1098            1 :     libspdm_session_info_set_psk_hint(session_info,
    1099              :                                       LIBSPDM_TEST_PSK_HINT_STRING,
    1100              :                                       sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
    1101            1 :     libspdm_secured_message_set_session_state(
    1102              :         session_info->secured_message_context,
    1103              :         LIBSPDM_SESSION_STATE_HANDSHAKING);
    1104            1 :     libspdm_set_mem(m_libspdm_dummy_key_buffer,
    1105              :                     ((libspdm_secured_message_context_t
    1106            1 :                       *)(session_info->secured_message_context))
    1107              :                     ->aead_key_size,
    1108              :                     (uint8_t)(0xFF));
    1109            1 :     libspdm_secured_message_set_response_handshake_encryption_key(
    1110              :         session_info->secured_message_context, m_libspdm_dummy_key_buffer,
    1111              :         ((libspdm_secured_message_context_t
    1112            1 :           *)(session_info->secured_message_context))
    1113              :         ->aead_key_size);
    1114            1 :     libspdm_set_mem(m_libspdm_dummy_salt_buffer,
    1115              :                     ((libspdm_secured_message_context_t
    1116            1 :                       *)(session_info->secured_message_context))
    1117              :                     ->aead_iv_size,
    1118              :                     (uint8_t)(0xFF));
    1119            1 :     libspdm_secured_message_set_response_handshake_salt(
    1120              :         session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
    1121              :         ((libspdm_secured_message_context_t
    1122            1 :           *)(session_info->secured_message_context))
    1123              :         ->aead_iv_size);
    1124              :     ((libspdm_secured_message_context_t *)(session_info
    1125            1 :                                            ->secured_message_context))
    1126            1 :     ->handshake_secret.response_handshake_sequence_number = 0;
    1127            1 :     libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
    1128              : 
    1129            1 :     status = libspdm_send_receive_psk_finish(spdm_context, session_id);
    1130            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1131            1 :     assert_int_equal(
    1132              :         libspdm_secured_message_get_session_state(
    1133              :             spdm_context->session_info[0].secured_message_context),
    1134              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
    1135            1 :     free(data);
    1136            1 : }
    1137              : 
    1138              : /**
    1139              :  * Test 3: requester state has not been negotiated, as if GET_VERSION,
    1140              :  * GET_CAPABILITIES and NEGOTIATE_ALGORITHMS had not been exchanged.
    1141              :  * Expected behavior: client returns a Status of RETURN_UNSUPPORTED.
    1142              :  **/
    1143            1 : void libspdm_test_requester_psk_finish_case3(void **state)
    1144              : {
    1145              :     libspdm_return_t status;
    1146              :     libspdm_test_context_t *spdm_test_context;
    1147              :     libspdm_context_t *spdm_context;
    1148              :     uint32_t session_id;
    1149              :     void *data;
    1150              :     size_t data_size;
    1151              :     void *hash;
    1152              :     size_t hash_size;
    1153              :     libspdm_session_info_t *session_info;
    1154              : 
    1155            1 :     spdm_test_context = *state;
    1156            1 :     spdm_context = spdm_test_context->spdm_context;
    1157            1 :     spdm_test_context->case_id = 0x3;
    1158            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1159              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1160            1 :     spdm_context->connection_info.connection_state =
    1161              :         LIBSPDM_CONNECTION_STATE_NOT_STARTED;
    1162            1 :     spdm_context->connection_info.capability.flags |=
    1163              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    1164            1 :     spdm_context->connection_info.capability.flags |=
    1165              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
    1166            1 :     spdm_context->connection_info.capability.flags |=
    1167              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
    1168            1 :     spdm_context->local_context.capability.flags |=
    1169              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    1170            1 :     spdm_context->local_context.capability.flags |=
    1171              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
    1172            1 :     spdm_context->local_context.capability.flags |=
    1173              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
    1174            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1175              :                                                          m_libspdm_use_asym_algo, &data,
    1176              :                                                          &data_size, &hash, &hash_size)) {
    1177            0 :         assert(false);
    1178              :     }
    1179            1 :     libspdm_reset_message_a(spdm_context);
    1180            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1181              :         m_libspdm_use_hash_algo;
    1182            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    1183              :         m_libspdm_use_asym_algo;
    1184            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
    1185              :         m_libspdm_use_dhe_algo;
    1186            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
    1187              :         m_libspdm_use_aead_algo;
    1188              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1189              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    1190              :         data_size;
    1191              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    1192              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    1193              :                      data, data_size);
    1194              : #endif
    1195              : 
    1196            1 :     session_id = 0xFFFFFFFF;
    1197            1 :     session_info = &spdm_context->session_info[0];
    1198            1 :     libspdm_session_info_init(spdm_context, session_info, session_id, true);
    1199            1 :     libspdm_session_info_set_psk_hint(session_info,
    1200              :                                       LIBSPDM_TEST_PSK_HINT_STRING,
    1201              :                                       sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
    1202            1 :     libspdm_secured_message_set_session_state(
    1203              :         session_info->secured_message_context,
    1204              :         LIBSPDM_SESSION_STATE_HANDSHAKING);
    1205            1 :     libspdm_set_mem(m_libspdm_dummy_key_buffer,
    1206              :                     ((libspdm_secured_message_context_t
    1207            1 :                       *)(session_info->secured_message_context))
    1208              :                     ->aead_key_size,
    1209              :                     (uint8_t)(0xFF));
    1210            1 :     libspdm_secured_message_set_response_handshake_encryption_key(
    1211              :         session_info->secured_message_context, m_libspdm_dummy_key_buffer,
    1212              :         ((libspdm_secured_message_context_t
    1213            1 :           *)(session_info->secured_message_context))
    1214              :         ->aead_key_size);
    1215            1 :     libspdm_set_mem(m_libspdm_dummy_salt_buffer,
    1216              :                     ((libspdm_secured_message_context_t
    1217            1 :                       *)(session_info->secured_message_context))
    1218              :                     ->aead_iv_size,
    1219              :                     (uint8_t)(0xFF));
    1220            1 :     libspdm_secured_message_set_response_handshake_salt(
    1221              :         session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
    1222              :         ((libspdm_secured_message_context_t
    1223            1 :           *)(session_info->secured_message_context))
    1224              :         ->aead_iv_size);
    1225              :     ((libspdm_secured_message_context_t *)(session_info
    1226            1 :                                            ->secured_message_context))
    1227            1 :     ->handshake_secret.response_handshake_sequence_number = 0;
    1228            1 :     libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
    1229              : 
    1230            1 :     status = libspdm_send_receive_psk_finish(spdm_context, session_id);
    1231            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_STATE_LOCAL);
    1232            1 :     free(data);
    1233            1 : }
    1234              : 
    1235              : /**
    1236              :  * Test 4: the requester is setup correctly, but receives an ERROR message
    1237              :  * indicating InvalidParameters.
    1238              :  * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR.
    1239              :  **/
    1240            1 : void libspdm_test_requester_psk_finish_case4(void **state)
    1241              : {
    1242              :     libspdm_return_t status;
    1243              :     libspdm_test_context_t *spdm_test_context;
    1244              :     libspdm_context_t *spdm_context;
    1245              :     uint32_t session_id;
    1246              :     void *data;
    1247              :     size_t data_size;
    1248              :     void *hash;
    1249              :     size_t hash_size;
    1250              :     libspdm_session_info_t *session_info;
    1251              : 
    1252            1 :     spdm_test_context = *state;
    1253            1 :     spdm_context = spdm_test_context->spdm_context;
    1254            1 :     spdm_test_context->case_id = 0x4;
    1255            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1256              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1257            1 :     spdm_context->connection_info.connection_state =
    1258              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1259            1 :     spdm_context->connection_info.capability.flags |=
    1260              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    1261            1 :     spdm_context->connection_info.capability.flags |=
    1262              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
    1263            1 :     spdm_context->connection_info.capability.flags |=
    1264              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
    1265            1 :     spdm_context->local_context.capability.flags |=
    1266              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    1267            1 :     spdm_context->local_context.capability.flags |=
    1268              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
    1269            1 :     spdm_context->local_context.capability.flags |=
    1270              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
    1271            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1272              :                                                          m_libspdm_use_asym_algo, &data,
    1273              :                                                          &data_size, &hash, &hash_size)) {
    1274            0 :         assert(false);
    1275              :     }
    1276            1 :     libspdm_reset_message_a(spdm_context);
    1277            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1278              :         m_libspdm_use_hash_algo;
    1279            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    1280              :         m_libspdm_use_asym_algo;
    1281            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
    1282              :         m_libspdm_use_dhe_algo;
    1283            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
    1284              :         m_libspdm_use_aead_algo;
    1285              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1286              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    1287              :         data_size;
    1288              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    1289              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    1290              :                      data, data_size);
    1291              : #endif
    1292              : 
    1293            1 :     session_id = 0xFFFFFFFF;
    1294            1 :     session_info = &spdm_context->session_info[0];
    1295            1 :     libspdm_session_info_init(spdm_context, session_info, session_id, true);
    1296            1 :     libspdm_session_info_set_psk_hint(session_info,
    1297              :                                       LIBSPDM_TEST_PSK_HINT_STRING,
    1298              :                                       sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
    1299            1 :     libspdm_secured_message_set_session_state(
    1300              :         session_info->secured_message_context,
    1301              :         LIBSPDM_SESSION_STATE_HANDSHAKING);
    1302            1 :     libspdm_set_mem(m_libspdm_dummy_key_buffer,
    1303              :                     ((libspdm_secured_message_context_t
    1304            1 :                       *)(session_info->secured_message_context))
    1305              :                     ->aead_key_size,
    1306              :                     (uint8_t)(0xFF));
    1307            1 :     libspdm_secured_message_set_response_handshake_encryption_key(
    1308              :         session_info->secured_message_context, m_libspdm_dummy_key_buffer,
    1309              :         ((libspdm_secured_message_context_t
    1310            1 :           *)(session_info->secured_message_context))
    1311              :         ->aead_key_size);
    1312            1 :     libspdm_set_mem(m_libspdm_dummy_salt_buffer,
    1313              :                     ((libspdm_secured_message_context_t
    1314            1 :                       *)(session_info->secured_message_context))
    1315              :                     ->aead_iv_size,
    1316              :                     (uint8_t)(0xFF));
    1317            1 :     libspdm_secured_message_set_response_handshake_salt(
    1318              :         session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
    1319              :         ((libspdm_secured_message_context_t
    1320            1 :           *)(session_info->secured_message_context))
    1321              :         ->aead_iv_size);
    1322              :     ((libspdm_secured_message_context_t *)(session_info
    1323            1 :                                            ->secured_message_context))
    1324            1 :     ->handshake_secret.response_handshake_sequence_number = 0;
    1325            1 :     libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
    1326              : 
    1327            1 :     status = libspdm_send_receive_psk_finish(spdm_context, session_id);
    1328            1 :     assert_int_equal(status, LIBSPDM_STATUS_ERROR_PEER);
    1329            1 :     assert_int_equal(spdm_context->session_info->session_id, INVALID_SESSION_ID);
    1330            1 :     free(data);
    1331            1 : }
    1332              : 
    1333              : /**
    1334              :  * Test 5: the requester is setup correctly, but receives an ERROR message
    1335              :  * indicating the Busy status of the responder.
    1336              :  * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR.
    1337              :  **/
    1338            1 : void libspdm_test_requester_psk_finish_case5(void **state)
    1339              : {
    1340              :     libspdm_return_t status;
    1341              :     libspdm_test_context_t *spdm_test_context;
    1342              :     libspdm_context_t *spdm_context;
    1343              :     uint32_t session_id;
    1344              :     void *data;
    1345              :     size_t data_size;
    1346              :     void *hash;
    1347              :     size_t hash_size;
    1348              :     libspdm_session_info_t *session_info;
    1349              : 
    1350            1 :     spdm_test_context = *state;
    1351            1 :     spdm_context = spdm_test_context->spdm_context;
    1352            1 :     spdm_test_context->case_id = 0x5;
    1353            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1354              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1355            1 :     spdm_context->connection_info.connection_state =
    1356              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1357            1 :     spdm_context->connection_info.capability.flags |=
    1358              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    1359            1 :     spdm_context->connection_info.capability.flags |=
    1360              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
    1361            1 :     spdm_context->connection_info.capability.flags |=
    1362              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
    1363            1 :     spdm_context->local_context.capability.flags |=
    1364              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    1365            1 :     spdm_context->local_context.capability.flags |=
    1366              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
    1367            1 :     spdm_context->local_context.capability.flags |=
    1368              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
    1369            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1370              :                                                          m_libspdm_use_asym_algo, &data,
    1371              :                                                          &data_size, &hash, &hash_size)) {
    1372            0 :         assert(false);
    1373              :     }
    1374            1 :     libspdm_reset_message_a(spdm_context);
    1375            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1376              :         m_libspdm_use_hash_algo;
    1377            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    1378              :         m_libspdm_use_asym_algo;
    1379            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
    1380              :         m_libspdm_use_dhe_algo;
    1381            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
    1382              :         m_libspdm_use_aead_algo;
    1383              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1384              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    1385              :         data_size;
    1386              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    1387              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    1388              :                      data, data_size);
    1389              : #endif
    1390              : 
    1391            1 :     session_id = 0xFFFFFFFF;
    1392            1 :     session_info = &spdm_context->session_info[0];
    1393            1 :     libspdm_session_info_init(spdm_context, session_info, session_id, true);
    1394            1 :     libspdm_session_info_set_psk_hint(session_info,
    1395              :                                       LIBSPDM_TEST_PSK_HINT_STRING,
    1396              :                                       sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
    1397            1 :     libspdm_secured_message_set_session_state(
    1398              :         session_info->secured_message_context,
    1399              :         LIBSPDM_SESSION_STATE_HANDSHAKING);
    1400            1 :     libspdm_set_mem(m_libspdm_dummy_key_buffer,
    1401              :                     ((libspdm_secured_message_context_t
    1402            1 :                       *)(session_info->secured_message_context))
    1403              :                     ->aead_key_size,
    1404              :                     (uint8_t)(0xFF));
    1405            1 :     libspdm_secured_message_set_response_handshake_encryption_key(
    1406              :         session_info->secured_message_context, m_libspdm_dummy_key_buffer,
    1407              :         ((libspdm_secured_message_context_t
    1408            1 :           *)(session_info->secured_message_context))
    1409              :         ->aead_key_size);
    1410            1 :     libspdm_set_mem(m_libspdm_dummy_salt_buffer,
    1411              :                     ((libspdm_secured_message_context_t
    1412            1 :                       *)(session_info->secured_message_context))
    1413              :                     ->aead_iv_size,
    1414              :                     (uint8_t)(0xFF));
    1415            1 :     libspdm_secured_message_set_response_handshake_salt(
    1416              :         session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
    1417              :         ((libspdm_secured_message_context_t
    1418            1 :           *)(session_info->secured_message_context))
    1419              :         ->aead_iv_size);
    1420              :     ((libspdm_secured_message_context_t *)(session_info
    1421            1 :                                            ->secured_message_context))
    1422            1 :     ->handshake_secret.response_handshake_sequence_number = 0;
    1423            1 :     libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
    1424              : 
    1425            1 :     status = libspdm_send_receive_psk_finish(spdm_context, session_id);
    1426            1 :     assert_int_equal(status, LIBSPDM_STATUS_BUSY_PEER);
    1427            1 :     free(data);
    1428            1 : }
    1429              : 
    1430              : /**
    1431              :  * Test 6: the requester is setup correctly, but, on the first try, receiving
    1432              :  * a Busy ERROR message, and, on retry, receiving a correct PSK_FINISH_RSP
    1433              :  * message.
    1434              :  * Expected behavior: client returns a Status of RETURN_SUCCESS and session
    1435              :  * is established.
    1436              :  **/
    1437            1 : void libspdm_test_requester_psk_finish_case6(void **state)
    1438              : {
    1439              :     libspdm_return_t status;
    1440              :     libspdm_test_context_t *spdm_test_context;
    1441              :     libspdm_context_t *spdm_context;
    1442              :     uint32_t session_id;
    1443              :     void *data;
    1444              :     size_t data_size;
    1445              :     void *hash;
    1446              :     size_t hash_size;
    1447              :     libspdm_session_info_t *session_info;
    1448              : 
    1449            1 :     spdm_test_context = *state;
    1450            1 :     spdm_context = spdm_test_context->spdm_context;
    1451            1 :     spdm_test_context->case_id = 0x6;
    1452            1 :     spdm_context->retry_times = 3;
    1453            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1454              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1455            1 :     spdm_context->connection_info.connection_state =
    1456              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1457            1 :     spdm_context->connection_info.capability.flags |=
    1458              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    1459            1 :     spdm_context->connection_info.capability.flags |=
    1460              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
    1461            1 :     spdm_context->connection_info.capability.flags |=
    1462              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
    1463            1 :     spdm_context->local_context.capability.flags |=
    1464              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    1465            1 :     spdm_context->local_context.capability.flags |=
    1466              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
    1467            1 :     spdm_context->local_context.capability.flags |=
    1468              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
    1469            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1470              :                                                          m_libspdm_use_asym_algo, &data,
    1471              :                                                          &data_size, &hash, &hash_size)) {
    1472            0 :         assert(false);
    1473              :     }
    1474            1 :     libspdm_reset_message_a(spdm_context);
    1475            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1476              :         m_libspdm_use_hash_algo;
    1477            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    1478              :         m_libspdm_use_asym_algo;
    1479            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
    1480              :         m_libspdm_use_dhe_algo;
    1481            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
    1482              :         m_libspdm_use_aead_algo;
    1483              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1484              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    1485              :         data_size;
    1486              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    1487              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    1488              :                      data, data_size);
    1489              : #endif
    1490              : 
    1491            1 :     session_id = 0xFFFFFFFF;
    1492            1 :     session_info = &spdm_context->session_info[0];
    1493            1 :     libspdm_session_info_init(spdm_context, session_info, session_id, true);
    1494            1 :     libspdm_session_info_set_psk_hint(session_info,
    1495              :                                       LIBSPDM_TEST_PSK_HINT_STRING,
    1496              :                                       sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
    1497            1 :     libspdm_secured_message_set_session_state(
    1498              :         session_info->secured_message_context,
    1499              :         LIBSPDM_SESSION_STATE_HANDSHAKING);
    1500            1 :     libspdm_set_mem(m_libspdm_dummy_key_buffer,
    1501              :                     ((libspdm_secured_message_context_t
    1502            1 :                       *)(session_info->secured_message_context))
    1503              :                     ->aead_key_size,
    1504              :                     (uint8_t)(0xFF));
    1505            1 :     libspdm_secured_message_set_response_handshake_encryption_key(
    1506              :         session_info->secured_message_context, m_libspdm_dummy_key_buffer,
    1507              :         ((libspdm_secured_message_context_t
    1508            1 :           *)(session_info->secured_message_context))
    1509              :         ->aead_key_size);
    1510            1 :     libspdm_set_mem(m_libspdm_dummy_salt_buffer,
    1511              :                     ((libspdm_secured_message_context_t
    1512            1 :                       *)(session_info->secured_message_context))
    1513              :                     ->aead_iv_size,
    1514              :                     (uint8_t)(0xFF));
    1515            1 :     libspdm_secured_message_set_response_handshake_salt(
    1516              :         session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
    1517              :         ((libspdm_secured_message_context_t
    1518            1 :           *)(session_info->secured_message_context))
    1519              :         ->aead_iv_size);
    1520              :     ((libspdm_secured_message_context_t *)(session_info
    1521            1 :                                            ->secured_message_context))
    1522            1 :     ->handshake_secret.response_handshake_sequence_number = 0;
    1523            1 :     libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
    1524              : 
    1525            1 :     status = libspdm_send_receive_psk_finish(spdm_context, session_id);
    1526            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1527            1 :     assert_int_equal(
    1528              :         libspdm_secured_message_get_session_state(
    1529              :             spdm_context->session_info[0].secured_message_context),
    1530              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
    1531            1 :     free(data);
    1532            1 : }
    1533              : 
    1534              : /**
    1535              :  * Test 7: the requester is setup correctly, but receives an ERROR message
    1536              :  * indicating the RequestResynch status of the responder.
    1537              :  * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, and the
    1538              :  * communication is reset to expect a new GET_VERSION message.
    1539              :  **/
    1540            1 : void libspdm_test_requester_psk_finish_case7(void **state)
    1541              : {
    1542              :     libspdm_return_t status;
    1543              :     libspdm_test_context_t *spdm_test_context;
    1544              :     libspdm_context_t *spdm_context;
    1545              :     uint32_t session_id;
    1546              :     void *data;
    1547              :     size_t data_size;
    1548              :     void *hash;
    1549              :     size_t hash_size;
    1550              :     libspdm_session_info_t *session_info;
    1551              : 
    1552            1 :     spdm_test_context = *state;
    1553            1 :     spdm_context = spdm_test_context->spdm_context;
    1554            1 :     spdm_test_context->case_id = 0x7;
    1555            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1556              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1557            1 :     spdm_context->connection_info.connection_state =
    1558              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1559            1 :     spdm_context->connection_info.capability.flags |=
    1560              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    1561            1 :     spdm_context->connection_info.capability.flags |=
    1562              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
    1563            1 :     spdm_context->connection_info.capability.flags |=
    1564              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
    1565            1 :     spdm_context->local_context.capability.flags |=
    1566              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    1567            1 :     spdm_context->local_context.capability.flags |=
    1568              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
    1569            1 :     spdm_context->local_context.capability.flags |=
    1570              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
    1571            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1572              :                                                          m_libspdm_use_asym_algo, &data,
    1573              :                                                          &data_size, &hash, &hash_size)) {
    1574            0 :         assert(false);
    1575              :     }
    1576            1 :     libspdm_reset_message_a(spdm_context);
    1577            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1578              :         m_libspdm_use_hash_algo;
    1579            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    1580              :         m_libspdm_use_asym_algo;
    1581            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
    1582              :         m_libspdm_use_dhe_algo;
    1583            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
    1584              :         m_libspdm_use_aead_algo;
    1585              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1586              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    1587              :         data_size;
    1588              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    1589              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    1590              :                      data, data_size);
    1591              : #endif
    1592              : 
    1593            1 :     session_id = 0xFFFFFFFF;
    1594            1 :     session_info = &spdm_context->session_info[0];
    1595            1 :     libspdm_session_info_init(spdm_context, session_info, session_id, true);
    1596            1 :     libspdm_session_info_set_psk_hint(session_info,
    1597              :                                       LIBSPDM_TEST_PSK_HINT_STRING,
    1598              :                                       sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
    1599            1 :     libspdm_secured_message_set_session_state(
    1600              :         session_info->secured_message_context,
    1601              :         LIBSPDM_SESSION_STATE_HANDSHAKING);
    1602            1 :     libspdm_set_mem(m_libspdm_dummy_key_buffer,
    1603              :                     ((libspdm_secured_message_context_t
    1604            1 :                       *)(session_info->secured_message_context))
    1605              :                     ->aead_key_size,
    1606              :                     (uint8_t)(0xFF));
    1607            1 :     libspdm_secured_message_set_response_handshake_encryption_key(
    1608              :         session_info->secured_message_context, m_libspdm_dummy_key_buffer,
    1609              :         ((libspdm_secured_message_context_t
    1610            1 :           *)(session_info->secured_message_context))
    1611              :         ->aead_key_size);
    1612            1 :     libspdm_set_mem(m_libspdm_dummy_salt_buffer,
    1613              :                     ((libspdm_secured_message_context_t
    1614            1 :                       *)(session_info->secured_message_context))
    1615              :                     ->aead_iv_size,
    1616              :                     (uint8_t)(0xFF));
    1617            1 :     libspdm_secured_message_set_response_handshake_salt(
    1618              :         session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
    1619              :         ((libspdm_secured_message_context_t
    1620            1 :           *)(session_info->secured_message_context))
    1621              :         ->aead_iv_size);
    1622              :     ((libspdm_secured_message_context_t *)(session_info
    1623            1 :                                            ->secured_message_context))
    1624            1 :     ->handshake_secret.response_handshake_sequence_number = 0;
    1625            1 :     libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
    1626              : 
    1627            1 :     status = libspdm_send_receive_psk_finish(spdm_context, session_id);
    1628            1 :     assert_int_equal(status, LIBSPDM_STATUS_RESYNCH_PEER);
    1629            1 :     assert_int_equal(spdm_context->connection_info.connection_state,
    1630              :                      LIBSPDM_CONNECTION_STATE_NOT_STARTED);
    1631            1 :     free(data);
    1632            1 : }
    1633              : 
    1634              : /**
    1635              :  * Test 8: the requester is setup correctly, but receives an ERROR message
    1636              :  * indicating the ResponseNotReady status of the responder.
    1637              :  * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR.
    1638              :  **/
    1639            1 : void libspdm_test_requester_psk_finish_case8(void **state)
    1640              : {
    1641              :     libspdm_return_t status;
    1642              :     libspdm_test_context_t *spdm_test_context;
    1643              :     libspdm_context_t *spdm_context;
    1644              :     uint32_t session_id;
    1645              :     void *data;
    1646              :     size_t data_size;
    1647              :     void *hash;
    1648              :     size_t hash_size;
    1649              :     libspdm_session_info_t *session_info;
    1650              : 
    1651            1 :     spdm_test_context = *state;
    1652            1 :     spdm_context = spdm_test_context->spdm_context;
    1653            1 :     spdm_test_context->case_id = 0x8;
    1654            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1655              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1656            1 :     spdm_context->connection_info.connection_state =
    1657              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1658            1 :     spdm_context->connection_info.capability.flags |=
    1659              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    1660            1 :     spdm_context->connection_info.capability.flags |=
    1661              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
    1662            1 :     spdm_context->connection_info.capability.flags |=
    1663              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
    1664            1 :     spdm_context->local_context.capability.flags |=
    1665              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    1666            1 :     spdm_context->local_context.capability.flags |=
    1667              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
    1668            1 :     spdm_context->local_context.capability.flags |=
    1669              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
    1670            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1671              :                                                          m_libspdm_use_asym_algo, &data,
    1672              :                                                          &data_size, &hash, &hash_size)) {
    1673            0 :         assert(false);
    1674              :     }
    1675            1 :     libspdm_reset_message_a(spdm_context);
    1676            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1677              :         m_libspdm_use_hash_algo;
    1678            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    1679              :         m_libspdm_use_asym_algo;
    1680            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
    1681              :         m_libspdm_use_dhe_algo;
    1682            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
    1683              :         m_libspdm_use_aead_algo;
    1684              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1685              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    1686              :         data_size;
    1687              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    1688              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    1689              :                      data, data_size);
    1690              : #endif
    1691              : 
    1692            1 :     session_id = 0xFFFFFFFF;
    1693            1 :     session_info = &spdm_context->session_info[0];
    1694            1 :     libspdm_session_info_init(spdm_context, session_info, session_id, true);
    1695            1 :     libspdm_session_info_set_psk_hint(session_info,
    1696              :                                       LIBSPDM_TEST_PSK_HINT_STRING,
    1697              :                                       sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
    1698            1 :     libspdm_secured_message_set_session_state(
    1699              :         session_info->secured_message_context,
    1700              :         LIBSPDM_SESSION_STATE_HANDSHAKING);
    1701            1 :     libspdm_set_mem(m_libspdm_dummy_key_buffer,
    1702              :                     ((libspdm_secured_message_context_t
    1703            1 :                       *)(session_info->secured_message_context))
    1704              :                     ->aead_key_size,
    1705              :                     (uint8_t)(0xFF));
    1706            1 :     libspdm_secured_message_set_response_handshake_encryption_key(
    1707              :         session_info->secured_message_context, m_libspdm_dummy_key_buffer,
    1708              :         ((libspdm_secured_message_context_t
    1709            1 :           *)(session_info->secured_message_context))
    1710              :         ->aead_key_size);
    1711            1 :     libspdm_set_mem(m_libspdm_dummy_salt_buffer,
    1712              :                     ((libspdm_secured_message_context_t
    1713            1 :                       *)(session_info->secured_message_context))
    1714              :                     ->aead_iv_size,
    1715              :                     (uint8_t)(0xFF));
    1716            1 :     libspdm_secured_message_set_response_handshake_salt(
    1717              :         session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
    1718              :         ((libspdm_secured_message_context_t
    1719            1 :           *)(session_info->secured_message_context))
    1720              :         ->aead_iv_size);
    1721              :     ((libspdm_secured_message_context_t *)(session_info
    1722            1 :                                            ->secured_message_context))
    1723            1 :     ->handshake_secret.response_handshake_sequence_number = 0;
    1724            1 :     libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
    1725              : 
    1726            1 :     status = libspdm_send_receive_psk_finish(spdm_context, session_id);
    1727            1 :     assert_int_equal(status, LIBSPDM_STATUS_NOT_READY_PEER);
    1728            1 :     free(data);
    1729            1 : }
    1730              : 
    1731              : /**
    1732              :  * Test 9: the requester is setup correctly, but, on the first try, receiving
    1733              :  * a ResponseNotReady ERROR message, and, on retry, receiving a correct
    1734              :  * PSK_FINISH_RSP message.
    1735              :  * Expected behavior: client returns a Status of RETURN_SUCCESS and session
    1736              :  * is established.
    1737              :  **/
    1738            1 : void libspdm_test_requester_psk_finish_case9(void **state)
    1739              : {
    1740              :     libspdm_return_t status;
    1741              :     libspdm_test_context_t *spdm_test_context;
    1742              :     libspdm_context_t *spdm_context;
    1743              :     uint32_t session_id;
    1744              :     void *data;
    1745              :     size_t data_size;
    1746              :     void *hash;
    1747              :     size_t hash_size;
    1748              :     libspdm_session_info_t *session_info;
    1749              : 
    1750            1 :     spdm_test_context = *state;
    1751            1 :     spdm_context = spdm_test_context->spdm_context;
    1752            1 :     spdm_test_context->case_id = 0x9;
    1753            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1754              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1755            1 :     spdm_context->connection_info.connection_state =
    1756              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1757            1 :     spdm_context->connection_info.capability.flags |=
    1758              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    1759            1 :     spdm_context->connection_info.capability.flags |=
    1760              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
    1761            1 :     spdm_context->connection_info.capability.flags |=
    1762              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
    1763            1 :     spdm_context->local_context.capability.flags |=
    1764              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    1765            1 :     spdm_context->local_context.capability.flags |=
    1766              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
    1767            1 :     spdm_context->local_context.capability.flags |=
    1768              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
    1769            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1770              :                                                          m_libspdm_use_asym_algo, &data,
    1771              :                                                          &data_size, &hash, &hash_size)) {
    1772            0 :         assert(false);
    1773              :     }
    1774            1 :     libspdm_reset_message_a(spdm_context);
    1775            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1776              :         m_libspdm_use_hash_algo;
    1777            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    1778              :         m_libspdm_use_asym_algo;
    1779            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
    1780              :         m_libspdm_use_dhe_algo;
    1781            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
    1782              :         m_libspdm_use_aead_algo;
    1783              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1784              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    1785              :         data_size;
    1786              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    1787              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    1788              :                      data, data_size);
    1789              : #endif
    1790              : 
    1791            1 :     session_id = 0xFFFFFFFF;
    1792            1 :     session_info = &spdm_context->session_info[0];
    1793            1 :     libspdm_session_info_init(spdm_context, session_info, session_id, true);
    1794            1 :     libspdm_session_info_set_psk_hint(session_info,
    1795              :                                       LIBSPDM_TEST_PSK_HINT_STRING,
    1796              :                                       sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
    1797            1 :     libspdm_secured_message_set_session_state(
    1798              :         session_info->secured_message_context,
    1799              :         LIBSPDM_SESSION_STATE_HANDSHAKING);
    1800            1 :     libspdm_set_mem(m_libspdm_dummy_key_buffer,
    1801              :                     ((libspdm_secured_message_context_t
    1802            1 :                       *)(session_info->secured_message_context))
    1803              :                     ->aead_key_size,
    1804              :                     (uint8_t)(0xFF));
    1805            1 :     libspdm_secured_message_set_response_handshake_encryption_key(
    1806              :         session_info->secured_message_context, m_libspdm_dummy_key_buffer,
    1807              :         ((libspdm_secured_message_context_t
    1808            1 :           *)(session_info->secured_message_context))
    1809              :         ->aead_key_size);
    1810            1 :     libspdm_set_mem(m_libspdm_dummy_salt_buffer,
    1811              :                     ((libspdm_secured_message_context_t
    1812            1 :                       *)(session_info->secured_message_context))
    1813              :                     ->aead_iv_size,
    1814              :                     (uint8_t)(0xFF));
    1815            1 :     libspdm_secured_message_set_response_handshake_salt(
    1816              :         session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
    1817              :         ((libspdm_secured_message_context_t
    1818            1 :           *)(session_info->secured_message_context))
    1819              :         ->aead_iv_size);
    1820              :     ((libspdm_secured_message_context_t *)(session_info
    1821            1 :                                            ->secured_message_context))
    1822            1 :     ->handshake_secret.response_handshake_sequence_number = 0;
    1823            1 :     libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
    1824              : 
    1825            1 :     status = libspdm_send_receive_psk_finish(spdm_context, session_id);
    1826              :     if (LIBSPDM_RESPOND_IF_READY_SUPPORT) {
    1827            1 :         assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1828            1 :         assert_int_equal(
    1829              :             libspdm_secured_message_get_session_state(
    1830              :                 spdm_context->session_info[0].secured_message_context),
    1831              :             LIBSPDM_SESSION_STATE_ESTABLISHED);
    1832              :     } else {
    1833              :         assert_int_equal(status, LIBSPDM_STATUS_NOT_READY_PEER);
    1834              :     }
    1835              : 
    1836            1 :     free(data);
    1837            1 : }
    1838              : 
    1839              : /**
    1840              :  * Test 10: receiving an unexpected ERROR message from the responder.
    1841              :  * There are tests for all named codes, including some reserved ones
    1842              :  * (namely, 0x00, 0x0b, 0x0c, 0x3f, 0xfd, 0xfe).
    1843              :  * However, for having specific test cases, it is excluded from this case:
    1844              :  * Busy (0x03), ResponseNotReady (0x42), and RequestResync (0x43).
    1845              :  * Expected behavior: client returns a status of RETURN_DEVICE_ERROR.
    1846              :  **/
    1847            1 : void libspdm_test_requester_psk_finish_case10(void **state) {
    1848              :     libspdm_return_t status;
    1849              :     libspdm_test_context_t    *spdm_test_context;
    1850              :     libspdm_context_t  *spdm_context;
    1851              :     uint32_t session_id;
    1852              :     void                 *data;
    1853              :     size_t data_size;
    1854              :     void                 *hash;
    1855              :     size_t hash_size;
    1856              :     libspdm_session_info_t    *session_info;
    1857              :     uint16_t error_code;
    1858              : 
    1859            1 :     spdm_test_context = *state;
    1860            1 :     spdm_context = spdm_test_context->spdm_context;
    1861            1 :     spdm_test_context->case_id = 0xA;
    1862            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1863              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1864            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    1865            1 :     spdm_context->connection_info.capability.flags |=
    1866              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
    1867            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
    1868            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    1869            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
    1870            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
    1871            1 :     libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
    1872              :                                                      m_libspdm_use_asym_algo,
    1873              :                                                      &data, &data_size,
    1874              :                                                      &hash, &hash_size);
    1875            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1876            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    1877            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
    1878            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
    1879              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1880              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    1881              :         data_size;
    1882              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    1883              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    1884              :                      data, data_size);
    1885              : #endif
    1886              : 
    1887            1 :     error_code = LIBSPDM_ERROR_CODE_RESERVED_00;
    1888           19 :     while(error_code <= 0xff) {
    1889           18 :         spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1890           18 :         libspdm_reset_message_a(spdm_context);
    1891              : 
    1892           18 :         session_id = 0xFFFFFFFF;
    1893           18 :         session_info = &spdm_context->session_info[0];
    1894           18 :         libspdm_session_info_init (spdm_context, session_info, session_id, true);
    1895           18 :         libspdm_session_info_set_psk_hint(session_info,
    1896              :                                           LIBSPDM_TEST_PSK_HINT_STRING,
    1897              :                                           sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
    1898           18 :         libspdm_secured_message_set_session_state (session_info->secured_message_context,
    1899              :                                                    LIBSPDM_SESSION_STATE_HANDSHAKING);
    1900           18 :         libspdm_set_mem (m_libspdm_dummy_key_buffer,
    1901           18 :                          ((libspdm_secured_message_context_t*)(session_info->secured_message_context))->aead_key_size,
    1902              :                          (uint8_t)(0xFF));
    1903           18 :         libspdm_secured_message_set_response_handshake_encryption_key (
    1904              :             session_info->secured_message_context, m_libspdm_dummy_key_buffer,
    1905           18 :             ((libspdm_secured_message_context_t*)(session_info->secured_message_context))->aead_key_size);
    1906           18 :         libspdm_set_mem (m_libspdm_dummy_salt_buffer,
    1907           18 :                          ((libspdm_secured_message_context_t*)(session_info->secured_message_context))->aead_iv_size,
    1908              :                          (uint8_t)(0xFF));
    1909           18 :         libspdm_secured_message_set_response_handshake_salt (session_info->secured_message_context,
    1910              :                                                              m_libspdm_dummy_salt_buffer,
    1911              :                                                              ((libspdm_secured_message_context_t*)(
    1912           18 :                                                                   session_info->
    1913              :                                                                   secured_message_context))->aead_iv_size);
    1914           18 :         ((libspdm_secured_message_context_t*)(session_info->secured_message_context))->
    1915              :         handshake_secret
    1916           18 :         .response_handshake_sequence_number = 0;
    1917           18 :         libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
    1918              : 
    1919           18 :         status = libspdm_send_receive_psk_finish (spdm_context, session_id);
    1920           18 :         if(error_code != SPDM_ERROR_CODE_DECRYPT_ERROR) {
    1921           17 :             LIBSPDM_ASSERT_INT_EQUAL_CASE (status, LIBSPDM_STATUS_ERROR_PEER, error_code);
    1922              :         } else {
    1923            1 :             LIBSPDM_ASSERT_INT_EQUAL_CASE (status, LIBSPDM_STATUS_SESSION_MSG_ERROR, error_code);
    1924              :         }
    1925              : 
    1926           18 :         error_code++;
    1927           18 :         if(error_code == SPDM_ERROR_CODE_BUSY) { /*busy is treated in cases 5 and 6*/
    1928            1 :             error_code = SPDM_ERROR_CODE_UNEXPECTED_REQUEST;
    1929              :         }
    1930           18 :         if(error_code == LIBSPDM_ERROR_CODE_RESERVED_0D) { /*skip some reserved error codes (0d to 3e)*/
    1931            1 :             error_code = LIBSPDM_ERROR_CODE_RESERVED_3F;
    1932              :         }
    1933           18 :         if(error_code == SPDM_ERROR_CODE_RESPONSE_NOT_READY) { /*skip response not ready, request resync, and some reserved codes (44 to fc)*/
    1934            1 :             error_code = LIBSPDM_ERROR_CODE_RESERVED_FD;
    1935              :         }
    1936              :     }
    1937              : 
    1938            1 :     free(data);
    1939            1 : }
    1940              : 
    1941            1 : void libspdm_test_requester_psk_finish_case11(void **state)
    1942              : {
    1943              :     libspdm_return_t status;
    1944              :     libspdm_test_context_t *spdm_test_context;
    1945              :     libspdm_context_t *spdm_context;
    1946              :     uint32_t session_id;
    1947              :     void *data;
    1948              :     size_t data_size;
    1949              :     void *hash;
    1950              :     size_t hash_size;
    1951              :     libspdm_session_info_t *session_info;
    1952              : 
    1953            1 :     spdm_test_context = *state;
    1954            1 :     spdm_context = spdm_test_context->spdm_context;
    1955            1 :     spdm_test_context->case_id = 0xB;
    1956            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1957              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1958            1 :     spdm_context->connection_info.connection_state =
    1959              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1960            1 :     spdm_context->connection_info.capability.flags |=
    1961              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    1962            1 :     spdm_context->connection_info.capability.flags |=
    1963              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
    1964            1 :     spdm_context->connection_info.capability.flags |=
    1965              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
    1966            1 :     spdm_context->local_context.capability.flags |=
    1967              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    1968            1 :     spdm_context->local_context.capability.flags |=
    1969              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
    1970            1 :     spdm_context->local_context.capability.flags |=
    1971              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
    1972            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1973              :                                                          m_libspdm_use_asym_algo, &data,
    1974              :                                                          &data_size, &hash, &hash_size)) {
    1975            0 :         assert(false);
    1976              :     }
    1977            1 :     libspdm_reset_message_a(spdm_context);
    1978              : 
    1979            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1980              :         m_libspdm_use_hash_algo;
    1981            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    1982              :         m_libspdm_use_asym_algo;
    1983            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
    1984              :         m_libspdm_use_dhe_algo;
    1985            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
    1986              :         m_libspdm_use_aead_algo;
    1987              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1988              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    1989              :         data_size;
    1990              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    1991              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    1992              :                      data, data_size);
    1993              : #endif
    1994              : 
    1995            1 :     session_id = 0xFFFFFFFF;
    1996            1 :     session_info = &spdm_context->session_info[0];
    1997            1 :     libspdm_session_info_init(spdm_context, session_info, session_id, true);
    1998            1 :     libspdm_session_info_set_psk_hint(session_info,
    1999              :                                       LIBSPDM_TEST_PSK_HINT_STRING,
    2000              :                                       sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
    2001            1 :     libspdm_secured_message_set_session_state(
    2002              :         session_info->secured_message_context,
    2003              :         LIBSPDM_SESSION_STATE_HANDSHAKING);
    2004            1 :     libspdm_set_mem(m_libspdm_dummy_key_buffer,
    2005              :                     ((libspdm_secured_message_context_t
    2006            1 :                       *)(session_info->secured_message_context))
    2007              :                     ->aead_key_size,
    2008              :                     (uint8_t)(0xFF));
    2009            1 :     libspdm_secured_message_set_response_handshake_encryption_key(
    2010              :         session_info->secured_message_context, m_libspdm_dummy_key_buffer,
    2011              :         ((libspdm_secured_message_context_t
    2012            1 :           *)(session_info->secured_message_context))
    2013              :         ->aead_key_size);
    2014            1 :     libspdm_set_mem(m_libspdm_dummy_salt_buffer,
    2015              :                     ((libspdm_secured_message_context_t
    2016            1 :                       *)(session_info->secured_message_context))
    2017              :                     ->aead_iv_size,
    2018              :                     (uint8_t)(0xFF));
    2019            1 :     libspdm_secured_message_set_response_handshake_salt(
    2020              :         session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
    2021              :         ((libspdm_secured_message_context_t
    2022            1 :           *)(session_info->secured_message_context))
    2023              :         ->aead_iv_size);
    2024              :     ((libspdm_secured_message_context_t *)(session_info
    2025            1 :                                            ->secured_message_context))
    2026            1 :     ->handshake_secret.response_handshake_sequence_number = 0;
    2027            1 :     libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
    2028              : 
    2029              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    2030              :     session_info->session_transcript.message_m.buffer_size =
    2031              :         session_info->session_transcript.message_m.max_buffer_size;
    2032              :     spdm_context->transcript.message_b.buffer_size =
    2033              :         spdm_context->transcript.message_b.max_buffer_size;
    2034              :     spdm_context->transcript.message_c.buffer_size =
    2035              :         spdm_context->transcript.message_c.max_buffer_size;
    2036              :     spdm_context->transcript.message_mut_b.buffer_size =
    2037              :         spdm_context->transcript.message_mut_b.max_buffer_size;
    2038              :     spdm_context->transcript.message_mut_c.buffer_size =
    2039              :         spdm_context->transcript.message_mut_c.max_buffer_size;
    2040              : #endif
    2041              : 
    2042            1 :     status = libspdm_send_receive_psk_finish(spdm_context, session_id);
    2043            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    2044            1 :     assert_int_equal(
    2045              :         libspdm_secured_message_get_session_state(
    2046              :             spdm_context->session_info[0].secured_message_context),
    2047              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
    2048              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    2049              :     assert_int_equal(session_info->session_transcript.message_m.buffer_size, 0);
    2050              :     assert_int_equal(spdm_context->transcript.message_b.buffer_size, 0);
    2051              :     assert_int_equal(spdm_context->transcript.message_c.buffer_size, 0);
    2052              :     assert_int_equal(spdm_context->transcript.message_mut_b.buffer_size, 0);
    2053              :     assert_int_equal(spdm_context->transcript.message_mut_c.buffer_size, 0);
    2054              : #endif
    2055            1 :     free(data);
    2056            1 : }
    2057              : 
    2058              : /**
    2059              :  * Test 12: requester is not setup correctly to support pre-shared keys
    2060              :  * (no capabilities). The responder would attempt to return a correct
    2061              :  * PSK_FINISH_RSP message.
    2062              :  * Expected behavior: client returns a Status of RETURN_UNSUPPORTED.
    2063              :  **/
    2064            1 : void libspdm_test_requester_psk_finish_case12(void **state)
    2065              : {
    2066              :     libspdm_return_t status;
    2067              :     libspdm_test_context_t *spdm_test_context;
    2068              :     libspdm_context_t *spdm_context;
    2069              :     uint32_t session_id;
    2070              :     void *data;
    2071              :     size_t data_size;
    2072              :     void *hash;
    2073              :     size_t hash_size;
    2074              :     libspdm_session_info_t *session_info;
    2075              : 
    2076            1 :     spdm_test_context = *state;
    2077            1 :     spdm_context = spdm_test_context->spdm_context;
    2078            1 :     spdm_test_context->case_id = 0xC;
    2079            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    2080              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    2081            1 :     spdm_context->connection_info.connection_state =
    2082              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    2083              :     /*no PSK capabilities*/
    2084            1 :     spdm_context->connection_info.capability.flags &=
    2085              :         ~(SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP);
    2086            1 :     spdm_context->connection_info.capability.flags |=
    2087              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
    2088            1 :     spdm_context->connection_info.capability.flags |=
    2089              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
    2090            1 :     spdm_context->local_context.capability.flags |=
    2091              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    2092            1 :     spdm_context->local_context.capability.flags |=
    2093              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
    2094            1 :     spdm_context->local_context.capability.flags |=
    2095              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
    2096            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    2097              :                                                          m_libspdm_use_asym_algo, &data,
    2098              :                                                          &data_size, &hash, &hash_size)) {
    2099            0 :         assert(false);
    2100              :     }
    2101            1 :     spdm_context->transcript.message_a.buffer_size = 0;
    2102            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    2103              :         m_libspdm_use_hash_algo;
    2104            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    2105              :         m_libspdm_use_asym_algo;
    2106            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
    2107              :         m_libspdm_use_dhe_algo;
    2108            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
    2109              :         m_libspdm_use_aead_algo;
    2110              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    2111              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    2112              :         data_size;
    2113              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    2114              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    2115              :                      data, data_size);
    2116              : #endif
    2117              : 
    2118            1 :     session_id = 0xFFFFFFFF;
    2119            1 :     session_info = &spdm_context->session_info[0];
    2120            1 :     libspdm_session_info_init(spdm_context, session_info, session_id, true);
    2121            1 :     libspdm_session_info_set_psk_hint(session_info,
    2122              :                                       LIBSPDM_TEST_PSK_HINT_STRING,
    2123              :                                       sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
    2124            1 :     libspdm_secured_message_set_session_state(
    2125              :         session_info->secured_message_context,
    2126              :         LIBSPDM_SESSION_STATE_HANDSHAKING);
    2127            1 :     libspdm_set_mem(m_libspdm_dummy_key_buffer,
    2128              :                     ((libspdm_secured_message_context_t
    2129            1 :                       *)(session_info->secured_message_context))
    2130              :                     ->aead_key_size,
    2131              :                     (uint8_t)(0xFF));
    2132            1 :     libspdm_secured_message_set_response_handshake_encryption_key(
    2133              :         session_info->secured_message_context, m_libspdm_dummy_key_buffer,
    2134              :         ((libspdm_secured_message_context_t
    2135            1 :           *)(session_info->secured_message_context))
    2136              :         ->aead_key_size);
    2137            1 :     libspdm_set_mem(m_libspdm_dummy_salt_buffer,
    2138              :                     ((libspdm_secured_message_context_t
    2139            1 :                       *)(session_info->secured_message_context))
    2140              :                     ->aead_iv_size,
    2141              :                     (uint8_t)(0xFF));
    2142            1 :     libspdm_secured_message_set_response_handshake_salt(
    2143              :         session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
    2144              :         ((libspdm_secured_message_context_t
    2145            1 :           *)(session_info->secured_message_context))
    2146              :         ->aead_iv_size);
    2147              :     ((libspdm_secured_message_context_t *)(session_info
    2148            1 :                                            ->secured_message_context))
    2149            1 :     ->handshake_secret.response_handshake_sequence_number = 0;
    2150            1 :     libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
    2151              : 
    2152            1 :     status = libspdm_send_receive_psk_finish(spdm_context, session_id);
    2153            1 :     assert_int_equal(status, LIBSPDM_STATUS_UNSUPPORTED_CAP);
    2154            1 :     free(data);
    2155            1 : }
    2156              : 
    2157              : /**
    2158              :  * Test 13: receiving an incorrect FINISH_RSP message, with wrong response
    2159              :  * code, but all other field correct.
    2160              :  * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR.
    2161              :  **/
    2162            1 : void libspdm_test_requester_psk_finish_case13(void **state)
    2163              : {
    2164              :     libspdm_return_t status;
    2165              :     libspdm_test_context_t *spdm_test_context;
    2166              :     libspdm_context_t *spdm_context;
    2167              :     uint32_t session_id;
    2168              :     void *data;
    2169              :     size_t data_size;
    2170              :     void *hash;
    2171              :     size_t hash_size;
    2172              :     libspdm_session_info_t *session_info;
    2173              : 
    2174            1 :     spdm_test_context = *state;
    2175            1 :     spdm_context = spdm_test_context->spdm_context;
    2176            1 :     spdm_test_context->case_id = 0xD;
    2177            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    2178              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    2179            1 :     spdm_context->connection_info.connection_state =
    2180              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    2181              :     /*no PSK capabilities*/
    2182            1 :     spdm_context->connection_info.capability.flags |=
    2183              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    2184            1 :     spdm_context->connection_info.capability.flags |=
    2185              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
    2186            1 :     spdm_context->connection_info.capability.flags |=
    2187              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
    2188            1 :     spdm_context->local_context.capability.flags |=
    2189              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    2190            1 :     spdm_context->local_context.capability.flags |=
    2191              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
    2192            1 :     spdm_context->local_context.capability.flags |=
    2193              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
    2194            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    2195              :                                                          m_libspdm_use_asym_algo, &data,
    2196              :                                                          &data_size, &hash, &hash_size)) {
    2197            0 :         assert(false);
    2198              :     }
    2199            1 :     spdm_context->transcript.message_a.buffer_size = 0;
    2200            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    2201              :         m_libspdm_use_hash_algo;
    2202            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    2203              :         m_libspdm_use_asym_algo;
    2204            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
    2205              :         m_libspdm_use_dhe_algo;
    2206            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
    2207              :         m_libspdm_use_aead_algo;
    2208              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    2209              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    2210              :         data_size;
    2211              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    2212              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    2213              :                      data, data_size);
    2214              : #endif
    2215              : 
    2216            1 :     session_id = 0xFFFFFFFF;
    2217            1 :     session_info = &spdm_context->session_info[0];
    2218            1 :     libspdm_session_info_init(spdm_context, session_info, session_id, true);
    2219            1 :     libspdm_session_info_set_psk_hint(session_info,
    2220              :                                       LIBSPDM_TEST_PSK_HINT_STRING,
    2221              :                                       sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
    2222            1 :     libspdm_secured_message_set_session_state(
    2223              :         session_info->secured_message_context,
    2224              :         LIBSPDM_SESSION_STATE_HANDSHAKING);
    2225            1 :     libspdm_set_mem(m_libspdm_dummy_key_buffer,
    2226              :                     ((libspdm_secured_message_context_t
    2227            1 :                       *)(session_info->secured_message_context))
    2228              :                     ->aead_key_size,
    2229              :                     (uint8_t)(0xFF));
    2230            1 :     libspdm_secured_message_set_response_handshake_encryption_key(
    2231              :         session_info->secured_message_context, m_libspdm_dummy_key_buffer,
    2232              :         ((libspdm_secured_message_context_t
    2233            1 :           *)(session_info->secured_message_context))
    2234              :         ->aead_key_size);
    2235            1 :     libspdm_set_mem(m_libspdm_dummy_salt_buffer,
    2236              :                     ((libspdm_secured_message_context_t
    2237            1 :                       *)(session_info->secured_message_context))
    2238              :                     ->aead_iv_size,
    2239              :                     (uint8_t)(0xFF));
    2240            1 :     libspdm_secured_message_set_response_handshake_salt(
    2241              :         session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
    2242              :         ((libspdm_secured_message_context_t
    2243            1 :           *)(session_info->secured_message_context))
    2244              :         ->aead_iv_size);
    2245              :     ((libspdm_secured_message_context_t *)(session_info
    2246            1 :                                            ->secured_message_context))
    2247            1 :     ->handshake_secret.response_handshake_sequence_number = 0;
    2248            1 :     libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
    2249              : 
    2250            1 :     status = libspdm_send_receive_psk_finish(spdm_context, session_id);
    2251            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
    2252            1 :     free(data);
    2253            1 : }
    2254              : 
    2255              : /**
    2256              :  * Test 14: requester is not setup correctly by not initializing a
    2257              :  * session during PSK_EXCHANGE. The responder would attempt to
    2258              :  * return a correct PSK_FINISH_RSP message.
    2259              :  * Expected behavior: client returns a Status of RETURN_UNSUPPORTED.
    2260              :  **/
    2261            1 : void libspdm_test_requester_psk_finish_case14(void **state)
    2262              : {
    2263              :     libspdm_return_t status;
    2264              :     libspdm_test_context_t *spdm_test_context;
    2265              :     libspdm_context_t *spdm_context;
    2266              :     uint32_t session_id;
    2267              :     void *data;
    2268              :     size_t data_size;
    2269              :     void *hash;
    2270              :     size_t hash_size;
    2271              :     libspdm_session_info_t *session_info;
    2272              : 
    2273            1 :     spdm_test_context = *state;
    2274            1 :     spdm_context = spdm_test_context->spdm_context;
    2275            1 :     spdm_test_context->case_id = 0xE;
    2276            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    2277              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    2278            1 :     spdm_context->connection_info.connection_state =
    2279              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    2280              :     /*no PSK capabilities*/
    2281            1 :     spdm_context->connection_info.capability.flags |=
    2282              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    2283            1 :     spdm_context->connection_info.capability.flags |=
    2284              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
    2285            1 :     spdm_context->connection_info.capability.flags |=
    2286              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
    2287            1 :     spdm_context->local_context.capability.flags |=
    2288              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    2289            1 :     spdm_context->local_context.capability.flags |=
    2290              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
    2291            1 :     spdm_context->local_context.capability.flags |=
    2292              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
    2293            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    2294              :                                                          m_libspdm_use_asym_algo, &data,
    2295              :                                                          &data_size, &hash, &hash_size)) {
    2296            0 :         assert(false);
    2297              :     }
    2298            1 :     spdm_context->transcript.message_a.buffer_size = 0;
    2299            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    2300              :         m_libspdm_use_hash_algo;
    2301            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    2302              :         m_libspdm_use_asym_algo;
    2303            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
    2304              :         m_libspdm_use_dhe_algo;
    2305            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
    2306              :         m_libspdm_use_aead_algo;
    2307              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    2308              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    2309              :         data_size;
    2310              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    2311              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    2312              :                      data, data_size);
    2313              : #endif
    2314              : 
    2315            1 :     session_id = 0xFFFFFFFF;
    2316            1 :     session_info = &spdm_context->session_info[0];
    2317            1 :     libspdm_session_info_init(spdm_context, session_info, session_id, true);
    2318            1 :     libspdm_session_info_set_psk_hint(session_info,
    2319              :                                       LIBSPDM_TEST_PSK_HINT_STRING,
    2320              :                                       sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
    2321            1 :     libspdm_secured_message_set_session_state(
    2322              :         session_info->secured_message_context,
    2323              :         LIBSPDM_SESSION_STATE_NOT_STARTED);
    2324            1 :     libspdm_set_mem(m_libspdm_dummy_key_buffer,
    2325              :                     ((libspdm_secured_message_context_t
    2326            1 :                       *)(session_info->secured_message_context))
    2327              :                     ->aead_key_size,
    2328              :                     (uint8_t)(0xFF));
    2329            1 :     libspdm_secured_message_set_response_handshake_encryption_key(
    2330              :         session_info->secured_message_context, m_libspdm_dummy_key_buffer,
    2331              :         ((libspdm_secured_message_context_t
    2332            1 :           *)(session_info->secured_message_context))
    2333              :         ->aead_key_size);
    2334            1 :     libspdm_set_mem(m_libspdm_dummy_salt_buffer,
    2335              :                     ((libspdm_secured_message_context_t
    2336            1 :                       *)(session_info->secured_message_context))
    2337              :                     ->aead_iv_size,
    2338              :                     (uint8_t)(0xFF));
    2339            1 :     libspdm_secured_message_set_response_handshake_salt(
    2340              :         session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
    2341              :         ((libspdm_secured_message_context_t
    2342            1 :           *)(session_info->secured_message_context))
    2343              :         ->aead_iv_size);
    2344              :     ((libspdm_secured_message_context_t *)(session_info
    2345            1 :                                            ->secured_message_context))
    2346            1 :     ->handshake_secret.response_handshake_sequence_number = 0;
    2347            1 :     libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
    2348              : 
    2349            1 :     status = libspdm_send_receive_psk_finish(spdm_context, session_id);
    2350            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_STATE_LOCAL);
    2351            1 :     free(data);
    2352            1 : }
    2353              : 
    2354              : /**
    2355              :  * Test 15 the requester is setup correctly, but receives an ERROR with SPDM_ERROR_CODE_DECRYPT_ERROR.
    2356              :  * Expected behavior: client returns a Status of INVALID_SESSION_ID  and free the session ID.
    2357              :  **/
    2358            1 : void libspdm_test_requester_psk_finish_case15(void **state)
    2359              : {
    2360              :     libspdm_return_t status;
    2361              :     libspdm_test_context_t *spdm_test_context;
    2362              :     libspdm_context_t *spdm_context;
    2363              :     uint32_t session_id;
    2364              :     void *data;
    2365              :     size_t data_size;
    2366              :     void *hash;
    2367              :     size_t hash_size;
    2368              :     libspdm_session_info_t *session_info;
    2369              : 
    2370            1 :     spdm_test_context = *state;
    2371            1 :     spdm_context = spdm_test_context->spdm_context;
    2372            1 :     spdm_test_context->case_id = 0xF;
    2373            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    2374              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    2375            1 :     spdm_context->connection_info.connection_state =
    2376              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    2377            1 :     spdm_context->connection_info.capability.flags |=
    2378              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    2379            1 :     spdm_context->connection_info.capability.flags |=
    2380              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
    2381            1 :     spdm_context->connection_info.capability.flags |=
    2382              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
    2383            1 :     spdm_context->local_context.capability.flags |=
    2384              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    2385            1 :     spdm_context->local_context.capability.flags |=
    2386              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
    2387            1 :     spdm_context->local_context.capability.flags |=
    2388              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
    2389            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    2390              :                                                          m_libspdm_use_asym_algo, &data,
    2391              :                                                          &data_size, &hash, &hash_size)) {
    2392            0 :         assert(false);
    2393              :     }
    2394            1 :     libspdm_reset_message_a(spdm_context);
    2395            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    2396              :         m_libspdm_use_hash_algo;
    2397            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    2398              :         m_libspdm_use_asym_algo;
    2399            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
    2400              :         m_libspdm_use_dhe_algo;
    2401            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
    2402              :         m_libspdm_use_aead_algo;
    2403              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    2404              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    2405              :         data_size;
    2406              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    2407              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    2408              :                      data, data_size);
    2409              : #endif
    2410              : 
    2411            1 :     session_id = 0xFFFFFFFF;
    2412            1 :     session_info = &spdm_context->session_info[0];
    2413            1 :     libspdm_session_info_init(spdm_context, session_info, session_id, true);
    2414            1 :     libspdm_session_info_set_psk_hint(session_info,
    2415              :                                       LIBSPDM_TEST_PSK_HINT_STRING,
    2416              :                                       sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
    2417            1 :     libspdm_secured_message_set_session_state(
    2418              :         session_info->secured_message_context,
    2419              :         LIBSPDM_SESSION_STATE_HANDSHAKING);
    2420            1 :     libspdm_set_mem(m_libspdm_dummy_key_buffer,
    2421              :                     ((libspdm_secured_message_context_t
    2422            1 :                       *)(session_info->secured_message_context))
    2423              :                     ->aead_key_size,
    2424              :                     (uint8_t)(0xFF));
    2425            1 :     libspdm_secured_message_set_response_handshake_encryption_key(
    2426              :         session_info->secured_message_context, m_libspdm_dummy_key_buffer,
    2427              :         ((libspdm_secured_message_context_t
    2428            1 :           *)(session_info->secured_message_context))
    2429              :         ->aead_key_size);
    2430            1 :     libspdm_set_mem(m_libspdm_dummy_salt_buffer,
    2431              :                     ((libspdm_secured_message_context_t
    2432            1 :                       *)(session_info->secured_message_context))
    2433              :                     ->aead_iv_size,
    2434              :                     (uint8_t)(0xFF));
    2435            1 :     libspdm_secured_message_set_response_handshake_salt(
    2436              :         session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
    2437              :         ((libspdm_secured_message_context_t
    2438            1 :           *)(session_info->secured_message_context))
    2439              :         ->aead_iv_size);
    2440              :     ((libspdm_secured_message_context_t *)(session_info
    2441            1 :                                            ->secured_message_context))
    2442            1 :     ->handshake_secret.response_handshake_sequence_number = 0;
    2443            1 :     libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
    2444              : 
    2445            1 :     status = libspdm_send_receive_psk_finish(spdm_context, session_id);
    2446            1 :     assert_int_equal(status, LIBSPDM_STATUS_SESSION_MSG_ERROR);
    2447            1 :     assert_int_equal(spdm_context->session_info->session_id, INVALID_SESSION_ID);
    2448            1 :     free(data);
    2449            1 : }
    2450              : 
    2451              : /**
    2452              :  * Test 16: a request message is successfully sent and a response message is successfully received.
    2453              :  * Expected Behavior: requester returns the status RETURN_SUCCESS and a PSK_FINISH_RSP message is
    2454              :  * received, buffer F appends the exchanged PSK_FINISH and PSK_FINISH_RSP messages.
    2455              :  **/
    2456            1 : void libspdm_test_requester_psk_finish_case16(void **state)
    2457              : {
    2458              :     libspdm_return_t status;
    2459              :     libspdm_test_context_t *spdm_test_context;
    2460              :     libspdm_context_t *spdm_context;
    2461              :     uint32_t session_id;
    2462              :     void *data;
    2463              :     size_t data_size;
    2464              :     void *hash;
    2465              :     size_t hash_size;
    2466              :     libspdm_session_info_t *session_info;
    2467              : 
    2468            1 :     spdm_test_context = *state;
    2469            1 :     spdm_context = spdm_test_context->spdm_context;
    2470            1 :     spdm_test_context->case_id = 0x10;
    2471            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    2472              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    2473            1 :     spdm_context->connection_info.connection_state =
    2474              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    2475            1 :     spdm_context->connection_info.capability.flags |=
    2476              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    2477            1 :     spdm_context->connection_info.capability.flags |=
    2478              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
    2479            1 :     spdm_context->connection_info.capability.flags |=
    2480              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
    2481            1 :     spdm_context->local_context.capability.flags |=
    2482              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    2483            1 :     spdm_context->local_context.capability.flags |=
    2484              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
    2485            1 :     spdm_context->local_context.capability.flags |=
    2486              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
    2487            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    2488              :                                                          m_libspdm_use_asym_algo, &data,
    2489              :                                                          &data_size, &hash, &hash_size)) {
    2490            0 :         assert(false);
    2491              :     }
    2492            1 :     libspdm_reset_message_a(spdm_context);
    2493            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    2494            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    2495            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
    2496            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
    2497              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    2498              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    2499              :         data_size;
    2500              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    2501              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    2502              :                      data, data_size);
    2503              : #endif
    2504              : 
    2505              : 
    2506            1 :     session_id = 0xFFFFFFFF;
    2507            1 :     session_info = &spdm_context->session_info[0];
    2508            1 :     libspdm_session_info_init(spdm_context, session_info, session_id, true);
    2509            1 :     libspdm_session_info_set_psk_hint(session_info,
    2510              :                                       LIBSPDM_TEST_PSK_HINT_STRING,
    2511              :                                       sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
    2512            1 :     libspdm_secured_message_set_session_state(
    2513              :         session_info->secured_message_context,
    2514              :         LIBSPDM_SESSION_STATE_HANDSHAKING);
    2515            1 :     libspdm_set_mem(m_libspdm_dummy_key_buffer,
    2516            1 :                     ((libspdm_secured_message_context_t*)(session_info->secured_message_context))
    2517              :                     ->aead_key_size, (uint8_t)(0xFF));
    2518            1 :     libspdm_secured_message_set_response_handshake_encryption_key(
    2519              :         session_info->secured_message_context, m_libspdm_dummy_key_buffer,
    2520            1 :         ((libspdm_secured_message_context_t*)(session_info->secured_message_context))
    2521              :         ->aead_key_size);
    2522            1 :     libspdm_set_mem(m_libspdm_dummy_salt_buffer,
    2523            1 :                     ((libspdm_secured_message_context_t*)(session_info->secured_message_context))
    2524              :                     ->aead_iv_size, (uint8_t)(0xFF));
    2525            1 :     libspdm_secured_message_set_response_handshake_salt(
    2526              :         session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
    2527            1 :         ((libspdm_secured_message_context_t*)(session_info->secured_message_context))
    2528              :         ->aead_iv_size);
    2529            1 :     ((libspdm_secured_message_context_t *)(session_info->secured_message_context))
    2530            1 :     ->handshake_secret.response_handshake_sequence_number = 0;
    2531            1 :     ((libspdm_secured_message_context_t *)(session_info->secured_message_context))
    2532            1 :     ->handshake_secret.request_handshake_sequence_number = 0;
    2533            1 :     libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
    2534              : 
    2535            1 :     status = libspdm_send_receive_psk_finish(spdm_context, session_id);
    2536            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    2537            1 :     assert_int_equal(
    2538              :         libspdm_secured_message_get_session_state(
    2539              :             spdm_context->session_info[0].secured_message_context),
    2540              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
    2541              : 
    2542              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    2543              :     assert_int_equal(spdm_context->session_info[0].session_transcript.message_f.buffer_size,
    2544              :                      m_libspdm_local_buffer_size);
    2545              :     LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "m_libspdm_local_buffer (0x%x):\n",
    2546              :                    m_libspdm_local_buffer_size));
    2547              :     libspdm_dump_hex(m_libspdm_local_buffer, m_libspdm_local_buffer_size);
    2548              :     assert_memory_equal(spdm_context->session_info[0].session_transcript.message_f.buffer,
    2549              :                         m_libspdm_local_buffer, m_libspdm_local_buffer_size);
    2550              : #endif
    2551            1 :     free(data);
    2552            1 : }
    2553              : 
    2554              : /**
    2555              :  * Test 17: SPDM version 1.4, with OpaqueData
    2556              :  * Expected Behavior: requester returns the status RETURN_SUCCESS and a PSK_FINISH_RSP message is
    2557              :  * received.
    2558              :  **/
    2559            1 : void libspdm_test_requester_psk_finish_case17(void **state)
    2560              : {
    2561              :     libspdm_return_t status;
    2562              :     libspdm_test_context_t *spdm_test_context;
    2563              :     libspdm_context_t *spdm_context;
    2564              :     uint32_t session_id;
    2565              :     void *data;
    2566              :     size_t data_size;
    2567              :     void *hash;
    2568              :     size_t hash_size;
    2569              :     libspdm_session_info_t *session_info;
    2570              : 
    2571            1 :     spdm_test_context = *state;
    2572            1 :     spdm_context = spdm_test_context->spdm_context;
    2573            1 :     spdm_test_context->case_id = 0x11;
    2574            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_14 <<
    2575              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    2576            1 :     spdm_context->connection_info.connection_state =
    2577              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    2578            1 :     spdm_context->connection_info.capability.flags |=
    2579              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    2580            1 :     spdm_context->connection_info.capability.flags |=
    2581              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
    2582            1 :     spdm_context->connection_info.capability.flags |=
    2583              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
    2584            1 :     spdm_context->local_context.capability.flags |=
    2585              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    2586            1 :     spdm_context->local_context.capability.flags |=
    2587              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
    2588            1 :     spdm_context->local_context.capability.flags |=
    2589              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
    2590            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    2591              :                                                          m_libspdm_use_asym_algo, &data,
    2592              :                                                          &data_size, &hash, &hash_size)) {
    2593            0 :         assert(false);
    2594              :     }
    2595            1 :     libspdm_reset_message_a(spdm_context);
    2596            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    2597            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    2598            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
    2599            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
    2600              : 
    2601            1 :     session_id = 0xFFFFFFFF;
    2602            1 :     session_info = &spdm_context->session_info[0];
    2603            1 :     libspdm_session_info_init(spdm_context, session_info, session_id, true);
    2604            1 :     libspdm_session_info_set_psk_hint(session_info,
    2605              :                                       LIBSPDM_TEST_PSK_HINT_STRING,
    2606              :                                       sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
    2607            1 :     libspdm_secured_message_set_session_state(
    2608              :         session_info->secured_message_context,
    2609              :         LIBSPDM_SESSION_STATE_HANDSHAKING);
    2610            1 :     libspdm_set_mem(m_libspdm_dummy_key_buffer,
    2611            1 :                     ((libspdm_secured_message_context_t*)(session_info->secured_message_context))
    2612              :                     ->aead_key_size, (uint8_t)(0xFF));
    2613            1 :     libspdm_secured_message_set_response_handshake_encryption_key(
    2614              :         session_info->secured_message_context, m_libspdm_dummy_key_buffer,
    2615            1 :         ((libspdm_secured_message_context_t*)(session_info->secured_message_context))
    2616              :         ->aead_key_size);
    2617            1 :     libspdm_set_mem(m_libspdm_dummy_salt_buffer,
    2618            1 :                     ((libspdm_secured_message_context_t*)(session_info->secured_message_context))
    2619              :                     ->aead_iv_size, (uint8_t)(0xFF));
    2620            1 :     libspdm_secured_message_set_response_handshake_salt(
    2621              :         session_info->secured_message_context, m_libspdm_dummy_salt_buffer,
    2622            1 :         ((libspdm_secured_message_context_t*)(session_info->secured_message_context))
    2623              :         ->aead_iv_size);
    2624            1 :     ((libspdm_secured_message_context_t *)(session_info->secured_message_context))
    2625            1 :     ->handshake_secret.response_handshake_sequence_number = 0;
    2626            1 :     ((libspdm_secured_message_context_t *)(session_info->secured_message_context))
    2627            1 :     ->handshake_secret.request_handshake_sequence_number = 0;
    2628            1 :     libspdm_secured_message_set_dummy_finished_key (session_info->secured_message_context);
    2629              : 
    2630            1 :     status = libspdm_send_receive_psk_finish(spdm_context, session_id);
    2631            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    2632            1 :     assert_int_equal(
    2633              :         libspdm_secured_message_get_session_state(
    2634              :             spdm_context->session_info[0].secured_message_context),
    2635              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
    2636              : 
    2637            1 :     free(data);
    2638            1 : }
    2639              : 
    2640            1 : int libspdm_requester_psk_finish_test_main(void)
    2641              : {
    2642            1 :     const struct CMUnitTest spdm_requester_psk_finish_tests[] = {
    2643              :         /* SendRequest failed*/
    2644              :         cmocka_unit_test(libspdm_test_requester_psk_finish_case1),
    2645              :         /* Successful response*/
    2646              :         cmocka_unit_test(libspdm_test_requester_psk_finish_case2),
    2647              :         /* connection_state check failed*/
    2648              :         cmocka_unit_test(libspdm_test_requester_psk_finish_case3),
    2649              :         /* Error response: SPDM_ERROR_CODE_INVALID_REQUEST*/
    2650              :         cmocka_unit_test(libspdm_test_requester_psk_finish_case4),
    2651              :         /* Always SPDM_ERROR_CODE_BUSY*/
    2652              :         cmocka_unit_test(libspdm_test_requester_psk_finish_case5),
    2653              :         /* SPDM_ERROR_CODE_BUSY + Successful response*/
    2654              :         cmocka_unit_test(libspdm_test_requester_psk_finish_case6),
    2655              :         /* Error response: SPDM_ERROR_CODE_REQUEST_RESYNCH*/
    2656              :         cmocka_unit_test(libspdm_test_requester_psk_finish_case7),
    2657              :         /* Always SPDM_ERROR_CODE_RESPONSE_NOT_READY*/
    2658              :         cmocka_unit_test(libspdm_test_requester_psk_finish_case8),
    2659              :         /* SPDM_ERROR_CODE_RESPONSE_NOT_READY + Successful response*/
    2660              :         cmocka_unit_test(libspdm_test_requester_psk_finish_case9),
    2661              :         /* Unexpected errors*/
    2662              :         cmocka_unit_test(libspdm_test_requester_psk_finish_case10),
    2663              :         /* Buffer reset*/
    2664              :         cmocka_unit_test(libspdm_test_requester_psk_finish_case11),
    2665              :         /* No correct setup*/
    2666              :         cmocka_unit_test(libspdm_test_requester_psk_finish_case12),
    2667              :         /* Wrong response code*/
    2668              :         cmocka_unit_test(libspdm_test_requester_psk_finish_case13),
    2669              :         /* Uninitialized session*/
    2670              :         cmocka_unit_test(libspdm_test_requester_psk_finish_case14),
    2671              :         /* Error response: SPDM_ERROR_CODE_DECRYPT_ERROR*/
    2672              :         cmocka_unit_test(libspdm_test_requester_psk_finish_case15),
    2673              :         /* Buffer verification*/
    2674              :         cmocka_unit_test(libspdm_test_requester_psk_finish_case16),
    2675              :         /* SPDM 1.4 with OpaqueData */
    2676              :         cmocka_unit_test(libspdm_test_requester_psk_finish_case17),
    2677              :     };
    2678              : 
    2679            1 :     libspdm_test_context_t test_context = {
    2680              :         LIBSPDM_TEST_CONTEXT_VERSION,
    2681              :         true,
    2682              :         libspdm_requester_psk_finish_test_send_message,
    2683              :         libspdm_requester_psk_finish_test_receive_message,
    2684              :     };
    2685              : 
    2686            1 :     libspdm_setup_test_context(&test_context);
    2687              : 
    2688            1 :     return cmocka_run_group_tests(spdm_requester_psk_finish_tests,
    2689              :                                   libspdm_unit_test_group_setup,
    2690              :                                   libspdm_unit_test_group_teardown);
    2691              : }
    2692              : 
    2693              : #endif /* LIBSPDM_ENABLE_CAPABILITY_PSK_CAP*/
        

Generated by: LCOV version 2.0-1