Line data Source code
1 : /**
2 : * Copyright Notice:
3 : * Copyright 2021-2024 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_secured_message_lib.h"
10 :
11 : #pragma pack(1)
12 :
13 : typedef struct {
14 : spdm_message_header_t header;
15 : uint8_t signature[LIBSPDM_MAX_ASYM_KEY_SIZE];
16 : uint8_t verify_data[LIBSPDM_MAX_HASH_SIZE];
17 : } libspdm_finish_request_mine_t;
18 :
19 : #pragma pack()
20 :
21 : libspdm_finish_request_mine_t m_libspdm_finish_request1 = {
22 : { SPDM_MESSAGE_VERSION_11, SPDM_FINISH, 0, 0 },
23 : };
24 : size_t m_libspdm_finish_request1_size = sizeof(m_libspdm_finish_request1);
25 :
26 : libspdm_finish_request_mine_t m_libspdm_finish_request3 = {
27 : { SPDM_MESSAGE_VERSION_11, SPDM_FINISH, 1, 0 },
28 : };
29 : size_t m_libspdm_finish_request3_size = sizeof(m_libspdm_finish_request3);
30 :
31 : libspdm_finish_request_mine_t m_libspdm_finish_request4 = {
32 : { SPDM_MESSAGE_VERSION_11, SPDM_FINISH, 1, 0xFF },
33 : };
34 : size_t m_libspdm_finish_request4_size = sizeof(m_libspdm_finish_request4);
35 :
36 : libspdm_finish_request_mine_t m_libspdm_finish_request5 = {
37 : { SPDM_MESSAGE_VERSION_11, SPDM_FINISH, 1, 10 },
38 : };
39 : size_t m_libspdm_finish_request5_size = sizeof(m_libspdm_finish_request5);
40 :
41 : libspdm_finish_request_mine_t m_libspdm_finish_request6 = {
42 : { SPDM_MESSAGE_VERSION_11, SPDM_FINISH, 6, 10 },
43 : };
44 : size_t m_libspdm_finish_request6_size = sizeof(m_libspdm_finish_request6);
45 :
46 : libspdm_finish_request_mine_t m_libspdm_finish_request7 = {
47 : { SPDM_MESSAGE_VERSION_11, SPDM_FINISH, 1, 3 },
48 : };
49 : size_t m_libspdm_finish_request7_size = sizeof(m_libspdm_finish_request7);
50 :
51 : uint8_t m_dummy_buffer[LIBSPDM_MAX_HASH_SIZE];
52 :
53 : #if LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP
54 :
55 : static libspdm_th_managed_buffer_t th_curr;
56 :
57 27 : void libspdm_secured_message_set_request_finished_key(
58 : void *spdm_secured_message_context, const void *key, size_t key_size)
59 : {
60 : libspdm_secured_message_context_t *secured_message_context;
61 :
62 27 : secured_message_context = spdm_secured_message_context;
63 27 : LIBSPDM_ASSERT(key_size == secured_message_context->hash_size);
64 27 : libspdm_copy_mem(secured_message_context->handshake_secret.request_finished_key,
65 : sizeof(secured_message_context->handshake_secret.request_finished_key),
66 : key, secured_message_context->hash_size);
67 27 : }
68 :
69 : /**
70 : * Test 1: receiving a correct FINISH message from the requester with a
71 : * correct MAC, no signature (no mutual authentication), and 'handshake in
72 : * the clear'.
73 : * Expected behavior: the responder accepts the request and produces a valid
74 : * FINISH_RSP response message.
75 : **/
76 1 : void libspdm_test_responder_finish_case1(void **state)
77 : {
78 : libspdm_return_t status;
79 : libspdm_test_context_t *spdm_test_context;
80 : libspdm_context_t *spdm_context;
81 : size_t response_size;
82 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
83 : spdm_finish_response_t *spdm_response;
84 : void *data1;
85 : size_t data_size1;
86 : uint8_t *ptr;
87 : uint8_t *cert_buffer;
88 : size_t cert_buffer_size;
89 : uint8_t cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
90 : uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
91 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
92 : libspdm_session_info_t *session_info;
93 : uint32_t session_id;
94 : uint32_t hash_size;
95 : uint32_t hmac_size;
96 :
97 1 : spdm_test_context = *state;
98 1 : spdm_context = spdm_test_context->spdm_context;
99 1 : spdm_test_context->case_id = 0x1;
100 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
101 : SPDM_VERSION_NUMBER_SHIFT_BIT;
102 1 : spdm_context->connection_info.connection_state =
103 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
104 1 : spdm_context->connection_info.capability.flags |=
105 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
106 1 : spdm_context->local_context.capability.flags |=
107 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
108 1 : spdm_context->connection_info.algorithm.base_hash_algo =
109 : m_libspdm_use_hash_algo;
110 1 : spdm_context->connection_info.algorithm.base_asym_algo =
111 : m_libspdm_use_asym_algo;
112 1 : spdm_context->connection_info.algorithm.measurement_spec =
113 : m_libspdm_use_measurement_spec;
114 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
115 : m_libspdm_use_measurement_hash_algo;
116 1 : spdm_context->connection_info.algorithm.dhe_named_group =
117 : m_libspdm_use_dhe_algo;
118 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
119 : m_libspdm_use_aead_algo;
120 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
121 : m_libspdm_use_asym_algo, &data1,
122 : &data_size1, NULL, NULL);
123 1 : spdm_context->local_context.local_cert_chain_provision[0] = data1;
124 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
125 : data_size1;
126 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data1;
127 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size =
128 : data_size1;
129 :
130 1 : libspdm_reset_message_a(spdm_context);
131 1 : spdm_context->local_context.mut_auth_requested = 0;
132 :
133 1 : session_id = 0xFFFFFFFF;
134 1 : spdm_context->latest_session_id = session_id;
135 1 : session_info = &spdm_context->session_info[0];
136 1 : libspdm_session_info_init(spdm_context, session_info, session_id, false);
137 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
138 1 : libspdm_set_mem(m_dummy_buffer, hash_size, (uint8_t)(0xFF));
139 1 : libspdm_secured_message_set_request_finished_key(
140 : session_info->secured_message_context, m_dummy_buffer,
141 : hash_size);
142 1 : libspdm_secured_message_set_session_state(
143 : session_info->secured_message_context,
144 : LIBSPDM_SESSION_STATE_HANDSHAKING);
145 :
146 1 : spdm_context->connection_info.capability.flags |=
147 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
148 1 : spdm_context->local_context.capability.flags |=
149 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
150 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
151 1 : hmac_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
152 1 : ptr = m_libspdm_finish_request1.signature;
153 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
154 1 : cert_buffer = (uint8_t *)data1;
155 1 : cert_buffer_size = data_size1;
156 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
157 : cert_buffer_hash);
158 : /* transcript.message_a size is 0*/
159 1 : libspdm_append_managed_buffer(&th_curr, cert_buffer_hash, hash_size);
160 : /* session_transcript.message_k is 0*/
161 1 : libspdm_append_managed_buffer(&th_curr, (uint8_t *)&m_libspdm_finish_request1,
162 : sizeof(spdm_finish_request_t));
163 1 : libspdm_set_mem(request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
164 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
165 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
166 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
167 : request_finished_key, hash_size, ptr);
168 1 : m_libspdm_finish_request1_size = sizeof(spdm_finish_request_t) + hmac_size;
169 1 : response_size = sizeof(response);
170 1 : status = libspdm_get_response_finish(spdm_context,
171 : m_libspdm_finish_request1_size,
172 : &m_libspdm_finish_request1,
173 : &response_size, response);
174 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
175 1 : assert_int_equal(response_size,
176 : sizeof(spdm_finish_response_t) + hmac_size);
177 1 : spdm_response = (void *)response;
178 1 : assert_int_equal(spdm_response->header.request_response_code,
179 : SPDM_FINISH_RSP);
180 1 : free(data1);
181 1 : }
182 :
183 : /**
184 : * Test 2:
185 : * Expected behavior:
186 : **/
187 1 : void libspdm_test_responder_finish_case2(void **state)
188 : {
189 1 : }
190 :
191 : /**
192 : * Test 3: receiving a correct FINISH from the requester, but the
193 : * responder is in a Busy state.
194 : * Expected behavior: the responder accepts the request, but produces an
195 : * ERROR message indicating the Busy state.
196 : **/
197 1 : void libspdm_test_responder_finish_case3(void **state)
198 : {
199 : libspdm_return_t status;
200 : libspdm_test_context_t *spdm_test_context;
201 : libspdm_context_t *spdm_context;
202 : size_t response_size;
203 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
204 : spdm_finish_response_t *spdm_response;
205 : void *data1;
206 : size_t data_size1;
207 : uint8_t *ptr;
208 : uint8_t *cert_buffer;
209 : size_t cert_buffer_size;
210 : uint8_t cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
211 : uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
212 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
213 : libspdm_session_info_t *session_info;
214 : uint32_t session_id;
215 : uint32_t hash_size;
216 : uint32_t hmac_size;
217 :
218 1 : spdm_test_context = *state;
219 1 : spdm_context = spdm_test_context->spdm_context;
220 1 : spdm_test_context->case_id = 0x3;
221 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
222 : SPDM_VERSION_NUMBER_SHIFT_BIT;
223 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_BUSY;
224 1 : spdm_context->connection_info.connection_state =
225 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
226 1 : spdm_context->connection_info.capability.flags |=
227 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
228 1 : spdm_context->local_context.capability.flags |=
229 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
230 1 : spdm_context->connection_info.algorithm.base_hash_algo =
231 : m_libspdm_use_hash_algo;
232 1 : spdm_context->connection_info.algorithm.base_asym_algo =
233 : m_libspdm_use_asym_algo;
234 1 : spdm_context->connection_info.algorithm.measurement_spec =
235 : m_libspdm_use_measurement_spec;
236 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
237 : m_libspdm_use_measurement_hash_algo;
238 1 : spdm_context->connection_info.algorithm.dhe_named_group =
239 : m_libspdm_use_dhe_algo;
240 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
241 : m_libspdm_use_aead_algo;
242 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
243 : m_libspdm_use_asym_algo, &data1,
244 : &data_size1, NULL, NULL);
245 1 : spdm_context->local_context.local_cert_chain_provision[0] = data1;
246 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
247 : data_size1;
248 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data1;
249 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size =
250 : data_size1;
251 :
252 1 : libspdm_reset_message_a(spdm_context);
253 1 : spdm_context->local_context.mut_auth_requested = 0;
254 :
255 1 : session_id = 0xFFFFFFFF;
256 1 : spdm_context->latest_session_id = session_id;
257 1 : session_info = &spdm_context->session_info[0];
258 1 : libspdm_session_info_init(spdm_context, session_info, session_id, false);
259 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
260 1 : libspdm_set_mem(m_dummy_buffer, hash_size, (uint8_t)(0xFF));
261 1 : libspdm_secured_message_set_request_finished_key(
262 : session_info->secured_message_context, m_dummy_buffer,
263 : hash_size);
264 1 : libspdm_secured_message_set_session_state(
265 : session_info->secured_message_context,
266 : LIBSPDM_SESSION_STATE_HANDSHAKING);
267 :
268 1 : spdm_context->connection_info.capability.flags |=
269 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
270 1 : spdm_context->local_context.capability.flags |=
271 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
272 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
273 1 : hmac_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
274 1 : ptr = m_libspdm_finish_request1.signature;
275 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
276 1 : cert_buffer = (uint8_t *)data1;
277 1 : cert_buffer_size = data_size1;
278 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
279 : cert_buffer_hash);
280 : /* transcript.message_a size is 0*/
281 1 : libspdm_append_managed_buffer(&th_curr, cert_buffer_hash, hash_size);
282 : /* session_transcript.message_k is 0*/
283 1 : libspdm_append_managed_buffer(&th_curr, (uint8_t *)&m_libspdm_finish_request1,
284 : sizeof(spdm_finish_request_t));
285 1 : libspdm_set_mem(request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
286 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
287 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
288 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
289 : request_finished_key, hash_size, ptr);
290 1 : m_libspdm_finish_request1_size = sizeof(spdm_finish_request_t) + hmac_size;
291 1 : response_size = sizeof(response);
292 1 : status = libspdm_get_response_finish(spdm_context,
293 : m_libspdm_finish_request1_size,
294 : &m_libspdm_finish_request1,
295 : &response_size, response);
296 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
297 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
298 1 : spdm_response = (void *)response;
299 1 : assert_int_equal(spdm_response->header.request_response_code,
300 : SPDM_ERROR);
301 1 : assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_BUSY);
302 1 : assert_int_equal(spdm_response->header.param2, 0);
303 1 : assert_int_equal(spdm_context->response_state,
304 : LIBSPDM_RESPONSE_STATE_BUSY);
305 1 : free(data1);
306 1 : }
307 :
308 : /**
309 : * Test 4: receiving a correct FINISH from the requester, but the responder
310 : * requires resynchronization with the requester.
311 : * Expected behavior: the responder accepts the request, but produces an
312 : * ERROR message indicating the NeedResynch state.
313 : **/
314 1 : void libspdm_test_responder_finish_case4(void **state)
315 : {
316 : libspdm_return_t status;
317 : libspdm_test_context_t *spdm_test_context;
318 : libspdm_context_t *spdm_context;
319 : size_t response_size;
320 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
321 : spdm_finish_response_t *spdm_response;
322 : void *data1;
323 : size_t data_size1;
324 : uint8_t *ptr;
325 : uint8_t *cert_buffer;
326 : size_t cert_buffer_size;
327 : uint8_t cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
328 : uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
329 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
330 : libspdm_session_info_t *session_info;
331 : uint32_t session_id;
332 : uint32_t hash_size;
333 : uint32_t hmac_size;
334 :
335 1 : spdm_test_context = *state;
336 1 : spdm_context = spdm_test_context->spdm_context;
337 1 : spdm_test_context->case_id = 0x4;
338 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
339 : SPDM_VERSION_NUMBER_SHIFT_BIT;
340 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NEED_RESYNC;
341 1 : spdm_context->connection_info.connection_state =
342 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
343 1 : spdm_context->connection_info.capability.flags |=
344 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
345 1 : spdm_context->local_context.capability.flags |=
346 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
347 1 : spdm_context->connection_info.algorithm.base_hash_algo =
348 : m_libspdm_use_hash_algo;
349 1 : spdm_context->connection_info.algorithm.base_asym_algo =
350 : m_libspdm_use_asym_algo;
351 1 : spdm_context->connection_info.algorithm.measurement_spec =
352 : m_libspdm_use_measurement_spec;
353 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
354 : m_libspdm_use_measurement_hash_algo;
355 1 : spdm_context->connection_info.algorithm.dhe_named_group =
356 : m_libspdm_use_dhe_algo;
357 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
358 : m_libspdm_use_aead_algo;
359 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
360 : m_libspdm_use_asym_algo, &data1,
361 : &data_size1, NULL, NULL);
362 1 : spdm_context->local_context.local_cert_chain_provision[0] = data1;
363 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
364 : data_size1;
365 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data1;
366 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size =
367 : data_size1;
368 :
369 1 : libspdm_reset_message_a(spdm_context);
370 1 : spdm_context->local_context.mut_auth_requested = 0;
371 :
372 1 : session_id = 0xFFFFFFFF;
373 1 : spdm_context->latest_session_id = session_id;
374 1 : session_info = &spdm_context->session_info[0];
375 1 : libspdm_session_info_init(spdm_context, session_info, session_id, false);
376 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
377 1 : libspdm_set_mem(m_dummy_buffer, hash_size, (uint8_t)(0xFF));
378 1 : libspdm_secured_message_set_request_finished_key(
379 : session_info->secured_message_context, m_dummy_buffer,
380 : hash_size);
381 1 : libspdm_secured_message_set_session_state(
382 : session_info->secured_message_context,
383 : LIBSPDM_SESSION_STATE_HANDSHAKING);
384 :
385 1 : spdm_context->connection_info.capability.flags |=
386 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
387 1 : spdm_context->local_context.capability.flags |=
388 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
389 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
390 1 : hmac_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
391 1 : ptr = m_libspdm_finish_request1.signature;
392 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
393 1 : cert_buffer = (uint8_t *)data1;
394 1 : cert_buffer_size = data_size1;
395 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
396 : cert_buffer_hash);
397 : /* transcript.message_a size is 0*/
398 1 : libspdm_append_managed_buffer(&th_curr, cert_buffer_hash, hash_size);
399 : /* session_transcript.message_k is 0*/
400 1 : libspdm_append_managed_buffer(&th_curr, (uint8_t *)&m_libspdm_finish_request1,
401 : sizeof(spdm_finish_request_t));
402 1 : libspdm_set_mem(request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
403 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
404 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
405 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
406 : request_finished_key, hash_size, ptr);
407 1 : m_libspdm_finish_request1_size = sizeof(spdm_finish_request_t) + hmac_size;
408 1 : response_size = sizeof(response);
409 1 : status = libspdm_get_response_finish(spdm_context,
410 : m_libspdm_finish_request1_size,
411 : &m_libspdm_finish_request1,
412 : &response_size, response);
413 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
414 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
415 1 : spdm_response = (void *)response;
416 1 : assert_int_equal(spdm_response->header.request_response_code,
417 : SPDM_ERROR);
418 1 : assert_int_equal(spdm_response->header.param1,
419 : SPDM_ERROR_CODE_REQUEST_RESYNCH);
420 1 : assert_int_equal(spdm_response->header.param2, 0);
421 1 : assert_int_equal(spdm_context->response_state,
422 : LIBSPDM_RESPONSE_STATE_NEED_RESYNC);
423 1 : free(data1);
424 1 : }
425 :
426 : #if LIBSPDM_RESPOND_IF_READY_SUPPORT
427 : /**
428 : * Test 5: receiving a correct FINISH from the requester, but the responder
429 : * could not produce the response in time.
430 : * Expected behavior: the responder accepts the request, but produces an
431 : * ERROR message indicating the ResponseNotReady state.
432 : **/
433 1 : void libspdm_test_responder_finish_case5(void **state)
434 : {
435 : libspdm_return_t status;
436 : libspdm_test_context_t *spdm_test_context;
437 : libspdm_context_t *spdm_context;
438 : size_t response_size;
439 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
440 : spdm_finish_response_t *spdm_response;
441 : void *data1;
442 : size_t data_size1;
443 : uint8_t *ptr;
444 : uint8_t *cert_buffer;
445 : size_t cert_buffer_size;
446 : uint8_t cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
447 : uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
448 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
449 : libspdm_session_info_t *session_info;
450 : uint32_t session_id;
451 : uint32_t hash_size;
452 : uint32_t hmac_size;
453 : spdm_error_data_response_not_ready_t *error_data;
454 :
455 1 : spdm_test_context = *state;
456 1 : spdm_context = spdm_test_context->spdm_context;
457 1 : spdm_test_context->case_id = 0x5;
458 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
459 : SPDM_VERSION_NUMBER_SHIFT_BIT;
460 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NOT_READY;
461 1 : spdm_context->connection_info.connection_state =
462 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
463 1 : spdm_context->connection_info.capability.flags |=
464 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
465 1 : spdm_context->local_context.capability.flags |=
466 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
467 1 : spdm_context->connection_info.algorithm.base_hash_algo =
468 : m_libspdm_use_hash_algo;
469 1 : spdm_context->connection_info.algorithm.base_asym_algo =
470 : m_libspdm_use_asym_algo;
471 1 : spdm_context->connection_info.algorithm.measurement_spec =
472 : m_libspdm_use_measurement_spec;
473 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
474 : m_libspdm_use_measurement_hash_algo;
475 1 : spdm_context->connection_info.algorithm.dhe_named_group =
476 : m_libspdm_use_dhe_algo;
477 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
478 : m_libspdm_use_aead_algo;
479 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
480 : m_libspdm_use_asym_algo, &data1,
481 : &data_size1, NULL, NULL);
482 1 : spdm_context->local_context.local_cert_chain_provision[0] = data1;
483 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
484 : data_size1;
485 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data1;
486 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size =
487 : data_size1;
488 :
489 1 : libspdm_reset_message_a(spdm_context);
490 1 : spdm_context->local_context.mut_auth_requested = 0;
491 :
492 1 : session_id = 0xFFFFFFFF;
493 1 : spdm_context->latest_session_id = session_id;
494 1 : session_info = &spdm_context->session_info[0];
495 1 : libspdm_session_info_init(spdm_context, session_info, session_id, false);
496 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
497 1 : libspdm_set_mem(m_dummy_buffer, hash_size, (uint8_t)(0xFF));
498 1 : libspdm_secured_message_set_request_finished_key(
499 : session_info->secured_message_context, m_dummy_buffer,
500 : hash_size);
501 1 : libspdm_secured_message_set_session_state(
502 : session_info->secured_message_context,
503 : LIBSPDM_SESSION_STATE_HANDSHAKING);
504 :
505 1 : spdm_context->connection_info.capability.flags |=
506 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
507 1 : spdm_context->local_context.capability.flags |=
508 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
509 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
510 1 : hmac_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
511 1 : ptr = m_libspdm_finish_request1.signature;
512 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
513 1 : cert_buffer = (uint8_t *)data1;
514 1 : cert_buffer_size = data_size1;
515 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
516 : cert_buffer_hash);
517 : /* transcript.message_a size is 0*/
518 1 : libspdm_append_managed_buffer(&th_curr, cert_buffer_hash, hash_size);
519 : /* session_transcript.message_k is 0*/
520 1 : libspdm_append_managed_buffer(&th_curr, (uint8_t *)&m_libspdm_finish_request1,
521 : sizeof(spdm_finish_request_t));
522 1 : libspdm_set_mem(request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
523 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
524 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
525 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
526 : request_finished_key, hash_size, ptr);
527 1 : m_libspdm_finish_request1_size = sizeof(spdm_finish_request_t) + hmac_size;
528 1 : response_size = sizeof(response);
529 1 : status = libspdm_get_response_finish(spdm_context,
530 : m_libspdm_finish_request1_size,
531 : &m_libspdm_finish_request1,
532 : &response_size, response);
533 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
534 1 : assert_int_equal(response_size,
535 : sizeof(spdm_error_response_t) +
536 : sizeof(spdm_error_data_response_not_ready_t));
537 1 : spdm_response = (void *)response;
538 1 : error_data =
539 : (spdm_error_data_response_not_ready_t *)(spdm_response + 1);
540 1 : assert_int_equal(spdm_response->header.request_response_code,
541 : SPDM_ERROR);
542 1 : assert_int_equal(spdm_response->header.param1,
543 : SPDM_ERROR_CODE_RESPONSE_NOT_READY);
544 1 : assert_int_equal(spdm_response->header.param2, 0);
545 1 : assert_int_equal(spdm_context->response_state,
546 : LIBSPDM_RESPONSE_STATE_NOT_READY);
547 1 : assert_int_equal(error_data->request_code, SPDM_FINISH);
548 1 : free(data1);
549 1 : }
550 : #endif /* LIBSPDM_RESPOND_IF_READY_SUPPORT */
551 :
552 : /**
553 : * Test 6: receiving a correct FINISH from the requester, but the responder
554 : * is not set no receive a FINISH message because previous messages (namely,
555 : * GET_CAPABILITIES, NEGOTIATE_ALGORITHMS or GET_DIGESTS) have not been
556 : * received.
557 : * Expected behavior: the responder rejects the request, and produces an
558 : * ERROR message indicating the UnexpectedRequest.
559 : **/
560 1 : void libspdm_test_responder_finish_case6(void **state)
561 : {
562 : libspdm_return_t status;
563 : libspdm_test_context_t *spdm_test_context;
564 : libspdm_context_t *spdm_context;
565 : size_t response_size;
566 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
567 : spdm_finish_response_t *spdm_response;
568 : void *data1;
569 : size_t data_size1;
570 : uint8_t *ptr;
571 : uint8_t *cert_buffer;
572 : size_t cert_buffer_size;
573 : uint8_t cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
574 : uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
575 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
576 : libspdm_session_info_t *session_info;
577 : uint32_t session_id;
578 : uint32_t hash_size;
579 : uint32_t hmac_size;
580 :
581 1 : spdm_test_context = *state;
582 1 : spdm_context = spdm_test_context->spdm_context;
583 1 : spdm_test_context->case_id = 0x6;
584 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
585 : SPDM_VERSION_NUMBER_SHIFT_BIT;
586 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
587 1 : spdm_context->connection_info.connection_state =
588 : LIBSPDM_CONNECTION_STATE_NOT_STARTED;
589 1 : spdm_context->connection_info.capability.flags |=
590 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
591 1 : spdm_context->local_context.capability.flags |=
592 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
593 1 : spdm_context->connection_info.algorithm.base_hash_algo =
594 : m_libspdm_use_hash_algo;
595 1 : spdm_context->connection_info.algorithm.base_asym_algo =
596 : m_libspdm_use_asym_algo;
597 1 : spdm_context->connection_info.algorithm.measurement_spec =
598 : m_libspdm_use_measurement_spec;
599 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
600 : m_libspdm_use_measurement_hash_algo;
601 1 : spdm_context->connection_info.algorithm.dhe_named_group =
602 : m_libspdm_use_dhe_algo;
603 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
604 : m_libspdm_use_aead_algo;
605 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
606 : m_libspdm_use_asym_algo, &data1,
607 : &data_size1, NULL, NULL);
608 1 : spdm_context->local_context.local_cert_chain_provision[0] = data1;
609 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
610 : data_size1;
611 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data1;
612 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size =
613 : data_size1;
614 :
615 1 : libspdm_reset_message_a(spdm_context);
616 1 : spdm_context->local_context.mut_auth_requested = 0;
617 :
618 1 : session_id = 0xFFFFFFFF;
619 1 : spdm_context->latest_session_id = session_id;
620 1 : session_info = &spdm_context->session_info[0];
621 1 : libspdm_session_info_init(spdm_context, session_info, session_id, false);
622 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
623 1 : libspdm_set_mem(m_dummy_buffer, hash_size, (uint8_t)(0xFF));
624 1 : libspdm_secured_message_set_request_finished_key(
625 : session_info->secured_message_context, m_dummy_buffer,
626 : hash_size);
627 1 : libspdm_secured_message_set_session_state(
628 : session_info->secured_message_context,
629 : LIBSPDM_SESSION_STATE_HANDSHAKING);
630 :
631 1 : spdm_context->connection_info.capability.flags |=
632 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
633 1 : spdm_context->local_context.capability.flags |=
634 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
635 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
636 1 : hmac_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
637 1 : ptr = m_libspdm_finish_request1.signature;
638 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
639 1 : cert_buffer = (uint8_t *)data1;
640 1 : cert_buffer_size = data_size1;
641 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
642 : cert_buffer_hash);
643 : /* transcript.message_a size is 0*/
644 1 : libspdm_append_managed_buffer(&th_curr, cert_buffer_hash, hash_size);
645 : /* session_transcript.message_k is 0*/
646 1 : libspdm_append_managed_buffer(&th_curr, (uint8_t *)&m_libspdm_finish_request1,
647 : sizeof(spdm_finish_request_t));
648 1 : libspdm_set_mem(request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
649 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
650 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
651 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
652 : request_finished_key, hash_size, ptr);
653 1 : m_libspdm_finish_request1_size = sizeof(spdm_finish_request_t) + hmac_size;
654 1 : response_size = sizeof(response);
655 1 : status = libspdm_get_response_finish(spdm_context,
656 : m_libspdm_finish_request1_size,
657 : &m_libspdm_finish_request1,
658 : &response_size, response);
659 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
660 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
661 1 : spdm_response = (void *)response;
662 1 : assert_int_equal(spdm_response->header.request_response_code,
663 : SPDM_ERROR);
664 1 : assert_int_equal(spdm_response->header.param1,
665 : SPDM_ERROR_CODE_UNEXPECTED_REQUEST);
666 1 : assert_int_equal(spdm_response->header.param2, 0);
667 1 : free(data1);
668 1 : }
669 :
670 1 : void libspdm_test_responder_finish_case7(void **state)
671 : {
672 : libspdm_return_t status;
673 : libspdm_test_context_t *spdm_test_context;
674 : libspdm_context_t *spdm_context;
675 : size_t response_size;
676 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
677 : spdm_finish_response_t *spdm_response;
678 : void *data1;
679 : size_t data_size1;
680 : uint8_t *ptr;
681 : uint8_t *cert_buffer;
682 : size_t cert_buffer_size;
683 : uint8_t cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
684 : uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
685 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
686 : libspdm_session_info_t *session_info;
687 : uint32_t session_id;
688 : uint32_t hash_size;
689 : uint32_t hmac_size;
690 :
691 1 : spdm_test_context = *state;
692 1 : spdm_context = spdm_test_context->spdm_context;
693 1 : spdm_test_context->case_id = 0x7;
694 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
695 : SPDM_VERSION_NUMBER_SHIFT_BIT;
696 1 : spdm_context->connection_info.connection_state =
697 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
698 1 : spdm_context->connection_info.capability.flags |=
699 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
700 1 : spdm_context->local_context.capability.flags |=
701 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
702 1 : spdm_context->connection_info.algorithm.base_hash_algo =
703 : m_libspdm_use_hash_algo;
704 1 : spdm_context->connection_info.algorithm.base_asym_algo =
705 : m_libspdm_use_asym_algo;
706 1 : spdm_context->connection_info.algorithm.measurement_spec =
707 : m_libspdm_use_measurement_spec;
708 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
709 : m_libspdm_use_measurement_hash_algo;
710 1 : spdm_context->connection_info.algorithm.dhe_named_group =
711 : m_libspdm_use_dhe_algo;
712 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
713 : m_libspdm_use_aead_algo;
714 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
715 : m_libspdm_use_asym_algo, &data1,
716 : &data_size1, NULL, NULL);
717 1 : spdm_context->local_context.local_cert_chain_provision[0] = data1;
718 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
719 : data_size1;
720 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data1;
721 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size =
722 : data_size1;
723 :
724 1 : libspdm_reset_message_a(spdm_context);
725 1 : spdm_context->local_context.mut_auth_requested = 0;
726 :
727 1 : session_id = 0xFFFFFFFF;
728 1 : spdm_context->latest_session_id = session_id;
729 1 : session_info = &spdm_context->session_info[0];
730 1 : libspdm_session_info_init(spdm_context, session_info, session_id, false);
731 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
732 1 : libspdm_set_mem(m_dummy_buffer, hash_size, (uint8_t)(0xFF));
733 1 : libspdm_secured_message_set_request_finished_key(
734 : session_info->secured_message_context, m_dummy_buffer,
735 : hash_size);
736 1 : libspdm_secured_message_set_session_state(
737 : session_info->secured_message_context,
738 : LIBSPDM_SESSION_STATE_HANDSHAKING);
739 :
740 1 : spdm_context->connection_info.capability.flags |=
741 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
742 1 : spdm_context->local_context.capability.flags |=
743 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
744 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
745 1 : hmac_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
746 1 : ptr = m_libspdm_finish_request1.signature;
747 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
748 1 : cert_buffer = (uint8_t *)data1;
749 1 : cert_buffer_size = data_size1;
750 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
751 : session_info->session_transcript.message_m.buffer_size =
752 : session_info->session_transcript.message_m.max_buffer_size;
753 : spdm_context->transcript.message_b.buffer_size =
754 : spdm_context->transcript.message_b.max_buffer_size;
755 : spdm_context->transcript.message_c.buffer_size =
756 : spdm_context->transcript.message_c.max_buffer_size;
757 : spdm_context->transcript.message_mut_b.buffer_size =
758 : spdm_context->transcript.message_mut_b.max_buffer_size;
759 : spdm_context->transcript.message_mut_c.buffer_size =
760 : spdm_context->transcript.message_mut_c.max_buffer_size;
761 : #endif
762 :
763 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
764 : cert_buffer_hash);
765 : /* transcript.message_a size is 0*/
766 1 : libspdm_append_managed_buffer(&th_curr, cert_buffer_hash, hash_size);
767 : /* session_transcript.message_k is 0*/
768 1 : libspdm_append_managed_buffer(&th_curr, (uint8_t *)&m_libspdm_finish_request1,
769 : sizeof(spdm_finish_request_t));
770 1 : libspdm_set_mem(request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
771 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
772 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
773 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
774 : request_finished_key, hash_size, ptr);
775 1 : m_libspdm_finish_request1_size = sizeof(spdm_finish_request_t) + hmac_size;
776 1 : response_size = sizeof(response);
777 1 : status = libspdm_get_response_finish(spdm_context,
778 : m_libspdm_finish_request1_size,
779 : &m_libspdm_finish_request1,
780 : &response_size, response);
781 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
782 1 : assert_int_equal(response_size,
783 : sizeof(spdm_finish_response_t) + hmac_size);
784 1 : spdm_response = (void *)response;
785 1 : assert_int_equal(spdm_response->header.request_response_code,
786 : SPDM_FINISH_RSP);
787 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
788 : assert_int_equal(session_info->session_transcript.message_m.buffer_size, 0);
789 : assert_int_equal(spdm_context->transcript.message_b.buffer_size, 0);
790 : assert_int_equal(spdm_context->transcript.message_c.buffer_size, 0);
791 : assert_int_equal(spdm_context->transcript.message_mut_b.buffer_size, 0);
792 : assert_int_equal(spdm_context->transcript.message_mut_c.buffer_size, 0);
793 : #endif
794 :
795 1 : free(data1);
796 1 : }
797 :
798 : /**
799 : * Test 8: receiving a correct FINISH message from the requester with
800 : * correct MAC and signature (with mutual authentication), and 'handshake in
801 : * the clear'.
802 : * Expected behavior: the responder accepts the request and produces a valid
803 : * FINISH_RSP response message.
804 : **/
805 1 : void libspdm_test_responder_finish_case8(void **state)
806 : {
807 : libspdm_return_t status;
808 : libspdm_test_context_t *spdm_test_context;
809 : libspdm_context_t *spdm_context;
810 : size_t response_size;
811 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
812 : spdm_finish_response_t *spdm_response;
813 : void *data1;
814 : size_t data_size1;
815 : void *data2;
816 : size_t data_size2;
817 : uint8_t *ptr;
818 : uint8_t *cert_buffer;
819 : size_t cert_buffer_size;
820 : uint8_t cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
821 : uint8_t req_cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
822 : uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
823 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
824 : libspdm_session_info_t *session_info;
825 : uint32_t session_id;
826 : uint32_t hash_size;
827 : uint32_t hmac_size;
828 : size_t req_asym_signature_size;
829 :
830 1 : spdm_test_context = *state;
831 1 : spdm_context = spdm_test_context->spdm_context;
832 1 : spdm_test_context->case_id = 0x8;
833 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
834 : SPDM_VERSION_NUMBER_SHIFT_BIT;
835 1 : spdm_context->connection_info.connection_state =
836 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
837 1 : spdm_context->connection_info.capability.flags |=
838 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
839 1 : spdm_context->local_context.capability.flags |=
840 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
841 1 : spdm_context->connection_info.algorithm.base_hash_algo =
842 : m_libspdm_use_hash_algo;
843 1 : spdm_context->connection_info.algorithm.base_asym_algo =
844 : m_libspdm_use_asym_algo;
845 1 : spdm_context->connection_info.algorithm.req_base_asym_alg =
846 : m_libspdm_use_req_asym_algo;
847 1 : spdm_context->connection_info.algorithm.measurement_spec =
848 : m_libspdm_use_measurement_spec;
849 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
850 : m_libspdm_use_measurement_hash_algo;
851 1 : spdm_context->connection_info.algorithm.dhe_named_group =
852 : m_libspdm_use_dhe_algo;
853 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
854 : m_libspdm_use_aead_algo;
855 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
856 : m_libspdm_use_asym_algo, &data1,
857 : &data_size1, NULL, NULL);
858 1 : spdm_context->local_context.local_cert_chain_provision[0] = data1;
859 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
860 : data_size1;
861 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data1;
862 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size =
863 : data_size1;
864 :
865 1 : libspdm_reset_message_a(spdm_context);
866 1 : spdm_context->local_context.mut_auth_requested = 1;
867 1 : libspdm_read_requester_public_certificate_chain(m_libspdm_use_hash_algo,
868 : m_libspdm_use_req_asym_algo, &data2,
869 : &data_size2, NULL, NULL);
870 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
871 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
872 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
873 : data2, data_size2);
874 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
875 : data_size2;
876 : #else
877 1 : libspdm_hash_all(
878 : spdm_context->connection_info.algorithm.base_hash_algo,
879 : data2, data_size2,
880 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
881 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
882 1 : libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
883 1 : libspdm_get_leaf_cert_public_key_from_cert_chain(
884 : spdm_context->connection_info.algorithm.base_hash_algo,
885 1 : spdm_context->connection_info.algorithm.req_base_asym_alg,
886 : data2,
887 : data_size2,
888 : &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
889 : #endif
890 1 : spdm_context->connection_info.peer_used_cert_chain_slot_id = 0;
891 :
892 1 : session_id = 0xFFFFFFFF;
893 1 : spdm_context->latest_session_id = session_id;
894 1 : session_info = &spdm_context->session_info[0];
895 1 : libspdm_session_info_init(spdm_context, session_info, session_id, false);
896 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
897 1 : libspdm_set_mem(m_dummy_buffer, hash_size, (uint8_t)(0xFF));
898 1 : libspdm_secured_message_set_request_finished_key(
899 : session_info->secured_message_context, m_dummy_buffer,
900 : hash_size);
901 1 : libspdm_secured_message_set_session_state(
902 : session_info->secured_message_context,
903 : LIBSPDM_SESSION_STATE_HANDSHAKING);
904 1 : session_info->mut_auth_requested = 1;
905 :
906 1 : spdm_context->connection_info.capability.flags |=
907 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
908 1 : spdm_context->local_context.capability.flags |=
909 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
910 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
911 1 : hmac_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
912 1 : req_asym_signature_size =
913 1 : libspdm_get_req_asym_signature_size(m_libspdm_use_req_asym_algo);
914 1 : ptr = m_libspdm_finish_request3.signature;
915 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
916 1 : cert_buffer = (uint8_t *)data1;
917 1 : cert_buffer_size = data_size1;
918 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
919 : cert_buffer_hash);
920 1 : cert_buffer = (uint8_t *)data2;
921 1 : cert_buffer_size = data_size2;
922 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
923 : req_cert_buffer_hash);
924 : /* transcript.message_a size is 0*/
925 1 : libspdm_append_managed_buffer(&th_curr, cert_buffer_hash, hash_size);
926 : /* session_transcript.message_k is 0*/
927 1 : libspdm_append_managed_buffer(&th_curr, req_cert_buffer_hash, hash_size);
928 1 : libspdm_append_managed_buffer(&th_curr, (uint8_t *)&m_libspdm_finish_request3,
929 : sizeof(spdm_finish_request_t));
930 : #if LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP
931 1 : libspdm_requester_data_sign(
932 : #if LIBSPDM_HAL_PASS_SPDM_CONTEXT
933 : spdm_context,
934 : #endif
935 1 : m_libspdm_finish_request3.header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT, SPDM_FINISH,
936 : m_libspdm_use_req_asym_algo, m_libspdm_use_hash_algo,
937 1 : false, libspdm_get_managed_buffer(&th_curr),
938 : libspdm_get_managed_buffer_size(&th_curr),
939 : ptr, &req_asym_signature_size);
940 : #endif
941 1 : libspdm_append_managed_buffer(&th_curr, ptr, req_asym_signature_size);
942 1 : ptr += req_asym_signature_size;
943 1 : libspdm_set_mem(request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
944 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
945 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
946 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
947 : request_finished_key, hash_size, ptr);
948 1 : m_libspdm_finish_request3_size = sizeof(spdm_finish_request_t) +
949 1 : req_asym_signature_size + hmac_size;
950 1 : response_size = sizeof(response);
951 1 : status = libspdm_get_response_finish(spdm_context,
952 : m_libspdm_finish_request3_size,
953 : &m_libspdm_finish_request3,
954 : &response_size, response);
955 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
956 1 : assert_int_equal(response_size,
957 : sizeof(spdm_finish_response_t) + hmac_size);
958 1 : spdm_response = (void *)response;
959 1 : assert_int_equal(spdm_response->header.request_response_code,
960 : SPDM_FINISH_RSP);
961 1 : free(data1);
962 1 : free(data2);
963 1 : }
964 :
965 : /**
966 : * Test 9: receiving a correct FINISH message from the requester, but the
967 : * responder has no capabilities for key exchange.
968 : * Expected behavior: the responder refuses the FINISH message and produces
969 : * an ERROR message indicating the UnsupportedRequest.
970 : **/
971 1 : void libspdm_test_responder_finish_case9(void **state)
972 : {
973 : libspdm_return_t status;
974 : libspdm_test_context_t *spdm_test_context;
975 : libspdm_context_t *spdm_context;
976 : size_t response_size;
977 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
978 : spdm_finish_response_t *spdm_response;
979 : void *data1;
980 : size_t data_size1;
981 : uint8_t *ptr;
982 : uint8_t *cert_buffer;
983 : size_t cert_buffer_size;
984 : uint8_t cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
985 : uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
986 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
987 : libspdm_session_info_t *session_info;
988 : uint32_t session_id;
989 : uint32_t hash_size;
990 : uint32_t hmac_size;
991 :
992 1 : spdm_test_context = *state;
993 1 : spdm_context = spdm_test_context->spdm_context;
994 1 : spdm_test_context->case_id = 0x9;
995 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
996 : SPDM_VERSION_NUMBER_SHIFT_BIT;
997 1 : spdm_context->connection_info.connection_state =
998 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
999 1 : spdm_context->connection_info.capability.flags = 0;
1000 1 : spdm_context->local_context.capability.flags = 0;
1001 1 : spdm_context->connection_info.capability.flags |=
1002 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
1003 : /* no key exchange capabilities (responder)*/
1004 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1005 : m_libspdm_use_hash_algo;
1006 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1007 : m_libspdm_use_asym_algo;
1008 1 : spdm_context->connection_info.algorithm.measurement_spec =
1009 : m_libspdm_use_measurement_spec;
1010 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
1011 : m_libspdm_use_measurement_hash_algo;
1012 1 : spdm_context->connection_info.algorithm.dhe_named_group =
1013 : m_libspdm_use_dhe_algo;
1014 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
1015 : m_libspdm_use_aead_algo;
1016 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
1017 : m_libspdm_use_asym_algo, &data1,
1018 : &data_size1, NULL, NULL);
1019 1 : spdm_context->local_context.local_cert_chain_provision[0] = data1;
1020 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
1021 : data_size1;
1022 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data1;
1023 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size =
1024 : data_size1;
1025 :
1026 1 : libspdm_reset_message_a(spdm_context);
1027 1 : spdm_context->local_context.mut_auth_requested = 0;
1028 :
1029 1 : session_id = 0xFFFFFFFF;
1030 1 : spdm_context->latest_session_id = session_id;
1031 1 : session_info = &spdm_context->session_info[0];
1032 1 : libspdm_session_info_init(spdm_context, session_info, session_id, false);
1033 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
1034 1 : libspdm_set_mem(m_dummy_buffer, hash_size, (uint8_t)(0xFF));
1035 1 : libspdm_secured_message_set_request_finished_key(
1036 : session_info->secured_message_context, m_dummy_buffer,
1037 : hash_size);
1038 1 : libspdm_secured_message_set_session_state(
1039 : session_info->secured_message_context,
1040 : LIBSPDM_SESSION_STATE_HANDSHAKING);
1041 :
1042 1 : spdm_context->connection_info.capability.flags |=
1043 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
1044 1 : spdm_context->local_context.capability.flags |=
1045 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
1046 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
1047 1 : hmac_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
1048 1 : ptr = m_libspdm_finish_request1.signature;
1049 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
1050 1 : cert_buffer = (uint8_t *)data1;
1051 1 : cert_buffer_size = data_size1;
1052 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
1053 : cert_buffer_hash);
1054 : /* transcript.message_a size is 0*/
1055 1 : libspdm_append_managed_buffer(&th_curr, cert_buffer_hash, hash_size);
1056 : /* session_transcript.message_k is 0*/
1057 1 : libspdm_append_managed_buffer(&th_curr, (uint8_t *)&m_libspdm_finish_request1,
1058 : sizeof(spdm_finish_request_t));
1059 1 : libspdm_set_mem(request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
1060 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
1061 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
1062 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
1063 : request_finished_key, hash_size, ptr);
1064 1 : m_libspdm_finish_request1_size = sizeof(spdm_finish_request_t) + hmac_size;
1065 1 : response_size = sizeof(response);
1066 1 : status = libspdm_get_response_finish(spdm_context,
1067 : m_libspdm_finish_request1_size,
1068 : &m_libspdm_finish_request1,
1069 : &response_size, response);
1070 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1071 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
1072 1 : spdm_response = (void *)response;
1073 1 : assert_int_equal(spdm_response->header.request_response_code,
1074 : SPDM_ERROR);
1075 1 : assert_int_equal(spdm_response->header.param1,
1076 : SPDM_ERROR_CODE_UNSUPPORTED_REQUEST);
1077 1 : assert_int_equal(spdm_response->header.param2, SPDM_FINISH);
1078 1 : free(data1);
1079 1 : }
1080 :
1081 : /**
1082 : * Test 10: receiving a correct FINISH message from the requester, but the
1083 : * responder is not correctly setup by not initializing a session during
1084 : * KEY_EXCHANGE.
1085 : * Expected behavior: the responder refuses the FINISH message and produces
1086 : * an ERROR message indicating the UnsupportedRequest.
1087 : **/
1088 1 : void libspdm_test_responder_finish_case10(void **state)
1089 : {
1090 : libspdm_return_t status;
1091 : libspdm_test_context_t *spdm_test_context;
1092 : libspdm_context_t *spdm_context;
1093 : size_t response_size;
1094 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1095 : spdm_finish_response_t *spdm_response;
1096 : void *data1;
1097 : size_t data_size1;
1098 : uint8_t *ptr;
1099 : uint8_t *cert_buffer;
1100 : size_t cert_buffer_size;
1101 : uint8_t cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
1102 : uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
1103 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
1104 : libspdm_session_info_t *session_info;
1105 : uint32_t session_id;
1106 : uint32_t hash_size;
1107 : uint32_t hmac_size;
1108 :
1109 1 : spdm_test_context = *state;
1110 1 : spdm_context = spdm_test_context->spdm_context;
1111 1 : spdm_test_context->case_id = 0xA;
1112 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
1113 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1114 1 : spdm_context->connection_info.connection_state =
1115 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1116 1 : spdm_context->connection_info.capability.flags |=
1117 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
1118 1 : spdm_context->local_context.capability.flags |=
1119 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
1120 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1121 : m_libspdm_use_hash_algo;
1122 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1123 : m_libspdm_use_asym_algo;
1124 1 : spdm_context->connection_info.algorithm.measurement_spec =
1125 : m_libspdm_use_measurement_spec;
1126 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
1127 : m_libspdm_use_measurement_hash_algo;
1128 1 : spdm_context->connection_info.algorithm.dhe_named_group =
1129 : m_libspdm_use_dhe_algo;
1130 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
1131 : m_libspdm_use_aead_algo;
1132 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
1133 : m_libspdm_use_asym_algo, &data1,
1134 : &data_size1, NULL, NULL);
1135 1 : spdm_context->local_context.local_cert_chain_provision[0] = data1;
1136 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
1137 : data_size1;
1138 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data1;
1139 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size =
1140 : data_size1;
1141 :
1142 1 : libspdm_reset_message_a(spdm_context);
1143 1 : spdm_context->local_context.mut_auth_requested = 0;
1144 :
1145 1 : session_id = 0xFFFFFFFF;
1146 1 : spdm_context->latest_session_id = session_id;
1147 1 : session_info = &spdm_context->session_info[0];
1148 1 : libspdm_session_info_init(spdm_context, session_info, session_id, false);
1149 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
1150 1 : libspdm_set_mem(m_dummy_buffer, hash_size, (uint8_t)(0xFF));
1151 1 : libspdm_secured_message_set_request_finished_key(
1152 : session_info->secured_message_context, m_dummy_buffer,
1153 : hash_size);
1154 1 : libspdm_secured_message_set_session_state(
1155 : session_info->secured_message_context,
1156 : LIBSPDM_SESSION_STATE_NOT_STARTED);
1157 :
1158 1 : spdm_context->connection_info.capability.flags |=
1159 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
1160 1 : spdm_context->local_context.capability.flags |=
1161 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
1162 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
1163 1 : hmac_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
1164 1 : ptr = m_libspdm_finish_request1.signature;
1165 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
1166 1 : cert_buffer = (uint8_t *)data1;
1167 1 : cert_buffer_size = data_size1;
1168 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
1169 : cert_buffer_hash);
1170 : /* transcript.message_a size is 0*/
1171 1 : libspdm_append_managed_buffer(&th_curr, cert_buffer_hash, hash_size);
1172 : /* session_transcript.message_k is 0*/
1173 1 : libspdm_append_managed_buffer(&th_curr, (uint8_t *)&m_libspdm_finish_request1,
1174 : sizeof(spdm_finish_request_t));
1175 1 : libspdm_set_mem(request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
1176 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
1177 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
1178 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
1179 : request_finished_key, hash_size, ptr);
1180 1 : m_libspdm_finish_request1_size = sizeof(spdm_finish_request_t) + hmac_size;
1181 1 : response_size = sizeof(response);
1182 1 : status = libspdm_get_response_finish(spdm_context,
1183 : m_libspdm_finish_request1_size,
1184 : &m_libspdm_finish_request1,
1185 : &response_size, response);
1186 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1187 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
1188 1 : spdm_response = (void *)response;
1189 1 : assert_int_equal(spdm_response->header.request_response_code,
1190 : SPDM_ERROR);
1191 1 : assert_int_equal(spdm_response->header.param1,
1192 : SPDM_ERROR_CODE_UNEXPECTED_REQUEST);
1193 1 : assert_int_equal(spdm_response->header.param2, 0);
1194 1 : free(data1);
1195 1 : }
1196 :
1197 : /**
1198 : * Test 11: receiving a FINISH message from the requester with an incorrect
1199 : * MAC (all-zero).
1200 : * Expected behavior: the responder refuses the FINISH message and produces
1201 : * an ERROR message indicating the DecryptError.
1202 : **/
1203 1 : void libspdm_test_responder_finish_case11(void **state)
1204 : {
1205 : libspdm_return_t status;
1206 : libspdm_test_context_t *spdm_test_context;
1207 : libspdm_context_t *spdm_context;
1208 : size_t response_size;
1209 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1210 : spdm_finish_response_t *spdm_response;
1211 : void *data1;
1212 : size_t data_size1;
1213 : uint8_t *ptr;
1214 : libspdm_session_info_t *session_info;
1215 : uint32_t session_id;
1216 : uint32_t hash_size;
1217 : uint32_t hmac_size;
1218 :
1219 1 : spdm_test_context = *state;
1220 1 : spdm_context = spdm_test_context->spdm_context;
1221 1 : spdm_test_context->case_id = 0xB;
1222 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
1223 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1224 1 : spdm_context->connection_info.connection_state =
1225 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1226 1 : spdm_context->connection_info.capability.flags |=
1227 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
1228 1 : spdm_context->local_context.capability.flags |=
1229 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
1230 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1231 : m_libspdm_use_hash_algo;
1232 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1233 : m_libspdm_use_asym_algo;
1234 1 : spdm_context->connection_info.algorithm.measurement_spec =
1235 : m_libspdm_use_measurement_spec;
1236 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
1237 : m_libspdm_use_measurement_hash_algo;
1238 1 : spdm_context->connection_info.algorithm.dhe_named_group =
1239 : m_libspdm_use_dhe_algo;
1240 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
1241 : m_libspdm_use_aead_algo;
1242 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
1243 : m_libspdm_use_asym_algo, &data1,
1244 : &data_size1, NULL, NULL);
1245 1 : spdm_context->local_context.local_cert_chain_provision[0] = data1;
1246 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
1247 : data_size1;
1248 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data1;
1249 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size =
1250 : data_size1;
1251 :
1252 1 : libspdm_reset_message_a(spdm_context);
1253 1 : spdm_context->local_context.mut_auth_requested = 0;
1254 :
1255 1 : session_id = 0xFFFFFFFF;
1256 1 : spdm_context->latest_session_id = session_id;
1257 1 : session_info = &spdm_context->session_info[0];
1258 1 : libspdm_session_info_init(spdm_context, session_info, session_id, false);
1259 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
1260 1 : libspdm_set_mem(m_dummy_buffer, hash_size, (uint8_t)(0xFF));
1261 1 : libspdm_secured_message_set_request_finished_key(
1262 : session_info->secured_message_context, m_dummy_buffer,
1263 : hash_size);
1264 1 : libspdm_secured_message_set_session_state(
1265 : session_info->secured_message_context,
1266 : LIBSPDM_SESSION_STATE_HANDSHAKING);
1267 :
1268 1 : spdm_context->connection_info.capability.flags |=
1269 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
1270 1 : spdm_context->local_context.capability.flags |=
1271 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
1272 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
1273 1 : hmac_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
1274 1 : ptr = m_libspdm_finish_request1.signature;
1275 1 : libspdm_set_mem(ptr, hmac_size, (uint8_t)(0x00)); /*all-zero MAC*/
1276 1 : m_libspdm_finish_request1_size = sizeof(spdm_finish_request_t) + hmac_size;
1277 1 : response_size = sizeof(response);
1278 1 : status = libspdm_get_response_finish(spdm_context,
1279 : m_libspdm_finish_request1_size,
1280 : &m_libspdm_finish_request1,
1281 : &response_size, response);
1282 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1283 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
1284 1 : spdm_response = (void *)response;
1285 1 : assert_int_equal(spdm_response->header.request_response_code,
1286 : SPDM_ERROR);
1287 1 : assert_int_equal(spdm_response->header.param1,
1288 : SPDM_ERROR_CODE_DECRYPT_ERROR);
1289 1 : assert_int_equal(spdm_response->header.param2, 0);
1290 1 : free(data1);
1291 1 : }
1292 :
1293 : /**
1294 : * Test 12: receiving a FINISH message from the requester with an incorrect
1295 : * MAC (arbitrary).
1296 : * Expected behavior: the responder refuses the FINISH message and produces
1297 : * an ERROR message indicating the DecryptError.
1298 : **/
1299 1 : void libspdm_test_responder_finish_case12(void **state)
1300 : {
1301 : libspdm_return_t status;
1302 : libspdm_test_context_t *spdm_test_context;
1303 : libspdm_context_t *spdm_context;
1304 : size_t response_size;
1305 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1306 : spdm_finish_response_t *spdm_response;
1307 : void *data1;
1308 : size_t data_size1;
1309 : uint8_t *ptr;
1310 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
1311 : uint8_t zero_data[LIBSPDM_MAX_HASH_SIZE];
1312 : libspdm_session_info_t *session_info;
1313 : uint32_t session_id;
1314 : uint32_t hash_size;
1315 : uint32_t hmac_size;
1316 :
1317 1 : spdm_test_context = *state;
1318 1 : spdm_context = spdm_test_context->spdm_context;
1319 1 : spdm_test_context->case_id = 0xC;
1320 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
1321 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1322 1 : spdm_context->connection_info.connection_state =
1323 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1324 1 : spdm_context->connection_info.capability.flags |=
1325 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
1326 1 : spdm_context->local_context.capability.flags |=
1327 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
1328 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1329 : m_libspdm_use_hash_algo;
1330 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1331 : m_libspdm_use_asym_algo;
1332 1 : spdm_context->connection_info.algorithm.measurement_spec =
1333 : m_libspdm_use_measurement_spec;
1334 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
1335 : m_libspdm_use_measurement_hash_algo;
1336 1 : spdm_context->connection_info.algorithm.dhe_named_group =
1337 : m_libspdm_use_dhe_algo;
1338 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
1339 : m_libspdm_use_aead_algo;
1340 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
1341 : m_libspdm_use_asym_algo, &data1,
1342 : &data_size1, NULL, NULL);
1343 1 : spdm_context->local_context.local_cert_chain_provision[0] = data1;
1344 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
1345 : data_size1;
1346 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data1;
1347 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size =
1348 : data_size1;
1349 :
1350 1 : libspdm_reset_message_a(spdm_context);
1351 1 : spdm_context->local_context.mut_auth_requested = 0;
1352 :
1353 1 : session_id = 0xFFFFFFFF;
1354 1 : spdm_context->latest_session_id = session_id;
1355 1 : session_info = &spdm_context->session_info[0];
1356 1 : libspdm_session_info_init(spdm_context, session_info, session_id, false);
1357 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
1358 1 : libspdm_set_mem(m_dummy_buffer, hash_size, (uint8_t)(0xFF));
1359 1 : libspdm_secured_message_set_request_finished_key(
1360 : session_info->secured_message_context, m_dummy_buffer,
1361 : hash_size);
1362 1 : libspdm_secured_message_set_session_state(
1363 : session_info->secured_message_context,
1364 : LIBSPDM_SESSION_STATE_HANDSHAKING);
1365 :
1366 1 : spdm_context->connection_info.capability.flags |=
1367 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
1368 1 : spdm_context->local_context.capability.flags |=
1369 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
1370 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
1371 1 : hmac_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
1372 1 : ptr = m_libspdm_finish_request1.signature;
1373 : /*arbitrary MAC*/
1374 1 : libspdm_set_mem(request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
1375 1 : libspdm_set_mem(zero_data, hash_size, (uint8_t)(0x00));
1376 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, zero_data, hash_size,
1377 : request_finished_key, hash_size, ptr);
1378 1 : m_libspdm_finish_request1_size = sizeof(spdm_finish_request_t) + hmac_size;
1379 1 : response_size = sizeof(response);
1380 1 : status = libspdm_get_response_finish(spdm_context,
1381 : m_libspdm_finish_request1_size,
1382 : &m_libspdm_finish_request1,
1383 : &response_size, response);
1384 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1385 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
1386 1 : spdm_response = (void *)response;
1387 1 : assert_int_equal(spdm_response->header.request_response_code,
1388 : SPDM_ERROR);
1389 1 : assert_int_equal(spdm_response->header.param1,
1390 : SPDM_ERROR_CODE_DECRYPT_ERROR);
1391 1 : assert_int_equal(spdm_response->header.param2, 0);
1392 1 : free(data1);
1393 1 : }
1394 :
1395 : /**
1396 : * Test 13:
1397 : * Expected behavior:
1398 : **/
1399 1 : void libspdm_test_responder_finish_case13(void **state)
1400 : {
1401 1 : }
1402 :
1403 : /**
1404 : * Test 14: receiving a FINISH message from the requester with an incorrect
1405 : * MAC size (only the correct first half of the MAC).
1406 : * Expected behavior: the responder refuses the FINISH message and produces
1407 : * an ERROR message indicating the InvalidRequest.
1408 : **/
1409 1 : void libspdm_test_responder_finish_case14(void **state)
1410 : {
1411 : libspdm_return_t status;
1412 : libspdm_test_context_t *spdm_test_context;
1413 : libspdm_context_t *spdm_context;
1414 : size_t response_size;
1415 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1416 : spdm_finish_response_t *spdm_response;
1417 : void *data1;
1418 : size_t data_size1;
1419 : uint8_t *ptr;
1420 : uint8_t *cert_buffer;
1421 : size_t cert_buffer_size;
1422 : uint8_t cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
1423 : uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
1424 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
1425 : libspdm_session_info_t *session_info;
1426 : uint32_t session_id;
1427 : uint32_t hash_size;
1428 : uint32_t hmac_size;
1429 :
1430 1 : spdm_test_context = *state;
1431 1 : spdm_context = spdm_test_context->spdm_context;
1432 1 : spdm_test_context->case_id = 0xE;
1433 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
1434 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1435 1 : spdm_context->connection_info.connection_state =
1436 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1437 1 : spdm_context->connection_info.capability.flags |=
1438 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
1439 1 : spdm_context->local_context.capability.flags |=
1440 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
1441 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1442 : m_libspdm_use_hash_algo;
1443 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1444 : m_libspdm_use_asym_algo;
1445 1 : spdm_context->connection_info.algorithm.measurement_spec =
1446 : m_libspdm_use_measurement_spec;
1447 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
1448 : m_libspdm_use_measurement_hash_algo;
1449 1 : spdm_context->connection_info.algorithm.dhe_named_group =
1450 : m_libspdm_use_dhe_algo;
1451 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
1452 : m_libspdm_use_aead_algo;
1453 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
1454 : m_libspdm_use_asym_algo, &data1,
1455 : &data_size1, NULL, NULL);
1456 1 : spdm_context->local_context.local_cert_chain_provision[0] = data1;
1457 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
1458 : data_size1;
1459 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data1;
1460 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size =
1461 : data_size1;
1462 :
1463 1 : libspdm_reset_message_a(spdm_context);
1464 1 : spdm_context->local_context.mut_auth_requested = 0;
1465 :
1466 1 : session_id = 0xFFFFFFFF;
1467 1 : spdm_context->latest_session_id = session_id;
1468 1 : session_info = &spdm_context->session_info[0];
1469 1 : libspdm_session_info_init(spdm_context, session_info, session_id, false);
1470 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
1471 1 : libspdm_set_mem(m_dummy_buffer, hash_size, (uint8_t)(0xFF));
1472 1 : libspdm_secured_message_set_request_finished_key(
1473 : session_info->secured_message_context, m_dummy_buffer,
1474 : hash_size);
1475 1 : libspdm_secured_message_set_session_state(
1476 : session_info->secured_message_context,
1477 : LIBSPDM_SESSION_STATE_HANDSHAKING);
1478 :
1479 1 : spdm_context->connection_info.capability.flags |=
1480 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
1481 1 : spdm_context->local_context.capability.flags |=
1482 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
1483 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
1484 1 : hmac_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
1485 1 : ptr = m_libspdm_finish_request1.signature;
1486 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
1487 1 : cert_buffer = (uint8_t *)data1;
1488 1 : cert_buffer_size = data_size1;
1489 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
1490 : cert_buffer_hash);
1491 : /* transcript.message_a size is 0*/
1492 1 : libspdm_append_managed_buffer(&th_curr, cert_buffer_hash, hash_size);
1493 : /* session_transcript.message_k is 0*/
1494 1 : libspdm_append_managed_buffer(&th_curr, (uint8_t *)&m_libspdm_finish_request1,
1495 : sizeof(spdm_finish_request_t));
1496 1 : libspdm_set_mem(request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
1497 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
1498 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
1499 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
1500 : request_finished_key, hash_size, ptr);
1501 1 : libspdm_set_mem(ptr + hmac_size/2, hmac_size/2, (uint8_t) 0x00); /* half HMAC size*/
1502 1 : m_libspdm_finish_request1_size = sizeof(spdm_finish_request_t) + hmac_size/2;
1503 1 : response_size = sizeof(response);
1504 1 : status = libspdm_get_response_finish(spdm_context,
1505 : m_libspdm_finish_request1_size,
1506 : &m_libspdm_finish_request1,
1507 : &response_size, response);
1508 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1509 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
1510 1 : spdm_response = (void *)response;
1511 1 : assert_int_equal(spdm_response->header.request_response_code,
1512 : SPDM_ERROR);
1513 1 : assert_int_equal(spdm_response->header.param1,
1514 : SPDM_ERROR_CODE_INVALID_REQUEST);
1515 1 : assert_int_equal(spdm_response->header.param2, 0);
1516 1 : free(data1);
1517 1 : }
1518 :
1519 : /**
1520 : * Test 15: receiving a FINISH message from the requester with an incorrect
1521 : * signature (all-zero), but a correct MAC.
1522 : * Expected behavior: the responder refuses the FINISH message and produces
1523 : * an ERROR message indicating the DecryptError.
1524 : **/
1525 1 : void libspdm_test_responder_finish_case15(void **state)
1526 : {
1527 : libspdm_return_t status;
1528 : libspdm_test_context_t *spdm_test_context;
1529 : libspdm_context_t *spdm_context;
1530 : size_t response_size;
1531 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1532 : spdm_finish_response_t *spdm_response;
1533 : void *data1;
1534 : size_t data_size1;
1535 : void *data2;
1536 : size_t data_size2;
1537 : uint8_t *ptr;
1538 : uint8_t *cert_buffer;
1539 : size_t cert_buffer_size;
1540 : uint8_t cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
1541 : uint8_t req_cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
1542 : uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
1543 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
1544 : libspdm_session_info_t *session_info;
1545 : uint32_t session_id;
1546 : uint32_t hash_size;
1547 : uint32_t hmac_size;
1548 : size_t req_asym_signature_size;
1549 :
1550 1 : spdm_test_context = *state;
1551 1 : spdm_context = spdm_test_context->spdm_context;
1552 1 : spdm_test_context->case_id = 0xF;
1553 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
1554 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1555 1 : spdm_context->connection_info.connection_state =
1556 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1557 1 : spdm_context->connection_info.capability.flags |=
1558 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
1559 1 : spdm_context->local_context.capability.flags |=
1560 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
1561 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1562 : m_libspdm_use_hash_algo;
1563 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1564 : m_libspdm_use_asym_algo;
1565 1 : spdm_context->connection_info.algorithm.req_base_asym_alg =
1566 : m_libspdm_use_req_asym_algo;
1567 1 : spdm_context->connection_info.algorithm.measurement_spec =
1568 : m_libspdm_use_measurement_spec;
1569 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
1570 : m_libspdm_use_measurement_hash_algo;
1571 1 : spdm_context->connection_info.algorithm.dhe_named_group =
1572 : m_libspdm_use_dhe_algo;
1573 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
1574 : m_libspdm_use_aead_algo;
1575 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
1576 : m_libspdm_use_asym_algo, &data1,
1577 : &data_size1, NULL, NULL);
1578 1 : spdm_context->local_context.local_cert_chain_provision[0] = data1;
1579 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
1580 : data_size1;
1581 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data1;
1582 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size =
1583 : data_size1;
1584 :
1585 1 : libspdm_reset_message_a(spdm_context);
1586 1 : spdm_context->local_context.mut_auth_requested = 1;
1587 1 : libspdm_read_requester_public_certificate_chain(m_libspdm_use_hash_algo,
1588 : m_libspdm_use_req_asym_algo, &data2,
1589 : &data_size2, NULL, NULL);
1590 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1591 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
1592 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
1593 : data2, data_size2);
1594 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
1595 : data_size2;
1596 : #endif
1597 :
1598 1 : session_id = 0xFFFFFFFF;
1599 1 : spdm_context->latest_session_id = session_id;
1600 1 : session_info = &spdm_context->session_info[0];
1601 1 : libspdm_session_info_init(spdm_context, session_info, session_id, false);
1602 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
1603 1 : libspdm_set_mem(m_dummy_buffer, hash_size, (uint8_t)(0xFF));
1604 1 : libspdm_secured_message_set_request_finished_key(
1605 : session_info->secured_message_context, m_dummy_buffer,
1606 : hash_size);
1607 1 : libspdm_secured_message_set_session_state(
1608 : session_info->secured_message_context,
1609 : LIBSPDM_SESSION_STATE_HANDSHAKING);
1610 1 : session_info->mut_auth_requested = 1;
1611 :
1612 1 : spdm_context->connection_info.capability.flags |=
1613 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
1614 1 : spdm_context->local_context.capability.flags |=
1615 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
1616 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
1617 1 : hmac_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
1618 1 : req_asym_signature_size =
1619 1 : libspdm_get_req_asym_signature_size(m_libspdm_use_req_asym_algo);
1620 1 : ptr = m_libspdm_finish_request3.signature;
1621 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
1622 1 : cert_buffer = (uint8_t *)data1;
1623 1 : cert_buffer_size = data_size1;
1624 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
1625 : cert_buffer_hash);
1626 1 : cert_buffer = (uint8_t *)data2;
1627 1 : cert_buffer_size = data_size2;
1628 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
1629 : req_cert_buffer_hash);
1630 : /* transcript.message_a size is 0*/
1631 1 : libspdm_append_managed_buffer(&th_curr, cert_buffer_hash, hash_size);
1632 : /* session_transcript.message_k is 0*/
1633 1 : libspdm_append_managed_buffer(&th_curr, req_cert_buffer_hash, hash_size);
1634 1 : libspdm_append_managed_buffer(&th_curr, (uint8_t *)&m_libspdm_finish_request3,
1635 : sizeof(spdm_finish_request_t));
1636 : #if LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP
1637 1 : libspdm_requester_data_sign(
1638 : #if LIBSPDM_HAL_PASS_SPDM_CONTEXT
1639 : spdm_context,
1640 : #endif
1641 1 : m_libspdm_finish_request3.header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT, SPDM_FINISH,
1642 : m_libspdm_use_req_asym_algo, m_libspdm_use_hash_algo,
1643 1 : false, libspdm_get_managed_buffer(&th_curr),
1644 : libspdm_get_managed_buffer_size(&th_curr),
1645 : ptr, &req_asym_signature_size);
1646 : #endif
1647 1 : libspdm_append_managed_buffer(&th_curr, ptr, req_asym_signature_size);
1648 1 : ptr += req_asym_signature_size;
1649 1 : libspdm_set_mem(request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
1650 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
1651 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
1652 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
1653 : request_finished_key, hash_size, ptr);
1654 1 : libspdm_set_mem(m_libspdm_finish_request3.signature,
1655 : req_asym_signature_size, (uint8_t) 0x00); /*zero signature*/
1656 1 : m_libspdm_finish_request3_size = sizeof(spdm_finish_request_t) +
1657 1 : req_asym_signature_size + hmac_size;
1658 1 : response_size = sizeof(response);
1659 1 : status = libspdm_get_response_finish(spdm_context,
1660 : m_libspdm_finish_request3_size,
1661 : &m_libspdm_finish_request3,
1662 : &response_size, response);
1663 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1664 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
1665 1 : spdm_response = (void *)response;
1666 1 : assert_int_equal(spdm_response->header.request_response_code,
1667 : SPDM_ERROR);
1668 1 : assert_int_equal(spdm_response->header.param1,
1669 : SPDM_ERROR_CODE_DECRYPT_ERROR);
1670 1 : assert_int_equal(spdm_response->header.param2, 0);
1671 1 : free(data1);
1672 1 : free(data2);
1673 1 : }
1674 :
1675 : /**
1676 : * Test 16: receiving a FINISH message from the requester with an incorrect
1677 : * signature (arbitrary), but a correct MAC.
1678 : * Expected behavior: the responder refuses the FINISH message and produces
1679 : * an ERROR message indicating the DecryptError.
1680 : **/
1681 1 : void libspdm_test_responder_finish_case16(void **state)
1682 : {
1683 : libspdm_return_t status;
1684 : libspdm_test_context_t *spdm_test_context;
1685 : libspdm_context_t *spdm_context;
1686 : size_t response_size;
1687 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1688 : spdm_finish_response_t *spdm_response;
1689 : void *data1;
1690 : size_t data_size1;
1691 : void *data2;
1692 : size_t data_size2;
1693 : uint8_t *ptr;
1694 : uint8_t *cert_buffer;
1695 : size_t cert_buffer_size;
1696 : uint8_t cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
1697 : uint8_t req_cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
1698 : uint8_t random_buffer[LIBSPDM_MAX_HASH_SIZE];
1699 : uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
1700 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
1701 : libspdm_session_info_t *session_info;
1702 : uint32_t session_id;
1703 : uint32_t hash_size;
1704 : uint32_t hmac_size;
1705 : size_t req_asym_signature_size;
1706 :
1707 1 : spdm_test_context = *state;
1708 1 : spdm_context = spdm_test_context->spdm_context;
1709 1 : spdm_test_context->case_id = 0x10;
1710 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
1711 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1712 1 : spdm_context->connection_info.connection_state =
1713 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1714 1 : spdm_context->connection_info.capability.flags |=
1715 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
1716 1 : spdm_context->local_context.capability.flags |=
1717 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
1718 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1719 : m_libspdm_use_hash_algo;
1720 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1721 : m_libspdm_use_asym_algo;
1722 1 : spdm_context->connection_info.algorithm.req_base_asym_alg =
1723 : m_libspdm_use_req_asym_algo;
1724 1 : spdm_context->connection_info.algorithm.measurement_spec =
1725 : m_libspdm_use_measurement_spec;
1726 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
1727 : m_libspdm_use_measurement_hash_algo;
1728 1 : spdm_context->connection_info.algorithm.dhe_named_group =
1729 : m_libspdm_use_dhe_algo;
1730 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
1731 : m_libspdm_use_aead_algo;
1732 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
1733 : m_libspdm_use_asym_algo, &data1,
1734 : &data_size1, NULL, NULL);
1735 1 : spdm_context->local_context.local_cert_chain_provision[0] = data1;
1736 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
1737 : data_size1;
1738 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data1;
1739 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size =
1740 : data_size1;
1741 :
1742 1 : libspdm_reset_message_a(spdm_context);
1743 1 : spdm_context->local_context.mut_auth_requested = 1;
1744 1 : libspdm_read_requester_public_certificate_chain(m_libspdm_use_hash_algo,
1745 : m_libspdm_use_req_asym_algo, &data2,
1746 : &data_size2, NULL, NULL);
1747 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1748 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
1749 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
1750 : data2, data_size2);
1751 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
1752 : data_size2;
1753 : #endif
1754 :
1755 1 : session_id = 0xFFFFFFFF;
1756 1 : spdm_context->latest_session_id = session_id;
1757 1 : session_info = &spdm_context->session_info[0];
1758 1 : libspdm_session_info_init(spdm_context, session_info, session_id, false);
1759 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
1760 1 : libspdm_set_mem(m_dummy_buffer, hash_size, (uint8_t)(0xFF));
1761 1 : libspdm_secured_message_set_request_finished_key(
1762 : session_info->secured_message_context, m_dummy_buffer,
1763 : hash_size);
1764 1 : libspdm_secured_message_set_session_state(
1765 : session_info->secured_message_context,
1766 : LIBSPDM_SESSION_STATE_HANDSHAKING);
1767 1 : session_info->mut_auth_requested = 1;
1768 :
1769 1 : spdm_context->connection_info.capability.flags |=
1770 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
1771 1 : spdm_context->local_context.capability.flags |=
1772 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
1773 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
1774 1 : hmac_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
1775 1 : req_asym_signature_size =
1776 1 : libspdm_get_req_asym_signature_size(m_libspdm_use_req_asym_algo);
1777 1 : ptr = m_libspdm_finish_request3.signature;
1778 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
1779 1 : cert_buffer = (uint8_t *)data1;
1780 1 : cert_buffer_size = data_size1;
1781 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
1782 : cert_buffer_hash);
1783 1 : cert_buffer = (uint8_t *)data2;
1784 1 : cert_buffer_size = data_size2;
1785 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
1786 : req_cert_buffer_hash);
1787 : /* transcript.message_a size is 0*/
1788 1 : libspdm_append_managed_buffer(&th_curr, cert_buffer_hash, hash_size);
1789 : /* session_transcript.message_k is 0*/
1790 1 : libspdm_append_managed_buffer(&th_curr, req_cert_buffer_hash, hash_size);
1791 1 : libspdm_append_managed_buffer(&th_curr, (uint8_t *)&m_libspdm_finish_request3,
1792 : sizeof(spdm_finish_request_t));
1793 : /*randomize signature*/
1794 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
1795 : libspdm_get_managed_buffer_size(&th_curr), random_buffer);
1796 : #if LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP
1797 1 : libspdm_requester_data_sign(
1798 : #if LIBSPDM_HAL_PASS_SPDM_CONTEXT
1799 : spdm_context,
1800 : #endif
1801 1 : m_libspdm_finish_request3.header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT, SPDM_FINISH,
1802 : m_libspdm_use_req_asym_algo, m_libspdm_use_hash_algo,
1803 : false, random_buffer, hash_size, ptr, &req_asym_signature_size);
1804 : #endif
1805 1 : libspdm_append_managed_buffer(&th_curr, ptr, req_asym_signature_size);
1806 1 : ptr += req_asym_signature_size;
1807 1 : libspdm_set_mem(request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
1808 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
1809 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
1810 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
1811 : request_finished_key, hash_size, ptr);
1812 1 : m_libspdm_finish_request3_size = sizeof(spdm_finish_request_t) +
1813 1 : req_asym_signature_size + hmac_size;
1814 1 : response_size = sizeof(response);
1815 1 : status = libspdm_get_response_finish(spdm_context,
1816 : m_libspdm_finish_request3_size,
1817 : &m_libspdm_finish_request3,
1818 : &response_size, response);
1819 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1820 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
1821 1 : spdm_response = (void *)response;
1822 1 : assert_int_equal(spdm_response->header.request_response_code,
1823 : SPDM_ERROR);
1824 1 : assert_int_equal(spdm_response->header.param1,
1825 : SPDM_ERROR_CODE_DECRYPT_ERROR);
1826 1 : assert_int_equal(spdm_response->header.param2, 0);
1827 1 : free(data1);
1828 1 : free(data2);
1829 1 : }
1830 :
1831 : /**
1832 : * Test 17: receiving a correct FINISH from the requester.
1833 : * Expected behavior: the responder accepts the request and produces a valid FINISH
1834 : * response message, and buffer F receives the exchanged FINISH and FINISH_RSP messages.
1835 : **/
1836 1 : void libspdm_test_responder_finish_case17(void **state)
1837 : {
1838 : libspdm_return_t status;
1839 : libspdm_test_context_t *spdm_test_context;
1840 : libspdm_context_t *spdm_context;
1841 : size_t response_size;
1842 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1843 : spdm_finish_response_t *spdm_response;
1844 : void *data1;
1845 : size_t data_size1;
1846 : uint8_t *ptr;
1847 : uint8_t *cert_buffer;
1848 : size_t cert_buffer_size;
1849 : uint8_t cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
1850 : uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
1851 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
1852 : libspdm_session_info_t *session_info;
1853 : uint32_t session_id;
1854 : uint32_t hash_size;
1855 : uint32_t hmac_size;
1856 :
1857 1 : spdm_test_context = *state;
1858 1 : spdm_context = spdm_test_context->spdm_context;
1859 1 : spdm_test_context->case_id = 0x11;
1860 1 : spdm_context->connection_info.connection_state =
1861 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1862 1 : spdm_context->connection_info.capability.flags |=
1863 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
1864 1 : spdm_context->local_context.capability.flags |=
1865 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
1866 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
1867 1 : spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
1868 1 : spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
1869 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
1870 : m_libspdm_use_measurement_hash_algo;
1871 1 : spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
1872 1 : spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
1873 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
1874 : m_libspdm_use_asym_algo, &data1,
1875 : &data_size1, NULL, NULL);
1876 1 : spdm_context->local_context.local_cert_chain_provision[0] = data1;
1877 1 : spdm_context->local_context.local_cert_chain_provision_size[0] = data_size1;
1878 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data1;
1879 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size = data_size1;
1880 :
1881 1 : libspdm_reset_message_a(spdm_context);
1882 1 : spdm_context->local_context.mut_auth_requested = 0;
1883 :
1884 1 : session_id = 0xFFFFFFFF;
1885 1 : spdm_context->latest_session_id = session_id;
1886 1 : session_info = &spdm_context->session_info[0];
1887 1 : libspdm_session_info_init(spdm_context, session_info, session_id, false);
1888 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
1889 1 : libspdm_set_mem(m_dummy_buffer, hash_size, (uint8_t)(0xFF));
1890 1 : libspdm_secured_message_set_request_finished_key(
1891 : session_info->secured_message_context, m_dummy_buffer, hash_size);
1892 1 : libspdm_secured_message_set_session_state(
1893 : session_info->secured_message_context, LIBSPDM_SESSION_STATE_HANDSHAKING);
1894 :
1895 1 : spdm_context->connection_info.capability.flags |=
1896 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
1897 1 : spdm_context->local_context.capability.flags |=
1898 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
1899 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
1900 1 : hmac_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
1901 1 : ptr = m_libspdm_finish_request1.signature;
1902 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
1903 1 : cert_buffer = (uint8_t *)data1;
1904 1 : cert_buffer_size = data_size1;
1905 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size, cert_buffer_hash);
1906 : /* transcript.message_a size is 0*/
1907 1 : libspdm_append_managed_buffer(&th_curr, cert_buffer_hash, hash_size);
1908 : /* session_transcript.message_k is 0*/
1909 1 : libspdm_append_managed_buffer(&th_curr, (uint8_t *)&m_libspdm_finish_request1,
1910 : sizeof(spdm_finish_request_t));
1911 1 : libspdm_set_mem(request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
1912 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
1913 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
1914 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
1915 : request_finished_key, hash_size, ptr);
1916 1 : m_libspdm_finish_request1_size = sizeof(spdm_finish_request_t) + hmac_size;
1917 1 : response_size = sizeof(response);
1918 1 : status = libspdm_get_response_finish(
1919 : spdm_context, m_libspdm_finish_request1_size, &m_libspdm_finish_request1,
1920 : &response_size, response);
1921 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1922 1 : assert_int_equal(response_size, sizeof(spdm_finish_response_t) + hmac_size);
1923 1 : spdm_response = (void *)response;
1924 1 : assert_int_equal(spdm_response->header.request_response_code, SPDM_FINISH_RSP);
1925 :
1926 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1927 : assert_int_equal(spdm_context->session_info[0].session_transcript.message_f.buffer_size,
1928 : m_libspdm_finish_request1_size + response_size);
1929 : assert_memory_equal(spdm_context->session_info[0].session_transcript.message_f.buffer,
1930 : &m_libspdm_finish_request1, m_libspdm_finish_request1_size);
1931 : assert_memory_equal(spdm_context->session_info[0].session_transcript.message_f.buffer +
1932 : m_libspdm_finish_request1_size,
1933 : response, response_size);
1934 : #endif
1935 :
1936 1 : free(data1);
1937 1 : }
1938 :
1939 : /**
1940 : * Test 18: receiving a correct FINISH message from the requester with
1941 : * correct MAC and signature (with mutual authentication), and 'handshake in
1942 : * the clear'. The slot_id for requester mutual authentication is 0xFF.
1943 : * Expected behavior: the responder accepts the request and produces a valid
1944 : * FINISH_RSP response message.
1945 : **/
1946 1 : void libspdm_test_responder_finish_case18(void **state)
1947 : {
1948 : libspdm_return_t status;
1949 : libspdm_test_context_t *spdm_test_context;
1950 : libspdm_context_t *spdm_context;
1951 : size_t response_size;
1952 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1953 : spdm_finish_response_t *spdm_response;
1954 : void *data1;
1955 : size_t data_size1;
1956 : void *data2;
1957 : size_t data_size2;
1958 : uint8_t *ptr;
1959 : uint8_t *cert_buffer;
1960 : size_t cert_buffer_size;
1961 : uint8_t cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
1962 : uint8_t req_cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
1963 : uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
1964 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
1965 : libspdm_session_info_t *session_info;
1966 : uint32_t session_id;
1967 : uint32_t hash_size;
1968 : uint32_t hmac_size;
1969 : size_t req_asym_signature_size;
1970 :
1971 1 : spdm_test_context = *state;
1972 1 : spdm_context = spdm_test_context->spdm_context;
1973 1 : spdm_test_context->case_id = 0x12;
1974 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
1975 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1976 1 : spdm_context->connection_info.connection_state =
1977 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1978 1 : spdm_context->connection_info.capability.flags |=
1979 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
1980 1 : spdm_context->local_context.capability.flags |=
1981 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
1982 1 : spdm_context->connection_info.capability.flags |=
1983 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PUB_KEY_ID_CAP;
1984 1 : spdm_context->local_context.capability.flags |=
1985 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PUB_KEY_ID_CAP;
1986 1 : spdm_context->connection_info.capability.flags |=
1987 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
1988 1 : spdm_context->local_context.capability.flags |=
1989 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
1990 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1991 : m_libspdm_use_hash_algo;
1992 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1993 : m_libspdm_use_asym_algo;
1994 1 : spdm_context->connection_info.algorithm.req_base_asym_alg =
1995 : m_libspdm_use_req_asym_algo;
1996 1 : spdm_context->connection_info.algorithm.dhe_named_group =
1997 : m_libspdm_use_dhe_algo;
1998 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
1999 : m_libspdm_use_aead_algo;
2000 1 : libspdm_read_responder_public_key(m_libspdm_use_asym_algo, &data1, &data_size1);
2001 1 : spdm_context->local_context.local_public_key_provision = data1;
2002 1 : spdm_context->local_context.local_public_key_provision_size = data_size1;
2003 1 : spdm_context->local_context.mut_auth_requested = SPDM_KEY_EXCHANGE_RESPONSE_MUT_AUTH_REQUESTED;
2004 1 : libspdm_read_requester_public_key(m_libspdm_use_req_asym_algo, &data2, &data_size2);
2005 1 : spdm_context->local_context.peer_public_key_provision = data2;
2006 1 : spdm_context->local_context.peer_public_key_provision_size = data_size2;
2007 :
2008 1 : spdm_context->encap_context.req_slot_id = 0xFF;
2009 1 : spdm_context->connection_info.peer_used_cert_chain_slot_id = 0xFF;
2010 1 : spdm_context->connection_info.local_used_cert_chain_slot_id = 0xFF;
2011 :
2012 1 : libspdm_reset_message_a(spdm_context);
2013 :
2014 1 : session_id = 0xFFFFFFFF;
2015 1 : spdm_context->latest_session_id = session_id;
2016 1 : session_info = &spdm_context->session_info[0];
2017 1 : libspdm_session_info_init(spdm_context, session_info, session_id, false);
2018 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
2019 1 : libspdm_set_mem(m_dummy_buffer, hash_size, (uint8_t)(0xFF));
2020 1 : libspdm_secured_message_set_request_finished_key(
2021 : session_info->secured_message_context, m_dummy_buffer,
2022 : hash_size);
2023 1 : libspdm_secured_message_set_session_state(
2024 : session_info->secured_message_context,
2025 : LIBSPDM_SESSION_STATE_HANDSHAKING);
2026 1 : session_info->mut_auth_requested = 1;
2027 :
2028 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
2029 1 : hmac_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
2030 1 : req_asym_signature_size =
2031 1 : libspdm_get_req_asym_signature_size(m_libspdm_use_req_asym_algo);
2032 1 : ptr = m_libspdm_finish_request4.signature;
2033 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
2034 1 : cert_buffer = (uint8_t *)data1;
2035 1 : cert_buffer_size = data_size1;
2036 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
2037 : cert_buffer_hash);
2038 1 : cert_buffer = (uint8_t *)data2;
2039 1 : cert_buffer_size = data_size2;
2040 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
2041 : req_cert_buffer_hash);
2042 : /* transcript.message_a size is 0*/
2043 1 : libspdm_append_managed_buffer(&th_curr, cert_buffer_hash, hash_size);
2044 : /* session_transcript.message_k is 0*/
2045 1 : libspdm_append_managed_buffer(&th_curr, req_cert_buffer_hash, hash_size);
2046 1 : libspdm_append_managed_buffer(&th_curr, (uint8_t *)&m_libspdm_finish_request4,
2047 : sizeof(spdm_finish_request_t));
2048 : #if LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP
2049 1 : libspdm_requester_data_sign(
2050 : #if LIBSPDM_HAL_PASS_SPDM_CONTEXT
2051 : spdm_context,
2052 : #endif
2053 1 : m_libspdm_finish_request4.header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
2054 : SPDM_FINISH,
2055 : m_libspdm_use_req_asym_algo, m_libspdm_use_hash_algo,
2056 1 : false, libspdm_get_managed_buffer(&th_curr),
2057 : libspdm_get_managed_buffer_size(&th_curr),
2058 : ptr, &req_asym_signature_size);
2059 : #endif
2060 1 : libspdm_append_managed_buffer(&th_curr, ptr, req_asym_signature_size);
2061 1 : ptr += req_asym_signature_size;
2062 :
2063 1 : libspdm_set_mem(request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
2064 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
2065 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
2066 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
2067 : request_finished_key, hash_size, ptr);
2068 1 : m_libspdm_finish_request4_size = sizeof(spdm_finish_request_t) +
2069 1 : req_asym_signature_size + hmac_size;
2070 1 : response_size = sizeof(response);
2071 1 : status = libspdm_get_response_finish(spdm_context,
2072 : m_libspdm_finish_request4_size,
2073 : &m_libspdm_finish_request4,
2074 : &response_size, response);
2075 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
2076 1 : assert_int_equal(response_size,
2077 : sizeof(spdm_finish_response_t) + hmac_size);
2078 1 : spdm_response = (void *)response;
2079 1 : assert_int_equal(spdm_response->header.request_response_code,
2080 : SPDM_FINISH_RSP);
2081 1 : free(data1);
2082 1 : free(data2);
2083 1 : }
2084 :
2085 : /**
2086 : * Test 19: receiving a invalid FINISH request message, enable mutual authentication without using the encapsulated request flow,
2087 : * that is KEY_EXCHANGE_RSP.MutAuthRequested equals 0x01.
2088 : * SlotID in FINISH request message is 10, but it shall be 0xFF or between 0 and 7 inclusive.
2089 : * Expected behavior: generate an ERROR_RESPONSE with code SPDM_ERROR_CODE_INVALID_REQUEST.
2090 : **/
2091 1 : void libspdm_test_responder_finish_case19(void **state)
2092 : {
2093 : libspdm_return_t status;
2094 : libspdm_test_context_t *spdm_test_context;
2095 : libspdm_context_t *spdm_context;
2096 : size_t response_size;
2097 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
2098 : spdm_finish_response_t *spdm_response;
2099 : void *data1;
2100 : size_t data_size1;
2101 : void *data2;
2102 : size_t data_size2;
2103 : uint8_t *ptr;
2104 : uint8_t *cert_buffer;
2105 : size_t cert_buffer_size;
2106 : uint8_t cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
2107 : uint8_t req_cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
2108 : uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
2109 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
2110 : libspdm_session_info_t *session_info;
2111 : uint32_t session_id;
2112 : uint32_t hash_size;
2113 : uint32_t hmac_size;
2114 : size_t req_asym_signature_size;
2115 :
2116 1 : spdm_test_context = *state;
2117 1 : spdm_context = spdm_test_context->spdm_context;
2118 1 : spdm_test_context->case_id = 0x13;
2119 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
2120 : SPDM_VERSION_NUMBER_SHIFT_BIT;
2121 1 : spdm_context->connection_info.connection_state =
2122 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
2123 1 : spdm_context->connection_info.capability.flags |=
2124 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
2125 1 : spdm_context->local_context.capability.flags |=
2126 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
2127 1 : spdm_context->connection_info.algorithm.base_hash_algo =
2128 : m_libspdm_use_hash_algo;
2129 1 : spdm_context->connection_info.algorithm.base_asym_algo =
2130 : m_libspdm_use_asym_algo;
2131 1 : spdm_context->connection_info.algorithm.req_base_asym_alg =
2132 : m_libspdm_use_req_asym_algo;
2133 1 : spdm_context->connection_info.algorithm.measurement_spec =
2134 : m_libspdm_use_measurement_spec;
2135 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
2136 : m_libspdm_use_measurement_hash_algo;
2137 1 : spdm_context->connection_info.algorithm.dhe_named_group =
2138 : m_libspdm_use_dhe_algo;
2139 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
2140 : m_libspdm_use_aead_algo;
2141 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
2142 : m_libspdm_use_asym_algo, &data1,
2143 : &data_size1, NULL, NULL);
2144 1 : spdm_context->local_context.local_cert_chain_provision[0] = data1;
2145 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
2146 : data_size1;
2147 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data1;
2148 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size =
2149 : data_size1;
2150 :
2151 1 : libspdm_reset_message_a(spdm_context);
2152 1 : spdm_context->local_context.mut_auth_requested = SPDM_KEY_EXCHANGE_RESPONSE_MUT_AUTH_REQUESTED;
2153 1 : libspdm_read_requester_public_certificate_chain(m_libspdm_use_hash_algo,
2154 : m_libspdm_use_req_asym_algo, &data2,
2155 : &data_size2, NULL, NULL);
2156 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
2157 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
2158 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
2159 : data2, data_size2);
2160 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
2161 : data_size2;
2162 : #else
2163 1 : libspdm_hash_all(
2164 : spdm_context->connection_info.algorithm.base_hash_algo,
2165 : data2, data_size2,
2166 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
2167 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
2168 1 : libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
2169 1 : libspdm_get_leaf_cert_public_key_from_cert_chain(
2170 : spdm_context->connection_info.algorithm.base_hash_algo,
2171 1 : spdm_context->connection_info.algorithm.req_base_asym_alg,
2172 : data2,
2173 : data_size2,
2174 : &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
2175 : #endif
2176 1 : spdm_context->connection_info.peer_used_cert_chain_slot_id = 0;
2177 :
2178 1 : session_id = 0xFFFFFFFF;
2179 1 : spdm_context->latest_session_id = session_id;
2180 1 : session_info = &spdm_context->session_info[0];
2181 1 : libspdm_session_info_init(spdm_context, session_info, session_id, false);
2182 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
2183 1 : libspdm_set_mem(m_dummy_buffer, hash_size, (uint8_t)(0xFF));
2184 1 : libspdm_secured_message_set_request_finished_key(
2185 : session_info->secured_message_context, m_dummy_buffer,
2186 : hash_size);
2187 1 : libspdm_secured_message_set_session_state(
2188 : session_info->secured_message_context,
2189 : LIBSPDM_SESSION_STATE_HANDSHAKING);
2190 1 : session_info->mut_auth_requested = SPDM_KEY_EXCHANGE_RESPONSE_MUT_AUTH_REQUESTED;
2191 :
2192 1 : spdm_context->connection_info.capability.flags |=
2193 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
2194 1 : spdm_context->local_context.capability.flags |=
2195 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
2196 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
2197 1 : hmac_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
2198 1 : req_asym_signature_size =
2199 1 : libspdm_get_req_asym_signature_size(m_libspdm_use_req_asym_algo);
2200 1 : ptr = m_libspdm_finish_request5.signature;
2201 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
2202 1 : cert_buffer = (uint8_t *)data1;
2203 1 : cert_buffer_size = data_size1;
2204 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
2205 : cert_buffer_hash);
2206 1 : cert_buffer = (uint8_t *)data2;
2207 1 : cert_buffer_size = data_size2;
2208 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
2209 : req_cert_buffer_hash);
2210 : /* transcript.message_a size is 0*/
2211 1 : libspdm_append_managed_buffer(&th_curr, cert_buffer_hash, hash_size);
2212 : /* session_transcript.message_k is 0*/
2213 1 : libspdm_append_managed_buffer(&th_curr, req_cert_buffer_hash, hash_size);
2214 1 : libspdm_append_managed_buffer(&th_curr, (uint8_t *)&m_libspdm_finish_request5,
2215 : sizeof(spdm_finish_request_t));
2216 : #if LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP
2217 1 : libspdm_requester_data_sign(
2218 : #if LIBSPDM_HAL_PASS_SPDM_CONTEXT
2219 : spdm_context,
2220 : #endif
2221 1 : m_libspdm_finish_request5.header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT, SPDM_FINISH,
2222 : m_libspdm_use_req_asym_algo, m_libspdm_use_hash_algo,
2223 1 : false, libspdm_get_managed_buffer(&th_curr),
2224 : libspdm_get_managed_buffer_size(&th_curr),
2225 : ptr, &req_asym_signature_size);
2226 : #endif
2227 1 : libspdm_append_managed_buffer(&th_curr, ptr, req_asym_signature_size);
2228 1 : ptr += req_asym_signature_size;
2229 1 : libspdm_set_mem(request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
2230 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
2231 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
2232 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
2233 : request_finished_key, hash_size, ptr);
2234 1 : m_libspdm_finish_request5_size = sizeof(spdm_finish_request_t) +
2235 1 : req_asym_signature_size + hmac_size;
2236 1 : response_size = sizeof(response);
2237 1 : status = libspdm_get_response_finish(spdm_context,
2238 : m_libspdm_finish_request5_size,
2239 : &m_libspdm_finish_request5,
2240 : &response_size, response);
2241 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
2242 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
2243 1 : spdm_response = (void *)response;
2244 1 : assert_int_equal(spdm_response->header.request_response_code,
2245 : SPDM_ERROR);
2246 1 : assert_int_equal(spdm_response->header.param1,
2247 : SPDM_ERROR_CODE_INVALID_REQUEST);
2248 1 : assert_int_equal(spdm_response->header.param2, 0);
2249 1 : free(data1);
2250 1 : free(data2);
2251 1 : }
2252 :
2253 : /**
2254 : * Test 20: receiving a invalid FINISH request message, enable mutual authentication with using the encapsulated request flow,
2255 : * that is KEY_EXCHANGE_RSP.MutAuthRequested equals 0x02.
2256 : * SlotID in FINISH request message is 3, but it shall match the value 0 in final ENCAPSULATED_RESPONSE_ACK.EncapsulatedRequest.
2257 : * Expected behavior: generate an ERROR_RESPONSE with code SPDM_ERROR_CODE_INVALID_REQUEST.
2258 : **/
2259 1 : void libspdm_test_responder_finish_case20(void **state)
2260 : {
2261 : libspdm_return_t status;
2262 : libspdm_test_context_t *spdm_test_context;
2263 : libspdm_context_t *spdm_context;
2264 : size_t response_size;
2265 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
2266 : spdm_finish_response_t *spdm_response;
2267 : void *data1;
2268 : size_t data_size1;
2269 : void *data2;
2270 : size_t data_size2;
2271 : uint8_t *ptr;
2272 : uint8_t *cert_buffer;
2273 : size_t cert_buffer_size;
2274 : uint8_t cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
2275 : uint8_t req_cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
2276 : uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
2277 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
2278 : libspdm_session_info_t *session_info;
2279 : uint32_t session_id;
2280 : uint32_t hash_size;
2281 : uint32_t hmac_size;
2282 : size_t req_asym_signature_size;
2283 :
2284 1 : spdm_test_context = *state;
2285 1 : spdm_context = spdm_test_context->spdm_context;
2286 1 : spdm_test_context->case_id = 0x14;
2287 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
2288 : SPDM_VERSION_NUMBER_SHIFT_BIT;
2289 1 : spdm_context->connection_info.connection_state =
2290 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
2291 1 : spdm_context->connection_info.capability.flags |=
2292 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
2293 1 : spdm_context->local_context.capability.flags |=
2294 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
2295 1 : spdm_context->connection_info.algorithm.base_hash_algo =
2296 : m_libspdm_use_hash_algo;
2297 1 : spdm_context->connection_info.algorithm.base_asym_algo =
2298 : m_libspdm_use_asym_algo;
2299 1 : spdm_context->connection_info.algorithm.req_base_asym_alg =
2300 : m_libspdm_use_req_asym_algo;
2301 1 : spdm_context->connection_info.algorithm.measurement_spec =
2302 : m_libspdm_use_measurement_spec;
2303 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
2304 : m_libspdm_use_measurement_hash_algo;
2305 1 : spdm_context->connection_info.algorithm.dhe_named_group =
2306 : m_libspdm_use_dhe_algo;
2307 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
2308 : m_libspdm_use_aead_algo;
2309 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
2310 : m_libspdm_use_asym_algo, &data1,
2311 : &data_size1, NULL, NULL);
2312 1 : spdm_context->local_context.local_cert_chain_provision[0] = data1;
2313 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
2314 : data_size1;
2315 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data1;
2316 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size =
2317 : data_size1;
2318 :
2319 1 : libspdm_reset_message_a(spdm_context);
2320 1 : spdm_context->local_context.mut_auth_requested =
2321 : SPDM_KEY_EXCHANGE_RESPONSE_MUT_AUTH_REQUESTED_WITH_ENCAP_REQUEST;
2322 1 : libspdm_read_requester_public_certificate_chain(m_libspdm_use_hash_algo,
2323 : m_libspdm_use_req_asym_algo, &data2,
2324 : &data_size2, NULL, NULL);
2325 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
2326 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
2327 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
2328 : data2, data_size2);
2329 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
2330 : data_size2;
2331 : #else
2332 1 : libspdm_hash_all(
2333 : spdm_context->connection_info.algorithm.base_hash_algo,
2334 : data2, data_size2,
2335 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
2336 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
2337 1 : libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
2338 1 : libspdm_get_leaf_cert_public_key_from_cert_chain(
2339 : spdm_context->connection_info.algorithm.base_hash_algo,
2340 1 : spdm_context->connection_info.algorithm.req_base_asym_alg,
2341 : data2,
2342 : data_size2,
2343 : &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
2344 : #endif
2345 1 : spdm_context->connection_info.peer_used_cert_chain_slot_id = 0;
2346 :
2347 1 : session_id = 0xFFFFFFFF;
2348 1 : spdm_context->latest_session_id = session_id;
2349 1 : session_info = &spdm_context->session_info[0];
2350 1 : libspdm_session_info_init(spdm_context, session_info, session_id, false);
2351 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
2352 1 : libspdm_set_mem(m_dummy_buffer, hash_size, (uint8_t)(0xFF));
2353 1 : libspdm_secured_message_set_request_finished_key(
2354 : session_info->secured_message_context, m_dummy_buffer,
2355 : hash_size);
2356 1 : libspdm_secured_message_set_session_state(
2357 : session_info->secured_message_context,
2358 : LIBSPDM_SESSION_STATE_HANDSHAKING);
2359 1 : session_info->mut_auth_requested =
2360 : SPDM_KEY_EXCHANGE_RESPONSE_MUT_AUTH_REQUESTED_WITH_ENCAP_REQUEST;
2361 :
2362 1 : spdm_context->connection_info.capability.flags |=
2363 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
2364 1 : spdm_context->local_context.capability.flags |=
2365 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
2366 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
2367 1 : hmac_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
2368 1 : req_asym_signature_size =
2369 1 : libspdm_get_req_asym_signature_size(m_libspdm_use_req_asym_algo);
2370 1 : ptr = m_libspdm_finish_request7.signature;
2371 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
2372 1 : cert_buffer = (uint8_t *)data1;
2373 1 : cert_buffer_size = data_size1;
2374 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
2375 : cert_buffer_hash);
2376 1 : cert_buffer = (uint8_t *)data2;
2377 1 : cert_buffer_size = data_size2;
2378 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
2379 : req_cert_buffer_hash);
2380 : /* transcript.message_a size is 0*/
2381 1 : libspdm_append_managed_buffer(&th_curr, cert_buffer_hash, hash_size);
2382 : /* session_transcript.message_k is 0*/
2383 1 : libspdm_append_managed_buffer(&th_curr, req_cert_buffer_hash, hash_size);
2384 1 : libspdm_append_managed_buffer(&th_curr, (uint8_t *)&m_libspdm_finish_request7,
2385 : sizeof(spdm_finish_request_t));
2386 : #if LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP
2387 1 : libspdm_requester_data_sign(
2388 : #if LIBSPDM_HAL_PASS_SPDM_CONTEXT
2389 : spdm_context,
2390 : #endif
2391 1 : m_libspdm_finish_request7.header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT, SPDM_FINISH,
2392 : m_libspdm_use_req_asym_algo, m_libspdm_use_hash_algo,
2393 1 : false, libspdm_get_managed_buffer(&th_curr),
2394 : libspdm_get_managed_buffer_size(&th_curr),
2395 : ptr, &req_asym_signature_size);
2396 : #endif
2397 1 : libspdm_append_managed_buffer(&th_curr, ptr, req_asym_signature_size);
2398 1 : ptr += req_asym_signature_size;
2399 1 : libspdm_set_mem(request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
2400 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
2401 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
2402 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
2403 : request_finished_key, hash_size, ptr);
2404 1 : m_libspdm_finish_request7_size = sizeof(spdm_finish_request_t) +
2405 1 : req_asym_signature_size + hmac_size;
2406 1 : response_size = sizeof(response);
2407 1 : status = libspdm_get_response_finish(spdm_context,
2408 : m_libspdm_finish_request7_size,
2409 : &m_libspdm_finish_request7,
2410 : &response_size, response);
2411 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
2412 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
2413 1 : spdm_response = (void *)response;
2414 1 : assert_int_equal(spdm_response->header.request_response_code,
2415 : SPDM_ERROR);
2416 1 : assert_int_equal(spdm_response->header.param1,
2417 : SPDM_ERROR_CODE_INVALID_REQUEST);
2418 1 : assert_int_equal(spdm_response->header.param2, 0);
2419 1 : free(data1);
2420 1 : free(data2);
2421 1 : }
2422 :
2423 : /**
2424 : * Test 21: receiving a valid FINISH request message, due to disable mutual authentication,
2425 : * although SlotID in FINISH request message is 10, it shall be ignored when read.
2426 : * Expected behavior: the responder accepts the request and produces a valid
2427 : * FINISH_RSP response message.
2428 : **/
2429 1 : void libspdm_test_responder_finish_case21(void **state)
2430 : {
2431 : libspdm_return_t status;
2432 : libspdm_test_context_t *spdm_test_context;
2433 : libspdm_context_t *spdm_context;
2434 : size_t response_size;
2435 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
2436 : spdm_finish_response_t *spdm_response;
2437 : void *data1;
2438 : size_t data_size1;
2439 : uint8_t *ptr;
2440 : uint8_t *cert_buffer;
2441 : size_t cert_buffer_size;
2442 : uint8_t cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
2443 : uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
2444 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
2445 : libspdm_session_info_t *session_info;
2446 : uint32_t session_id;
2447 : uint32_t hash_size;
2448 : uint32_t hmac_size;
2449 :
2450 1 : spdm_test_context = *state;
2451 1 : spdm_context = spdm_test_context->spdm_context;
2452 1 : spdm_test_context->case_id = 0x15;
2453 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
2454 : SPDM_VERSION_NUMBER_SHIFT_BIT;
2455 1 : spdm_context->connection_info.connection_state =
2456 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
2457 1 : spdm_context->connection_info.capability.flags |=
2458 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
2459 1 : spdm_context->local_context.capability.flags |=
2460 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
2461 1 : spdm_context->connection_info.algorithm.base_hash_algo =
2462 : m_libspdm_use_hash_algo;
2463 1 : spdm_context->connection_info.algorithm.base_asym_algo =
2464 : m_libspdm_use_asym_algo;
2465 1 : spdm_context->connection_info.algorithm.measurement_spec =
2466 : m_libspdm_use_measurement_spec;
2467 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
2468 : m_libspdm_use_measurement_hash_algo;
2469 1 : spdm_context->connection_info.algorithm.dhe_named_group =
2470 : m_libspdm_use_dhe_algo;
2471 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
2472 : m_libspdm_use_aead_algo;
2473 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
2474 : m_libspdm_use_asym_algo, &data1,
2475 : &data_size1, NULL, NULL);
2476 1 : spdm_context->local_context.local_cert_chain_provision[0] = data1;
2477 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
2478 : data_size1;
2479 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data1;
2480 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size =
2481 : data_size1;
2482 :
2483 1 : libspdm_reset_message_a(spdm_context);
2484 1 : spdm_context->local_context.mut_auth_requested = 0;
2485 :
2486 1 : session_id = 0xFFFFFFFF;
2487 1 : spdm_context->latest_session_id = session_id;
2488 1 : session_info = &spdm_context->session_info[0];
2489 1 : libspdm_session_info_init(spdm_context, session_info, session_id, false);
2490 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
2491 1 : libspdm_set_mem(m_dummy_buffer, hash_size, (uint8_t)(0xFF));
2492 1 : libspdm_secured_message_set_request_finished_key(
2493 : session_info->secured_message_context, m_dummy_buffer,
2494 : hash_size);
2495 1 : libspdm_secured_message_set_session_state(
2496 : session_info->secured_message_context,
2497 : LIBSPDM_SESSION_STATE_HANDSHAKING);
2498 1 : session_info->mut_auth_requested = 0;
2499 :
2500 1 : spdm_context->connection_info.capability.flags |=
2501 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
2502 1 : spdm_context->local_context.capability.flags |=
2503 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
2504 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
2505 1 : hmac_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
2506 1 : ptr = m_libspdm_finish_request6.signature;
2507 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
2508 1 : cert_buffer = (uint8_t *)data1;
2509 1 : cert_buffer_size = data_size1;
2510 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
2511 : cert_buffer_hash);
2512 : /* transcript.message_a size is 0*/
2513 1 : libspdm_append_managed_buffer(&th_curr, cert_buffer_hash, hash_size);
2514 : /* session_transcript.message_k is 0*/
2515 1 : libspdm_append_managed_buffer(&th_curr, (uint8_t *)&m_libspdm_finish_request6,
2516 : sizeof(spdm_finish_request_t));
2517 1 : libspdm_set_mem(request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
2518 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
2519 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
2520 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
2521 : request_finished_key, hash_size, ptr);
2522 1 : m_libspdm_finish_request6_size = sizeof(spdm_finish_request_t) + hmac_size;
2523 1 : response_size = sizeof(response);
2524 1 : status = libspdm_get_response_finish(spdm_context,
2525 : m_libspdm_finish_request6_size,
2526 : &m_libspdm_finish_request6,
2527 : &response_size, response);
2528 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
2529 1 : spdm_response = (void *)response;
2530 1 : assert_int_equal(spdm_response->header.request_response_code,
2531 : SPDM_FINISH_RSP);
2532 1 : assert_int_equal(response_size,
2533 : sizeof(spdm_finish_response_t) + hmac_size);
2534 1 : free(data1);
2535 1 : }
2536 :
2537 : /**
2538 : * Test 22: receiving a valid FINISH request message, enable mutual authentication without using the encapsulated request flow,
2539 : * that is KEY_EXCHANGE_RSP.MutAuthRequested equals 0x01.
2540 : * although SlotID in FINISH request message is 3, it no need match the value 0 in final ENCAPSULATED_RESPONSE_ACK.EncapsulatedRequest.
2541 : * Expected behavior: the responder accepts the request and produces a valid
2542 : * FINISH_RSP response message.
2543 : **/
2544 1 : void libspdm_test_responder_finish_case22(void **state)
2545 : {
2546 : libspdm_return_t status;
2547 : libspdm_test_context_t *spdm_test_context;
2548 : libspdm_context_t *spdm_context;
2549 : size_t response_size;
2550 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
2551 : spdm_finish_response_t *spdm_response;
2552 : void *data1;
2553 : size_t data_size1;
2554 : void *data2;
2555 : size_t data_size2;
2556 : uint8_t *ptr;
2557 : uint8_t *cert_buffer;
2558 : size_t cert_buffer_size;
2559 : uint8_t cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
2560 : uint8_t req_cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
2561 : uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
2562 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
2563 : libspdm_session_info_t *session_info;
2564 : uint32_t session_id;
2565 : uint32_t hash_size;
2566 : uint32_t hmac_size;
2567 : size_t req_asym_signature_size;
2568 :
2569 1 : spdm_test_context = *state;
2570 1 : spdm_context = spdm_test_context->spdm_context;
2571 1 : spdm_test_context->case_id = 0x16;
2572 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
2573 : SPDM_VERSION_NUMBER_SHIFT_BIT;
2574 1 : spdm_context->connection_info.connection_state =
2575 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
2576 1 : spdm_context->connection_info.capability.flags |=
2577 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
2578 1 : spdm_context->local_context.capability.flags |=
2579 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
2580 1 : spdm_context->connection_info.algorithm.base_hash_algo =
2581 : m_libspdm_use_hash_algo;
2582 1 : spdm_context->connection_info.algorithm.base_asym_algo =
2583 : m_libspdm_use_asym_algo;
2584 1 : spdm_context->connection_info.algorithm.req_base_asym_alg =
2585 : m_libspdm_use_req_asym_algo;
2586 1 : spdm_context->connection_info.algorithm.measurement_spec =
2587 : m_libspdm_use_measurement_spec;
2588 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
2589 : m_libspdm_use_measurement_hash_algo;
2590 1 : spdm_context->connection_info.algorithm.dhe_named_group =
2591 : m_libspdm_use_dhe_algo;
2592 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
2593 : m_libspdm_use_aead_algo;
2594 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
2595 : m_libspdm_use_asym_algo, &data1,
2596 : &data_size1, NULL, NULL);
2597 1 : spdm_context->local_context.local_cert_chain_provision[0] = data1;
2598 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
2599 : data_size1;
2600 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data1;
2601 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size =
2602 : data_size1;
2603 :
2604 1 : libspdm_reset_message_a(spdm_context);
2605 1 : spdm_context->local_context.mut_auth_requested = SPDM_KEY_EXCHANGE_RESPONSE_MUT_AUTH_REQUESTED;
2606 1 : libspdm_read_requester_public_certificate_chain(m_libspdm_use_hash_algo,
2607 : m_libspdm_use_req_asym_algo, &data2,
2608 : &data_size2, NULL, NULL);
2609 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
2610 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
2611 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
2612 : data2, data_size2);
2613 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
2614 : data_size2;
2615 : #else
2616 1 : libspdm_hash_all(
2617 : spdm_context->connection_info.algorithm.base_hash_algo,
2618 : data2, data_size2,
2619 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
2620 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
2621 1 : libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
2622 1 : libspdm_get_leaf_cert_public_key_from_cert_chain(
2623 : spdm_context->connection_info.algorithm.base_hash_algo,
2624 1 : spdm_context->connection_info.algorithm.req_base_asym_alg,
2625 : data2,
2626 : data_size2,
2627 : &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
2628 : #endif
2629 1 : spdm_context->connection_info.peer_used_cert_chain_slot_id = 0;
2630 :
2631 1 : session_id = 0xFFFFFFFF;
2632 1 : spdm_context->latest_session_id = session_id;
2633 1 : session_info = &spdm_context->session_info[0];
2634 1 : libspdm_session_info_init(spdm_context, session_info, session_id, false);
2635 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
2636 1 : libspdm_set_mem(m_dummy_buffer, hash_size, (uint8_t)(0xFF));
2637 1 : libspdm_secured_message_set_request_finished_key(
2638 : session_info->secured_message_context, m_dummy_buffer,
2639 : hash_size);
2640 1 : libspdm_secured_message_set_session_state(
2641 : session_info->secured_message_context,
2642 : LIBSPDM_SESSION_STATE_HANDSHAKING);
2643 1 : session_info->mut_auth_requested = SPDM_KEY_EXCHANGE_RESPONSE_MUT_AUTH_REQUESTED;
2644 :
2645 1 : spdm_context->connection_info.capability.flags |=
2646 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
2647 1 : spdm_context->local_context.capability.flags |=
2648 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
2649 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
2650 1 : hmac_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
2651 1 : req_asym_signature_size =
2652 1 : libspdm_get_req_asym_signature_size(m_libspdm_use_req_asym_algo);
2653 1 : ptr = m_libspdm_finish_request7.signature;
2654 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
2655 1 : cert_buffer = (uint8_t *)data1;
2656 1 : cert_buffer_size = data_size1;
2657 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
2658 : cert_buffer_hash);
2659 1 : cert_buffer = (uint8_t *)data2;
2660 1 : cert_buffer_size = data_size2;
2661 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
2662 : req_cert_buffer_hash);
2663 : /* transcript.message_a size is 0*/
2664 1 : libspdm_append_managed_buffer(&th_curr, cert_buffer_hash, hash_size);
2665 : /* session_transcript.message_k is 0*/
2666 1 : libspdm_append_managed_buffer(&th_curr, req_cert_buffer_hash, hash_size);
2667 1 : libspdm_append_managed_buffer(&th_curr, (uint8_t *)&m_libspdm_finish_request7,
2668 : sizeof(spdm_finish_request_t));
2669 : #if LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP
2670 1 : libspdm_requester_data_sign(
2671 : #if LIBSPDM_HAL_PASS_SPDM_CONTEXT
2672 : spdm_context,
2673 : #endif
2674 1 : m_libspdm_finish_request7.header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT, SPDM_FINISH,
2675 : m_libspdm_use_req_asym_algo, m_libspdm_use_hash_algo,
2676 1 : false, libspdm_get_managed_buffer(&th_curr),
2677 : libspdm_get_managed_buffer_size(&th_curr),
2678 : ptr, &req_asym_signature_size);
2679 : #endif
2680 1 : libspdm_append_managed_buffer(&th_curr, ptr, req_asym_signature_size);
2681 1 : ptr += req_asym_signature_size;
2682 1 : libspdm_set_mem(request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
2683 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
2684 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
2685 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
2686 : request_finished_key, hash_size, ptr);
2687 1 : m_libspdm_finish_request7_size = sizeof(spdm_finish_request_t) +
2688 1 : req_asym_signature_size + hmac_size;
2689 1 : response_size = sizeof(response);
2690 1 : status = libspdm_get_response_finish(spdm_context,
2691 : m_libspdm_finish_request7_size,
2692 : &m_libspdm_finish_request7,
2693 : &response_size, response);
2694 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
2695 1 : spdm_response = (void *)response;
2696 1 : assert_int_equal(spdm_response->header.request_response_code,
2697 : SPDM_FINISH_RSP);
2698 1 : assert_int_equal(response_size,
2699 : sizeof(spdm_finish_response_t) + hmac_size);
2700 1 : free(data1);
2701 1 : free(data2);
2702 1 : }
2703 :
2704 : /**
2705 : * Test 23: Same as test case 22 but test signature endianness.
2706 : * Big-Endian Sign. Little-Endian Verify.
2707 : * Expecting signature to fail.
2708 : **/
2709 1 : void libspdm_test_responder_finish_case23(void** state)
2710 : {
2711 : libspdm_return_t status;
2712 : libspdm_test_context_t* spdm_test_context;
2713 : libspdm_context_t* spdm_context;
2714 : size_t response_size;
2715 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
2716 : spdm_finish_response_t* spdm_response;
2717 : void* data1;
2718 : size_t data_size1;
2719 : void* data2;
2720 : size_t data_size2;
2721 : uint8_t* ptr;
2722 : uint8_t* cert_buffer;
2723 : size_t cert_buffer_size;
2724 : uint8_t cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
2725 : uint8_t req_cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
2726 : uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
2727 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
2728 : libspdm_session_info_t* session_info;
2729 : uint32_t session_id;
2730 : uint32_t hash_size;
2731 : uint32_t hmac_size;
2732 : size_t req_asym_signature_size;
2733 :
2734 1 : spdm_test_context = *state;
2735 1 : spdm_context = spdm_test_context->spdm_context;
2736 1 : spdm_test_context->case_id = 23;
2737 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
2738 : SPDM_VERSION_NUMBER_SHIFT_BIT;
2739 1 : spdm_context->connection_info.connection_state =
2740 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
2741 1 : spdm_context->connection_info.capability.flags |=
2742 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
2743 1 : spdm_context->local_context.capability.flags |=
2744 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
2745 1 : spdm_context->connection_info.algorithm.base_hash_algo =
2746 : m_libspdm_use_hash_algo;
2747 1 : spdm_context->connection_info.algorithm.base_asym_algo =
2748 : m_libspdm_use_asym_algo;
2749 1 : spdm_context->connection_info.algorithm.req_base_asym_alg =
2750 : m_libspdm_use_req_asym_algo;
2751 1 : spdm_context->connection_info.algorithm.measurement_spec =
2752 : m_libspdm_use_measurement_spec;
2753 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
2754 : m_libspdm_use_measurement_hash_algo;
2755 1 : spdm_context->connection_info.algorithm.dhe_named_group =
2756 : m_libspdm_use_dhe_algo;
2757 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
2758 : m_libspdm_use_aead_algo;
2759 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
2760 : m_libspdm_use_asym_algo, &data1,
2761 : &data_size1, NULL, NULL);
2762 1 : spdm_context->local_context.local_cert_chain_provision[0] = data1;
2763 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
2764 : data_size1;
2765 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data1;
2766 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size =
2767 : data_size1;
2768 1 : spdm_context->spdm_10_11_verify_signature_endian =
2769 : LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_LITTLE_ONLY;
2770 :
2771 1 : libspdm_reset_message_a(spdm_context);
2772 1 : spdm_context->local_context.mut_auth_requested = SPDM_KEY_EXCHANGE_RESPONSE_MUT_AUTH_REQUESTED;
2773 1 : libspdm_read_requester_public_certificate_chain(m_libspdm_use_hash_algo,
2774 : m_libspdm_use_req_asym_algo, &data2,
2775 : &data_size2, NULL, NULL);
2776 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
2777 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
2778 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
2779 : data2, data_size2);
2780 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
2781 : data_size2;
2782 : #else
2783 1 : libspdm_hash_all(
2784 : spdm_context->connection_info.algorithm.base_hash_algo,
2785 : data2, data_size2,
2786 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
2787 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
2788 1 : libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
2789 1 : libspdm_get_leaf_cert_public_key_from_cert_chain(
2790 : spdm_context->connection_info.algorithm.base_hash_algo,
2791 1 : spdm_context->connection_info.algorithm.req_base_asym_alg,
2792 : data2,
2793 : data_size2,
2794 : &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
2795 : #endif
2796 1 : spdm_context->connection_info.peer_used_cert_chain_slot_id = 0;
2797 :
2798 1 : session_id = 0xFFFFFFFF;
2799 1 : spdm_context->latest_session_id = session_id;
2800 1 : session_info = &spdm_context->session_info[0];
2801 1 : libspdm_session_info_init(spdm_context, session_info, session_id, false);
2802 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
2803 1 : libspdm_set_mem(m_dummy_buffer, hash_size, (uint8_t)(0xFF));
2804 1 : libspdm_secured_message_set_request_finished_key(
2805 : session_info->secured_message_context, m_dummy_buffer,
2806 : hash_size);
2807 1 : libspdm_secured_message_set_session_state(
2808 : session_info->secured_message_context,
2809 : LIBSPDM_SESSION_STATE_HANDSHAKING);
2810 1 : session_info->mut_auth_requested = SPDM_KEY_EXCHANGE_RESPONSE_MUT_AUTH_REQUESTED;
2811 :
2812 1 : spdm_context->connection_info.capability.flags |=
2813 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
2814 1 : spdm_context->local_context.capability.flags |=
2815 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
2816 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
2817 1 : hmac_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
2818 1 : req_asym_signature_size =
2819 1 : libspdm_get_req_asym_signature_size(m_libspdm_use_req_asym_algo);
2820 1 : ptr = m_libspdm_finish_request7.signature;
2821 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
2822 1 : cert_buffer = (uint8_t*)data1;
2823 1 : cert_buffer_size = data_size1;
2824 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
2825 : cert_buffer_hash);
2826 1 : cert_buffer = (uint8_t*)data2;
2827 1 : cert_buffer_size = data_size2;
2828 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
2829 : req_cert_buffer_hash);
2830 : /* transcript.message_a size is 0*/
2831 1 : libspdm_append_managed_buffer(&th_curr, cert_buffer_hash, hash_size);
2832 : /* session_transcript.message_k is 0*/
2833 1 : libspdm_append_managed_buffer(&th_curr, req_cert_buffer_hash, hash_size);
2834 1 : libspdm_append_managed_buffer(&th_curr, (uint8_t*)&m_libspdm_finish_request7,
2835 : sizeof(spdm_finish_request_t));
2836 : #if LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP
2837 1 : libspdm_requester_data_sign(
2838 : #if LIBSPDM_HAL_PASS_SPDM_CONTEXT
2839 : spdm_context,
2840 : #endif
2841 1 : m_libspdm_finish_request7.header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT, SPDM_FINISH,
2842 : m_libspdm_use_req_asym_algo, m_libspdm_use_hash_algo,
2843 1 : false, libspdm_get_managed_buffer(&th_curr),
2844 : libspdm_get_managed_buffer_size(&th_curr),
2845 : ptr, &req_asym_signature_size);
2846 : #endif
2847 1 : libspdm_append_managed_buffer(&th_curr, ptr, req_asym_signature_size);
2848 1 : ptr += req_asym_signature_size;
2849 1 : libspdm_set_mem(request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
2850 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
2851 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
2852 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
2853 : request_finished_key, hash_size, ptr);
2854 1 : m_libspdm_finish_request7_size = sizeof(spdm_finish_request_t) +
2855 1 : req_asym_signature_size + hmac_size;
2856 1 : response_size = sizeof(response);
2857 1 : status = libspdm_get_response_finish(spdm_context,
2858 : m_libspdm_finish_request7_size,
2859 : &m_libspdm_finish_request7,
2860 : &response_size, response);
2861 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
2862 1 : spdm_response = (void*)response;
2863 :
2864 : /* Expecting failure on little-endian signature */
2865 1 : assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
2866 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
2867 1 : free(data1);
2868 1 : free(data2);
2869 1 : }
2870 :
2871 : /**
2872 : * Test 24: Same as test case 22 but test signature endianness.
2873 : * Big-Endian Sign. Big-Endian Verify.
2874 : * Expecting signature to PASS.
2875 : **/
2876 1 : void libspdm_test_responder_finish_case24(void** state)
2877 : {
2878 : libspdm_return_t status;
2879 : libspdm_test_context_t* spdm_test_context;
2880 : libspdm_context_t* spdm_context;
2881 : size_t response_size;
2882 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
2883 : spdm_finish_response_t* spdm_response;
2884 : void* data1;
2885 : size_t data_size1;
2886 : void* data2;
2887 : size_t data_size2;
2888 : uint8_t* ptr;
2889 : uint8_t* cert_buffer;
2890 : size_t cert_buffer_size;
2891 : uint8_t cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
2892 : uint8_t req_cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
2893 : uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
2894 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
2895 : libspdm_session_info_t* session_info;
2896 : uint32_t session_id;
2897 : uint32_t hash_size;
2898 : uint32_t hmac_size;
2899 : size_t req_asym_signature_size;
2900 :
2901 1 : spdm_test_context = *state;
2902 1 : spdm_context = spdm_test_context->spdm_context;
2903 1 : spdm_test_context->case_id = 24;
2904 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
2905 : SPDM_VERSION_NUMBER_SHIFT_BIT;
2906 1 : spdm_context->connection_info.connection_state =
2907 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
2908 1 : spdm_context->connection_info.capability.flags |=
2909 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
2910 1 : spdm_context->local_context.capability.flags |=
2911 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
2912 1 : spdm_context->connection_info.algorithm.base_hash_algo =
2913 : m_libspdm_use_hash_algo;
2914 1 : spdm_context->connection_info.algorithm.base_asym_algo =
2915 : m_libspdm_use_asym_algo;
2916 1 : spdm_context->connection_info.algorithm.req_base_asym_alg =
2917 : m_libspdm_use_req_asym_algo;
2918 1 : spdm_context->connection_info.algorithm.measurement_spec =
2919 : m_libspdm_use_measurement_spec;
2920 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
2921 : m_libspdm_use_measurement_hash_algo;
2922 1 : spdm_context->connection_info.algorithm.dhe_named_group =
2923 : m_libspdm_use_dhe_algo;
2924 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
2925 : m_libspdm_use_aead_algo;
2926 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
2927 : m_libspdm_use_asym_algo, &data1,
2928 : &data_size1, NULL, NULL);
2929 1 : spdm_context->local_context.local_cert_chain_provision[0] = data1;
2930 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
2931 : data_size1;
2932 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data1;
2933 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size =
2934 : data_size1;
2935 1 : spdm_context->spdm_10_11_verify_signature_endian =
2936 : LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_ONLY;
2937 :
2938 1 : libspdm_reset_message_a(spdm_context);
2939 1 : spdm_context->local_context.mut_auth_requested = SPDM_KEY_EXCHANGE_RESPONSE_MUT_AUTH_REQUESTED;
2940 1 : libspdm_read_requester_public_certificate_chain(m_libspdm_use_hash_algo,
2941 : m_libspdm_use_req_asym_algo, &data2,
2942 : &data_size2, NULL, NULL);
2943 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
2944 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
2945 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
2946 : data2, data_size2);
2947 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
2948 : data_size2;
2949 : #else
2950 1 : libspdm_hash_all(
2951 : spdm_context->connection_info.algorithm.base_hash_algo,
2952 : data2, data_size2,
2953 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
2954 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
2955 1 : libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
2956 1 : libspdm_get_leaf_cert_public_key_from_cert_chain(
2957 : spdm_context->connection_info.algorithm.base_hash_algo,
2958 1 : spdm_context->connection_info.algorithm.req_base_asym_alg,
2959 : data2,
2960 : data_size2,
2961 : &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
2962 : #endif
2963 1 : spdm_context->connection_info.peer_used_cert_chain_slot_id = 0;
2964 :
2965 1 : session_id = 0xFFFFFFFF;
2966 1 : spdm_context->latest_session_id = session_id;
2967 1 : session_info = &spdm_context->session_info[0];
2968 1 : libspdm_session_info_init(spdm_context, session_info, session_id, false);
2969 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
2970 1 : libspdm_set_mem(m_dummy_buffer, hash_size, (uint8_t)(0xFF));
2971 1 : libspdm_secured_message_set_request_finished_key(
2972 : session_info->secured_message_context, m_dummy_buffer,
2973 : hash_size);
2974 1 : libspdm_secured_message_set_session_state(
2975 : session_info->secured_message_context,
2976 : LIBSPDM_SESSION_STATE_HANDSHAKING);
2977 1 : session_info->mut_auth_requested = SPDM_KEY_EXCHANGE_RESPONSE_MUT_AUTH_REQUESTED;
2978 :
2979 1 : spdm_context->connection_info.capability.flags |=
2980 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
2981 1 : spdm_context->local_context.capability.flags |=
2982 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
2983 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
2984 1 : hmac_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
2985 1 : req_asym_signature_size =
2986 1 : libspdm_get_req_asym_signature_size(m_libspdm_use_req_asym_algo);
2987 1 : ptr = m_libspdm_finish_request7.signature;
2988 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
2989 1 : cert_buffer = (uint8_t*)data1;
2990 1 : cert_buffer_size = data_size1;
2991 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
2992 : cert_buffer_hash);
2993 1 : cert_buffer = (uint8_t*)data2;
2994 1 : cert_buffer_size = data_size2;
2995 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
2996 : req_cert_buffer_hash);
2997 : /* transcript.message_a size is 0*/
2998 1 : libspdm_append_managed_buffer(&th_curr, cert_buffer_hash, hash_size);
2999 : /* session_transcript.message_k is 0*/
3000 1 : libspdm_append_managed_buffer(&th_curr, req_cert_buffer_hash, hash_size);
3001 1 : libspdm_append_managed_buffer(&th_curr, (uint8_t*)&m_libspdm_finish_request7,
3002 : sizeof(spdm_finish_request_t));
3003 : #if LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP
3004 1 : libspdm_requester_data_sign(
3005 : #if LIBSPDM_HAL_PASS_SPDM_CONTEXT
3006 : spdm_context,
3007 : #endif
3008 1 : m_libspdm_finish_request7.header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT, SPDM_FINISH,
3009 : m_libspdm_use_req_asym_algo, m_libspdm_use_hash_algo,
3010 1 : false, libspdm_get_managed_buffer(&th_curr),
3011 : libspdm_get_managed_buffer_size(&th_curr),
3012 : ptr, &req_asym_signature_size);
3013 : #endif
3014 1 : libspdm_append_managed_buffer(&th_curr, ptr, req_asym_signature_size);
3015 1 : ptr += req_asym_signature_size;
3016 1 : libspdm_set_mem(request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
3017 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
3018 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
3019 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
3020 : request_finished_key, hash_size, ptr);
3021 1 : m_libspdm_finish_request7_size = sizeof(spdm_finish_request_t) +
3022 1 : req_asym_signature_size + hmac_size;
3023 1 : response_size = sizeof(response);
3024 1 : status = libspdm_get_response_finish(spdm_context,
3025 : m_libspdm_finish_request7_size,
3026 : &m_libspdm_finish_request7,
3027 : &response_size, response);
3028 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
3029 1 : spdm_response = (void*)response;
3030 :
3031 : /* Expecting pass on big-endian signature */
3032 1 : assert_int_equal(spdm_response->header.request_response_code, SPDM_FINISH_RSP);
3033 1 : assert_int_equal(response_size, sizeof(spdm_finish_response_t) + hmac_size);
3034 1 : free(data1);
3035 1 : free(data2);
3036 1 : }
3037 :
3038 : /**
3039 : * Test 25: Same as test case 22, but test signature endianness.
3040 : * Big Endian Sign. Big or Little Endian Verify.
3041 : * Expecting signature to PASS.
3042 : **/
3043 1 : void libspdm_test_responder_finish_case25(void** state)
3044 : {
3045 : libspdm_return_t status;
3046 : libspdm_test_context_t* spdm_test_context;
3047 : libspdm_context_t* spdm_context;
3048 : size_t response_size;
3049 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
3050 : spdm_finish_response_t* spdm_response;
3051 : void* data1;
3052 : size_t data_size1;
3053 : void* data2;
3054 : size_t data_size2;
3055 : uint8_t* ptr;
3056 : uint8_t* cert_buffer;
3057 : size_t cert_buffer_size;
3058 : uint8_t cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
3059 : uint8_t req_cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
3060 : uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
3061 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
3062 : libspdm_session_info_t* session_info;
3063 : uint32_t session_id;
3064 : uint32_t hash_size;
3065 : uint32_t hmac_size;
3066 : size_t req_asym_signature_size;
3067 :
3068 1 : spdm_test_context = *state;
3069 1 : spdm_context = spdm_test_context->spdm_context;
3070 1 : spdm_test_context->case_id = 25;
3071 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
3072 : SPDM_VERSION_NUMBER_SHIFT_BIT;
3073 1 : spdm_context->connection_info.connection_state =
3074 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
3075 1 : spdm_context->connection_info.capability.flags |=
3076 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
3077 1 : spdm_context->local_context.capability.flags |=
3078 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
3079 1 : spdm_context->connection_info.algorithm.base_hash_algo =
3080 : m_libspdm_use_hash_algo;
3081 1 : spdm_context->connection_info.algorithm.base_asym_algo =
3082 : m_libspdm_use_asym_algo;
3083 1 : spdm_context->connection_info.algorithm.req_base_asym_alg =
3084 : m_libspdm_use_req_asym_algo;
3085 1 : spdm_context->connection_info.algorithm.measurement_spec =
3086 : m_libspdm_use_measurement_spec;
3087 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
3088 : m_libspdm_use_measurement_hash_algo;
3089 1 : spdm_context->connection_info.algorithm.dhe_named_group =
3090 : m_libspdm_use_dhe_algo;
3091 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
3092 : m_libspdm_use_aead_algo;
3093 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
3094 : m_libspdm_use_asym_algo, &data1,
3095 : &data_size1, NULL, NULL);
3096 1 : spdm_context->local_context.local_cert_chain_provision[0] = data1;
3097 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
3098 : data_size1;
3099 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data1;
3100 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size =
3101 : data_size1;
3102 1 : spdm_context->spdm_10_11_verify_signature_endian =
3103 : LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_OR_LITTLE;
3104 :
3105 1 : libspdm_reset_message_a(spdm_context);
3106 1 : spdm_context->local_context.mut_auth_requested = SPDM_KEY_EXCHANGE_RESPONSE_MUT_AUTH_REQUESTED;
3107 1 : libspdm_read_requester_public_certificate_chain(m_libspdm_use_hash_algo,
3108 : m_libspdm_use_req_asym_algo, &data2,
3109 : &data_size2, NULL, NULL);
3110 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
3111 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
3112 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
3113 : data2, data_size2);
3114 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
3115 : data_size2;
3116 : #else
3117 1 : libspdm_hash_all(
3118 : spdm_context->connection_info.algorithm.base_hash_algo,
3119 : data2, data_size2,
3120 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
3121 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
3122 1 : libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
3123 1 : libspdm_get_leaf_cert_public_key_from_cert_chain(
3124 : spdm_context->connection_info.algorithm.base_hash_algo,
3125 1 : spdm_context->connection_info.algorithm.req_base_asym_alg,
3126 : data2,
3127 : data_size2,
3128 : &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
3129 : #endif
3130 1 : spdm_context->connection_info.peer_used_cert_chain_slot_id = 0;
3131 :
3132 1 : session_id = 0xFFFFFFFF;
3133 1 : spdm_context->latest_session_id = session_id;
3134 1 : session_info = &spdm_context->session_info[0];
3135 1 : libspdm_session_info_init(spdm_context, session_info, session_id, false);
3136 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
3137 1 : libspdm_set_mem(m_dummy_buffer, hash_size, (uint8_t)(0xFF));
3138 1 : libspdm_secured_message_set_request_finished_key(
3139 : session_info->secured_message_context, m_dummy_buffer,
3140 : hash_size);
3141 1 : libspdm_secured_message_set_session_state(
3142 : session_info->secured_message_context,
3143 : LIBSPDM_SESSION_STATE_HANDSHAKING);
3144 1 : session_info->mut_auth_requested = SPDM_KEY_EXCHANGE_RESPONSE_MUT_AUTH_REQUESTED;
3145 :
3146 1 : spdm_context->connection_info.capability.flags |=
3147 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
3148 1 : spdm_context->local_context.capability.flags |=
3149 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
3150 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
3151 1 : hmac_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
3152 1 : req_asym_signature_size =
3153 1 : libspdm_get_req_asym_signature_size(m_libspdm_use_req_asym_algo);
3154 1 : ptr = m_libspdm_finish_request7.signature;
3155 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
3156 1 : cert_buffer = (uint8_t*)data1;
3157 1 : cert_buffer_size = data_size1;
3158 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
3159 : cert_buffer_hash);
3160 1 : cert_buffer = (uint8_t*)data2;
3161 1 : cert_buffer_size = data_size2;
3162 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
3163 : req_cert_buffer_hash);
3164 : /* transcript.message_a size is 0*/
3165 1 : libspdm_append_managed_buffer(&th_curr, cert_buffer_hash, hash_size);
3166 : /* session_transcript.message_k is 0*/
3167 1 : libspdm_append_managed_buffer(&th_curr, req_cert_buffer_hash, hash_size);
3168 1 : libspdm_append_managed_buffer(&th_curr, (uint8_t*)&m_libspdm_finish_request7,
3169 : sizeof(spdm_finish_request_t));
3170 : #if LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP
3171 1 : libspdm_requester_data_sign(
3172 : #if LIBSPDM_HAL_PASS_SPDM_CONTEXT
3173 : spdm_context,
3174 : #endif
3175 1 : m_libspdm_finish_request7.header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT, SPDM_FINISH,
3176 : m_libspdm_use_req_asym_algo, m_libspdm_use_hash_algo,
3177 1 : false, libspdm_get_managed_buffer(&th_curr),
3178 : libspdm_get_managed_buffer_size(&th_curr),
3179 : ptr, &req_asym_signature_size);
3180 : #endif
3181 1 : libspdm_append_managed_buffer(&th_curr, ptr, req_asym_signature_size);
3182 1 : ptr += req_asym_signature_size;
3183 1 : libspdm_set_mem(request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
3184 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
3185 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
3186 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
3187 : request_finished_key, hash_size, ptr);
3188 1 : m_libspdm_finish_request7_size = sizeof(spdm_finish_request_t) +
3189 1 : req_asym_signature_size + hmac_size;
3190 1 : response_size = sizeof(response);
3191 1 : status = libspdm_get_response_finish(spdm_context,
3192 : m_libspdm_finish_request7_size,
3193 : &m_libspdm_finish_request7,
3194 : &response_size, response);
3195 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
3196 1 : spdm_response = (void*)response;
3197 1 : assert_int_equal(spdm_response->header.request_response_code, SPDM_FINISH_RSP);
3198 1 : assert_int_equal(response_size, sizeof(spdm_finish_response_t) + hmac_size);
3199 1 : free(data1);
3200 1 : free(data2);
3201 1 : }
3202 :
3203 : /**
3204 : * Test 26: Same as test case 22, but test endian verification.
3205 : * Sign as Little Endian, Verify as Little.
3206 : * Expecting signature to PASS.
3207 : **/
3208 1 : void libspdm_test_responder_finish_case26(void** state)
3209 : {
3210 : libspdm_return_t status;
3211 : libspdm_test_context_t* spdm_test_context;
3212 : libspdm_context_t* spdm_context;
3213 : size_t response_size;
3214 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
3215 : spdm_finish_response_t* spdm_response;
3216 : void* data1;
3217 : size_t data_size1;
3218 : void* data2;
3219 : size_t data_size2;
3220 : uint8_t* ptr;
3221 : uint8_t* cert_buffer;
3222 : size_t cert_buffer_size;
3223 : uint8_t cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
3224 : uint8_t req_cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
3225 : uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
3226 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
3227 : libspdm_session_info_t* session_info;
3228 : uint32_t session_id;
3229 : uint32_t hash_size;
3230 : uint32_t hmac_size;
3231 : size_t req_asym_signature_size;
3232 :
3233 1 : spdm_test_context = *state;
3234 1 : spdm_context = spdm_test_context->spdm_context;
3235 1 : spdm_test_context->case_id = 26;
3236 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
3237 : SPDM_VERSION_NUMBER_SHIFT_BIT;
3238 1 : spdm_context->connection_info.connection_state =
3239 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
3240 1 : spdm_context->connection_info.capability.flags |=
3241 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
3242 1 : spdm_context->local_context.capability.flags |=
3243 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
3244 1 : spdm_context->connection_info.algorithm.base_hash_algo =
3245 : m_libspdm_use_hash_algo;
3246 1 : spdm_context->connection_info.algorithm.base_asym_algo =
3247 : m_libspdm_use_asym_algo;
3248 1 : spdm_context->connection_info.algorithm.req_base_asym_alg =
3249 : m_libspdm_use_req_asym_algo;
3250 1 : spdm_context->connection_info.algorithm.measurement_spec =
3251 : m_libspdm_use_measurement_spec;
3252 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
3253 : m_libspdm_use_measurement_hash_algo;
3254 1 : spdm_context->connection_info.algorithm.dhe_named_group =
3255 : m_libspdm_use_dhe_algo;
3256 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
3257 : m_libspdm_use_aead_algo;
3258 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
3259 : m_libspdm_use_asym_algo, &data1,
3260 : &data_size1, NULL, NULL);
3261 1 : spdm_context->local_context.local_cert_chain_provision[0] = data1;
3262 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
3263 : data_size1;
3264 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data1;
3265 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size =
3266 : data_size1;
3267 1 : spdm_context->spdm_10_11_verify_signature_endian =
3268 : LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_LITTLE_ONLY;
3269 :
3270 1 : libspdm_reset_message_a(spdm_context);
3271 1 : spdm_context->local_context.mut_auth_requested = SPDM_KEY_EXCHANGE_RESPONSE_MUT_AUTH_REQUESTED;
3272 1 : libspdm_read_requester_public_certificate_chain(m_libspdm_use_hash_algo,
3273 : m_libspdm_use_req_asym_algo, &data2,
3274 : &data_size2, NULL, NULL);
3275 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
3276 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
3277 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
3278 : data2, data_size2);
3279 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
3280 : data_size2;
3281 : #else
3282 1 : libspdm_hash_all(
3283 : spdm_context->connection_info.algorithm.base_hash_algo,
3284 : data2, data_size2,
3285 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
3286 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
3287 1 : libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
3288 1 : libspdm_get_leaf_cert_public_key_from_cert_chain(
3289 : spdm_context->connection_info.algorithm.base_hash_algo,
3290 1 : spdm_context->connection_info.algorithm.req_base_asym_alg,
3291 : data2,
3292 : data_size2,
3293 : &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
3294 : #endif
3295 1 : spdm_context->connection_info.peer_used_cert_chain_slot_id = 0;
3296 :
3297 1 : session_id = 0xFFFFFFFF;
3298 1 : spdm_context->latest_session_id = session_id;
3299 1 : session_info = &spdm_context->session_info[0];
3300 1 : libspdm_session_info_init(spdm_context, session_info, session_id, false);
3301 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
3302 1 : libspdm_set_mem(m_dummy_buffer, hash_size, (uint8_t)(0xFF));
3303 1 : libspdm_secured_message_set_request_finished_key(
3304 : session_info->secured_message_context, m_dummy_buffer,
3305 : hash_size);
3306 1 : libspdm_secured_message_set_session_state(
3307 : session_info->secured_message_context,
3308 : LIBSPDM_SESSION_STATE_HANDSHAKING);
3309 1 : session_info->mut_auth_requested = SPDM_KEY_EXCHANGE_RESPONSE_MUT_AUTH_REQUESTED;
3310 :
3311 1 : spdm_context->connection_info.capability.flags |=
3312 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
3313 1 : spdm_context->local_context.capability.flags |=
3314 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
3315 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
3316 1 : hmac_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
3317 1 : req_asym_signature_size =
3318 1 : libspdm_get_req_asym_signature_size(m_libspdm_use_req_asym_algo);
3319 1 : ptr = m_libspdm_finish_request7.signature;
3320 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
3321 1 : cert_buffer = (uint8_t*)data1;
3322 1 : cert_buffer_size = data_size1;
3323 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
3324 : cert_buffer_hash);
3325 1 : cert_buffer = (uint8_t*)data2;
3326 1 : cert_buffer_size = data_size2;
3327 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
3328 : req_cert_buffer_hash);
3329 : /* transcript.message_a size is 0*/
3330 1 : libspdm_append_managed_buffer(&th_curr, cert_buffer_hash, hash_size);
3331 : /* session_transcript.message_k is 0*/
3332 1 : libspdm_append_managed_buffer(&th_curr, req_cert_buffer_hash, hash_size);
3333 1 : libspdm_append_managed_buffer(&th_curr, (uint8_t*)&m_libspdm_finish_request7,
3334 : sizeof(spdm_finish_request_t));
3335 : #if LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP
3336 1 : libspdm_requester_data_sign(
3337 : #if LIBSPDM_HAL_PASS_SPDM_CONTEXT
3338 : spdm_context,
3339 : #endif
3340 1 : m_libspdm_finish_request7.header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT, SPDM_FINISH,
3341 : m_libspdm_use_req_asym_algo, m_libspdm_use_hash_algo,
3342 1 : false, libspdm_get_managed_buffer(&th_curr),
3343 : libspdm_get_managed_buffer_size(&th_curr),
3344 : ptr, &req_asym_signature_size);
3345 :
3346 : /* Switch signature to little endian */
3347 1 : libspdm_copy_signature_swap_endian(
3348 : m_libspdm_use_req_asym_algo,
3349 : ptr, req_asym_signature_size,
3350 : ptr, req_asym_signature_size);
3351 : #endif
3352 1 : libspdm_append_managed_buffer(&th_curr, ptr, req_asym_signature_size);
3353 1 : ptr += req_asym_signature_size;
3354 1 : libspdm_set_mem(request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
3355 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
3356 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
3357 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
3358 : request_finished_key, hash_size, ptr);
3359 1 : m_libspdm_finish_request7_size = sizeof(spdm_finish_request_t) +
3360 1 : req_asym_signature_size + hmac_size;
3361 1 : response_size = sizeof(response);
3362 1 : status = libspdm_get_response_finish(spdm_context,
3363 : m_libspdm_finish_request7_size,
3364 : &m_libspdm_finish_request7,
3365 : &response_size, response);
3366 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
3367 1 : spdm_response = (void*)response;
3368 1 : assert_int_equal(spdm_response->header.request_response_code, SPDM_FINISH_RSP);
3369 1 : assert_int_equal(response_size, sizeof(spdm_finish_response_t) + hmac_size);
3370 1 : free(data1);
3371 1 : free(data2);
3372 1 : }
3373 :
3374 : /**
3375 : * Test 27: Same as test case 22, but test endian verification.
3376 : * Sign as Little Endian, Verify as Big.
3377 : * Expecting signature to FAIL.
3378 : **/
3379 1 : void libspdm_test_responder_finish_case27(void** state)
3380 : {
3381 : libspdm_return_t status;
3382 : libspdm_test_context_t* spdm_test_context;
3383 : libspdm_context_t* spdm_context;
3384 : size_t response_size;
3385 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
3386 : spdm_finish_response_t* spdm_response;
3387 : void* data1;
3388 : size_t data_size1;
3389 : void* data2;
3390 : size_t data_size2;
3391 : uint8_t* ptr;
3392 : uint8_t* cert_buffer;
3393 : size_t cert_buffer_size;
3394 : uint8_t cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
3395 : uint8_t req_cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
3396 : uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
3397 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
3398 : libspdm_session_info_t* session_info;
3399 : uint32_t session_id;
3400 : uint32_t hash_size;
3401 : uint32_t hmac_size;
3402 : size_t req_asym_signature_size;
3403 :
3404 1 : spdm_test_context = *state;
3405 1 : spdm_context = spdm_test_context->spdm_context;
3406 1 : spdm_test_context->case_id = 27;
3407 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
3408 : SPDM_VERSION_NUMBER_SHIFT_BIT;
3409 1 : spdm_context->connection_info.connection_state =
3410 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
3411 1 : spdm_context->connection_info.capability.flags |=
3412 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
3413 1 : spdm_context->local_context.capability.flags |=
3414 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
3415 1 : spdm_context->connection_info.algorithm.base_hash_algo =
3416 : m_libspdm_use_hash_algo;
3417 1 : spdm_context->connection_info.algorithm.base_asym_algo =
3418 : m_libspdm_use_asym_algo;
3419 1 : spdm_context->connection_info.algorithm.req_base_asym_alg =
3420 : m_libspdm_use_req_asym_algo;
3421 1 : spdm_context->connection_info.algorithm.measurement_spec =
3422 : m_libspdm_use_measurement_spec;
3423 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
3424 : m_libspdm_use_measurement_hash_algo;
3425 1 : spdm_context->connection_info.algorithm.dhe_named_group =
3426 : m_libspdm_use_dhe_algo;
3427 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
3428 : m_libspdm_use_aead_algo;
3429 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
3430 : m_libspdm_use_asym_algo, &data1,
3431 : &data_size1, NULL, NULL);
3432 1 : spdm_context->local_context.local_cert_chain_provision[0] = data1;
3433 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
3434 : data_size1;
3435 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data1;
3436 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size =
3437 : data_size1;
3438 1 : spdm_context->spdm_10_11_verify_signature_endian =
3439 : LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_ONLY;
3440 :
3441 1 : libspdm_reset_message_a(spdm_context);
3442 1 : spdm_context->local_context.mut_auth_requested = SPDM_KEY_EXCHANGE_RESPONSE_MUT_AUTH_REQUESTED;
3443 1 : libspdm_read_requester_public_certificate_chain(m_libspdm_use_hash_algo,
3444 : m_libspdm_use_req_asym_algo, &data2,
3445 : &data_size2, NULL, NULL);
3446 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
3447 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
3448 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
3449 : data2, data_size2);
3450 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
3451 : data_size2;
3452 : #else
3453 1 : libspdm_hash_all(
3454 : spdm_context->connection_info.algorithm.base_hash_algo,
3455 : data2, data_size2,
3456 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
3457 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
3458 1 : libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
3459 1 : libspdm_get_leaf_cert_public_key_from_cert_chain(
3460 : spdm_context->connection_info.algorithm.base_hash_algo,
3461 1 : spdm_context->connection_info.algorithm.req_base_asym_alg,
3462 : data2,
3463 : data_size2,
3464 : &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
3465 : #endif
3466 1 : spdm_context->connection_info.peer_used_cert_chain_slot_id = 0;
3467 :
3468 1 : session_id = 0xFFFFFFFF;
3469 1 : spdm_context->latest_session_id = session_id;
3470 1 : session_info = &spdm_context->session_info[0];
3471 1 : libspdm_session_info_init(spdm_context, session_info, session_id, false);
3472 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
3473 1 : libspdm_set_mem(m_dummy_buffer, hash_size, (uint8_t)(0xFF));
3474 1 : libspdm_secured_message_set_request_finished_key(
3475 : session_info->secured_message_context, m_dummy_buffer,
3476 : hash_size);
3477 1 : libspdm_secured_message_set_session_state(
3478 : session_info->secured_message_context,
3479 : LIBSPDM_SESSION_STATE_HANDSHAKING);
3480 1 : session_info->mut_auth_requested = SPDM_KEY_EXCHANGE_RESPONSE_MUT_AUTH_REQUESTED;
3481 :
3482 1 : spdm_context->connection_info.capability.flags |=
3483 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
3484 1 : spdm_context->local_context.capability.flags |=
3485 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
3486 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
3487 1 : hmac_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
3488 1 : req_asym_signature_size =
3489 1 : libspdm_get_req_asym_signature_size(m_libspdm_use_req_asym_algo);
3490 1 : ptr = m_libspdm_finish_request7.signature;
3491 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
3492 1 : cert_buffer = (uint8_t*)data1;
3493 1 : cert_buffer_size = data_size1;
3494 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
3495 : cert_buffer_hash);
3496 1 : cert_buffer = (uint8_t*)data2;
3497 1 : cert_buffer_size = data_size2;
3498 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
3499 : req_cert_buffer_hash);
3500 : /* transcript.message_a size is 0*/
3501 1 : libspdm_append_managed_buffer(&th_curr, cert_buffer_hash, hash_size);
3502 : /* session_transcript.message_k is 0*/
3503 1 : libspdm_append_managed_buffer(&th_curr, req_cert_buffer_hash, hash_size);
3504 1 : libspdm_append_managed_buffer(&th_curr, (uint8_t*)&m_libspdm_finish_request7,
3505 : sizeof(spdm_finish_request_t));
3506 : #if LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP
3507 1 : libspdm_requester_data_sign(
3508 : #if LIBSPDM_HAL_PASS_SPDM_CONTEXT
3509 : spdm_context,
3510 : #endif
3511 1 : m_libspdm_finish_request7.header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT, SPDM_FINISH,
3512 : m_libspdm_use_req_asym_algo, m_libspdm_use_hash_algo,
3513 1 : false, libspdm_get_managed_buffer(&th_curr),
3514 : libspdm_get_managed_buffer_size(&th_curr),
3515 : ptr, &req_asym_signature_size);
3516 :
3517 : /* Switch signature to little endian */
3518 1 : libspdm_copy_signature_swap_endian(
3519 : m_libspdm_use_req_asym_algo,
3520 : ptr, req_asym_signature_size,
3521 : ptr, req_asym_signature_size);
3522 : #endif
3523 1 : libspdm_append_managed_buffer(&th_curr, ptr, req_asym_signature_size);
3524 1 : ptr += req_asym_signature_size;
3525 1 : libspdm_set_mem(request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
3526 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
3527 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
3528 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
3529 : request_finished_key, hash_size, ptr);
3530 1 : m_libspdm_finish_request7_size = sizeof(spdm_finish_request_t) +
3531 1 : req_asym_signature_size + hmac_size;
3532 1 : response_size = sizeof(response);
3533 1 : status = libspdm_get_response_finish(spdm_context,
3534 : m_libspdm_finish_request7_size,
3535 : &m_libspdm_finish_request7,
3536 : &response_size, response);
3537 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
3538 1 : spdm_response = (void*)response;
3539 1 : assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
3540 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
3541 1 : free(data1);
3542 1 : free(data2);
3543 1 : }
3544 :
3545 : /**
3546 : * Test 28: Same as test case 22, but test endian verification.
3547 : * Sign as Little Endian, Verify as Big Or Little.
3548 : * Expecting signature to PASS.
3549 : **/
3550 1 : void libspdm_test_responder_finish_case28(void** state)
3551 : {
3552 : libspdm_return_t status;
3553 : libspdm_test_context_t* spdm_test_context;
3554 : libspdm_context_t* spdm_context;
3555 : size_t response_size;
3556 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
3557 : spdm_finish_response_t* spdm_response;
3558 : void* data1;
3559 : size_t data_size1;
3560 : void* data2;
3561 : size_t data_size2;
3562 : uint8_t* ptr;
3563 : uint8_t* cert_buffer;
3564 : size_t cert_buffer_size;
3565 : uint8_t cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
3566 : uint8_t req_cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
3567 : uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
3568 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
3569 : libspdm_session_info_t* session_info;
3570 : uint32_t session_id;
3571 : uint32_t hash_size;
3572 : uint32_t hmac_size;
3573 : size_t req_asym_signature_size;
3574 :
3575 1 : spdm_test_context = *state;
3576 1 : spdm_context = spdm_test_context->spdm_context;
3577 1 : spdm_test_context->case_id = 28;
3578 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
3579 : SPDM_VERSION_NUMBER_SHIFT_BIT;
3580 1 : spdm_context->connection_info.connection_state =
3581 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
3582 1 : spdm_context->connection_info.capability.flags |=
3583 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
3584 1 : spdm_context->local_context.capability.flags |=
3585 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
3586 1 : spdm_context->connection_info.algorithm.base_hash_algo =
3587 : m_libspdm_use_hash_algo;
3588 1 : spdm_context->connection_info.algorithm.base_asym_algo =
3589 : m_libspdm_use_asym_algo;
3590 1 : spdm_context->connection_info.algorithm.req_base_asym_alg =
3591 : m_libspdm_use_req_asym_algo;
3592 1 : spdm_context->connection_info.algorithm.measurement_spec =
3593 : m_libspdm_use_measurement_spec;
3594 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
3595 : m_libspdm_use_measurement_hash_algo;
3596 1 : spdm_context->connection_info.algorithm.dhe_named_group =
3597 : m_libspdm_use_dhe_algo;
3598 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
3599 : m_libspdm_use_aead_algo;
3600 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
3601 : m_libspdm_use_asym_algo, &data1,
3602 : &data_size1, NULL, NULL);
3603 1 : spdm_context->local_context.local_cert_chain_provision[0] = data1;
3604 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
3605 : data_size1;
3606 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data1;
3607 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size =
3608 : data_size1;
3609 1 : spdm_context->spdm_10_11_verify_signature_endian =
3610 : LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_LITTLE_ONLY;
3611 :
3612 1 : libspdm_reset_message_a(spdm_context);
3613 1 : spdm_context->local_context.mut_auth_requested = SPDM_KEY_EXCHANGE_RESPONSE_MUT_AUTH_REQUESTED;
3614 1 : libspdm_read_requester_public_certificate_chain(m_libspdm_use_hash_algo,
3615 : m_libspdm_use_req_asym_algo, &data2,
3616 : &data_size2, NULL, NULL);
3617 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
3618 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
3619 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
3620 : data2, data_size2);
3621 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
3622 : data_size2;
3623 : #else
3624 1 : libspdm_hash_all(
3625 : spdm_context->connection_info.algorithm.base_hash_algo,
3626 : data2, data_size2,
3627 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
3628 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
3629 1 : libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
3630 1 : libspdm_get_leaf_cert_public_key_from_cert_chain(
3631 : spdm_context->connection_info.algorithm.base_hash_algo,
3632 1 : spdm_context->connection_info.algorithm.req_base_asym_alg,
3633 : data2,
3634 : data_size2,
3635 : &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
3636 : #endif
3637 1 : spdm_context->connection_info.peer_used_cert_chain_slot_id = 0;
3638 :
3639 1 : session_id = 0xFFFFFFFF;
3640 1 : spdm_context->latest_session_id = session_id;
3641 1 : session_info = &spdm_context->session_info[0];
3642 1 : libspdm_session_info_init(spdm_context, session_info, session_id, false);
3643 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
3644 1 : libspdm_set_mem(m_dummy_buffer, hash_size, (uint8_t)(0xFF));
3645 1 : libspdm_secured_message_set_request_finished_key(
3646 : session_info->secured_message_context, m_dummy_buffer,
3647 : hash_size);
3648 1 : libspdm_secured_message_set_session_state(
3649 : session_info->secured_message_context,
3650 : LIBSPDM_SESSION_STATE_HANDSHAKING);
3651 1 : session_info->mut_auth_requested = SPDM_KEY_EXCHANGE_RESPONSE_MUT_AUTH_REQUESTED;
3652 :
3653 1 : spdm_context->connection_info.capability.flags |=
3654 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
3655 1 : spdm_context->local_context.capability.flags |=
3656 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
3657 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
3658 1 : hmac_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
3659 1 : req_asym_signature_size =
3660 1 : libspdm_get_req_asym_signature_size(m_libspdm_use_req_asym_algo);
3661 1 : ptr = m_libspdm_finish_request7.signature;
3662 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
3663 1 : cert_buffer = (uint8_t*)data1;
3664 1 : cert_buffer_size = data_size1;
3665 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
3666 : cert_buffer_hash);
3667 1 : cert_buffer = (uint8_t*)data2;
3668 1 : cert_buffer_size = data_size2;
3669 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
3670 : req_cert_buffer_hash);
3671 : /* transcript.message_a size is 0*/
3672 1 : libspdm_append_managed_buffer(&th_curr, cert_buffer_hash, hash_size);
3673 : /* session_transcript.message_k is 0*/
3674 1 : libspdm_append_managed_buffer(&th_curr, req_cert_buffer_hash, hash_size);
3675 1 : libspdm_append_managed_buffer(&th_curr, (uint8_t*)&m_libspdm_finish_request7,
3676 : sizeof(spdm_finish_request_t));
3677 : #if LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP
3678 1 : libspdm_requester_data_sign(
3679 : #if LIBSPDM_HAL_PASS_SPDM_CONTEXT
3680 : spdm_context,
3681 : #endif
3682 1 : m_libspdm_finish_request7.header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT, SPDM_FINISH,
3683 : m_libspdm_use_req_asym_algo, m_libspdm_use_hash_algo,
3684 1 : false, libspdm_get_managed_buffer(&th_curr),
3685 : libspdm_get_managed_buffer_size(&th_curr),
3686 : ptr, &req_asym_signature_size);
3687 :
3688 : /* Switch signature to little endian */
3689 1 : libspdm_copy_signature_swap_endian(
3690 : m_libspdm_use_req_asym_algo,
3691 : ptr, req_asym_signature_size,
3692 : ptr, req_asym_signature_size);
3693 : #endif
3694 1 : libspdm_append_managed_buffer(&th_curr, ptr, req_asym_signature_size);
3695 1 : ptr += req_asym_signature_size;
3696 1 : libspdm_set_mem(request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
3697 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
3698 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
3699 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
3700 : request_finished_key, hash_size, ptr);
3701 1 : m_libspdm_finish_request7_size = sizeof(spdm_finish_request_t) +
3702 1 : req_asym_signature_size + hmac_size;
3703 1 : response_size = sizeof(response);
3704 1 : status = libspdm_get_response_finish(spdm_context,
3705 : m_libspdm_finish_request7_size,
3706 : &m_libspdm_finish_request7,
3707 : &response_size, response);
3708 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
3709 1 : spdm_response = (void*)response;
3710 1 : assert_int_equal(spdm_response->header.request_response_code, SPDM_FINISH_RSP);
3711 1 : assert_int_equal(response_size, sizeof(spdm_finish_response_t) + hmac_size);
3712 1 : free(data1);
3713 1 : free(data2);
3714 1 : }
3715 :
3716 : /**
3717 : * Test 29: Receive the correct FINISH from the requester, and
3718 : * the requester and responder have not set HANDSHAKE_IN_THE_CLEAR.
3719 : * Expected behavior: the responder accepts the request and produces a valid
3720 : * FINISH_RSP response message, and The ResponderVerifyData field is absent.
3721 : **/
3722 1 : void libspdm_test_responder_finish_case29(void **state)
3723 : {
3724 : libspdm_return_t status;
3725 : libspdm_test_context_t *spdm_test_context;
3726 : libspdm_context_t *spdm_context;
3727 : size_t response_size;
3728 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
3729 : spdm_finish_response_t *spdm_response;
3730 : void *data1;
3731 : size_t data_size1;
3732 : uint8_t *ptr;
3733 : uint8_t *cert_buffer;
3734 : size_t cert_buffer_size;
3735 : uint8_t cert_buffer_hash[LIBSPDM_MAX_HASH_SIZE];
3736 : uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
3737 : uint8_t request_finished_key[LIBSPDM_MAX_HASH_SIZE];
3738 : libspdm_session_info_t *session_info;
3739 : uint32_t session_id;
3740 : uint32_t hash_size;
3741 : uint32_t hmac_size;
3742 :
3743 1 : spdm_test_context = *state;
3744 1 : spdm_context = spdm_test_context->spdm_context;
3745 1 : spdm_test_context->case_id = 29;
3746 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
3747 : SPDM_VERSION_NUMBER_SHIFT_BIT;
3748 1 : spdm_context->connection_info.connection_state =
3749 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
3750 1 : spdm_context->connection_info.capability.flags |=
3751 : SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP;
3752 1 : spdm_context->local_context.capability.flags |=
3753 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
3754 :
3755 1 : spdm_context->connection_info.algorithm.base_hash_algo =
3756 : m_libspdm_use_hash_algo;
3757 1 : spdm_context->connection_info.algorithm.base_asym_algo =
3758 : m_libspdm_use_asym_algo;
3759 1 : spdm_context->connection_info.algorithm.measurement_spec =
3760 : m_libspdm_use_measurement_spec;
3761 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
3762 : m_libspdm_use_measurement_hash_algo;
3763 1 : spdm_context->connection_info.algorithm.dhe_named_group =
3764 : m_libspdm_use_dhe_algo;
3765 1 : spdm_context->connection_info.algorithm.aead_cipher_suite =
3766 : m_libspdm_use_aead_algo;
3767 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
3768 : m_libspdm_use_asym_algo, &data1,
3769 : &data_size1, NULL, NULL);
3770 1 : spdm_context->local_context.local_cert_chain_provision[0] = data1;
3771 1 : spdm_context->local_context.local_cert_chain_provision_size[0] =
3772 : data_size1;
3773 1 : spdm_context->connection_info.local_used_cert_chain_buffer = data1;
3774 1 : spdm_context->connection_info.local_used_cert_chain_buffer_size =
3775 : data_size1;
3776 :
3777 1 : libspdm_reset_message_a(spdm_context);
3778 1 : spdm_context->local_context.mut_auth_requested = 0;
3779 :
3780 : /* The requester and responder have not set HANDSHAKE_IN_THE_CLEAR*/
3781 1 : spdm_context->connection_info.capability.flags &=
3782 : ~SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
3783 1 : spdm_context->local_context.capability.flags &=
3784 : ~SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP;
3785 :
3786 1 : session_id = 0xFFFFFFFF;
3787 1 : spdm_context->latest_session_id = session_id;
3788 1 : spdm_context->last_spdm_request_session_id_valid = true;
3789 1 : spdm_context->last_spdm_request_session_id = session_id;
3790 1 : session_info = &spdm_context->session_info[0];
3791 1 : libspdm_session_info_init(spdm_context, session_info, session_id, false);
3792 :
3793 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
3794 1 : hmac_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
3795 :
3796 1 : libspdm_set_mem(m_dummy_buffer, hash_size, (uint8_t)(0xFF));
3797 1 : libspdm_secured_message_set_request_finished_key(
3798 : session_info->secured_message_context, m_dummy_buffer,
3799 : hash_size);
3800 1 : libspdm_secured_message_set_session_state(
3801 : session_info->secured_message_context,
3802 : LIBSPDM_SESSION_STATE_HANDSHAKING);
3803 :
3804 1 : hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
3805 1 : ptr = m_libspdm_finish_request1.signature;
3806 1 : libspdm_init_managed_buffer(&th_curr, sizeof(th_curr.buffer));
3807 1 : cert_buffer = (uint8_t *)data1;
3808 1 : cert_buffer_size = data_size1;
3809 1 : libspdm_hash_all(m_libspdm_use_hash_algo, cert_buffer, cert_buffer_size,
3810 : cert_buffer_hash);
3811 : /* transcript.message_a size is 0*/
3812 1 : libspdm_append_managed_buffer(&th_curr, cert_buffer_hash, hash_size);
3813 : /* session_transcript.message_k is 0*/
3814 1 : libspdm_append_managed_buffer(&th_curr, (uint8_t *)&m_libspdm_finish_request1,
3815 : sizeof(spdm_finish_request_t));
3816 1 : libspdm_set_mem(request_finished_key, LIBSPDM_MAX_HASH_SIZE, (uint8_t)(0xFF));
3817 1 : libspdm_hash_all(m_libspdm_use_hash_algo, libspdm_get_managed_buffer(&th_curr),
3818 : libspdm_get_managed_buffer_size(&th_curr), hash_data);
3819 1 : libspdm_hmac_all(m_libspdm_use_hash_algo, hash_data, hash_size,
3820 : request_finished_key, hash_size, ptr);
3821 1 : m_libspdm_finish_request1_size = sizeof(spdm_finish_request_t) + hmac_size;
3822 1 : response_size = sizeof(response);
3823 1 : status = libspdm_get_response_finish(spdm_context,
3824 : m_libspdm_finish_request1_size,
3825 : &m_libspdm_finish_request1,
3826 : &response_size, response);
3827 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
3828 : /* The ResponderVerifyData field shall be absent.*/
3829 1 : assert_int_equal(response_size,
3830 : sizeof(spdm_finish_response_t));
3831 1 : spdm_response = (void *)response;
3832 1 : assert_int_equal(spdm_response->header.request_response_code,
3833 : SPDM_FINISH_RSP);
3834 1 : free(data1);
3835 1 : }
3836 :
3837 1 : int libspdm_responder_finish_test_main(void)
3838 : {
3839 1 : const struct CMUnitTest spdm_responder_finish_tests[] = {
3840 : /* Success Case*/
3841 : cmocka_unit_test(libspdm_test_responder_finish_case1),
3842 : /* Can be populated with new test.*/
3843 : cmocka_unit_test(libspdm_test_responder_finish_case2),
3844 : /* response_state: SPDM_RESPONSE_STATE_BUSY*/
3845 : cmocka_unit_test(libspdm_test_responder_finish_case3),
3846 : /* response_state: SPDM_RESPONSE_STATE_NEED_RESYNC*/
3847 : cmocka_unit_test(libspdm_test_responder_finish_case4),
3848 : #if LIBSPDM_RESPOND_IF_READY_SUPPORT
3849 : /* response_state: LIBSPDM_RESPONSE_STATE_NOT_READY*/
3850 : cmocka_unit_test(libspdm_test_responder_finish_case5),
3851 : #endif /* LIBSPDM_RESPOND_IF_READY_SUPPORT */
3852 : /* connection_state Check*/
3853 : cmocka_unit_test(libspdm_test_responder_finish_case6),
3854 : /* Buffer reset*/
3855 : cmocka_unit_test(libspdm_test_responder_finish_case7),
3856 : /* Success Case*/
3857 : cmocka_unit_test(libspdm_test_responder_finish_case8),
3858 : /* Unsupported KEY_EX capabilities*/
3859 : cmocka_unit_test(libspdm_test_responder_finish_case9),
3860 : /* Uninitialized session*/
3861 : cmocka_unit_test(libspdm_test_responder_finish_case10),
3862 : /* Incorrect MAC*/
3863 : cmocka_unit_test(libspdm_test_responder_finish_case11),
3864 : cmocka_unit_test(libspdm_test_responder_finish_case12),
3865 : /* Can be populated with new test.*/
3866 : cmocka_unit_test(libspdm_test_responder_finish_case13),
3867 : cmocka_unit_test(libspdm_test_responder_finish_case14),
3868 : /* Incorrect signature*/
3869 : cmocka_unit_test(libspdm_test_responder_finish_case15),
3870 : cmocka_unit_test(libspdm_test_responder_finish_case16),
3871 : /* Buffer verification*/
3872 : cmocka_unit_test(libspdm_test_responder_finish_case17),
3873 : /* Success Case, enable mutual authentication and use slot_id 0xFF */
3874 : cmocka_unit_test(libspdm_test_responder_finish_case18),
3875 : /* Invalid SlotID in FINISH request message when mutual authentication */
3876 : cmocka_unit_test_setup(libspdm_test_responder_finish_case19, libspdm_unit_test_group_setup),
3877 : cmocka_unit_test_setup(libspdm_test_responder_finish_case20, libspdm_unit_test_group_setup),
3878 : /* If FINISH.Param1 != 0x01, then FINISH.Param2 is reserved, shall be ignored when read */
3879 : cmocka_unit_test_setup(libspdm_test_responder_finish_case21, libspdm_unit_test_group_setup),
3880 : /* If KEY_EXCHANGE_RSP.MutAuthRequested equals neither 0x02 nor 0x04, FINISH.Param2 no need match ENCAPSULATED_RESPONSE_ACK.EncapsulatedRequest */
3881 : cmocka_unit_test_setup(libspdm_test_responder_finish_case22, libspdm_unit_test_group_setup),
3882 : /* Big Endian Sign - Little Endian Verify */
3883 : cmocka_unit_test_setup(libspdm_test_responder_finish_case23, libspdm_unit_test_group_setup),
3884 : /* Big Endian Sign - Big Endian Verify */
3885 : cmocka_unit_test_setup(libspdm_test_responder_finish_case24, libspdm_unit_test_group_setup),
3886 : /* Big Endian Sign - Big or Little Endian Verify */
3887 : cmocka_unit_test_setup(libspdm_test_responder_finish_case25, libspdm_unit_test_group_setup),
3888 : /* Little Endian Sign - Little Endian Verify*/
3889 : cmocka_unit_test_setup(libspdm_test_responder_finish_case26, libspdm_unit_test_group_setup),
3890 : /* Little Endian Sign - Big Endian Verify */
3891 : cmocka_unit_test_setup(libspdm_test_responder_finish_case27, libspdm_unit_test_group_setup),
3892 : /* Little Endian Sign - Big or Little Endian Verify */
3893 : cmocka_unit_test_setup(libspdm_test_responder_finish_case28, libspdm_unit_test_group_setup),
3894 : /* The requester and responder have not set HANDSHAKE_IN_THE_CLEAR*/
3895 : cmocka_unit_test(libspdm_test_responder_finish_case29),
3896 : };
3897 :
3898 1 : libspdm_test_context_t test_context = {
3899 : LIBSPDM_TEST_CONTEXT_VERSION,
3900 : false,
3901 : };
3902 :
3903 1 : libspdm_setup_test_context(&test_context);
3904 :
3905 1 : return cmocka_run_group_tests(spdm_responder_finish_tests,
3906 : libspdm_unit_test_group_setup,
3907 : libspdm_unit_test_group_teardown);
3908 : }
3909 :
3910 : #endif /* LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP*/
|