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