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_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 : void libspdm_test_responder_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 : void libspdm_test_responder_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 : void libspdm_test_responder_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 : void libspdm_test_responder_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 : void libspdm_test_responder_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 : void libspdm_test_responder_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, false);
759 1 : hash_size = libspdm_get_hash_size (m_libspdm_use_hash_algo);
760 1 : libspdm_set_mem (dummy_buffer, hash_size, (uint8_t)(0xFF));
761 1 : libspdm_secured_message_set_request_finished_key (session_info->secured_message_context,
762 : dummy_buffer, hash_size);
763 1 : libspdm_secured_message_set_session_state (session_info->secured_message_context,
764 : LIBSPDM_SESSION_STATE_HANDSHAKING);
765 :
766 1 : hash_size = libspdm_get_hash_size (m_libspdm_use_hash_algo);
767 1 : hmac_size = libspdm_get_hash_size (m_libspdm_use_hash_algo);
768 1 : ptr = m_libspdm_finish_request.signature;
769 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
770 1 : cert_buffer = (uint8_t *)data;
771 1 : cert_buffer_size = data_size;
772 1 : libspdm_hash_all (m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size, cert_buffer_hash);
773 : /* Transcript.MessageA size is 0*/
774 1 : libspdm_append_managed_buffer (&th_curr, cert_buffer_hash, hash_size);
775 : /* SessionTranscript.MessageK is 0*/
776 1 : libspdm_append_managed_buffer (&th_curr, (uint8_t *)&m_libspdm_finish_request,
777 : sizeof(spdm_finish_request_t));
778 1 : libspdm_set_mem (request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
779 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
780 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
781 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
782 : request_finished_key, hash_size, ptr);
783 :
784 1 : spdm_context->last_spdm_request_size = sizeof(spdm_finish_request_t) + hmac_size;
785 1 : libspdm_copy_mem(spdm_context->last_spdm_request,
786 1 : libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
787 : &m_libspdm_finish_request, m_libspdm_finish_request_size);
788 :
789 : /*RESPOND_IF_READY specific data*/
790 1 : spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
791 1 : libspdm_copy_mem(spdm_context->cache_spdm_request,
792 1 : libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
793 1 : spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
794 1 : spdm_context->error_data.rd_exponent = 1;
795 1 : spdm_context->error_data.rd_tm = 1;
796 1 : spdm_context->error_data.request_code = SPDM_FINISH;
797 1 : spdm_context->error_data.token = LIBSPDM_MY_TEST_TOKEN;
798 :
799 : /*check FINISH_RSP response*/
800 1 : response_size = sizeof(response);
801 1 : status = libspdm_get_response_respond_if_ready(spdm_context,
802 : m_libspdm_respond_if_ready_request6_size,
803 : &m_libspdm_respond_if_ready_request6,
804 : &response_size,
805 : response);
806 1 : assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
807 1 : assert_int_equal (response_size, sizeof(spdm_finish_response_t) + hmac_size);
808 1 : spdm_response = (void *)response;
809 1 : assert_int_equal (spdm_response->header.request_response_code, SPDM_FINISH_RSP);
810 1 : free(data);
811 1 : libspdm_free_session_id (spdm_context, (0xFFFFFFFF));
812 1 : }
813 : #endif /* LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP*/
814 :
815 : /**
816 : * Test 7: receiving a correct RESPOND_IF_READY from the requester, after a
817 : * PSK_EXCHANGE could not be processed.
818 : * Expected behavior: the responder accepts the request and produces a valid PSK_EXCHANGE_RSP
819 : * response message.
820 : **/
821 : #if LIBSPDM_ENABLE_CAPABILITY_PSK_CAP
822 :
823 1 : void libspdm_test_responder_respond_if_ready_case7(void **state) {
824 : libspdm_return_t status;
825 : libspdm_test_context_t *spdm_test_context;
826 : libspdm_context_t *spdm_context;
827 : size_t response_size;
828 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
829 : spdm_psk_exchange_response_t *spdm_response; /*response to the original request (PSK_EXCHANGE_RSP)*/
830 : void *data;
831 : size_t data_size;
832 : uint8_t *ptr;
833 : size_t opaque_psk_exchange_req_size;
834 :
835 1 : spdm_test_context = *state;
836 1 : spdm_context = spdm_test_context->spdm_context;
837 1 : spdm_test_context->case_id = 0x7;
838 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
839 :
840 : /*state for the the original request (PSK_EXCHANGE)*/
841 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
842 1 : spdm_context->local_context.capability.flags = 0;
843 1 : spdm_context->connection_info.capability.flags |=
844 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP |
845 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
846 1 : spdm_context->local_context.capability.flags |=
847 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP |
848 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
849 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
850 1 : spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
851 1 : spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
852 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
853 : m_libspdm_use_measurement_hash_algo;
854 1 : spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
855 1 : spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
856 1 : spdm_context->connection_info.algorithm.key_schedule = m_libspdm_use_key_schedule_algo;
857 :
858 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
859 : SPDM_VERSION_NUMBER_SHIFT_BIT;
860 1 : libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
861 : m_libspdm_use_asym_algo,
862 : &data, &data_size,
863 : NULL, NULL);
864 1 : spdm_context->local_context.local_cert_chain_provision[0] = data;
865 1 : spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
866 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data;
867 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size = data_size;
868 :
869 1 : m_libspdm_psk_exchange_request.psk_hint_length =
870 : (uint16_t)sizeof(LIBSPDM_TEST_PSK_HINT_STRING);
871 1 : m_libspdm_psk_exchange_request.requester_context_length = LIBSPDM_PSK_CONTEXT_LENGTH;
872 1 : opaque_psk_exchange_req_size =
873 1 : libspdm_get_opaque_data_supported_version_data_size (spdm_context);
874 1 : m_libspdm_psk_exchange_request.opaque_length = (uint16_t)opaque_psk_exchange_req_size;
875 1 : m_libspdm_psk_exchange_request.req_session_id = 0xFFFF;
876 1 : ptr = m_libspdm_psk_exchange_request.psk_hint;
877 1 : libspdm_copy_mem(ptr, sizeof(m_libspdm_psk_exchange_request.psk_hint),
878 : LIBSPDM_TEST_PSK_HINT_STRING,
879 : sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
880 1 : ptr += m_libspdm_psk_exchange_request.psk_hint_length;
881 1 : libspdm_get_random_number (LIBSPDM_PSK_CONTEXT_LENGTH, ptr);
882 1 : ptr += m_libspdm_psk_exchange_request.requester_context_length;
883 1 : libspdm_build_opaque_data_supported_version_data (spdm_context, &opaque_psk_exchange_req_size,
884 : ptr);
885 1 : ptr += opaque_psk_exchange_req_size;
886 :
887 1 : spdm_context->last_spdm_request_size = m_libspdm_psk_exchange_request_size;
888 1 : libspdm_copy_mem(spdm_context->last_spdm_request,
889 1 : libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
890 : &m_libspdm_psk_exchange_request, m_libspdm_psk_exchange_request_size);
891 :
892 : /*RESPOND_IF_READY specific data*/
893 1 : spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
894 1 : libspdm_copy_mem(spdm_context->cache_spdm_request,
895 1 : libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
896 1 : spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
897 1 : spdm_context->error_data.rd_exponent = 1;
898 1 : spdm_context->error_data.rd_tm = 1;
899 1 : spdm_context->error_data.request_code = SPDM_PSK_EXCHANGE;
900 1 : spdm_context->error_data.token = LIBSPDM_MY_TEST_TOKEN;
901 :
902 : /*check PSK_EXCHANGE_RSP response*/
903 1 : response_size = sizeof(response);
904 1 : status = libspdm_get_response_respond_if_ready(spdm_context,
905 : m_libspdm_respond_if_ready_request7_size,
906 : &m_libspdm_respond_if_ready_request7,
907 : &response_size,
908 : response);
909 1 : assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
910 1 : assert_int_equal (response_size,
911 : sizeof(spdm_psk_exchange_response_t) + LIBSPDM_PSK_CONTEXT_LENGTH +
912 : libspdm_get_opaque_data_version_selection_data_size(
913 : spdm_context) + libspdm_get_hash_size (m_libspdm_use_hash_algo));
914 1 : assert_int_equal (libspdm_secured_message_get_session_state (spdm_context->session_info[0].
915 : secured_message_context),
916 : LIBSPDM_SESSION_STATE_HANDSHAKING);
917 1 : spdm_response = (void *)response;
918 1 : assert_int_equal (spdm_response->header.request_response_code, SPDM_PSK_EXCHANGE_RSP);
919 1 : assert_int_equal (spdm_response->rsp_session_id, 0xFFFF);
920 1 : free(data);
921 1 : libspdm_free_session_id (spdm_context, (0xFFFFFFFF));
922 1 : }
923 : #endif /* LIBSPDM_ENABLE_CAPABILITY_PSK_CAP*/
924 :
925 : /**
926 : * Test 8: receiving a correct RESPOND_IF_READY from the requester, after a
927 : * PSK_FINISH could not be processed.
928 : * Expected behavior: the responder accepts the request and produces a valid PSK_FINISH_RSP
929 : * response message.
930 : **/
931 : #if LIBSPDM_ENABLE_CAPABILITY_PSK_CAP
932 1 : void libspdm_test_responder_respond_if_ready_case8(void **state) {
933 : libspdm_return_t status;
934 : libspdm_test_context_t *spdm_test_context;
935 : libspdm_context_t *spdm_context;
936 : size_t response_size;
937 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
938 : spdm_psk_finish_response_t *spdm_response; /*response to the original request (FINISH_PSK_RSP)*/
939 : void *data;
940 : size_t data_size;
941 : uint8_t *ptr;
942 : uint8_t dummy_buffer[LIBSPDM_MAX_HASH_SIZE];
943 : uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
944 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
945 : libspdm_session_info_t *session_info;
946 : uint32_t session_id;
947 : uint32_t hash_size;
948 : uint32_t hmac_size;
949 :
950 1 : spdm_test_context = *state;
951 1 : spdm_context = spdm_test_context->spdm_context;
952 1 : spdm_test_context->case_id = 0x8;
953 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
954 :
955 : /*state for the the original request (FINISH)*/
956 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
957 1 : spdm_context->local_context.capability.flags = 0;
958 1 : spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
959 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
960 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
961 1 : spdm_context->local_context.capability.flags |=
962 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
963 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
964 1 : spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
965 1 : spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
966 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
967 : m_libspdm_use_measurement_hash_algo;
968 1 : spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
969 1 : spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
970 :
971 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
972 : SPDM_VERSION_NUMBER_SHIFT_BIT;
973 1 : libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
974 : m_libspdm_use_asym_algo,
975 : &data, &data_size,
976 : NULL, NULL);
977 1 : spdm_context->local_context.local_cert_chain_provision[0] = data;
978 1 : spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
979 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data;
980 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size = data_size;
981 :
982 1 : spdm_context->local_context.mut_auth_requested = 0;
983 :
984 1 : session_id = 0xFFFFFFFF;
985 1 : spdm_context->latest_session_id = session_id;
986 1 : spdm_context->last_spdm_request_session_id_valid = true;
987 1 : spdm_context->last_spdm_request_session_id = session_id;
988 1 : session_info = &spdm_context->session_info[0];
989 1 : libspdm_session_info_init (spdm_context, session_info, session_id, true);
990 1 : libspdm_session_info_set_psk_hint(session_info,
991 : LIBSPDM_TEST_PSK_HINT_STRING,
992 : sizeof(LIBSPDM_TEST_PSK_HINT_STRING));
993 1 : hash_size = libspdm_get_hash_size (m_libspdm_use_hash_algo);
994 1 : libspdm_set_mem (dummy_buffer, hash_size, (uint8_t)(0xFF));
995 1 : libspdm_secured_message_set_request_finished_key (session_info->secured_message_context,
996 : dummy_buffer, hash_size);
997 1 : libspdm_secured_message_set_session_state (session_info->secured_message_context,
998 : LIBSPDM_SESSION_STATE_HANDSHAKING);
999 :
1000 1 : hash_size = libspdm_get_hash_size (m_libspdm_use_hash_algo);
1001 1 : hmac_size = libspdm_get_hash_size (m_libspdm_use_hash_algo);
1002 1 : ptr = m_libspdm_psk_finish_request.verify_data;
1003 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
1004 : /* Transcript.MessageA size is 0
1005 : * SessionTranscript.MessageK is 0*/
1006 1 : libspdm_append_managed_buffer (&th_curr, (uint8_t *)&m_libspdm_psk_finish_request,
1007 : sizeof(spdm_psk_finish_request_t));
1008 1 : libspdm_set_mem (request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
1009 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
1010 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
1011 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
1012 : request_finished_key, hash_size, ptr);
1013 :
1014 1 : spdm_context->last_spdm_request_size = sizeof(spdm_psk_finish_request_t) + hmac_size;
1015 1 : libspdm_copy_mem(spdm_context->last_spdm_request,
1016 1 : libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
1017 : &m_libspdm_psk_finish_request, m_libspdm_psk_finish_request_size);
1018 :
1019 : /*RESPOND_IF_READY specific data*/
1020 1 : spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
1021 1 : libspdm_copy_mem(spdm_context->cache_spdm_request,
1022 1 : libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
1023 1 : spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
1024 1 : spdm_context->error_data.rd_exponent = 1;
1025 1 : spdm_context->error_data.rd_tm = 1;
1026 1 : spdm_context->error_data.request_code = SPDM_PSK_FINISH;
1027 1 : spdm_context->error_data.token = LIBSPDM_MY_TEST_TOKEN;
1028 :
1029 : /*check FINISH_PSK_RSP response*/
1030 1 : response_size = sizeof(response);
1031 1 : status = libspdm_get_response_respond_if_ready(spdm_context,
1032 : m_libspdm_respond_if_ready_request8_size,
1033 : &m_libspdm_respond_if_ready_request8,
1034 : &response_size,
1035 : response);
1036 1 : assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
1037 1 : assert_int_equal (response_size, sizeof(spdm_psk_finish_response_t));
1038 1 : spdm_response = (void *)response;
1039 1 : assert_int_equal (spdm_response->header.request_response_code, SPDM_PSK_FINISH_RSP);
1040 1 : free(data);
1041 1 : libspdm_free_session_id (spdm_context, (0xFFFFFFFF));
1042 1 : }
1043 : #endif /* LIBSPDM_ENABLE_CAPABILITY_PSK_CAP*/
1044 :
1045 : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
1046 :
1047 : /**
1048 : * Test 9:
1049 : * Expected behavior:
1050 : **/
1051 1 : void libspdm_test_responder_respond_if_ready_case9(void **state) {
1052 1 : }
1053 :
1054 : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
1055 :
1056 : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
1057 : /**
1058 : * Test 10: receiving a correct RESPOND_IF_READY from the requester, but the responder is in
1059 : * a Busy state.
1060 : * Expected behavior: the responder accepts the request, but produces an ERROR message
1061 : * indicating the Busy state.
1062 : **/
1063 1 : void libspdm_test_responder_respond_if_ready_case10(void **state) {
1064 : libspdm_return_t status;
1065 : libspdm_test_context_t *spdm_test_context;
1066 : libspdm_context_t *spdm_context;
1067 : size_t response_size;
1068 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1069 : spdm_digest_response_t *spdm_response; /*response to the original request (DIGESTS)*/
1070 :
1071 1 : spdm_test_context = *state;
1072 1 : spdm_context = spdm_test_context->spdm_context;
1073 1 : spdm_test_context->case_id = 0xA;
1074 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_BUSY;
1075 :
1076 : /*state for the the original request (GET_DIGESTS)*/
1077 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1078 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
1079 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
1080 1 : spdm_context->local_context.local_cert_chain_provision[0] = m_libspdm_local_certificate_chain;
1081 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
1082 : sizeof(m_libspdm_local_certificate_chain);
1083 1 : libspdm_set_mem (m_libspdm_local_certificate_chain, sizeof(m_libspdm_local_certificate_chain),
1084 : (uint8_t)(0xFF));
1085 :
1086 1 : spdm_context->last_spdm_request_size = m_libspdm_get_digest_request_size;
1087 1 : libspdm_copy_mem(spdm_context->last_spdm_request,
1088 1 : libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
1089 : &m_libspdm_get_digest_request, m_libspdm_get_digest_request_size);
1090 :
1091 : /*RESPOND_IF_READY specific data*/
1092 1 : spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
1093 1 : libspdm_copy_mem(spdm_context->cache_spdm_request,
1094 1 : libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
1095 1 : spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
1096 1 : spdm_context->error_data.rd_exponent = 1;
1097 1 : spdm_context->error_data.rd_tm = 1;
1098 1 : spdm_context->error_data.request_code = SPDM_GET_DIGESTS;
1099 1 : spdm_context->error_data.token = LIBSPDM_MY_TEST_TOKEN;
1100 :
1101 : /*check ERROR response*/
1102 1 : response_size = sizeof(response);
1103 1 : status = libspdm_get_response_respond_if_ready(spdm_context,
1104 : m_libspdm_respond_if_ready_request1_size,
1105 : &m_libspdm_respond_if_ready_request1,
1106 : &response_size,
1107 : response);
1108 1 : assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
1109 1 : assert_int_equal (response_size, sizeof(spdm_error_response_t));
1110 1 : spdm_response = (void *)response;
1111 1 : assert_int_equal (spdm_response->header.request_response_code, SPDM_ERROR);
1112 1 : assert_int_equal (spdm_response->header.param1, SPDM_ERROR_CODE_BUSY);
1113 1 : assert_int_equal (spdm_response->header.param2, 0);
1114 1 : assert_int_equal (spdm_context->response_state, LIBSPDM_RESPONSE_STATE_BUSY);
1115 1 : }
1116 :
1117 : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
1118 :
1119 : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
1120 : /**
1121 : * Test 11: receiving a correct RESPOND_IF_READY from the requester, but the responder requires
1122 : * resynchronization with the requester.
1123 : * Expected behavior: the responder accepts the request, but produces an ERROR message
1124 : * indicating the NeedResynch state.
1125 : **/
1126 1 : void libspdm_test_responder_respond_if_ready_case11(void **state) {
1127 : libspdm_return_t status;
1128 : libspdm_test_context_t *spdm_test_context;
1129 : libspdm_context_t *spdm_context;
1130 : size_t response_size;
1131 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1132 : spdm_digest_response_t *spdm_response; /*response to the original request (DIGESTS)*/
1133 :
1134 1 : spdm_test_context = *state;
1135 1 : spdm_context = spdm_test_context->spdm_context;
1136 1 : spdm_test_context->case_id = 0xB;
1137 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NEED_RESYNC;
1138 :
1139 : /*state for the the original request (GET_DIGESTS)*/
1140 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1141 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
1142 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
1143 1 : spdm_context->local_context.local_cert_chain_provision[0] = m_libspdm_local_certificate_chain;
1144 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
1145 : sizeof(m_libspdm_local_certificate_chain);
1146 1 : libspdm_set_mem (m_libspdm_local_certificate_chain, sizeof(m_libspdm_local_certificate_chain),
1147 : (uint8_t)(0xFF));
1148 :
1149 1 : spdm_context->last_spdm_request_size = m_libspdm_get_digest_request_size;
1150 1 : libspdm_copy_mem(spdm_context->last_spdm_request,
1151 1 : libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
1152 : &m_libspdm_get_digest_request, m_libspdm_get_digest_request_size);
1153 :
1154 : /*RESPOND_IF_READY specific data*/
1155 1 : spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
1156 1 : libspdm_copy_mem(spdm_context->cache_spdm_request,
1157 1 : libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
1158 1 : spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
1159 1 : spdm_context->error_data.rd_exponent = 1;
1160 1 : spdm_context->error_data.rd_tm = 1;
1161 1 : spdm_context->error_data.request_code = SPDM_GET_DIGESTS;
1162 1 : spdm_context->error_data.token = LIBSPDM_MY_TEST_TOKEN;
1163 :
1164 : /*check ERROR response*/
1165 1 : response_size = sizeof(response);
1166 1 : status = libspdm_get_response_respond_if_ready(spdm_context,
1167 : m_libspdm_respond_if_ready_request1_size,
1168 : &m_libspdm_respond_if_ready_request1,
1169 : &response_size,
1170 : response);
1171 1 : assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
1172 1 : assert_int_equal (response_size, sizeof(spdm_error_response_t));
1173 1 : spdm_response = (void *)response;
1174 1 : assert_int_equal (spdm_response->header.request_response_code, SPDM_ERROR);
1175 1 : assert_int_equal (spdm_response->header.param1, SPDM_ERROR_CODE_REQUEST_RESYNCH);
1176 1 : assert_int_equal (spdm_response->header.param2, 0);
1177 1 : assert_int_equal (spdm_context->response_state, LIBSPDM_RESPONSE_STATE_NEED_RESYNC);
1178 1 : }
1179 :
1180 : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
1181 :
1182 : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
1183 :
1184 : /**
1185 : * Test 12: receiving a correct RESPOND_IF_READY from the requester, but the responder could not
1186 : * produce the response in time.
1187 : * Expected behavior: the responder accepts the request, but produces an ERROR message
1188 : * indicating the ResponseNotReady state, with the same token as the request.
1189 : **/
1190 1 : void libspdm_test_responder_respond_if_ready_case12(void **state) {
1191 : libspdm_return_t status;
1192 : libspdm_test_context_t *spdm_test_context;
1193 : libspdm_context_t *spdm_context;
1194 : size_t response_size;
1195 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1196 : spdm_digest_response_t *spdm_response; /*response to the original request (DIGESTS)*/
1197 : spdm_error_data_response_not_ready_t *error_data;
1198 :
1199 1 : spdm_test_context = *state;
1200 1 : spdm_context = spdm_test_context->spdm_context;
1201 1 : spdm_test_context->case_id = 0xC;
1202 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NOT_READY;
1203 :
1204 : /*state for the the original request (GET_DIGESTS)*/
1205 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1206 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
1207 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
1208 1 : spdm_context->local_context.local_cert_chain_provision[0] = m_libspdm_local_certificate_chain;
1209 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
1210 : sizeof(m_libspdm_local_certificate_chain);
1211 1 : libspdm_set_mem (m_libspdm_local_certificate_chain, sizeof(m_libspdm_local_certificate_chain),
1212 : (uint8_t)(0xFF));
1213 :
1214 1 : spdm_context->last_spdm_request_size = m_libspdm_get_digest_request_size;
1215 1 : libspdm_copy_mem(spdm_context->last_spdm_request,
1216 1 : libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
1217 : &m_libspdm_get_digest_request, m_libspdm_get_digest_request_size);
1218 :
1219 : /*RESPOND_IF_READY specific data*/
1220 1 : spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
1221 1 : libspdm_copy_mem(spdm_context->cache_spdm_request,
1222 1 : libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
1223 1 : spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
1224 1 : spdm_context->error_data.rd_exponent = 1;
1225 1 : spdm_context->error_data.rd_tm = 1;
1226 1 : spdm_context->error_data.request_code = SPDM_GET_DIGESTS;
1227 1 : spdm_context->error_data.token = LIBSPDM_MY_TEST_TOKEN;
1228 :
1229 : /*check ERROR response*/
1230 1 : response_size = sizeof(response);
1231 1 : status = libspdm_get_response_respond_if_ready(spdm_context,
1232 : m_libspdm_respond_if_ready_request1_size,
1233 : &m_libspdm_respond_if_ready_request1,
1234 : &response_size,
1235 : response);
1236 1 : assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
1237 1 : assert_int_equal (response_size,
1238 : sizeof(spdm_error_response_t) + sizeof(spdm_error_data_response_not_ready_t));
1239 1 : spdm_response = (void *)response;
1240 1 : error_data = (spdm_error_data_response_not_ready_t*)(spdm_response + 1);
1241 1 : assert_int_equal (spdm_response->header.request_response_code, SPDM_ERROR);
1242 1 : assert_int_equal (spdm_response->header.param1, SPDM_ERROR_CODE_RESPONSE_NOT_READY);
1243 1 : assert_int_equal (spdm_response->header.param2, 0);
1244 1 : assert_int_equal (spdm_context->response_state, LIBSPDM_RESPONSE_STATE_NOT_READY);
1245 1 : assert_int_equal (error_data->request_code, SPDM_GET_DIGESTS);
1246 1 : assert_int_equal (error_data->token, LIBSPDM_MY_TEST_TOKEN);
1247 1 : }
1248 :
1249 : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
1250 :
1251 : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
1252 :
1253 : /**
1254 : * Test 13: receiving a correct RESPOND_IF_READY from the requester, with the correct original
1255 : * request code, but with a token different from the expected.
1256 : * Expected behavior: the responder refuses the RESPOND_IF_READY message and produces an
1257 : * ERROR message indicating the InvalidRequest.
1258 : **/
1259 1 : void libspdm_test_responder_respond_if_ready_case13(void **state) {
1260 : libspdm_return_t status;
1261 : libspdm_test_context_t *spdm_test_context;
1262 : libspdm_context_t *spdm_context;
1263 : size_t response_size;
1264 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1265 : spdm_digest_response_t *spdm_response; /*response to the original request (DIGESTS)*/
1266 :
1267 1 : spdm_test_context = *state;
1268 1 : spdm_context = spdm_test_context->spdm_context;
1269 1 : spdm_test_context->case_id = 0xD;
1270 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
1271 :
1272 : /*state for the the original request (GET_DIGESTS)*/
1273 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1274 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
1275 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
1276 1 : spdm_context->local_context.local_cert_chain_provision[0] = m_libspdm_local_certificate_chain;
1277 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
1278 : sizeof(m_libspdm_local_certificate_chain);
1279 1 : libspdm_set_mem (m_libspdm_local_certificate_chain, sizeof(m_libspdm_local_certificate_chain),
1280 : (uint8_t)(0xFF));
1281 :
1282 1 : spdm_context->last_spdm_request_size = m_libspdm_get_digest_request_size;
1283 1 : libspdm_copy_mem(spdm_context->last_spdm_request,
1284 1 : libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
1285 : &m_libspdm_get_digest_request, m_libspdm_get_digest_request_size);
1286 :
1287 : /*RESPOND_IF_READY specific data*/
1288 1 : spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
1289 1 : libspdm_copy_mem(spdm_context->cache_spdm_request,
1290 1 : libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
1291 1 : spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
1292 1 : spdm_context->error_data.rd_exponent = 1;
1293 1 : spdm_context->error_data.rd_tm = 1;
1294 1 : spdm_context->error_data.request_code = SPDM_GET_DIGESTS;
1295 1 : spdm_context->error_data.token = LIBSPDM_MY_TEST_TOKEN;
1296 :
1297 : /*check ERROR response*/
1298 1 : response_size = sizeof(response);
1299 1 : status = libspdm_get_response_respond_if_ready(spdm_context,
1300 : m_libspdm_respond_if_ready_request10_size,
1301 : &m_libspdm_respond_if_ready_request10,
1302 : &response_size,
1303 : response);
1304 1 : assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
1305 1 : assert_int_equal (response_size, sizeof(spdm_error_response_t));
1306 1 : spdm_response = (void *)response;
1307 1 : assert_int_equal (spdm_response->header.request_response_code, SPDM_ERROR);
1308 1 : assert_int_equal (spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
1309 1 : assert_int_equal (spdm_response->header.param2, 0);
1310 1 : }
1311 : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
1312 :
1313 : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
1314 : /**
1315 : * Test 14: receiving a correct RESPOND_IF_READY from the requester, with the correct token,
1316 : * but with a request code different from the expected.
1317 : * Expected behavior: the responder refuses the RESPOND_IF_READY message and produces an
1318 : * ERROR message indicating the InvalidRequest.
1319 : **/
1320 1 : void libspdm_test_responder_respond_if_ready_case14(void **state) {
1321 : libspdm_return_t status;
1322 : libspdm_test_context_t *spdm_test_context;
1323 : libspdm_context_t *spdm_context;
1324 : size_t response_size;
1325 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1326 : spdm_digest_response_t *spdm_response; /*response to the original request (DIGESTS)*/
1327 :
1328 1 : spdm_test_context = *state;
1329 1 : spdm_context = spdm_test_context->spdm_context;
1330 1 : spdm_test_context->case_id = 0xE;
1331 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
1332 :
1333 : /*state for the the original request (GET_DIGESTS)*/
1334 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1335 1 : spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
1336 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
1337 1 : spdm_context->local_context.local_cert_chain_provision[0] = m_libspdm_local_certificate_chain;
1338 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
1339 : sizeof(m_libspdm_local_certificate_chain);
1340 1 : libspdm_set_mem (m_libspdm_local_certificate_chain, sizeof(m_libspdm_local_certificate_chain),
1341 : (uint8_t)(0xFF));
1342 :
1343 1 : spdm_context->last_spdm_request_size = m_libspdm_get_digest_request_size;
1344 1 : libspdm_copy_mem(spdm_context->last_spdm_request,
1345 1 : libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context),
1346 : &m_libspdm_get_digest_request, m_libspdm_get_digest_request_size);
1347 :
1348 : /*RESPOND_IF_READY specific data*/
1349 1 : spdm_context->cache_spdm_request_size = spdm_context->last_spdm_request_size;
1350 1 : libspdm_copy_mem(spdm_context->cache_spdm_request,
1351 1 : libspdm_get_scratch_buffer_cache_spdm_request_capacity(spdm_context),
1352 1 : spdm_context->last_spdm_request, spdm_context->last_spdm_request_size);
1353 1 : spdm_context->error_data.rd_exponent = 1;
1354 1 : spdm_context->error_data.rd_tm = 1;
1355 1 : spdm_context->error_data.request_code = SPDM_GET_DIGESTS;
1356 1 : spdm_context->error_data.token = LIBSPDM_MY_TEST_TOKEN;
1357 :
1358 : /*check ERROR response*/
1359 1 : response_size = sizeof(response);
1360 1 : status = libspdm_get_response_respond_if_ready(spdm_context,
1361 : m_libspdm_respond_if_ready_request11_size,
1362 : &m_libspdm_respond_if_ready_request11,
1363 : &response_size,
1364 : response);
1365 1 : assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
1366 1 : assert_int_equal (response_size, sizeof(spdm_error_response_t));
1367 1 : spdm_response = (void *)response;
1368 1 : assert_int_equal (spdm_response->header.request_response_code, SPDM_ERROR);
1369 1 : assert_int_equal (spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
1370 1 : assert_int_equal (spdm_response->header.param2, 0);
1371 1 : }
1372 : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
1373 :
1374 1 : int libspdm_responder_respond_if_ready_test_main(void) {
1375 1 : const struct CMUnitTest spdm_responder_respond_if_ready_tests[] = {
1376 : /* Success Case*/
1377 : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
1378 : cmocka_unit_test(libspdm_test_responder_respond_if_ready_case1),
1379 : cmocka_unit_test(libspdm_test_responder_respond_if_ready_case2),
1380 : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
1381 :
1382 : #if LIBSPDM_ENABLE_CAPABILITY_CHAL_CAP
1383 : cmocka_unit_test(libspdm_test_responder_respond_if_ready_case3),
1384 : #endif /* LIBSPDM_ENABLE_CAPABILITY_CHAL_CAP*/
1385 :
1386 : #if LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP
1387 : cmocka_unit_test(libspdm_test_responder_respond_if_ready_case4),
1388 : #endif /* LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP*/
1389 :
1390 : #if LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP
1391 : cmocka_unit_test(libspdm_test_responder_respond_if_ready_case5),
1392 : cmocka_unit_test(libspdm_test_responder_respond_if_ready_case6),
1393 : #endif /* LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP*/
1394 :
1395 : #if LIBSPDM_ENABLE_CAPABILITY_PSK_CAP
1396 : cmocka_unit_test(libspdm_test_responder_respond_if_ready_case7),
1397 : cmocka_unit_test(libspdm_test_responder_respond_if_ready_case8),
1398 : #endif /* LIBSPDM_ENABLE_CAPABILITY_PSK_CAP*/
1399 :
1400 : #if LIBSPDM_ENABLE_CAPABILITY_CERT_CAP
1401 : cmocka_unit_test(libspdm_test_responder_respond_if_ready_case9),
1402 : cmocka_unit_test(libspdm_test_responder_respond_if_ready_case10),
1403 : cmocka_unit_test(libspdm_test_responder_respond_if_ready_case11),
1404 : cmocka_unit_test(libspdm_test_responder_respond_if_ready_case12),
1405 : cmocka_unit_test(libspdm_test_responder_respond_if_ready_case13),
1406 : cmocka_unit_test(libspdm_test_responder_respond_if_ready_case14),
1407 : #endif /* LIBSPDM_ENABLE_CAPABILITY_CERT_CAP*/
1408 :
1409 : };
1410 :
1411 1 : libspdm_test_context_t test_context = {
1412 : LIBSPDM_TEST_CONTEXT_VERSION,
1413 : false,
1414 : };
1415 :
1416 1 : libspdm_setup_test_context (&test_context);
1417 :
1418 1 : return cmocka_run_group_tests(spdm_responder_respond_if_ready_tests,
1419 : libspdm_unit_test_group_setup,
1420 : libspdm_unit_test_group_teardown);
1421 : }
1422 : #endif /* LIBSPDM_ENABLE_CAPABILITY_*_CAP */
1423 : #endif /* LIBSPDM_RESPOND_IF_READY_SUPPORT */
|