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.3 % 1188 1085
Test Date: 2026-06-14 09:11:02 Functions: 100.0 % 24 24

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

Generated by: LCOV version 2.0-1