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: 2025-10-12 08:10:56 Functions: 100.0 % 18 18

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

Generated by: LCOV version 2.0-1