LCOV - code coverage report
Current view: top level - unit_test/test_spdm_requester - heartbeat.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 93.8 % 811 761
Test Date: 2026-02-22 08:11:49 Functions: 100.0 % 18 18

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

Generated by: LCOV version 2.0-1