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 % 855 855
Test Date: 2025-06-29 08:09:00 Functions: 100.0 % 25 25

            Line data    Source code
       1              : /**
       2              :  *  Copyright Notice:
       3              :  *  Copyright 2021-2025 DMTF. All rights reserved.
       4              :  *  License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
       5              :  **/
       6              : 
       7              : #include "spdm_unit_test.h"
       8              : #include "internal/libspdm_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              :         {
      24              :             SPDM_MESSAGE_VERSION_12,
      25              :             SPDM_NEGOTIATE_ALGORITHMS,
      26              :             4,
      27              :             0
      28              :         },
      29              :         sizeof(libspdm_negotiate_algorithms_request_spdm_tables_t),
      30              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF,
      31              :         SPDM_ALGORITHMS_OPAQUE_DATA_FORMAT_1,
      32              :     },
      33              :     {
      34              :         {
      35              :             SPDM_NEGOTIATE_ALGORITHMS_STRUCT_TABLE_ALG_TYPE_DHE,
      36              :             0x20,
      37              :             SPDM_ALGORITHMS_DHE_NAMED_GROUP_SECP_256_R1
      38              :         },
      39              :         {
      40              :             SPDM_NEGOTIATE_ALGORITHMS_STRUCT_TABLE_ALG_TYPE_AEAD,
      41              :             0x20,
      42              :             SPDM_ALGORITHMS_AEAD_CIPHER_SUITE_AES_256_GCM
      43              :         },
      44              :         {
      45              :             SPDM_NEGOTIATE_ALGORITHMS_STRUCT_TABLE_ALG_TYPE_REQ_BASE_ASYM_ALG,
      46              :             0x20,
      47              :             SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048
      48              :         },
      49              :         {
      50              :             SPDM_NEGOTIATE_ALGORITHMS_STRUCT_TABLE_ALG_TYPE_KEY_SCHEDULE,
      51              :             0x20,
      52              :             SPDM_ALGORITHMS_KEY_SCHEDULE_SPDM
      53              :         }
      54              :     }
      55              : };
      56              : 
      57              : size_t m_libspdm_chunk_send_negotiate_algorithm_request1_size =
      58              :     sizeof(m_libspdm_chunk_send_negotiate_algorithm_request1);
      59              : 
      60           22 : void libspdm_test_responder_chunk_send_ack_setup_algo_state(libspdm_context_t* spdm_context)
      61              : {
      62              :     /* This state is copied form Algorithms test case 22 */
      63           22 :     m_libspdm_chunk_send_negotiate_algorithm_request1.spdm_request_version10.base_hash_algo =
      64              :         m_libspdm_use_hash_algo;
      65           22 :     m_libspdm_chunk_send_negotiate_algorithm_request1.spdm_request_version10.base_asym_algo =
      66              :         m_libspdm_use_asym_algo;
      67              : 
      68           22 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
      69           22 :     spdm_context->connection_info.connection_state =
      70              :         LIBSPDM_CONNECTION_STATE_AFTER_CAPABILITIES;
      71              : 
      72           22 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
      73              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
      74           22 :     spdm_context->local_context.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
      75           22 :     spdm_context->local_context.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
      76           22 :     spdm_context->local_context.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
      77           22 :     spdm_context->local_context.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
      78           22 :     spdm_context->local_context.algorithm.req_base_asym_alg = m_libspdm_use_req_asym_algo;
      79           22 :     spdm_context->local_context.algorithm.key_schedule = m_libspdm_use_key_schedule_algo;
      80           22 :     spdm_context->local_context.algorithm.other_params_support =
      81              :         SPDM_ALGORITHMS_OPAQUE_DATA_FORMAT_1;
      82              :     /* spdm_context->connection_info.algorithm.other_params_support = SPDM_ALGORITHMS_OPAQUE_DATA_FORMAT_1; */
      83           22 :     libspdm_reset_message_a(spdm_context);
      84           22 :     spdm_context->local_context.capability.flags = 0;
      85           22 :     spdm_context->connection_info.capability.flags = 0;
      86           22 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
      87           22 :     spdm_context->connection_info.capability.flags |=
      88              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
      89              : 
      90           22 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
      91           22 :     spdm_context->connection_info.capability.flags |=
      92              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
      93              : 
      94           22 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
      95           22 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
      96              : 
      97           22 :     spdm_context->local_context.capability.flags |=
      98              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MUT_AUTH_CAP;
      99           22 :     spdm_context->connection_info.capability.flags |=
     100              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MUT_AUTH_CAP;
     101              : 
     102           22 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
     103           22 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
     104              : 
     105           22 :     spdm_context->local_context.capability.data_transfer_size =
     106              :         CHUNK_SEND_ACK_RESPONDER_UNIT_TEST_DATA_TRANSFER_SIZE;
     107              : 
     108           22 :     spdm_context->local_context.capability.flags |=
     109              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHUNK_CAP;
     110           22 :     spdm_context->connection_info.capability.flags |=
     111              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHUNK_CAP;
     112           22 : }
     113              : 
     114              : /* Test sending large NegAlg Request in multiple chunks. */
     115            1 : void libspdm_test_responder_chunk_send_ack_rsp_case0(void** state)
     116              : {
     117              :     libspdm_return_t status;
     118              : 
     119              :     libspdm_test_context_t* spdm_test_context;
     120              :     libspdm_context_t* spdm_context;
     121              : 
     122              :     size_t request_size;
     123              :     size_t response_size;
     124              : 
     125              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
     126              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     127              : 
     128              :     spdm_chunk_send_request_t *chunk_send_request;
     129              :     spdm_chunk_send_ack_response_t* chunk_send_ack_response;
     130              :     spdm_algorithms_response_t *algorithms_response;
     131              :     size_t algorithms_response_size;
     132              : 
     133              :     const uint8_t* chunk_src;
     134              :     uint8_t* chunk_dst;
     135              :     uint16_t chunk_num;
     136              :     uint32_t bytes_sent;
     137              :     uint32_t bytes_total;
     138              : 
     139            1 :     spdm_test_context = *state;
     140            1 :     spdm_context = spdm_test_context->spdm_context;
     141            1 :     spdm_test_context->case_id = 0;
     142              : 
     143            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
     144              : 
     145            1 :     chunk_num = 0;
     146            1 :     bytes_sent = 0;
     147            1 :     bytes_total = sizeof(m_libspdm_chunk_send_negotiate_algorithm_request1);
     148            1 :     chunk_src = (const uint8_t *)&m_libspdm_chunk_send_negotiate_algorithm_request1;
     149              : 
     150              :     do {
     151            2 :         libspdm_zero_mem(request, sizeof(request));
     152            2 :         chunk_send_request = (spdm_chunk_send_request_t*)request;
     153              : 
     154            2 :         chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     155            2 :         chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
     156            2 :         chunk_send_request->header.param1 = 0;
     157            2 :         chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
     158            2 :         chunk_send_request->chunk_seq_no = chunk_num;
     159              : 
     160            2 :         if (chunk_num == 0) {
     161            1 :             *((uint32_t*) (chunk_send_request + 1)) = bytes_total;
     162            1 :             chunk_send_request->chunk_size =
     163            1 :                 spdm_context->local_context.capability.data_transfer_size
     164            1 :                 - sizeof(spdm_chunk_send_request_t) - sizeof(uint32_t);
     165              : 
     166            1 :             chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
     167              : 
     168            1 :             request_size = sizeof(spdm_chunk_send_request_t)
     169              :                            + sizeof(uint32_t)
     170            1 :                            + chunk_send_request->chunk_size;
     171              :         } else {
     172            1 :             chunk_send_request->chunk_size =
     173            1 :                 LIBSPDM_MIN(
     174              :                     spdm_context->local_context.capability.data_transfer_size
     175              :                     - sizeof(spdm_chunk_send_request_t),
     176              :                     bytes_total - bytes_sent);
     177              : 
     178            1 :             chunk_dst = ((uint8_t*) (chunk_send_request + 1));
     179              : 
     180            1 :             request_size = sizeof(spdm_chunk_send_request_t)
     181            1 :                            + chunk_send_request->chunk_size;
     182              : 
     183            1 :             if (bytes_total - bytes_sent == chunk_send_request->chunk_size) {
     184            1 :                 chunk_send_request->header.param1 = SPDM_CHUNK_SEND_REQUEST_ATTRIBUTE_LAST_CHUNK;
     185              :             }
     186              :         }
     187              : 
     188            2 :         libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
     189            2 :                          chunk_src, chunk_send_request->chunk_size);
     190              : 
     191            2 :         chunk_src += chunk_send_request->chunk_size;
     192            2 :         bytes_sent += chunk_send_request->chunk_size;
     193            2 :         chunk_num++;
     194              : 
     195            2 :         response_size = sizeof(response);
     196            2 :         status = libspdm_get_response_chunk_send(
     197              :             spdm_context,
     198              :             request_size, request,
     199              :             &response_size, response);
     200              : 
     201            2 :         assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     202            2 :         assert_true(response_size >= sizeof(spdm_chunk_send_ack_response_t));
     203              : 
     204            2 :         chunk_send_ack_response = (spdm_chunk_send_ack_response_t*) response;
     205            2 :         assert_int_equal(chunk_send_ack_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
     206            2 :         assert_int_equal(chunk_send_ack_response->header.request_response_code,
     207              :                          SPDM_CHUNK_SEND_ACK);
     208            2 :         assert_int_equal(chunk_send_ack_response->header.param1, 0);
     209            2 :         assert_int_equal(chunk_send_ack_response->header.param2, spdm_test_context->case_id);
     210            2 :         assert_int_equal(chunk_send_ack_response->chunk_seq_no, chunk_send_request->chunk_seq_no);
     211              : 
     212            2 :     } while (bytes_sent < bytes_total);
     213              : 
     214            1 :     algorithms_response = (spdm_algorithms_response_t*) (chunk_send_ack_response + 1);
     215            1 :     algorithms_response_size = response_size - sizeof(spdm_chunk_send_ack_response_t);
     216            1 :     assert_int_equal(algorithms_response->header.request_response_code, SPDM_ALGORITHMS);
     217              : 
     218            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     219            1 :     assert_int_equal(algorithms_response_size,
     220              :                      sizeof(spdm_algorithms_response_t) + 4 *
     221              :                      sizeof(spdm_negotiate_algorithms_common_struct_table_t));
     222            1 :     assert_int_equal(algorithms_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
     223            1 :     assert_int_equal(algorithms_response->header.request_response_code, SPDM_ALGORITHMS);
     224            1 :     assert_int_equal(algorithms_response->header.param1, 4);
     225            1 : }
     226              : 
     227              : /**
     228              :  * Test 1: Responder receives a CHUNK_SEND request without chunk capabilities.
     229              :  * Expected Behavior: Returns ERROR response message with an error code.
     230              :  **/
     231            1 : void libspdm_test_responder_chunk_send_ack_rsp_case1(void** state)
     232              : {
     233              :     libspdm_return_t status;
     234              : 
     235              :     libspdm_test_context_t* spdm_test_context;
     236              :     libspdm_context_t* spdm_context;
     237              : 
     238              :     size_t request_size;
     239              :     size_t response_size;
     240              : 
     241              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
     242              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     243              : 
     244              :     spdm_chunk_send_request_t* chunk_send_request;
     245              :     spdm_error_response_t* error_response;
     246              : 
     247              :     const uint8_t* chunk_src;
     248              :     uint8_t* chunk_dst;
     249              :     uint16_t chunk_num;
     250              :     uint32_t bytes_total;
     251              : 
     252            1 :     spdm_test_context = *state;
     253            1 :     spdm_context = spdm_test_context->spdm_context;
     254            1 :     spdm_test_context->case_id = 1;
     255              : 
     256            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
     257              : 
     258            1 :     spdm_context->local_context.capability.flags &=
     259              :         ~SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHUNK_CAP;
     260            1 :     spdm_context->connection_info.capability.flags |=
     261              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHUNK_CAP;
     262              : 
     263            1 :     chunk_num = 0;
     264            1 :     bytes_total = sizeof(m_libspdm_chunk_send_negotiate_algorithm_request1);
     265            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
     266              : 
     267            1 :     libspdm_zero_mem(request, sizeof(request));
     268            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
     269              : 
     270            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     271            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
     272            1 :     chunk_send_request->header.param1 = 0;
     273            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
     274            1 :     chunk_send_request->chunk_seq_no = chunk_num;
     275              : 
     276            1 :     *((uint32_t*) (chunk_send_request + 1)) = bytes_total;
     277            1 :     chunk_send_request->chunk_size =
     278            1 :         spdm_context->local_context.capability.data_transfer_size
     279            1 :         - sizeof(spdm_chunk_send_request_t) - sizeof(uint32_t);
     280              : 
     281            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
     282              : 
     283            1 :     request_size = sizeof(spdm_chunk_send_request_t)
     284              :                    + sizeof(uint32_t)
     285            1 :                    + chunk_send_request->chunk_size;
     286              : 
     287            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
     288            1 :                      chunk_src, chunk_send_request->chunk_size);
     289              : 
     290            1 :     response_size = sizeof(response);
     291            1 :     status = libspdm_get_response_chunk_send(
     292              :         spdm_context,
     293              :         request_size, request,
     294              :         &response_size, response);
     295              : 
     296            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     297            1 :     assert_true(response_size == sizeof(spdm_error_response_t));
     298              : 
     299            1 :     error_response = (spdm_error_response_t*) response;
     300            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
     301            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
     302            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_UNEXPECTED_REQUEST);
     303            1 :     assert_int_equal(error_response->header.param2, 0);
     304            1 : }
     305              : 
     306              : /**
     307              :  * Test 2: Responder receives a CHUNK_SEND request with bad response state.
     308              :  * Expected Behavior: Returns ERROR response message
     309              :  * with request_response_code as error code.
     310              :  **/
     311            1 : void libspdm_test_responder_chunk_send_ack_rsp_case2(void** state)
     312              : {
     313              :     libspdm_return_t status;
     314              : 
     315              :     libspdm_test_context_t* spdm_test_context;
     316              :     libspdm_context_t* spdm_context;
     317              : 
     318              :     size_t request_size;
     319              :     size_t response_size;
     320              : 
     321              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
     322              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     323              : 
     324              :     spdm_chunk_send_request_t* chunk_send_request;
     325              :     spdm_error_response_t* error_response;
     326              : 
     327              :     const uint8_t* chunk_src;
     328              :     uint8_t* chunk_dst;
     329              :     uint16_t chunk_num;
     330              :     uint32_t bytes_total;
     331              : 
     332            1 :     spdm_test_context = *state;
     333            1 :     spdm_context = spdm_test_context->spdm_context;
     334            1 :     spdm_test_context->case_id = 2;
     335              : 
     336            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
     337              : 
     338            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_BUSY;
     339              : 
     340            1 :     chunk_num = 0;
     341            1 :     bytes_total = sizeof(m_libspdm_chunk_send_negotiate_algorithm_request1);
     342            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
     343              : 
     344            1 :     libspdm_zero_mem(request, sizeof(request));
     345            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
     346              : 
     347            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     348            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
     349            1 :     chunk_send_request->header.param1 = 0;
     350            1 :     chunk_send_request->header.param2 = (uint8_t)spdm_test_context->case_id; /* chunk_handle */
     351            1 :     chunk_send_request->chunk_seq_no = chunk_num;
     352              : 
     353            1 :     *((uint32_t*) (chunk_send_request + 1)) = bytes_total;
     354            1 :     chunk_send_request->chunk_size =
     355            1 :         spdm_context->local_context.capability.data_transfer_size
     356            1 :         - sizeof(spdm_chunk_send_request_t) - sizeof(uint32_t);
     357              : 
     358            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
     359              : 
     360            1 :     request_size = sizeof(spdm_chunk_send_request_t)
     361              :                    + sizeof(uint32_t)
     362            1 :                    + chunk_send_request->chunk_size;
     363              : 
     364            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
     365            1 :                      chunk_src, chunk_send_request->chunk_size);
     366              : 
     367            1 :     response_size = sizeof(response);
     368            1 :     status = libspdm_get_response_chunk_send(
     369              :         spdm_context,
     370              :         request_size, request,
     371              :         &response_size, response);
     372              : 
     373            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     374            1 :     assert_true(response_size == sizeof(spdm_error_response_t));
     375              : 
     376            1 :     error_response = (spdm_error_response_t*) response;
     377            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
     378            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
     379            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_BUSY);
     380            1 :     assert_int_equal(error_response->header.param2, 0);
     381            1 : }
     382              : 
     383              : /**
     384              :  * Test 3: Responder receives a CHUNK_SEND request with bad connection state.
     385              :  * Expected Behavior: Returns ERROR response message
     386              :  * with SPDM_ERROR_CODE_UNEXPECTED_REQUEST error code.
     387              :  **/
     388            1 : void libspdm_test_responder_chunk_send_ack_rsp_case3(void** state)
     389              : {
     390              :     libspdm_return_t status;
     391              : 
     392              :     libspdm_test_context_t* spdm_test_context;
     393              :     libspdm_context_t* spdm_context;
     394              : 
     395              :     size_t request_size;
     396              :     size_t response_size;
     397              : 
     398              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
     399              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     400              : 
     401              :     spdm_chunk_send_request_t* chunk_send_request;
     402              :     spdm_error_response_t* error_response;
     403              : 
     404              :     const uint8_t* chunk_src;
     405              :     uint8_t* chunk_dst;
     406              :     uint16_t chunk_num;
     407              :     uint32_t bytes_total;
     408              : 
     409            1 :     spdm_test_context = *state;
     410            1 :     spdm_context = spdm_test_context->spdm_context;
     411            1 :     spdm_test_context->case_id = 3;
     412              : 
     413            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
     414              : 
     415              :     spdm_context->connection_info.connection_state
     416            1 :         = LIBSPDM_CONNECTION_STATE_AFTER_CAPABILITIES - 1;
     417              : 
     418            1 :     chunk_num = 0;
     419            1 :     bytes_total = sizeof(m_libspdm_chunk_send_negotiate_algorithm_request1);
     420            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
     421              : 
     422            1 :     libspdm_zero_mem(request, sizeof(request));
     423            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
     424              : 
     425            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     426            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
     427            1 :     chunk_send_request->header.param1 = 0;
     428            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
     429            1 :     chunk_send_request->chunk_seq_no = chunk_num;
     430              : 
     431            1 :     *((uint32_t*) (chunk_send_request + 1)) = bytes_total;
     432            1 :     chunk_send_request->chunk_size =
     433            1 :         spdm_context->local_context.capability.data_transfer_size
     434            1 :         - sizeof(spdm_chunk_send_request_t) - sizeof(uint32_t);
     435              : 
     436            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
     437              : 
     438            1 :     request_size = sizeof(spdm_chunk_send_request_t)
     439              :                    + sizeof(uint32_t)
     440            1 :                    + chunk_send_request->chunk_size;
     441              : 
     442            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
     443            1 :                      chunk_src, chunk_send_request->chunk_size);
     444              : 
     445            1 :     response_size = sizeof(response);
     446            1 :     status = libspdm_get_response_chunk_send(
     447              :         spdm_context,
     448              :         request_size, request,
     449              :         &response_size, response);
     450              : 
     451            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     452            1 :     assert_true(response_size == sizeof(spdm_error_response_t));
     453              : 
     454            1 :     error_response = (spdm_error_response_t*) response;
     455            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
     456            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
     457            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_UNEXPECTED_REQUEST);
     458            1 :     assert_int_equal(error_response->header.param2, 0);
     459            1 : }
     460              : 
     461              : 
     462              : /**
     463              :  * Test 4: Responder receives a CHUNK_SEND request with bad size.
     464              :  * Expected Behavior: Returns ERROR response message
     465              :  * with SPDM_ERROR_CODE_INVALID_REQUEST error code.
     466              :  **/
     467            1 : void libspdm_test_responder_chunk_send_ack_rsp_case4(void** state)
     468              : {
     469              :     libspdm_return_t status;
     470              : 
     471              :     libspdm_test_context_t* spdm_test_context;
     472              :     libspdm_context_t* spdm_context;
     473              : 
     474              :     size_t request_size;
     475              :     size_t response_size;
     476              : 
     477              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
     478              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     479              : 
     480              :     spdm_chunk_send_request_t* chunk_send_request;
     481              :     spdm_error_response_t* error_response;
     482              : 
     483              :     const uint8_t* chunk_src;
     484              :     uint8_t* chunk_dst;
     485              :     uint16_t chunk_num;
     486              :     uint32_t bytes_total;
     487              : 
     488            1 :     spdm_test_context = *state;
     489            1 :     spdm_context = spdm_test_context->spdm_context;
     490            1 :     spdm_test_context->case_id = 4;
     491              : 
     492            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
     493              : 
     494            1 :     chunk_num = 0;
     495            1 :     bytes_total = sizeof(m_libspdm_chunk_send_negotiate_algorithm_request1);
     496            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
     497              : 
     498            1 :     libspdm_zero_mem(request, sizeof(request));
     499            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
     500              : 
     501            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     502            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
     503            1 :     chunk_send_request->header.param1 = 0;
     504            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
     505            1 :     chunk_send_request->chunk_seq_no = chunk_num;
     506              : 
     507            1 :     *((uint32_t*) (chunk_send_request + 1)) = bytes_total;
     508            1 :     chunk_send_request->chunk_size =
     509            1 :         spdm_context->local_context.capability.data_transfer_size
     510            1 :         - sizeof(spdm_chunk_send_request_t) - sizeof(uint32_t);
     511              : 
     512            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
     513              : 
     514            1 :     request_size = sizeof(spdm_chunk_send_request_t)
     515              :                    + sizeof(uint32_t)
     516            1 :                    + chunk_send_request->chunk_size;
     517              : 
     518            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
     519            1 :                      chunk_src, chunk_send_request->chunk_size);
     520              : 
     521            1 :     response_size = sizeof(response);
     522            1 :     request_size = sizeof(spdm_chunk_send_request_t) - 1;
     523            1 :     status = libspdm_get_response_chunk_send(
     524              :         spdm_context,
     525              :         request_size, request,
     526              :         &response_size, response);
     527              : 
     528            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     529            1 :     assert_true(response_size == sizeof(spdm_error_response_t));
     530              : 
     531            1 :     error_response = (spdm_error_response_t*) response;
     532            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
     533            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
     534            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
     535            1 :     assert_int_equal(error_response->header.param2, 0);
     536            1 : }
     537              : /**
     538              :  * Test 5: Responder receives a CHUNK_SEND request SPDM version less than 1.2.
     539              :  * Expected Behavior: Returns ERROR response message
     540              :  * with SPDM_ERROR_CODE_UNSUPPORTED_REQUEST error code.
     541              :  **/
     542            1 : void libspdm_test_responder_chunk_send_ack_rsp_case5(void** state)
     543              : {
     544              :     libspdm_return_t status;
     545              : 
     546              :     libspdm_test_context_t* spdm_test_context;
     547              :     libspdm_context_t* spdm_context;
     548              : 
     549              :     size_t request_size;
     550              :     size_t response_size;
     551              : 
     552              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
     553              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     554              : 
     555              :     spdm_chunk_send_request_t* chunk_send_request;
     556              :     spdm_error_response_t* error_response;
     557              : 
     558              :     const uint8_t* chunk_src;
     559              :     uint8_t* chunk_dst;
     560              :     uint16_t chunk_num;
     561              :     uint32_t bytes_total;
     562              : 
     563            1 :     spdm_test_context = *state;
     564            1 :     spdm_context = spdm_test_context->spdm_context;
     565            1 :     spdm_test_context->case_id = 5;
     566              : 
     567            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
     568              : 
     569            1 :     chunk_num = 0;
     570            1 :     bytes_total = sizeof(m_libspdm_chunk_send_negotiate_algorithm_request1);
     571            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
     572              : 
     573            1 :     libspdm_zero_mem(request, sizeof(request));
     574            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
     575              : 
     576            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     577            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
     578            1 :     chunk_send_request->header.param1 = 0;
     579            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
     580            1 :     chunk_send_request->chunk_seq_no = chunk_num;
     581              : 
     582            1 :     *((uint32_t*) (chunk_send_request + 1)) = bytes_total;
     583            1 :     chunk_send_request->chunk_size =
     584            1 :         spdm_context->local_context.capability.data_transfer_size
     585            1 :         - sizeof(spdm_chunk_send_request_t) - sizeof(uint32_t);
     586              : 
     587            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
     588              : 
     589            1 :     request_size = sizeof(spdm_chunk_send_request_t)
     590              :                    + sizeof(uint32_t)
     591            1 :                    + chunk_send_request->chunk_size;
     592              : 
     593            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
     594            1 :                      chunk_src, chunk_send_request->chunk_size);
     595              : 
     596            1 :     response_size = sizeof(response);
     597            1 :     status = libspdm_get_response_chunk_send(
     598              :         spdm_context,
     599              :         request_size, request,
     600              :         &response_size, response);
     601              : 
     602            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     603            1 :     assert_true(response_size == sizeof(spdm_error_response_t));
     604              : 
     605            1 :     error_response = (spdm_error_response_t*) response;
     606            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
     607            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
     608            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_UNSUPPORTED_REQUEST);
     609            1 :     assert_int_equal(error_response->header.param2, SPDM_CHUNK_SEND);
     610            1 : }
     611              : /**
     612              :  * Test 6: Responder receives a CHUNK_SEND request with wrong SPDM version.
     613              :  * Expected Behavior: Returns ERROR response message
     614              :  * with SPDM_ERROR_CODE_VERSION_MISMATCH error code.
     615              :  **/
     616            1 : void libspdm_test_responder_chunk_send_ack_rsp_case6(void** state)
     617              : {
     618              :     libspdm_return_t status;
     619              : 
     620              :     libspdm_test_context_t* spdm_test_context;
     621              :     libspdm_context_t* spdm_context;
     622              : 
     623              :     size_t request_size;
     624              :     size_t response_size;
     625              : 
     626              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
     627              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     628              : 
     629              :     spdm_chunk_send_request_t* chunk_send_request;
     630              :     spdm_error_response_t* error_response;
     631              : 
     632              :     const uint8_t* chunk_src;
     633              :     uint8_t* chunk_dst;
     634              :     uint16_t chunk_num;
     635              :     uint32_t bytes_total;
     636              : 
     637            1 :     spdm_test_context = *state;
     638            1 :     spdm_context = spdm_test_context->spdm_context;
     639            1 :     spdm_test_context->case_id = 6;
     640              : 
     641            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
     642              : 
     643            1 :     chunk_num = 0;
     644            1 :     bytes_total = sizeof(m_libspdm_chunk_send_negotiate_algorithm_request1);
     645            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
     646              : 
     647            1 :     libspdm_zero_mem(request, sizeof(request));
     648            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
     649              : 
     650            1 :     chunk_send_request->header.spdm_version = 0x13;
     651            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
     652            1 :     chunk_send_request->header.param1 = 0;
     653            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
     654            1 :     chunk_send_request->chunk_seq_no = chunk_num;
     655              : 
     656            1 :     *((uint32_t*) (chunk_send_request + 1)) = bytes_total;
     657            1 :     chunk_send_request->chunk_size =
     658            1 :         spdm_context->local_context.capability.data_transfer_size
     659            1 :         - sizeof(spdm_chunk_send_request_t) - sizeof(uint32_t);
     660              : 
     661            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
     662              : 
     663            1 :     request_size = sizeof(spdm_chunk_send_request_t)
     664              :                    + sizeof(uint32_t)
     665            1 :                    + chunk_send_request->chunk_size;
     666              : 
     667            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
     668            1 :                      chunk_src, chunk_send_request->chunk_size);
     669              : 
     670            1 :     response_size = sizeof(response);
     671            1 :     status = libspdm_get_response_chunk_send(
     672              :         spdm_context,
     673              :         request_size, request,
     674              :         &response_size, response);
     675              : 
     676            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     677            1 :     assert_true(response_size == sizeof(spdm_error_response_t));
     678              : 
     679            1 :     error_response = (spdm_error_response_t*) response;
     680            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
     681            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
     682            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_VERSION_MISMATCH);
     683            1 :     assert_int_equal(error_response->header.param2, 0);
     684            1 : }
     685              : 
     686              : /**
     687              :  * Test 7: Responder gets chunk send when chunk get already in use.
     688              :  **/
     689            1 : void libspdm_test_responder_chunk_send_ack_rsp_case7(void** state)
     690              : {
     691              :     libspdm_return_t status;
     692              : 
     693              :     libspdm_test_context_t* spdm_test_context;
     694              :     libspdm_context_t* spdm_context;
     695              : 
     696              :     size_t request_size;
     697              :     size_t response_size;
     698              : 
     699              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
     700              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     701              : 
     702              :     spdm_chunk_send_request_t* chunk_send_request;
     703              :     spdm_error_response_t* error_response;
     704              : 
     705              :     const uint8_t* chunk_src;
     706              :     uint8_t* chunk_dst;
     707              :     uint16_t chunk_num;
     708              :     uint32_t bytes_total;
     709              : 
     710            1 :     spdm_test_context = *state;
     711            1 :     spdm_context = spdm_test_context->spdm_context;
     712            1 :     spdm_test_context->case_id = 7;
     713              : 
     714            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
     715            1 :     spdm_context->chunk_context.get.chunk_in_use = true;
     716              : 
     717            1 :     chunk_num = 0;
     718            1 :     bytes_total = sizeof(m_libspdm_chunk_send_negotiate_algorithm_request1);
     719            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
     720              : 
     721            1 :     libspdm_zero_mem(request, sizeof(request));
     722            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
     723              : 
     724            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     725            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
     726            1 :     chunk_send_request->header.param1 = 0;
     727            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
     728            1 :     chunk_send_request->chunk_seq_no = chunk_num;
     729              : 
     730            1 :     *((uint32_t*) (chunk_send_request + 1)) = bytes_total;
     731            1 :     chunk_send_request->chunk_size =
     732            1 :         spdm_context->local_context.capability.data_transfer_size
     733            1 :         - sizeof(spdm_chunk_send_request_t) - sizeof(uint32_t);
     734              : 
     735            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
     736              : 
     737            1 :     request_size = sizeof(spdm_chunk_send_request_t)
     738              :                    + sizeof(uint32_t)
     739            1 :                    + chunk_send_request->chunk_size;
     740              : 
     741            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
     742            1 :                      chunk_src, chunk_send_request->chunk_size);
     743              : 
     744            1 :     response_size = sizeof(response);
     745            1 :     status = libspdm_get_response_chunk_send(
     746              :         spdm_context,
     747              :         request_size, request,
     748              :         &response_size, response);
     749              : 
     750            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     751            1 :     assert_true(response_size == sizeof(spdm_error_response_t));
     752              : 
     753            1 :     error_response = (spdm_error_response_t*) response;
     754            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
     755            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
     756            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_UNEXPECTED_REQUEST);
     757            1 :     assert_int_equal(error_response->header.param2, 0);
     758              : 
     759            1 :     spdm_context->chunk_context.get.chunk_in_use = false;
     760            1 : }
     761              : 
     762              : /**
     763              :  * Test 8: First request has bad sequence number.
     764              :  **/
     765            1 : void libspdm_test_responder_chunk_send_ack_rsp_case8(void** state)
     766              : {
     767              :     libspdm_return_t status;
     768              : 
     769              :     libspdm_test_context_t* spdm_test_context;
     770              :     libspdm_context_t* spdm_context;
     771              : 
     772              :     size_t request_size;
     773              :     size_t response_size;
     774              : 
     775              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
     776              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     777              : 
     778              :     spdm_chunk_send_request_t *chunk_send_request;
     779              :     spdm_chunk_send_ack_response_t *chunk_send_ack_response;
     780              :     spdm_error_response_t *error_response;
     781              : 
     782              :     const uint8_t *chunk_src;
     783              :     uint8_t *chunk_dst;
     784              :     uint32_t bytes_total;
     785              : 
     786            1 :     spdm_test_context = *state;
     787            1 :     spdm_context = spdm_test_context->spdm_context;
     788            1 :     spdm_test_context->case_id = 8;
     789              : 
     790            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
     791              : 
     792            1 :     bytes_total = sizeof(m_libspdm_chunk_send_negotiate_algorithm_request1);
     793            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
     794              : 
     795            1 :     libspdm_zero_mem(request, sizeof(request));
     796            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
     797              : 
     798            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     799            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
     800            1 :     chunk_send_request->header.param1 = 0;
     801            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
     802            1 :     chunk_send_request->chunk_seq_no = 1; /* Bad seq num */
     803              : 
     804            1 :     *((uint32_t*) (chunk_send_request + 1)) = bytes_total;
     805            1 :     chunk_send_request->chunk_size =
     806            1 :         spdm_context->local_context.capability.data_transfer_size
     807            1 :         - sizeof(spdm_chunk_send_request_t) - sizeof(uint32_t);
     808              : 
     809            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
     810              : 
     811            1 :     request_size = sizeof(spdm_chunk_send_request_t)
     812              :                    + sizeof(uint32_t)
     813            1 :                    + chunk_send_request->chunk_size;
     814              : 
     815            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
     816            1 :                      chunk_src, chunk_send_request->chunk_size);
     817              : 
     818            1 :     response_size = sizeof(response);
     819            1 :     status = libspdm_get_response_chunk_send(
     820              :         spdm_context,
     821              :         request_size, request,
     822              :         &response_size, response);
     823              : 
     824            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
     825            1 :     assert_true(response_size == sizeof(spdm_chunk_send_ack_response_t)
     826              :                 + sizeof(spdm_error_response_t));
     827              : 
     828            1 :     chunk_send_ack_response = (spdm_chunk_send_ack_response_t*) response;
     829            1 :     assert_int_equal(chunk_send_ack_response->header.param1,
     830              :                      SPDM_CHUNK_SEND_ACK_RESPONSE_ATTRIBUTE_EARLY_ERROR_DETECTED);
     831              : 
     832            1 :     error_response = (spdm_error_response_t*) (chunk_send_ack_response + 1);
     833            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
     834            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
     835            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
     836            1 :     assert_int_equal(error_response->header.param2, 0);
     837            1 : }
     838              : 
     839              : /**
     840              :  * Test 9: First request has chunk size too large.
     841              :  **/
     842            1 : void libspdm_test_responder_chunk_send_ack_rsp_case9(void** state)
     843              : {
     844              :     libspdm_return_t status;
     845              : 
     846              :     libspdm_test_context_t* spdm_test_context;
     847              :     libspdm_context_t* spdm_context;
     848              : 
     849              :     size_t request_size;
     850              :     size_t response_size;
     851              : 
     852              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
     853              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     854              : 
     855              :     spdm_chunk_send_request_t* chunk_send_request;
     856              :     spdm_chunk_send_ack_response_t* chunk_send_ack_response;
     857              :     spdm_error_response_t* error_response;
     858              : 
     859              :     const uint8_t* chunk_src;
     860              :     uint8_t* chunk_dst;
     861              :     uint32_t bytes_total;
     862              : 
     863            1 :     spdm_test_context = *state;
     864            1 :     spdm_context = spdm_test_context->spdm_context;
     865            1 :     spdm_test_context->case_id = 9;
     866              : 
     867            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
     868              : 
     869            1 :     bytes_total = sizeof(m_libspdm_chunk_send_negotiate_algorithm_request1);
     870            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
     871              : 
     872            1 :     libspdm_zero_mem(request, sizeof(request));
     873            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
     874              : 
     875            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     876            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
     877            1 :     chunk_send_request->header.param1 = 0;
     878            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
     879            1 :     chunk_send_request->chunk_seq_no = 0;
     880              : 
     881            1 :     *((uint32_t*) (chunk_send_request + 1)) = bytes_total;
     882            1 :     chunk_send_request->chunk_size =
     883            1 :         spdm_context->local_context.capability.data_transfer_size
     884            1 :         - sizeof(spdm_chunk_send_request_t) - sizeof(uint32_t);
     885              : 
     886            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
     887              : 
     888            1 :     request_size = sizeof(spdm_chunk_send_request_t)
     889              :                    + sizeof(uint32_t)
     890            1 :                    + chunk_send_request->chunk_size;
     891              : 
     892            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
     893            1 :                      chunk_src, chunk_send_request->chunk_size);
     894              : 
     895            1 :     chunk_send_request->chunk_size += 1; /* chunk size too large */
     896              : 
     897            1 :     response_size = sizeof(response);
     898            1 :     status = libspdm_get_response_chunk_send(
     899              :         spdm_context,
     900              :         request_size, request,
     901              :         &response_size, response);
     902              : 
     903            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
     904            1 :     assert_true(response_size == sizeof(spdm_chunk_send_ack_response_t)
     905              :                 + sizeof(spdm_error_response_t));
     906              : 
     907            1 :     chunk_send_ack_response = (spdm_chunk_send_ack_response_t*) response;
     908            1 :     assert_int_equal(chunk_send_ack_response->header.param1,
     909              :                      SPDM_CHUNK_SEND_ACK_RESPONSE_ATTRIBUTE_EARLY_ERROR_DETECTED);
     910              : 
     911            1 :     error_response = (spdm_error_response_t*) (chunk_send_ack_response + 1);
     912            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
     913            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
     914            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
     915            1 :     assert_int_equal(error_response->header.param2, 0);
     916            1 : }
     917              : 
     918              : /**
     919              :  * Test 10: First request has size larger than data transfer size.
     920              :  **/
     921            1 : void libspdm_test_responder_chunk_send_ack_rsp_case10(void** state)
     922              : {
     923              :     libspdm_return_t status;
     924              : 
     925              :     libspdm_test_context_t* spdm_test_context;
     926              :     libspdm_context_t* spdm_context;
     927              : 
     928              :     size_t request_size;
     929              :     size_t response_size;
     930              : 
     931              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
     932              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     933              : 
     934              :     spdm_chunk_send_request_t* chunk_send_request;
     935              :     spdm_chunk_send_ack_response_t* chunk_send_ack_response;
     936              :     spdm_error_response_t* error_response;
     937              : 
     938              :     const uint8_t* chunk_src;
     939              :     uint8_t* chunk_dst;
     940              :     uint32_t bytes_total;
     941              : 
     942            1 :     spdm_test_context = *state;
     943            1 :     spdm_context = spdm_test_context->spdm_context;
     944            1 :     spdm_test_context->case_id = 10;
     945              : 
     946            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
     947              : 
     948            1 :     bytes_total = sizeof(m_libspdm_chunk_send_negotiate_algorithm_request1);
     949            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
     950              : 
     951            1 :     libspdm_zero_mem(request, sizeof(request));
     952            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
     953              : 
     954            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     955            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
     956            1 :     chunk_send_request->header.param1 = 0;
     957            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
     958            1 :     chunk_send_request->chunk_seq_no = 0;
     959              : 
     960            1 :     *((uint32_t*) (chunk_send_request + 1)) = bytes_total;
     961            1 :     chunk_send_request->chunk_size =
     962            1 :         spdm_context->local_context.capability.data_transfer_size
     963            1 :         - sizeof(spdm_chunk_send_request_t) - sizeof(uint32_t);
     964              : 
     965            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
     966              : 
     967            1 :     request_size = sizeof(spdm_chunk_send_request_t)
     968              :                    + sizeof(uint32_t)
     969            1 :                    + chunk_send_request->chunk_size
     970              :                    + 1; /* Request size too large */
     971              : 
     972            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
     973            1 :                      chunk_src, chunk_send_request->chunk_size);
     974              : 
     975            1 :     response_size = sizeof(response);
     976            1 :     status = libspdm_get_response_chunk_send(
     977              :         spdm_context,
     978              :         request_size, request,
     979              :         &response_size, response);
     980              : 
     981            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
     982            1 :     assert_true(response_size == sizeof(spdm_chunk_send_ack_response_t)
     983              :                 + sizeof(spdm_error_response_t));
     984              : 
     985            1 :     chunk_send_ack_response = (spdm_chunk_send_ack_response_t*) response;
     986            1 :     assert_int_equal(chunk_send_ack_response->header.param1,
     987              :                      SPDM_CHUNK_SEND_ACK_RESPONSE_ATTRIBUTE_EARLY_ERROR_DETECTED);
     988              : 
     989            1 :     error_response = (spdm_error_response_t*) (chunk_send_ack_response + 1);
     990            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
     991            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
     992            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
     993            1 :     assert_int_equal(error_response->header.param2, 0);
     994            1 : }
     995              : 
     996              : /**
     997              :  * Test 11: First request has LAST CHUNK bit set.
     998              :  **/
     999            1 : void libspdm_test_responder_chunk_send_ack_rsp_case11(void** state)
    1000              : {
    1001              :     libspdm_return_t status;
    1002              : 
    1003              :     libspdm_test_context_t* spdm_test_context;
    1004              :     libspdm_context_t* spdm_context;
    1005              : 
    1006              :     size_t request_size;
    1007              :     size_t response_size;
    1008              : 
    1009              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1010              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1011              : 
    1012              :     spdm_chunk_send_request_t* chunk_send_request;
    1013              :     spdm_chunk_send_ack_response_t* chunk_send_ack_response;
    1014              :     spdm_error_response_t* error_response;
    1015              : 
    1016              :     const uint8_t* chunk_src;
    1017              :     uint8_t* chunk_dst;
    1018              : 
    1019            1 :     spdm_test_context = *state;
    1020            1 :     spdm_context = spdm_test_context->spdm_context;
    1021            1 :     spdm_test_context->case_id = 11;
    1022              : 
    1023            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
    1024              : 
    1025            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
    1026              : 
    1027            1 :     libspdm_zero_mem(request, sizeof(request));
    1028            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
    1029              : 
    1030            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1031            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
    1032            1 :     chunk_send_request->header.param1 = 0;
    1033            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
    1034            1 :     chunk_send_request->chunk_seq_no = 0;
    1035              : 
    1036            1 :     *((uint32_t*) (chunk_send_request + 1)) = LIBSPDM_MAX_SPDM_MSG_SIZE + 1;
    1037              : 
    1038            1 :     chunk_send_request->chunk_size =
    1039            1 :         spdm_context->local_context.capability.data_transfer_size
    1040            1 :         - sizeof(spdm_chunk_send_request_t) - sizeof(uint32_t);
    1041              : 
    1042            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
    1043              : 
    1044            1 :     request_size = sizeof(spdm_chunk_send_request_t)
    1045              :                    + sizeof(uint32_t)
    1046            1 :                    + chunk_send_request->chunk_size;
    1047              : 
    1048            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
    1049            1 :                      chunk_src, chunk_send_request->chunk_size);
    1050              : 
    1051            1 :     response_size = sizeof(response);
    1052            1 :     status = libspdm_get_response_chunk_send(
    1053              :         spdm_context,
    1054              :         request_size, request,
    1055              :         &response_size, response);
    1056              : 
    1057            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
    1058            1 :     assert_true(response_size == sizeof(spdm_chunk_send_ack_response_t)
    1059              :                 + sizeof(spdm_error_response_t));
    1060              : 
    1061            1 :     chunk_send_ack_response = (spdm_chunk_send_ack_response_t*) response;
    1062            1 :     assert_int_equal(chunk_send_ack_response->header.param1,
    1063              :                      SPDM_CHUNK_SEND_ACK_RESPONSE_ATTRIBUTE_EARLY_ERROR_DETECTED);
    1064              : 
    1065            1 :     error_response = (spdm_error_response_t*) (chunk_send_ack_response + 1);
    1066            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
    1067            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
    1068            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1069            1 :     assert_int_equal(error_response->header.param2, 0);
    1070            1 : }
    1071              : 
    1072              : /**
    1073              :  * Test 12: First request has LAST CHUNK bit set.
    1074              :  **/
    1075            1 : void libspdm_test_responder_chunk_send_ack_rsp_case12(void** state)
    1076              : {
    1077              :     libspdm_return_t status;
    1078              : 
    1079              :     libspdm_test_context_t* spdm_test_context;
    1080              :     libspdm_context_t* spdm_context;
    1081              : 
    1082              :     size_t request_size;
    1083              :     size_t response_size;
    1084              : 
    1085              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1086              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1087              : 
    1088              :     spdm_chunk_send_request_t* chunk_send_request;
    1089              :     spdm_chunk_send_ack_response_t* chunk_send_ack_response;
    1090              :     spdm_error_response_t* error_response;
    1091              : 
    1092              :     const uint8_t* chunk_src;
    1093              :     uint8_t* chunk_dst;
    1094              :     uint32_t bytes_total;
    1095              : 
    1096            1 :     spdm_test_context = *state;
    1097            1 :     spdm_context = spdm_test_context->spdm_context;
    1098            1 :     spdm_test_context->case_id = 12;
    1099              : 
    1100            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
    1101              : 
    1102            1 :     bytes_total = sizeof(m_libspdm_chunk_send_negotiate_algorithm_request1);
    1103            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
    1104              : 
    1105            1 :     libspdm_zero_mem(request, sizeof(request));
    1106            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
    1107              : 
    1108            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1109            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
    1110            1 :     chunk_send_request->header.param1 = SPDM_CHUNK_SEND_REQUEST_ATTRIBUTE_LAST_CHUNK;
    1111            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
    1112            1 :     chunk_send_request->chunk_seq_no = 0;
    1113              : 
    1114            1 :     *((uint32_t*) (chunk_send_request + 1)) = bytes_total;
    1115              : 
    1116            1 :     chunk_send_request->chunk_size =
    1117            1 :         spdm_context->local_context.capability.data_transfer_size
    1118            1 :         - sizeof(spdm_chunk_send_request_t) - sizeof(uint32_t);
    1119              : 
    1120            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
    1121              : 
    1122            1 :     request_size = sizeof(spdm_chunk_send_request_t)
    1123              :                    + sizeof(uint32_t)
    1124            1 :                    + chunk_send_request->chunk_size;
    1125              : 
    1126            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
    1127            1 :                      chunk_src, chunk_send_request->chunk_size);
    1128              : 
    1129            1 :     response_size = sizeof(response);
    1130            1 :     status = libspdm_get_response_chunk_send(
    1131              :         spdm_context,
    1132              :         request_size, request,
    1133              :         &response_size, response);
    1134              : 
    1135            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
    1136            1 :     assert_true(response_size == sizeof(spdm_chunk_send_ack_response_t)
    1137              :                 + sizeof(spdm_error_response_t));
    1138              : 
    1139            1 :     chunk_send_ack_response = (spdm_chunk_send_ack_response_t*) response;
    1140            1 :     assert_int_equal(chunk_send_ack_response->header.param1,
    1141              :                      SPDM_CHUNK_SEND_ACK_RESPONSE_ATTRIBUTE_EARLY_ERROR_DETECTED);
    1142              : 
    1143            1 :     error_response = (spdm_error_response_t*) (chunk_send_ack_response + 1);
    1144            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
    1145            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
    1146            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1147            1 :     assert_int_equal(error_response->header.param2, 0);
    1148            1 : }
    1149              : 
    1150            9 : void libspdm_test_responder_chunk_send_ack_reset_send_state(libspdm_context_t* spdm_context)
    1151              : {
    1152              :     libspdm_chunk_info_t* send_info;
    1153              : 
    1154            9 :     send_info = &spdm_context->chunk_context.send;
    1155            9 :     send_info->chunk_in_use = false;
    1156            9 :     send_info->chunk_handle = 0;
    1157            9 :     send_info->chunk_seq_no = 0;
    1158            9 :     send_info->chunk_bytes_transferred = 0;
    1159            9 :     send_info->large_message = NULL;
    1160            9 :     send_info->large_message_size = 0;
    1161            9 : }
    1162              : 
    1163              : /**
    1164              :  * Test 13: Request has bad sequence number.
    1165              :  **/
    1166            1 : void libspdm_test_responder_chunk_send_ack_rsp_case13(void** state)
    1167              : {
    1168              :     libspdm_return_t status;
    1169              : 
    1170              :     libspdm_test_context_t* spdm_test_context;
    1171              :     libspdm_context_t* spdm_context;
    1172              : 
    1173              :     size_t request_size;
    1174              :     size_t response_size;
    1175              : 
    1176              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1177              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1178              : 
    1179              :     spdm_chunk_send_request_t* chunk_send_request;
    1180              :     spdm_chunk_send_ack_response_t* chunk_send_ack_response;
    1181              :     spdm_error_response_t* error_response;
    1182              : 
    1183              :     const uint8_t* chunk_src;
    1184              :     uint8_t* chunk_dst;
    1185              : 
    1186            1 :     spdm_test_context = *state;
    1187            1 :     spdm_context = spdm_test_context->spdm_context;
    1188            1 :     spdm_test_context->case_id = 13;
    1189              : 
    1190            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
    1191            1 :     spdm_context->chunk_context.send.chunk_in_use = true;
    1192            1 :     spdm_context->chunk_context.send.chunk_handle = (uint8_t) spdm_test_context->case_id;
    1193            1 :     spdm_context->chunk_context.send.chunk_seq_no = 0;
    1194              : 
    1195            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
    1196              : 
    1197            1 :     libspdm_zero_mem(request, sizeof(request));
    1198            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
    1199              : 
    1200            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1201            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
    1202            1 :     chunk_send_request->header.param1 = 0;
    1203            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
    1204            1 :     chunk_send_request->chunk_seq_no = 2; /* Bad seq num */
    1205              : 
    1206            1 :     chunk_send_request->chunk_size =
    1207            1 :         spdm_context->local_context.capability.data_transfer_size
    1208            1 :         - sizeof(spdm_chunk_send_request_t);
    1209              : 
    1210            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1));
    1211              : 
    1212            1 :     request_size = sizeof(spdm_chunk_send_request_t)
    1213            1 :                    + chunk_send_request->chunk_size;
    1214              : 
    1215            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
    1216            1 :                      chunk_src, chunk_send_request->chunk_size);
    1217              : 
    1218            1 :     response_size = sizeof(response);
    1219            1 :     status = libspdm_get_response_chunk_send(
    1220              :         spdm_context,
    1221              :         request_size, request,
    1222              :         &response_size, response);
    1223              : 
    1224            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
    1225            1 :     assert_true(response_size == sizeof(spdm_chunk_send_ack_response_t)
    1226              :                 + sizeof(spdm_error_response_t));
    1227              : 
    1228            1 :     chunk_send_ack_response = (spdm_chunk_send_ack_response_t*) response;
    1229            1 :     assert_int_equal(chunk_send_ack_response->header.param1,
    1230              :                      SPDM_CHUNK_SEND_ACK_RESPONSE_ATTRIBUTE_EARLY_ERROR_DETECTED);
    1231              : 
    1232            1 :     error_response = (spdm_error_response_t*) (chunk_send_ack_response + 1);
    1233            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
    1234            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
    1235            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1236            1 :     assert_int_equal(error_response->header.param2, 0);
    1237              : 
    1238            1 :     libspdm_test_responder_chunk_send_ack_reset_send_state(spdm_context);
    1239            1 : }
    1240              : 
    1241              : /**
    1242              :  * Test 14: Request has bad chunk handle.
    1243              :  **/
    1244            1 : void libspdm_test_responder_chunk_send_ack_rsp_case14(void** state)
    1245              : {
    1246              :     libspdm_return_t status;
    1247              : 
    1248              :     libspdm_test_context_t* spdm_test_context;
    1249              :     libspdm_context_t* spdm_context;
    1250              : 
    1251              :     size_t request_size;
    1252              :     size_t response_size;
    1253              : 
    1254              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1255              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1256              : 
    1257              :     spdm_chunk_send_request_t* chunk_send_request;
    1258              :     spdm_chunk_send_ack_response_t* chunk_send_ack_response;
    1259              :     spdm_error_response_t* error_response;
    1260              : 
    1261              :     const uint8_t* chunk_src;
    1262              :     uint8_t* chunk_dst;
    1263              : 
    1264            1 :     spdm_test_context = *state;
    1265            1 :     spdm_context = spdm_test_context->spdm_context;
    1266            1 :     spdm_test_context->case_id = 14;
    1267              : 
    1268            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
    1269            1 :     spdm_context->chunk_context.send.chunk_in_use = true;
    1270            1 :     spdm_context->chunk_context.send.chunk_handle = (uint8_t) spdm_test_context->case_id;
    1271            1 :     spdm_context->chunk_context.send.chunk_seq_no = 0;
    1272              : 
    1273            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
    1274              : 
    1275            1 :     libspdm_zero_mem(request, sizeof(request));
    1276            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
    1277              : 
    1278            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1279            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
    1280            1 :     chunk_send_request->header.param1 = 0;
    1281            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id + 1; /* bad chunk_handle */
    1282            1 :     chunk_send_request->chunk_seq_no = 1;
    1283            1 :     chunk_send_request->chunk_size =
    1284            1 :         spdm_context->local_context.capability.data_transfer_size
    1285            1 :         - sizeof(spdm_chunk_send_request_t);
    1286              : 
    1287            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1));
    1288              : 
    1289            1 :     request_size = sizeof(spdm_chunk_send_request_t)
    1290            1 :                    + chunk_send_request->chunk_size;
    1291              : 
    1292            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
    1293            1 :                      chunk_src, chunk_send_request->chunk_size);
    1294              : 
    1295            1 :     response_size = sizeof(response);
    1296            1 :     status = libspdm_get_response_chunk_send(
    1297              :         spdm_context,
    1298              :         request_size, request,
    1299              :         &response_size, response);
    1300              : 
    1301            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
    1302            1 :     assert_true(response_size == sizeof(spdm_chunk_send_ack_response_t)
    1303              :                 + sizeof(spdm_error_response_t));
    1304              : 
    1305            1 :     chunk_send_ack_response = (spdm_chunk_send_ack_response_t*) response;
    1306            1 :     assert_int_equal(chunk_send_ack_response->header.param1,
    1307              :                      SPDM_CHUNK_SEND_ACK_RESPONSE_ATTRIBUTE_EARLY_ERROR_DETECTED);
    1308              : 
    1309            1 :     error_response = (spdm_error_response_t*) (chunk_send_ack_response + 1);
    1310            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
    1311            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
    1312            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1313            1 :     assert_int_equal(error_response->header.param2, 0);
    1314              : 
    1315            1 :     libspdm_test_responder_chunk_send_ack_reset_send_state(spdm_context);
    1316            1 : }
    1317              : 
    1318              : /**
    1319              :  * Test 15: Request has size larger than data transfer size.
    1320              :  **/
    1321            1 : void libspdm_test_responder_chunk_send_ack_rsp_case15(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 = 15;
    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; /* chunk_handle */
    1359            1 :     chunk_send_request->chunk_seq_no = 1;
    1360              : 
    1361            1 :     chunk_send_request->chunk_size =
    1362            1 :         spdm_context->local_context.capability.data_transfer_size
    1363            1 :         - sizeof(spdm_chunk_send_request_t);
    1364              : 
    1365            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1));
    1366              : 
    1367            1 :     request_size = sizeof(spdm_chunk_send_request_t)
    1368            1 :                    + chunk_send_request->chunk_size
    1369              :                    + 1; /* Request size too large */
    1370              : 
    1371            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
    1372            1 :                      chunk_src, chunk_send_request->chunk_size);
    1373              : 
    1374            1 :     response_size = sizeof(response);
    1375            1 :     status = libspdm_get_response_chunk_send(
    1376              :         spdm_context,
    1377              :         request_size, request,
    1378              :         &response_size, response);
    1379              : 
    1380            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
    1381            1 :     assert_true(response_size == sizeof(spdm_chunk_send_ack_response_t)
    1382              :                 + sizeof(spdm_error_response_t));
    1383              : 
    1384            1 :     chunk_send_ack_response = (spdm_chunk_send_ack_response_t*) response;
    1385            1 :     assert_int_equal(chunk_send_ack_response->header.param1,
    1386              :                      SPDM_CHUNK_SEND_ACK_RESPONSE_ATTRIBUTE_EARLY_ERROR_DETECTED);
    1387              : 
    1388            1 :     error_response = (spdm_error_response_t*) (chunk_send_ack_response + 1);
    1389            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
    1390            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
    1391            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1392            1 :     assert_int_equal(error_response->header.param2, 0);
    1393              : 
    1394            1 :     libspdm_test_responder_chunk_send_ack_reset_send_state(spdm_context);
    1395            1 : }
    1396              : 
    1397              : /**
    1398              :  * Test 16: Request has chunk size + transferred size > large message size
    1399              :  **/
    1400            1 : void libspdm_test_responder_chunk_send_ack_rsp_case16(void** state)
    1401              : {
    1402              :     libspdm_return_t status;
    1403              : 
    1404              :     libspdm_test_context_t* spdm_test_context;
    1405              :     libspdm_context_t* spdm_context;
    1406              : 
    1407              :     size_t request_size;
    1408              :     size_t response_size;
    1409              : 
    1410              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1411              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1412              : 
    1413              :     spdm_chunk_send_request_t* chunk_send_request;
    1414              :     spdm_chunk_send_ack_response_t* chunk_send_ack_response;
    1415              :     spdm_error_response_t* error_response;
    1416              : 
    1417              :     const uint8_t* chunk_src;
    1418              :     uint8_t* chunk_dst;
    1419              : 
    1420            1 :     spdm_test_context = *state;
    1421            1 :     spdm_context = spdm_test_context->spdm_context;
    1422            1 :     spdm_test_context->case_id = 16;
    1423              : 
    1424            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
    1425            1 :     spdm_context->chunk_context.send.chunk_in_use = true;
    1426            1 :     spdm_context->chunk_context.send.chunk_handle = (uint8_t) spdm_test_context->case_id;
    1427            1 :     spdm_context->chunk_context.send.chunk_seq_no = 0;
    1428            1 :     spdm_context->chunk_context.send.large_message_size = 1024;
    1429            1 :     spdm_context->chunk_context.send.chunk_bytes_transferred = 1023;
    1430              : 
    1431            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
    1432              : 
    1433            1 :     libspdm_zero_mem(request, sizeof(request));
    1434            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
    1435              : 
    1436            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1437            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
    1438            1 :     chunk_send_request->header.param1 = 0;
    1439            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
    1440            1 :     chunk_send_request->chunk_seq_no = 1;
    1441            1 :     chunk_send_request->chunk_size = 2; /* Bad size. Over large message size */
    1442              : 
    1443            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1));
    1444              : 
    1445            1 :     request_size = sizeof(spdm_chunk_send_request_t)
    1446            1 :                    + chunk_send_request->chunk_size;
    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_INVALID_MSG_FIELD);
    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 17: Request has LAST_CHUNK indicated before all bytes transferred.
    1476              :  **/
    1477            1 : void libspdm_test_responder_chunk_send_ack_rsp_case17(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 = 17;
    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 = 0;
    1518            1 :     chunk_send_request->chunk_size = 1;
    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_INVALID_MSG_FIELD);
    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 18: Request missing LAST_CHUNK after all bytes transferred.
    1553              :  **/
    1554            1 : void libspdm_test_responder_chunk_send_ack_rsp_case18(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 = 18;
    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 = 1022;
    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 = 2;
    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_INVALID_MSG_FIELD);
    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 19: Request missing LAST_CHUNK when request size != data transfer size.
    1630              :  **/
    1631            1 : void libspdm_test_responder_chunk_send_ack_rsp_case19(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 = 19;
    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 = 0;
    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 =
    1673            1 :         spdm_context->local_context.capability.data_transfer_size
    1674              :         - sizeof(spdm_chunk_send_request_t)
    1675            1 :         - 1; /* Chunk size too small. */
    1676              : 
    1677            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1));
    1678              : 
    1679            1 :     request_size = sizeof(spdm_chunk_send_request_t)
    1680            1 :                    + chunk_send_request->chunk_size;
    1681              : 
    1682            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
    1683            1 :                      chunk_src, chunk_send_request->chunk_size);
    1684              : 
    1685            1 :     response_size = sizeof(response);
    1686            1 :     status = libspdm_get_response_chunk_send(
    1687              :         spdm_context,
    1688              :         request_size, request,
    1689              :         &response_size, response);
    1690              : 
    1691            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
    1692            1 :     assert_true(response_size == sizeof(spdm_chunk_send_ack_response_t)
    1693              :                 + sizeof(spdm_error_response_t));
    1694              : 
    1695            1 :     chunk_send_ack_response = (spdm_chunk_send_ack_response_t*) response;
    1696            1 :     assert_int_equal(chunk_send_ack_response->header.param1,
    1697              :                      SPDM_CHUNK_SEND_ACK_RESPONSE_ATTRIBUTE_EARLY_ERROR_DETECTED);
    1698              : 
    1699            1 :     error_response = (spdm_error_response_t*) (chunk_send_ack_response + 1);
    1700            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
    1701            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
    1702            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1703            1 :     assert_int_equal(error_response->header.param2, 0);
    1704              : 
    1705            1 :     libspdm_test_responder_chunk_send_ack_reset_send_state(spdm_context);
    1706            1 : }
    1707              : 
    1708              : /**
    1709              :  *  Test 20: Request chunk seq wrapped.
    1710              :  **/
    1711            1 : void libspdm_test_responder_chunk_send_ack_rsp_case20(void** state)
    1712              : {
    1713              :     libspdm_return_t status;
    1714              : 
    1715              :     libspdm_test_context_t* spdm_test_context;
    1716              :     libspdm_context_t* spdm_context;
    1717              : 
    1718              :     size_t request_size;
    1719              :     size_t response_size;
    1720              : 
    1721              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1722              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1723              : 
    1724              :     spdm_chunk_send_request_t* chunk_send_request;
    1725              :     spdm_chunk_send_ack_response_t* chunk_send_ack_response;
    1726              :     spdm_error_response_t* error_response;
    1727              : 
    1728              :     const uint8_t* chunk_src;
    1729              :     uint8_t* chunk_dst;
    1730              : 
    1731              :     /* Format the last chunk. */
    1732            1 :     spdm_test_context = *state;
    1733            1 :     spdm_context = spdm_test_context->spdm_context;
    1734            1 :     spdm_test_context->case_id = 20;
    1735              : 
    1736            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
    1737            1 :     spdm_context->chunk_context.send.chunk_in_use = true;
    1738            1 :     spdm_context->chunk_context.send.chunk_handle = (uint8_t) spdm_test_context->case_id;
    1739            1 :     spdm_context->chunk_context.send.chunk_seq_no = 65535; /* maximum chunk seq received */
    1740            1 :     spdm_context->chunk_context.send.large_message_size = 0x10000;
    1741            1 :     spdm_context->chunk_context.send.chunk_bytes_transferred = 0x8000;
    1742              : 
    1743            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
    1744              : 
    1745            1 :     libspdm_zero_mem(request, sizeof(request));
    1746            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
    1747              : 
    1748            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1749            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
    1750            1 :     chunk_send_request->header.param1 = 0;
    1751            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
    1752            1 :     chunk_send_request->chunk_seq_no = 0; /* chunk seq wrapped */
    1753              : 
    1754            1 :     chunk_send_request->chunk_size =
    1755            1 :         spdm_context->local_context.capability.data_transfer_size
    1756            1 :         - sizeof(spdm_chunk_send_request_t);
    1757              : 
    1758            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1));
    1759              : 
    1760            1 :     request_size = sizeof(spdm_chunk_send_request_t)
    1761            1 :                    + chunk_send_request->chunk_size;
    1762              : 
    1763            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
    1764            1 :                      chunk_src, chunk_send_request->chunk_size);
    1765              : 
    1766            1 :     response_size = sizeof(response);
    1767            1 :     status = libspdm_get_response_chunk_send(
    1768              :         spdm_context,
    1769              :         request_size, request,
    1770              :         &response_size, response);
    1771              : 
    1772            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
    1773            1 :     assert_true(response_size == sizeof(spdm_chunk_send_ack_response_t)
    1774              :                 + sizeof(spdm_error_response_t));
    1775              : 
    1776            1 :     chunk_send_ack_response = (spdm_chunk_send_ack_response_t*) response;
    1777            1 :     assert_int_equal(chunk_send_ack_response->header.param1,
    1778              :                      SPDM_CHUNK_SEND_ACK_RESPONSE_ATTRIBUTE_EARLY_ERROR_DETECTED);
    1779              : 
    1780            1 :     error_response = (spdm_error_response_t*) (chunk_send_ack_response + 1);
    1781            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
    1782            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
    1783            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1784            1 :     assert_int_equal(error_response->header.param2, 0);
    1785              : 
    1786            1 :     libspdm_test_responder_chunk_send_ack_reset_send_state(spdm_context);
    1787            1 : }
    1788              : 
    1789              : /**
    1790              :  *  Test 21: Request size exceed max chunk seq no.
    1791              :  **/
    1792            1 : void libspdm_test_responder_chunk_send_ack_rsp_case21(void** state)
    1793              : {
    1794              :     libspdm_return_t status;
    1795              : 
    1796              :     libspdm_test_context_t* spdm_test_context;
    1797              :     libspdm_context_t* spdm_context;
    1798              : 
    1799              :     size_t request_size;
    1800              :     size_t response_size;
    1801              : 
    1802              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1803              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1804              : 
    1805              :     spdm_chunk_send_request_t* chunk_send_request;
    1806              :     spdm_chunk_send_ack_response_t* chunk_send_ack_response;
    1807              :     spdm_error_response_t* error_response;
    1808              : 
    1809              :     const uint8_t* chunk_src;
    1810              :     uint8_t* chunk_dst;
    1811              : 
    1812              :     /* Format the last chunk. */
    1813            1 :     spdm_test_context = *state;
    1814            1 :     spdm_context = spdm_test_context->spdm_context;
    1815            1 :     spdm_test_context->case_id = 21;
    1816              : 
    1817            1 :     libspdm_test_responder_chunk_send_ack_setup_algo_state(spdm_context);
    1818            1 :     chunk_src = (const uint8_t*) &m_libspdm_chunk_send_negotiate_algorithm_request1;
    1819              : 
    1820            1 :     libspdm_zero_mem(request, sizeof(request));
    1821            1 :     chunk_send_request = (spdm_chunk_send_request_t*) request;
    1822              : 
    1823            1 :     chunk_send_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1824            1 :     chunk_send_request->header.request_response_code = SPDM_CHUNK_SEND;
    1825            1 :     chunk_send_request->header.param1 = 0;
    1826            1 :     chunk_send_request->header.param2 = (uint8_t) spdm_test_context->case_id; /* chunk_handle */
    1827            1 :     chunk_send_request->chunk_seq_no = 0;
    1828              : 
    1829              : 
    1830            1 :     *((uint32_t*) (chunk_send_request + 1)) = 0x1000000; /* a size exceed max chunk seq */
    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) - sizeof(uint32_t);
    1834              : 
    1835            1 :     chunk_dst = ((uint8_t*) (chunk_send_request + 1)) + sizeof(uint32_t);
    1836              : 
    1837            1 :     request_size = sizeof(spdm_chunk_send_request_t)
    1838              :                    + sizeof(uint32_t)
    1839            1 :                    + chunk_send_request->chunk_size;
    1840              : 
    1841            1 :     libspdm_copy_mem(chunk_dst, chunk_send_request->chunk_size,
    1842            1 :                      chunk_src, chunk_send_request->chunk_size);
    1843              : 
    1844            1 :     response_size = sizeof(response);
    1845            1 :     status = libspdm_get_response_chunk_send(
    1846              :         spdm_context,
    1847              :         request_size, request,
    1848              :         &response_size, response);
    1849              : 
    1850            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
    1851            1 :     assert_true(response_size == sizeof(spdm_chunk_send_ack_response_t)
    1852              :                 + sizeof(spdm_error_response_t));
    1853              : 
    1854            1 :     chunk_send_ack_response = (spdm_chunk_send_ack_response_t*) response;
    1855            1 :     assert_int_equal(chunk_send_ack_response->header.param1,
    1856              :                      SPDM_CHUNK_SEND_ACK_RESPONSE_ATTRIBUTE_EARLY_ERROR_DETECTED);
    1857              : 
    1858            1 :     error_response = (spdm_error_response_t*) (chunk_send_ack_response + 1);
    1859            1 :     assert_int_equal(error_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
    1860            1 :     assert_int_equal(error_response->header.request_response_code, SPDM_ERROR);
    1861            1 :     assert_int_equal(error_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1862            1 :     assert_int_equal(error_response->header.param2, 0);
    1863              : 
    1864            1 :     libspdm_test_responder_chunk_send_ack_reset_send_state(spdm_context);
    1865            1 : }
    1866              : 
    1867            1 : int libspdm_responder_chunk_send_ack_test_main(void)
    1868              : {
    1869            1 :     const struct CMUnitTest spdm_responder_chunk_send_ack_tests[] = {
    1870              :         /* Responder sent multiple chunks and processed correctly */
    1871              :         cmocka_unit_test(libspdm_test_responder_chunk_send_ack_rsp_case0),
    1872              :         /* Responder has no response flag chunk cap */
    1873              :         cmocka_unit_test(libspdm_test_responder_chunk_send_ack_rsp_case1),
    1874              :         /* Responder has bad response state */
    1875              :         cmocka_unit_test(libspdm_test_responder_chunk_send_ack_rsp_case2),
    1876              :         /* Responder has connection state <= NOT_START */
    1877              :         cmocka_unit_test(libspdm_test_responder_chunk_send_ack_rsp_case3),
    1878              :         /* Request has wrong size */
    1879              :         cmocka_unit_test(libspdm_test_responder_chunk_send_ack_rsp_case4),
    1880              :         /* Request has SPDM version less than 1.2*/
    1881              :         cmocka_unit_test(libspdm_test_responder_chunk_send_ack_rsp_case5),
    1882              :         /* Request has SPDM version not matching connection */
    1883              :         cmocka_unit_test(libspdm_test_responder_chunk_send_ack_rsp_case6),
    1884              :         /* Responder is already in chunking mode */
    1885              :         cmocka_unit_test(libspdm_test_responder_chunk_send_ack_rsp_case7),
    1886              : 
    1887              :         /* First request has bad sequence number */
    1888              :         cmocka_unit_test(libspdm_test_responder_chunk_send_ack_rsp_case8),
    1889              :         /* First request has chunk size too large */
    1890              :         cmocka_unit_test(libspdm_test_responder_chunk_send_ack_rsp_case9),
    1891              :         /* First request has size larger than data transfer size */
    1892              :         cmocka_unit_test(libspdm_test_responder_chunk_send_ack_rsp_case10),
    1893              :         /* Large message size larger than max SPDM message size. */
    1894              :         cmocka_unit_test(libspdm_test_responder_chunk_send_ack_rsp_case11),
    1895              :         /* First request has LAST CHUNK bit set. */
    1896              :         cmocka_unit_test(libspdm_test_responder_chunk_send_ack_rsp_case12),
    1897              : 
    1898              :         /* Request has bad sequence number */
    1899              :         cmocka_unit_test(libspdm_test_responder_chunk_send_ack_rsp_case13),
    1900              :         /* Request has bad chunk handle */
    1901              :         cmocka_unit_test(libspdm_test_responder_chunk_send_ack_rsp_case14),
    1902              :         /* Request has chunk size too large for request*/
    1903              :         cmocka_unit_test(libspdm_test_responder_chunk_send_ack_rsp_case15),
    1904              :         /* Request has chunk size + transferred size > large message size */
    1905              :         cmocka_unit_test(libspdm_test_responder_chunk_send_ack_rsp_case16),
    1906              :         /* Request has LAST_CHUNK indicated before all bytes transferred. */
    1907              :         cmocka_unit_test(libspdm_test_responder_chunk_send_ack_rsp_case17),
    1908              :         /* Request missing LAST_CHUNK after all bytes transferred. */
    1909              :         cmocka_unit_test(libspdm_test_responder_chunk_send_ack_rsp_case18),
    1910              :         /* Request missing LAST_CHUNK when request size != data transfer size. */
    1911              :         cmocka_unit_test(libspdm_test_responder_chunk_send_ack_rsp_case19),
    1912              :         /* Request chunk seq wrapped. */
    1913              :         cmocka_unit_test(libspdm_test_responder_chunk_send_ack_rsp_case20),
    1914              :         /* Request size exceed max chunk seq no. */
    1915              :         cmocka_unit_test(libspdm_test_responder_chunk_send_ack_rsp_case21),
    1916              :     };
    1917              : 
    1918            1 :     libspdm_test_context_t test_context = {
    1919              :         LIBSPDM_TEST_CONTEXT_VERSION,
    1920              :         false,
    1921              :     };
    1922              : 
    1923            1 :     libspdm_setup_test_context(&test_context);
    1924              : 
    1925            1 :     return cmocka_run_group_tests(spdm_responder_chunk_send_ack_tests,
    1926              :                                   libspdm_unit_test_group_setup,
    1927              :                                   libspdm_unit_test_group_teardown);
    1928              : }
    1929              : 
    1930              : #endif /* LIBSPDM_ENABLE_CAPABILITY_CHUNK_CAP*/
        

Generated by: LCOV version 2.0-1