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