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 % 555 555
Test Date: 2025-06-29 08:09:00 Functions: 100.0 % 16 16

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

Generated by: LCOV version 2.0-1