LCOV - code coverage report
Current view: top level - unit_test/test_spdm_responder - chunk_send_ack.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 949 949
Test Date: 2026-09-13 08:13:44 Functions: 100.0 % 26 26

            Line data    Source code
       1              : /**
       2              :  *  Copyright Notice:
       3              :  *  Copyright 2021-2026 DMTF. All rights reserved.
       4              :  *  License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
       5              :  **/
       6              : 
       7              : #include "spdm_unit_test.h"
       8              : #include "internal/libspdm_responder_lib.h"
       9              : 
      10              : #if LIBSPDM_ENABLE_CAPABILITY_CHUNK_CAP
      11              : 
      12              : #define CHUNK_SEND_ACK_RESPONDER_UNIT_TEST_DATA_TRANSFER_SIZE (42)
      13              : 
      14              : typedef struct {
      15              :     spdm_negotiate_algorithms_request_t spdm_request_version10;
      16              :     spdm_negotiate_algorithms_common_struct_table_t struct_table[4];
      17              : } libspdm_negotiate_algorithms_request_spdm_tables_t;
      18              : 
      19              : libspdm_negotiate_algorithms_request_spdm_tables_t
      20              :     m_libspdm_chunk_send_negotiate_algorithm_request1 = {
      21              :     {
      22              :         {
      23              :             SPDM_MESSAGE_VERSION_12,
      24              :             SPDM_NEGOTIATE_ALGORITHMS,
      25              :             4,
      26              :             0
      27              :         },
      28              :         sizeof(libspdm_negotiate_algorithms_request_spdm_tables_t),
      29              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF,
      30              :         SPDM_ALGORITHMS_OPAQUE_DATA_FORMAT_1,
      31              :     },
      32              :     {
      33              :         {
      34              :             SPDM_NEGOTIATE_ALGORITHMS_STRUCT_TABLE_ALG_TYPE_DHE,
      35              :             0x20,
      36              :             SPDM_ALGORITHMS_DHE_NAMED_GROUP_SECP_256_R1
      37              :         },
      38              :         {
      39              :             SPDM_NEGOTIATE_ALGORITHMS_STRUCT_TABLE_ALG_TYPE_AEAD,
      40              :             0x20,
      41              :             SPDM_ALGORITHMS_AEAD_CIPHER_SUITE_AES_256_GCM
      42              :         },
      43              :         {
      44              :             SPDM_NEGOTIATE_ALGORITHMS_STRUCT_TABLE_ALG_TYPE_REQ_BASE_ASYM_ALG,
      45              :             0x20,
      46              :             SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048
      47              :         },
      48              :         {
      49              :             SPDM_NEGOTIATE_ALGORITHMS_STRUCT_TABLE_ALG_TYPE_KEY_SCHEDULE,
      50              :             0x20,
      51              :             SPDM_ALGORITHMS_KEY_SCHEDULE_SPDM
      52              :         }
      53              :     }
      54              : };
      55              : 
      56              : size_t m_libspdm_chunk_send_negotiate_algorithm_request1_size =
      57              :     sizeof(m_libspdm_chunk_send_negotiate_algorithm_request1);
      58              : 
      59              : libspdm_negotiate_algorithms_request_spdm_tables_t
      60              :     m_libspdm_chunk_send_negotiate_algorithm_request22 = {
      61              :     {
      62              :         {
      63              :             SPDM_MESSAGE_VERSION_14,
      64              :             SPDM_NEGOTIATE_ALGORITHMS,
      65              :             4,
      66              :             0
      67              :         },
      68              :         sizeof(libspdm_negotiate_algorithms_request_spdm_tables_t),
      69              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF,
      70              :         SPDM_ALGORITHMS_OPAQUE_DATA_FORMAT_1,
      71              :     },
      72              :     {
      73              :         {
      74              :             SPDM_NEGOTIATE_ALGORITHMS_STRUCT_TABLE_ALG_TYPE_DHE,
      75              :             0x20,
      76              :             SPDM_ALGORITHMS_DHE_NAMED_GROUP_SECP_256_R1
      77              :         },
      78              :         {
      79              :             SPDM_NEGOTIATE_ALGORITHMS_STRUCT_TABLE_ALG_TYPE_AEAD,
      80              :             0x20,
      81              :             SPDM_ALGORITHMS_AEAD_CIPHER_SUITE_AES_256_GCM
      82              :         },
      83              :         {
      84              :             SPDM_NEGOTIATE_ALGORITHMS_STRUCT_TABLE_ALG_TYPE_REQ_BASE_ASYM_ALG,
      85              :             0x20,
      86              :             SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048
      87              :         },
      88              :         {
      89              :             SPDM_NEGOTIATE_ALGORITHMS_STRUCT_TABLE_ALG_TYPE_KEY_SCHEDULE,
      90              :             0x20,
      91              :             SPDM_ALGORITHMS_KEY_SCHEDULE_SPDM
      92              :         }
      93              :     }
      94              : };
      95              : 
      96           23 : void libspdm_test_responder_chunk_send_ack_setup_algo_state(libspdm_context_t* spdm_context)
      97              : {
      98              :     /* This state is copied form Algorithms test case 22 */
      99           23 :     m_libspdm_chunk_send_negotiate_algorithm_request1.spdm_request_version10.base_hash_algo =
     100              :         m_libspdm_use_hash_algo;
     101           23 :     m_libspdm_chunk_send_negotiate_algorithm_request1.spdm_request_version10.base_asym_algo =
     102              :         m_libspdm_use_asym_algo;
     103              : 
     104           23 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
     105           23 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AFTER_CAPABILITIES;
     106              : 
     107           23 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     108              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     109           23 :     spdm_context->local_context.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     110           23 :     spdm_context->local_context.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     111           23 :     spdm_context->local_context.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
     112           23 :     spdm_context->local_context.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
     113           23 :     spdm_context->local_context.algorithm.req_base_asym_alg = m_libspdm_use_req_asym_algo;
     114           23 :     spdm_context->local_context.algorithm.key_schedule = m_libspdm_use_key_schedule_algo;
     115           23 :     spdm_context->local_context.algorithm.other_params_support =
     116              :         SPDM_ALGORITHMS_OPAQUE_DATA_FORMAT_1;
     117              :     /* spdm_context->connection_info.algorithm.other_params_support = SPDM_ALGORITHMS_OPAQUE_DATA_FORMAT_1; */
     118           23 :     libspdm_reset_message_a(spdm_context);
     119           23 :     spdm_context->local_context.capability.flags = 0;
     120           23 :     spdm_context->connection_info.capability.flags = 0;
     121           23 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
     122           23 :     spdm_context->connection_info.capability.flags |=
     123              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
     124              : 
     125           23 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
     126           23 :     spdm_context->connection_info.capability.flags |=
     127              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
     128              : 
     129           23 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
     130           23 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
     131              : 
     132           23 :     spdm_context->local_context.capability.flags |=
     133              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MUT_AUTH_CAP;
     134           23 :     spdm_context->connection_info.capability.flags |=
     135              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MUT_AUTH_CAP;
     136              : 
     137           23 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
     138           23 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
     139              : 
     140           23 :     spdm_context->local_context.capability.data_transfer_size =
     141              :         CHUNK_SEND_ACK_RESPONDER_UNIT_TEST_DATA_TRANSFER_SIZE;
     142              : 
     143           23 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHUNK_CAP;
     144           23 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHUNK_CAP;
     145           23 : }
     146              : 
     147              : /* Test sending large NegAlg Request in multiple chunks. */
     148            1 : static void rsp_chunk_send_ack_case0(void** state)
     149              : {
     150              :     libspdm_return_t status;
     151              : 
     152              :     libspdm_test_context_t* spdm_test_context;
     153              :     libspdm_context_t* spdm_context;
     154              : 
     155              :     size_t request_size;
     156              :     size_t response_size;
     157              : 
     158              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
     159              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     160              : 
     161              :     spdm_chunk_send_request_t *chunk_send_request;
     162              :     spdm_chunk_send_ack_response_t* chunk_send_ack_response;
     163              :     spdm_algorithms_response_t *algorithms_response;
     164              :     size_t algorithms_response_size;
     165              : 
     166              :     const uint8_t* chunk_src;
     167              :     uint8_t* chunk_dst;
     168              :     uint16_t chunk_num;
     169              :     uint32_t bytes_sent;
     170              :     uint32_t bytes_total;
     171              : 
     172              :     void *scratch_buffer;
     173              :     size_t scratch_buffer_size;
     174              :     uint8_t *large_message;
     175              :     size_t large_message_capacity;
     176              :     size_t i;
     177              : 
     178            1 :     spdm_test_context = *state;
     179            1 :     spdm_context = spdm_test_context->spdm_context;
     180            1 :     spdm_test_context->case_id = 0;
     181              : 
     182            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
     183              : 
     184            1 :     chunk_num = 0;
     185            1 :     bytes_sent = 0;
     186            1 :     bytes_total = sizeof(m_libspdm_chunk_send_negotiate_algorithm_request1);
     187            1 :     chunk_src = (const uint8_t *)&m_libspdm_chunk_send_negotiate_algorithm_request1;
     188              : 
     189              :     do {
     190            2 :         libspdm_zero_mem(request, sizeof(request));
     191            2 :         chunk_send_request = (spdm_chunk_send_request_t*)request;
     192              : 
     193            2 :         chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     194            2 :         chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
     195            2 :         chunk_send_request->header.param1 = 0;
     196            2 :         chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
     197            2 :         chunk_send_request->chunk_seq_no = chunk_num;
     198              : 
     199            2 :         if (chunk_num == 0) {
     200            1 :             *((uint32_t*) (chunk_send_request + 1)) = bytes_total;
     201            1 :             chunk_send_request->chunk_size =
     202            1 :                 spdm_context->local_context.capability.data_transfer_size
     203            1 :                 - sizeof(spdm_chunk_send_request_t) - sizeof(uint32_t);
     204              : 
     205            1 :             chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
     206              : 
     207            1 :             request_size = sizeof(spdm_chunk_send_request_t)
     208              :                            + sizeof(uint32_t)
     209            1 :                            + chunk_send_request->chunk_size;
     210              :         } else {
     211            1 :             chunk_send_request->chunk_size =
     212            1 :                 LIBSPDM_MIN(
     213              :                     spdm_context->local_context.capability.data_transfer_size
     214              :                     - sizeof(spdm_chunk_send_request_t),
     215              :                     bytes_total - bytes_sent);
     216              : 
     217            1 :             chunk_dst = ((uint8_t*) (chunk_send_request + 1));
     218              : 
     219            1 :             request_size = sizeof(spdm_chunk_send_request_t)
     220            1 :                            + chunk_send_request->chunk_size;
     221              : 
     222            1 :             if (bytes_total - bytes_sent == chunk_send_request->chunk_size) {
     223            1 :                 chunk_send_request->header.param1 = SPDM_CHUNK_SEND_REQUEST_ATTRIBUTE_LAST_CHUNK;
     224              :             }
     225              :         }
     226              : 
     227            2 :         libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
     228            2 :                          chunk_src, chunk_send_request->chunk_size);
     229              : 
     230            2 :         chunk_src += chunk_send_request->chunk_size;
     231            2 :         bytes_sent += chunk_send_request->chunk_size;
     232            2 :         chunk_num++;
     233              : 
     234            2 :         response_size = sizeof(response);
     235            2 :         status = libspdm_get_response_chunk_send(
     236              :             spdm_context,
     237              :             request_size, request,
     238              :             &response_size, response);
     239              : 
     240            2 :         assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     241            2 :         assert_true(response_size >= sizeof(spdm_chunk_send_ack_response_t));
     242              : 
     243            2 :         chunk_send_ack_response = (spdm_chunk_send_ack_response_t*) response;
     244            2 :         assert_int_equal(chunk_send_ack_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
     245            2 :         assert_int_equal(chunk_send_ack_response->header.request_response_code,
     246              :                          SPDM_CHUNK_SEND_ACK);
     247            2 :         assert_int_equal(chunk_send_ack_response->header.param1, 0);
     248            2 :         assert_int_equal(chunk_send_ack_response->header.param2, spdm_test_context->case_id);
     249            2 :         assert_int_equal(chunk_send_ack_response->chunk_seq_no, chunk_send_request->chunk_seq_no);
     250              : 
     251            2 :     } while (bytes_sent < bytes_total);
     252              : 
     253            1 :     algorithms_response = (spdm_algorithms_response_t*) (chunk_send_ack_response + 1);
     254            1 :     algorithms_response_size = response_size - sizeof(spdm_chunk_send_ack_response_t);
     255            1 :     assert_int_equal(algorithms_response->header.request_response_code, SPDM_ALGORITHMS);
     256              : 
     257            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     258            1 :     assert_int_equal(algorithms_response_size,
     259              :                      sizeof(spdm_algorithms_response_t) + 4 *
     260              :                      sizeof(spdm_negotiate_algorithms_common_struct_table_t));
     261            1 :     assert_int_equal(algorithms_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
     262            1 :     assert_int_equal(algorithms_response->header.request_response_code, SPDM_ALGORITHMS);
     263            1 :     assert_int_equal(algorithms_response->header.param1, 4);
     264              : 
     265              :     /* Verify the completion cleanup fully reset large_message state and
     266              :      * scrubbed the scratch buffer, so the consumed large request does not linger. */
     267            1 :     assert_false(spdm_context->chunk_context.send.chunk_in_use);
     268            1 :     assert_null(spdm_context->chunk_context.send.large_message);
     269            1 :     assert_int_equal(spdm_context->chunk_context.send.large_message_size, 0);
     270            1 :     assert_int_equal(spdm_context->chunk_context.send.large_message_capacity, 0);
     271              : 
     272            1 :     libspdm_get_scratch_buffer(spdm_context, &scratch_buffer, &scratch_buffer_size);
     273            2 :     large_message = (uint8_t *)scratch_buffer +
     274            1 :                     libspdm_get_scratch_buffer_large_message_offset(spdm_context);
     275            1 :     large_message_capacity = libspdm_get_scratch_buffer_large_message_capacity(spdm_context);
     276         4609 :     for (i = 0; i < large_message_capacity; i++) {
     277         4608 :         assert_int_equal(large_message[i], 0);
     278              :     }
     279            1 : }
     280              : 
     281              : /**
     282              :  * Test 1: Responder receives a CHUNK_SEND request without chunk capabilities.
     283              :  * Expected Behavior: Returns ERROR response message with an error code.
     284              :  **/
     285            1 : static void rsp_chunk_send_ack_case1(void** state)
     286              : {
     287              :     libspdm_return_t status;
     288              : 
     289              :     libspdm_test_context_t* spdm_test_context;
     290              :     libspdm_context_t* spdm_context;
     291              : 
     292              :     size_t request_size;
     293              :     size_t response_size;
     294              : 
     295              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
     296              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     297              : 
     298              :     spdm_chunk_send_request_t* chunk_send_request;
     299              :     spdm_error_response_t* error_response;
     300              : 
     301              :     const uint8_t* chunk_src;
     302              :     uint8_t* chunk_dst;
     303              :     uint16_t chunk_num;
     304              :     uint32_t bytes_total;
     305              : 
     306            1 :     spdm_test_context = *state;
     307            1 :     spdm_context = spdm_test_context->spdm_context;
     308            1 :     spdm_test_context->case_id = 1;
     309              : 
     310            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
     311              : 
     312            1 :     spdm_context->local_context.capability.flags &= ~SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHUNK_CAP;
     313            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHUNK_CAP;
     314              : 
     315            1 :     chunk_num = 0;
     316            1 :     bytes_total = sizeof(m_libspdm_chunk_send_negotiate_algorithm_request1);
     317            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
     318              : 
     319            1 :     libspdm_zero_mem(request, sizeof(request));
     320            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
     321              : 
     322            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     323            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
     324            1 :     chunk_send_request->header.param1 = 0;
     325            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
     326            1 :     chunk_send_request->chunk_seq_no = chunk_num;
     327              : 
     328            1 :     *((uint32_t*) (chunk_send_request + 1)) = bytes_total;
     329            1 :     chunk_send_request->chunk_size =
     330            1 :         spdm_context->local_context.capability.data_transfer_size
     331            1 :         - sizeof(spdm_chunk_send_request_t) - sizeof(uint32_t);
     332              : 
     333            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
     334              : 
     335            1 :     request_size = sizeof(spdm_chunk_send_request_t)
     336              :                    + sizeof(uint32_t)
     337            1 :                    + chunk_send_request->chunk_size;
     338              : 
     339            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
     340            1 :                      chunk_src, chunk_send_request->chunk_size);
     341              : 
     342            1 :     response_size = sizeof(response);
     343            1 :     status = libspdm_get_response_chunk_send(
     344              :         spdm_context,
     345              :         request_size, request,
     346              :         &response_size, response);
     347              : 
     348            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     349            1 :     assert_true(response_size == sizeof(spdm_error_response_t));
     350              : 
     351            1 :     error_response = (spdm_error_response_t*) response;
     352            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
     353            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
     354            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_UNSUPPORTED_REQUEST);
     355            1 :     assert_int_equal(error_response->header.param2, SPDM_CHUNK_SEND);
     356            1 : }
     357              : 
     358              : /**
     359              :  * Test 2: Responder receives a CHUNK_SEND request with bad response state.
     360              :  * Expected Behavior: Returns ERROR response message
     361              :  * with request_response_code as error code.
     362              :  **/
     363            1 : static void rsp_chunk_send_ack_case2(void** state)
     364              : {
     365              :     libspdm_return_t status;
     366              : 
     367              :     libspdm_test_context_t* spdm_test_context;
     368              :     libspdm_context_t* spdm_context;
     369              : 
     370              :     size_t request_size;
     371              :     size_t response_size;
     372              : 
     373              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
     374              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     375              : 
     376              :     spdm_chunk_send_request_t* chunk_send_request;
     377              :     spdm_error_response_t* error_response;
     378              : 
     379              :     const uint8_t* chunk_src;
     380              :     uint8_t* chunk_dst;
     381              :     uint16_t chunk_num;
     382              :     uint32_t bytes_total;
     383              : 
     384            1 :     spdm_test_context = *state;
     385            1 :     spdm_context = spdm_test_context->spdm_context;
     386            1 :     spdm_test_context->case_id = 2;
     387              : 
     388            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
     389              : 
     390            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_BUSY;
     391              : 
     392            1 :     chunk_num = 0;
     393            1 :     bytes_total = sizeof(m_libspdm_chunk_send_negotiate_algorithm_request1);
     394            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
     395              : 
     396            1 :     libspdm_zero_mem(request, sizeof(request));
     397            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
     398              : 
     399            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     400            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
     401            1 :     chunk_send_request->header.param1 = 0;
     402            1 :     chunk_send_request->header.param2 = (uint8_t)spdm_test_context->case_id; /* chunk_handle */
     403            1 :     chunk_send_request->chunk_seq_no = chunk_num;
     404              : 
     405            1 :     *((uint32_t*) (chunk_send_request + 1)) = bytes_total;
     406            1 :     chunk_send_request->chunk_size =
     407            1 :         spdm_context->local_context.capability.data_transfer_size
     408            1 :         - sizeof(spdm_chunk_send_request_t) - sizeof(uint32_t);
     409              : 
     410            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
     411              : 
     412            1 :     request_size = sizeof(spdm_chunk_send_request_t)
     413              :                    + sizeof(uint32_t)
     414            1 :                    + chunk_send_request->chunk_size;
     415              : 
     416            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
     417            1 :                      chunk_src, chunk_send_request->chunk_size);
     418              : 
     419            1 :     response_size = sizeof(response);
     420            1 :     status = libspdm_get_response_chunk_send(
     421              :         spdm_context,
     422              :         request_size, request,
     423              :         &response_size, response);
     424              : 
     425            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     426            1 :     assert_true(response_size == sizeof(spdm_error_response_t));
     427              : 
     428            1 :     error_response = (spdm_error_response_t*) response;
     429            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
     430            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
     431            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_BUSY);
     432            1 :     assert_int_equal(error_response->header.param2, 0);
     433            1 : }
     434              : 
     435              : /**
     436              :  * Test 3: Responder receives a CHUNK_SEND request with bad connection state.
     437              :  * Expected Behavior: Returns ERROR response message
     438              :  * with SPDM_ERROR_CODE_UNEXPECTED_REQUEST error code.
     439              :  **/
     440            1 : static void rsp_chunk_send_ack_case3(void** state)
     441              : {
     442              :     libspdm_return_t status;
     443              : 
     444              :     libspdm_test_context_t* spdm_test_context;
     445              :     libspdm_context_t* spdm_context;
     446              : 
     447              :     size_t request_size;
     448              :     size_t response_size;
     449              : 
     450              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
     451              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     452              : 
     453              :     spdm_chunk_send_request_t* chunk_send_request;
     454              :     spdm_error_response_t* error_response;
     455              : 
     456              :     const uint8_t* chunk_src;
     457              :     uint8_t* chunk_dst;
     458              :     uint16_t chunk_num;
     459              :     uint32_t bytes_total;
     460              : 
     461            1 :     spdm_test_context = *state;
     462            1 :     spdm_context = spdm_test_context->spdm_context;
     463            1 :     spdm_test_context->case_id = 3;
     464              : 
     465            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
     466              : 
     467              :     spdm_context->connection_info.connection_state
     468            1 :         = LIBSPDM_CONNECTION_STATE_AFTER_CAPABILITIES - 1;
     469              : 
     470            1 :     chunk_num = 0;
     471            1 :     bytes_total = sizeof(m_libspdm_chunk_send_negotiate_algorithm_request1);
     472            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
     473              : 
     474            1 :     libspdm_zero_mem(request, sizeof(request));
     475            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
     476              : 
     477            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     478            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
     479            1 :     chunk_send_request->header.param1 = 0;
     480            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
     481            1 :     chunk_send_request->chunk_seq_no = chunk_num;
     482              : 
     483            1 :     *((uint32_t*) (chunk_send_request + 1)) = bytes_total;
     484            1 :     chunk_send_request->chunk_size =
     485            1 :         spdm_context->local_context.capability.data_transfer_size
     486            1 :         - sizeof(spdm_chunk_send_request_t) - sizeof(uint32_t);
     487              : 
     488            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
     489              : 
     490            1 :     request_size = sizeof(spdm_chunk_send_request_t)
     491              :                    + sizeof(uint32_t)
     492            1 :                    + chunk_send_request->chunk_size;
     493              : 
     494            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
     495            1 :                      chunk_src, chunk_send_request->chunk_size);
     496              : 
     497            1 :     response_size = sizeof(response);
     498            1 :     status = libspdm_get_response_chunk_send(
     499              :         spdm_context,
     500              :         request_size, request,
     501              :         &response_size, response);
     502              : 
     503            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     504            1 :     assert_true(response_size == sizeof(spdm_error_response_t));
     505              : 
     506            1 :     error_response = (spdm_error_response_t*) response;
     507            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
     508            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
     509            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_UNEXPECTED_REQUEST);
     510            1 :     assert_int_equal(error_response->header.param2, 0);
     511            1 : }
     512              : 
     513              : 
     514              : /**
     515              :  * Test 4: Responder receives a CHUNK_SEND request with bad size.
     516              :  * Expected Behavior: Returns ERROR response message
     517              :  * with SPDM_ERROR_CODE_INVALID_REQUEST error code.
     518              :  **/
     519            1 : static void rsp_chunk_send_ack_case4(void** state)
     520              : {
     521              :     libspdm_return_t status;
     522              : 
     523              :     libspdm_test_context_t* spdm_test_context;
     524              :     libspdm_context_t* spdm_context;
     525              : 
     526              :     size_t request_size;
     527              :     size_t response_size;
     528              : 
     529              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
     530              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     531              : 
     532              :     spdm_chunk_send_request_t* chunk_send_request;
     533              :     spdm_error_response_t* error_response;
     534              : 
     535              :     const uint8_t* chunk_src;
     536              :     uint8_t* chunk_dst;
     537              :     uint16_t chunk_num;
     538              :     uint32_t bytes_total;
     539              : 
     540            1 :     spdm_test_context = *state;
     541            1 :     spdm_context = spdm_test_context->spdm_context;
     542            1 :     spdm_test_context->case_id = 4;
     543              : 
     544            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
     545              : 
     546            1 :     chunk_num = 0;
     547            1 :     bytes_total = sizeof(m_libspdm_chunk_send_negotiate_algorithm_request1);
     548            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
     549              : 
     550            1 :     libspdm_zero_mem(request, sizeof(request));
     551            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
     552              : 
     553            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     554            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
     555            1 :     chunk_send_request->header.param1 = 0;
     556            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
     557            1 :     chunk_send_request->chunk_seq_no = chunk_num;
     558              : 
     559            1 :     *((uint32_t*) (chunk_send_request + 1)) = bytes_total;
     560            1 :     chunk_send_request->chunk_size =
     561            1 :         spdm_context->local_context.capability.data_transfer_size
     562            1 :         - sizeof(spdm_chunk_send_request_t) - sizeof(uint32_t);
     563              : 
     564            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
     565              : 
     566            1 :     request_size = sizeof(spdm_chunk_send_request_t)
     567              :                    + sizeof(uint32_t)
     568            1 :                    + chunk_send_request->chunk_size;
     569              : 
     570            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
     571            1 :                      chunk_src, chunk_send_request->chunk_size);
     572              : 
     573            1 :     response_size = sizeof(response);
     574            1 :     request_size = sizeof(spdm_chunk_send_request_t) - 1;
     575            1 :     status = libspdm_get_response_chunk_send(
     576              :         spdm_context,
     577              :         request_size, request,
     578              :         &response_size, response);
     579              : 
     580            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     581            1 :     assert_true(response_size == sizeof(spdm_error_response_t));
     582              : 
     583            1 :     error_response = (spdm_error_response_t*) response;
     584            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
     585            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
     586            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
     587            1 :     assert_int_equal(error_response->header.param2, 0);
     588            1 : }
     589              : /**
     590              :  * Test 5: Responder receives a CHUNK_SEND request SPDM version less than 1.2.
     591              :  * Expected Behavior: Returns ERROR response message
     592              :  * with SPDM_ERROR_CODE_UNSUPPORTED_REQUEST error code.
     593              :  **/
     594            1 : static void rsp_chunk_send_ack_case5(void** state)
     595              : {
     596              :     libspdm_return_t status;
     597              : 
     598              :     libspdm_test_context_t* spdm_test_context;
     599              :     libspdm_context_t* spdm_context;
     600              : 
     601              :     size_t request_size;
     602              :     size_t response_size;
     603              : 
     604              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
     605              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     606              : 
     607              :     spdm_chunk_send_request_t* chunk_send_request;
     608              :     spdm_error_response_t* error_response;
     609              : 
     610              :     const uint8_t* chunk_src;
     611              :     uint8_t* chunk_dst;
     612              :     uint16_t chunk_num;
     613              :     uint32_t bytes_total;
     614              : 
     615            1 :     spdm_test_context = *state;
     616            1 :     spdm_context = spdm_test_context->spdm_context;
     617            1 :     spdm_test_context->case_id = 5;
     618              : 
     619            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
     620              : 
     621            1 :     chunk_num = 0;
     622            1 :     bytes_total = sizeof(m_libspdm_chunk_send_negotiate_algorithm_request1);
     623            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
     624              : 
     625            1 :     libspdm_zero_mem(request, sizeof(request));
     626            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
     627              : 
     628            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     629            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
     630            1 :     chunk_send_request->header.param1 = 0;
     631            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
     632            1 :     chunk_send_request->chunk_seq_no = chunk_num;
     633              : 
     634            1 :     *((uint32_t*) (chunk_send_request + 1)) = bytes_total;
     635            1 :     chunk_send_request->chunk_size =
     636            1 :         spdm_context->local_context.capability.data_transfer_size
     637            1 :         - sizeof(spdm_chunk_send_request_t) - sizeof(uint32_t);
     638              : 
     639            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
     640              : 
     641            1 :     request_size = sizeof(spdm_chunk_send_request_t)
     642              :                    + sizeof(uint32_t)
     643            1 :                    + chunk_send_request->chunk_size;
     644              : 
     645            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
     646            1 :                      chunk_src, chunk_send_request->chunk_size);
     647              : 
     648            1 :     response_size = sizeof(response);
     649            1 :     status = libspdm_get_response_chunk_send(
     650              :         spdm_context,
     651              :         request_size, request,
     652              :         &response_size, response);
     653              : 
     654            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     655            1 :     assert_true(response_size == sizeof(spdm_error_response_t));
     656              : 
     657            1 :     error_response = (spdm_error_response_t*) response;
     658            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
     659            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
     660            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_UNSUPPORTED_REQUEST);
     661            1 :     assert_int_equal(error_response->header.param2, SPDM_CHUNK_SEND);
     662            1 : }
     663              : /**
     664              :  * Test 6: Responder receives a CHUNK_SEND request with wrong SPDM version.
     665              :  * Expected Behavior: Returns ERROR response message
     666              :  * with SPDM_ERROR_CODE_VERSION_MISMATCH error code.
     667              :  **/
     668            1 : static void rsp_chunk_send_ack_case6(void** state)
     669              : {
     670              :     libspdm_return_t status;
     671              : 
     672              :     libspdm_test_context_t* spdm_test_context;
     673              :     libspdm_context_t* spdm_context;
     674              : 
     675              :     size_t request_size;
     676              :     size_t response_size;
     677              : 
     678              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
     679              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     680              : 
     681              :     spdm_chunk_send_request_t* chunk_send_request;
     682              :     spdm_error_response_t* error_response;
     683              : 
     684              :     const uint8_t* chunk_src;
     685              :     uint8_t* chunk_dst;
     686              :     uint16_t chunk_num;
     687              :     uint32_t bytes_total;
     688              : 
     689            1 :     spdm_test_context = *state;
     690            1 :     spdm_context = spdm_test_context->spdm_context;
     691            1 :     spdm_test_context->case_id = 6;
     692              : 
     693            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
     694              : 
     695            1 :     chunk_num = 0;
     696            1 :     bytes_total = sizeof(m_libspdm_chunk_send_negotiate_algorithm_request1);
     697            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
     698              : 
     699            1 :     libspdm_zero_mem(request, sizeof(request));
     700            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
     701              : 
     702            1 :     chunk_send_request->header.spdm_version = 0x13;
     703            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
     704            1 :     chunk_send_request->header.param1 = 0;
     705            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
     706            1 :     chunk_send_request->chunk_seq_no = chunk_num;
     707              : 
     708            1 :     *((uint32_t*) (chunk_send_request + 1)) = bytes_total;
     709            1 :     chunk_send_request->chunk_size =
     710            1 :         spdm_context->local_context.capability.data_transfer_size
     711            1 :         - sizeof(spdm_chunk_send_request_t) - sizeof(uint32_t);
     712              : 
     713            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
     714              : 
     715            1 :     request_size = sizeof(spdm_chunk_send_request_t)
     716              :                    + sizeof(uint32_t)
     717            1 :                    + chunk_send_request->chunk_size;
     718              : 
     719            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
     720            1 :                      chunk_src, chunk_send_request->chunk_size);
     721              : 
     722            1 :     response_size = sizeof(response);
     723            1 :     status = libspdm_get_response_chunk_send(
     724              :         spdm_context,
     725              :         request_size, request,
     726              :         &response_size, response);
     727              : 
     728            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     729            1 :     assert_true(response_size == sizeof(spdm_error_response_t));
     730              : 
     731            1 :     error_response = (spdm_error_response_t*) response;
     732            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
     733            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
     734            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_VERSION_MISMATCH);
     735            1 :     assert_int_equal(error_response->header.param2, 0);
     736            1 : }
     737              : 
     738              : /**
     739              :  * Test 7: Responder gets chunk send when chunk get already in use.
     740              :  **/
     741            1 : static void rsp_chunk_send_ack_case7(void** state)
     742              : {
     743              :     libspdm_return_t status;
     744              : 
     745              :     libspdm_test_context_t* spdm_test_context;
     746              :     libspdm_context_t* spdm_context;
     747              : 
     748              :     size_t request_size;
     749              :     size_t response_size;
     750              : 
     751              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
     752              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     753              : 
     754              :     spdm_chunk_send_request_t* chunk_send_request;
     755              :     spdm_error_response_t* error_response;
     756              : 
     757              :     const uint8_t* chunk_src;
     758              :     uint8_t* chunk_dst;
     759              :     uint16_t chunk_num;
     760              :     uint32_t bytes_total;
     761              : 
     762            1 :     spdm_test_context = *state;
     763            1 :     spdm_context = spdm_test_context->spdm_context;
     764            1 :     spdm_test_context->case_id = 7;
     765              : 
     766            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
     767            1 :     spdm_context->chunk_context.get.chunk_in_use = true;
     768              : 
     769            1 :     chunk_num = 0;
     770            1 :     bytes_total = sizeof(m_libspdm_chunk_send_negotiate_algorithm_request1);
     771            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
     772              : 
     773            1 :     libspdm_zero_mem(request, sizeof(request));
     774            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
     775              : 
     776            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     777            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
     778            1 :     chunk_send_request->header.param1 = 0;
     779            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
     780            1 :     chunk_send_request->chunk_seq_no = chunk_num;
     781              : 
     782            1 :     *((uint32_t*) (chunk_send_request + 1)) = bytes_total;
     783            1 :     chunk_send_request->chunk_size =
     784            1 :         spdm_context->local_context.capability.data_transfer_size
     785            1 :         - sizeof(spdm_chunk_send_request_t) - sizeof(uint32_t);
     786              : 
     787            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
     788              : 
     789            1 :     request_size = sizeof(spdm_chunk_send_request_t)
     790              :                    + sizeof(uint32_t)
     791            1 :                    + chunk_send_request->chunk_size;
     792              : 
     793            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
     794            1 :                      chunk_src, chunk_send_request->chunk_size);
     795              : 
     796            1 :     response_size = sizeof(response);
     797            1 :     status = libspdm_get_response_chunk_send(
     798              :         spdm_context,
     799              :         request_size, request,
     800              :         &response_size, response);
     801              : 
     802            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     803            1 :     assert_true(response_size == sizeof(spdm_error_response_t));
     804              : 
     805            1 :     error_response = (spdm_error_response_t*) response;
     806            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
     807            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
     808            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_UNEXPECTED_REQUEST);
     809            1 :     assert_int_equal(error_response->header.param2, 0);
     810              : 
     811            1 :     spdm_context->chunk_context.get.chunk_in_use = false;
     812            1 : }
     813              : 
     814              : /**
     815              :  * Test 8: First request has bad sequence number.
     816              :  **/
     817            1 : static void rsp_chunk_send_ack_case8(void** state)
     818              : {
     819              :     libspdm_return_t status;
     820              : 
     821              :     libspdm_test_context_t* spdm_test_context;
     822              :     libspdm_context_t* spdm_context;
     823              : 
     824              :     size_t request_size;
     825              :     size_t response_size;
     826              : 
     827              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
     828              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     829              : 
     830              :     spdm_chunk_send_request_t *chunk_send_request;
     831              :     spdm_chunk_send_ack_response_t *chunk_send_ack_response;
     832              :     spdm_error_response_t *error_response;
     833              : 
     834              :     const uint8_t *chunk_src;
     835              :     uint8_t *chunk_dst;
     836              :     uint32_t bytes_total;
     837              : 
     838            1 :     spdm_test_context = *state;
     839            1 :     spdm_context = spdm_test_context->spdm_context;
     840            1 :     spdm_test_context->case_id = 8;
     841              : 
     842            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
     843              : 
     844            1 :     bytes_total = sizeof(m_libspdm_chunk_send_negotiate_algorithm_request1);
     845            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
     846              : 
     847            1 :     libspdm_zero_mem(request, sizeof(request));
     848            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
     849              : 
     850            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     851            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
     852            1 :     chunk_send_request->header.param1 = 0;
     853            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
     854            1 :     chunk_send_request->chunk_seq_no = 1; /* Bad seq num */
     855              : 
     856            1 :     *((uint32_t*) (chunk_send_request + 1)) = bytes_total;
     857            1 :     chunk_send_request->chunk_size =
     858            1 :         spdm_context->local_context.capability.data_transfer_size
     859            1 :         - sizeof(spdm_chunk_send_request_t) - sizeof(uint32_t);
     860              : 
     861            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
     862              : 
     863            1 :     request_size = sizeof(spdm_chunk_send_request_t)
     864              :                    + sizeof(uint32_t)
     865            1 :                    + chunk_send_request->chunk_size;
     866              : 
     867            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
     868            1 :                      chunk_src, chunk_send_request->chunk_size);
     869              : 
     870            1 :     response_size = sizeof(response);
     871            1 :     status = libspdm_get_response_chunk_send(
     872              :         spdm_context,
     873              :         request_size, request,
     874              :         &response_size, response);
     875              : 
     876            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     877            1 :     assert_true(response_size == sizeof(spdm_chunk_send_ack_response_t)
     878              :                 + sizeof(spdm_error_response_t));
     879              : 
     880            1 :     chunk_send_ack_response = (spdm_chunk_send_ack_response_t*) response;
     881            1 :     assert_int_equal(chunk_send_ack_response->header.param1,
     882              :                      SPDM_CHUNK_SEND_ACK_RESPONSE_ATTRIBUTE_EARLY_ERROR_DETECTED);
     883              : 
     884            1 :     error_response = (spdm_error_response_t*) (chunk_send_ack_response + 1);
     885            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
     886            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
     887            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
     888            1 :     assert_int_equal(error_response->header.param2, 0);
     889            1 : }
     890              : 
     891              : /**
     892              :  * Test 9: First request has chunk size too large.
     893              :  **/
     894            1 : static void rsp_chunk_send_ack_case9(void** state)
     895              : {
     896              :     libspdm_return_t status;
     897              : 
     898              :     libspdm_test_context_t* spdm_test_context;
     899              :     libspdm_context_t* spdm_context;
     900              : 
     901              :     size_t request_size;
     902              :     size_t response_size;
     903              : 
     904              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
     905              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     906              : 
     907              :     spdm_chunk_send_request_t* chunk_send_request;
     908              :     spdm_chunk_send_ack_response_t* chunk_send_ack_response;
     909              :     spdm_error_response_t* error_response;
     910              : 
     911              :     const uint8_t* chunk_src;
     912              :     uint8_t* chunk_dst;
     913              :     uint32_t bytes_total;
     914              : 
     915            1 :     spdm_test_context = *state;
     916            1 :     spdm_context = spdm_test_context->spdm_context;
     917            1 :     spdm_test_context->case_id = 9;
     918              : 
     919            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
     920              : 
     921            1 :     bytes_total = sizeof(m_libspdm_chunk_send_negotiate_algorithm_request1);
     922            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
     923              : 
     924            1 :     libspdm_zero_mem(request, sizeof(request));
     925            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
     926              : 
     927            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     928            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
     929            1 :     chunk_send_request->header.param1 = 0;
     930            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
     931            1 :     chunk_send_request->chunk_seq_no = 0;
     932              : 
     933            1 :     *((uint32_t*) (chunk_send_request + 1)) = bytes_total;
     934            1 :     chunk_send_request->chunk_size =
     935            1 :         spdm_context->local_context.capability.data_transfer_size
     936            1 :         - sizeof(spdm_chunk_send_request_t) - sizeof(uint32_t);
     937              : 
     938            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
     939              : 
     940            1 :     request_size = sizeof(spdm_chunk_send_request_t)
     941              :                    + sizeof(uint32_t)
     942            1 :                    + chunk_send_request->chunk_size;
     943              : 
     944            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
     945            1 :                      chunk_src, chunk_send_request->chunk_size);
     946              : 
     947            1 :     chunk_send_request->chunk_size += 1; /* chunk size too large */
     948              : 
     949            1 :     response_size = sizeof(response);
     950            1 :     status = libspdm_get_response_chunk_send(
     951              :         spdm_context,
     952              :         request_size, request,
     953              :         &response_size, response);
     954              : 
     955            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     956            1 :     assert_true(response_size == sizeof(spdm_chunk_send_ack_response_t)
     957              :                 + sizeof(spdm_error_response_t));
     958              : 
     959            1 :     chunk_send_ack_response = (spdm_chunk_send_ack_response_t*) response;
     960            1 :     assert_int_equal(chunk_send_ack_response->header.param1,
     961              :                      SPDM_CHUNK_SEND_ACK_RESPONSE_ATTRIBUTE_EARLY_ERROR_DETECTED);
     962              : 
     963            1 :     error_response = (spdm_error_response_t*) (chunk_send_ack_response + 1);
     964            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
     965            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
     966            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
     967            1 :     assert_int_equal(error_response->header.param2, 0);
     968            1 : }
     969              : 
     970              : /**
     971              :  * Test 10: First request has size larger than data transfer size.
     972              :  **/
     973            1 : static void rsp_chunk_send_ack_case10(void** state)
     974              : {
     975              :     libspdm_return_t status;
     976              : 
     977              :     libspdm_test_context_t* spdm_test_context;
     978              :     libspdm_context_t* spdm_context;
     979              : 
     980              :     size_t request_size;
     981              :     size_t response_size;
     982              : 
     983              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
     984              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     985              : 
     986              :     spdm_chunk_send_request_t* chunk_send_request;
     987              :     spdm_chunk_send_ack_response_t* chunk_send_ack_response;
     988              :     spdm_error_response_t* error_response;
     989              : 
     990              :     const uint8_t* chunk_src;
     991              :     uint8_t* chunk_dst;
     992              :     uint32_t bytes_total;
     993              : 
     994            1 :     spdm_test_context = *state;
     995            1 :     spdm_context = spdm_test_context->spdm_context;
     996            1 :     spdm_test_context->case_id = 10;
     997              : 
     998            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
     999              : 
    1000            1 :     bytes_total = sizeof(m_libspdm_chunk_send_negotiate_algorithm_request1);
    1001            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
    1002              : 
    1003            1 :     libspdm_zero_mem(request, sizeof(request));
    1004            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
    1005              : 
    1006            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1007            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
    1008            1 :     chunk_send_request->header.param1 = 0;
    1009            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
    1010            1 :     chunk_send_request->chunk_seq_no = 0;
    1011              : 
    1012            1 :     *((uint32_t*) (chunk_send_request + 1)) = bytes_total;
    1013            1 :     chunk_send_request->chunk_size =
    1014            1 :         spdm_context->local_context.capability.data_transfer_size
    1015            1 :         - sizeof(spdm_chunk_send_request_t) - sizeof(uint32_t);
    1016              : 
    1017            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
    1018              : 
    1019            1 :     request_size = sizeof(spdm_chunk_send_request_t)
    1020              :                    + sizeof(uint32_t)
    1021            1 :                    + chunk_send_request->chunk_size
    1022              :                    + 1; /* Request size too large */
    1023              : 
    1024            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
    1025            1 :                      chunk_src, chunk_send_request->chunk_size);
    1026              : 
    1027            1 :     response_size = sizeof(response);
    1028            1 :     status = libspdm_get_response_chunk_send(
    1029              :         spdm_context,
    1030              :         request_size, request,
    1031              :         &response_size, response);
    1032              : 
    1033            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1034            1 :     assert_true(response_size == sizeof(spdm_chunk_send_ack_response_t)
    1035              :                 + sizeof(spdm_error_response_t));
    1036              : 
    1037            1 :     chunk_send_ack_response = (spdm_chunk_send_ack_response_t*) response;
    1038            1 :     assert_int_equal(chunk_send_ack_response->header.param1,
    1039              :                      SPDM_CHUNK_SEND_ACK_RESPONSE_ATTRIBUTE_EARLY_ERROR_DETECTED);
    1040              : 
    1041            1 :     error_response = (spdm_error_response_t*) (chunk_send_ack_response + 1);
    1042            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
    1043            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
    1044            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1045            1 :     assert_int_equal(error_response->header.param2, 0);
    1046            1 : }
    1047              : 
    1048              : /**
    1049              :  * Test 11: First request has LAST CHUNK bit set.
    1050              :  **/
    1051            1 : static void rsp_chunk_send_ack_case11(void** state)
    1052              : {
    1053              :     libspdm_return_t status;
    1054              : 
    1055              :     libspdm_test_context_t* spdm_test_context;
    1056              :     libspdm_context_t* spdm_context;
    1057              : 
    1058              :     size_t request_size;
    1059              :     size_t response_size;
    1060              : 
    1061              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1062              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1063              : 
    1064              :     spdm_chunk_send_request_t* chunk_send_request;
    1065              :     spdm_chunk_send_ack_response_t* chunk_send_ack_response;
    1066              :     spdm_error_response_t* error_response;
    1067              : 
    1068              :     const uint8_t* chunk_src;
    1069              :     uint8_t* chunk_dst;
    1070              : 
    1071            1 :     spdm_test_context = *state;
    1072            1 :     spdm_context = spdm_test_context->spdm_context;
    1073            1 :     spdm_test_context->case_id = 11;
    1074              : 
    1075            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
    1076              : 
    1077            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
    1078              : 
    1079            1 :     libspdm_zero_mem(request, sizeof(request));
    1080            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
    1081              : 
    1082            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1083            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
    1084            1 :     chunk_send_request->header.param1 = 0;
    1085            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
    1086            1 :     chunk_send_request->chunk_seq_no = 0;
    1087              : 
    1088            1 :     *((uint32_t*) (chunk_send_request + 1)) = LIBSPDM_MAX_SPDM_MSG_SIZE + 1;
    1089              : 
    1090            1 :     chunk_send_request->chunk_size =
    1091            1 :         spdm_context->local_context.capability.data_transfer_size
    1092            1 :         - sizeof(spdm_chunk_send_request_t) - sizeof(uint32_t);
    1093              : 
    1094            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
    1095              : 
    1096            1 :     request_size = sizeof(spdm_chunk_send_request_t)
    1097              :                    + sizeof(uint32_t)
    1098            1 :                    + chunk_send_request->chunk_size;
    1099              : 
    1100            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
    1101            1 :                      chunk_src, chunk_send_request->chunk_size);
    1102              : 
    1103            1 :     response_size = sizeof(response);
    1104            1 :     status = libspdm_get_response_chunk_send(
    1105              :         spdm_context,
    1106              :         request_size, request,
    1107              :         &response_size, response);
    1108              : 
    1109            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1110            1 :     assert_true(response_size == sizeof(spdm_chunk_send_ack_response_t)
    1111              :                 + sizeof(spdm_error_response_t));
    1112              : 
    1113            1 :     chunk_send_ack_response = (spdm_chunk_send_ack_response_t*) response;
    1114            1 :     assert_int_equal(chunk_send_ack_response->header.param1,
    1115              :                      SPDM_CHUNK_SEND_ACK_RESPONSE_ATTRIBUTE_EARLY_ERROR_DETECTED);
    1116              : 
    1117            1 :     error_response = (spdm_error_response_t*) (chunk_send_ack_response + 1);
    1118            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
    1119            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
    1120            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1121            1 :     assert_int_equal(error_response->header.param2, 0);
    1122            1 : }
    1123              : 
    1124              : /**
    1125              :  * Test 12: First request has LAST CHUNK bit set.
    1126              :  **/
    1127            1 : static void rsp_chunk_send_ack_case12(void** state)
    1128              : {
    1129              :     libspdm_return_t status;
    1130              : 
    1131              :     libspdm_test_context_t* spdm_test_context;
    1132              :     libspdm_context_t* spdm_context;
    1133              : 
    1134              :     size_t request_size;
    1135              :     size_t response_size;
    1136              : 
    1137              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1138              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1139              : 
    1140              :     spdm_chunk_send_request_t* chunk_send_request;
    1141              :     spdm_chunk_send_ack_response_t* chunk_send_ack_response;
    1142              :     spdm_error_response_t* error_response;
    1143              : 
    1144              :     const uint8_t* chunk_src;
    1145              :     uint8_t* chunk_dst;
    1146              :     uint32_t bytes_total;
    1147              : 
    1148            1 :     spdm_test_context = *state;
    1149            1 :     spdm_context = spdm_test_context->spdm_context;
    1150            1 :     spdm_test_context->case_id = 12;
    1151              : 
    1152            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
    1153              : 
    1154            1 :     bytes_total = sizeof(m_libspdm_chunk_send_negotiate_algorithm_request1);
    1155            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
    1156              : 
    1157            1 :     libspdm_zero_mem(request, sizeof(request));
    1158            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
    1159              : 
    1160            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1161            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
    1162            1 :     chunk_send_request->header.param1 = SPDM_CHUNK_SEND_REQUEST_ATTRIBUTE_LAST_CHUNK;
    1163            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
    1164            1 :     chunk_send_request->chunk_seq_no = 0;
    1165              : 
    1166            1 :     *((uint32_t*) (chunk_send_request + 1)) = bytes_total;
    1167              : 
    1168            1 :     chunk_send_request->chunk_size =
    1169            1 :         spdm_context->local_context.capability.data_transfer_size
    1170            1 :         - sizeof(spdm_chunk_send_request_t) - sizeof(uint32_t);
    1171              : 
    1172            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
    1173              : 
    1174            1 :     request_size = sizeof(spdm_chunk_send_request_t)
    1175              :                    + sizeof(uint32_t)
    1176            1 :                    + chunk_send_request->chunk_size;
    1177              : 
    1178            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
    1179            1 :                      chunk_src, chunk_send_request->chunk_size);
    1180              : 
    1181            1 :     response_size = sizeof(response);
    1182            1 :     status = libspdm_get_response_chunk_send(
    1183              :         spdm_context,
    1184              :         request_size, request,
    1185              :         &response_size, response);
    1186              : 
    1187            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1188            1 :     assert_true(response_size == sizeof(spdm_chunk_send_ack_response_t)
    1189              :                 + sizeof(spdm_error_response_t));
    1190              : 
    1191            1 :     chunk_send_ack_response = (spdm_chunk_send_ack_response_t*) response;
    1192            1 :     assert_int_equal(chunk_send_ack_response->header.param1,
    1193              :                      SPDM_CHUNK_SEND_ACK_RESPONSE_ATTRIBUTE_EARLY_ERROR_DETECTED);
    1194              : 
    1195            1 :     error_response = (spdm_error_response_t*) (chunk_send_ack_response + 1);
    1196            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
    1197            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
    1198            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1199            1 :     assert_int_equal(error_response->header.param2, 0);
    1200            1 : }
    1201              : 
    1202            9 : void libspdm_test_responder_chunk_send_ack_reset_send_state(libspdm_context_t* spdm_context)
    1203              : {
    1204              :     libspdm_chunk_info_t* send_info;
    1205              : 
    1206            9 :     send_info = &spdm_context->chunk_context.send;
    1207            9 :     send_info->chunk_in_use = false;
    1208            9 :     send_info->chunk_handle = 0;
    1209            9 :     send_info->chunk_seq_no = 0;
    1210            9 :     send_info->chunk_bytes_transferred = 0;
    1211            9 :     send_info->large_message = NULL;
    1212            9 :     send_info->large_message_size = 0;
    1213            9 :     send_info->large_message_capacity = 0;
    1214            9 : }
    1215              : 
    1216              : /**
    1217              :  * Test 13: Request has bad sequence number.
    1218              :  **/
    1219            1 : static void rsp_chunk_send_ack_case13(void** state)
    1220              : {
    1221              :     libspdm_return_t status;
    1222              : 
    1223              :     libspdm_test_context_t* spdm_test_context;
    1224              :     libspdm_context_t* spdm_context;
    1225              : 
    1226              :     size_t request_size;
    1227              :     size_t response_size;
    1228              : 
    1229              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1230              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1231              : 
    1232              :     spdm_chunk_send_request_t* chunk_send_request;
    1233              :     spdm_chunk_send_ack_response_t* chunk_send_ack_response;
    1234              :     spdm_error_response_t* error_response;
    1235              : 
    1236              :     const uint8_t* chunk_src;
    1237              :     uint8_t* chunk_dst;
    1238              : 
    1239              :     void *scratch_buffer;
    1240              :     size_t scratch_buffer_size;
    1241              :     uint8_t *large_message;
    1242              :     size_t large_message_capacity;
    1243              :     size_t i;
    1244              : 
    1245            1 :     spdm_test_context = *state;
    1246            1 :     spdm_context = spdm_test_context->spdm_context;
    1247            1 :     spdm_test_context->case_id = 13;
    1248              : 
    1249            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
    1250              : 
    1251            1 :     libspdm_get_scratch_buffer(spdm_context, &scratch_buffer, &scratch_buffer_size);
    1252            2 :     large_message = (uint8_t *)scratch_buffer +
    1253            1 :                     libspdm_get_scratch_buffer_large_message_offset(spdm_context);
    1254            1 :     large_message_capacity = libspdm_get_scratch_buffer_large_message_capacity(spdm_context);
    1255            1 :     libspdm_set_mem(large_message, large_message_capacity, 0xa5);
    1256              : 
    1257            1 :     spdm_context->chunk_context.send.chunk_in_use = true;
    1258            1 :     spdm_context->chunk_context.send.chunk_handle = (uint8_t) spdm_test_context->case_id;
    1259            1 :     spdm_context->chunk_context.send.chunk_seq_no = 0;
    1260            1 :     spdm_context->chunk_context.send.large_message = large_message;
    1261            1 :     spdm_context->chunk_context.send.large_message_capacity = large_message_capacity;
    1262            1 :     spdm_context->chunk_context.send.large_message_size = large_message_capacity;
    1263            1 :     spdm_context->chunk_context.send.chunk_bytes_transferred = large_message_capacity;
    1264              : 
    1265            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
    1266              : 
    1267            1 :     libspdm_zero_mem(request, sizeof(request));
    1268            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
    1269              : 
    1270            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1271            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
    1272            1 :     chunk_send_request->header.param1 = 0;
    1273            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
    1274            1 :     chunk_send_request->chunk_seq_no = 2; /* Bad seq num */
    1275              : 
    1276            1 :     chunk_send_request->chunk_size =
    1277            1 :         spdm_context->local_context.capability.data_transfer_size
    1278            1 :         - sizeof(spdm_chunk_send_request_t);
    1279              : 
    1280            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1));
    1281              : 
    1282            1 :     request_size = sizeof(spdm_chunk_send_request_t)
    1283            1 :                    + chunk_send_request->chunk_size;
    1284              : 
    1285            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
    1286            1 :                      chunk_src, chunk_send_request->chunk_size);
    1287              : 
    1288            1 :     response_size = sizeof(response);
    1289            1 :     status = libspdm_get_response_chunk_send(
    1290              :         spdm_context,
    1291              :         request_size, request,
    1292              :         &response_size, response);
    1293              : 
    1294            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1295            1 :     assert_true(response_size == sizeof(spdm_chunk_send_ack_response_t)
    1296              :                 + sizeof(spdm_error_response_t));
    1297              : 
    1298            1 :     chunk_send_ack_response = (spdm_chunk_send_ack_response_t*) response;
    1299            1 :     assert_int_equal(chunk_send_ack_response->header.param1,
    1300              :                      SPDM_CHUNK_SEND_ACK_RESPONSE_ATTRIBUTE_EARLY_ERROR_DETECTED);
    1301              : 
    1302            1 :     error_response = (spdm_error_response_t*) (chunk_send_ack_response + 1);
    1303            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
    1304            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
    1305            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1306            1 :     assert_int_equal(error_response->header.param2, 0);
    1307              : 
    1308            1 :     assert_null(spdm_context->chunk_context.send.large_message);
    1309            1 :     assert_int_equal(spdm_context->chunk_context.send.large_message_size, 0);
    1310            1 :     assert_int_equal(spdm_context->chunk_context.send.large_message_capacity, 0);
    1311         4609 :     for (i = 0; i < large_message_capacity; i++) {
    1312         4608 :         assert_int_equal(large_message[i], 0);
    1313              :     }
    1314              : 
    1315            1 :     libspdm_test_responder_chunk_send_ack_reset_send_state(spdm_context);
    1316            1 : }
    1317              : 
    1318              : /**
    1319              :  * Test 14: Request has bad chunk handle.
    1320              :  **/
    1321            1 : static void rsp_chunk_send_ack_case14(void** state)
    1322              : {
    1323              :     libspdm_return_t status;
    1324              : 
    1325              :     libspdm_test_context_t* spdm_test_context;
    1326              :     libspdm_context_t* spdm_context;
    1327              : 
    1328              :     size_t request_size;
    1329              :     size_t response_size;
    1330              : 
    1331              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1332              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1333              : 
    1334              :     spdm_chunk_send_request_t* chunk_send_request;
    1335              :     spdm_chunk_send_ack_response_t* chunk_send_ack_response;
    1336              :     spdm_error_response_t* error_response;
    1337              : 
    1338              :     const uint8_t* chunk_src;
    1339              :     uint8_t* chunk_dst;
    1340              : 
    1341            1 :     spdm_test_context = *state;
    1342            1 :     spdm_context = spdm_test_context->spdm_context;
    1343            1 :     spdm_test_context->case_id = 14;
    1344              : 
    1345            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
    1346            1 :     spdm_context->chunk_context.send.chunk_in_use = true;
    1347            1 :     spdm_context->chunk_context.send.chunk_handle = (uint8_t) spdm_test_context->case_id;
    1348            1 :     spdm_context->chunk_context.send.chunk_seq_no = 0;
    1349              : 
    1350            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
    1351              : 
    1352            1 :     libspdm_zero_mem(request, sizeof(request));
    1353            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
    1354              : 
    1355            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1356            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
    1357            1 :     chunk_send_request->header.param1 = 0;
    1358            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id + 1; /* bad chunk_handle */
    1359            1 :     chunk_send_request->chunk_seq_no = 1;
    1360            1 :     chunk_send_request->chunk_size =
    1361            1 :         spdm_context->local_context.capability.data_transfer_size
    1362            1 :         - sizeof(spdm_chunk_send_request_t);
    1363              : 
    1364            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1));
    1365              : 
    1366            1 :     request_size = sizeof(spdm_chunk_send_request_t)
    1367            1 :                    + chunk_send_request->chunk_size;
    1368              : 
    1369            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
    1370            1 :                      chunk_src, chunk_send_request->chunk_size);
    1371              : 
    1372            1 :     response_size = sizeof(response);
    1373            1 :     status = libspdm_get_response_chunk_send(
    1374              :         spdm_context,
    1375              :         request_size, request,
    1376              :         &response_size, response);
    1377              : 
    1378            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1379            1 :     assert_true(response_size == sizeof(spdm_chunk_send_ack_response_t)
    1380              :                 + sizeof(spdm_error_response_t));
    1381              : 
    1382            1 :     chunk_send_ack_response = (spdm_chunk_send_ack_response_t*) response;
    1383            1 :     assert_int_equal(chunk_send_ack_response->header.param1,
    1384              :                      SPDM_CHUNK_SEND_ACK_RESPONSE_ATTRIBUTE_EARLY_ERROR_DETECTED);
    1385              : 
    1386            1 :     error_response = (spdm_error_response_t*) (chunk_send_ack_response + 1);
    1387            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
    1388            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
    1389            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1390            1 :     assert_int_equal(error_response->header.param2, 0);
    1391              : 
    1392            1 :     libspdm_test_responder_chunk_send_ack_reset_send_state(spdm_context);
    1393            1 : }
    1394              : 
    1395              : /**
    1396              :  * Test 15: Request has size larger than data transfer size.
    1397              :  **/
    1398            1 : static void rsp_chunk_send_ack_case15(void** state)
    1399              : {
    1400              :     libspdm_return_t status;
    1401              : 
    1402              :     libspdm_test_context_t* spdm_test_context;
    1403              :     libspdm_context_t* spdm_context;
    1404              : 
    1405              :     size_t request_size;
    1406              :     size_t response_size;
    1407              : 
    1408              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1409              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1410              : 
    1411              :     spdm_chunk_send_request_t* chunk_send_request;
    1412              :     spdm_chunk_send_ack_response_t* chunk_send_ack_response;
    1413              :     spdm_error_response_t* error_response;
    1414              : 
    1415              :     const uint8_t* chunk_src;
    1416              :     uint8_t* chunk_dst;
    1417              : 
    1418            1 :     spdm_test_context = *state;
    1419            1 :     spdm_context = spdm_test_context->spdm_context;
    1420            1 :     spdm_test_context->case_id = 15;
    1421              : 
    1422            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
    1423            1 :     spdm_context->chunk_context.send.chunk_in_use = true;
    1424            1 :     spdm_context->chunk_context.send.chunk_handle = (uint8_t) spdm_test_context->case_id;
    1425            1 :     spdm_context->chunk_context.send.chunk_seq_no = 0;
    1426              : 
    1427            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
    1428              : 
    1429            1 :     libspdm_zero_mem(request, sizeof(request));
    1430            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
    1431              : 
    1432            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1433            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
    1434            1 :     chunk_send_request->header.param1 = 0;
    1435            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
    1436            1 :     chunk_send_request->chunk_seq_no = 1;
    1437              : 
    1438            1 :     chunk_send_request->chunk_size =
    1439            1 :         spdm_context->local_context.capability.data_transfer_size
    1440            1 :         - sizeof(spdm_chunk_send_request_t);
    1441              : 
    1442            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1));
    1443              : 
    1444            1 :     request_size = sizeof(spdm_chunk_send_request_t)
    1445            1 :                    + chunk_send_request->chunk_size
    1446              :                    + 1; /* Request size too large */
    1447              : 
    1448            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
    1449            1 :                      chunk_src, chunk_send_request->chunk_size);
    1450              : 
    1451            1 :     response_size = sizeof(response);
    1452            1 :     status = libspdm_get_response_chunk_send(
    1453              :         spdm_context,
    1454              :         request_size, request,
    1455              :         &response_size, response);
    1456              : 
    1457            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1458            1 :     assert_true(response_size == sizeof(spdm_chunk_send_ack_response_t)
    1459              :                 + sizeof(spdm_error_response_t));
    1460              : 
    1461            1 :     chunk_send_ack_response = (spdm_chunk_send_ack_response_t*) response;
    1462            1 :     assert_int_equal(chunk_send_ack_response->header.param1,
    1463              :                      SPDM_CHUNK_SEND_ACK_RESPONSE_ATTRIBUTE_EARLY_ERROR_DETECTED);
    1464              : 
    1465            1 :     error_response = (spdm_error_response_t*) (chunk_send_ack_response + 1);
    1466            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
    1467            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
    1468            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1469            1 :     assert_int_equal(error_response->header.param2, 0);
    1470              : 
    1471            1 :     libspdm_test_responder_chunk_send_ack_reset_send_state(spdm_context);
    1472            1 : }
    1473              : 
    1474              : /**
    1475              :  * Test 16: Request has chunk size + transferred size > large message size
    1476              :  **/
    1477            1 : static void rsp_chunk_send_ack_case16(void** state)
    1478              : {
    1479              :     libspdm_return_t status;
    1480              : 
    1481              :     libspdm_test_context_t* spdm_test_context;
    1482              :     libspdm_context_t* spdm_context;
    1483              : 
    1484              :     size_t request_size;
    1485              :     size_t response_size;
    1486              : 
    1487              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1488              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1489              : 
    1490              :     spdm_chunk_send_request_t* chunk_send_request;
    1491              :     spdm_chunk_send_ack_response_t* chunk_send_ack_response;
    1492              :     spdm_error_response_t* error_response;
    1493              : 
    1494              :     const uint8_t* chunk_src;
    1495              :     uint8_t* chunk_dst;
    1496              : 
    1497            1 :     spdm_test_context = *state;
    1498            1 :     spdm_context = spdm_test_context->spdm_context;
    1499            1 :     spdm_test_context->case_id = 16;
    1500              : 
    1501            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
    1502            1 :     spdm_context->chunk_context.send.chunk_in_use = true;
    1503            1 :     spdm_context->chunk_context.send.chunk_handle = (uint8_t) spdm_test_context->case_id;
    1504            1 :     spdm_context->chunk_context.send.chunk_seq_no = 0;
    1505            1 :     spdm_context->chunk_context.send.large_message_size = 1024;
    1506            1 :     spdm_context->chunk_context.send.chunk_bytes_transferred = 1023;
    1507              : 
    1508            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
    1509              : 
    1510            1 :     libspdm_zero_mem(request, sizeof(request));
    1511            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
    1512              : 
    1513            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1514            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
    1515            1 :     chunk_send_request->header.param1 = 0;
    1516            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
    1517            1 :     chunk_send_request->chunk_seq_no = 1;
    1518            1 :     chunk_send_request->chunk_size = 2; /* Bad size. Over large message size */
    1519              : 
    1520            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1));
    1521              : 
    1522            1 :     request_size = sizeof(spdm_chunk_send_request_t)
    1523            1 :                    + chunk_send_request->chunk_size;
    1524              : 
    1525            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
    1526            1 :                      chunk_src, chunk_send_request->chunk_size);
    1527              : 
    1528            1 :     response_size = sizeof(response);
    1529            1 :     status = libspdm_get_response_chunk_send(
    1530              :         spdm_context,
    1531              :         request_size, request,
    1532              :         &response_size, response);
    1533              : 
    1534            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1535            1 :     assert_true(response_size == sizeof(spdm_chunk_send_ack_response_t)
    1536              :                 + sizeof(spdm_error_response_t));
    1537              : 
    1538            1 :     chunk_send_ack_response = (spdm_chunk_send_ack_response_t*) response;
    1539            1 :     assert_int_equal(chunk_send_ack_response->header.param1,
    1540              :                      SPDM_CHUNK_SEND_ACK_RESPONSE_ATTRIBUTE_EARLY_ERROR_DETECTED);
    1541              : 
    1542            1 :     error_response = (spdm_error_response_t*) (chunk_send_ack_response + 1);
    1543            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
    1544            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
    1545            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1546            1 :     assert_int_equal(error_response->header.param2, 0);
    1547              : 
    1548            1 :     libspdm_test_responder_chunk_send_ack_reset_send_state(spdm_context);
    1549            1 : }
    1550              : 
    1551              : /**
    1552              :  * Test 17: Request has LAST_CHUNK indicated before all bytes transferred.
    1553              :  **/
    1554            1 : static void rsp_chunk_send_ack_case17(void** state)
    1555              : {
    1556              :     libspdm_return_t status;
    1557              : 
    1558              :     libspdm_test_context_t* spdm_test_context;
    1559              :     libspdm_context_t* spdm_context;
    1560              : 
    1561              :     size_t request_size;
    1562              :     size_t response_size;
    1563              : 
    1564              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1565              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1566              : 
    1567              :     spdm_chunk_send_request_t* chunk_send_request;
    1568              :     spdm_chunk_send_ack_response_t* chunk_send_ack_response;
    1569              :     spdm_error_response_t* error_response;
    1570              : 
    1571              :     const uint8_t* chunk_src;
    1572              :     uint8_t* chunk_dst;
    1573              : 
    1574            1 :     spdm_test_context = *state;
    1575            1 :     spdm_context = spdm_test_context->spdm_context;
    1576            1 :     spdm_test_context->case_id = 17;
    1577              : 
    1578            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
    1579            1 :     spdm_context->chunk_context.send.chunk_in_use = true;
    1580            1 :     spdm_context->chunk_context.send.chunk_handle = (uint8_t) spdm_test_context->case_id;
    1581            1 :     spdm_context->chunk_context.send.chunk_seq_no = 0;
    1582            1 :     spdm_context->chunk_context.send.large_message_size = 1024;
    1583            1 :     spdm_context->chunk_context.send.chunk_bytes_transferred = 1023;
    1584              : 
    1585            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
    1586              : 
    1587            1 :     libspdm_zero_mem(request, sizeof(request));
    1588            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
    1589              : 
    1590            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1591            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
    1592            1 :     chunk_send_request->header.param1 = 0;
    1593            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
    1594            1 :     chunk_send_request->chunk_seq_no = 0;
    1595            1 :     chunk_send_request->chunk_size = 1;
    1596              : 
    1597            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1));
    1598              : 
    1599            1 :     request_size = sizeof(spdm_chunk_send_request_t)
    1600            1 :                    + chunk_send_request->chunk_size;
    1601              : 
    1602            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
    1603            1 :                      chunk_src, chunk_send_request->chunk_size);
    1604              : 
    1605            1 :     response_size = sizeof(response);
    1606            1 :     status = libspdm_get_response_chunk_send(
    1607              :         spdm_context,
    1608              :         request_size, request,
    1609              :         &response_size, response);
    1610              : 
    1611            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1612            1 :     assert_true(response_size == sizeof(spdm_chunk_send_ack_response_t)
    1613              :                 + sizeof(spdm_error_response_t));
    1614              : 
    1615            1 :     chunk_send_ack_response = (spdm_chunk_send_ack_response_t*) response;
    1616            1 :     assert_int_equal(chunk_send_ack_response->header.param1,
    1617              :                      SPDM_CHUNK_SEND_ACK_RESPONSE_ATTRIBUTE_EARLY_ERROR_DETECTED);
    1618              : 
    1619            1 :     error_response = (spdm_error_response_t*) (chunk_send_ack_response + 1);
    1620            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
    1621            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
    1622            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1623            1 :     assert_int_equal(error_response->header.param2, 0);
    1624              : 
    1625            1 :     libspdm_test_responder_chunk_send_ack_reset_send_state(spdm_context);
    1626            1 : }
    1627              : 
    1628              : /**
    1629              :  * Test 18: Request missing LAST_CHUNK after all bytes transferred.
    1630              :  **/
    1631            1 : static void rsp_chunk_send_ack_case18(void** state)
    1632              : {
    1633              :     libspdm_return_t status;
    1634              : 
    1635              :     libspdm_test_context_t* spdm_test_context;
    1636              :     libspdm_context_t* spdm_context;
    1637              : 
    1638              :     size_t request_size;
    1639              :     size_t response_size;
    1640              : 
    1641              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1642              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1643              : 
    1644              :     spdm_chunk_send_request_t* chunk_send_request;
    1645              :     spdm_chunk_send_ack_response_t* chunk_send_ack_response;
    1646              :     spdm_error_response_t* error_response;
    1647              : 
    1648              :     const uint8_t* chunk_src;
    1649              :     uint8_t* chunk_dst;
    1650              : 
    1651            1 :     spdm_test_context = *state;
    1652            1 :     spdm_context = spdm_test_context->spdm_context;
    1653            1 :     spdm_test_context->case_id = 18;
    1654              : 
    1655            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
    1656            1 :     spdm_context->chunk_context.send.chunk_in_use = true;
    1657            1 :     spdm_context->chunk_context.send.chunk_handle = (uint8_t) spdm_test_context->case_id;
    1658            1 :     spdm_context->chunk_context.send.chunk_seq_no = 0;
    1659            1 :     spdm_context->chunk_context.send.large_message_size = 1024;
    1660            1 :     spdm_context->chunk_context.send.chunk_bytes_transferred = 1022;
    1661              : 
    1662            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
    1663              : 
    1664            1 :     libspdm_zero_mem(request, sizeof(request));
    1665            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
    1666              : 
    1667            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1668            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
    1669            1 :     chunk_send_request->header.param1 = 0;
    1670            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
    1671            1 :     chunk_send_request->chunk_seq_no = 0;
    1672            1 :     chunk_send_request->chunk_size = 2;
    1673              : 
    1674            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1));
    1675              : 
    1676            1 :     request_size = sizeof(spdm_chunk_send_request_t)
    1677            1 :                    + chunk_send_request->chunk_size;
    1678              : 
    1679            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
    1680            1 :                      chunk_src, chunk_send_request->chunk_size);
    1681              : 
    1682            1 :     response_size = sizeof(response);
    1683            1 :     status = libspdm_get_response_chunk_send(
    1684              :         spdm_context,
    1685              :         request_size, request,
    1686              :         &response_size, response);
    1687              : 
    1688            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1689            1 :     assert_true(response_size == sizeof(spdm_chunk_send_ack_response_t)
    1690              :                 + sizeof(spdm_error_response_t));
    1691              : 
    1692            1 :     chunk_send_ack_response = (spdm_chunk_send_ack_response_t*) response;
    1693            1 :     assert_int_equal(chunk_send_ack_response->header.param1,
    1694              :                      SPDM_CHUNK_SEND_ACK_RESPONSE_ATTRIBUTE_EARLY_ERROR_DETECTED);
    1695              : 
    1696            1 :     error_response = (spdm_error_response_t*) (chunk_send_ack_response + 1);
    1697            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
    1698            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
    1699            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1700            1 :     assert_int_equal(error_response->header.param2, 0);
    1701              : 
    1702            1 :     libspdm_test_responder_chunk_send_ack_reset_send_state(spdm_context);
    1703            1 : }
    1704              : 
    1705              : /**
    1706              :  *  Test 19: Request missing LAST_CHUNK when request size != data transfer size.
    1707              :  **/
    1708            1 : static void rsp_chunk_send_ack_case19(void** state)
    1709              : {
    1710              :     libspdm_return_t status;
    1711              : 
    1712              :     libspdm_test_context_t* spdm_test_context;
    1713              :     libspdm_context_t* spdm_context;
    1714              : 
    1715              :     size_t request_size;
    1716              :     size_t response_size;
    1717              : 
    1718              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1719              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1720              : 
    1721              :     spdm_chunk_send_request_t* chunk_send_request;
    1722              :     spdm_chunk_send_ack_response_t* chunk_send_ack_response;
    1723              :     spdm_error_response_t* error_response;
    1724              : 
    1725              :     const uint8_t* chunk_src;
    1726              :     uint8_t* chunk_dst;
    1727              : 
    1728            1 :     spdm_test_context = *state;
    1729            1 :     spdm_context = spdm_test_context->spdm_context;
    1730            1 :     spdm_test_context->case_id = 19;
    1731              : 
    1732            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
    1733            1 :     spdm_context->chunk_context.send.chunk_in_use = true;
    1734            1 :     spdm_context->chunk_context.send.chunk_handle = (uint8_t) spdm_test_context->case_id;
    1735            1 :     spdm_context->chunk_context.send.chunk_seq_no = 0;
    1736            1 :     spdm_context->chunk_context.send.large_message_size = 1024;
    1737            1 :     spdm_context->chunk_context.send.chunk_bytes_transferred = 0;
    1738              : 
    1739            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
    1740              : 
    1741            1 :     libspdm_zero_mem(request, sizeof(request));
    1742            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
    1743              : 
    1744            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1745            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
    1746            1 :     chunk_send_request->header.param1 = 0;
    1747            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
    1748            1 :     chunk_send_request->chunk_seq_no = 0;
    1749            1 :     chunk_send_request->chunk_size =
    1750            1 :         spdm_context->local_context.capability.data_transfer_size
    1751              :         - sizeof(spdm_chunk_send_request_t)
    1752            1 :         - 1; /* Chunk size too small. */
    1753              : 
    1754            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1));
    1755              : 
    1756            1 :     request_size = sizeof(spdm_chunk_send_request_t)
    1757            1 :                    + chunk_send_request->chunk_size;
    1758              : 
    1759            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
    1760            1 :                      chunk_src, chunk_send_request->chunk_size);
    1761              : 
    1762            1 :     response_size = sizeof(response);
    1763            1 :     status = libspdm_get_response_chunk_send(
    1764              :         spdm_context,
    1765              :         request_size, request,
    1766              :         &response_size, response);
    1767              : 
    1768            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1769            1 :     assert_true(response_size == sizeof(spdm_chunk_send_ack_response_t)
    1770              :                 + sizeof(spdm_error_response_t));
    1771              : 
    1772            1 :     chunk_send_ack_response = (spdm_chunk_send_ack_response_t*) response;
    1773            1 :     assert_int_equal(chunk_send_ack_response->header.param1,
    1774              :                      SPDM_CHUNK_SEND_ACK_RESPONSE_ATTRIBUTE_EARLY_ERROR_DETECTED);
    1775              : 
    1776            1 :     error_response = (spdm_error_response_t*) (chunk_send_ack_response + 1);
    1777            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
    1778            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
    1779            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1780            1 :     assert_int_equal(error_response->header.param2, 0);
    1781              : 
    1782            1 :     libspdm_test_responder_chunk_send_ack_reset_send_state(spdm_context);
    1783            1 : }
    1784              : 
    1785              : /**
    1786              :  *  Test 20: Request chunk seq wrapped.
    1787              :  **/
    1788            1 : static void rsp_chunk_send_ack_case20(void** state)
    1789              : {
    1790              :     libspdm_return_t status;
    1791              : 
    1792              :     libspdm_test_context_t* spdm_test_context;
    1793              :     libspdm_context_t* spdm_context;
    1794              : 
    1795              :     size_t request_size;
    1796              :     size_t response_size;
    1797              : 
    1798              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1799              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1800              : 
    1801              :     spdm_chunk_send_request_t* chunk_send_request;
    1802              :     spdm_chunk_send_ack_response_t* chunk_send_ack_response;
    1803              :     spdm_error_response_t* error_response;
    1804              : 
    1805              :     const uint8_t* chunk_src;
    1806              :     uint8_t* chunk_dst;
    1807              : 
    1808              :     /* Format the last chunk. */
    1809            1 :     spdm_test_context = *state;
    1810            1 :     spdm_context = spdm_test_context->spdm_context;
    1811            1 :     spdm_test_context->case_id = 20;
    1812              : 
    1813            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
    1814            1 :     spdm_context->chunk_context.send.chunk_in_use = true;
    1815            1 :     spdm_context->chunk_context.send.chunk_handle = (uint8_t) spdm_test_context->case_id;
    1816            1 :     spdm_context->chunk_context.send.chunk_seq_no = 65535; /* maximum chunk seq received */
    1817            1 :     spdm_context->chunk_context.send.large_message_size = 0x10000;
    1818            1 :     spdm_context->chunk_context.send.chunk_bytes_transferred = 0x8000;
    1819              : 
    1820            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
    1821              : 
    1822            1 :     libspdm_zero_mem(request, sizeof(request));
    1823            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
    1824              : 
    1825            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1826            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
    1827            1 :     chunk_send_request->header.param1 = 0;
    1828            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
    1829            1 :     chunk_send_request->chunk_seq_no = 0; /* chunk seq wrapped */
    1830              : 
    1831            1 :     chunk_send_request->chunk_size =
    1832            1 :         spdm_context->local_context.capability.data_transfer_size
    1833            1 :         - sizeof(spdm_chunk_send_request_t);
    1834              : 
    1835            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1));
    1836              : 
    1837            1 :     request_size = sizeof(spdm_chunk_send_request_t)
    1838            1 :                    + chunk_send_request->chunk_size;
    1839              : 
    1840            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
    1841            1 :                      chunk_src, chunk_send_request->chunk_size);
    1842              : 
    1843            1 :     response_size = sizeof(response);
    1844            1 :     status = libspdm_get_response_chunk_send(
    1845              :         spdm_context,
    1846              :         request_size, request,
    1847              :         &response_size, response);
    1848              : 
    1849            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1850            1 :     assert_true(response_size == sizeof(spdm_chunk_send_ack_response_t)
    1851              :                 + sizeof(spdm_error_response_t));
    1852              : 
    1853            1 :     chunk_send_ack_response = (spdm_chunk_send_ack_response_t*) response;
    1854            1 :     assert_int_equal(chunk_send_ack_response->header.param1,
    1855              :                      SPDM_CHUNK_SEND_ACK_RESPONSE_ATTRIBUTE_EARLY_ERROR_DETECTED);
    1856              : 
    1857            1 :     error_response = (spdm_error_response_t*) (chunk_send_ack_response + 1);
    1858            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
    1859            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
    1860            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1861            1 :     assert_int_equal(error_response->header.param2, 0);
    1862              : 
    1863            1 :     libspdm_test_responder_chunk_send_ack_reset_send_state(spdm_context);
    1864            1 : }
    1865              : 
    1866              : /**
    1867              :  *  Test 21: Request size exceed max chunk seq no.
    1868              :  **/
    1869            1 : static void rsp_chunk_send_ack_case21(void** state)
    1870              : {
    1871              :     libspdm_return_t status;
    1872              : 
    1873              :     libspdm_test_context_t* spdm_test_context;
    1874              :     libspdm_context_t* spdm_context;
    1875              : 
    1876              :     size_t request_size;
    1877              :     size_t response_size;
    1878              : 
    1879              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1880              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1881              : 
    1882              :     spdm_chunk_send_request_t* chunk_send_request;
    1883              :     spdm_chunk_send_ack_response_t* chunk_send_ack_response;
    1884              :     spdm_error_response_t* error_response;
    1885              : 
    1886              :     const uint8_t* chunk_src;
    1887              :     uint8_t* chunk_dst;
    1888              : 
    1889              :     /* Format the last chunk. */
    1890            1 :     spdm_test_context = *state;
    1891            1 :     spdm_context = spdm_test_context->spdm_context;
    1892            1 :     spdm_test_context->case_id = 21;
    1893              : 
    1894            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
    1895            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
    1896              : 
    1897            1 :     libspdm_zero_mem(request, sizeof(request));
    1898            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
    1899              : 
    1900            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1901            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
    1902            1 :     chunk_send_request->header.param1 = 0;
    1903            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
    1904            1 :     chunk_send_request->chunk_seq_no = 0;
    1905              : 
    1906              : 
    1907            1 :     *((uint32_t*) (chunk_send_request + 1)) = 0x1000000; /* a size exceed max chunk seq */
    1908            1 :     chunk_send_request->chunk_size =
    1909            1 :         spdm_context->local_context.capability.data_transfer_size
    1910            1 :         - sizeof(spdm_chunk_send_request_t) - sizeof(uint32_t);
    1911              : 
    1912            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
    1913              : 
    1914            1 :     request_size = sizeof(spdm_chunk_send_request_t)
    1915              :                    + sizeof(uint32_t)
    1916            1 :                    + chunk_send_request->chunk_size;
    1917              : 
    1918            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
    1919            1 :                      chunk_src, chunk_send_request->chunk_size);
    1920              : 
    1921            1 :     response_size = sizeof(response);
    1922            1 :     status = libspdm_get_response_chunk_send(
    1923              :         spdm_context,
    1924              :         request_size, request,
    1925              :         &response_size, response);
    1926              : 
    1927            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1928            1 :     assert_true(response_size == sizeof(spdm_chunk_send_ack_response_t)
    1929              :                 + sizeof(spdm_error_response_t));
    1930              : 
    1931            1 :     chunk_send_ack_response = (spdm_chunk_send_ack_response_t*) response;
    1932            1 :     assert_int_equal(chunk_send_ack_response->header.param1,
    1933              :                      SPDM_CHUNK_SEND_ACK_RESPONSE_ATTRIBUTE_EARLY_ERROR_DETECTED);
    1934              : 
    1935            1 :     error_response = (spdm_error_response_t*) (chunk_send_ack_response + 1);
    1936            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
    1937            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
    1938            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1939            1 :     assert_int_equal(error_response->header.param2, 0);
    1940              : 
    1941            1 :     libspdm_test_responder_chunk_send_ack_reset_send_state(spdm_context);
    1942            1 : }
    1943              : 
    1944              : 
    1945              : /* Test sending large NegAlg Request in multiple chunks, spdm 1.4 */
    1946            1 : static void rsp_chunk_send_ack_case22(void** state)
    1947              : {
    1948              :     libspdm_return_t status;
    1949              : 
    1950              :     libspdm_test_context_t* spdm_test_context;
    1951              :     libspdm_context_t* spdm_context;
    1952              : 
    1953              :     size_t request_size;
    1954              :     size_t response_size;
    1955              : 
    1956              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1957              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1958              : 
    1959              :     spdm_chunk_send_request_14_t *chunk_send_request;
    1960              :     spdm_chunk_send_ack_response_14_t* chunk_send_ack_response;
    1961              :     spdm_algorithms_response_t *algorithms_response;
    1962              :     size_t algorithms_response_size;
    1963              : 
    1964              :     const uint8_t* chunk_src;
    1965              :     uint8_t* chunk_dst;
    1966              :     uint16_t chunk_num;
    1967              :     uint32_t bytes_sent;
    1968              :     uint32_t bytes_total;
    1969              : 
    1970              :     void *scratch_buffer;
    1971              :     size_t scratch_buffer_size;
    1972              :     uint8_t *large_message;
    1973              :     size_t large_message_capacity;
    1974              :     size_t i;
    1975              : 
    1976            1 :     spdm_test_context = *state;
    1977            1 :     spdm_context = spdm_test_context->spdm_context;
    1978            1 :     spdm_test_context->case_id = 22;
    1979              : 
    1980            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
    1981              : 
    1982            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_14 <<
    1983              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1984            1 :     m_libspdm_chunk_send_negotiate_algorithm_request22.spdm_request_version10.base_hash_algo =
    1985              :         m_libspdm_use_hash_algo;
    1986            1 :     m_libspdm_chunk_send_negotiate_algorithm_request22.spdm_request_version10.base_asym_algo =
    1987              :         m_libspdm_use_asym_algo;
    1988              : 
    1989            1 :     chunk_num = 0;
    1990            1 :     bytes_sent = 0;
    1991            1 :     bytes_total = sizeof(m_libspdm_chunk_send_negotiate_algorithm_request22);
    1992            1 :     chunk_src = (const uint8_t *)&m_libspdm_chunk_send_negotiate_algorithm_request22;
    1993              : 
    1994              :     do {
    1995            2 :         libspdm_zero_mem(request, sizeof(request));
    1996            2 :         chunk_send_request = (spdm_chunk_send_request_14_t*)request;
    1997              : 
    1998            2 :         chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_14;
    1999            2 :         chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
    2000            2 :         chunk_send_request->header.param1 = 0;
    2001            2 :         chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
    2002            2 :         chunk_send_request->chunk_seq_no = chunk_num;
    2003              : 
    2004            2 :         if (chunk_num == 0) {
    2005            1 :             *((uint32_t*) (chunk_send_request + 1)) = bytes_total;
    2006            1 :             chunk_send_request->chunk_size =
    2007            1 :                 spdm_context->local_context.capability.data_transfer_size
    2008            1 :                 - sizeof(spdm_chunk_send_request_14_t) - sizeof(uint32_t);
    2009              : 
    2010            1 :             chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
    2011              : 
    2012            1 :             request_size = sizeof(spdm_chunk_send_request_14_t)
    2013              :                            + sizeof(uint32_t)
    2014            1 :                            + chunk_send_request->chunk_size;
    2015              :         } else {
    2016            1 :             chunk_send_request->chunk_size =
    2017            1 :                 LIBSPDM_MIN(
    2018              :                     spdm_context->local_context.capability.data_transfer_size
    2019              :                     - sizeof(spdm_chunk_send_request_14_t),
    2020              :                     bytes_total - bytes_sent);
    2021              : 
    2022            1 :             chunk_dst = ((uint8_t*) (chunk_send_request + 1));
    2023              : 
    2024            1 :             request_size = sizeof(spdm_chunk_send_request_14_t)
    2025            1 :                            + chunk_send_request->chunk_size;
    2026              : 
    2027            1 :             if (bytes_total - bytes_sent == chunk_send_request->chunk_size) {
    2028            1 :                 chunk_send_request->header.param1 = SPDM_CHUNK_SEND_REQUEST_ATTRIBUTE_LAST_CHUNK;
    2029              :             }
    2030              :         }
    2031              : 
    2032            2 :         libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
    2033            2 :                          chunk_src, chunk_send_request->chunk_size);
    2034              : 
    2035            2 :         chunk_src += chunk_send_request->chunk_size;
    2036            2 :         bytes_sent += chunk_send_request->chunk_size;
    2037            2 :         chunk_num++;
    2038              : 
    2039            2 :         response_size = sizeof(response);
    2040            2 :         status = libspdm_get_response_chunk_send(
    2041              :             spdm_context,
    2042              :             request_size, request,
    2043              :             &response_size, response);
    2044              : 
    2045            2 :         assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    2046            2 :         assert_true(response_size >= sizeof(spdm_chunk_send_ack_response_14_t));
    2047              : 
    2048            2 :         chunk_send_ack_response = (spdm_chunk_send_ack_response_14_t*) response;
    2049            2 :         assert_int_equal(chunk_send_ack_response->header.spdm_version, SPDM_MESSAGE_VERSION_14);
    2050            2 :         assert_int_equal(chunk_send_ack_response->header.request_response_code,
    2051              :                          SPDM_CHUNK_SEND_ACK);
    2052            2 :         assert_int_equal(chunk_send_ack_response->header.param1, 0);
    2053            2 :         assert_int_equal(chunk_send_ack_response->header.param2, spdm_test_context->case_id);
    2054            2 :         assert_int_equal(chunk_send_ack_response->chunk_seq_no, chunk_send_request->chunk_seq_no);
    2055              : 
    2056            2 :     } while (bytes_sent < bytes_total);
    2057              : 
    2058            1 :     algorithms_response = (spdm_algorithms_response_t*) (chunk_send_ack_response + 1);
    2059            1 :     algorithms_response_size = response_size - sizeof(spdm_chunk_send_ack_response_14_t);
    2060            1 :     assert_int_equal(algorithms_response->header.request_response_code, SPDM_ALGORITHMS);
    2061              : 
    2062            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    2063            1 :     assert_int_equal(algorithms_response_size,
    2064              :                      sizeof(spdm_algorithms_response_t) + 4 *
    2065              :                      sizeof(spdm_negotiate_algorithms_common_struct_table_t));
    2066            1 :     assert_int_equal(algorithms_response->header.spdm_version, SPDM_MESSAGE_VERSION_14);
    2067            1 :     assert_int_equal(algorithms_response->header.request_response_code, SPDM_ALGORITHMS);
    2068            1 :     assert_int_equal(algorithms_response->header.param1, 4);
    2069              : 
    2070            1 :     assert_false(spdm_context->chunk_context.send.chunk_in_use);
    2071            1 :     assert_null(spdm_context->chunk_context.send.large_message);
    2072            1 :     assert_int_equal(spdm_context->chunk_context.send.large_message_size, 0);
    2073            1 :     assert_int_equal(spdm_context->chunk_context.send.large_message_capacity, 0);
    2074              : 
    2075            1 :     libspdm_get_scratch_buffer(spdm_context, &scratch_buffer, &scratch_buffer_size);
    2076            2 :     large_message = (uint8_t *)scratch_buffer +
    2077            1 :                     libspdm_get_scratch_buffer_large_message_offset(spdm_context);
    2078            1 :     large_message_capacity = libspdm_get_scratch_buffer_large_message_capacity(spdm_context);
    2079         4609 :     for (i = 0; i < large_message_capacity; i++) {
    2080         4608 :         assert_int_equal(large_message[i], 0);
    2081              :     }
    2082            1 : }
    2083              : 
    2084            1 : int libspdm_rsp_chunk_send_ack_test(void)
    2085              : {
    2086            1 :     const struct CMUnitTest test_cases[] = {
    2087              :         /* Responder sent multiple chunks and processed correctly */
    2088              :         cmocka_unit_test(rsp_chunk_send_ack_case0),
    2089              :         /* Responder has no response flag chunk cap */
    2090              :         cmocka_unit_test(rsp_chunk_send_ack_case1),
    2091              :         /* Responder has bad response state */
    2092              :         cmocka_unit_test(rsp_chunk_send_ack_case2),
    2093              :         /* Responder has connection state <= NOT_START */
    2094              :         cmocka_unit_test(rsp_chunk_send_ack_case3),
    2095              :         /* Request has wrong size */
    2096              :         cmocka_unit_test(rsp_chunk_send_ack_case4),
    2097              :         /* Request has SPDM version less than 1.2*/
    2098              :         cmocka_unit_test(rsp_chunk_send_ack_case5),
    2099              :         /* Request has SPDM version not matching connection */
    2100              :         cmocka_unit_test(rsp_chunk_send_ack_case6),
    2101              :         /* Responder is already in chunking mode */
    2102              :         cmocka_unit_test(rsp_chunk_send_ack_case7),
    2103              : 
    2104              :         /* First request has bad sequence number */
    2105              :         cmocka_unit_test(rsp_chunk_send_ack_case8),
    2106              :         /* First request has chunk size too large */
    2107              :         cmocka_unit_test(rsp_chunk_send_ack_case9),
    2108              :         /* First request has size larger than data transfer size */
    2109              :         cmocka_unit_test(rsp_chunk_send_ack_case10),
    2110              :         /* Large message size larger than max SPDM message size. */
    2111              :         cmocka_unit_test(rsp_chunk_send_ack_case11),
    2112              :         /* First request has LAST CHUNK bit set. */
    2113              :         cmocka_unit_test(rsp_chunk_send_ack_case12),
    2114              : 
    2115              :         /* Request has bad sequence number */
    2116              :         cmocka_unit_test(rsp_chunk_send_ack_case13),
    2117              :         /* Request has bad chunk handle */
    2118              :         cmocka_unit_test(rsp_chunk_send_ack_case14),
    2119              :         /* Request has chunk size too large for request*/
    2120              :         cmocka_unit_test(rsp_chunk_send_ack_case15),
    2121              :         /* Request has chunk size + transferred size > large message size */
    2122              :         cmocka_unit_test(rsp_chunk_send_ack_case16),
    2123              :         /* Request has LAST_CHUNK indicated before all bytes transferred. */
    2124              :         cmocka_unit_test(rsp_chunk_send_ack_case17),
    2125              :         /* Request missing LAST_CHUNK after all bytes transferred. */
    2126              :         cmocka_unit_test(rsp_chunk_send_ack_case18),
    2127              :         /* Request missing LAST_CHUNK when request size != data transfer size. */
    2128              :         cmocka_unit_test(rsp_chunk_send_ack_case19),
    2129              :         /* Request chunk seq wrapped. */
    2130              :         cmocka_unit_test(rsp_chunk_send_ack_case20),
    2131              :         /* Request size exceed max chunk seq no. */
    2132              :         cmocka_unit_test(rsp_chunk_send_ack_case21),
    2133              : 
    2134              :         /* Responder sent multiple chunks and processed correctly, spdm 1.4 */
    2135              :         cmocka_unit_test(rsp_chunk_send_ack_case22),
    2136              :     };
    2137              : 
    2138            1 :     libspdm_test_context_t test_context = {
    2139              :         LIBSPDM_TEST_CONTEXT_VERSION,
    2140              :         false,
    2141              :     };
    2142              : 
    2143            1 :     libspdm_setup_test_context(&test_context);
    2144              : 
    2145            1 :     return cmocka_run_group_tests(test_cases,
    2146              :                                   libspdm_unit_test_group_setup,
    2147              :                                   libspdm_unit_test_group_teardown);
    2148              : }
    2149              : 
    2150              : #endif /* LIBSPDM_ENABLE_CAPABILITY_CHUNK_CAP*/
        

Generated by: LCOV version 2.0-1