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: 2026-02-22 08:11:49 Functions: 100.0 % 26 26

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

Generated by: LCOV version 2.0-1