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