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

Generated by: LCOV version 2.0-1