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: 2025-12-21 08:10:27 Functions: 100.0 % 16 16

            Line data    Source code
       1              : /**
       2              :  *  Copyright Notice:
       3              :  *  Copyright 2021-2025 DMTF. All rights reserved.
       4              :  *  License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
       5              :  **/
       6              : 
       7              : #include "spdm_unit_test.h"
       8              : #include "internal/libspdm_responder_lib.h"
       9              : #include "internal/libspdm_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 (
     494              :                           m_libspdm_use_asym_algo));
     495            1 :     spdm_response = (void *)response;
     496            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_CHALLENGE_AUTH);
     497            1 :     assert_int_equal (spdm_response->header.param1, 0);
     498            1 :     assert_int_equal (spdm_response->header.param2, 1 << 0);
     499            1 :     free(data);
     500            1 : }
     501              : #endif /* LIBSPDM_ENABLE_CAPABILITY_CHAL_CAP*/
     502              : 
     503              : /**
     504              :  * Test 4: receiving a correct RESPOND_IF_READY from the requester, after a
     505              :  * GET_MEASUREMENTS could not be processed.
     506              :  * Expected behavior: the responder accepts the request and produces a valid MEASUREMENTS
     507              :  * response message.
     508              :  **/
     509              : 
     510              : #if LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP
     511              : 
     512              : extern size_t libspdm_secret_lib_meas_opaque_data_size;
     513              : 
     514            1 : static void rsp_respond_if_ready_case4(void **state) {
     515              :     libspdm_return_t status;
     516              :     libspdm_test_context_t    *spdm_test_context;
     517              :     libspdm_context_t  *spdm_context;
     518              :     size_t response_size;
     519              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     520              :     spdm_measurements_response_t *spdm_response; /*response to the original request (MEASUREMENTS)*/
     521              : 
     522            1 :     spdm_test_context = *state;
     523            1 :     spdm_context = spdm_test_context->spdm_context;
     524            1 :     spdm_test_context->case_id = 0x4;
     525            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
     526              : 
     527              :     /*state for the the original request (GET_MEASUREMENTS)*/
     528            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     529            1 :     spdm_context->local_context.capability.flags = 0;
     530            1 :     spdm_context->local_context.capability.flags |=
     531              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
     532            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     533            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     534            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     535            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     536              :         m_libspdm_use_measurement_hash_algo;
     537              : 
     538            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     539              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     540            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
     541              : 
     542            1 :     spdm_context->last_spdm_request_size = m_libspdm_get_measurements_request_size;
     543            1 :     libspdm_copy_mem(spdm_context->last_spdm_request,
     544            1 :                      libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
     545              :                      &m_libspdm_get_measurements_request, m_libspdm_get_measurements_request_size);
     546              : 
     547              :     /*RESPOND_IF_READY specific data*/
     548            1 :     spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
     549            1 :     libspdm_copy_mem(spdm_context->cache_spdm_request,
     550            1 :                      libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
     551            1 :                      spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
     552            1 :     spdm_context->error_data.rd_exponent = 1;
     553            1 :     spdm_context->error_data.rd_tm        = 1;
     554            1 :     spdm_context->error_data.request_code = SPDM_GET_MEASUREMENTS;
     555            1 :     spdm_context->error_data.token       = LIBSPDM_MY_TEST_TOKEN;
     556              : 
     557              :     /*check MEASUREMENT response*/
     558            1 :     response_size = sizeof(response);
     559            1 :     libspdm_get_random_number (SPDM_NONCE_SIZE, m_libspdm_get_measurements_request.nonce);
     560            1 :     status = libspdm_get_response_respond_if_ready(spdm_context,
     561              :                                                    m_libspdm_respond_if_ready_request4_size,
     562              :                                                    &m_libspdm_respond_if_ready_request4,
     563              :                                                    &response_size,
     564              :                                                    response);
     565            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
     566            1 :     assert_int_equal (response_size,
     567              :                       sizeof(spdm_measurements_response_t) + sizeof(uint16_t) + SPDM_NONCE_SIZE);
     568            1 :     spdm_response = (void *)response;
     569            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_MEASUREMENTS);
     570            1 :     assert_int_equal (spdm_response->header.param1, LIBSPDM_MEASUREMENT_BLOCK_NUMBER);
     571            1 : }
     572              : 
     573              : #endif /* LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP*/
     574              : 
     575              : /**
     576              :  * Test 5: receiving a correct RESPOND_IF_READY from the requester, after a
     577              :  * KEY_EXCHANGE could not be processed.
     578              :  * Expected behavior: the responder accepts the request and produces a valid KEY_EXCHANGE_RSP
     579              :  * response message.
     580              :  **/
     581              : #if LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP
     582              : 
     583            1 : static void rsp_respond_if_ready_case5(void **state) {
     584              :     libspdm_return_t status;
     585              :     libspdm_test_context_t    *spdm_test_context;
     586              :     libspdm_context_t  *spdm_context;
     587              :     size_t response_size;
     588              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     589              :     spdm_key_exchange_response_t *spdm_response; /*response to the original request (KEY_EXCHANGE_RSP)*/
     590              :     void                 *data;
     591              :     size_t data_size;
     592              :     uint8_t                *ptr;
     593              :     size_t dhe_key_size;
     594              :     void                 *dhe_context;
     595              :     size_t opaque_key_exchange_req_size;
     596              : 
     597            1 :     spdm_test_context = *state;
     598            1 :     spdm_context = spdm_test_context->spdm_context;
     599            1 :     spdm_test_context->case_id = 0x5;
     600            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
     601              : 
     602              :     /*state for the the original request (KEY_EXCHANGE)*/
     603            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     604            1 :     spdm_context->connection_info.capability.flags |=
     605              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP |
     606              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
     607            1 :     spdm_context->local_context.capability.flags =
     608              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP |
     609              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP |
     610              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
     611            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     612            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     613            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     614            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     615              :         m_libspdm_use_measurement_hash_algo;
     616            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
     617            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
     618              : 
     619            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     620              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     621            1 :     libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
     622              :                                                      m_libspdm_use_asym_algo,
     623              :                                                      &data, &data_size,
     624              :                                                      NULL, NULL);
     625            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     626            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     627              : 
     628            1 :     m_libspdm_key_exchange_request.req_session_id = 0xFFFF;
     629            1 :     m_libspdm_key_exchange_request.reserved = 0;
     630            1 :     ptr = m_libspdm_key_exchange_request.random_data;
     631            1 :     libspdm_get_random_number (SPDM_RANDOM_DATA_SIZE, ptr);
     632            1 :     ptr += SPDM_RANDOM_DATA_SIZE;
     633            1 :     dhe_key_size = libspdm_get_dhe_pub_key_size (m_libspdm_use_dhe_algo);
     634            1 :     dhe_context = libspdm_dhe_new (spdm_context->connection_info.version, m_libspdm_use_dhe_algo,
     635              :                                    false);
     636            1 :     libspdm_dhe_generate_key (m_libspdm_use_dhe_algo, dhe_context, ptr, &dhe_key_size);
     637            1 :     ptr += dhe_key_size;
     638            1 :     libspdm_dhe_free (m_libspdm_use_dhe_algo, dhe_context);
     639            1 :     opaque_key_exchange_req_size =
     640            1 :         libspdm_get_opaque_data_supported_version_data_size (spdm_context);
     641            1 :     *(uint16_t *)ptr = (uint16_t)opaque_key_exchange_req_size;
     642            1 :     ptr += sizeof(uint16_t);
     643            1 :     libspdm_build_opaque_data_supported_version_data (spdm_context, &opaque_key_exchange_req_size,
     644              :                                                       ptr);
     645            1 :     ptr += opaque_key_exchange_req_size;
     646              : 
     647            1 :     spdm_context->last_spdm_request_size = m_libspdm_key_exchange_request_size;
     648            1 :     libspdm_copy_mem(spdm_context->last_spdm_request,
     649            1 :                      libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
     650              :                      &m_libspdm_key_exchange_request, m_libspdm_key_exchange_request_size);
     651              : 
     652              :     /*RESPOND_IF_READY specific data*/
     653            1 :     spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
     654            1 :     libspdm_copy_mem(spdm_context->cache_spdm_request,
     655            1 :                      libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
     656            1 :                      spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
     657            1 :     spdm_context->error_data.rd_exponent = 1;
     658            1 :     spdm_context->error_data.rd_tm        = 1;
     659            1 :     spdm_context->error_data.request_code = SPDM_KEY_EXCHANGE;
     660            1 :     spdm_context->error_data.token       = LIBSPDM_MY_TEST_TOKEN;
     661              : 
     662              :     /*check KEY_EXCHANGE_RSP response*/
     663            1 :     response_size = sizeof(response);
     664            1 :     status = libspdm_get_response_respond_if_ready(spdm_context,
     665              :                                                    m_libspdm_respond_if_ready_request5_size,
     666              :                                                    &m_libspdm_respond_if_ready_request5,
     667              :                                                    &response_size,
     668              :                                                    response);
     669            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
     670            1 :     assert_int_equal (response_size,
     671              :                       sizeof(spdm_key_exchange_response_t) + dhe_key_size + 2 +
     672              :                       libspdm_get_opaque_data_version_selection_data_size(
     673              :                           spdm_context) + libspdm_get_asym_signature_size (
     674              :                           m_libspdm_use_asym_algo) +
     675              :                       libspdm_get_hash_size (m_libspdm_use_hash_algo));
     676            1 :     assert_int_equal (libspdm_secured_message_get_session_state (spdm_context->session_info[0].
     677              :                                                                  secured_message_context),
     678              :                       LIBSPDM_SESSION_STATE_HANDSHAKING);
     679            1 :     spdm_response = (void *)response;
     680            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_KEY_EXCHANGE_RSP);
     681            1 :     assert_int_equal (spdm_response->rsp_session_id, 0xFFFF);
     682            1 :     free(data);
     683            1 :     libspdm_free_session_id (spdm_context, (0xFFFFFFFF));
     684            1 : }
     685              : 
     686              : #endif /* LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP*/
     687              : 
     688              : /**
     689              :  * Test 6: receiving a correct RESPOND_IF_READY from the requester, after a
     690              :  * FINISH could not be processed.
     691              :  * Expected behavior: the responder accepts the request and produces a valid FINISH_RSP
     692              :  * response message.
     693              :  **/
     694              : #if LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP
     695              : 
     696            1 : static void rsp_respond_if_ready_case6(void **state) {
     697              :     libspdm_return_t status;
     698              :     libspdm_test_context_t    *spdm_test_context;
     699              :     libspdm_context_t  *spdm_context;
     700              :     size_t response_size;
     701              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     702              :     spdm_finish_response_t *spdm_response; /*response to the original request (FINISH_RSP)*/
     703              :     void                 *data;
     704              :     size_t data_size;
     705              :     uint8_t                *ptr;
     706              :     uint8_t dummy_buffer[LIBSPDM_MAX_HASH_SIZE];
     707              :     uint8_t                *cert_buffer;
     708              :     size_t cert_buffer_size;
     709              :     uint8_t cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
     710              :     uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
     711              :     uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
     712              :     libspdm_session_info_t    *session_info;
     713              :     uint32_t session_id;
     714              :     uint32_t hash_size;
     715              :     uint32_t hmac_size;
     716              : 
     717            1 :     spdm_test_context = *state;
     718            1 :     spdm_context = spdm_test_context->spdm_context;
     719            1 :     spdm_test_context->case_id = 0x6;
     720            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
     721              : 
     722              :     /*state for the the original request (FINISH)*/
     723            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     724            1 :     spdm_context->local_context.capability.flags = 0;
     725            1 :     spdm_context->connection_info.capability.flags |=
     726              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
     727            1 :     spdm_context->connection_info.capability.flags |=
     728              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
     729            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
     730            1 :     spdm_context->local_context.capability.flags |=
     731              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
     732            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     733            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     734            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     735            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     736              :         m_libspdm_use_measurement_hash_algo;
     737            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
     738            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
     739              : 
     740            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     741              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     742            1 :     libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
     743              :                                                      m_libspdm_use_asym_algo,
     744              :                                                      &data, &data_size,
     745              :                                                      NULL, NULL);
     746            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     747            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     748              : 
     749            1 :     session_id = 0xFFFFFFFF;
     750            1 :     spdm_context->latest_session_id = session_id;
     751            1 :     session_info = &spdm_context->session_info[0];
     752            1 :     libspdm_session_info_init (spdm_context, session_info, session_id,
     753              :                                SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, false);
     754            1 :     session_info->local_used_cert_chain_slot_id = 0;
     755            1 :     hash_size = libspdm_get_hash_size (m_libspdm_use_hash_algo);
     756            1 :     libspdm_set_mem (dummy_buffer, hash_size, (uint8_t)(0xFF));
     757            1 :     libspdm_secured_message_set_request_finished_key (session_info->secured_message_context,
     758              :                                                       dummy_buffer, hash_size);
     759            1 :     libspdm_secured_message_set_session_state (session_info->secured_message_context,
     760              :                                                LIBSPDM_SESSION_STATE_HANDSHAKING);
     761              : 
     762            1 :     hash_size = libspdm_get_hash_size (m_libspdm_use_hash_algo);
     763            1 :     hmac_size = libspdm_get_hash_size (m_libspdm_use_hash_algo);
     764            1 :     ptr = m_libspdm_finish_request.signature;
     765            1 :     libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
     766            1 :     cert_buffer = (uint8_t *)data;
     767            1 :     cert_buffer_size = data_size;
     768            1 :     libspdm_hash_all (m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size, cert_buffer_hash);
     769              :     /* Transcript.MessageA size is 0*/
     770            1 :     libspdm_append_managed_buffer (&th_curr, cert_buffer_hash, hash_size);
     771              :     /* SessionTranscript.MessageK is 0*/
     772            1 :     libspdm_append_managed_buffer (&th_curr, (uint8_t *)&m_libspdm_finish_request,
     773              :                                    sizeof(spdm_finish_request_t));
     774            1 :     libspdm_set_mem (request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
     775            1 :     libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
     776              :                      libspdm_get_managed_buffer_size(&th_curr), hash_data);
     777            1 :     libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
     778              :                      request_finished_key, hash_size, ptr);
     779              : 
     780            1 :     spdm_context->last_spdm_request_size = sizeof(spdm_finish_request_t) + hmac_size;
     781            1 :     libspdm_copy_mem(spdm_context->last_spdm_request,
     782            1 :                      libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
     783              :                      &m_libspdm_finish_request, m_libspdm_finish_request_size);
     784              : 
     785              :     /*RESPOND_IF_READY specific data*/
     786            1 :     spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
     787            1 :     libspdm_copy_mem(spdm_context->cache_spdm_request,
     788            1 :                      libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
     789            1 :                      spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
     790            1 :     spdm_context->error_data.rd_exponent = 1;
     791            1 :     spdm_context->error_data.rd_tm        = 1;
     792            1 :     spdm_context->error_data.request_code = SPDM_FINISH;
     793            1 :     spdm_context->error_data.token       = LIBSPDM_MY_TEST_TOKEN;
     794              : 
     795              :     /*check FINISH_RSP response*/
     796            1 :     response_size = sizeof(response);
     797            1 :     status = libspdm_get_response_respond_if_ready(spdm_context,
     798              :                                                    m_libspdm_respond_if_ready_request6_size,
     799              :                                                    &m_libspdm_respond_if_ready_request6,
     800              :                                                    &response_size,
     801              :                                                    response);
     802            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
     803            1 :     assert_int_equal (response_size, sizeof(spdm_finish_response_t) + hmac_size);
     804            1 :     spdm_response = (void *)response;
     805            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_FINISH_RSP);
     806            1 :     free(data);
     807            1 :     libspdm_free_session_id (spdm_context, (0xFFFFFFFF));
     808            1 : }
     809              : #endif /* LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP*/
     810              : 
     811              : /**
     812              :  * Test 7: receiving a correct RESPOND_IF_READY from the requester, after a
     813              :  * PSK_EXCHANGE could not be processed.
     814              :  * Expected behavior: the responder accepts the request and produces a valid PSK_EXCHANGE_RSP
     815              :  * response message.
     816              :  **/
     817              : #if LIBSPDM_ENABLE_CAPABILITY_PSK_CAP
     818              : 
     819            1 : static void rsp_respond_if_ready_case7(void **state) {
     820              :     libspdm_return_t status;
     821              :     libspdm_test_context_t    *spdm_test_context;
     822              :     libspdm_context_t  *spdm_context;
     823              :     size_t response_size;
     824              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     825              :     spdm_psk_exchange_response_t *spdm_response; /*response to the original request (PSK_EXCHANGE_RSP)*/
     826              :     void                 *data;
     827              :     size_t data_size;
     828              :     uint8_t                *ptr;
     829              :     size_t opaque_psk_exchange_req_size;
     830              : 
     831            1 :     spdm_test_context = *state;
     832            1 :     spdm_context = spdm_test_context->spdm_context;
     833            1 :     spdm_test_context->case_id = 0x7;
     834            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
     835              : 
     836              :     /*state for the the original request (PSK_EXCHANGE)*/
     837            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     838            1 :     spdm_context->local_context.capability.flags = 0;
     839            1 :     spdm_context->connection_info.capability.flags |=
     840              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP |
     841              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
     842            1 :     spdm_context->local_context.capability.flags |=
     843              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP |
     844              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
     845            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     846            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     847            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     848            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     849              :         m_libspdm_use_measurement_hash_algo;
     850            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
     851            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
     852            1 :     spdm_context->connection_info.algorithm.key_schedule = m_libspdm_use_key_schedule_algo;
     853              : 
     854            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     855              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     856            1 :     libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
     857              :                                                      m_libspdm_use_asym_algo,
     858              :                                                      &data, &data_size,
     859              :                                                      NULL, NULL);
     860            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     861            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     862              : 
     863            1 :     m_libspdm_psk_exchange_request.psk_hint_length =
     864              :         (uint16_t)sizeof(LIBSPDM_TEST_PSK_HINT_STRING);
     865            1 :     m_libspdm_psk_exchange_request.requester_context_length = LIBSPDM_PSK_CONTEXT_LENGTH;
     866            1 :     opaque_psk_exchange_req_size =
     867            1 :         libspdm_get_opaque_data_supported_version_data_size (spdm_context);
     868            1 :     m_libspdm_psk_exchange_request.opaque_length = (uint16_t)opaque_psk_exchange_req_size;
     869            1 :     m_libspdm_psk_exchange_request.req_session_id = 0xFFFF;
     870            1 :     ptr = m_libspdm_psk_exchange_request.psk_hint;
     871            1 :     libspdm_copy_mem(ptr, sizeof(m_libspdm_psk_exchange_request.psk_hint),
     872              :                      LIBSPDM_TEST_PSK_HINT_STRING,
     873              :                      sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
     874            1 :     ptr += m_libspdm_psk_exchange_request.psk_hint_length;
     875            1 :     libspdm_get_random_number (LIBSPDM_PSK_CONTEXT_LENGTH, ptr);
     876            1 :     ptr += m_libspdm_psk_exchange_request.requester_context_length;
     877            1 :     libspdm_build_opaque_data_supported_version_data (spdm_context, &opaque_psk_exchange_req_size,
     878              :                                                       ptr);
     879            1 :     ptr += opaque_psk_exchange_req_size;
     880              : 
     881            1 :     spdm_context->last_spdm_request_size = m_libspdm_psk_exchange_request_size;
     882            1 :     libspdm_copy_mem(spdm_context->last_spdm_request,
     883            1 :                      libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
     884              :                      &m_libspdm_psk_exchange_request, m_libspdm_psk_exchange_request_size);
     885              : 
     886              :     /*RESPOND_IF_READY specific data*/
     887            1 :     spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
     888            1 :     libspdm_copy_mem(spdm_context->cache_spdm_request,
     889            1 :                      libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
     890            1 :                      spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
     891            1 :     spdm_context->error_data.rd_exponent = 1;
     892            1 :     spdm_context->error_data.rd_tm        = 1;
     893            1 :     spdm_context->error_data.request_code = SPDM_PSK_EXCHANGE;
     894            1 :     spdm_context->error_data.token       = LIBSPDM_MY_TEST_TOKEN;
     895              : 
     896              :     /*check PSK_EXCHANGE_RSP response*/
     897            1 :     response_size = sizeof(response);
     898            1 :     status = libspdm_get_response_respond_if_ready(spdm_context,
     899              :                                                    m_libspdm_respond_if_ready_request7_size,
     900              :                                                    &m_libspdm_respond_if_ready_request7,
     901              :                                                    &response_size,
     902              :                                                    response);
     903            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
     904            1 :     assert_int_equal (response_size,
     905              :                       sizeof(spdm_psk_exchange_response_t) + LIBSPDM_PSK_CONTEXT_LENGTH +
     906              :                       libspdm_get_opaque_data_version_selection_data_size(
     907              :                           spdm_context) + libspdm_get_hash_size (m_libspdm_use_hash_algo));
     908            1 :     assert_int_equal (libspdm_secured_message_get_session_state (spdm_context->session_info[0].
     909              :                                                                  secured_message_context),
     910              :                       LIBSPDM_SESSION_STATE_HANDSHAKING);
     911            1 :     spdm_response = (void *)response;
     912            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_PSK_EXCHANGE_RSP);
     913            1 :     assert_int_equal (spdm_response->rsp_session_id, 0xFFFF);
     914            1 :     free(data);
     915            1 :     libspdm_free_session_id (spdm_context, (0xFFFFFFFF));
     916            1 : }
     917              : #endif /* LIBSPDM_ENABLE_CAPABILITY_PSK_CAP*/
     918              : 
     919              : /**
     920              :  * Test 8: receiving a correct RESPOND_IF_READY from the requester, after a
     921              :  * PSK_FINISH could not be processed.
     922              :  * Expected behavior: the responder accepts the request and produces a valid PSK_FINISH_RSP
     923              :  * response message.
     924              :  **/
     925              : #if LIBSPDM_ENABLE_CAPABILITY_PSK_CAP
     926            1 : static void rsp_respond_if_ready_case8(void **state) {
     927              :     libspdm_return_t status;
     928              :     libspdm_test_context_t    *spdm_test_context;
     929              :     libspdm_context_t  *spdm_context;
     930              :     size_t response_size;
     931              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     932              :     spdm_psk_finish_response_t *spdm_response; /*response to the original request (FINISH_PSK_RSP)*/
     933              :     void                 *data;
     934              :     size_t data_size;
     935              :     uint8_t                *ptr;
     936              :     uint8_t dummy_buffer[LIBSPDM_MAX_HASH_SIZE];
     937              :     uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
     938              :     uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
     939              :     libspdm_session_info_t    *session_info;
     940              :     uint32_t session_id;
     941              :     uint32_t hash_size;
     942              :     uint32_t hmac_size;
     943              : 
     944            1 :     spdm_test_context = *state;
     945            1 :     spdm_context = spdm_test_context->spdm_context;
     946            1 :     spdm_test_context->case_id = 0x8;
     947            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
     948              : 
     949              :     /*state for the the original request (PSK_FINISH)*/
     950            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     951            1 :     spdm_context->local_context.capability.flags = 0;
     952            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
     953            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
     954            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
     955            1 :     spdm_context->local_context.capability.flags |=
     956              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
     957            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     958            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     959            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     960            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     961              :         m_libspdm_use_measurement_hash_algo;
     962            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
     963            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
     964              : 
     965            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     966              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     967            1 :     libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
     968              :                                                      m_libspdm_use_asym_algo,
     969              :                                                      &data, &data_size,
     970              :                                                      NULL, NULL);
     971            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     972            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     973              : 
     974            1 :     session_id = 0xFFFFFFFF;
     975            1 :     spdm_context->latest_session_id = session_id;
     976            1 :     spdm_context->last_spdm_request_session_id_valid = true;
     977            1 :     spdm_context->last_spdm_request_session_id = session_id;
     978            1 :     session_info = &spdm_context->session_info[0];
     979            1 :     libspdm_session_info_init (spdm_context, session_info, session_id,
     980              :                                SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     981            1 :     libspdm_session_info_set_psk_hint(session_info,
     982              :                                       LIBSPDM_TEST_PSK_HINT_STRING,
     983              :                                       sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
     984            1 :     hash_size = libspdm_get_hash_size (m_libspdm_use_hash_algo);
     985            1 :     libspdm_set_mem (dummy_buffer, hash_size, (uint8_t)(0xFF));
     986            1 :     libspdm_secured_message_set_request_finished_key (session_info->secured_message_context,
     987              :                                                       dummy_buffer, hash_size);
     988            1 :     libspdm_secured_message_set_session_state (session_info->secured_message_context,
     989              :                                                LIBSPDM_SESSION_STATE_HANDSHAKING);
     990              : 
     991            1 :     hash_size = libspdm_get_hash_size (m_libspdm_use_hash_algo);
     992            1 :     hmac_size = libspdm_get_hash_size (m_libspdm_use_hash_algo);
     993            1 :     ptr = m_libspdm_psk_finish_request.verify_data;
     994            1 :     libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
     995              :     /* Transcript.MessageA size is 0
     996              :      * SessionTranscript.MessageK is 0*/
     997            1 :     libspdm_append_managed_buffer (&th_curr, (uint8_t *)&m_libspdm_psk_finish_request,
     998              :                                    sizeof(spdm_psk_finish_request_t));
     999            1 :     libspdm_set_mem (request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
    1000            1 :     libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
    1001              :                      libspdm_get_managed_buffer_size(&th_curr), hash_data);
    1002            1 :     libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
    1003              :                      request_finished_key, hash_size, ptr);
    1004              : 
    1005            1 :     spdm_context->last_spdm_request_size = sizeof(spdm_psk_finish_request_t) + hmac_size;
    1006            1 :     libspdm_copy_mem(spdm_context->last_spdm_request,
    1007            1 :                      libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
    1008              :                      &m_libspdm_psk_finish_request, m_libspdm_psk_finish_request_size);
    1009              : 
    1010              :     /*RESPOND_IF_READY specific data*/
    1011            1 :     spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
    1012            1 :     libspdm_copy_mem(spdm_context->cache_spdm_request,
    1013            1 :                      libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
    1014            1 :                      spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
    1015            1 :     spdm_context->error_data.rd_exponent = 1;
    1016            1 :     spdm_context->error_data.rd_tm        = 1;
    1017            1 :     spdm_context->error_data.request_code = SPDM_PSK_FINISH;
    1018            1 :     spdm_context->error_data.token       = LIBSPDM_MY_TEST_TOKEN;
    1019              : 
    1020              :     /*check FINISH_PSK_RSP response*/
    1021            1 :     response_size = sizeof(response);
    1022            1 :     status = libspdm_get_response_respond_if_ready(spdm_context,
    1023              :                                                    m_libspdm_respond_if_ready_request8_size,
    1024              :                                                    &m_libspdm_respond_if_ready_request8,
    1025              :                                                    &response_size,
    1026              :                                                    response);
    1027            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
    1028            1 :     assert_int_equal (response_size, sizeof(spdm_psk_finish_response_t));
    1029            1 :     spdm_response = (void *)response;
    1030            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_PSK_FINISH_RSP);
    1031            1 :     free(data);
    1032            1 :     libspdm_free_session_id (spdm_context, (0xFFFFFFFF));
    1033            1 : }
    1034              : #endif /* LIBSPDM_ENABLE_CAPABILITY_PSK_CAP*/
    1035              : 
    1036              : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
    1037              : 
    1038              : /**
    1039              :  * Test 9:
    1040              :  * Expected behavior:
    1041              :  **/
    1042            1 : static void rsp_respond_if_ready_case9(void **state) {
    1043            1 : }
    1044              : 
    1045              : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
    1046              : 
    1047              : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
    1048              : /**
    1049              :  * Test 10: receiving a correct RESPOND_IF_READY from the requester, but the responder is in
    1050              :  * a Busy state.
    1051              :  * Expected behavior: the responder accepts the request, but produces an ERROR message
    1052              :  * indicating the Busy state.
    1053              :  **/
    1054            1 : static void rsp_respond_if_ready_case10(void **state) {
    1055              :     libspdm_return_t status;
    1056              :     libspdm_test_context_t    *spdm_test_context;
    1057              :     libspdm_context_t  *spdm_context;
    1058              :     size_t response_size;
    1059              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1060              :     spdm_digest_response_t *spdm_response; /*response to the original request (DIGESTS)*/
    1061              : 
    1062            1 :     spdm_test_context = *state;
    1063            1 :     spdm_context = spdm_test_context->spdm_context;
    1064            1 :     spdm_test_context->case_id = 0xA;
    1065            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_BUSY;
    1066              : 
    1067              :     /*state for the the original request (GET_DIGESTS)*/
    1068            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1069            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
    1070            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1071            1 :     spdm_context->local_context.local_cert_chain_provision[0] = m_libspdm_local_certificate_chain;
    1072            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
    1073              :         sizeof(m_libspdm_local_certificate_chain);
    1074            1 :     libspdm_set_mem (m_libspdm_local_certificate_chain, sizeof(m_libspdm_local_certificate_chain),
    1075              :                      (uint8_t)(0xFF));
    1076              : 
    1077            1 :     spdm_context->last_spdm_request_size = m_libspdm_get_digest_request_size;
    1078            1 :     libspdm_copy_mem(spdm_context->last_spdm_request,
    1079            1 :                      libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
    1080              :                      &m_libspdm_get_digest_request, m_libspdm_get_digest_request_size);
    1081              : 
    1082              :     /*RESPOND_IF_READY specific data*/
    1083            1 :     spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
    1084            1 :     libspdm_copy_mem(spdm_context->cache_spdm_request,
    1085            1 :                      libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
    1086            1 :                      spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
    1087            1 :     spdm_context->error_data.rd_exponent = 1;
    1088            1 :     spdm_context->error_data.rd_tm        = 1;
    1089            1 :     spdm_context->error_data.request_code = SPDM_GET_DIGESTS;
    1090            1 :     spdm_context->error_data.token       = LIBSPDM_MY_TEST_TOKEN;
    1091              : 
    1092              :     /*check ERROR response*/
    1093            1 :     response_size = sizeof(response);
    1094            1 :     status = libspdm_get_response_respond_if_ready(spdm_context,
    1095              :                                                    m_libspdm_respond_if_ready_request1_size,
    1096              :                                                    &m_libspdm_respond_if_ready_request1,
    1097              :                                                    &response_size,
    1098              :                                                    response);
    1099            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
    1100            1 :     assert_int_equal (response_size, sizeof(spdm_error_response_t));
    1101            1 :     spdm_response = (void *)response;
    1102            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_ERROR);
    1103            1 :     assert_int_equal (spdm_response->header.param1, SPDM_ERROR_CODE_BUSY);
    1104            1 :     assert_int_equal (spdm_response->header.param2, 0);
    1105            1 :     assert_int_equal (spdm_context->response_state, LIBSPDM_RESPONSE_STATE_BUSY);
    1106            1 : }
    1107              : 
    1108              : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
    1109              : 
    1110              : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
    1111              : /**
    1112              :  * Test 11: receiving a correct RESPOND_IF_READY from the requester, but the responder requires
    1113              :  * resynchronization with the requester.
    1114              :  * Expected behavior: the responder accepts the request, but produces an ERROR message
    1115              :  * indicating the NeedResynch state.
    1116              :  **/
    1117            1 : static void rsp_respond_if_ready_case11(void **state) {
    1118              :     libspdm_return_t status;
    1119              :     libspdm_test_context_t    *spdm_test_context;
    1120              :     libspdm_context_t  *spdm_context;
    1121              :     size_t response_size;
    1122              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1123              :     spdm_digest_response_t *spdm_response; /*response to the original request (DIGESTS)*/
    1124              : 
    1125            1 :     spdm_test_context = *state;
    1126            1 :     spdm_context = spdm_test_context->spdm_context;
    1127            1 :     spdm_test_context->case_id = 0xB;
    1128            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NEED_RESYNC;
    1129              : 
    1130              :     /*state for the the original request (GET_DIGESTS)*/
    1131            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1132            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
    1133            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1134            1 :     spdm_context->local_context.local_cert_chain_provision[0] = m_libspdm_local_certificate_chain;
    1135            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
    1136              :         sizeof(m_libspdm_local_certificate_chain);
    1137            1 :     libspdm_set_mem (m_libspdm_local_certificate_chain, sizeof(m_libspdm_local_certificate_chain),
    1138              :                      (uint8_t)(0xFF));
    1139              : 
    1140            1 :     spdm_context->last_spdm_request_size = m_libspdm_get_digest_request_size;
    1141            1 :     libspdm_copy_mem(spdm_context->last_spdm_request,
    1142            1 :                      libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
    1143              :                      &m_libspdm_get_digest_request, m_libspdm_get_digest_request_size);
    1144              : 
    1145              :     /*RESPOND_IF_READY specific data*/
    1146            1 :     spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
    1147            1 :     libspdm_copy_mem(spdm_context->cache_spdm_request,
    1148            1 :                      libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
    1149            1 :                      spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
    1150            1 :     spdm_context->error_data.rd_exponent = 1;
    1151            1 :     spdm_context->error_data.rd_tm        = 1;
    1152            1 :     spdm_context->error_data.request_code = SPDM_GET_DIGESTS;
    1153            1 :     spdm_context->error_data.token       = LIBSPDM_MY_TEST_TOKEN;
    1154              : 
    1155              :     /*check ERROR response*/
    1156            1 :     response_size = sizeof(response);
    1157            1 :     status = libspdm_get_response_respond_if_ready(spdm_context,
    1158              :                                                    m_libspdm_respond_if_ready_request1_size,
    1159              :                                                    &m_libspdm_respond_if_ready_request1,
    1160              :                                                    &response_size,
    1161              :                                                    response);
    1162            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
    1163            1 :     assert_int_equal (response_size, sizeof(spdm_error_response_t));
    1164            1 :     spdm_response = (void *)response;
    1165            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_ERROR);
    1166            1 :     assert_int_equal (spdm_response->header.param1, SPDM_ERROR_CODE_REQUEST_RESYNCH);
    1167            1 :     assert_int_equal (spdm_response->header.param2, 0);
    1168            1 :     assert_int_equal (spdm_context->response_state, LIBSPDM_RESPONSE_STATE_NEED_RESYNC);
    1169            1 : }
    1170              : 
    1171              : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
    1172              : 
    1173              : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
    1174              : 
    1175              : /**
    1176              :  * Test 12: receiving a correct RESPOND_IF_READY from the requester, but the responder could not
    1177              :  * produce the response in time.
    1178              :  * Expected behavior: the responder accepts the request, but produces an ERROR message
    1179              :  * indicating the ResponseNotReady state, with the same token as the request.
    1180              :  **/
    1181            1 : static void rsp_respond_if_ready_case12(void **state) {
    1182              :     libspdm_return_t status;
    1183              :     libspdm_test_context_t    *spdm_test_context;
    1184              :     libspdm_context_t  *spdm_context;
    1185              :     size_t response_size;
    1186              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1187              :     spdm_digest_response_t *spdm_response; /*response to the original request (DIGESTS)*/
    1188              :     spdm_error_data_response_not_ready_t *error_data;
    1189              : 
    1190            1 :     spdm_test_context = *state;
    1191            1 :     spdm_context = spdm_test_context->spdm_context;
    1192            1 :     spdm_test_context->case_id = 0xC;
    1193            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NOT_READY;
    1194              : 
    1195              :     /*state for the the original request (GET_DIGESTS)*/
    1196            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1197            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
    1198            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1199            1 :     spdm_context->local_context.local_cert_chain_provision[0] = m_libspdm_local_certificate_chain;
    1200            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
    1201              :         sizeof(m_libspdm_local_certificate_chain);
    1202            1 :     libspdm_set_mem (m_libspdm_local_certificate_chain, sizeof(m_libspdm_local_certificate_chain),
    1203              :                      (uint8_t)(0xFF));
    1204              : 
    1205            1 :     spdm_context->last_spdm_request_size = m_libspdm_get_digest_request_size;
    1206            1 :     libspdm_copy_mem(spdm_context->last_spdm_request,
    1207            1 :                      libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
    1208              :                      &m_libspdm_get_digest_request, m_libspdm_get_digest_request_size);
    1209              : 
    1210              :     /*RESPOND_IF_READY specific data*/
    1211            1 :     spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
    1212            1 :     libspdm_copy_mem(spdm_context->cache_spdm_request,
    1213            1 :                      libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
    1214            1 :                      spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
    1215            1 :     spdm_context->error_data.rd_exponent = 1;
    1216            1 :     spdm_context->error_data.rd_tm        = 1;
    1217            1 :     spdm_context->error_data.request_code = SPDM_GET_DIGESTS;
    1218            1 :     spdm_context->error_data.token       = LIBSPDM_MY_TEST_TOKEN;
    1219              : 
    1220              :     /*check ERROR response*/
    1221            1 :     response_size = sizeof(response);
    1222            1 :     status = libspdm_get_response_respond_if_ready(spdm_context,
    1223              :                                                    m_libspdm_respond_if_ready_request1_size,
    1224              :                                                    &m_libspdm_respond_if_ready_request1,
    1225              :                                                    &response_size,
    1226              :                                                    response);
    1227            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
    1228            1 :     assert_int_equal (response_size,
    1229              :                       sizeof(spdm_error_response_t) + sizeof(spdm_error_data_response_not_ready_t));
    1230            1 :     spdm_response = (void *)response;
    1231            1 :     error_data = (spdm_error_data_response_not_ready_t*)(spdm_response + 1);
    1232            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_ERROR);
    1233            1 :     assert_int_equal (spdm_response->header.param1, SPDM_ERROR_CODE_RESPONSE_NOT_READY);
    1234            1 :     assert_int_equal (spdm_response->header.param2, 0);
    1235            1 :     assert_int_equal (spdm_context->response_state, LIBSPDM_RESPONSE_STATE_NOT_READY);
    1236            1 :     assert_int_equal (error_data->request_code, SPDM_GET_DIGESTS);
    1237            1 :     assert_int_equal (error_data->token, LIBSPDM_MY_TEST_TOKEN);
    1238            1 : }
    1239              : 
    1240              : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
    1241              : 
    1242              : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
    1243              : 
    1244              : /**
    1245              :  * Test 13: receiving a correct RESPOND_IF_READY from the requester, with the correct original
    1246              :  * request code, but with a token different from the expected.
    1247              :  * Expected behavior: the responder refuses the RESPOND_IF_READY message and produces an
    1248              :  * ERROR message indicating the InvalidRequest.
    1249              :  **/
    1250            1 : static void rsp_respond_if_ready_case13(void **state) {
    1251              :     libspdm_return_t status;
    1252              :     libspdm_test_context_t    *spdm_test_context;
    1253              :     libspdm_context_t  *spdm_context;
    1254              :     size_t response_size;
    1255              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1256              :     spdm_digest_response_t *spdm_response; /*response to the original request (DIGESTS)*/
    1257              : 
    1258            1 :     spdm_test_context = *state;
    1259            1 :     spdm_context = spdm_test_context->spdm_context;
    1260            1 :     spdm_test_context->case_id = 0xD;
    1261            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
    1262              : 
    1263              :     /*state for the the original request (GET_DIGESTS)*/
    1264            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1265            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
    1266            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1267            1 :     spdm_context->local_context.local_cert_chain_provision[0] = m_libspdm_local_certificate_chain;
    1268            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
    1269              :         sizeof(m_libspdm_local_certificate_chain);
    1270            1 :     libspdm_set_mem (m_libspdm_local_certificate_chain, sizeof(m_libspdm_local_certificate_chain),
    1271              :                      (uint8_t)(0xFF));
    1272              : 
    1273            1 :     spdm_context->last_spdm_request_size = m_libspdm_get_digest_request_size;
    1274            1 :     libspdm_copy_mem(spdm_context->last_spdm_request,
    1275            1 :                      libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
    1276              :                      &m_libspdm_get_digest_request, m_libspdm_get_digest_request_size);
    1277              : 
    1278              :     /*RESPOND_IF_READY specific data*/
    1279            1 :     spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
    1280            1 :     libspdm_copy_mem(spdm_context->cache_spdm_request,
    1281            1 :                      libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
    1282            1 :                      spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
    1283            1 :     spdm_context->error_data.rd_exponent = 1;
    1284            1 :     spdm_context->error_data.rd_tm        = 1;
    1285            1 :     spdm_context->error_data.request_code = SPDM_GET_DIGESTS;
    1286            1 :     spdm_context->error_data.token       = LIBSPDM_MY_TEST_TOKEN;
    1287              : 
    1288              :     /*check ERROR response*/
    1289            1 :     response_size = sizeof(response);
    1290            1 :     status = libspdm_get_response_respond_if_ready(spdm_context,
    1291              :                                                    m_libspdm_respond_if_ready_request10_size,
    1292              :                                                    &m_libspdm_respond_if_ready_request10,
    1293              :                                                    &response_size,
    1294              :                                                    response);
    1295            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
    1296            1 :     assert_int_equal (response_size, sizeof(spdm_error_response_t));
    1297            1 :     spdm_response = (void *)response;
    1298            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_ERROR);
    1299            1 :     assert_int_equal (spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1300            1 :     assert_int_equal (spdm_response->header.param2, 0);
    1301            1 : }
    1302              : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
    1303              : 
    1304              : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
    1305              : /**
    1306              :  * Test 14: receiving a correct RESPOND_IF_READY from the requester, with the correct token,
    1307              :  * but with a request code different from the expected.
    1308              :  * Expected behavior: the responder refuses the RESPOND_IF_READY message and produces an
    1309              :  * ERROR message indicating the InvalidRequest.
    1310              :  **/
    1311            1 : static void rsp_respond_if_ready_case14(void **state) {
    1312              :     libspdm_return_t status;
    1313              :     libspdm_test_context_t    *spdm_test_context;
    1314              :     libspdm_context_t  *spdm_context;
    1315              :     size_t response_size;
    1316              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1317              :     spdm_digest_response_t *spdm_response; /*response to the original request (DIGESTS)*/
    1318              : 
    1319            1 :     spdm_test_context = *state;
    1320            1 :     spdm_context = spdm_test_context->spdm_context;
    1321            1 :     spdm_test_context->case_id = 0xE;
    1322            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
    1323              : 
    1324              :     /*state for the the original request (GET_DIGESTS)*/
    1325            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1326            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
    1327            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1328            1 :     spdm_context->local_context.local_cert_chain_provision[0] = m_libspdm_local_certificate_chain;
    1329            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
    1330              :         sizeof(m_libspdm_local_certificate_chain);
    1331            1 :     libspdm_set_mem (m_libspdm_local_certificate_chain, sizeof(m_libspdm_local_certificate_chain),
    1332              :                      (uint8_t)(0xFF));
    1333              : 
    1334            1 :     spdm_context->last_spdm_request_size = m_libspdm_get_digest_request_size;
    1335            1 :     libspdm_copy_mem(spdm_context->last_spdm_request,
    1336            1 :                      libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
    1337              :                      &m_libspdm_get_digest_request, m_libspdm_get_digest_request_size);
    1338              : 
    1339              :     /*RESPOND_IF_READY specific data*/
    1340            1 :     spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
    1341            1 :     libspdm_copy_mem(spdm_context->cache_spdm_request,
    1342            1 :                      libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
    1343            1 :                      spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
    1344            1 :     spdm_context->error_data.rd_exponent = 1;
    1345            1 :     spdm_context->error_data.rd_tm        = 1;
    1346            1 :     spdm_context->error_data.request_code = SPDM_GET_DIGESTS;
    1347            1 :     spdm_context->error_data.token       = LIBSPDM_MY_TEST_TOKEN;
    1348              : 
    1349              :     /*check ERROR response*/
    1350            1 :     response_size = sizeof(response);
    1351            1 :     status = libspdm_get_response_respond_if_ready(spdm_context,
    1352              :                                                    m_libspdm_respond_if_ready_request11_size,
    1353              :                                                    &m_libspdm_respond_if_ready_request11,
    1354              :                                                    &response_size,
    1355              :                                                    response);
    1356            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
    1357            1 :     assert_int_equal (response_size, sizeof(spdm_error_response_t));
    1358            1 :     spdm_response = (void *)response;
    1359            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_ERROR);
    1360            1 :     assert_int_equal (spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1361            1 :     assert_int_equal (spdm_response->header.param2, 0);
    1362            1 : }
    1363              : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
    1364              : 
    1365            1 : int libspdm_rsp_respond_if_ready_test(void) {
    1366            1 :     const struct CMUnitTest test_cases[] = {
    1367              :         /* Success Case*/
    1368              :     #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
    1369              :         cmocka_unit_test(rsp_respond_if_ready_case1),
    1370              :         cmocka_unit_test(rsp_respond_if_ready_case2),
    1371              :     #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
    1372              : 
    1373              :     #if LIBSPDM_ENABLE_CAPABILITY_CHAL_CAP
    1374              :         cmocka_unit_test(rsp_respond_if_ready_case3),
    1375              :     #endif /* LIBSPDM_ENABLE_CAPABILITY_CHAL_CAP*/
    1376              : 
    1377              :     #if LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP
    1378              :         cmocka_unit_test(rsp_respond_if_ready_case4),
    1379              :     #endif /* LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP*/
    1380              : 
    1381              :     #if LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP
    1382              :         cmocka_unit_test(rsp_respond_if_ready_case5),
    1383              :         cmocka_unit_test(rsp_respond_if_ready_case6),
    1384              :     #endif /* LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP*/
    1385              : 
    1386              :     #if LIBSPDM_ENABLE_CAPABILITY_PSK_CAP
    1387              :         cmocka_unit_test(rsp_respond_if_ready_case7),
    1388              :         cmocka_unit_test(rsp_respond_if_ready_case8),
    1389              :     #endif /* LIBSPDM_ENABLE_CAPABILITY_PSK_CAP*/
    1390              : 
    1391              :     #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
    1392              :         cmocka_unit_test(rsp_respond_if_ready_case9),
    1393              :         cmocka_unit_test(rsp_respond_if_ready_case10),
    1394              :         cmocka_unit_test(rsp_respond_if_ready_case11),
    1395              :         cmocka_unit_test(rsp_respond_if_ready_case12),
    1396              :         cmocka_unit_test(rsp_respond_if_ready_case13),
    1397              :         cmocka_unit_test(rsp_respond_if_ready_case14),
    1398              :     #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
    1399              : 
    1400              :     };
    1401              : 
    1402            1 :     libspdm_test_context_t test_context = {
    1403              :         LIBSPDM_TEST_CONTEXT_VERSION,
    1404              :         false,
    1405              :     };
    1406              : 
    1407            1 :     libspdm_setup_test_context (&test_context);
    1408              : 
    1409            1 :     return cmocka_run_group_tests(test_cases,
    1410              :                                   libspdm_unit_test_group_setup,
    1411              :                                   libspdm_unit_test_group_teardown);
    1412              : }
    1413              : #endif /* LIBSPDM_ENABLE_CAPABILITY_*_CAP */
    1414              : #endif /* LIBSPDM_RESPOND_IF_READY_SUPPORT */
        

Generated by: LCOV version 2.0-1