Line data Source code
1 : /**
2 : * Copyright Notice:
3 : * Copyright 2025 DMTF. All rights reserved.
4 : * License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
5 : **/
6 :
7 : #include "spdm_unit_test.h"
8 : #include "internal/libspdm_responder_lib.h"
9 :
10 : #if (LIBSPDM_ENABLE_CAPABILITY_ENCAP_CAP) && (LIBSPDM_ENABLE_CAPABILITY_EVENT_CAP)
11 :
12 : extern uint32_t g_event_count;
13 :
14 : static uint8_t m_send_buffer[LIBSPDM_MAX_SPDM_MSG_SIZE];
15 : static uint8_t m_receive_buffer[LIBSPDM_MAX_SPDM_MSG_SIZE];
16 : static uint32_t m_session_id = 0xFFFFFFFF;
17 :
18 2 : static void set_standard_state(libspdm_context_t *spdm_context)
19 : {
20 : libspdm_session_info_t *session_info;
21 :
22 2 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
23 : SPDM_VERSION_NUMBER_SHIFT_BIT;
24 2 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
25 :
26 2 : spdm_context->connection_info.capability.flags |=
27 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
28 2 : spdm_context->connection_info.capability.flags |=
29 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
30 2 : spdm_context->connection_info.capability.flags |=
31 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
32 2 : spdm_context->connection_info.capability.flags |=
33 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
34 :
35 2 : spdm_context->local_context.capability.flags |=
36 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_EVENT_CAP;
37 2 : spdm_context->local_context.capability.flags |=
38 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
39 2 : spdm_context->local_context.capability.flags |=
40 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
41 2 : spdm_context->local_context.capability.flags |=
42 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
43 2 : spdm_context->local_context.capability.flags |=
44 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
45 :
46 2 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
47 2 : spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
48 2 : spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
49 2 : spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
50 :
51 2 : spdm_context->latest_session_id = m_session_id;
52 2 : spdm_context->last_spdm_request_session_id_valid = true;
53 2 : spdm_context->last_spdm_request_session_id = m_session_id;
54 2 : session_info = &spdm_context->session_info[0];
55 2 : libspdm_session_info_init(spdm_context, session_info, m_session_id, true);
56 2 : libspdm_secured_message_set_session_state(
57 : session_info->secured_message_context,
58 : LIBSPDM_SESSION_STATE_ESTABLISHED);
59 2 : }
60 :
61 : /**
62 : * Test 1: Responder forms the expected SEND_EVENT request message with one event.
63 : **/
64 1 : static void test_responder_encap_send_event_case1(void **state)
65 : {
66 : libspdm_return_t status;
67 : libspdm_test_context_t *spdm_test_context;
68 : libspdm_context_t *spdm_context;
69 1 : size_t request_buffer_size = sizeof(m_send_buffer);
70 : spdm_send_event_request_t *spdm_request;
71 :
72 1 : spdm_test_context = *state;
73 1 : spdm_context = spdm_test_context->spdm_context;
74 1 : spdm_test_context->case_id = 0x01;
75 :
76 1 : set_standard_state(spdm_context);
77 :
78 1 : g_event_count = 1;
79 :
80 1 : status = libspdm_get_encap_request_send_event(spdm_context, &request_buffer_size,
81 : m_send_buffer);
82 :
83 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
84 :
85 1 : spdm_request = (spdm_send_event_request_t *)m_send_buffer;
86 :
87 1 : assert_int_equal(spdm_request->header.spdm_version, SPDM_MESSAGE_VERSION_13);
88 1 : assert_int_equal(spdm_request->header.request_response_code, SPDM_SEND_EVENT);
89 1 : assert_int_equal(spdm_request->header.param1, 0);
90 1 : assert_int_equal(spdm_request->header.param1, 0);
91 1 : assert_int_equal(spdm_request->event_count, g_event_count);
92 :
93 1 : for (unsigned int index = 0;
94 4601 : index < request_buffer_size - sizeof(spdm_send_event_request_t);
95 4600 : index++) {
96 4600 : assert_int_equal((uint8_t)index, ((uint8_t *)(spdm_request + 1))[index]);
97 : }
98 1 : }
99 :
100 : /**
101 : * Test 2: Responder processes the encapsulated EVENT_ACK response.
102 : **/
103 1 : static void test_responder_encap_send_event_case2(void **state)
104 : {
105 : libspdm_return_t status;
106 : libspdm_test_context_t *spdm_test_context;
107 : libspdm_context_t *spdm_context;
108 : size_t response_size;
109 : spdm_event_ack_response_t *spdm_response;
110 : bool need_continue;
111 :
112 1 : spdm_test_context = *state;
113 1 : spdm_context = spdm_test_context->spdm_context;
114 1 : spdm_test_context->case_id = 0x02;
115 :
116 1 : set_standard_state(spdm_context);
117 :
118 1 : spdm_response = (spdm_event_ack_response_t *)m_receive_buffer;
119 1 : response_size = sizeof(spdm_event_ack_response_t);
120 :
121 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
122 1 : spdm_response->header.request_response_code = SPDM_EVENT_ACK;
123 1 : spdm_response->header.param1 = 0;
124 1 : spdm_response->header.param2 = 0;
125 :
126 1 : status = libspdm_process_encap_response_event_ack(spdm_context, response_size, spdm_response,
127 : &need_continue);
128 :
129 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
130 1 : assert_false(need_continue);
131 1 : }
132 :
133 1 : int libspdm_responder_encap_send_event_test_main(void)
134 : {
135 1 : const struct CMUnitTest spdm_responder_key_update_tests[] = {
136 : cmocka_unit_test(test_responder_encap_send_event_case1),
137 : cmocka_unit_test(test_responder_encap_send_event_case2),
138 : };
139 :
140 1 : libspdm_test_context_t test_context = {
141 : LIBSPDM_TEST_CONTEXT_VERSION,
142 : false,
143 : };
144 :
145 1 : libspdm_setup_test_context(&test_context);
146 :
147 1 : return cmocka_run_group_tests(spdm_responder_key_update_tests,
148 : libspdm_unit_test_group_setup,
149 : libspdm_unit_test_group_teardown);
150 : }
151 :
152 : #endif /* (LIBSPDM_ENABLE_CAPABILITY_ENCAP_CAP) && (LIBSPDM_ENABLE_CAPABILITY_EVENT_CAP) */
|