LCOV - code coverage report
Current view: top level - unit_test/test_spdm_requester - chunk_get.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 98.6 % 554 546
Test Date: 2026-02-22 08:11:49 Functions: 100.0 % 17 17

            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 :     *(uint32_t*) meas_rsp->measurement_record_length =
     122            1 :         2 * ((uint32_t) (sizeof(spdm_measurement_block_dmtf_t) +
     123            1 :                          libspdm_get_measurement_hash_size( 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 :     *(uint16_t*) 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            1 : 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            1 :     spdm_context = (libspdm_context_t*)context;
     235            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     236            1 :     *response_size = sizeof(spdm_digest_response_t) +
     237            1 :                      libspdm_get_hash_size(m_libspdm_use_hash_algo) * SPDM_MAX_SLOT_COUNT;
     238            1 :     spdm_response = response;
     239              : 
     240            1 :     spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     241            1 :     spdm_response->header.param1 = 0;
     242            1 :     spdm_response->header.request_response_code = SPDM_DIGESTS;
     243            1 :     spdm_response->header.param2 = 0;
     244            1 :     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            1 :     digest = (void*) (spdm_response + 1);
     249            1 :     libspdm_zero_mem(digest, libspdm_get_hash_size(m_libspdm_use_hash_algo) * SPDM_MAX_SLOT_COUNT);
     250            9 :     for (slot_id = 0; slot_id < SPDM_MAX_SLOT_COUNT; slot_id++) {
     251            8 :         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            8 :         digest += libspdm_get_hash_size(m_libspdm_use_hash_algo);
     256              :     }
     257            1 :     spdm_response->header.param2 |= (0xFF << 0);
     258            1 : }
     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        65621 : 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        65621 :     size_t header_size = sizeof(libspdm_test_message_header_t);
     324              : 
     325        65621 :     spdm_test_context = libspdm_get_test_context();
     326              : 
     327        65621 :     m_libspdm_local_request_buffer_size = 0;
     328        65621 :     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        65621 :     m_libspdm_local_request_buffer_size += request_size - header_size;
     331              : 
     332        65621 :     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        65573 :     } else if (spdm_test_context->case_id == 0x2) {
     340            7 :         return LIBSPDM_STATUS_SUCCESS;
     341        65566 :     } 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        65560 :     } else if (spdm_test_context->case_id == 0x4) {
     353           10 :         return LIBSPDM_STATUS_SUCCESS;
     354        65550 :     } else if (spdm_test_context->case_id == 0x5) {
     355            2 :         return LIBSPDM_STATUS_SUCCESS;
     356        65548 :     } else if (spdm_test_context->case_id == 0x6) {
     357        65537 :         return LIBSPDM_STATUS_SUCCESS;
     358           11 :     } else if (spdm_test_context->case_id == 0x7) {
     359            1 :         return LIBSPDM_STATUS_SUCCESS;
     360           10 :     } else if (spdm_test_context->case_id == 0x8) {
     361           10 :         return LIBSPDM_STATUS_SUCCESS;
     362              :     } else {
     363            0 :         return LIBSPDM_STATUS_SEND_FAIL;
     364              :     }
     365              : }
     366              : 
     367        65621 : static libspdm_return_t receive_message(
     368              :     void *spdm_context, size_t *response_size, void **response, uint64_t timeout)
     369              : {
     370              :     libspdm_test_context_t* spdm_test_context;
     371        65621 :     uint8_t chunk_handle = CHUNK_GET_UNIT_TEST_CHUNK_HANDLE;
     372              :     static bool error_large_response_sent = false;
     373              : 
     374              :     static spdm_message_header_t* sub_rsp = NULL;
     375              :     static size_t sub_rsp_size = 0;
     376              :     static size_t sub_rsp_copied = 0;
     377              :     static size_t sub_rsp_remaining = 0;
     378              :     static uint16_t chunk_seq_no = 0;
     379              : 
     380              :     spdm_message_header_t* spdm_request_header;
     381              :     spdm_chunk_response_response_t* chunk_rsp;
     382              :     spdm_chunk_response_response_14_t* chunk_rsp_14;
     383              :     size_t chunk_rsp_size;
     384              :     uint8_t* chunk_copy_to;
     385              :     size_t chunk_copy_size;
     386              :     size_t transport_header_size;
     387              :     void (*build_response_func)(void*, void*, size_t *);
     388              : 
     389        65621 :     build_response_func = NULL;
     390              : 
     391        65621 :     spdm_test_context = libspdm_get_test_context();
     392        65621 :     spdm_request_header = (spdm_message_header_t*) m_libspdm_local_request_buffer;
     393              : 
     394              :     /* First response to these tests should always be error large response */
     395        65621 :     if (error_large_response_sent == false) {
     396            7 :         error_large_response_sent = true;
     397              : 
     398              :         spdm_error_response_t* error_rsp;
     399              :         size_t error_rsp_size;
     400              : 
     401            7 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     402            7 :         error_rsp = (void*) ((uint8_t*) *response + transport_header_size);
     403            7 :         error_rsp_size = sizeof(spdm_error_response_t) + sizeof(uint8_t);
     404              : 
     405            7 :         error_rsp->header.spdm_version = spdm_request_header->spdm_version;
     406            7 :         error_rsp->header.request_response_code = SPDM_ERROR;
     407            7 :         error_rsp->header.param1 = SPDM_ERROR_CODE_LARGE_RESPONSE;
     408            7 :         error_rsp->header.param2 = 0;
     409            7 :         *((uint16_t*) (error_rsp + 1)) = chunk_handle;
     410              : 
     411            7 :         libspdm_transport_test_encode_message(
     412              :             spdm_context, NULL, false, false,
     413              :             error_rsp_size, error_rsp,
     414              :             response_size, response);
     415              : 
     416            7 :         return LIBSPDM_STATUS_SUCCESS;
     417              :     }
     418              : 
     419        65614 :     if (spdm_test_context->case_id == 0x1) {
     420              : 
     421              :         /* Refers to just the certificate portion in the cert response */
     422              :         static size_t sub_cert_index = 0;
     423              :         static size_t sub_cert_count = 0;
     424              : 
     425           47 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     426           47 :         chunk_rsp = (void*) ((uint8_t*) *response + transport_header_size);
     427              : 
     428           47 :         chunk_rsp->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     429           47 :         chunk_rsp->header.request_response_code = SPDM_CHUNK_RESPONSE;
     430           47 :         chunk_rsp->header.param1 = 0;
     431           47 :         chunk_rsp->header.param2 = chunk_handle;
     432              : 
     433           47 :         chunk_copy_to = (uint8_t*) (chunk_rsp + 1);
     434           47 :         chunk_copy_size = CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE
     435              :                           - sizeof(spdm_chunk_response_response_t);
     436              : 
     437           47 :         if (sub_rsp_copied == 0) {
     438            1 :             sub_rsp = (spdm_message_header_t*) m_libspdm_local_large_response_buffer;
     439            1 :             sub_rsp_size = sizeof(m_libspdm_local_large_response_buffer);
     440            1 :             libspdm_zero_mem(sub_rsp, sub_rsp_size);
     441              : 
     442            1 :             libspdm_requester_chunk_get_test_case1_build_certificates_response(
     443              :                 spdm_context, sub_rsp, &sub_rsp_size, sub_cert_index, &sub_cert_count);
     444              : 
     445            1 :             sub_rsp_remaining = sub_rsp_size;
     446            1 :             sub_rsp_copied = 0;
     447              : 
     448              :             /* first chunk has size of large response */
     449            1 :             chunk_seq_no = 0;
     450            1 :             *((uint32_t*) (chunk_rsp + 1)) = (uint32_t) sub_rsp_size;
     451              : 
     452            1 :             chunk_copy_to += sizeof(uint32_t);
     453            1 :             chunk_copy_size -= sizeof(uint32_t);
     454            1 :             chunk_copy_size = LIBSPDM_MIN(sub_rsp_remaining, chunk_copy_size);
     455            1 :             chunk_rsp_size = sizeof(spdm_chunk_response_response_t)
     456              :                              + sizeof(uint32_t) + chunk_copy_size;
     457              :         } else {
     458           46 :             chunk_copy_size = LIBSPDM_MIN(sub_rsp_remaining, chunk_copy_size);
     459           46 :             chunk_rsp_size = sizeof(spdm_chunk_response_response_t) + chunk_copy_size;
     460              :         }
     461              : 
     462           47 :         if (chunk_copy_size == sub_rsp_remaining) {
     463            1 :             chunk_rsp->header.param1 = SPDM_CHUNK_GET_RESPONSE_ATTRIBUTE_LAST_CHUNK;
     464              :         }
     465              : 
     466           47 :         libspdm_copy_mem(chunk_copy_to,
     467           47 :                          *response_size - (chunk_copy_to - (uint8_t*)*response),
     468           47 :                          (uint8_t*) sub_rsp + sub_rsp_copied,
     469              :                          chunk_copy_size);
     470              : 
     471           47 :         sub_rsp_copied += chunk_copy_size;
     472           47 :         sub_rsp_remaining -= chunk_copy_size;
     473           47 :         chunk_rsp->chunk_size = (uint32_t) chunk_copy_size;
     474           47 :         chunk_rsp->chunk_seq_no = chunk_seq_no;
     475           47 :         chunk_seq_no++;
     476              : 
     477           47 :         libspdm_transport_test_encode_message(
     478              :             spdm_context, NULL, false, false,
     479              :             chunk_rsp_size, chunk_rsp,
     480              :             response_size, response);
     481              : 
     482           47 :         if (sub_rsp_copied >= sub_rsp_size) {
     483            1 :             sub_cert_index++;
     484            1 :             sub_rsp = NULL;
     485            1 :             sub_rsp_size = 0;
     486            1 :             sub_rsp_copied = 0;
     487            1 :             sub_rsp_remaining = 0;
     488            1 :             chunk_seq_no = 0;
     489            1 :             error_large_response_sent = false;
     490              : 
     491            1 :             if (sub_cert_index == sub_cert_count) {
     492            1 :                 sub_cert_index = 0;
     493              : 
     494            1 :                 free(m_libspdm_local_certificate_chain_test_case_1);
     495            1 :                 m_libspdm_local_certificate_chain_test_case_1 = NULL;
     496            1 :                 m_libspdm_local_certificate_chain_size_test_case_1 = 0;
     497              :             }
     498              :         }
     499              : 
     500           47 :         return LIBSPDM_STATUS_SUCCESS;
     501        65567 :     } else if (spdm_test_context->case_id == 0x2) {
     502            6 :         build_response_func = libspdm_requester_chunk_get_test_case2_build_measurements_response;
     503        65561 :     } else if (spdm_test_context->case_id == 0x3) {
     504            5 :         build_response_func = libspdm_requester_chunk_get_test_case3_build_challenge_response;
     505        65556 :     } else if (spdm_test_context->case_id == 0x4) {
     506            9 :         build_response_func = libspdm_requester_chunk_get_test_case4_build_digest_response;
     507        65547 :     } else if (spdm_test_context->case_id == 0x5) {
     508            1 :         build_response_func = libspdm_requester_chunk_get_test_case5_case6_build_vendor_response;
     509        65546 :     } else if (spdm_test_context->case_id == 0x6) {
     510        65536 :         build_response_func = libspdm_requester_chunk_get_test_case5_case6_build_vendor_response;
     511           10 :     } else if (spdm_test_context->case_id == 0x7) {
     512              :         /* This case only return one error message with RequestResynch */
     513              :         spdm_error_response_t* error_rsp;
     514              :         size_t error_rsp_size;
     515              : 
     516            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     517            1 :         error_rsp = (void*) ((uint8_t*) *response + transport_header_size);
     518            1 :         error_rsp_size = sizeof(spdm_error_response_t) + sizeof(uint8_t);
     519              : 
     520            1 :         error_rsp->header.spdm_version = SPDM_MESSAGE_VERSION_10;
     521            1 :         error_rsp->header.request_response_code = SPDM_ERROR;
     522            1 :         error_rsp->header.param1 = SPDM_ERROR_CODE_REQUEST_RESYNCH;
     523            1 :         error_rsp->header.param2 = 0;
     524              : 
     525            1 :         libspdm_transport_test_encode_message(
     526              :             spdm_context, NULL, false, false,
     527              :             error_rsp_size, error_rsp,
     528              :             response_size, response);
     529              : 
     530              :         /* reset static status for next case */
     531            1 :         sub_rsp = NULL;
     532            1 :         sub_rsp_size = 0;
     533            1 :         sub_rsp_copied = 0;
     534            1 :         sub_rsp_remaining = 0;
     535            1 :         chunk_seq_no = 0;
     536            1 :         error_large_response_sent = false;
     537              : 
     538            1 :         return LIBSPDM_STATUS_SUCCESS;
     539            9 :     } else if (spdm_test_context->case_id == 0x8) {
     540            9 :         build_response_func = libspdm_requester_chunk_get_test_case8_build_digest_response;
     541              :     } else {
     542            0 :         LIBSPDM_ASSERT(0);
     543            0 :         return LIBSPDM_STATUS_RECEIVE_FAIL;
     544              :     }
     545              : 
     546        65566 :     if (build_response_func) {
     547        65566 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     548        65566 :         chunk_rsp = (void*) ((uint8_t*) *response + transport_header_size);
     549              : 
     550        65566 :         chunk_rsp->header.spdm_version = spdm_request_header->spdm_version;
     551        65566 :         chunk_rsp->header.request_response_code = SPDM_CHUNK_RESPONSE;
     552        65566 :         chunk_rsp->header.param1 = 0;
     553        65566 :         chunk_rsp->header.param2 = chunk_handle;
     554              : 
     555        65566 :         chunk_copy_to = (uint8_t*) (chunk_rsp + 1);
     556        65566 :         chunk_copy_size = CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE
     557              :                           - sizeof(spdm_chunk_response_response_t);
     558              : 
     559        65566 :         if (sub_rsp_copied == 0) {
     560              : 
     561            6 :             sub_rsp = (spdm_message_header_t*) m_libspdm_local_large_response_buffer;
     562            6 :             sub_rsp_size = sizeof(m_libspdm_local_large_response_buffer);
     563            6 :             if (spdm_test_context->case_id == 0x5 || spdm_test_context->case_id == 0x6) {
     564            2 :                 sub_rsp =
     565              :                     (spdm_message_header_t*)
     566              :                     m_libspdm_local_response_buffer_for_chunk_seq_no_wrap_test;
     567            2 :                 sub_rsp_size = sizeof(m_libspdm_local_response_buffer_for_chunk_seq_no_wrap_test);
     568              :             }
     569            6 :             libspdm_zero_mem(sub_rsp, sub_rsp_size);
     570              : 
     571            6 :             build_response_func(spdm_context, sub_rsp, &sub_rsp_size);
     572              : 
     573            6 :             sub_rsp_remaining = sub_rsp_size;
     574            6 :             sub_rsp_copied = 0;
     575              : 
     576              :             /* first chunk has size of large response */
     577            6 :             chunk_seq_no = 0;
     578            6 :             *((uint32_t*) (chunk_rsp + 1)) = (uint32_t) sub_rsp_size;
     579              : 
     580            6 :             chunk_copy_to += sizeof(uint32_t);
     581            6 :             chunk_copy_size -= sizeof(uint32_t);
     582            6 :             chunk_copy_size = LIBSPDM_MIN(sub_rsp_remaining, chunk_copy_size);
     583            6 :             chunk_rsp_size = sizeof(spdm_chunk_response_response_t)
     584              :                              + sizeof(uint32_t) + chunk_copy_size;
     585              : 
     586              :             /* case_id 0x5 will only get 1 chunk message */
     587            6 :             if (spdm_test_context->case_id == 0x5) {
     588            1 :                 sub_rsp_size = sub_rsp_copied;
     589              :             }
     590              : 
     591              :         } else {
     592        65560 :             chunk_copy_size = LIBSPDM_MIN(sub_rsp_remaining, chunk_copy_size);
     593        65560 :             chunk_rsp_size = sizeof(spdm_chunk_response_response_t) + chunk_copy_size;
     594              :         }
     595              : 
     596        65566 :         if (chunk_copy_size == sub_rsp_remaining) {
     597            4 :             chunk_rsp->header.param1 = SPDM_CHUNK_GET_RESPONSE_ATTRIBUTE_LAST_CHUNK;
     598              :         }
     599              : 
     600        65566 :         libspdm_copy_mem(chunk_copy_to,
     601        65566 :                          *response_size - (chunk_copy_to - (uint8_t*) *response),
     602        65566 :                          (uint8_t*) sub_rsp + sub_rsp_copied,
     603              :                          chunk_copy_size);
     604              : 
     605        65566 :         sub_rsp_copied += chunk_copy_size;
     606        65566 :         sub_rsp_remaining -= chunk_copy_size;
     607        65566 :         chunk_rsp->chunk_size = (uint32_t) chunk_copy_size;
     608        65566 :         if (spdm_request_header->spdm_version < SPDM_MESSAGE_VERSION_14) {
     609        65557 :             chunk_rsp->chunk_seq_no = chunk_seq_no++;
     610              :         } else {
     611            9 :             chunk_rsp_14 = (spdm_chunk_response_response_14_t*) chunk_rsp;
     612            9 :             chunk_rsp_14->chunk_seq_no = chunk_seq_no++;
     613              :         }
     614              : 
     615        65566 :         libspdm_transport_test_encode_message(
     616              :             spdm_context, NULL, false, false,
     617              :             chunk_rsp_size, chunk_rsp,
     618              :             response_size, response);
     619              : 
     620        65566 :         if (sub_rsp_copied >= sub_rsp_size) {
     621            5 :             sub_rsp = NULL;
     622            5 :             sub_rsp_size = 0;
     623            5 :             sub_rsp_copied = 0;
     624            5 :             sub_rsp_remaining = 0;
     625            5 :             chunk_seq_no = 0;
     626            5 :             error_large_response_sent = false;
     627              :         }
     628        65566 :         return LIBSPDM_STATUS_SUCCESS;
     629              :     }
     630            0 :     return LIBSPDM_STATUS_SEND_FAIL;
     631              : 
     632              : }
     633              : #if LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT
     634            1 : static void req_chunk_get_case1(void** state)
     635              : {
     636              :     libspdm_return_t status;
     637              :     libspdm_test_context_t* spdm_test_context;
     638              :     libspdm_context_t* spdm_context;
     639              :     size_t cert_chain_size;
     640              :     uint8_t cert_chain[LIBSPDM_MAX_CERT_CHAIN_SIZE];
     641              :     void* data;
     642              :     size_t data_size;
     643              :     void* hash;
     644              :     size_t hash_size;
     645              :     const uint8_t* root_cert;
     646              :     size_t root_cert_size;
     647              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     648              :     size_t count;
     649              :     #endif
     650              : 
     651            1 :     spdm_test_context = *state;
     652            1 :     spdm_context = spdm_test_context->spdm_context;
     653            1 :     spdm_test_context->case_id = 0x1;
     654            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     655              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     656            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AFTER_DIGESTS;
     657            1 :     spdm_context->connection_info.capability.flags |=
     658              :         (SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP
     659              :          | SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP
     660              :          | SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHUNK_CAP);
     661              : 
     662            1 :     spdm_context->local_context.capability.flags |=  SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHUNK_CAP;
     663              :     spdm_context->local_context.capability.data_transfer_size
     664            1 :         = CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
     665            1 :     spdm_context->local_context.is_requester = true;
     666              : 
     667            1 :     libspdm_read_responder_public_certificate_chain(
     668              :         m_libspdm_use_hash_algo,
     669              :         m_libspdm_use_asym_algo, &data,
     670              :         &data_size, &hash, &hash_size);
     671            1 :     libspdm_x509_get_cert_from_cert_chain(
     672            1 :         (uint8_t*) data + sizeof(spdm_cert_chain_t) + hash_size,
     673            1 :         data_size - sizeof(spdm_cert_chain_t) - hash_size, 0,
     674              :         &root_cert, &root_cert_size);
     675            1 :     LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "root cert data :\n"));
     676            1 :     libspdm_dump_hex(root_cert, root_cert_size);
     677            1 :     spdm_context->local_context.peer_root_cert_provision_size[0] = root_cert_size;
     678              : 
     679            1 :     spdm_context->local_context.peer_root_cert_provision[0] = root_cert;
     680            1 :     libspdm_reset_message_b(spdm_context);
     681            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     682            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     683            1 :     spdm_context->connection_info.algorithm.req_base_asym_alg = m_libspdm_use_req_asym_algo;
     684              : 
     685              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     686              :     spdm_context->transcript.message_m.buffer_size =
     687              :         spdm_context->transcript.message_m.max_buffer_size;
     688              :     #endif
     689            1 :     cert_chain_size = sizeof(cert_chain);
     690            1 :     libspdm_zero_mem(cert_chain, sizeof(cert_chain));
     691            1 :     status = libspdm_get_certificate(spdm_context, NULL, 0, &cert_chain_size, cert_chain);
     692            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     693              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     694              :     count = (data_size + m_libspdm_local_req_msg_size_test_case_1 - 1) / m_libspdm_local_req_msg_size_test_case_1;
     695              :     assert_int_equal(spdm_context->transcript.message_b.buffer_size,
     696              :                      sizeof(spdm_get_certificate_request_t) * count +
     697              :                      sizeof(spdm_certificate_response_t) * count +
     698              :                      data_size);
     699              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
     700              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = 0;
     701              :     #else
     702            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size = 0;
     703              :     #endif
     704            1 :     free(data);
     705            1 : }
     706              : #endif
     707              : #if LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP
     708            1 : static void req_chunk_get_case2(void** state)
     709              : {
     710              :     /* Copied from Get Measurements Test Case 0x20 */
     711              :     libspdm_return_t status;
     712              :     libspdm_test_context_t* spdm_test_context;
     713              :     libspdm_context_t* spdm_context;
     714              :     uint8_t number_of_block;
     715              :     uint32_t measurement_record_length;
     716              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
     717              :     uint8_t request_attribute;
     718              :     void* data;
     719              :     size_t data_size;
     720              :     void* hash;
     721              :     size_t hash_size;
     722              : 
     723            1 :     spdm_test_context = *state;
     724            1 :     spdm_context = spdm_test_context->spdm_context;
     725            1 :     spdm_test_context->case_id = 0x02;
     726            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     727              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     728            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     729            1 :     spdm_context->connection_info.capability.flags |=
     730              :         (SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG
     731              :          | SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHUNK_CAP);
     732              : 
     733            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHUNK_CAP;
     734              :     spdm_context->local_context.capability.data_transfer_size
     735            1 :         = CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
     736              : 
     737            1 :     libspdm_read_responder_public_certificate_chain(
     738              :         m_libspdm_use_hash_algo, m_libspdm_use_asym_algo,
     739              :         &data, &data_size, &hash, &hash_size);
     740            1 :     libspdm_reset_message_m(spdm_context, NULL);
     741            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     742            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     743              :         m_libspdm_use_measurement_hash_algo;
     744            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     745            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     746            1 :     spdm_context->local_context.algorithm.measurement_spec = SPDM_MEASUREMENT_SPECIFICATION_DMTF;
     747              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     748              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = data_size;
     749              :     libspdm_copy_mem(
     750              :         spdm_context->connection_info.peer_used_cert_chain[0].buffer,
     751              :         sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
     752              :         data, data_size);
     753              :     #else
     754            1 :     libspdm_hash_all(
     755              :         spdm_context->connection_info.algorithm.base_hash_algo,
     756              :         data, data_size,
     757            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
     758            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
     759            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
     760            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
     761              :         spdm_context->connection_info.algorithm.base_hash_algo,
     762              :         spdm_context->connection_info.algorithm.base_asym_algo,
     763              :         data, data_size,
     764              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
     765              :     #endif
     766            1 :     request_attribute = 0;
     767              : 
     768            1 :     measurement_record_length = sizeof(measurement_record);
     769            1 :     status = libspdm_get_measurement(
     770              :         spdm_context, NULL, request_attribute,
     771              :         SPDM_GET_MEASUREMENTS_REQUEST_MEASUREMENT_OPERATION_ALL_MEASUREMENTS,
     772              :         0, NULL, &number_of_block, &measurement_record_length,
     773              :         measurement_record);
     774            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     775              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     776              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size,
     777              :                      sizeof(spdm_message_header_t) +
     778              :                      sizeof(spdm_measurements_response_t) +
     779              :                      2 * (sizeof(spdm_measurement_block_dmtf_t) +
     780              :                           libspdm_get_measurement_hash_size(
     781              :                               m_libspdm_use_measurement_hash_algo)) +
     782              :                      sizeof(uint16_t) + SPDM_NONCE_SIZE);
     783              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = 0;
     784              :     #else
     785            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size = 0;
     786              :     #endif
     787            1 :     free(data);
     788            1 : }
     789              : #endif
     790              : 
     791              : #if LIBSPDM_SEND_CHALLENGE_SUPPORT
     792            1 : static void req_chunk_get_case3(void** state)
     793              : {
     794              :     /* Copied from Challenge Test Case 2*/
     795              :     libspdm_return_t status;
     796              :     libspdm_test_context_t* spdm_test_context;
     797              :     libspdm_context_t* spdm_context;
     798              :     uint8_t measurement_hash[LIBSPDM_MAX_HASH_SIZE];
     799              :     void* data;
     800              :     size_t data_size;
     801              :     void* hash;
     802              :     size_t hash_size;
     803              : 
     804            1 :     spdm_test_context = *state;
     805            1 :     spdm_context = spdm_test_context->spdm_context;
     806            1 :     spdm_test_context->case_id = 0x3;
     807            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     808            1 :     spdm_context->connection_info.capability.flags = 0;
     809            1 :     spdm_context->connection_info.capability.flags |=
     810              :         (SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP
     811              :          | SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHUNK_CAP);
     812              : 
     813            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHUNK_CAP;
     814              :     spdm_context->local_context.capability.data_transfer_size
     815            1 :         = CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
     816              : 
     817            1 :     libspdm_read_responder_public_certificate_chain(
     818              :         m_libspdm_use_hash_algo, m_libspdm_use_asym_algo,
     819              :         &data, &data_size, &hash, &hash_size);
     820            1 :     libspdm_reset_message_a(spdm_context);
     821            1 :     libspdm_reset_message_b(spdm_context);
     822            1 :     libspdm_reset_message_c(spdm_context);
     823            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     824            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     825              : 
     826            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     827              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     828              : 
     829              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     830              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = data_size;
     831              :     libspdm_copy_mem(
     832              :         spdm_context->connection_info.peer_used_cert_chain[0].buffer,
     833              :         sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
     834              :         data, data_size);
     835              :     #else
     836            1 :     libspdm_hash_all(
     837              :         spdm_context->connection_info.algorithm.base_hash_algo,
     838              :         data, data_size,
     839            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
     840            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
     841            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
     842            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
     843              :         spdm_context->connection_info.algorithm.base_hash_algo,
     844              :         spdm_context->connection_info.algorithm.base_asym_algo,
     845              :         data, data_size,
     846              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
     847              :     #endif
     848              : 
     849            1 :     libspdm_zero_mem(measurement_hash, sizeof(measurement_hash));
     850            1 :     status = libspdm_challenge(
     851              :         spdm_context, NULL, 0,
     852              :         SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH,
     853              :         measurement_hash, NULL);
     854            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     855            1 :     free(data);
     856              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     857              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = 0;
     858              :     #else
     859            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size = 0;
     860              :     #endif
     861            1 : }
     862              : #endif /* LIBSPDM_SEND_CHALLENGE_SUPPORT */
     863              : 
     864              : #if LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT
     865            1 : static void req_chunk_get_case4(void** state)
     866              : {
     867              :     /* Copied from Get Digests Test Case 2*/
     868              :     libspdm_return_t status;
     869              :     libspdm_test_context_t* spdm_test_context;
     870              :     libspdm_context_t* spdm_context;
     871              :     libspdm_data_parameter_t parameter;
     872              :     uint8_t slot_mask;
     873              :     uint8_t slot_id;
     874              :     uint8_t total_digest_buffer[LIBSPDM_MAX_HASH_SIZE * SPDM_MAX_SLOT_COUNT];
     875              :     uint8_t my_total_digest_buffer[LIBSPDM_MAX_HASH_SIZE * SPDM_MAX_SLOT_COUNT];
     876              :     uint8_t* digest;
     877              :     size_t data_return_size;
     878              : 
     879            1 :     spdm_test_context = *state;
     880            1 :     spdm_context = spdm_test_context->spdm_context;
     881            1 :     spdm_test_context->case_id = 0x4;
     882            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     883              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     884            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     885            1 :     spdm_context->connection_info.capability.flags |=
     886              :         (SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP
     887              :          | SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHUNK_CAP);
     888              : 
     889            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHUNK_CAP;
     890              :     spdm_context->local_context.capability.data_transfer_size
     891            1 :         = CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
     892              : 
     893            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     894              : 
     895            1 :     libspdm_set_mem(
     896              :         m_libspdm_local_certificate_chain_test_case_4,
     897              :         sizeof(m_libspdm_local_certificate_chain_test_case_4),
     898              :         (uint8_t) (0xFF));
     899            1 :     libspdm_reset_message_b(spdm_context);
     900              : 
     901              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     902              :     spdm_context->transcript.message_m.buffer_size =
     903              :         spdm_context->transcript.message_m.max_buffer_size;
     904              :     #endif
     905            1 :     libspdm_zero_mem(total_digest_buffer, sizeof(total_digest_buffer));
     906            1 :     status = libspdm_get_digest(spdm_context, NULL, &slot_mask, &total_digest_buffer);
     907            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     908              : 
     909            1 :     assert_int_equal(slot_mask, 0xFF);
     910            1 :     libspdm_zero_mem(my_total_digest_buffer, sizeof(my_total_digest_buffer));
     911            1 :     digest = my_total_digest_buffer;
     912            9 :     for (slot_id = 0; slot_id < SPDM_MAX_SLOT_COUNT; slot_id++) {
     913            8 :         libspdm_hash_all(m_libspdm_use_hash_algo,
     914              :                          m_libspdm_local_certificate_chain_test_case_4,
     915              :                          sizeof(m_libspdm_local_certificate_chain_test_case_4), digest);
     916            8 :         digest += libspdm_get_hash_size(m_libspdm_use_hash_algo);
     917              :     }
     918            1 :     assert_memory_equal(total_digest_buffer, my_total_digest_buffer,
     919              :                         sizeof(my_total_digest_buffer));
     920              : 
     921            1 :     parameter.location = LIBSPDM_DATA_LOCATION_CONNECTION;
     922            1 :     data_return_size = sizeof(uint8_t);
     923            1 :     status = libspdm_get_data(spdm_context, LIBSPDM_DATA_PEER_SLOT_MASK,
     924              :                               &parameter, &slot_mask, &data_return_size);
     925            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     926            1 :     assert_int_equal(data_return_size, sizeof(uint8_t));
     927            1 :     assert_int_equal(slot_mask, 0xFF);
     928              : 
     929              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     930              :     assert_int_equal(
     931              :         spdm_context->transcript.message_b.buffer_size,
     932              :         sizeof(spdm_get_digest_request_t) +
     933              :         sizeof(spdm_digest_response_t) +
     934              :         libspdm_get_hash_size(spdm_context->connection_info
     935              :                               .algorithm.base_hash_algo) * SPDM_MAX_SLOT_COUNT);
     936              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
     937              :     #endif
     938            1 : }
     939              : #endif
     940              : 
     941              : #if LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES
     942            1 : static void req_chunk_get_case5(void **state)
     943              : {
     944              :     /* Copied from Vendor Request case 1*/
     945              :     libspdm_return_t status;
     946              :     libspdm_test_context_t *spdm_test_context;
     947              :     libspdm_context_t *spdm_context;
     948              : 
     949            1 :     uint16_t standard_id = 6;
     950            1 :     uint8_t vendor_id_len = 2;
     951            1 :     uint8_t vendor_id[SPDM_MAX_VENDOR_ID_LENGTH] = {0xAA, 0xAA};
     952            1 :     uint32_t data_len = 16;
     953              :     uint8_t data[16];
     954              : 
     955            1 :     spdm_test_context = *state;
     956            1 :     spdm_context = spdm_test_context->spdm_context;
     957            1 :     spdm_test_context->case_id = 0x5;
     958            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     959              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     960              :     /* Large response need a large scratch buffer. */
     961            1 :     spdm_context->connection_info.capability.max_spdm_msg_size =
     962              :         BUFFER_SIZE_FOR_CHUNK_SEQ_NO_WRAP_TEST;
     963            1 :     spdm_context->local_context.capability.max_spdm_msg_size =
     964              :         BUFFER_SIZE_FOR_CHUNK_SEQ_NO_WRAP_TEST;
     965            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     966            1 :     spdm_context->local_context.capability.data_transfer_size =
     967              :         CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
     968            1 :     spdm_context->connection_info.capability.data_transfer_size =
     969              :         CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
     970            1 :     spdm_context->local_context.capability.sender_data_transfer_size =
     971              :         CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
     972            1 :     spdm_context->local_context.is_requester = true;
     973              : 
     974            1 :     spdm_test_context->scratch_buffer_size =
     975            1 :         libspdm_get_sizeof_required_scratch_buffer(spdm_context);
     976            1 :     spdm_test_context->scratch_buffer = (void *)malloc(spdm_test_context->scratch_buffer_size);
     977            1 :     libspdm_set_scratch_buffer (spdm_context,
     978              :                                 spdm_test_context->scratch_buffer,
     979              :                                 spdm_test_context->scratch_buffer_size);
     980              : 
     981            1 :     libspdm_set_mem(data, sizeof(data), 0xAA);
     982              : 
     983            1 :     status = libspdm_vendor_send_request_receive_response(spdm_context, NULL,
     984              :                                                           standard_id, vendor_id_len, vendor_id,
     985              :                                                           data_len, data,
     986              :                                                           &standard_id, &vendor_id_len, vendor_id,
     987              :                                                           &data_len, data);
     988              : 
     989            1 :     assert_int_equal(status, LIBSPDM_STATUS_RECEIVE_FAIL);
     990            1 : }
     991              : 
     992            1 : static void req_chunk_get_case6(void **state)
     993              : {
     994              :     /* Copied from Chunk Get Request case 5*/
     995              :     libspdm_return_t status;
     996              :     libspdm_test_context_t *spdm_test_context;
     997              :     libspdm_context_t *spdm_context;
     998              : 
     999            1 :     uint16_t standard_id = 6;
    1000            1 :     uint8_t vendor_id_len = 2;
    1001            1 :     uint8_t vendor_id[SPDM_MAX_VENDOR_ID_LENGTH] = {0xAA, 0xAA};
    1002            1 :     uint32_t data_len = 16;
    1003              :     uint8_t data[16];
    1004              : 
    1005            1 :     spdm_test_context = *state;
    1006            1 :     spdm_context = spdm_test_context->spdm_context;
    1007            1 :     spdm_test_context->case_id = 0x6;
    1008            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
    1009              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1010              :     /* Large response need a large scratch buffer. */
    1011            1 :     spdm_context->connection_info.capability.max_spdm_msg_size =
    1012              :         BUFFER_SIZE_FOR_CHUNK_SEQ_NO_WRAP_TEST;
    1013            1 :     spdm_context->local_context.capability.max_spdm_msg_size =
    1014              :         BUFFER_SIZE_FOR_CHUNK_SEQ_NO_WRAP_TEST;
    1015            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1016              :     /* to pass the exam of max_chunk_data_transfer_size*/
    1017            1 :     spdm_context->local_context.capability.data_transfer_size =
    1018              :         CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE + 0x10;
    1019            1 :     spdm_context->connection_info.capability.data_transfer_size =
    1020              :         CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE + 0x10;
    1021            1 :     spdm_context->local_context.capability.sender_data_transfer_size =
    1022              :         CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE + 0x10;
    1023            1 :     spdm_context->local_context.is_requester = true;
    1024              : 
    1025            1 :     spdm_test_context->scratch_buffer_size =
    1026            1 :         libspdm_get_sizeof_required_scratch_buffer(spdm_context);
    1027            1 :     spdm_test_context->scratch_buffer = (void *)malloc(spdm_test_context->scratch_buffer_size);
    1028            1 :     libspdm_set_scratch_buffer (spdm_context,
    1029              :                                 spdm_test_context->scratch_buffer,
    1030              :                                 spdm_test_context->scratch_buffer_size);
    1031              : 
    1032            1 :     libspdm_set_mem(data, sizeof(data), 0xAA);
    1033              : 
    1034            1 :     status = libspdm_vendor_send_request_receive_response(spdm_context, NULL,
    1035              :                                                           standard_id, vendor_id_len, vendor_id,
    1036              :                                                           data_len, data,
    1037              :                                                           &standard_id, &vendor_id_len, vendor_id,
    1038              :                                                           &data_len, data);
    1039              : 
    1040            1 :     assert_int_equal(status, LIBSPDM_STATUS_RECEIVE_FAIL);
    1041            1 : }
    1042              : 
    1043            1 : static void req_chunk_get_case7(void **state)
    1044              : {
    1045              :     /* Copied from Chunk Get Request case 5*/
    1046              :     libspdm_return_t status;
    1047              :     libspdm_test_context_t *spdm_test_context;
    1048              :     libspdm_context_t *spdm_context;
    1049              : 
    1050            1 :     uint16_t standard_id = 6;
    1051            1 :     uint8_t vendor_id_len = 2;
    1052            1 :     uint8_t vendor_id[SPDM_MAX_VENDOR_ID_LENGTH] = {0xAA, 0xAA};
    1053            1 :     uint32_t data_len = 16;
    1054              :     uint8_t data[16];
    1055              : 
    1056            1 :     spdm_test_context = *state;
    1057            1 :     spdm_context = spdm_test_context->spdm_context;
    1058            1 :     spdm_test_context->case_id = 0x7;
    1059            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
    1060              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1061              :     /* Large response need a large scratch buffer. */
    1062            1 :     spdm_context->connection_info.capability.max_spdm_msg_size =
    1063              :         BUFFER_SIZE_FOR_CHUNK_SEQ_NO_WRAP_TEST;
    1064            1 :     spdm_context->local_context.capability.max_spdm_msg_size =
    1065              :         BUFFER_SIZE_FOR_CHUNK_SEQ_NO_WRAP_TEST;
    1066            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1067            1 :     spdm_context->local_context.capability.data_transfer_size =
    1068              :         CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
    1069            1 :     spdm_context->connection_info.capability.data_transfer_size =
    1070              :         CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
    1071            1 :     spdm_context->local_context.capability.sender_data_transfer_size =
    1072              :         CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
    1073            1 :     spdm_context->local_context.is_requester = true;
    1074              : 
    1075            1 :     spdm_test_context->scratch_buffer_size =
    1076            1 :         libspdm_get_sizeof_required_scratch_buffer(spdm_context);
    1077            1 :     spdm_test_context->scratch_buffer = (void *)malloc(spdm_test_context->scratch_buffer_size);
    1078            1 :     libspdm_set_scratch_buffer (spdm_context,
    1079              :                                 spdm_test_context->scratch_buffer,
    1080              :                                 spdm_test_context->scratch_buffer_size);
    1081              : 
    1082            1 :     libspdm_set_mem(data, sizeof(data), 0xAA);
    1083              : 
    1084            1 :     status = libspdm_vendor_send_request_receive_response(spdm_context, NULL,
    1085              :                                                           standard_id, vendor_id_len, vendor_id,
    1086              :                                                           data_len, data,
    1087              :                                                           &standard_id, &vendor_id_len, vendor_id,
    1088              :                                                           &data_len, data);
    1089              : 
    1090            1 :     assert_int_equal(status, LIBSPDM_STATUS_RESYNCH_PEER);
    1091            1 :     assert_int_equal(spdm_context->connection_info.connection_state,
    1092              :                      LIBSPDM_CONNECTION_STATE_NOT_STARTED);
    1093            1 : }
    1094              : #endif /* LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES */
    1095              : 
    1096              : #if LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT
    1097            1 : static void req_chunk_get_case8(void** state)
    1098              : {
    1099              :     /* Copied from Chunk Send Test Case 4, use spdm 1.4*/
    1100              :     libspdm_return_t status;
    1101              :     libspdm_test_context_t* spdm_test_context;
    1102              :     libspdm_context_t* spdm_context;
    1103              :     libspdm_data_parameter_t parameter;
    1104              :     uint8_t slot_mask;
    1105              :     uint8_t slot_id;
    1106              :     uint8_t total_digest_buffer[LIBSPDM_MAX_HASH_SIZE * SPDM_MAX_SLOT_COUNT];
    1107              :     uint8_t my_total_digest_buffer[LIBSPDM_MAX_HASH_SIZE * SPDM_MAX_SLOT_COUNT];
    1108              :     uint8_t* digest;
    1109              :     size_t data_return_size;
    1110              : 
    1111            1 :     spdm_test_context = *state;
    1112            1 :     spdm_context = spdm_test_context->spdm_context;
    1113            1 :     spdm_test_context->case_id = 0x8;
    1114            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_14 <<
    1115              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1116            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1117            1 :     spdm_context->connection_info.capability.flags |=
    1118              :         (SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP
    1119              :          | SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHUNK_CAP);
    1120              : 
    1121            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHUNK_CAP;
    1122              :     spdm_context->local_context.capability.data_transfer_size
    1123            1 :         = CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
    1124              : 
    1125            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1126              : 
    1127            1 :     libspdm_set_mem(
    1128              :         m_libspdm_local_certificate_chain_test_case_4,
    1129              :         sizeof(m_libspdm_local_certificate_chain_test_case_4),
    1130              :         (uint8_t) (0xFF));
    1131            1 :     libspdm_reset_message_b(spdm_context);
    1132              : 
    1133              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1134              :     spdm_context->transcript.message_m.buffer_size =
    1135              :         spdm_context->transcript.message_m.max_buffer_size;
    1136              :     #endif
    1137            1 :     libspdm_zero_mem(total_digest_buffer, sizeof(total_digest_buffer));
    1138            1 :     status = libspdm_get_digest(spdm_context, NULL, &slot_mask, &total_digest_buffer);
    1139            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1140              : 
    1141            1 :     assert_int_equal(slot_mask, 0xFF);
    1142            1 :     libspdm_zero_mem(my_total_digest_buffer, sizeof(my_total_digest_buffer));
    1143            1 :     digest = my_total_digest_buffer;
    1144            9 :     for (slot_id = 0; slot_id < SPDM_MAX_SLOT_COUNT; slot_id++) {
    1145            8 :         libspdm_hash_all(m_libspdm_use_hash_algo,
    1146              :                          m_libspdm_local_certificate_chain_test_case_4,
    1147              :                          sizeof(m_libspdm_local_certificate_chain_test_case_4), digest);
    1148            8 :         digest += libspdm_get_hash_size(m_libspdm_use_hash_algo);
    1149              :     }
    1150            1 :     assert_memory_equal(total_digest_buffer, my_total_digest_buffer,
    1151              :                         sizeof(my_total_digest_buffer));
    1152              : 
    1153            1 :     parameter.location = LIBSPDM_DATA_LOCATION_CONNECTION;
    1154            1 :     data_return_size = sizeof(uint8_t);
    1155            1 :     status = libspdm_get_data(spdm_context, LIBSPDM_DATA_PEER_SLOT_MASK,
    1156              :                               &parameter, &slot_mask, &data_return_size);
    1157            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1158            1 :     assert_int_equal(data_return_size, sizeof(uint8_t));
    1159            1 :     assert_int_equal(slot_mask, 0xFF);
    1160              : 
    1161              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1162              :     assert_int_equal(
    1163              :         spdm_context->transcript.message_b.buffer_size,
    1164              :         sizeof(spdm_get_digest_request_t) +
    1165              :         sizeof(spdm_digest_response_t) +
    1166              :         libspdm_get_hash_size(spdm_context->connection_info
    1167              :                               .algorithm.base_hash_algo) * SPDM_MAX_SLOT_COUNT);
    1168              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
    1169              :     #endif
    1170            1 : }
    1171              : #endif
    1172              : 
    1173              : 
    1174            1 : int libspdm_req_chunk_get_test(void)
    1175              : {
    1176              :     /* Test the CHUNK_GET handlers in various requester handlers */
    1177            1 :     const struct CMUnitTest test_cases[] = {
    1178              : #if LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT
    1179              :         /* Request a certificate in portions */
    1180              :         cmocka_unit_test(req_chunk_get_case1),
    1181              : #endif
    1182              : #if LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP
    1183              :         /* Request all measurements */
    1184              :         cmocka_unit_test(req_chunk_get_case2),
    1185              : #endif
    1186              : #if LIBSPDM_SEND_CHALLENGE_SUPPORT
    1187              :         /* Request Challenge */
    1188              :         cmocka_unit_test(req_chunk_get_case3),
    1189              : #endif
    1190              : #if LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT
    1191              :         /* Request Digests */
    1192              :         cmocka_unit_test(req_chunk_get_case4),
    1193              : #endif
    1194              : #if LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES
    1195              :         /* Request Vendor Specific Response and chunk data size
    1196              :          * exceed max_chunk_data_transfer_size
    1197              :          */
    1198              :         cmocka_unit_test(req_chunk_get_case5),
    1199              :         /* Request Vendor Specific Response and chunk seq no wrapped */
    1200              :         cmocka_unit_test(req_chunk_get_case6),
    1201              :         /* Request Vendor Specific Response
    1202              :          * and recieve error code RequestResync */
    1203              :         cmocka_unit_test(req_chunk_get_case7),
    1204              : #endif
    1205              : #if LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT
    1206              :         /* Request Digests with spdm 1.4 */
    1207              :         cmocka_unit_test(req_chunk_get_case8),
    1208              : #endif
    1209              :     };
    1210              : 
    1211            1 :     libspdm_test_context_t test_context = {
    1212              :         LIBSPDM_TEST_CONTEXT_VERSION,
    1213              :         true,
    1214              :         send_message,
    1215              :         receive_message,
    1216              :     };
    1217              : 
    1218            1 :     libspdm_setup_test_context(&test_context);
    1219              : 
    1220            1 :     return cmocka_run_group_tests(test_cases,
    1221              :                                   libspdm_unit_test_group_setup,
    1222              :                                   libspdm_unit_test_group_teardown);
    1223              : }
    1224              : 
    1225              : #endif /* LIBSPDM_ENABLE_CAPABILITY_CHUNK_CAP*/
        

Generated by: LCOV version 2.0-1