LCOV - code coverage report
Current view: top level - unit_test/test_spdm_responder/error_test - event_ack_err.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 92.4 % 275 254
Test Date: 2026-02-22 08:11:49 Functions: 100.0 % 11 11

            Line data    Source code
       1              : /**
       2              :  *  Copyright Notice:
       3              :  *  Copyright 2025-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              : #include "internal/libspdm_secured_message_lib.h"
      10              : 
      11              : #if LIBSPDM_EVENT_RECIPIENT_SUPPORT
      12              : 
      13              : static uint8_t m_spdm_request_buffer[0x1000];
      14              : static uint8_t m_spdm_response_buffer[0x1000];
      15              : 
      16              : static const uint32_t m_session_id = 0xffffffff;
      17              : 
      18              : typedef struct {
      19              :     uint32_t event_instance_id;
      20              :     uint8_t svh_id;
      21              :     uint8_t svh_vendor_id_len;
      22              :     uint8_t svh_vendor_id[4];
      23              :     uint16_t event_type_id;
      24              :     uint16_t event_detail_len;
      25              :     uint8_t event_detail[100];
      26              : } expected_event_t;
      27              : 
      28              : static expected_event_t m_expected_event[4];
      29              : static uint32_t m_event_counter;
      30              : static bool m_process_event_error = false;
      31              : 
      32            1 : static libspdm_return_t process_event(void *spdm_context,
      33              :                                       uint32_t session_id,
      34              :                                       uint32_t event_instance_id,
      35              :                                       uint8_t svh_id,
      36              :                                       uint8_t svh_vendor_id_len,
      37              :                                       const void *svh_vendor_id,
      38              :                                       uint16_t event_type_id,
      39              :                                       uint16_t event_detail_len,
      40              :                                       const void *event_detail)
      41              : {
      42            1 :     if (m_process_event_error) {
      43            1 :         return LIBSPDM_STATUS_INVALID_MSG_FIELD;
      44              :     }
      45              : 
      46            0 :     printf("Event Received\n");
      47            0 :     printf("Event Instance ID = [0x%x]\n", event_instance_id);
      48            0 :     printf("SVH ID = [0x%x], SVH VendorIDLen = [0x%x]\n", svh_id, svh_vendor_id_len);
      49            0 :     if (svh_vendor_id_len != 0) {
      50            0 :         printf("SVH VendorID\n");
      51            0 :         libspdm_dump_hex(svh_vendor_id, svh_vendor_id_len);
      52            0 :         printf("\n");
      53              :     }
      54            0 :     printf("EventTypeID = [0x%x], EventDetailLen = [0x%x]\n", event_type_id, event_detail_len);
      55            0 :     printf("Event Detail\n");
      56            0 :     libspdm_dump_hex(event_detail, event_detail_len);
      57              : 
      58            0 :     assert_int_equal(session_id, m_session_id);
      59            0 :     assert_int_equal(event_instance_id, m_expected_event[m_event_counter].event_instance_id);
      60            0 :     assert_int_equal(event_type_id, m_expected_event[m_event_counter].event_type_id);
      61            0 :     assert_int_equal(svh_id, m_expected_event[m_event_counter].svh_id);
      62            0 :     assert_int_equal(svh_vendor_id_len, m_expected_event[m_event_counter].svh_vendor_id_len);
      63            0 :     if (svh_vendor_id_len == 0) {
      64            0 :         assert_ptr_equal(svh_vendor_id, NULL);
      65              :     }
      66            0 :     assert_int_equal(event_detail_len, m_expected_event[m_event_counter].event_detail_len);
      67            0 :     assert_memory_equal(m_expected_event[m_event_counter].event_detail, event_detail,
      68              :                         event_detail_len);
      69            0 :     m_event_counter++;
      70              : 
      71            0 :     return LIBSPDM_STATUS_SUCCESS;
      72              : }
      73              : 
      74            8 : static void set_standard_state(libspdm_context_t *spdm_context)
      75              : {
      76              :     libspdm_session_info_t *session_info;
      77              : 
      78            8 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
      79              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
      80            8 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
      81              : 
      82            8 :     spdm_context->connection_info.capability.flags |=
      83              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_EVENT_CAP;
      84            8 :     spdm_context->connection_info.capability.flags |=
      85              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
      86            8 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
      87            8 :     spdm_context->connection_info.capability.flags |=
      88              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
      89            8 :     spdm_context->connection_info.capability.flags |=
      90              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
      91              : 
      92            8 :     spdm_context->local_context.capability.flags |=
      93              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
      94            8 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
      95            8 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
      96            8 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
      97              : 
      98            8 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
      99            8 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     100            8 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
     101            8 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
     102              : 
     103            8 :     spdm_context->latest_session_id = m_session_id;
     104            8 :     spdm_context->last_spdm_request_session_id_valid = true;
     105            8 :     spdm_context->last_spdm_request_session_id = m_session_id;
     106            8 :     session_info = &spdm_context->session_info[0];
     107            8 :     libspdm_session_info_init(spdm_context, session_info, m_session_id,
     108              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     109            8 :     libspdm_secured_message_set_session_state(
     110              :         session_info->secured_message_context,
     111              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
     112              : 
     113            8 :     libspdm_register_event_callback(spdm_context, process_event);
     114            8 : }
     115              : 
     116              : /**
     117              :  * Test 1: Illegal EventCount is set to 0.
     118              :  * Expected behavior: InvalidRequest error response.
     119              :  **/
     120            1 : static void rsp_event_ack_err_case1(void **state)
     121              : {
     122              :     libspdm_return_t status;
     123              :     libspdm_test_context_t *spdm_test_context;
     124              :     libspdm_context_t *spdm_context;
     125              :     spdm_send_event_request_t *send_event;
     126              :     size_t request_size;
     127              :     spdm_error_response_t *spdm_response;
     128            1 :     size_t response_size =  sizeof(m_spdm_response_buffer);
     129              :     uint8_t event_data_size;
     130              :     spdm_dmtf_event_type_event_lost_t event_lost;
     131              : 
     132            1 :     spdm_test_context = *state;
     133            1 :     spdm_context = spdm_test_context->spdm_context;
     134            1 :     spdm_test_context->case_id = 0x01;
     135              : 
     136            1 :     set_standard_state(spdm_context);
     137              : 
     138            1 :     send_event = (spdm_send_event_request_t *)m_spdm_request_buffer;
     139              : 
     140            1 :     send_event->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     141            1 :     send_event->header.request_response_code = SPDM_SEND_EVENT;
     142            1 :     send_event->header.param1 = 0;
     143            1 :     send_event->header.param2 = 0;
     144              :     /* Illegal value for EventCount. */
     145            1 :     send_event->event_count = 0;
     146              : 
     147            1 :     event_lost.last_acked_event_inst_id = 0xffeeddcc;
     148            1 :     event_lost.last_lost_event_inst_id = 0x55667788;
     149              : 
     150            1 :     generate_dmtf_event_data(send_event + 1, &event_data_size, 0x11223344,
     151              :                              SPDM_DMTF_EVENT_TYPE_EVENT_LOST, &event_lost);
     152              : 
     153            1 :     m_event_counter = 0;
     154              : 
     155            1 :     request_size = sizeof(spdm_send_event_request_t) + event_data_size;
     156              : 
     157            1 :     status = libspdm_get_response_send_event(
     158              :         spdm_context, request_size, m_spdm_request_buffer,
     159              :         &response_size, m_spdm_response_buffer);
     160              : 
     161            1 :     spdm_response = (spdm_error_response_t *)m_spdm_response_buffer;
     162              : 
     163            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     164              : 
     165            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     166            1 :     assert_int_equal(spdm_response->header.spdm_version, SPDM_MESSAGE_VERSION_13);
     167            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     168            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
     169            1 :     assert_int_equal(spdm_response->header.param2, 0);
     170              : 
     171            1 :     assert_int_equal(m_event_counter, 0);
     172            1 : }
     173              : 
     174              : /**
     175              :  * Test 2: Send two events with gap in event instance IDs.
     176              :  * Expected behavior: InvalidRequest error response.
     177              :  **/
     178            1 : static void rsp_event_ack_err_case2(void **state)
     179              : {
     180              :     libspdm_return_t status;
     181              :     libspdm_test_context_t *spdm_test_context;
     182              :     libspdm_context_t *spdm_context;
     183              :     spdm_send_event_request_t *send_event;
     184              :     size_t request_size;
     185              :     spdm_error_response_t *spdm_response;
     186            1 :     size_t response_size =  sizeof(m_spdm_response_buffer);
     187              :     uint8_t event_data_size[2];
     188              :     spdm_dmtf_event_type_event_lost_t event_lost;
     189              :     spdm_dmtf_event_type_certificate_changed_t certificate_changed;
     190              :     uint8_t *ptr;
     191              : 
     192            1 :     spdm_test_context = *state;
     193            1 :     spdm_context = spdm_test_context->spdm_context;
     194            1 :     spdm_test_context->case_id = 0x02;
     195              : 
     196            1 :     set_standard_state(spdm_context);
     197              : 
     198            1 :     send_event = (spdm_send_event_request_t *)m_spdm_request_buffer;
     199              : 
     200            1 :     send_event->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     201            1 :     send_event->header.request_response_code = SPDM_SEND_EVENT;
     202            1 :     send_event->header.param1 = 0;
     203            1 :     send_event->header.param2 = 0;
     204            1 :     send_event->event_count = 2;
     205              : 
     206            1 :     certificate_changed.certificate_changed = 5;
     207              : 
     208            1 :     event_lost.last_acked_event_inst_id = 0xffeeddcc;
     209            1 :     event_lost.last_lost_event_inst_id = 0x55667788;
     210              : 
     211            1 :     ptr = (uint8_t *)(send_event + 1);
     212              : 
     213            1 :     generate_dmtf_event_data(ptr, &event_data_size[0], 0x11223343,
     214              :                              SPDM_DMTF_EVENT_TYPE_CERTIFICATE_CHANGED, &certificate_changed);
     215            1 :     ptr += event_data_size[0];
     216              : 
     217            1 :     generate_dmtf_event_data(ptr, &event_data_size[1], 0x11223345,
     218              :                              SPDM_DMTF_EVENT_TYPE_EVENT_LOST, &event_lost);
     219            1 :     ptr += event_data_size[1];
     220              : 
     221            1 :     m_event_counter = 0;
     222              : 
     223            1 :     m_expected_event[0].event_instance_id = 0x11223343;
     224            1 :     m_expected_event[0].svh_id = SPDM_REGISTRY_ID_DMTF;
     225            1 :     m_expected_event[0].svh_vendor_id_len = 0;
     226            1 :     m_expected_event[0].event_type_id = SPDM_DMTF_EVENT_TYPE_CERTIFICATE_CHANGED;
     227              : 
     228            1 :     m_expected_event[1].event_instance_id = 0x11223344;
     229            1 :     m_expected_event[1].svh_id = SPDM_REGISTRY_ID_DMTF;
     230            1 :     m_expected_event[1].svh_vendor_id_len = 0;
     231            1 :     m_expected_event[1].event_type_id = SPDM_DMTF_EVENT_TYPE_EVENT_LOST;
     232              : 
     233            1 :     request_size = sizeof(spdm_send_event_request_t) + event_data_size[0] + event_data_size[1];
     234              : 
     235            1 :     status = libspdm_get_response_send_event(
     236              :         spdm_context, request_size, m_spdm_request_buffer,
     237              :         &response_size, m_spdm_response_buffer);
     238              : 
     239            1 :     spdm_response = (spdm_error_response_t *)m_spdm_response_buffer;
     240              : 
     241            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     242              : 
     243            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     244            1 :     assert_int_equal(spdm_response->header.spdm_version, SPDM_MESSAGE_VERSION_13);
     245            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     246            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
     247            1 :     assert_int_equal(spdm_response->header.param2, 0);
     248              : 
     249            1 :     assert_int_equal(m_event_counter, 0);
     250            1 : }
     251              : 
     252              : /**
     253              :  * Test 3: Send one event but the value of EventCount is two.
     254              :  * Expected behavior: InvalidRequest error response.
     255              :  **/
     256            1 : static void rsp_event_ack_err_case3(void **state)
     257              : {
     258              :     libspdm_return_t status;
     259              :     libspdm_test_context_t *spdm_test_context;
     260              :     libspdm_context_t *spdm_context;
     261              :     spdm_send_event_request_t *send_event;
     262              :     size_t request_size;
     263              :     spdm_error_response_t *spdm_response;
     264            1 :     size_t response_size =  sizeof(m_spdm_response_buffer);
     265              :     uint8_t event_data_size;
     266              :     spdm_dmtf_event_type_event_lost_t event_lost;
     267              : 
     268            1 :     spdm_test_context = *state;
     269            1 :     spdm_context = spdm_test_context->spdm_context;
     270            1 :     spdm_test_context->case_id = 0x03;
     271              : 
     272            1 :     set_standard_state(spdm_context);
     273              : 
     274            1 :     send_event = (spdm_send_event_request_t *)m_spdm_request_buffer;
     275              : 
     276            1 :     send_event->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     277            1 :     send_event->header.request_response_code = SPDM_SEND_EVENT;
     278            1 :     send_event->header.param1 = 0;
     279            1 :     send_event->header.param2 = 0;
     280              :     /* Only one event but event_count is two. */
     281            1 :     send_event->event_count = 2;
     282              : 
     283            1 :     event_lost.last_acked_event_inst_id = 0xffeeddcc;
     284            1 :     event_lost.last_lost_event_inst_id = 0x55667788;
     285              : 
     286            1 :     generate_dmtf_event_data(send_event + 1, &event_data_size, 0x11223344,
     287              :                              SPDM_DMTF_EVENT_TYPE_EVENT_LOST, &event_lost);
     288              : 
     289            1 :     m_event_counter = 0;
     290              : 
     291            1 :     request_size = sizeof(spdm_send_event_request_t) + event_data_size;
     292              : 
     293            1 :     status = libspdm_get_response_send_event(
     294              :         spdm_context, request_size, m_spdm_request_buffer,
     295              :         &response_size, m_spdm_response_buffer);
     296              : 
     297            1 :     spdm_response = (spdm_error_response_t *)m_spdm_response_buffer;
     298              : 
     299            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     300              : 
     301            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     302            1 :     assert_int_equal(spdm_response->header.spdm_version, SPDM_MESSAGE_VERSION_13);
     303            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     304            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
     305            1 :     assert_int_equal(spdm_response->header.param2, 0);
     306              : 
     307            1 :     assert_int_equal(m_event_counter, 0);
     308            1 : }
     309              : 
     310              : /**
     311              :  * Test 4: Send one event but request_size is not exact.
     312              :  * Expected behavior: InvalidRequest error response.
     313              :  **/
     314            1 : static void rsp_event_ack_err_case4(void **state)
     315              : {
     316              :     libspdm_return_t status;
     317              :     libspdm_test_context_t *spdm_test_context;
     318              :     libspdm_context_t *spdm_context;
     319              :     spdm_send_event_request_t *send_event;
     320              :     size_t request_size;
     321              :     spdm_error_response_t *spdm_response;
     322            1 :     size_t response_size =  sizeof(m_spdm_response_buffer);
     323              :     uint8_t event_data_size;
     324              :     spdm_dmtf_event_type_event_lost_t event_lost;
     325              : 
     326            1 :     spdm_test_context = *state;
     327            1 :     spdm_context = spdm_test_context->spdm_context;
     328            1 :     spdm_test_context->case_id = 0x04;
     329              : 
     330            1 :     set_standard_state(spdm_context);
     331              : 
     332            1 :     send_event = (spdm_send_event_request_t *)m_spdm_request_buffer;
     333              : 
     334            1 :     send_event->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     335            1 :     send_event->header.request_response_code = SPDM_SEND_EVENT;
     336            1 :     send_event->header.param1 = 0;
     337            1 :     send_event->header.param2 = 0;
     338            1 :     send_event->event_count = 1;
     339              : 
     340            1 :     event_lost.last_acked_event_inst_id = 0xffeeddcc;
     341            1 :     event_lost.last_lost_event_inst_id = 0x55667788;
     342              : 
     343            1 :     generate_dmtf_event_data(send_event + 1, &event_data_size, 0x11223344,
     344              :                              SPDM_DMTF_EVENT_TYPE_EVENT_LOST, &event_lost);
     345              : 
     346            1 :     m_event_counter = 0;
     347              : 
     348              :     /* request_size is not exact (+ 1). */
     349            1 :     request_size = sizeof(spdm_send_event_request_t) + event_data_size + 1;
     350              : 
     351            1 :     status = libspdm_get_response_send_event(
     352              :         spdm_context, request_size, m_spdm_request_buffer,
     353              :         &response_size, m_spdm_response_buffer);
     354              : 
     355            1 :     spdm_response = (spdm_error_response_t *)m_spdm_response_buffer;
     356              : 
     357            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     358              : 
     359            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     360            1 :     assert_int_equal(spdm_response->header.spdm_version, SPDM_MESSAGE_VERSION_13);
     361            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     362            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
     363            1 :     assert_int_equal(spdm_response->header.param2, 0);
     364              : 
     365            1 :     assert_int_equal(m_event_counter, 0);
     366            1 : }
     367              : 
     368              : /**
     369              :  * Test 5: Negotiated SPDM version does not support SEND_EVENT request message.
     370              :  * Expected Behavior: Responder returns SPDM_ERROR_CODE_UNSUPPORTED_REQUEST.
     371              :  **/
     372            1 : static void rsp_event_ack_err_case5(void **state)
     373              : {
     374              :     libspdm_return_t status;
     375              :     libspdm_test_context_t *spdm_test_context;
     376              :     libspdm_context_t *spdm_context;
     377              :     spdm_send_event_request_t *send_event;
     378              :     size_t request_size;
     379              :     spdm_error_response_t *spdm_response;
     380            1 :     size_t response_size =  sizeof(m_spdm_response_buffer);
     381              : 
     382            1 :     spdm_test_context = *state;
     383            1 :     spdm_context = spdm_test_context->spdm_context;
     384            1 :     spdm_test_context->case_id = 0x05;
     385              : 
     386            1 :     set_standard_state(spdm_context);
     387              : 
     388              :     /* SPDM 1.2 does not support SEND_EVENT request message. */
     389            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     390              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     391              : 
     392            1 :     send_event = (spdm_send_event_request_t *)m_spdm_request_buffer;
     393              : 
     394            1 :     send_event->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     395            1 :     send_event->header.request_response_code = SPDM_SEND_EVENT;
     396            1 :     send_event->header.param1 = 0;
     397            1 :     send_event->header.param2 = 0;
     398              : 
     399            1 :     m_event_counter = 0;
     400              : 
     401            1 :     request_size = sizeof(spdm_send_event_request_t);
     402              : 
     403            1 :     status = libspdm_get_response_send_event(
     404              :         spdm_context, request_size, m_spdm_request_buffer,
     405              :         &response_size, m_spdm_response_buffer);
     406              : 
     407            1 :     spdm_response = (spdm_error_response_t *)m_spdm_response_buffer;
     408              : 
     409            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     410              : 
     411            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     412            1 :     assert_int_equal(spdm_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
     413            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     414            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_UNSUPPORTED_REQUEST);
     415            1 :     assert_int_equal(spdm_response->header.param2, SPDM_SEND_EVENT);
     416              : 
     417            1 :     assert_int_equal(m_event_counter, 0);
     418            1 : }
     419              : 
     420              : /**
     421              :  * Test 6: SPDM version field in SEND_EVENT request message does not match the
     422              :  *         connection's negotiated version.
     423              :  * Expected Behavior: Responder returns SPDM_ERROR_CODE_VERSION_MISMATCH.
     424              :  **/
     425            1 : static void rsp_event_ack_err_case6(void **state)
     426              : {
     427              :     libspdm_return_t status;
     428              :     libspdm_test_context_t *spdm_test_context;
     429              :     libspdm_context_t *spdm_context;
     430              :     spdm_send_event_request_t *send_event;
     431              :     size_t request_size;
     432              :     spdm_error_response_t *spdm_response;
     433            1 :     size_t response_size =  sizeof(m_spdm_response_buffer);
     434              : 
     435            1 :     spdm_test_context = *state;
     436            1 :     spdm_context = spdm_test_context->spdm_context;
     437            1 :     spdm_test_context->case_id = 0x06;
     438              : 
     439            1 :     set_standard_state(spdm_context);
     440              : 
     441            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_14 <<
     442              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     443              : 
     444            1 :     send_event = (spdm_send_event_request_t *)m_spdm_request_buffer;
     445              : 
     446              :     /* Value is not equal to the negotiated SPDM version (1.4). */
     447            1 :     send_event->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     448            1 :     send_event->header.request_response_code = SPDM_SEND_EVENT;
     449            1 :     send_event->header.param1 = 0;
     450            1 :     send_event->header.param2 = 0;
     451              : 
     452            1 :     m_event_counter = 0;
     453              : 
     454            1 :     request_size = sizeof(spdm_send_event_request_t);
     455              : 
     456            1 :     status = libspdm_get_response_send_event(
     457              :         spdm_context, request_size, m_spdm_request_buffer,
     458              :         &response_size, m_spdm_response_buffer);
     459              : 
     460            1 :     spdm_response = (spdm_error_response_t *)m_spdm_response_buffer;
     461              : 
     462            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     463              : 
     464            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     465            1 :     assert_int_equal(spdm_response->header.spdm_version, SPDM_MESSAGE_VERSION_14);
     466            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     467            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_VERSION_MISMATCH);
     468            1 :     assert_int_equal(spdm_response->header.param2, 0);
     469              : 
     470            1 :     assert_int_equal(m_event_counter, 0);
     471            1 : }
     472              : 
     473              : /**
     474              :  * Test 7: Requester does not support EVENT_CAP.
     475              :  * Expected Behavior: Responder returns SPDM_ERROR_CODE_UNSUPPORTED_REQUEST.
     476              :  **/
     477            1 : static void rsp_event_ack_err_case7(void **state)
     478              : {
     479              :     libspdm_return_t status;
     480              :     libspdm_test_context_t *spdm_test_context;
     481              :     libspdm_context_t *spdm_context;
     482              :     spdm_send_event_request_t *send_event;
     483              :     size_t request_size;
     484              :     spdm_error_response_t *spdm_response;
     485            1 :     size_t response_size =  sizeof(m_spdm_response_buffer);
     486              : 
     487            1 :     spdm_test_context = *state;
     488            1 :     spdm_context = spdm_test_context->spdm_context;
     489            1 :     spdm_test_context->case_id = 0x07;
     490              : 
     491            1 :     set_standard_state(spdm_context);
     492              : 
     493            1 :     send_event = (spdm_send_event_request_t *)m_spdm_request_buffer;
     494              : 
     495            1 :     send_event->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     496            1 :     send_event->header.request_response_code = SPDM_SEND_EVENT;
     497            1 :     send_event->header.param1 = 0;
     498            1 :     send_event->header.param2 = 0;
     499              : 
     500              :     /* Requester sends SEND_EVENT but does not support EVENT_CAP. */
     501            1 :     spdm_context->connection_info.capability.flags &=
     502              :         ~SPDM_GET_CAPABILITIES_REQUEST_FLAGS_EVENT_CAP;
     503              : 
     504            1 :     m_event_counter = 0;
     505              : 
     506            1 :     request_size = sizeof(spdm_send_event_request_t);
     507              : 
     508            1 :     status = libspdm_get_response_send_event(
     509              :         spdm_context, request_size, m_spdm_request_buffer,
     510              :         &response_size, m_spdm_response_buffer);
     511              : 
     512            1 :     spdm_response = (spdm_error_response_t *)m_spdm_response_buffer;
     513              : 
     514            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     515              : 
     516            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     517            1 :     assert_int_equal(spdm_response->header.spdm_version, SPDM_MESSAGE_VERSION_13);
     518            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     519            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_UNSUPPORTED_REQUEST);
     520            1 :     assert_int_equal(spdm_response->header.param2, SPDM_SEND_EVENT);
     521              : 
     522            1 :     assert_int_equal(m_event_counter, 0);
     523            1 : }
     524              : 
     525              : /**
     526              :  * Test 8: Call to process_event returns an error.
     527              :  * Expected Behavior: Responder returns SPDM_ERROR_CODE_INVALID_REQUEST.
     528              :  **/
     529            1 : static void rsp_event_ack_err_case8(void **state)
     530              : {
     531              :     libspdm_return_t status;
     532              :     libspdm_test_context_t *spdm_test_context;
     533              :     libspdm_context_t *spdm_context;
     534              :     spdm_send_event_request_t *send_event;
     535              :     size_t request_size;
     536              :     spdm_error_response_t *spdm_response;
     537            1 :     size_t response_size =  sizeof(m_spdm_response_buffer);
     538              :     uint8_t event_data_size;
     539              :     spdm_dmtf_event_type_event_lost_t event_lost;
     540              : 
     541            1 :     spdm_test_context = *state;
     542            1 :     spdm_context = spdm_test_context->spdm_context;
     543            1 :     spdm_test_context->case_id = 0x8;
     544              : 
     545            1 :     set_standard_state(spdm_context);
     546              : 
     547            1 :     send_event = (spdm_send_event_request_t *)m_spdm_request_buffer;
     548              : 
     549            1 :     send_event->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     550            1 :     send_event->header.request_response_code = SPDM_SEND_EVENT;
     551            1 :     send_event->header.param1 = 0;
     552            1 :     send_event->header.param2 = 0;
     553            1 :     send_event->event_count = 1;
     554              : 
     555            1 :     event_lost.last_acked_event_inst_id = 0xffeeddcc;
     556            1 :     event_lost.last_lost_event_inst_id = 0x55667788;
     557              : 
     558            1 :     generate_dmtf_event_data(send_event + 1, &event_data_size, 0x11223344,
     559              :                              SPDM_DMTF_EVENT_TYPE_EVENT_LOST, &event_lost);
     560              : 
     561            1 :     m_event_counter = 0;
     562              : 
     563            1 :     request_size = sizeof(spdm_send_event_request_t) + event_data_size;
     564              : 
     565              :     /* Induce error in process_request. */
     566            1 :     m_process_event_error = true;
     567              : 
     568            1 :     status = libspdm_get_response_send_event(
     569              :         spdm_context, request_size, m_spdm_request_buffer,
     570              :         &response_size, m_spdm_response_buffer);
     571              : 
     572            1 :     m_process_event_error = false;
     573              : 
     574            1 :     spdm_response = (spdm_error_response_t *)m_spdm_response_buffer;
     575              : 
     576            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     577              : 
     578            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     579            1 :     assert_int_equal(spdm_response->header.spdm_version, SPDM_MESSAGE_VERSION_13);
     580            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     581            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
     582            1 :     assert_int_equal(spdm_response->header.param2, 0);
     583              : 
     584            1 :     assert_int_equal(m_event_counter, 0);
     585            1 : }
     586              : 
     587            1 : int libspdm_rsp_event_ack_error_test(void)
     588              : {
     589            1 :     const struct CMUnitTest test_cases[] = {
     590              :         cmocka_unit_test(rsp_event_ack_err_case1),
     591              :         cmocka_unit_test(rsp_event_ack_err_case2),
     592              :         cmocka_unit_test(rsp_event_ack_err_case3),
     593              :         cmocka_unit_test(rsp_event_ack_err_case4),
     594              :         cmocka_unit_test(rsp_event_ack_err_case5),
     595              :         cmocka_unit_test(rsp_event_ack_err_case6),
     596              :         cmocka_unit_test(rsp_event_ack_err_case7),
     597              :         cmocka_unit_test(rsp_event_ack_err_case8),
     598              :     };
     599              : 
     600            1 :     libspdm_test_context_t test_context = {
     601              :         LIBSPDM_TEST_CONTEXT_VERSION,
     602              :         false,
     603              :     };
     604              : 
     605            1 :     libspdm_setup_test_context(&test_context);
     606              : 
     607            1 :     return cmocka_run_group_tests(test_cases,
     608              :                                   libspdm_unit_test_group_setup,
     609              :                                   libspdm_unit_test_group_teardown);
     610              : }
     611              : 
     612              : #endif /* LIBSPDM_EVENT_RECIPIENT_SUPPORT */
        

Generated by: LCOV version 2.0-1