LCOV - code coverage report
Current view: top level - unit_test/test_spdm_responder - psk_exchange.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 99.7 % 787 785
Test Date: 2025-06-29 08:09:00 Functions: 100.0 % 18 18

            Line data    Source code
       1              : /**
       2              :  *  Copyright Notice:
       3              :  *  Copyright 2021-2025 DMTF. All rights reserved.
       4              :  *  License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
       5              :  **/
       6              : 
       7              : #include "spdm_unit_test.h"
       8              : #include "internal/libspdm_responder_lib.h"
       9              : #include "internal/libspdm_requester_lib.h"
      10              : 
      11              : #if LIBSPDM_ENABLE_CAPABILITY_PSK_CAP
      12              : 
      13              : #pragma pack(1)
      14              : 
      15              : typedef struct {
      16              :     spdm_message_header_t header;
      17              :     uint16_t req_session_id;
      18              :     uint16_t psk_hint_length;
      19              :     uint16_t context_length;
      20              :     uint16_t opaque_length;
      21              :     uint8_t psk_hint[LIBSPDM_PSK_MAX_HINT_LENGTH];
      22              :     uint8_t context[LIBSPDM_PSK_CONTEXT_LENGTH];
      23              :     uint8_t opaque_data[SPDM_MAX_OPAQUE_DATA_SIZE];
      24              : } libspdm_psk_exchange_request_mine_t;
      25              : 
      26              : typedef struct {
      27              :     spdm_message_header_t header;
      28              :     uint16_t req_session_id;
      29              :     uint16_t psk_hint_length;
      30              :     uint16_t context_length;
      31              :     uint16_t opaque_length;
      32              :     uint8_t context[LIBSPDM_PSK_CONTEXT_LENGTH];
      33              :     uint8_t opaque_data[SPDM_MAX_OPAQUE_DATA_SIZE];
      34              : } libspdm_psk_exchange_request_mine_t_noPSKHINT;
      35              : 
      36              : typedef struct {
      37              :     spdm_message_header_t header;
      38              :     uint16_t req_session_id;
      39              :     uint16_t psk_hint_length;
      40              :     uint16_t context_length;
      41              :     uint16_t opaque_length;
      42              :     uint8_t psk_hint[LIBSPDM_PSK_MAX_HINT_LENGTH];
      43              :     uint8_t context[LIBSPDM_PSK_CONTEXT_LENGTH];
      44              : } libspdm_psk_exchange_request_mine_t_noOPAQUE;
      45              : 
      46              : typedef struct {
      47              :     spdm_message_header_t header;
      48              :     uint16_t req_session_id;
      49              :     uint16_t psk_hint_length;
      50              :     uint16_t context_length;
      51              :     uint16_t opaque_length;
      52              :     uint8_t context[LIBSPDM_PSK_CONTEXT_LENGTH];
      53              : } libspdm_psk_exchange_request_mine_t_noPSKHINT_noOPAQUE;
      54              : 
      55              : #pragma pack()
      56              : 
      57              : 
      58              : libspdm_psk_exchange_request_mine_t m_libspdm_psk_exchange_request1 = {
      59              :     { SPDM_MESSAGE_VERSION_11, SPDM_PSK_EXCHANGE,
      60              :       SPDM_PSK_EXCHANGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH, 0 },
      61              : };
      62              : size_t m_libspdm_psk_exchange_request1_size = sizeof(m_libspdm_psk_exchange_request1);
      63              : 
      64              : libspdm_psk_exchange_request_mine_t m_libspdm_psk_exchange_request2 = {
      65              :     { SPDM_MESSAGE_VERSION_11, SPDM_PSK_EXCHANGE,
      66              :       SPDM_PSK_EXCHANGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH, 0 },
      67              : };
      68              : size_t m_libspdm_psk_exchange_request2_size = sizeof(spdm_psk_exchange_request_t);
      69              : 
      70              : libspdm_psk_exchange_request_mine_t m_libspdm_psk_exchange_request3 = {
      71              :     { SPDM_MESSAGE_VERSION_12, SPDM_PSK_EXCHANGE,
      72              :       SPDM_PSK_EXCHANGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH, 0 },
      73              : };
      74              : size_t m_libspdm_psk_exchange_request3_size = sizeof(m_libspdm_psk_exchange_request3);
      75              : 
      76              : /* Request TCB measurement hash */
      77              : libspdm_psk_exchange_request_mine_t m_libspdm_psk_exchange_request4 = {
      78              :     { SPDM_MESSAGE_VERSION_11, SPDM_PSK_EXCHANGE,
      79              :       SPDM_PSK_EXCHANGE_REQUEST_TCB_COMPONENT_MEASUREMENT_HASH, 0 },
      80              : };
      81              : size_t m_libspdm_psk_exchange_request4_size = sizeof(m_libspdm_psk_exchange_request4);
      82              : 
      83              : /* Request all measurement hash */
      84              : libspdm_psk_exchange_request_mine_t m_libspdm_psk_exchange_request5 = {
      85              :     { SPDM_MESSAGE_VERSION_11, SPDM_PSK_EXCHANGE,
      86              :       SPDM_PSK_EXCHANGE_REQUEST_ALL_MEASUREMENTS_HASH, 0 },
      87              : };
      88              : size_t m_libspdm_psk_exchange_request5_size = sizeof(m_libspdm_psk_exchange_request5);
      89              : 
      90              : /* Uses a reserved value in measurement hash */
      91              : libspdm_psk_exchange_request_mine_t m_libspdm_psk_exchange_request6 = {
      92              :     { SPDM_MESSAGE_VERSION_11, SPDM_PSK_EXCHANGE,
      93              :       0x50, 0 },
      94              : };
      95              : size_t m_libspdm_psk_exchange_request6_size = sizeof(m_libspdm_psk_exchange_request6);
      96              : 
      97              : libspdm_psk_exchange_request_mine_t_noPSKHINT m_libspdm_psk_exchange_request7 = {
      98              :     { SPDM_MESSAGE_VERSION_11, SPDM_PSK_EXCHANGE,
      99              :       SPDM_PSK_EXCHANGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH, 0 },
     100              : };
     101              : size_t m_libspdm_psk_exchange_request7_size = sizeof(m_libspdm_psk_exchange_request7);
     102              : 
     103              : libspdm_psk_exchange_request_mine_t_noOPAQUE m_libspdm_psk_exchange_request8 = {
     104              :     { SPDM_MESSAGE_VERSION_11, SPDM_PSK_EXCHANGE,
     105              :       SPDM_PSK_EXCHANGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH, 0 },
     106              : };
     107              : size_t m_libspdm_psk_exchange_request8_size = sizeof(m_libspdm_psk_exchange_request8);
     108              : 
     109              : libspdm_psk_exchange_request_mine_t_noPSKHINT_noOPAQUE m_libspdm_psk_exchange_request9 = {
     110              :     { SPDM_MESSAGE_VERSION_11, SPDM_PSK_EXCHANGE,
     111              :       SPDM_PSK_EXCHANGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH, 0 },
     112              : };
     113              : size_t m_libspdm_psk_exchange_request9_size = sizeof(m_libspdm_psk_exchange_request9);
     114              : 
     115            1 : void libspdm_test_responder_psk_exchange_case1(void **state)
     116              : {
     117              :     libspdm_return_t status;
     118              :     libspdm_test_context_t *spdm_test_context;
     119              :     libspdm_context_t *spdm_context;
     120              :     size_t response_size;
     121              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     122              :     spdm_psk_exchange_response_t *spdm_response;
     123              :     void *data1;
     124              :     size_t data_size1;
     125              :     uint8_t *ptr;
     126              :     size_t opaque_psk_exchange_req_size;
     127              : 
     128            1 :     spdm_test_context = *state;
     129            1 :     spdm_context = spdm_test_context->spdm_context;
     130            1 :     spdm_test_context->case_id = 0x1;
     131            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     132              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     133            1 :     spdm_context->connection_info.connection_state =
     134              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     135            1 :     spdm_context->connection_info.capability.flags |=
     136              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP |
     137              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
     138            1 :     spdm_context->local_context.capability.flags |=
     139              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP |
     140              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
     141            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     142              :         m_libspdm_use_hash_algo;
     143            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     144              :         m_libspdm_use_measurement_spec;
     145            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     146              :         m_libspdm_use_measurement_hash_algo;
     147            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
     148              :         m_libspdm_use_dhe_algo;
     149            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
     150              :         m_libspdm_use_aead_algo;
     151            1 :     spdm_context->connection_info.algorithm.key_schedule =
     152              :         m_libspdm_use_key_schedule_algo;
     153            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     154              :                                                     m_libspdm_use_asym_algo, &data1,
     155              :                                                     &data_size1, NULL, NULL);
     156            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     157            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
     158              :         data_size1;
     159            1 :     spdm_context->connection_info.local_used_cert_chain_buffer = data1;
     160            1 :     spdm_context->connection_info.local_used_cert_chain_buffer_size =
     161              :         data_size1;
     162              : 
     163            1 :     libspdm_reset_message_a(spdm_context);
     164              : 
     165            1 :     m_libspdm_psk_exchange_request1.psk_hint_length =
     166              :         (uint16_t)sizeof(LIBSPDM_TEST_PSK_HINT_STRING);
     167            1 :     m_libspdm_psk_exchange_request1.context_length = LIBSPDM_PSK_CONTEXT_LENGTH;
     168            1 :     opaque_psk_exchange_req_size =
     169            1 :         libspdm_get_opaque_data_supported_version_data_size(spdm_context);
     170            1 :     m_libspdm_psk_exchange_request1.opaque_length =
     171            1 :         (uint16_t)opaque_psk_exchange_req_size;
     172            1 :     m_libspdm_psk_exchange_request1.req_session_id = 0xFFFF;
     173            1 :     ptr = m_libspdm_psk_exchange_request1.psk_hint;
     174            1 :     libspdm_copy_mem(ptr, sizeof(m_libspdm_psk_exchange_request1.psk_hint),
     175              :                      LIBSPDM_TEST_PSK_HINT_STRING,
     176              :                      sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
     177            1 :     ptr += m_libspdm_psk_exchange_request1.psk_hint_length;
     178            1 :     libspdm_get_random_number(LIBSPDM_PSK_CONTEXT_LENGTH, ptr);
     179            1 :     ptr += m_libspdm_psk_exchange_request1.context_length;
     180            1 :     libspdm_build_opaque_data_supported_version_data(
     181              :         spdm_context, &opaque_psk_exchange_req_size, ptr);
     182              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     183              :     spdm_context->transcript.message_m.buffer_size =
     184              :         spdm_context->transcript.message_m.max_buffer_size;
     185              : #endif
     186            1 :     ptr += opaque_psk_exchange_req_size;
     187            1 :     response_size = sizeof(response);
     188            1 :     status = libspdm_get_response_psk_exchange(
     189              :         spdm_context, m_libspdm_psk_exchange_request1_size,
     190              :         &m_libspdm_psk_exchange_request1, &response_size, response);
     191            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     192            1 :     assert_int_equal(
     193              :         libspdm_secured_message_get_session_state(
     194              :             spdm_context->session_info[0].secured_message_context),
     195              :         LIBSPDM_SESSION_STATE_HANDSHAKING);
     196            1 :     spdm_response = (void *)response;
     197            1 :     assert_int_equal(spdm_response->header.request_response_code,
     198              :                      SPDM_PSK_EXCHANGE_RSP);
     199            1 :     assert_int_equal(spdm_response->rsp_session_id, 0xFFFF);
     200              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     201              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size,
     202              :                      0);
     203              : #endif
     204            1 :     free(data1);
     205            1 : }
     206              : 
     207            1 : void libspdm_test_responder_psk_exchange_case2(void **state)
     208              : {
     209              :     libspdm_return_t status;
     210              :     libspdm_test_context_t *spdm_test_context;
     211              :     libspdm_context_t *spdm_context;
     212              :     size_t response_size;
     213              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     214              :     spdm_psk_exchange_response_t *spdm_response;
     215              :     void *data1;
     216              :     size_t data_size1;
     217              :     uint8_t *ptr;
     218              :     size_t opaque_psk_exchange_req_size;
     219              : 
     220            1 :     spdm_test_context = *state;
     221            1 :     spdm_context = spdm_test_context->spdm_context;
     222            1 :     spdm_test_context->case_id = 0x2;
     223            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     224              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     225            1 :     spdm_context->connection_info.connection_state =
     226              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     227            1 :     spdm_context->connection_info.capability.flags |=
     228              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
     229            1 :     spdm_context->local_context.capability.flags |=
     230              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
     231            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     232              :         m_libspdm_use_hash_algo;
     233            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     234              :         m_libspdm_use_measurement_spec;
     235            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     236              :         m_libspdm_use_measurement_hash_algo;
     237            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
     238              :         m_libspdm_use_dhe_algo;
     239            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
     240              :         m_libspdm_use_aead_algo;
     241            1 :     spdm_context->connection_info.algorithm.key_schedule =
     242              :         m_libspdm_use_key_schedule_algo;
     243            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     244              :                                                     m_libspdm_use_asym_algo, &data1,
     245              :                                                     &data_size1, NULL, NULL);
     246            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     247            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
     248              :         data_size1;
     249            1 :     spdm_context->connection_info.local_used_cert_chain_buffer = data1;
     250            1 :     spdm_context->connection_info.local_used_cert_chain_buffer_size =
     251              :         data_size1;
     252              : 
     253            1 :     libspdm_reset_message_a(spdm_context);
     254              : 
     255            1 :     m_libspdm_psk_exchange_request2.psk_hint_length =
     256              :         (uint16_t)sizeof(LIBSPDM_TEST_PSK_HINT_STRING);
     257            1 :     m_libspdm_psk_exchange_request2.context_length = LIBSPDM_PSK_CONTEXT_LENGTH;
     258            1 :     opaque_psk_exchange_req_size =
     259            1 :         libspdm_get_opaque_data_supported_version_data_size(spdm_context);
     260            1 :     m_libspdm_psk_exchange_request2.opaque_length =
     261            1 :         (uint16_t)opaque_psk_exchange_req_size;
     262            1 :     m_libspdm_psk_exchange_request2.req_session_id = 0xFFFF;
     263            1 :     ptr = m_libspdm_psk_exchange_request2.psk_hint;
     264            1 :     libspdm_copy_mem(ptr, sizeof(m_libspdm_psk_exchange_request2.psk_hint),
     265              :                      LIBSPDM_TEST_PSK_HINT_STRING,
     266              :                      sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
     267            1 :     ptr += m_libspdm_psk_exchange_request2.psk_hint_length;
     268            1 :     libspdm_get_random_number(LIBSPDM_PSK_CONTEXT_LENGTH, ptr);
     269            1 :     ptr += m_libspdm_psk_exchange_request2.context_length;
     270            1 :     libspdm_build_opaque_data_supported_version_data(
     271              :         spdm_context, &opaque_psk_exchange_req_size, ptr);
     272            1 :     ptr += opaque_psk_exchange_req_size;
     273            1 :     response_size = sizeof(response);
     274            1 :     status = libspdm_get_response_psk_exchange(
     275              :         spdm_context, m_libspdm_psk_exchange_request2_size,
     276              :         &m_libspdm_psk_exchange_request2, &response_size, response);
     277            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     278            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     279            1 :     spdm_response = (void *)response;
     280            1 :     assert_int_equal(spdm_response->header.request_response_code,
     281              :                      SPDM_ERROR);
     282            1 :     assert_int_equal(spdm_response->header.param1,
     283              :                      SPDM_ERROR_CODE_INVALID_REQUEST);
     284            1 :     assert_int_equal(spdm_response->header.param2, 0);
     285            1 :     free(data1);
     286            1 : }
     287              : 
     288            1 : void libspdm_test_responder_psk_exchange_case3(void **state)
     289              : {
     290              :     libspdm_return_t status;
     291              :     libspdm_test_context_t *spdm_test_context;
     292              :     libspdm_context_t *spdm_context;
     293              :     size_t response_size;
     294              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     295              :     spdm_psk_exchange_response_t *spdm_response;
     296              :     void *data1;
     297              :     size_t data_size1;
     298              :     uint8_t *ptr;
     299              :     size_t opaque_psk_exchange_req_size;
     300              : 
     301            1 :     spdm_test_context = *state;
     302            1 :     spdm_context = spdm_test_context->spdm_context;
     303            1 :     spdm_test_context->case_id = 0x3;
     304            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     305              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     306            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_BUSY;
     307            1 :     spdm_context->connection_info.connection_state =
     308              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     309            1 :     spdm_context->connection_info.capability.flags |=
     310              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
     311            1 :     spdm_context->local_context.capability.flags |=
     312              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
     313            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     314              :         m_libspdm_use_hash_algo;
     315            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     316              :         m_libspdm_use_measurement_spec;
     317            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     318              :         m_libspdm_use_measurement_hash_algo;
     319            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
     320              :         m_libspdm_use_dhe_algo;
     321            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
     322              :         m_libspdm_use_aead_algo;
     323            1 :     spdm_context->connection_info.algorithm.key_schedule =
     324              :         m_libspdm_use_key_schedule_algo;
     325            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     326              :                                                     m_libspdm_use_asym_algo, &data1,
     327              :                                                     &data_size1, NULL, NULL);
     328            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     329            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
     330              :         data_size1;
     331            1 :     spdm_context->connection_info.local_used_cert_chain_buffer = data1;
     332            1 :     spdm_context->connection_info.local_used_cert_chain_buffer_size =
     333              :         data_size1;
     334              : 
     335            1 :     libspdm_reset_message_a(spdm_context);
     336              : 
     337            1 :     m_libspdm_psk_exchange_request1.psk_hint_length =
     338              :         (uint16_t)sizeof(LIBSPDM_TEST_PSK_HINT_STRING);
     339            1 :     m_libspdm_psk_exchange_request1.context_length = LIBSPDM_PSK_CONTEXT_LENGTH;
     340            1 :     opaque_psk_exchange_req_size =
     341            1 :         libspdm_get_opaque_data_supported_version_data_size(spdm_context);
     342            1 :     m_libspdm_psk_exchange_request1.opaque_length =
     343            1 :         (uint16_t)opaque_psk_exchange_req_size;
     344            1 :     m_libspdm_psk_exchange_request1.req_session_id = 0xFFFF;
     345            1 :     ptr = m_libspdm_psk_exchange_request1.psk_hint;
     346            1 :     libspdm_copy_mem(ptr, sizeof(m_libspdm_psk_exchange_request1.psk_hint),
     347              :                      LIBSPDM_TEST_PSK_HINT_STRING,
     348              :                      sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
     349            1 :     ptr += m_libspdm_psk_exchange_request1.psk_hint_length;
     350            1 :     libspdm_get_random_number(LIBSPDM_PSK_CONTEXT_LENGTH, ptr);
     351            1 :     ptr += m_libspdm_psk_exchange_request1.context_length;
     352            1 :     libspdm_build_opaque_data_supported_version_data(
     353              :         spdm_context, &opaque_psk_exchange_req_size, ptr);
     354            1 :     ptr += opaque_psk_exchange_req_size;
     355            1 :     response_size = sizeof(response);
     356            1 :     status = libspdm_get_response_psk_exchange(
     357              :         spdm_context, m_libspdm_psk_exchange_request1_size,
     358              :         &m_libspdm_psk_exchange_request1, &response_size, response);
     359            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     360            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     361            1 :     spdm_response = (void *)response;
     362            1 :     assert_int_equal(spdm_response->header.request_response_code,
     363              :                      SPDM_ERROR);
     364            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_BUSY);
     365            1 :     assert_int_equal(spdm_response->header.param2, 0);
     366            1 :     assert_int_equal(spdm_context->response_state,
     367              :                      LIBSPDM_RESPONSE_STATE_BUSY);
     368            1 :     free(data1);
     369            1 : }
     370              : 
     371            1 : void libspdm_test_responder_psk_exchange_case4(void **state)
     372              : {
     373              :     libspdm_return_t status;
     374              :     libspdm_test_context_t *spdm_test_context;
     375              :     libspdm_context_t *spdm_context;
     376              :     size_t response_size;
     377              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     378              :     spdm_psk_exchange_response_t *spdm_response;
     379              :     void *data1;
     380              :     size_t data_size1;
     381              :     uint8_t *ptr;
     382              :     size_t opaque_psk_exchange_req_size;
     383              : 
     384            1 :     spdm_test_context = *state;
     385            1 :     spdm_context = spdm_test_context->spdm_context;
     386            1 :     spdm_test_context->case_id = 0x4;
     387            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     388              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     389            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NEED_RESYNC;
     390            1 :     spdm_context->connection_info.connection_state =
     391              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     392            1 :     spdm_context->connection_info.capability.flags |=
     393              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
     394            1 :     spdm_context->local_context.capability.flags |=
     395              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
     396            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     397              :         m_libspdm_use_hash_algo;
     398            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     399              :         m_libspdm_use_measurement_spec;
     400            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     401              :         m_libspdm_use_measurement_hash_algo;
     402            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
     403              :         m_libspdm_use_dhe_algo;
     404            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
     405              :         m_libspdm_use_aead_algo;
     406            1 :     spdm_context->connection_info.algorithm.key_schedule =
     407              :         m_libspdm_use_key_schedule_algo;
     408            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     409              :                                                     m_libspdm_use_asym_algo, &data1,
     410              :                                                     &data_size1, NULL, NULL);
     411            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     412            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
     413              :         data_size1;
     414            1 :     spdm_context->connection_info.local_used_cert_chain_buffer = data1;
     415            1 :     spdm_context->connection_info.local_used_cert_chain_buffer_size =
     416              :         data_size1;
     417              : 
     418            1 :     libspdm_reset_message_a(spdm_context);
     419              : 
     420            1 :     m_libspdm_psk_exchange_request1.psk_hint_length =
     421              :         (uint16_t)sizeof(LIBSPDM_TEST_PSK_HINT_STRING);
     422            1 :     m_libspdm_psk_exchange_request1.context_length = LIBSPDM_PSK_CONTEXT_LENGTH;
     423            1 :     opaque_psk_exchange_req_size =
     424            1 :         libspdm_get_opaque_data_supported_version_data_size(spdm_context);
     425            1 :     m_libspdm_psk_exchange_request1.opaque_length =
     426            1 :         (uint16_t)opaque_psk_exchange_req_size;
     427            1 :     m_libspdm_psk_exchange_request1.req_session_id = 0xFFFF;
     428            1 :     ptr = m_libspdm_psk_exchange_request1.psk_hint;
     429            1 :     libspdm_copy_mem(ptr, sizeof(m_libspdm_psk_exchange_request1.psk_hint),
     430              :                      LIBSPDM_TEST_PSK_HINT_STRING,
     431              :                      sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
     432            1 :     ptr += m_libspdm_psk_exchange_request1.psk_hint_length;
     433            1 :     libspdm_get_random_number(LIBSPDM_PSK_CONTEXT_LENGTH, ptr);
     434            1 :     ptr += m_libspdm_psk_exchange_request1.context_length;
     435            1 :     libspdm_build_opaque_data_supported_version_data(
     436              :         spdm_context, &opaque_psk_exchange_req_size, ptr);
     437            1 :     ptr += opaque_psk_exchange_req_size;
     438            1 :     response_size = sizeof(response);
     439            1 :     status = libspdm_get_response_psk_exchange(
     440              :         spdm_context, m_libspdm_psk_exchange_request1_size,
     441              :         &m_libspdm_psk_exchange_request1, &response_size, response);
     442            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     443            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     444            1 :     spdm_response = (void *)response;
     445            1 :     assert_int_equal(spdm_response->header.request_response_code,
     446              :                      SPDM_ERROR);
     447            1 :     assert_int_equal(spdm_response->header.param1,
     448              :                      SPDM_ERROR_CODE_REQUEST_RESYNCH);
     449            1 :     assert_int_equal(spdm_response->header.param2, 0);
     450            1 :     assert_int_equal(spdm_context->response_state,
     451              :                      LIBSPDM_RESPONSE_STATE_NEED_RESYNC);
     452            1 :     free(data1);
     453            1 : }
     454              : 
     455              : #if LIBSPDM_RESPOND_IF_READY_SUPPORT
     456            1 : void libspdm_test_responder_psk_exchange_case5(void **state)
     457              : {
     458              :     libspdm_return_t status;
     459              :     libspdm_test_context_t *spdm_test_context;
     460              :     libspdm_context_t *spdm_context;
     461              :     size_t response_size;
     462              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     463              :     spdm_psk_exchange_response_t *spdm_response;
     464              :     void *data1;
     465              :     size_t data_size1;
     466              :     uint8_t *ptr;
     467              :     size_t opaque_psk_exchange_req_size;
     468              :     spdm_error_data_response_not_ready_t *error_data;
     469              : 
     470            1 :     spdm_test_context = *state;
     471            1 :     spdm_context = spdm_test_context->spdm_context;
     472            1 :     spdm_test_context->case_id = 0x5;
     473            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     474              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     475            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NOT_READY;
     476            1 :     spdm_context->connection_info.connection_state =
     477              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     478            1 :     spdm_context->connection_info.capability.flags |=
     479              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
     480            1 :     spdm_context->local_context.capability.flags |=
     481              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
     482            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     483              :         m_libspdm_use_hash_algo;
     484            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     485              :         m_libspdm_use_measurement_spec;
     486            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     487              :         m_libspdm_use_measurement_hash_algo;
     488            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
     489              :         m_libspdm_use_dhe_algo;
     490            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
     491              :         m_libspdm_use_aead_algo;
     492            1 :     spdm_context->connection_info.algorithm.key_schedule =
     493              :         m_libspdm_use_key_schedule_algo;
     494            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     495              :                                                     m_libspdm_use_asym_algo, &data1,
     496              :                                                     &data_size1, NULL, NULL);
     497            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     498            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
     499              :         data_size1;
     500            1 :     spdm_context->connection_info.local_used_cert_chain_buffer = data1;
     501            1 :     spdm_context->connection_info.local_used_cert_chain_buffer_size =
     502              :         data_size1;
     503              : 
     504            1 :     libspdm_reset_message_a(spdm_context);
     505              : 
     506            1 :     m_libspdm_psk_exchange_request1.psk_hint_length =
     507              :         (uint16_t)sizeof(LIBSPDM_TEST_PSK_HINT_STRING);
     508            1 :     m_libspdm_psk_exchange_request1.context_length = LIBSPDM_PSK_CONTEXT_LENGTH;
     509            1 :     opaque_psk_exchange_req_size =
     510            1 :         libspdm_get_opaque_data_supported_version_data_size(spdm_context);
     511            1 :     m_libspdm_psk_exchange_request1.opaque_length =
     512            1 :         (uint16_t)opaque_psk_exchange_req_size;
     513            1 :     m_libspdm_psk_exchange_request1.req_session_id = 0xFFFF;
     514            1 :     ptr = m_libspdm_psk_exchange_request1.psk_hint;
     515            1 :     libspdm_copy_mem(ptr, sizeof(m_libspdm_psk_exchange_request1.psk_hint),
     516              :                      LIBSPDM_TEST_PSK_HINT_STRING,
     517              :                      sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
     518            1 :     ptr += m_libspdm_psk_exchange_request1.psk_hint_length;
     519            1 :     libspdm_get_random_number(LIBSPDM_PSK_CONTEXT_LENGTH, ptr);
     520            1 :     ptr += m_libspdm_psk_exchange_request1.context_length;
     521            1 :     libspdm_build_opaque_data_supported_version_data(
     522              :         spdm_context, &opaque_psk_exchange_req_size, ptr);
     523            1 :     ptr += opaque_psk_exchange_req_size;
     524            1 :     response_size = sizeof(response);
     525            1 :     status = libspdm_get_response_psk_exchange(
     526              :         spdm_context, m_libspdm_psk_exchange_request1_size,
     527              :         &m_libspdm_psk_exchange_request1, &response_size, response);
     528            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     529            1 :     assert_int_equal(response_size,
     530              :                      sizeof(spdm_error_response_t) +
     531              :                      sizeof(spdm_error_data_response_not_ready_t));
     532            1 :     spdm_response = (void *)response;
     533            1 :     error_data = (spdm_error_data_response_not_ready_t
     534              :                   *)(&spdm_response->rsp_session_id);
     535            1 :     assert_int_equal(spdm_response->header.request_response_code,
     536              :                      SPDM_ERROR);
     537            1 :     assert_int_equal(spdm_response->header.param1,
     538              :                      SPDM_ERROR_CODE_RESPONSE_NOT_READY);
     539            1 :     assert_int_equal(spdm_response->header.param2, 0);
     540            1 :     assert_int_equal(spdm_context->response_state,
     541              :                      LIBSPDM_RESPONSE_STATE_NOT_READY);
     542            1 :     assert_int_equal(error_data->request_code, SPDM_PSK_EXCHANGE);
     543            1 :     free(data1);
     544            1 : }
     545              : #endif /* LIBSPDM_RESPOND_IF_READY_SUPPORT */
     546              : 
     547            1 : void libspdm_test_responder_psk_exchange_case6(void **state)
     548              : {
     549              :     libspdm_return_t status;
     550              :     libspdm_test_context_t *spdm_test_context;
     551              :     libspdm_context_t *spdm_context;
     552              :     size_t response_size;
     553              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     554              :     spdm_psk_exchange_response_t *spdm_response;
     555              :     void *data1;
     556              :     size_t data_size1;
     557              :     uint8_t *ptr;
     558              :     size_t opaque_psk_exchange_req_size;
     559              : 
     560            1 :     spdm_test_context = *state;
     561            1 :     spdm_context = spdm_test_context->spdm_context;
     562            1 :     spdm_test_context->case_id = 0x6;
     563            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     564              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     565            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
     566            1 :     spdm_context->connection_info.connection_state =
     567              :         LIBSPDM_CONNECTION_STATE_NOT_STARTED;
     568            1 :     spdm_context->connection_info.capability.flags |=
     569              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
     570            1 :     spdm_context->local_context.capability.flags |=
     571              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
     572            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     573              :         m_libspdm_use_hash_algo;
     574            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     575              :         m_libspdm_use_measurement_spec;
     576            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     577              :         m_libspdm_use_measurement_hash_algo;
     578            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
     579              :         m_libspdm_use_dhe_algo;
     580            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
     581              :         m_libspdm_use_aead_algo;
     582            1 :     spdm_context->connection_info.algorithm.key_schedule =
     583              :         m_libspdm_use_key_schedule_algo;
     584            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     585              :                                                     m_libspdm_use_asym_algo, &data1,
     586              :                                                     &data_size1, NULL, NULL);
     587            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     588            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
     589              :         data_size1;
     590            1 :     spdm_context->connection_info.local_used_cert_chain_buffer = data1;
     591            1 :     spdm_context->connection_info.local_used_cert_chain_buffer_size =
     592              :         data_size1;
     593              : 
     594            1 :     libspdm_reset_message_a(spdm_context);
     595              : 
     596            1 :     m_libspdm_psk_exchange_request1.psk_hint_length =
     597              :         (uint16_t)sizeof(LIBSPDM_TEST_PSK_HINT_STRING);
     598            1 :     m_libspdm_psk_exchange_request1.context_length = LIBSPDM_PSK_CONTEXT_LENGTH;
     599            1 :     opaque_psk_exchange_req_size =
     600            1 :         libspdm_get_opaque_data_supported_version_data_size(spdm_context);
     601            1 :     m_libspdm_psk_exchange_request1.opaque_length =
     602            1 :         (uint16_t)opaque_psk_exchange_req_size;
     603            1 :     m_libspdm_psk_exchange_request1.req_session_id = 0xFFFF;
     604            1 :     ptr = m_libspdm_psk_exchange_request1.psk_hint;
     605            1 :     libspdm_copy_mem(ptr, sizeof(m_libspdm_psk_exchange_request1.psk_hint),
     606              :                      LIBSPDM_TEST_PSK_HINT_STRING,
     607              :                      sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
     608            1 :     ptr += m_libspdm_psk_exchange_request1.psk_hint_length;
     609            1 :     libspdm_get_random_number(LIBSPDM_PSK_CONTEXT_LENGTH, ptr);
     610            1 :     ptr += m_libspdm_psk_exchange_request1.context_length;
     611            1 :     libspdm_build_opaque_data_supported_version_data(
     612              :         spdm_context, &opaque_psk_exchange_req_size, ptr);
     613            1 :     ptr += opaque_psk_exchange_req_size;
     614            1 :     response_size = sizeof(response);
     615            1 :     status = libspdm_get_response_psk_exchange(
     616              :         spdm_context, m_libspdm_psk_exchange_request1_size,
     617              :         &m_libspdm_psk_exchange_request1, &response_size, response);
     618            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     619            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     620            1 :     spdm_response = (void *)response;
     621            1 :     assert_int_equal(spdm_response->header.request_response_code,
     622              :                      SPDM_ERROR);
     623            1 :     assert_int_equal(spdm_response->header.param1,
     624              :                      SPDM_ERROR_CODE_UNEXPECTED_REQUEST);
     625            1 :     assert_int_equal(spdm_response->header.param2, 0);
     626            1 :     free(data1);
     627            1 : }
     628              : 
     629            1 : void libspdm_test_responder_psk_exchange_case7(void **state)
     630              : {
     631              :     libspdm_return_t status;
     632              :     libspdm_test_context_t *spdm_test_context;
     633              :     libspdm_context_t *spdm_context;
     634              :     size_t response_size;
     635              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     636              :     spdm_psk_exchange_response_t *spdm_response;
     637              :     void *data1;
     638              :     size_t data_size1;
     639              :     uint8_t *ptr;
     640              :     size_t opaque_psk_exchange_req_size;
     641              : 
     642            1 :     spdm_test_context = *state;
     643            1 :     spdm_context = spdm_test_context->spdm_context;
     644            1 :     spdm_test_context->case_id = 0x7;
     645            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     646              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     647            1 :     spdm_context->connection_info.connection_state =
     648              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     649            1 :     spdm_context->connection_info.capability.flags |=
     650              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
     651            1 :     spdm_context->local_context.capability.flags |=
     652              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
     653            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     654              :         m_libspdm_use_hash_algo;
     655            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     656              :         m_libspdm_use_measurement_spec;
     657            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     658              :         m_libspdm_use_measurement_hash_algo;
     659            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
     660              :         m_libspdm_use_dhe_algo;
     661            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
     662              :         m_libspdm_use_aead_algo;
     663            1 :     spdm_context->connection_info.algorithm.key_schedule =
     664              :         m_libspdm_use_key_schedule_algo;
     665            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     666              :                                                     m_libspdm_use_asym_algo, &data1,
     667              :                                                     &data_size1, NULL, NULL);
     668            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     669            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
     670              :         data_size1;
     671            1 :     spdm_context->connection_info.local_used_cert_chain_buffer = data1;
     672            1 :     spdm_context->connection_info.local_used_cert_chain_buffer_size =
     673              :         data_size1;
     674              : 
     675            1 :     libspdm_reset_message_a(spdm_context);
     676              : 
     677            1 :     m_libspdm_psk_exchange_request1.psk_hint_length =
     678              :         (uint16_t)sizeof(LIBSPDM_TEST_PSK_HINT_STRING);
     679            1 :     m_libspdm_psk_exchange_request1.context_length = LIBSPDM_PSK_CONTEXT_LENGTH;
     680            1 :     opaque_psk_exchange_req_size =
     681            1 :         libspdm_get_opaque_data_supported_version_data_size(spdm_context);
     682            1 :     m_libspdm_psk_exchange_request1.opaque_length =
     683            1 :         (uint16_t)opaque_psk_exchange_req_size;
     684            1 :     m_libspdm_psk_exchange_request1.req_session_id = 0xFFFF;
     685            1 :     ptr = m_libspdm_psk_exchange_request1.psk_hint;
     686            1 :     libspdm_copy_mem(ptr, sizeof(m_libspdm_psk_exchange_request1.psk_hint),
     687              :                      LIBSPDM_TEST_PSK_HINT_STRING,
     688              :                      sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
     689            1 :     ptr += m_libspdm_psk_exchange_request1.psk_hint_length;
     690            1 :     libspdm_get_random_number(LIBSPDM_PSK_CONTEXT_LENGTH, ptr);
     691            1 :     ptr += m_libspdm_psk_exchange_request1.context_length;
     692            1 :     libspdm_build_opaque_data_supported_version_data(
     693              :         spdm_context, &opaque_psk_exchange_req_size, ptr);
     694            1 :     ptr += opaque_psk_exchange_req_size;
     695              : 
     696              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     697              :     spdm_context->transcript.message_m.buffer_size =
     698              :         spdm_context->transcript.message_m.max_buffer_size;
     699              :     spdm_context->transcript.message_b.buffer_size =
     700              :         spdm_context->transcript.message_b.max_buffer_size;
     701              :     spdm_context->transcript.message_c.buffer_size =
     702              :         spdm_context->transcript.message_c.max_buffer_size;
     703              :     spdm_context->transcript.message_mut_b.buffer_size =
     704              :         spdm_context->transcript.message_mut_b.max_buffer_size;
     705              :     spdm_context->transcript.message_mut_c.buffer_size =
     706              :         spdm_context->transcript.message_mut_c.max_buffer_size;
     707              : #endif
     708              : 
     709            1 :     response_size = sizeof(response);
     710            1 :     status = libspdm_get_response_psk_exchange(
     711              :         spdm_context, m_libspdm_psk_exchange_request1_size,
     712              :         &m_libspdm_psk_exchange_request1, &response_size, response);
     713            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     714            1 :     assert_int_equal(
     715              :         libspdm_secured_message_get_session_state(
     716              :             spdm_context->session_info[0].secured_message_context),
     717              :         LIBSPDM_SESSION_STATE_HANDSHAKING);
     718            1 :     spdm_response = (void *)response;
     719            1 :     assert_int_equal(spdm_response->header.request_response_code,
     720              :                      SPDM_PSK_EXCHANGE_RSP);
     721              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     722              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
     723              :     assert_int_equal(spdm_context->transcript.message_b.buffer_size, 0);
     724              :     assert_int_equal(spdm_context->transcript.message_c.buffer_size, 0);
     725              :     assert_int_equal(spdm_context->transcript.message_mut_b.buffer_size, 0);
     726              :     assert_int_equal(spdm_context->transcript.message_mut_c.buffer_size, 0);
     727              : #endif
     728              : 
     729            1 :     free(data1);
     730            1 : }
     731              : 
     732            1 : void libspdm_test_responder_psk_exchange_case8(void **state)
     733              : {
     734              :     libspdm_return_t status;
     735              :     libspdm_test_context_t *spdm_test_context;
     736              :     libspdm_context_t *spdm_context;
     737              :     size_t current_request_size;
     738              :     size_t response_size;
     739              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     740              :     spdm_psk_exchange_response_t *spdm_response;
     741              :     void *data1;
     742              :     size_t data_size1;
     743              :     uint8_t *ptr;
     744              :     size_t opaque_psk_exchange_req_size;
     745              : 
     746            1 :     spdm_test_context = *state;
     747            1 :     spdm_context = spdm_test_context->spdm_context;
     748              : 
     749            1 :     if(spdm_context->session_info[0].session_id != INVALID_SESSION_ID) {
     750            1 :         libspdm_free_session_id(spdm_context,0xFFFFFFFF);
     751              :     }
     752              : 
     753            1 :     spdm_test_context->case_id = 0x8;
     754            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     755              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     756            1 :     spdm_context->connection_info.connection_state =
     757              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     758            1 :     spdm_context->connection_info.capability.flags |=
     759              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
     760            1 :     spdm_context->local_context.capability.flags |=
     761              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
     762            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     763            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     764            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     765              :         m_libspdm_use_measurement_hash_algo;
     766            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
     767            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
     768            1 :     spdm_context->connection_info.algorithm.key_schedule = m_libspdm_use_key_schedule_algo;
     769            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     770              :                                                     m_libspdm_use_asym_algo, &data1,
     771              :                                                     &data_size1, NULL, NULL);
     772            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     773            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size1;
     774            1 :     spdm_context->connection_info.local_used_cert_chain_buffer = data1;
     775            1 :     spdm_context->connection_info.local_used_cert_chain_buffer_size = data_size1;
     776              : 
     777            1 :     libspdm_reset_message_a(spdm_context);
     778              : 
     779            1 :     m_libspdm_psk_exchange_request1.psk_hint_length =
     780              :         (uint16_t)sizeof(LIBSPDM_TEST_PSK_HINT_STRING);
     781            1 :     m_libspdm_psk_exchange_request1.context_length = LIBSPDM_PSK_CONTEXT_LENGTH;
     782            1 :     opaque_psk_exchange_req_size =
     783            1 :         libspdm_get_opaque_data_supported_version_data_size(spdm_context);
     784            1 :     m_libspdm_psk_exchange_request1.opaque_length =
     785            1 :         (uint16_t)opaque_psk_exchange_req_size;
     786            1 :     m_libspdm_psk_exchange_request1.req_session_id = 0xFFFF;
     787            1 :     ptr = m_libspdm_psk_exchange_request1.psk_hint;
     788            1 :     libspdm_copy_mem(ptr, sizeof(m_libspdm_psk_exchange_request1.psk_hint),
     789              :                      LIBSPDM_TEST_PSK_HINT_STRING,
     790              :                      sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
     791            1 :     ptr += m_libspdm_psk_exchange_request1.psk_hint_length;
     792            1 :     libspdm_get_random_number(LIBSPDM_PSK_CONTEXT_LENGTH, ptr);
     793            1 :     ptr += m_libspdm_psk_exchange_request1.context_length;
     794            1 :     libspdm_build_opaque_data_supported_version_data(
     795              :         spdm_context, &opaque_psk_exchange_req_size, ptr);
     796            1 :     ptr += opaque_psk_exchange_req_size;
     797              : 
     798            1 :     current_request_size = sizeof(spdm_psk_exchange_request_t) +
     799            1 :                            m_libspdm_psk_exchange_request1.psk_hint_length +
     800            1 :                            m_libspdm_psk_exchange_request1.context_length +
     801              :                            opaque_psk_exchange_req_size;
     802            1 :     response_size = sizeof(response);
     803            1 :     status = libspdm_get_response_psk_exchange(
     804              :         spdm_context, current_request_size, &m_libspdm_psk_exchange_request1,
     805              :         &response_size, response);
     806            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     807            1 :     assert_int_equal(libspdm_secured_message_get_session_state(
     808              :                          spdm_context->session_info[0].secured_message_context),
     809              :                      LIBSPDM_SESSION_STATE_HANDSHAKING);
     810            1 :     spdm_response = (void *)response;
     811            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_PSK_EXCHANGE_RSP);
     812            1 :     assert_int_equal(spdm_response->rsp_session_id, 0xFFFF);
     813              : 
     814              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     815              :     assert_int_equal(spdm_context->session_info[0].session_transcript.message_k.buffer_size,
     816              :                      current_request_size + response_size);
     817              :     assert_memory_equal(spdm_context->session_info[0].session_transcript.message_k.buffer,
     818              :                         &m_libspdm_psk_exchange_request1, current_request_size);
     819              :     assert_memory_equal(spdm_context->session_info[0].session_transcript.message_k.buffer +
     820              :                         current_request_size, response, response_size);
     821              : #endif
     822            1 :     free(data1);
     823            1 : }
     824              : 
     825            1 : void libspdm_test_responder_psk_exchange_case9(void **state)
     826              : {
     827              :     libspdm_return_t status;
     828              :     libspdm_test_context_t *spdm_test_context;
     829              :     libspdm_context_t *spdm_context;
     830              :     size_t response_size;
     831              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     832              :     spdm_psk_exchange_response_t *spdm_response;
     833              :     void *data1;
     834              :     size_t data_size1;
     835              :     uint8_t *ptr;
     836              :     size_t opaque_psk_exchange_req_size;
     837              : 
     838            1 :     spdm_test_context = *state;
     839            1 :     spdm_context = spdm_test_context->spdm_context;
     840            1 :     spdm_test_context->case_id = 0x9;
     841            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     842              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     843            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     844            1 :     spdm_context->connection_info.capability.flags |=
     845              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
     846            1 :     spdm_context->local_context.capability.flags |=
     847              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
     848            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     849            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     850            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     851              :         m_libspdm_use_measurement_hash_algo;
     852            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
     853            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
     854            1 :     spdm_context->connection_info.algorithm.key_schedule = m_libspdm_use_key_schedule_algo;
     855            1 :     spdm_context->connection_info.algorithm.other_params_support =
     856              :         SPDM_ALGORITHMS_OPAQUE_DATA_FORMAT_1;
     857            1 :     libspdm_session_info_init(spdm_context,
     858            1 :                               spdm_context->session_info,
     859              :                               INVALID_SESSION_ID, false);
     860            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     861              :                                                     m_libspdm_use_asym_algo, &data1,
     862              :                                                     &data_size1, NULL, NULL);
     863            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     864            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size1;
     865            1 :     spdm_context->connection_info.local_used_cert_chain_buffer = data1;
     866            1 :     spdm_context->connection_info.local_used_cert_chain_buffer_size = data_size1;
     867              : 
     868            1 :     libspdm_reset_message_a(spdm_context);
     869              : 
     870            1 :     m_libspdm_psk_exchange_request3.psk_hint_length =
     871              :         (uint16_t)sizeof(LIBSPDM_TEST_PSK_HINT_STRING);
     872            1 :     m_libspdm_psk_exchange_request3.context_length = LIBSPDM_PSK_CONTEXT_LENGTH;
     873            1 :     opaque_psk_exchange_req_size =
     874            1 :         libspdm_get_opaque_data_supported_version_data_size(spdm_context);
     875            1 :     m_libspdm_psk_exchange_request3.opaque_length = (uint16_t)opaque_psk_exchange_req_size;
     876            1 :     m_libspdm_psk_exchange_request3.req_session_id = 0xFFFF;
     877            1 :     ptr = m_libspdm_psk_exchange_request3.psk_hint;
     878            1 :     libspdm_copy_mem(ptr, sizeof(m_libspdm_psk_exchange_request3.psk_hint),
     879              :                      LIBSPDM_TEST_PSK_HINT_STRING,
     880              :                      sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
     881            1 :     ptr += m_libspdm_psk_exchange_request3.psk_hint_length;
     882            1 :     libspdm_get_random_number(LIBSPDM_PSK_CONTEXT_LENGTH, ptr);
     883            1 :     ptr += m_libspdm_psk_exchange_request3.context_length;
     884            1 :     libspdm_build_opaque_data_supported_version_data(
     885              :         spdm_context, &opaque_psk_exchange_req_size, ptr);
     886              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     887              :     spdm_context->transcript.message_m.buffer_size =
     888              :         spdm_context->transcript.message_m.max_buffer_size;
     889              : #endif
     890            1 :     ptr += opaque_psk_exchange_req_size;
     891            1 :     response_size = sizeof(response);
     892            1 :     status = libspdm_get_response_psk_exchange(
     893              :         spdm_context, m_libspdm_psk_exchange_request3_size,
     894              :         &m_libspdm_psk_exchange_request3, &response_size, response);
     895            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     896            1 :     assert_int_equal(
     897              :         libspdm_secured_message_get_session_state(
     898              :             spdm_context->session_info[0].secured_message_context),
     899              :         LIBSPDM_SESSION_STATE_HANDSHAKING);
     900            1 :     assert_int_equal(spdm_context->session_info[0].session_policy, 0);
     901            1 :     spdm_response = (void *)response;
     902            1 :     assert_int_equal(spdm_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
     903            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_PSK_EXCHANGE_RSP);
     904            1 :     assert_int_equal(spdm_response->rsp_session_id, 0xFFFF);
     905              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     906              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
     907              : #endif
     908            1 :     free(data1);
     909            1 : }
     910              : 
     911            1 : void libspdm_test_responder_psk_exchange_case10(void **state)
     912              : {
     913              :     libspdm_return_t status;
     914              :     libspdm_test_context_t *spdm_test_context;
     915              :     libspdm_context_t *spdm_context;
     916              :     size_t response_size;
     917              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     918              :     #if LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP
     919              :     uint8_t measurement_hash[LIBSPDM_MAX_HASH_SIZE];
     920              :     #endif /* LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP */
     921              :     uint32_t measurement_summary_hash_size;
     922              :     spdm_psk_exchange_response_t *spdm_response;
     923              :     void *data1;
     924              :     size_t data_size1;
     925              :     uint8_t *ptr;
     926              :     size_t opaque_psk_exchange_req_size;
     927              :     bool result;
     928              : 
     929            1 :     spdm_test_context = *state;
     930            1 :     spdm_context = spdm_test_context->spdm_context;
     931            1 :     spdm_test_context->case_id = 0xA;
     932              : 
     933              :     /* Clear previous sessions */
     934            1 :     if(spdm_context->session_info[0].session_id != INVALID_SESSION_ID) {
     935            1 :         libspdm_free_session_id(spdm_context,0xFFFFFFFF);
     936              :     }
     937              : 
     938            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     939              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     940            1 :     spdm_context->connection_info.connection_state =
     941              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     942            1 :     spdm_context->connection_info.capability.flags |=
     943              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
     944            1 :     spdm_context->local_context.capability.flags |=
     945              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
     946            1 :     spdm_context->local_context.capability.flags |=
     947              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP;
     948            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     949              :         m_libspdm_use_hash_algo;
     950            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     951              :         m_libspdm_use_measurement_spec;
     952            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     953              :         m_libspdm_use_measurement_hash_algo;
     954            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
     955              :         m_libspdm_use_dhe_algo;
     956            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
     957              :         m_libspdm_use_aead_algo;
     958            1 :     spdm_context->connection_info.algorithm.key_schedule =
     959              :         m_libspdm_use_key_schedule_algo;
     960            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     961              :                                                     m_libspdm_use_asym_algo, &data1,
     962              :                                                     &data_size1, NULL, NULL);
     963            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     964            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
     965              :         data_size1;
     966            1 :     spdm_context->connection_info.local_used_cert_chain_buffer = data1;
     967            1 :     spdm_context->connection_info.local_used_cert_chain_buffer_size =
     968              :         data_size1;
     969              : 
     970            1 :     libspdm_reset_message_a(spdm_context);
     971              : 
     972            1 :     m_libspdm_psk_exchange_request4.psk_hint_length =
     973              :         (uint16_t)sizeof(LIBSPDM_TEST_PSK_HINT_STRING);
     974            1 :     m_libspdm_psk_exchange_request4.context_length = LIBSPDM_PSK_CONTEXT_LENGTH;
     975            1 :     opaque_psk_exchange_req_size =
     976            1 :         libspdm_get_opaque_data_supported_version_data_size(spdm_context);
     977            1 :     m_libspdm_psk_exchange_request4.opaque_length =
     978            1 :         (uint16_t)opaque_psk_exchange_req_size;
     979            1 :     m_libspdm_psk_exchange_request4.req_session_id = 0xFFFF;
     980            1 :     ptr = m_libspdm_psk_exchange_request4.psk_hint;
     981            1 :     libspdm_copy_mem(ptr, sizeof(m_libspdm_psk_exchange_request4.psk_hint),
     982              :                      LIBSPDM_TEST_PSK_HINT_STRING,
     983              :                      sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
     984            1 :     ptr += m_libspdm_psk_exchange_request4.psk_hint_length;
     985            1 :     libspdm_get_random_number(LIBSPDM_PSK_CONTEXT_LENGTH, ptr);
     986            1 :     ptr += m_libspdm_psk_exchange_request4.context_length;
     987            1 :     libspdm_build_opaque_data_supported_version_data(
     988              :         spdm_context, &opaque_psk_exchange_req_size, ptr);
     989              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     990              :     spdm_context->transcript.message_m.buffer_size =
     991              :         spdm_context->transcript.message_m.max_buffer_size;
     992              : #endif
     993            1 :     ptr += opaque_psk_exchange_req_size;
     994            1 :     response_size = sizeof(response);
     995            1 :     status = libspdm_get_response_psk_exchange(
     996              :         spdm_context, m_libspdm_psk_exchange_request4_size,
     997              :         &m_libspdm_psk_exchange_request4, &response_size, response);
     998            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     999            1 :     assert_int_equal(
    1000              :         libspdm_secured_message_get_session_state(
    1001              :             spdm_context->session_info[0].secured_message_context),
    1002              :         LIBSPDM_SESSION_STATE_HANDSHAKING);
    1003            1 :     spdm_response = (void *)response;
    1004            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1005              :                      SPDM_PSK_EXCHANGE_RSP);
    1006            1 :     assert_int_equal(spdm_response->rsp_session_id, 0xFFFF);
    1007              : 
    1008            1 :     measurement_summary_hash_size = libspdm_get_measurement_summary_hash_size(
    1009            1 :         spdm_context, false, m_libspdm_psk_exchange_request4.header.param1);
    1010              : 
    1011              : #if LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP
    1012            1 :     result = libspdm_generate_measurement_summary_hash(
    1013              : #if LIBSPDM_HAL_PASS_SPDM_CONTEXT
    1014              :         spdm_context,
    1015              : #endif
    1016            1 :         spdm_context->connection_info.version,
    1017              :         spdm_context->connection_info.algorithm.base_hash_algo,
    1018            1 :         spdm_context->connection_info.algorithm.measurement_spec,
    1019              :         spdm_context->connection_info.algorithm.measurement_hash_algo,
    1020            1 :         m_libspdm_psk_exchange_request4.header.param1,
    1021              :         measurement_hash,
    1022              :         measurement_summary_hash_size);
    1023              : 
    1024            1 :     assert_true(result);
    1025              : 
    1026            1 :     assert_memory_equal((uint8_t *)response + sizeof(spdm_psk_exchange_response_t),
    1027              :                         measurement_hash, measurement_summary_hash_size);
    1028              : #endif /* LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP */
    1029              : 
    1030              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1031              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size,
    1032              :                      0);
    1033              : #endif
    1034            1 :     free(data1);
    1035            1 : }
    1036              : 
    1037            1 : void libspdm_test_responder_psk_exchange_case11(void **state)
    1038              : {
    1039              :     libspdm_return_t status;
    1040              :     libspdm_test_context_t *spdm_test_context;
    1041              :     libspdm_context_t *spdm_context;
    1042              :     size_t response_size;
    1043              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1044              :     #if LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP
    1045              :     uint8_t measurement_hash[LIBSPDM_MAX_HASH_SIZE];
    1046              :     #endif /* LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP */
    1047              :     uint32_t measurement_summary_hash_size;
    1048              :     spdm_psk_exchange_response_t *spdm_response;
    1049              :     void *data1;
    1050              :     size_t data_size1;
    1051              :     uint8_t *ptr;
    1052              :     size_t opaque_psk_exchange_req_size;
    1053              :     bool result;
    1054              : 
    1055            1 :     spdm_test_context = *state;
    1056            1 :     spdm_context = spdm_test_context->spdm_context;
    1057            1 :     spdm_test_context->case_id = 0xB;
    1058              : 
    1059              :     /* Clear previous sessions */
    1060            1 :     if(spdm_context->session_info[0].session_id != INVALID_SESSION_ID) {
    1061            1 :         libspdm_free_session_id(spdm_context,0xFFFFFFFF);
    1062              :     }
    1063              : 
    1064            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1065              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1066            1 :     spdm_context->connection_info.connection_state =
    1067              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1068            1 :     spdm_context->connection_info.capability.flags |=
    1069              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    1070            1 :     spdm_context->local_context.capability.flags |=
    1071              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    1072            1 :     spdm_context->local_context.capability.flags |=
    1073              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP;
    1074            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1075              :         m_libspdm_use_hash_algo;
    1076            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    1077              :         m_libspdm_use_measurement_spec;
    1078            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    1079              :         m_libspdm_use_measurement_hash_algo;
    1080            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
    1081              :         m_libspdm_use_dhe_algo;
    1082            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
    1083              :         m_libspdm_use_aead_algo;
    1084            1 :     spdm_context->connection_info.algorithm.key_schedule =
    1085              :         m_libspdm_use_key_schedule_algo;
    1086            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1087              :                                                     m_libspdm_use_asym_algo, &data1,
    1088              :                                                     &data_size1, NULL, NULL);
    1089            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
    1090            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
    1091              :         data_size1;
    1092            1 :     spdm_context->connection_info.local_used_cert_chain_buffer = data1;
    1093            1 :     spdm_context->connection_info.local_used_cert_chain_buffer_size =
    1094              :         data_size1;
    1095              : 
    1096            1 :     libspdm_reset_message_a(spdm_context);
    1097              : 
    1098            1 :     m_libspdm_psk_exchange_request5.psk_hint_length =
    1099              :         (uint16_t)sizeof(LIBSPDM_TEST_PSK_HINT_STRING);
    1100            1 :     m_libspdm_psk_exchange_request5.context_length = LIBSPDM_PSK_CONTEXT_LENGTH;
    1101            1 :     opaque_psk_exchange_req_size =
    1102            1 :         libspdm_get_opaque_data_supported_version_data_size(spdm_context);
    1103            1 :     m_libspdm_psk_exchange_request5.opaque_length =
    1104            1 :         (uint16_t)opaque_psk_exchange_req_size;
    1105            1 :     m_libspdm_psk_exchange_request5.req_session_id = 0xFFFF;
    1106            1 :     ptr = m_libspdm_psk_exchange_request5.psk_hint;
    1107            1 :     libspdm_copy_mem(ptr, sizeof(m_libspdm_psk_exchange_request5.psk_hint),
    1108              :                      LIBSPDM_TEST_PSK_HINT_STRING,
    1109              :                      sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
    1110            1 :     ptr += m_libspdm_psk_exchange_request5.psk_hint_length;
    1111            1 :     libspdm_get_random_number(LIBSPDM_PSK_CONTEXT_LENGTH, ptr);
    1112            1 :     ptr += m_libspdm_psk_exchange_request5.context_length;
    1113            1 :     libspdm_build_opaque_data_supported_version_data(
    1114              :         spdm_context, &opaque_psk_exchange_req_size, ptr);
    1115              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1116              :     spdm_context->transcript.message_m.buffer_size =
    1117              :         spdm_context->transcript.message_m.max_buffer_size;
    1118              : #endif
    1119            1 :     ptr += opaque_psk_exchange_req_size;
    1120            1 :     response_size = sizeof(response);
    1121            1 :     status = libspdm_get_response_psk_exchange(
    1122              :         spdm_context, m_libspdm_psk_exchange_request5_size,
    1123              :         &m_libspdm_psk_exchange_request5, &response_size, response);
    1124            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1125            1 :     assert_int_equal(
    1126              :         libspdm_secured_message_get_session_state(
    1127              :             spdm_context->session_info[0].secured_message_context),
    1128              :         LIBSPDM_SESSION_STATE_HANDSHAKING);
    1129            1 :     spdm_response = (void *)response;
    1130            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1131              :                      SPDM_PSK_EXCHANGE_RSP);
    1132            1 :     assert_int_equal(spdm_response->rsp_session_id, 0xFFFF);
    1133              : 
    1134            1 :     measurement_summary_hash_size = libspdm_get_measurement_summary_hash_size(
    1135            1 :         spdm_context, false, m_libspdm_psk_exchange_request5.header.param1);
    1136              : 
    1137              : #if LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP
    1138            1 :     result = libspdm_generate_measurement_summary_hash(
    1139              : #if LIBSPDM_HAL_PASS_SPDM_CONTEXT
    1140              :         spdm_context,
    1141              : #endif
    1142            1 :         spdm_context->connection_info.version,
    1143              :         spdm_context->connection_info.algorithm.base_hash_algo,
    1144            1 :         spdm_context->connection_info.algorithm.measurement_spec,
    1145              :         spdm_context->connection_info.algorithm.measurement_hash_algo,
    1146            1 :         m_libspdm_psk_exchange_request5.header.param1,
    1147              :         measurement_hash,
    1148              :         measurement_summary_hash_size);
    1149              : 
    1150            1 :     assert_true(result);
    1151              : 
    1152            1 :     assert_memory_equal((uint8_t *)response + sizeof(spdm_psk_exchange_response_t),
    1153              :                         measurement_hash, measurement_summary_hash_size);
    1154              : #endif /* LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP */
    1155              : 
    1156              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1157              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size,
    1158              :                      0);
    1159              : #endif
    1160            1 :     free(data1);
    1161            1 : }
    1162              : 
    1163            1 : void libspdm_test_responder_psk_exchange_case12(void **state)
    1164              : {
    1165              :     libspdm_return_t status;
    1166              :     libspdm_test_context_t *spdm_test_context;
    1167              :     libspdm_context_t *spdm_context;
    1168              :     size_t response_size;
    1169              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1170              :     spdm_psk_exchange_response_t *spdm_response;
    1171              :     void *data1;
    1172              :     size_t data_size1;
    1173              :     uint8_t *ptr;
    1174              :     size_t opaque_psk_exchange_req_size;
    1175              : 
    1176            1 :     spdm_test_context = *state;
    1177            1 :     spdm_context = spdm_test_context->spdm_context;
    1178            1 :     spdm_test_context->case_id = 0xC;
    1179              : 
    1180              :     /* Clear previous sessions */
    1181            1 :     if(spdm_context->session_info[0].session_id != INVALID_SESSION_ID) {
    1182            1 :         libspdm_free_session_id(spdm_context,0xFFFFFFFF);
    1183              :     }
    1184              : 
    1185            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1186              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1187            1 :     spdm_context->connection_info.connection_state =
    1188              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1189            1 :     spdm_context->connection_info.capability.flags |=
    1190              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    1191            1 :     spdm_context->local_context.capability.flags |=
    1192              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    1193            1 :     spdm_context->local_context.capability.flags |=
    1194              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP;
    1195            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1196              :         m_libspdm_use_hash_algo;
    1197            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    1198              :         m_libspdm_use_measurement_spec;
    1199            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    1200              :         m_libspdm_use_measurement_hash_algo;
    1201            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
    1202              :         m_libspdm_use_dhe_algo;
    1203            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
    1204              :         m_libspdm_use_aead_algo;
    1205            1 :     spdm_context->connection_info.algorithm.key_schedule =
    1206              :         m_libspdm_use_key_schedule_algo;
    1207            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1208              :                                                     m_libspdm_use_asym_algo, &data1,
    1209              :                                                     &data_size1, NULL, NULL);
    1210            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
    1211            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
    1212              :         data_size1;
    1213            1 :     spdm_context->connection_info.local_used_cert_chain_buffer = data1;
    1214            1 :     spdm_context->connection_info.local_used_cert_chain_buffer_size =
    1215              :         data_size1;
    1216              : 
    1217            1 :     libspdm_reset_message_a(spdm_context);
    1218              : 
    1219            1 :     m_libspdm_psk_exchange_request6.psk_hint_length =
    1220              :         (uint16_t)sizeof(LIBSPDM_TEST_PSK_HINT_STRING);
    1221            1 :     m_libspdm_psk_exchange_request6.context_length = LIBSPDM_PSK_CONTEXT_LENGTH;
    1222            1 :     opaque_psk_exchange_req_size =
    1223            1 :         libspdm_get_opaque_data_supported_version_data_size(spdm_context);
    1224            1 :     m_libspdm_psk_exchange_request6.opaque_length =
    1225            1 :         (uint16_t)opaque_psk_exchange_req_size;
    1226            1 :     m_libspdm_psk_exchange_request6.req_session_id = 0xFFFF;
    1227            1 :     ptr = m_libspdm_psk_exchange_request6.psk_hint;
    1228            1 :     libspdm_copy_mem(ptr, sizeof(m_libspdm_psk_exchange_request6.psk_hint),
    1229              :                      LIBSPDM_TEST_PSK_HINT_STRING,
    1230              :                      sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
    1231            1 :     ptr += m_libspdm_psk_exchange_request6.psk_hint_length;
    1232            1 :     libspdm_get_random_number(LIBSPDM_PSK_CONTEXT_LENGTH, ptr);
    1233            1 :     ptr += m_libspdm_psk_exchange_request6.context_length;
    1234            1 :     libspdm_build_opaque_data_supported_version_data(
    1235              :         spdm_context, &opaque_psk_exchange_req_size, ptr);
    1236              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1237              :     spdm_context->transcript.message_m.buffer_size =
    1238              :         spdm_context->transcript.message_m.max_buffer_size;
    1239              : #endif
    1240            1 :     ptr += opaque_psk_exchange_req_size;
    1241            1 :     response_size = sizeof(response);
    1242            1 :     status = libspdm_get_response_psk_exchange(
    1243              :         spdm_context, m_libspdm_psk_exchange_request6_size,
    1244              :         &m_libspdm_psk_exchange_request6, &response_size, response);
    1245            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1246              : 
    1247            1 :     spdm_response = (void *)response;
    1248            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1249              :                      SPDM_ERROR);
    1250            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1251              : 
    1252              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1253              :     /* Error before libspdm_reset_message_buffer_via_request_code, so will not libspdm_reset_message_m */
    1254              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size,
    1255              :                      spdm_context->transcript.message_m.max_buffer_size);
    1256              : #endif
    1257            1 :     free(data1);
    1258            1 : }
    1259              : 
    1260            1 : void libspdm_test_responder_psk_exchange_case13(void **state)
    1261              : {
    1262              :     libspdm_return_t status;
    1263              :     libspdm_test_context_t *spdm_test_context;
    1264              :     libspdm_context_t *spdm_context;
    1265              :     size_t response_size;
    1266              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1267              :     spdm_psk_exchange_response_t *spdm_response;
    1268              :     void *data1;
    1269              :     size_t data_size1;
    1270              :     uint8_t *ptr;
    1271              :     size_t opaque_psk_exchange_req_size;
    1272              : 
    1273            1 :     spdm_test_context = *state;
    1274            1 :     spdm_context = spdm_test_context->spdm_context;
    1275            1 :     spdm_test_context->case_id = 0xD;
    1276              : 
    1277              :     /* Clear previous sessions */
    1278            1 :     if(spdm_context->session_info[0].session_id != INVALID_SESSION_ID) {
    1279            0 :         libspdm_free_session_id(spdm_context,0xFFFFFFFF);
    1280              :     }
    1281              : 
    1282            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1283              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1284            1 :     spdm_context->connection_info.connection_state =
    1285              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1286              : 
    1287            1 :     spdm_context->local_context.capability.flags &=
    1288              :         ~SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP;
    1289              : 
    1290            1 :     spdm_context->connection_info.capability.flags |=
    1291              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    1292            1 :     spdm_context->local_context.capability.flags |=
    1293              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    1294              : 
    1295            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1296              :         m_libspdm_use_hash_algo;
    1297            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    1298              :         m_libspdm_use_measurement_spec;
    1299            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    1300              :         m_libspdm_use_measurement_hash_algo;
    1301            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
    1302              :         m_libspdm_use_dhe_algo;
    1303            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
    1304              :         m_libspdm_use_aead_algo;
    1305            1 :     spdm_context->connection_info.algorithm.key_schedule =
    1306              :         m_libspdm_use_key_schedule_algo;
    1307            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1308              :                                                     m_libspdm_use_asym_algo, &data1,
    1309              :                                                     &data_size1, NULL, NULL);
    1310            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
    1311            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
    1312              :         data_size1;
    1313            1 :     spdm_context->connection_info.local_used_cert_chain_buffer = data1;
    1314            1 :     spdm_context->connection_info.local_used_cert_chain_buffer_size =
    1315              :         data_size1;
    1316              : 
    1317            1 :     libspdm_reset_message_a(spdm_context);
    1318              : 
    1319            1 :     m_libspdm_psk_exchange_request4.psk_hint_length =
    1320              :         (uint16_t)sizeof(LIBSPDM_TEST_PSK_HINT_STRING);
    1321            1 :     m_libspdm_psk_exchange_request4.context_length = LIBSPDM_PSK_CONTEXT_LENGTH;
    1322            1 :     opaque_psk_exchange_req_size =
    1323            1 :         libspdm_get_opaque_data_supported_version_data_size(spdm_context);
    1324            1 :     m_libspdm_psk_exchange_request4.opaque_length =
    1325            1 :         (uint16_t)opaque_psk_exchange_req_size;
    1326            1 :     m_libspdm_psk_exchange_request4.req_session_id = 0xFFFF;
    1327            1 :     ptr = m_libspdm_psk_exchange_request4.psk_hint;
    1328            1 :     libspdm_copy_mem(ptr, sizeof(m_libspdm_psk_exchange_request4.psk_hint),
    1329              :                      LIBSPDM_TEST_PSK_HINT_STRING,
    1330              :                      sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
    1331            1 :     ptr += m_libspdm_psk_exchange_request4.psk_hint_length;
    1332            1 :     libspdm_get_random_number(LIBSPDM_PSK_CONTEXT_LENGTH, ptr);
    1333            1 :     ptr += m_libspdm_psk_exchange_request4.context_length;
    1334            1 :     libspdm_build_opaque_data_supported_version_data(
    1335              :         spdm_context, &opaque_psk_exchange_req_size, ptr);
    1336              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1337              :     spdm_context->transcript.message_m.buffer_size =
    1338              :         spdm_context->transcript.message_m.max_buffer_size;
    1339              : #endif
    1340            1 :     ptr += opaque_psk_exchange_req_size;
    1341            1 :     response_size = sizeof(response);
    1342            1 :     status = libspdm_get_response_psk_exchange(
    1343              :         spdm_context, m_libspdm_psk_exchange_request4_size,
    1344              :         &m_libspdm_psk_exchange_request4, &response_size, response);
    1345            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1346              : 
    1347            1 :     spdm_response = (void *)response;
    1348            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1349              :                      SPDM_ERROR);
    1350            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1351              : 
    1352            1 :     free(data1);
    1353            1 : }
    1354              : 
    1355            1 : void libspdm_test_responder_psk_exchange_case14(void **state)
    1356              : {
    1357              :     libspdm_return_t status;
    1358              :     libspdm_test_context_t *spdm_test_context;
    1359              :     libspdm_context_t *spdm_context;
    1360              :     size_t response_size;
    1361              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1362              :     spdm_psk_exchange_response_t *spdm_response;
    1363              :     void *data1;
    1364              :     size_t data_size1;
    1365              :     uint8_t *ptr;
    1366              :     size_t opaque_psk_exchange_req_size;
    1367              : 
    1368            1 :     spdm_test_context = *state;
    1369            1 :     spdm_context = spdm_test_context->spdm_context;
    1370            1 :     spdm_test_context->case_id = 0xE;
    1371              : 
    1372              :     /* Clear previous sessions */
    1373            1 :     if(spdm_context->session_info[0].session_id != INVALID_SESSION_ID) {
    1374            0 :         libspdm_free_session_id(spdm_context,0xFFFFFFFF);
    1375              :     }
    1376              : 
    1377            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1378              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1379            1 :     spdm_context->connection_info.connection_state =
    1380              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1381            1 :     spdm_context->connection_info.capability.flags |=
    1382              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    1383            1 :     spdm_context->local_context.capability.flags |=
    1384              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    1385            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1386              :         m_libspdm_use_hash_algo;
    1387            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    1388              :         m_libspdm_use_measurement_spec;
    1389            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    1390              :         m_libspdm_use_measurement_hash_algo;
    1391            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
    1392              :         m_libspdm_use_dhe_algo;
    1393            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
    1394              :         m_libspdm_use_aead_algo;
    1395            1 :     spdm_context->connection_info.algorithm.key_schedule =
    1396              :         m_libspdm_use_key_schedule_algo;
    1397            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1398              :                                                     m_libspdm_use_asym_algo, &data1,
    1399              :                                                     &data_size1, NULL, NULL);
    1400            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
    1401            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
    1402              :         data_size1;
    1403            1 :     spdm_context->connection_info.local_used_cert_chain_buffer = data1;
    1404            1 :     spdm_context->connection_info.local_used_cert_chain_buffer_size =
    1405              :         data_size1;
    1406              : 
    1407            1 :     libspdm_reset_message_a(spdm_context);
    1408              : 
    1409            1 :     m_libspdm_psk_exchange_request7.psk_hint_length = 0;
    1410            1 :     m_libspdm_psk_exchange_request7.context_length = LIBSPDM_PSK_CONTEXT_LENGTH;
    1411            1 :     opaque_psk_exchange_req_size =
    1412            1 :         libspdm_get_opaque_data_supported_version_data_size(spdm_context);
    1413            1 :     m_libspdm_psk_exchange_request7.opaque_length =
    1414            1 :         (uint16_t)opaque_psk_exchange_req_size;
    1415            1 :     m_libspdm_psk_exchange_request7.req_session_id = 0xFFFF;
    1416            1 :     ptr = m_libspdm_psk_exchange_request7.context;
    1417            1 :     libspdm_get_random_number(LIBSPDM_PSK_CONTEXT_LENGTH, ptr);
    1418            1 :     ptr += m_libspdm_psk_exchange_request7.context_length;
    1419            1 :     libspdm_build_opaque_data_supported_version_data(
    1420              :         spdm_context, &opaque_psk_exchange_req_size, ptr);
    1421              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1422              :     spdm_context->transcript.message_m.buffer_size =
    1423              :         spdm_context->transcript.message_m.max_buffer_size;
    1424              : #endif
    1425            1 :     ptr += opaque_psk_exchange_req_size;
    1426            1 :     response_size = sizeof(response);
    1427            1 :     status = libspdm_get_response_psk_exchange(
    1428              :         spdm_context, m_libspdm_psk_exchange_request7_size,
    1429              :         &m_libspdm_psk_exchange_request7, &response_size, response);
    1430            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1431            1 :     assert_int_equal(
    1432              :         libspdm_secured_message_get_session_state(
    1433              :             spdm_context->session_info[0].secured_message_context),
    1434              :         LIBSPDM_SESSION_STATE_HANDSHAKING);
    1435            1 :     spdm_response = (void *)response;
    1436            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1437              :                      SPDM_PSK_EXCHANGE_RSP);
    1438            1 :     assert_int_equal(spdm_response->rsp_session_id, 0xFFFF);
    1439              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1440              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size,
    1441              :                      0);
    1442              : #endif
    1443            1 :     free(data1);
    1444            1 : }
    1445              : 
    1446            1 : void libspdm_test_responder_psk_exchange_case15(void **state)
    1447              : {
    1448              :     libspdm_return_t status;
    1449              :     libspdm_test_context_t *spdm_test_context;
    1450              :     libspdm_context_t *spdm_context;
    1451              :     size_t response_size;
    1452              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1453              :     spdm_psk_exchange_response_t *spdm_response;
    1454              :     void *data1;
    1455              :     size_t data_size1;
    1456              :     uint8_t *ptr;
    1457              :     size_t opaque_psk_exchange_req_size;
    1458              : 
    1459            1 :     spdm_test_context = *state;
    1460            1 :     spdm_context = spdm_test_context->spdm_context;
    1461            1 :     spdm_test_context->case_id = 0xF;
    1462              : 
    1463              :     /* Clear previous sessions */
    1464            1 :     if(spdm_context->session_info[0].session_id != INVALID_SESSION_ID) {
    1465            1 :         libspdm_free_session_id(spdm_context,0xFFFFFFFF);
    1466              :     }
    1467              : 
    1468            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1469              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1470            1 :     spdm_context->connection_info.connection_state =
    1471              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1472            1 :     spdm_context->connection_info.capability.flags |=
    1473              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    1474            1 :     spdm_context->local_context.capability.flags |=
    1475              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    1476            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1477              :         m_libspdm_use_hash_algo;
    1478            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    1479              :         m_libspdm_use_measurement_spec;
    1480            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    1481              :         m_libspdm_use_measurement_hash_algo;
    1482            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
    1483              :         m_libspdm_use_dhe_algo;
    1484            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
    1485              :         m_libspdm_use_aead_algo;
    1486            1 :     spdm_context->connection_info.algorithm.key_schedule =
    1487              :         m_libspdm_use_key_schedule_algo;
    1488            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1489              :                                                     m_libspdm_use_asym_algo, &data1,
    1490              :                                                     &data_size1, NULL, NULL);
    1491            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
    1492            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
    1493              :         data_size1;
    1494            1 :     spdm_context->connection_info.local_used_cert_chain_buffer = data1;
    1495            1 :     spdm_context->connection_info.local_used_cert_chain_buffer_size =
    1496              :         data_size1;
    1497              : 
    1498            1 :     libspdm_reset_message_a(spdm_context);
    1499              : 
    1500            1 :     m_libspdm_psk_exchange_request8.psk_hint_length =
    1501              :         (uint16_t)sizeof(LIBSPDM_TEST_PSK_HINT_STRING);
    1502            1 :     m_libspdm_psk_exchange_request8.context_length = LIBSPDM_PSK_CONTEXT_LENGTH;
    1503            1 :     opaque_psk_exchange_req_size = 0;
    1504            1 :     m_libspdm_psk_exchange_request8.opaque_length =
    1505            1 :         (uint16_t)opaque_psk_exchange_req_size;
    1506            1 :     m_libspdm_psk_exchange_request8.req_session_id = 0xFFFF;
    1507            1 :     ptr = m_libspdm_psk_exchange_request8.psk_hint;
    1508            1 :     libspdm_copy_mem(ptr, sizeof(m_libspdm_psk_exchange_request8.psk_hint),
    1509              :                      LIBSPDM_TEST_PSK_HINT_STRING,
    1510              :                      sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
    1511            1 :     ptr += m_libspdm_psk_exchange_request8.psk_hint_length;
    1512            1 :     libspdm_get_random_number(LIBSPDM_PSK_CONTEXT_LENGTH, ptr);
    1513            1 :     ptr += m_libspdm_psk_exchange_request8.context_length;
    1514              : 
    1515              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1516              :     spdm_context->transcript.message_m.buffer_size =
    1517              :         spdm_context->transcript.message_m.max_buffer_size;
    1518              : #endif
    1519            1 :     ptr += opaque_psk_exchange_req_size;
    1520            1 :     response_size = sizeof(response);
    1521            1 :     status = libspdm_get_response_psk_exchange(
    1522              :         spdm_context, m_libspdm_psk_exchange_request8_size,
    1523              :         &m_libspdm_psk_exchange_request8, &response_size, response);
    1524            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1525            1 :     assert_int_equal(
    1526              :         libspdm_secured_message_get_session_state(
    1527              :             spdm_context->session_info[0].secured_message_context),
    1528              :         LIBSPDM_SESSION_STATE_HANDSHAKING);
    1529            1 :     spdm_response = (void *)response;
    1530            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1531              :                      SPDM_PSK_EXCHANGE_RSP);
    1532            1 :     assert_int_equal(spdm_response->rsp_session_id, 0xFFFF);
    1533              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1534              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size,
    1535              :                      0);
    1536              : #endif
    1537            1 :     free(data1);
    1538            1 : }
    1539              : 
    1540            1 : void libspdm_test_responder_psk_exchange_case16(void **state)
    1541              : {
    1542              :     libspdm_return_t status;
    1543              :     libspdm_test_context_t *spdm_test_context;
    1544              :     libspdm_context_t *spdm_context;
    1545              :     size_t response_size;
    1546              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1547              :     spdm_psk_exchange_response_t *spdm_response;
    1548              :     void *data1;
    1549              :     size_t data_size1;
    1550              :     uint8_t *ptr;
    1551              :     size_t opaque_psk_exchange_req_size;
    1552              : 
    1553            1 :     spdm_test_context = *state;
    1554            1 :     spdm_context = spdm_test_context->spdm_context;
    1555            1 :     spdm_test_context->case_id = 0x10;
    1556              : 
    1557              :     /* Clear previous sessions */
    1558            1 :     if(spdm_context->session_info[0].session_id != INVALID_SESSION_ID) {
    1559            1 :         libspdm_free_session_id(spdm_context,0xFFFFFFFF);
    1560              :     }
    1561              : 
    1562            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1563              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1564            1 :     spdm_context->connection_info.connection_state =
    1565              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1566            1 :     spdm_context->connection_info.capability.flags |=
    1567              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    1568            1 :     spdm_context->local_context.capability.flags |=
    1569              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    1570            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1571              :         m_libspdm_use_hash_algo;
    1572            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    1573              :         m_libspdm_use_measurement_spec;
    1574            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    1575              :         m_libspdm_use_measurement_hash_algo;
    1576            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
    1577              :         m_libspdm_use_dhe_algo;
    1578            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
    1579              :         m_libspdm_use_aead_algo;
    1580            1 :     spdm_context->connection_info.algorithm.key_schedule =
    1581              :         m_libspdm_use_key_schedule_algo;
    1582            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1583              :                                                     m_libspdm_use_asym_algo, &data1,
    1584              :                                                     &data_size1, NULL, NULL);
    1585            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
    1586            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
    1587              :         data_size1;
    1588            1 :     spdm_context->connection_info.local_used_cert_chain_buffer = data1;
    1589            1 :     spdm_context->connection_info.local_used_cert_chain_buffer_size =
    1590              :         data_size1;
    1591              : 
    1592            1 :     libspdm_reset_message_a(spdm_context);
    1593              : 
    1594            1 :     m_libspdm_psk_exchange_request9.psk_hint_length = 0;
    1595            1 :     m_libspdm_psk_exchange_request9.context_length = LIBSPDM_PSK_CONTEXT_LENGTH;
    1596            1 :     opaque_psk_exchange_req_size = 0;
    1597            1 :     m_libspdm_psk_exchange_request9.opaque_length =
    1598            1 :         (uint16_t)opaque_psk_exchange_req_size;
    1599            1 :     m_libspdm_psk_exchange_request9.req_session_id = 0xFFFF;
    1600            1 :     ptr = m_libspdm_psk_exchange_request9.context;
    1601            1 :     libspdm_get_random_number(LIBSPDM_PSK_CONTEXT_LENGTH, ptr);
    1602            1 :     ptr += m_libspdm_psk_exchange_request9.context_length;
    1603              : 
    1604              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1605              :     spdm_context->transcript.message_m.buffer_size =
    1606              :         spdm_context->transcript.message_m.max_buffer_size;
    1607              : #endif
    1608            1 :     ptr += opaque_psk_exchange_req_size;
    1609            1 :     response_size = sizeof(response);
    1610            1 :     status = libspdm_get_response_psk_exchange(
    1611              :         spdm_context, m_libspdm_psk_exchange_request9_size,
    1612              :         &m_libspdm_psk_exchange_request9, &response_size, response);
    1613            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1614            1 :     assert_int_equal(
    1615              :         libspdm_secured_message_get_session_state(
    1616              :             spdm_context->session_info[0].secured_message_context),
    1617              :         LIBSPDM_SESSION_STATE_HANDSHAKING);
    1618            1 :     spdm_response = (void *)response;
    1619            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1620              :                      SPDM_PSK_EXCHANGE_RSP);
    1621            1 :     assert_int_equal(spdm_response->rsp_session_id, 0xFFFF);
    1622              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1623              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size,
    1624              :                      0);
    1625              : #endif
    1626            1 :     free(data1);
    1627            1 : }
    1628              : 
    1629            1 : void libspdm_test_responder_psk_exchange_case17(void **state)
    1630              : {
    1631              :     libspdm_return_t status;
    1632              :     libspdm_test_context_t *spdm_test_context;
    1633              :     libspdm_context_t *spdm_context;
    1634              :     size_t response_size;
    1635              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1636              :     spdm_psk_exchange_response_t *spdm_response;
    1637              :     void *data1;
    1638              :     size_t data_size1;
    1639              :     uint8_t *ptr;
    1640              :     size_t opaque_psk_exchange_req_size;
    1641              : 
    1642            1 :     spdm_test_context = *state;
    1643            1 :     spdm_context = spdm_test_context->spdm_context;
    1644            1 :     spdm_test_context->case_id = 0x11;
    1645            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
    1646              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1647            1 :     spdm_context->connection_info.connection_state =
    1648              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1649            1 :     spdm_context->connection_info.capability.flags |=
    1650              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    1651            1 :     spdm_context->local_context.capability.flags |=
    1652              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    1653            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1654              :         m_libspdm_use_hash_algo;
    1655            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    1656              :         m_libspdm_use_measurement_spec;
    1657            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    1658              :         m_libspdm_use_measurement_hash_algo;
    1659            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
    1660              :         m_libspdm_use_dhe_algo;
    1661            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
    1662              :         m_libspdm_use_aead_algo;
    1663            1 :     spdm_context->connection_info.algorithm.key_schedule =
    1664              :         m_libspdm_use_key_schedule_algo;
    1665            1 :     spdm_context->connection_info.algorithm.other_params_support =
    1666              :         SPDM_ALGORITHMS_OPAQUE_DATA_FORMAT_1;
    1667            1 :     libspdm_session_info_init(spdm_context,
    1668            1 :                               spdm_context->session_info,
    1669              :                               INVALID_SESSION_ID, false);
    1670            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1671              :                                                     m_libspdm_use_asym_algo, &data1,
    1672              :                                                     &data_size1, NULL, NULL);
    1673            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
    1674            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
    1675              :         data_size1;
    1676            1 :     spdm_context->connection_info.local_used_cert_chain_buffer = data1;
    1677            1 :     spdm_context->connection_info.local_used_cert_chain_buffer_size =
    1678              :         data_size1;
    1679              : 
    1680            1 :     libspdm_reset_message_a(spdm_context);
    1681              : 
    1682            1 :     m_libspdm_psk_exchange_request3.psk_hint_length =
    1683              :         (uint16_t)sizeof(LIBSPDM_TEST_PSK_HINT_STRING);
    1684            1 :     m_libspdm_psk_exchange_request3.context_length = LIBSPDM_PSK_CONTEXT_LENGTH;
    1685            1 :     opaque_psk_exchange_req_size =
    1686            1 :         libspdm_get_opaque_data_supported_version_data_size(spdm_context);
    1687            1 :     m_libspdm_psk_exchange_request3.opaque_length =
    1688            1 :         (uint16_t)opaque_psk_exchange_req_size;
    1689            1 :     m_libspdm_psk_exchange_request3.req_session_id = 0xFFFF;
    1690            1 :     ptr = m_libspdm_psk_exchange_request3.psk_hint;
    1691            1 :     libspdm_copy_mem(ptr, sizeof(m_libspdm_psk_exchange_request3.psk_hint),
    1692              :                      LIBSPDM_TEST_PSK_HINT_STRING,
    1693              :                      sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
    1694            1 :     ptr += m_libspdm_psk_exchange_request3.psk_hint_length;
    1695            1 :     libspdm_get_random_number(LIBSPDM_PSK_CONTEXT_LENGTH, ptr);
    1696            1 :     ptr += m_libspdm_psk_exchange_request3.context_length;
    1697            1 :     libspdm_build_opaque_data_supported_version_data(
    1698              :         spdm_context, &opaque_psk_exchange_req_size, ptr);
    1699              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1700              :     spdm_context->transcript.message_m.buffer_size =
    1701              :         spdm_context->transcript.message_m.max_buffer_size;
    1702              : #endif
    1703            1 :     ptr += opaque_psk_exchange_req_size;
    1704            1 :     response_size = sizeof(response);
    1705            1 :     status = libspdm_get_response_psk_exchange(
    1706              :         spdm_context, m_libspdm_psk_exchange_request3_size,
    1707              :         &m_libspdm_psk_exchange_request3, &response_size, response);
    1708            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1709            1 :     assert_int_equal(
    1710              :         libspdm_secured_message_get_session_state(
    1711              :             spdm_context->session_info[0].secured_message_context),
    1712              :         LIBSPDM_SESSION_STATE_HANDSHAKING);
    1713            1 :     assert_int_equal(spdm_context->session_info[0].session_policy, 0);
    1714            1 :     spdm_response = (void *)response;
    1715            1 :     assert_int_equal(spdm_response->header.spdm_version,
    1716              :                      SPDM_MESSAGE_VERSION_12);
    1717            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1718              :                      SPDM_PSK_EXCHANGE_RSP);
    1719            1 :     assert_int_equal(spdm_response->rsp_session_id, 0xFFFF);
    1720              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1721              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size,
    1722              :                      0);
    1723              : #endif
    1724            1 :     free(data1);
    1725            1 : }
    1726              : 
    1727            1 : int libspdm_responder_psk_exchange_test_main(void)
    1728              : {
    1729            1 :     const struct CMUnitTest spdm_responder_psk_exchange_tests[] = {
    1730              :         /* Success Case*/
    1731              :         cmocka_unit_test(libspdm_test_responder_psk_exchange_case1),
    1732              :         /* Bad request size*/
    1733              :         cmocka_unit_test(libspdm_test_responder_psk_exchange_case2),
    1734              :         /* response_state: SPDM_RESPONSE_STATE_BUSY*/
    1735              :         cmocka_unit_test(libspdm_test_responder_psk_exchange_case3),
    1736              :         /* response_state: SPDM_RESPONSE_STATE_NEED_RESYNC*/
    1737              :         cmocka_unit_test(libspdm_test_responder_psk_exchange_case4),
    1738              :         #if LIBSPDM_RESPOND_IF_READY_SUPPORT
    1739              :         /* response_state: SPDM_RESPONSE_STATE_NOT_READY*/
    1740              :         cmocka_unit_test(libspdm_test_responder_psk_exchange_case5),
    1741              :         #endif /* LIBSPDM_RESPOND_IF_READY_SUPPORT */
    1742              :         /* connection_state Check*/
    1743              :         cmocka_unit_test(libspdm_test_responder_psk_exchange_case6),
    1744              :         /* Buffer reset*/
    1745              :         cmocka_unit_test(libspdm_test_responder_psk_exchange_case7),
    1746              :         /* Buffer verification*/
    1747              :         cmocka_unit_test(libspdm_test_responder_psk_exchange_case8),
    1748              :         /* Successful response V1.2*/
    1749              :         cmocka_unit_test(libspdm_test_responder_psk_exchange_case9),
    1750              :         /* TCB measurement hash requested */
    1751              :         cmocka_unit_test(libspdm_test_responder_psk_exchange_case10),
    1752              :         /* All measurement hash requested */
    1753              :         cmocka_unit_test(libspdm_test_responder_psk_exchange_case11),
    1754              :         /* Reserved value in Measurement summary. Error + Invalid */
    1755              :         cmocka_unit_test(libspdm_test_responder_psk_exchange_case12),
    1756              :         /* TCB measurement hash requested, measurement flag not set */
    1757              :         cmocka_unit_test(libspdm_test_responder_psk_exchange_case13),
    1758              :         /* No PSKHint*/
    1759              :         cmocka_unit_test(libspdm_test_responder_psk_exchange_case14),
    1760              :         /* No OpaqueData*/
    1761              :         cmocka_unit_test(libspdm_test_responder_psk_exchange_case15),
    1762              :         /* No PSKHint and no OpaqueData*/
    1763              :         cmocka_unit_test(libspdm_test_responder_psk_exchange_case16),
    1764              :         /* OpaqueData only supports OpaqueDataFmt1, Success Case */
    1765              :         cmocka_unit_test(libspdm_test_responder_psk_exchange_case17),
    1766              :     };
    1767              : 
    1768            1 :     libspdm_test_context_t test_context = {
    1769              :         LIBSPDM_TEST_CONTEXT_VERSION,
    1770              :         false,
    1771              :     };
    1772              : 
    1773            1 :     libspdm_setup_test_context(&test_context);
    1774              : 
    1775            1 :     return cmocka_run_group_tests(spdm_responder_psk_exchange_tests,
    1776              :                                   libspdm_unit_test_group_setup,
    1777              :                                   libspdm_unit_test_group_teardown);
    1778              : }
    1779              : 
    1780              : #endif /* LIBSPDM_ENABLE_CAPABILITY_PSK_CAP*/
        

Generated by: LCOV version 2.0-1