Line data Source code
1 : /**
2 : * Copyright Notice:
3 : * Copyright 2021-2025 DMTF. All rights reserved.
4 : * License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
5 : **/
6 :
7 : #include "spdm_unit_test.h"
8 : #include "internal/libspdm_responder_lib.h"
9 : #include "internal/libspdm_requester_lib.h"
10 :
11 : #if LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP
12 :
13 79 : void spdm_meas_log_reset_callback (
14 : void *spdm_context,
15 : const uint32_t *session_id)
16 : {
17 79 : libspdm_context_t *context = spdm_context;
18 79 : if (session_id == NULL) {
19 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
20 : assert_int_equal(context->transcript.message_m.buffer_size, 0);
21 : #else
22 77 : assert_null(context->transcript.digest_context_l1l2);
23 : #endif
24 : } else {
25 2 : libspdm_session_info_t* session_info = &context->session_info[0];
26 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
27 : assert_int_equal(session_info->session_transcript.message_m.buffer_size, 0);
28 : #else
29 2 : assert_null(session_info->session_transcript.digest_context_l1l2);
30 : #endif
31 : }
32 79 : }
33 :
34 : spdm_get_measurements_request_t m_libspdm_get_measurements_request1 = {
35 : { SPDM_MESSAGE_VERSION_10, SPDM_GET_MEASUREMENTS, 0,
36 : SPDM_GET_MEASUREMENTS_REQUEST_MEASUREMENT_OPERATION_TOTAL_NUMBER_OF_MEASUREMENTS },
37 : };
38 : size_t m_libspdm_get_measurements_request1_size = sizeof(spdm_message_header_t);
39 :
40 : spdm_get_measurements_request_t m_libspdm_get_measurements_request3 = {
41 : { SPDM_MESSAGE_VERSION_10, SPDM_GET_MEASUREMENTS,
42 : SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE, 1 },
43 : };
44 : size_t m_libspdm_get_measurements_request3_size =
45 : sizeof(m_libspdm_get_measurements_request3) - sizeof(uint8_t);
46 :
47 : spdm_get_measurements_request_t m_libspdm_get_measurements_request4 = {
48 : { SPDM_MESSAGE_VERSION_10, SPDM_GET_MEASUREMENTS,
49 : SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE, 1 },
50 : };
51 : size_t m_libspdm_get_measurements_request4_size = sizeof(spdm_message_header_t);
52 :
53 : spdm_get_measurements_request_t m_libspdm_get_measurements_request5 = {
54 : { SPDM_MESSAGE_VERSION_10, SPDM_GET_MEASUREMENTS,
55 : SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE,
56 : SPDM_GET_MEASUREMENTS_REQUEST_MEASUREMENT_OPERATION_TOTAL_NUMBER_OF_MEASUREMENTS },
57 : };
58 : size_t m_libspdm_get_measurements_request5_size =
59 : sizeof(m_libspdm_get_measurements_request5) - sizeof(uint8_t);
60 :
61 : spdm_get_measurements_request_t m_libspdm_get_measurements_request6 = {
62 : { SPDM_MESSAGE_VERSION_10, SPDM_GET_MEASUREMENTS, 0, 1 },
63 : };
64 : size_t m_libspdm_get_measurements_request6_size = sizeof(spdm_message_header_t);
65 :
66 : spdm_get_measurements_request_t m_libspdm_get_measurements_request7 = {
67 : { SPDM_MESSAGE_VERSION_10, SPDM_GET_MEASUREMENTS, 0,
68 : SPDM_GET_MEASUREMENTS_REQUEST_MEASUREMENT_OPERATION_ALL_MEASUREMENTS },
69 : };
70 : size_t m_libspdm_get_measurements_request7_size = sizeof(spdm_message_header_t);
71 :
72 : spdm_get_measurements_request_t m_libspdm_get_measurements_request8 = {
73 : { SPDM_MESSAGE_VERSION_10, SPDM_GET_MEASUREMENTS,
74 : SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE,
75 : SPDM_GET_MEASUREMENTS_REQUEST_MEASUREMENT_OPERATION_ALL_MEASUREMENTS },
76 : };
77 : size_t m_libspdm_get_measurements_request8_size =
78 : sizeof(m_libspdm_get_measurements_request8) - sizeof(uint8_t);
79 :
80 : spdm_get_measurements_request_t m_libspdm_get_measurements_request9 = {
81 : { SPDM_MESSAGE_VERSION_11, SPDM_GET_MEASUREMENTS, 0, 1 },
82 : };
83 : size_t m_libspdm_get_measurements_request9_size = sizeof(spdm_message_header_t);
84 :
85 : spdm_get_measurements_request_t m_libspdm_get_measurements_request10 = {
86 : { SPDM_MESSAGE_VERSION_11, SPDM_GET_MEASUREMENTS,
87 : SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE, 1 },
88 : };
89 : size_t m_libspdm_get_measurements_request10_size =
90 : sizeof(m_libspdm_get_measurements_request10);
91 :
92 : spdm_get_measurements_request_t m_libspdm_get_measurements_request11 = {
93 : { SPDM_MESSAGE_VERSION_11, SPDM_GET_MEASUREMENTS,
94 : SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE, 1 },
95 : /* nonce
96 : * SlotId != 0*/
97 : };
98 : size_t m_libspdm_get_measurements_request11_size =
99 : sizeof(m_libspdm_get_measurements_request11);
100 :
101 : spdm_get_measurements_request_t m_libspdm_get_measurements_request12 = {
102 : { SPDM_MESSAGE_VERSION_11, SPDM_GET_MEASUREMENTS,
103 : SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE, 1 },
104 : /* nonce
105 : * SlotId >= SPDM_MAX_SLOT_COUNT*/
106 : };
107 : size_t m_libspdm_get_measurements_request12_size =
108 : sizeof(m_libspdm_get_measurements_request12);
109 :
110 : spdm_get_measurements_request_t m_libspdm_get_measurements_request13 = {
111 : { SPDM_MESSAGE_VERSION_11, SPDM_GET_MEASUREMENTS, 0, 0xF0 },
112 : };
113 : size_t m_libspdm_get_measurements_request13_size = sizeof(spdm_message_header_t);
114 :
115 : spdm_get_measurements_request_t m_libspdm_get_measurements_request14 = {
116 : { SPDM_MESSAGE_VERSION_12, SPDM_GET_MEASUREMENTS,
117 : SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_RAW_BIT_STREAM_REQUESTED, 1},
118 : };
119 : size_t m_libspdm_get_measurements_request14_size = sizeof(spdm_message_header_t);
120 :
121 : spdm_get_measurements_request_t m_libspdm_get_measurements_request15 = {
122 : { SPDM_MESSAGE_VERSION_12, SPDM_GET_MEASUREMENTS,
123 : SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE, 1},
124 : };
125 : size_t m_libspdm_get_measurements_request15_size = sizeof(m_libspdm_get_measurements_request14);
126 :
127 : spdm_get_measurements_request_t m_libspdm_get_measurements_request16 = {
128 : { SPDM_MESSAGE_VERSION_12, SPDM_GET_MEASUREMENTS,
129 : SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE, 1 },
130 : };
131 : size_t m_libspdm_get_measurements_request16_size = sizeof(m_libspdm_get_measurements_request16);
132 :
133 : spdm_get_measurements_request_t m_libspdm_get_measurements_request17 = {
134 : { SPDM_MESSAGE_VERSION_13, SPDM_GET_MEASUREMENTS, 0,
135 : SPDM_GET_MEASUREMENTS_REQUEST_MEASUREMENT_OPERATION_TOTAL_NUMBER_OF_MEASUREMENTS },
136 : };
137 : size_t m_libspdm_get_measurements_request17_size = sizeof(spdm_message_header_t);
138 :
139 : extern size_t libspdm_secret_lib_meas_opaque_data_size;
140 :
141 : /**
142 : * Test 1: Successful response to get a number of measurements without signature
143 : * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code, correct transcript.message_m size, and correct response message size and fields
144 : **/
145 1 : static void rsp_measurements_case1(void **state)
146 : {
147 : libspdm_return_t status;
148 : libspdm_test_context_t *spdm_test_context;
149 : libspdm_context_t *spdm_context;
150 : size_t response_size;
151 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
152 : spdm_measurements_response_t *spdm_response;
153 :
154 1 : spdm_test_context = *state;
155 1 : spdm_context = spdm_test_context->spdm_context;
156 1 : spdm_test_context->case_id = 0x1;
157 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
158 : SPDM_VERSION_NUMBER_SHIFT_BIT;
159 1 : spdm_context->connection_info.connection_state =
160 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
161 1 : spdm_context->local_context.capability.flags |=
162 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
163 1 : spdm_context->connection_info.algorithm.base_hash_algo =
164 : m_libspdm_use_hash_algo;
165 1 : spdm_context->connection_info.algorithm.base_asym_algo =
166 : m_libspdm_use_asym_algo;
167 1 : spdm_context->connection_info.algorithm.measurement_spec =
168 : m_libspdm_use_measurement_spec;
169 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
170 : m_libspdm_use_measurement_hash_algo;
171 1 : spdm_context->spdm_meas_log_reset_callback = spdm_meas_log_reset_callback;
172 1 : libspdm_reset_message_m(spdm_context, NULL);
173 :
174 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
175 :
176 1 : response_size = sizeof(response);
177 :
178 1 : status = libspdm_get_response_measurements(
179 : spdm_context, m_libspdm_get_measurements_request1_size,
180 : &m_libspdm_get_measurements_request1, &response_size, response);
181 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
182 1 : assert_int_equal(response_size,
183 : sizeof(spdm_measurements_response_t) + SPDM_NONCE_SIZE + sizeof(uint16_t));
184 1 : spdm_response = (void *)response;
185 1 : assert_int_equal(spdm_response->header.request_response_code,
186 : SPDM_MEASUREMENTS);
187 1 : assert_int_equal(spdm_response->header.param1,
188 : LIBSPDM_MEASUREMENT_BLOCK_NUMBER);
189 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
190 : assert_int_equal(spdm_context->transcript.message_m.buffer_size,
191 : m_libspdm_get_measurements_request1_size +
192 : sizeof(spdm_measurements_response_t) +
193 : SPDM_NONCE_SIZE +
194 : sizeof(uint16_t));
195 : #endif
196 1 : }
197 :
198 : /**
199 : * Test 2:
200 : * Expected Behavior:
201 : **/
202 1 : static void rsp_measurements_case2(void **state)
203 : {
204 1 : }
205 :
206 : /**
207 : * Test 3: Force response_state = SPDM_RESPONSE_STATE_BUSY when asked GET_MEASUREMENTS
208 : * Expected Behavior: generate an ERROR_RESPONSE with code SPDM_ERROR_CODE_BUSY
209 : **/
210 1 : static void rsp_measurements_case3(void **state)
211 : {
212 : libspdm_return_t status;
213 : libspdm_test_context_t *spdm_test_context;
214 : libspdm_context_t *spdm_context;
215 : size_t response_size;
216 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
217 : spdm_measurements_response_t *spdm_response;
218 :
219 1 : spdm_test_context = *state;
220 1 : spdm_context = spdm_test_context->spdm_context;
221 1 : spdm_test_context->case_id = 0x3;
222 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
223 : SPDM_VERSION_NUMBER_SHIFT_BIT;
224 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_BUSY;
225 1 : spdm_context->connection_info.connection_state =
226 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
227 1 : spdm_context->local_context.capability.flags |=
228 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
229 1 : spdm_context->connection_info.algorithm.base_hash_algo =
230 : m_libspdm_use_hash_algo;
231 1 : spdm_context->connection_info.algorithm.base_asym_algo =
232 : m_libspdm_use_asym_algo;
233 1 : spdm_context->connection_info.algorithm.measurement_spec =
234 : m_libspdm_use_measurement_spec;
235 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
236 : m_libspdm_use_measurement_hash_algo;
237 1 : libspdm_reset_message_m(spdm_context, NULL);
238 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
239 :
240 1 : response_size = sizeof(response);
241 1 : libspdm_get_random_number(SPDM_NONCE_SIZE,
242 : m_libspdm_get_measurements_request1.nonce);
243 1 : status = libspdm_get_response_measurements(
244 : spdm_context, m_libspdm_get_measurements_request1_size,
245 : &m_libspdm_get_measurements_request1, &response_size, response);
246 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
247 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
248 1 : spdm_response = (void *)response;
249 1 : assert_int_equal(spdm_response->header.request_response_code,
250 : SPDM_ERROR);
251 1 : assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_BUSY);
252 1 : assert_int_equal(spdm_response->header.param2, 0);
253 1 : assert_int_equal(spdm_context->response_state,
254 : LIBSPDM_RESPONSE_STATE_BUSY);
255 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
256 : assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
257 : #endif
258 1 : }
259 :
260 : /**
261 : * Test 4: Force response_state = SPDM_RESPONSE_STATE_NEED_RESYNC when asked GET_MEASUREMENTS
262 : * Expected Behavior: generate an ERROR_RESPONSE with code SPDM_ERROR_CODE_REQUEST_RESYNCH
263 : **/
264 1 : static void rsp_measurements_case4(void **state)
265 : {
266 : libspdm_return_t status;
267 : libspdm_test_context_t *spdm_test_context;
268 : libspdm_context_t *spdm_context;
269 : size_t response_size;
270 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
271 : spdm_measurements_response_t *spdm_response;
272 :
273 1 : spdm_test_context = *state;
274 1 : spdm_context = spdm_test_context->spdm_context;
275 1 : spdm_test_context->case_id = 0x4;
276 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
277 : SPDM_VERSION_NUMBER_SHIFT_BIT;
278 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NEED_RESYNC;
279 1 : spdm_context->connection_info.connection_state =
280 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
281 1 : spdm_context->local_context.capability.flags |=
282 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
283 1 : spdm_context->connection_info.algorithm.base_hash_algo =
284 : m_libspdm_use_hash_algo;
285 1 : spdm_context->connection_info.algorithm.base_asym_algo =
286 : m_libspdm_use_asym_algo;
287 1 : spdm_context->connection_info.algorithm.measurement_spec =
288 : m_libspdm_use_measurement_spec;
289 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
290 : m_libspdm_use_measurement_hash_algo;
291 1 : libspdm_reset_message_m(spdm_context, NULL);
292 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
293 :
294 1 : response_size = sizeof(response);
295 1 : libspdm_get_random_number(SPDM_NONCE_SIZE,
296 : m_libspdm_get_measurements_request1.nonce);
297 1 : status = libspdm_get_response_measurements(
298 : spdm_context, m_libspdm_get_measurements_request1_size,
299 : &m_libspdm_get_measurements_request1, &response_size, response);
300 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
301 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
302 1 : spdm_response = (void *)response;
303 1 : assert_int_equal(spdm_response->header.request_response_code,
304 : SPDM_ERROR);
305 1 : assert_int_equal(spdm_response->header.param1,
306 : SPDM_ERROR_CODE_REQUEST_RESYNCH);
307 1 : assert_int_equal(spdm_response->header.param2, 0);
308 1 : assert_int_equal(spdm_context->response_state,
309 : LIBSPDM_RESPONSE_STATE_NEED_RESYNC);
310 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
311 : assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
312 : #endif
313 1 : }
314 :
315 : #if LIBSPDM_RESPOND_IF_READY_SUPPORT
316 : /**
317 : * Test 5: Force response_state = SPDM_RESPONSE_STATE_NOT_READY when asked GET_MEASUREMENTS
318 : * Expected Behavior: generate an ERROR_RESPONSE with code SPDM_ERROR_CODE_RESPONSE_NOT_READY
319 : **/
320 1 : static void rsp_measurements_case5(void **state)
321 : {
322 : libspdm_return_t status;
323 : libspdm_test_context_t *spdm_test_context;
324 : libspdm_context_t *spdm_context;
325 : size_t response_size;
326 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
327 : spdm_measurements_response_t *spdm_response;
328 : spdm_error_data_response_not_ready_t *error_data;
329 :
330 1 : spdm_test_context = *state;
331 1 : spdm_context = spdm_test_context->spdm_context;
332 1 : spdm_test_context->case_id = 0x5;
333 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
334 : SPDM_VERSION_NUMBER_SHIFT_BIT;
335 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NOT_READY;
336 1 : spdm_context->connection_info.connection_state =
337 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
338 1 : spdm_context->local_context.capability.flags |=
339 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
340 1 : spdm_context->connection_info.algorithm.base_hash_algo =
341 : m_libspdm_use_hash_algo;
342 1 : spdm_context->connection_info.algorithm.base_asym_algo =
343 : m_libspdm_use_asym_algo;
344 1 : spdm_context->connection_info.algorithm.measurement_spec =
345 : m_libspdm_use_measurement_spec;
346 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
347 : m_libspdm_use_measurement_hash_algo;
348 1 : libspdm_reset_message_m(spdm_context, NULL);
349 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
350 :
351 1 : response_size = sizeof(response);
352 1 : libspdm_get_random_number(SPDM_NONCE_SIZE,
353 : m_libspdm_get_measurements_request1.nonce);
354 1 : status = libspdm_get_response_measurements(
355 : spdm_context, m_libspdm_get_measurements_request1_size,
356 : &m_libspdm_get_measurements_request1, &response_size, response);
357 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
358 1 : assert_int_equal(response_size,
359 : sizeof(spdm_error_response_t) +
360 : sizeof(spdm_error_data_response_not_ready_t));
361 1 : spdm_response = (void *)response;
362 1 : error_data = (spdm_error_data_response_not_ready_t
363 : *)(&spdm_response->number_of_blocks);
364 1 : assert_int_equal(spdm_response->header.request_response_code,
365 : SPDM_ERROR);
366 1 : assert_int_equal(spdm_response->header.param1,
367 : SPDM_ERROR_CODE_RESPONSE_NOT_READY);
368 1 : assert_int_equal(spdm_response->header.param2, 0);
369 1 : assert_int_equal(spdm_context->response_state,
370 : LIBSPDM_RESPONSE_STATE_NOT_READY);
371 1 : assert_int_equal(error_data->request_code, SPDM_GET_MEASUREMENTS);
372 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
373 : assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
374 : #endif
375 1 : }
376 : #endif /* LIBSPDM_RESPOND_IF_READY_SUPPORT */
377 :
378 : /**
379 : * Test 6: simulate wrong connection_state when asked GET_MEASUREMENTS
380 : * (missing SPDM_GET_DIGESTS_RECEIVE_FLAG, SPDM_GET_CAPABILITIES_RECEIVE_FLAG and SPDM_NEGOTIATE_ALGORITHMS_RECEIVE_FLAG)
381 : * Expected Behavior: generate an ERROR_RESPONSE with code SPDM_ERROR_CODE_UNEXPECTED_REQUEST
382 : **/
383 1 : static void rsp_measurements_case6(void **state)
384 : {
385 : libspdm_return_t status;
386 : libspdm_test_context_t *spdm_test_context;
387 : libspdm_context_t *spdm_context;
388 : size_t response_size;
389 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
390 : spdm_measurements_response_t *spdm_response;
391 :
392 1 : spdm_test_context = *state;
393 1 : spdm_context = spdm_test_context->spdm_context;
394 1 : spdm_test_context->case_id = 0x6;
395 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
396 : SPDM_VERSION_NUMBER_SHIFT_BIT;
397 1 : spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
398 1 : spdm_context->connection_info.connection_state =
399 : LIBSPDM_CONNECTION_STATE_NOT_STARTED;
400 1 : spdm_context->local_context.capability.flags |=
401 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
402 1 : spdm_context->connection_info.algorithm.base_hash_algo =
403 : m_libspdm_use_hash_algo;
404 1 : spdm_context->connection_info.algorithm.base_asym_algo =
405 : m_libspdm_use_asym_algo;
406 1 : spdm_context->connection_info.algorithm.measurement_spec =
407 : m_libspdm_use_measurement_spec;
408 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
409 : m_libspdm_use_measurement_hash_algo;
410 1 : libspdm_reset_message_m(spdm_context, NULL);
411 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
412 :
413 1 : response_size = sizeof(response);
414 1 : libspdm_get_random_number(SPDM_NONCE_SIZE,
415 : m_libspdm_get_measurements_request1.nonce);
416 1 : status = libspdm_get_response_measurements(
417 : spdm_context, m_libspdm_get_measurements_request1_size,
418 : &m_libspdm_get_measurements_request1, &response_size, response);
419 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
420 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
421 1 : spdm_response = (void *)response;
422 1 : assert_int_equal(spdm_response->header.request_response_code,
423 : SPDM_ERROR);
424 1 : assert_int_equal(spdm_response->header.param1,
425 : SPDM_ERROR_CODE_UNEXPECTED_REQUEST);
426 1 : assert_int_equal(spdm_response->header.param2, 0);
427 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
428 : assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
429 : #endif
430 1 : }
431 :
432 : /**
433 : * Test 7: Successful response to get a number of measurements with signature
434 : * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code, empty transcript.message_m, and correct response message size and fields
435 : **/
436 1 : static void rsp_measurements_case7(void **state)
437 : {
438 : libspdm_return_t status;
439 : libspdm_test_context_t *spdm_test_context;
440 : libspdm_context_t *spdm_context;
441 : size_t response_size;
442 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
443 : spdm_measurements_response_t *spdm_response;
444 : size_t measurment_sig_size;
445 :
446 : bool result;
447 : uint32_t measurement_record_data_length;
448 : uint8_t *measurement_record_data;
449 : uint8_t *ptr;
450 : uint16_t opaque_length;
451 : void *signature;
452 : size_t signature_size;
453 : libspdm_session_info_t *session_info;
454 : void *data;
455 : size_t data_size;
456 : void *hash;
457 : size_t hash_size;
458 :
459 1 : spdm_test_context = *state;
460 1 : spdm_context = spdm_test_context->spdm_context;
461 1 : spdm_test_context->case_id = 0x7;
462 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
463 : SPDM_VERSION_NUMBER_SHIFT_BIT;
464 1 : spdm_context->connection_info.connection_state =
465 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
466 1 : spdm_context->local_context.capability.flags |=
467 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
468 1 : spdm_context->connection_info.algorithm.base_hash_algo =
469 : m_libspdm_use_hash_algo;
470 1 : spdm_context->connection_info.algorithm.base_asym_algo =
471 : m_libspdm_use_asym_algo;
472 1 : spdm_context->connection_info.algorithm.measurement_spec =
473 : m_libspdm_use_measurement_spec;
474 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
475 : m_libspdm_use_measurement_hash_algo;
476 1 : libspdm_reset_message_m(spdm_context, NULL);
477 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
478 1 : measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
479 1 : libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
480 :
481 1 : response_size = sizeof(response);
482 1 : libspdm_get_random_number(SPDM_NONCE_SIZE,
483 : m_libspdm_get_measurements_request5.nonce);
484 1 : status = libspdm_get_response_measurements(
485 : spdm_context, m_libspdm_get_measurements_request5_size,
486 : &m_libspdm_get_measurements_request5, &response_size, response);
487 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
488 1 : assert_int_equal(response_size, sizeof(spdm_measurements_response_t) +
489 : measurment_sig_size);
490 1 : spdm_response = (void *)response;
491 1 : assert_int_equal(spdm_response->header.request_response_code,
492 : SPDM_MEASUREMENTS);
493 1 : assert_int_equal(spdm_response->header.param1,
494 : LIBSPDM_MEASUREMENT_BLOCK_NUMBER);
495 :
496 1 : if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
497 : m_libspdm_use_asym_algo, &data,
498 : &data_size,
499 : &hash, &hash_size)) {
500 0 : assert(false);
501 : }
502 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
503 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
504 : data_size;
505 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
506 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
507 : data, data_size);
508 : #else
509 1 : libspdm_hash_all(
510 : spdm_context->connection_info.algorithm.base_hash_algo,
511 : data, data_size,
512 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
513 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
514 1 : libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
515 1 : libspdm_get_leaf_cert_public_key_from_cert_chain(
516 : spdm_context->connection_info.algorithm.base_hash_algo,
517 : spdm_context->connection_info.algorithm.base_asym_algo,
518 : data, data_size,
519 : &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
520 : #endif
521 :
522 1 : measurement_record_data_length = libspdm_read_uint24(spdm_response->measurement_record_length);
523 1 : measurement_record_data = (void *)(spdm_response + 1);
524 1 : ptr = measurement_record_data + measurement_record_data_length;
525 1 : ptr += SPDM_NONCE_SIZE;
526 1 : opaque_length = libspdm_read_uint16((const uint8_t *)ptr);
527 1 : ptr += sizeof(uint16_t);
528 1 : ptr += opaque_length;
529 1 : signature = ptr;
530 1 : signature_size = libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
531 1 : session_info = NULL;
532 :
533 1 : status = libspdm_append_message_m(spdm_context, session_info,
534 : &m_libspdm_get_measurements_request5,
535 : m_libspdm_get_measurements_request5_size);
536 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
537 :
538 1 : status = libspdm_append_message_m(spdm_context, session_info, spdm_response,
539 : response_size - signature_size);
540 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
541 :
542 1 : result = libspdm_verify_measurement_signature(
543 : spdm_context, session_info, 0, signature, signature_size);
544 1 : assert_true(result);
545 :
546 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
547 : assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
548 : #endif
549 1 : }
550 :
551 : /**
552 : * Test 8: Successful response to get one measurement with signature
553 : * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code, empty transcript.message_m, and correct response message size and fields
554 : **/
555 1 : static void rsp_measurements_case8(void **state)
556 : {
557 : libspdm_return_t status;
558 : libspdm_test_context_t *spdm_test_context;
559 : libspdm_context_t *spdm_context;
560 : size_t response_size;
561 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
562 : spdm_measurements_response_t *spdm_response;
563 : size_t measurment_sig_size;
564 :
565 1 : spdm_test_context = *state;
566 1 : spdm_context = spdm_test_context->spdm_context;
567 1 : spdm_test_context->case_id = 0x8;
568 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
569 : SPDM_VERSION_NUMBER_SHIFT_BIT;
570 1 : spdm_context->connection_info.connection_state =
571 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
572 1 : spdm_context->local_context.capability.flags |=
573 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
574 1 : spdm_context->connection_info.algorithm.base_hash_algo =
575 : m_libspdm_use_hash_algo;
576 1 : spdm_context->connection_info.algorithm.base_asym_algo =
577 : m_libspdm_use_asym_algo;
578 1 : spdm_context->connection_info.algorithm.measurement_spec =
579 : m_libspdm_use_measurement_spec;
580 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
581 : m_libspdm_use_measurement_hash_algo;
582 1 : libspdm_reset_message_m(spdm_context, NULL);
583 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
584 1 : measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
585 1 : libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
586 1 : response_size = sizeof(response);
587 1 : libspdm_get_random_number(SPDM_NONCE_SIZE,
588 : m_libspdm_get_measurements_request3.nonce);
589 1 : status = libspdm_get_response_measurements(
590 : spdm_context, m_libspdm_get_measurements_request3_size,
591 : &m_libspdm_get_measurements_request3, &response_size, response);
592 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
593 1 : assert_int_equal(response_size,
594 : sizeof(spdm_measurements_response_t) +
595 : sizeof(spdm_measurement_block_dmtf_t) +
596 : libspdm_get_measurement_hash_size(
597 : m_libspdm_use_measurement_hash_algo) +
598 : measurment_sig_size);
599 1 : spdm_response = (void *)response;
600 1 : assert_int_equal(spdm_response->header.request_response_code,
601 : SPDM_MEASUREMENTS);
602 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
603 : assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
604 : #endif
605 1 : }
606 :
607 : /**
608 : * Test 9: Error case, Bad request size (sizeof(spdm_message_header_t)x) to get measurement number with signature
609 : * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code, empty transcript.message_m size, and Error message as response
610 : **/
611 1 : static void rsp_measurements_case9(void **state)
612 : {
613 : libspdm_return_t status;
614 : libspdm_test_context_t *spdm_test_context;
615 : libspdm_context_t *spdm_context;
616 : size_t response_size;
617 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
618 : spdm_measurements_response_t *spdm_response;
619 :
620 1 : spdm_test_context = *state;
621 1 : spdm_context = spdm_test_context->spdm_context;
622 1 : spdm_test_context->case_id = 0x9;
623 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
624 : SPDM_VERSION_NUMBER_SHIFT_BIT;
625 1 : spdm_context->connection_info.connection_state =
626 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
627 1 : spdm_context->local_context.capability.flags |=
628 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
629 1 : spdm_context->connection_info.algorithm.base_hash_algo =
630 : m_libspdm_use_hash_algo;
631 1 : spdm_context->connection_info.algorithm.base_asym_algo =
632 : m_libspdm_use_asym_algo;
633 1 : spdm_context->connection_info.algorithm.measurement_spec =
634 : m_libspdm_use_measurement_spec;
635 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
636 : m_libspdm_use_measurement_hash_algo;
637 1 : libspdm_reset_message_m(spdm_context, NULL);
638 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
639 :
640 1 : response_size = sizeof(response);
641 1 : libspdm_get_random_number(SPDM_NONCE_SIZE,
642 : m_libspdm_get_measurements_request4.nonce);
643 1 : status = libspdm_get_response_measurements(
644 : spdm_context, m_libspdm_get_measurements_request4_size,
645 : &m_libspdm_get_measurements_request4, &response_size, response);
646 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
647 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
648 1 : spdm_response = (void *)response;
649 1 : assert_int_equal(spdm_response->header.request_response_code,
650 : SPDM_ERROR);
651 1 : assert_int_equal(spdm_response->header.param1,
652 : SPDM_ERROR_CODE_INVALID_REQUEST);
653 1 : assert_int_equal(spdm_response->header.param2, 0);
654 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
655 : assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
656 : #endif
657 1 : }
658 :
659 : /**
660 : * Test 10: Successful response to get one measurement without signature
661 : * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code, correct transcript.message_m size, and correct response message size and fields
662 : **/
663 1 : static void rsp_measurements_case10(void **state)
664 : {
665 : libspdm_return_t status;
666 : libspdm_test_context_t *spdm_test_context;
667 : libspdm_context_t *spdm_context;
668 : size_t response_size;
669 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
670 : spdm_measurements_response_t *spdm_response;
671 :
672 1 : spdm_test_context = *state;
673 1 : spdm_context = spdm_test_context->spdm_context;
674 1 : spdm_test_context->case_id = 0xA;
675 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
676 : SPDM_VERSION_NUMBER_SHIFT_BIT;
677 1 : spdm_context->connection_info.connection_state =
678 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
679 1 : spdm_context->local_context.capability.flags |=
680 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
681 1 : spdm_context->connection_info.algorithm.base_hash_algo =
682 : m_libspdm_use_hash_algo;
683 1 : spdm_context->connection_info.algorithm.base_asym_algo =
684 : m_libspdm_use_asym_algo;
685 1 : spdm_context->connection_info.algorithm.measurement_spec =
686 : m_libspdm_use_measurement_spec;
687 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
688 : m_libspdm_use_measurement_hash_algo;
689 1 : libspdm_reset_message_m(spdm_context, NULL);
690 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
691 :
692 1 : response_size = sizeof(response);
693 1 : libspdm_get_random_number(SPDM_NONCE_SIZE,
694 : m_libspdm_get_measurements_request6.nonce);
695 1 : status = libspdm_get_response_measurements(
696 : spdm_context, m_libspdm_get_measurements_request6_size,
697 : &m_libspdm_get_measurements_request6, &response_size, response);
698 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
699 1 : assert_int_equal(response_size,
700 : sizeof(spdm_measurements_response_t) +
701 : sizeof(spdm_measurement_block_dmtf_t) +
702 : libspdm_get_measurement_hash_size(
703 : m_libspdm_use_measurement_hash_algo) + SPDM_NONCE_SIZE +
704 : sizeof(uint16_t));
705 1 : spdm_response = (void *)response;
706 1 : assert_int_equal(spdm_response->header.request_response_code,
707 : SPDM_MEASUREMENTS);
708 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
709 : assert_int_equal(spdm_context->transcript.message_m.buffer_size,
710 : m_libspdm_get_measurements_request6_size +
711 : sizeof(spdm_measurements_response_t) +
712 : sizeof(spdm_measurement_block_dmtf_t) +
713 : libspdm_get_measurement_hash_size(
714 : m_libspdm_use_measurement_hash_algo) + SPDM_NONCE_SIZE +
715 : sizeof(uint16_t));
716 : #endif
717 1 : }
718 :
719 : /**
720 : * Test 11: Successful response to get all measurements with signature
721 : * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code, empty transcript.message_m, and correct response message size and fields
722 : **/
723 1 : static void rsp_measurements_case11(void **state)
724 : {
725 : libspdm_return_t status;
726 : libspdm_test_context_t *spdm_test_context;
727 : libspdm_context_t *spdm_context;
728 : size_t response_size;
729 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
730 : spdm_measurements_response_t *spdm_response;
731 : size_t measurment_sig_size;
732 :
733 1 : spdm_test_context = *state;
734 1 : spdm_context = spdm_test_context->spdm_context;
735 1 : spdm_test_context->case_id = 0xB;
736 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
737 : SPDM_VERSION_NUMBER_SHIFT_BIT;
738 1 : spdm_context->connection_info.connection_state =
739 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
740 1 : spdm_context->local_context.capability.flags |=
741 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
742 1 : spdm_context->connection_info.algorithm.base_hash_algo =
743 : m_libspdm_use_hash_algo;
744 1 : spdm_context->connection_info.algorithm.base_asym_algo =
745 : m_libspdm_use_asym_algo;
746 1 : spdm_context->connection_info.algorithm.measurement_spec =
747 : m_libspdm_use_measurement_spec;
748 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
749 : m_libspdm_use_measurement_hash_algo;
750 1 : libspdm_reset_message_m(spdm_context, NULL);
751 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
752 1 : measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
753 1 : libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
754 :
755 1 : response_size = sizeof(response);
756 1 : libspdm_get_random_number(SPDM_NONCE_SIZE,
757 : m_libspdm_get_measurements_request8.nonce);
758 1 : status = libspdm_get_response_measurements(
759 : spdm_context, m_libspdm_get_measurements_request8_size,
760 : &m_libspdm_get_measurements_request8, &response_size, response);
761 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
762 1 : assert_int_equal(response_size,
763 : sizeof(spdm_measurements_response_t) +
764 : LIBSPDM_MEASUREMENT_BLOCK_HASH_NUMBER *
765 : (sizeof(spdm_measurement_block_dmtf_t) +
766 : libspdm_get_measurement_hash_size(
767 : m_libspdm_use_measurement_hash_algo)) +
768 : (sizeof(spdm_measurement_block_dmtf_t) +
769 : sizeof(spdm_measurements_secure_version_number_t)) +
770 : (sizeof(spdm_measurement_block_dmtf_t) +
771 : libspdm_get_measurement_hash_size(
772 : m_libspdm_use_measurement_hash_algo)) +
773 : (sizeof(spdm_measurement_block_dmtf_t) +
774 : LIBSPDM_MEASUREMENT_MANIFEST_SIZE) +
775 : (sizeof(spdm_measurement_block_dmtf_t) +
776 : sizeof(spdm_measurements_device_mode_t)) +
777 : measurment_sig_size);
778 1 : spdm_response = (void *)response;
779 1 : assert_int_equal(spdm_response->header.request_response_code,
780 : SPDM_MEASUREMENTS);
781 1 : assert_int_equal(spdm_response->number_of_blocks,
782 : LIBSPDM_MEASUREMENT_BLOCK_NUMBER);
783 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
784 : assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
785 : #endif
786 1 : }
787 :
788 : /**
789 : * Test 12: Successful response to get all measurements without signature
790 : * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code, correct transcript.message_m size, and correct response message size and fields
791 : **/
792 1 : static void rsp_measurements_case12(void **state)
793 : {
794 : libspdm_return_t status;
795 : libspdm_test_context_t *spdm_test_context;
796 : libspdm_context_t *spdm_context;
797 : size_t response_size;
798 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
799 : spdm_measurements_response_t *spdm_response;
800 :
801 1 : spdm_test_context = *state;
802 1 : spdm_context = spdm_test_context->spdm_context;
803 1 : spdm_test_context->case_id = 0xC;
804 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
805 : SPDM_VERSION_NUMBER_SHIFT_BIT;
806 1 : spdm_context->connection_info.connection_state =
807 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
808 1 : spdm_context->local_context.capability.flags |=
809 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
810 1 : spdm_context->connection_info.algorithm.base_hash_algo =
811 : m_libspdm_use_hash_algo;
812 1 : spdm_context->connection_info.algorithm.base_asym_algo =
813 : m_libspdm_use_asym_algo;
814 1 : spdm_context->connection_info.algorithm.measurement_spec =
815 : m_libspdm_use_measurement_spec;
816 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
817 : m_libspdm_use_measurement_hash_algo;
818 1 : libspdm_reset_message_m(spdm_context, NULL);
819 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
820 :
821 1 : response_size = sizeof(response);
822 1 : libspdm_get_random_number(SPDM_NONCE_SIZE,
823 : m_libspdm_get_measurements_request7.nonce);
824 1 : status = libspdm_get_response_measurements(
825 : spdm_context, m_libspdm_get_measurements_request7_size,
826 : &m_libspdm_get_measurements_request7, &response_size, response);
827 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
828 1 : assert_int_equal(response_size,
829 : sizeof(spdm_measurements_response_t) +
830 : LIBSPDM_MEASUREMENT_BLOCK_HASH_NUMBER *
831 : (sizeof(spdm_measurement_block_dmtf_t) +
832 : libspdm_get_measurement_hash_size(
833 : m_libspdm_use_measurement_hash_algo)) +
834 : (sizeof(spdm_measurement_block_dmtf_t) +
835 : sizeof(spdm_measurements_secure_version_number_t)) +
836 : (sizeof(spdm_measurement_block_dmtf_t) +
837 : libspdm_get_measurement_hash_size(
838 : m_libspdm_use_measurement_hash_algo)) +
839 : (sizeof(spdm_measurement_block_dmtf_t) +
840 : LIBSPDM_MEASUREMENT_MANIFEST_SIZE) +
841 : (sizeof(spdm_measurement_block_dmtf_t) +
842 : sizeof(spdm_measurements_device_mode_t)) +
843 : SPDM_NONCE_SIZE + sizeof(uint16_t));
844 1 : spdm_response = (void *)response;
845 1 : assert_int_equal(spdm_response->header.request_response_code,
846 : SPDM_MEASUREMENTS);
847 1 : assert_int_equal(spdm_response->number_of_blocks,
848 : LIBSPDM_MEASUREMENT_BLOCK_NUMBER);
849 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
850 : assert_int_equal(spdm_context->transcript.message_m.buffer_size,
851 : m_libspdm_get_measurements_request7_size +
852 : sizeof(spdm_measurements_response_t) +
853 : LIBSPDM_MEASUREMENT_BLOCK_HASH_NUMBER *
854 : (sizeof(spdm_measurement_block_dmtf_t) +
855 : libspdm_get_measurement_hash_size(
856 : m_libspdm_use_measurement_hash_algo)) +
857 : (sizeof(spdm_measurement_block_dmtf_t) +
858 : sizeof(spdm_measurements_secure_version_number_t)) +
859 : (sizeof(spdm_measurement_block_dmtf_t) +
860 : libspdm_get_measurement_hash_size(
861 : m_libspdm_use_measurement_hash_algo)) +
862 : (sizeof(spdm_measurement_block_dmtf_t) +
863 : LIBSPDM_MEASUREMENT_MANIFEST_SIZE) +
864 : (sizeof(spdm_measurement_block_dmtf_t) +
865 : sizeof(spdm_measurements_device_mode_t)) +
866 : SPDM_NONCE_SIZE + sizeof(uint16_t));
867 : #endif
868 1 : }
869 :
870 : /**
871 : * Test 13:
872 : * Expected Behavior:
873 : **/
874 1 : static void rsp_measurements_case13(void **state)
875 : {
876 1 : }
877 :
878 : /**
879 : * Test 14: Error case, signature was required, but there is no nonce and/or slotID
880 : * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code, empty transcript.message_m size, and Error message as response
881 : **/
882 1 : static void rsp_measurements_case14(void **state)
883 : {
884 : libspdm_return_t status;
885 : libspdm_test_context_t *spdm_test_context;
886 : libspdm_context_t *spdm_context;
887 : size_t response_size;
888 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
889 : spdm_measurements_response_t *spdm_response;
890 : uint16_t TestMsgSizes[3];
891 :
892 1 : TestMsgSizes[0] =
893 1 : (uint16_t)(m_libspdm_get_measurements_request10_size -
894 : sizeof(m_libspdm_get_measurements_request10.slot_id_param) -
895 : sizeof(m_libspdm_get_measurements_request10.nonce));
896 1 : TestMsgSizes[1] =
897 1 : (uint16_t)(m_libspdm_get_measurements_request10_size -
898 : sizeof(m_libspdm_get_measurements_request10.slot_id_param));
899 1 : TestMsgSizes[2] =
900 1 : (uint16_t)(m_libspdm_get_measurements_request10_size -
901 : sizeof(m_libspdm_get_measurements_request10.nonce));
902 :
903 1 : spdm_test_context = *state;
904 1 : spdm_context = spdm_test_context->spdm_context;
905 1 : spdm_test_context->case_id = 0xE;
906 1 : spdm_context->connection_info.connection_state =
907 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
908 1 : spdm_context->local_context.capability.flags = 0;
909 1 : spdm_context->local_context.capability.flags |=
910 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
911 1 : spdm_context->connection_info.algorithm.base_hash_algo =
912 : m_libspdm_use_hash_algo;
913 1 : spdm_context->connection_info.algorithm.base_asym_algo =
914 : m_libspdm_use_asym_algo;
915 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
916 : m_libspdm_use_measurement_hash_algo;
917 :
918 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
919 : SPDM_VERSION_NUMBER_SHIFT_BIT;
920 1 : libspdm_reset_message_m(spdm_context, NULL);
921 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
922 :
923 1 : libspdm_get_random_number(SPDM_NONCE_SIZE,
924 : m_libspdm_get_measurements_request10.nonce);
925 4 : for (int i = 0; i < sizeof(TestMsgSizes) / sizeof(TestMsgSizes[0]);
926 3 : i++) {
927 3 : response_size = sizeof(response);
928 3 : status = libspdm_get_response_measurements(
929 3 : spdm_context, TestMsgSizes[i],
930 : &m_libspdm_get_measurements_request10, &response_size,
931 : response);
932 3 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
933 3 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
934 3 : spdm_response = (void *)response;
935 3 : assert_int_equal(spdm_response->header.request_response_code,
936 : SPDM_ERROR);
937 3 : assert_int_equal(spdm_response->header.param1,
938 : SPDM_ERROR_CODE_INVALID_REQUEST);
939 3 : assert_int_equal(spdm_response->header.param2, 0);
940 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
941 : assert_int_equal(spdm_context->transcript.message_m.buffer_size,
942 : 0);
943 : #endif
944 : }
945 1 : }
946 :
947 : /**
948 : * Test 15: Error case, meas_cap = 01b, but signature was requested (request message includes nonce and slotID)
949 : * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code, empty transcript.message_m size, and Error message as response
950 : **/
951 1 : static void rsp_measurements_case15(void **state)
952 : {
953 : libspdm_return_t status;
954 : libspdm_test_context_t *spdm_test_context;
955 : libspdm_context_t *spdm_context;
956 : size_t response_size;
957 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
958 : spdm_measurements_response_t *spdm_response;
959 : /* size_t measurment_sig_size;*/
960 :
961 1 : spdm_test_context = *state;
962 1 : spdm_context = spdm_test_context->spdm_context;
963 1 : spdm_test_context->case_id = 0xF;
964 1 : spdm_context->connection_info.connection_state =
965 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
966 1 : spdm_context->local_context.capability.flags = 0;
967 1 : spdm_context->local_context.capability.flags |=
968 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_NO_SIG;
969 1 : spdm_context->connection_info.algorithm.base_hash_algo =
970 : m_libspdm_use_hash_algo;
971 1 : spdm_context->connection_info.algorithm.base_asym_algo =
972 : m_libspdm_use_asym_algo;
973 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
974 : m_libspdm_use_measurement_hash_algo;
975 :
976 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
977 : SPDM_VERSION_NUMBER_SHIFT_BIT;
978 1 : libspdm_reset_message_m(spdm_context, NULL);
979 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
980 : /* measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 + libspdm_get_asym_signature_size (m_libspdm_use_asym_algo);*/
981 :
982 1 : response_size = sizeof(response);
983 1 : libspdm_get_random_number(SPDM_NONCE_SIZE,
984 : m_libspdm_get_measurements_request10.nonce);
985 1 : status = libspdm_get_response_measurements(
986 : spdm_context, m_libspdm_get_measurements_request10_size,
987 : &m_libspdm_get_measurements_request10, &response_size, response);
988 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
989 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
990 1 : spdm_response = (void *)response;
991 1 : assert_int_equal(spdm_response->header.request_response_code,
992 : SPDM_ERROR);
993 1 : assert_int_equal(spdm_response->header.param1,
994 : SPDM_ERROR_CODE_INVALID_REQUEST);
995 1 : assert_int_equal(spdm_response->header.param2, 0);
996 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
997 : assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
998 : #endif
999 1 : }
1000 :
1001 : /**
1002 : * Test 16: Error case, meas_cap = 01b, but signature was requested (request message does not include nonce and slotID)
1003 : * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code, empty transcript.message_m size, and Error message as response
1004 : **/
1005 1 : static void rsp_measurements_case16(void **state)
1006 : {
1007 : libspdm_return_t status;
1008 : libspdm_test_context_t *spdm_test_context;
1009 : libspdm_context_t *spdm_context;
1010 : size_t response_size;
1011 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1012 : spdm_measurements_response_t *spdm_response;
1013 : /* size_t measurment_sig_size;*/
1014 :
1015 1 : spdm_test_context = *state;
1016 1 : spdm_context = spdm_test_context->spdm_context;
1017 1 : spdm_test_context->case_id = 0x10;
1018 1 : spdm_context->connection_info.connection_state =
1019 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
1020 1 : spdm_context->local_context.capability.flags = 0;
1021 1 : spdm_context->local_context.capability.flags |=
1022 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_NO_SIG;
1023 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1024 : m_libspdm_use_hash_algo;
1025 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1026 : m_libspdm_use_asym_algo;
1027 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
1028 : m_libspdm_use_measurement_hash_algo;
1029 :
1030 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
1031 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1032 1 : libspdm_reset_message_m(spdm_context, NULL);
1033 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
1034 : /* measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 + libspdm_get_asym_signature_size (m_libspdm_use_asym_algo);*/
1035 :
1036 1 : response_size = sizeof(response);
1037 1 : status = libspdm_get_response_measurements(
1038 : spdm_context, m_libspdm_get_measurements_request9_size,
1039 : &m_libspdm_get_measurements_request10, &response_size, response);
1040 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1041 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
1042 1 : spdm_response = (void *)response;
1043 1 : assert_int_equal(spdm_response->header.request_response_code,
1044 : SPDM_ERROR);
1045 1 : assert_int_equal(spdm_response->header.param1,
1046 : SPDM_ERROR_CODE_INVALID_REQUEST);
1047 1 : assert_int_equal(spdm_response->header.param2, 0);
1048 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1049 : assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
1050 : #endif
1051 1 : }
1052 :
1053 : /**
1054 : * Test 17: Error case, meas_cap = 00
1055 : * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code, empty transcript.message_m size, and Error message as response
1056 : **/
1057 1 : static void rsp_measurements_case17(void **state)
1058 : {
1059 : libspdm_return_t status;
1060 : libspdm_test_context_t *spdm_test_context;
1061 : libspdm_context_t *spdm_context;
1062 : size_t response_size;
1063 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1064 : spdm_measurements_response_t *spdm_response;
1065 : /* size_t measurment_sig_size;*/
1066 :
1067 1 : spdm_test_context = *state;
1068 1 : spdm_context = spdm_test_context->spdm_context;
1069 1 : spdm_test_context->case_id = 0x11;
1070 1 : spdm_context->connection_info.connection_state =
1071 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
1072 1 : spdm_context->local_context.capability.flags = 0;
1073 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1074 : m_libspdm_use_hash_algo;
1075 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1076 : m_libspdm_use_asym_algo;
1077 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
1078 : m_libspdm_use_measurement_hash_algo;
1079 :
1080 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
1081 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1082 1 : libspdm_reset_message_m(spdm_context, NULL);
1083 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
1084 : /* measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 + libspdm_get_asym_signature_size (m_libspdm_use_asym_algo);*/
1085 :
1086 1 : response_size = sizeof(response);
1087 1 : libspdm_get_random_number(SPDM_NONCE_SIZE,
1088 : m_libspdm_get_measurements_request9.nonce);
1089 1 : status = libspdm_get_response_measurements(
1090 : spdm_context, m_libspdm_get_measurements_request9_size,
1091 : &m_libspdm_get_measurements_request9, &response_size, response);
1092 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1093 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
1094 1 : spdm_response = (void *)response;
1095 1 : assert_int_equal(spdm_response->header.request_response_code,
1096 : SPDM_ERROR);
1097 1 : assert_int_equal(spdm_response->header.param1,
1098 : SPDM_ERROR_CODE_UNSUPPORTED_REQUEST);
1099 1 : assert_int_equal(
1100 : spdm_response->header.param2,
1101 : m_libspdm_get_measurements_request10.header.request_response_code);
1102 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1103 : assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
1104 : #endif
1105 1 : }
1106 :
1107 : /**
1108 : * Test 18: Successful response to get one measurement with signature, SlotId different from default
1109 : * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code, empty transcript.message_m, and correct response message size and fields
1110 : **/
1111 1 : static void rsp_measurements_case18(void **state)
1112 : {
1113 : libspdm_return_t status;
1114 : libspdm_test_context_t *spdm_test_context;
1115 : libspdm_context_t *spdm_context;
1116 : size_t response_size;
1117 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1118 : spdm_measurements_response_t *spdm_response;
1119 : void *data;
1120 : size_t data_size;
1121 : size_t measurment_sig_size;
1122 :
1123 1 : spdm_test_context = *state;
1124 1 : spdm_context = spdm_test_context->spdm_context;
1125 1 : spdm_test_context->case_id = 0x12;
1126 1 : spdm_context->connection_info.connection_state =
1127 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
1128 1 : spdm_context->local_context.capability.flags |=
1129 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
1130 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1131 : m_libspdm_use_hash_algo;
1132 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1133 : m_libspdm_use_asym_algo;
1134 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
1135 : m_libspdm_use_measurement_hash_algo;
1136 :
1137 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
1138 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1139 1 : libspdm_reset_message_m(spdm_context, NULL);
1140 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
1141 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
1142 : m_libspdm_use_asym_algo, &data,
1143 : &data_size, NULL, NULL);
1144 1 : measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
1145 1 : libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
1146 9 : for (int i = 0; i < SPDM_MAX_SLOT_COUNT; i++) {
1147 8 : spdm_context->local_context.local_cert_chain_provision_size[i] =
1148 : data_size;
1149 8 : spdm_context->local_context.local_cert_chain_provision[i] =
1150 : data;
1151 : }
1152 :
1153 1 : response_size = sizeof(response);
1154 1 : libspdm_get_random_number(SPDM_NONCE_SIZE,
1155 : m_libspdm_get_measurements_request11.nonce);
1156 1 : status = libspdm_get_response_measurements(
1157 : spdm_context, m_libspdm_get_measurements_request11_size,
1158 : &m_libspdm_get_measurements_request11, &response_size, response);
1159 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1160 1 : assert_int_equal(response_size,
1161 : sizeof(spdm_measurements_response_t) +
1162 : sizeof(spdm_measurement_block_dmtf_t) +
1163 : libspdm_get_measurement_hash_size(
1164 : m_libspdm_use_measurement_hash_algo) +
1165 : measurment_sig_size);
1166 1 : spdm_response = (void *)response;
1167 1 : assert_int_equal(spdm_response->header.request_response_code,
1168 : SPDM_MEASUREMENTS);
1169 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1170 : assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
1171 : #endif
1172 1 : assert_int_equal(m_libspdm_get_measurements_request11.slot_id_param,
1173 : spdm_response->header.param2);
1174 :
1175 1 : free(data);
1176 1 : }
1177 :
1178 : /**
1179 : * Test 19: Error case, invalid SlotId parameter (SlotId >= SPDM_MAX_SLOT_COUNT)
1180 : * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code, empty transcript.message_m size, and Error message as response
1181 : **/
1182 1 : static void rsp_measurements_case19(void **state)
1183 : {
1184 : libspdm_return_t status;
1185 : libspdm_test_context_t *spdm_test_context;
1186 : libspdm_context_t *spdm_context;
1187 : size_t response_size;
1188 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1189 : spdm_measurements_response_t *spdm_response;
1190 : /* size_t measurment_sig_size;*/
1191 :
1192 1 : spdm_test_context = *state;
1193 1 : spdm_context = spdm_test_context->spdm_context;
1194 1 : spdm_test_context->case_id = 0x13;
1195 1 : spdm_context->connection_info.connection_state =
1196 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
1197 1 : spdm_context->local_context.capability.flags |=
1198 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
1199 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1200 : m_libspdm_use_hash_algo;
1201 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1202 : m_libspdm_use_asym_algo;
1203 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
1204 : m_libspdm_use_measurement_hash_algo;
1205 :
1206 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
1207 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1208 1 : libspdm_reset_message_m(spdm_context, NULL);
1209 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
1210 : /* measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 + libspdm_get_asym_signature_size (m_libspdm_use_asym_algo);*/
1211 :
1212 1 : response_size = sizeof(response);
1213 1 : libspdm_get_random_number(SPDM_NONCE_SIZE,
1214 : m_libspdm_get_measurements_request12.nonce);
1215 1 : status = libspdm_get_response_measurements(
1216 : spdm_context, m_libspdm_get_measurements_request12_size,
1217 : &m_libspdm_get_measurements_request12, &response_size, response);
1218 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1219 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
1220 1 : spdm_response = (void *)response;
1221 1 : assert_int_equal(spdm_response->header.request_response_code,
1222 : SPDM_ERROR);
1223 1 : assert_int_equal(spdm_response->header.param1,
1224 : SPDM_ERROR_CODE_INVALID_REQUEST);
1225 1 : assert_int_equal(spdm_response->header.param2, 0);
1226 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1227 : assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
1228 : #endif
1229 1 : }
1230 :
1231 : /**
1232 : * Test 21: Error case, request a measurement index not found
1233 : * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code, empty transcript.message_m size, and Error message as response
1234 : **/
1235 1 : static void rsp_measurements_case21(void **state)
1236 : {
1237 : libspdm_return_t status;
1238 : libspdm_test_context_t *spdm_test_context;
1239 : libspdm_context_t *spdm_context;
1240 : size_t response_size;
1241 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1242 : spdm_measurements_response_t *spdm_response;
1243 :
1244 1 : spdm_test_context = *state;
1245 1 : spdm_context = spdm_test_context->spdm_context;
1246 1 : spdm_test_context->case_id = 0x15;
1247 1 : spdm_context->connection_info.connection_state =
1248 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
1249 1 : spdm_context->local_context.capability.flags |=
1250 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
1251 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1252 : m_libspdm_use_hash_algo;
1253 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1254 : m_libspdm_use_asym_algo;
1255 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
1256 : m_libspdm_use_measurement_hash_algo;
1257 :
1258 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
1259 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1260 1 : libspdm_reset_message_m(spdm_context, NULL);
1261 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
1262 :
1263 1 : response_size = sizeof(response);
1264 1 : libspdm_get_random_number(SPDM_NONCE_SIZE,
1265 : m_libspdm_get_measurements_request13.nonce);
1266 1 : status = libspdm_get_response_measurements(
1267 : spdm_context, m_libspdm_get_measurements_request13_size,
1268 : &m_libspdm_get_measurements_request13, &response_size, response);
1269 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1270 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
1271 1 : spdm_response = (void *)response;
1272 1 : assert_int_equal(spdm_response->header.request_response_code,
1273 : SPDM_ERROR);
1274 1 : assert_int_equal(spdm_response->header.param1,
1275 : SPDM_ERROR_CODE_INVALID_REQUEST);
1276 1 : assert_int_equal(spdm_response->header.param2, 0);
1277 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1278 : assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
1279 : #endif
1280 1 : }
1281 :
1282 : /**
1283 : * Test 22: request a large number of measurements before requesting a signed response
1284 : * Expected Behavior: while transcript.message_m is not full, get a LIBSPDM_STATUS_SUCCESS return code, empty transcript.message_m, and correct response message size and fields
1285 : * if transcript.message_m has no more room, an error response is expected
1286 : **/
1287 1 : static void rsp_measurements_case22(void **state)
1288 : {
1289 : libspdm_return_t status;
1290 : libspdm_test_context_t *spdm_test_context;
1291 : libspdm_context_t *spdm_context;
1292 : size_t response_size;
1293 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1294 : spdm_measurements_response_t *spdm_response;
1295 : size_t NumberOfMessages;
1296 : #define TOTAL_MESSAGES 100
1297 :
1298 1 : spdm_test_context = *state;
1299 1 : spdm_context = spdm_test_context->spdm_context;
1300 1 : spdm_test_context->case_id = 0x16;
1301 1 : spdm_context->connection_info.connection_state =
1302 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
1303 1 : spdm_context->local_context.capability.flags |=
1304 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
1305 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1306 : m_libspdm_use_hash_algo;
1307 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1308 : m_libspdm_use_asym_algo;
1309 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
1310 : m_libspdm_use_measurement_hash_algo;
1311 1 : spdm_context->connection_info.algorithm.measurement_spec =
1312 : m_libspdm_use_measurement_spec;
1313 :
1314 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
1315 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1316 1 : libspdm_reset_message_m(spdm_context, NULL);
1317 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
1318 :
1319 101 : for (NumberOfMessages = 1; NumberOfMessages <= TOTAL_MESSAGES; NumberOfMessages++) {
1320 100 : libspdm_get_random_number(SPDM_NONCE_SIZE,
1321 : m_libspdm_get_measurements_request9.nonce);
1322 100 : response_size = sizeof(response);
1323 100 : status = libspdm_get_response_measurements(
1324 : spdm_context, m_libspdm_get_measurements_request9_size,
1325 : &m_libspdm_get_measurements_request9, &response_size,
1326 : response);
1327 100 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1328 100 : spdm_response = (void *)response;
1329 100 : if (spdm_response->header.request_response_code ==
1330 : SPDM_MEASUREMENTS) {
1331 100 : assert_int_equal(
1332 : spdm_response->header.request_response_code,
1333 : SPDM_MEASUREMENTS);
1334 100 : assert_int_equal(
1335 : response_size,
1336 : sizeof(spdm_measurements_response_t) +
1337 : sizeof(spdm_measurement_block_dmtf_t) +
1338 : libspdm_get_measurement_hash_size(
1339 : m_libspdm_use_measurement_hash_algo) + SPDM_NONCE_SIZE +
1340 : sizeof(uint16_t));
1341 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1342 : assert_int_equal(
1343 : spdm_context->transcript.message_m.buffer_size,
1344 : NumberOfMessages *
1345 : (m_libspdm_get_measurements_request9_size +
1346 : sizeof(spdm_measurements_response_t) +
1347 : sizeof(spdm_measurement_block_dmtf_t) +
1348 : libspdm_get_measurement_hash_size(
1349 : m_libspdm_use_measurement_hash_algo) + SPDM_NONCE_SIZE +
1350 : sizeof(uint16_t)));
1351 : #endif
1352 : } else {
1353 0 : assert_int_equal(
1354 : spdm_response->header.request_response_code,
1355 : SPDM_ERROR);
1356 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1357 : assert_int_equal(
1358 : spdm_context->transcript.message_m.buffer_size,
1359 : 0);
1360 : #endif
1361 0 : break;
1362 : }
1363 : }
1364 1 : }
1365 :
1366 : /**
1367 : * Test 23: Successful response to get a session based measurement with signature
1368 : * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code, with an empty session_transcript.message_m
1369 : **/
1370 1 : static void rsp_measurements_case23(void **state)
1371 : {
1372 : libspdm_return_t status;
1373 : libspdm_test_context_t *spdm_test_context;
1374 : libspdm_context_t *spdm_context;
1375 : size_t response_size;
1376 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1377 : spdm_measurements_response_t *spdm_response;
1378 : size_t measurment_sig_size;
1379 : libspdm_session_info_t *session_info;
1380 : uint32_t session_id;
1381 :
1382 1 : spdm_test_context = *state;
1383 1 : spdm_context = spdm_test_context->spdm_context;
1384 1 : spdm_test_context->case_id = 0x17;
1385 1 : spdm_context->connection_info.connection_state =
1386 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
1387 1 : spdm_context->local_context.capability.flags |=
1388 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
1389 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1390 : m_libspdm_use_hash_algo;
1391 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1392 : m_libspdm_use_asym_algo;
1393 1 : spdm_context->connection_info.algorithm.measurement_spec =
1394 : m_libspdm_use_measurement_spec;
1395 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
1396 : m_libspdm_use_measurement_hash_algo;
1397 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
1398 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1399 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
1400 1 : measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
1401 1 : libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
1402 :
1403 1 : response_size = sizeof(response);
1404 1 : libspdm_get_random_number(SPDM_NONCE_SIZE,
1405 : m_libspdm_get_measurements_request5.nonce);
1406 :
1407 :
1408 1 : session_id = 0xFFFFFFFF;
1409 1 : spdm_context->latest_session_id = session_id;
1410 1 : spdm_context->last_spdm_request_session_id_valid = true;
1411 1 : spdm_context->last_spdm_request_session_id = session_id;
1412 1 : session_info = &spdm_context->session_info[0];
1413 1 : libspdm_session_info_init(spdm_context, session_info, session_id,
1414 : SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
1415 1 : libspdm_secured_message_set_session_state(
1416 : session_info->secured_message_context,
1417 : LIBSPDM_SESSION_STATE_ESTABLISHED);
1418 1 : status = libspdm_get_response_measurements(
1419 : spdm_context, m_libspdm_get_measurements_request5_size,
1420 : &m_libspdm_get_measurements_request5, &response_size, response);
1421 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1422 1 : assert_int_equal(response_size, sizeof(spdm_measurements_response_t) +
1423 : measurment_sig_size);
1424 1 : spdm_response = (void *)response;
1425 1 : assert_int_equal(spdm_response->header.request_response_code,
1426 : SPDM_MEASUREMENTS);
1427 1 : assert_int_equal(spdm_response->header.param1,
1428 : LIBSPDM_MEASUREMENT_BLOCK_NUMBER);
1429 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1430 : assert_int_equal(session_info->session_transcript.message_m.buffer_size, 0);
1431 : #endif
1432 1 : }
1433 :
1434 : /**
1435 : * Test 24: receiving a correct GET_MEASUREMENTS from the requester that does not request a
1436 : * signature. Buffer M already has arbitrary data.
1437 : * Expected behavior: the responder accepts the request and produces a valid
1438 : * MEASUREMENTS response message, and buffer M appends the exchanged GET_MEASUREMENTS and MEASUREMENTS
1439 : * messages.
1440 : **/
1441 1 : static void rsp_measurements_case24(void **state)
1442 : {
1443 : libspdm_return_t status;
1444 : libspdm_test_context_t *spdm_test_context;
1445 : libspdm_context_t *spdm_context;
1446 : size_t response_size;
1447 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1448 : spdm_measurements_response_t *spdm_response;
1449 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1450 : size_t arbitrary_size;
1451 : #endif
1452 :
1453 1 : spdm_test_context = *state;
1454 1 : spdm_context = spdm_test_context->spdm_context;
1455 1 : spdm_test_context->case_id = 0x18;
1456 1 : spdm_context->connection_info.connection_state =
1457 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
1458 1 : spdm_context->local_context.capability.flags |=
1459 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
1460 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
1461 1 : spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
1462 1 : spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
1463 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
1464 : m_libspdm_use_measurement_hash_algo;
1465 1 : libspdm_reset_message_m(spdm_context, NULL);
1466 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
1467 1 : spdm_context->last_spdm_request_session_id_valid = 0;
1468 :
1469 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1470 : /*filling M buffer with arbitrary data*/
1471 : arbitrary_size = 18;
1472 : libspdm_set_mem(spdm_context->transcript.message_m.buffer, arbitrary_size, (uint8_t) 0xFF);
1473 : spdm_context->transcript.message_m.buffer_size = arbitrary_size;
1474 : #endif
1475 :
1476 1 : response_size = sizeof(response);
1477 1 : libspdm_get_random_number(SPDM_NONCE_SIZE, m_libspdm_get_measurements_request7.nonce);
1478 1 : status = libspdm_get_response_measurements(
1479 : spdm_context, m_libspdm_get_measurements_request7_size,
1480 : &m_libspdm_get_measurements_request7, &response_size, response);
1481 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1482 1 : assert_int_equal(response_size,
1483 : sizeof(spdm_measurements_response_t) + LIBSPDM_MEASUREMENT_BLOCK_HASH_NUMBER*
1484 : (sizeof(spdm_measurement_block_dmtf_t) +
1485 : libspdm_get_measurement_hash_size(m_libspdm_use_measurement_hash_algo)) +
1486 : (sizeof(spdm_measurement_block_dmtf_t) +
1487 : sizeof(spdm_measurements_secure_version_number_t)) +
1488 : (sizeof(spdm_measurement_block_dmtf_t) +
1489 : libspdm_get_measurement_hash_size(m_libspdm_use_measurement_hash_algo)) +
1490 : (sizeof(spdm_measurement_block_dmtf_t) + LIBSPDM_MEASUREMENT_MANIFEST_SIZE) +
1491 : (sizeof(spdm_measurement_block_dmtf_t) +
1492 : sizeof(spdm_measurements_device_mode_t)) +
1493 : SPDM_NONCE_SIZE + sizeof(uint16_t));
1494 1 : spdm_response = (void *)response;
1495 1 : assert_int_equal(spdm_response->header.request_response_code, SPDM_MEASUREMENTS);
1496 1 : assert_int_equal(spdm_response->number_of_blocks, LIBSPDM_MEASUREMENT_BLOCK_NUMBER);
1497 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1498 : assert_int_equal(spdm_context->transcript.message_m.buffer_size,
1499 : arbitrary_size + m_libspdm_get_measurements_request7_size +
1500 : sizeof(spdm_measurements_response_t) + LIBSPDM_MEASUREMENT_BLOCK_HASH_NUMBER*
1501 : (sizeof(spdm_measurement_block_dmtf_t) +
1502 : libspdm_get_measurement_hash_size(m_libspdm_use_measurement_hash_algo)) +
1503 : (sizeof(spdm_measurement_block_dmtf_t) +
1504 : sizeof(spdm_measurements_secure_version_number_t)) +
1505 : (sizeof(spdm_measurement_block_dmtf_t) +
1506 : libspdm_get_measurement_hash_size(m_libspdm_use_measurement_hash_algo)) +
1507 : (sizeof(spdm_measurement_block_dmtf_t) + LIBSPDM_MEASUREMENT_MANIFEST_SIZE) +
1508 : (sizeof(spdm_measurement_block_dmtf_t) +
1509 : sizeof(spdm_measurements_device_mode_t)) +
1510 : SPDM_NONCE_SIZE + sizeof(uint16_t));
1511 :
1512 : assert_int_equal(spdm_context->transcript.message_m.buffer_size,
1513 : arbitrary_size + m_libspdm_get_measurements_request7_size + response_size);
1514 : assert_memory_equal(spdm_context->transcript.message_m.buffer + arbitrary_size,
1515 : &m_libspdm_get_measurements_request7,
1516 : m_libspdm_get_measurements_request7_size);
1517 : assert_memory_equal(spdm_context->transcript.message_m.buffer + arbitrary_size
1518 : + m_libspdm_get_measurements_request7_size,
1519 : response, response_size);
1520 : #endif
1521 1 : }
1522 :
1523 1 : static void rsp_measurements_case25(void **state)
1524 : {
1525 : libspdm_return_t status;
1526 : libspdm_test_context_t *spdm_test_context;
1527 : libspdm_context_t *spdm_context;
1528 : size_t response_size;
1529 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1530 : spdm_measurements_response_t *spdm_response;
1531 :
1532 1 : spdm_test_context = *state;
1533 1 : spdm_context = spdm_test_context->spdm_context;
1534 1 : spdm_test_context->case_id = 0x19;
1535 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
1536 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1537 1 : spdm_context->connection_info.connection_state =
1538 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
1539 1 : spdm_context->local_context.capability.flags |=
1540 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
1541 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1542 : m_libspdm_use_hash_algo;
1543 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1544 : m_libspdm_use_asym_algo;
1545 1 : spdm_context->connection_info.algorithm.measurement_spec =
1546 : m_libspdm_use_measurement_spec;
1547 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
1548 : m_libspdm_use_measurement_hash_algo;
1549 1 : libspdm_reset_message_m(spdm_context, NULL);
1550 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
1551 :
1552 1 : response_size = sizeof(response);
1553 1 : libspdm_get_random_number(SPDM_NONCE_SIZE,
1554 : m_libspdm_get_measurements_request14.nonce);
1555 1 : status = libspdm_get_response_measurements(
1556 : spdm_context, m_libspdm_get_measurements_request14_size,
1557 : &m_libspdm_get_measurements_request14, &response_size, response);
1558 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1559 1 : assert_int_equal(response_size,
1560 : sizeof(spdm_measurements_response_t) +
1561 : sizeof(spdm_measurement_block_dmtf_t) +
1562 : LIBSPDM_MEASUREMENT_RAW_DATA_SIZE + SPDM_NONCE_SIZE +
1563 : sizeof(uint16_t));
1564 1 : spdm_response = (void *)response;
1565 1 : assert_int_equal(spdm_response->header.request_response_code,
1566 : SPDM_MEASUREMENTS);
1567 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1568 : assert_int_equal(spdm_context->transcript.message_m.buffer_size,
1569 : m_libspdm_get_measurements_request14_size +
1570 : sizeof(spdm_measurements_response_t) +
1571 : sizeof(spdm_measurement_block_dmtf_t) +
1572 : LIBSPDM_MEASUREMENT_RAW_DATA_SIZE + SPDM_NONCE_SIZE +
1573 : sizeof(uint16_t));
1574 : #endif
1575 1 : }
1576 :
1577 1 : static void rsp_measurements_case26(void **state)
1578 : {
1579 : libspdm_return_t status;
1580 : libspdm_test_context_t *spdm_test_context;
1581 : libspdm_context_t *spdm_context;
1582 : size_t response_size;
1583 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1584 : spdm_measurements_response_t *spdm_response;
1585 : void *data;
1586 : size_t data_size;
1587 : size_t measurment_sig_size;
1588 :
1589 1 : spdm_test_context = *state;
1590 1 : spdm_context = spdm_test_context->spdm_context;
1591 1 : spdm_test_context->case_id = 0x1A;
1592 1 : spdm_context->connection_info.connection_state =
1593 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
1594 1 : spdm_context->local_context.capability.flags |=
1595 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
1596 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1597 : m_libspdm_use_hash_algo;
1598 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1599 : m_libspdm_use_asym_algo;
1600 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
1601 : m_libspdm_use_measurement_hash_algo;
1602 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1603 : m_libspdm_use_hash_algo;
1604 1 : spdm_context->connection_info.algorithm.measurement_spec =
1605 : m_libspdm_use_measurement_spec;
1606 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
1607 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1608 1 : libspdm_reset_message_m(spdm_context, NULL);
1609 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
1610 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
1611 : m_libspdm_use_asym_algo, &data,
1612 : &data_size, NULL, NULL);
1613 1 : measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
1614 1 : libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
1615 9 : for (int i = 0; i < SPDM_MAX_SLOT_COUNT; i++) {
1616 8 : spdm_context->local_context.local_cert_chain_provision_size[i] =
1617 : data_size;
1618 8 : spdm_context->local_context.local_cert_chain_provision[i] =
1619 : data;
1620 : }
1621 :
1622 1 : response_size = sizeof(response);
1623 1 : libspdm_get_random_number(SPDM_NONCE_SIZE,
1624 : m_libspdm_get_measurements_request15.nonce);
1625 1 : status = libspdm_get_response_measurements(
1626 : spdm_context, m_libspdm_get_measurements_request15_size,
1627 : &m_libspdm_get_measurements_request15, &response_size, response);
1628 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1629 1 : assert_int_equal(response_size,
1630 : sizeof(spdm_measurements_response_t) +
1631 : sizeof(spdm_measurement_block_dmtf_t) +
1632 : libspdm_get_measurement_hash_size(
1633 : m_libspdm_use_measurement_hash_algo) +
1634 : measurment_sig_size);
1635 1 : spdm_response = (void *)response;
1636 1 : assert_int_equal(spdm_response->header.request_response_code,
1637 : SPDM_MEASUREMENTS);
1638 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1639 : assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
1640 : #endif
1641 1 : assert_int_equal(spdm_response->header.param2, m_libspdm_get_measurements_request15.slot_id_param|
1642 : (SPDM_MEASUREMENTS_RESPONSE_CONTENT_NO_CHANGE_DETECTED &
1643 : SPDM_MEASUREMENTS_RESPONSE_CONTENT_CHANGE_MASK));
1644 :
1645 1 : free(data);
1646 1 : }
1647 :
1648 1 : static void rsp_measurements_case27(void **state)
1649 : {
1650 : libspdm_return_t status;
1651 : libspdm_test_context_t *spdm_test_context;
1652 : libspdm_context_t *spdm_context;
1653 : size_t response_size;
1654 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1655 : spdm_measurements_response_t *spdm_response;
1656 : void *data;
1657 : size_t data_size;
1658 : size_t measurment_sig_size;
1659 : uint8_t content_changed;
1660 : uint8_t measurements_count;
1661 : uint8_t *measurement_record_data;
1662 : size_t measurement_record_data_length;
1663 : uint8_t expect_measurement_record_data[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
1664 : size_t expect_measurement_record_data_length;
1665 : uint8_t *opaque_data;
1666 : uint16_t *opaque_data_size;
1667 : uint8_t expect_opaque_data[SPDM_MAX_OPAQUE_DATA_SIZE];
1668 : size_t expect_opaque_data_size;
1669 :
1670 1 : spdm_test_context = *state;
1671 1 : spdm_context = spdm_test_context->spdm_context;
1672 1 : spdm_test_context->case_id = 0x1B;
1673 1 : spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
1674 1 : spdm_context->local_context.capability.flags |=
1675 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
1676 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
1677 1 : spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
1678 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
1679 : m_libspdm_use_measurement_hash_algo;
1680 1 : spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
1681 1 : spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
1682 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
1683 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1684 1 : spdm_context->connection_info.algorithm.other_params_support =
1685 : SPDM_ALGORITHMS_OPAQUE_DATA_FORMAT_1;
1686 1 : libspdm_reset_message_m(spdm_context, NULL);
1687 :
1688 : /*opaque data*/
1689 1 : libspdm_secret_lib_meas_opaque_data_size = 0x20;
1690 :
1691 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
1692 : m_libspdm_use_asym_algo, &data,
1693 : &data_size, NULL, NULL);
1694 1 : measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) +
1695 1 : libspdm_secret_lib_meas_opaque_data_size +
1696 1 : libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
1697 9 : for (int i = 0; i < SPDM_MAX_SLOT_COUNT; i++) {
1698 8 : spdm_context->local_context.local_cert_chain_provision_size[i] = data_size;
1699 8 : spdm_context->local_context.local_cert_chain_provision[i] = data;
1700 : }
1701 :
1702 1 : response_size = sizeof(response);
1703 1 : libspdm_get_random_number(SPDM_NONCE_SIZE, m_libspdm_get_measurements_request15.nonce);
1704 1 : status = libspdm_get_response_measurements(
1705 : spdm_context, m_libspdm_get_measurements_request15_size,
1706 : &m_libspdm_get_measurements_request15, &response_size, response);
1707 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1708 1 : assert_int_equal(response_size,
1709 : sizeof(spdm_measurements_response_t) +
1710 : sizeof(spdm_measurement_block_dmtf_t) +
1711 : libspdm_get_measurement_hash_size(m_libspdm_use_measurement_hash_algo) +
1712 : measurment_sig_size);
1713 1 : spdm_response = (void *)response;
1714 1 : assert_int_equal(spdm_response->header.request_response_code,
1715 : SPDM_MEASUREMENTS);
1716 :
1717 1 : expect_measurement_record_data_length = sizeof(expect_measurement_record_data);
1718 1 : expect_opaque_data_size = sizeof(expect_opaque_data);
1719 :
1720 1 : libspdm_measurement_collection(
1721 : spdm_context,
1722 1 : spdm_context->connection_info.version,
1723 1 : spdm_context->connection_info.algorithm.measurement_spec,
1724 : spdm_context->connection_info.algorithm.measurement_hash_algo,
1725 1 : m_libspdm_get_measurements_request15.header.param2,
1726 1 : m_libspdm_get_measurements_request15.header.param1,
1727 : 0,
1728 : NULL,
1729 : &content_changed,
1730 : &measurements_count,
1731 : expect_measurement_record_data,
1732 : &expect_measurement_record_data_length);
1733 :
1734 1 : libspdm_measurement_opaque_data(
1735 : spdm_context,
1736 1 : spdm_context->connection_info.version,
1737 1 : spdm_context->connection_info.algorithm.measurement_spec,
1738 : spdm_context->connection_info.algorithm.measurement_hash_algo,
1739 1 : m_libspdm_get_measurements_request15.header.param2,
1740 1 : m_libspdm_get_measurements_request15.header.param1,
1741 : 0,
1742 : NULL,
1743 : expect_opaque_data,
1744 : &expect_opaque_data_size);
1745 :
1746 1 : measurement_record_data = (uint8_t *)response + sizeof(spdm_measurements_response_t);
1747 1 : opaque_data_size =
1748 : (uint16_t *)(measurement_record_data + sizeof(spdm_measurement_block_dmtf_t) +
1749 1 : libspdm_get_measurement_hash_size(
1750 1 : m_libspdm_use_measurement_hash_algo) +
1751 : SPDM_NONCE_SIZE);
1752 1 : opaque_data = (uint8_t *)opaque_data_size + sizeof(uint16_t);
1753 :
1754 1 : measurement_record_data_length = libspdm_read_uint24(spdm_response->measurement_record_length);
1755 :
1756 1 : assert_int_equal(measurement_record_data_length, expect_measurement_record_data_length );
1757 1 : assert_memory_equal(measurement_record_data, expect_measurement_record_data,
1758 : expect_measurement_record_data_length);
1759 1 : assert_int_equal(*opaque_data_size, libspdm_secret_lib_meas_opaque_data_size);
1760 1 : assert_memory_equal(opaque_data, expect_opaque_data, libspdm_secret_lib_meas_opaque_data_size);
1761 :
1762 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1763 : assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
1764 : #endif
1765 1 : assert_int_equal(spdm_response->header.param2, m_libspdm_get_measurements_request15.slot_id_param|
1766 : (SPDM_MEASUREMENTS_RESPONSE_CONTENT_NO_CHANGE_DETECTED &
1767 : SPDM_MEASUREMENTS_RESPONSE_CONTENT_CHANGE_MASK));
1768 :
1769 1 : free(data);
1770 1 : }
1771 :
1772 : /**
1773 : * Test 28: Successful response to get all measurements with signature using slot_id 0xFF
1774 : * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code, empty transcript.message_m, and correct response message size and fields
1775 : **/
1776 1 : static void rsp_measurements_case28(void **state)
1777 : {
1778 : libspdm_return_t status;
1779 : libspdm_test_context_t *spdm_test_context;
1780 : libspdm_context_t *spdm_context;
1781 : size_t response_size;
1782 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1783 : spdm_measurements_response_t *spdm_response;
1784 : void *data;
1785 : size_t data_size;
1786 : size_t measurment_sig_size;
1787 :
1788 1 : spdm_test_context = *state;
1789 1 : spdm_context = spdm_test_context->spdm_context;
1790 1 : spdm_test_context->case_id = 0x1C;
1791 1 : spdm_context->connection_info.connection_state =
1792 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
1793 1 : spdm_context->local_context.capability.flags |=
1794 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
1795 1 : spdm_context->local_context.capability.flags |=
1796 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PUB_KEY_ID_CAP;
1797 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1798 : m_libspdm_use_hash_algo;
1799 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1800 : m_libspdm_use_asym_algo;
1801 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
1802 : m_libspdm_use_measurement_hash_algo;
1803 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1804 : m_libspdm_use_hash_algo;
1805 1 : spdm_context->connection_info.algorithm.measurement_spec =
1806 : m_libspdm_use_measurement_spec;
1807 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
1808 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1809 1 : libspdm_reset_message_m(spdm_context, NULL);
1810 :
1811 : /*opaque data*/
1812 1 : libspdm_secret_lib_meas_opaque_data_size = 0x20;
1813 :
1814 1 : libspdm_read_responder_public_key(m_libspdm_use_asym_algo, &data, &data_size);
1815 1 : spdm_context->local_context.local_public_key_provision = data;
1816 1 : spdm_context->local_context.local_public_key_provision_size = data_size;
1817 :
1818 1 : measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) +
1819 1 : libspdm_secret_lib_meas_opaque_data_size +
1820 1 : libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
1821 1 : response_size = sizeof(response);
1822 1 : libspdm_get_random_number(SPDM_NONCE_SIZE,
1823 : m_libspdm_get_measurements_request16.nonce);
1824 1 : m_libspdm_get_measurements_request16.slot_id_param = 0xF;
1825 1 : status = libspdm_get_response_measurements(
1826 : spdm_context, m_libspdm_get_measurements_request16_size,
1827 : &m_libspdm_get_measurements_request16, &response_size, response);
1828 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1829 1 : assert_int_equal(response_size,
1830 : sizeof(spdm_measurements_response_t) + sizeof(spdm_measurement_block_dmtf_t) +
1831 : libspdm_get_measurement_hash_size(m_libspdm_use_measurement_hash_algo) +
1832 : measurment_sig_size);
1833 1 : spdm_response = (void *)response;
1834 1 : assert_int_equal(spdm_response->header.request_response_code,
1835 : SPDM_MEASUREMENTS);
1836 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1837 : assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
1838 : #endif
1839 1 : assert_int_equal(spdm_response->header.param2,
1840 : m_libspdm_get_measurements_request16.slot_id_param |
1841 : (SPDM_MEASUREMENTS_RESPONSE_CONTENT_NO_CHANGE_DETECTED &
1842 : SPDM_MEASUREMENTS_RESPONSE_CONTENT_CHANGE_MASK));
1843 :
1844 1 : free(data);
1845 1 : }
1846 :
1847 : /**
1848 : * Test 29: Based of Test Case 7 Successful response to get a number of measurements
1849 : * with signature.
1850 : * Signature test with signing in big endian but verification in little endian.
1851 : *
1852 : * Expected Behavior: Failing signature verification
1853 : **/
1854 1 : static void rsp_measurements_case29(void** state)
1855 : {
1856 : libspdm_return_t status;
1857 : libspdm_test_context_t* spdm_test_context;
1858 : libspdm_context_t* spdm_context;
1859 : size_t response_size;
1860 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1861 : spdm_measurements_response_t* spdm_response;
1862 : size_t measurment_sig_size;
1863 :
1864 : bool result;
1865 : uint32_t measurement_record_data_length;
1866 : uint8_t* measurement_record_data;
1867 : uint8_t* ptr;
1868 : uint16_t opaque_length;
1869 : void* signature;
1870 : size_t signature_size;
1871 : libspdm_session_info_t* session_info;
1872 : void* data;
1873 : size_t data_size;
1874 : void* hash;
1875 : size_t hash_size;
1876 :
1877 1 : spdm_test_context = *state;
1878 1 : spdm_context = spdm_test_context->spdm_context;
1879 1 : spdm_test_context->case_id = 29;
1880 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
1881 : SPDM_VERSION_NUMBER_SHIFT_BIT;
1882 1 : spdm_context->connection_info.connection_state =
1883 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
1884 1 : spdm_context->local_context.capability.flags |=
1885 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
1886 1 : spdm_context->connection_info.algorithm.base_hash_algo =
1887 : m_libspdm_use_hash_algo;
1888 1 : spdm_context->connection_info.algorithm.base_asym_algo =
1889 : m_libspdm_use_asym_algo;
1890 1 : spdm_context->connection_info.algorithm.measurement_spec =
1891 : m_libspdm_use_measurement_spec;
1892 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
1893 : m_libspdm_use_measurement_hash_algo;
1894 1 : spdm_context->spdm_10_11_verify_signature_endian =
1895 : LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_LITTLE_ONLY;
1896 :
1897 1 : libspdm_reset_message_m(spdm_context, NULL);
1898 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
1899 1 : measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
1900 1 : libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
1901 :
1902 1 : response_size = sizeof(response);
1903 1 : libspdm_get_random_number(SPDM_NONCE_SIZE,
1904 : m_libspdm_get_measurements_request5.nonce);
1905 1 : status = libspdm_get_response_measurements(
1906 : spdm_context, m_libspdm_get_measurements_request5_size,
1907 : &m_libspdm_get_measurements_request5, &response_size, response);
1908 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1909 1 : assert_int_equal(response_size, sizeof(spdm_measurements_response_t) +
1910 : measurment_sig_size);
1911 1 : spdm_response = (void*)response;
1912 1 : assert_int_equal(spdm_response->header.request_response_code,
1913 : SPDM_MEASUREMENTS);
1914 1 : assert_int_equal(spdm_response->header.param1,
1915 : LIBSPDM_MEASUREMENT_BLOCK_NUMBER);
1916 :
1917 1 : if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
1918 : m_libspdm_use_asym_algo, &data,
1919 : &data_size,
1920 : &hash, &hash_size)) {
1921 0 : assert(false);
1922 : }
1923 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1924 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
1925 : data_size;
1926 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
1927 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
1928 : data, data_size);
1929 : #else
1930 1 : libspdm_hash_all(
1931 : spdm_context->connection_info.algorithm.base_hash_algo,
1932 : data, data_size,
1933 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
1934 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
1935 1 : libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
1936 1 : libspdm_get_leaf_cert_public_key_from_cert_chain(
1937 : spdm_context->connection_info.algorithm.base_hash_algo,
1938 : spdm_context->connection_info.algorithm.base_asym_algo,
1939 : data, data_size,
1940 : &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
1941 : #endif
1942 :
1943 1 : measurement_record_data_length = libspdm_read_uint24(spdm_response->measurement_record_length);
1944 1 : measurement_record_data = (void*)(spdm_response + 1);
1945 1 : ptr = measurement_record_data + measurement_record_data_length;
1946 1 : ptr += SPDM_NONCE_SIZE;
1947 1 : opaque_length = libspdm_read_uint16((const uint8_t*)ptr);
1948 1 : ptr += sizeof(uint16_t);
1949 1 : ptr += opaque_length;
1950 1 : signature = ptr;
1951 1 : signature_size = libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
1952 1 : session_info = NULL;
1953 :
1954 1 : status = libspdm_append_message_m(spdm_context, session_info,
1955 : &m_libspdm_get_measurements_request5,
1956 : m_libspdm_get_measurements_request5_size);
1957 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1958 :
1959 1 : status = libspdm_append_message_m(spdm_context, session_info, spdm_response,
1960 : response_size - signature_size);
1961 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1962 :
1963 1 : result = libspdm_verify_measurement_signature(
1964 : spdm_context, session_info, 0, signature, signature_size);
1965 1 : assert_false(result);
1966 :
1967 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1968 : assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
1969 : #endif
1970 1 : }
1971 :
1972 : /**
1973 : * Test 30: Based of Test Case 7 Successful response to get a number of measurements
1974 : * with signature.
1975 : * Signature test with signing in big endian but verification in little endian.
1976 : *
1977 : * Expected Behavior: Failing signature verification
1978 : **/
1979 1 : static void rsp_measurements_case30(void** state)
1980 : {
1981 : libspdm_return_t status;
1982 : libspdm_test_context_t* spdm_test_context;
1983 : libspdm_context_t* spdm_context;
1984 : size_t response_size;
1985 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
1986 : spdm_measurements_response_t* spdm_response;
1987 : size_t measurment_sig_size;
1988 :
1989 : bool result;
1990 : uint32_t measurement_record_data_length;
1991 : uint8_t* measurement_record_data;
1992 : uint8_t* ptr;
1993 : uint16_t opaque_length;
1994 : void* signature;
1995 : size_t signature_size;
1996 : libspdm_session_info_t* session_info;
1997 : void* data;
1998 : size_t data_size;
1999 : void* hash;
2000 : size_t hash_size;
2001 :
2002 1 : spdm_test_context = *state;
2003 1 : spdm_context = spdm_test_context->spdm_context;
2004 1 : spdm_test_context->case_id = 30;
2005 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
2006 : SPDM_VERSION_NUMBER_SHIFT_BIT;
2007 1 : spdm_context->connection_info.connection_state =
2008 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
2009 1 : spdm_context->local_context.capability.flags |=
2010 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
2011 1 : spdm_context->connection_info.algorithm.base_hash_algo =
2012 : m_libspdm_use_hash_algo;
2013 1 : spdm_context->connection_info.algorithm.base_asym_algo =
2014 : m_libspdm_use_asym_algo;
2015 1 : spdm_context->connection_info.algorithm.measurement_spec =
2016 : m_libspdm_use_measurement_spec;
2017 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
2018 : m_libspdm_use_measurement_hash_algo;
2019 1 : spdm_context->spdm_10_11_verify_signature_endian =
2020 : LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_ONLY;
2021 :
2022 1 : libspdm_reset_message_m(spdm_context, NULL);
2023 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
2024 1 : measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
2025 1 : libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
2026 :
2027 1 : response_size = sizeof(response);
2028 1 : libspdm_get_random_number(SPDM_NONCE_SIZE,
2029 : m_libspdm_get_measurements_request5.nonce);
2030 1 : status = libspdm_get_response_measurements(
2031 : spdm_context, m_libspdm_get_measurements_request5_size,
2032 : &m_libspdm_get_measurements_request5, &response_size, response);
2033 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
2034 1 : assert_int_equal(response_size, sizeof(spdm_measurements_response_t) +
2035 : measurment_sig_size);
2036 1 : spdm_response = (void*)response;
2037 1 : assert_int_equal(spdm_response->header.request_response_code,
2038 : SPDM_MEASUREMENTS);
2039 1 : assert_int_equal(spdm_response->header.param1,
2040 : LIBSPDM_MEASUREMENT_BLOCK_NUMBER);
2041 :
2042 1 : libspdm_read_responder_public_certificate_chain(
2043 : m_libspdm_use_hash_algo, m_libspdm_use_asym_algo,
2044 : &data, &data_size,
2045 : &hash, &hash_size);
2046 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
2047 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
2048 : data_size;
2049 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
2050 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
2051 : data, data_size);
2052 : #else
2053 1 : libspdm_hash_all(
2054 : spdm_context->connection_info.algorithm.base_hash_algo,
2055 : data, data_size,
2056 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
2057 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
2058 1 : libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
2059 1 : libspdm_get_leaf_cert_public_key_from_cert_chain(
2060 : spdm_context->connection_info.algorithm.base_hash_algo,
2061 : spdm_context->connection_info.algorithm.base_asym_algo,
2062 : data, data_size,
2063 : &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
2064 : #endif
2065 :
2066 1 : measurement_record_data_length = libspdm_read_uint24(spdm_response->measurement_record_length);
2067 1 : measurement_record_data = (void*)(spdm_response + 1);
2068 1 : ptr = measurement_record_data + measurement_record_data_length;
2069 1 : ptr += SPDM_NONCE_SIZE;
2070 1 : opaque_length = libspdm_read_uint16((const uint8_t*)ptr);
2071 1 : ptr += sizeof(uint16_t);
2072 1 : ptr += opaque_length;
2073 1 : signature = ptr;
2074 1 : signature_size = libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
2075 1 : session_info = NULL;
2076 :
2077 1 : status = libspdm_append_message_m(
2078 : spdm_context, session_info,
2079 : &m_libspdm_get_measurements_request5,
2080 : m_libspdm_get_measurements_request5_size);
2081 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
2082 :
2083 1 : status = libspdm_append_message_m(
2084 : spdm_context, session_info, spdm_response,
2085 : response_size - signature_size);
2086 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
2087 :
2088 1 : result = libspdm_verify_measurement_signature(
2089 : spdm_context, session_info, 0, signature, signature_size);
2090 1 : assert_true(result);
2091 :
2092 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
2093 : assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
2094 : #endif
2095 1 : }
2096 :
2097 : /**
2098 : * Test 31: Based of Test Case 7 Successful response to get a number of measurements
2099 : * with signature.
2100 : * Signature test with signing in big endian but verification in big or little endian.
2101 : *
2102 : * Expected Behavior: Passing signature verification
2103 : **/
2104 1 : static void rsp_measurements_case31(void** state)
2105 : {
2106 : libspdm_return_t status;
2107 : libspdm_test_context_t* spdm_test_context;
2108 : libspdm_context_t* spdm_context;
2109 : size_t response_size;
2110 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
2111 : spdm_measurements_response_t* spdm_response;
2112 : size_t measurment_sig_size;
2113 :
2114 : bool result;
2115 : uint32_t measurement_record_data_length;
2116 : uint8_t* measurement_record_data;
2117 : uint8_t* ptr;
2118 : uint16_t opaque_length;
2119 : void* signature;
2120 : size_t signature_size;
2121 : libspdm_session_info_t* session_info;
2122 : void* data;
2123 : size_t data_size;
2124 : void* hash;
2125 : size_t hash_size;
2126 :
2127 1 : spdm_test_context = *state;
2128 1 : spdm_context = spdm_test_context->spdm_context;
2129 1 : spdm_test_context->case_id = 31;
2130 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
2131 : SPDM_VERSION_NUMBER_SHIFT_BIT;
2132 1 : spdm_context->connection_info.connection_state =
2133 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
2134 1 : spdm_context->local_context.capability.flags |=
2135 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
2136 1 : spdm_context->connection_info.algorithm.base_hash_algo =
2137 : m_libspdm_use_hash_algo;
2138 1 : spdm_context->connection_info.algorithm.base_asym_algo =
2139 : m_libspdm_use_asym_algo;
2140 1 : spdm_context->connection_info.algorithm.measurement_spec =
2141 : m_libspdm_use_measurement_spec;
2142 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
2143 : m_libspdm_use_measurement_hash_algo;
2144 1 : spdm_context->spdm_10_11_verify_signature_endian =
2145 : LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_OR_LITTLE;
2146 :
2147 1 : libspdm_reset_message_m(spdm_context, NULL);
2148 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
2149 1 : measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
2150 1 : libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
2151 :
2152 1 : response_size = sizeof(response);
2153 1 : libspdm_get_random_number(SPDM_NONCE_SIZE,
2154 : m_libspdm_get_measurements_request5.nonce);
2155 1 : status = libspdm_get_response_measurements(
2156 : spdm_context, m_libspdm_get_measurements_request5_size,
2157 : &m_libspdm_get_measurements_request5, &response_size, response);
2158 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
2159 1 : assert_int_equal(response_size, sizeof(spdm_measurements_response_t) +
2160 : measurment_sig_size);
2161 1 : spdm_response = (void*)response;
2162 1 : assert_int_equal(spdm_response->header.request_response_code,
2163 : SPDM_MEASUREMENTS);
2164 1 : assert_int_equal(spdm_response->header.param1,
2165 : LIBSPDM_MEASUREMENT_BLOCK_NUMBER);
2166 :
2167 1 : libspdm_read_responder_public_certificate_chain(
2168 : m_libspdm_use_hash_algo, m_libspdm_use_asym_algo,
2169 : &data, &data_size,
2170 : &hash, &hash_size);
2171 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
2172 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
2173 : data_size;
2174 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
2175 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
2176 : data, data_size);
2177 : #else
2178 1 : libspdm_hash_all(
2179 : spdm_context->connection_info.algorithm.base_hash_algo,
2180 : data, data_size,
2181 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
2182 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
2183 1 : libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
2184 1 : libspdm_get_leaf_cert_public_key_from_cert_chain(
2185 : spdm_context->connection_info.algorithm.base_hash_algo,
2186 : spdm_context->connection_info.algorithm.base_asym_algo,
2187 : data, data_size,
2188 : &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
2189 : #endif
2190 :
2191 1 : measurement_record_data_length = libspdm_read_uint24(spdm_response->measurement_record_length);
2192 1 : measurement_record_data = (void*)(spdm_response + 1);
2193 1 : ptr = measurement_record_data + measurement_record_data_length;
2194 1 : ptr += SPDM_NONCE_SIZE;
2195 1 : opaque_length = libspdm_read_uint16((const uint8_t*)ptr);
2196 1 : ptr += sizeof(uint16_t);
2197 1 : ptr += opaque_length;
2198 1 : signature = ptr;
2199 1 : signature_size = libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
2200 1 : session_info = NULL;
2201 :
2202 1 : status = libspdm_append_message_m(
2203 : spdm_context, session_info,
2204 : &m_libspdm_get_measurements_request5,
2205 : m_libspdm_get_measurements_request5_size);
2206 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
2207 :
2208 1 : status = libspdm_append_message_m(
2209 : spdm_context, session_info, spdm_response,
2210 : response_size - signature_size);
2211 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
2212 :
2213 1 : result = libspdm_verify_measurement_signature(
2214 : spdm_context, session_info, 0, signature, signature_size);
2215 1 : assert_true(result);
2216 :
2217 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
2218 : assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
2219 : #endif
2220 1 : }
2221 :
2222 : /**
2223 : * Test 32: Based of Test Case 7 Successful response to get a number of measurements
2224 : * with signature.
2225 : * Signature test with signing in little endian but verification in little endian.
2226 : *
2227 : * Expected Behavior: Failing signature verification
2228 : **/
2229 1 : static void rsp_measurements_case32(void** state)
2230 : {
2231 : libspdm_return_t status;
2232 : libspdm_test_context_t* spdm_test_context;
2233 : libspdm_context_t* spdm_context;
2234 : size_t response_size;
2235 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
2236 : spdm_measurements_response_t* spdm_response;
2237 : size_t measurment_sig_size;
2238 :
2239 : bool result;
2240 : uint32_t measurement_record_data_length;
2241 : uint8_t* measurement_record_data;
2242 : uint8_t* ptr;
2243 : uint16_t opaque_length;
2244 : void* signature;
2245 : size_t signature_size;
2246 : libspdm_session_info_t* session_info;
2247 : void* data;
2248 : size_t data_size;
2249 : void* hash;
2250 : size_t hash_size;
2251 :
2252 1 : spdm_test_context = *state;
2253 1 : spdm_context = spdm_test_context->spdm_context;
2254 1 : spdm_test_context->case_id = 32;
2255 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
2256 : SPDM_VERSION_NUMBER_SHIFT_BIT;
2257 1 : spdm_context->connection_info.connection_state =
2258 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
2259 1 : spdm_context->local_context.capability.flags |=
2260 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
2261 1 : spdm_context->connection_info.algorithm.base_hash_algo =
2262 : m_libspdm_use_hash_algo;
2263 1 : spdm_context->connection_info.algorithm.base_asym_algo =
2264 : m_libspdm_use_asym_algo;
2265 1 : spdm_context->connection_info.algorithm.measurement_spec =
2266 : m_libspdm_use_measurement_spec;
2267 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
2268 : m_libspdm_use_measurement_hash_algo;
2269 1 : spdm_context->spdm_10_11_verify_signature_endian =
2270 : LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_LITTLE_ONLY;
2271 :
2272 1 : libspdm_reset_message_m(spdm_context, NULL);
2273 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
2274 1 : measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
2275 1 : libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
2276 :
2277 1 : response_size = sizeof(response);
2278 1 : libspdm_get_random_number(SPDM_NONCE_SIZE,
2279 : m_libspdm_get_measurements_request5.nonce);
2280 1 : status = libspdm_get_response_measurements(
2281 : spdm_context, m_libspdm_get_measurements_request5_size,
2282 : &m_libspdm_get_measurements_request5, &response_size, response);
2283 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
2284 1 : assert_int_equal(response_size, sizeof(spdm_measurements_response_t) +
2285 : measurment_sig_size);
2286 1 : spdm_response = (void*)response;
2287 1 : assert_int_equal(spdm_response->header.request_response_code,
2288 : SPDM_MEASUREMENTS);
2289 1 : assert_int_equal(spdm_response->header.param1,
2290 : LIBSPDM_MEASUREMENT_BLOCK_NUMBER);
2291 :
2292 1 : libspdm_read_responder_public_certificate_chain(
2293 : m_libspdm_use_hash_algo, m_libspdm_use_asym_algo,
2294 : &data, &data_size,
2295 : &hash, &hash_size);
2296 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
2297 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
2298 : data_size;
2299 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
2300 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
2301 : data, data_size);
2302 : #else
2303 1 : libspdm_hash_all(
2304 : spdm_context->connection_info.algorithm.base_hash_algo,
2305 : data, data_size,
2306 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
2307 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
2308 1 : libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
2309 1 : libspdm_get_leaf_cert_public_key_from_cert_chain(
2310 : spdm_context->connection_info.algorithm.base_hash_algo,
2311 : spdm_context->connection_info.algorithm.base_asym_algo,
2312 : data, data_size,
2313 : &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
2314 : #endif
2315 :
2316 1 : measurement_record_data_length = libspdm_read_uint24(spdm_response->measurement_record_length);
2317 1 : measurement_record_data = (void*)(spdm_response + 1);
2318 1 : ptr = measurement_record_data + measurement_record_data_length;
2319 1 : ptr += SPDM_NONCE_SIZE;
2320 1 : opaque_length = libspdm_read_uint16((const uint8_t*)ptr);
2321 1 : ptr += sizeof(uint16_t);
2322 1 : ptr += opaque_length;
2323 1 : signature = ptr;
2324 1 : signature_size = libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
2325 :
2326 1 : libspdm_copy_signature_swap_endian(
2327 : m_libspdm_use_asym_algo,
2328 : signature, signature_size, signature, signature_size);
2329 :
2330 1 : session_info = NULL;
2331 :
2332 1 : status = libspdm_append_message_m(
2333 : spdm_context, session_info,
2334 : &m_libspdm_get_measurements_request5,
2335 : m_libspdm_get_measurements_request5_size);
2336 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
2337 :
2338 1 : status = libspdm_append_message_m(
2339 : spdm_context, session_info, spdm_response,
2340 : response_size - signature_size);
2341 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
2342 :
2343 1 : result = libspdm_verify_measurement_signature(
2344 : spdm_context, session_info, 0, signature, signature_size);
2345 1 : assert_true(result);
2346 :
2347 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
2348 : assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
2349 : #endif
2350 1 : }
2351 :
2352 : /**
2353 : * Test 33: Based of Test Case 7 Successful response to get a number of measurements
2354 : * with signature.
2355 : * Signature test with signing in little endian but verification in big endian.
2356 : *
2357 : * Expected Behavior: Failing signature verification
2358 : **/
2359 1 : static void rsp_measurements_case33(void** state)
2360 : {
2361 : libspdm_return_t status;
2362 : libspdm_test_context_t* spdm_test_context;
2363 : libspdm_context_t* spdm_context;
2364 : size_t response_size;
2365 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
2366 : spdm_measurements_response_t* spdm_response;
2367 : size_t measurment_sig_size;
2368 :
2369 : bool result;
2370 : uint32_t measurement_record_data_length;
2371 : uint8_t* measurement_record_data;
2372 : uint8_t* ptr;
2373 : uint16_t opaque_length;
2374 : void* signature;
2375 : size_t signature_size;
2376 : libspdm_session_info_t* session_info;
2377 : void* data;
2378 : size_t data_size;
2379 : void* hash;
2380 : size_t hash_size;
2381 :
2382 1 : spdm_test_context = *state;
2383 1 : spdm_context = spdm_test_context->spdm_context;
2384 1 : spdm_test_context->case_id = 33;
2385 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
2386 : SPDM_VERSION_NUMBER_SHIFT_BIT;
2387 1 : spdm_context->connection_info.connection_state =
2388 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
2389 1 : spdm_context->local_context.capability.flags |=
2390 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
2391 1 : spdm_context->connection_info.algorithm.base_hash_algo =
2392 : m_libspdm_use_hash_algo;
2393 1 : spdm_context->connection_info.algorithm.base_asym_algo =
2394 : m_libspdm_use_asym_algo;
2395 1 : spdm_context->connection_info.algorithm.measurement_spec =
2396 : m_libspdm_use_measurement_spec;
2397 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
2398 : m_libspdm_use_measurement_hash_algo;
2399 1 : spdm_context->spdm_10_11_verify_signature_endian =
2400 : LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_ONLY;
2401 :
2402 1 : libspdm_reset_message_m(spdm_context, NULL);
2403 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
2404 1 : measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
2405 1 : libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
2406 :
2407 1 : response_size = sizeof(response);
2408 1 : libspdm_get_random_number(SPDM_NONCE_SIZE,
2409 : m_libspdm_get_measurements_request5.nonce);
2410 1 : status = libspdm_get_response_measurements(
2411 : spdm_context, m_libspdm_get_measurements_request5_size,
2412 : &m_libspdm_get_measurements_request5, &response_size, response);
2413 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
2414 1 : assert_int_equal(response_size, sizeof(spdm_measurements_response_t) +
2415 : measurment_sig_size);
2416 1 : spdm_response = (void*)response;
2417 1 : assert_int_equal(spdm_response->header.request_response_code,
2418 : SPDM_MEASUREMENTS);
2419 1 : assert_int_equal(spdm_response->header.param1,
2420 : LIBSPDM_MEASUREMENT_BLOCK_NUMBER);
2421 :
2422 1 : libspdm_read_responder_public_certificate_chain(
2423 : m_libspdm_use_hash_algo, m_libspdm_use_asym_algo,
2424 : &data, &data_size,
2425 : &hash, &hash_size);
2426 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
2427 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
2428 : data_size;
2429 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
2430 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
2431 : data, data_size);
2432 : #else
2433 1 : libspdm_hash_all(
2434 : spdm_context->connection_info.algorithm.base_hash_algo,
2435 : data, data_size,
2436 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
2437 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
2438 1 : libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
2439 1 : libspdm_get_leaf_cert_public_key_from_cert_chain(
2440 : spdm_context->connection_info.algorithm.base_hash_algo,
2441 : spdm_context->connection_info.algorithm.base_asym_algo,
2442 : data, data_size,
2443 : &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
2444 : #endif
2445 :
2446 1 : measurement_record_data_length = libspdm_read_uint24(spdm_response->measurement_record_length);
2447 1 : measurement_record_data = (void*)(spdm_response + 1);
2448 1 : ptr = measurement_record_data + measurement_record_data_length;
2449 1 : ptr += SPDM_NONCE_SIZE;
2450 1 : opaque_length = libspdm_read_uint16((const uint8_t*)ptr);
2451 1 : ptr += sizeof(uint16_t);
2452 1 : ptr += opaque_length;
2453 1 : signature = ptr;
2454 1 : signature_size = libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
2455 :
2456 1 : libspdm_copy_signature_swap_endian(
2457 : m_libspdm_use_asym_algo,
2458 : signature, signature_size, signature, signature_size);
2459 :
2460 1 : session_info = NULL;
2461 :
2462 1 : status = libspdm_append_message_m(
2463 : spdm_context, session_info,
2464 : &m_libspdm_get_measurements_request5,
2465 : m_libspdm_get_measurements_request5_size);
2466 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
2467 :
2468 1 : status = libspdm_append_message_m(
2469 : spdm_context, session_info, spdm_response,
2470 : response_size - signature_size);
2471 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
2472 :
2473 1 : result = libspdm_verify_measurement_signature(
2474 : spdm_context, session_info, 0, signature, signature_size);
2475 1 : assert_false(result);
2476 :
2477 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
2478 : assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
2479 : #endif
2480 1 : }
2481 :
2482 :
2483 : /**
2484 : * Test 34: Based of Test Case 7 Successful response to get a number of measurements
2485 : * with signature.
2486 : * Signature test with signing in little endian but verification in big or little endian.
2487 : *
2488 : * Expected Behavior: Passing signature verification
2489 : **/
2490 1 : static void rsp_measurements_case34(void** state)
2491 : {
2492 : libspdm_return_t status;
2493 : libspdm_test_context_t* spdm_test_context;
2494 : libspdm_context_t* spdm_context;
2495 : size_t response_size;
2496 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
2497 : spdm_measurements_response_t* spdm_response;
2498 : size_t measurment_sig_size;
2499 :
2500 : bool result;
2501 : uint32_t measurement_record_data_length;
2502 : uint8_t* measurement_record_data;
2503 : uint8_t* ptr;
2504 : uint16_t opaque_length;
2505 : void* signature;
2506 : size_t signature_size;
2507 : libspdm_session_info_t* session_info;
2508 : void* data;
2509 : size_t data_size;
2510 : void* hash;
2511 : size_t hash_size;
2512 :
2513 1 : spdm_test_context = *state;
2514 1 : spdm_context = spdm_test_context->spdm_context;
2515 1 : spdm_test_context->case_id = 34;
2516 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
2517 : SPDM_VERSION_NUMBER_SHIFT_BIT;
2518 1 : spdm_context->connection_info.connection_state =
2519 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
2520 1 : spdm_context->local_context.capability.flags |=
2521 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
2522 1 : spdm_context->connection_info.algorithm.base_hash_algo =
2523 : m_libspdm_use_hash_algo;
2524 1 : spdm_context->connection_info.algorithm.base_asym_algo =
2525 : m_libspdm_use_asym_algo;
2526 1 : spdm_context->connection_info.algorithm.measurement_spec =
2527 : m_libspdm_use_measurement_spec;
2528 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
2529 : m_libspdm_use_measurement_hash_algo;
2530 1 : spdm_context->spdm_10_11_verify_signature_endian =
2531 : LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_OR_LITTLE;
2532 :
2533 1 : libspdm_reset_message_m(spdm_context, NULL);
2534 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
2535 1 : measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
2536 1 : libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
2537 :
2538 1 : response_size = sizeof(response);
2539 1 : libspdm_get_random_number(SPDM_NONCE_SIZE,
2540 : m_libspdm_get_measurements_request5.nonce);
2541 1 : status = libspdm_get_response_measurements(
2542 : spdm_context, m_libspdm_get_measurements_request5_size,
2543 : &m_libspdm_get_measurements_request5, &response_size, response);
2544 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
2545 1 : assert_int_equal(response_size, sizeof(spdm_measurements_response_t) +
2546 : measurment_sig_size);
2547 1 : spdm_response = (void*)response;
2548 1 : assert_int_equal(spdm_response->header.request_response_code,
2549 : SPDM_MEASUREMENTS);
2550 1 : assert_int_equal(spdm_response->header.param1,
2551 : LIBSPDM_MEASUREMENT_BLOCK_NUMBER);
2552 :
2553 1 : libspdm_read_responder_public_certificate_chain(
2554 : m_libspdm_use_hash_algo, m_libspdm_use_asym_algo,
2555 : &data, &data_size,
2556 : &hash, &hash_size);
2557 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
2558 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
2559 : data_size;
2560 : libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
2561 : sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
2562 : data, data_size);
2563 : #else
2564 1 : libspdm_hash_all(
2565 : spdm_context->connection_info.algorithm.base_hash_algo,
2566 : data, data_size,
2567 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
2568 1 : spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
2569 1 : libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
2570 1 : libspdm_get_leaf_cert_public_key_from_cert_chain(
2571 : spdm_context->connection_info.algorithm.base_hash_algo,
2572 : spdm_context->connection_info.algorithm.base_asym_algo,
2573 : data, data_size,
2574 : &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
2575 : #endif
2576 :
2577 1 : measurement_record_data_length = libspdm_read_uint24(spdm_response->measurement_record_length);
2578 1 : measurement_record_data = (void*)(spdm_response + 1);
2579 1 : ptr = measurement_record_data + measurement_record_data_length;
2580 1 : ptr += SPDM_NONCE_SIZE;
2581 1 : opaque_length = libspdm_read_uint16((const uint8_t*)ptr);
2582 1 : ptr += sizeof(uint16_t);
2583 1 : ptr += opaque_length;
2584 1 : signature = ptr;
2585 1 : signature_size = libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
2586 1 : libspdm_copy_signature_swap_endian(
2587 : m_libspdm_use_asym_algo,
2588 : signature, signature_size, signature, signature_size);
2589 :
2590 1 : session_info = NULL;
2591 :
2592 1 : status = libspdm_append_message_m(
2593 : spdm_context, session_info,
2594 : &m_libspdm_get_measurements_request5,
2595 : m_libspdm_get_measurements_request5_size);
2596 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
2597 :
2598 1 : status = libspdm_append_message_m(
2599 : spdm_context, session_info, spdm_response,
2600 : response_size - signature_size);
2601 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
2602 :
2603 1 : result = libspdm_verify_measurement_signature(
2604 : spdm_context, session_info, 0, signature, signature_size);
2605 1 : assert_true(result);
2606 :
2607 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
2608 : assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
2609 : #endif
2610 1 : }
2611 :
2612 : /**
2613 : * Test 35: Successful response V1.3 to get a number of measurements without signature
2614 : * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code, correct context field
2615 : **/
2616 1 : static void rsp_measurements_case35(void **state)
2617 : {
2618 : libspdm_return_t status;
2619 : libspdm_test_context_t *spdm_test_context;
2620 : libspdm_context_t *spdm_context;
2621 : size_t response_size;
2622 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
2623 : spdm_measurements_response_t *spdm_response;
2624 : uint8_t *requester_context;
2625 : uint8_t *responder_context;
2626 :
2627 1 : spdm_test_context = *state;
2628 1 : spdm_context = spdm_test_context->spdm_context;
2629 1 : spdm_test_context->case_id = 35;
2630 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
2631 : SPDM_VERSION_NUMBER_SHIFT_BIT;
2632 1 : spdm_context->connection_info.connection_state =
2633 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
2634 1 : spdm_context->local_context.capability.flags |=
2635 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
2636 1 : spdm_context->connection_info.algorithm.base_hash_algo =
2637 : m_libspdm_use_hash_algo;
2638 1 : spdm_context->connection_info.algorithm.base_asym_algo =
2639 : m_libspdm_use_asym_algo;
2640 1 : spdm_context->connection_info.algorithm.measurement_spec =
2641 : m_libspdm_use_measurement_spec;
2642 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
2643 : m_libspdm_use_measurement_hash_algo;
2644 1 : libspdm_reset_message_m(spdm_context, NULL);
2645 :
2646 1 : libspdm_secret_lib_meas_opaque_data_size = 0;
2647 :
2648 1 : response_size = sizeof(response);
2649 :
2650 1 : requester_context = ((uint8_t *)&m_libspdm_get_measurements_request17) +
2651 : m_libspdm_get_measurements_request17_size;
2652 1 : libspdm_set_mem(requester_context, SPDM_REQ_CONTEXT_SIZE, 0xAA);
2653 1 : m_libspdm_get_measurements_request17_size += SPDM_REQ_CONTEXT_SIZE;
2654 :
2655 1 : status = libspdm_get_response_measurements(
2656 : spdm_context, m_libspdm_get_measurements_request17_size,
2657 : &m_libspdm_get_measurements_request17, &response_size, response);
2658 :
2659 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
2660 1 : assert_int_equal(response_size,
2661 : sizeof(spdm_measurements_response_t) + SPDM_NONCE_SIZE + sizeof(uint16_t) +
2662 : SPDM_REQ_CONTEXT_SIZE);
2663 1 : spdm_response = (void *)response;
2664 1 : assert_int_equal(spdm_response->header.request_response_code,
2665 : SPDM_MEASUREMENTS);
2666 1 : responder_context = (void *)response;
2667 1 : responder_context += sizeof(spdm_measurements_response_t) + SPDM_NONCE_SIZE + sizeof(uint16_t);
2668 1 : assert_memory_equal((void *)requester_context, responder_context, SPDM_REQ_CONTEXT_SIZE);
2669 : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
2670 : assert_int_equal(spdm_context->transcript.message_m.buffer_size,
2671 : m_libspdm_get_measurements_request17_size +
2672 : sizeof(spdm_measurements_response_t) +
2673 : SPDM_NONCE_SIZE +
2674 : sizeof(uint16_t) +
2675 : SPDM_REQ_CONTEXT_SIZE);
2676 : #endif
2677 1 : }
2678 :
2679 : /**
2680 : * Test 36: The key usage bit mask is not set, the SlotID fields in GET_MEASUREMENTS and MEASUREMENTS shall not specify this certificate slot
2681 : * Expected Behavior: get a SPDM_ERROR_CODE_INVALID_REQUEST return code
2682 : **/
2683 1 : static void rsp_measurements_case36(void **state)
2684 : {
2685 : libspdm_return_t status;
2686 : libspdm_test_context_t *spdm_test_context;
2687 : libspdm_context_t *spdm_context;
2688 : size_t response_size;
2689 : uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
2690 : uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
2691 : spdm_get_measurements_request_t *spdm_request;
2692 : spdm_measurements_response_t *spdm_response;
2693 : uint8_t *requester_context;
2694 : uint8_t slot_id;
2695 : void *data;
2696 : size_t data_size;
2697 : size_t request_size;
2698 :
2699 1 : spdm_test_context = *state;
2700 1 : spdm_context = spdm_test_context->spdm_context;
2701 1 : spdm_test_context->case_id = 36;
2702 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
2703 : SPDM_VERSION_NUMBER_SHIFT_BIT;
2704 1 : spdm_context->connection_info.connection_state =
2705 : LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
2706 1 : spdm_context->local_context.capability.flags |=
2707 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
2708 1 : spdm_context->local_context.capability.flags |=
2709 : SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PUB_KEY_ID_CAP;
2710 1 : spdm_context->connection_info.algorithm.base_hash_algo =
2711 : m_libspdm_use_hash_algo;
2712 1 : spdm_context->connection_info.algorithm.base_asym_algo =
2713 : m_libspdm_use_asym_algo;
2714 1 : spdm_context->connection_info.algorithm.measurement_hash_algo =
2715 : m_libspdm_use_measurement_hash_algo;
2716 1 : spdm_context->connection_info.algorithm.base_hash_algo =
2717 : m_libspdm_use_hash_algo;
2718 1 : spdm_context->connection_info.algorithm.measurement_spec =
2719 : m_libspdm_use_measurement_spec;
2720 1 : spdm_context->connection_info.multi_key_conn_rsp = true;
2721 1 : libspdm_reset_message_m(spdm_context, NULL);
2722 :
2723 1 : libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
2724 : m_libspdm_use_asym_algo, &data,
2725 : &data_size, NULL, NULL);
2726 9 : for (int i = 0; i < SPDM_MAX_SLOT_COUNT; i++) {
2727 8 : spdm_context->local_context.local_cert_chain_provision_size[i] = data_size;
2728 8 : spdm_context->local_context.local_cert_chain_provision[i] = data;
2729 : }
2730 :
2731 1 : spdm_request = (void *)request;
2732 1 : spdm_request->header.spdm_version = SPDM_MESSAGE_VERSION_13;
2733 1 : spdm_request->header.request_response_code = SPDM_GET_MEASUREMENTS;
2734 1 : spdm_request->header.param1 = SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE;
2735 1 : spdm_request->header.param2 = 1;
2736 1 : libspdm_get_random_number(SPDM_NONCE_SIZE, spdm_request->nonce);
2737 : /* If set, the SlotID fields in GET_MEASUREMENTS and MEASUREMENTS can specify this certificate slot. If not set,
2738 : * the SlotID fields in GET_MEASUREMENTS and MEASUREMENTS shall not specify this certificate slot. */
2739 1 : slot_id = 0;
2740 1 : spdm_request->slot_id_param = slot_id;
2741 1 : spdm_context->local_context.local_key_usage_bit_mask[slot_id] =
2742 : SPDM_KEY_USAGE_BIT_MASK_KEY_EX_USE |
2743 : SPDM_KEY_USAGE_BIT_MASK_CHALLENGE_USE;
2744 1 : requester_context = ((uint8_t *)spdm_request) + sizeof(spdm_get_measurements_request_t);
2745 1 : libspdm_set_mem(requester_context, SPDM_REQ_CONTEXT_SIZE, 0xAA);
2746 1 : request_size = sizeof(spdm_get_measurements_request_t) + SPDM_REQ_CONTEXT_SIZE;
2747 :
2748 1 : response_size = sizeof(response);
2749 1 : status = libspdm_get_response_measurements(
2750 : spdm_context, request_size,
2751 : (void *)spdm_request, &response_size, response);
2752 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
2753 1 : assert_int_equal(response_size, sizeof(spdm_error_response_t));
2754 1 : spdm_response = (void *)response;
2755 1 : assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
2756 1 : assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
2757 1 : assert_int_equal(spdm_response->header.param2, 0);
2758 1 : }
2759 :
2760 1 : int libspdm_rsp_measurements_test(void)
2761 : {
2762 1 : m_libspdm_get_measurements_request11.slot_id_param = SPDM_MAX_SLOT_COUNT - 1;
2763 1 : m_libspdm_get_measurements_request12.slot_id_param = SPDM_MAX_SLOT_COUNT + 1;
2764 :
2765 1 : const struct CMUnitTest test_cases[] = {
2766 : /* Success Case to get measurement number without signature*/
2767 : cmocka_unit_test(rsp_measurements_case1),
2768 : /* Can be populated with new test.*/
2769 : cmocka_unit_test(rsp_measurements_case2),
2770 : /* response_state: SPDM_RESPONSE_STATE_BUSY*/
2771 : cmocka_unit_test(rsp_measurements_case3),
2772 : /* response_state: SPDM_RESPONSE_STATE_NEED_RESYNC*/
2773 : cmocka_unit_test(rsp_measurements_case4),
2774 : #if LIBSPDM_RESPOND_IF_READY_SUPPORT
2775 : /* response_state: SPDM_RESPONSE_STATE_NOT_READY*/
2776 : cmocka_unit_test(rsp_measurements_case5),
2777 : #endif /* LIBSPDM_RESPOND_IF_READY_SUPPORT */
2778 : /* connection_state Check*/
2779 : cmocka_unit_test(rsp_measurements_case6),
2780 : /* Success Case to get measurement number with signature*/
2781 : cmocka_unit_test(rsp_measurements_case7),
2782 : /* Success Case to get one measurement with signature*/
2783 : cmocka_unit_test(rsp_measurements_case8),
2784 : /* Bad request size to get one measurement with signature*/
2785 : cmocka_unit_test(rsp_measurements_case9),
2786 : /* Success Case to get one measurement without signature*/
2787 : cmocka_unit_test(rsp_measurements_case10),
2788 : /* Success Case to get all measurements with signature*/
2789 : cmocka_unit_test(rsp_measurements_case11),
2790 : /* Success Case to get all measurements without signature*/
2791 : cmocka_unit_test(rsp_measurements_case12),
2792 : /* Can be populated with new test.*/
2793 : cmocka_unit_test(rsp_measurements_case13),
2794 : /* Error Case: sig required, but no nonce and/or SlotID*/
2795 : cmocka_unit_test(rsp_measurements_case14),
2796 : /* Error Case: sig required, but meas_cap = 01b (including nonce and SlotId on request)*/
2797 : cmocka_unit_test(rsp_measurements_case15),
2798 : /* Error Case: sig required, but meas_cap = 01b (not including nonce and SlotId on request)*/
2799 : cmocka_unit_test(rsp_measurements_case16),
2800 : /* Error Case: meas_cap = 00b*/
2801 : cmocka_unit_test(rsp_measurements_case17),
2802 : /* Success Case: SlotId different from default*/
2803 : cmocka_unit_test(rsp_measurements_case18),
2804 : /* Bad SlotId parameter (>= SPDM_MAX_SLOT_COUNT)*/
2805 : cmocka_unit_test(rsp_measurements_case19),
2806 : /* Error Case: request a measurement out of bounds*/
2807 : cmocka_unit_test(rsp_measurements_case21),
2808 : /* Large number of requests before requiring a signature*/
2809 : cmocka_unit_test(rsp_measurements_case22),
2810 : /* Successful response to get a session based measurement with signature*/
2811 : cmocka_unit_test(rsp_measurements_case23),
2812 : /* Buffer verification */
2813 : cmocka_unit_test(rsp_measurements_case24),
2814 : /* Success Case V1.2 to get one measurement without signature*/
2815 : cmocka_unit_test(rsp_measurements_case25),
2816 : /* Successful response V1.2 to get one measurement with signature and without opqaue data*/
2817 : cmocka_unit_test(rsp_measurements_case26),
2818 : /* Successful response V1.2 to get one measurement with signature and with opqaue data*/
2819 : cmocka_unit_test(rsp_measurements_case27),
2820 : /* Success Case to get measurement with signature using slot_id 0xFF */
2821 : cmocka_unit_test(rsp_measurements_case28),
2822 : /* Error Case: Big Endian Signature. Little Endian Verify */
2823 : cmocka_unit_test(rsp_measurements_case29),
2824 : /* Success Case: Big Endian Signature. Big Endian Verify */
2825 : cmocka_unit_test(rsp_measurements_case30),
2826 : /* Success Case: Big Endian Signature. Big or Little Endian Verify */
2827 : cmocka_unit_test(rsp_measurements_case31),
2828 : /* Success Case: Little Endian Signature. Little Endian Verify */
2829 : cmocka_unit_test(rsp_measurements_case32),
2830 : /* Error Case: Little Endian Signature. Big Endian Verify */
2831 : cmocka_unit_test(rsp_measurements_case33),
2832 : /* Success Case: Little Endian Signature. Big or Little Endian Verify */
2833 : cmocka_unit_test(rsp_measurements_case34),
2834 : /* Success Case: V1.3 get a correct context field */
2835 : cmocka_unit_test(rsp_measurements_case35),
2836 : /* The key usage bit mask is not set, failed Case*/
2837 : cmocka_unit_test(rsp_measurements_case36),
2838 : };
2839 :
2840 1 : libspdm_test_context_t test_context = {
2841 : LIBSPDM_TEST_CONTEXT_VERSION,
2842 : false,
2843 : };
2844 :
2845 1 : libspdm_setup_test_context(&test_context);
2846 :
2847 1 : return cmocka_run_group_tests(test_cases,
2848 : libspdm_unit_test_group_setup,
2849 : libspdm_unit_test_group_teardown);
2850 : }
2851 :
2852 : #endif /* LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP*/
|