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