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 % 914 914
Test Date: 2025-10-12 08:10:56 Functions: 100.0 % 26 26

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

Generated by: LCOV version 2.0-1