LCOV - code coverage report
Current view: top level - unit_test/test_spdm_responder - respond_if_ready.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 547 547
Test Date: 2026-02-22 08:11:49 Functions: 100.0 % 16 16

            Line data    Source code
       1              : /**
       2              :  *  Copyright Notice:
       3              :  *  Copyright 2021-2026 DMTF. All rights reserved.
       4              :  *  License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
       5              :  **/
       6              : 
       7              : #include "spdm_unit_test.h"
       8              : #include "internal/libspdm_responder_lib.h"
       9              : #include "internal/libspdm_requester_lib.h"
      10              : #include "internal/libspdm_secured_message_lib.h"
      11              : 
      12              : #if LIBSPDM_RESPOND_IF_READY_SUPPORT
      13              : 
      14              : #if (LIBSPDM_ENABLE_CAPABILITY_CERT_CAP || LIBSPDM_ENABLE_CAPABILITY_CHAL_CAP || \
      15              :      LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP || LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP || \
      16              :      LIBSPDM_ENABLE_CAPABILITY_PSK_CAP)
      17              : 
      18              : #define LIBSPDM_MY_TEST_TOKEN            0x30
      19              : #define LIBSPDM_MY_WRONG_TEST_TOKEN      0x2F
      20              : 
      21              : static libspdm_th_managed_buffer_t th_curr;
      22              : 
      23              : extern size_t libspdm_secret_lib_challenge_opaque_data_size;
      24              : 
      25              : spdm_response_if_ready_request_t m_libspdm_respond_if_ready_request1 = {
      26              :     {
      27              :         SPDM_MESSAGE_VERSION_11,
      28              :         SPDM_RESPOND_IF_READY,
      29              :         SPDM_GET_DIGESTS,
      30              :         LIBSPDM_MY_TEST_TOKEN
      31              :     },
      32              : };
      33              : size_t m_libspdm_respond_if_ready_request1_size = sizeof(spdm_message_header_t);
      34              : 
      35              : spdm_response_if_ready_request_t m_libspdm_respond_if_ready_request2 = {
      36              :     {
      37              :         SPDM_MESSAGE_VERSION_11,
      38              :         SPDM_RESPOND_IF_READY,
      39              :         SPDM_GET_CERTIFICATE,
      40              :         LIBSPDM_MY_TEST_TOKEN
      41              :     },
      42              : };
      43              : size_t m_libspdm_respond_if_ready_request2_size = sizeof(spdm_message_header_t);
      44              : 
      45              : spdm_response_if_ready_request_t m_libspdm_respond_if_ready_request3 = {
      46              :     {
      47              :         SPDM_MESSAGE_VERSION_11,
      48              :         SPDM_RESPOND_IF_READY,
      49              :         SPDM_CHALLENGE,
      50              :         LIBSPDM_MY_TEST_TOKEN
      51              :     },
      52              : };
      53              : size_t m_libspdm_respond_if_ready_request3_size = sizeof(spdm_message_header_t);
      54              : 
      55              : spdm_response_if_ready_request_t m_libspdm_respond_if_ready_request4 = {
      56              :     {
      57              :         SPDM_MESSAGE_VERSION_11,
      58              :         SPDM_RESPOND_IF_READY,
      59              :         SPDM_GET_MEASUREMENTS,
      60              :         LIBSPDM_MY_TEST_TOKEN
      61              :     },
      62              : };
      63              : size_t m_libspdm_respond_if_ready_request4_size = sizeof(spdm_message_header_t);
      64              : 
      65              : spdm_response_if_ready_request_t m_libspdm_respond_if_ready_request5 = {
      66              :     {
      67              :         SPDM_MESSAGE_VERSION_11,
      68              :         SPDM_RESPOND_IF_READY,
      69              :         SPDM_KEY_EXCHANGE,
      70              :         LIBSPDM_MY_TEST_TOKEN
      71              :     },
      72              : };
      73              : size_t m_libspdm_respond_if_ready_request5_size = sizeof(spdm_message_header_t);
      74              : 
      75              : spdm_response_if_ready_request_t m_libspdm_respond_if_ready_request6 = {
      76              :     {
      77              :         SPDM_MESSAGE_VERSION_11,
      78              :         SPDM_RESPOND_IF_READY,
      79              :         SPDM_FINISH,
      80              :         LIBSPDM_MY_TEST_TOKEN
      81              :     },
      82              : };
      83              : size_t m_libspdm_respond_if_ready_request6_size = sizeof(spdm_message_header_t);
      84              : 
      85              : spdm_response_if_ready_request_t m_libspdm_respond_if_ready_request7 = {
      86              :     {
      87              :         SPDM_MESSAGE_VERSION_11,
      88              :         SPDM_RESPOND_IF_READY,
      89              :         SPDM_PSK_EXCHANGE,
      90              :         LIBSPDM_MY_TEST_TOKEN
      91              :     },
      92              : };
      93              : size_t m_libspdm_respond_if_ready_request7_size = sizeof(spdm_message_header_t);
      94              : 
      95              : spdm_response_if_ready_request_t m_libspdm_respond_if_ready_request8 = {
      96              :     {
      97              :         SPDM_MESSAGE_VERSION_11,
      98              :         SPDM_RESPOND_IF_READY,
      99              :         SPDM_PSK_FINISH,
     100              :         LIBSPDM_MY_TEST_TOKEN
     101              :     },
     102              : };
     103              : size_t m_libspdm_respond_if_ready_request8_size = sizeof(spdm_message_header_t);
     104              : 
     105              : spdm_response_if_ready_request_t m_libspdm_respond_if_ready_request10 = {
     106              :     {
     107              :         SPDM_MESSAGE_VERSION_11,
     108              :         SPDM_RESPOND_IF_READY,
     109              :         SPDM_GET_DIGESTS,
     110              :         LIBSPDM_MY_WRONG_TEST_TOKEN /*wrong token*/
     111              :     },
     112              : };
     113              : size_t m_libspdm_respond_if_ready_request10_size = sizeof(spdm_message_header_t);
     114              : 
     115              : spdm_response_if_ready_request_t m_libspdm_respond_if_ready_request11 = {
     116              :     {
     117              :         SPDM_MESSAGE_VERSION_11,
     118              :         SPDM_RESPOND_IF_READY,
     119              :         SPDM_GET_CERTIFICATE, /*wrong original request code*/
     120              :         LIBSPDM_MY_TEST_TOKEN
     121              :     },
     122              : };
     123              : size_t m_libspdm_respond_if_ready_request11_size = sizeof(spdm_message_header_t);
     124              : 
     125              : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
     126              : spdm_get_digest_request_t m_libspdm_get_digest_request = {
     127              :     {
     128              :         SPDM_MESSAGE_VERSION_11,
     129              :         SPDM_GET_DIGESTS,
     130              :         0,
     131              :         0
     132              :     },
     133              : };
     134              : size_t m_libspdm_get_digest_request_size = sizeof(spdm_message_header_t);
     135              : 
     136              : spdm_get_certificate_request_t m_libspdm_get_certificate_request = {
     137              :     {
     138              :         SPDM_MESSAGE_VERSION_11,
     139              :         SPDM_GET_CERTIFICATE,
     140              :         0,
     141              :         0
     142              :     },
     143              :     0,
     144              :     LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN
     145              : };
     146              : size_t m_libspdm_get_certificate_request_size = sizeof(m_libspdm_get_certificate_request);
     147              : 
     148              : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
     149              : 
     150              : #if LIBSPDM_ENABLE_CAPABILITY_CHAL_CAP
     151              : 
     152              : spdm_challenge_request_t m_libspdm_challenge_request = {
     153              :     {
     154              :         SPDM_MESSAGE_VERSION_11,
     155              :         SPDM_CHALLENGE,
     156              :         0,
     157              :         SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH
     158              :     },
     159              : };
     160              : size_t m_libspdm_challenge_request_size = sizeof(m_libspdm_challenge_request);
     161              : 
     162              : #endif /* LIBSPDM_ENABLE_CAPABILITY_CHAL_CAP*/
     163              : 
     164              : #if LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP
     165              : spdm_get_measurements_request_t m_libspdm_get_measurements_request = {
     166              :     {
     167              :         SPDM_MESSAGE_VERSION_11,
     168              :         SPDM_GET_MEASUREMENTS,
     169              :         0,
     170              :         SPDM_GET_MEASUREMENTS_REQUEST_MEASUREMENT_OPERATION_TOTAL_NUMBER_OF_MEASUREMENTS
     171              :     },
     172              : };
     173              : size_t m_libspdm_get_measurements_request_size = sizeof(spdm_message_header_t);
     174              : #endif /* LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP*/
     175              : 
     176              : #pragma pack(1)
     177              : 
     178              : typedef struct {
     179              :     spdm_message_header_t header;
     180              :     uint16_t req_session_id;
     181              :     uint8_t session_policy;
     182              :     uint8_t reserved;
     183              :     uint8_t random_data[SPDM_RANDOM_DATA_SIZE];
     184              :     uint8_t exchange_data[LIBSPDM_MAX_DHE_KEY_SIZE];
     185              :     uint16_t opaque_length;
     186              :     uint8_t opaque_data[SPDM_MAX_OPAQUE_DATA_SIZE];
     187              : } libspdm_key_exchange_request_mine_t;
     188              : 
     189              : typedef struct {
     190              :     spdm_message_header_t header;
     191              :     uint8_t signature[LIBSPDM_MAX_ASYM_SIG_SIZE];
     192              :     uint8_t verify_data[LIBSPDM_MAX_HASH_SIZE];
     193              : } libspdm_finish_request_mine_t;
     194              : 
     195              : #if LIBSPDM_ENABLE_CAPABILITY_PSK_CAP
     196              : typedef struct {
     197              :     spdm_message_header_t header;
     198              :     uint16_t req_session_id;
     199              :     uint16_t psk_hint_length;
     200              :     uint16_t requester_context_length;
     201              :     uint16_t opaque_length;
     202              :     uint8_t psk_hint[LIBSPDM_PSK_MAX_HINT_LENGTH];
     203              :     uint8_t requester_context[LIBSPDM_PSK_CONTEXT_LENGTH];
     204              :     uint8_t opaque_data[SPDM_MAX_OPAQUE_DATA_SIZE];
     205              : } libspdm_psk_exchange_request_mine_t;
     206              : 
     207              : typedef struct {
     208              :     spdm_message_header_t header;
     209              :     uint8_t verify_data[LIBSPDM_MAX_HASH_SIZE];
     210              : } libspdm_psk_finish_request_mine_t;
     211              : #endif /* LIBSPDM_ENABLE_CAPABILITY_PSK_CAP */
     212              : 
     213              : #pragma pack()
     214              : 
     215              : libspdm_key_exchange_request_mine_t m_libspdm_key_exchange_request = {
     216              :     {
     217              :         SPDM_MESSAGE_VERSION_11,
     218              :         SPDM_KEY_EXCHANGE,
     219              :         SPDM_KEY_EXCHANGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH,
     220              :         0
     221              :     },
     222              : };
     223              : size_t m_libspdm_key_exchange_request_size = sizeof(m_libspdm_key_exchange_request);
     224              : 
     225              : libspdm_finish_request_mine_t m_libspdm_finish_request = {
     226              :     {
     227              :         SPDM_MESSAGE_VERSION_11,
     228              :         SPDM_FINISH,
     229              :         0,
     230              :         0
     231              :     },
     232              : };
     233              : size_t m_libspdm_finish_request_size = sizeof(m_libspdm_finish_request);
     234              : 
     235              : #if LIBSPDM_ENABLE_CAPABILITY_PSK_CAP
     236              : libspdm_psk_exchange_request_mine_t m_libspdm_psk_exchange_request = {
     237              :     {
     238              :         SPDM_MESSAGE_VERSION_11,
     239              :         SPDM_PSK_EXCHANGE,
     240              :         SPDM_PSK_EXCHANGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH,
     241              :         0
     242              :     },
     243              : };
     244              : size_t m_libspdm_psk_exchange_request_size = sizeof(m_libspdm_psk_exchange_request);
     245              : 
     246              : libspdm_psk_finish_request_mine_t m_libspdm_psk_finish_request = {
     247              :     {
     248              :         SPDM_MESSAGE_VERSION_11,
     249              :         SPDM_PSK_FINISH,
     250              :         0,
     251              :         0
     252              :     },
     253              : };
     254              : size_t m_libspdm_psk_finish_request_size = sizeof(m_libspdm_psk_finish_request);
     255              : #endif /* LIBSPDM_ENABLE_CAPABILITY_PSK_CAP */
     256              : 
     257              : spdm_end_session_request_t m_libspdm_end_session_request = {
     258              :     {
     259              :         SPDM_MESSAGE_VERSION_11,
     260              :         SPDM_END_SESSION,
     261              :         0,
     262              :         0
     263              :     }
     264              : };
     265              : size_t m_libspdm_end_session_request_size = sizeof(m_libspdm_end_session_request);
     266              : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
     267              : static uint8_t m_libspdm_local_certificate_chain[LIBSPDM_MAX_CERT_CHAIN_SIZE];
     268              : #endif
     269            2 : static void libspdm_secured_message_set_request_finished_key(
     270              :     void *spdm_secured_message_context, const void *key, size_t key_size)
     271              : {
     272              :     libspdm_secured_message_context_t *secured_message_context;
     273              : 
     274            2 :     secured_message_context = spdm_secured_message_context;
     275            2 :     LIBSPDM_ASSERT(key_size == secured_message_context->hash_size);
     276            2 :     libspdm_copy_mem(secured_message_context->handshake_secret.request_finished_key,
     277              :                      sizeof(secured_message_context->handshake_secret.request_finished_key),
     278              :                      key, secured_message_context->hash_size);
     279            2 : }
     280              : 
     281              : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
     282              : /**
     283              :  * Test 1: receiving a correct RESPOND_IF_READY from the requester, after a
     284              :  * GET_DIGESTS could not be processed.
     285              :  * Expected behavior: the responder accepts the request and produces a valid DIGESTS
     286              :  * response message.
     287              :  **/
     288            1 : static void rsp_respond_if_ready_case1(void **state) {
     289              :     libspdm_return_t status;
     290              :     libspdm_test_context_t    *spdm_test_context;
     291              :     libspdm_context_t  *spdm_context;
     292              :     size_t response_size;
     293              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     294              :     spdm_digest_response_t *spdm_response; /*response to the original request (DIGESTS)*/
     295              : 
     296            1 :     spdm_test_context = *state;
     297            1 :     spdm_context = spdm_test_context->spdm_context;
     298            1 :     spdm_test_context->case_id = 0x1;
     299            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
     300              : 
     301              :     /*state for the the original request (GET_DIGESTS)*/
     302            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     303            1 :     spdm_context->local_context.capability.flags = 0;
     304            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
     305            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     306              : 
     307            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     308              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     309            1 :     spdm_context->local_context.local_cert_chain_provision[0] = m_libspdm_local_certificate_chain;
     310            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
     311              :         sizeof(m_libspdm_local_certificate_chain);
     312            1 :     libspdm_set_mem (m_libspdm_local_certificate_chain, sizeof(m_libspdm_local_certificate_chain),
     313              :                      (uint8_t)(0xFF));
     314              : 
     315            1 :     spdm_context->last_spdm_request_size = m_libspdm_get_digest_request_size;
     316            1 :     libspdm_copy_mem(spdm_context->last_spdm_request,
     317            1 :                      libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
     318              :                      &m_libspdm_get_digest_request, m_libspdm_get_digest_request_size);
     319              : 
     320              :     /*RESPOND_IF_READY specific data*/
     321            1 :     spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
     322            1 :     libspdm_copy_mem(spdm_context->cache_spdm_request,
     323            1 :                      libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
     324            1 :                      spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
     325            1 :     spdm_context->error_data.rd_exponent = 1;
     326            1 :     spdm_context->error_data.rd_tm        = 1;
     327            1 :     spdm_context->error_data.request_code = SPDM_GET_DIGESTS;
     328            1 :     spdm_context->error_data.token       = LIBSPDM_MY_TEST_TOKEN;
     329              : 
     330              :     /*check DIGESTS response*/
     331            1 :     response_size = sizeof(response);
     332            1 :     status = libspdm_get_response_respond_if_ready(spdm_context,
     333              :                                                    m_libspdm_respond_if_ready_request1_size,
     334              :                                                    &m_libspdm_respond_if_ready_request1,
     335              :                                                    &response_size,
     336              :                                                    response);
     337            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
     338            1 :     assert_int_equal (response_size,
     339              :                       sizeof(spdm_digest_response_t) +
     340              :                       libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo));
     341            1 :     spdm_response = (void *)response;
     342            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_DIGESTS);
     343            1 : }
     344              : 
     345              : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
     346              : 
     347              : /**
     348              :  * Test 2: receiving a correct RESPOND_IF_READY from the requester, after a
     349              :  * GET_CERTIFICATE could not be processed.
     350              :  * Expected behavior: the responder accepts the request and produces a valid CERTIFICATE
     351              :  * response message.
     352              :  **/
     353              : 
     354              : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
     355              : 
     356            1 : static void rsp_respond_if_ready_case2(void **state) {
     357              :     libspdm_return_t status;
     358              :     libspdm_test_context_t    *spdm_test_context;
     359              :     libspdm_context_t  *spdm_context;
     360              :     size_t response_size;
     361              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     362              :     spdm_certificate_response_t *spdm_response; /*response to the original request (CERTIFICATE)*/
     363              :     void                 *data;
     364              :     size_t data_size;
     365              : 
     366            1 :     spdm_test_context = *state;
     367            1 :     spdm_context = spdm_test_context->spdm_context;
     368            1 :     spdm_test_context->case_id = 0x2;
     369            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
     370              : 
     371              :     /*state for the the original request (GET_CERTIFICATE)*/
     372            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AFTER_DIGESTS;
     373            1 :     spdm_context->local_context.capability.flags = 0;
     374            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
     375            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     376            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     377              : 
     378            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     379              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     380            1 :     libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
     381              :                                                      m_libspdm_use_asym_algo,
     382              :                                                      &data, &data_size,
     383              :                                                      NULL, NULL);
     384            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     385            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     386              : 
     387            1 :     spdm_context->last_spdm_request_size = m_libspdm_get_certificate_request_size;
     388            1 :     libspdm_copy_mem(spdm_context->last_spdm_request,
     389            1 :                      libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
     390              :                      &m_libspdm_get_certificate_request, m_libspdm_get_certificate_request_size);
     391              : 
     392              :     /*RESPOND_IF_READY specific data*/
     393            1 :     spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
     394            1 :     libspdm_copy_mem(spdm_context->cache_spdm_request,
     395            1 :                      libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
     396            1 :                      spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
     397            1 :     spdm_context->error_data.rd_exponent = 1;
     398            1 :     spdm_context->error_data.rd_tm        = 1;
     399            1 :     spdm_context->error_data.request_code = SPDM_GET_CERTIFICATE;
     400            1 :     spdm_context->error_data.token       = LIBSPDM_MY_TEST_TOKEN;
     401              : 
     402              :     /*check CERTIFICATE response*/
     403            1 :     response_size = sizeof(response);
     404            1 :     status = libspdm_get_response_respond_if_ready(spdm_context,
     405              :                                                    m_libspdm_respond_if_ready_request2_size,
     406              :                                                    &m_libspdm_respond_if_ready_request2,
     407              :                                                    &response_size,
     408              :                                                    response);
     409            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
     410            1 :     assert_int_equal (response_size,
     411              :                       sizeof(spdm_certificate_response_t) + LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN);
     412            1 :     spdm_response = (void *)response;
     413            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_CERTIFICATE);
     414            1 :     assert_int_equal (spdm_response->header.param1, 0);
     415            1 :     assert_int_equal (spdm_response->portion_length, LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN);
     416            1 :     assert_int_equal (spdm_response->remainder_length,
     417              :                       data_size - LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN);
     418            1 :     free(data);
     419            1 : }
     420              : 
     421              : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
     422              : 
     423              : /**
     424              :  * Test 3: receiving a correct RESPOND_IF_READY from the requester, after a
     425              :  * CHALLENGE could not be processed.
     426              :  * Expected behavior: the responder accepts the request and produces a valid CHALLENGE_AUTH
     427              :  * response message.
     428              :  **/
     429              : #if LIBSPDM_ENABLE_CAPABILITY_CHAL_CAP
     430            1 : static void rsp_respond_if_ready_case3(void **state) {
     431              :     libspdm_return_t status;
     432              :     libspdm_test_context_t    *spdm_test_context;
     433              :     libspdm_context_t  *spdm_context;
     434              :     size_t response_size;
     435              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     436              :     spdm_challenge_auth_response_t *spdm_response; /*response to the original request (CHALLENGE_AUTH)*/
     437              :     void                 *data;
     438              :     size_t data_size;
     439              : 
     440            1 :     spdm_test_context = *state;
     441            1 :     spdm_context = spdm_test_context->spdm_context;
     442            1 :     spdm_test_context->case_id = 0x3;
     443            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
     444              : 
     445              :     /*state for the the original request (CHALLENGE)*/
     446            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     447            1 :     spdm_context->local_context.capability.flags = 0;
     448            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
     449            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
     450            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     451            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     452            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     453            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     454              :         m_libspdm_use_measurement_hash_algo;
     455              : 
     456            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     457              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     458            1 :     libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
     459              :                                                      m_libspdm_use_asym_algo,
     460              :                                                      &data, &data_size,
     461              :                                                      NULL, NULL);
     462            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     463            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     464              : 
     465            1 :     libspdm_secret_lib_challenge_opaque_data_size = 0;
     466              : 
     467            1 :     spdm_context->last_spdm_request_size = m_libspdm_challenge_request_size;
     468            1 :     libspdm_copy_mem(spdm_context->last_spdm_request,
     469            1 :                      libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
     470              :                      &m_libspdm_challenge_request, m_libspdm_challenge_request_size);
     471              : 
     472              :     /*RESPOND_IF_READY specific data*/
     473            1 :     spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
     474            1 :     libspdm_copy_mem(spdm_context->cache_spdm_request,
     475            1 :                      libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
     476            1 :                      spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
     477            1 :     spdm_context->error_data.rd_exponent = 1;
     478            1 :     spdm_context->error_data.rd_tm        = 1;
     479            1 :     spdm_context->error_data.request_code = SPDM_CHALLENGE;
     480            1 :     spdm_context->error_data.token       = LIBSPDM_MY_TEST_TOKEN;
     481              : 
     482              :     /*check CHALLENGE response*/
     483            1 :     response_size = sizeof(response);
     484            1 :     libspdm_get_random_number (SPDM_NONCE_SIZE, m_libspdm_challenge_request.nonce);
     485            1 :     status = libspdm_get_response_respond_if_ready(spdm_context,
     486              :                                                    m_libspdm_respond_if_ready_request3_size,
     487              :                                                    &m_libspdm_respond_if_ready_request3,
     488              :                                                    &response_size,
     489              :                                                    response);
     490            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
     491            1 :     assert_int_equal (response_size, sizeof(spdm_challenge_auth_response_t) + libspdm_get_hash_size (
     492              :                           m_libspdm_use_hash_algo) + SPDM_NONCE_SIZE + 0 + sizeof(uint16_t) + 0 +
     493              :                       libspdm_get_asym_signature_size ( m_libspdm_use_asym_algo));
     494            1 :     spdm_response = (void *)response;
     495            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_CHALLENGE_AUTH);
     496            1 :     assert_int_equal (spdm_response->header.param1, 0);
     497            1 :     assert_int_equal (spdm_response->header.param2, 1 << 0);
     498            1 :     free(data);
     499            1 : }
     500              : #endif /* LIBSPDM_ENABLE_CAPABILITY_CHAL_CAP*/
     501              : 
     502              : /**
     503              :  * Test 4: receiving a correct RESPOND_IF_READY from the requester, after a
     504              :  * GET_MEASUREMENTS could not be processed.
     505              :  * Expected behavior: the responder accepts the request and produces a valid MEASUREMENTS
     506              :  * response message.
     507              :  **/
     508              : 
     509              : #if LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP
     510              : 
     511              : extern size_t libspdm_secret_lib_meas_opaque_data_size;
     512              : 
     513            1 : static void rsp_respond_if_ready_case4(void **state) {
     514              :     libspdm_return_t status;
     515              :     libspdm_test_context_t    *spdm_test_context;
     516              :     libspdm_context_t  *spdm_context;
     517              :     size_t response_size;
     518              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     519              :     spdm_measurements_response_t *spdm_response; /*response to the original request (MEASUREMENTS)*/
     520              : 
     521            1 :     spdm_test_context = *state;
     522            1 :     spdm_context = spdm_test_context->spdm_context;
     523            1 :     spdm_test_context->case_id = 0x4;
     524            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
     525              : 
     526              :     /*state for the the original request (GET_MEASUREMENTS)*/
     527            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     528            1 :     spdm_context->local_context.capability.flags = 0;
     529            1 :     spdm_context->local_context.capability.flags |=
     530              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
     531            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     532            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     533            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     534            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     535              :         m_libspdm_use_measurement_hash_algo;
     536              : 
     537            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     538              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     539            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
     540              : 
     541            1 :     spdm_context->last_spdm_request_size = m_libspdm_get_measurements_request_size;
     542            1 :     libspdm_copy_mem(spdm_context->last_spdm_request,
     543            1 :                      libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
     544              :                      &m_libspdm_get_measurements_request, m_libspdm_get_measurements_request_size);
     545              : 
     546              :     /*RESPOND_IF_READY specific data*/
     547            1 :     spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
     548            1 :     libspdm_copy_mem(spdm_context->cache_spdm_request,
     549            1 :                      libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
     550            1 :                      spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
     551            1 :     spdm_context->error_data.rd_exponent = 1;
     552            1 :     spdm_context->error_data.rd_tm        = 1;
     553            1 :     spdm_context->error_data.request_code = SPDM_GET_MEASUREMENTS;
     554            1 :     spdm_context->error_data.token       = LIBSPDM_MY_TEST_TOKEN;
     555              : 
     556              :     /*check MEASUREMENT response*/
     557            1 :     response_size = sizeof(response);
     558            1 :     libspdm_get_random_number (SPDM_NONCE_SIZE, m_libspdm_get_measurements_request.nonce);
     559            1 :     status = libspdm_get_response_respond_if_ready(spdm_context,
     560              :                                                    m_libspdm_respond_if_ready_request4_size,
     561              :                                                    &m_libspdm_respond_if_ready_request4,
     562              :                                                    &response_size,
     563              :                                                    response);
     564            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
     565            1 :     assert_int_equal (response_size,
     566              :                       sizeof(spdm_measurements_response_t) + sizeof(uint16_t) + SPDM_NONCE_SIZE);
     567            1 :     spdm_response = (void *)response;
     568            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_MEASUREMENTS);
     569            1 :     assert_int_equal (spdm_response->header.param1, LIBSPDM_MEASUREMENT_BLOCK_NUMBER);
     570            1 : }
     571              : 
     572              : #endif /* LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP*/
     573              : 
     574              : /**
     575              :  * Test 5: receiving a correct RESPOND_IF_READY from the requester, after a
     576              :  * KEY_EXCHANGE could not be processed.
     577              :  * Expected behavior: the responder accepts the request and produces a valid KEY_EXCHANGE_RSP
     578              :  * response message.
     579              :  **/
     580              : #if LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP
     581              : 
     582            1 : static void rsp_respond_if_ready_case5(void **state) {
     583              :     libspdm_return_t status;
     584              :     libspdm_test_context_t    *spdm_test_context;
     585              :     libspdm_context_t  *spdm_context;
     586              :     size_t response_size;
     587              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     588              :     spdm_key_exchange_response_t *spdm_response; /*response to the original request (KEY_EXCHANGE_RSP)*/
     589              :     void                 *data;
     590              :     size_t data_size;
     591              :     uint8_t                *ptr;
     592              :     size_t dhe_key_size;
     593              :     void                 *dhe_context;
     594              :     size_t opaque_key_exchange_req_size;
     595              : 
     596            1 :     spdm_test_context = *state;
     597            1 :     spdm_context = spdm_test_context->spdm_context;
     598            1 :     spdm_test_context->case_id = 0x5;
     599            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
     600              : 
     601              :     /*state for the the original request (KEY_EXCHANGE)*/
     602            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     603            1 :     spdm_context->connection_info.capability.flags |=
     604              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP |
     605              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
     606            1 :     spdm_context->local_context.capability.flags =
     607              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP |
     608              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP |
     609              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
     610            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     611            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     612            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     613            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     614              :         m_libspdm_use_measurement_hash_algo;
     615            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
     616            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
     617              : 
     618            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     619              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     620            1 :     libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
     621              :                                                      m_libspdm_use_asym_algo,
     622              :                                                      &data, &data_size,
     623              :                                                      NULL, NULL);
     624            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     625            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     626              : 
     627            1 :     m_libspdm_key_exchange_request.req_session_id = 0xFFFF;
     628            1 :     m_libspdm_key_exchange_request.reserved = 0;
     629            1 :     ptr = m_libspdm_key_exchange_request.random_data;
     630            1 :     libspdm_get_random_number (SPDM_RANDOM_DATA_SIZE, ptr);
     631            1 :     ptr += SPDM_RANDOM_DATA_SIZE;
     632            1 :     dhe_key_size = libspdm_get_dhe_pub_key_size (m_libspdm_use_dhe_algo);
     633            1 :     dhe_context = libspdm_dhe_new (spdm_context->connection_info.version, m_libspdm_use_dhe_algo,
     634              :                                    false);
     635            1 :     libspdm_dhe_generate_key (m_libspdm_use_dhe_algo, dhe_context, ptr, &dhe_key_size);
     636            1 :     ptr += dhe_key_size;
     637            1 :     libspdm_dhe_free (m_libspdm_use_dhe_algo, dhe_context);
     638            1 :     opaque_key_exchange_req_size =
     639            1 :         libspdm_get_opaque_data_supported_version_data_size (spdm_context);
     640            1 :     *(uint16_t *)ptr = (uint16_t)opaque_key_exchange_req_size;
     641            1 :     ptr += sizeof(uint16_t);
     642            1 :     libspdm_build_opaque_data_supported_version_data (spdm_context, &opaque_key_exchange_req_size,
     643              :                                                       ptr);
     644            1 :     ptr += opaque_key_exchange_req_size;
     645              : 
     646            1 :     spdm_context->last_spdm_request_size = m_libspdm_key_exchange_request_size;
     647            1 :     libspdm_copy_mem(spdm_context->last_spdm_request,
     648            1 :                      libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
     649              :                      &m_libspdm_key_exchange_request, m_libspdm_key_exchange_request_size);
     650              : 
     651              :     /*RESPOND_IF_READY specific data*/
     652            1 :     spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
     653            1 :     libspdm_copy_mem(spdm_context->cache_spdm_request,
     654            1 :                      libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
     655            1 :                      spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
     656            1 :     spdm_context->error_data.rd_exponent = 1;
     657            1 :     spdm_context->error_data.rd_tm        = 1;
     658            1 :     spdm_context->error_data.request_code = SPDM_KEY_EXCHANGE;
     659            1 :     spdm_context->error_data.token       = LIBSPDM_MY_TEST_TOKEN;
     660              : 
     661              :     /*check KEY_EXCHANGE_RSP response*/
     662            1 :     response_size = sizeof(response);
     663            1 :     status = libspdm_get_response_respond_if_ready(spdm_context,
     664              :                                                    m_libspdm_respond_if_ready_request5_size,
     665              :                                                    &m_libspdm_respond_if_ready_request5,
     666              :                                                    &response_size,
     667              :                                                    response);
     668            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
     669            1 :     assert_int_equal (response_size,
     670              :                       sizeof(spdm_key_exchange_response_t) + dhe_key_size + 2 +
     671              :                       libspdm_get_opaque_data_version_selection_data_size(
     672              :                           spdm_context) + libspdm_get_asym_signature_size (
     673              :                           m_libspdm_use_asym_algo) +
     674              :                       libspdm_get_hash_size (m_libspdm_use_hash_algo));
     675            1 :     assert_int_equal (libspdm_secured_message_get_session_state (spdm_context->session_info[0].
     676              :                                                                  secured_message_context),
     677              :                       LIBSPDM_SESSION_STATE_HANDSHAKING);
     678            1 :     spdm_response = (void *)response;
     679            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_KEY_EXCHANGE_RSP);
     680            1 :     assert_int_equal (spdm_response->rsp_session_id, 0xFFFF);
     681            1 :     free(data);
     682            1 :     libspdm_free_session_id (spdm_context, (0xFFFFFFFF));
     683            1 : }
     684              : 
     685              : #endif /* LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP*/
     686              : 
     687              : /**
     688              :  * Test 6: receiving a correct RESPOND_IF_READY from the requester, after a
     689              :  * FINISH could not be processed.
     690              :  * Expected behavior: the responder accepts the request and produces a valid FINISH_RSP
     691              :  * response message.
     692              :  **/
     693              : #if LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP
     694              : 
     695            1 : static void rsp_respond_if_ready_case6(void **state) {
     696              :     libspdm_return_t status;
     697              :     libspdm_test_context_t    *spdm_test_context;
     698              :     libspdm_context_t  *spdm_context;
     699              :     size_t response_size;
     700              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     701              :     spdm_finish_response_t *spdm_response; /*response to the original request (FINISH_RSP)*/
     702              :     void                 *data;
     703              :     size_t data_size;
     704              :     uint8_t                *ptr;
     705              :     uint8_t dummy_buffer[LIBSPDM_MAX_HASH_SIZE];
     706              :     uint8_t                *cert_buffer;
     707              :     size_t cert_buffer_size;
     708              :     uint8_t cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
     709              :     uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
     710              :     uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
     711              :     libspdm_session_info_t    *session_info;
     712              :     uint32_t session_id;
     713              :     uint32_t hash_size;
     714              :     uint32_t hmac_size;
     715              : 
     716            1 :     spdm_test_context = *state;
     717            1 :     spdm_context = spdm_test_context->spdm_context;
     718            1 :     spdm_test_context->case_id = 0x6;
     719            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
     720              : 
     721              :     /*state for the the original request (FINISH)*/
     722            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     723            1 :     spdm_context->local_context.capability.flags = 0;
     724            1 :     spdm_context->connection_info.capability.flags |=
     725              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
     726            1 :     spdm_context->connection_info.capability.flags |=
     727              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
     728            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
     729            1 :     spdm_context->local_context.capability.flags |=
     730              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
     731            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     732            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     733            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     734            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     735              :         m_libspdm_use_measurement_hash_algo;
     736            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
     737            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
     738              : 
     739            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     740              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     741            1 :     libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
     742              :                                                      m_libspdm_use_asym_algo,
     743              :                                                      &data, &data_size,
     744              :                                                      NULL, NULL);
     745            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     746            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     747              : 
     748            1 :     session_id = 0xFFFFFFFF;
     749            1 :     spdm_context->latest_session_id = session_id;
     750            1 :     session_info = &spdm_context->session_info[0];
     751            1 :     libspdm_session_info_init (spdm_context, session_info, session_id,
     752              :                                SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, false);
     753            1 :     session_info->local_used_cert_chain_slot_id = 0;
     754            1 :     hash_size = libspdm_get_hash_size (m_libspdm_use_hash_algo);
     755            1 :     libspdm_set_mem (dummy_buffer, hash_size, (uint8_t)(0xFF));
     756            1 :     libspdm_secured_message_set_request_finished_key (session_info->secured_message_context,
     757              :                                                       dummy_buffer, hash_size);
     758            1 :     libspdm_secured_message_set_session_state (session_info->secured_message_context,
     759              :                                                LIBSPDM_SESSION_STATE_HANDSHAKING);
     760              : 
     761            1 :     hash_size = libspdm_get_hash_size (m_libspdm_use_hash_algo);
     762            1 :     hmac_size = libspdm_get_hash_size (m_libspdm_use_hash_algo);
     763            1 :     ptr = m_libspdm_finish_request.signature;
     764            1 :     libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
     765            1 :     cert_buffer = (uint8_t *)data;
     766            1 :     cert_buffer_size = data_size;
     767            1 :     libspdm_hash_all (m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size, cert_buffer_hash);
     768              :     /* Transcript.MessageA size is 0*/
     769            1 :     libspdm_append_managed_buffer (&th_curr, cert_buffer_hash, hash_size);
     770              :     /* SessionTranscript.MessageK is 0*/
     771            1 :     libspdm_append_managed_buffer (&th_curr, (uint8_t *)&m_libspdm_finish_request,
     772              :                                    sizeof(spdm_finish_request_t));
     773            1 :     libspdm_set_mem (request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
     774            1 :     libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
     775              :                      libspdm_get_managed_buffer_size(&th_curr), hash_data);
     776            1 :     libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
     777              :                      request_finished_key, hash_size, ptr);
     778              : 
     779            1 :     spdm_context->last_spdm_request_size = sizeof(spdm_finish_request_t) + hmac_size;
     780            1 :     libspdm_copy_mem(spdm_context->last_spdm_request,
     781            1 :                      libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
     782              :                      &m_libspdm_finish_request, m_libspdm_finish_request_size);
     783              : 
     784              :     /*RESPOND_IF_READY specific data*/
     785            1 :     spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
     786            1 :     libspdm_copy_mem(spdm_context->cache_spdm_request,
     787            1 :                      libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
     788            1 :                      spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
     789            1 :     spdm_context->error_data.rd_exponent = 1;
     790            1 :     spdm_context->error_data.rd_tm        = 1;
     791            1 :     spdm_context->error_data.request_code = SPDM_FINISH;
     792            1 :     spdm_context->error_data.token       = LIBSPDM_MY_TEST_TOKEN;
     793              : 
     794              :     /*check FINISH_RSP response*/
     795            1 :     response_size = sizeof(response);
     796            1 :     status = libspdm_get_response_respond_if_ready(spdm_context,
     797              :                                                    m_libspdm_respond_if_ready_request6_size,
     798              :                                                    &m_libspdm_respond_if_ready_request6,
     799              :                                                    &response_size,
     800              :                                                    response);
     801            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
     802            1 :     assert_int_equal (response_size, sizeof(spdm_finish_response_t) + hmac_size);
     803            1 :     spdm_response = (void *)response;
     804            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_FINISH_RSP);
     805            1 :     free(data);
     806            1 :     libspdm_free_session_id (spdm_context, (0xFFFFFFFF));
     807            1 : }
     808              : #endif /* LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP*/
     809              : 
     810              : /**
     811              :  * Test 7: receiving a correct RESPOND_IF_READY from the requester, after a
     812              :  * PSK_EXCHANGE could not be processed.
     813              :  * Expected behavior: the responder accepts the request and produces a valid PSK_EXCHANGE_RSP
     814              :  * response message.
     815              :  **/
     816              : #if LIBSPDM_ENABLE_CAPABILITY_PSK_CAP
     817              : 
     818            1 : static void rsp_respond_if_ready_case7(void **state) {
     819              :     libspdm_return_t status;
     820              :     libspdm_test_context_t    *spdm_test_context;
     821              :     libspdm_context_t  *spdm_context;
     822              :     size_t response_size;
     823              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     824              :     spdm_psk_exchange_response_t *spdm_response; /*response to the original request (PSK_EXCHANGE_RSP)*/
     825              :     void                 *data;
     826              :     size_t data_size;
     827              :     uint8_t                *ptr;
     828              :     size_t opaque_psk_exchange_req_size;
     829              : 
     830            1 :     spdm_test_context = *state;
     831            1 :     spdm_context = spdm_test_context->spdm_context;
     832            1 :     spdm_test_context->case_id = 0x7;
     833            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
     834              : 
     835              :     /*state for the the original request (PSK_EXCHANGE)*/
     836            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     837            1 :     spdm_context->local_context.capability.flags = 0;
     838            1 :     spdm_context->connection_info.capability.flags |=
     839              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP |
     840              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
     841            1 :     spdm_context->local_context.capability.flags |=
     842              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP |
     843              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
     844            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     845            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     846            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     847            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     848              :         m_libspdm_use_measurement_hash_algo;
     849            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
     850            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
     851            1 :     spdm_context->connection_info.algorithm.key_schedule = m_libspdm_use_key_schedule_algo;
     852              : 
     853            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     854              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     855            1 :     libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
     856              :                                                      m_libspdm_use_asym_algo,
     857              :                                                      &data, &data_size,
     858              :                                                      NULL, NULL);
     859            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     860            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     861              : 
     862            1 :     m_libspdm_psk_exchange_request.psk_hint_length = (uint16_t)sizeof(LIBSPDM_TEST_PSK_HINT_STRING);
     863            1 :     m_libspdm_psk_exchange_request.requester_context_length = LIBSPDM_PSK_CONTEXT_LENGTH;
     864            1 :     opaque_psk_exchange_req_size =
     865            1 :         libspdm_get_opaque_data_supported_version_data_size (spdm_context);
     866            1 :     m_libspdm_psk_exchange_request.opaque_length = (uint16_t)opaque_psk_exchange_req_size;
     867            1 :     m_libspdm_psk_exchange_request.req_session_id = 0xFFFF;
     868            1 :     ptr = m_libspdm_psk_exchange_request.psk_hint;
     869            1 :     libspdm_copy_mem(ptr, sizeof(m_libspdm_psk_exchange_request.psk_hint),
     870              :                      LIBSPDM_TEST_PSK_HINT_STRING,
     871              :                      sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
     872            1 :     ptr += m_libspdm_psk_exchange_request.psk_hint_length;
     873            1 :     libspdm_get_random_number (LIBSPDM_PSK_CONTEXT_LENGTH, ptr);
     874            1 :     ptr += m_libspdm_psk_exchange_request.requester_context_length;
     875            1 :     libspdm_build_opaque_data_supported_version_data (spdm_context, &opaque_psk_exchange_req_size,
     876              :                                                       ptr);
     877            1 :     ptr += opaque_psk_exchange_req_size;
     878              : 
     879            1 :     spdm_context->last_spdm_request_size = m_libspdm_psk_exchange_request_size;
     880            1 :     libspdm_copy_mem(spdm_context->last_spdm_request,
     881            1 :                      libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
     882              :                      &m_libspdm_psk_exchange_request, m_libspdm_psk_exchange_request_size);
     883              : 
     884              :     /*RESPOND_IF_READY specific data*/
     885            1 :     spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
     886            1 :     libspdm_copy_mem(spdm_context->cache_spdm_request,
     887            1 :                      libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
     888            1 :                      spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
     889            1 :     spdm_context->error_data.rd_exponent = 1;
     890            1 :     spdm_context->error_data.rd_tm        = 1;
     891            1 :     spdm_context->error_data.request_code = SPDM_PSK_EXCHANGE;
     892            1 :     spdm_context->error_data.token       = LIBSPDM_MY_TEST_TOKEN;
     893              : 
     894              :     /*check PSK_EXCHANGE_RSP response*/
     895            1 :     response_size = sizeof(response);
     896            1 :     status = libspdm_get_response_respond_if_ready(spdm_context,
     897              :                                                    m_libspdm_respond_if_ready_request7_size,
     898              :                                                    &m_libspdm_respond_if_ready_request7,
     899              :                                                    &response_size,
     900              :                                                    response);
     901            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
     902            1 :     assert_int_equal (response_size,
     903              :                       sizeof(spdm_psk_exchange_response_t) + LIBSPDM_PSK_CONTEXT_LENGTH +
     904              :                       libspdm_get_opaque_data_version_selection_data_size(
     905              :                           spdm_context) + libspdm_get_hash_size (m_libspdm_use_hash_algo));
     906            1 :     assert_int_equal (libspdm_secured_message_get_session_state (spdm_context->session_info[0].
     907              :                                                                  secured_message_context),
     908              :                       LIBSPDM_SESSION_STATE_HANDSHAKING);
     909            1 :     spdm_response = (void *)response;
     910            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_PSK_EXCHANGE_RSP);
     911            1 :     assert_int_equal (spdm_response->rsp_session_id, 0xFFFF);
     912            1 :     free(data);
     913            1 :     libspdm_free_session_id (spdm_context, (0xFFFFFFFF));
     914            1 : }
     915              : #endif /* LIBSPDM_ENABLE_CAPABILITY_PSK_CAP*/
     916              : 
     917              : /**
     918              :  * Test 8: receiving a correct RESPOND_IF_READY from the requester, after a
     919              :  * PSK_FINISH could not be processed.
     920              :  * Expected behavior: the responder accepts the request and produces a valid PSK_FINISH_RSP
     921              :  * response message.
     922              :  **/
     923              : #if LIBSPDM_ENABLE_CAPABILITY_PSK_CAP
     924            1 : static void rsp_respond_if_ready_case8(void **state) {
     925              :     libspdm_return_t status;
     926              :     libspdm_test_context_t    *spdm_test_context;
     927              :     libspdm_context_t  *spdm_context;
     928              :     size_t response_size;
     929              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     930              :     spdm_psk_finish_response_t *spdm_response; /*response to the original request (FINISH_PSK_RSP)*/
     931              :     void                 *data;
     932              :     size_t data_size;
     933              :     uint8_t                *ptr;
     934              :     uint8_t dummy_buffer[LIBSPDM_MAX_HASH_SIZE];
     935              :     uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
     936              :     uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
     937              :     libspdm_session_info_t    *session_info;
     938              :     uint32_t session_id;
     939              :     uint32_t hash_size;
     940              :     uint32_t hmac_size;
     941              : 
     942            1 :     spdm_test_context = *state;
     943            1 :     spdm_context = spdm_test_context->spdm_context;
     944            1 :     spdm_test_context->case_id = 0x8;
     945            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
     946              : 
     947              :     /*state for the the original request (PSK_FINISH)*/
     948            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     949            1 :     spdm_context->local_context.capability.flags = 0;
     950            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
     951            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
     952            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
     953            1 :     spdm_context->local_context.capability.flags |=
     954              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
     955            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     956            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     957            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     958            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     959              :         m_libspdm_use_measurement_hash_algo;
     960            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
     961            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
     962              : 
     963            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     964              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     965            1 :     libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
     966              :                                                      m_libspdm_use_asym_algo,
     967              :                                                      &data, &data_size,
     968              :                                                      NULL, NULL);
     969            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     970            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     971              : 
     972            1 :     session_id = 0xFFFFFFFF;
     973            1 :     spdm_context->latest_session_id = session_id;
     974            1 :     spdm_context->last_spdm_request_session_id_valid = true;
     975            1 :     spdm_context->last_spdm_request_session_id = session_id;
     976            1 :     session_info = &spdm_context->session_info[0];
     977            1 :     libspdm_session_info_init (spdm_context, session_info, session_id,
     978              :                                SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     979            1 :     libspdm_session_info_set_psk_hint(session_info,
     980              :                                       LIBSPDM_TEST_PSK_HINT_STRING,
     981              :                                       sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
     982            1 :     hash_size = libspdm_get_hash_size (m_libspdm_use_hash_algo);
     983            1 :     libspdm_set_mem (dummy_buffer, hash_size, (uint8_t)(0xFF));
     984            1 :     libspdm_secured_message_set_request_finished_key (session_info->secured_message_context,
     985              :                                                       dummy_buffer, hash_size);
     986            1 :     libspdm_secured_message_set_session_state (session_info->secured_message_context,
     987              :                                                LIBSPDM_SESSION_STATE_HANDSHAKING);
     988              : 
     989            1 :     hash_size = libspdm_get_hash_size (m_libspdm_use_hash_algo);
     990            1 :     hmac_size = libspdm_get_hash_size (m_libspdm_use_hash_algo);
     991            1 :     ptr = m_libspdm_psk_finish_request.verify_data;
     992            1 :     libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
     993              :     /* Transcript.MessageA size is 0
     994              :      * SessionTranscript.MessageK is 0*/
     995            1 :     libspdm_append_managed_buffer (&th_curr, (uint8_t *)&m_libspdm_psk_finish_request,
     996              :                                    sizeof(spdm_psk_finish_request_t));
     997            1 :     libspdm_set_mem (request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
     998            1 :     libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
     999              :                      libspdm_get_managed_buffer_size(&th_curr), hash_data);
    1000            1 :     libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
    1001              :                      request_finished_key, hash_size, ptr);
    1002              : 
    1003            1 :     spdm_context->last_spdm_request_size = sizeof(spdm_psk_finish_request_t) + hmac_size;
    1004            1 :     libspdm_copy_mem(spdm_context->last_spdm_request,
    1005            1 :                      libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
    1006              :                      &m_libspdm_psk_finish_request, m_libspdm_psk_finish_request_size);
    1007              : 
    1008              :     /*RESPOND_IF_READY specific data*/
    1009            1 :     spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
    1010            1 :     libspdm_copy_mem(spdm_context->cache_spdm_request,
    1011            1 :                      libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
    1012            1 :                      spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
    1013            1 :     spdm_context->error_data.rd_exponent = 1;
    1014            1 :     spdm_context->error_data.rd_tm        = 1;
    1015            1 :     spdm_context->error_data.request_code = SPDM_PSK_FINISH;
    1016            1 :     spdm_context->error_data.token       = LIBSPDM_MY_TEST_TOKEN;
    1017              : 
    1018              :     /*check FINISH_PSK_RSP response*/
    1019            1 :     response_size = sizeof(response);
    1020            1 :     status = libspdm_get_response_respond_if_ready(spdm_context,
    1021              :                                                    m_libspdm_respond_if_ready_request8_size,
    1022              :                                                    &m_libspdm_respond_if_ready_request8,
    1023              :                                                    &response_size,
    1024              :                                                    response);
    1025            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
    1026            1 :     assert_int_equal (response_size, sizeof(spdm_psk_finish_response_t));
    1027            1 :     spdm_response = (void *)response;
    1028            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_PSK_FINISH_RSP);
    1029            1 :     free(data);
    1030            1 :     libspdm_free_session_id (spdm_context, (0xFFFFFFFF));
    1031            1 : }
    1032              : #endif /* LIBSPDM_ENABLE_CAPABILITY_PSK_CAP*/
    1033              : 
    1034              : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
    1035              : 
    1036              : /**
    1037              :  * Test 9:
    1038              :  * Expected behavior:
    1039              :  **/
    1040            1 : static void rsp_respond_if_ready_case9(void **state) {
    1041            1 : }
    1042              : 
    1043              : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
    1044              : 
    1045              : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
    1046              : /**
    1047              :  * Test 10: receiving a correct RESPOND_IF_READY from the requester, but the responder is in
    1048              :  * a Busy state.
    1049              :  * Expected behavior: the responder accepts the request, but produces an ERROR message
    1050              :  * indicating the Busy state.
    1051              :  **/
    1052            1 : static void rsp_respond_if_ready_case10(void **state) {
    1053              :     libspdm_return_t status;
    1054              :     libspdm_test_context_t    *spdm_test_context;
    1055              :     libspdm_context_t  *spdm_context;
    1056              :     size_t response_size;
    1057              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1058              :     spdm_digest_response_t *spdm_response; /*response to the original request (DIGESTS)*/
    1059              : 
    1060            1 :     spdm_test_context = *state;
    1061            1 :     spdm_context = spdm_test_context->spdm_context;
    1062            1 :     spdm_test_context->case_id = 0xA;
    1063            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_BUSY;
    1064              : 
    1065              :     /*state for the the original request (GET_DIGESTS)*/
    1066            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1067            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
    1068            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1069            1 :     spdm_context->local_context.local_cert_chain_provision[0] = m_libspdm_local_certificate_chain;
    1070            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
    1071              :         sizeof(m_libspdm_local_certificate_chain);
    1072            1 :     libspdm_set_mem (m_libspdm_local_certificate_chain, sizeof(m_libspdm_local_certificate_chain),
    1073              :                      (uint8_t)(0xFF));
    1074              : 
    1075            1 :     spdm_context->last_spdm_request_size = m_libspdm_get_digest_request_size;
    1076            1 :     libspdm_copy_mem(spdm_context->last_spdm_request,
    1077            1 :                      libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
    1078              :                      &m_libspdm_get_digest_request, m_libspdm_get_digest_request_size);
    1079              : 
    1080              :     /*RESPOND_IF_READY specific data*/
    1081            1 :     spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
    1082            1 :     libspdm_copy_mem(spdm_context->cache_spdm_request,
    1083            1 :                      libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
    1084            1 :                      spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
    1085            1 :     spdm_context->error_data.rd_exponent = 1;
    1086            1 :     spdm_context->error_data.rd_tm        = 1;
    1087            1 :     spdm_context->error_data.request_code = SPDM_GET_DIGESTS;
    1088            1 :     spdm_context->error_data.token       = LIBSPDM_MY_TEST_TOKEN;
    1089              : 
    1090              :     /*check ERROR response*/
    1091            1 :     response_size = sizeof(response);
    1092            1 :     status = libspdm_get_response_respond_if_ready(spdm_context,
    1093              :                                                    m_libspdm_respond_if_ready_request1_size,
    1094              :                                                    &m_libspdm_respond_if_ready_request1,
    1095              :                                                    &response_size,
    1096              :                                                    response);
    1097            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
    1098            1 :     assert_int_equal (response_size, sizeof(spdm_error_response_t));
    1099            1 :     spdm_response = (void *)response;
    1100            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_ERROR);
    1101            1 :     assert_int_equal (spdm_response->header.param1, SPDM_ERROR_CODE_BUSY);
    1102            1 :     assert_int_equal (spdm_response->header.param2, 0);
    1103            1 :     assert_int_equal (spdm_context->response_state, LIBSPDM_RESPONSE_STATE_BUSY);
    1104            1 : }
    1105              : 
    1106              : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
    1107              : 
    1108              : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
    1109              : /**
    1110              :  * Test 11: receiving a correct RESPOND_IF_READY from the requester, but the responder requires
    1111              :  * resynchronization with the requester.
    1112              :  * Expected behavior: the responder accepts the request, but produces an ERROR message
    1113              :  * indicating the NeedResynch state.
    1114              :  **/
    1115            1 : static void rsp_respond_if_ready_case11(void **state) {
    1116              :     libspdm_return_t status;
    1117              :     libspdm_test_context_t    *spdm_test_context;
    1118              :     libspdm_context_t  *spdm_context;
    1119              :     size_t response_size;
    1120              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1121              :     spdm_digest_response_t *spdm_response; /*response to the original request (DIGESTS)*/
    1122              : 
    1123            1 :     spdm_test_context = *state;
    1124            1 :     spdm_context = spdm_test_context->spdm_context;
    1125            1 :     spdm_test_context->case_id = 0xB;
    1126            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NEED_RESYNC;
    1127              : 
    1128              :     /*state for the the original request (GET_DIGESTS)*/
    1129            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1130            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
    1131            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1132            1 :     spdm_context->local_context.local_cert_chain_provision[0] = m_libspdm_local_certificate_chain;
    1133            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
    1134              :         sizeof(m_libspdm_local_certificate_chain);
    1135            1 :     libspdm_set_mem (m_libspdm_local_certificate_chain, sizeof(m_libspdm_local_certificate_chain),
    1136              :                      (uint8_t)(0xFF));
    1137              : 
    1138            1 :     spdm_context->last_spdm_request_size = m_libspdm_get_digest_request_size;
    1139            1 :     libspdm_copy_mem(spdm_context->last_spdm_request,
    1140            1 :                      libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
    1141              :                      &m_libspdm_get_digest_request, m_libspdm_get_digest_request_size);
    1142              : 
    1143              :     /*RESPOND_IF_READY specific data*/
    1144            1 :     spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
    1145            1 :     libspdm_copy_mem(spdm_context->cache_spdm_request,
    1146            1 :                      libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
    1147            1 :                      spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
    1148            1 :     spdm_context->error_data.rd_exponent = 1;
    1149            1 :     spdm_context->error_data.rd_tm        = 1;
    1150            1 :     spdm_context->error_data.request_code = SPDM_GET_DIGESTS;
    1151            1 :     spdm_context->error_data.token       = LIBSPDM_MY_TEST_TOKEN;
    1152              : 
    1153              :     /*check ERROR response*/
    1154            1 :     response_size = sizeof(response);
    1155            1 :     status = libspdm_get_response_respond_if_ready(spdm_context,
    1156              :                                                    m_libspdm_respond_if_ready_request1_size,
    1157              :                                                    &m_libspdm_respond_if_ready_request1,
    1158              :                                                    &response_size,
    1159              :                                                    response);
    1160            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
    1161            1 :     assert_int_equal (response_size, sizeof(spdm_error_response_t));
    1162            1 :     spdm_response = (void *)response;
    1163            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_ERROR);
    1164            1 :     assert_int_equal (spdm_response->header.param1, SPDM_ERROR_CODE_REQUEST_RESYNCH);
    1165            1 :     assert_int_equal (spdm_response->header.param2, 0);
    1166            1 :     assert_int_equal (spdm_context->response_state, LIBSPDM_RESPONSE_STATE_NEED_RESYNC);
    1167            1 : }
    1168              : 
    1169              : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
    1170              : 
    1171              : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
    1172              : 
    1173              : /**
    1174              :  * Test 12: receiving a correct RESPOND_IF_READY from the requester, but the responder could not
    1175              :  * produce the response in time.
    1176              :  * Expected behavior: the responder accepts the request, but produces an ERROR message
    1177              :  * indicating the ResponseNotReady state, with the same token as the request.
    1178              :  **/
    1179            1 : static void rsp_respond_if_ready_case12(void **state) {
    1180              :     libspdm_return_t status;
    1181              :     libspdm_test_context_t    *spdm_test_context;
    1182              :     libspdm_context_t  *spdm_context;
    1183              :     size_t response_size;
    1184              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1185              :     spdm_digest_response_t *spdm_response; /*response to the original request (DIGESTS)*/
    1186              :     spdm_error_data_response_not_ready_t *error_data;
    1187              : 
    1188            1 :     spdm_test_context = *state;
    1189            1 :     spdm_context = spdm_test_context->spdm_context;
    1190            1 :     spdm_test_context->case_id = 0xC;
    1191            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NOT_READY;
    1192              : 
    1193              :     /*state for the the original request (GET_DIGESTS)*/
    1194            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1195            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
    1196            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1197            1 :     spdm_context->local_context.local_cert_chain_provision[0] = m_libspdm_local_certificate_chain;
    1198            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
    1199              :         sizeof(m_libspdm_local_certificate_chain);
    1200            1 :     libspdm_set_mem (m_libspdm_local_certificate_chain, sizeof(m_libspdm_local_certificate_chain),
    1201              :                      (uint8_t)(0xFF));
    1202              : 
    1203            1 :     spdm_context->last_spdm_request_size = m_libspdm_get_digest_request_size;
    1204            1 :     libspdm_copy_mem(spdm_context->last_spdm_request,
    1205            1 :                      libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
    1206              :                      &m_libspdm_get_digest_request, m_libspdm_get_digest_request_size);
    1207              : 
    1208              :     /*RESPOND_IF_READY specific data*/
    1209            1 :     spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
    1210            1 :     libspdm_copy_mem(spdm_context->cache_spdm_request,
    1211            1 :                      libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
    1212            1 :                      spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
    1213            1 :     spdm_context->error_data.rd_exponent = 1;
    1214            1 :     spdm_context->error_data.rd_tm        = 1;
    1215            1 :     spdm_context->error_data.request_code = SPDM_GET_DIGESTS;
    1216            1 :     spdm_context->error_data.token       = LIBSPDM_MY_TEST_TOKEN;
    1217              : 
    1218              :     /*check ERROR response*/
    1219            1 :     response_size = sizeof(response);
    1220            1 :     status = libspdm_get_response_respond_if_ready(spdm_context,
    1221              :                                                    m_libspdm_respond_if_ready_request1_size,
    1222              :                                                    &m_libspdm_respond_if_ready_request1,
    1223              :                                                    &response_size,
    1224              :                                                    response);
    1225            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
    1226            1 :     assert_int_equal (response_size,
    1227              :                       sizeof(spdm_error_response_t) + sizeof(spdm_error_data_response_not_ready_t));
    1228            1 :     spdm_response = (void *)response;
    1229            1 :     error_data = (spdm_error_data_response_not_ready_t*)(spdm_response + 1);
    1230            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_ERROR);
    1231            1 :     assert_int_equal (spdm_response->header.param1, SPDM_ERROR_CODE_RESPONSE_NOT_READY);
    1232            1 :     assert_int_equal (spdm_response->header.param2, 0);
    1233            1 :     assert_int_equal (spdm_context->response_state, LIBSPDM_RESPONSE_STATE_NOT_READY);
    1234            1 :     assert_int_equal (error_data->request_code, SPDM_GET_DIGESTS);
    1235            1 :     assert_int_equal (error_data->token, LIBSPDM_MY_TEST_TOKEN);
    1236            1 : }
    1237              : 
    1238              : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
    1239              : 
    1240              : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
    1241              : 
    1242              : /**
    1243              :  * Test 13: receiving a correct RESPOND_IF_READY from the requester, with the correct original
    1244              :  * request code, but with a token different from the expected.
    1245              :  * Expected behavior: the responder refuses the RESPOND_IF_READY message and produces an
    1246              :  * ERROR message indicating the InvalidRequest.
    1247              :  **/
    1248            1 : static void rsp_respond_if_ready_case13(void **state) {
    1249              :     libspdm_return_t status;
    1250              :     libspdm_test_context_t    *spdm_test_context;
    1251              :     libspdm_context_t  *spdm_context;
    1252              :     size_t response_size;
    1253              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1254              :     spdm_digest_response_t *spdm_response; /*response to the original request (DIGESTS)*/
    1255              : 
    1256            1 :     spdm_test_context = *state;
    1257            1 :     spdm_context = spdm_test_context->spdm_context;
    1258            1 :     spdm_test_context->case_id = 0xD;
    1259            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
    1260              : 
    1261              :     /*state for the the original request (GET_DIGESTS)*/
    1262            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1263            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
    1264            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1265            1 :     spdm_context->local_context.local_cert_chain_provision[0] = m_libspdm_local_certificate_chain;
    1266            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
    1267              :         sizeof(m_libspdm_local_certificate_chain);
    1268            1 :     libspdm_set_mem (m_libspdm_local_certificate_chain, sizeof(m_libspdm_local_certificate_chain),
    1269              :                      (uint8_t)(0xFF));
    1270              : 
    1271            1 :     spdm_context->last_spdm_request_size = m_libspdm_get_digest_request_size;
    1272            1 :     libspdm_copy_mem(spdm_context->last_spdm_request,
    1273            1 :                      libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
    1274              :                      &m_libspdm_get_digest_request, m_libspdm_get_digest_request_size);
    1275              : 
    1276              :     /*RESPOND_IF_READY specific data*/
    1277            1 :     spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
    1278            1 :     libspdm_copy_mem(spdm_context->cache_spdm_request,
    1279            1 :                      libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
    1280            1 :                      spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
    1281            1 :     spdm_context->error_data.rd_exponent = 1;
    1282            1 :     spdm_context->error_data.rd_tm        = 1;
    1283            1 :     spdm_context->error_data.request_code = SPDM_GET_DIGESTS;
    1284            1 :     spdm_context->error_data.token       = LIBSPDM_MY_TEST_TOKEN;
    1285              : 
    1286              :     /*check ERROR response*/
    1287            1 :     response_size = sizeof(response);
    1288            1 :     status = libspdm_get_response_respond_if_ready(spdm_context,
    1289              :                                                    m_libspdm_respond_if_ready_request10_size,
    1290              :                                                    &m_libspdm_respond_if_ready_request10,
    1291              :                                                    &response_size,
    1292              :                                                    response);
    1293            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
    1294            1 :     assert_int_equal (response_size, sizeof(spdm_error_response_t));
    1295            1 :     spdm_response = (void *)response;
    1296            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_ERROR);
    1297            1 :     assert_int_equal (spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1298            1 :     assert_int_equal (spdm_response->header.param2, 0);
    1299            1 : }
    1300              : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
    1301              : 
    1302              : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
    1303              : /**
    1304              :  * Test 14: receiving a correct RESPOND_IF_READY from the requester, with the correct token,
    1305              :  * but with a request code different from the expected.
    1306              :  * Expected behavior: the responder refuses the RESPOND_IF_READY message and produces an
    1307              :  * ERROR message indicating the InvalidRequest.
    1308              :  **/
    1309            1 : static void rsp_respond_if_ready_case14(void **state) {
    1310              :     libspdm_return_t status;
    1311              :     libspdm_test_context_t    *spdm_test_context;
    1312              :     libspdm_context_t  *spdm_context;
    1313              :     size_t response_size;
    1314              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1315              :     spdm_digest_response_t *spdm_response; /*response to the original request (DIGESTS)*/
    1316              : 
    1317            1 :     spdm_test_context = *state;
    1318            1 :     spdm_context = spdm_test_context->spdm_context;
    1319            1 :     spdm_test_context->case_id = 0xE;
    1320            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
    1321              : 
    1322              :     /*state for the the original request (GET_DIGESTS)*/
    1323            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1324            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
    1325            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1326            1 :     spdm_context->local_context.local_cert_chain_provision[0] = m_libspdm_local_certificate_chain;
    1327            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
    1328              :         sizeof(m_libspdm_local_certificate_chain);
    1329            1 :     libspdm_set_mem (m_libspdm_local_certificate_chain, sizeof(m_libspdm_local_certificate_chain),
    1330              :                      (uint8_t)(0xFF));
    1331              : 
    1332            1 :     spdm_context->last_spdm_request_size = m_libspdm_get_digest_request_size;
    1333            1 :     libspdm_copy_mem(spdm_context->last_spdm_request,
    1334            1 :                      libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
    1335              :                      &m_libspdm_get_digest_request, m_libspdm_get_digest_request_size);
    1336              : 
    1337              :     /*RESPOND_IF_READY specific data*/
    1338            1 :     spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
    1339            1 :     libspdm_copy_mem(spdm_context->cache_spdm_request,
    1340            1 :                      libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
    1341            1 :                      spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
    1342            1 :     spdm_context->error_data.rd_exponent = 1;
    1343            1 :     spdm_context->error_data.rd_tm        = 1;
    1344            1 :     spdm_context->error_data.request_code = SPDM_GET_DIGESTS;
    1345            1 :     spdm_context->error_data.token       = LIBSPDM_MY_TEST_TOKEN;
    1346              : 
    1347              :     /*check ERROR response*/
    1348            1 :     response_size = sizeof(response);
    1349            1 :     status = libspdm_get_response_respond_if_ready(spdm_context,
    1350              :                                                    m_libspdm_respond_if_ready_request11_size,
    1351              :                                                    &m_libspdm_respond_if_ready_request11,
    1352              :                                                    &response_size,
    1353              :                                                    response);
    1354            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
    1355            1 :     assert_int_equal (response_size, sizeof(spdm_error_response_t));
    1356            1 :     spdm_response = (void *)response;
    1357            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_ERROR);
    1358            1 :     assert_int_equal (spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1359            1 :     assert_int_equal (spdm_response->header.param2, 0);
    1360            1 : }
    1361              : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
    1362              : 
    1363            1 : int libspdm_rsp_respond_if_ready_test(void) {
    1364            1 :     const struct CMUnitTest test_cases[] = {
    1365              :         /* Success Case*/
    1366              :     #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
    1367              :         cmocka_unit_test(rsp_respond_if_ready_case1),
    1368              :         cmocka_unit_test(rsp_respond_if_ready_case2),
    1369              :     #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
    1370              : 
    1371              :     #if LIBSPDM_ENABLE_CAPABILITY_CHAL_CAP
    1372              :         cmocka_unit_test(rsp_respond_if_ready_case3),
    1373              :     #endif /* LIBSPDM_ENABLE_CAPABILITY_CHAL_CAP*/
    1374              : 
    1375              :     #if LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP
    1376              :         cmocka_unit_test(rsp_respond_if_ready_case4),
    1377              :     #endif /* LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP*/
    1378              : 
    1379              :     #if LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP
    1380              :         cmocka_unit_test(rsp_respond_if_ready_case5),
    1381              :         cmocka_unit_test(rsp_respond_if_ready_case6),
    1382              :     #endif /* LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP*/
    1383              : 
    1384              :     #if LIBSPDM_ENABLE_CAPABILITY_PSK_CAP
    1385              :         cmocka_unit_test(rsp_respond_if_ready_case7),
    1386              :         cmocka_unit_test(rsp_respond_if_ready_case8),
    1387              :     #endif /* LIBSPDM_ENABLE_CAPABILITY_PSK_CAP*/
    1388              : 
    1389              :     #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
    1390              :         cmocka_unit_test(rsp_respond_if_ready_case9),
    1391              :         cmocka_unit_test(rsp_respond_if_ready_case10),
    1392              :         cmocka_unit_test(rsp_respond_if_ready_case11),
    1393              :         cmocka_unit_test(rsp_respond_if_ready_case12),
    1394              :         cmocka_unit_test(rsp_respond_if_ready_case13),
    1395              :         cmocka_unit_test(rsp_respond_if_ready_case14),
    1396              :     #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
    1397              : 
    1398              :     };
    1399              : 
    1400            1 :     libspdm_test_context_t test_context = {
    1401              :         LIBSPDM_TEST_CONTEXT_VERSION,
    1402              :         false,
    1403              :     };
    1404              : 
    1405            1 :     libspdm_setup_test_context (&test_context);
    1406              : 
    1407            1 :     return cmocka_run_group_tests(test_cases,
    1408              :                                   libspdm_unit_test_group_setup,
    1409              :                                   libspdm_unit_test_group_teardown);
    1410              : }
    1411              : #endif /* LIBSPDM_ENABLE_CAPABILITY_*_CAP */
    1412              : #endif /* LIBSPDM_RESPOND_IF_READY_SUPPORT */
        

Generated by: LCOV version 2.0-1