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

Generated by: LCOV version 2.0-1