Line data Source code
1 : /**
2 : * Copyright Notice:
3 : * Copyright 2021-2025 DMTF. All rights reserved.
4 : * License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
5 : **/
6 :
7 : #include "spdm_unit_test.h"
8 : #include "internal/libspdm_responder_lib.h"
9 : #include "internal/libspdm_requester_lib.h"
10 : #include "internal/libspdm_secured_message_lib.h"
11 :
12 : #if LIBSPDM_RESPOND_IF_READY_SUPPORT
13 :
14 : #if (LIBSPDM_ENABLE_CAPABILITY_CERT_CAP || LIBSPDM_ENABLE_CAPABILITY_CHAL_CAP || \
15 : LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP || LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP || \
16 : LIBSPDM_ENABLE_CAPABILITY_PSK_CAP)
17 :
18 : #define LIBSPDM_MY_TEST_TOKEN 0x30
19 : #define LIBSPDM_MY_WRONG_TEST_TOKEN 0x2F
20 :
21 : static libspdm_th_managed_buffer_t th_curr;
22 :
23 : extern size_t libspdm_secret_lib_challenge_opaque_data_size;
24 :
25 : spdm_response_if_ready_request_t m_libspdm_respond_if_ready_request1 = {
26 : {
27 : SPDM_MESSAGE_VERSION_11,
28 : SPDM_RESPOND_IF_READY,
29 : SPDM_GET_DIGESTS,
30 : LIBSPDM_MY_TEST_TOKEN
31 : },
32 : };
33 : size_t m_libspdm_respond_if_ready_request1_size = sizeof(spdm_message_header_t);
34 :
35 : spdm_response_if_ready_request_t m_libspdm_respond_if_ready_request2 = {
36 : {
37 : SPDM_MESSAGE_VERSION_11,
38 : SPDM_RESPOND_IF_READY,
39 : SPDM_GET_CERTIFICATE,
40 : LIBSPDM_MY_TEST_TOKEN
41 : },
42 : };
43 : size_t m_libspdm_respond_if_ready_request2_size = sizeof(spdm_message_header_t);
44 :
45 : spdm_response_if_ready_request_t m_libspdm_respond_if_ready_request3 = {
46 : {
47 : SPDM_MESSAGE_VERSION_11,
48 : SPDM_RESPOND_IF_READY,
49 : SPDM_CHALLENGE,
50 : LIBSPDM_MY_TEST_TOKEN
51 : },
52 : };
53 : size_t m_libspdm_respond_if_ready_request3_size = sizeof(spdm_message_header_t);
54 :
55 : spdm_response_if_ready_request_t m_libspdm_respond_if_ready_request4 = {
56 : {
57 : SPDM_MESSAGE_VERSION_11,
58 : SPDM_RESPOND_IF_READY,
59 : SPDM_GET_MEASUREMENTS,
60 : LIBSPDM_MY_TEST_TOKEN
61 : },
62 : };
63 : size_t m_libspdm_respond_if_ready_request4_size = sizeof(spdm_message_header_t);
64 :
65 : spdm_response_if_ready_request_t m_libspdm_respond_if_ready_request5 = {
66 : {
67 : SPDM_MESSAGE_VERSION_11,
68 : SPDM_RESPOND_IF_READY,
69 : SPDM_KEY_EXCHANGE,
70 : LIBSPDM_MY_TEST_TOKEN
71 : },
72 : };
73 : size_t m_libspdm_respond_if_ready_request5_size = sizeof(spdm_message_header_t);
74 :
75 : spdm_response_if_ready_request_t m_libspdm_respond_if_ready_request6 = {
76 : {
77 : SPDM_MESSAGE_VERSION_11,
78 : SPDM_RESPOND_IF_READY,
79 : SPDM_FINISH,
80 : LIBSPDM_MY_TEST_TOKEN
81 : },
82 : };
83 : size_t m_libspdm_respond_if_ready_request6_size = sizeof(spdm_message_header_t);
84 :
85 : spdm_response_if_ready_request_t m_libspdm_respond_if_ready_request7 = {
86 : {
87 : SPDM_MESSAGE_VERSION_11,
88 : SPDM_RESPOND_IF_READY,
89 : SPDM_PSK_EXCHANGE,
90 : LIBSPDM_MY_TEST_TOKEN
91 : },
92 : };
93 : size_t m_libspdm_respond_if_ready_request7_size = sizeof(spdm_message_header_t);
94 :
95 : spdm_response_if_ready_request_t m_libspdm_respond_if_ready_request8 = {
96 : {
97 : SPDM_MESSAGE_VERSION_11,
98 : SPDM_RESPOND_IF_READY,
99 : SPDM_PSK_FINISH,
100 : LIBSPDM_MY_TEST_TOKEN
101 : },
102 : };
103 : size_t m_libspdm_respond_if_ready_request8_size = sizeof(spdm_message_header_t);
104 :
105 : spdm_response_if_ready_request_t m_libspdm_respond_if_ready_request10 = {
106 : {
107 : SPDM_MESSAGE_VERSION_11,
108 : SPDM_RESPOND_IF_READY,
109 : SPDM_GET_DIGESTS,
110 : LIBSPDM_MY_WRONG_TEST_TOKEN /*wrong token*/
111 : },
112 : };
113 : size_t m_libspdm_respond_if_ready_request10_size = sizeof(spdm_message_header_t);
114 :
115 : spdm_response_if_ready_request_t m_libspdm_respond_if_ready_request11 = {
116 : {
117 : SPDM_MESSAGE_VERSION_11,
118 : SPDM_RESPOND_IF_READY,
119 : SPDM_GET_CERTIFICATE, /*wrong original request code*/
120 : LIBSPDM_MY_TEST_TOKEN
121 : },
122 : };
123 : size_t m_libspdm_respond_if_ready_request11_size = sizeof(spdm_message_header_t);
124 :
125 : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
126 : spdm_get_digest_request_t m_libspdm_get_digest_request = {
127 : {
128 : SPDM_MESSAGE_VERSION_11,
129 : SPDM_GET_DIGESTS,
130 : 0,
131 : 0
132 : },
133 : };
134 : size_t m_libspdm_get_digest_request_size = sizeof(spdm_message_header_t);
135 :
136 : spdm_get_certificate_request_t m_libspdm_get_certificate_request = {
137 : {
138 : SPDM_MESSAGE_VERSION_11,
139 : SPDM_GET_CERTIFICATE,
140 : 0,
141 : 0
142 : },
143 : 0,
144 : LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN
145 : };
146 : size_t m_libspdm_get_certificate_request_size = sizeof(m_libspdm_get_certificate_request);
147 :
148 : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
149 :
150 : #if LIBSPDM_ENABLE_CAPABILITY_CHAL_CAP
151 :
152 : spdm_challenge_request_t m_libspdm_challenge_request = {
153 : {
154 : SPDM_MESSAGE_VERSION_11,
155 : SPDM_CHALLENGE,
156 : 0,
157 : SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH
158 : },
159 : };
160 : size_t m_libspdm_challenge_request_size = sizeof(m_libspdm_challenge_request);
161 :
162 : #endif /* LIBSPDM_ENABLE_CAPABILITY_CHAL_CAP*/
163 :
164 : #if LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP
165 : spdm_get_measurements_request_t m_libspdm_get_measurements_request = {
166 : {
167 : SPDM_MESSAGE_VERSION_11,
168 : SPDM_GET_MEASUREMENTS,
169 : 0,
170 : SPDM_GET_MEASUREMENTS_REQUEST_MEASUREMENT_OPERATION_TOTAL_NUMBER_OF_MEASUREMENTS
171 : },
172 : };
173 : size_t m_libspdm_get_measurements_request_size = sizeof(spdm_message_header_t);
174 : #endif /* LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP*/
175 :
176 : #pragma pack(1)
177 :
178 : typedef struct {
179 : spdm_message_header_t header;
180 : uint16_t req_session_id;
181 : uint8_t session_policy;
182 : uint8_t reserved;
183 : uint8_t random_data[SPDM_RANDOM_DATA_SIZE];
184 : uint8_t exchange_data[LIBSPDM_MAX_DHE_KEY_SIZE];
185 : uint16_t opaque_length;
186 : uint8_t opaque_data[SPDM_MAX_OPAQUE_DATA_SIZE];
187 : } libspdm_key_exchange_request_mine_t;
188 :
189 : typedef struct {
190 : spdm_message_header_t header;
191 : uint8_t signature[LIBSPDM_MAX_ASYM_KEY_SIZE];
192 : uint8_t verify_data[LIBSPDM_MAX_HASH_SIZE];
193 : } libspdm_finish_request_mine_t;
194 :
195 : #if LIBSPDM_ENABLE_CAPABILITY_PSK_CAP
196 : typedef struct {
197 : spdm_message_header_t header;
198 : uint16_t req_session_id;
199 : uint16_t psk_hint_length;
200 : uint16_t requester_context_length;
201 : uint16_t opaque_length;
202 : uint8_t psk_hint[LIBSPDM_PSK_MAX_HINT_LENGTH];
203 : uint8_t requester_context[LIBSPDM_PSK_CONTEXT_LENGTH];
204 : uint8_t opaque_data[SPDM_MAX_OPAQUE_DATA_SIZE];
205 : } libspdm_psk_exchange_request_mine_t;
206 :
207 : typedef struct {
208 : spdm_message_header_t header;
209 : uint8_t verify_data[LIBSPDM_MAX_HASH_SIZE];
210 : } libspdm_psk_finish_request_mine_t;
211 : #endif /* LIBSPDM_ENABLE_CAPABILITY_PSK_CAP */
212 :
213 : #pragma pack()
214 :
215 : libspdm_key_exchange_request_mine_t m_libspdm_key_exchange_request = {
216 : {
217 : SPDM_MESSAGE_VERSION_11,
218 : SPDM_KEY_EXCHANGE,
219 : SPDM_KEY_EXCHANGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH,
220 : 0
221 : },
222 : };
223 : size_t m_libspdm_key_exchange_request_size = sizeof(m_libspdm_key_exchange_request);
224 :
225 : libspdm_finish_request_mine_t m_libspdm_finish_request = {
226 : {
227 : SPDM_MESSAGE_VERSION_11,
228 : SPDM_FINISH,
229 : 0,
230 : 0
231 : },
232 : };
233 : size_t m_libspdm_finish_request_size = sizeof(m_libspdm_finish_request);
234 :
235 : #if LIBSPDM_ENABLE_CAPABILITY_PSK_CAP
236 : libspdm_psk_exchange_request_mine_t m_libspdm_psk_exchange_request = {
237 : {
238 : SPDM_MESSAGE_VERSION_11,
239 : SPDM_PSK_EXCHANGE,
240 : SPDM_PSK_EXCHANGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH,
241 : 0
242 : },
243 : };
244 : size_t m_libspdm_psk_exchange_request_size = sizeof(m_libspdm_psk_exchange_request);
245 :
246 : libspdm_psk_finish_request_mine_t m_libspdm_psk_finish_request = {
247 : {
248 : SPDM_MESSAGE_VERSION_11,
249 : SPDM_PSK_FINISH,
250 : 0,
251 : 0
252 : },
253 : };
254 : size_t m_libspdm_psk_finish_request_size = sizeof(m_libspdm_psk_finish_request);
255 : #endif /* LIBSPDM_ENABLE_CAPABILITY_PSK_CAP */
256 :
257 : spdm_end_session_request_t m_libspdm_end_session_request = {
258 : {
259 : SPDM_MESSAGE_VERSION_11,
260 : SPDM_END_SESSION,
261 : 0,
262 : 0
263 : }
264 : };
265 : size_t m_libspdm_end_session_request_size = sizeof(m_libspdm_end_session_request);
266 : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
267 : static uint8_t m_libspdm_local_certificate_chain[LIBSPDM_MAX_CERT_CHAIN_SIZE];
268 : #endif
269 2 : static void libspdm_secured_message_set_request_finished_key(
270 : void *spdm_secured_message_context, const void *key, size_t key_size)
271 : {
272 : libspdm_secured_message_context_t *secured_message_context;
273 :
274 2 : secured_message_context = spdm_secured_message_context;
275 2 : LIBSPDM_ASSERT(key_size == secured_message_context->hash_size);
276 2 : libspdm_copy_mem(secured_message_context->handshake_secret.request_finished_key,
277 : sizeof(secured_message_context->handshake_secret.request_finished_key),
278 : key, secured_message_context->hash_size);
279 2 : }
280 :
281 : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
282 : /**
283 : * Test 1: receiving a correct RESPOND_IF_READY from the requester, after a
284 : * GET_DIGESTS could not be processed.
285 : * Expected behavior: the responder accepts the request and produces a valid DIGESTS
286 : * response message.
287 : **/
288 1 : static void rsp_respond_if_ready_case1(void **state) {
289 : libspdm_return_t status;
290 : libspdm_test_context_t *spdm_test_context;
291 : libspdm_context_t *spdm_context;
292 : size_t response_size;
293 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
294 : spdm_digest_response_t *spdm_response; /*response to the original request (DIGESTS)*/
295 :
296 1 : spdm_test_context = *state;
297 1 : spdm_context = spdm_test_context->spdm_context;
298 1 : spdm_test_context->case_id = 0x1;
299 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
300 :
301 : /*state for the the original request (GET_DIGESTS)*/
302 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
303 1 : spdm_context->local_context.capability.flags = 0;
304 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
305 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
306 :
307 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
308 : SPDM_VERSION_NUMBER_SHIFT_BIT;
309 1 : spdm_context->local_context.local_cert_chain_provision[0] = m_libspdm_local_certificate_chain;
310 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
311 : sizeof(m_libspdm_local_certificate_chain);
312 1 : libspdm_set_mem (m_libspdm_local_certificate_chain, sizeof(m_libspdm_local_certificate_chain),
313 : (uint8_t)(0xFF));
314 :
315 1 : spdm_context->last_spdm_request_size = m_libspdm_get_digest_request_size;
316 1 : libspdm_copy_mem(spdm_context->last_spdm_request,
317 1 : libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
318 : &m_libspdm_get_digest_request, m_libspdm_get_digest_request_size);
319 :
320 : /*RESPOND_IF_READY specific data*/
321 1 : spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
322 1 : libspdm_copy_mem(spdm_context->cache_spdm_request,
323 1 : libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
324 1 : spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
325 1 : spdm_context->error_data.rd_exponent = 1;
326 1 : spdm_context->error_data.rd_tm = 1;
327 1 : spdm_context->error_data.request_code = SPDM_GET_DIGESTS;
328 1 : spdm_context->error_data.token = LIBSPDM_MY_TEST_TOKEN;
329 :
330 : /*check DIGESTS response*/
331 1 : response_size = sizeof(response);
332 1 : status = libspdm_get_response_respond_if_ready(spdm_context,
333 : m_libspdm_respond_if_ready_request1_size,
334 : &m_libspdm_respond_if_ready_request1,
335 : &response_size,
336 : response);
337 1 : assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
338 1 : assert_int_equal (response_size,
339 : sizeof(spdm_digest_response_t) +
340 : libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo));
341 1 : spdm_response = (void *)response;
342 1 : assert_int_equal (spdm_response->header.request_response_code, SPDM_DIGESTS);
343 1 : }
344 :
345 : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
346 :
347 : /**
348 : * Test 2: receiving a correct RESPOND_IF_READY from the requester, after a
349 : * GET_CERTIFICATE could not be processed.
350 : * Expected behavior: the responder accepts the request and produces a valid CERTIFICATE
351 : * response message.
352 : **/
353 :
354 : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
355 :
356 1 : static void rsp_respond_if_ready_case2(void **state) {
357 : libspdm_return_t status;
358 : libspdm_test_context_t *spdm_test_context;
359 : libspdm_context_t *spdm_context;
360 : size_t response_size;
361 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
362 : spdm_certificate_response_t *spdm_response; /*response to the original request (CERTIFICATE)*/
363 : void *data;
364 : size_t data_size;
365 :
366 1 : spdm_test_context = *state;
367 1 : spdm_context = spdm_test_context->spdm_context;
368 1 : spdm_test_context->case_id = 0x2;
369 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
370 :
371 : /*state for the the original request (GET_CERTIFICATE)*/
372 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AFTER_DIGESTS;
373 1 : spdm_context->local_context.capability.flags = 0;
374 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
375 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
376 1 : spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
377 :
378 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
379 : SPDM_VERSION_NUMBER_SHIFT_BIT;
380 1 : libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
381 : m_libspdm_use_asym_algo,
382 : &data, &data_size,
383 : NULL, NULL);
384 1 : spdm_context->local_context.local_cert_chain_provision[0] = data;
385 1 : spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
386 :
387 1 : spdm_context->last_spdm_request_size = m_libspdm_get_certificate_request_size;
388 1 : libspdm_copy_mem(spdm_context->last_spdm_request,
389 1 : libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
390 : &m_libspdm_get_certificate_request, m_libspdm_get_certificate_request_size);
391 :
392 : /*RESPOND_IF_READY specific data*/
393 1 : spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
394 1 : libspdm_copy_mem(spdm_context->cache_spdm_request,
395 1 : libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
396 1 : spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
397 1 : spdm_context->error_data.rd_exponent = 1;
398 1 : spdm_context->error_data.rd_tm = 1;
399 1 : spdm_context->error_data.request_code = SPDM_GET_CERTIFICATE;
400 1 : spdm_context->error_data.token = LIBSPDM_MY_TEST_TOKEN;
401 :
402 : /*check CERTIFICATE response*/
403 1 : response_size = sizeof(response);
404 1 : status = libspdm_get_response_respond_if_ready(spdm_context,
405 : m_libspdm_respond_if_ready_request2_size,
406 : &m_libspdm_respond_if_ready_request2,
407 : &response_size,
408 : response);
409 1 : assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
410 1 : assert_int_equal (response_size,
411 : sizeof(spdm_certificate_response_t) + LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN);
412 1 : spdm_response = (void *)response;
413 1 : assert_int_equal (spdm_response->header.request_response_code, SPDM_CERTIFICATE);
414 1 : assert_int_equal (spdm_response->header.param1, 0);
415 1 : assert_int_equal (spdm_response->portion_length, LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN);
416 1 : assert_int_equal (spdm_response->remainder_length,
417 : data_size - LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN);
418 1 : free(data);
419 1 : }
420 :
421 : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
422 :
423 : /**
424 : * Test 3: receiving a correct RESPOND_IF_READY from the requester, after a
425 : * CHALLENGE could not be processed.
426 : * Expected behavior: the responder accepts the request and produces a valid CHALLENGE_AUTH
427 : * response message.
428 : **/
429 : #if LIBSPDM_ENABLE_CAPABILITY_CHAL_CAP
430 1 : static void rsp_respond_if_ready_case3(void **state) {
431 : libspdm_return_t status;
432 : libspdm_test_context_t *spdm_test_context;
433 : libspdm_context_t *spdm_context;
434 : size_t response_size;
435 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
436 : spdm_challenge_auth_response_t *spdm_response; /*response to the original request (CHALLENGE_AUTH)*/
437 : void *data;
438 : size_t data_size;
439 :
440 1 : spdm_test_context = *state;
441 1 : spdm_context = spdm_test_context->spdm_context;
442 1 : spdm_test_context->case_id = 0x3;
443 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
444 :
445 : /*state for the the original request (CHALLENGE)*/
446 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
447 1 : spdm_context->local_context.capability.flags = 0;
448 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
449 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
450 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
451 1 : spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
452 1 : spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
453 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
454 : m_libspdm_use_measurement_hash_algo;
455 :
456 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
457 : SPDM_VERSION_NUMBER_SHIFT_BIT;
458 1 : libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
459 : m_libspdm_use_asym_algo,
460 : &data, &data_size,
461 : NULL, NULL);
462 1 : spdm_context->local_context.local_cert_chain_provision[0] = data;
463 1 : spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
464 :
465 1 : libspdm_secret_lib_challenge_opaque_data_size = 0;
466 :
467 1 : spdm_context->last_spdm_request_size = m_libspdm_challenge_request_size;
468 1 : libspdm_copy_mem(spdm_context->last_spdm_request,
469 1 : libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
470 : &m_libspdm_challenge_request, m_libspdm_challenge_request_size);
471 :
472 : /*RESPOND_IF_READY specific data*/
473 1 : spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
474 1 : libspdm_copy_mem(spdm_context->cache_spdm_request,
475 1 : libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
476 1 : spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
477 1 : spdm_context->error_data.rd_exponent = 1;
478 1 : spdm_context->error_data.rd_tm = 1;
479 1 : spdm_context->error_data.request_code = SPDM_CHALLENGE;
480 1 : spdm_context->error_data.token = LIBSPDM_MY_TEST_TOKEN;
481 :
482 : /*check CHALLENGE response*/
483 1 : response_size = sizeof(response);
484 1 : libspdm_get_random_number (SPDM_NONCE_SIZE, m_libspdm_challenge_request.nonce);
485 1 : status = libspdm_get_response_respond_if_ready(spdm_context,
486 : m_libspdm_respond_if_ready_request3_size,
487 : &m_libspdm_respond_if_ready_request3,
488 : &response_size,
489 : response);
490 1 : assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
491 1 : assert_int_equal (response_size, sizeof(spdm_challenge_auth_response_t) + libspdm_get_hash_size (
492 : m_libspdm_use_hash_algo) + SPDM_NONCE_SIZE + 0 + sizeof(uint16_t) + 0 +
493 : libspdm_get_asym_signature_size (
494 : m_libspdm_use_asym_algo));
495 1 : spdm_response = (void *)response;
496 1 : assert_int_equal (spdm_response->header.request_response_code, SPDM_CHALLENGE_AUTH);
497 1 : assert_int_equal (spdm_response->header.param1, 0);
498 1 : assert_int_equal (spdm_response->header.param2, 1 << 0);
499 1 : free(data);
500 1 : }
501 : #endif /* LIBSPDM_ENABLE_CAPABILITY_CHAL_CAP*/
502 :
503 : /**
504 : * Test 4: receiving a correct RESPOND_IF_READY from the requester, after a
505 : * GET_MEASUREMENTS could not be processed.
506 : * Expected behavior: the responder accepts the request and produces a valid MEASUREMENTS
507 : * response message.
508 : **/
509 :
510 : #if LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP
511 :
512 : extern size_t libspdm_secret_lib_meas_opaque_data_size;
513 :
514 1 : static void rsp_respond_if_ready_case4(void **state) {
515 : libspdm_return_t status;
516 : libspdm_test_context_t *spdm_test_context;
517 : libspdm_context_t *spdm_context;
518 : size_t response_size;
519 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
520 : spdm_measurements_response_t *spdm_response; /*response to the original request (MEASUREMENTS)*/
521 :
522 1 : spdm_test_context = *state;
523 1 : spdm_context = spdm_test_context->spdm_context;
524 1 : spdm_test_context->case_id = 0x4;
525 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
526 :
527 : /*state for the the original request (GET_MEASUREMENTS)*/
528 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
529 1 : spdm_context->local_context.capability.flags = 0;
530 1 : spdm_context->local_context.capability.flags |=
531 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
532 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
533 1 : spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
534 1 : spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
535 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
536 : m_libspdm_use_measurement_hash_algo;
537 :
538 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
539 : SPDM_VERSION_NUMBER_SHIFT_BIT;
540 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
541 :
542 1 : spdm_context->last_spdm_request_size = m_libspdm_get_measurements_request_size;
543 1 : libspdm_copy_mem(spdm_context->last_spdm_request,
544 1 : libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
545 : &m_libspdm_get_measurements_request, m_libspdm_get_measurements_request_size);
546 :
547 : /*RESPOND_IF_READY specific data*/
548 1 : spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
549 1 : libspdm_copy_mem(spdm_context->cache_spdm_request,
550 1 : libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
551 1 : spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
552 1 : spdm_context->error_data.rd_exponent = 1;
553 1 : spdm_context->error_data.rd_tm = 1;
554 1 : spdm_context->error_data.request_code = SPDM_GET_MEASUREMENTS;
555 1 : spdm_context->error_data.token = LIBSPDM_MY_TEST_TOKEN;
556 :
557 : /*check MEASUREMENT response*/
558 1 : response_size = sizeof(response);
559 1 : libspdm_get_random_number (SPDM_NONCE_SIZE, m_libspdm_get_measurements_request.nonce);
560 1 : status = libspdm_get_response_respond_if_ready(spdm_context,
561 : m_libspdm_respond_if_ready_request4_size,
562 : &m_libspdm_respond_if_ready_request4,
563 : &response_size,
564 : response);
565 1 : assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
566 1 : assert_int_equal (response_size,
567 : sizeof(spdm_measurements_response_t) + sizeof(uint16_t) + SPDM_NONCE_SIZE);
568 1 : spdm_response = (void *)response;
569 1 : assert_int_equal (spdm_response->header.request_response_code, SPDM_MEASUREMENTS);
570 1 : assert_int_equal (spdm_response->header.param1, LIBSPDM_MEASUREMENT_BLOCK_NUMBER);
571 1 : }
572 :
573 : #endif /* LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP*/
574 :
575 : /**
576 : * Test 5: receiving a correct RESPOND_IF_READY from the requester, after a
577 : * KEY_EXCHANGE could not be processed.
578 : * Expected behavior: the responder accepts the request and produces a valid KEY_EXCHANGE_RSP
579 : * response message.
580 : **/
581 : #if LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP
582 :
583 1 : static void rsp_respond_if_ready_case5(void **state) {
584 : libspdm_return_t status;
585 : libspdm_test_context_t *spdm_test_context;
586 : libspdm_context_t *spdm_context;
587 : size_t response_size;
588 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
589 : spdm_key_exchange_response_t *spdm_response; /*response to the original request (KEY_EXCHANGE_RSP)*/
590 : void *data;
591 : size_t data_size;
592 : uint8_t *ptr;
593 : size_t dhe_key_size;
594 : void *dhe_context;
595 : size_t opaque_key_exchange_req_size;
596 :
597 1 : spdm_test_context = *state;
598 1 : spdm_context = spdm_test_context->spdm_context;
599 1 : spdm_test_context->case_id = 0x5;
600 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
601 :
602 : /*state for the the original request (KEY_EXCHANGE)*/
603 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
604 1 : spdm_context->connection_info.capability.flags |=
605 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP |
606 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
607 1 : spdm_context->local_context.capability.flags =
608 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP |
609 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP |
610 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
611 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
612 1 : spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
613 1 : spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
614 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
615 : m_libspdm_use_measurement_hash_algo;
616 1 : spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
617 1 : spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
618 :
619 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
620 : SPDM_VERSION_NUMBER_SHIFT_BIT;
621 1 : libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
622 : m_libspdm_use_asym_algo,
623 : &data, &data_size,
624 : NULL, NULL);
625 1 : spdm_context->local_context.local_cert_chain_provision[0] = data;
626 1 : spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
627 :
628 1 : spdm_context->local_context.mut_auth_requested = 0;
629 :
630 1 : m_libspdm_key_exchange_request.req_session_id = 0xFFFF;
631 1 : m_libspdm_key_exchange_request.reserved = 0;
632 1 : ptr = m_libspdm_key_exchange_request.random_data;
633 1 : libspdm_get_random_number (SPDM_RANDOM_DATA_SIZE, ptr);
634 1 : ptr += SPDM_RANDOM_DATA_SIZE;
635 1 : dhe_key_size = libspdm_get_dhe_pub_key_size (m_libspdm_use_dhe_algo);
636 1 : dhe_context = libspdm_dhe_new (spdm_context->connection_info.version, m_libspdm_use_dhe_algo,
637 : false);
638 1 : libspdm_dhe_generate_key (m_libspdm_use_dhe_algo, dhe_context, ptr, &dhe_key_size);
639 1 : ptr += dhe_key_size;
640 1 : libspdm_dhe_free (m_libspdm_use_dhe_algo, dhe_context);
641 1 : opaque_key_exchange_req_size =
642 1 : libspdm_get_opaque_data_supported_version_data_size (spdm_context);
643 1 : *(uint16_t *)ptr = (uint16_t)opaque_key_exchange_req_size;
644 1 : ptr += sizeof(uint16_t);
645 1 : libspdm_build_opaque_data_supported_version_data (spdm_context, &opaque_key_exchange_req_size,
646 : ptr);
647 1 : ptr += opaque_key_exchange_req_size;
648 :
649 1 : spdm_context->last_spdm_request_size = m_libspdm_key_exchange_request_size;
650 1 : libspdm_copy_mem(spdm_context->last_spdm_request,
651 1 : libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
652 : &m_libspdm_key_exchange_request, m_libspdm_key_exchange_request_size);
653 :
654 : /*RESPOND_IF_READY specific data*/
655 1 : spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
656 1 : libspdm_copy_mem(spdm_context->cache_spdm_request,
657 1 : libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
658 1 : spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
659 1 : spdm_context->error_data.rd_exponent = 1;
660 1 : spdm_context->error_data.rd_tm = 1;
661 1 : spdm_context->error_data.request_code = SPDM_KEY_EXCHANGE;
662 1 : spdm_context->error_data.token = LIBSPDM_MY_TEST_TOKEN;
663 :
664 : /*check KEY_EXCHANGE_RSP response*/
665 1 : response_size = sizeof(response);
666 1 : status = libspdm_get_response_respond_if_ready(spdm_context,
667 : m_libspdm_respond_if_ready_request5_size,
668 : &m_libspdm_respond_if_ready_request5,
669 : &response_size,
670 : response);
671 1 : assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
672 1 : assert_int_equal (response_size,
673 : sizeof(spdm_key_exchange_response_t) + dhe_key_size + 2 +
674 : libspdm_get_opaque_data_version_selection_data_size(
675 : spdm_context) + libspdm_get_asym_signature_size (
676 : m_libspdm_use_asym_algo) +
677 : libspdm_get_hash_size (m_libspdm_use_hash_algo));
678 1 : assert_int_equal (libspdm_secured_message_get_session_state (spdm_context->session_info[0].
679 : secured_message_context),
680 : LIBSPDM_SESSION_STATE_HANDSHAKING);
681 1 : spdm_response = (void *)response;
682 1 : assert_int_equal (spdm_response->header.request_response_code, SPDM_KEY_EXCHANGE_RSP);
683 1 : assert_int_equal (spdm_response->rsp_session_id, 0xFFFF);
684 1 : free(data);
685 1 : libspdm_free_session_id (spdm_context, (0xFFFFFFFF));
686 1 : }
687 :
688 : #endif /* LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP*/
689 :
690 : /**
691 : * Test 6: receiving a correct RESPOND_IF_READY from the requester, after a
692 : * FINISH could not be processed.
693 : * Expected behavior: the responder accepts the request and produces a valid FINISH_RSP
694 : * response message.
695 : **/
696 : #if LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP
697 :
698 1 : static void rsp_respond_if_ready_case6(void **state) {
699 : libspdm_return_t status;
700 : libspdm_test_context_t *spdm_test_context;
701 : libspdm_context_t *spdm_context;
702 : size_t response_size;
703 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
704 : spdm_finish_response_t *spdm_response; /*response to the original request (FINISH_RSP)*/
705 : void *data;
706 : size_t data_size;
707 : uint8_t *ptr;
708 : uint8_t dummy_buffer[LIBSPDM_MAX_HASH_SIZE];
709 : uint8_t *cert_buffer;
710 : size_t cert_buffer_size;
711 : uint8_t cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
712 : uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
713 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
714 : libspdm_session_info_t *session_info;
715 : uint32_t session_id;
716 : uint32_t hash_size;
717 : uint32_t hmac_size;
718 :
719 1 : spdm_test_context = *state;
720 1 : spdm_context = spdm_test_context->spdm_context;
721 1 : spdm_test_context->case_id = 0x6;
722 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
723 :
724 : /*state for the the original request (FINISH)*/
725 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
726 1 : spdm_context->local_context.capability.flags = 0;
727 1 : spdm_context->connection_info.capability.flags |=
728 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
729 1 : spdm_context->connection_info.capability.flags |=
730 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
731 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
732 1 : spdm_context->local_context.capability.flags |=
733 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
734 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
735 1 : spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
736 1 : spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
737 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
738 : m_libspdm_use_measurement_hash_algo;
739 1 : spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
740 1 : spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
741 :
742 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
743 : SPDM_VERSION_NUMBER_SHIFT_BIT;
744 1 : libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
745 : m_libspdm_use_asym_algo,
746 : &data, &data_size,
747 : NULL, NULL);
748 1 : spdm_context->local_context.local_cert_chain_provision[0] = data;
749 1 : spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
750 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data;
751 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size = data_size;
752 :
753 1 : spdm_context->local_context.mut_auth_requested = 0;
754 :
755 1 : session_id = 0xFFFFFFFF;
756 1 : spdm_context->latest_session_id = session_id;
757 1 : session_info = &spdm_context->session_info[0];
758 1 : libspdm_session_info_init (spdm_context, session_info, session_id,
759 : SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, false);
760 1 : hash_size = libspdm_get_hash_size (m_libspdm_use_hash_algo);
761 1 : libspdm_set_mem (dummy_buffer, hash_size, (uint8_t)(0xFF));
762 1 : libspdm_secured_message_set_request_finished_key (session_info->secured_message_context,
763 : dummy_buffer, hash_size);
764 1 : libspdm_secured_message_set_session_state (session_info->secured_message_context,
765 : LIBSPDM_SESSION_STATE_HANDSHAKING);
766 :
767 1 : hash_size = libspdm_get_hash_size (m_libspdm_use_hash_algo);
768 1 : hmac_size = libspdm_get_hash_size (m_libspdm_use_hash_algo);
769 1 : ptr = m_libspdm_finish_request.signature;
770 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
771 1 : cert_buffer = (uint8_t *)data;
772 1 : cert_buffer_size = data_size;
773 1 : libspdm_hash_all (m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size, cert_buffer_hash);
774 : /* Transcript.MessageA size is 0*/
775 1 : libspdm_append_managed_buffer (&th_curr, cert_buffer_hash, hash_size);
776 : /* SessionTranscript.MessageK is 0*/
777 1 : libspdm_append_managed_buffer (&th_curr, (uint8_t *)&m_libspdm_finish_request,
778 : sizeof(spdm_finish_request_t));
779 1 : libspdm_set_mem (request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
780 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
781 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
782 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
783 : request_finished_key, hash_size, ptr);
784 :
785 1 : spdm_context->last_spdm_request_size = sizeof(spdm_finish_request_t) + hmac_size;
786 1 : libspdm_copy_mem(spdm_context->last_spdm_request,
787 1 : libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
788 : &m_libspdm_finish_request, m_libspdm_finish_request_size);
789 :
790 : /*RESPOND_IF_READY specific data*/
791 1 : spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
792 1 : libspdm_copy_mem(spdm_context->cache_spdm_request,
793 1 : libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
794 1 : spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
795 1 : spdm_context->error_data.rd_exponent = 1;
796 1 : spdm_context->error_data.rd_tm = 1;
797 1 : spdm_context->error_data.request_code = SPDM_FINISH;
798 1 : spdm_context->error_data.token = LIBSPDM_MY_TEST_TOKEN;
799 :
800 : /*check FINISH_RSP response*/
801 1 : response_size = sizeof(response);
802 1 : status = libspdm_get_response_respond_if_ready(spdm_context,
803 : m_libspdm_respond_if_ready_request6_size,
804 : &m_libspdm_respond_if_ready_request6,
805 : &response_size,
806 : response);
807 1 : assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
808 1 : assert_int_equal (response_size, sizeof(spdm_finish_response_t) + hmac_size);
809 1 : spdm_response = (void *)response;
810 1 : assert_int_equal (spdm_response->header.request_response_code, SPDM_FINISH_RSP);
811 1 : free(data);
812 1 : libspdm_free_session_id (spdm_context, (0xFFFFFFFF));
813 1 : }
814 : #endif /* LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP*/
815 :
816 : /**
817 : * Test 7: receiving a correct RESPOND_IF_READY from the requester, after a
818 : * PSK_EXCHANGE could not be processed.
819 : * Expected behavior: the responder accepts the request and produces a valid PSK_EXCHANGE_RSP
820 : * response message.
821 : **/
822 : #if LIBSPDM_ENABLE_CAPABILITY_PSK_CAP
823 :
824 1 : static void rsp_respond_if_ready_case7(void **state) {
825 : libspdm_return_t status;
826 : libspdm_test_context_t *spdm_test_context;
827 : libspdm_context_t *spdm_context;
828 : size_t response_size;
829 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
830 : spdm_psk_exchange_response_t *spdm_response; /*response to the original request (PSK_EXCHANGE_RSP)*/
831 : void *data;
832 : size_t data_size;
833 : uint8_t *ptr;
834 : size_t opaque_psk_exchange_req_size;
835 :
836 1 : spdm_test_context = *state;
837 1 : spdm_context = spdm_test_context->spdm_context;
838 1 : spdm_test_context->case_id = 0x7;
839 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
840 :
841 : /*state for the the original request (PSK_EXCHANGE)*/
842 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
843 1 : spdm_context->local_context.capability.flags = 0;
844 1 : spdm_context->connection_info.capability.flags |=
845 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP |
846 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
847 1 : spdm_context->local_context.capability.flags |=
848 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP |
849 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
850 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
851 1 : spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
852 1 : spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
853 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
854 : m_libspdm_use_measurement_hash_algo;
855 1 : spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
856 1 : spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
857 1 : spdm_context->connection_info.algorithm.key_schedule = m_libspdm_use_key_schedule_algo;
858 :
859 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
860 : SPDM_VERSION_NUMBER_SHIFT_BIT;
861 1 : libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
862 : m_libspdm_use_asym_algo,
863 : &data, &data_size,
864 : NULL, NULL);
865 1 : spdm_context->local_context.local_cert_chain_provision[0] = data;
866 1 : spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
867 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data;
868 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size = data_size;
869 :
870 1 : m_libspdm_psk_exchange_request.psk_hint_length =
871 : (uint16_t)sizeof(LIBSPDM_TEST_PSK_HINT_STRING);
872 1 : m_libspdm_psk_exchange_request.requester_context_length = LIBSPDM_PSK_CONTEXT_LENGTH;
873 1 : opaque_psk_exchange_req_size =
874 1 : libspdm_get_opaque_data_supported_version_data_size (spdm_context);
875 1 : m_libspdm_psk_exchange_request.opaque_length = (uint16_t)opaque_psk_exchange_req_size;
876 1 : m_libspdm_psk_exchange_request.req_session_id = 0xFFFF;
877 1 : ptr = m_libspdm_psk_exchange_request.psk_hint;
878 1 : libspdm_copy_mem(ptr, sizeof(m_libspdm_psk_exchange_request.psk_hint),
879 : LIBSPDM_TEST_PSK_HINT_STRING,
880 : sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
881 1 : ptr += m_libspdm_psk_exchange_request.psk_hint_length;
882 1 : libspdm_get_random_number (LIBSPDM_PSK_CONTEXT_LENGTH, ptr);
883 1 : ptr += m_libspdm_psk_exchange_request.requester_context_length;
884 1 : libspdm_build_opaque_data_supported_version_data (spdm_context, &opaque_psk_exchange_req_size,
885 : ptr);
886 1 : ptr += opaque_psk_exchange_req_size;
887 :
888 1 : spdm_context->last_spdm_request_size = m_libspdm_psk_exchange_request_size;
889 1 : libspdm_copy_mem(spdm_context->last_spdm_request,
890 1 : libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
891 : &m_libspdm_psk_exchange_request, m_libspdm_psk_exchange_request_size);
892 :
893 : /*RESPOND_IF_READY specific data*/
894 1 : spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
895 1 : libspdm_copy_mem(spdm_context->cache_spdm_request,
896 1 : libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
897 1 : spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
898 1 : spdm_context->error_data.rd_exponent = 1;
899 1 : spdm_context->error_data.rd_tm = 1;
900 1 : spdm_context->error_data.request_code = SPDM_PSK_EXCHANGE;
901 1 : spdm_context->error_data.token = LIBSPDM_MY_TEST_TOKEN;
902 :
903 : /*check PSK_EXCHANGE_RSP response*/
904 1 : response_size = sizeof(response);
905 1 : status = libspdm_get_response_respond_if_ready(spdm_context,
906 : m_libspdm_respond_if_ready_request7_size,
907 : &m_libspdm_respond_if_ready_request7,
908 : &response_size,
909 : response);
910 1 : assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
911 1 : assert_int_equal (response_size,
912 : sizeof(spdm_psk_exchange_response_t) + LIBSPDM_PSK_CONTEXT_LENGTH +
913 : libspdm_get_opaque_data_version_selection_data_size(
914 : spdm_context) + libspdm_get_hash_size (m_libspdm_use_hash_algo));
915 1 : assert_int_equal (libspdm_secured_message_get_session_state (spdm_context->session_info[0].
916 : secured_message_context),
917 : LIBSPDM_SESSION_STATE_HANDSHAKING);
918 1 : spdm_response = (void *)response;
919 1 : assert_int_equal (spdm_response->header.request_response_code, SPDM_PSK_EXCHANGE_RSP);
920 1 : assert_int_equal (spdm_response->rsp_session_id, 0xFFFF);
921 1 : free(data);
922 1 : libspdm_free_session_id (spdm_context, (0xFFFFFFFF));
923 1 : }
924 : #endif /* LIBSPDM_ENABLE_CAPABILITY_PSK_CAP*/
925 :
926 : /**
927 : * Test 8: receiving a correct RESPOND_IF_READY from the requester, after a
928 : * PSK_FINISH could not be processed.
929 : * Expected behavior: the responder accepts the request and produces a valid PSK_FINISH_RSP
930 : * response message.
931 : **/
932 : #if LIBSPDM_ENABLE_CAPABILITY_PSK_CAP
933 1 : static void rsp_respond_if_ready_case8(void **state) {
934 : libspdm_return_t status;
935 : libspdm_test_context_t *spdm_test_context;
936 : libspdm_context_t *spdm_context;
937 : size_t response_size;
938 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
939 : spdm_psk_finish_response_t *spdm_response; /*response to the original request (FINISH_PSK_RSP)*/
940 : void *data;
941 : size_t data_size;
942 : uint8_t *ptr;
943 : uint8_t dummy_buffer[LIBSPDM_MAX_HASH_SIZE];
944 : uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
945 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
946 : libspdm_session_info_t *session_info;
947 : uint32_t session_id;
948 : uint32_t hash_size;
949 : uint32_t hmac_size;
950 :
951 1 : spdm_test_context = *state;
952 1 : spdm_context = spdm_test_context->spdm_context;
953 1 : spdm_test_context->case_id = 0x8;
954 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
955 :
956 : /*state for the the original request (FINISH)*/
957 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
958 1 : spdm_context->local_context.capability.flags = 0;
959 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
960 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
961 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
962 1 : spdm_context->local_context.capability.flags |=
963 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
964 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
965 1 : spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
966 1 : spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
967 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
968 : m_libspdm_use_measurement_hash_algo;
969 1 : spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
970 1 : spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
971 :
972 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
973 : SPDM_VERSION_NUMBER_SHIFT_BIT;
974 1 : libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
975 : m_libspdm_use_asym_algo,
976 : &data, &data_size,
977 : NULL, NULL);
978 1 : spdm_context->local_context.local_cert_chain_provision[0] = data;
979 1 : spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
980 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data;
981 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size = data_size;
982 :
983 1 : spdm_context->local_context.mut_auth_requested = 0;
984 :
985 1 : session_id = 0xFFFFFFFF;
986 1 : spdm_context->latest_session_id = session_id;
987 1 : spdm_context->last_spdm_request_session_id_valid = true;
988 1 : spdm_context->last_spdm_request_session_id = session_id;
989 1 : session_info = &spdm_context->session_info[0];
990 1 : libspdm_session_info_init (spdm_context, session_info, session_id,
991 : SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
992 1 : libspdm_session_info_set_psk_hint(session_info,
993 : LIBSPDM_TEST_PSK_HINT_STRING,
994 : sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
995 1 : hash_size = libspdm_get_hash_size (m_libspdm_use_hash_algo);
996 1 : libspdm_set_mem (dummy_buffer, hash_size, (uint8_t)(0xFF));
997 1 : libspdm_secured_message_set_request_finished_key (session_info->secured_message_context,
998 : dummy_buffer, hash_size);
999 1 : libspdm_secured_message_set_session_state (session_info->secured_message_context,
1000 : LIBSPDM_SESSION_STATE_HANDSHAKING);
1001 :
1002 1 : hash_size = libspdm_get_hash_size (m_libspdm_use_hash_algo);
1003 1 : hmac_size = libspdm_get_hash_size (m_libspdm_use_hash_algo);
1004 1 : ptr = m_libspdm_psk_finish_request.verify_data;
1005 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
1006 : /* Transcript.MessageA size is 0
1007 : * SessionTranscript.MessageK is 0*/
1008 1 : libspdm_append_managed_buffer (&th_curr, (uint8_t *)&m_libspdm_psk_finish_request,
1009 : sizeof(spdm_psk_finish_request_t));
1010 1 : libspdm_set_mem (request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
1011 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
1012 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
1013 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
1014 : request_finished_key, hash_size, ptr);
1015 :
1016 1 : spdm_context->last_spdm_request_size = sizeof(spdm_psk_finish_request_t) + hmac_size;
1017 1 : libspdm_copy_mem(spdm_context->last_spdm_request,
1018 1 : libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
1019 : &m_libspdm_psk_finish_request, m_libspdm_psk_finish_request_size);
1020 :
1021 : /*RESPOND_IF_READY specific data*/
1022 1 : spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
1023 1 : libspdm_copy_mem(spdm_context->cache_spdm_request,
1024 1 : libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
1025 1 : spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
1026 1 : spdm_context->error_data.rd_exponent = 1;
1027 1 : spdm_context->error_data.rd_tm = 1;
1028 1 : spdm_context->error_data.request_code = SPDM_PSK_FINISH;
1029 1 : spdm_context->error_data.token = LIBSPDM_MY_TEST_TOKEN;
1030 :
1031 : /*check FINISH_PSK_RSP response*/
1032 1 : response_size = sizeof(response);
1033 1 : status = libspdm_get_response_respond_if_ready(spdm_context,
1034 : m_libspdm_respond_if_ready_request8_size,
1035 : &m_libspdm_respond_if_ready_request8,
1036 : &response_size,
1037 : response);
1038 1 : assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
1039 1 : assert_int_equal (response_size, sizeof(spdm_psk_finish_response_t));
1040 1 : spdm_response = (void *)response;
1041 1 : assert_int_equal (spdm_response->header.request_response_code, SPDM_PSK_FINISH_RSP);
1042 1 : free(data);
1043 1 : libspdm_free_session_id (spdm_context, (0xFFFFFFFF));
1044 1 : }
1045 : #endif /* LIBSPDM_ENABLE_CAPABILITY_PSK_CAP*/
1046 :
1047 : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
1048 :
1049 : /**
1050 : * Test 9:
1051 : * Expected behavior:
1052 : **/
1053 1 : static void rsp_respond_if_ready_case9(void **state) {
1054 1 : }
1055 :
1056 : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
1057 :
1058 : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
1059 : /**
1060 : * Test 10: receiving a correct RESPOND_IF_READY from the requester, but the responder is in
1061 : * a Busy state.
1062 : * Expected behavior: the responder accepts the request, but produces an ERROR message
1063 : * indicating the Busy state.
1064 : **/
1065 1 : static void rsp_respond_if_ready_case10(void **state) {
1066 : libspdm_return_t status;
1067 : libspdm_test_context_t *spdm_test_context;
1068 : libspdm_context_t *spdm_context;
1069 : size_t response_size;
1070 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1071 : spdm_digest_response_t *spdm_response; /*response to the original request (DIGESTS)*/
1072 :
1073 1 : spdm_test_context = *state;
1074 1 : spdm_context = spdm_test_context->spdm_context;
1075 1 : spdm_test_context->case_id = 0xA;
1076 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_BUSY;
1077 :
1078 : /*state for the the original request (GET_DIGESTS)*/
1079 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1080 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
1081 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
1082 1 : spdm_context->local_context.local_cert_chain_provision[0] = m_libspdm_local_certificate_chain;
1083 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
1084 : sizeof(m_libspdm_local_certificate_chain);
1085 1 : libspdm_set_mem (m_libspdm_local_certificate_chain, sizeof(m_libspdm_local_certificate_chain),
1086 : (uint8_t)(0xFF));
1087 :
1088 1 : spdm_context->last_spdm_request_size = m_libspdm_get_digest_request_size;
1089 1 : libspdm_copy_mem(spdm_context->last_spdm_request,
1090 1 : libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
1091 : &m_libspdm_get_digest_request, m_libspdm_get_digest_request_size);
1092 :
1093 : /*RESPOND_IF_READY specific data*/
1094 1 : spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
1095 1 : libspdm_copy_mem(spdm_context->cache_spdm_request,
1096 1 : libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
1097 1 : spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
1098 1 : spdm_context->error_data.rd_exponent = 1;
1099 1 : spdm_context->error_data.rd_tm = 1;
1100 1 : spdm_context->error_data.request_code = SPDM_GET_DIGESTS;
1101 1 : spdm_context->error_data.token = LIBSPDM_MY_TEST_TOKEN;
1102 :
1103 : /*check ERROR response*/
1104 1 : response_size = sizeof(response);
1105 1 : status = libspdm_get_response_respond_if_ready(spdm_context,
1106 : m_libspdm_respond_if_ready_request1_size,
1107 : &m_libspdm_respond_if_ready_request1,
1108 : &response_size,
1109 : response);
1110 1 : assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
1111 1 : assert_int_equal (response_size, sizeof(spdm_error_response_t));
1112 1 : spdm_response = (void *)response;
1113 1 : assert_int_equal (spdm_response->header.request_response_code, SPDM_ERROR);
1114 1 : assert_int_equal (spdm_response->header.param1, SPDM_ERROR_CODE_BUSY);
1115 1 : assert_int_equal (spdm_response->header.param2, 0);
1116 1 : assert_int_equal (spdm_context->response_state, LIBSPDM_RESPONSE_STATE_BUSY);
1117 1 : }
1118 :
1119 : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
1120 :
1121 : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
1122 : /**
1123 : * Test 11: receiving a correct RESPOND_IF_READY from the requester, but the responder requires
1124 : * resynchronization with the requester.
1125 : * Expected behavior: the responder accepts the request, but produces an ERROR message
1126 : * indicating the NeedResynch state.
1127 : **/
1128 1 : static void rsp_respond_if_ready_case11(void **state) {
1129 : libspdm_return_t status;
1130 : libspdm_test_context_t *spdm_test_context;
1131 : libspdm_context_t *spdm_context;
1132 : size_t response_size;
1133 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1134 : spdm_digest_response_t *spdm_response; /*response to the original request (DIGESTS)*/
1135 :
1136 1 : spdm_test_context = *state;
1137 1 : spdm_context = spdm_test_context->spdm_context;
1138 1 : spdm_test_context->case_id = 0xB;
1139 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NEED_RESYNC;
1140 :
1141 : /*state for the the original request (GET_DIGESTS)*/
1142 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1143 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
1144 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
1145 1 : spdm_context->local_context.local_cert_chain_provision[0] = m_libspdm_local_certificate_chain;
1146 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
1147 : sizeof(m_libspdm_local_certificate_chain);
1148 1 : libspdm_set_mem (m_libspdm_local_certificate_chain, sizeof(m_libspdm_local_certificate_chain),
1149 : (uint8_t)(0xFF));
1150 :
1151 1 : spdm_context->last_spdm_request_size = m_libspdm_get_digest_request_size;
1152 1 : libspdm_copy_mem(spdm_context->last_spdm_request,
1153 1 : libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
1154 : &m_libspdm_get_digest_request, m_libspdm_get_digest_request_size);
1155 :
1156 : /*RESPOND_IF_READY specific data*/
1157 1 : spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
1158 1 : libspdm_copy_mem(spdm_context->cache_spdm_request,
1159 1 : libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
1160 1 : spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
1161 1 : spdm_context->error_data.rd_exponent = 1;
1162 1 : spdm_context->error_data.rd_tm = 1;
1163 1 : spdm_context->error_data.request_code = SPDM_GET_DIGESTS;
1164 1 : spdm_context->error_data.token = LIBSPDM_MY_TEST_TOKEN;
1165 :
1166 : /*check ERROR response*/
1167 1 : response_size = sizeof(response);
1168 1 : status = libspdm_get_response_respond_if_ready(spdm_context,
1169 : m_libspdm_respond_if_ready_request1_size,
1170 : &m_libspdm_respond_if_ready_request1,
1171 : &response_size,
1172 : response);
1173 1 : assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
1174 1 : assert_int_equal (response_size, sizeof(spdm_error_response_t));
1175 1 : spdm_response = (void *)response;
1176 1 : assert_int_equal (spdm_response->header.request_response_code, SPDM_ERROR);
1177 1 : assert_int_equal (spdm_response->header.param1, SPDM_ERROR_CODE_REQUEST_RESYNCH);
1178 1 : assert_int_equal (spdm_response->header.param2, 0);
1179 1 : assert_int_equal (spdm_context->response_state, LIBSPDM_RESPONSE_STATE_NEED_RESYNC);
1180 1 : }
1181 :
1182 : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
1183 :
1184 : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
1185 :
1186 : /**
1187 : * Test 12: receiving a correct RESPOND_IF_READY from the requester, but the responder could not
1188 : * produce the response in time.
1189 : * Expected behavior: the responder accepts the request, but produces an ERROR message
1190 : * indicating the ResponseNotReady state, with the same token as the request.
1191 : **/
1192 1 : static void rsp_respond_if_ready_case12(void **state) {
1193 : libspdm_return_t status;
1194 : libspdm_test_context_t *spdm_test_context;
1195 : libspdm_context_t *spdm_context;
1196 : size_t response_size;
1197 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1198 : spdm_digest_response_t *spdm_response; /*response to the original request (DIGESTS)*/
1199 : spdm_error_data_response_not_ready_t *error_data;
1200 :
1201 1 : spdm_test_context = *state;
1202 1 : spdm_context = spdm_test_context->spdm_context;
1203 1 : spdm_test_context->case_id = 0xC;
1204 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NOT_READY;
1205 :
1206 : /*state for the the original request (GET_DIGESTS)*/
1207 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1208 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
1209 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
1210 1 : spdm_context->local_context.local_cert_chain_provision[0] = m_libspdm_local_certificate_chain;
1211 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
1212 : sizeof(m_libspdm_local_certificate_chain);
1213 1 : libspdm_set_mem (m_libspdm_local_certificate_chain, sizeof(m_libspdm_local_certificate_chain),
1214 : (uint8_t)(0xFF));
1215 :
1216 1 : spdm_context->last_spdm_request_size = m_libspdm_get_digest_request_size;
1217 1 : libspdm_copy_mem(spdm_context->last_spdm_request,
1218 1 : libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
1219 : &m_libspdm_get_digest_request, m_libspdm_get_digest_request_size);
1220 :
1221 : /*RESPOND_IF_READY specific data*/
1222 1 : spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
1223 1 : libspdm_copy_mem(spdm_context->cache_spdm_request,
1224 1 : libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
1225 1 : spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
1226 1 : spdm_context->error_data.rd_exponent = 1;
1227 1 : spdm_context->error_data.rd_tm = 1;
1228 1 : spdm_context->error_data.request_code = SPDM_GET_DIGESTS;
1229 1 : spdm_context->error_data.token = LIBSPDM_MY_TEST_TOKEN;
1230 :
1231 : /*check ERROR response*/
1232 1 : response_size = sizeof(response);
1233 1 : status = libspdm_get_response_respond_if_ready(spdm_context,
1234 : m_libspdm_respond_if_ready_request1_size,
1235 : &m_libspdm_respond_if_ready_request1,
1236 : &response_size,
1237 : response);
1238 1 : assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
1239 1 : assert_int_equal (response_size,
1240 : sizeof(spdm_error_response_t) + sizeof(spdm_error_data_response_not_ready_t));
1241 1 : spdm_response = (void *)response;
1242 1 : error_data = (spdm_error_data_response_not_ready_t*)(spdm_response + 1);
1243 1 : assert_int_equal (spdm_response->header.request_response_code, SPDM_ERROR);
1244 1 : assert_int_equal (spdm_response->header.param1, SPDM_ERROR_CODE_RESPONSE_NOT_READY);
1245 1 : assert_int_equal (spdm_response->header.param2, 0);
1246 1 : assert_int_equal (spdm_context->response_state, LIBSPDM_RESPONSE_STATE_NOT_READY);
1247 1 : assert_int_equal (error_data->request_code, SPDM_GET_DIGESTS);
1248 1 : assert_int_equal (error_data->token, LIBSPDM_MY_TEST_TOKEN);
1249 1 : }
1250 :
1251 : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
1252 :
1253 : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
1254 :
1255 : /**
1256 : * Test 13: receiving a correct RESPOND_IF_READY from the requester, with the correct original
1257 : * request code, but with a token different from the expected.
1258 : * Expected behavior: the responder refuses the RESPOND_IF_READY message and produces an
1259 : * ERROR message indicating the InvalidRequest.
1260 : **/
1261 1 : static void rsp_respond_if_ready_case13(void **state) {
1262 : libspdm_return_t status;
1263 : libspdm_test_context_t *spdm_test_context;
1264 : libspdm_context_t *spdm_context;
1265 : size_t response_size;
1266 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1267 : spdm_digest_response_t *spdm_response; /*response to the original request (DIGESTS)*/
1268 :
1269 1 : spdm_test_context = *state;
1270 1 : spdm_context = spdm_test_context->spdm_context;
1271 1 : spdm_test_context->case_id = 0xD;
1272 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
1273 :
1274 : /*state for the the original request (GET_DIGESTS)*/
1275 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1276 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
1277 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
1278 1 : spdm_context->local_context.local_cert_chain_provision[0] = m_libspdm_local_certificate_chain;
1279 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
1280 : sizeof(m_libspdm_local_certificate_chain);
1281 1 : libspdm_set_mem (m_libspdm_local_certificate_chain, sizeof(m_libspdm_local_certificate_chain),
1282 : (uint8_t)(0xFF));
1283 :
1284 1 : spdm_context->last_spdm_request_size = m_libspdm_get_digest_request_size;
1285 1 : libspdm_copy_mem(spdm_context->last_spdm_request,
1286 1 : libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
1287 : &m_libspdm_get_digest_request, m_libspdm_get_digest_request_size);
1288 :
1289 : /*RESPOND_IF_READY specific data*/
1290 1 : spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
1291 1 : libspdm_copy_mem(spdm_context->cache_spdm_request,
1292 1 : libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
1293 1 : spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
1294 1 : spdm_context->error_data.rd_exponent = 1;
1295 1 : spdm_context->error_data.rd_tm = 1;
1296 1 : spdm_context->error_data.request_code = SPDM_GET_DIGESTS;
1297 1 : spdm_context->error_data.token = LIBSPDM_MY_TEST_TOKEN;
1298 :
1299 : /*check ERROR response*/
1300 1 : response_size = sizeof(response);
1301 1 : status = libspdm_get_response_respond_if_ready(spdm_context,
1302 : m_libspdm_respond_if_ready_request10_size,
1303 : &m_libspdm_respond_if_ready_request10,
1304 : &response_size,
1305 : response);
1306 1 : assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
1307 1 : assert_int_equal (response_size, sizeof(spdm_error_response_t));
1308 1 : spdm_response = (void *)response;
1309 1 : assert_int_equal (spdm_response->header.request_response_code, SPDM_ERROR);
1310 1 : assert_int_equal (spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
1311 1 : assert_int_equal (spdm_response->header.param2, 0);
1312 1 : }
1313 : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
1314 :
1315 : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
1316 : /**
1317 : * Test 14: receiving a correct RESPOND_IF_READY from the requester, with the correct token,
1318 : * but with a request code different from the expected.
1319 : * Expected behavior: the responder refuses the RESPOND_IF_READY message and produces an
1320 : * ERROR message indicating the InvalidRequest.
1321 : **/
1322 1 : static void rsp_respond_if_ready_case14(void **state) {
1323 : libspdm_return_t status;
1324 : libspdm_test_context_t *spdm_test_context;
1325 : libspdm_context_t *spdm_context;
1326 : size_t response_size;
1327 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1328 : spdm_digest_response_t *spdm_response; /*response to the original request (DIGESTS)*/
1329 :
1330 1 : spdm_test_context = *state;
1331 1 : spdm_context = spdm_test_context->spdm_context;
1332 1 : spdm_test_context->case_id = 0xE;
1333 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
1334 :
1335 : /*state for the the original request (GET_DIGESTS)*/
1336 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1337 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
1338 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
1339 1 : spdm_context->local_context.local_cert_chain_provision[0] = m_libspdm_local_certificate_chain;
1340 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
1341 : sizeof(m_libspdm_local_certificate_chain);
1342 1 : libspdm_set_mem (m_libspdm_local_certificate_chain, sizeof(m_libspdm_local_certificate_chain),
1343 : (uint8_t)(0xFF));
1344 :
1345 1 : spdm_context->last_spdm_request_size = m_libspdm_get_digest_request_size;
1346 1 : libspdm_copy_mem(spdm_context->last_spdm_request,
1347 1 : libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
1348 : &m_libspdm_get_digest_request, m_libspdm_get_digest_request_size);
1349 :
1350 : /*RESPOND_IF_READY specific data*/
1351 1 : spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
1352 1 : libspdm_copy_mem(spdm_context->cache_spdm_request,
1353 1 : libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
1354 1 : spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
1355 1 : spdm_context->error_data.rd_exponent = 1;
1356 1 : spdm_context->error_data.rd_tm = 1;
1357 1 : spdm_context->error_data.request_code = SPDM_GET_DIGESTS;
1358 1 : spdm_context->error_data.token = LIBSPDM_MY_TEST_TOKEN;
1359 :
1360 : /*check ERROR response*/
1361 1 : response_size = sizeof(response);
1362 1 : status = libspdm_get_response_respond_if_ready(spdm_context,
1363 : m_libspdm_respond_if_ready_request11_size,
1364 : &m_libspdm_respond_if_ready_request11,
1365 : &response_size,
1366 : response);
1367 1 : assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
1368 1 : assert_int_equal (response_size, sizeof(spdm_error_response_t));
1369 1 : spdm_response = (void *)response;
1370 1 : assert_int_equal (spdm_response->header.request_response_code, SPDM_ERROR);
1371 1 : assert_int_equal (spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
1372 1 : assert_int_equal (spdm_response->header.param2, 0);
1373 1 : }
1374 : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
1375 :
1376 1 : int libspdm_rsp_respond_if_ready_test(void) {
1377 1 : const struct CMUnitTest test_cases[] = {
1378 : /* Success Case*/
1379 : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
1380 : cmocka_unit_test(rsp_respond_if_ready_case1),
1381 : cmocka_unit_test(rsp_respond_if_ready_case2),
1382 : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
1383 :
1384 : #if LIBSPDM_ENABLE_CAPABILITY_CHAL_CAP
1385 : cmocka_unit_test(rsp_respond_if_ready_case3),
1386 : #endif /* LIBSPDM_ENABLE_CAPABILITY_CHAL_CAP*/
1387 :
1388 : #if LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP
1389 : cmocka_unit_test(rsp_respond_if_ready_case4),
1390 : #endif /* LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP*/
1391 :
1392 : #if LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP
1393 : cmocka_unit_test(rsp_respond_if_ready_case5),
1394 : cmocka_unit_test(rsp_respond_if_ready_case6),
1395 : #endif /* LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP*/
1396 :
1397 : #if LIBSPDM_ENABLE_CAPABILITY_PSK_CAP
1398 : cmocka_unit_test(rsp_respond_if_ready_case7),
1399 : cmocka_unit_test(rsp_respond_if_ready_case8),
1400 : #endif /* LIBSPDM_ENABLE_CAPABILITY_PSK_CAP*/
1401 :
1402 : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
1403 : cmocka_unit_test(rsp_respond_if_ready_case9),
1404 : cmocka_unit_test(rsp_respond_if_ready_case10),
1405 : cmocka_unit_test(rsp_respond_if_ready_case11),
1406 : cmocka_unit_test(rsp_respond_if_ready_case12),
1407 : cmocka_unit_test(rsp_respond_if_ready_case13),
1408 : cmocka_unit_test(rsp_respond_if_ready_case14),
1409 : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
1410 :
1411 : };
1412 :
1413 1 : libspdm_test_context_t test_context = {
1414 : LIBSPDM_TEST_CONTEXT_VERSION,
1415 : false,
1416 : };
1417 :
1418 1 : libspdm_setup_test_context (&test_context);
1419 :
1420 1 : return cmocka_run_group_tests(test_cases,
1421 : libspdm_unit_test_group_setup,
1422 : libspdm_unit_test_group_teardown);
1423 : }
1424 : #endif /* LIBSPDM_ENABLE_CAPABILITY_*_CAP */
1425 : #endif /* LIBSPDM_RESPOND_IF_READY_SUPPORT */
|