Line data Source code
1 : /**
2 : * Copyright Notice:
3 : * Copyright 2024 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_requester_lib.h"
9 : #include "internal/libspdm_secured_message_lib.h"
10 :
11 : #if LIBSPDM_ENABLE_CAPABILITY_SET_KEY_PAIR_INFO_CAP
12 :
13 3 : libspdm_return_t libspdm_requester_set_key_pair_info_test_send_message(
14 : void *spdm_context, size_t request_size, const void *request,
15 : uint64_t timeout)
16 : {
17 : libspdm_test_context_t *spdm_test_context;
18 :
19 3 : spdm_test_context = libspdm_get_test_context();
20 3 : switch (spdm_test_context->case_id) {
21 3 : case 0x1:
22 : case 0x2:
23 : case 0x3:
24 3 : return LIBSPDM_STATUS_SUCCESS;
25 0 : default:
26 0 : return LIBSPDM_STATUS_SEND_FAIL;
27 : }
28 : }
29 :
30 3 : libspdm_return_t libspdm_requester_set_key_pair_info_test_receive_message(
31 : void *spdm_context, size_t *response_size,
32 : void **response, uint64_t timeout)
33 : {
34 : libspdm_test_context_t *spdm_test_context;
35 :
36 3 : spdm_test_context = libspdm_get_test_context();
37 3 : switch (spdm_test_context->case_id) {
38 :
39 1 : case 0x1: {
40 : spdm_key_pair_info_response_t *spdm_response;
41 : size_t spdm_response_size;
42 : size_t transport_header_size;
43 :
44 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
45 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
46 1 : spdm_response_size = sizeof(spdm_key_pair_info_response_t);
47 :
48 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
49 1 : spdm_response->header.request_response_code = SPDM_SET_KEY_PAIR_INFO_ACK;
50 1 : spdm_response->header.param1 = 0;
51 1 : spdm_response->header.param2 = 0;
52 :
53 1 : libspdm_transport_test_encode_message(spdm_context, NULL, false,
54 : false, spdm_response_size,
55 : spdm_response, response_size,
56 : response);
57 : }
58 1 : return LIBSPDM_STATUS_SUCCESS;
59 1 : case 0x2: {
60 : spdm_key_pair_info_response_t *spdm_response;
61 : size_t spdm_response_size;
62 : size_t transport_header_size;
63 :
64 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
65 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
66 1 : spdm_response_size = sizeof(spdm_key_pair_info_response_t);
67 :
68 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_12;
69 1 : spdm_response->header.request_response_code = SPDM_SET_KEY_PAIR_INFO_ACK;
70 1 : spdm_response->header.param1 = 0;
71 1 : spdm_response->header.param2 = 0;
72 :
73 1 : libspdm_transport_test_encode_message(spdm_context, NULL, false,
74 : false, spdm_response_size,
75 : spdm_response, response_size,
76 : response);
77 : }
78 1 : return LIBSPDM_STATUS_SUCCESS;
79 :
80 1 : case 0x3: {
81 : spdm_key_pair_info_response_t *spdm_response;
82 : size_t spdm_response_size;
83 : size_t transport_header_size;
84 :
85 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
86 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
87 1 : spdm_response_size = sizeof(spdm_key_pair_info_response_t);
88 :
89 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
90 1 : spdm_response->header.request_response_code = SPDM_KEY_PAIR_INFO;
91 1 : spdm_response->header.param1 = 0;
92 1 : spdm_response->header.param2 = 0;
93 :
94 1 : libspdm_transport_test_encode_message(spdm_context, NULL, false,
95 : false, spdm_response_size,
96 : spdm_response, response_size,
97 : response);
98 : }
99 1 : return LIBSPDM_STATUS_SUCCESS;
100 :
101 0 : default:
102 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
103 : }
104 : }
105 :
106 : /**
107 : * Test 1: Successful response to set key pair info
108 : * Expected Behavior: get a RETURN_SUCCESS return code
109 : **/
110 1 : void libspdm_test_requester_set_key_pair_info_case1(void **state)
111 : {
112 : libspdm_return_t status;
113 : libspdm_test_context_t *spdm_test_context;
114 : libspdm_context_t *spdm_context;
115 :
116 : uint8_t key_pair_id;
117 : uint8_t operation;
118 : uint16_t desired_key_usage;
119 : uint32_t desired_asym_algo;
120 : uint8_t desired_assoc_cert_slot_mask;
121 :
122 1 : spdm_test_context = *state;
123 1 : spdm_context = spdm_test_context->spdm_context;
124 1 : spdm_test_context->case_id = 0x1;
125 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
126 : SPDM_VERSION_NUMBER_SHIFT_BIT;
127 :
128 1 : spdm_context->connection_info.connection_state =
129 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
130 1 : spdm_context->connection_info.capability.flags |=
131 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_KEY_PAIR_INFO_CAP;
132 :
133 1 : key_pair_id = 1;
134 1 : operation = SPDM_SET_KEY_PAIR_INFO_ERASE_OPERATION;
135 1 : desired_key_usage = 0;
136 1 : desired_asym_algo = 0;
137 1 : desired_assoc_cert_slot_mask = 0;
138 1 : status = libspdm_set_key_pair_info(spdm_context, NULL, key_pair_id,
139 : operation, desired_key_usage, desired_asym_algo,
140 : desired_assoc_cert_slot_mask);
141 :
142 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
143 :
144 : /*wrong desired_assoc_cert_slot_mask when operation is erase*/
145 1 : desired_assoc_cert_slot_mask = 1;
146 1 : status = libspdm_set_key_pair_info(spdm_context, NULL, key_pair_id,
147 : operation, desired_key_usage, desired_asym_algo,
148 : desired_assoc_cert_slot_mask);
149 :
150 1 : assert_int_equal(status, LIBSPDM_STATUS_INVALID_PARAMETER);
151 1 : }
152 :
153 : /**
154 : * Test 2: Fail case, The response version is incorrect .
155 : * Expected Behavior: returns a status of LIBSPDM_STATUS_INVALID_MSG_FIELD.
156 : **/
157 1 : void libspdm_test_requester_set_key_pair_info_case2(void **state)
158 : {
159 : libspdm_return_t status;
160 : libspdm_test_context_t *spdm_test_context;
161 : libspdm_context_t *spdm_context;
162 :
163 : uint8_t key_pair_id;
164 : uint8_t operation;
165 : uint16_t desired_key_usage;
166 : uint32_t desired_asym_algo;
167 : uint8_t desired_assoc_cert_slot_mask;
168 :
169 1 : spdm_test_context = *state;
170 1 : spdm_context = spdm_test_context->spdm_context;
171 1 : spdm_test_context->case_id = 0x2;
172 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
173 : SPDM_VERSION_NUMBER_SHIFT_BIT;
174 :
175 1 : spdm_context->connection_info.connection_state =
176 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
177 1 : spdm_context->connection_info.capability.flags |=
178 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_KEY_PAIR_INFO_CAP;
179 :
180 1 : key_pair_id = 1;
181 1 : operation = SPDM_SET_KEY_PAIR_INFO_ERASE_OPERATION;
182 1 : desired_key_usage = 0;
183 1 : desired_asym_algo = 0;
184 1 : desired_assoc_cert_slot_mask = 0;
185 1 : status = libspdm_set_key_pair_info(spdm_context, NULL, key_pair_id,
186 : operation, desired_key_usage, desired_asym_algo,
187 : desired_assoc_cert_slot_mask);
188 :
189 1 : assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
190 1 : }
191 :
192 : /**
193 : * Test 3: Fail case, The response code is incorrect
194 : * Expected Behavior: returns a status of LIBSPDM_STATUS_INVALID_MSG_FIELD.
195 : **/
196 1 : void libspdm_test_requester_set_key_pair_info_case3(void **state)
197 : {
198 : libspdm_return_t status;
199 : libspdm_test_context_t *spdm_test_context;
200 : libspdm_context_t *spdm_context;
201 :
202 : uint8_t key_pair_id;
203 : uint8_t operation;
204 : uint16_t desired_key_usage;
205 : uint32_t desired_asym_algo;
206 : uint8_t desired_assoc_cert_slot_mask;
207 :
208 1 : spdm_test_context = *state;
209 1 : spdm_context = spdm_test_context->spdm_context;
210 1 : spdm_test_context->case_id = 0x3;
211 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
212 : SPDM_VERSION_NUMBER_SHIFT_BIT;
213 :
214 1 : spdm_context->connection_info.connection_state =
215 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
216 1 : spdm_context->connection_info.capability.flags |=
217 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_KEY_PAIR_INFO_CAP;
218 :
219 1 : key_pair_id = 1;
220 1 : operation = SPDM_SET_KEY_PAIR_INFO_ERASE_OPERATION;
221 1 : desired_key_usage = 0;
222 1 : desired_asym_algo = 0;
223 1 : desired_assoc_cert_slot_mask = 0;
224 1 : status = libspdm_set_key_pair_info(spdm_context, NULL, key_pair_id,
225 : operation, desired_key_usage, desired_asym_algo,
226 : desired_assoc_cert_slot_mask);
227 :
228 1 : assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
229 1 : }
230 :
231 1 : int libspdm_requester_set_key_pair_info_test_main(void)
232 : {
233 1 : const struct CMUnitTest spdm_requester_set_key_pair_info_tests[] = {
234 : /* Successful response to set key pair info, key_pair_id is 1*/
235 : cmocka_unit_test(libspdm_test_requester_set_key_pair_info_case1),
236 : /* The response version is incorrect */
237 : cmocka_unit_test(libspdm_test_requester_set_key_pair_info_case2),
238 : /* The response code is incorrect */
239 : cmocka_unit_test(libspdm_test_requester_set_key_pair_info_case3),
240 : };
241 :
242 1 : libspdm_test_context_t test_context = {
243 : LIBSPDM_TEST_CONTEXT_VERSION,
244 : true,
245 : libspdm_requester_set_key_pair_info_test_send_message,
246 : libspdm_requester_set_key_pair_info_test_receive_message,
247 : };
248 :
249 1 : libspdm_setup_test_context(&test_context);
250 :
251 1 : return cmocka_run_group_tests(spdm_requester_set_key_pair_info_tests,
252 : libspdm_unit_test_group_setup,
253 : libspdm_unit_test_group_teardown);
254 : }
255 :
256 : #endif /*LIBSPDM_ENABLE_CAPABILITY_SET_KEY_PAIR_INFO_CAP*/
|