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

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

Generated by: LCOV version 2.0-1