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

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

Generated by: LCOV version 2.0-1