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_requester_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 : static uint8_t m_libspdm_last_token;
14 : static uint8_t m_libspdm_last_rsp_enc_key[LIBSPDM_MAX_AEAD_KEY_SIZE];
15 : static uint8_t m_libspdm_last_rsp_salt[LIBSPDM_MAX_AEAD_IV_SIZE];
16 : static uint64_t m_libspdm_last_rsp_sequence_number;
17 :
18 35 : static void libspdm_set_standard_key_update_test_state(
19 : libspdm_context_t *spdm_context, uint32_t *session_id)
20 : {
21 : void *data;
22 : size_t data_size;
23 : void *hash;
24 : size_t hash_size;
25 : libspdm_session_info_t *session_info;
26 :
27 35 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
28 35 : spdm_context->connection_info.capability.flags |=
29 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_UPD_CAP;
30 35 : spdm_context->connection_info.capability.flags |=
31 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
32 35 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
33 35 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_UPD_CAP;
34 35 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
35 35 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
36 35 : if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
37 : m_libspdm_use_asym_algo, &data,
38 : &data_size, &hash, &hash_size)) {
39 0 : assert(false);
40 : }
41 35 : spdm_context->transcript.message_a.buffer_size = 0;
42 35 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
43 35 : spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
44 35 : spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
45 35 : spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
46 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
47 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = data_size;
48 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
49 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
50 : data, data_size);
51 : #endif
52 :
53 35 : *session_id = 0xFFFFFFFF;
54 35 : session_info = &spdm_context->session_info[0];
55 35 : libspdm_session_info_init(spdm_context, session_info, *session_id,
56 : SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
57 35 : libspdm_secured_message_set_session_state(
58 : session_info->secured_message_context,
59 : LIBSPDM_SESSION_STATE_ESTABLISHED);
60 :
61 35 : free(data);
62 35 : }
63 :
64 83 : static void libspdm_set_standard_key_update_test_secrets(
65 : libspdm_secured_message_context_t *secured_message_context,
66 : uint8_t *m_rsp_secret_buffer, uint8_t rsp_secret_fill,
67 : uint8_t *m_req_secret_buffer, uint8_t req_secret_fill)
68 : {
69 83 : libspdm_set_mem(m_rsp_secret_buffer, secured_message_context->hash_size, rsp_secret_fill);
70 83 : libspdm_set_mem(m_req_secret_buffer, secured_message_context->hash_size, req_secret_fill);
71 :
72 83 : libspdm_copy_mem(secured_message_context->application_secret.response_data_secret,
73 : sizeof(secured_message_context->application_secret.response_data_secret),
74 : m_rsp_secret_buffer, secured_message_context->aead_key_size);
75 83 : libspdm_copy_mem(secured_message_context->application_secret.request_data_secret,
76 : sizeof(secured_message_context->application_secret.request_data_secret),
77 : m_req_secret_buffer, secured_message_context->aead_key_size);
78 :
79 83 : libspdm_set_mem(secured_message_context->application_secret
80 83 : .response_data_encryption_key,
81 : secured_message_context->aead_key_size, (uint8_t)(0xFF));
82 83 : libspdm_set_mem(secured_message_context->application_secret
83 83 : .response_data_salt,
84 : secured_message_context->aead_iv_size, (uint8_t)(0xFF));
85 :
86 :
87 83 : libspdm_set_mem(secured_message_context->application_secret
88 83 : .request_data_encryption_key,
89 : secured_message_context->aead_key_size, (uint8_t)(0xEE));
90 83 : libspdm_set_mem(secured_message_context->application_secret
91 83 : .request_data_salt,
92 : secured_message_context->aead_iv_size, (uint8_t)(0xEE));
93 :
94 : secured_message_context->application_secret.
95 83 : response_data_sequence_number = 0;
96 : secured_message_context->application_secret.
97 83 : request_data_sequence_number = 0;
98 83 : }
99 :
100 35 : static void libspdm_compute_secret_update(spdm_version_number_t spdm_version,
101 : size_t hash_size,
102 : const uint8_t *in_secret, uint8_t *out_secret,
103 : size_t out_secret_size)
104 : {
105 : uint8_t bin_str9[128];
106 : size_t bin_str9_size;
107 :
108 35 : bin_str9_size = sizeof(bin_str9);
109 35 : libspdm_bin_concat(spdm_version,
110 : SPDM_BIN_STR_9_LABEL, sizeof(SPDM_BIN_STR_9_LABEL) - 1,
111 35 : NULL, (uint16_t)hash_size, hash_size, bin_str9,
112 : &bin_str9_size);
113 :
114 35 : libspdm_hkdf_expand(m_libspdm_use_hash_algo, in_secret, hash_size, bin_str9,
115 : bin_str9_size, out_secret, out_secret_size);
116 35 : }
117 :
118 128 : static libspdm_return_t send_message(
119 : void *spdm_context, size_t request_size, const void *request, uint64_t timeout)
120 : {
121 : libspdm_test_context_t *spdm_test_context;
122 :
123 128 : spdm_test_context = libspdm_get_test_context();
124 128 : switch (spdm_test_context->case_id) {
125 1 : case 0x1:
126 1 : return LIBSPDM_STATUS_SEND_FAIL;
127 2 : case 0x2: {
128 : libspdm_return_t status;
129 : uint8_t *decoded_message;
130 : size_t decoded_message_size;
131 : uint32_t session_id;
132 : uint32_t *message_session_id;
133 : bool is_app_message;
134 : libspdm_session_info_t *session_info;
135 : uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
136 :
137 2 : message_session_id = NULL;
138 2 : session_id = 0xFFFFFFFF;
139 :
140 2 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
141 2 : if (session_info == NULL) {
142 0 : return LIBSPDM_STATUS_SEND_FAIL;
143 : }
144 :
145 2 : memcpy(message_buffer, request, request_size);
146 :
147 : ((libspdm_secured_message_context_t
148 2 : *)(session_info->secured_message_context))
149 2 : ->application_secret.request_data_sequence_number--;
150 2 : libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message, &decoded_message_size);
151 2 : status = libspdm_transport_test_decode_message(spdm_context,
152 : &message_session_id, &is_app_message, true,
153 : request_size,
154 : message_buffer, &decoded_message_size,
155 : (void **)&decoded_message);
156 2 : if (LIBSPDM_STATUS_IS_ERROR(status)) {
157 0 : return LIBSPDM_STATUS_SEND_FAIL;
158 : }
159 :
160 2 : m_libspdm_last_token = ((spdm_key_update_request_t
161 2 : *) decoded_message)->header.param2;
162 : }
163 2 : return LIBSPDM_STATUS_SUCCESS;
164 0 : case 0x3: {
165 : static size_t sub_index = 0;
166 :
167 0 : if(sub_index > 0) {
168 : libspdm_return_t status;
169 : uint8_t *decoded_message;
170 : size_t decoded_message_size;
171 : uint32_t session_id;
172 : uint32_t *message_session_id;
173 : bool is_app_message;
174 : libspdm_session_info_t *session_info;
175 : uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
176 :
177 0 : message_session_id = NULL;
178 0 : session_id = 0xFFFFFFFF;
179 :
180 0 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
181 0 : if (session_info == NULL) {
182 0 : return LIBSPDM_STATUS_SEND_FAIL;
183 : }
184 :
185 0 : memcpy(message_buffer, request, request_size);
186 :
187 : ((libspdm_secured_message_context_t
188 0 : *)(session_info->secured_message_context))
189 0 : ->application_secret.request_data_sequence_number--;
190 0 : libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message,
191 : &decoded_message_size);
192 0 : status = libspdm_transport_test_decode_message(spdm_context,
193 : &message_session_id, &is_app_message,
194 : true,
195 : request_size,
196 : message_buffer, &decoded_message_size,
197 : (void **)&decoded_message);
198 0 : if (LIBSPDM_STATUS_IS_ERROR(status)) {
199 0 : return LIBSPDM_STATUS_SEND_FAIL;
200 : }
201 :
202 0 : m_libspdm_last_token = ((spdm_key_update_request_t
203 0 : *) decoded_message)->header.param2;
204 : }
205 :
206 0 : sub_index++;
207 : }
208 0 : return LIBSPDM_STATUS_SUCCESS;
209 1 : case 0x4: {
210 : static size_t sub_index = 0;
211 :
212 1 : if(sub_index > 0) {
213 : libspdm_return_t status;
214 : uint8_t *decoded_message;
215 : size_t decoded_message_size;
216 : uint32_t session_id;
217 : uint32_t *message_session_id;
218 : bool is_app_message;
219 : libspdm_session_info_t *session_info;
220 : uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
221 :
222 0 : message_session_id = NULL;
223 0 : session_id = 0xFFFFFFFF;
224 :
225 0 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
226 0 : if (session_info == NULL) {
227 0 : return LIBSPDM_STATUS_SEND_FAIL;
228 : }
229 :
230 0 : memcpy(message_buffer, request, request_size);
231 :
232 : ((libspdm_secured_message_context_t
233 0 : *)(session_info->secured_message_context))
234 0 : ->application_secret.request_data_sequence_number--;
235 0 : libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message,
236 : &decoded_message_size);
237 0 : status = libspdm_transport_test_decode_message(spdm_context,
238 : &message_session_id, &is_app_message,
239 : true,
240 : request_size,
241 : message_buffer, &decoded_message_size,
242 : (void **)&decoded_message);
243 0 : if (LIBSPDM_STATUS_IS_ERROR(status)) {
244 0 : return LIBSPDM_STATUS_SEND_FAIL;
245 : }
246 :
247 0 : m_libspdm_last_token = ((spdm_key_update_request_t
248 0 : *) decoded_message)->header.param2;
249 : }
250 :
251 1 : sub_index++;
252 : }
253 1 : return LIBSPDM_STATUS_SUCCESS;
254 1 : case 0x5: {
255 : static size_t sub_index = 0;
256 :
257 1 : if(sub_index > 0) {
258 : libspdm_return_t status;
259 : uint8_t *decoded_message;
260 : size_t decoded_message_size;
261 : uint32_t session_id;
262 : uint32_t *message_session_id;
263 : bool is_app_message;
264 : libspdm_session_info_t *session_info;
265 : uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
266 :
267 0 : message_session_id = NULL;
268 0 : session_id = 0xFFFFFFFF;
269 :
270 0 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
271 0 : if (session_info == NULL) {
272 0 : return LIBSPDM_STATUS_SEND_FAIL;
273 : }
274 :
275 0 : memcpy(message_buffer, request, request_size);
276 :
277 : ((libspdm_secured_message_context_t
278 0 : *)(session_info->secured_message_context))
279 0 : ->application_secret.request_data_sequence_number--;
280 0 : libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message,
281 : &decoded_message_size);
282 0 : status = libspdm_transport_test_decode_message(spdm_context,
283 : &message_session_id, &is_app_message,
284 : true,
285 : request_size,
286 : message_buffer, &decoded_message_size,
287 : (void **)&decoded_message);
288 0 : if (LIBSPDM_STATUS_IS_ERROR(status)) {
289 0 : return LIBSPDM_STATUS_SEND_FAIL;
290 : }
291 :
292 0 : m_libspdm_last_token = ((spdm_key_update_request_t
293 0 : *) decoded_message)->header.param2;
294 : }
295 :
296 1 : sub_index++;
297 : }
298 1 : return LIBSPDM_STATUS_SUCCESS;
299 3 : case 0x6: {
300 : static size_t sub_index = 0;
301 :
302 3 : if(sub_index > 0) {
303 : libspdm_return_t status;
304 : uint8_t *decoded_message;
305 : size_t decoded_message_size;
306 : uint32_t session_id;
307 : uint32_t *message_session_id;
308 : bool is_app_message;
309 : libspdm_session_info_t *session_info;
310 : uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
311 :
312 2 : message_session_id = NULL;
313 2 : session_id = 0xFFFFFFFF;
314 :
315 2 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
316 2 : if (session_info == NULL) {
317 0 : return LIBSPDM_STATUS_SEND_FAIL;
318 : }
319 :
320 2 : memcpy(message_buffer, request, request_size);
321 :
322 : ((libspdm_secured_message_context_t
323 2 : *)(session_info->secured_message_context))
324 2 : ->application_secret.request_data_sequence_number--;
325 2 : libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message,
326 : &decoded_message_size);
327 2 : status = libspdm_transport_test_decode_message(spdm_context,
328 : &message_session_id, &is_app_message,
329 : true,
330 : request_size,
331 : message_buffer, &decoded_message_size,
332 : (void **)&decoded_message);
333 2 : if (LIBSPDM_STATUS_IS_ERROR(status)) {
334 0 : return LIBSPDM_STATUS_SEND_FAIL;
335 : }
336 :
337 2 : m_libspdm_last_token = ((spdm_key_update_request_t
338 2 : *) decoded_message)->header.param2;
339 : }
340 :
341 3 : sub_index++;
342 : }
343 3 : return LIBSPDM_STATUS_SUCCESS;
344 3 : case 0x7:
345 : case 0x8:
346 3 : return LIBSPDM_STATUS_SUCCESS;
347 3 : case 0x9: {
348 : static size_t sub_index = 0;
349 :
350 3 : if(sub_index != 1) {
351 : libspdm_return_t status;
352 : uint8_t *decoded_message;
353 : size_t decoded_message_size;
354 : uint32_t session_id;
355 : uint32_t *message_session_id;
356 : bool is_app_message;
357 : libspdm_session_info_t *session_info;
358 : uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
359 :
360 2 : message_session_id = NULL;
361 2 : session_id = 0xFFFFFFFF;
362 :
363 2 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
364 2 : if (session_info == NULL) {
365 0 : return LIBSPDM_STATUS_SEND_FAIL;
366 : }
367 :
368 2 : memcpy(message_buffer, request, request_size);
369 :
370 : ((libspdm_secured_message_context_t
371 2 : *)(session_info->secured_message_context))
372 2 : ->application_secret.request_data_sequence_number--;
373 2 : libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message,
374 : &decoded_message_size);
375 2 : status = libspdm_transport_test_decode_message(spdm_context,
376 : &message_session_id, &is_app_message,
377 : true,
378 : request_size,
379 : message_buffer, &decoded_message_size,
380 : (void **)&decoded_message);
381 2 : if (LIBSPDM_STATUS_IS_ERROR(status)) {
382 0 : return LIBSPDM_STATUS_SEND_FAIL;
383 : }
384 :
385 2 : m_libspdm_last_token = ((spdm_key_update_request_t
386 2 : *) decoded_message)->header.param2;
387 : }
388 :
389 3 : sub_index++;
390 : }
391 3 : return LIBSPDM_STATUS_SUCCESS;
392 17 : case 0xA:
393 17 : return LIBSPDM_STATUS_SUCCESS;
394 20 : case 0xB:
395 : case 0xC:
396 : case 0xD:
397 : case 0xE:
398 : case 0xF:
399 : case 0x10:
400 : case 0x11:
401 : case 0x12:
402 : case 0x13:
403 : case 0x14:
404 : case 0x15: {
405 : libspdm_return_t status;
406 : uint8_t *decoded_message;
407 : size_t decoded_message_size;
408 : uint32_t session_id;
409 : uint32_t *message_session_id;
410 : bool is_app_message;
411 : libspdm_session_info_t *session_info;
412 : uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
413 :
414 20 : message_session_id = NULL;
415 20 : session_id = 0xFFFFFFFF;
416 :
417 20 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
418 20 : if (session_info == NULL) {
419 0 : return LIBSPDM_STATUS_SEND_FAIL;
420 : }
421 :
422 20 : memcpy(message_buffer, request, request_size);
423 :
424 : ((libspdm_secured_message_context_t
425 20 : *)(session_info->secured_message_context))
426 20 : ->application_secret.request_data_sequence_number--;
427 20 : libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message, &decoded_message_size);
428 20 : status = libspdm_transport_test_decode_message(spdm_context,
429 : &message_session_id, &is_app_message, true,
430 : request_size,
431 : message_buffer, &decoded_message_size,
432 : (void **)&decoded_message);
433 20 : if (LIBSPDM_STATUS_IS_ERROR(status)) {
434 0 : return LIBSPDM_STATUS_SEND_FAIL;
435 : }
436 :
437 20 : m_libspdm_last_token = ((spdm_key_update_request_t
438 20 : *) decoded_message)->header.param2;
439 : }
440 20 : return LIBSPDM_STATUS_SUCCESS;
441 3 : case 0x16: {
442 : static size_t sub_index = 0;
443 :
444 3 : if(sub_index < 2) {
445 : libspdm_return_t status;
446 : uint8_t *decoded_message;
447 : size_t decoded_message_size;
448 : uint32_t session_id;
449 : uint32_t *message_session_id;
450 : bool is_app_message;
451 : libspdm_session_info_t *session_info;
452 : uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
453 :
454 2 : message_session_id = NULL;
455 2 : session_id = 0xFFFFFFFF;
456 :
457 2 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
458 2 : if (session_info == NULL) {
459 0 : return LIBSPDM_STATUS_SEND_FAIL;
460 : }
461 :
462 2 : memcpy(message_buffer, request, request_size);
463 :
464 : ((libspdm_secured_message_context_t
465 2 : *)(session_info->secured_message_context))
466 2 : ->application_secret.request_data_sequence_number--;
467 2 : libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message,
468 : &decoded_message_size);
469 2 : status = libspdm_transport_test_decode_message(spdm_context,
470 : &message_session_id, &is_app_message,
471 : true,
472 : request_size,
473 : message_buffer, &decoded_message_size,
474 : (void **)&decoded_message);
475 2 : if (LIBSPDM_STATUS_IS_ERROR(status)) {
476 0 : return LIBSPDM_STATUS_SEND_FAIL;
477 : }
478 :
479 2 : m_libspdm_last_token = ((spdm_key_update_request_t
480 2 : *) decoded_message)->header.param2;
481 : }
482 :
483 3 : sub_index++;
484 : }
485 3 : return LIBSPDM_STATUS_SUCCESS;
486 34 : case 0x17: {
487 : static size_t sub_index = 0;
488 :
489 34 : LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "send message: %zu\n", sub_index));
490 :
491 34 : if(sub_index%2 == 0) {
492 : libspdm_return_t status;
493 : uint8_t *decoded_message;
494 : size_t decoded_message_size;
495 : uint32_t session_id;
496 : uint32_t *message_session_id;
497 : bool is_app_message;
498 : libspdm_session_info_t *session_info;
499 : uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
500 :
501 17 : message_session_id = NULL;
502 17 : session_id = 0xFFFFFFFF;
503 :
504 17 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
505 17 : if (session_info == NULL) {
506 0 : return LIBSPDM_STATUS_SEND_FAIL;
507 : }
508 :
509 17 : memcpy(message_buffer, request, request_size);
510 :
511 : ((libspdm_secured_message_context_t
512 17 : *)(session_info->secured_message_context))
513 17 : ->application_secret.request_data_sequence_number--;
514 17 : libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message,
515 : &decoded_message_size);
516 17 : status = libspdm_transport_test_decode_message(spdm_context,
517 : &message_session_id, &is_app_message,
518 : true,
519 : request_size,
520 : message_buffer, &decoded_message_size,
521 : (void **)&decoded_message);
522 17 : if (LIBSPDM_STATUS_IS_ERROR(status)) {
523 0 : return LIBSPDM_STATUS_SEND_FAIL;
524 : }
525 :
526 17 : m_libspdm_last_token = ((spdm_key_update_request_t
527 17 : *) decoded_message)->header.param2;
528 :
529 17 : LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "last token: %x\n", m_libspdm_last_token));
530 : }
531 :
532 34 : sub_index++;
533 : }
534 34 : return LIBSPDM_STATUS_SUCCESS;
535 6 : case 0x18:
536 : case 0x19:
537 : case 0x1A: {
538 : libspdm_return_t status;
539 : uint8_t *decoded_message;
540 : size_t decoded_message_size;
541 : uint32_t session_id;
542 : uint32_t *message_session_id;
543 : bool is_app_message;
544 : libspdm_session_info_t *session_info;
545 : uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
546 :
547 6 : message_session_id = NULL;
548 6 : session_id = 0xFFFFFFFF;
549 :
550 6 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
551 6 : if (session_info == NULL) {
552 0 : return LIBSPDM_STATUS_SEND_FAIL;
553 : }
554 :
555 6 : memcpy(message_buffer, request, request_size);
556 :
557 : ((libspdm_secured_message_context_t
558 6 : *)(session_info->secured_message_context))
559 6 : ->application_secret.request_data_sequence_number--;
560 6 : libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message, &decoded_message_size);
561 6 : status = libspdm_transport_test_decode_message(spdm_context,
562 : &message_session_id, &is_app_message, true,
563 : request_size,
564 : message_buffer, &decoded_message_size,
565 : (void **)&decoded_message);
566 6 : if (LIBSPDM_STATUS_IS_ERROR(status)) {
567 0 : return LIBSPDM_STATUS_SEND_FAIL;
568 : }
569 :
570 6 : m_libspdm_last_token = ((spdm_key_update_request_t
571 6 : *) decoded_message)->header.param2;
572 : }
573 6 : return LIBSPDM_STATUS_SUCCESS;
574 2 : case 0x1B: {
575 : libspdm_return_t status;
576 : uint8_t *decoded_message;
577 : size_t decoded_message_size;
578 : uint32_t session_id;
579 : uint32_t *message_session_id;
580 : bool is_app_message;
581 : libspdm_session_info_t *session_info;
582 : uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
583 :
584 2 : message_session_id = NULL;
585 2 : session_id = 0xFFFFFFFF;
586 :
587 2 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
588 2 : if (session_info == NULL) {
589 0 : return LIBSPDM_STATUS_SEND_FAIL;
590 : }
591 :
592 2 : memcpy(message_buffer, request, request_size);
593 :
594 : ((libspdm_secured_message_context_t
595 2 : *)(session_info->secured_message_context))
596 2 : ->application_secret.request_data_sequence_number--;
597 2 : libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message, &decoded_message_size);
598 2 : status = libspdm_transport_test_decode_message(spdm_context,
599 : &message_session_id, &is_app_message, true,
600 : request_size,
601 : message_buffer, &decoded_message_size,
602 : (void **)&decoded_message);
603 2 : if (LIBSPDM_STATUS_IS_ERROR(status)) {
604 0 : return LIBSPDM_STATUS_SEND_FAIL;
605 : }
606 :
607 2 : m_libspdm_last_token = ((spdm_key_update_request_t
608 2 : *) decoded_message)->header.param2;
609 : }
610 2 : return LIBSPDM_STATUS_SUCCESS;
611 1 : case 0x1C: {
612 : static size_t sub_index = 0;
613 :
614 1 : if(sub_index > 0) {
615 : libspdm_return_t status;
616 : uint8_t *decoded_message;
617 : size_t decoded_message_size;
618 : uint32_t session_id;
619 : uint32_t *message_session_id;
620 : bool is_app_message;
621 : libspdm_session_info_t *session_info;
622 : uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
623 :
624 0 : message_session_id = NULL;
625 0 : session_id = 0xFFFFFFFF;
626 :
627 0 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
628 0 : if (session_info == NULL) {
629 0 : return LIBSPDM_STATUS_SEND_FAIL;
630 : }
631 :
632 0 : memcpy(message_buffer, request, request_size);
633 :
634 : ((libspdm_secured_message_context_t
635 0 : *)(session_info->secured_message_context))
636 0 : ->application_secret.request_data_sequence_number--;
637 0 : libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message,
638 : &decoded_message_size);
639 0 : status = libspdm_transport_test_decode_message(spdm_context,
640 : &message_session_id, &is_app_message,
641 : true,
642 : request_size,
643 : message_buffer, &decoded_message_size,
644 : (void **)&decoded_message);
645 0 : if (LIBSPDM_STATUS_IS_ERROR(status)) {
646 0 : return LIBSPDM_STATUS_SEND_FAIL;
647 : }
648 :
649 0 : m_libspdm_last_token = ((spdm_key_update_request_t
650 0 : *) decoded_message)->header.param2;
651 : }
652 :
653 1 : sub_index++;
654 : }
655 1 : return LIBSPDM_STATUS_SUCCESS;
656 4 : case 0x1D: {
657 : static size_t sub_index = 0;
658 :
659 4 : if(sub_index > 0) {
660 : libspdm_return_t status;
661 : uint8_t *decoded_message;
662 : size_t decoded_message_size;
663 : uint32_t session_id;
664 : uint32_t *message_session_id;
665 : bool is_app_message;
666 : libspdm_session_info_t *session_info;
667 : uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
668 :
669 3 : message_session_id = NULL;
670 3 : session_id = 0xFFFFFFFF;
671 :
672 3 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
673 3 : if (session_info == NULL) {
674 0 : return LIBSPDM_STATUS_SEND_FAIL;
675 : }
676 :
677 3 : memcpy(message_buffer, request, request_size);
678 :
679 : ((libspdm_secured_message_context_t
680 3 : *)(session_info->secured_message_context))
681 3 : ->application_secret.request_data_sequence_number--;
682 3 : libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message,
683 : &decoded_message_size);
684 3 : status = libspdm_transport_test_decode_message(spdm_context,
685 : &message_session_id, &is_app_message,
686 : true,
687 : request_size,
688 : message_buffer, &decoded_message_size,
689 : (void **)&decoded_message);
690 3 : if (LIBSPDM_STATUS_IS_ERROR(status)) {
691 0 : return LIBSPDM_STATUS_SEND_FAIL;
692 : }
693 :
694 3 : m_libspdm_last_token = ((spdm_key_update_request_t
695 3 : *) decoded_message)->header.param2;
696 : }
697 :
698 4 : sub_index++;
699 : }
700 4 : return LIBSPDM_STATUS_SUCCESS;
701 3 : case 0x1E: {
702 : static size_t sub_index = 0;
703 :
704 3 : if(sub_index > 0) {
705 : libspdm_return_t status;
706 : uint8_t *decoded_message;
707 : size_t decoded_message_size;
708 : uint32_t session_id;
709 : uint32_t *message_session_id;
710 : bool is_app_message;
711 : libspdm_session_info_t *session_info;
712 : uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
713 :
714 2 : message_session_id = NULL;
715 2 : session_id = 0xFFFFFFFF;
716 :
717 2 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
718 2 : if (session_info == NULL) {
719 0 : return LIBSPDM_STATUS_SEND_FAIL;
720 : }
721 :
722 2 : memcpy(message_buffer, request, request_size);
723 :
724 : ((libspdm_secured_message_context_t
725 2 : *)(session_info->secured_message_context))
726 2 : ->application_secret.request_data_sequence_number--;
727 2 : libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message,
728 : &decoded_message_size);
729 2 : status = libspdm_transport_test_decode_message(spdm_context,
730 : &message_session_id, &is_app_message,
731 : true,
732 : request_size,
733 : message_buffer, &decoded_message_size,
734 : (void **)&decoded_message);
735 2 : if (LIBSPDM_STATUS_IS_ERROR(status)) {
736 0 : return LIBSPDM_STATUS_SEND_FAIL;
737 : }
738 :
739 2 : m_libspdm_last_token = ((spdm_key_update_request_t
740 2 : *) decoded_message)->header.param2;
741 : }
742 :
743 3 : sub_index++;
744 : }
745 3 : return LIBSPDM_STATUS_SUCCESS;
746 3 : case 0x1F:
747 : case 0x20:
748 3 : return LIBSPDM_STATUS_SUCCESS;
749 3 : case 0x21: {
750 : static size_t sub_index = 0;
751 :
752 3 : if(sub_index != 1) {
753 : libspdm_return_t status;
754 : uint8_t *decoded_message;
755 : size_t decoded_message_size;
756 : uint32_t session_id;
757 : uint32_t *message_session_id;
758 : bool is_app_message;
759 : libspdm_session_info_t *session_info;
760 : uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
761 :
762 2 : message_session_id = NULL;
763 2 : session_id = 0xFFFFFFFF;
764 :
765 2 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
766 2 : if (session_info == NULL) {
767 0 : return LIBSPDM_STATUS_SEND_FAIL;
768 : }
769 :
770 2 : memcpy(message_buffer, request, request_size);
771 :
772 : ((libspdm_secured_message_context_t
773 2 : *)(session_info->secured_message_context))
774 2 : ->application_secret.request_data_sequence_number--;
775 2 : libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message,
776 : &decoded_message_size);
777 2 : status = libspdm_transport_test_decode_message(spdm_context,
778 : &message_session_id, &is_app_message,
779 : true,
780 : request_size,
781 : message_buffer, &decoded_message_size,
782 : (void **)&decoded_message);
783 2 : if (LIBSPDM_STATUS_IS_ERROR(status)) {
784 0 : return LIBSPDM_STATUS_SEND_FAIL;
785 : }
786 :
787 2 : m_libspdm_last_token = ((spdm_key_update_request_t
788 2 : *) decoded_message)->header.param2;
789 : }
790 :
791 3 : sub_index++;
792 : }
793 3 : return LIBSPDM_STATUS_SUCCESS;
794 17 : case 0x22:
795 17 : return LIBSPDM_STATUS_SUCCESS;
796 1 : case 0x23:
797 1 : return LIBSPDM_STATUS_SUCCESS;
798 0 : default:
799 0 : return LIBSPDM_STATUS_SEND_FAIL;
800 : }
801 : }
802 :
803 127 : static libspdm_return_t receive_message(
804 : void *spdm_context, size_t *response_size, void **response, uint64_t timeout)
805 : {
806 : libspdm_test_context_t *spdm_test_context;
807 :
808 127 : spdm_test_context = libspdm_get_test_context();
809 127 : switch (spdm_test_context->case_id) {
810 0 : case 0x1:
811 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
812 :
813 2 : case 0x2: {
814 : static size_t sub_index = 0;
815 :
816 : spdm_key_update_response_t *spdm_response;
817 : size_t spdm_response_size;
818 : size_t transport_header_size;
819 : uint32_t session_id;
820 : libspdm_session_info_t *session_info;
821 : uint8_t *scratch_buffer;
822 : size_t scratch_buffer_size;
823 :
824 2 : spdm_response_size = sizeof(spdm_key_update_response_t);
825 2 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
826 2 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
827 :
828 2 : session_id = 0xFFFFFFFF;
829 :
830 2 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
831 2 : if (session_info == NULL) {
832 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
833 : }
834 :
835 2 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
836 2 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
837 2 : if (sub_index == 0) {
838 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
839 1 : spdm_response->header.param2 = m_libspdm_last_token;
840 1 : } else if (sub_index == 1) {
841 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
842 1 : spdm_response->header.param2 = m_libspdm_last_token;
843 : }
844 :
845 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
846 : * transport_message is always in sender buffer. */
847 2 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
848 2 : libspdm_copy_mem (scratch_buffer + transport_header_size,
849 : scratch_buffer_size - transport_header_size,
850 : spdm_response, spdm_response_size);
851 2 : spdm_response = (void *)(scratch_buffer + transport_header_size);
852 2 : libspdm_transport_test_encode_message(spdm_context, &session_id,
853 : false, false, spdm_response_size,
854 : spdm_response, response_size, response);
855 : /* WALKAROUND: If just use single context to encode
856 : * message and then decode message */
857 : ((libspdm_secured_message_context_t
858 2 : *)(session_info->secured_message_context))
859 2 : ->application_secret.response_data_sequence_number--;
860 :
861 2 : sub_index++;
862 : }
863 2 : return LIBSPDM_STATUS_SUCCESS;
864 :
865 0 : case 0x3: {
866 : static size_t sub_index = 0;
867 :
868 : spdm_key_update_response_t *spdm_response;
869 : size_t spdm_response_size;
870 : size_t transport_header_size;
871 : uint32_t session_id;
872 : libspdm_session_info_t *session_info;
873 : uint8_t *scratch_buffer;
874 : size_t scratch_buffer_size;
875 :
876 0 : spdm_response_size = sizeof(spdm_key_update_response_t);
877 0 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
878 0 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
879 :
880 0 : session_id = 0xFFFFFFFF;
881 :
882 0 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
883 0 : if (session_info == NULL) {
884 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
885 : }
886 :
887 0 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
888 0 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
889 0 : if (sub_index == 0) {
890 0 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
891 0 : spdm_response->header.param2 = m_libspdm_last_token;
892 0 : } else if (sub_index == 1) {
893 0 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
894 0 : spdm_response->header.param2 = m_libspdm_last_token;
895 : }
896 :
897 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
898 : * transport_message is always in sender buffer. */
899 0 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
900 0 : libspdm_copy_mem (scratch_buffer + transport_header_size,
901 : scratch_buffer_size - transport_header_size,
902 : spdm_response, spdm_response_size);
903 0 : spdm_response = (void *)(scratch_buffer + transport_header_size);
904 0 : libspdm_transport_test_encode_message(spdm_context, &session_id,
905 : false, false, spdm_response_size,
906 : spdm_response, response_size, response);
907 : /* WALKAROUND: If just use single context to encode
908 : * message and then decode message */
909 : ((libspdm_secured_message_context_t
910 0 : *)(session_info->secured_message_context))
911 0 : ->application_secret.response_data_sequence_number--;
912 :
913 0 : sub_index++;
914 : }
915 0 : return LIBSPDM_STATUS_SUCCESS;
916 :
917 1 : case 0x4: {
918 : spdm_error_response_t *spdm_response;
919 : size_t spdm_response_size;
920 : size_t transport_header_size;
921 : uint32_t session_id;
922 : libspdm_session_info_t *session_info;
923 : uint8_t *scratch_buffer;
924 : size_t scratch_buffer_size;
925 :
926 1 : spdm_response_size = sizeof(spdm_error_response_t);
927 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
928 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
929 :
930 1 : session_id = 0xFFFFFFFF;
931 1 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
932 1 : if (session_info == NULL) {
933 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
934 : }
935 :
936 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
937 1 : spdm_response->header.request_response_code = SPDM_ERROR;
938 1 : spdm_response->header.param1 = SPDM_ERROR_CODE_INVALID_REQUEST;
939 1 : spdm_response->header.param2 = 0;
940 :
941 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
942 : * transport_message is always in sender buffer. */
943 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
944 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
945 : scratch_buffer_size - transport_header_size,
946 : spdm_response, spdm_response_size);
947 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
948 1 : libspdm_transport_test_encode_message(spdm_context, &session_id,
949 : false, false, spdm_response_size,
950 : spdm_response, response_size, response);
951 : /* WALKAROUND: If just use single context to encode
952 : * message and then decode message */
953 : ((libspdm_secured_message_context_t
954 1 : *)(session_info->secured_message_context))
955 1 : ->application_secret.response_data_sequence_number--;
956 : }
957 1 : return LIBSPDM_STATUS_SUCCESS;
958 :
959 1 : case 0x5: {
960 : spdm_error_response_t *spdm_response;
961 : size_t spdm_response_size;
962 : size_t transport_header_size;
963 : uint32_t session_id;
964 : libspdm_session_info_t *session_info;
965 : uint8_t *scratch_buffer;
966 : size_t scratch_buffer_size;
967 :
968 1 : spdm_response_size = sizeof(spdm_error_response_t);
969 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
970 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
971 :
972 1 : session_id = 0xFFFFFFFF;
973 1 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
974 1 : if (session_info == NULL) {
975 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
976 : }
977 :
978 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
979 1 : spdm_response->header.request_response_code = SPDM_ERROR;
980 1 : spdm_response->header.param1 = SPDM_ERROR_CODE_BUSY;
981 1 : spdm_response->header.param2 = 0;
982 :
983 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
984 : * transport_message is always in sender buffer. */
985 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
986 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
987 : scratch_buffer_size - transport_header_size,
988 : spdm_response, spdm_response_size);
989 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
990 1 : libspdm_transport_test_encode_message(spdm_context, &session_id,
991 : false, false, spdm_response_size,
992 : spdm_response, response_size, response);
993 : /* WALKAROUND: If just use single context to encode
994 : * message and then decode message */
995 : ((libspdm_secured_message_context_t
996 1 : *)(session_info->secured_message_context))
997 1 : ->application_secret.response_data_sequence_number--;
998 : }
999 1 : return LIBSPDM_STATUS_SUCCESS;
1000 :
1001 3 : case 0x6: {
1002 : static size_t sub_index = 0;
1003 :
1004 : uint32_t session_id;
1005 : libspdm_session_info_t *session_info;
1006 :
1007 3 : session_id = 0xFFFFFFFF;
1008 3 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
1009 3 : if (session_info == NULL) {
1010 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
1011 : }
1012 :
1013 3 : if (sub_index == 0) {
1014 : spdm_error_response_t *spdm_response;
1015 : size_t spdm_response_size;
1016 : size_t transport_header_size;
1017 : uint8_t *scratch_buffer;
1018 : size_t scratch_buffer_size;
1019 :
1020 1 : spdm_response_size = sizeof(spdm_error_response_t);
1021 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
1022 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
1023 :
1024 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
1025 1 : spdm_response->header.request_response_code = SPDM_ERROR;
1026 1 : spdm_response->header.param1 = SPDM_ERROR_CODE_BUSY;
1027 1 : spdm_response->header.param2 = 0;
1028 :
1029 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
1030 : * transport_message is always in sender buffer. */
1031 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
1032 : &scratch_buffer_size);
1033 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
1034 : scratch_buffer_size - transport_header_size,
1035 : spdm_response, spdm_response_size);
1036 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
1037 1 : libspdm_transport_test_encode_message(spdm_context,
1038 : &session_id, false, false,
1039 : spdm_response_size, spdm_response,
1040 : response_size, response);
1041 : /* WALKAROUND: If just use single context to encode
1042 : * message and then decode message */
1043 : ((libspdm_secured_message_context_t
1044 1 : *)(session_info->secured_message_context))
1045 1 : ->application_secret.response_data_sequence_number--;
1046 2 : } else if (sub_index == 1) {
1047 : spdm_key_update_response_t *spdm_response;
1048 : size_t spdm_response_size;
1049 : size_t transport_header_size;
1050 : uint8_t *scratch_buffer;
1051 : size_t scratch_buffer_size;
1052 :
1053 1 : spdm_response_size = sizeof(spdm_key_update_response_t);
1054 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
1055 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
1056 :
1057 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
1058 1 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
1059 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
1060 1 : spdm_response->header.param2 = m_libspdm_last_token;
1061 :
1062 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
1063 : * transport_message is always in sender buffer. */
1064 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
1065 : &scratch_buffer_size);
1066 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
1067 : scratch_buffer_size - transport_header_size,
1068 : spdm_response, spdm_response_size);
1069 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
1070 1 : libspdm_transport_test_encode_message(spdm_context,
1071 : &session_id, false, false,
1072 : spdm_response_size, spdm_response,
1073 : response_size, response);
1074 : /* WALKAROUND: If just use single context to encode
1075 : * message and then decode message */
1076 : ((libspdm_secured_message_context_t
1077 1 : *)(session_info->secured_message_context))
1078 1 : ->application_secret.response_data_sequence_number--;
1079 1 : } else if (sub_index == 2) {
1080 : spdm_key_update_response_t *spdm_response;
1081 : size_t spdm_response_size;
1082 : size_t transport_header_size;
1083 : uint8_t *scratch_buffer;
1084 : size_t scratch_buffer_size;
1085 :
1086 1 : spdm_response_size = sizeof(spdm_key_update_response_t);
1087 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
1088 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
1089 :
1090 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
1091 1 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
1092 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
1093 1 : spdm_response->header.param2 = m_libspdm_last_token;
1094 :
1095 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
1096 : * transport_message is always in sender buffer. */
1097 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
1098 : &scratch_buffer_size);
1099 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
1100 : scratch_buffer_size - transport_header_size,
1101 : spdm_response, spdm_response_size);
1102 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
1103 1 : libspdm_transport_test_encode_message(spdm_context,
1104 : &session_id, false, false,
1105 : spdm_response_size, spdm_response,
1106 : response_size, response);
1107 : /* WALKAROUND: If just use single context to encode
1108 : * message and then decode message */
1109 : ((libspdm_secured_message_context_t
1110 1 : *)(session_info->secured_message_context))
1111 1 : ->application_secret.response_data_sequence_number--;
1112 : }
1113 :
1114 3 : sub_index++;
1115 : }
1116 3 : return LIBSPDM_STATUS_SUCCESS;
1117 :
1118 1 : case 0x7: {
1119 : spdm_error_response_t *spdm_response;
1120 : size_t spdm_response_size;
1121 : size_t transport_header_size;
1122 : uint32_t session_id;
1123 : libspdm_session_info_t *session_info;
1124 : uint8_t *scratch_buffer;
1125 : size_t scratch_buffer_size;
1126 :
1127 1 : spdm_response_size = sizeof(spdm_error_response_t);
1128 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
1129 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
1130 :
1131 1 : session_id = 0xFFFFFFFF;
1132 1 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
1133 1 : if (session_info == NULL) {
1134 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
1135 : }
1136 :
1137 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_10;
1138 1 : spdm_response->header.request_response_code = SPDM_ERROR;
1139 1 : spdm_response->header.param1 = SPDM_ERROR_CODE_REQUEST_RESYNCH;
1140 1 : spdm_response->header.param2 = 0;
1141 :
1142 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
1143 : * transport_message is always in sender buffer. */
1144 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
1145 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
1146 : scratch_buffer_size - transport_header_size,
1147 : spdm_response, spdm_response_size);
1148 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
1149 1 : libspdm_transport_test_encode_message(spdm_context, &session_id,
1150 : false, false, spdm_response_size,
1151 : spdm_response, response_size, response);
1152 : /* WALKAROUND: If just use single context to encode
1153 : * message and then decode message */
1154 : ((libspdm_secured_message_context_t
1155 1 : *)(session_info->secured_message_context))
1156 1 : ->application_secret.response_data_sequence_number--;
1157 : }
1158 1 : return LIBSPDM_STATUS_SUCCESS;
1159 :
1160 2 : case 0x8: {
1161 : spdm_error_response_data_response_not_ready_t *spdm_response;
1162 : size_t spdm_response_size;
1163 : size_t transport_header_size;
1164 : uint32_t session_id;
1165 : libspdm_session_info_t *session_info;
1166 : uint8_t *scratch_buffer;
1167 : size_t scratch_buffer_size;
1168 :
1169 2 : spdm_response_size = sizeof(spdm_error_response_data_response_not_ready_t);
1170 2 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
1171 2 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
1172 :
1173 2 : session_id = 0xFFFFFFFF;
1174 2 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
1175 2 : if (session_info == NULL) {
1176 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
1177 : }
1178 :
1179 2 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
1180 2 : spdm_response->header.request_response_code = SPDM_ERROR;
1181 2 : spdm_response->header.param1 = SPDM_ERROR_CODE_RESPONSE_NOT_READY;
1182 2 : spdm_response->header.param2 = 0;
1183 2 : spdm_response->extend_error_data.rd_exponent = 1;
1184 2 : spdm_response->extend_error_data.rd_tm = 2;
1185 2 : spdm_response->extend_error_data.request_code = SPDM_KEY_UPDATE;
1186 2 : spdm_response->extend_error_data.token = 0;
1187 :
1188 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
1189 : * transport_message is always in sender buffer. */
1190 2 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
1191 2 : libspdm_copy_mem (scratch_buffer + transport_header_size,
1192 : scratch_buffer_size - transport_header_size,
1193 : spdm_response, spdm_response_size);
1194 2 : spdm_response = (void *)(scratch_buffer + transport_header_size);
1195 2 : libspdm_transport_test_encode_message(spdm_context, &session_id,
1196 : false, false, spdm_response_size,
1197 : spdm_response, response_size, response);
1198 : /* WALKAROUND: If just use single context to encode
1199 : * message and then decode message */
1200 : ((libspdm_secured_message_context_t
1201 2 : *)(session_info->secured_message_context))
1202 2 : ->application_secret.response_data_sequence_number--;
1203 : }
1204 2 : return LIBSPDM_STATUS_SUCCESS;
1205 :
1206 3 : case 0x9: {
1207 : static size_t sub_index = 0;
1208 :
1209 : uint32_t session_id;
1210 : libspdm_session_info_t *session_info;
1211 :
1212 3 : session_id = 0xFFFFFFFF;
1213 3 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
1214 3 : if (session_info == NULL) {
1215 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
1216 : }
1217 :
1218 3 : if (sub_index == 0) {
1219 : spdm_error_response_data_response_not_ready_t
1220 : *spdm_response;
1221 : size_t spdm_response_size;
1222 : size_t transport_header_size;
1223 : uint8_t *scratch_buffer;
1224 : size_t scratch_buffer_size;
1225 :
1226 1 : spdm_response_size = sizeof(spdm_error_response_data_response_not_ready_t);
1227 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
1228 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
1229 :
1230 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
1231 1 : spdm_response->header.request_response_code = SPDM_ERROR;
1232 1 : spdm_response->header.param1 = SPDM_ERROR_CODE_RESPONSE_NOT_READY;
1233 1 : spdm_response->header.param2 = 0;
1234 1 : spdm_response->extend_error_data.rd_exponent = 1;
1235 1 : spdm_response->extend_error_data.rd_tm = 2;
1236 1 : spdm_response->extend_error_data.request_code = SPDM_KEY_UPDATE;
1237 1 : spdm_response->extend_error_data.token = 1;
1238 :
1239 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
1240 : * transport_message is always in sender buffer. */
1241 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
1242 : &scratch_buffer_size);
1243 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
1244 : scratch_buffer_size - transport_header_size,
1245 : spdm_response, spdm_response_size);
1246 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
1247 1 : libspdm_transport_test_encode_message(spdm_context,
1248 : &session_id, false, false,
1249 : spdm_response_size, spdm_response,
1250 : response_size, response);
1251 : /* WALKAROUND: If just use single context to encode
1252 : * message and then decode message */
1253 : ((libspdm_secured_message_context_t
1254 1 : *)(session_info->secured_message_context))
1255 1 : ->application_secret.response_data_sequence_number--;
1256 2 : } else if (sub_index == 1) {
1257 : spdm_key_update_response_t *spdm_response;
1258 : size_t spdm_response_size;
1259 : size_t transport_header_size;
1260 : uint8_t *scratch_buffer;
1261 : size_t scratch_buffer_size;
1262 :
1263 1 : spdm_response_size = sizeof(spdm_key_update_response_t);
1264 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
1265 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
1266 :
1267 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
1268 1 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
1269 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
1270 1 : spdm_response->header.param2 = m_libspdm_last_token;
1271 :
1272 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
1273 : * transport_message is always in sender buffer. */
1274 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
1275 : &scratch_buffer_size);
1276 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
1277 : scratch_buffer_size - transport_header_size,
1278 : spdm_response, spdm_response_size);
1279 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
1280 1 : libspdm_transport_test_encode_message(spdm_context,
1281 : &session_id, false, false,
1282 : spdm_response_size, spdm_response,
1283 : response_size, response);
1284 : /* WALKAROUND: If just use single context to encode
1285 : * message and then decode message */
1286 : ((libspdm_secured_message_context_t
1287 1 : *)(session_info->secured_message_context))
1288 1 : ->application_secret.response_data_sequence_number--;
1289 1 : } else if (sub_index == 2) {
1290 : spdm_key_update_response_t *spdm_response;
1291 : size_t spdm_response_size;
1292 : size_t transport_header_size;
1293 : uint8_t *scratch_buffer;
1294 : size_t scratch_buffer_size;
1295 :
1296 1 : spdm_response_size = sizeof(spdm_key_update_response_t);
1297 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
1298 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
1299 :
1300 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
1301 1 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
1302 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
1303 1 : spdm_response->header.param2 = m_libspdm_last_token;
1304 :
1305 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
1306 : * transport_message is always in sender buffer. */
1307 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
1308 : &scratch_buffer_size);
1309 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
1310 : scratch_buffer_size - transport_header_size,
1311 : spdm_response, spdm_response_size);
1312 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
1313 1 : libspdm_transport_test_encode_message(spdm_context,
1314 : &session_id, false, false,
1315 : spdm_response_size, spdm_response,
1316 : response_size, response);
1317 : /* WALKAROUND: If just use single context to encode
1318 : * message and then decode message */
1319 : ((libspdm_secured_message_context_t
1320 1 : *)(session_info->secured_message_context))
1321 1 : ->application_secret.response_data_sequence_number--;
1322 : }
1323 :
1324 3 : sub_index++;
1325 : }
1326 3 : return LIBSPDM_STATUS_SUCCESS;
1327 :
1328 17 : case 0xA: {
1329 : static uint16_t error_code = LIBSPDM_ERROR_CODE_RESERVED_00;
1330 :
1331 : uint32_t session_id;
1332 : libspdm_session_info_t *session_info;
1333 :
1334 : spdm_error_response_t *spdm_response;
1335 : size_t spdm_response_size;
1336 : size_t transport_header_size;
1337 : uint8_t *scratch_buffer;
1338 : size_t scratch_buffer_size;
1339 :
1340 17 : spdm_response_size = sizeof(spdm_error_response_t);
1341 17 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
1342 17 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
1343 :
1344 17 : session_id = 0xFFFFFFFF;
1345 17 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
1346 17 : if (session_info == NULL) {
1347 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
1348 : }
1349 :
1350 17 : if(error_code <= 0xff) {
1351 : /* skip SPDM_ERROR_CODE_DECRYPT_ERROR, because this case will free context*/
1352 17 : if(error_code == SPDM_ERROR_CODE_DECRYPT_ERROR) {
1353 1 : error_code++;
1354 : }
1355 17 : libspdm_zero_mem (spdm_response, spdm_response_size);
1356 17 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
1357 17 : spdm_response->header.request_response_code = SPDM_ERROR;
1358 17 : spdm_response->header.param1 = (uint8_t) error_code;
1359 17 : spdm_response->header.param2 = 0;
1360 :
1361 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
1362 : * transport_message is always in sender buffer. */
1363 17 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
1364 : &scratch_buffer_size);
1365 17 : libspdm_copy_mem (scratch_buffer + transport_header_size,
1366 : scratch_buffer_size - transport_header_size,
1367 : spdm_response, spdm_response_size);
1368 17 : spdm_response = (void *)(scratch_buffer + transport_header_size);
1369 17 : libspdm_transport_test_encode_message(spdm_context,
1370 : &session_id, false, false,
1371 : spdm_response_size, spdm_response,
1372 : response_size, response);
1373 : /* WALKAROUND: If just use single context to encode
1374 : * message and then decode message */
1375 : ((libspdm_secured_message_context_t
1376 17 : *)(session_info->secured_message_context))
1377 17 : ->application_secret.response_data_sequence_number--;
1378 : }
1379 :
1380 17 : error_code++;
1381 : /*busy is treated in cases 5 and 6*/
1382 17 : if(error_code == SPDM_ERROR_CODE_BUSY) {
1383 1 : error_code = SPDM_ERROR_CODE_UNEXPECTED_REQUEST;
1384 : }
1385 : /*skip some reserved error codes (0d to 3e)*/
1386 17 : if(error_code == LIBSPDM_ERROR_CODE_RESERVED_0D) {
1387 1 : error_code = LIBSPDM_ERROR_CODE_RESERVED_3F;
1388 : }
1389 : /*skip response not ready, request resync, and some reserved codes (44 to fc)*/
1390 17 : if(error_code == SPDM_ERROR_CODE_RESPONSE_NOT_READY) {
1391 1 : error_code = LIBSPDM_ERROR_CODE_RESERVED_FD;
1392 : }
1393 : }
1394 17 : return LIBSPDM_STATUS_SUCCESS;
1395 :
1396 2 : case 0xB: {
1397 : static size_t sub_index = 0;
1398 :
1399 : spdm_key_update_response_t *spdm_response;
1400 : size_t spdm_response_size;
1401 : size_t transport_header_size;
1402 : uint32_t session_id;
1403 : libspdm_session_info_t *session_info;
1404 : uint8_t *scratch_buffer;
1405 : size_t scratch_buffer_size;
1406 :
1407 2 : spdm_response_size = sizeof(spdm_key_update_response_t);
1408 2 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
1409 2 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
1410 :
1411 2 : session_id = 0xFFFFFFFF;
1412 :
1413 2 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
1414 2 : if (session_info == NULL) {
1415 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
1416 : }
1417 :
1418 2 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
1419 2 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
1420 2 : if (sub_index == 0) {
1421 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
1422 1 : spdm_response->header.param2 = m_libspdm_last_token;
1423 1 : } else if (sub_index == 1) {
1424 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
1425 1 : spdm_response->header.param2 = m_libspdm_last_token;
1426 : }
1427 :
1428 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
1429 : * transport_message is always in sender buffer. */
1430 2 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
1431 2 : libspdm_copy_mem (scratch_buffer + transport_header_size,
1432 : scratch_buffer_size - transport_header_size,
1433 : spdm_response, spdm_response_size);
1434 2 : spdm_response = (void *)(scratch_buffer + transport_header_size);
1435 2 : libspdm_transport_test_encode_message(spdm_context, &session_id,
1436 : false, false, spdm_response_size,
1437 : spdm_response, response_size, response);
1438 : /* WALKAROUND: If just use single context to encode
1439 : * message and then decode message */
1440 : ((libspdm_secured_message_context_t
1441 2 : *)(session_info->secured_message_context))
1442 2 : ->application_secret.response_data_sequence_number--;
1443 :
1444 2 : sub_index++;
1445 : }
1446 2 : return LIBSPDM_STATUS_SUCCESS;
1447 :
1448 1 : case 0xC: {
1449 : static size_t sub_index = 0;
1450 :
1451 : spdm_key_update_response_t *spdm_response;
1452 : size_t spdm_response_size;
1453 : size_t transport_header_size;
1454 : uint32_t session_id;
1455 : libspdm_session_info_t *session_info;
1456 : uint8_t *scratch_buffer;
1457 : size_t scratch_buffer_size;
1458 :
1459 1 : spdm_response_size = sizeof(spdm_key_update_response_t);
1460 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
1461 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
1462 :
1463 1 : session_id = 0xFFFFFFFF;
1464 :
1465 1 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
1466 1 : if (session_info == NULL) {
1467 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
1468 : }
1469 :
1470 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
1471 : /*wrong response code*/
1472 1 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE;
1473 1 : if (sub_index == 0) {
1474 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
1475 1 : spdm_response->header.param2 = m_libspdm_last_token;
1476 0 : } else if (sub_index == 1) {
1477 0 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
1478 0 : spdm_response->header.param2 = m_libspdm_last_token;
1479 : }
1480 :
1481 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
1482 : * transport_message is always in sender buffer. */
1483 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
1484 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
1485 : scratch_buffer_size - transport_header_size,
1486 : spdm_response, spdm_response_size);
1487 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
1488 1 : libspdm_transport_test_encode_message(spdm_context, &session_id,
1489 : false, false, spdm_response_size,
1490 : spdm_response, response_size, response);
1491 : /* WALKAROUND: If just use single context to encode
1492 : * message and then decode message */
1493 : ((libspdm_secured_message_context_t
1494 1 : *)(session_info->secured_message_context))
1495 1 : ->application_secret.response_data_sequence_number--;
1496 :
1497 1 : sub_index++;
1498 : }
1499 1 : return LIBSPDM_STATUS_SUCCESS;
1500 :
1501 0 : case 0xD: {
1502 : static size_t sub_index = 0;
1503 :
1504 : spdm_key_update_response_t *spdm_response;
1505 : size_t spdm_response_size;
1506 : size_t transport_header_size;
1507 : uint32_t session_id;
1508 : libspdm_session_info_t *session_info;
1509 : uint8_t *scratch_buffer;
1510 : size_t scratch_buffer_size;
1511 :
1512 0 : spdm_response_size = sizeof(spdm_key_update_response_t);
1513 0 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
1514 0 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
1515 :
1516 0 : session_id = 0xFFFFFFFF;
1517 :
1518 0 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
1519 0 : if (session_info == NULL) {
1520 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
1521 : }
1522 :
1523 0 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
1524 0 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
1525 0 : if (sub_index == 0) {
1526 0 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
1527 0 : spdm_response->header.param2 = m_libspdm_last_token;
1528 0 : } else if (sub_index == 1) {
1529 0 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
1530 0 : spdm_response->header.param2 = m_libspdm_last_token;
1531 : }
1532 :
1533 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
1534 : * transport_message is always in sender buffer. */
1535 0 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
1536 0 : libspdm_copy_mem (scratch_buffer + transport_header_size,
1537 : scratch_buffer_size - transport_header_size,
1538 : spdm_response, spdm_response_size);
1539 0 : spdm_response = (void *)(scratch_buffer + transport_header_size);
1540 0 : libspdm_transport_test_encode_message(spdm_context, &session_id,
1541 : false, false, spdm_response_size,
1542 : spdm_response, response_size, response);
1543 : /* WALKAROUND: If just use single context to encode
1544 : * message and then decode message */
1545 : ((libspdm_secured_message_context_t
1546 0 : *)(session_info->secured_message_context))
1547 0 : ->application_secret.response_data_sequence_number--;
1548 :
1549 0 : sub_index++;
1550 : }
1551 0 : return LIBSPDM_STATUS_SUCCESS;
1552 :
1553 0 : case 0xE: {
1554 : static size_t sub_index = 0;
1555 :
1556 : spdm_key_update_response_t *spdm_response;
1557 : size_t spdm_response_size;
1558 : size_t transport_header_size;
1559 : uint32_t session_id;
1560 : libspdm_session_info_t *session_info;
1561 : uint8_t *scratch_buffer;
1562 : size_t scratch_buffer_size;
1563 :
1564 0 : spdm_response_size = sizeof(spdm_key_update_response_t);
1565 0 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
1566 0 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
1567 :
1568 0 : session_id = 0xFFFFFFFF;
1569 :
1570 0 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
1571 0 : if (session_info == NULL) {
1572 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
1573 : }
1574 :
1575 0 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
1576 0 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
1577 0 : if (sub_index == 0) {
1578 0 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
1579 0 : spdm_response->header.param2 = m_libspdm_last_token;
1580 0 : } else if (sub_index == 1) {
1581 0 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
1582 0 : spdm_response->header.param2 = m_libspdm_last_token;
1583 : }
1584 :
1585 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
1586 : * transport_message is always in sender buffer. */
1587 0 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
1588 0 : libspdm_copy_mem (scratch_buffer + transport_header_size,
1589 : scratch_buffer_size - transport_header_size,
1590 : spdm_response, spdm_response_size);
1591 0 : spdm_response = (void *)(scratch_buffer + transport_header_size);
1592 0 : libspdm_transport_test_encode_message(spdm_context, &session_id,
1593 : false, false, spdm_response_size,
1594 : spdm_response, response_size, response);
1595 : /* WALKAROUND: If just use single context to encode
1596 : * message and then decode message */
1597 : ((libspdm_secured_message_context_t
1598 0 : *)(session_info->secured_message_context))
1599 0 : ->application_secret.response_data_sequence_number--;
1600 :
1601 0 : sub_index++;
1602 : }
1603 0 : return LIBSPDM_STATUS_SUCCESS;
1604 :
1605 1 : case 0xF: {
1606 : static size_t sub_index = 0;
1607 :
1608 : spdm_key_update_response_t *spdm_response;
1609 : size_t spdm_response_size;
1610 : size_t transport_header_size;
1611 : uint32_t session_id;
1612 : libspdm_session_info_t *session_info;
1613 : uint8_t *scratch_buffer;
1614 : size_t scratch_buffer_size;
1615 :
1616 1 : spdm_response_size = sizeof(spdm_key_update_response_t);
1617 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
1618 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
1619 :
1620 1 : session_id = 0xFFFFFFFF;
1621 :
1622 1 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
1623 1 : if (session_info == NULL) {
1624 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
1625 : }
1626 :
1627 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
1628 1 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
1629 1 : if (sub_index == 0) {
1630 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
1631 : /*wrong token*/
1632 1 : spdm_response->header.param2 = m_libspdm_last_token + 1;
1633 0 : } else if (sub_index == 1) {
1634 0 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
1635 0 : spdm_response->header.param2 = m_libspdm_last_token;
1636 : }
1637 :
1638 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
1639 : * transport_message is always in sender buffer. */
1640 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
1641 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
1642 : scratch_buffer_size - transport_header_size,
1643 : spdm_response, spdm_response_size);
1644 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
1645 1 : libspdm_transport_test_encode_message(spdm_context, &session_id,
1646 : false, false, spdm_response_size,
1647 : spdm_response, response_size, response);
1648 : /* WALKAROUND: If just use single context to encode
1649 : * message and then decode message */
1650 : ((libspdm_secured_message_context_t
1651 1 : *)(session_info->secured_message_context))
1652 1 : ->application_secret.response_data_sequence_number--;
1653 :
1654 1 : sub_index++;
1655 : }
1656 1 : return LIBSPDM_STATUS_SUCCESS;
1657 :
1658 1 : case 0x10: {
1659 : static size_t sub_index = 0;
1660 :
1661 : spdm_key_update_response_t *spdm_response;
1662 : size_t spdm_response_size;
1663 : size_t transport_header_size;
1664 : uint32_t session_id;
1665 : libspdm_session_info_t *session_info;
1666 : uint8_t *scratch_buffer;
1667 : size_t scratch_buffer_size;
1668 :
1669 1 : spdm_response_size = sizeof(spdm_key_update_response_t);
1670 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
1671 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
1672 :
1673 1 : session_id = 0xFFFFFFFF;
1674 :
1675 1 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
1676 1 : if (session_info == NULL) {
1677 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
1678 : }
1679 :
1680 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
1681 1 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
1682 1 : if (sub_index == 0) {
1683 : /*wrong operation code*/
1684 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_ALL_KEYS;
1685 1 : spdm_response->header.param2 = m_libspdm_last_token;
1686 0 : } else if (sub_index == 1) {
1687 0 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
1688 0 : spdm_response->header.param2 = m_libspdm_last_token;
1689 : }
1690 :
1691 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
1692 : * transport_message is always in sender buffer. */
1693 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
1694 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
1695 : scratch_buffer_size - transport_header_size,
1696 : spdm_response, spdm_response_size);
1697 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
1698 1 : libspdm_transport_test_encode_message(spdm_context, &session_id,
1699 : false, false, spdm_response_size,
1700 : spdm_response, response_size, response);
1701 : /* WALKAROUND: If just use single context to encode
1702 : * message and then decode message */
1703 : ((libspdm_secured_message_context_t
1704 1 : *)(session_info->secured_message_context))
1705 1 : ->application_secret.response_data_sequence_number--;
1706 :
1707 1 : sub_index++;
1708 : }
1709 1 : return LIBSPDM_STATUS_SUCCESS;
1710 :
1711 2 : case 0x11: {
1712 : static size_t sub_index = 0;
1713 :
1714 : uint32_t session_id;
1715 : libspdm_session_info_t *session_info;
1716 :
1717 2 : session_id = 0xFFFFFFFF;
1718 2 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
1719 2 : if (session_info == NULL) {
1720 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
1721 : }
1722 :
1723 2 : if (sub_index == 0) {
1724 : spdm_key_update_response_t *spdm_response;
1725 : size_t spdm_response_size;
1726 : size_t transport_header_size;
1727 : uint8_t *scratch_buffer;
1728 : size_t scratch_buffer_size;
1729 :
1730 1 : spdm_response_size = sizeof(spdm_key_update_response_t);
1731 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
1732 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
1733 :
1734 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
1735 1 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
1736 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
1737 1 : spdm_response->header.param2 = m_libspdm_last_token;
1738 :
1739 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
1740 : * transport_message is always in sender buffer. */
1741 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
1742 : &scratch_buffer_size);
1743 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
1744 : scratch_buffer_size - transport_header_size,
1745 : spdm_response, spdm_response_size);
1746 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
1747 1 : libspdm_transport_test_encode_message(spdm_context,
1748 : &session_id, false, false,
1749 : spdm_response_size, spdm_response,
1750 : response_size, response);
1751 : /* WALKAROUND: If just use single context to encode
1752 : * message and then decode message */
1753 : ((libspdm_secured_message_context_t
1754 1 : *)(session_info->secured_message_context))
1755 1 : ->application_secret.response_data_sequence_number--;
1756 1 : } else if (sub_index == 1) {
1757 : spdm_error_response_t *spdm_response;
1758 : size_t spdm_response_size;
1759 : size_t transport_header_size;
1760 : uint8_t *scratch_buffer;
1761 : size_t scratch_buffer_size;
1762 :
1763 1 : spdm_response_size = sizeof(spdm_error_response_t);
1764 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
1765 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
1766 :
1767 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
1768 1 : spdm_response->header.request_response_code = SPDM_ERROR;
1769 1 : spdm_response->header.param1 = SPDM_ERROR_CODE_INVALID_REQUEST;
1770 1 : spdm_response->header.param2 = 0;
1771 :
1772 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
1773 : * transport_message is always in sender buffer. */
1774 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
1775 : &scratch_buffer_size);
1776 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
1777 : scratch_buffer_size - transport_header_size,
1778 : spdm_response, spdm_response_size);
1779 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
1780 1 : libspdm_transport_test_encode_message(spdm_context,
1781 : &session_id, false, false,
1782 : spdm_response_size, spdm_response,
1783 : response_size, response);
1784 : /* WALKAROUND: If just use single context to encode
1785 : * message and then decode message */
1786 : ((libspdm_secured_message_context_t
1787 1 : *)(session_info->secured_message_context))
1788 1 : ->application_secret.response_data_sequence_number--;
1789 : }
1790 :
1791 2 : sub_index++;
1792 : }
1793 2 : return LIBSPDM_STATUS_SUCCESS;
1794 :
1795 5 : case 0x12: {
1796 : static size_t sub_index = 0;
1797 :
1798 : uint32_t session_id;
1799 : libspdm_session_info_t *session_info;
1800 :
1801 5 : session_id = 0xFFFFFFFF;
1802 5 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
1803 5 : if (session_info == NULL) {
1804 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
1805 : }
1806 :
1807 5 : if (sub_index == 0) {
1808 : spdm_key_update_response_t *spdm_response;
1809 : size_t spdm_response_size;
1810 : size_t transport_header_size;
1811 : uint8_t *scratch_buffer;
1812 : size_t scratch_buffer_size;
1813 :
1814 1 : spdm_response_size = sizeof(spdm_key_update_response_t);
1815 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
1816 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
1817 :
1818 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
1819 1 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
1820 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
1821 1 : spdm_response->header.param2 = m_libspdm_last_token;
1822 :
1823 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
1824 : * transport_message is always in sender buffer. */
1825 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
1826 : &scratch_buffer_size);
1827 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
1828 : scratch_buffer_size - transport_header_size,
1829 : spdm_response, spdm_response_size);
1830 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
1831 1 : libspdm_transport_test_encode_message(spdm_context,
1832 : &session_id, false, false,
1833 : spdm_response_size, spdm_response,
1834 : response_size, response);
1835 : /* WALKAROUND: If just use single context to encode
1836 : * message and then decode message */
1837 : ((libspdm_secured_message_context_t
1838 1 : *)(session_info->secured_message_context))
1839 1 : ->application_secret.response_data_sequence_number--;
1840 : } else {
1841 : spdm_error_response_t *spdm_response;
1842 : size_t spdm_response_size;
1843 : size_t transport_header_size;
1844 : uint8_t *scratch_buffer;
1845 : size_t scratch_buffer_size;
1846 :
1847 4 : spdm_response_size = sizeof(spdm_error_response_t);
1848 4 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
1849 4 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
1850 :
1851 4 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
1852 4 : spdm_response->header.request_response_code = SPDM_ERROR;
1853 4 : spdm_response->header.param1 = SPDM_ERROR_CODE_BUSY;
1854 4 : spdm_response->header.param2 = 0;
1855 :
1856 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
1857 : * transport_message is always in sender buffer. */
1858 4 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
1859 : &scratch_buffer_size);
1860 4 : libspdm_copy_mem (scratch_buffer + transport_header_size,
1861 : scratch_buffer_size - transport_header_size,
1862 : spdm_response, spdm_response_size);
1863 4 : spdm_response = (void *)(scratch_buffer + transport_header_size);
1864 4 : libspdm_transport_test_encode_message(spdm_context,
1865 : &session_id, false, false,
1866 : spdm_response_size, spdm_response,
1867 : response_size, response);
1868 : /* WALKAROUND: If just use single context to encode
1869 : * message and then decode message */
1870 : ((libspdm_secured_message_context_t
1871 4 : *)(session_info->secured_message_context))
1872 4 : ->application_secret.response_data_sequence_number--;
1873 : }
1874 :
1875 5 : sub_index++;
1876 : }
1877 5 : return LIBSPDM_STATUS_SUCCESS;
1878 :
1879 3 : case 0x13: {
1880 : static size_t sub_index = 0;
1881 :
1882 : uint32_t session_id;
1883 : libspdm_session_info_t *session_info;
1884 :
1885 3 : session_id = 0xFFFFFFFF;
1886 3 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
1887 3 : if (session_info == NULL) {
1888 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
1889 : }
1890 :
1891 3 : if (sub_index == 0) {
1892 : spdm_key_update_response_t *spdm_response;
1893 : size_t spdm_response_size;
1894 : size_t transport_header_size;
1895 : uint8_t *scratch_buffer;
1896 : size_t scratch_buffer_size;
1897 :
1898 1 : spdm_response_size = sizeof(spdm_key_update_response_t);
1899 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
1900 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
1901 :
1902 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
1903 1 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
1904 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
1905 1 : spdm_response->header.param2 = m_libspdm_last_token;
1906 :
1907 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
1908 : * transport_message is always in sender buffer. */
1909 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
1910 : &scratch_buffer_size);
1911 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
1912 : scratch_buffer_size - transport_header_size,
1913 : spdm_response, spdm_response_size);
1914 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
1915 1 : libspdm_transport_test_encode_message(spdm_context,
1916 : &session_id, false, false,
1917 : spdm_response_size, spdm_response,
1918 : response_size, response);
1919 : /* WALKAROUND: If just use single context to encode
1920 : * message and then decode message */
1921 : ((libspdm_secured_message_context_t
1922 1 : *)(session_info->secured_message_context))
1923 1 : ->application_secret.response_data_sequence_number--;
1924 2 : } else if (sub_index == 1) {
1925 : spdm_error_response_t *spdm_response;
1926 : size_t spdm_response_size;
1927 : size_t transport_header_size;
1928 : uint8_t *scratch_buffer;
1929 : size_t scratch_buffer_size;
1930 :
1931 1 : spdm_response_size = sizeof(spdm_error_response_t);
1932 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
1933 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
1934 :
1935 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
1936 1 : spdm_response->header.request_response_code = SPDM_ERROR;
1937 1 : spdm_response->header.param1 = SPDM_ERROR_CODE_BUSY;
1938 1 : spdm_response->header.param2 = 0;
1939 :
1940 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
1941 : * transport_message is always in sender buffer. */
1942 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
1943 : &scratch_buffer_size);
1944 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
1945 : scratch_buffer_size - transport_header_size,
1946 : spdm_response, spdm_response_size);
1947 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
1948 1 : libspdm_transport_test_encode_message(spdm_context,
1949 : &session_id, false, false,
1950 : spdm_response_size, spdm_response,
1951 : response_size, response);
1952 : /* WALKAROUND: If just use single context to encode
1953 : * message and then decode message */
1954 : ((libspdm_secured_message_context_t
1955 1 : *)(session_info->secured_message_context))
1956 1 : ->application_secret.response_data_sequence_number--;
1957 1 : } else if (sub_index == 2) {
1958 : spdm_key_update_response_t *spdm_response;
1959 : size_t spdm_response_size;
1960 : size_t transport_header_size;
1961 : uint8_t *scratch_buffer;
1962 : size_t scratch_buffer_size;
1963 :
1964 1 : spdm_response_size = sizeof(spdm_key_update_response_t);
1965 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
1966 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
1967 :
1968 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
1969 1 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
1970 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
1971 1 : spdm_response->header.param2 = m_libspdm_last_token;
1972 :
1973 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
1974 : * transport_message is always in sender buffer. */
1975 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
1976 : &scratch_buffer_size);
1977 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
1978 : scratch_buffer_size - transport_header_size,
1979 : spdm_response, spdm_response_size);
1980 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
1981 1 : libspdm_transport_test_encode_message(spdm_context,
1982 : &session_id, false, false,
1983 : spdm_response_size, spdm_response,
1984 : response_size, response);
1985 : /* WALKAROUND: If just use single context to encode
1986 : * message and then decode message */
1987 : ((libspdm_secured_message_context_t
1988 1 : *)(session_info->secured_message_context))
1989 1 : ->application_secret.response_data_sequence_number--;
1990 : }
1991 :
1992 3 : sub_index++;
1993 : }
1994 3 : return LIBSPDM_STATUS_SUCCESS;
1995 :
1996 2 : case 0x14: {
1997 : static size_t sub_index = 0;
1998 :
1999 : uint32_t session_id;
2000 : libspdm_session_info_t *session_info;
2001 :
2002 2 : session_id = 0xFFFFFFFF;
2003 2 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
2004 2 : if (session_info == NULL) {
2005 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
2006 : }
2007 :
2008 2 : if (sub_index == 0) {
2009 : spdm_key_update_response_t *spdm_response;
2010 : size_t spdm_response_size;
2011 : size_t transport_header_size;
2012 : uint8_t *scratch_buffer;
2013 : size_t scratch_buffer_size;
2014 :
2015 1 : spdm_response_size = sizeof(spdm_key_update_response_t);
2016 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
2017 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
2018 :
2019 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
2020 1 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
2021 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
2022 1 : spdm_response->header.param2 = m_libspdm_last_token;
2023 :
2024 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
2025 : * transport_message is always in sender buffer. */
2026 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
2027 : &scratch_buffer_size);
2028 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
2029 : scratch_buffer_size - transport_header_size,
2030 : spdm_response, spdm_response_size);
2031 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
2032 1 : libspdm_transport_test_encode_message(spdm_context,
2033 : &session_id, false, false,
2034 : spdm_response_size, spdm_response,
2035 : response_size, response);
2036 : /* WALKAROUND: If just use single context to encode
2037 : * message and then decode message */
2038 : ((libspdm_secured_message_context_t
2039 1 : *)(session_info->secured_message_context))
2040 1 : ->application_secret.response_data_sequence_number--;
2041 1 : } else if (sub_index == 1) {
2042 : spdm_error_response_t *spdm_response;
2043 : size_t spdm_response_size;
2044 : size_t transport_header_size;
2045 : uint8_t *scratch_buffer;
2046 : size_t scratch_buffer_size;
2047 :
2048 1 : spdm_response_size = sizeof(spdm_error_response_t);
2049 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
2050 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
2051 :
2052 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_10;
2053 1 : spdm_response->header.request_response_code = SPDM_ERROR;
2054 1 : spdm_response->header.param1 = SPDM_ERROR_CODE_REQUEST_RESYNCH;
2055 1 : spdm_response->header.param2 = 0;
2056 :
2057 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
2058 : * transport_message is always in sender buffer. */
2059 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
2060 : &scratch_buffer_size);
2061 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
2062 : scratch_buffer_size - transport_header_size,
2063 : spdm_response, spdm_response_size);
2064 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
2065 1 : libspdm_transport_test_encode_message(spdm_context,
2066 : &session_id, false, false,
2067 : spdm_response_size, spdm_response,
2068 : response_size, response);
2069 : /* WALKAROUND: If just use single context to encode
2070 : * message and then decode message */
2071 : ((libspdm_secured_message_context_t
2072 1 : *)(session_info->secured_message_context))
2073 1 : ->application_secret.response_data_sequence_number--;
2074 : }
2075 :
2076 2 : sub_index++;
2077 : }
2078 2 : return LIBSPDM_STATUS_SUCCESS;
2079 :
2080 3 : case 0x15: {
2081 : static size_t sub_index = 0;
2082 :
2083 : uint32_t session_id;
2084 : libspdm_session_info_t *session_info;
2085 :
2086 3 : session_id = 0xFFFFFFFF;
2087 3 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
2088 3 : if (session_info == NULL) {
2089 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
2090 : }
2091 :
2092 3 : if (sub_index == 0) {
2093 : spdm_key_update_response_t *spdm_response;
2094 : size_t spdm_response_size;
2095 : size_t transport_header_size;
2096 : uint8_t *scratch_buffer;
2097 : size_t scratch_buffer_size;
2098 :
2099 1 : spdm_response_size = sizeof(spdm_key_update_response_t);
2100 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
2101 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
2102 :
2103 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
2104 1 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
2105 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
2106 1 : spdm_response->header.param2 = m_libspdm_last_token;
2107 :
2108 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
2109 : * transport_message is always in sender buffer. */
2110 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
2111 : &scratch_buffer_size);
2112 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
2113 : scratch_buffer_size - transport_header_size,
2114 : spdm_response, spdm_response_size);
2115 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
2116 1 : libspdm_transport_test_encode_message(spdm_context,
2117 : &session_id, false, false,
2118 : spdm_response_size, spdm_response,
2119 : response_size, response);
2120 : /* WALKAROUND: If just use single context to encode
2121 : * message and then decode message */
2122 : ((libspdm_secured_message_context_t
2123 1 : *)(session_info->secured_message_context))
2124 1 : ->application_secret.response_data_sequence_number--;
2125 : } else {
2126 : spdm_error_response_data_response_not_ready_t *spdm_response;
2127 : size_t spdm_response_size;
2128 : size_t transport_header_size;
2129 : uint8_t *scratch_buffer;
2130 : size_t scratch_buffer_size;
2131 :
2132 2 : spdm_response_size = sizeof(spdm_error_response_data_response_not_ready_t);
2133 2 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
2134 2 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
2135 :
2136 2 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
2137 2 : spdm_response->header.request_response_code = SPDM_ERROR;
2138 2 : spdm_response->header.param1 = SPDM_ERROR_CODE_RESPONSE_NOT_READY;
2139 2 : spdm_response->header.param2 = 0;
2140 2 : spdm_response->extend_error_data.rd_exponent = 1;
2141 2 : spdm_response->extend_error_data.rd_tm = 2;
2142 2 : spdm_response->extend_error_data.request_code = SPDM_KEY_UPDATE;
2143 2 : spdm_response->extend_error_data.token = 0;
2144 :
2145 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
2146 : * transport_message is always in sender buffer. */
2147 2 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
2148 : &scratch_buffer_size);
2149 2 : libspdm_copy_mem (scratch_buffer + transport_header_size,
2150 : scratch_buffer_size - transport_header_size,
2151 : spdm_response, spdm_response_size);
2152 2 : spdm_response = (void *)(scratch_buffer + transport_header_size);
2153 2 : libspdm_transport_test_encode_message(spdm_context,
2154 : &session_id, false, false,
2155 : spdm_response_size, spdm_response,
2156 : response_size, response);
2157 : /* WALKAROUND: If just use single context to encode
2158 : * message and then decode message */
2159 : ((libspdm_secured_message_context_t
2160 2 : *)(session_info->secured_message_context))
2161 2 : ->application_secret.response_data_sequence_number--;
2162 : }
2163 :
2164 3 : sub_index++;
2165 : }
2166 3 : return LIBSPDM_STATUS_SUCCESS;
2167 :
2168 3 : case 0x16: {
2169 : static size_t sub_index = 0;
2170 :
2171 : uint32_t session_id;
2172 : libspdm_session_info_t *session_info;
2173 :
2174 3 : session_id = 0xFFFFFFFF;
2175 3 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
2176 3 : if (session_info == NULL) {
2177 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
2178 : }
2179 :
2180 3 : if (sub_index == 0) {
2181 : spdm_key_update_response_t *spdm_response;
2182 : size_t spdm_response_size;
2183 : size_t transport_header_size;
2184 : uint8_t *scratch_buffer;
2185 : size_t scratch_buffer_size;
2186 :
2187 1 : spdm_response_size = sizeof(spdm_key_update_response_t);
2188 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
2189 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
2190 :
2191 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
2192 1 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
2193 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
2194 1 : spdm_response->header.param2 = m_libspdm_last_token;
2195 :
2196 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
2197 : * transport_message is always in sender buffer. */
2198 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
2199 : &scratch_buffer_size);
2200 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
2201 : scratch_buffer_size - transport_header_size,
2202 : spdm_response, spdm_response_size);
2203 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
2204 1 : libspdm_transport_test_encode_message(spdm_context,
2205 : &session_id, false, false,
2206 : spdm_response_size, spdm_response,
2207 : response_size, response);
2208 : /* WALKAROUND: If just use single context to encode
2209 : * message and then decode message */
2210 : ((libspdm_secured_message_context_t
2211 1 : *)(session_info->secured_message_context))
2212 1 : ->application_secret.response_data_sequence_number--;
2213 2 : } else if (sub_index == 1) {
2214 : spdm_error_response_data_response_not_ready_t *spdm_response;
2215 : size_t spdm_response_size;
2216 : size_t transport_header_size;
2217 : uint8_t *scratch_buffer;
2218 : size_t scratch_buffer_size;
2219 :
2220 1 : spdm_response_size = sizeof(spdm_error_response_data_response_not_ready_t);
2221 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
2222 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
2223 :
2224 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
2225 1 : spdm_response->header.request_response_code = SPDM_ERROR;
2226 1 : spdm_response->header.param1 = SPDM_ERROR_CODE_RESPONSE_NOT_READY;
2227 1 : spdm_response->header.param2 = 0;
2228 1 : spdm_response->extend_error_data.rd_exponent = 1;
2229 1 : spdm_response->extend_error_data.rd_tm = 2;
2230 1 : spdm_response->extend_error_data.request_code = SPDM_KEY_UPDATE;
2231 1 : spdm_response->extend_error_data.token = 0;
2232 :
2233 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
2234 : * transport_message is always in sender buffer. */
2235 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
2236 : &scratch_buffer_size);
2237 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
2238 : scratch_buffer_size - transport_header_size,
2239 : spdm_response, spdm_response_size);
2240 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
2241 1 : libspdm_transport_test_encode_message(spdm_context,
2242 : &session_id, false, false,
2243 : spdm_response_size, spdm_response,
2244 : response_size, response);
2245 : /* WALKAROUND: If just use single context to encode
2246 : * message and then decode message */
2247 : ((libspdm_secured_message_context_t
2248 1 : *)(session_info->secured_message_context))
2249 1 : ->application_secret.response_data_sequence_number--;
2250 1 : } else if (sub_index == 2) {
2251 : spdm_key_update_response_t *spdm_response;
2252 : size_t spdm_response_size;
2253 : size_t transport_header_size;
2254 : uint8_t *scratch_buffer;
2255 : size_t scratch_buffer_size;
2256 :
2257 1 : spdm_response_size = sizeof(spdm_key_update_response_t);
2258 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
2259 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
2260 :
2261 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
2262 1 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
2263 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
2264 1 : spdm_response->header.param2 = m_libspdm_last_token;
2265 :
2266 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
2267 : * transport_message is always in sender buffer. */
2268 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
2269 : &scratch_buffer_size);
2270 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
2271 : scratch_buffer_size - transport_header_size,
2272 : spdm_response, spdm_response_size);
2273 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
2274 1 : libspdm_transport_test_encode_message(spdm_context,
2275 : &session_id, false, false,
2276 : spdm_response_size, spdm_response,
2277 : response_size, response);
2278 : /* WALKAROUND: If just use single context to encode
2279 : * message and then decode message */
2280 : ((libspdm_secured_message_context_t
2281 1 : *)(session_info->secured_message_context))
2282 1 : ->application_secret.response_data_sequence_number--;
2283 : }
2284 :
2285 3 : sub_index++;
2286 : }
2287 3 : return LIBSPDM_STATUS_SUCCESS;
2288 :
2289 34 : case 0x17: {
2290 : static size_t sub_index = 0;
2291 : static uint16_t error_code = LIBSPDM_ERROR_CODE_RESERVED_00;
2292 :
2293 : uint32_t session_id;
2294 : libspdm_session_info_t *session_info;
2295 :
2296 34 : session_id = 0xFFFFFFFF;
2297 34 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
2298 34 : if (session_info == NULL) {
2299 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
2300 : }
2301 :
2302 34 : if(error_code <= 0xff) {
2303 : /* skip SPDM_ERROR_CODE_DECRYPT_ERROR, because this case will free context*/
2304 34 : if(error_code == SPDM_ERROR_CODE_DECRYPT_ERROR) {
2305 1 : error_code++;
2306 : }
2307 34 : if (sub_index%2 == 0) {
2308 : spdm_key_update_response_t *spdm_response;
2309 : size_t spdm_response_size;
2310 : size_t transport_header_size;
2311 : uint8_t *scratch_buffer;
2312 : size_t scratch_buffer_size;
2313 :
2314 17 : spdm_response_size = sizeof(spdm_key_update_response_t);
2315 17 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
2316 17 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
2317 :
2318 17 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
2319 17 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
2320 17 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
2321 17 : spdm_response->header.param2 = m_libspdm_last_token;
2322 :
2323 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
2324 : * transport_message is always in sender buffer. */
2325 17 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
2326 : &scratch_buffer_size);
2327 17 : libspdm_copy_mem (scratch_buffer + transport_header_size,
2328 : scratch_buffer_size - transport_header_size,
2329 : spdm_response, spdm_response_size);
2330 17 : spdm_response = (void *)(scratch_buffer + transport_header_size);
2331 17 : libspdm_transport_test_encode_message(spdm_context,
2332 : &session_id, false, false,
2333 : spdm_response_size, spdm_response,
2334 : response_size, response);
2335 : /* WALKAROUND: If just use single context to encode
2336 : * message and then decode message */
2337 : ((libspdm_secured_message_context_t
2338 17 : *)(session_info->secured_message_context))
2339 17 : ->application_secret.response_data_sequence_number--;
2340 : } else {
2341 : spdm_error_response_t *spdm_response;
2342 : size_t spdm_response_size;
2343 : size_t transport_header_size;
2344 : uint8_t *scratch_buffer;
2345 : size_t scratch_buffer_size;
2346 :
2347 17 : spdm_response_size = sizeof(spdm_error_response_t);
2348 17 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
2349 17 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
2350 :
2351 17 : libspdm_zero_mem (spdm_response, spdm_response_size);
2352 17 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
2353 17 : spdm_response->header.request_response_code = SPDM_ERROR;
2354 17 : spdm_response->header.param1 = (uint8_t) error_code;
2355 17 : spdm_response->header.param2 = 0;
2356 :
2357 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
2358 : * transport_message is always in sender buffer. */
2359 17 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
2360 : &scratch_buffer_size);
2361 17 : libspdm_copy_mem (scratch_buffer + transport_header_size,
2362 : scratch_buffer_size - transport_header_size,
2363 : spdm_response, spdm_response_size);
2364 17 : spdm_response = (void *)(scratch_buffer + transport_header_size);
2365 17 : libspdm_transport_test_encode_message(spdm_context,
2366 : &session_id, false, false,
2367 : spdm_response_size, spdm_response,
2368 : response_size, response);
2369 : /* WALKAROUND: If just use single context to encode
2370 : * message and then decode message */
2371 : ((libspdm_secured_message_context_t
2372 17 : *)(session_info->secured_message_context))
2373 17 : ->application_secret.response_data_sequence_number--;
2374 :
2375 17 : error_code++;
2376 : /*busy is treated in cases 5 and 6*/
2377 17 : if(error_code == SPDM_ERROR_CODE_BUSY) {
2378 1 : error_code = SPDM_ERROR_CODE_UNEXPECTED_REQUEST;
2379 : }
2380 : /*skip some reserved error codes (0d to 3e)*/
2381 17 : if(error_code == LIBSPDM_ERROR_CODE_RESERVED_0D) {
2382 1 : error_code = LIBSPDM_ERROR_CODE_RESERVED_3F;
2383 : }
2384 : /*skip response not ready, request resync, and some reserved codes (44 to fc)*/
2385 17 : if(error_code == SPDM_ERROR_CODE_RESPONSE_NOT_READY) {
2386 1 : error_code = LIBSPDM_ERROR_CODE_RESERVED_FD;
2387 : }
2388 : }
2389 : }
2390 :
2391 34 : sub_index++;
2392 : }
2393 34 : return LIBSPDM_STATUS_SUCCESS;
2394 :
2395 2 : case 0x18: {
2396 : static size_t sub_index = 0;
2397 :
2398 : spdm_key_update_response_t *spdm_response;
2399 : size_t spdm_response_size;
2400 : size_t transport_header_size;
2401 : uint32_t session_id;
2402 : libspdm_session_info_t *session_info;
2403 : uint8_t *scratch_buffer;
2404 : size_t scratch_buffer_size;
2405 :
2406 2 : spdm_response_size = sizeof(spdm_key_update_response_t);
2407 2 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
2408 2 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
2409 :
2410 2 : session_id = 0xFFFFFFFF;
2411 :
2412 2 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
2413 2 : if (session_info == NULL) {
2414 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
2415 : }
2416 :
2417 2 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
2418 2 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
2419 2 : if (sub_index == 0) {
2420 1 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
2421 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
2422 1 : spdm_response->header.param2 = m_libspdm_last_token;
2423 1 : } else if (sub_index == 1) {
2424 : /*wrong response code*/
2425 1 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE;
2426 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
2427 1 : spdm_response->header.param2 = m_libspdm_last_token;
2428 : }
2429 :
2430 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
2431 : * transport_message is always in sender buffer. */
2432 2 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
2433 2 : libspdm_copy_mem (scratch_buffer + transport_header_size,
2434 : scratch_buffer_size - transport_header_size,
2435 : spdm_response, spdm_response_size);
2436 2 : spdm_response = (void *)(scratch_buffer + transport_header_size);
2437 2 : libspdm_transport_test_encode_message(spdm_context, &session_id,
2438 : false, false, spdm_response_size,
2439 : spdm_response, response_size, response);
2440 : /* WALKAROUND: If just use single context to encode
2441 : * message and then decode message */
2442 : ((libspdm_secured_message_context_t
2443 2 : *)(session_info->secured_message_context))
2444 2 : ->application_secret.response_data_sequence_number--;
2445 :
2446 2 : sub_index++;
2447 : }
2448 2 : return LIBSPDM_STATUS_SUCCESS;
2449 :
2450 2 : case 0x19: {
2451 : static size_t sub_index = 0;
2452 :
2453 : spdm_key_update_response_t *spdm_response;
2454 : size_t spdm_response_size;
2455 : size_t transport_header_size;
2456 : uint32_t session_id;
2457 : libspdm_session_info_t *session_info;
2458 : uint8_t *scratch_buffer;
2459 : size_t scratch_buffer_size;
2460 :
2461 2 : spdm_response_size = sizeof(spdm_key_update_response_t);
2462 2 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
2463 2 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
2464 :
2465 2 : session_id = 0xFFFFFFFF;
2466 :
2467 2 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
2468 2 : if (session_info == NULL) {
2469 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
2470 : }
2471 :
2472 2 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
2473 2 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
2474 2 : if (sub_index == 0) {
2475 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
2476 1 : spdm_response->header.param2 = m_libspdm_last_token;
2477 1 : } else if (sub_index == 1) {
2478 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
2479 : /*wrong token*/
2480 1 : spdm_response->header.param2 = m_libspdm_last_token + 1;
2481 : }
2482 :
2483 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
2484 : * transport_message is always in sender buffer. */
2485 2 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
2486 2 : libspdm_copy_mem (scratch_buffer + transport_header_size,
2487 : scratch_buffer_size - transport_header_size,
2488 : spdm_response, spdm_response_size);
2489 2 : spdm_response = (void *)(scratch_buffer + transport_header_size);
2490 2 : libspdm_transport_test_encode_message(spdm_context, &session_id,
2491 : false, false, spdm_response_size,
2492 : spdm_response, response_size, response);
2493 : /* WALKAROUND: If just use single context to encode
2494 : * message and then decode message */
2495 : ((libspdm_secured_message_context_t
2496 2 : *)(session_info->secured_message_context))
2497 2 : ->application_secret.response_data_sequence_number--;
2498 :
2499 2 : sub_index++;
2500 : }
2501 2 : return LIBSPDM_STATUS_SUCCESS;
2502 :
2503 2 : case 0x1A: {
2504 : static size_t sub_index = 0;
2505 :
2506 : spdm_key_update_response_t *spdm_response;
2507 : size_t spdm_response_size;
2508 : size_t transport_header_size;
2509 : uint32_t session_id;
2510 : libspdm_session_info_t *session_info;
2511 : uint8_t *scratch_buffer;
2512 : size_t scratch_buffer_size;
2513 :
2514 2 : spdm_response_size = sizeof(spdm_key_update_response_t);
2515 2 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
2516 2 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
2517 :
2518 2 : session_id = 0xFFFFFFFF;
2519 :
2520 2 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
2521 2 : if (session_info == NULL) {
2522 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
2523 : }
2524 :
2525 2 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
2526 2 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
2527 2 : if (sub_index == 0) {
2528 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
2529 1 : spdm_response->header.param2 = m_libspdm_last_token;
2530 1 : } else if (sub_index == 1) {
2531 : /*wrong operation code*/
2532 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
2533 1 : spdm_response->header.param2 = m_libspdm_last_token;
2534 : }
2535 :
2536 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
2537 : * transport_message is always in sender buffer. */
2538 2 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
2539 2 : libspdm_copy_mem (scratch_buffer + transport_header_size,
2540 : scratch_buffer_size - transport_header_size,
2541 : spdm_response, spdm_response_size);
2542 2 : spdm_response = (void *)(scratch_buffer + transport_header_size);
2543 2 : libspdm_transport_test_encode_message(spdm_context, &session_id,
2544 : false, false, spdm_response_size,
2545 : spdm_response, response_size, response);
2546 : /* WALKAROUND: If just use single context to encode
2547 : * message and then decode message */
2548 : ((libspdm_secured_message_context_t
2549 2 : *)(session_info->secured_message_context))
2550 2 : ->application_secret.response_data_sequence_number--;
2551 :
2552 2 : sub_index++;
2553 : }
2554 2 : return LIBSPDM_STATUS_SUCCESS;
2555 :
2556 2 : case 0x1B: {
2557 : static size_t sub_index = 0;
2558 :
2559 : spdm_key_update_response_t *spdm_response;
2560 : size_t spdm_response_size;
2561 : size_t transport_header_size;
2562 : uint32_t session_id;
2563 : libspdm_session_info_t *session_info;
2564 : uint8_t *scratch_buffer;
2565 : size_t scratch_buffer_size;
2566 :
2567 2 : spdm_response_size = sizeof(spdm_key_update_response_t);
2568 2 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
2569 2 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
2570 :
2571 2 : session_id = 0xFFFFFFFF;
2572 :
2573 2 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
2574 2 : if (session_info == NULL) {
2575 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
2576 : }
2577 :
2578 2 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
2579 2 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
2580 2 : if (sub_index == 0) {
2581 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_ALL_KEYS;
2582 1 : spdm_response->header.param2 = m_libspdm_last_token;
2583 1 : } else if (sub_index == 1) {
2584 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
2585 1 : spdm_response->header.param2 = m_libspdm_last_token;
2586 :
2587 : /* as it is using single context, the keys were updated
2588 : * in the requester and do not need to be updated before
2589 : * sending the response */
2590 : }
2591 :
2592 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
2593 : * transport_message is always in sender buffer. */
2594 2 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
2595 2 : libspdm_copy_mem (scratch_buffer + transport_header_size,
2596 : scratch_buffer_size - transport_header_size,
2597 : spdm_response, spdm_response_size);
2598 2 : spdm_response = (void *)(scratch_buffer + transport_header_size);
2599 2 : libspdm_transport_test_encode_message(spdm_context, &session_id,
2600 : false, false, spdm_response_size,
2601 : spdm_response, response_size, response);
2602 : /* WALKAROUND: If just use single context to encode
2603 : * message and then decode message */
2604 : ((libspdm_secured_message_context_t
2605 2 : *)(session_info->secured_message_context))
2606 2 : ->application_secret.response_data_sequence_number--;
2607 :
2608 2 : sub_index++;
2609 : }
2610 2 : return LIBSPDM_STATUS_SUCCESS;
2611 :
2612 1 : case 0x1C: {
2613 : spdm_error_response_t *spdm_response;
2614 : size_t spdm_response_size;
2615 : size_t transport_header_size;
2616 : uint32_t session_id;
2617 : libspdm_session_info_t *session_info;
2618 : uint8_t *scratch_buffer;
2619 : size_t scratch_buffer_size;
2620 :
2621 : libspdm_secured_message_context_t *secured_message_context;
2622 : uint8_t curr_rsp_enc_key[LIBSPDM_MAX_AEAD_KEY_SIZE];
2623 : uint8_t curr_rsp_salt[LIBSPDM_MAX_AEAD_IV_SIZE];
2624 : uint64_t curr_rsp_sequence_number;
2625 :
2626 1 : spdm_response_size = sizeof(spdm_key_update_response_t);
2627 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
2628 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
2629 :
2630 1 : session_id = 0xFFFFFFFF;
2631 1 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
2632 1 : if (session_info == NULL) {
2633 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
2634 : }
2635 1 : secured_message_context = session_info->secured_message_context;
2636 :
2637 : /*use previous key to send*/
2638 1 : libspdm_copy_mem(curr_rsp_enc_key, sizeof(curr_rsp_enc_key),
2639 : secured_message_context
2640 1 : ->application_secret.response_data_encryption_key,
2641 : secured_message_context->aead_key_size);
2642 1 : libspdm_copy_mem(curr_rsp_salt, sizeof(curr_rsp_salt),
2643 : secured_message_context
2644 1 : ->application_secret.response_data_salt,
2645 : secured_message_context->aead_iv_size);
2646 1 : curr_rsp_sequence_number = m_libspdm_last_rsp_sequence_number;
2647 :
2648 1 : libspdm_copy_mem(secured_message_context->application_secret
2649 1 : .response_data_encryption_key,
2650 : sizeof(secured_message_context->application_secret
2651 : .response_data_encryption_key),
2652 : m_libspdm_last_rsp_enc_key,
2653 : secured_message_context->aead_key_size);
2654 1 : libspdm_copy_mem(secured_message_context->application_secret
2655 1 : .response_data_salt,
2656 : sizeof(secured_message_context->application_secret
2657 : .response_data_salt),
2658 : m_libspdm_last_rsp_salt,
2659 : secured_message_context->aead_iv_size);
2660 : secured_message_context->application_secret
2661 1 : .response_data_sequence_number = m_libspdm_last_rsp_sequence_number;
2662 :
2663 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
2664 1 : spdm_response->header.request_response_code = SPDM_ERROR;
2665 1 : spdm_response->header.param1 = SPDM_ERROR_CODE_INVALID_REQUEST;
2666 1 : spdm_response->header.param2 = 0;
2667 :
2668 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
2669 : * transport_message is always in sender buffer. */
2670 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
2671 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
2672 : scratch_buffer_size - transport_header_size,
2673 : spdm_response, spdm_response_size);
2674 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
2675 1 : libspdm_transport_test_encode_message(spdm_context, &session_id,
2676 : false, false, spdm_response_size,
2677 : spdm_response, response_size, response);
2678 :
2679 : /*restore new key*/
2680 1 : libspdm_copy_mem(secured_message_context->application_secret
2681 1 : .response_data_encryption_key,
2682 : sizeof(secured_message_context->application_secret
2683 : .response_data_encryption_key),
2684 : curr_rsp_enc_key,
2685 : secured_message_context->aead_key_size);
2686 1 : libspdm_copy_mem(secured_message_context->application_secret
2687 1 : .response_data_salt,
2688 : sizeof(secured_message_context->application_secret
2689 : .response_data_salt),
2690 : curr_rsp_salt,
2691 : secured_message_context->aead_iv_size);
2692 : secured_message_context->application_secret
2693 1 : .response_data_sequence_number = curr_rsp_sequence_number;
2694 : }
2695 1 : return LIBSPDM_STATUS_SUCCESS;
2696 :
2697 4 : case 0x1D: {
2698 : spdm_error_response_t *spdm_response;
2699 : size_t spdm_response_size;
2700 : size_t transport_header_size;
2701 : uint32_t session_id;
2702 : libspdm_session_info_t *session_info;
2703 : uint8_t *scratch_buffer;
2704 : size_t scratch_buffer_size;
2705 :
2706 : libspdm_secured_message_context_t *secured_message_context;
2707 : uint8_t curr_rsp_enc_key[LIBSPDM_MAX_AEAD_KEY_SIZE];
2708 : uint8_t curr_rsp_salt[LIBSPDM_MAX_AEAD_IV_SIZE];
2709 : uint64_t curr_rsp_sequence_number;
2710 :
2711 4 : spdm_response_size = sizeof(spdm_key_update_response_t);
2712 4 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
2713 4 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
2714 :
2715 4 : session_id = 0xFFFFFFFF;
2716 4 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
2717 4 : if (session_info == NULL) {
2718 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
2719 : }
2720 4 : secured_message_context = session_info->secured_message_context;
2721 :
2722 : /*use previous key to send*/
2723 4 : libspdm_copy_mem(curr_rsp_enc_key, sizeof(curr_rsp_enc_key),
2724 : secured_message_context
2725 4 : ->application_secret.response_data_encryption_key,
2726 : secured_message_context->aead_key_size);
2727 4 : libspdm_copy_mem(curr_rsp_salt, sizeof(curr_rsp_salt),
2728 : secured_message_context
2729 4 : ->application_secret.response_data_salt,
2730 : secured_message_context->aead_iv_size);
2731 4 : curr_rsp_sequence_number = m_libspdm_last_rsp_sequence_number;
2732 :
2733 4 : libspdm_copy_mem(secured_message_context->application_secret
2734 4 : .response_data_encryption_key,
2735 : sizeof(secured_message_context->application_secret
2736 : .response_data_encryption_key),
2737 : m_libspdm_last_rsp_enc_key,
2738 : secured_message_context->aead_key_size);
2739 4 : libspdm_copy_mem(secured_message_context->application_secret
2740 4 : .response_data_salt,
2741 : sizeof(secured_message_context->application_secret
2742 : .response_data_salt),
2743 : m_libspdm_last_rsp_salt,
2744 : secured_message_context->aead_iv_size);
2745 : secured_message_context->application_secret
2746 4 : .response_data_sequence_number = m_libspdm_last_rsp_sequence_number;
2747 :
2748 : /* once the sequence number is used, it should be increased for next BUSY message.*/
2749 4 : m_libspdm_last_rsp_sequence_number++;
2750 :
2751 4 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
2752 4 : spdm_response->header.request_response_code = SPDM_ERROR;
2753 4 : spdm_response->header.param1 = SPDM_ERROR_CODE_BUSY;
2754 4 : spdm_response->header.param2 = 0;
2755 :
2756 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
2757 : * transport_message is always in sender buffer. */
2758 4 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
2759 4 : libspdm_copy_mem (scratch_buffer + transport_header_size,
2760 : scratch_buffer_size - transport_header_size,
2761 : spdm_response, spdm_response_size);
2762 4 : spdm_response = (void *)(scratch_buffer + transport_header_size);
2763 4 : libspdm_transport_test_encode_message(spdm_context, &session_id,
2764 : false, false, spdm_response_size,
2765 : spdm_response, response_size, response);
2766 :
2767 : /*restore new key*/
2768 4 : libspdm_copy_mem(secured_message_context->application_secret
2769 4 : .response_data_encryption_key,
2770 : sizeof(secured_message_context->application_secret
2771 : .response_data_encryption_key),
2772 : curr_rsp_enc_key,
2773 : secured_message_context->aead_key_size);
2774 4 : libspdm_copy_mem(secured_message_context->application_secret
2775 4 : .response_data_salt,
2776 : sizeof(secured_message_context->application_secret
2777 : .response_data_salt),
2778 : curr_rsp_salt,
2779 : secured_message_context->aead_iv_size);
2780 : secured_message_context->application_secret
2781 4 : .response_data_sequence_number = curr_rsp_sequence_number;
2782 : }
2783 4 : return LIBSPDM_STATUS_SUCCESS;
2784 :
2785 3 : case 0x1E: {
2786 : static size_t sub_index = 0;
2787 :
2788 : uint32_t session_id;
2789 : libspdm_session_info_t *session_info;
2790 :
2791 : libspdm_secured_message_context_t *secured_message_context;
2792 :
2793 3 : session_id = 0xFFFFFFFF;
2794 3 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
2795 3 : if (session_info == NULL) {
2796 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
2797 : }
2798 3 : secured_message_context = session_info->secured_message_context;
2799 :
2800 3 : if (sub_index == 0) {
2801 : spdm_error_response_t *spdm_response;
2802 : size_t spdm_response_size;
2803 : size_t transport_header_size;
2804 : uint8_t *scratch_buffer;
2805 : size_t scratch_buffer_size;
2806 :
2807 1 : spdm_response_size = sizeof(spdm_error_response_t);
2808 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
2809 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
2810 :
2811 : uint8_t curr_rsp_enc_key[LIBSPDM_MAX_AEAD_KEY_SIZE];
2812 : uint8_t curr_rsp_salt[LIBSPDM_MAX_AEAD_IV_SIZE];
2813 : uint64_t curr_rsp_sequence_number;
2814 :
2815 : /*use previous key to send*/
2816 1 : libspdm_copy_mem(curr_rsp_enc_key, sizeof(curr_rsp_enc_key),
2817 : secured_message_context
2818 1 : ->application_secret.response_data_encryption_key,
2819 : secured_message_context->aead_key_size);
2820 1 : libspdm_copy_mem(curr_rsp_salt, sizeof(curr_rsp_salt),
2821 : secured_message_context
2822 1 : ->application_secret.response_data_salt,
2823 : secured_message_context->aead_iv_size);
2824 1 : curr_rsp_sequence_number = m_libspdm_last_rsp_sequence_number;
2825 :
2826 1 : libspdm_copy_mem(secured_message_context->application_secret
2827 1 : .response_data_encryption_key,
2828 : sizeof(secured_message_context->application_secret
2829 : .response_data_encryption_key),
2830 : m_libspdm_last_rsp_enc_key,
2831 : secured_message_context->aead_key_size);
2832 1 : libspdm_copy_mem(secured_message_context->application_secret
2833 1 : .response_data_salt,
2834 : sizeof(secured_message_context->application_secret
2835 : .response_data_salt),
2836 : m_libspdm_last_rsp_salt,
2837 : secured_message_context->aead_iv_size);
2838 : secured_message_context->application_secret
2839 1 : .response_data_sequence_number = m_libspdm_last_rsp_sequence_number;
2840 :
2841 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
2842 1 : spdm_response->header.request_response_code = SPDM_ERROR;
2843 1 : spdm_response->header.param1 = SPDM_ERROR_CODE_BUSY;
2844 1 : spdm_response->header.param2 = 0;
2845 :
2846 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
2847 : * transport_message is always in sender buffer. */
2848 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
2849 : &scratch_buffer_size);
2850 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
2851 : scratch_buffer_size - transport_header_size,
2852 : spdm_response, spdm_response_size);
2853 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
2854 1 : libspdm_transport_test_encode_message(spdm_context,
2855 : &session_id, false, false,
2856 : spdm_response_size, spdm_response,
2857 : response_size, response);
2858 :
2859 : /*restore new key*/
2860 1 : libspdm_copy_mem(secured_message_context->application_secret
2861 1 : .response_data_encryption_key,
2862 : sizeof(secured_message_context->application_secret
2863 : .response_data_encryption_key),
2864 : curr_rsp_enc_key,
2865 : secured_message_context->aead_key_size);
2866 1 : libspdm_copy_mem(secured_message_context->application_secret
2867 1 : .response_data_salt,
2868 : sizeof(secured_message_context->application_secret
2869 : .response_data_salt),
2870 : curr_rsp_salt,
2871 : secured_message_context->aead_iv_size);
2872 : secured_message_context->application_secret
2873 1 : .response_data_sequence_number = curr_rsp_sequence_number;
2874 2 : } else if (sub_index == 1) {
2875 : spdm_key_update_response_t *spdm_response;
2876 : size_t spdm_response_size;
2877 : size_t transport_header_size;
2878 : uint8_t *scratch_buffer;
2879 : size_t scratch_buffer_size;
2880 :
2881 1 : spdm_response_size = sizeof(spdm_key_update_response_t);
2882 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
2883 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
2884 :
2885 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
2886 1 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
2887 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_ALL_KEYS;
2888 1 : spdm_response->header.param2 = m_libspdm_last_token;
2889 :
2890 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
2891 : * transport_message is always in sender buffer. */
2892 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
2893 : &scratch_buffer_size);
2894 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
2895 : scratch_buffer_size - transport_header_size,
2896 : spdm_response, spdm_response_size);
2897 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
2898 1 : libspdm_transport_test_encode_message(spdm_context,
2899 : &session_id, false, false,
2900 : spdm_response_size, spdm_response,
2901 : response_size, response);
2902 : /* WALKAROUND: If just use single context to encode
2903 : * message and then decode message */
2904 : secured_message_context->application_secret
2905 1 : .response_data_sequence_number--;
2906 1 : } else if (sub_index == 2) {
2907 : spdm_key_update_response_t *spdm_response;
2908 : size_t spdm_response_size;
2909 : size_t transport_header_size;
2910 : uint8_t *scratch_buffer;
2911 : size_t scratch_buffer_size;
2912 :
2913 1 : spdm_response_size = sizeof(spdm_key_update_response_t);
2914 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
2915 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
2916 :
2917 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
2918 1 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
2919 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
2920 1 : spdm_response->header.param2 = m_libspdm_last_token;
2921 :
2922 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
2923 : * transport_message is always in sender buffer. */
2924 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
2925 : &scratch_buffer_size);
2926 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
2927 : scratch_buffer_size - transport_header_size,
2928 : spdm_response, spdm_response_size);
2929 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
2930 1 : libspdm_transport_test_encode_message(spdm_context,
2931 : &session_id, false, false,
2932 : spdm_response_size, spdm_response,
2933 : response_size, response);
2934 : /* WALKAROUND: If just use single context to encode
2935 : * message and then decode message */
2936 : secured_message_context->application_secret
2937 1 : .response_data_sequence_number--;
2938 : }
2939 :
2940 3 : sub_index++;
2941 : }
2942 3 : return LIBSPDM_STATUS_SUCCESS;
2943 :
2944 1 : case 0x1F: {
2945 : spdm_error_response_t *spdm_response;
2946 : size_t spdm_response_size;
2947 : size_t transport_header_size;
2948 : uint32_t session_id;
2949 : libspdm_session_info_t *session_info;
2950 : uint8_t *scratch_buffer;
2951 : size_t scratch_buffer_size;
2952 :
2953 : libspdm_secured_message_context_t *secured_message_context;
2954 : uint8_t curr_rsp_enc_key[LIBSPDM_MAX_AEAD_KEY_SIZE];
2955 : uint8_t curr_rsp_salt[LIBSPDM_MAX_AEAD_IV_SIZE];
2956 : uint64_t curr_rsp_sequence_number;
2957 :
2958 1 : spdm_response_size = sizeof(spdm_error_response_t);
2959 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
2960 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
2961 :
2962 1 : session_id = 0xFFFFFFFF;
2963 1 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
2964 1 : if (session_info == NULL) {
2965 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
2966 : }
2967 1 : secured_message_context = session_info->secured_message_context;
2968 :
2969 : /*use previous key to send*/
2970 1 : libspdm_copy_mem(curr_rsp_enc_key, sizeof(curr_rsp_enc_key),
2971 : secured_message_context
2972 1 : ->application_secret.response_data_encryption_key,
2973 : secured_message_context->aead_key_size);
2974 1 : libspdm_copy_mem(curr_rsp_salt, sizeof(curr_rsp_salt),
2975 : secured_message_context
2976 1 : ->application_secret.response_data_salt,
2977 : secured_message_context->aead_iv_size);
2978 1 : curr_rsp_sequence_number = m_libspdm_last_rsp_sequence_number;
2979 :
2980 1 : libspdm_copy_mem(secured_message_context->application_secret
2981 1 : .response_data_encryption_key,
2982 : sizeof(secured_message_context->application_secret
2983 : .response_data_encryption_key),
2984 : m_libspdm_last_rsp_enc_key,
2985 : secured_message_context->aead_key_size);
2986 1 : libspdm_copy_mem(secured_message_context->application_secret
2987 1 : .response_data_salt,
2988 : sizeof(secured_message_context->application_secret
2989 : .response_data_salt),
2990 : m_libspdm_last_rsp_salt,
2991 : secured_message_context->aead_iv_size);
2992 : secured_message_context->application_secret
2993 1 : .response_data_sequence_number = m_libspdm_last_rsp_sequence_number;
2994 :
2995 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_10;
2996 1 : spdm_response->header.request_response_code = SPDM_ERROR;
2997 1 : spdm_response->header.param1 = SPDM_ERROR_CODE_REQUEST_RESYNCH;
2998 1 : spdm_response->header.param2 = 0;
2999 :
3000 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
3001 : * transport_message is always in sender buffer. */
3002 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
3003 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
3004 : scratch_buffer_size - transport_header_size,
3005 : spdm_response, spdm_response_size);
3006 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
3007 1 : libspdm_transport_test_encode_message(spdm_context, &session_id,
3008 : false, false, spdm_response_size,
3009 : spdm_response, response_size, response);
3010 :
3011 : /*restore new key*/
3012 1 : libspdm_copy_mem(secured_message_context->application_secret
3013 1 : .response_data_encryption_key,
3014 : sizeof(secured_message_context->application_secret
3015 : .response_data_encryption_key),
3016 : curr_rsp_enc_key,
3017 : secured_message_context->aead_key_size);
3018 1 : libspdm_copy_mem(secured_message_context->application_secret
3019 1 : .response_data_salt,
3020 : sizeof(secured_message_context->application_secret
3021 : .response_data_salt),
3022 : curr_rsp_salt,
3023 : secured_message_context->aead_iv_size);
3024 : secured_message_context->application_secret
3025 1 : .response_data_sequence_number = curr_rsp_sequence_number;
3026 : }
3027 1 : return LIBSPDM_STATUS_SUCCESS;
3028 :
3029 2 : case 0x20: {
3030 : spdm_error_response_data_response_not_ready_t *spdm_response;
3031 : size_t spdm_response_size;
3032 : size_t transport_header_size;
3033 : uint32_t session_id;
3034 : libspdm_session_info_t *session_info;
3035 : uint8_t *scratch_buffer;
3036 : size_t scratch_buffer_size;
3037 :
3038 : libspdm_secured_message_context_t *secured_message_context;
3039 : uint8_t curr_rsp_enc_key[LIBSPDM_MAX_AEAD_KEY_SIZE];
3040 : uint8_t curr_rsp_salt[LIBSPDM_MAX_AEAD_IV_SIZE];
3041 : uint64_t curr_rsp_sequence_number;
3042 :
3043 2 : spdm_response_size = sizeof(spdm_error_response_data_response_not_ready_t);
3044 2 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
3045 2 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
3046 :
3047 2 : session_id = 0xFFFFFFFF;
3048 2 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
3049 2 : if (session_info == NULL) {
3050 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
3051 : }
3052 2 : secured_message_context = session_info->secured_message_context;
3053 :
3054 : /*use previous key to send*/
3055 2 : libspdm_copy_mem(curr_rsp_enc_key, sizeof(curr_rsp_enc_key),
3056 : secured_message_context
3057 2 : ->application_secret.response_data_encryption_key,
3058 : secured_message_context->aead_key_size);
3059 2 : libspdm_copy_mem(curr_rsp_salt, sizeof(curr_rsp_salt),
3060 : secured_message_context
3061 2 : ->application_secret.response_data_salt,
3062 : secured_message_context->aead_iv_size);
3063 2 : curr_rsp_sequence_number = m_libspdm_last_rsp_sequence_number;
3064 :
3065 2 : libspdm_copy_mem(secured_message_context->application_secret
3066 2 : .response_data_encryption_key,
3067 : sizeof(secured_message_context->application_secret
3068 : .response_data_encryption_key),
3069 : m_libspdm_last_rsp_enc_key,
3070 : secured_message_context->aead_key_size);
3071 2 : libspdm_copy_mem(secured_message_context->application_secret
3072 2 : .response_data_salt,
3073 : sizeof(secured_message_context->application_secret
3074 : .response_data_salt),
3075 : m_libspdm_last_rsp_salt,
3076 : secured_message_context->aead_iv_size);
3077 : secured_message_context->application_secret
3078 2 : .response_data_sequence_number = m_libspdm_last_rsp_sequence_number;
3079 :
3080 : /* once the sequence number is used, it should be increased for next NOT_READY message.*/
3081 2 : m_libspdm_last_rsp_sequence_number++;
3082 :
3083 2 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
3084 2 : spdm_response->header.request_response_code = SPDM_ERROR;
3085 2 : spdm_response->header.param1 = SPDM_ERROR_CODE_RESPONSE_NOT_READY;
3086 2 : spdm_response->header.param2 = 0;
3087 2 : spdm_response->extend_error_data.rd_exponent = 1;
3088 2 : spdm_response->extend_error_data.rd_tm = 2;
3089 2 : spdm_response->extend_error_data.request_code = SPDM_KEY_UPDATE;
3090 2 : spdm_response->extend_error_data.token = 0;
3091 :
3092 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
3093 : * transport_message is always in sender buffer. */
3094 2 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
3095 2 : libspdm_copy_mem (scratch_buffer + transport_header_size,
3096 : scratch_buffer_size - transport_header_size,
3097 : spdm_response, spdm_response_size);
3098 2 : spdm_response = (void *)(scratch_buffer + transport_header_size);
3099 2 : libspdm_transport_test_encode_message(spdm_context, &session_id,
3100 : false, false, spdm_response_size,
3101 : spdm_response, response_size, response);
3102 :
3103 : /*restore new key*/
3104 2 : libspdm_copy_mem(secured_message_context->application_secret
3105 2 : .response_data_encryption_key,
3106 : sizeof(secured_message_context->application_secret
3107 : .response_data_encryption_key),
3108 : curr_rsp_enc_key,
3109 : secured_message_context->aead_key_size);
3110 2 : libspdm_copy_mem(secured_message_context->application_secret
3111 2 : .response_data_salt,
3112 : sizeof(secured_message_context->application_secret
3113 : .response_data_salt),
3114 : curr_rsp_salt,
3115 : secured_message_context->aead_iv_size);
3116 : secured_message_context->application_secret
3117 2 : .response_data_sequence_number = curr_rsp_sequence_number;
3118 : }
3119 2 : return LIBSPDM_STATUS_SUCCESS;
3120 :
3121 3 : case 0x21: {
3122 : static size_t sub_index = 0;
3123 :
3124 : uint32_t session_id;
3125 : libspdm_session_info_t *session_info;
3126 :
3127 : libspdm_secured_message_context_t *secured_message_context;
3128 :
3129 3 : session_id = 0xFFFFFFFF;
3130 3 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
3131 3 : if (session_info == NULL) {
3132 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
3133 : }
3134 3 : secured_message_context = session_info->secured_message_context;
3135 :
3136 3 : if (sub_index == 0) {
3137 : spdm_error_response_data_response_not_ready_t
3138 : *spdm_response;
3139 : size_t spdm_response_size;
3140 : size_t transport_header_size;
3141 : uint8_t *scratch_buffer;
3142 : size_t scratch_buffer_size;
3143 :
3144 : uint8_t curr_rsp_enc_key[LIBSPDM_MAX_AEAD_KEY_SIZE];
3145 : uint8_t curr_rsp_salt[LIBSPDM_MAX_AEAD_IV_SIZE];
3146 : uint64_t curr_rsp_sequence_number;
3147 :
3148 1 : spdm_response_size = sizeof(spdm_error_response_data_response_not_ready_t);
3149 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
3150 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
3151 :
3152 : /*use previous key to send*/
3153 1 : libspdm_copy_mem(curr_rsp_enc_key, sizeof(curr_rsp_enc_key),
3154 : secured_message_context
3155 1 : ->application_secret.response_data_encryption_key,
3156 : secured_message_context->aead_key_size);
3157 1 : libspdm_copy_mem(curr_rsp_salt, sizeof(curr_rsp_salt),
3158 : secured_message_context
3159 1 : ->application_secret.response_data_salt,
3160 : secured_message_context->aead_iv_size);
3161 1 : curr_rsp_sequence_number = m_libspdm_last_rsp_sequence_number;
3162 :
3163 1 : libspdm_copy_mem(secured_message_context->application_secret
3164 1 : .response_data_encryption_key,
3165 : sizeof(secured_message_context->application_secret
3166 : .response_data_encryption_key),
3167 : m_libspdm_last_rsp_enc_key,
3168 : secured_message_context->aead_key_size);
3169 1 : libspdm_copy_mem(secured_message_context->application_secret
3170 1 : .response_data_salt,
3171 : sizeof(secured_message_context->application_secret
3172 : .response_data_salt),
3173 : m_libspdm_last_rsp_salt,
3174 : secured_message_context->aead_iv_size);
3175 : secured_message_context->application_secret
3176 1 : .response_data_sequence_number = m_libspdm_last_rsp_sequence_number;
3177 :
3178 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
3179 1 : spdm_response->header.request_response_code = SPDM_ERROR;
3180 1 : spdm_response->header.param1 = SPDM_ERROR_CODE_RESPONSE_NOT_READY;
3181 1 : spdm_response->header.param2 = 0;
3182 1 : spdm_response->extend_error_data.rd_exponent = 1;
3183 1 : spdm_response->extend_error_data.rd_tm = 2;
3184 1 : spdm_response->extend_error_data.request_code = SPDM_KEY_UPDATE;
3185 1 : spdm_response->extend_error_data.token = 1;
3186 :
3187 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
3188 : * transport_message is always in sender buffer. */
3189 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
3190 : &scratch_buffer_size);
3191 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
3192 : scratch_buffer_size - transport_header_size,
3193 : spdm_response, spdm_response_size);
3194 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
3195 1 : libspdm_transport_test_encode_message(spdm_context,
3196 : &session_id, false, false,
3197 : spdm_response_size, spdm_response,
3198 : response_size, response);
3199 :
3200 : /*restore new key*/
3201 1 : libspdm_copy_mem(secured_message_context->application_secret
3202 1 : .response_data_encryption_key,
3203 : sizeof(secured_message_context->application_secret
3204 : .response_data_encryption_key),
3205 : curr_rsp_enc_key,
3206 : secured_message_context->aead_key_size);
3207 1 : libspdm_copy_mem(secured_message_context->application_secret
3208 1 : .response_data_salt,
3209 : sizeof(secured_message_context->application_secret
3210 : .response_data_salt),
3211 : curr_rsp_salt,
3212 : secured_message_context->aead_iv_size);
3213 : secured_message_context->application_secret
3214 1 : .response_data_sequence_number = curr_rsp_sequence_number;
3215 2 : } else if (sub_index == 1) {
3216 : spdm_key_update_response_t *spdm_response;
3217 : size_t spdm_response_size;
3218 : size_t transport_header_size;
3219 : uint8_t *scratch_buffer;
3220 : size_t scratch_buffer_size;
3221 :
3222 1 : spdm_response_size = sizeof(spdm_key_update_response_t);
3223 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
3224 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
3225 :
3226 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
3227 1 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
3228 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_ALL_KEYS;
3229 1 : spdm_response->header.param2 = m_libspdm_last_token;
3230 :
3231 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
3232 : * transport_message is always in sender buffer. */
3233 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
3234 : &scratch_buffer_size);
3235 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
3236 : scratch_buffer_size - transport_header_size,
3237 : spdm_response, spdm_response_size);
3238 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
3239 1 : libspdm_transport_test_encode_message(spdm_context,
3240 : &session_id, false, false,
3241 : spdm_response_size, spdm_response,
3242 : response_size, response);
3243 : /* WALKAROUND: If just use single context to encode
3244 : * message and then decode message */
3245 : secured_message_context->application_secret
3246 1 : .response_data_sequence_number--;
3247 1 : } else if (sub_index == 2) {
3248 : spdm_key_update_response_t *spdm_response;
3249 : size_t spdm_response_size;
3250 : size_t transport_header_size;
3251 : uint8_t *scratch_buffer;
3252 : size_t scratch_buffer_size;
3253 :
3254 1 : spdm_response_size = sizeof(spdm_key_update_response_t);
3255 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
3256 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
3257 :
3258 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
3259 1 : spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
3260 1 : spdm_response->header.param1 = SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
3261 1 : spdm_response->header.param2 = m_libspdm_last_token;
3262 :
3263 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
3264 : * transport_message is always in sender buffer. */
3265 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
3266 : &scratch_buffer_size);
3267 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
3268 : scratch_buffer_size - transport_header_size,
3269 : spdm_response, spdm_response_size);
3270 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
3271 1 : libspdm_transport_test_encode_message(spdm_context,
3272 : &session_id, false, false,
3273 : spdm_response_size, spdm_response,
3274 : response_size, response);
3275 : /* WALKAROUND: If just use single context to encode
3276 : * message and then decode message */
3277 : secured_message_context->application_secret
3278 1 : .response_data_sequence_number--;
3279 : }
3280 :
3281 3 : sub_index++;
3282 : }
3283 3 : return LIBSPDM_STATUS_SUCCESS;
3284 :
3285 17 : case 0x22: {
3286 : static uint16_t error_code = LIBSPDM_ERROR_CODE_RESERVED_00;
3287 :
3288 : uint32_t session_id;
3289 : libspdm_session_info_t *session_info;
3290 :
3291 : spdm_error_response_t *spdm_response;
3292 : size_t spdm_response_size;
3293 : size_t transport_header_size;
3294 : uint8_t *scratch_buffer;
3295 : size_t scratch_buffer_size;
3296 :
3297 : libspdm_secured_message_context_t *secured_message_context;
3298 : uint8_t curr_rsp_enc_key[LIBSPDM_MAX_AEAD_KEY_SIZE];
3299 : uint8_t curr_rsp_salt[LIBSPDM_MAX_AEAD_IV_SIZE];
3300 : uint64_t curr_rsp_sequence_number;
3301 :
3302 17 : spdm_response_size = sizeof(spdm_error_response_t);
3303 17 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
3304 17 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
3305 :
3306 17 : session_id = 0xFFFFFFFF;
3307 17 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
3308 17 : if (session_info == NULL) {
3309 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
3310 : }
3311 17 : secured_message_context = session_info->secured_message_context;
3312 :
3313 17 : if(error_code <= 0xff) {
3314 : /* skip SPDM_ERROR_CODE_DECRYPT_ERROR, because this case will free context*/
3315 17 : if(error_code == SPDM_ERROR_CODE_DECRYPT_ERROR) {
3316 1 : error_code++;
3317 : }
3318 : /*use previous key to send*/
3319 17 : libspdm_copy_mem(curr_rsp_enc_key, sizeof(curr_rsp_enc_key),
3320 : secured_message_context
3321 17 : ->application_secret.response_data_encryption_key,
3322 : secured_message_context->aead_key_size);
3323 17 : libspdm_copy_mem(curr_rsp_salt, sizeof(curr_rsp_salt),
3324 : secured_message_context
3325 17 : ->application_secret.response_data_salt,
3326 : secured_message_context->aead_iv_size);
3327 17 : curr_rsp_sequence_number = m_libspdm_last_rsp_sequence_number;
3328 :
3329 17 : libspdm_copy_mem(secured_message_context->application_secret
3330 17 : .response_data_encryption_key,
3331 : sizeof(secured_message_context->application_secret
3332 : .response_data_encryption_key),
3333 : m_libspdm_last_rsp_enc_key,
3334 : secured_message_context->aead_key_size);
3335 17 : libspdm_copy_mem(secured_message_context->application_secret
3336 17 : .response_data_salt,
3337 : sizeof(secured_message_context->application_secret
3338 : .response_data_salt),
3339 : m_libspdm_last_rsp_salt,
3340 : secured_message_context->aead_iv_size);
3341 : secured_message_context->application_secret
3342 17 : .response_data_sequence_number = m_libspdm_last_rsp_sequence_number;
3343 :
3344 17 : libspdm_zero_mem (spdm_response, spdm_response_size);
3345 17 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
3346 17 : spdm_response->header.request_response_code = SPDM_ERROR;
3347 17 : spdm_response->header.param1 = (uint8_t) error_code;
3348 17 : spdm_response->header.param2 = 0;
3349 :
3350 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
3351 : * transport_message is always in sender buffer. */
3352 17 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
3353 : &scratch_buffer_size);
3354 17 : libspdm_copy_mem (scratch_buffer + transport_header_size,
3355 : scratch_buffer_size - transport_header_size,
3356 : spdm_response, spdm_response_size);
3357 17 : spdm_response = (void *)(scratch_buffer + transport_header_size);
3358 17 : libspdm_transport_test_encode_message(spdm_context,
3359 : &session_id, false, false,
3360 : spdm_response_size, spdm_response,
3361 : response_size, response);
3362 :
3363 : /*restore new key*/
3364 17 : libspdm_copy_mem(secured_message_context->application_secret
3365 17 : .response_data_encryption_key,
3366 : sizeof(secured_message_context->application_secret
3367 : .response_data_encryption_key),
3368 : curr_rsp_enc_key,
3369 : secured_message_context->aead_key_size);
3370 17 : libspdm_copy_mem(secured_message_context->application_secret
3371 17 : .response_data_salt,
3372 : sizeof(secured_message_context->application_secret
3373 : .response_data_salt),
3374 : curr_rsp_salt,
3375 : secured_message_context->aead_iv_size);
3376 : secured_message_context->application_secret
3377 17 : .response_data_sequence_number = curr_rsp_sequence_number;
3378 : }
3379 :
3380 17 : error_code++;
3381 : /*busy is treated in cases 5 and 6*/
3382 17 : if(error_code == SPDM_ERROR_CODE_BUSY) {
3383 1 : error_code = SPDM_ERROR_CODE_UNEXPECTED_REQUEST;
3384 : }
3385 : /*skip some reserved error codes (0d to 3e)*/
3386 17 : if(error_code == LIBSPDM_ERROR_CODE_RESERVED_0D) {
3387 1 : error_code = LIBSPDM_ERROR_CODE_RESERVED_3F;
3388 : }
3389 : /*skip response not ready, request resync, and some reserved codes (44 to fc)*/
3390 17 : if(error_code == SPDM_ERROR_CODE_RESPONSE_NOT_READY) {
3391 1 : error_code = LIBSPDM_ERROR_CODE_RESERVED_FD;
3392 : }
3393 : }
3394 17 : return LIBSPDM_STATUS_SUCCESS;
3395 :
3396 1 : case 0x23: {
3397 : spdm_error_response_t *spdm_response;
3398 : size_t spdm_response_size;
3399 : size_t transport_header_size;
3400 : uint32_t session_id;
3401 : libspdm_session_info_t *session_info;
3402 : uint8_t *scratch_buffer;
3403 : size_t scratch_buffer_size;
3404 :
3405 1 : spdm_response_size = sizeof(spdm_error_response_t);
3406 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
3407 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
3408 :
3409 1 : session_id = 0xFFFFFFFF;
3410 1 : session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
3411 1 : if (session_info == NULL) {
3412 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
3413 : }
3414 :
3415 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
3416 1 : spdm_response->header.request_response_code = SPDM_ERROR;
3417 1 : spdm_response->header.param1 = SPDM_ERROR_CODE_DECRYPT_ERROR;
3418 1 : spdm_response->header.param2 = 0;
3419 :
3420 : /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
3421 : * transport_message is always in sender buffer. */
3422 1 : libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
3423 1 : libspdm_copy_mem (scratch_buffer + transport_header_size,
3424 : scratch_buffer_size - transport_header_size,
3425 : spdm_response, spdm_response_size);
3426 1 : spdm_response = (void *)(scratch_buffer + transport_header_size);
3427 1 : libspdm_transport_test_encode_message(spdm_context, &session_id,
3428 : false, false, spdm_response_size,
3429 : spdm_response, response_size, response);
3430 : /* WALKAROUND: If just use single context to encode
3431 : * message and then decode message */
3432 : ((libspdm_secured_message_context_t
3433 1 : *)(session_info->secured_message_context))
3434 1 : ->application_secret.response_data_sequence_number--;
3435 : }
3436 1 : return LIBSPDM_STATUS_SUCCESS;
3437 :
3438 0 : default:
3439 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
3440 : }
3441 : }
3442 :
3443 :
3444 : /**
3445 : * Test 1: when no KEY_UPDATE_ACK message is received, and the client
3446 : * returns a device error.
3447 : * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR.
3448 : **/
3449 1 : static void req_key_update_case1(void **state)
3450 : {
3451 : libspdm_return_t status;
3452 : libspdm_test_context_t *spdm_test_context;
3453 : libspdm_context_t *spdm_context;
3454 : uint32_t session_id;
3455 : libspdm_session_info_t *session_info;
3456 :
3457 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
3458 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
3459 :
3460 1 : spdm_test_context = *state;
3461 1 : spdm_context = spdm_test_context->spdm_context;
3462 1 : spdm_test_context->case_id = 0x1;
3463 :
3464 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
3465 : SPDM_VERSION_NUMBER_SHIFT_BIT;
3466 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
3467 :
3468 1 : session_info = &spdm_context->session_info[0];
3469 :
3470 1 : libspdm_set_standard_key_update_test_secrets(
3471 1 : session_info->secured_message_context,
3472 : m_rsp_secret_buffer, (uint8_t)(0xFF),
3473 : m_req_secret_buffer, (uint8_t)(0xEE));
3474 :
3475 1 : status = libspdm_key_update( spdm_context, session_id, true);
3476 :
3477 1 : assert_int_equal(status, LIBSPDM_STATUS_SEND_FAIL);
3478 1 : }
3479 :
3480 : /**
3481 : * Test 2: receiving a correct UPDATE_KEY_ACK message for updating
3482 : * only the request data key.
3483 : * Expected behavior: client returns a Status of LIBSPDM_STATUS_SUCCESS, the
3484 : * request data key is updated, but not the response data key.
3485 : **/
3486 1 : static void req_key_update_case2(void **state)
3487 : {
3488 : libspdm_return_t status;
3489 : libspdm_test_context_t *spdm_test_context;
3490 : libspdm_context_t *spdm_context;
3491 : uint32_t session_id;
3492 : libspdm_session_info_t *session_info;
3493 :
3494 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
3495 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
3496 :
3497 1 : spdm_test_context = *state;
3498 1 : spdm_context = spdm_test_context->spdm_context;
3499 1 : spdm_test_context->case_id = 0x2;
3500 :
3501 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
3502 : SPDM_VERSION_NUMBER_SHIFT_BIT;
3503 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
3504 :
3505 1 : session_info = &spdm_context->session_info[0];
3506 :
3507 1 : libspdm_set_standard_key_update_test_secrets(
3508 1 : session_info->secured_message_context,
3509 : m_rsp_secret_buffer, (uint8_t)(0xFF),
3510 : m_req_secret_buffer, (uint8_t)(0xEE));
3511 :
3512 : /*request side updated*/
3513 1 : libspdm_compute_secret_update(spdm_context->connection_info.version,
3514 : ((libspdm_secured_message_context_t
3515 1 : *)(session_info->secured_message_context))->hash_size,
3516 : m_req_secret_buffer, m_req_secret_buffer,
3517 : sizeof(m_req_secret_buffer));
3518 : /*response side *not* updated*/
3519 :
3520 1 : status = libspdm_key_update( spdm_context, session_id, true);
3521 :
3522 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
3523 1 : assert_memory_equal(((libspdm_secured_message_context_t
3524 : *)(session_info->secured_message_context))
3525 : ->application_secret.request_data_secret,
3526 : m_req_secret_buffer, ((libspdm_secured_message_context_t
3527 : *)(session_info->secured_message_context))->hash_size);
3528 1 : assert_memory_equal(((libspdm_secured_message_context_t
3529 : *)(session_info->secured_message_context))
3530 : ->application_secret.response_data_secret,
3531 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t
3532 : *)(session_info->secured_message_context))->hash_size);
3533 1 : }
3534 :
3535 : /**
3536 : * Test 3: requester state has not been negotiated, as if GET_VERSION,
3537 : * GET_CAPABILITIES and NEGOTIATE_ALGORITHMS had not been exchanged.
3538 : * Expected behavior: client returns a Status of RETURN_UNSUPPORTED.
3539 : **/
3540 1 : static void req_key_update_case3(void **state)
3541 : {
3542 : libspdm_return_t status;
3543 : libspdm_test_context_t *spdm_test_context;
3544 : libspdm_context_t *spdm_context;
3545 : uint32_t session_id;
3546 : libspdm_session_info_t *session_info;
3547 :
3548 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
3549 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
3550 :
3551 1 : spdm_test_context = *state;
3552 1 : spdm_context = spdm_test_context->spdm_context;
3553 1 : spdm_test_context->case_id = 0x3;
3554 :
3555 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
3556 : SPDM_VERSION_NUMBER_SHIFT_BIT;
3557 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
3558 :
3559 : /*state not negotiated*/
3560 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NOT_STARTED;
3561 :
3562 1 : session_info = &spdm_context->session_info[0];
3563 :
3564 1 : libspdm_set_standard_key_update_test_secrets(
3565 1 : session_info->secured_message_context,
3566 : m_rsp_secret_buffer, (uint8_t)(0xFF),
3567 : m_req_secret_buffer, (uint8_t)(0xEE));
3568 :
3569 1 : status = libspdm_key_update( spdm_context, session_id, true);
3570 :
3571 1 : assert_int_equal(status, LIBSPDM_STATUS_INVALID_STATE_LOCAL);
3572 1 : }
3573 :
3574 : /**
3575 : * Test 4: the requester is setup correctly (see Test 2), but receives an ERROR
3576 : * message indicating InvalidParameters when updating key.
3577 : * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, and
3578 : * no keys should be updated.
3579 : **/
3580 1 : static void req_key_update_case4(void **state)
3581 : {
3582 : libspdm_return_t status;
3583 : libspdm_test_context_t *spdm_test_context;
3584 : libspdm_context_t *spdm_context;
3585 : uint32_t session_id;
3586 : libspdm_session_info_t *session_info;
3587 :
3588 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
3589 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
3590 :
3591 1 : spdm_test_context = *state;
3592 1 : spdm_context = spdm_test_context->spdm_context;
3593 1 : spdm_test_context->case_id = 0x4;
3594 :
3595 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
3596 : SPDM_VERSION_NUMBER_SHIFT_BIT;
3597 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
3598 :
3599 1 : session_info = &spdm_context->session_info[0];
3600 :
3601 1 : libspdm_set_standard_key_update_test_secrets(
3602 1 : session_info->secured_message_context,
3603 : m_rsp_secret_buffer, (uint8_t)(0xFF),
3604 : m_req_secret_buffer, (uint8_t)(0xEE));
3605 :
3606 : /*no keys are updated*/
3607 :
3608 1 : status = libspdm_key_update( spdm_context, session_id, true);
3609 :
3610 1 : assert_int_equal(status, LIBSPDM_STATUS_ERROR_PEER);
3611 1 : assert_memory_equal(((libspdm_secured_message_context_t
3612 : *)(session_info->secured_message_context))
3613 : ->application_secret.request_data_secret,
3614 : m_req_secret_buffer, ((libspdm_secured_message_context_t
3615 : *)(session_info->secured_message_context))->hash_size);
3616 1 : assert_memory_equal(((libspdm_secured_message_context_t
3617 : *)(session_info->secured_message_context))
3618 : ->application_secret.response_data_secret,
3619 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t
3620 : *)(session_info->secured_message_context))->hash_size);
3621 1 : }
3622 :
3623 : /**
3624 : * Test 5: the requester is setup correctly (see Test 2), but receives an ERROR
3625 : * message indicating the Busy status of the responder, when updating key.
3626 : * Expected behavior: client returns a Status of RETURN_NO_RESPONSE, and
3627 : * no keys should be updated.
3628 : **/
3629 1 : static void req_key_update_case5(void **state)
3630 : {
3631 : libspdm_return_t status;
3632 : libspdm_test_context_t *spdm_test_context;
3633 : libspdm_context_t *spdm_context;
3634 : uint32_t session_id;
3635 : libspdm_session_info_t *session_info;
3636 :
3637 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
3638 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
3639 :
3640 1 : spdm_test_context = *state;
3641 1 : spdm_context = spdm_test_context->spdm_context;
3642 1 : spdm_test_context->case_id = 0x5;
3643 :
3644 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
3645 : SPDM_VERSION_NUMBER_SHIFT_BIT;
3646 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
3647 :
3648 1 : session_info = &spdm_context->session_info[0];
3649 :
3650 1 : libspdm_set_standard_key_update_test_secrets(
3651 1 : session_info->secured_message_context,
3652 : m_rsp_secret_buffer, (uint8_t)(0xFF),
3653 : m_req_secret_buffer, (uint8_t)(0xEE));
3654 :
3655 : /*no keys are updated*/
3656 :
3657 1 : status = libspdm_key_update( spdm_context, session_id, true);
3658 :
3659 1 : assert_int_equal(status, LIBSPDM_STATUS_BUSY_PEER);
3660 1 : assert_memory_equal(((libspdm_secured_message_context_t
3661 : *)(session_info->secured_message_context))
3662 : ->application_secret.request_data_secret,
3663 : m_req_secret_buffer, ((libspdm_secured_message_context_t
3664 : *)(session_info->secured_message_context))->hash_size);
3665 1 : assert_memory_equal(((libspdm_secured_message_context_t
3666 : *)(session_info->secured_message_context))
3667 : ->application_secret.response_data_secret,
3668 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t
3669 : *)(session_info->secured_message_context))->hash_size);
3670 1 : }
3671 :
3672 : /**
3673 : * Test 6: the requester is setup correctly (see Test 2), but, when updating
3674 : * key, on the first try, receiving a Busy ERROR message, and on retry,
3675 : * receiving a correct KEY_UPDATE_ACK message. The VERIFY_KEY behavior is
3676 : * not altered.
3677 : * Expected behavior: client returns a Status of LIBSPDM_STATUS_SUCCESS, the
3678 : * request data key is updated, but not the response data key.
3679 : **/
3680 1 : static void req_key_update_case6(void **state)
3681 : {
3682 : libspdm_return_t status;
3683 : libspdm_test_context_t *spdm_test_context;
3684 : libspdm_context_t *spdm_context;
3685 : uint32_t session_id;
3686 : libspdm_session_info_t *session_info;
3687 :
3688 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
3689 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
3690 :
3691 1 : spdm_test_context = *state;
3692 1 : spdm_context = spdm_test_context->spdm_context;
3693 1 : spdm_test_context->case_id = 0x6;
3694 :
3695 1 : spdm_context->retry_times = 3;
3696 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
3697 : SPDM_VERSION_NUMBER_SHIFT_BIT;
3698 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
3699 :
3700 1 : session_info = &spdm_context->session_info[0];
3701 :
3702 1 : libspdm_set_standard_key_update_test_secrets(
3703 1 : session_info->secured_message_context,
3704 : m_rsp_secret_buffer, (uint8_t)(0xFF),
3705 : m_req_secret_buffer, (uint8_t)(0xEE));
3706 :
3707 : /*request side updated*/
3708 1 : libspdm_compute_secret_update(spdm_context->connection_info.version,
3709 : ((libspdm_secured_message_context_t
3710 1 : *)(session_info->secured_message_context))->hash_size,
3711 : m_req_secret_buffer, m_req_secret_buffer,
3712 : sizeof(m_req_secret_buffer));
3713 : /*response side *not* updated*/
3714 :
3715 1 : status = libspdm_key_update( spdm_context, session_id, true);
3716 :
3717 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
3718 1 : assert_memory_equal(((libspdm_secured_message_context_t
3719 : *)(session_info->secured_message_context))
3720 : ->application_secret.request_data_secret,
3721 : m_req_secret_buffer, ((libspdm_secured_message_context_t
3722 : *)(session_info->secured_message_context))->hash_size);
3723 1 : assert_memory_equal(((libspdm_secured_message_context_t
3724 : *)(session_info->secured_message_context))
3725 : ->application_secret.response_data_secret,
3726 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t
3727 : *)(session_info->secured_message_context))->hash_size);
3728 1 : }
3729 :
3730 : /**
3731 : * Test 7: the requester is setup correctly (see Test 2), but receives an ERROR
3732 : * message indicating the RequestResynch status of the responder, when updating
3733 : * key.
3734 : * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, and the
3735 : * communication is reset to expect a new GET_VERSION message.
3736 : **/
3737 1 : static void req_key_update_case7(void **state)
3738 : {
3739 : libspdm_return_t status;
3740 : libspdm_test_context_t *spdm_test_context;
3741 : libspdm_context_t *spdm_context;
3742 : uint32_t session_id;
3743 : libspdm_session_info_t *session_info;
3744 :
3745 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
3746 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
3747 :
3748 1 : spdm_test_context = *state;
3749 1 : spdm_context = spdm_test_context->spdm_context;
3750 1 : spdm_test_context->case_id = 0x7;
3751 :
3752 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
3753 : SPDM_VERSION_NUMBER_SHIFT_BIT;
3754 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
3755 :
3756 1 : session_info = &spdm_context->session_info[0];
3757 :
3758 1 : libspdm_set_standard_key_update_test_secrets(
3759 1 : session_info->secured_message_context,
3760 : m_rsp_secret_buffer, (uint8_t)(0xFF),
3761 : m_req_secret_buffer, (uint8_t)(0xEE));
3762 :
3763 1 : status = libspdm_key_update( spdm_context, session_id, true);
3764 :
3765 1 : assert_int_equal(status, LIBSPDM_STATUS_RESYNCH_PEER);
3766 1 : assert_int_equal(spdm_context->connection_info.connection_state,
3767 : LIBSPDM_CONNECTION_STATE_NOT_STARTED);
3768 1 : }
3769 :
3770 : /**
3771 : * Test 8: the requester is setup correctly (see Test 2), but receives an ERROR
3772 : * message indicating the ResponseNotReady status of the responder, when
3773 : * updating key.
3774 : * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, and
3775 : * no keys should be updated.
3776 : **/
3777 1 : static void req_key_update_case8(void **state)
3778 : {
3779 : libspdm_return_t status;
3780 : libspdm_test_context_t *spdm_test_context;
3781 : libspdm_context_t *spdm_context;
3782 : uint32_t session_id;
3783 : libspdm_session_info_t *session_info;
3784 :
3785 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
3786 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
3787 :
3788 1 : spdm_test_context = *state;
3789 1 : spdm_context = spdm_test_context->spdm_context;
3790 1 : spdm_test_context->case_id = 0x8;
3791 :
3792 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
3793 : SPDM_VERSION_NUMBER_SHIFT_BIT;
3794 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
3795 :
3796 1 : session_info = &spdm_context->session_info[0];
3797 :
3798 1 : libspdm_set_standard_key_update_test_secrets(
3799 1 : session_info->secured_message_context,
3800 : m_rsp_secret_buffer, (uint8_t)(0xFF),
3801 : m_req_secret_buffer, (uint8_t)(0xEE));
3802 :
3803 : /*no keys are updated*/
3804 :
3805 1 : status = libspdm_key_update( spdm_context, session_id, true);
3806 :
3807 1 : assert_int_equal(status, LIBSPDM_STATUS_NOT_READY_PEER);
3808 1 : assert_memory_equal(((libspdm_secured_message_context_t
3809 : *)(session_info->secured_message_context))
3810 : ->application_secret.request_data_secret,
3811 : m_req_secret_buffer, ((libspdm_secured_message_context_t
3812 : *)(session_info->secured_message_context))->hash_size);
3813 1 : assert_memory_equal(((libspdm_secured_message_context_t
3814 : *)(session_info->secured_message_context))
3815 : ->application_secret.response_data_secret,
3816 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t
3817 : *)(session_info->secured_message_context))->hash_size);
3818 1 : }
3819 :
3820 : /**
3821 : * Test 9: the requester is setup correctly (see Test 2), but, when updating
3822 : * key, on the first try, receiving a ResponseNotReady ERROR message, and on
3823 : * retry, receiving a correct KEY_UPDATE_ACK message. The VERIFY_KEY
3824 : * behavior is not altered.
3825 : * Expected behavior: client returns a Status of LIBSPDM_STATUS_SUCCESS, the
3826 : * request data key is updated, but not the response data key.
3827 : **/
3828 1 : static void req_key_update_case9(void **state)
3829 : {
3830 : libspdm_return_t status;
3831 : libspdm_test_context_t *spdm_test_context;
3832 : libspdm_context_t *spdm_context;
3833 : uint32_t session_id;
3834 : libspdm_session_info_t *session_info;
3835 :
3836 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
3837 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
3838 :
3839 1 : spdm_test_context = *state;
3840 1 : spdm_context = spdm_test_context->spdm_context;
3841 1 : spdm_test_context->case_id = 0x9;
3842 :
3843 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
3844 : SPDM_VERSION_NUMBER_SHIFT_BIT;
3845 1 : libspdm_set_standard_key_update_test_state(spdm_context, &session_id);
3846 :
3847 1 : session_info = &spdm_context->session_info[0];
3848 :
3849 1 : libspdm_set_standard_key_update_test_secrets(
3850 1 : session_info->secured_message_context,
3851 : m_rsp_secret_buffer, (uint8_t)(0xFF),
3852 : m_req_secret_buffer, (uint8_t)(0xEE));
3853 :
3854 : /*request side updated*/
3855 1 : libspdm_compute_secret_update(spdm_context->connection_info.version,
3856 : ((libspdm_secured_message_context_t
3857 1 : *)(session_info->secured_message_context))->hash_size,
3858 : m_req_secret_buffer, m_req_secret_buffer,
3859 : sizeof(m_req_secret_buffer));
3860 : /*response side *not* updated*/
3861 :
3862 1 : status = libspdm_key_update(spdm_context, session_id, true);
3863 :
3864 : if (LIBSPDM_RESPOND_IF_READY_SUPPORT) {
3865 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
3866 1 : assert_memory_equal(((libspdm_secured_message_context_t *)
3867 : (session_info->secured_message_context))->application_secret.request_data_secret,
3868 : m_req_secret_buffer, ((libspdm_secured_message_context_t *)
3869 : (session_info->secured_message_context))->hash_size);
3870 :
3871 1 : assert_memory_equal(((libspdm_secured_message_context_t *)
3872 : (session_info->secured_message_context))->application_secret.response_data_secret,
3873 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t *)
3874 : (session_info->secured_message_context))->hash_size);
3875 : } else {
3876 : assert_int_equal(status, LIBSPDM_STATUS_NOT_READY_PEER);
3877 : }
3878 :
3879 1 : }
3880 :
3881 : /**
3882 : * Test 10: receiving an unexpected ERROR message from the responder,
3883 : * when updating key.
3884 : * There are tests for all named codes, including some reserved ones
3885 : * (namely, 0x00, 0x0b, 0x0c, 0x3f, 0xfd, 0xfe).
3886 : * However, for having specific test cases, it is excluded from this case:
3887 : * Busy (0x03), ResponseNotReady (0x42), and RequestResync (0x43).
3888 : * Expected behavior: client returns a status of RETURN_DEVICE_ERROR, and
3889 : * no keys should be updated.
3890 : **/
3891 1 : static void req_key_update_case10(void **state)
3892 : {
3893 : libspdm_return_t status;
3894 : libspdm_test_context_t *spdm_test_context;
3895 : libspdm_context_t *spdm_context;
3896 : uint32_t session_id;
3897 : libspdm_session_info_t *session_info;
3898 : uint16_t error_code;
3899 :
3900 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
3901 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
3902 :
3903 1 : spdm_test_context = *state;
3904 1 : spdm_context = spdm_test_context->spdm_context;
3905 1 : spdm_test_context->case_id = 0xA;
3906 :
3907 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
3908 : SPDM_VERSION_NUMBER_SHIFT_BIT;
3909 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
3910 :
3911 1 : session_info = &spdm_context->session_info[0];
3912 :
3913 1 : error_code = LIBSPDM_ERROR_CODE_RESERVED_00;
3914 18 : while(error_code <= 0xff) {
3915 : /* skip SPDM_ERROR_CODE_DECRYPT_ERROR, because this case will free context*/
3916 17 : if(error_code == SPDM_ERROR_CODE_DECRYPT_ERROR) {
3917 1 : error_code++;
3918 : }
3919 17 : libspdm_set_standard_key_update_test_secrets(
3920 17 : session_info->secured_message_context,
3921 : m_rsp_secret_buffer, (uint8_t)(0xFF),
3922 : m_req_secret_buffer, (uint8_t)(0xEE));
3923 :
3924 : /*no keys are updated*/
3925 :
3926 17 : status = libspdm_key_update( spdm_context, session_id, true);
3927 :
3928 17 : LIBSPDM_ASSERT_INT_EQUAL_CASE (status, LIBSPDM_STATUS_ERROR_PEER, error_code);
3929 17 : assert_memory_equal(((libspdm_secured_message_context_t
3930 : *)(session_info->secured_message_context))
3931 : ->application_secret.request_data_secret,
3932 : m_req_secret_buffer, ((libspdm_secured_message_context_t
3933 : *)(session_info->secured_message_context))->hash_size);
3934 17 : assert_memory_equal(((libspdm_secured_message_context_t
3935 : *)(session_info->secured_message_context))
3936 : ->application_secret.response_data_secret,
3937 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t
3938 : *)(session_info->secured_message_context))->hash_size);
3939 :
3940 17 : error_code++;
3941 : /*busy is treated in cases 5 and 6*/
3942 17 : if(error_code == SPDM_ERROR_CODE_BUSY) {
3943 1 : error_code = SPDM_ERROR_CODE_UNEXPECTED_REQUEST;
3944 : }
3945 : /*skip some reserved error codes (0d to 3e)*/
3946 17 : if(error_code == LIBSPDM_ERROR_CODE_RESERVED_0D) {
3947 1 : error_code = LIBSPDM_ERROR_CODE_RESERVED_3F;
3948 : }
3949 : /*skip response not ready, request resync, and some reserved codes (44 to fc)*/
3950 17 : if(error_code == SPDM_ERROR_CODE_RESPONSE_NOT_READY) {
3951 1 : error_code = LIBSPDM_ERROR_CODE_RESERVED_FD;
3952 : }
3953 : }
3954 1 : }
3955 :
3956 1 : static void req_key_update_case11(void **state)
3957 : {
3958 : libspdm_return_t status;
3959 : libspdm_test_context_t *spdm_test_context;
3960 : libspdm_context_t *spdm_context;
3961 : uint32_t session_id;
3962 : libspdm_session_info_t *session_info;
3963 :
3964 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
3965 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
3966 :
3967 1 : spdm_test_context = *state;
3968 1 : spdm_context = spdm_test_context->spdm_context;
3969 1 : spdm_test_context->case_id = 0xB;
3970 :
3971 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
3972 : SPDM_VERSION_NUMBER_SHIFT_BIT;
3973 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
3974 :
3975 1 : session_info = &spdm_context->session_info[0];
3976 :
3977 1 : libspdm_set_standard_key_update_test_secrets(
3978 1 : session_info->secured_message_context,
3979 : m_rsp_secret_buffer, (uint8_t)(0xFF),
3980 : m_req_secret_buffer, (uint8_t)(0xEE));
3981 :
3982 : /*request side updated*/
3983 1 : libspdm_compute_secret_update(spdm_context->connection_info.version,
3984 : ((libspdm_secured_message_context_t
3985 1 : *)(session_info->secured_message_context))->hash_size,
3986 : m_req_secret_buffer, m_req_secret_buffer,
3987 : sizeof(m_req_secret_buffer));
3988 : /*response side *not* updated*/
3989 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
3990 : session_info->session_transcript.message_m.buffer_size =
3991 : session_info->session_transcript.message_m.max_buffer_size;
3992 : spdm_context->transcript.message_b.buffer_size =
3993 : spdm_context->transcript.message_b.max_buffer_size;
3994 : spdm_context->transcript.message_c.buffer_size =
3995 : spdm_context->transcript.message_c.max_buffer_size;
3996 : spdm_context->transcript.message_mut_b.buffer_size =
3997 : spdm_context->transcript.message_mut_b.max_buffer_size;
3998 : spdm_context->transcript.message_mut_c.buffer_size =
3999 : spdm_context->transcript.message_mut_c.max_buffer_size;
4000 : #endif
4001 :
4002 1 : status = libspdm_key_update( spdm_context, session_id, true);
4003 :
4004 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
4005 1 : assert_memory_equal(((libspdm_secured_message_context_t
4006 : *)(session_info->secured_message_context))
4007 : ->application_secret.request_data_secret,
4008 : m_req_secret_buffer, ((libspdm_secured_message_context_t
4009 : *)(session_info->secured_message_context))->hash_size);
4010 1 : assert_memory_equal(((libspdm_secured_message_context_t
4011 : *)(session_info->secured_message_context))
4012 : ->application_secret.response_data_secret,
4013 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t
4014 : *)(session_info->secured_message_context))->hash_size);
4015 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
4016 : assert_int_equal(session_info->session_transcript.message_m.buffer_size, 0);
4017 : assert_int_equal(spdm_context->transcript.message_b.buffer_size, 0);
4018 : assert_int_equal(spdm_context->transcript.message_c.buffer_size, 0);
4019 : assert_int_equal(spdm_context->transcript.message_mut_b.buffer_size, 0);
4020 : assert_int_equal(spdm_context->transcript.message_mut_c.buffer_size, 0);
4021 : #endif
4022 1 : }
4023 :
4024 : /**
4025 : * Test 12: requester is not setup correctly to support key update
4026 : * (no capabilities). The responder would attempt to return a correct
4027 : * KEY_UPDATE_ACK message.
4028 : * Expected behavior: client returns a Status of RETURN_UNSUPPORTED,
4029 : * and no keys are updated.
4030 : **/
4031 1 : static void req_key_update_case12(void **state)
4032 : {
4033 : libspdm_return_t status;
4034 : libspdm_test_context_t *spdm_test_context;
4035 : libspdm_context_t *spdm_context;
4036 : uint32_t session_id;
4037 : libspdm_session_info_t *session_info;
4038 :
4039 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4040 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4041 :
4042 1 : spdm_test_context = *state;
4043 1 : spdm_context = spdm_test_context->spdm_context;
4044 1 : spdm_test_context->case_id = 0xC;
4045 :
4046 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
4047 : SPDM_VERSION_NUMBER_SHIFT_BIT;
4048 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
4049 :
4050 : /*no capabilities*/
4051 1 : spdm_context->connection_info.capability.flags &=
4052 : ~SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_UPD_CAP;
4053 1 : spdm_context->local_context.capability.flags &=
4054 : ~SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_UPD_CAP;
4055 :
4056 1 : session_info = &spdm_context->session_info[0];
4057 :
4058 1 : libspdm_set_standard_key_update_test_secrets(
4059 1 : session_info->secured_message_context,
4060 : m_rsp_secret_buffer, (uint8_t)(0xFF),
4061 : m_req_secret_buffer, (uint8_t)(0xEE));
4062 :
4063 : /*no keys are updated*/
4064 :
4065 1 : status = libspdm_key_update( spdm_context, session_id, true);
4066 :
4067 1 : assert_int_equal(status, LIBSPDM_STATUS_UNSUPPORTED_CAP);
4068 1 : assert_memory_equal(((libspdm_secured_message_context_t
4069 : *)(session_info->secured_message_context))
4070 : ->application_secret.request_data_secret,
4071 : m_req_secret_buffer, ((libspdm_secured_message_context_t
4072 : *)(session_info->secured_message_context))->hash_size);
4073 1 : assert_memory_equal(((libspdm_secured_message_context_t
4074 : *)(session_info->secured_message_context))
4075 : ->application_secret.response_data_secret,
4076 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t
4077 : *)(session_info->secured_message_context))->hash_size);
4078 1 : }
4079 :
4080 : /**
4081 : * Test 13: receiving an incorrect KEY_UPDATE_ACK message, with wrong
4082 : * response code, but all other field correct, when updating key.
4083 : * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR,
4084 : * no keys are updated.
4085 : **/
4086 1 : static void req_key_update_case13(void **state)
4087 : {
4088 : libspdm_return_t status;
4089 : libspdm_test_context_t *spdm_test_context;
4090 : libspdm_context_t *spdm_context;
4091 : uint32_t session_id;
4092 : libspdm_session_info_t *session_info;
4093 :
4094 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4095 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4096 :
4097 1 : spdm_test_context = *state;
4098 1 : spdm_context = spdm_test_context->spdm_context;
4099 1 : spdm_test_context->case_id = 0xC;
4100 :
4101 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
4102 : SPDM_VERSION_NUMBER_SHIFT_BIT;
4103 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
4104 :
4105 1 : session_info = &spdm_context->session_info[0];
4106 :
4107 1 : libspdm_set_standard_key_update_test_secrets(
4108 1 : session_info->secured_message_context,
4109 : m_rsp_secret_buffer, (uint8_t)(0xFF),
4110 : m_req_secret_buffer, (uint8_t)(0xEE));
4111 :
4112 : /*no keys are updated*/
4113 :
4114 1 : status = libspdm_key_update( spdm_context, session_id, true);
4115 :
4116 1 : assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
4117 1 : assert_memory_equal(((libspdm_secured_message_context_t
4118 : *)(session_info->secured_message_context))
4119 : ->application_secret.request_data_secret,
4120 : m_req_secret_buffer, ((libspdm_secured_message_context_t
4121 : *)(session_info->secured_message_context))->hash_size);
4122 1 : assert_memory_equal(((libspdm_secured_message_context_t
4123 : *)(session_info->secured_message_context))
4124 : ->application_secret.response_data_secret,
4125 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t
4126 : *)(session_info->secured_message_context))->hash_size);
4127 1 : }
4128 :
4129 : /**
4130 : * Test 14: requester is not setup correctly by not initializing a
4131 : * session during KEY_EXCHANGE. The responder would attempt to
4132 : * return a correct KEY_UPDATE_ACK message.
4133 : * Expected behavior: client returns a Status of RETURN_UNSUPPORTED,
4134 : * and no keys are updated.
4135 : **/
4136 1 : static void req_key_update_case14(void **state)
4137 : {
4138 : libspdm_return_t status;
4139 : libspdm_test_context_t *spdm_test_context;
4140 : libspdm_context_t *spdm_context;
4141 : uint32_t session_id;
4142 : libspdm_session_info_t *session_info;
4143 :
4144 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4145 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4146 :
4147 1 : spdm_test_context = *state;
4148 1 : spdm_context = spdm_test_context->spdm_context;
4149 1 : spdm_test_context->case_id = 0xD;
4150 :
4151 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
4152 : SPDM_VERSION_NUMBER_SHIFT_BIT;
4153 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
4154 :
4155 1 : session_info = &spdm_context->session_info[0];
4156 :
4157 : /*session not initialized*/
4158 1 : libspdm_secured_message_set_session_state(
4159 : session_info->secured_message_context,
4160 : LIBSPDM_SESSION_STATE_NOT_STARTED);
4161 :
4162 1 : libspdm_set_standard_key_update_test_secrets(
4163 1 : session_info->secured_message_context,
4164 : m_rsp_secret_buffer, (uint8_t)(0xFF),
4165 : m_req_secret_buffer, (uint8_t)(0xEE));
4166 :
4167 : /*no keys are updated*/
4168 :
4169 1 : status = libspdm_key_update( spdm_context, session_id, true);
4170 :
4171 1 : assert_int_equal(status, LIBSPDM_STATUS_INVALID_STATE_LOCAL);
4172 1 : assert_memory_equal(((libspdm_secured_message_context_t
4173 : *)(session_info->secured_message_context))
4174 : ->application_secret.request_data_secret,
4175 : m_req_secret_buffer, ((libspdm_secured_message_context_t
4176 : *)(session_info->secured_message_context))->hash_size);
4177 1 : assert_memory_equal(((libspdm_secured_message_context_t
4178 : *)(session_info->secured_message_context))
4179 : ->application_secret.response_data_secret,
4180 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t
4181 : *)(session_info->secured_message_context))->hash_size);
4182 1 : }
4183 :
4184 : /**
4185 : * Test 15: the requester is setup correctly (see Test 2), but receives a
4186 : * KEY_UPDATE_ACK response with the wrong token. The VERIFY_KEY behavior
4187 : * is not altered.
4188 : * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, and
4189 : * no keys should be updated.
4190 : **/
4191 1 : static void req_key_update_case15(void **state)
4192 : {
4193 : libspdm_return_t status;
4194 : libspdm_test_context_t *spdm_test_context;
4195 : libspdm_context_t *spdm_context;
4196 : uint32_t session_id;
4197 : libspdm_session_info_t *session_info;
4198 :
4199 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4200 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4201 :
4202 1 : spdm_test_context = *state;
4203 1 : spdm_context = spdm_test_context->spdm_context;
4204 1 : spdm_test_context->case_id = 0xF;
4205 :
4206 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
4207 : SPDM_VERSION_NUMBER_SHIFT_BIT;
4208 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
4209 :
4210 1 : session_info = &spdm_context->session_info[0];
4211 :
4212 1 : libspdm_set_standard_key_update_test_secrets(
4213 1 : session_info->secured_message_context,
4214 : m_rsp_secret_buffer, (uint8_t)(0xFF),
4215 : m_req_secret_buffer, (uint8_t)(0xEE));
4216 :
4217 : /*no keys are updated*/
4218 :
4219 1 : status = libspdm_key_update( spdm_context, session_id, true);
4220 :
4221 1 : assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
4222 1 : assert_memory_equal(((libspdm_secured_message_context_t
4223 : *)(session_info->secured_message_context))
4224 : ->application_secret.request_data_secret,
4225 : m_req_secret_buffer, ((libspdm_secured_message_context_t
4226 : *)(session_info->secured_message_context))->hash_size);
4227 1 : assert_memory_equal(((libspdm_secured_message_context_t
4228 : *)(session_info->secured_message_context))
4229 : ->application_secret.response_data_secret,
4230 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t
4231 : *)(session_info->secured_message_context))->hash_size);
4232 1 : }
4233 :
4234 : /**
4235 : * Test 16: the requester is setup correctly (see Test 2), but receives a
4236 : * KEY_UPDATE_ACK response with the operation code. The VERIFY_KEY
4237 : * behavior is not altered.
4238 : * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, and
4239 : * no keys should be updated.
4240 : **/
4241 1 : static void req_key_update_case16(void **state)
4242 : {
4243 : libspdm_return_t status;
4244 : libspdm_test_context_t *spdm_test_context;
4245 : libspdm_context_t *spdm_context;
4246 : uint32_t session_id;
4247 : libspdm_session_info_t *session_info;
4248 :
4249 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4250 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4251 :
4252 1 : spdm_test_context = *state;
4253 1 : spdm_context = spdm_test_context->spdm_context;
4254 1 : spdm_test_context->case_id = 0x10;
4255 :
4256 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
4257 : SPDM_VERSION_NUMBER_SHIFT_BIT;
4258 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
4259 :
4260 1 : session_info = &spdm_context->session_info[0];
4261 :
4262 1 : libspdm_set_standard_key_update_test_secrets(
4263 1 : session_info->secured_message_context,
4264 : m_rsp_secret_buffer, (uint8_t)(0xFF),
4265 : m_req_secret_buffer, (uint8_t)(0xEE));
4266 :
4267 : /*no keys are updated*/
4268 :
4269 1 : status = libspdm_key_update( spdm_context, session_id, true);
4270 :
4271 1 : assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
4272 1 : assert_memory_equal(((libspdm_secured_message_context_t
4273 : *)(session_info->secured_message_context))
4274 : ->application_secret.request_data_secret,
4275 : m_req_secret_buffer, ((libspdm_secured_message_context_t
4276 : *)(session_info->secured_message_context))->hash_size);
4277 1 : assert_memory_equal(((libspdm_secured_message_context_t
4278 : *)(session_info->secured_message_context))
4279 : ->application_secret.response_data_secret,
4280 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t
4281 : *)(session_info->secured_message_context))->hash_size);
4282 1 : }
4283 :
4284 : /**
4285 : * Test 17: the requester is setup correctly (see Test 2), but receives an
4286 : * ERROR message indicating InvalidParameters when verifying key.
4287 : * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, the
4288 : * request data key is not rollbacked.
4289 : **/
4290 1 : static void req_key_update_case17(void **state)
4291 : {
4292 : libspdm_return_t status;
4293 : libspdm_test_context_t *spdm_test_context;
4294 : libspdm_context_t *spdm_context;
4295 : uint32_t session_id;
4296 : libspdm_session_info_t *session_info;
4297 :
4298 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4299 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4300 :
4301 1 : spdm_test_context = *state;
4302 1 : spdm_context = spdm_test_context->spdm_context;
4303 1 : spdm_test_context->case_id = 0x11;
4304 :
4305 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
4306 : SPDM_VERSION_NUMBER_SHIFT_BIT;
4307 1 : libspdm_set_standard_key_update_test_state(spdm_context, &session_id);
4308 :
4309 1 : session_info = &spdm_context->session_info[0];
4310 :
4311 1 : libspdm_set_standard_key_update_test_secrets(
4312 1 : session_info->secured_message_context,
4313 : m_rsp_secret_buffer, (uint8_t)(0xFF),
4314 : m_req_secret_buffer, (uint8_t)(0xEE));
4315 :
4316 : /*request side updated*/
4317 1 : libspdm_compute_secret_update(spdm_context->connection_info.version,
4318 : ((libspdm_secured_message_context_t
4319 1 : *)(session_info->secured_message_context))->hash_size,
4320 : m_req_secret_buffer, m_req_secret_buffer,
4321 : sizeof(m_req_secret_buffer));
4322 : /*response side *not* updated*/
4323 :
4324 1 : status = libspdm_key_update(spdm_context, session_id, true);
4325 :
4326 1 : assert_int_equal(status, LIBSPDM_STATUS_ERROR_PEER);
4327 1 : assert_memory_equal(((libspdm_secured_message_context_t
4328 : *)(session_info->secured_message_context))
4329 : ->application_secret.request_data_secret,
4330 : m_req_secret_buffer, ((libspdm_secured_message_context_t
4331 : *)(session_info->secured_message_context))->hash_size);
4332 1 : assert_memory_equal(((libspdm_secured_message_context_t
4333 : *)(session_info->secured_message_context))
4334 : ->application_secret.response_data_secret,
4335 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t
4336 : *)(session_info->secured_message_context))->hash_size);
4337 1 : }
4338 :
4339 : /**
4340 : * Test 18: the requester is setup correctly (see Test 2), but receives an
4341 : * ERROR message indicating the Busy status of the responder, when verifying
4342 : * key.
4343 : * Expected behavior: client returns a Status of RETURN_NO_RESPONSE, the
4344 : * request data key is not rollbacked.
4345 : **/
4346 1 : static void req_key_update_case18(void **state)
4347 : {
4348 : libspdm_return_t status;
4349 : libspdm_test_context_t *spdm_test_context;
4350 : libspdm_context_t *spdm_context;
4351 : uint32_t session_id;
4352 : libspdm_session_info_t *session_info;
4353 :
4354 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4355 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4356 :
4357 1 : spdm_test_context = *state;
4358 1 : spdm_context = spdm_test_context->spdm_context;
4359 1 : spdm_test_context->case_id = 0x12;
4360 :
4361 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
4362 : SPDM_VERSION_NUMBER_SHIFT_BIT;
4363 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
4364 :
4365 1 : session_info = &spdm_context->session_info[0];
4366 :
4367 1 : libspdm_set_standard_key_update_test_secrets(
4368 1 : session_info->secured_message_context,
4369 : m_rsp_secret_buffer, (uint8_t)(0xFF),
4370 : m_req_secret_buffer, (uint8_t)(0xEE));
4371 :
4372 : /*request side updated*/
4373 1 : libspdm_compute_secret_update(spdm_context->connection_info.version,
4374 : ((libspdm_secured_message_context_t
4375 1 : *)(session_info->secured_message_context))->hash_size,
4376 : m_req_secret_buffer, m_req_secret_buffer,
4377 : sizeof(m_req_secret_buffer));
4378 : /*response side *not* updated*/
4379 :
4380 1 : status = libspdm_key_update( spdm_context, session_id, true);
4381 :
4382 1 : assert_int_equal(status, LIBSPDM_STATUS_BUSY_PEER);
4383 1 : assert_memory_equal(((libspdm_secured_message_context_t
4384 : *)(session_info->secured_message_context))
4385 : ->application_secret.request_data_secret,
4386 : m_req_secret_buffer, ((libspdm_secured_message_context_t
4387 : *)(session_info->secured_message_context))->hash_size);
4388 1 : assert_memory_equal(((libspdm_secured_message_context_t
4389 : *)(session_info->secured_message_context))
4390 : ->application_secret.response_data_secret,
4391 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t
4392 : *)(session_info->secured_message_context))->hash_size);
4393 1 : }
4394 :
4395 : /**
4396 : * Test 19: the requester is setup correctly (see Test 2), but, when
4397 : * verifying key, on the first try, receiving a Busy ERROR message,
4398 : * and on retry, receiving a correct KEY_UPDATE_ACK message. The
4399 : * VERIFY_KEY behavior is not altered.
4400 : * Expected behavior: client returns a Status of LIBSPDM_STATUS_SUCCESS, the
4401 : * request data key is not rollbacked.
4402 : **/
4403 1 : static void req_key_update_case19(void **state)
4404 : {
4405 : libspdm_return_t status;
4406 : libspdm_test_context_t *spdm_test_context;
4407 : libspdm_context_t *spdm_context;
4408 : uint32_t session_id;
4409 : libspdm_session_info_t *session_info;
4410 :
4411 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4412 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4413 :
4414 1 : spdm_test_context = *state;
4415 1 : spdm_context = spdm_test_context->spdm_context;
4416 1 : spdm_test_context->case_id = 0x13;
4417 :
4418 1 : spdm_context->retry_times = 3;
4419 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
4420 : SPDM_VERSION_NUMBER_SHIFT_BIT;
4421 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
4422 :
4423 1 : session_info = &spdm_context->session_info[0];
4424 :
4425 1 : libspdm_set_standard_key_update_test_secrets(
4426 1 : session_info->secured_message_context,
4427 : m_rsp_secret_buffer, (uint8_t)(0xFF),
4428 : m_req_secret_buffer, (uint8_t)(0xEE));
4429 :
4430 : /*request side updated*/
4431 1 : libspdm_compute_secret_update(spdm_context->connection_info.version,
4432 : ((libspdm_secured_message_context_t
4433 1 : *)(session_info->secured_message_context))->hash_size,
4434 : m_req_secret_buffer, m_req_secret_buffer,
4435 : sizeof(m_req_secret_buffer));
4436 : /*response side *not* updated*/
4437 :
4438 1 : status = libspdm_key_update( spdm_context, session_id, true);
4439 :
4440 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
4441 1 : assert_memory_equal(((libspdm_secured_message_context_t
4442 : *)(session_info->secured_message_context))
4443 : ->application_secret.request_data_secret,
4444 : m_req_secret_buffer, ((libspdm_secured_message_context_t
4445 : *)(session_info->secured_message_context))->hash_size);
4446 1 : assert_memory_equal(((libspdm_secured_message_context_t
4447 : *)(session_info->secured_message_context))
4448 : ->application_secret.response_data_secret,
4449 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t
4450 : *)(session_info->secured_message_context))->hash_size);
4451 1 : }
4452 :
4453 : /**
4454 : * Test 20: the requester is setup correctly (see Test 2), but receives an
4455 : * ERROR message indicating the RequestResynch status of the responder, when
4456 : * verifying key.
4457 : * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, and the
4458 : * communication is reset to expect a new GET_VERSION message.
4459 : **/
4460 1 : static void req_key_update_case20(void **state)
4461 : {
4462 : libspdm_return_t status;
4463 : libspdm_test_context_t *spdm_test_context;
4464 : libspdm_context_t *spdm_context;
4465 : uint32_t session_id;
4466 : libspdm_session_info_t *session_info;
4467 :
4468 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4469 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4470 :
4471 1 : spdm_test_context = *state;
4472 1 : spdm_context = spdm_test_context->spdm_context;
4473 1 : spdm_test_context->case_id = 0x14;
4474 :
4475 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
4476 : SPDM_VERSION_NUMBER_SHIFT_BIT;
4477 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
4478 :
4479 1 : session_info = &spdm_context->session_info[0];
4480 :
4481 1 : libspdm_set_standard_key_update_test_secrets(
4482 1 : session_info->secured_message_context,
4483 : m_rsp_secret_buffer, (uint8_t)(0xFF),
4484 : m_req_secret_buffer, (uint8_t)(0xEE));
4485 :
4486 1 : status = libspdm_key_update( spdm_context, session_id, true);
4487 :
4488 1 : assert_int_equal(status, LIBSPDM_STATUS_RESYNCH_PEER);
4489 1 : assert_int_equal(spdm_context->connection_info.connection_state,
4490 : LIBSPDM_CONNECTION_STATE_NOT_STARTED);
4491 1 : }
4492 :
4493 : /**
4494 : * Test 21: the requester is setup correctly (see Test 2), but receives an
4495 : * ERROR message indicating the ResponseNotReady status of the responder, when
4496 : * verifying key.
4497 : * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, the
4498 : * request data key is not rollbacked.
4499 : **/
4500 1 : static void req_key_update_case21(void **state)
4501 : {
4502 : libspdm_return_t status;
4503 : libspdm_test_context_t *spdm_test_context;
4504 : libspdm_context_t *spdm_context;
4505 : uint32_t session_id;
4506 : libspdm_session_info_t *session_info;
4507 :
4508 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4509 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4510 :
4511 1 : spdm_test_context = *state;
4512 1 : spdm_context = spdm_test_context->spdm_context;
4513 1 : spdm_test_context->case_id = 0x15;
4514 :
4515 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
4516 : SPDM_VERSION_NUMBER_SHIFT_BIT;
4517 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
4518 :
4519 1 : session_info = &spdm_context->session_info[0];
4520 :
4521 1 : libspdm_set_standard_key_update_test_secrets(
4522 1 : session_info->secured_message_context,
4523 : m_rsp_secret_buffer, (uint8_t)(0xFF),
4524 : m_req_secret_buffer, (uint8_t)(0xEE));
4525 :
4526 : /*request side updated*/
4527 1 : libspdm_compute_secret_update(spdm_context->connection_info.version,
4528 : ((libspdm_secured_message_context_t
4529 1 : *)(session_info->secured_message_context))->hash_size,
4530 : m_req_secret_buffer, m_req_secret_buffer,
4531 : sizeof(m_req_secret_buffer));
4532 : /*response side *not* updated*/
4533 :
4534 1 : status = libspdm_key_update( spdm_context, session_id, true);
4535 :
4536 1 : assert_int_equal(status, LIBSPDM_STATUS_NOT_READY_PEER);
4537 1 : assert_memory_equal(((libspdm_secured_message_context_t
4538 : *)(session_info->secured_message_context))
4539 : ->application_secret.request_data_secret,
4540 : m_req_secret_buffer, ((libspdm_secured_message_context_t
4541 : *)(session_info->secured_message_context))->hash_size);
4542 1 : assert_memory_equal(((libspdm_secured_message_context_t
4543 : *)(session_info->secured_message_context))
4544 : ->application_secret.response_data_secret,
4545 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t
4546 : *)(session_info->secured_message_context))->hash_size);
4547 1 : }
4548 :
4549 : /**
4550 : * Test 22: the requester is setup correctly (see Test 2), but, when verifying
4551 : * key, on the first try, receiving a ResponseNotReady ERROR message, and on
4552 : * retry, receiving a correct KEY_UPDATE_ACK message.
4553 : * Expected behavior: client returns a Status of LIBSPDM_STATUS_SUCCESS, the
4554 : * request data key is not rollbacked.
4555 : **/
4556 1 : static void req_key_update_case22(void **state)
4557 : {
4558 : libspdm_return_t status;
4559 : libspdm_test_context_t *spdm_test_context;
4560 : libspdm_context_t *spdm_context;
4561 : uint32_t session_id;
4562 : libspdm_session_info_t *session_info;
4563 :
4564 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4565 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4566 :
4567 1 : spdm_test_context = *state;
4568 1 : spdm_context = spdm_test_context->spdm_context;
4569 1 : spdm_test_context->case_id = 0x16;
4570 :
4571 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
4572 : SPDM_VERSION_NUMBER_SHIFT_BIT;
4573 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
4574 :
4575 1 : session_info = &spdm_context->session_info[0];
4576 :
4577 1 : libspdm_set_standard_key_update_test_secrets(
4578 1 : session_info->secured_message_context,
4579 : m_rsp_secret_buffer, (uint8_t)(0xFF),
4580 : m_req_secret_buffer, (uint8_t)(0xEE));
4581 :
4582 : /*request side updated*/
4583 1 : libspdm_compute_secret_update(spdm_context->connection_info.version,
4584 : ((libspdm_secured_message_context_t
4585 1 : *)(session_info->secured_message_context))->hash_size,
4586 : m_req_secret_buffer, m_req_secret_buffer,
4587 : sizeof(m_req_secret_buffer));
4588 : /*response side *not* updated*/
4589 :
4590 1 : status = libspdm_key_update(spdm_context, session_id, true);
4591 :
4592 : if (LIBSPDM_RESPOND_IF_READY_SUPPORT) {
4593 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
4594 1 : assert_memory_equal(((libspdm_secured_message_context_t
4595 : *)(session_info->secured_message_context))
4596 : ->application_secret.request_data_secret,
4597 : m_req_secret_buffer, ((libspdm_secured_message_context_t
4598 : *)(session_info->secured_message_context))->hash_size);
4599 1 : assert_memory_equal(((libspdm_secured_message_context_t
4600 : *)(session_info->secured_message_context))
4601 : ->application_secret.response_data_secret,
4602 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t
4603 : *)(session_info->secured_message_context))->hash_size);
4604 : } else {
4605 : assert_int_equal(status, LIBSPDM_STATUS_NOT_READY_PEER);
4606 : }
4607 1 : }
4608 :
4609 : /**
4610 : * Test 23: receiving an unexpected ERROR message from the responder,
4611 : * when verifying key.
4612 : * There are tests for all named codes, including some reserved ones
4613 : * (namely, 0x00, 0x0b, 0x0c, 0x3f, 0xfd, 0xfe).
4614 : * However, for having specific test cases, it is excluded from this case:
4615 : * Busy (0x03), ResponseNotReady (0x42), and RequestResync (0x43).
4616 : * Expected behavior: client returns a status of RETURN_DEVICE_ERROR, the
4617 : * request data key is not rollbacked.
4618 : **/
4619 1 : static void req_key_update_case23(void **state)
4620 : {
4621 : libspdm_return_t status;
4622 : libspdm_test_context_t *spdm_test_context;
4623 : libspdm_context_t *spdm_context;
4624 : uint32_t session_id;
4625 : libspdm_session_info_t *session_info;
4626 : uint16_t error_code;
4627 :
4628 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4629 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4630 :
4631 1 : spdm_test_context = *state;
4632 1 : spdm_context = spdm_test_context->spdm_context;
4633 1 : spdm_test_context->case_id = 0x17;
4634 :
4635 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
4636 : SPDM_VERSION_NUMBER_SHIFT_BIT;
4637 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
4638 :
4639 1 : session_info = &spdm_context->session_info[0];
4640 :
4641 1 : error_code = LIBSPDM_ERROR_CODE_RESERVED_00;
4642 18 : while(error_code <= 0xff) {
4643 : /* skip SPDM_ERROR_CODE_DECRYPT_ERROR, because this case will free context*/
4644 17 : if(error_code == SPDM_ERROR_CODE_DECRYPT_ERROR) {
4645 1 : error_code++;
4646 : }
4647 17 : libspdm_set_standard_key_update_test_secrets(
4648 17 : session_info->secured_message_context,
4649 : m_rsp_secret_buffer, (uint8_t)(0xFF),
4650 : m_req_secret_buffer, (uint8_t)(0xEE));
4651 :
4652 : /*request side updated*/
4653 17 : libspdm_compute_secret_update(spdm_context->connection_info.version,
4654 : ((libspdm_secured_message_context_t
4655 17 : *)(session_info->secured_message_context))->hash_size,
4656 : m_req_secret_buffer, m_req_secret_buffer,
4657 : sizeof(m_req_secret_buffer));
4658 : /*response side *not* updated*/
4659 :
4660 17 : status = libspdm_key_update( spdm_context, session_id, true);
4661 :
4662 17 : LIBSPDM_ASSERT_INT_EQUAL_CASE (status, LIBSPDM_STATUS_ERROR_PEER, error_code);
4663 17 : assert_memory_equal(((libspdm_secured_message_context_t
4664 : *)(session_info->secured_message_context))
4665 : ->application_secret.request_data_secret,
4666 : m_req_secret_buffer, ((libspdm_secured_message_context_t
4667 : *)(session_info->secured_message_context))->hash_size);
4668 17 : assert_memory_equal(((libspdm_secured_message_context_t
4669 : *)(session_info->secured_message_context))
4670 : ->application_secret.response_data_secret,
4671 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t
4672 : *)(session_info->secured_message_context))->hash_size);
4673 :
4674 17 : error_code++;
4675 : /*busy is treated in cases 5 and 6*/
4676 17 : if(error_code == SPDM_ERROR_CODE_BUSY) {
4677 1 : error_code = SPDM_ERROR_CODE_UNEXPECTED_REQUEST;
4678 : }
4679 : /*skip some reserved error codes (0d to 3e)*/
4680 17 : if(error_code == LIBSPDM_ERROR_CODE_RESERVED_0D) {
4681 1 : error_code = LIBSPDM_ERROR_CODE_RESERVED_3F;
4682 : }
4683 : /*skip response not ready, request resync, and some reserved codes (44 to fc)*/
4684 17 : if(error_code == SPDM_ERROR_CODE_RESPONSE_NOT_READY) {
4685 1 : error_code = LIBSPDM_ERROR_CODE_RESERVED_FD;
4686 : }
4687 : }
4688 1 : }
4689 :
4690 : /**
4691 : * Test 24: receiving an incorrect KEY_UPDATE_ACK message, with wrong
4692 : * response code, but all other field correct, when verifying key.
4693 : * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, the
4694 : * request data key is not rollbacked.
4695 : **/
4696 1 : static void req_key_update_case24(void **state)
4697 : {
4698 : libspdm_return_t status;
4699 : libspdm_test_context_t *spdm_test_context;
4700 : libspdm_context_t *spdm_context;
4701 : uint32_t session_id;
4702 : libspdm_session_info_t *session_info;
4703 :
4704 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4705 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4706 :
4707 1 : spdm_test_context = *state;
4708 1 : spdm_context = spdm_test_context->spdm_context;
4709 1 : spdm_test_context->case_id = 0x18;
4710 :
4711 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
4712 : SPDM_VERSION_NUMBER_SHIFT_BIT;
4713 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
4714 :
4715 1 : session_info = &spdm_context->session_info[0];
4716 :
4717 1 : libspdm_set_standard_key_update_test_secrets(
4718 1 : session_info->secured_message_context,
4719 : m_rsp_secret_buffer, (uint8_t)(0xFF),
4720 : m_req_secret_buffer, (uint8_t)(0xEE));
4721 :
4722 : /*request side updated*/
4723 1 : libspdm_compute_secret_update(spdm_context->connection_info.version,
4724 : ((libspdm_secured_message_context_t
4725 1 : *)(session_info->secured_message_context))->hash_size,
4726 : m_req_secret_buffer, m_req_secret_buffer,
4727 : sizeof(m_req_secret_buffer));
4728 : /*response side *not* updated*/
4729 :
4730 1 : status = libspdm_key_update( spdm_context, session_id, true);
4731 :
4732 1 : assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
4733 1 : assert_memory_equal(((libspdm_secured_message_context_t
4734 : *)(session_info->secured_message_context))
4735 : ->application_secret.request_data_secret,
4736 : m_req_secret_buffer, ((libspdm_secured_message_context_t
4737 : *)(session_info->secured_message_context))->hash_size);
4738 1 : assert_memory_equal(((libspdm_secured_message_context_t
4739 : *)(session_info->secured_message_context))
4740 : ->application_secret.response_data_secret,
4741 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t
4742 : *)(session_info->secured_message_context))->hash_size);
4743 1 : }
4744 :
4745 : /**
4746 : * Test 25: the requester is setup correctly (see Test 2), and receives a
4747 : * correct KEY_UPDATE_ACK to update key. However, it receives a
4748 : * KEY_UPDATE_ACK response with the wrong token to verify the key.
4749 : * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, the
4750 : * request data key is not rollbacked.
4751 : **/
4752 1 : static void req_key_update_case25(void **state)
4753 : {
4754 : libspdm_return_t status;
4755 : libspdm_test_context_t *spdm_test_context;
4756 : libspdm_context_t *spdm_context;
4757 : uint32_t session_id;
4758 : libspdm_session_info_t *session_info;
4759 :
4760 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4761 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4762 :
4763 1 : spdm_test_context = *state;
4764 1 : spdm_context = spdm_test_context->spdm_context;
4765 1 : spdm_test_context->case_id = 0x19;
4766 :
4767 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
4768 : SPDM_VERSION_NUMBER_SHIFT_BIT;
4769 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
4770 :
4771 1 : session_info = &spdm_context->session_info[0];
4772 :
4773 1 : libspdm_set_standard_key_update_test_secrets(
4774 1 : session_info->secured_message_context,
4775 : m_rsp_secret_buffer, (uint8_t)(0xFF),
4776 : m_req_secret_buffer, (uint8_t)(0xEE));
4777 :
4778 : /*request side updated*/
4779 1 : libspdm_compute_secret_update(spdm_context->connection_info.version,
4780 : ((libspdm_secured_message_context_t
4781 1 : *)(session_info->secured_message_context))->hash_size,
4782 : m_req_secret_buffer, m_req_secret_buffer,
4783 : sizeof(m_req_secret_buffer));
4784 : /*response side *not* updated*/
4785 :
4786 1 : status = libspdm_key_update( spdm_context, session_id, true);
4787 :
4788 1 : assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
4789 1 : assert_memory_equal(((libspdm_secured_message_context_t
4790 : *)(session_info->secured_message_context))
4791 : ->application_secret.request_data_secret,
4792 : m_req_secret_buffer, ((libspdm_secured_message_context_t
4793 : *)(session_info->secured_message_context))->hash_size);
4794 1 : assert_memory_equal(((libspdm_secured_message_context_t
4795 : *)(session_info->secured_message_context))
4796 : ->application_secret.response_data_secret,
4797 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t
4798 : *)(session_info->secured_message_context))->hash_size);
4799 1 : }
4800 :
4801 : /**
4802 : * Test 26: the requester is setup correctly (see Test 2) and receives a
4803 : * correct KEY_UPDATE_ACK to update key. However, it receives a
4804 : * KEY_UPDATE_ACK response with the wrong operation code to verify the key.
4805 : * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, the
4806 : * request data key is not rollbacked.
4807 : **/
4808 1 : static void req_key_update_case26(void **state)
4809 : {
4810 : libspdm_return_t status;
4811 : libspdm_test_context_t *spdm_test_context;
4812 : libspdm_context_t *spdm_context;
4813 : uint32_t session_id;
4814 : libspdm_session_info_t *session_info;
4815 :
4816 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4817 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4818 :
4819 1 : spdm_test_context = *state;
4820 1 : spdm_context = spdm_test_context->spdm_context;
4821 1 : spdm_test_context->case_id = 0x1A;
4822 :
4823 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
4824 : SPDM_VERSION_NUMBER_SHIFT_BIT;
4825 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
4826 :
4827 1 : session_info = &spdm_context->session_info[0];
4828 :
4829 1 : libspdm_set_standard_key_update_test_secrets(
4830 1 : session_info->secured_message_context,
4831 : m_rsp_secret_buffer, (uint8_t)(0xFF),
4832 : m_req_secret_buffer, (uint8_t)(0xEE));
4833 :
4834 : /*request side updated*/
4835 1 : libspdm_compute_secret_update(spdm_context->connection_info.version,
4836 : ((libspdm_secured_message_context_t
4837 1 : *)(session_info->secured_message_context))->hash_size,
4838 : m_req_secret_buffer, m_req_secret_buffer,
4839 : sizeof(m_req_secret_buffer));
4840 : /*response side *not* updated*/
4841 :
4842 1 : status = libspdm_key_update( spdm_context, session_id, true);
4843 :
4844 1 : assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
4845 1 : assert_memory_equal(((libspdm_secured_message_context_t
4846 : *)(session_info->secured_message_context))
4847 : ->application_secret.request_data_secret,
4848 : m_req_secret_buffer, ((libspdm_secured_message_context_t
4849 : *)(session_info->secured_message_context))->hash_size);
4850 1 : assert_memory_equal(((libspdm_secured_message_context_t
4851 : *)(session_info->secured_message_context))
4852 : ->application_secret.response_data_secret,
4853 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t
4854 : *)(session_info->secured_message_context))->hash_size);
4855 1 : }
4856 :
4857 : /**
4858 : * Test 27: receiving a correct UPDATE_KEY_ACK message for updating
4859 : * both the request data key and the response data key.
4860 : * Expected behavior: client returns a Status of LIBSPDM_STATUS_SUCCESS, and
4861 : * the request data key and response data key are updated.
4862 : **/
4863 1 : static void req_key_update_case27(void **state)
4864 : {
4865 : libspdm_return_t status;
4866 : libspdm_test_context_t *spdm_test_context;
4867 : libspdm_context_t *spdm_context;
4868 : uint32_t session_id;
4869 : libspdm_session_info_t *session_info;
4870 :
4871 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4872 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4873 :
4874 1 : spdm_test_context = *state;
4875 1 : spdm_context = spdm_test_context->spdm_context;
4876 1 : spdm_test_context->case_id = 0x1B;
4877 :
4878 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
4879 : SPDM_VERSION_NUMBER_SHIFT_BIT;
4880 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
4881 :
4882 1 : session_info = &spdm_context->session_info[0];
4883 :
4884 1 : libspdm_set_standard_key_update_test_secrets(
4885 1 : session_info->secured_message_context,
4886 : m_rsp_secret_buffer, (uint8_t)(0xFF),
4887 : m_req_secret_buffer, (uint8_t)(0xEE));
4888 :
4889 : /*request side updated*/
4890 1 : libspdm_compute_secret_update(spdm_context->connection_info.version,
4891 : ((libspdm_secured_message_context_t
4892 1 : *)(session_info->secured_message_context))->hash_size,
4893 : m_req_secret_buffer, m_req_secret_buffer,
4894 : sizeof(m_req_secret_buffer));
4895 : /*response side updated*/
4896 1 : libspdm_compute_secret_update(spdm_context->connection_info.version,
4897 : ((libspdm_secured_message_context_t
4898 1 : *)(session_info->secured_message_context))->hash_size,
4899 : m_rsp_secret_buffer, m_rsp_secret_buffer,
4900 : sizeof(m_rsp_secret_buffer));
4901 :
4902 1 : status = libspdm_key_update( spdm_context, session_id, false);
4903 :
4904 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
4905 1 : assert_memory_equal(((libspdm_secured_message_context_t
4906 : *)(session_info->secured_message_context))
4907 : ->application_secret.request_data_secret,
4908 : m_req_secret_buffer, ((libspdm_secured_message_context_t
4909 : *)(session_info->secured_message_context))->hash_size);
4910 1 : assert_memory_equal(((libspdm_secured_message_context_t
4911 : *)(session_info->secured_message_context))
4912 : ->application_secret.response_data_secret,
4913 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t
4914 : *)(session_info->secured_message_context))->hash_size);
4915 1 : }
4916 :
4917 : /**
4918 : * Test 28: the requester is setup correctly (see Test 27), but receives an
4919 : * ERROR message indicating InvalidParameters when updating all keys.
4920 : * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, and
4921 : * no keys should be updated.
4922 : **/
4923 1 : static void req_key_update_case28(void **state)
4924 : {
4925 : libspdm_return_t status;
4926 : libspdm_test_context_t *spdm_test_context;
4927 : libspdm_context_t *spdm_context;
4928 : uint32_t session_id;
4929 : libspdm_session_info_t *session_info;
4930 :
4931 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4932 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4933 :
4934 : libspdm_secured_message_context_t *secured_message_context;
4935 :
4936 1 : spdm_test_context = *state;
4937 1 : spdm_context = spdm_test_context->spdm_context;
4938 1 : spdm_test_context->case_id = 0x1C;
4939 :
4940 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
4941 : SPDM_VERSION_NUMBER_SHIFT_BIT;
4942 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
4943 :
4944 1 : session_info = &spdm_context->session_info[0];
4945 1 : secured_message_context = session_info->secured_message_context;
4946 :
4947 1 : libspdm_set_standard_key_update_test_secrets(
4948 1 : session_info->secured_message_context,
4949 : m_rsp_secret_buffer, (uint8_t)(0xFF),
4950 : m_req_secret_buffer, (uint8_t)(0xEE));
4951 :
4952 : /*store previous encryption state*/
4953 1 : libspdm_copy_mem(m_libspdm_last_rsp_enc_key, sizeof(m_libspdm_last_rsp_enc_key),
4954 : secured_message_context
4955 1 : ->application_secret.response_data_encryption_key,
4956 : secured_message_context->aead_key_size);
4957 1 : libspdm_copy_mem(m_libspdm_last_rsp_salt, sizeof(m_libspdm_last_rsp_salt),
4958 : secured_message_context
4959 1 : ->application_secret.response_data_salt,
4960 : secured_message_context->aead_iv_size);
4961 1 : m_libspdm_last_rsp_sequence_number = secured_message_context
4962 1 : ->application_secret.response_data_sequence_number;
4963 :
4964 : /*no keys are updated*/
4965 :
4966 1 : status = libspdm_key_update( spdm_context, session_id, false);
4967 :
4968 1 : assert_int_equal(status, LIBSPDM_STATUS_ERROR_PEER);
4969 1 : assert_memory_equal(((libspdm_secured_message_context_t
4970 : *)(session_info->secured_message_context))
4971 : ->application_secret.request_data_secret,
4972 : m_req_secret_buffer, ((libspdm_secured_message_context_t
4973 : *)(session_info->secured_message_context))->hash_size);
4974 1 : assert_memory_equal(((libspdm_secured_message_context_t
4975 : *)(session_info->secured_message_context))
4976 : ->application_secret.response_data_secret,
4977 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t
4978 : *)(session_info->secured_message_context))->hash_size);
4979 1 : }
4980 :
4981 : /**
4982 : * Test 29: the requester is setup correctly (see Test 27), but receives an
4983 : * ERROR message indicating the Busy status of the responder, when updating
4984 : * all keys.
4985 : * Expected behavior: client returns a Status of RETURN_NO_RESPONSE, and
4986 : * no keys should be updated.
4987 : **/
4988 1 : static void req_key_update_case29(void **state)
4989 : {
4990 : libspdm_return_t status;
4991 : libspdm_test_context_t *spdm_test_context;
4992 : libspdm_context_t *spdm_context;
4993 : uint32_t session_id;
4994 : libspdm_session_info_t *session_info;
4995 :
4996 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4997 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
4998 :
4999 : libspdm_secured_message_context_t *secured_message_context;
5000 :
5001 1 : spdm_test_context = *state;
5002 1 : spdm_context = spdm_test_context->spdm_context;
5003 1 : spdm_test_context->case_id = 0x1D;
5004 :
5005 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
5006 : SPDM_VERSION_NUMBER_SHIFT_BIT;
5007 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
5008 :
5009 1 : session_info = &spdm_context->session_info[0];
5010 1 : secured_message_context = session_info->secured_message_context;
5011 :
5012 1 : libspdm_set_standard_key_update_test_secrets(
5013 1 : session_info->secured_message_context,
5014 : m_rsp_secret_buffer, (uint8_t)(0xFF),
5015 : m_req_secret_buffer, (uint8_t)(0xEE));
5016 :
5017 : /*store previous encryption state*/
5018 1 : libspdm_copy_mem(m_libspdm_last_rsp_enc_key, sizeof(m_libspdm_last_rsp_enc_key),
5019 : secured_message_context
5020 1 : ->application_secret.response_data_encryption_key,
5021 : secured_message_context->aead_key_size);
5022 1 : libspdm_copy_mem(m_libspdm_last_rsp_salt, sizeof(m_libspdm_last_rsp_salt),
5023 : secured_message_context
5024 1 : ->application_secret.response_data_salt,
5025 : secured_message_context->aead_iv_size);
5026 1 : m_libspdm_last_rsp_sequence_number = secured_message_context
5027 1 : ->application_secret.response_data_sequence_number;
5028 :
5029 : /*no keys are updated*/
5030 :
5031 1 : status = libspdm_key_update( spdm_context, session_id, false);
5032 :
5033 1 : assert_int_equal(status, LIBSPDM_STATUS_BUSY_PEER);
5034 1 : assert_memory_equal(((libspdm_secured_message_context_t
5035 : *)(session_info->secured_message_context))
5036 : ->application_secret.request_data_secret,
5037 : m_req_secret_buffer, ((libspdm_secured_message_context_t
5038 : *)(session_info->secured_message_context))->hash_size);
5039 1 : assert_memory_equal(((libspdm_secured_message_context_t
5040 : *)(session_info->secured_message_context))
5041 : ->application_secret.response_data_secret,
5042 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t
5043 : *)(session_info->secured_message_context))->hash_size);
5044 1 : }
5045 :
5046 : /**
5047 : * Test 30: the requester is setup correctly (see Test 27), but, when updating
5048 : * all keys, on the first try, receiving a Busy ERROR message, and on retry,
5049 : * receiving a correct KEY_UPDATE_ACK message. The VERIFY_KEY behavior is
5050 : * not altered.
5051 : * Expected behavior: client returns a Status of LIBSPDM_STATUS_SUCCESS, and
5052 : * the request data key and response data key are updated.
5053 : **/
5054 1 : static void req_key_update_case30(void **state)
5055 : {
5056 : libspdm_return_t status;
5057 : libspdm_test_context_t *spdm_test_context;
5058 : libspdm_context_t *spdm_context;
5059 : uint32_t session_id;
5060 : libspdm_session_info_t *session_info;
5061 :
5062 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
5063 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
5064 :
5065 : libspdm_secured_message_context_t *secured_message_context;
5066 :
5067 1 : spdm_test_context = *state;
5068 1 : spdm_context = spdm_test_context->spdm_context;
5069 1 : spdm_test_context->case_id = 0x1E;
5070 :
5071 1 : spdm_context->retry_times = 3;
5072 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
5073 : SPDM_VERSION_NUMBER_SHIFT_BIT;
5074 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
5075 :
5076 1 : session_info = &spdm_context->session_info[0];
5077 1 : secured_message_context = session_info->secured_message_context;
5078 :
5079 1 : libspdm_set_standard_key_update_test_secrets(
5080 1 : session_info->secured_message_context,
5081 : m_rsp_secret_buffer, (uint8_t)(0xFF),
5082 : m_req_secret_buffer, (uint8_t)(0xEE));
5083 :
5084 : /*store previous encryption state*/
5085 1 : libspdm_copy_mem(m_libspdm_last_rsp_enc_key, sizeof(m_libspdm_last_rsp_enc_key),
5086 : secured_message_context
5087 1 : ->application_secret.response_data_encryption_key,
5088 : secured_message_context->aead_key_size);
5089 1 : libspdm_copy_mem(m_libspdm_last_rsp_salt, sizeof(m_libspdm_last_rsp_salt),
5090 : secured_message_context
5091 1 : ->application_secret.response_data_salt,
5092 : secured_message_context->aead_iv_size);
5093 1 : m_libspdm_last_rsp_sequence_number = secured_message_context
5094 1 : ->application_secret.response_data_sequence_number;
5095 :
5096 : /*request side updated*/
5097 1 : libspdm_compute_secret_update(spdm_context->connection_info.version,
5098 : ((libspdm_secured_message_context_t
5099 1 : *)(session_info->secured_message_context))->hash_size,
5100 : m_req_secret_buffer, m_req_secret_buffer,
5101 : sizeof(m_req_secret_buffer));
5102 : /*response side updated*/
5103 1 : libspdm_compute_secret_update(spdm_context->connection_info.version,
5104 : ((libspdm_secured_message_context_t
5105 1 : *)(session_info->secured_message_context))->hash_size,
5106 : m_rsp_secret_buffer, m_rsp_secret_buffer,
5107 : sizeof(m_rsp_secret_buffer));
5108 :
5109 1 : status = libspdm_key_update( spdm_context, session_id, false);
5110 :
5111 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
5112 1 : assert_memory_equal(((libspdm_secured_message_context_t
5113 : *)(session_info->secured_message_context))
5114 : ->application_secret.request_data_secret,
5115 : m_req_secret_buffer, ((libspdm_secured_message_context_t
5116 : *)(session_info->secured_message_context))->hash_size);
5117 1 : assert_memory_equal(((libspdm_secured_message_context_t
5118 : *)(session_info->secured_message_context))
5119 : ->application_secret.response_data_secret,
5120 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t
5121 : *)(session_info->secured_message_context))->hash_size);
5122 1 : }
5123 :
5124 : /**
5125 : * Test 31: the requester is setup correctly (see Test 27), but receives an
5126 : * ERROR message indicating the RequestResynch status of the responder, when
5127 : * updating all keys.
5128 : * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, and the
5129 : * communication is reset to expect a new GET_VERSION message.
5130 : **/
5131 1 : static void req_key_update_case31(void **state)
5132 : {
5133 : libspdm_return_t status;
5134 : libspdm_test_context_t *spdm_test_context;
5135 : libspdm_context_t *spdm_context;
5136 : uint32_t session_id;
5137 : libspdm_session_info_t *session_info;
5138 :
5139 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
5140 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
5141 :
5142 : libspdm_secured_message_context_t *secured_message_context;
5143 :
5144 1 : spdm_test_context = *state;
5145 1 : spdm_context = spdm_test_context->spdm_context;
5146 1 : spdm_test_context->case_id = 0x1F;
5147 :
5148 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
5149 : SPDM_VERSION_NUMBER_SHIFT_BIT;
5150 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
5151 :
5152 1 : session_info = &spdm_context->session_info[0];
5153 1 : secured_message_context = session_info->secured_message_context;
5154 :
5155 1 : libspdm_set_standard_key_update_test_secrets(
5156 1 : session_info->secured_message_context,
5157 : m_rsp_secret_buffer, (uint8_t)(0xFF),
5158 : m_req_secret_buffer, (uint8_t)(0xEE));
5159 :
5160 : /*store previous encryption state*/
5161 1 : libspdm_copy_mem(m_libspdm_last_rsp_enc_key, sizeof(m_libspdm_last_rsp_enc_key),
5162 : secured_message_context
5163 1 : ->application_secret.response_data_encryption_key,
5164 : secured_message_context->aead_key_size);
5165 1 : libspdm_copy_mem(m_libspdm_last_rsp_salt, sizeof(m_libspdm_last_rsp_salt),
5166 : secured_message_context
5167 1 : ->application_secret.response_data_salt,
5168 : secured_message_context->aead_iv_size);
5169 1 : m_libspdm_last_rsp_sequence_number = secured_message_context
5170 1 : ->application_secret.response_data_sequence_number;
5171 :
5172 1 : status = libspdm_key_update( spdm_context, session_id, false);
5173 :
5174 1 : assert_int_equal(status, LIBSPDM_STATUS_RESYNCH_PEER);
5175 1 : assert_int_equal(spdm_context->connection_info.connection_state,
5176 : LIBSPDM_CONNECTION_STATE_NOT_STARTED);
5177 1 : }
5178 :
5179 : /**
5180 : * Test 32: the requester is setup correctly (see Test 27), but receives an
5181 : * ERROR message indicating the ResponseNotReady status of the responder, when
5182 : * updating all keys.
5183 : * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, and
5184 : * no keys should be updated.
5185 : **/
5186 1 : static void req_key_update_case32(void **state)
5187 : {
5188 : libspdm_return_t status;
5189 : libspdm_test_context_t *spdm_test_context;
5190 : libspdm_context_t *spdm_context;
5191 : uint32_t session_id;
5192 : libspdm_session_info_t *session_info;
5193 :
5194 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
5195 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
5196 :
5197 : libspdm_secured_message_context_t *secured_message_context;
5198 :
5199 1 : spdm_test_context = *state;
5200 1 : spdm_context = spdm_test_context->spdm_context;
5201 1 : spdm_test_context->case_id = 0x20;
5202 :
5203 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
5204 : SPDM_VERSION_NUMBER_SHIFT_BIT;
5205 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
5206 :
5207 1 : session_info = &spdm_context->session_info[0];
5208 1 : secured_message_context = session_info->secured_message_context;
5209 :
5210 1 : libspdm_set_standard_key_update_test_secrets(
5211 1 : session_info->secured_message_context,
5212 : m_rsp_secret_buffer, (uint8_t)(0xFF),
5213 : m_req_secret_buffer, (uint8_t)(0xEE));
5214 :
5215 : /*store previous encryption state*/
5216 1 : libspdm_copy_mem(m_libspdm_last_rsp_enc_key, sizeof(m_libspdm_last_rsp_enc_key),
5217 : secured_message_context
5218 1 : ->application_secret.response_data_encryption_key,
5219 : secured_message_context->aead_key_size);
5220 1 : libspdm_copy_mem(m_libspdm_last_rsp_salt, sizeof(m_libspdm_last_rsp_salt),
5221 : secured_message_context
5222 1 : ->application_secret.response_data_salt,
5223 : secured_message_context->aead_iv_size);
5224 1 : m_libspdm_last_rsp_sequence_number = secured_message_context
5225 1 : ->application_secret.response_data_sequence_number;
5226 :
5227 : /*no keys are updated*/
5228 :
5229 1 : status = libspdm_key_update( spdm_context, session_id, false);
5230 :
5231 1 : assert_int_equal(status, LIBSPDM_STATUS_NOT_READY_PEER);
5232 1 : assert_memory_equal(((libspdm_secured_message_context_t
5233 : *)(session_info->secured_message_context))
5234 : ->application_secret.request_data_secret,
5235 : m_req_secret_buffer, ((libspdm_secured_message_context_t
5236 : *)(session_info->secured_message_context))->hash_size);
5237 1 : assert_memory_equal(((libspdm_secured_message_context_t
5238 : *)(session_info->secured_message_context))
5239 : ->application_secret.response_data_secret,
5240 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t
5241 : *)(session_info->secured_message_context))->hash_size);
5242 1 : }
5243 :
5244 : /**
5245 : * Test 33: the requester is setup correctly (see Test 27), but, when updating
5246 : * all keys, on the first try, receiving a ResponseNotReady ERROR message, and
5247 : * on retry, receiving a correct KEY_UPDATE_ACK message. The VERIFY_KEY
5248 : * behavior is not altered.
5249 : * Expected behavior: client returns a Status of LIBSPDM_STATUS_SUCCESS, and
5250 : * the request data key and response data key are updated.
5251 : **/
5252 1 : static void req_key_update_case33(void **state)
5253 : {
5254 : libspdm_return_t status;
5255 : libspdm_test_context_t *spdm_test_context;
5256 : libspdm_context_t *spdm_context;
5257 : uint32_t session_id;
5258 : libspdm_session_info_t *session_info;
5259 :
5260 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
5261 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
5262 :
5263 : libspdm_secured_message_context_t *secured_message_context;
5264 :
5265 1 : spdm_test_context = *state;
5266 1 : spdm_context = spdm_test_context->spdm_context;
5267 1 : spdm_test_context->case_id = 0x21;
5268 :
5269 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
5270 : SPDM_VERSION_NUMBER_SHIFT_BIT;
5271 1 : libspdm_set_standard_key_update_test_state(spdm_context, &session_id);
5272 :
5273 1 : session_info = &spdm_context->session_info[0];
5274 1 : secured_message_context = session_info->secured_message_context;
5275 :
5276 1 : libspdm_set_standard_key_update_test_secrets(
5277 1 : session_info->secured_message_context,
5278 : m_rsp_secret_buffer, (uint8_t)(0xFF),
5279 : m_req_secret_buffer, (uint8_t)(0xEE));
5280 :
5281 : /*store previous encryption state*/
5282 1 : libspdm_copy_mem(m_libspdm_last_rsp_enc_key, sizeof(m_libspdm_last_rsp_enc_key),
5283 : secured_message_context
5284 1 : ->application_secret.response_data_encryption_key,
5285 : secured_message_context->aead_key_size);
5286 1 : libspdm_copy_mem(m_libspdm_last_rsp_salt, sizeof(m_libspdm_last_rsp_salt),
5287 : secured_message_context
5288 1 : ->application_secret.response_data_salt,
5289 : secured_message_context->aead_iv_size);
5290 1 : m_libspdm_last_rsp_sequence_number = secured_message_context
5291 1 : ->application_secret.response_data_sequence_number;
5292 :
5293 : /*request side updated*/
5294 1 : libspdm_compute_secret_update(spdm_context->connection_info.version,
5295 : ((libspdm_secured_message_context_t
5296 1 : *)(session_info->secured_message_context))->hash_size,
5297 : m_req_secret_buffer, m_req_secret_buffer,
5298 : sizeof(m_req_secret_buffer));
5299 : /*response side updated*/
5300 1 : libspdm_compute_secret_update(spdm_context->connection_info.version,
5301 : ((libspdm_secured_message_context_t
5302 1 : *)(session_info->secured_message_context))->hash_size,
5303 : m_rsp_secret_buffer, m_rsp_secret_buffer,
5304 : sizeof(m_rsp_secret_buffer));
5305 :
5306 1 : status = libspdm_key_update(spdm_context, session_id, false);
5307 :
5308 : if (LIBSPDM_RESPOND_IF_READY_SUPPORT) {
5309 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
5310 1 : assert_memory_equal(((libspdm_secured_message_context_t
5311 : *)(session_info->secured_message_context))
5312 : ->application_secret.request_data_secret,
5313 : m_req_secret_buffer, ((libspdm_secured_message_context_t
5314 : *)(session_info->secured_message_context))->hash_size);
5315 1 : assert_memory_equal(((libspdm_secured_message_context_t
5316 : *)(session_info->secured_message_context))
5317 : ->application_secret.response_data_secret,
5318 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t
5319 : *)(session_info->secured_message_context))->hash_size);
5320 : } else {
5321 : assert_int_equal(status, LIBSPDM_STATUS_NOT_READY_PEER);
5322 : }
5323 1 : }
5324 :
5325 : /**
5326 : * Test 34: receiving an unexpected ERROR message from the responder,
5327 : * when updating all keys.
5328 : * There are tests for all named codes, including some reserved ones
5329 : * (namely, 0x00, 0x0b, 0x0c, 0x3f, 0xfd, 0xfe).
5330 : * However, for having specific test cases, it is excluded from this case:
5331 : * Busy (0x03), ResponseNotReady (0x42), and RequestResync (0x43).
5332 : * Expected behavior: client returns a status of RETURN_DEVICE_ERROR, and
5333 : * no keys should be updated.
5334 : **/
5335 1 : static void req_key_update_case34(void **state)
5336 : {
5337 : libspdm_return_t status;
5338 : libspdm_test_context_t *spdm_test_context;
5339 : libspdm_context_t *spdm_context;
5340 : uint32_t session_id;
5341 : libspdm_session_info_t *session_info;
5342 : uint16_t error_code;
5343 :
5344 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
5345 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
5346 :
5347 : libspdm_secured_message_context_t *secured_message_context;
5348 :
5349 1 : spdm_test_context = *state;
5350 1 : spdm_context = spdm_test_context->spdm_context;
5351 1 : spdm_test_context->case_id = 0x22;
5352 :
5353 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
5354 : SPDM_VERSION_NUMBER_SHIFT_BIT;
5355 1 : libspdm_set_standard_key_update_test_state( spdm_context, &session_id);
5356 :
5357 1 : session_info = &spdm_context->session_info[0];
5358 1 : secured_message_context = session_info->secured_message_context;
5359 :
5360 1 : error_code = LIBSPDM_ERROR_CODE_RESERVED_00;
5361 18 : while(error_code <= 0xff) {
5362 : /* skip SPDM_ERROR_CODE_DECRYPT_ERROR, because this case will free context*/
5363 17 : if(error_code == SPDM_ERROR_CODE_DECRYPT_ERROR) {
5364 1 : error_code++;
5365 : }
5366 17 : libspdm_set_standard_key_update_test_secrets(
5367 17 : session_info->secured_message_context,
5368 : m_rsp_secret_buffer, (uint8_t)(0xFF),
5369 : m_req_secret_buffer, (uint8_t)(0xEE));
5370 :
5371 : /*store previous encryption state*/
5372 17 : libspdm_copy_mem(m_libspdm_last_rsp_enc_key, sizeof(m_libspdm_last_rsp_enc_key),
5373 : secured_message_context
5374 17 : ->application_secret.response_data_encryption_key,
5375 : secured_message_context->aead_key_size);
5376 17 : libspdm_copy_mem(m_libspdm_last_rsp_salt, sizeof(m_libspdm_last_rsp_salt),
5377 : secured_message_context
5378 17 : ->application_secret.response_data_salt,
5379 : secured_message_context->aead_iv_size);
5380 17 : m_libspdm_last_rsp_sequence_number = secured_message_context
5381 17 : ->application_secret.response_data_sequence_number;
5382 :
5383 : /*no keys are updated*/
5384 :
5385 17 : status = libspdm_key_update( spdm_context, session_id, false);
5386 :
5387 17 : LIBSPDM_ASSERT_INT_EQUAL_CASE (status, LIBSPDM_STATUS_ERROR_PEER, error_code);
5388 17 : assert_memory_equal(((libspdm_secured_message_context_t
5389 : *)(session_info->secured_message_context))
5390 : ->application_secret.request_data_secret,
5391 : m_req_secret_buffer, ((libspdm_secured_message_context_t
5392 : *)(session_info->secured_message_context))->hash_size);
5393 17 : assert_memory_equal(((libspdm_secured_message_context_t
5394 : *)(session_info->secured_message_context))
5395 : ->application_secret.response_data_secret,
5396 : m_rsp_secret_buffer, ((libspdm_secured_message_context_t
5397 : *)(session_info->secured_message_context))->hash_size);
5398 :
5399 17 : error_code++;
5400 : /*busy is treated in cases 5 and 6*/
5401 17 : if(error_code == SPDM_ERROR_CODE_BUSY) {
5402 1 : error_code = SPDM_ERROR_CODE_UNEXPECTED_REQUEST;
5403 : }
5404 : /*skip some reserved error codes (0d to 3e)*/
5405 17 : if(error_code == LIBSPDM_ERROR_CODE_RESERVED_0D) {
5406 1 : error_code = LIBSPDM_ERROR_CODE_RESERVED_3F;
5407 : }
5408 : /*skip response not ready, request resync, and some reserved codes (44 to fc)*/
5409 17 : if(error_code == SPDM_ERROR_CODE_RESPONSE_NOT_READY) {
5410 1 : error_code = LIBSPDM_ERROR_CODE_RESERVED_FD;
5411 : }
5412 : }
5413 1 : }
5414 :
5415 : /**
5416 : * Test 35: the requester is setup correctly, but receives an ERROR with SPDM_ERROR_CODE_DECRYPT_ERROR.
5417 : * Expected behavior: client returns a Status of INVALID_SESSION_ID and free the session ID.
5418 : **/
5419 1 : static void req_key_update_case35(void **state)
5420 : {
5421 : libspdm_return_t status;
5422 : libspdm_test_context_t *spdm_test_context;
5423 : libspdm_context_t *spdm_context;
5424 : uint32_t session_id;
5425 : libspdm_session_info_t *session_info;
5426 :
5427 : uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
5428 : uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
5429 :
5430 1 : spdm_test_context = *state;
5431 1 : spdm_context = spdm_test_context->spdm_context;
5432 1 : spdm_test_context->case_id = 0x23;
5433 :
5434 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
5435 : SPDM_VERSION_NUMBER_SHIFT_BIT;
5436 1 : libspdm_set_standard_key_update_test_state(spdm_context, &session_id);
5437 :
5438 1 : session_info = &spdm_context->session_info[0];
5439 :
5440 1 : libspdm_set_standard_key_update_test_secrets(
5441 1 : session_info->secured_message_context,
5442 : m_rsp_secret_buffer, (uint8_t)(0xFF),
5443 : m_req_secret_buffer, (uint8_t)(0xEE));
5444 :
5445 : /*no keys are updated*/
5446 :
5447 1 : status = libspdm_key_update(spdm_context, session_id, true);
5448 :
5449 1 : assert_int_equal(status, LIBSPDM_STATUS_SESSION_MSG_ERROR);
5450 1 : assert_int_equal(spdm_context->session_info->session_id, INVALID_SESSION_ID);
5451 1 : }
5452 :
5453 1 : int libspdm_req_key_update_test(void)
5454 : {
5455 1 : const struct CMUnitTest test_cases[] = {
5456 : /* SendRequest failed*/
5457 : cmocka_unit_test(req_key_update_case1),
5458 : /* update single key
5459 : * Successful response*/
5460 : cmocka_unit_test(req_key_update_case2),
5461 : /* connection_state check failed*/
5462 : cmocka_unit_test(req_key_update_case3),
5463 : /* Error response: SPDM_ERROR_CODE_INVALID_REQUEST*/
5464 : cmocka_unit_test(req_key_update_case4),
5465 : /* Always SPDM_ERROR_CODE_BUSY*/
5466 : cmocka_unit_test(req_key_update_case5),
5467 : /* SPDM_ERROR_CODE_BUSY + Successful response*/
5468 : cmocka_unit_test(req_key_update_case6),
5469 : /* Error response: SPDM_ERROR_CODE_REQUEST_RESYNCH*/
5470 : cmocka_unit_test(req_key_update_case7),
5471 : /* Always SPDM_ERROR_CODE_RESPONSE_NOT_READY*/
5472 : cmocka_unit_test(req_key_update_case8),
5473 : /* SPDM_ERROR_CODE_RESPONSE_NOT_READY + Successful response*/
5474 : cmocka_unit_test(req_key_update_case9),
5475 : /* Unexpected errors*/
5476 : cmocka_unit_test(req_key_update_case10),
5477 : /* Buffer reset*/
5478 : cmocka_unit_test(req_key_update_case11),
5479 : /* No correct setup*/
5480 : cmocka_unit_test(req_key_update_case12),
5481 : cmocka_unit_test(req_key_update_case13),
5482 : cmocka_unit_test(req_key_update_case14),
5483 : /* Wrong parameters*/
5484 : cmocka_unit_test(req_key_update_case15),
5485 : cmocka_unit_test(req_key_update_case16),
5486 : /* verify key
5487 : * Error response: SPDM_ERROR_CODE_INVALID_REQUEST*/
5488 : cmocka_unit_test(req_key_update_case17),
5489 : /* Always SPDM_ERROR_CODE_BUSY*/
5490 : cmocka_unit_test(req_key_update_case18),
5491 : /* SPDM_ERROR_CODE_BUSY + Successful response*/
5492 : cmocka_unit_test(req_key_update_case19),
5493 : /* Error response: SPDM_ERROR_CODE_REQUEST_RESYNCH*/
5494 : cmocka_unit_test(req_key_update_case20),
5495 : /* Always SPDM_ERROR_CODE_RESPONSE_NOT_READY*/
5496 : cmocka_unit_test(req_key_update_case21),
5497 : /* SPDM_ERROR_CODE_RESPONSE_NOT_READY + Successful response*/
5498 : cmocka_unit_test(req_key_update_case22),
5499 : /* Unexpected errors*/
5500 : cmocka_unit_test(req_key_update_case23),
5501 : /* No correct setup*/
5502 : cmocka_unit_test(req_key_update_case24),
5503 : /* Wrong parameters*/
5504 : cmocka_unit_test(req_key_update_case25),
5505 : cmocka_unit_test(req_key_update_case26),
5506 : /* update all keys
5507 : * Successful response*/
5508 : cmocka_unit_test(req_key_update_case27),
5509 : /* Error response: SPDM_ERROR_CODE_INVALID_REQUEST*/
5510 : cmocka_unit_test(req_key_update_case28),
5511 : /* Always SPDM_ERROR_CODE_BUSY*/
5512 : cmocka_unit_test(req_key_update_case29),
5513 : /* SPDM_ERROR_CODE_BUSY + Successful response*/
5514 : cmocka_unit_test(req_key_update_case30),
5515 : /* Error response: SPDM_ERROR_CODE_REQUEST_RESYNCH*/
5516 : cmocka_unit_test(req_key_update_case31),
5517 : /* Always SPDM_ERROR_CODE_RESPONSE_NOT_READY*/
5518 : cmocka_unit_test(req_key_update_case32),
5519 : /* SPDM_ERROR_CODE_RESPONSE_NOT_READY + Successful response*/
5520 : cmocka_unit_test(req_key_update_case33),
5521 : /* Unexpected errors*/
5522 : cmocka_unit_test(req_key_update_case34),
5523 : /* Error response: SPDM_ERROR_CODE_DECRYPT_ERROR*/
5524 : cmocka_unit_test(req_key_update_case35),
5525 : };
5526 :
5527 1 : libspdm_test_context_t test_context = {
5528 : LIBSPDM_TEST_CONTEXT_VERSION,
5529 : true,
5530 : send_message,
5531 : receive_message,
5532 : };
5533 :
5534 1 : libspdm_setup_test_context(&test_context);
5535 :
5536 1 : return cmocka_run_group_tests(test_cases,
5537 : libspdm_unit_test_group_setup,
5538 : libspdm_unit_test_group_teardown);
5539 : }
5540 :
5541 : #endif /* (LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP) || (LIBSPDM_ENABLE_CAPABILITY_PSK_CAP) */
|