LCOV - code coverage report
Current view: top level - unit_test/test_spdm_responder - encapsulated_request.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 99.5 % 595 592
Test Date: 2026-02-22 08:11:49 Functions: 94.7 % 19 18

            Line data    Source code
       1              : /**
       2              :  *  Copyright Notice:
       3              :  *  Copyright 2021-2026 DMTF. All rights reserved.
       4              :  *  License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
       5              :  **/
       6              : 
       7              : #include "spdm_unit_test.h"
       8              : #include "internal/libspdm_responder_lib.h"
       9              : 
      10              : #if LIBSPDM_ENABLE_CAPABILITY_ENCAP_CAP
      11              : 
      12              : static spdm_get_encapsulated_request_request_t m_libspdm_encapsulated_request_t1 = {
      13              :     {SPDM_MESSAGE_VERSION_11, SPDM_GET_ENCAPSULATED_REQUEST, 0, 0}
      14              : };
      15              : static size_t m_libspdm_encapsulated_request_t1_size = sizeof(m_libspdm_encapsulated_request_t1);
      16              : 
      17              : static spdm_get_encapsulated_request_request_t m_libspdm_encapsulated_request_t2 = {
      18              :     {SPDM_MESSAGE_VERSION_13, SPDM_GET_ENCAPSULATED_REQUEST, 0, 0}
      19              : };
      20              : static size_t m_libspdm_encapsulated_request_t2_size = sizeof(m_libspdm_encapsulated_request_t2);
      21              : 
      22              : static spdm_deliver_encapsulated_response_request_t m_libspdm_m_deliver_encapsulated_response_request_t1 =
      23              : {
      24              :     {SPDM_MESSAGE_VERSION_11, SPDM_DELIVER_ENCAPSULATED_RESPONSE, 0, 0}
      25              : };
      26              : static size_t m_libspdm_m_deliver_encapsulated_response_request_t1_size =
      27              :     sizeof(m_libspdm_m_deliver_encapsulated_response_request_t1);
      28              : 
      29              : static uint8_t m_libspdm_local_certificate_chain[LIBSPDM_MAX_CERT_CHAIN_SIZE];
      30              : 
      31              : static spdm_deliver_encapsulated_response_request_t m_libspdm_m_deliver_encapsulated_response_request_t2 =
      32              : {
      33              :     {SPDM_MESSAGE_VERSION_12, SPDM_DELIVER_ENCAPSULATED_RESPONSE, 0xFF, 0}
      34              : };
      35              : static size_t m_libspdm_m_deliver_encapsulated_response_request_t2_size =
      36              :     sizeof(m_libspdm_m_deliver_encapsulated_response_request_t2);
      37              : 
      38              : #if (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT)
      39            1 : static void rsp_encapsulated_request_case1(void **State)
      40              : {
      41              :     libspdm_return_t status;
      42              :     libspdm_test_context_t *spdm_test_context;
      43              :     spdm_encapsulated_request_response_t *spdm_response_requester;
      44              :     spdm_get_digest_request_t *spdm_get_digests_request;
      45              :     libspdm_context_t *spdm_context;
      46              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
      47              :     size_t data_size;
      48              :     void *data;
      49              :     size_t response_size;
      50              : 
      51            1 :     spdm_test_context = *State;
      52            1 :     spdm_context = spdm_test_context->spdm_context;
      53            1 :     spdm_test_context->case_id = 0x1;
      54              : 
      55            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
      56              : 
      57            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
      58            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
      59            1 :     spdm_context->encap_context.request_op_code_count =
      60              :         LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
      61            1 :     spdm_context->encap_context.current_request_op_code = 0;
      62            1 :     spdm_context->encap_context.request_op_code_sequence[0] = SPDM_GET_DIGESTS;
      63            1 :     spdm_context->encap_context.request_id = 0;
      64              : 
      65            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
      66            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
      67            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
      68            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
      69              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
      70            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
      71              :                                                     m_libspdm_use_asym_algo, &data,
      72              :                                                     &data_size,
      73              :                                                     NULL, NULL);
      74            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
      75            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
      76            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
      77            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
      78            1 :     libspdm_reset_message_b(spdm_context);
      79              : 
      80            1 :     response_size = sizeof(response);
      81            1 :     status = libspdm_get_response_encapsulated_request(spdm_context,
      82              :                                                        m_libspdm_encapsulated_request_t1_size,
      83              :                                                        &m_libspdm_encapsulated_request_t1,
      84              :                                                        &response_size,
      85              :                                                        response);
      86              : 
      87            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
      88            1 :     assert_int_equal(response_size,
      89              :                      sizeof(spdm_encapsulated_request_response_t) + sizeof(spdm_digest_response_t));
      90            1 :     spdm_response_requester = (void *)response;
      91              : 
      92            1 :     assert_int_equal(spdm_response_requester->header.spdm_version, SPDM_MESSAGE_VERSION_11);
      93            1 :     assert_int_equal(spdm_response_requester->header.request_response_code,
      94              :                      SPDM_ENCAPSULATED_REQUEST);
      95            1 :     assert_int_equal(spdm_response_requester->header.param1, 0x1);
      96            1 :     assert_int_equal(spdm_response_requester->header.param2, 0);
      97              : 
      98            1 :     spdm_get_digests_request = (spdm_get_digest_request_t *)(spdm_response_requester + 1);
      99            1 :     assert_int_equal(spdm_get_digests_request->header.spdm_version, SPDM_MESSAGE_VERSION_11);
     100            1 :     assert_int_equal(spdm_get_digests_request->header.request_response_code, SPDM_GET_DIGESTS);
     101            1 :     assert_int_equal(spdm_get_digests_request->header.param1, 0);
     102            1 :     assert_int_equal(spdm_get_digests_request->header.param2, 0);
     103              : 
     104            1 :     free(data);
     105            1 : }
     106              : 
     107            1 : static void rsp_encapsulated_request_case2(void **State)
     108              : {
     109              :     libspdm_return_t status;
     110              :     libspdm_test_context_t *spdm_test_context;
     111              :     spdm_encapsulated_request_response_t *spdm_response_requester;
     112              :     spdm_get_certificate_request_t *spdm_get_certificate_request;
     113              :     libspdm_context_t *spdm_context;
     114              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     115              :     size_t data_size;
     116              :     void *data;
     117              :     size_t response_size;
     118              : 
     119            1 :     spdm_test_context = *State;
     120            1 :     spdm_context = spdm_test_context->spdm_context;
     121            1 :     spdm_test_context->case_id = 0x2;
     122              : 
     123            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
     124            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
     125            1 :     spdm_context->encap_context.request_op_code_count =
     126              :         LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
     127            1 :     spdm_context->encap_context.current_request_op_code = 0;
     128            1 :     spdm_context->encap_context.request_op_code_sequence[0] = SPDM_GET_CERTIFICATE;
     129            1 :     spdm_context->encap_context.request_id = 0;
     130              : 
     131            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     132            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
     133            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
     134            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     135              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     136            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     137              :                                                     m_libspdm_use_asym_algo, &data,
     138              :                                                     &data_size,
     139              :                                                     NULL, NULL);
     140            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     141            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     142            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     143            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     144            1 :     libspdm_reset_message_b(spdm_context);
     145              : 
     146            1 :     response_size = sizeof(response);
     147              : 
     148            1 :     status = libspdm_get_response_encapsulated_request(spdm_context,
     149              :                                                        m_libspdm_encapsulated_request_t1_size,
     150              :                                                        &m_libspdm_encapsulated_request_t1,
     151              :                                                        &response_size,
     152              :                                                        response);
     153              : 
     154            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     155            1 :     assert_int_equal(response_size,
     156              :                      sizeof(spdm_encapsulated_request_response_t) +
     157              :                      sizeof(spdm_certificate_response_t));
     158            1 :     spdm_response_requester = (void *)response;
     159            1 :     assert_int_equal(spdm_response_requester->header.spdm_version, SPDM_MESSAGE_VERSION_11);
     160            1 :     assert_int_equal(spdm_response_requester->header.request_response_code,
     161              :                      SPDM_ENCAPSULATED_REQUEST);
     162            1 :     assert_int_equal(spdm_response_requester->header.param1, 0x1);
     163            1 :     assert_int_equal(spdm_response_requester->header.param2, 0);
     164              : 
     165            1 :     spdm_get_certificate_request = (spdm_get_certificate_request_t *)(spdm_response_requester + 1);
     166            1 :     assert_int_equal(spdm_get_certificate_request->header.spdm_version, SPDM_MESSAGE_VERSION_11);
     167            1 :     assert_int_equal(spdm_get_certificate_request->header.request_response_code,
     168              :                      SPDM_GET_CERTIFICATE);
     169            1 :     assert_int_equal(spdm_get_certificate_request->header.param1, 0);
     170            1 :     assert_int_equal(spdm_get_certificate_request->header.param2, 0);
     171            1 :     assert_int_equal(spdm_get_certificate_request->offset, 0);
     172              : 
     173            1 :     const size_t length = spdm_context->local_context.capability.max_spdm_msg_size -
     174              :                           sizeof(spdm_deliver_encapsulated_response_request_t) -
     175              :                           sizeof(spdm_get_certificate_request_t);
     176              : 
     177            1 :     assert_int_equal(spdm_get_certificate_request->length, length);
     178            1 :     free(data);
     179            1 : }
     180              : 
     181            1 : static void rsp_encapsulated_request_case3(void **State)
     182              : {
     183              :     libspdm_return_t status;
     184              :     libspdm_test_context_t *spdm_test_context;
     185              :     spdm_error_response_t *spdm_response_requester;
     186              :     libspdm_context_t *spdm_context;
     187              :     size_t response_size;
     188              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     189              :     uint8_t m_local_certificate_chain[LIBSPDM_MAX_CERT_CHAIN_SIZE];
     190              : 
     191            1 :     spdm_test_context = *State;
     192            1 :     spdm_context = spdm_test_context->spdm_context;
     193            1 :     spdm_test_context->case_id = 0x3;
     194              : 
     195            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
     196            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
     197            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
     198              : 
     199            1 :     spdm_context->encap_context.current_request_op_code = 0;
     200            1 :     spdm_context->encap_context.request_id = 0;
     201            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     202            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
     203            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     204            1 :     spdm_context->local_context.local_cert_chain_provision[0] = m_local_certificate_chain;
     205            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
     206              :         sizeof(m_local_certificate_chain);
     207            1 :     libspdm_set_mem(m_local_certificate_chain, sizeof(m_local_certificate_chain), (uint8_t)(0xFF));
     208            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     209              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     210              : 
     211            1 :     response_size = sizeof(response);
     212            1 :     status = libspdm_get_response_encapsulated_request(spdm_context,
     213              :                                                        m_libspdm_encapsulated_request_t1_size,
     214              :                                                        &m_libspdm_encapsulated_request_t1,
     215              :                                                        &response_size,
     216              :                                                        response);
     217              : 
     218            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     219            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     220            1 :     spdm_response_requester = (void *)response;
     221            1 :     assert_int_equal(spdm_response_requester->header.spdm_version, SPDM_MESSAGE_VERSION_11);
     222            1 :     assert_int_equal(spdm_response_requester->header.request_response_code, SPDM_ERROR);
     223            1 :     assert_int_equal(spdm_response_requester->header.param1, SPDM_ERROR_CODE_UNEXPECTED_REQUEST);
     224            1 :     assert_int_equal(spdm_response_requester->header.param2, 0);
     225            1 : }
     226              : 
     227            1 : static void rsp_encapsulated_request_case4(void **State)
     228              : {
     229              :     libspdm_return_t status;
     230              :     libspdm_test_context_t *spdm_test_context;
     231              :     spdm_error_response_t *spdm_response_requester;
     232              :     libspdm_context_t *spdm_context;
     233              :     size_t response_size;
     234              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     235              :     uint8_t m_local_certificate_chain[LIBSPDM_MAX_CERT_CHAIN_SIZE];
     236              : 
     237            1 :     spdm_test_context = *State;
     238            1 :     spdm_context = spdm_test_context->spdm_context;
     239            1 :     spdm_test_context->case_id = 0x4;
     240              : 
     241            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NEED_RESYNC;
     242            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
     243            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
     244              : 
     245            1 :     spdm_context->encap_context.current_request_op_code = SPDM_GET_DIGESTS;
     246              : 
     247            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     248            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
     249            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     250            1 :     spdm_context->local_context.local_cert_chain_provision[0] = m_local_certificate_chain;
     251            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
     252              :         sizeof(m_local_certificate_chain);
     253            1 :     libspdm_set_mem(m_local_certificate_chain, sizeof(m_local_certificate_chain), (uint8_t)(0xFF));
     254            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     255              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     256              : 
     257            1 :     response_size = sizeof(response);
     258            1 :     status = libspdm_get_response_encapsulated_request(spdm_context,
     259              :                                                        m_libspdm_encapsulated_request_t1_size,
     260              :                                                        &m_libspdm_encapsulated_request_t1,
     261              :                                                        &response_size,
     262              :                                                        response);
     263            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     264            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     265            1 :     spdm_response_requester = (void *)response;
     266            1 :     assert_int_equal(spdm_response_requester->header.spdm_version, SPDM_MESSAGE_VERSION_11);
     267            1 :     assert_int_equal(spdm_response_requester->header.request_response_code, SPDM_ERROR);
     268            1 :     assert_int_equal(spdm_response_requester->header.param1, SPDM_ERROR_CODE_REQUEST_RESYNCH);
     269            1 :     assert_int_equal(spdm_response_requester->header.param2, 0);
     270            1 : }
     271              : #endif /* (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT) */
     272              : 
     273              : #if (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_SEND_CHALLENGE_SUPPORT)
     274            1 : static void rsp_encapsulated_request_case5(void **State)
     275              : {
     276              :     libspdm_return_t status;
     277              :     libspdm_test_context_t *spdm_test_context;
     278              :     spdm_encapsulated_request_response_t *spdm_response_requester;
     279              :     libspdm_context_t *spdm_context;
     280              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     281              :     size_t data_size;
     282              :     void *data;
     283              :     size_t response_size;
     284              : 
     285            1 :     spdm_test_context = *State;
     286            1 :     spdm_context = spdm_test_context->spdm_context;
     287            1 :     spdm_test_context->case_id = 0x5;
     288              : 
     289            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
     290            1 :     spdm_context->connection_info.capability.flags = 0;
     291            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHAL_CAP;
     292            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
     293            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
     294            1 :     spdm_context->encap_context.request_op_code_count =
     295              :         LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
     296            1 :     spdm_context->encap_context.current_request_op_code = 0;
     297            1 :     spdm_context->encap_context.request_op_code_sequence[0] = SPDM_CHALLENGE;
     298            1 :     spdm_context->encap_context.request_id = 0;
     299              : 
     300            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     301            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
     302            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     303              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     304            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     305              :                                                     m_libspdm_use_asym_algo, &data,
     306              :                                                     &data_size,
     307              :                                                     NULL, NULL);
     308            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     309            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     310            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     311            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     312            1 :     libspdm_reset_message_b(spdm_context);
     313              : 
     314            1 :     response_size = sizeof(response);
     315            1 :     status = libspdm_get_response_encapsulated_request(spdm_context,
     316              :                                                        m_libspdm_encapsulated_request_t1_size,
     317              :                                                        &m_libspdm_encapsulated_request_t1,
     318              :                                                        &response_size,
     319              :                                                        response);
     320              : 
     321            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     322            1 :     assert_int_equal(response_size,
     323              :                      sizeof(spdm_encapsulated_request_response_t) +
     324              :                      sizeof(spdm_challenge_request_t));
     325            1 :     spdm_response_requester = (void *)response;
     326            1 :     assert_int_equal(spdm_response_requester->header.spdm_version, SPDM_MESSAGE_VERSION_11);
     327            1 :     assert_int_equal(spdm_response_requester->header.request_response_code,
     328              :                      SPDM_ENCAPSULATED_REQUEST);
     329            1 :     assert_int_equal(spdm_response_requester->header.param1, 0x1);
     330            1 :     assert_int_equal(spdm_response_requester->header.param2, 0);
     331            1 :     free(data);
     332            1 : }
     333              : #endif /* LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_SEND_CHALLENGE_SUPPORT) */
     334              : 
     335            1 : static void rsp_encapsulated_request_case6(void **State)
     336              : {
     337              :     libspdm_return_t status;
     338              :     libspdm_test_context_t *spdm_test_context;
     339              :     spdm_encapsulated_request_response_t *spdm_response_requester;
     340              :     libspdm_context_t *spdm_context;
     341              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     342              :     size_t data_size;
     343              :     void *data;
     344              :     size_t response_size;
     345              :     uint32_t session_id;
     346              :     libspdm_session_info_t *session_info;
     347              : 
     348            1 :     spdm_test_context = *State;
     349            1 :     spdm_context = spdm_test_context->spdm_context;
     350            1 :     spdm_test_context->case_id = 0x6;
     351              : 
     352            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
     353            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     354            1 :     spdm_context->connection_info.capability.flags |=
     355              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_UPD_CAP;
     356            1 :     spdm_context->local_context.capability.flags |=
     357              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_UPD_CAP;
     358            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
     359            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
     360            1 :     spdm_context->encap_context.request_op_code_count =
     361              :         LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
     362            1 :     spdm_context->encap_context.current_request_op_code = 0;
     363            1 :     spdm_context->encap_context.request_op_code_sequence[0] = SPDM_KEY_UPDATE;
     364            1 :     spdm_context->encap_context.request_id = 0;
     365              : 
     366            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     367            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
     368            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     369              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     370            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     371              :                                                     m_libspdm_use_asym_algo, &data,
     372              :                                                     &data_size,
     373              :                                                     NULL, NULL);
     374            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     375            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     376            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     377            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     378            1 :     libspdm_reset_message_b(spdm_context);
     379              : 
     380            1 :     session_id = 0xFFFFFFFF;
     381            1 :     spdm_context->latest_session_id = session_id;
     382            1 :     spdm_context->last_spdm_request_session_id_valid = true;
     383            1 :     spdm_context->last_spdm_request_session_id = session_id;
     384            1 :     session_info = &spdm_context->session_info[0];
     385            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
     386              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     387            1 :     libspdm_secured_message_set_session_state(session_info->secured_message_context,
     388              :                                               LIBSPDM_SESSION_STATE_ESTABLISHED);
     389              : 
     390            1 :     response_size = sizeof(response);
     391            1 :     status = libspdm_get_response_encapsulated_request(spdm_context,
     392              :                                                        m_libspdm_encapsulated_request_t1_size,
     393              :                                                        &m_libspdm_encapsulated_request_t1,
     394              :                                                        &response_size,
     395              :                                                        response);
     396              : 
     397            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     398            1 :     assert_int_equal(response_size,
     399              :                      sizeof(spdm_encapsulated_request_response_t) +
     400              :                      sizeof(spdm_key_update_response_t));
     401            1 :     spdm_response_requester = (void *)response;
     402            1 :     assert_int_equal(spdm_response_requester->header.request_response_code,
     403              :                      SPDM_ENCAPSULATED_REQUEST);
     404            1 :     assert_int_equal(spdm_response_requester->header.param1, 0x1);
     405            1 :     assert_int_equal(spdm_response_requester->header.param2, 0);
     406            1 :     free(data);
     407            1 : }
     408              : 
     409            1 : static void rsp_encapsulated_request_case7(void **State)
     410              : {
     411              :     libspdm_return_t status;
     412              :     libspdm_test_context_t *spdm_test_context;
     413              :     spdm_error_response_t *spdm_response_requester;
     414              :     libspdm_context_t *spdm_context;
     415              :     size_t response_size;
     416              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     417              :     uint8_t m_local_certificate_chain[LIBSPDM_MAX_CERT_CHAIN_SIZE];
     418              : 
     419            1 :     spdm_test_context = *State;
     420            1 :     spdm_context = spdm_test_context->spdm_context;
     421            1 :     spdm_test_context->case_id = 0x7;
     422              : 
     423            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     424              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     425            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
     426            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
     427            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
     428              : 
     429            1 :     spdm_context->encap_context.current_request_op_code = 0;
     430            1 :     spdm_context->encap_context.request_id = 0;
     431            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     432            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
     433            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     434            1 :     spdm_context->local_context.local_cert_chain_provision[0] = m_local_certificate_chain;
     435            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
     436              :         sizeof(m_local_certificate_chain);
     437            1 :     libspdm_set_mem(m_local_certificate_chain, sizeof(m_local_certificate_chain), 0xFF);
     438              : 
     439            1 :     response_size = sizeof(response);
     440            1 :     status = libspdm_get_response_encapsulated_request(spdm_context,
     441              :                                                        m_libspdm_encapsulated_request_t2_size,
     442              :                                                        &m_libspdm_encapsulated_request_t2,
     443              :                                                        &response_size,
     444              :                                                        response);
     445              : 
     446            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     447            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     448            1 :     spdm_response_requester = (void *)response;
     449            1 :     assert_int_equal(spdm_response_requester->header.request_response_code, SPDM_ERROR);
     450            1 :     assert_int_equal(spdm_response_requester->header.param1, SPDM_ERROR_CODE_NO_PENDING_REQUESTS);
     451            1 :     assert_int_equal(spdm_response_requester->header.param2, 0);
     452            1 : }
     453              : 
     454              : #if LIBSPDM_SEND_GET_ENDPOINT_INFO_SUPPORT
     455            0 : static libspdm_return_t get_endpoint_info_callback_encap_response (
     456              :     void *spdm_context,
     457              :     uint8_t subcode,
     458              :     uint8_t param2,
     459              :     uint8_t request_attributes,
     460              :     uint32_t endpoint_info_size,
     461              :     const void *endpoint_info)
     462              : {
     463              :     /* should never reach here */
     464            0 :     LIBSPDM_ASSERT (0);
     465            0 :     return LIBSPDM_STATUS_UNSUPPORTED_CAP;
     466              : }
     467              : 
     468            1 : static void rsp_encapsulated_request_case8(void **State)
     469              : {
     470              :     libspdm_return_t status;
     471              :     libspdm_test_context_t *spdm_test_context;
     472              :     spdm_encapsulated_request_response_t *spdm_response_requester;
     473              :     libspdm_context_t *spdm_context;
     474              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     475              :     size_t data_size;
     476              :     void *data;
     477              :     size_t response_size;
     478              :     uint32_t session_id;
     479              :     libspdm_session_info_t *session_info;
     480              : 
     481            1 :     spdm_test_context = *State;
     482            1 :     spdm_context = spdm_test_context->spdm_context;
     483            1 :     spdm_test_context->case_id = 0x6;
     484              : 
     485            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
     486            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     487            1 :     spdm_context->connection_info.capability.flags |=
     488              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_EP_INFO_CAP_SIG;
     489            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
     490            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
     491            1 :     spdm_context->encap_context.request_op_code_count =
     492              :         LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
     493            1 :     spdm_context->encap_context.current_request_op_code = 0;
     494            1 :     spdm_context->encap_context.request_op_code_sequence[0] = SPDM_GET_ENDPOINT_INFO;
     495            1 :     spdm_context->encap_context.request_id = 0;
     496              : 
     497            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     498            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
     499            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     500              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     501            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     502              :                                                     m_libspdm_use_req_asym_algo, &data,
     503              :                                                     &data_size,
     504              :                                                     NULL, NULL);
     505            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     506            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     507            1 :     spdm_context->connection_info.algorithm.req_base_asym_alg = m_libspdm_use_req_asym_algo;
     508            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     509            1 :     spdm_context->get_endpoint_info_callback = get_endpoint_info_callback_encap_response;
     510              : 
     511              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     512              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = data_size;
     513              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
     514              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
     515              :                      data, data_size);
     516              : #else
     517            1 :     libspdm_hash_all(
     518              :         spdm_context->connection_info.algorithm.base_hash_algo,
     519              :         data, data_size,
     520            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
     521            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
     522            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
     523            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
     524              :         spdm_context->connection_info.algorithm.base_hash_algo,
     525              :         spdm_context->connection_info.algorithm.base_asym_algo,
     526              :         data, data_size,
     527              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
     528              : #endif
     529              : 
     530            1 :     session_id = 0xFFFFFFFF;
     531            1 :     spdm_context->latest_session_id = session_id;
     532            1 :     spdm_context->last_spdm_request_session_id_valid = true;
     533            1 :     spdm_context->last_spdm_request_session_id = session_id;
     534            1 :     session_info = &spdm_context->session_info[0];
     535            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
     536              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     537            1 :     libspdm_secured_message_set_session_state(session_info->secured_message_context,
     538              :                                               LIBSPDM_SESSION_STATE_ESTABLISHED);
     539              : 
     540            1 :     libspdm_reset_message_a(spdm_context);
     541            1 :     libspdm_reset_message_encap_e(spdm_context, session_info);
     542              : 
     543            1 :     response_size = sizeof(response);
     544            1 :     status = libspdm_get_response_encapsulated_request(spdm_context,
     545              :                                                        m_libspdm_encapsulated_request_t2_size,
     546              :                                                        &m_libspdm_encapsulated_request_t2,
     547              :                                                        &response_size,
     548              :                                                        response);
     549              : 
     550            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     551              : 
     552            1 :     assert_int_equal(response_size,
     553              :                      sizeof(spdm_encapsulated_request_response_t) +
     554              :                      sizeof(spdm_get_endpoint_info_request_t) +
     555              :                      SPDM_NONCE_SIZE);
     556            1 :     spdm_response_requester = (void *)response;
     557            1 :     assert_int_equal(spdm_response_requester->header.request_response_code,
     558              :                      SPDM_ENCAPSULATED_REQUEST);
     559            1 :     assert_int_equal(spdm_response_requester->header.param1, 0x1);
     560            1 :     assert_int_equal(spdm_response_requester->header.param2, 0);
     561            1 :     free(data);
     562            1 : }
     563              : #endif /* LIBSPDM_SEND_GET_ENDPOINT_INFO_SUPPORT */
     564              : 
     565            1 : static void rsp_encapsulated_response_ack_case1(void **State)
     566              : {
     567              :     libspdm_return_t status;
     568              :     libspdm_test_context_t *spdm_test_context;
     569              :     libspdm_context_t *spdm_context;
     570              :     spdm_deliver_encapsulated_response_request_t *spdm_response_requester;
     571              :     spdm_digest_response_t *spdm_response_requester_digest;
     572              :     uint8_t temp_buf[LIBSPDM_MAX_SPDM_MSG_SIZE];
     573              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     574              :     size_t spdm_response_requester_size;
     575              :     size_t spdm_response_requester_digest_size;
     576              :     size_t data_size;
     577              :     size_t response_size;
     578              :     uint8_t *digest;
     579              :     void *data;
     580              : 
     581            1 :     spdm_test_context = *State;
     582            1 :     spdm_context = spdm_test_context->spdm_context;
     583              : 
     584            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
     585            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
     586            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
     587            1 :     spdm_context->encap_context.request_op_code_count =
     588              :         LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
     589              : 
     590            1 :     spdm_context->encap_context.current_request_op_code = SPDM_GET_DIGESTS;
     591            1 :     spdm_context->encap_context.request_op_code_sequence[0] = SPDM_GET_DIGESTS;
     592              : 
     593            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     594            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
     595            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     596              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     597            1 :     spdm_context->encap_context.request_id = 0;
     598            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     599              :                                                     m_libspdm_use_asym_algo, &data,
     600              :                                                     &data_size,
     601              :                                                     NULL, NULL);
     602            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     603            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     604            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     605            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     606            1 :     libspdm_reset_message_b(spdm_context);
     607              : 
     608            1 :     spdm_response_requester_size = sizeof(spdm_digest_response_t) +
     609            1 :                                    libspdm_get_hash_size(m_libspdm_use_hash_algo) +
     610              :                                    sizeof(spdm_deliver_encapsulated_response_request_t);
     611              : 
     612            1 :     spdm_response_requester = (void *)temp_buf;
     613            1 :     libspdm_copy_mem(spdm_response_requester,
     614              :                      sizeof(temp_buf),
     615              :                      &m_libspdm_m_deliver_encapsulated_response_request_t1,
     616              :                      m_libspdm_m_deliver_encapsulated_response_request_t1_size);
     617              : 
     618            1 :     spdm_response_requester_digest_size = sizeof(spdm_digest_response_t) +
     619            1 :                                           libspdm_get_hash_size(m_libspdm_use_hash_algo);
     620            1 :     spdm_response_requester_digest =
     621              :         (void *)(temp_buf + sizeof(spdm_deliver_encapsulated_response_request_t));
     622            1 :     spdm_response_requester_digest->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     623            1 :     spdm_response_requester_digest->header.param1 = 0;
     624            1 :     spdm_response_requester_digest->header.request_response_code = SPDM_DIGESTS;
     625            1 :     spdm_response_requester_digest->header.param2 = 0;
     626              : 
     627            1 :     digest = (void *)(spdm_response_requester_digest + 1);
     628            1 :     libspdm_hash_all(m_libspdm_use_hash_algo, m_libspdm_local_certificate_chain,
     629              :                      sizeof(m_libspdm_local_certificate_chain), &digest[0]);
     630            1 :     spdm_response_requester_digest->header.param2 |= (0x01 << 0);
     631              : 
     632            1 :     libspdm_set_mem(m_libspdm_local_certificate_chain,
     633              :                     sizeof(m_libspdm_local_certificate_chain),
     634              :                     (uint8_t)(0xFF));
     635              : 
     636            1 :     libspdm_copy_mem(spdm_response_requester + 1,
     637              :                      spdm_response_requester_digest_size,
     638              :                      spdm_response_requester_digest,
     639              :                      spdm_response_requester_digest_size);
     640              : 
     641            1 :     response_size = sizeof(response);
     642            1 :     status = libspdm_get_response_encapsulated_response_ack(spdm_context,
     643              :                                                             spdm_response_requester_size,
     644              :                                                             spdm_response_requester, &response_size,
     645              :                                                             response);
     646            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     647            1 :     free(data);
     648            1 : }
     649              : 
     650            1 : static void rsp_encapsulated_response_ack_case2(void **State)
     651              : {
     652              :     libspdm_return_t status;
     653              :     libspdm_test_context_t *spdm_test_context;
     654              :     libspdm_context_t *spdm_context;
     655              :     spdm_deliver_encapsulated_response_request_t *spdm_response_requester;
     656              :     spdm_certificate_response_t *spdm_response_requester_certificate;
     657              :     uint8_t temp_buf[LIBSPDM_MAX_SPDM_MSG_SIZE];
     658              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     659              :     size_t spdm_response_requester_size;
     660              :     size_t data_size;
     661              :     size_t response_size;
     662              :     void *data;
     663              :     uint16_t portion_length;
     664              :     uint16_t remainder_length;
     665              :     static size_t calling_index = 0;
     666              : 
     667              :     static void *libspdm_local_certificate_chain;
     668              :     static size_t libspdm_local_certificate_chain_size;
     669              : 
     670            1 :     spdm_test_context = *State;
     671            1 :     spdm_context = spdm_test_context->spdm_context;
     672              : 
     673            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
     674            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
     675            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
     676            1 :     spdm_context->encap_context.request_op_code_count =
     677              :         LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
     678              : 
     679            1 :     spdm_context->encap_context.current_request_op_code = SPDM_GET_CERTIFICATE;
     680            1 :     spdm_context->encap_context.request_op_code_sequence[0] = SPDM_GET_CERTIFICATE;
     681              : 
     682            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     683            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
     684            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     685              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     686            1 :     spdm_context->encap_context.request_id = 0;
     687            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     688              :                                                     m_libspdm_use_asym_algo, &data,
     689              :                                                     &data_size,
     690              :                                                     NULL, NULL);
     691            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     692            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     693            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     694            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     695            1 :     libspdm_reset_message_b(spdm_context);
     696              : 
     697            1 :     spdm_response_requester = (void *)temp_buf;
     698            1 :     libspdm_copy_mem(spdm_response_requester,
     699              :                      sizeof(temp_buf),
     700              :                      &m_libspdm_m_deliver_encapsulated_response_request_t1,
     701              :                      m_libspdm_m_deliver_encapsulated_response_request_t1_size);
     702              : 
     703            1 :     spdm_response_requester_certificate =
     704              :         (void *)(temp_buf + sizeof(spdm_deliver_encapsulated_response_request_t));
     705              : 
     706            1 :     libspdm_read_responder_public_certificate_chain(
     707              :         m_libspdm_use_hash_algo, m_libspdm_use_asym_algo,
     708              :         &libspdm_local_certificate_chain,
     709              :         &libspdm_local_certificate_chain_size, NULL, NULL);
     710              : 
     711            1 :     portion_length = LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN;
     712            1 :     remainder_length = (uint16_t)(libspdm_local_certificate_chain_size -
     713            1 :                                   (LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN * (calling_index + 1)));
     714              : 
     715            1 :     spdm_response_requester_certificate->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     716            1 :     spdm_response_requester_certificate->header.request_response_code = SPDM_CERTIFICATE;
     717            1 :     spdm_response_requester_certificate->header.param1 = 0;
     718            1 :     spdm_response_requester_certificate->header.param2 = 0;
     719            1 :     spdm_response_requester_certificate->portion_length = portion_length;
     720            1 :     spdm_response_requester_certificate->remainder_length = remainder_length;
     721              : 
     722            1 :     libspdm_copy_mem(spdm_response_requester_certificate + 1,
     723              :                      sizeof(temp_buf) - sizeof(*spdm_response_requester_certificate),
     724            1 :                      (uint8_t *)libspdm_local_certificate_chain +
     725            1 :                      LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN * calling_index,
     726              :                      portion_length);
     727              : 
     728            1 :     free(libspdm_local_certificate_chain);
     729              : 
     730            1 :     response_size = sizeof(response);
     731            1 :     spdm_response_requester_size = sizeof(spdm_certificate_response_t) + portion_length +
     732              :                                    sizeof(spdm_deliver_encapsulated_response_request_t);
     733            1 :     status = libspdm_get_response_encapsulated_response_ack(spdm_context,
     734              :                                                             spdm_response_requester_size,
     735              :                                                             spdm_response_requester, &response_size,
     736              :                                                             response);
     737            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     738            1 :     free(data);
     739            1 : }
     740              : 
     741            1 : static void rsp_encapsulated_response_ack_case3(void **State)
     742              : {
     743              :     libspdm_return_t status;
     744              :     libspdm_test_context_t *spdm_test_context;
     745              :     libspdm_context_t *spdm_context;
     746              :     spdm_deliver_encapsulated_response_request_t *spdm_response_requester;
     747              :     spdm_key_update_response_t *spdm_response_requester_key_update;
     748              :     uint8_t temp_buf[LIBSPDM_MAX_SPDM_MSG_SIZE];
     749              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     750              :     size_t spdm_response_requester_size;
     751              :     size_t data_size;
     752              :     size_t response_size;
     753              :     void *data;
     754              :     uint32_t session_id;
     755              :     libspdm_session_info_t *session_info;
     756              : 
     757            1 :     spdm_test_context = *State;
     758            1 :     spdm_context = spdm_test_context->spdm_context;
     759              : 
     760            1 :     spdm_context->last_spdm_request_session_id_valid = true;
     761            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
     762            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
     763            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
     764            1 :     spdm_context->encap_context.request_op_code_count =
     765              :         LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
     766              : 
     767            1 :     spdm_context->encap_context.current_request_op_code = SPDM_KEY_UPDATE;
     768            1 :     spdm_context->encap_context.request_op_code_sequence[0] = SPDM_KEY_UPDATE;
     769              : 
     770            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     771            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
     772            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     773              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     774            1 :     spdm_context->encap_context.request_id = 0;
     775            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     776              :                                                     m_libspdm_use_asym_algo, &data,
     777              :                                                     &data_size,
     778              :                                                     NULL, NULL);
     779            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     780            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     781            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     782            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     783              : 
     784            1 :     libspdm_reset_message_b(spdm_context);
     785              : 
     786            1 :     session_id = 0xFFFFFFFF;
     787            1 :     spdm_context->latest_session_id = session_id;
     788            1 :     spdm_context->last_spdm_request_session_id_valid = true;
     789            1 :     spdm_context->last_spdm_request_session_id = session_id;
     790            1 :     session_info = &spdm_context->session_info[0];
     791            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
     792              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     793            1 :     libspdm_secured_message_set_session_state(session_info->secured_message_context,
     794              :                                               LIBSPDM_SESSION_STATE_ESTABLISHED);
     795              : 
     796            1 :     spdm_context->encap_context.last_encap_request_header.spdm_version = SPDM_MESSAGE_VERSION_11;
     797            1 :     spdm_context->encap_context.last_encap_request_header.request_response_code =
     798              :         SPDM_KEY_UPDATE_ACK;
     799            1 :     spdm_context->encap_context.last_encap_request_header.param1 =
     800              :         SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
     801            1 :     spdm_context->encap_context.last_encap_request_header.param2 = 0;
     802              : 
     803            1 :     spdm_response_requester = (void *)temp_buf;
     804            1 :     libspdm_copy_mem(spdm_response_requester,
     805              :                      sizeof(temp_buf),
     806              :                      &m_libspdm_m_deliver_encapsulated_response_request_t1,
     807              :                      m_libspdm_m_deliver_encapsulated_response_request_t1_size);
     808              : 
     809            1 :     spdm_response_requester_key_update =
     810              :         (void *)(temp_buf + sizeof(spdm_deliver_encapsulated_response_request_t));
     811              : 
     812            1 :     spdm_response_requester_key_update->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     813            1 :     spdm_response_requester_key_update->header.request_response_code = SPDM_KEY_UPDATE_ACK;
     814            1 :     spdm_response_requester_key_update->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
     815            1 :     spdm_response_requester_key_update->header.param2 = 0;
     816              : 
     817            1 :     response_size = sizeof(response);
     818            1 :     spdm_response_requester_size = sizeof(spdm_key_update_response_t) +
     819              :                                    sizeof(spdm_deliver_encapsulated_response_request_t);
     820            1 :     status = libspdm_get_response_encapsulated_response_ack(spdm_context,
     821              :                                                             spdm_response_requester_size,
     822              :                                                             spdm_response_requester, &response_size,
     823              :                                                             response);
     824            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     825            1 :     free(data);
     826            1 : }
     827              : 
     828            1 : static void rsp_encapsulated_response_ack_case4(void **State)
     829              : {
     830              :     libspdm_return_t status;
     831              :     spdm_encapsulated_request_response_t *spdm_response_requester;
     832              :     libspdm_test_context_t *spdm_test_context;
     833              :     libspdm_context_t *spdm_context;
     834              :     size_t response_size;
     835            1 :     spdm_test_context = *State;
     836            1 :     spdm_context = spdm_test_context->spdm_context;
     837              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     838              : 
     839            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
     840            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
     841            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
     842            1 :     spdm_context->encap_context.request_op_code_count =
     843              :         LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
     844            1 :     spdm_context->encap_context.current_request_op_code = 0;
     845            1 :     libspdm_reset_message_b(spdm_context);
     846              : 
     847            1 :     response_size = sizeof(response);
     848            1 :     status = libspdm_get_response_encapsulated_response_ack(spdm_context,
     849              :                                                             m_libspdm_m_deliver_encapsulated_response_request_t1_size,
     850              :                                                             &m_libspdm_m_deliver_encapsulated_response_request_t1,
     851              :                                                             &response_size,
     852              :                                                             response);
     853            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     854            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     855            1 :     spdm_response_requester = (void *)response;
     856            1 :     assert_int_equal(spdm_response_requester->header.request_response_code, SPDM_ERROR);
     857            1 :     assert_int_equal(spdm_response_requester->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
     858            1 :     assert_int_equal(spdm_response_requester->header.param2, 0);
     859            1 : }
     860              : 
     861            1 : static void rsp_encapsulated_response_ack_case5(void **State)
     862              : {
     863              :     libspdm_return_t status;
     864              :     spdm_encapsulated_request_response_t *spdm_response_requester;
     865              :     libspdm_test_context_t *spdm_test_context;
     866              :     libspdm_context_t *spdm_context;
     867              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     868              :     size_t response_size;
     869            1 :     spdm_test_context = *State;
     870            1 :     spdm_context = spdm_test_context->spdm_context;
     871              : 
     872            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
     873            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
     874            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
     875            1 :     spdm_context->encap_context.request_op_code_count =
     876              :         LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
     877            1 :     spdm_context->encap_context.current_request_op_code = 0;
     878              : 
     879            1 :     response_size = sizeof(response);
     880            1 :     status = libspdm_get_response_encapsulated_response_ack(spdm_context,
     881              :                                                             m_libspdm_m_deliver_encapsulated_response_request_t1_size,
     882              :                                                             &m_libspdm_m_deliver_encapsulated_response_request_t1,
     883              :                                                             &response_size,
     884              :                                                             response);
     885            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     886            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     887            1 :     spdm_response_requester = (void *)response;
     888            1 :     assert_int_equal(spdm_response_requester->header.request_response_code, SPDM_ERROR);
     889            1 :     assert_int_equal(spdm_response_requester->header.param1, SPDM_ERROR_CODE_UNEXPECTED_REQUEST);
     890            1 :     assert_int_equal(spdm_response_requester->header.param2, 0);
     891            1 : }
     892              : 
     893            1 : static void rsp_encapsulated_response_ack_case6(void **State)
     894              : {
     895              :     libspdm_return_t status;
     896              :     spdm_encapsulated_request_response_t *spdm_response_requester;
     897              :     libspdm_test_context_t *spdm_test_context;
     898              :     libspdm_context_t *spdm_context;
     899              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     900              :     size_t response_size;
     901              :     size_t data_size;
     902              :     void *data;
     903              : 
     904            1 :     spdm_test_context = *State;
     905            1 :     spdm_context = spdm_test_context->spdm_context;
     906              : 
     907            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NEED_RESYNC;
     908            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     909            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
     910            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
     911            1 :     spdm_context->encap_context.request_op_code_count =
     912              :         LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
     913              : 
     914            1 :     status = libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     915              :                                                              m_libspdm_use_asym_algo, &data,
     916              :                                                              &data_size,
     917              :                                                              NULL, NULL);
     918            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     919            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     920            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     921            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     922              : 
     923            1 :     response_size = sizeof(response);
     924            1 :     status = libspdm_get_response_encapsulated_response_ack(spdm_context,
     925              :                                                             m_libspdm_m_deliver_encapsulated_response_request_t1_size,
     926              :                                                             &m_libspdm_m_deliver_encapsulated_response_request_t1,
     927              :                                                             &response_size,
     928              :                                                             response);
     929            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     930            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     931            1 :     spdm_response_requester = (void *)response;
     932            1 :     assert_int_equal(spdm_response_requester->header.request_response_code, SPDM_ERROR);
     933            1 :     assert_int_equal(spdm_response_requester->header.param1, SPDM_ERROR_CODE_REQUEST_RESYNCH);
     934            1 :     assert_int_equal(spdm_response_requester->header.param2, 0);
     935            1 : }
     936              : 
     937            1 : static void rsp_encapsulated_response_ack_case7(void **State)
     938              : {
     939              :     libspdm_return_t status;
     940              :     libspdm_test_context_t *spdm_test_context;
     941              :     libspdm_context_t *spdm_context;
     942              :     spdm_deliver_encapsulated_response_request_t *spdm_response_requester;
     943              :     spdm_certificate_response_t *spdm_response_requester_certificate;
     944              :     uint8_t temp_buf[LIBSPDM_MAX_SPDM_MSG_SIZE];
     945              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     946              :     size_t spdm_response_requester_size;
     947              :     size_t data_size;
     948              :     size_t response_size;
     949              :     void *data;
     950              :     uint16_t portion_length;
     951              :     uint16_t remainder_length;
     952              :     static size_t calling_index = 0;
     953              : 
     954              :     static void *libspdm_local_certificate_chain;
     955              :     static size_t libspdm_local_certificate_chain_size;
     956              : 
     957            1 :     spdm_test_context = *State;
     958            1 :     spdm_context = spdm_test_context->spdm_context;
     959              : 
     960            1 :     spdm_context->encap_context.request_id = 0xFF;
     961            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
     962            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
     963            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
     964            1 :     spdm_context->encap_context.request_op_code_count =
     965              :         LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
     966              : 
     967            1 :     spdm_context->encap_context.current_request_op_code = SPDM_GET_CERTIFICATE;
     968            1 :     spdm_context->encap_context.request_op_code_sequence[0] = SPDM_GET_CERTIFICATE;
     969              : 
     970            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     971            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
     972            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     973              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     974            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     975              :                                                     m_libspdm_use_asym_algo, &data,
     976              :                                                     &data_size,
     977              :                                                     NULL, NULL);
     978            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     979            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     980            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     981            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     982            1 :     libspdm_reset_message_b(spdm_context);
     983              : 
     984            1 :     spdm_response_requester = (void *)temp_buf;
     985            1 :     libspdm_copy_mem(spdm_response_requester,
     986              :                      sizeof(temp_buf),
     987              :                      &m_libspdm_m_deliver_encapsulated_response_request_t1,
     988              :                      m_libspdm_m_deliver_encapsulated_response_request_t1_size);
     989              : 
     990            1 :     spdm_response_requester_certificate =
     991              :         (void *)(temp_buf + sizeof(spdm_deliver_encapsulated_response_request_t));
     992              : 
     993            1 :     libspdm_read_responder_public_certificate_chain(
     994              :         m_libspdm_use_hash_algo, m_libspdm_use_asym_algo,
     995              :         &libspdm_local_certificate_chain,
     996              :         &libspdm_local_certificate_chain_size, NULL, NULL);
     997              : 
     998            1 :     portion_length = LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN;
     999            1 :     remainder_length = (uint16_t)(libspdm_local_certificate_chain_size -
    1000            1 :                                   (LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN * (calling_index + 1)));
    1001              : 
    1002            1 :     spdm_response_requester_certificate->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1003            1 :     spdm_response_requester_certificate->header.request_response_code = SPDM_CERTIFICATE;
    1004            1 :     spdm_response_requester_certificate->header.param1 = 0;
    1005            1 :     spdm_response_requester_certificate->header.param2 = 0;
    1006            1 :     spdm_response_requester_certificate->portion_length = portion_length;
    1007            1 :     spdm_response_requester_certificate->remainder_length = remainder_length;
    1008              : 
    1009            1 :     libspdm_copy_mem(spdm_response_requester_certificate + 1,
    1010              :                      sizeof(temp_buf) - sizeof(*spdm_response_requester_certificate),
    1011            1 :                      (uint8_t *)libspdm_local_certificate_chain +
    1012            1 :                      LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN * calling_index,
    1013              :                      portion_length);
    1014              : 
    1015            1 :     free(libspdm_local_certificate_chain);
    1016              : 
    1017            1 :     response_size = sizeof(response);
    1018            1 :     spdm_response_requester_size = sizeof(spdm_certificate_response_t) + portion_length +
    1019              :                                    sizeof(spdm_deliver_encapsulated_response_request_t);
    1020            1 :     status = libspdm_get_response_encapsulated_response_ack(spdm_context,
    1021              :                                                             spdm_response_requester_size,
    1022              :                                                             spdm_response_requester, &response_size,
    1023              :                                                             response);
    1024            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1025            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
    1026            1 :     spdm_response_requester = (void *)response;
    1027            1 :     assert_int_equal(spdm_response_requester->header.request_response_code, SPDM_ERROR);
    1028            1 :     assert_int_equal(spdm_response_requester->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1029            1 :     assert_int_equal(spdm_response_requester->header.param2, 0);
    1030            1 :     free(data);
    1031            1 : }
    1032              : 
    1033            1 : static void rsp_encapsulated_response_ack_case8(void **State)
    1034              : {
    1035              :     libspdm_return_t status;
    1036              :     libspdm_test_context_t *spdm_test_context;
    1037              :     libspdm_context_t *spdm_context;
    1038              :     spdm_encapsulated_response_ack_response_t *spdm_response;
    1039              :     spdm_deliver_encapsulated_response_request_t *spdm_response_requester;
    1040              :     spdm_digest_response_t *spdm_response_requester_digest;
    1041              :     uint8_t temp_buf[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1042              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1043              :     size_t spdm_response_requester_size;
    1044              :     size_t spdm_response_requester_digest_size;
    1045              :     size_t data_size;
    1046              :     size_t response_size;
    1047              :     uint8_t *digest;
    1048              :     void *data;
    1049              : 
    1050            1 :     spdm_test_context = *State;
    1051            1 :     spdm_context = spdm_test_context->spdm_context;
    1052              : 
    1053            1 :     spdm_context->encap_context.request_id = 0xFF;
    1054            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
    1055            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
    1056            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
    1057            1 :     spdm_context->encap_context.request_op_code_count =
    1058              :         LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
    1059              : 
    1060            1 :     spdm_context->encap_context.current_request_op_code = SPDM_GET_DIGESTS;
    1061            1 :     spdm_context->encap_context.request_op_code_sequence[0] = SPDM_GET_DIGESTS;
    1062              : 
    1063            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1064            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
    1065            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
    1066              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1067            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1068              :                                                     m_libspdm_use_asym_algo, &data,
    1069              :                                                     &data_size,
    1070              :                                                     NULL, NULL);
    1071            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
    1072            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
    1073            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    1074            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1075            1 :     libspdm_reset_message_b(spdm_context);
    1076              : 
    1077            1 :     spdm_response_requester_size = sizeof(spdm_digest_response_t) +
    1078            1 :                                    libspdm_get_hash_size(m_libspdm_use_hash_algo) +
    1079              :                                    sizeof(spdm_deliver_encapsulated_response_request_t);
    1080              : 
    1081            1 :     spdm_response_requester = (void *)temp_buf;
    1082            1 :     libspdm_copy_mem(spdm_response_requester,
    1083              :                      sizeof(temp_buf),
    1084              :                      &m_libspdm_m_deliver_encapsulated_response_request_t2,
    1085              :                      m_libspdm_m_deliver_encapsulated_response_request_t2_size);
    1086              : 
    1087            1 :     spdm_response_requester_digest_size = sizeof(spdm_digest_response_t) +
    1088            1 :                                           libspdm_get_hash_size(m_libspdm_use_hash_algo);
    1089            1 :     spdm_response_requester_digest =
    1090              :         (void *)(temp_buf + sizeof(spdm_deliver_encapsulated_response_request_t));
    1091            1 :     spdm_response_requester_digest->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1092            1 :     spdm_response_requester_digest->header.param1 = 0;
    1093            1 :     spdm_response_requester_digest->header.request_response_code = SPDM_DIGESTS;
    1094            1 :     spdm_response_requester_digest->header.param2 = 0;
    1095              : 
    1096            1 :     digest = (void *)(spdm_response_requester_digest + 1);
    1097            1 :     libspdm_hash_all(m_libspdm_use_hash_algo, m_libspdm_local_certificate_chain,
    1098              :                      sizeof(m_libspdm_local_certificate_chain), &digest[0]);
    1099            1 :     spdm_response_requester_digest->header.param2 |= (0x01 << 0);
    1100              : 
    1101            1 :     libspdm_set_mem(m_libspdm_local_certificate_chain,
    1102              :                     sizeof(m_libspdm_local_certificate_chain),
    1103              :                     (uint8_t)(0xFF));
    1104              : 
    1105            1 :     libspdm_copy_mem(spdm_response_requester + 1,
    1106              :                      spdm_response_requester_digest_size,
    1107              :                      spdm_response_requester_digest,
    1108              :                      spdm_response_requester_digest_size);
    1109              : 
    1110            1 :     response_size = sizeof(response);
    1111            1 :     status = libspdm_get_response_encapsulated_response_ack(spdm_context,
    1112              :                                                             spdm_response_requester_size,
    1113              :                                                             spdm_response_requester, &response_size,
    1114              :                                                             response);
    1115            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1116            1 :     assert_int_equal(response_size, sizeof(spdm_encapsulated_response_ack_response_t));
    1117            1 :     spdm_response = (void *)response;
    1118            1 :     assert_int_equal(spdm_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
    1119            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ENCAPSULATED_RESPONSE_ACK);
    1120            1 :     assert_int_equal(spdm_response->header.param1, 0);
    1121            1 :     assert_int_equal(spdm_response->header.param2,
    1122              :                      SPDM_ENCAPSULATED_RESPONSE_ACK_RESPONSE_PAYLOAD_TYPE_ABSENT);
    1123            1 :     assert_int_equal(spdm_response->ack_request_id,
    1124              :                      m_libspdm_m_deliver_encapsulated_response_request_t2.header.param1);
    1125            1 :     free(data);
    1126            1 : }
    1127              : 
    1128              : /**
    1129              :  * Test 9: In an encapsulated request flow, a Responder issue an encapsulated request that can take up to CT time to
    1130              :  * fulfill, then the Requester deliver an encapsulated ERROR message with a ResponseNotReady error code.
    1131              :  * Expected behavior: the Responder shall not encapsulate another request by setting Param2 in ENCAPSULATED_RESPONSE_ACK
    1132              :  * to a value of zero.
    1133              :  **/
    1134            1 : static void rsp_encapsulated_response_ack_case9(void **State)
    1135              : {
    1136              :     libspdm_return_t status;
    1137              :     libspdm_test_context_t *spdm_test_context;
    1138              :     libspdm_context_t *spdm_context;
    1139              :     spdm_encapsulated_response_ack_response_t *spdm_response;
    1140              :     spdm_deliver_encapsulated_response_request_t *spdm_request;
    1141              :     spdm_error_response_data_response_not_ready_t *EncapsulatedResponse;
    1142              :     uint8_t temp_buf[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1143              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1144              :     size_t spdm_request_size;
    1145              :     size_t EncapsulatedResponse_size;
    1146              :     size_t response_size;
    1147              : 
    1148            1 :     spdm_test_context = *State;
    1149            1 :     spdm_context = spdm_test_context->spdm_context;
    1150              : 
    1151            1 :     spdm_context->encap_context.request_id = 0xFF;
    1152            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
    1153            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
    1154            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
    1155            1 :     spdm_context->encap_context.request_op_code_count =
    1156              :         LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
    1157              : 
    1158            1 :     spdm_context->encap_context.current_request_op_code = SPDM_GET_DIGESTS;
    1159            1 :     spdm_context->encap_context.request_op_code_sequence[0] = SPDM_GET_DIGESTS;
    1160              : 
    1161            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1162            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
    1163            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
    1164              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1165            1 :     libspdm_reset_message_b(spdm_context);
    1166              : 
    1167            1 :     spdm_request_size = sizeof(spdm_deliver_encapsulated_response_request_t) +
    1168              :                         sizeof(spdm_error_response_data_response_not_ready_t);
    1169              : 
    1170            1 :     spdm_request = (void *)temp_buf;
    1171            1 :     libspdm_copy_mem(spdm_request,
    1172              :                      sizeof(temp_buf),
    1173              :                      &m_libspdm_m_deliver_encapsulated_response_request_t2,
    1174              :                      m_libspdm_m_deliver_encapsulated_response_request_t2_size);
    1175              : 
    1176            1 :     EncapsulatedResponse_size = sizeof(spdm_error_response_data_response_not_ready_t);
    1177            1 :     EncapsulatedResponse =
    1178              :         (void *)(temp_buf + sizeof(spdm_deliver_encapsulated_response_request_t));
    1179            1 :     EncapsulatedResponse->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1180            1 :     EncapsulatedResponse->header.request_response_code = SPDM_ERROR;
    1181            1 :     EncapsulatedResponse->header.param1 = SPDM_ERROR_CODE_RESPONSE_NOT_READY;
    1182            1 :     EncapsulatedResponse->header.param2 = 0;
    1183            1 :     EncapsulatedResponse->extend_error_data.rd_exponent = 1;
    1184            1 :     EncapsulatedResponse->extend_error_data.rd_tm = 1;
    1185            1 :     EncapsulatedResponse->extend_error_data.request_code = SPDM_GET_DIGESTS;
    1186            1 :     EncapsulatedResponse->extend_error_data.token = 0;
    1187              : 
    1188            1 :     libspdm_copy_mem(spdm_request + 1,
    1189              :                      EncapsulatedResponse_size,
    1190              :                      EncapsulatedResponse,
    1191              :                      EncapsulatedResponse_size);
    1192              : 
    1193            1 :     response_size = sizeof(response);
    1194            1 :     status = libspdm_get_response_encapsulated_response_ack(spdm_context,
    1195              :                                                             spdm_request_size,
    1196              :                                                             spdm_request, &response_size,
    1197              :                                                             response);
    1198            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1199            1 :     assert_int_equal(response_size, sizeof(spdm_encapsulated_response_ack_response_t));
    1200            1 :     spdm_response = (void *)response;
    1201            1 :     assert_int_equal(spdm_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
    1202            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ENCAPSULATED_RESPONSE_ACK);
    1203            1 :     assert_int_equal(spdm_response->header.param1, 0);
    1204            1 :     assert_int_equal(spdm_response->header.param2,
    1205              :                      SPDM_ENCAPSULATED_RESPONSE_ACK_RESPONSE_PAYLOAD_TYPE_ABSENT);
    1206            1 :     assert_int_equal(spdm_response->ack_request_id,
    1207              :                      m_libspdm_m_deliver_encapsulated_response_request_t2.header.param1);
    1208            1 : }
    1209              : 
    1210            1 : int libspdm_rsp_encapsulated_request_test(void)
    1211              : {
    1212            1 :     const struct CMUnitTest test_cases[] = {
    1213              : #if (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT)
    1214              :         /*Success Case request_op_code_sequence: SPDM_GET_DIGESTS*/
    1215              :         cmocka_unit_test(rsp_encapsulated_request_case1),
    1216              :         /*Success Case current_request_op_code: SPDM_GET_CERTIFICATE */
    1217              :         cmocka_unit_test(rsp_encapsulated_request_case2),
    1218              :         /*response_state : LIBSPDM_RESPONSE_STATE_NORMAL with UnexpectedRequest error. */
    1219              :         cmocka_unit_test(rsp_encapsulated_request_case3),
    1220              :         /*response_state : LIBSPDM_RESPONSE_STATE_NEED_RESYNC */
    1221              :         cmocka_unit_test(rsp_encapsulated_request_case4),
    1222              : #endif /* (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT) */
    1223              : #if (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_SEND_CHALLENGE_SUPPORT)
    1224              :         /*Success Case current_request_op_code: SPDM_CHALLENGE */
    1225              :         cmocka_unit_test(rsp_encapsulated_request_case5),
    1226              : #endif
    1227              :         /* Success Case current_request_op_code: SPDM_KEY_UPDATE */
    1228              :         cmocka_unit_test(rsp_encapsulated_request_case6),
    1229              :         /*response_state : LIBSPDM_RESPONSE_STATE_NORMAL with NoPendingRequests error. */
    1230              :         cmocka_unit_test(rsp_encapsulated_request_case7),
    1231              : #if LIBSPDM_SEND_GET_ENDPOINT_INFO_SUPPORT
    1232              :         /* Success Case current_request_op_code: SPDM_GET_ENDPOINT_INFO */
    1233              :         cmocka_unit_test(rsp_encapsulated_request_case8),
    1234              : #endif /* LIBSPDM_SEND_GET_ENDPOINT_INFO_SUPPORT */
    1235              : 
    1236              : #if (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT)
    1237              :         /*Success Case current_request_op_code: SPDM_GET_DIGESTS*/
    1238              :         cmocka_unit_test(rsp_encapsulated_response_ack_case1),
    1239              :         /*Success Case current_request_op_code: SPDM_GET_CERTIFICATE*/
    1240              :         cmocka_unit_test(rsp_encapsulated_response_ack_case2),
    1241              : #endif
    1242              :         /* Success Case current_request_op_code: SPDM_KEY_UPDATE */
    1243              :         cmocka_unit_test(rsp_encapsulated_response_ack_case3),
    1244              :         /* current_request_op_code: NULL */
    1245              :         cmocka_unit_test(rsp_encapsulated_response_ack_case4),
    1246              :         /*response_state : LIBSPDM_RESPONSE_STATE_NORMAL */
    1247              :         cmocka_unit_test(rsp_encapsulated_response_ack_case5),
    1248              :         /*response_state : LIBSPDM_RESPONSE_STATE_NEED_RESYNC */
    1249              :         cmocka_unit_test(rsp_encapsulated_response_ack_case6),
    1250              : #if (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT)
    1251              :         /*spdm_request->header.param1 != spdm_context->encap_context.request_id */
    1252              :         cmocka_unit_test(rsp_encapsulated_response_ack_case7),
    1253              :         /*Success Case  When version is greater than V1.2 */
    1254              :         cmocka_unit_test(rsp_encapsulated_response_ack_case8),
    1255              : #endif
    1256              :         /*When the Requester delivers an encapsulated ERROR message with a ResponseNotReady error code*/
    1257              :         cmocka_unit_test(rsp_encapsulated_response_ack_case9),
    1258              :     };
    1259              : 
    1260            1 :     libspdm_test_context_t test_context = {
    1261              :         LIBSPDM_TEST_CONTEXT_VERSION,
    1262              :         false,
    1263              :     };
    1264              : 
    1265            1 :     libspdm_setup_test_context(&test_context);
    1266              : 
    1267            1 :     return cmocka_run_group_tests(test_cases,
    1268              :                                   libspdm_unit_test_group_setup,
    1269              :                                   libspdm_unit_test_group_teardown);
    1270              : }
    1271              : 
    1272              : #endif /* LIBSPDM_ENABLE_CAPABILITY_ENCAP_CAP */
        

Generated by: LCOV version 2.0-1