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.9 % 1040 956
Test Date: 2025-06-29 08:09:00 Functions: 100.0 % 22 22

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

Generated by: LCOV version 2.0-1