LCOV - code coverage report
Current view: top level - unit_test/test_spdm_requester - chunk_get.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 98.6 % 567 559
Test Date: 2025-12-21 08:10:27 Functions: 100.0 % 17 17

            Line data    Source code
       1              : /**
       2              :  *  Copyright Notice:
       3              :  *  Copyright 2021-2025 DMTF. All rights reserved.
       4              :  *  License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
       5              :  **/
       6              : 
       7              : #include "spdm_unit_test.h"
       8              : #include "internal/libspdm_requester_lib.h"
       9              : #include "internal/libspdm_secured_message_lib.h"
      10              : 
      11              : #if LIBSPDM_ENABLE_CAPABILITY_CHUNK_CAP
      12              : 
      13              : static void *m_libspdm_local_certificate_chain_test_case_1;
      14              : static size_t m_libspdm_local_certificate_chain_size_test_case_1;
      15              : static uint16_t m_libspdm_local_req_msg_size_test_case_1;
      16              : 
      17              : static uint8_t m_libspdm_local_large_response_buffer[LIBSPDM_MAX_SPDM_MSG_SIZE];
      18              : 
      19              : #define BUFFER_SIZE_FOR_CHUNK_SEQ_NO_WRAP_TEST 0x200000
      20              : static uint8_t m_libspdm_local_response_buffer_for_chunk_seq_no_wrap_test[
      21              :     BUFFER_SIZE_FOR_CHUNK_SEQ_NO_WRAP_TEST];
      22              : 
      23              : static size_t m_libspdm_local_buffer_size;
      24              : static uint8_t m_libspdm_local_buffer[LIBSPDM_MAX_MESSAGE_M1M2_BUFFER_SIZE];
      25              : 
      26              : static size_t m_libspdm_local_request_buffer_size;
      27              : static uint8_t m_libspdm_local_request_buffer[LIBSPDM_MAX_SPDM_MSG_SIZE];
      28              : 
      29              : static uint8_t m_libspdm_local_certificate_chain_test_case_4[LIBSPDM_MAX_CERT_CHAIN_SIZE];
      30              : 
      31              : /* Override the LIBSPDM_DATA_TRANSFER_SIZE just for the unit tests in this file.
      32              :  * All other unit tests have the default data transfer size due to the specific
      33              :  * unit tests requests and responses hardcode for each test case. */
      34              : #define CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE (42)
      35              : 
      36              : /* Loading the target expiration certificate chain and saving root certificate hash
      37              :  * "rsa3072_Expiration/bundle_responder.certchain.der"*/
      38              : bool libspdm_libspdm_read_responder_public_certificate_chain_expiration(
      39              :     void** data, size_t* size, void** hash, size_t* hash_size);
      40              : 
      41              : #define CHUNK_GET_UNIT_TEST_CHUNK_HANDLE (10)
      42              : 
      43            1 : void libspdm_requester_chunk_get_test_case1_build_certificates_response(
      44              :     void *context, void *response, size_t *response_size,
      45              :     size_t sub_cert_index, size_t *sub_cert_count)
      46              : {
      47              :     spdm_certificate_response_t *cert_rsp;
      48              :     uint16_t sub_cert_portion_length;
      49              :     uint16_t sub_cert_remainder_length;
      50              : 
      51            1 :     if (m_libspdm_local_certificate_chain_test_case_1 == NULL) {
      52            1 :         libspdm_read_responder_public_certificate_chain(
      53              :             m_libspdm_use_hash_algo, m_libspdm_use_asym_algo,
      54              :             &m_libspdm_local_certificate_chain_test_case_1,
      55              :             &m_libspdm_local_certificate_chain_size_test_case_1, NULL, NULL);
      56              :     }
      57            1 :     LIBSPDM_ASSERT(m_libspdm_local_certificate_chain_test_case_1 != NULL);
      58              : 
      59            1 :     *sub_cert_count = (m_libspdm_local_certificate_chain_size_test_case_1 +
      60            1 :                        m_libspdm_local_req_msg_size_test_case_1 - 1) /
      61              :                       m_libspdm_local_req_msg_size_test_case_1;
      62              : 
      63            1 :     if (sub_cert_index != *sub_cert_count - 1) {
      64            0 :         sub_cert_portion_length = m_libspdm_local_req_msg_size_test_case_1;
      65            0 :         sub_cert_remainder_length =
      66            0 :             (uint16_t) (m_libspdm_local_certificate_chain_size_test_case_1 -
      67              :                         m_libspdm_local_req_msg_size_test_case_1 *
      68            0 :                         (sub_cert_index + 1));
      69              :     } else {
      70            1 :         sub_cert_portion_length = (uint16_t) (
      71              :             m_libspdm_local_certificate_chain_size_test_case_1 -
      72            1 :             m_libspdm_local_req_msg_size_test_case_1 * (*sub_cert_count - 1));
      73            1 :         sub_cert_remainder_length = 0;
      74              :     }
      75              : 
      76            1 :     cert_rsp = (spdm_certificate_response_t*) ((uint8_t*) response);
      77              : 
      78            1 :     cert_rsp->header.spdm_version = SPDM_MESSAGE_VERSION_12;
      79            1 :     cert_rsp->header.request_response_code = SPDM_CERTIFICATE;
      80            1 :     cert_rsp->header.param1 = 0;
      81            1 :     cert_rsp->header.param2 = 0;
      82            1 :     cert_rsp->portion_length = sub_cert_portion_length;
      83            1 :     cert_rsp->remainder_length = sub_cert_remainder_length;
      84              : 
      85            1 :     libspdm_copy_mem(
      86            1 :         cert_rsp + 1, sub_cert_portion_length,
      87            1 :         (uint8_t*) m_libspdm_local_certificate_chain_test_case_1 +
      88            1 :         m_libspdm_local_req_msg_size_test_case_1 * sub_cert_index,
      89              :         sub_cert_portion_length);
      90              : 
      91            1 :     *response_size = sizeof(spdm_certificate_response_t) + sub_cert_portion_length;
      92            1 : }
      93              : 
      94            1 : void libspdm_requester_chunk_get_test_case2_build_measurements_response(
      95              :     void* context, void* response, size_t* response_size)
      96              : {
      97              :     libspdm_context_t* spdm_context;
      98            1 :     spdm_measurements_response_t* meas_rsp = NULL;
      99              :     spdm_measurement_block_dmtf_t* measurment_block;
     100              : 
     101            1 :     spdm_context = (libspdm_context_t*) context;
     102              :     /* This is get measurements test case 20, but changed to SPDM version 1.2
     103              :      * which includes opaque data */
     104              : 
     105              :     uint8_t* ptr;
     106            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     107              :         m_libspdm_use_measurement_hash_algo;
     108              : 
     109            1 :     *response_size = sizeof(spdm_measurements_response_t) +
     110              :                      2 * (sizeof(spdm_measurement_block_dmtf_t) +
     111            1 :                           libspdm_get_measurement_hash_size(
     112              :                               m_libspdm_use_measurement_hash_algo)) +
     113            1 :                      SPDM_NONCE_SIZE + sizeof(uint16_t);
     114              : 
     115            1 :     meas_rsp = (spdm_measurements_response_t*)((uint8_t*) response);
     116            1 :     meas_rsp->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     117            1 :     meas_rsp->header.request_response_code = SPDM_MEASUREMENTS;
     118            1 :     meas_rsp->header.param1 = 0;
     119            1 :     meas_rsp->header.param2 = 0;
     120            1 :     meas_rsp->number_of_blocks = 2;
     121            1 :     *(uint32_t*) meas_rsp->measurement_record_length =
     122            1 :         2 * ((uint32_t) (sizeof(spdm_measurement_block_dmtf_t) +
     123            1 :                          libspdm_get_measurement_hash_size(
     124              :                              m_libspdm_use_measurement_hash_algo)));
     125            1 :     measurment_block = (void*) (meas_rsp + 1);
     126            1 :     libspdm_set_mem(
     127              :         measurment_block,
     128            1 :         2 * (sizeof(spdm_measurement_block_dmtf_t) +
     129            1 :              libspdm_get_measurement_hash_size(
     130              :                  m_libspdm_use_measurement_hash_algo)),
     131              :         1);
     132            1 :     measurment_block->measurement_block_common_header.index = 1;
     133            1 :     measurment_block->measurement_block_common_header.measurement_specification =
     134              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
     135            1 :     measurment_block->measurement_block_common_header.measurement_size =
     136            1 :         (uint16_t) (sizeof(spdm_measurement_block_dmtf_header_t) +
     137            1 :                     libspdm_get_measurement_hash_size(
     138              :                         m_libspdm_use_measurement_hash_algo));
     139            1 :     measurment_block =
     140              :         (void*) (((uint8_t*) measurment_block) +
     141            1 :                  (sizeof(spdm_measurement_block_dmtf_t) +
     142            1 :                   libspdm_get_measurement_hash_size(
     143              :                       m_libspdm_use_measurement_hash_algo)));
     144            1 :     measurment_block->measurement_block_common_header.index = 2;
     145            1 :     measurment_block->measurement_block_common_header.measurement_specification =
     146              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
     147            1 :     measurment_block->measurement_block_common_header.measurement_size =
     148            1 :         (uint16_t) (sizeof(spdm_measurement_block_dmtf_header_t) +
     149            1 :                     libspdm_get_measurement_hash_size(
     150              :                         m_libspdm_use_measurement_hash_algo));
     151            1 :     ptr = (uint8_t*) meas_rsp + *response_size - SPDM_NONCE_SIZE - sizeof(uint16_t);
     152            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE, ptr);
     153            1 :     ptr += SPDM_NONCE_SIZE;
     154              :     /* Set opaque data length to 0 */
     155            1 :     *ptr = 0;
     156            1 :     ptr++;
     157            1 :     *ptr = 0;
     158            1 : }
     159              : 
     160            1 : void libspdm_requester_chunk_get_test_case3_build_challenge_response(
     161              :     void* context, void* response, size_t* response_size)
     162              : {
     163              :     libspdm_context_t* spdm_context;
     164              :     spdm_challenge_auth_response_t* spdm_response;
     165              :     void* data;
     166              :     size_t data_size;
     167              :     uint8_t* ptr;
     168              :     uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
     169              :     size_t sig_size;
     170              : 
     171            1 :     spdm_context = (libspdm_context_t*) context;
     172            1 :     libspdm_read_responder_public_certificate_chain(
     173              :         m_libspdm_use_hash_algo,
     174              :         m_libspdm_use_asym_algo, &data,
     175              :         &data_size, NULL, NULL);
     176            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     177            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     178            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     179            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     180            1 :     *response_size = sizeof(spdm_challenge_auth_response_t) +
     181            1 :                      libspdm_get_hash_size(m_libspdm_use_hash_algo) +
     182            1 :                      SPDM_NONCE_SIZE + 0 + sizeof(uint16_t) + 0 +
     183            1 :                      libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
     184            1 :     spdm_response = response;
     185              : 
     186            1 :     spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     187            1 :     spdm_response->header.request_response_code = SPDM_CHALLENGE_AUTH;
     188            1 :     spdm_response->header.param1 = 0;
     189            1 :     spdm_response->header.param2 = (1 << 0);
     190            1 :     ptr = (void*) (spdm_response + 1);
     191            1 :     libspdm_hash_all(
     192              :         m_libspdm_use_hash_algo,
     193              :         spdm_context->local_context.local_cert_chain_provision[0],
     194              :         spdm_context->local_context.local_cert_chain_provision_size[0],
     195              :         ptr);
     196            1 :     free(data);
     197            1 :     data = NULL;
     198              : 
     199            1 :     ptr += libspdm_get_hash_size(m_libspdm_use_hash_algo);
     200            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE, ptr);
     201            1 :     ptr += SPDM_NONCE_SIZE;
     202              :     /* libspdm_zero_mem (ptr, libspdm_get_hash_size (m_libspdm_use_hash_algo));
     203              :      * ptr += libspdm_get_hash_size (m_libspdm_use_hash_algo);*/
     204            1 :     *(uint16_t*) ptr = 0;
     205            1 :     ptr += sizeof(uint16_t);
     206              : 
     207            1 :     libspdm_copy_mem(
     208            1 :         &m_libspdm_local_buffer[m_libspdm_local_buffer_size],
     209              :         sizeof(m_libspdm_local_buffer) -
     210            1 :         (&m_libspdm_local_buffer[m_libspdm_local_buffer_size] - m_libspdm_local_buffer),
     211            1 :         spdm_response, (size_t) ptr - (size_t) spdm_response);
     212            1 :     m_libspdm_local_buffer_size += ((size_t) ptr - (size_t) spdm_response);
     213            1 :     LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "m_libspdm_local_buffer_size (0x%zx):\n",
     214              :                    m_libspdm_local_buffer_size));
     215            1 :     libspdm_dump_hex(m_libspdm_local_buffer, m_libspdm_local_buffer_size);
     216            1 :     libspdm_hash_all(m_libspdm_use_hash_algo, m_libspdm_local_buffer,
     217              :                      m_libspdm_local_buffer_size, hash_data);
     218            1 :     LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "HashDataSize (0x%x):\n",
     219              :                    libspdm_get_hash_size(m_libspdm_use_hash_algo)));
     220            1 :     libspdm_dump_hex(m_libspdm_local_buffer, m_libspdm_local_buffer_size);
     221            1 :     sig_size = libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
     222            1 :     libspdm_responder_data_sign(
     223              :         spdm_context,
     224            1 :         spdm_response->header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     225              :             0, SPDM_CHALLENGE_AUTH,
     226              :             m_libspdm_use_asym_algo, m_libspdm_use_pqc_asym_algo, m_libspdm_use_hash_algo,
     227              :             false, m_libspdm_local_buffer, m_libspdm_local_buffer_size,
     228              :             ptr, &sig_size);
     229            1 :     ptr += sig_size;
     230            1 : }
     231              : 
     232            1 : void libspdm_requester_chunk_get_test_case4_build_digest_response(
     233              :     void* context, void* response, size_t* response_size)
     234              : {
     235              :     libspdm_context_t *spdm_context;
     236              :     spdm_digest_response_t* spdm_response;
     237              :     uint8_t* digest;
     238              :     uint8_t slot_id;
     239              : 
     240            1 :     spdm_context = (libspdm_context_t*)context;
     241            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     242              :         m_libspdm_use_hash_algo;
     243            1 :     *response_size = sizeof(spdm_digest_response_t) +
     244            1 :                      libspdm_get_hash_size(m_libspdm_use_hash_algo) * SPDM_MAX_SLOT_COUNT;
     245            1 :     spdm_response = response;
     246              : 
     247            1 :     spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     248            1 :     spdm_response->header.param1 = 0;
     249            1 :     spdm_response->header.request_response_code = SPDM_DIGESTS;
     250            1 :     spdm_response->header.param2 = 0;
     251            1 :     libspdm_set_mem(m_libspdm_local_certificate_chain_test_case_4,
     252              :                     sizeof(m_libspdm_local_certificate_chain_test_case_4),
     253              :                     (uint8_t) (0xFF));
     254              : 
     255            1 :     digest = (void*) (spdm_response + 1);
     256            1 :     libspdm_zero_mem(digest,
     257            1 :                      libspdm_get_hash_size(m_libspdm_use_hash_algo) * SPDM_MAX_SLOT_COUNT);
     258            9 :     for (slot_id = 0; slot_id < SPDM_MAX_SLOT_COUNT; slot_id++) {
     259            8 :         libspdm_hash_all(
     260              :             m_libspdm_use_hash_algo,
     261              :             m_libspdm_local_certificate_chain_test_case_4,
     262              :             sizeof(m_libspdm_local_certificate_chain_test_case_4), &digest[0]);
     263            8 :         digest += libspdm_get_hash_size(m_libspdm_use_hash_algo);
     264              :     }
     265            1 :     spdm_response->header.param2 |= (0xFF << 0);
     266            1 : }
     267              : 
     268            2 : void libspdm_requester_chunk_get_test_case5_case6_build_vendor_response(
     269              :     void* context, void* response, size_t* response_size)
     270              : {
     271              :     spdm_vendor_defined_response_msg_t *spdm_response;
     272              : 
     273              :     /* For exceed max chunk seq no */
     274            2 :     *response_size =
     275              :         (CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE -
     276              :          sizeof(spdm_chunk_response_response_t)) * 65536 - sizeof(uint32_t) + 0x10;
     277              : 
     278            2 :     libspdm_set_mem(response, *response_size, 0xff);
     279              : 
     280            2 :     spdm_response = response;
     281              : 
     282            2 :     spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     283            2 :     spdm_response->header.request_response_code = SPDM_VENDOR_DEFINED_RESPONSE;
     284            2 :     spdm_response->header.param1 = 0;
     285            2 :     spdm_response->header.param2 = 0;
     286              : 
     287            2 :     spdm_response->standard_id = 6;
     288            2 :     spdm_response->len = 2;
     289            2 : }
     290              : 
     291            1 : void libspdm_requester_chunk_get_test_case8_build_digest_response(
     292              :     void* context, void* response, size_t* response_size)
     293              : {
     294              :     /* this is referenced from case 4, but use spdm 1.4 */
     295              :     libspdm_context_t *spdm_context;
     296              :     spdm_digest_response_t* spdm_response;
     297              :     uint8_t* digest;
     298              :     uint8_t slot_id;
     299              : 
     300            1 :     spdm_context = (libspdm_context_t*)context;
     301            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     302              :         m_libspdm_use_hash_algo;
     303            1 :     *response_size = sizeof(spdm_digest_response_t) +
     304            1 :                      libspdm_get_hash_size(m_libspdm_use_hash_algo) * SPDM_MAX_SLOT_COUNT;
     305            1 :     spdm_response = response;
     306              : 
     307            1 :     spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_14;
     308            1 :     spdm_response->header.param1 = 0;
     309            1 :     spdm_response->header.request_response_code = SPDM_DIGESTS;
     310            1 :     spdm_response->header.param2 = 0;
     311            1 :     libspdm_set_mem(m_libspdm_local_certificate_chain_test_case_4,
     312              :                     sizeof(m_libspdm_local_certificate_chain_test_case_4),
     313              :                     (uint8_t) (0xFF));
     314              : 
     315            1 :     digest = (void*) (spdm_response + 1);
     316            1 :     libspdm_zero_mem(digest,
     317            1 :                      libspdm_get_hash_size(m_libspdm_use_hash_algo) * SPDM_MAX_SLOT_COUNT);
     318            9 :     for (slot_id = 0; slot_id < SPDM_MAX_SLOT_COUNT; slot_id++) {
     319            8 :         libspdm_hash_all(
     320              :             m_libspdm_use_hash_algo,
     321              :             m_libspdm_local_certificate_chain_test_case_4,
     322              :             sizeof(m_libspdm_local_certificate_chain_test_case_4), &digest[0]);
     323            8 :         digest += libspdm_get_hash_size(m_libspdm_use_hash_algo);
     324              :     }
     325            1 :     spdm_response->header.param1 |= (0xFF << 0); /* 1.3+ supported_slot_mask */
     326            1 :     spdm_response->header.param2 |= (0xFF << 0);
     327            1 : }
     328              : 
     329        65621 : static libspdm_return_t send_message(
     330              :     void *spdm_context, size_t request_size, const void *request, uint64_t timeout)
     331              : {
     332              :     libspdm_test_context_t* spdm_test_context;
     333        65621 :     size_t header_size = sizeof(libspdm_test_message_header_t);
     334              : 
     335        65621 :     spdm_test_context = libspdm_get_test_context();
     336              : 
     337        65621 :     m_libspdm_local_request_buffer_size = 0;
     338        65621 :     libspdm_copy_mem(m_libspdm_local_request_buffer, sizeof(m_libspdm_local_request_buffer),
     339              :                      (const uint8_t *)request + header_size, request_size - header_size);
     340        65621 :     m_libspdm_local_request_buffer_size += request_size - header_size;
     341              : 
     342        65621 :     if (spdm_test_context->case_id == 0x1) {
     343           48 :         const spdm_get_certificate_request_t *spdm_request =
     344              :             (const void *)((const uint8_t *)request + header_size);
     345           48 :         if (spdm_request->header.request_response_code == SPDM_GET_CERTIFICATE) {
     346            1 :             m_libspdm_local_req_msg_size_test_case_1 = spdm_request->length;
     347              :         }
     348           48 :         return LIBSPDM_STATUS_SUCCESS;
     349        65573 :     } else if (spdm_test_context->case_id == 0x2) {
     350            7 :         return LIBSPDM_STATUS_SUCCESS;
     351        65566 :     } else if (spdm_test_context->case_id == 0x3) {
     352              :         const uint8_t* ptr;
     353            6 :         ptr = (const uint8_t*) request;
     354              : 
     355            6 :         if (ptr[2] == SPDM_CHALLENGE) {
     356            1 :             m_libspdm_local_buffer_size = 0;
     357            1 :             libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     358            1 :                              &ptr[1], request_size - 1);
     359            1 :             m_libspdm_local_buffer_size += (request_size - 1);
     360              :         }
     361            6 :         return LIBSPDM_STATUS_SUCCESS;
     362        65560 :     } else if (spdm_test_context->case_id == 0x4) {
     363           10 :         return LIBSPDM_STATUS_SUCCESS;
     364        65550 :     } else if (spdm_test_context->case_id == 0x5) {
     365            2 :         return LIBSPDM_STATUS_SUCCESS;
     366        65548 :     } else if (spdm_test_context->case_id == 0x6) {
     367        65537 :         return LIBSPDM_STATUS_SUCCESS;
     368           11 :     } else if (spdm_test_context->case_id == 0x7) {
     369            1 :         return LIBSPDM_STATUS_SUCCESS;
     370           10 :     } else if (spdm_test_context->case_id == 0x8) {
     371           10 :         return LIBSPDM_STATUS_SUCCESS;
     372              :     } else {
     373            0 :         return LIBSPDM_STATUS_SEND_FAIL;
     374              :     }
     375              : }
     376              : 
     377        65621 : static libspdm_return_t receive_message(
     378              :     void *spdm_context, size_t *response_size, void **response, uint64_t timeout)
     379              : {
     380              :     libspdm_test_context_t* spdm_test_context;
     381        65621 :     uint8_t chunk_handle = CHUNK_GET_UNIT_TEST_CHUNK_HANDLE;
     382              :     static bool error_large_response_sent = false;
     383              : 
     384              :     static spdm_message_header_t* sub_rsp = NULL;
     385              :     static size_t sub_rsp_size = 0;
     386              :     static size_t sub_rsp_copied = 0;
     387              :     static size_t sub_rsp_remaining = 0;
     388              :     static uint16_t chunk_seq_no = 0;
     389              : 
     390              :     spdm_message_header_t* spdm_request_header;
     391              :     spdm_chunk_response_response_t* chunk_rsp;
     392              :     spdm_chunk_response_response_14_t* chunk_rsp_14;
     393              :     size_t chunk_rsp_size;
     394              :     uint8_t* chunk_copy_to;
     395              :     size_t chunk_copy_size;
     396              :     size_t transport_header_size;
     397              :     void (*build_response_func)(void*, void*, size_t *);
     398              : 
     399        65621 :     build_response_func = NULL;
     400              : 
     401        65621 :     spdm_test_context = libspdm_get_test_context();
     402        65621 :     spdm_request_header = (spdm_message_header_t*) m_libspdm_local_request_buffer;
     403              : 
     404              :     /* First response to these tests should always be error large response */
     405        65621 :     if (error_large_response_sent == false) {
     406            7 :         error_large_response_sent = true;
     407              : 
     408              :         spdm_error_response_t* error_rsp;
     409              :         size_t error_rsp_size;
     410              : 
     411            7 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     412            7 :         error_rsp = (void*) ((uint8_t*) *response + transport_header_size);
     413            7 :         error_rsp_size = sizeof(spdm_error_response_t) + sizeof(uint8_t);
     414              : 
     415            7 :         error_rsp->header.spdm_version = spdm_request_header->spdm_version;
     416            7 :         error_rsp->header.request_response_code = SPDM_ERROR;
     417            7 :         error_rsp->header.param1 = SPDM_ERROR_CODE_LARGE_RESPONSE;
     418            7 :         error_rsp->header.param2 = 0;
     419            7 :         *((uint16_t*) (error_rsp + 1)) = chunk_handle;
     420              : 
     421            7 :         libspdm_transport_test_encode_message(
     422              :             spdm_context, NULL, false, false,
     423              :             error_rsp_size, error_rsp,
     424              :             response_size, response);
     425              : 
     426            7 :         return LIBSPDM_STATUS_SUCCESS;
     427              :     }
     428              : 
     429        65614 :     if (spdm_test_context->case_id == 0x1) {
     430              : 
     431              :         /* Refers to just the certificate portion in the cert response */
     432              :         static size_t sub_cert_index = 0;
     433              :         static size_t sub_cert_count = 0;
     434              : 
     435           47 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     436           47 :         chunk_rsp = (void*) ((uint8_t*) *response + transport_header_size);
     437              : 
     438           47 :         chunk_rsp->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     439           47 :         chunk_rsp->header.request_response_code = SPDM_CHUNK_RESPONSE;
     440           47 :         chunk_rsp->header.param1 = 0;
     441           47 :         chunk_rsp->header.param2 = chunk_handle;
     442              : 
     443           47 :         chunk_copy_to = (uint8_t*) (chunk_rsp + 1);
     444           47 :         chunk_copy_size = CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE
     445              :                           - sizeof(spdm_chunk_response_response_t);
     446              : 
     447           47 :         if (sub_rsp_copied == 0) {
     448            1 :             sub_rsp = (spdm_message_header_t*) m_libspdm_local_large_response_buffer;
     449            1 :             sub_rsp_size = sizeof(m_libspdm_local_large_response_buffer);
     450            1 :             libspdm_zero_mem(sub_rsp, sub_rsp_size);
     451              : 
     452            1 :             libspdm_requester_chunk_get_test_case1_build_certificates_response(
     453              :                 spdm_context, sub_rsp, &sub_rsp_size, sub_cert_index, &sub_cert_count);
     454              : 
     455            1 :             sub_rsp_remaining = sub_rsp_size;
     456            1 :             sub_rsp_copied = 0;
     457              : 
     458              :             /* first chunk has size of large response */
     459            1 :             chunk_seq_no = 0;
     460            1 :             *((uint32_t*) (chunk_rsp + 1)) = (uint32_t) sub_rsp_size;
     461              : 
     462            1 :             chunk_copy_to += sizeof(uint32_t);
     463            1 :             chunk_copy_size -= sizeof(uint32_t);
     464            1 :             chunk_copy_size = LIBSPDM_MIN(sub_rsp_remaining, chunk_copy_size);
     465            1 :             chunk_rsp_size = sizeof(spdm_chunk_response_response_t)
     466              :                              + sizeof(uint32_t) + chunk_copy_size;
     467              :         } else {
     468           46 :             chunk_copy_size = LIBSPDM_MIN(sub_rsp_remaining, chunk_copy_size);
     469           46 :             chunk_rsp_size = sizeof(spdm_chunk_response_response_t) + chunk_copy_size;
     470              :         }
     471              : 
     472           47 :         if (chunk_copy_size == sub_rsp_remaining) {
     473            1 :             chunk_rsp->header.param1 = SPDM_CHUNK_GET_RESPONSE_ATTRIBUTE_LAST_CHUNK;
     474              :         }
     475              : 
     476           47 :         libspdm_copy_mem(chunk_copy_to,
     477           47 :                          *response_size - (chunk_copy_to - (uint8_t*)*response),
     478           47 :                          (uint8_t*) sub_rsp + sub_rsp_copied,
     479              :                          chunk_copy_size);
     480              : 
     481           47 :         sub_rsp_copied += chunk_copy_size;
     482           47 :         sub_rsp_remaining -= chunk_copy_size;
     483           47 :         chunk_rsp->chunk_size = (uint32_t) chunk_copy_size;
     484           47 :         chunk_rsp->chunk_seq_no = chunk_seq_no;
     485           47 :         chunk_seq_no++;
     486              : 
     487           47 :         libspdm_transport_test_encode_message(
     488              :             spdm_context, NULL, false, false,
     489              :             chunk_rsp_size, chunk_rsp,
     490              :             response_size, response);
     491              : 
     492           47 :         if (sub_rsp_copied >= sub_rsp_size) {
     493            1 :             sub_cert_index++;
     494            1 :             sub_rsp = NULL;
     495            1 :             sub_rsp_size = 0;
     496            1 :             sub_rsp_copied = 0;
     497            1 :             sub_rsp_remaining = 0;
     498            1 :             chunk_seq_no = 0;
     499            1 :             error_large_response_sent = false;
     500              : 
     501            1 :             if (sub_cert_index == sub_cert_count) {
     502            1 :                 sub_cert_index = 0;
     503              : 
     504            1 :                 free(m_libspdm_local_certificate_chain_test_case_1);
     505            1 :                 m_libspdm_local_certificate_chain_test_case_1 = NULL;
     506            1 :                 m_libspdm_local_certificate_chain_size_test_case_1 = 0;
     507              :             }
     508              :         }
     509              : 
     510           47 :         return LIBSPDM_STATUS_SUCCESS;
     511        65567 :     } else if (spdm_test_context->case_id == 0x2) {
     512            6 :         build_response_func =
     513              :             libspdm_requester_chunk_get_test_case2_build_measurements_response;
     514        65561 :     } else if (spdm_test_context->case_id == 0x3) {
     515            5 :         build_response_func =
     516              :             libspdm_requester_chunk_get_test_case3_build_challenge_response;
     517        65556 :     } else if (spdm_test_context->case_id == 0x4) {
     518            9 :         build_response_func =
     519              :             libspdm_requester_chunk_get_test_case4_build_digest_response;
     520        65547 :     } else if (spdm_test_context->case_id == 0x5) {
     521            1 :         build_response_func =
     522              :             libspdm_requester_chunk_get_test_case5_case6_build_vendor_response;
     523        65546 :     } else if (spdm_test_context->case_id == 0x6) {
     524        65536 :         build_response_func =
     525              :             libspdm_requester_chunk_get_test_case5_case6_build_vendor_response;
     526           10 :     } else if (spdm_test_context->case_id == 0x7) {
     527              :         /* This case only return one error message with RequestResynch */
     528              :         spdm_error_response_t* error_rsp;
     529              :         size_t error_rsp_size;
     530              : 
     531            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     532            1 :         error_rsp = (void*) ((uint8_t*) *response + transport_header_size);
     533            1 :         error_rsp_size = sizeof(spdm_error_response_t) + sizeof(uint8_t);
     534              : 
     535            1 :         error_rsp->header.spdm_version = SPDM_MESSAGE_VERSION_10;
     536            1 :         error_rsp->header.request_response_code = SPDM_ERROR;
     537            1 :         error_rsp->header.param1 = SPDM_ERROR_CODE_REQUEST_RESYNCH;
     538            1 :         error_rsp->header.param2 = 0;
     539              : 
     540            1 :         libspdm_transport_test_encode_message(
     541              :             spdm_context, NULL, false, false,
     542              :             error_rsp_size, error_rsp,
     543              :             response_size, response);
     544              : 
     545              :         /* reset static status for next case */
     546            1 :         sub_rsp = NULL;
     547            1 :         sub_rsp_size = 0;
     548            1 :         sub_rsp_copied = 0;
     549            1 :         sub_rsp_remaining = 0;
     550            1 :         chunk_seq_no = 0;
     551            1 :         error_large_response_sent = false;
     552              : 
     553            1 :         return LIBSPDM_STATUS_SUCCESS;
     554            9 :     } else if (spdm_test_context->case_id == 0x8) {
     555            9 :         build_response_func =
     556              :             libspdm_requester_chunk_get_test_case8_build_digest_response;
     557              :     } else {
     558            0 :         LIBSPDM_ASSERT(0);
     559            0 :         return LIBSPDM_STATUS_RECEIVE_FAIL;
     560              :     }
     561              : 
     562        65566 :     if (build_response_func) {
     563        65566 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     564        65566 :         chunk_rsp = (void*) ((uint8_t*) *response + transport_header_size);
     565              : 
     566        65566 :         chunk_rsp->header.spdm_version = spdm_request_header->spdm_version;
     567        65566 :         chunk_rsp->header.request_response_code = SPDM_CHUNK_RESPONSE;
     568        65566 :         chunk_rsp->header.param1 = 0;
     569        65566 :         chunk_rsp->header.param2 = chunk_handle;
     570              : 
     571        65566 :         chunk_copy_to = (uint8_t*) (chunk_rsp + 1);
     572        65566 :         chunk_copy_size = CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE
     573              :                           - sizeof(spdm_chunk_response_response_t);
     574              : 
     575        65566 :         if (sub_rsp_copied == 0) {
     576              : 
     577            6 :             sub_rsp = (spdm_message_header_t*) m_libspdm_local_large_response_buffer;
     578            6 :             sub_rsp_size = sizeof(m_libspdm_local_large_response_buffer);
     579            6 :             if (spdm_test_context->case_id == 0x5 ||
     580            5 :                 spdm_test_context->case_id == 0x6) {
     581            2 :                 sub_rsp =
     582              :                     (spdm_message_header_t*)
     583              :                     m_libspdm_local_response_buffer_for_chunk_seq_no_wrap_test;
     584            2 :                 sub_rsp_size = sizeof(m_libspdm_local_response_buffer_for_chunk_seq_no_wrap_test);
     585              :             }
     586            6 :             libspdm_zero_mem(sub_rsp, sub_rsp_size);
     587              : 
     588            6 :             build_response_func(spdm_context, sub_rsp, &sub_rsp_size);
     589              : 
     590            6 :             sub_rsp_remaining = sub_rsp_size;
     591            6 :             sub_rsp_copied = 0;
     592              : 
     593              :             /* first chunk has size of large response */
     594            6 :             chunk_seq_no = 0;
     595            6 :             *((uint32_t*) (chunk_rsp + 1)) = (uint32_t) sub_rsp_size;
     596              : 
     597            6 :             chunk_copy_to += sizeof(uint32_t);
     598            6 :             chunk_copy_size -= sizeof(uint32_t);
     599            6 :             chunk_copy_size = LIBSPDM_MIN(sub_rsp_remaining, chunk_copy_size);
     600            6 :             chunk_rsp_size = sizeof(spdm_chunk_response_response_t)
     601              :                              + sizeof(uint32_t) + chunk_copy_size;
     602              : 
     603              :             /* case_id 0x5 will only get 1 chunk message */
     604            6 :             if (spdm_test_context->case_id == 0x5) {
     605            1 :                 sub_rsp_size = sub_rsp_copied;
     606              :             }
     607              : 
     608              :         } else {
     609        65560 :             chunk_copy_size = LIBSPDM_MIN(sub_rsp_remaining, chunk_copy_size);
     610        65560 :             chunk_rsp_size = sizeof(spdm_chunk_response_response_t) + chunk_copy_size;
     611              :         }
     612              : 
     613        65566 :         if (chunk_copy_size == sub_rsp_remaining) {
     614            4 :             chunk_rsp->header.param1 = SPDM_CHUNK_GET_RESPONSE_ATTRIBUTE_LAST_CHUNK;
     615              :         }
     616              : 
     617        65566 :         libspdm_copy_mem(chunk_copy_to,
     618        65566 :                          *response_size - (chunk_copy_to - (uint8_t*) *response),
     619        65566 :                          (uint8_t*) sub_rsp + sub_rsp_copied,
     620              :                          chunk_copy_size);
     621              : 
     622        65566 :         sub_rsp_copied += chunk_copy_size;
     623        65566 :         sub_rsp_remaining -= chunk_copy_size;
     624        65566 :         chunk_rsp->chunk_size = (uint32_t) chunk_copy_size;
     625        65566 :         if (spdm_request_header->spdm_version < SPDM_MESSAGE_VERSION_14) {
     626        65557 :             chunk_rsp->chunk_seq_no = chunk_seq_no++;
     627              :         } else {
     628            9 :             chunk_rsp_14 = (spdm_chunk_response_response_14_t*) chunk_rsp;
     629            9 :             chunk_rsp_14->chunk_seq_no = chunk_seq_no++;
     630              :         }
     631              : 
     632        65566 :         libspdm_transport_test_encode_message(
     633              :             spdm_context, NULL, false, false,
     634              :             chunk_rsp_size, chunk_rsp,
     635              :             response_size, response);
     636              : 
     637        65566 :         if (sub_rsp_copied >= sub_rsp_size) {
     638            5 :             sub_rsp = NULL;
     639            5 :             sub_rsp_size = 0;
     640            5 :             sub_rsp_copied = 0;
     641            5 :             sub_rsp_remaining = 0;
     642            5 :             chunk_seq_no = 0;
     643            5 :             error_large_response_sent = false;
     644              :         }
     645        65566 :         return LIBSPDM_STATUS_SUCCESS;
     646              :     }
     647            0 :     return LIBSPDM_STATUS_SEND_FAIL;
     648              : 
     649              : }
     650              : #if LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT
     651            1 : static void req_chunk_get_case1(void** state)
     652              : {
     653              :     libspdm_return_t status;
     654              :     libspdm_test_context_t* spdm_test_context;
     655              :     libspdm_context_t* spdm_context;
     656              :     size_t cert_chain_size;
     657              :     uint8_t cert_chain[LIBSPDM_MAX_CERT_CHAIN_SIZE];
     658              :     void* data;
     659              :     size_t data_size;
     660              :     void* hash;
     661              :     size_t hash_size;
     662              :     const uint8_t* root_cert;
     663              :     size_t root_cert_size;
     664              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     665              :     size_t count;
     666              :     #endif
     667              : 
     668            1 :     spdm_test_context = *state;
     669            1 :     spdm_context = spdm_test_context->spdm_context;
     670            1 :     spdm_test_context->case_id = 0x1;
     671            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     672              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     673            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AFTER_DIGESTS;
     674            1 :     spdm_context->connection_info.capability.flags |=
     675              :         (SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP
     676              :          | SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP
     677              :          | SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHUNK_CAP);
     678              : 
     679            1 :     spdm_context->local_context.capability.flags |=  SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHUNK_CAP;
     680              :     spdm_context->local_context.capability.data_transfer_size
     681            1 :         = CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
     682            1 :     spdm_context->local_context.is_requester = true;
     683              : 
     684            1 :     libspdm_read_responder_public_certificate_chain(
     685              :         m_libspdm_use_hash_algo,
     686              :         m_libspdm_use_asym_algo, &data,
     687              :         &data_size, &hash, &hash_size);
     688            1 :     libspdm_x509_get_cert_from_cert_chain(
     689            1 :         (uint8_t*) data + sizeof(spdm_cert_chain_t) + hash_size,
     690            1 :         data_size - sizeof(spdm_cert_chain_t) - hash_size, 0,
     691              :         &root_cert, &root_cert_size);
     692            1 :     LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "root cert data :\n"));
     693            1 :     libspdm_dump_hex(root_cert, root_cert_size);
     694            1 :     spdm_context->local_context.peer_root_cert_provision_size[0] = root_cert_size;
     695              : 
     696            1 :     spdm_context->local_context.peer_root_cert_provision[0] = root_cert;
     697            1 :     libspdm_reset_message_b(spdm_context);
     698            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     699            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     700            1 :     spdm_context->connection_info.algorithm.req_base_asym_alg = m_libspdm_use_req_asym_algo;
     701              : 
     702              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     703              :     spdm_context->transcript.message_m.buffer_size =
     704              :         spdm_context->transcript.message_m.max_buffer_size;
     705              :     #endif
     706            1 :     cert_chain_size = sizeof(cert_chain);
     707            1 :     libspdm_zero_mem(cert_chain, sizeof(cert_chain));
     708            1 :     status = libspdm_get_certificate(spdm_context, NULL, 0, &cert_chain_size, cert_chain);
     709            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     710              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     711              :     count = (data_size + m_libspdm_local_req_msg_size_test_case_1 - 1) / m_libspdm_local_req_msg_size_test_case_1;
     712              :     assert_int_equal(spdm_context->transcript.message_b.buffer_size,
     713              :                      sizeof(spdm_get_certificate_request_t) * count +
     714              :                      sizeof(spdm_certificate_response_t) * count +
     715              :                      data_size);
     716              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
     717              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = 0;
     718              :     #else
     719            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size = 0;
     720              :     #endif
     721            1 :     free(data);
     722            1 : }
     723              : #endif
     724              : #if LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP
     725            1 : static void req_chunk_get_case2(void** state)
     726              : {
     727              :     /* Copied from Get Measurements Test Case 0x20 */
     728              :     libspdm_return_t status;
     729              :     libspdm_test_context_t* spdm_test_context;
     730              :     libspdm_context_t* spdm_context;
     731              :     uint8_t number_of_block;
     732              :     uint32_t measurement_record_length;
     733              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
     734              :     uint8_t request_attribute;
     735              :     void* data;
     736              :     size_t data_size;
     737              :     void* hash;
     738              :     size_t hash_size;
     739              : 
     740            1 :     spdm_test_context = *state;
     741            1 :     spdm_context = spdm_test_context->spdm_context;
     742            1 :     spdm_test_context->case_id = 0x02;
     743            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     744              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     745            1 :     spdm_context->connection_info.connection_state =
     746              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     747            1 :     spdm_context->connection_info.capability.flags |=
     748              :         (SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG
     749              :          | SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHUNK_CAP);
     750              : 
     751            1 :     spdm_context->local_context.capability.flags |=
     752              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHUNK_CAP;
     753              :     spdm_context->local_context.capability.data_transfer_size
     754            1 :         = CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
     755              : 
     756            1 :     libspdm_read_responder_public_certificate_chain(
     757              :         m_libspdm_use_hash_algo, m_libspdm_use_asym_algo,
     758              :         &data, &data_size, &hash, &hash_size);
     759            1 :     libspdm_reset_message_m(spdm_context, NULL);
     760            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     761              :         m_libspdm_use_measurement_spec;
     762            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     763              :         m_libspdm_use_measurement_hash_algo;
     764            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     765              :         m_libspdm_use_hash_algo;
     766            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     767              :         m_libspdm_use_asym_algo;
     768            1 :     spdm_context->local_context.algorithm.measurement_spec =
     769              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
     770              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     771              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = data_size;
     772              :     libspdm_copy_mem(
     773              :         spdm_context->connection_info.peer_used_cert_chain[0].buffer,
     774              :         sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
     775              :         data, data_size);
     776              :     #else
     777            1 :     libspdm_hash_all(
     778              :         spdm_context->connection_info.algorithm.base_hash_algo,
     779              :         data, data_size,
     780            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
     781            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
     782            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
     783            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
     784              :         spdm_context->connection_info.algorithm.base_hash_algo,
     785              :         spdm_context->connection_info.algorithm.base_asym_algo,
     786              :         data, data_size,
     787              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
     788              :     #endif
     789            1 :     request_attribute = 0;
     790              : 
     791            1 :     measurement_record_length = sizeof(measurement_record);
     792            1 :     status = libspdm_get_measurement(
     793              :         spdm_context, NULL, request_attribute,
     794              :         SPDM_GET_MEASUREMENTS_REQUEST_MEASUREMENT_OPERATION_ALL_MEASUREMENTS,
     795              :         0, NULL, &number_of_block, &measurement_record_length,
     796              :         measurement_record);
     797            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     798              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     799              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size,
     800              :                      sizeof(spdm_message_header_t) +
     801              :                      sizeof(spdm_measurements_response_t) +
     802              :                      2 * (sizeof(spdm_measurement_block_dmtf_t) +
     803              :                           libspdm_get_measurement_hash_size(
     804              :                               m_libspdm_use_measurement_hash_algo)) +
     805              :                      sizeof(uint16_t) + SPDM_NONCE_SIZE);
     806              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = 0;
     807              :     #else
     808            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size = 0;
     809              :     #endif
     810            1 :     free(data);
     811            1 : }
     812              : #endif
     813              : 
     814              : #if LIBSPDM_SEND_CHALLENGE_SUPPORT
     815            1 : static void req_chunk_get_case3(void** state)
     816              : {
     817              :     /* Copied from Challenge Test Case 2*/
     818              :     libspdm_return_t status;
     819              :     libspdm_test_context_t* spdm_test_context;
     820              :     libspdm_context_t* spdm_context;
     821              :     uint8_t measurement_hash[LIBSPDM_MAX_HASH_SIZE];
     822              :     void* data;
     823              :     size_t data_size;
     824              :     void* hash;
     825              :     size_t hash_size;
     826              : 
     827            1 :     spdm_test_context = *state;
     828            1 :     spdm_context = spdm_test_context->spdm_context;
     829            1 :     spdm_test_context->case_id = 0x3;
     830            1 :     spdm_context->connection_info.connection_state =
     831              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     832            1 :     spdm_context->connection_info.capability.flags = 0;
     833            1 :     spdm_context->connection_info.capability.flags |=
     834              :         (SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP
     835              :          | SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHUNK_CAP);
     836              : 
     837            1 :     spdm_context->local_context.capability.flags |=
     838              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHUNK_CAP;
     839              :     spdm_context->local_context.capability.data_transfer_size
     840            1 :         = CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
     841              : 
     842            1 :     libspdm_read_responder_public_certificate_chain(
     843              :         m_libspdm_use_hash_algo, m_libspdm_use_asym_algo,
     844              :         &data, &data_size, &hash, &hash_size);
     845            1 :     libspdm_reset_message_a(spdm_context);
     846            1 :     libspdm_reset_message_b(spdm_context);
     847            1 :     libspdm_reset_message_c(spdm_context);
     848            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     849              :         m_libspdm_use_hash_algo;
     850            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     851              :         m_libspdm_use_asym_algo;
     852              : 
     853            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     854              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     855              : 
     856              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     857              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = data_size;
     858              :     libspdm_copy_mem(
     859              :         spdm_context->connection_info.peer_used_cert_chain[0].buffer,
     860              :         sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
     861              :         data, data_size);
     862              :     #else
     863            1 :     libspdm_hash_all(
     864              :         spdm_context->connection_info.algorithm.base_hash_algo,
     865              :         data, data_size,
     866            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
     867            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
     868            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
     869            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
     870              :         spdm_context->connection_info.algorithm.base_hash_algo,
     871              :         spdm_context->connection_info.algorithm.base_asym_algo,
     872              :         data, data_size,
     873              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
     874              :     #endif
     875              : 
     876            1 :     libspdm_zero_mem(measurement_hash, sizeof(measurement_hash));
     877            1 :     status = libspdm_challenge(
     878              :         spdm_context, NULL, 0,
     879              :         SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH,
     880              :         measurement_hash, NULL);
     881            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     882            1 :     free(data);
     883              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     884              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = 0;
     885              :     #else
     886            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size = 0;
     887              :     #endif
     888            1 : }
     889              : #endif /* LIBSPDM_SEND_CHALLENGE_SUPPORT */
     890              : 
     891              : #if LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT
     892            1 : static void req_chunk_get_case4(void** state)
     893              : {
     894              :     /* Copied from Get Digests Test Case 2*/
     895              :     libspdm_return_t status;
     896              :     libspdm_test_context_t* spdm_test_context;
     897              :     libspdm_context_t* spdm_context;
     898              :     libspdm_data_parameter_t parameter;
     899              :     uint8_t slot_mask;
     900              :     uint8_t slot_id;
     901              :     uint8_t total_digest_buffer[LIBSPDM_MAX_HASH_SIZE * SPDM_MAX_SLOT_COUNT];
     902              :     uint8_t my_total_digest_buffer[LIBSPDM_MAX_HASH_SIZE * SPDM_MAX_SLOT_COUNT];
     903              :     uint8_t* digest;
     904              :     size_t data_return_size;
     905              : 
     906            1 :     spdm_test_context = *state;
     907            1 :     spdm_context = spdm_test_context->spdm_context;
     908            1 :     spdm_test_context->case_id = 0x4;
     909            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     910              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     911            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     912            1 :     spdm_context->connection_info.capability.flags |=
     913              :         (SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP
     914              :          | SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHUNK_CAP);
     915              : 
     916            1 :     spdm_context->local_context.capability.flags |=
     917              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHUNK_CAP;
     918              :     spdm_context->local_context.capability.data_transfer_size
     919            1 :         = CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
     920              : 
     921            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     922              : 
     923            1 :     libspdm_set_mem(
     924              :         m_libspdm_local_certificate_chain_test_case_4,
     925              :         sizeof(m_libspdm_local_certificate_chain_test_case_4),
     926              :         (uint8_t) (0xFF));
     927            1 :     libspdm_reset_message_b(spdm_context);
     928              : 
     929              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     930              :     spdm_context->transcript.message_m.buffer_size =
     931              :         spdm_context->transcript.message_m.max_buffer_size;
     932              :     #endif
     933            1 :     libspdm_zero_mem(total_digest_buffer, sizeof(total_digest_buffer));
     934            1 :     status = libspdm_get_digest(spdm_context, NULL, &slot_mask, &total_digest_buffer);
     935            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     936              : 
     937            1 :     assert_int_equal(slot_mask, 0xFF);
     938            1 :     libspdm_zero_mem(my_total_digest_buffer, sizeof(my_total_digest_buffer));
     939            1 :     digest = my_total_digest_buffer;
     940            9 :     for (slot_id = 0; slot_id < SPDM_MAX_SLOT_COUNT; slot_id++) {
     941            8 :         libspdm_hash_all(m_libspdm_use_hash_algo,
     942              :                          m_libspdm_local_certificate_chain_test_case_4,
     943              :                          sizeof(m_libspdm_local_certificate_chain_test_case_4), digest);
     944            8 :         digest += libspdm_get_hash_size(m_libspdm_use_hash_algo);
     945              :     }
     946            1 :     assert_memory_equal(total_digest_buffer, my_total_digest_buffer,
     947              :                         sizeof(my_total_digest_buffer));
     948              : 
     949            1 :     parameter.location = LIBSPDM_DATA_LOCATION_CONNECTION;
     950            1 :     data_return_size = sizeof(uint8_t);
     951            1 :     status = libspdm_get_data(spdm_context, LIBSPDM_DATA_PEER_SLOT_MASK,
     952              :                               &parameter, &slot_mask, &data_return_size);
     953            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     954            1 :     assert_int_equal(data_return_size, sizeof(uint8_t));
     955            1 :     assert_int_equal(slot_mask, 0xFF);
     956              : 
     957            1 :     data_return_size = sizeof(total_digest_buffer);
     958            1 :     status = libspdm_get_data(spdm_context, LIBSPDM_DATA_PEER_TOTAL_DIGEST_BUFFER,
     959              :                               &parameter, total_digest_buffer, &data_return_size);
     960            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     961            1 :     assert_int_equal(data_return_size, libspdm_get_hash_size(
     962              :                          m_libspdm_use_hash_algo) * SPDM_MAX_SLOT_COUNT);
     963            1 :     assert_memory_equal(total_digest_buffer, my_total_digest_buffer,
     964              :                         sizeof(my_total_digest_buffer));
     965              : 
     966              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     967              :     assert_int_equal(
     968              :         spdm_context->transcript.message_b.buffer_size,
     969              :         sizeof(spdm_get_digest_request_t) +
     970              :         sizeof(spdm_digest_response_t) +
     971              :         libspdm_get_hash_size(spdm_context->connection_info
     972              :                               .algorithm.base_hash_algo) * SPDM_MAX_SLOT_COUNT);
     973              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
     974              :     #endif
     975            1 : }
     976              : #endif
     977              : 
     978              : #if LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES
     979            1 : static void req_chunk_get_case5(void **state)
     980              : {
     981              :     /* Copied from Vendor Request case 1*/
     982              :     libspdm_return_t status;
     983              :     libspdm_test_context_t *spdm_test_context;
     984              :     libspdm_context_t *spdm_context;
     985              : 
     986            1 :     uint16_t standard_id = 6;
     987            1 :     uint8_t vendor_id_len = 2;
     988            1 :     uint8_t vendor_id[SPDM_MAX_VENDOR_ID_LENGTH] = {0xAA, 0xAA};
     989            1 :     uint32_t data_len = 16;
     990              :     uint8_t data[16];
     991              : 
     992            1 :     spdm_test_context = *state;
     993            1 :     spdm_context = spdm_test_context->spdm_context;
     994            1 :     spdm_test_context->case_id = 0x5;
     995            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     996              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     997              :     /* Large response need a large scratch buffer. */
     998            1 :     spdm_context->connection_info.capability.max_spdm_msg_size =
     999              :         BUFFER_SIZE_FOR_CHUNK_SEQ_NO_WRAP_TEST;
    1000            1 :     spdm_context->local_context.capability.max_spdm_msg_size =
    1001              :         BUFFER_SIZE_FOR_CHUNK_SEQ_NO_WRAP_TEST;
    1002            1 :     spdm_context->connection_info.connection_state =
    1003              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1004            1 :     spdm_context->local_context.capability.data_transfer_size =
    1005              :         CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
    1006            1 :     spdm_context->connection_info.capability.data_transfer_size =
    1007              :         CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
    1008            1 :     spdm_context->local_context.capability.sender_data_transfer_size =
    1009              :         CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
    1010            1 :     spdm_context->local_context.is_requester = true;
    1011              : 
    1012            1 :     spdm_test_context->scratch_buffer_size =
    1013            1 :         libspdm_get_sizeof_required_scratch_buffer(spdm_context);
    1014            1 :     spdm_test_context->scratch_buffer = (void *)malloc(spdm_test_context->scratch_buffer_size);
    1015            1 :     libspdm_set_scratch_buffer (spdm_context,
    1016              :                                 spdm_test_context->scratch_buffer,
    1017              :                                 spdm_test_context->scratch_buffer_size);
    1018              : 
    1019            1 :     libspdm_set_mem(data, sizeof(data), 0xAA);
    1020              : 
    1021            1 :     status = libspdm_vendor_send_request_receive_response(spdm_context, NULL,
    1022              :                                                           standard_id, vendor_id_len, vendor_id,
    1023              :                                                           data_len, data,
    1024              :                                                           &standard_id, &vendor_id_len, vendor_id,
    1025              :                                                           &data_len, data);
    1026              : 
    1027            1 :     assert_int_equal(status, LIBSPDM_STATUS_RECEIVE_FAIL);
    1028            1 : }
    1029              : 
    1030            1 : static void req_chunk_get_case6(void **state)
    1031              : {
    1032              :     /* Copied from Chunk Get Request case 5*/
    1033              :     libspdm_return_t status;
    1034              :     libspdm_test_context_t *spdm_test_context;
    1035              :     libspdm_context_t *spdm_context;
    1036              : 
    1037            1 :     uint16_t standard_id = 6;
    1038            1 :     uint8_t vendor_id_len = 2;
    1039            1 :     uint8_t vendor_id[SPDM_MAX_VENDOR_ID_LENGTH] = {0xAA, 0xAA};
    1040            1 :     uint32_t data_len = 16;
    1041              :     uint8_t data[16];
    1042              : 
    1043            1 :     spdm_test_context = *state;
    1044            1 :     spdm_context = spdm_test_context->spdm_context;
    1045            1 :     spdm_test_context->case_id = 0x6;
    1046            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
    1047              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1048              :     /* Large response need a large scratch buffer. */
    1049            1 :     spdm_context->connection_info.capability.max_spdm_msg_size =
    1050              :         BUFFER_SIZE_FOR_CHUNK_SEQ_NO_WRAP_TEST;
    1051            1 :     spdm_context->local_context.capability.max_spdm_msg_size =
    1052              :         BUFFER_SIZE_FOR_CHUNK_SEQ_NO_WRAP_TEST;
    1053            1 :     spdm_context->connection_info.connection_state =
    1054              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1055              :     /* to pass the exam of max_chunk_data_transfer_size*/
    1056            1 :     spdm_context->local_context.capability.data_transfer_size =
    1057              :         CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE + 0x10;
    1058            1 :     spdm_context->connection_info.capability.data_transfer_size =
    1059              :         CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE + 0x10;
    1060            1 :     spdm_context->local_context.capability.sender_data_transfer_size =
    1061              :         CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE + 0x10;
    1062            1 :     spdm_context->local_context.is_requester = true;
    1063              : 
    1064            1 :     spdm_test_context->scratch_buffer_size =
    1065            1 :         libspdm_get_sizeof_required_scratch_buffer(spdm_context);
    1066            1 :     spdm_test_context->scratch_buffer = (void *)malloc(spdm_test_context->scratch_buffer_size);
    1067            1 :     libspdm_set_scratch_buffer (spdm_context,
    1068              :                                 spdm_test_context->scratch_buffer,
    1069              :                                 spdm_test_context->scratch_buffer_size);
    1070              : 
    1071            1 :     libspdm_set_mem(data, sizeof(data), 0xAA);
    1072              : 
    1073            1 :     status = libspdm_vendor_send_request_receive_response(spdm_context, NULL,
    1074              :                                                           standard_id, vendor_id_len, vendor_id,
    1075              :                                                           data_len, data,
    1076              :                                                           &standard_id, &vendor_id_len, vendor_id,
    1077              :                                                           &data_len, data);
    1078              : 
    1079            1 :     assert_int_equal(status, LIBSPDM_STATUS_RECEIVE_FAIL);
    1080            1 : }
    1081              : 
    1082            1 : static void req_chunk_get_case7(void **state)
    1083              : {
    1084              :     /* Copied from Chunk Get Request case 5*/
    1085              :     libspdm_return_t status;
    1086              :     libspdm_test_context_t *spdm_test_context;
    1087              :     libspdm_context_t *spdm_context;
    1088              : 
    1089            1 :     uint16_t standard_id = 6;
    1090            1 :     uint8_t vendor_id_len = 2;
    1091            1 :     uint8_t vendor_id[SPDM_MAX_VENDOR_ID_LENGTH] = {0xAA, 0xAA};
    1092            1 :     uint32_t data_len = 16;
    1093              :     uint8_t data[16];
    1094              : 
    1095            1 :     spdm_test_context = *state;
    1096            1 :     spdm_context = spdm_test_context->spdm_context;
    1097            1 :     spdm_test_context->case_id = 0x7;
    1098            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
    1099              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1100              :     /* Large response need a large scratch buffer. */
    1101            1 :     spdm_context->connection_info.capability.max_spdm_msg_size =
    1102              :         BUFFER_SIZE_FOR_CHUNK_SEQ_NO_WRAP_TEST;
    1103            1 :     spdm_context->local_context.capability.max_spdm_msg_size =
    1104              :         BUFFER_SIZE_FOR_CHUNK_SEQ_NO_WRAP_TEST;
    1105            1 :     spdm_context->connection_info.connection_state =
    1106              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1107            1 :     spdm_context->local_context.capability.data_transfer_size =
    1108              :         CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
    1109            1 :     spdm_context->connection_info.capability.data_transfer_size =
    1110              :         CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
    1111            1 :     spdm_context->local_context.capability.sender_data_transfer_size =
    1112              :         CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
    1113            1 :     spdm_context->local_context.is_requester = true;
    1114              : 
    1115            1 :     spdm_test_context->scratch_buffer_size =
    1116            1 :         libspdm_get_sizeof_required_scratch_buffer(spdm_context);
    1117            1 :     spdm_test_context->scratch_buffer = (void *)malloc(spdm_test_context->scratch_buffer_size);
    1118            1 :     libspdm_set_scratch_buffer (spdm_context,
    1119              :                                 spdm_test_context->scratch_buffer,
    1120              :                                 spdm_test_context->scratch_buffer_size);
    1121              : 
    1122            1 :     libspdm_set_mem(data, sizeof(data), 0xAA);
    1123              : 
    1124            1 :     status = libspdm_vendor_send_request_receive_response(spdm_context, NULL,
    1125              :                                                           standard_id, vendor_id_len, vendor_id,
    1126              :                                                           data_len, data,
    1127              :                                                           &standard_id, &vendor_id_len, vendor_id,
    1128              :                                                           &data_len, data);
    1129              : 
    1130            1 :     assert_int_equal(status, LIBSPDM_STATUS_RESYNCH_PEER);
    1131            1 :     assert_int_equal(spdm_context->connection_info.connection_state,
    1132              :                      LIBSPDM_CONNECTION_STATE_NOT_STARTED);
    1133            1 : }
    1134              : #endif /* LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES */
    1135              : 
    1136              : #if LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT
    1137            1 : static void req_chunk_get_case8(void** state)
    1138              : {
    1139              :     /* Copied from Chunk Send Test Case 4, use spdm 1.4*/
    1140              :     libspdm_return_t status;
    1141              :     libspdm_test_context_t* spdm_test_context;
    1142              :     libspdm_context_t* spdm_context;
    1143              :     libspdm_data_parameter_t parameter;
    1144              :     uint8_t slot_mask;
    1145              :     uint8_t slot_id;
    1146              :     uint8_t total_digest_buffer[LIBSPDM_MAX_HASH_SIZE * SPDM_MAX_SLOT_COUNT];
    1147              :     uint8_t my_total_digest_buffer[LIBSPDM_MAX_HASH_SIZE * SPDM_MAX_SLOT_COUNT];
    1148              :     uint8_t* digest;
    1149              :     size_t data_return_size;
    1150              : 
    1151            1 :     spdm_test_context = *state;
    1152            1 :     spdm_context = spdm_test_context->spdm_context;
    1153            1 :     spdm_test_context->case_id = 0x8;
    1154            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_14 <<
    1155              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1156            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1157            1 :     spdm_context->connection_info.capability.flags |=
    1158              :         (SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP
    1159              :          | SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHUNK_CAP);
    1160              : 
    1161            1 :     spdm_context->local_context.capability.flags |=
    1162              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHUNK_CAP;
    1163              :     spdm_context->local_context.capability.data_transfer_size
    1164            1 :         = CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
    1165              : 
    1166            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1167              : 
    1168            1 :     libspdm_set_mem(
    1169              :         m_libspdm_local_certificate_chain_test_case_4,
    1170              :         sizeof(m_libspdm_local_certificate_chain_test_case_4),
    1171              :         (uint8_t) (0xFF));
    1172            1 :     libspdm_reset_message_b(spdm_context);
    1173              : 
    1174              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1175              :     spdm_context->transcript.message_m.buffer_size =
    1176              :         spdm_context->transcript.message_m.max_buffer_size;
    1177              :     #endif
    1178            1 :     libspdm_zero_mem(total_digest_buffer, sizeof(total_digest_buffer));
    1179            1 :     status = libspdm_get_digest(spdm_context, NULL, &slot_mask, &total_digest_buffer);
    1180            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1181              : 
    1182            1 :     assert_int_equal(slot_mask, 0xFF);
    1183            1 :     libspdm_zero_mem(my_total_digest_buffer, sizeof(my_total_digest_buffer));
    1184            1 :     digest = my_total_digest_buffer;
    1185            9 :     for (slot_id = 0; slot_id < SPDM_MAX_SLOT_COUNT; slot_id++) {
    1186            8 :         libspdm_hash_all(m_libspdm_use_hash_algo,
    1187              :                          m_libspdm_local_certificate_chain_test_case_4,
    1188              :                          sizeof(m_libspdm_local_certificate_chain_test_case_4), digest);
    1189            8 :         digest += libspdm_get_hash_size(m_libspdm_use_hash_algo);
    1190              :     }
    1191            1 :     assert_memory_equal(total_digest_buffer, my_total_digest_buffer,
    1192              :                         sizeof(my_total_digest_buffer));
    1193              : 
    1194            1 :     parameter.location = LIBSPDM_DATA_LOCATION_CONNECTION;
    1195            1 :     data_return_size = sizeof(uint8_t);
    1196            1 :     status = libspdm_get_data(spdm_context, LIBSPDM_DATA_PEER_SLOT_MASK,
    1197              :                               &parameter, &slot_mask, &data_return_size);
    1198            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1199            1 :     assert_int_equal(data_return_size, sizeof(uint8_t));
    1200            1 :     assert_int_equal(slot_mask, 0xFF);
    1201              : 
    1202            1 :     data_return_size = sizeof(total_digest_buffer);
    1203            1 :     status = libspdm_get_data(spdm_context, LIBSPDM_DATA_PEER_TOTAL_DIGEST_BUFFER,
    1204              :                               &parameter, total_digest_buffer, &data_return_size);
    1205            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1206            1 :     assert_int_equal(data_return_size, libspdm_get_hash_size(
    1207              :                          m_libspdm_use_hash_algo) * SPDM_MAX_SLOT_COUNT);
    1208            1 :     assert_memory_equal(total_digest_buffer, my_total_digest_buffer,
    1209              :                         sizeof(my_total_digest_buffer));
    1210              : 
    1211              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1212              :     assert_int_equal(
    1213              :         spdm_context->transcript.message_b.buffer_size,
    1214              :         sizeof(spdm_get_digest_request_t) +
    1215              :         sizeof(spdm_digest_response_t) +
    1216              :         libspdm_get_hash_size(spdm_context->connection_info
    1217              :                               .algorithm.base_hash_algo) * SPDM_MAX_SLOT_COUNT);
    1218              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
    1219              :     #endif
    1220            1 : }
    1221              : #endif
    1222              : 
    1223              : 
    1224            1 : int libspdm_req_chunk_get_test(void)
    1225              : {
    1226              :     /* Test the CHUNK_GET handlers in various requester handlers */
    1227            1 :     const struct CMUnitTest test_cases[] = {
    1228              : #if LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT
    1229              :         /* Request a certificate in portions */
    1230              :         cmocka_unit_test(req_chunk_get_case1),
    1231              : #endif
    1232              : #if LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP
    1233              :         /* Request all measurements */
    1234              :         cmocka_unit_test(req_chunk_get_case2),
    1235              : #endif
    1236              : #if LIBSPDM_SEND_CHALLENGE_SUPPORT
    1237              :         /* Request Challenge */
    1238              :         cmocka_unit_test(req_chunk_get_case3),
    1239              : #endif
    1240              : #if LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT
    1241              :         /* Request Digests */
    1242              :         cmocka_unit_test(req_chunk_get_case4),
    1243              : #endif
    1244              : #if LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES
    1245              :         /* Request Vendor Specific Response and chunk data size
    1246              :          * exceed max_chunk_data_transfer_size
    1247              :          */
    1248              :         cmocka_unit_test(req_chunk_get_case5),
    1249              :         /* Request Vendor Specific Response and chunk seq no wrapped */
    1250              :         cmocka_unit_test(req_chunk_get_case6),
    1251              :         /* Request Vendor Specific Response
    1252              :          * and recieve error code RequestResync */
    1253              :         cmocka_unit_test(req_chunk_get_case7),
    1254              : #endif
    1255              : #if LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT
    1256              :         /* Request Digests with spdm 1.4 */
    1257              :         cmocka_unit_test(req_chunk_get_case8),
    1258              : #endif
    1259              :     };
    1260              : 
    1261            1 :     libspdm_test_context_t test_context = {
    1262              :         LIBSPDM_TEST_CONTEXT_VERSION,
    1263              :         true,
    1264              :         send_message,
    1265              :         receive_message,
    1266              :     };
    1267              : 
    1268            1 :     libspdm_setup_test_context(&test_context);
    1269              : 
    1270            1 :     return cmocka_run_group_tests(test_cases,
    1271              :                                   libspdm_unit_test_group_setup,
    1272              :                                   libspdm_unit_test_group_teardown);
    1273              : }
    1274              : 
    1275              : #endif /* LIBSPDM_ENABLE_CAPABILITY_CHUNK_CAP*/
        

Generated by: LCOV version 2.0-1