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.2 % 492 488
Test Date: 2025-09-14 08:11:04 Functions: 100.0 % 15 15

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

Generated by: LCOV version 2.0-1