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.7 % 596 588
Test Date: 2026-05-03 08:40:47 Functions: 100.0 % 19 19

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

Generated by: LCOV version 2.0-1