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.1 % 455 451
Test Date: 2025-06-29 08:09:00 Functions: 100.0 % 14 14

            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              : #if LIBSPDM_HAL_PASS_SPDM_CONTEXT
     220              :         spdm_context,
     221              : #endif
     222            1 :         spdm_response->header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     223              :             SPDM_CHALLENGE_AUTH,
     224              :             m_libspdm_use_asym_algo, m_libspdm_use_hash_algo,
     225              :             false, m_libspdm_local_buffer, m_libspdm_local_buffer_size,
     226              :             ptr, &sig_size);
     227            1 :     ptr += sig_size;
     228            1 : }
     229              : 
     230            1 : void libspdm_requester_chunk_get_test_case4_build_digest_response(
     231              :     void* context, void* response, size_t* response_size)
     232              : {
     233              :     libspdm_context_t *spdm_context;
     234              :     spdm_digest_response_t* spdm_response;
     235              :     uint8_t* digest;
     236              :     uint8_t slot_id;
     237              : 
     238            1 :     spdm_context = (libspdm_context_t*)context;
     239            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     240              :         m_libspdm_use_hash_algo;
     241            1 :     *response_size = sizeof(spdm_digest_response_t) +
     242            1 :                      libspdm_get_hash_size(m_libspdm_use_hash_algo) * SPDM_MAX_SLOT_COUNT;
     243            1 :     spdm_response = response;
     244              : 
     245            1 :     spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     246            1 :     spdm_response->header.param1 = 0;
     247            1 :     spdm_response->header.request_response_code = SPDM_DIGESTS;
     248            1 :     spdm_response->header.param2 = 0;
     249            1 :     libspdm_set_mem(m_libspdm_local_certificate_chain_test_case_4,
     250              :                     sizeof(m_libspdm_local_certificate_chain_test_case_4),
     251              :                     (uint8_t) (0xFF));
     252              : 
     253            1 :     digest = (void*) (spdm_response + 1);
     254            1 :     libspdm_zero_mem(digest,
     255            1 :                      libspdm_get_hash_size(m_libspdm_use_hash_algo) * SPDM_MAX_SLOT_COUNT);
     256            9 :     for (slot_id = 0; slot_id < SPDM_MAX_SLOT_COUNT; slot_id++) {
     257            8 :         libspdm_hash_all(
     258              :             m_libspdm_use_hash_algo,
     259              :             m_libspdm_local_certificate_chain_test_case_4,
     260              :             sizeof(m_libspdm_local_certificate_chain_test_case_4), &digest[0]);
     261            8 :         digest += libspdm_get_hash_size(m_libspdm_use_hash_algo);
     262              :     }
     263            1 :     spdm_response->header.param2 |= (0xFF << 0);
     264            1 : }
     265              : 
     266            2 : void libspdm_requester_chunk_get_test_case5_case6_build_vendor_response(
     267              :     void* context, void* response, size_t* response_size)
     268              : {
     269              :     spdm_vendor_defined_response_msg_t *spdm_response;
     270              : 
     271              :     /* For exceed max chunk seq no */
     272            2 :     *response_size =
     273              :         (CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE -
     274              :          sizeof(spdm_chunk_response_response_t)) * 65536 - sizeof(uint32_t) + 0x10;
     275              : 
     276            2 :     libspdm_set_mem(response, *response_size, 0xff);
     277              : 
     278            2 :     spdm_response = response;
     279              : 
     280            2 :     spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     281            2 :     spdm_response->header.request_response_code = SPDM_VENDOR_DEFINED_RESPONSE;
     282            2 :     spdm_response->header.param1 = 0;
     283            2 :     spdm_response->header.param2 = 0;
     284              : 
     285            2 :     spdm_response->standard_id = 6;
     286            2 :     spdm_response->len = 2;
     287            2 : }
     288              : 
     289        65612 : libspdm_return_t libspdm_requester_chunk_get_test_send_message(
     290              :     void* spdm_context, size_t request_size, const void* request,
     291              :     uint64_t timeout)
     292              : {
     293              :     libspdm_test_context_t* spdm_test_context;
     294              : 
     295        65612 :     spdm_test_context = libspdm_get_test_context();
     296        65612 :     if (spdm_test_context->case_id == 0x1) {
     297           50 :         return LIBSPDM_STATUS_SUCCESS;
     298        65562 :     } else if (spdm_test_context->case_id == 0x2) {
     299            7 :         return LIBSPDM_STATUS_SUCCESS;
     300        65555 :     } else if (spdm_test_context->case_id == 0x3) {
     301              :         const uint8_t* ptr;
     302            6 :         ptr = (const uint8_t*) request;
     303              : 
     304            6 :         if (ptr[2] == SPDM_CHALLENGE) {
     305            1 :             m_libspdm_local_buffer_size = 0;
     306            1 :             libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     307            1 :                              &ptr[1], request_size - 1);
     308            1 :             m_libspdm_local_buffer_size += (request_size - 1);
     309              :         }
     310            6 :         return LIBSPDM_STATUS_SUCCESS;
     311        65549 :     } else if (spdm_test_context->case_id == 0x4) {
     312           10 :         return LIBSPDM_STATUS_SUCCESS;
     313        65539 :     } else if (spdm_test_context->case_id == 0x5) {
     314            2 :         return LIBSPDM_STATUS_SUCCESS;
     315        65537 :     } else if (spdm_test_context->case_id == 0x6) {
     316        65537 :         return LIBSPDM_STATUS_SUCCESS;
     317              :     } else {
     318            0 :         return LIBSPDM_STATUS_SEND_FAIL;
     319              :     }
     320              : }
     321              : 
     322        65612 : 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        65612 :     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        65612 :     build_response_func = NULL;
     344              : 
     345        65612 :     spdm_test_context = libspdm_get_test_context();
     346              : 
     347              :     /* First response to these tests should always be error large response */
     348        65612 :     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        65605 :     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        65557 :     } else if (spdm_test_context->case_id == 0x2) {
     455            6 :         build_response_func =
     456              :             libspdm_requester_chunk_get_test_case2_build_measurements_response;
     457        65551 :     } else if (spdm_test_context->case_id == 0x3) {
     458            5 :         build_response_func =
     459              :             libspdm_requester_chunk_get_test_case3_build_challenge_response;
     460        65546 :     } else if (spdm_test_context->case_id == 0x4) {
     461            9 :         build_response_func =
     462              :             libspdm_requester_chunk_get_test_case4_build_digest_response;
     463        65537 :     } 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        65536 :     } 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              :     } else {
     470            0 :         LIBSPDM_ASSERT(0);
     471            0 :         return LIBSPDM_STATUS_RECEIVE_FAIL;
     472              :     }
     473              : 
     474        65557 :     if (build_response_func) {
     475        65557 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     476        65557 :         chunk_rsp = (void*) ((uint8_t*) *response + transport_header_size);
     477              : 
     478        65557 :         chunk_rsp->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     479        65557 :         chunk_rsp->header.request_response_code = SPDM_CHUNK_RESPONSE;
     480        65557 :         chunk_rsp->header.param1 = 0;
     481        65557 :         chunk_rsp->header.param2 = chunk_handle;
     482              : 
     483        65557 :         chunk_copy_to = (uint8_t*) (chunk_rsp + 1);
     484        65557 :         chunk_copy_size = CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE
     485              :                           - sizeof(spdm_chunk_response_response_t);
     486              : 
     487        65557 :         if (sub_rsp_copied == 0) {
     488              : 
     489            5 :             sub_rsp = (spdm_message_header_t*) m_libspdm_local_large_response_buffer;
     490            5 :             sub_rsp_size = sizeof(m_libspdm_local_large_response_buffer);
     491            5 :             if (spdm_test_context->case_id == 0x5 ||
     492            4 :                 spdm_test_context->case_id == 0x6) {
     493            2 :                 sub_rsp =
     494              :                     (spdm_message_header_t*)
     495              :                     m_libspdm_local_response_buffer_for_chunk_seq_no_wrap_test;
     496            2 :                 sub_rsp_size = sizeof(m_libspdm_local_response_buffer_for_chunk_seq_no_wrap_test);
     497              :             }
     498            5 :             libspdm_zero_mem(sub_rsp, sub_rsp_size);
     499              : 
     500            5 :             build_response_func(spdm_context, sub_rsp, &sub_rsp_size);
     501              : 
     502            5 :             sub_rsp_remaining = sub_rsp_size;
     503            5 :             sub_rsp_copied = 0;
     504              : 
     505              :             /* first chunk has size of large response */
     506            5 :             chunk_seq_no = 0;
     507            5 :             *((uint32_t*) (chunk_rsp + 1)) = (uint32_t) sub_rsp_size;
     508              : 
     509            5 :             chunk_copy_to += sizeof(uint32_t);
     510            5 :             chunk_copy_size -= sizeof(uint32_t);
     511            5 :             chunk_copy_size = LIBSPDM_MIN(sub_rsp_remaining, chunk_copy_size);
     512            5 :             chunk_rsp_size = sizeof(spdm_chunk_response_response_t)
     513              :                              + sizeof(uint32_t) + chunk_copy_size;
     514              : 
     515              :             /* case_id 0x5 will only get 1 chunk message */
     516            5 :             if (spdm_test_context->case_id == 0x5) {
     517            1 :                 sub_rsp_size = sub_rsp_copied;
     518              :             }
     519              : 
     520              :         } else {
     521        65552 :             chunk_copy_size = LIBSPDM_MIN(sub_rsp_remaining, chunk_copy_size);
     522        65552 :             chunk_rsp_size = sizeof(spdm_chunk_response_response_t) + chunk_copy_size;
     523              :         }
     524              : 
     525        65557 :         if (chunk_copy_size == sub_rsp_remaining) {
     526            3 :             chunk_rsp->header.param1 = SPDM_CHUNK_GET_RESPONSE_ATTRIBUTE_LAST_CHUNK;
     527              :         }
     528              : 
     529        65557 :         libspdm_copy_mem(chunk_copy_to,
     530        65557 :                          *response_size - (chunk_copy_to - (uint8_t*) *response),
     531        65557 :                          (uint8_t*) sub_rsp + sub_rsp_copied,
     532              :                          chunk_copy_size);
     533              : 
     534        65557 :         sub_rsp_copied += chunk_copy_size;
     535        65557 :         sub_rsp_remaining -= chunk_copy_size;
     536        65557 :         chunk_rsp->chunk_size = (uint32_t) chunk_copy_size;
     537        65557 :         chunk_rsp->chunk_seq_no = chunk_seq_no++;
     538              : 
     539        65557 :         libspdm_transport_test_encode_message(
     540              :             spdm_context, NULL, false, false,
     541              :             chunk_rsp_size, chunk_rsp,
     542              :             response_size, response);
     543              : 
     544        65557 :         if (sub_rsp_copied >= sub_rsp_size) {
     545            4 :             sub_rsp = NULL;
     546            4 :             sub_rsp_size = 0;
     547            4 :             sub_rsp_copied = 0;
     548            4 :             sub_rsp_remaining = 0;
     549            4 :             chunk_seq_no = 0;
     550            4 :             error_large_response_sent = false;
     551              :         }
     552        65557 :         return LIBSPDM_STATUS_SUCCESS;
     553              :     }
     554            0 :     return LIBSPDM_STATUS_SEND_FAIL;
     555              : 
     556              : }
     557              : #if LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT
     558            1 : void libspdm_test_requester_chunk_get_case1(void** state)
     559              : {
     560              :     libspdm_return_t status;
     561              :     libspdm_test_context_t* spdm_test_context;
     562              :     libspdm_context_t* spdm_context;
     563              :     size_t cert_chain_size;
     564              :     uint8_t cert_chain[LIBSPDM_MAX_CERT_CHAIN_SIZE];
     565              :     void* data;
     566              :     size_t data_size;
     567              :     void* hash;
     568              :     size_t hash_size;
     569              :     const uint8_t* root_cert;
     570              :     size_t root_cert_size;
     571              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     572              :     size_t count;
     573              :     #endif
     574              : 
     575            1 :     spdm_test_context = *state;
     576            1 :     spdm_context = spdm_test_context->spdm_context;
     577            1 :     spdm_test_context->case_id = 0x1;
     578            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     579              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     580            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AFTER_DIGESTS;
     581            1 :     spdm_context->connection_info.capability.flags |=
     582              :         (SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP
     583              :          | SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP
     584              :          | SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHUNK_CAP);
     585              : 
     586            1 :     spdm_context->local_context.capability.flags |=  SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHUNK_CAP;
     587              :     spdm_context->local_context.capability.data_transfer_size
     588            1 :         = CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
     589            1 :     spdm_context->local_context.is_requester = true;
     590              : 
     591            1 :     libspdm_read_responder_public_certificate_chain(
     592              :         m_libspdm_use_hash_algo,
     593              :         m_libspdm_use_asym_algo, &data,
     594              :         &data_size, &hash, &hash_size);
     595            1 :     libspdm_x509_get_cert_from_cert_chain(
     596            1 :         (uint8_t*) data + sizeof(spdm_cert_chain_t) + hash_size,
     597            1 :         data_size - sizeof(spdm_cert_chain_t) - hash_size, 0,
     598              :         &root_cert, &root_cert_size);
     599            1 :     LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "root cert data :\n"));
     600            1 :     libspdm_dump_hex(root_cert, root_cert_size);
     601            1 :     spdm_context->local_context.peer_root_cert_provision_size[0] = root_cert_size;
     602              : 
     603            1 :     spdm_context->local_context.peer_root_cert_provision[0] = root_cert;
     604            1 :     libspdm_reset_message_b(spdm_context);
     605            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     606            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     607            1 :     spdm_context->connection_info.algorithm.req_base_asym_alg = m_libspdm_use_req_asym_algo;
     608              : 
     609              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     610              :     spdm_context->transcript.message_m.buffer_size =
     611              :         spdm_context->transcript.message_m.max_buffer_size;
     612              :     #endif
     613            1 :     cert_chain_size = sizeof(cert_chain);
     614            1 :     libspdm_zero_mem(cert_chain, sizeof(cert_chain));
     615            1 :     status = libspdm_get_certificate(spdm_context, NULL, 0, &cert_chain_size, cert_chain);
     616            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     617              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     618              :     count = (data_size + LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN - 1) / LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN;
     619              :     assert_int_equal(spdm_context->transcript.message_b.buffer_size,
     620              :                      sizeof(spdm_get_certificate_request_t) * count +
     621              :                      sizeof(spdm_certificate_response_t) * count +
     622              :                      data_size);
     623              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
     624              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = 0;
     625              :     #else
     626            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size = 0;
     627              :     #endif
     628            1 :     free(data);
     629            1 : }
     630              : #endif
     631              : #if LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP
     632            1 : void libspdm_test_requester_chunk_get_case2(void** state)
     633              : {
     634              :     /* Copied from Get Measurements Test Case 0x20 */
     635              :     libspdm_return_t status;
     636              :     libspdm_test_context_t* spdm_test_context;
     637              :     libspdm_context_t* spdm_context;
     638              :     uint8_t number_of_block;
     639              :     uint32_t measurement_record_length;
     640              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
     641              :     uint8_t request_attribute;
     642              :     void* data;
     643              :     size_t data_size;
     644              :     void* hash;
     645              :     size_t hash_size;
     646              : 
     647            1 :     spdm_test_context = *state;
     648            1 :     spdm_context = spdm_test_context->spdm_context;
     649            1 :     spdm_test_context->case_id = 0x02;
     650            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     651              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     652            1 :     spdm_context->connection_info.connection_state =
     653              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     654            1 :     spdm_context->connection_info.capability.flags |=
     655              :         (SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG
     656              :          | SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHUNK_CAP);
     657              : 
     658            1 :     spdm_context->local_context.capability.flags |=
     659              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHUNK_CAP;
     660              :     spdm_context->local_context.capability.data_transfer_size
     661            1 :         = CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
     662              : 
     663            1 :     libspdm_read_responder_public_certificate_chain(
     664              :         m_libspdm_use_hash_algo, m_libspdm_use_asym_algo,
     665              :         &data, &data_size, &hash, &hash_size);
     666            1 :     libspdm_reset_message_m(spdm_context, NULL);
     667            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     668              :         m_libspdm_use_measurement_spec;
     669            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     670              :         m_libspdm_use_measurement_hash_algo;
     671            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     672              :         m_libspdm_use_hash_algo;
     673            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     674              :         m_libspdm_use_asym_algo;
     675            1 :     spdm_context->local_context.algorithm.measurement_spec =
     676              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
     677              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     678              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = data_size;
     679              :     libspdm_copy_mem(
     680              :         spdm_context->connection_info.peer_used_cert_chain[0].buffer,
     681              :         sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
     682              :         data, data_size);
     683              :     #else
     684            1 :     libspdm_hash_all(
     685              :         spdm_context->connection_info.algorithm.base_hash_algo,
     686              :         data, data_size,
     687            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
     688            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
     689            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
     690            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
     691              :         spdm_context->connection_info.algorithm.base_hash_algo,
     692              :         spdm_context->connection_info.algorithm.base_asym_algo,
     693              :         data, data_size,
     694              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
     695              :     #endif
     696            1 :     request_attribute = 0;
     697              : 
     698            1 :     measurement_record_length = sizeof(measurement_record);
     699            1 :     status = libspdm_get_measurement(
     700              :         spdm_context, NULL, request_attribute,
     701              :         SPDM_GET_MEASUREMENTS_REQUEST_MEASUREMENT_OPERATION_ALL_MEASUREMENTS,
     702              :         0, NULL, &number_of_block, &measurement_record_length,
     703              :         measurement_record);
     704            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     705              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     706              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size,
     707              :                      sizeof(spdm_message_header_t) +
     708              :                      sizeof(spdm_measurements_response_t) +
     709              :                      2 * (sizeof(spdm_measurement_block_dmtf_t) +
     710              :                           libspdm_get_measurement_hash_size(
     711              :                               m_libspdm_use_measurement_hash_algo)) +
     712              :                      sizeof(uint16_t) + SPDM_NONCE_SIZE);
     713              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = 0;
     714              :     #else
     715            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size = 0;
     716              :     #endif
     717            1 :     free(data);
     718            1 : }
     719              : #endif
     720              : #if LIBSPDM_ENABLE_CAPABILITY_CHAL_CAP
     721            1 : void libspdm_test_requester_chunk_get_case3(void** state)
     722              : {
     723              :     /* Copied from Challenge Test Case 2*/
     724              :     libspdm_return_t status;
     725              :     libspdm_test_context_t* spdm_test_context;
     726              :     libspdm_context_t* spdm_context;
     727              :     uint8_t measurement_hash[LIBSPDM_MAX_HASH_SIZE];
     728              :     void* data;
     729              :     size_t data_size;
     730              :     void* hash;
     731              :     size_t hash_size;
     732              : 
     733            1 :     spdm_test_context = *state;
     734            1 :     spdm_context = spdm_test_context->spdm_context;
     735            1 :     spdm_test_context->case_id = 0x3;
     736            1 :     spdm_context->connection_info.connection_state =
     737              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     738            1 :     spdm_context->connection_info.capability.flags = 0;
     739            1 :     spdm_context->connection_info.capability.flags |=
     740              :         (SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP
     741              :          | SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHUNK_CAP);
     742              : 
     743            1 :     spdm_context->local_context.capability.flags |=
     744              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHUNK_CAP;
     745              :     spdm_context->local_context.capability.data_transfer_size
     746            1 :         = CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
     747              : 
     748            1 :     libspdm_read_responder_public_certificate_chain(
     749              :         m_libspdm_use_hash_algo, m_libspdm_use_asym_algo,
     750              :         &data, &data_size, &hash, &hash_size);
     751            1 :     libspdm_reset_message_a(spdm_context);
     752            1 :     libspdm_reset_message_b(spdm_context);
     753            1 :     libspdm_reset_message_c(spdm_context);
     754            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     755              :         m_libspdm_use_hash_algo;
     756            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     757              :         m_libspdm_use_asym_algo;
     758              : 
     759            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     760              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     761              : 
     762              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     763              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = data_size;
     764              :     libspdm_copy_mem(
     765              :         spdm_context->connection_info.peer_used_cert_chain[0].buffer,
     766              :         sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
     767              :         data, data_size);
     768              :     #else
     769            1 :     libspdm_hash_all(
     770              :         spdm_context->connection_info.algorithm.base_hash_algo,
     771              :         data, data_size,
     772            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
     773            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
     774            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
     775            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
     776              :         spdm_context->connection_info.algorithm.base_hash_algo,
     777              :         spdm_context->connection_info.algorithm.base_asym_algo,
     778              :         data, data_size,
     779              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
     780              :     #endif
     781              : 
     782            1 :     libspdm_zero_mem(measurement_hash, sizeof(measurement_hash));
     783            1 :     status = libspdm_challenge(
     784              :         spdm_context, NULL, 0,
     785              :         SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH,
     786              :         measurement_hash, NULL);
     787            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     788            1 :     free(data);
     789              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     790              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = 0;
     791              :     #else
     792            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size = 0;
     793              :     #endif
     794            1 : }
     795              : #endif
     796              : #if LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT
     797            1 : void libspdm_test_requester_chunk_get_case4(void** state)
     798              : {
     799              :     /* Copied from Get Digests Test Case 2*/
     800              :     libspdm_return_t status;
     801              :     libspdm_test_context_t* spdm_test_context;
     802              :     libspdm_context_t* spdm_context;
     803              :     libspdm_data_parameter_t parameter;
     804              :     uint8_t slot_mask;
     805              :     uint8_t slot_id;
     806              :     uint8_t total_digest_buffer[LIBSPDM_MAX_HASH_SIZE * SPDM_MAX_SLOT_COUNT];
     807              :     uint8_t my_total_digest_buffer[LIBSPDM_MAX_HASH_SIZE * SPDM_MAX_SLOT_COUNT];
     808              :     uint8_t* digest;
     809              :     size_t data_return_size;
     810              : 
     811            1 :     spdm_test_context = *state;
     812            1 :     spdm_context = spdm_test_context->spdm_context;
     813            1 :     spdm_test_context->case_id = 0x4;
     814            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     815              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     816            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     817            1 :     spdm_context->connection_info.capability.flags |=
     818              :         (SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP
     819              :          | SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHUNK_CAP);
     820              : 
     821            1 :     spdm_context->local_context.capability.flags |=
     822              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHUNK_CAP;
     823              :     spdm_context->local_context.capability.data_transfer_size
     824            1 :         = CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
     825              : 
     826            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     827              : 
     828            1 :     libspdm_set_mem(
     829              :         m_libspdm_local_certificate_chain_test_case_4,
     830              :         sizeof(m_libspdm_local_certificate_chain_test_case_4),
     831              :         (uint8_t) (0xFF));
     832            1 :     libspdm_reset_message_b(spdm_context);
     833              : 
     834              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     835              :     spdm_context->transcript.message_m.buffer_size =
     836              :         spdm_context->transcript.message_m.max_buffer_size;
     837              :     #endif
     838            1 :     libspdm_zero_mem(total_digest_buffer, sizeof(total_digest_buffer));
     839            1 :     status = libspdm_get_digest(spdm_context, NULL, &slot_mask, &total_digest_buffer);
     840            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     841              : 
     842            1 :     assert_int_equal(slot_mask, 0xFF);
     843            1 :     libspdm_zero_mem(my_total_digest_buffer, sizeof(my_total_digest_buffer));
     844            1 :     digest = my_total_digest_buffer;
     845            9 :     for (slot_id = 0; slot_id < SPDM_MAX_SLOT_COUNT; slot_id++) {
     846            8 :         libspdm_hash_all(m_libspdm_use_hash_algo,
     847              :                          m_libspdm_local_certificate_chain_test_case_4,
     848              :                          sizeof(m_libspdm_local_certificate_chain_test_case_4), digest);
     849            8 :         digest += libspdm_get_hash_size(m_libspdm_use_hash_algo);
     850              :     }
     851            1 :     assert_memory_equal(total_digest_buffer, my_total_digest_buffer,
     852              :                         sizeof(my_total_digest_buffer));
     853              : 
     854            1 :     parameter.location = LIBSPDM_DATA_LOCATION_CONNECTION;
     855            1 :     data_return_size = sizeof(uint8_t);
     856            1 :     status = libspdm_get_data(spdm_context, LIBSPDM_DATA_PEER_SLOT_MASK,
     857              :                               &parameter, &slot_mask, &data_return_size);
     858            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     859            1 :     assert_int_equal(data_return_size, sizeof(uint8_t));
     860            1 :     assert_int_equal(slot_mask, 0xFF);
     861              : 
     862            1 :     data_return_size = sizeof(total_digest_buffer);
     863            1 :     status = libspdm_get_data(spdm_context, LIBSPDM_DATA_PEER_TOTAL_DIGEST_BUFFER,
     864              :                               &parameter, total_digest_buffer, &data_return_size);
     865            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     866            1 :     assert_int_equal(data_return_size, libspdm_get_hash_size(
     867              :                          m_libspdm_use_hash_algo) * SPDM_MAX_SLOT_COUNT);
     868            1 :     assert_memory_equal(total_digest_buffer, my_total_digest_buffer,
     869              :                         sizeof(my_total_digest_buffer));
     870              : 
     871              :     #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     872              :     assert_int_equal(
     873              :         spdm_context->transcript.message_b.buffer_size,
     874              :         sizeof(spdm_get_digest_request_t) +
     875              :         sizeof(spdm_digest_response_t) +
     876              :         libspdm_get_hash_size(spdm_context->connection_info
     877              :                               .algorithm.base_hash_algo) * SPDM_MAX_SLOT_COUNT);
     878              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
     879              :     #endif
     880            1 : }
     881              : #endif
     882              : 
     883              : #if LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES
     884            1 : static void libspdm_test_requester_chunk_get_case5(void **state)
     885              : {
     886              :     /* Copied from Vendor Request case 1*/
     887              :     libspdm_return_t status;
     888              :     libspdm_test_context_t *spdm_test_context;
     889              :     libspdm_context_t *spdm_context;
     890              : 
     891            1 :     uint16_t standard_id = 6;
     892            1 :     uint8_t vendor_id_len = 2;
     893            1 :     uint8_t vendor_id[SPDM_MAX_VENDOR_ID_LENGTH] = {0xAA, 0xAA};
     894            1 :     uint16_t data_len = 16;
     895              :     uint8_t data[16];
     896              : 
     897            1 :     spdm_test_context = *state;
     898            1 :     spdm_context = spdm_test_context->spdm_context;
     899            1 :     spdm_test_context->case_id = 0x5;
     900            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     901              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     902              :     /* Large response need a large scratch buffer. */
     903            1 :     spdm_context->connection_info.capability.max_spdm_msg_size =
     904              :         BUFFER_SIZE_FOR_CHUNK_SEQ_NO_WRAP_TEST;
     905            1 :     spdm_context->local_context.capability.max_spdm_msg_size =
     906              :         BUFFER_SIZE_FOR_CHUNK_SEQ_NO_WRAP_TEST;
     907            1 :     spdm_context->connection_info.connection_state =
     908              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     909            1 :     spdm_context->local_context.capability.data_transfer_size =
     910              :         CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
     911            1 :     spdm_context->connection_info.capability.data_transfer_size =
     912              :         CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
     913            1 :     spdm_context->local_context.capability.sender_data_transfer_size =
     914              :         CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE;
     915            1 :     spdm_context->local_context.is_requester = true;
     916              : 
     917            1 :     spdm_test_context->scratch_buffer_size =
     918            1 :         libspdm_get_sizeof_required_scratch_buffer(spdm_context);
     919            1 :     spdm_test_context->scratch_buffer = (void *)malloc(spdm_test_context->scratch_buffer_size);
     920            1 :     libspdm_set_scratch_buffer (spdm_context,
     921              :                                 spdm_test_context->scratch_buffer,
     922              :                                 spdm_test_context->scratch_buffer_size);
     923              : 
     924            1 :     libspdm_set_mem(data, sizeof(data), 0xAA);
     925              : 
     926            1 :     status = libspdm_vendor_send_request_receive_response(spdm_context, NULL,
     927              :                                                           standard_id, vendor_id_len, vendor_id,
     928              :                                                           data_len, data,
     929              :                                                           &standard_id, &vendor_id_len, vendor_id,
     930              :                                                           &data_len, data);
     931              : 
     932            1 :     assert_int_equal(status, LIBSPDM_STATUS_RECEIVE_FAIL);
     933            1 : }
     934              : 
     935            1 : static void libspdm_test_requester_chunk_get_case6(void **state)
     936              : {
     937              :     /* Copied from Chunk Get Request case 5*/
     938              :     libspdm_return_t status;
     939              :     libspdm_test_context_t *spdm_test_context;
     940              :     libspdm_context_t *spdm_context;
     941              : 
     942            1 :     uint16_t standard_id = 6;
     943            1 :     uint8_t vendor_id_len = 2;
     944            1 :     uint8_t vendor_id[SPDM_MAX_VENDOR_ID_LENGTH] = {0xAA, 0xAA};
     945            1 :     uint16_t data_len = 16;
     946              :     uint8_t data[16];
     947              : 
     948            1 :     spdm_test_context = *state;
     949            1 :     spdm_context = spdm_test_context->spdm_context;
     950            1 :     spdm_test_context->case_id = 0x6;
     951            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     952              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     953              :     /* Large response need a large scratch buffer. */
     954            1 :     spdm_context->connection_info.capability.max_spdm_msg_size =
     955              :         BUFFER_SIZE_FOR_CHUNK_SEQ_NO_WRAP_TEST;
     956            1 :     spdm_context->local_context.capability.max_spdm_msg_size =
     957              :         BUFFER_SIZE_FOR_CHUNK_SEQ_NO_WRAP_TEST;
     958            1 :     spdm_context->connection_info.connection_state =
     959              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     960              :     /* to pass the exam of max_chunk_data_transfer_size*/
     961            1 :     spdm_context->local_context.capability.data_transfer_size =
     962              :         CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE + 0x10;
     963            1 :     spdm_context->connection_info.capability.data_transfer_size =
     964              :         CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE + 0x10;
     965            1 :     spdm_context->local_context.capability.sender_data_transfer_size =
     966              :         CHUNK_GET_REQUESTER_UNIT_TEST_DATA_TRANSFER_SIZE + 0x10;
     967            1 :     spdm_context->local_context.is_requester = true;
     968              : 
     969            1 :     spdm_test_context->scratch_buffer_size =
     970            1 :         libspdm_get_sizeof_required_scratch_buffer(spdm_context);
     971            1 :     spdm_test_context->scratch_buffer = (void *)malloc(spdm_test_context->scratch_buffer_size);
     972            1 :     libspdm_set_scratch_buffer (spdm_context,
     973              :                                 spdm_test_context->scratch_buffer,
     974              :                                 spdm_test_context->scratch_buffer_size);
     975              : 
     976            1 :     libspdm_set_mem(data, sizeof(data), 0xAA);
     977              : 
     978            1 :     status = libspdm_vendor_send_request_receive_response(spdm_context, NULL,
     979              :                                                           standard_id, vendor_id_len, vendor_id,
     980              :                                                           data_len, data,
     981              :                                                           &standard_id, &vendor_id_len, vendor_id,
     982              :                                                           &data_len, data);
     983              : 
     984            1 :     assert_int_equal(status, LIBSPDM_STATUS_RECEIVE_FAIL);
     985            1 : }
     986              : 
     987              : #endif /* LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES */
     988              : 
     989            1 : int libspdm_requester_chunk_get_test_main(void)
     990              : {
     991              :     /* Test the CHUNK_GET handlers in various requester handlers */
     992            1 :     const struct CMUnitTest spdm_requester_chunk_get_tests[] = {
     993              : #if LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT
     994              :         /* Request a certificate in portions */
     995              :         cmocka_unit_test(libspdm_test_requester_chunk_get_case1),
     996              : #endif
     997              : #if LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP
     998              :         /* Request all measurements */
     999              :         cmocka_unit_test(libspdm_test_requester_chunk_get_case2),
    1000              : #endif
    1001              : #if LIBSPDM_ENABLE_CAPABILITY_CHAL_CAP
    1002              :         /* Request Challenge */
    1003              :         cmocka_unit_test(libspdm_test_requester_chunk_get_case3),
    1004              : #endif
    1005              : #if LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT
    1006              :         /* Request Digests */
    1007              :         cmocka_unit_test(libspdm_test_requester_chunk_get_case4),
    1008              : #endif
    1009              : #if LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES
    1010              :         /* Request Vendor Specific Response and chunk data size
    1011              :          * exceed max_chunk_data_transfer_size
    1012              :          */
    1013              :         cmocka_unit_test(libspdm_test_requester_chunk_get_case5),
    1014              :         /* Request Vendor Specific Response and chunk seq no wrapped */
    1015              :         cmocka_unit_test(libspdm_test_requester_chunk_get_case6),
    1016              : #endif
    1017              :     };
    1018              : 
    1019            1 :     libspdm_test_context_t test_context = {
    1020              :         LIBSPDM_TEST_CONTEXT_VERSION,
    1021              :         true,
    1022              :         libspdm_requester_chunk_get_test_send_message,
    1023              :         libspdm_requester_chunk_get_test_receive_message,
    1024              :     };
    1025              : 
    1026            1 :     libspdm_setup_test_context(&test_context);
    1027              : 
    1028            1 :     return cmocka_run_group_tests(spdm_requester_chunk_get_tests,
    1029              :                                   libspdm_unit_test_group_setup,
    1030              :                                   libspdm_unit_test_group_teardown);
    1031              : }
    1032              : 
    1033              : #endif /* LIBSPDM_ENABLE_CAPABILITY_CHUNK_CAP*/
        

Generated by: LCOV version 2.0-1