LCOV - code coverage report
Current view: top level - unit_test/test_spdm_responder - end_session_ack.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 289 289
Test Date: 2025-12-21 08:10:27 Functions: 100.0 % 9 9

            Line data    Source code
       1              : /**
       2              :  *  Copyright Notice:
       3              :  *  Copyright 2021-2025 DMTF. All rights reserved.
       4              :  *  License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
       5              :  **/
       6              : 
       7              : #include "spdm_unit_test.h"
       8              : #include "internal/libspdm_responder_lib.h"
       9              : #include "internal/libspdm_secured_message_lib.h"
      10              : 
      11              : #if (LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP) || (LIBSPDM_ENABLE_CAPABILITY_PSK_CAP)
      12              : 
      13              : spdm_end_session_request_t m_libspdm_end_session_request1 = {
      14              :     { SPDM_MESSAGE_VERSION_11, SPDM_END_SESSION, 0, 0 }
      15              : };
      16              : size_t m_libspdm_end_session_request1_size = sizeof(m_libspdm_end_session_request1);
      17              : 
      18              : spdm_end_session_request_t m_libspdm_end_session_request2 = {
      19              :     { SPDM_MESSAGE_VERSION_11, SPDM_END_SESSION, 0, 0 }
      20              : };
      21              : size_t m_libspdm_end_session_request2_size = LIBSPDM_MAX_SPDM_MSG_SIZE;
      22              : 
      23              : spdm_end_session_request_t m_libspdm_end_session_request3 = {
      24              :     { SPDM_MESSAGE_VERSION_11, SPDM_END_SESSION,
      25              :       SPDM_END_SESSION_REQUEST_ATTRIBUTES_PRESERVE_NEGOTIATED_STATE_CLEAR, 0 }
      26              : };
      27              : size_t m_libspdm_end_session_request3_size = sizeof(m_libspdm_end_session_request1);
      28              : 
      29            1 : static void rsp_end_session_ack_case1(void **state)
      30              : {
      31              :     libspdm_return_t status;
      32              :     libspdm_test_context_t *spdm_test_context;
      33              :     libspdm_context_t *spdm_context;
      34              :     size_t response_size;
      35              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
      36              :     spdm_end_session_response_t *spdm_response;
      37              :     void *data1;
      38              :     size_t data_size1;
      39              :     libspdm_session_info_t *session_info;
      40              :     uint32_t session_id;
      41              : 
      42            1 :     spdm_test_context = *state;
      43            1 :     spdm_context = spdm_test_context->spdm_context;
      44            1 :     spdm_test_context->case_id = 0x1;
      45            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
      46              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
      47            1 :     spdm_context->connection_info.connection_state =
      48              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
      49            1 :     spdm_context->connection_info.capability.flags |=
      50              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
      51            1 :     spdm_context->local_context.capability.flags |=
      52              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
      53            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
      54              :         m_libspdm_use_hash_algo;
      55            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
      56              :         m_libspdm_use_asym_algo;
      57            1 :     spdm_context->connection_info.algorithm.measurement_spec =
      58              :         m_libspdm_use_measurement_spec;
      59            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
      60              :         m_libspdm_use_measurement_hash_algo;
      61            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
      62              :         m_libspdm_use_dhe_algo;
      63            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
      64              :         m_libspdm_use_aead_algo;
      65            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
      66              :                                                     m_libspdm_use_asym_algo, &data1,
      67              :                                                     &data_size1, NULL, NULL);
      68            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
      69            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
      70              :         data_size1;
      71              : 
      72            1 :     libspdm_reset_message_a(spdm_context);
      73              : 
      74            1 :     session_id = 0xFFFFFFFF;
      75            1 :     spdm_context->latest_session_id = session_id;
      76            1 :     spdm_context->last_spdm_request_session_id_valid = true;
      77            1 :     spdm_context->last_spdm_request_session_id = session_id;
      78            1 :     session_info = &spdm_context->session_info[0];
      79            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
      80              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
      81            1 :     libspdm_secured_message_set_session_state(
      82              :         session_info->secured_message_context,
      83              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
      84              : 
      85            1 :     response_size = sizeof(response);
      86            1 :     status = libspdm_get_response_end_session(spdm_context,
      87              :                                               m_libspdm_end_session_request1_size,
      88              :                                               &m_libspdm_end_session_request1,
      89              :                                               &response_size, response);
      90            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
      91            1 :     assert_int_equal(response_size, sizeof(spdm_end_session_response_t));
      92            1 :     spdm_response = (void *)response;
      93            1 :     assert_int_equal(spdm_response->header.request_response_code,
      94              :                      SPDM_END_SESSION_ACK);
      95            1 :     free(data1);
      96            1 : }
      97              : 
      98            1 : static void rsp_end_session_ack_case2(void **state)
      99              : {
     100              :     libspdm_return_t status;
     101              :     libspdm_test_context_t *spdm_test_context;
     102              :     libspdm_context_t *spdm_context;
     103              :     size_t response_size;
     104              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     105              :     spdm_end_session_response_t *spdm_response;
     106              :     void *data1;
     107              :     size_t data_size1;
     108              :     libspdm_session_info_t *session_info;
     109              :     uint32_t session_id;
     110              : 
     111            1 :     spdm_test_context = *state;
     112            1 :     spdm_context = spdm_test_context->spdm_context;
     113            1 :     spdm_test_context->case_id = 0x2;
     114            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     115              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     116            1 :     spdm_context->connection_info.connection_state =
     117              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     118            1 :     spdm_context->connection_info.capability.flags |=
     119              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
     120            1 :     spdm_context->local_context.capability.flags |=
     121              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
     122            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     123              :         m_libspdm_use_hash_algo;
     124            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     125              :         m_libspdm_use_asym_algo;
     126            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     127              :         m_libspdm_use_measurement_spec;
     128            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     129              :         m_libspdm_use_measurement_hash_algo;
     130            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
     131              :         m_libspdm_use_dhe_algo;
     132            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
     133              :         m_libspdm_use_aead_algo;
     134            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     135              :                                                     m_libspdm_use_asym_algo, &data1,
     136              :                                                     &data_size1, NULL, NULL);
     137            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     138            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
     139              :         data_size1;
     140              : 
     141            1 :     libspdm_reset_message_a(spdm_context);
     142              : 
     143            1 :     session_id = 0xFFFFFFFF;
     144            1 :     spdm_context->latest_session_id = session_id;
     145            1 :     spdm_context->last_spdm_request_session_id_valid = true;
     146            1 :     spdm_context->last_spdm_request_session_id = session_id;
     147            1 :     session_info = &spdm_context->session_info[0];
     148            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
     149              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     150            1 :     libspdm_secured_message_set_session_state(
     151              :         session_info->secured_message_context,
     152              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
     153              : 
     154            1 :     response_size = sizeof(response);
     155            1 :     status = libspdm_get_response_end_session(spdm_context,
     156              :                                               m_libspdm_end_session_request2_size,
     157              :                                               &m_libspdm_end_session_request2,
     158              :                                               &response_size, response);
     159            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     160            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     161            1 :     spdm_response = (void *)response;
     162            1 :     assert_int_equal(spdm_response->header.request_response_code,
     163              :                      SPDM_ERROR);
     164            1 :     assert_int_equal(spdm_response->header.param1,
     165              :                      SPDM_ERROR_CODE_INVALID_REQUEST);
     166            1 :     assert_int_equal(spdm_response->header.param2, 0);
     167            1 :     free(data1);
     168            1 : }
     169              : 
     170            1 : static void rsp_end_session_ack_case3(void **state)
     171              : {
     172              :     libspdm_return_t status;
     173              :     libspdm_test_context_t *spdm_test_context;
     174              :     libspdm_context_t *spdm_context;
     175              :     size_t response_size;
     176              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     177              :     spdm_end_session_response_t *spdm_response;
     178              :     void *data1;
     179              :     size_t data_size1;
     180              :     libspdm_session_info_t *session_info;
     181              :     uint32_t session_id;
     182              : 
     183            1 :     spdm_test_context = *state;
     184            1 :     spdm_context = spdm_test_context->spdm_context;
     185            1 :     spdm_test_context->case_id = 0x3;
     186            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     187              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     188            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_BUSY;
     189            1 :     spdm_context->connection_info.connection_state =
     190              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     191            1 :     spdm_context->connection_info.capability.flags |=
     192              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
     193            1 :     spdm_context->local_context.capability.flags |=
     194              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
     195            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     196              :         m_libspdm_use_hash_algo;
     197            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     198              :         m_libspdm_use_asym_algo;
     199            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     200              :         m_libspdm_use_measurement_spec;
     201            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     202              :         m_libspdm_use_measurement_hash_algo;
     203            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
     204              :         m_libspdm_use_dhe_algo;
     205            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
     206              :         m_libspdm_use_aead_algo;
     207            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     208              :                                                     m_libspdm_use_asym_algo, &data1,
     209              :                                                     &data_size1, NULL, NULL);
     210            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     211            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
     212              :         data_size1;
     213              : 
     214            1 :     libspdm_reset_message_a(spdm_context);
     215              : 
     216            1 :     session_id = 0xFFFFFFFF;
     217            1 :     spdm_context->latest_session_id = session_id;
     218            1 :     spdm_context->last_spdm_request_session_id_valid = true;
     219            1 :     spdm_context->last_spdm_request_session_id = session_id;
     220            1 :     session_info = &spdm_context->session_info[0];
     221            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
     222              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     223            1 :     libspdm_secured_message_set_session_state(
     224              :         session_info->secured_message_context,
     225              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
     226              : 
     227            1 :     response_size = sizeof(response);
     228            1 :     status = libspdm_get_response_end_session(spdm_context,
     229              :                                               m_libspdm_end_session_request1_size,
     230              :                                               &m_libspdm_end_session_request1,
     231              :                                               &response_size, response);
     232            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     233            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     234            1 :     spdm_response = (void *)response;
     235            1 :     assert_int_equal(spdm_response->header.request_response_code,
     236              :                      SPDM_ERROR);
     237            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_BUSY);
     238            1 :     assert_int_equal(spdm_response->header.param2, 0);
     239            1 :     assert_int_equal(spdm_context->response_state,
     240              :                      LIBSPDM_RESPONSE_STATE_BUSY);
     241            1 :     free(data1);
     242            1 : }
     243              : 
     244            1 : static void rsp_end_session_ack_case4(void **state)
     245              : {
     246              :     libspdm_return_t status;
     247              :     libspdm_test_context_t *spdm_test_context;
     248              :     libspdm_context_t *spdm_context;
     249              :     size_t response_size;
     250              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     251              :     spdm_end_session_response_t *spdm_response;
     252              :     void *data1;
     253              :     size_t data_size1;
     254              :     libspdm_session_info_t *session_info;
     255              :     uint32_t session_id;
     256              : 
     257            1 :     spdm_test_context = *state;
     258            1 :     spdm_context = spdm_test_context->spdm_context;
     259            1 :     spdm_test_context->case_id = 0x4;
     260            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     261              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     262            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NEED_RESYNC;
     263            1 :     spdm_context->connection_info.connection_state =
     264              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     265            1 :     spdm_context->connection_info.capability.flags |=
     266              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
     267            1 :     spdm_context->local_context.capability.flags |=
     268              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
     269            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     270              :         m_libspdm_use_hash_algo;
     271            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     272              :         m_libspdm_use_asym_algo;
     273            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     274              :         m_libspdm_use_measurement_spec;
     275            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     276              :         m_libspdm_use_measurement_hash_algo;
     277            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
     278              :         m_libspdm_use_dhe_algo;
     279            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
     280              :         m_libspdm_use_aead_algo;
     281            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     282              :                                                     m_libspdm_use_asym_algo, &data1,
     283              :                                                     &data_size1, NULL, NULL);
     284            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     285            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
     286              :         data_size1;
     287              : 
     288            1 :     libspdm_reset_message_a(spdm_context);
     289              : 
     290            1 :     session_id = 0xFFFFFFFF;
     291            1 :     spdm_context->latest_session_id = session_id;
     292            1 :     spdm_context->last_spdm_request_session_id_valid = true;
     293            1 :     spdm_context->last_spdm_request_session_id = session_id;
     294            1 :     session_info = &spdm_context->session_info[0];
     295            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
     296              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     297            1 :     libspdm_secured_message_set_session_state(
     298              :         session_info->secured_message_context,
     299              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
     300              : 
     301            1 :     response_size = sizeof(response);
     302            1 :     status = libspdm_get_response_end_session(spdm_context,
     303              :                                               m_libspdm_end_session_request1_size,
     304              :                                               &m_libspdm_end_session_request1,
     305              :                                               &response_size, response);
     306            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     307            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     308            1 :     spdm_response = (void *)response;
     309            1 :     assert_int_equal(spdm_response->header.request_response_code,
     310              :                      SPDM_ERROR);
     311            1 :     assert_int_equal(spdm_response->header.param1,
     312              :                      SPDM_ERROR_CODE_REQUEST_RESYNCH);
     313            1 :     assert_int_equal(spdm_response->header.param2, 0);
     314            1 :     assert_int_equal(spdm_context->response_state,
     315              :                      LIBSPDM_RESPONSE_STATE_NEED_RESYNC);
     316            1 :     free(data1);
     317            1 : }
     318              : 
     319              : #if LIBSPDM_RESPOND_IF_READY_SUPPORT
     320            1 : static void rsp_end_session_ack_case5(void **state)
     321              : {
     322              :     libspdm_return_t status;
     323              :     libspdm_test_context_t *spdm_test_context;
     324              :     libspdm_context_t *spdm_context;
     325              :     size_t response_size;
     326              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     327              :     spdm_end_session_response_t *spdm_response;
     328              :     void *data1;
     329              :     size_t data_size1;
     330              :     libspdm_session_info_t *session_info;
     331              :     uint32_t session_id;
     332              :     spdm_error_data_response_not_ready_t *error_data;
     333              : 
     334            1 :     spdm_test_context = *state;
     335            1 :     spdm_context = spdm_test_context->spdm_context;
     336            1 :     spdm_test_context->case_id = 0x5;
     337            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     338              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     339            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NOT_READY;
     340            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     341            1 :     spdm_context->connection_info.capability.flags |=
     342              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
     343            1 :     spdm_context->local_context.capability.flags |=
     344              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
     345            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     346            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     347            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     348            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     349              :         m_libspdm_use_measurement_hash_algo;
     350            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
     351            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
     352            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     353              :                                                     m_libspdm_use_asym_algo, &data1,
     354              :                                                     &data_size1, NULL, NULL);
     355            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     356            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size1;
     357              : 
     358            1 :     libspdm_reset_message_a(spdm_context);
     359              : 
     360            1 :     session_id = 0xFFFFFFFF;
     361            1 :     spdm_context->latest_session_id = session_id;
     362            1 :     spdm_context->last_spdm_request_session_id_valid = true;
     363            1 :     spdm_context->last_spdm_request_session_id = session_id;
     364            1 :     session_info = &spdm_context->session_info[0];
     365            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
     366              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     367            1 :     libspdm_secured_message_set_session_state(
     368              :         session_info->secured_message_context,
     369              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
     370              : 
     371            1 :     response_size = sizeof(response);
     372            1 :     status = libspdm_get_response_end_session(spdm_context,
     373              :                                               m_libspdm_end_session_request1_size,
     374              :                                               &m_libspdm_end_session_request1,
     375              :                                               &response_size, response);
     376            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     377            1 :     assert_int_equal(response_size,
     378              :                      sizeof(spdm_error_response_t) +
     379              :                      sizeof(spdm_error_data_response_not_ready_t));
     380            1 :     spdm_response = (void *)response;
     381            1 :     error_data = (spdm_error_data_response_not_ready_t *)(spdm_response + 1);
     382            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     383            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_RESPONSE_NOT_READY);
     384            1 :     assert_int_equal(spdm_response->header.param2, 0);
     385            1 :     assert_int_equal(spdm_context->response_state, LIBSPDM_RESPONSE_STATE_NOT_READY);
     386            1 :     assert_int_equal(error_data->request_code, SPDM_END_SESSION);
     387            1 :     free(data1);
     388            1 : }
     389              : #endif /* LIBSPDM_RESPOND_IF_READY_SUPPORT */
     390              : 
     391            1 : static void rsp_end_session_ack_case6(void **state)
     392              : {
     393              :     libspdm_return_t status;
     394              :     libspdm_test_context_t *spdm_test_context;
     395              :     libspdm_context_t *spdm_context;
     396              :     size_t response_size;
     397              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     398              :     spdm_end_session_response_t *spdm_response;
     399              :     void *data1;
     400              :     size_t data_size1;
     401              :     libspdm_session_info_t *session_info;
     402              :     uint32_t session_id;
     403              : 
     404            1 :     spdm_test_context = *state;
     405            1 :     spdm_context = spdm_test_context->spdm_context;
     406            1 :     spdm_test_context->case_id = 0x6;
     407            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     408              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     409            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
     410            1 :     spdm_context->connection_info.connection_state =
     411              :         LIBSPDM_CONNECTION_STATE_NOT_STARTED;
     412            1 :     spdm_context->connection_info.capability.flags |=
     413              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
     414            1 :     spdm_context->local_context.capability.flags |=
     415              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
     416            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     417              :         m_libspdm_use_hash_algo;
     418            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     419              :         m_libspdm_use_asym_algo;
     420            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     421              :         m_libspdm_use_measurement_spec;
     422            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     423              :         m_libspdm_use_measurement_hash_algo;
     424            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
     425              :         m_libspdm_use_dhe_algo;
     426            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
     427              :         m_libspdm_use_aead_algo;
     428            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     429              :                                                     m_libspdm_use_asym_algo, &data1,
     430              :                                                     &data_size1, NULL, NULL);
     431            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     432            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
     433              :         data_size1;
     434              : 
     435            1 :     libspdm_reset_message_a(spdm_context);
     436              : 
     437            1 :     session_id = 0xFFFFFFFF;
     438            1 :     spdm_context->latest_session_id = session_id;
     439            1 :     spdm_context->last_spdm_request_session_id_valid = true;
     440            1 :     spdm_context->last_spdm_request_session_id = session_id;
     441            1 :     session_info = &spdm_context->session_info[0];
     442            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
     443              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     444            1 :     libspdm_secured_message_set_session_state(
     445              :         session_info->secured_message_context,
     446              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
     447              : 
     448            1 :     response_size = sizeof(response);
     449            1 :     status = libspdm_get_response_end_session(spdm_context,
     450              :                                               m_libspdm_end_session_request1_size,
     451              :                                               &m_libspdm_end_session_request1,
     452              :                                               &response_size, response);
     453            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     454            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     455            1 :     spdm_response = (void *)response;
     456            1 :     assert_int_equal(spdm_response->header.request_response_code,
     457              :                      SPDM_ERROR);
     458            1 :     assert_int_equal(spdm_response->header.param1,
     459              :                      SPDM_ERROR_CODE_UNEXPECTED_REQUEST);
     460            1 :     assert_int_equal(spdm_response->header.param2, 0);
     461            1 :     free(data1);
     462            1 : }
     463              : 
     464            1 : static void rsp_end_session_ack_case7(void **state)
     465              : {
     466              :     libspdm_return_t status;
     467              :     libspdm_test_context_t *spdm_test_context;
     468              :     libspdm_context_t *spdm_context;
     469              :     size_t response_size;
     470              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     471              :     spdm_end_session_response_t *spdm_response;
     472              :     void *data1;
     473              :     size_t data_size1;
     474              :     libspdm_session_info_t *session_info;
     475              :     uint32_t session_id;
     476              : 
     477            1 :     spdm_test_context = *state;
     478            1 :     spdm_context = spdm_test_context->spdm_context;
     479            1 :     spdm_test_context->case_id = 0x7;
     480            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     481              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     482            1 :     spdm_context->connection_info.connection_state =
     483              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     484            1 :     spdm_context->connection_info.capability.flags |=
     485              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
     486            1 :     spdm_context->local_context.capability.flags |=
     487              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
     488            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     489              :         m_libspdm_use_hash_algo;
     490            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     491              :         m_libspdm_use_asym_algo;
     492            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     493              :         m_libspdm_use_measurement_spec;
     494            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     495              :         m_libspdm_use_measurement_hash_algo;
     496            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
     497              :         m_libspdm_use_dhe_algo;
     498            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
     499              :         m_libspdm_use_aead_algo;
     500            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     501              :                                                     m_libspdm_use_asym_algo, &data1,
     502              :                                                     &data_size1, NULL, NULL);
     503            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     504            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
     505              :         data_size1;
     506              : 
     507            1 :     libspdm_reset_message_a(spdm_context);
     508              : 
     509            1 :     session_id = 0xFFFFFFFF;
     510            1 :     spdm_context->latest_session_id = session_id;
     511            1 :     spdm_context->last_spdm_request_session_id_valid = true;
     512            1 :     spdm_context->last_spdm_request_session_id = session_id;
     513            1 :     session_info = &spdm_context->session_info[0];
     514            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
     515              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     516            1 :     libspdm_secured_message_set_session_state(
     517              :         session_info->secured_message_context,
     518              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
     519              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     520              :     session_info->session_transcript.message_m.buffer_size =
     521              :         session_info->session_transcript.message_m.max_buffer_size;
     522              :     spdm_context->transcript.message_b.buffer_size =
     523              :         spdm_context->transcript.message_b.max_buffer_size;
     524              :     spdm_context->transcript.message_c.buffer_size =
     525              :         spdm_context->transcript.message_c.max_buffer_size;
     526              :     spdm_context->transcript.message_mut_b.buffer_size =
     527              :         spdm_context->transcript.message_mut_b.max_buffer_size;
     528              :     spdm_context->transcript.message_mut_c.buffer_size =
     529              :         spdm_context->transcript.message_mut_c.max_buffer_size;
     530              : #endif
     531              : 
     532            1 :     response_size = sizeof(response);
     533            1 :     status = libspdm_get_response_end_session(spdm_context,
     534              :                                               m_libspdm_end_session_request1_size,
     535              :                                               &m_libspdm_end_session_request1,
     536              :                                               &response_size, response);
     537            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     538            1 :     assert_int_equal(response_size, sizeof(spdm_end_session_response_t));
     539            1 :     spdm_response = (void *)response;
     540            1 :     assert_int_equal(spdm_response->header.request_response_code,
     541              :                      SPDM_END_SESSION_ACK);
     542              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     543              :     assert_int_equal(session_info->session_transcript.message_m.buffer_size, 0);
     544              :     assert_int_equal(spdm_context->transcript.message_b.buffer_size, 0);
     545              :     assert_int_equal(spdm_context->transcript.message_c.buffer_size, 0);
     546              :     assert_int_equal(spdm_context->transcript.message_mut_b.buffer_size, 0);
     547              :     assert_int_equal(spdm_context->transcript.message_mut_c.buffer_size, 0);
     548              : #endif
     549              : 
     550            1 :     free(data1);
     551            1 : }
     552              : 
     553            1 : static void rsp_end_session_ack_case8(void **state)
     554              : {
     555              :     libspdm_return_t status;
     556              :     libspdm_test_context_t *spdm_test_context;
     557              :     libspdm_context_t *spdm_context;
     558              :     size_t response_size;
     559              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     560              :     spdm_end_session_response_t *spdm_response;
     561              :     void *data1;
     562              :     size_t data_size1;
     563              :     libspdm_session_info_t *session_info;
     564              :     uint32_t session_id;
     565              : 
     566            1 :     spdm_test_context = *state;
     567            1 :     spdm_context = spdm_test_context->spdm_context;
     568            1 :     spdm_test_context->case_id = 0x1;
     569            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     570              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     571            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     572            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
     573            1 :     spdm_context->local_context.capability.flags |=
     574              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
     575            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     576            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     577            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     578            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     579              :         m_libspdm_use_measurement_hash_algo;
     580            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
     581            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
     582            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     583              :                                                     m_libspdm_use_asym_algo, &data1,
     584              :                                                     &data_size1, NULL, NULL);
     585            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     586            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size1;
     587              : 
     588            1 :     libspdm_reset_message_a(spdm_context);
     589              : 
     590            1 :     session_id = 0xFFFFFFFF;
     591            1 :     spdm_context->latest_session_id = session_id;
     592            1 :     spdm_context->last_spdm_request_session_id_valid = true;
     593            1 :     spdm_context->last_spdm_request_session_id = session_id;
     594            1 :     session_info = &spdm_context->session_info[0];
     595            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
     596              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     597            1 :     libspdm_secured_message_set_session_state(
     598              :         session_info->secured_message_context,
     599              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
     600              : 
     601            1 :     response_size = sizeof(response);
     602            1 :     status = libspdm_get_response_end_session(spdm_context,
     603              :                                               m_libspdm_end_session_request3_size,
     604              :                                               &m_libspdm_end_session_request3,
     605              :                                               &response_size, response);
     606            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     607            1 :     assert_int_equal(response_size, sizeof(spdm_end_session_response_t));
     608            1 :     spdm_response = (void *)response;
     609            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_END_SESSION_ACK);
     610            1 :     assert_int_not_equal(spdm_context->connection_info.end_session_attributes &
     611              :                          SPDM_END_SESSION_REQUEST_ATTRIBUTES_PRESERVE_NEGOTIATED_STATE_CLEAR, 0);
     612            1 :     free(data1);
     613            1 : }
     614              : 
     615            1 : int libspdm_rsp_end_session_ack_test(void)
     616              : {
     617            1 :     const struct CMUnitTest test_cases[] = {
     618              :         /* Success Case*/
     619              :         cmocka_unit_test(rsp_end_session_ack_case1),
     620              :         /* Bad request size*/
     621              :         cmocka_unit_test(rsp_end_session_ack_case2),
     622              :         /* response_state: SPDM_RESPONSE_STATE_BUSY*/
     623              :         cmocka_unit_test(rsp_end_session_ack_case3),
     624              :         /* response_state: LIBSPDM_RESPONSE_STATE_NEED_RESYNC*/
     625              :         cmocka_unit_test(rsp_end_session_ack_case4),
     626              :         #if LIBSPDM_RESPOND_IF_READY_SUPPORT
     627              :         /* response_state: LIBSPDM_RESPONSE_STATE_NOT_READY*/
     628              :         cmocka_unit_test(rsp_end_session_ack_case5),
     629              :         #endif /* LIBSPDM_RESPOND_IF_READY_SUPPORT */
     630              :         /* connection_state Check*/
     631              :         cmocka_unit_test(rsp_end_session_ack_case6),
     632              :         /* Buffer reset*/
     633              :         cmocka_unit_test(rsp_end_session_ack_case7),
     634              :         /* Success Case with end_session_attribute set */
     635              :         cmocka_unit_test(rsp_end_session_ack_case8),
     636              :     };
     637              : 
     638            1 :     libspdm_test_context_t test_context = {
     639              :         LIBSPDM_TEST_CONTEXT_VERSION,
     640              :         false,
     641              :     };
     642              : 
     643            1 :     libspdm_setup_test_context(&test_context);
     644              : 
     645            1 :     return cmocka_run_group_tests(test_cases,
     646              :                                   libspdm_unit_test_group_setup,
     647              :                                   libspdm_unit_test_group_teardown);
     648              : }
     649              : 
     650              : #endif /* (LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP) || (LIBSPDM_ENABLE_CAPABILITY_PSK_CAP) */
        

Generated by: LCOV version 2.0-1