Skip to content

Commit bb52c78

Browse files
Xiaohanjllljyao1
Xiaohanjlll
authored andcommitted
Add unit test for SPDM 1.3 DIGEST to transcript in case of MULTI_KEY
Signed-off-by: Xiaohanjlll <[email protected]>
1 parent 1eb447d commit bb52c78

File tree

4 files changed

+391
-8
lines changed

4 files changed

+391
-8
lines changed

unit_test/test_spdm_requester/encap_digests.c

+114-8
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,22 @@ spdm_get_digest_request_t m_spdm_get_digests_request1 = {
1717
};
1818
size_t m_spdm_get_digests_request1_size = sizeof(m_spdm_get_digests_request1);
1919

20+
21+
spdm_get_digest_request_t m_spdm_get_digests_request2 = {
22+
{
23+
SPDM_MESSAGE_VERSION_13,
24+
SPDM_GET_DIGESTS,
25+
},
26+
};
27+
size_t m_spdm_get_digests_request2_size = sizeof(m_spdm_get_digests_request2);
28+
2029
static uint8_t m_local_certificate_chain[LIBSPDM_MAX_CERT_CHAIN_SIZE];
2130

2231
/**
2332
* Test 1: receives a valid GET_DIGESTS request message from Requester
2433
* Expected Behavior: produces a valid DIGESTS response message
2534
**/
26-
void test_spdm_requester_challenge_auth_case1(void **state)
35+
void test_spdm_requester_encap_get_digests_case1(void **state)
2736
{
2837
libspdm_return_t status;
2938
libspdm_test_context_t *spdm_test_context;
@@ -79,15 +88,15 @@ void test_spdm_requester_challenge_auth_case1(void **state)
7988
* Test 2:
8089
* Expected Behavior:
8190
**/
82-
void test_spdm_requester_challenge_auth_case2(void **state)
91+
void test_spdm_requester_encap_get_digests_case2(void **state)
8392
{
8493
}
8594

8695
/**
8796
* Test 3: receives a valid GET_DIGESTS request message from Requester, but the request message cannot be appended to the internal cache since the internal cache is full
8897
* Expected Behavior: produces an ERROR response message with error code = Unspecified
8998
**/
90-
void test_spdm_requester_challenge_auth_case3(void **state)
99+
void test_spdm_requester_encap_get_digests_case3(void **state)
91100
{
92101
libspdm_return_t status;
93102
libspdm_test_context_t *spdm_test_context;
@@ -145,7 +154,7 @@ void test_spdm_requester_challenge_auth_case3(void **state)
145154
* Test 4: receives a valid GET_DIGESTS request message from Requester, but the response message cannot be appended to the internal cache since the internal cache is full
146155
* Expected Behavior: produces an ERROR response message with error code = Unspecified
147156
**/
148-
void test_spdm_requester_challenge_auth_case4(void **state)
157+
void test_spdm_requester_encap_get_digests_case4(void **state)
149158
{
150159
libspdm_test_context_t *spdm_test_context;
151160
libspdm_context_t *spdm_context;
@@ -198,6 +207,101 @@ void test_spdm_requester_challenge_auth_case4(void **state)
198207
#endif
199208
}
200209

210+
/**
211+
* Test 5: receives a valid GET_DIGESTS request message from Requester ,
212+
* Set multi_key_conn_req to check if it responds correctly
213+
* Expected Behavior: produces a valid DIGESTS response message
214+
**/
215+
void test_spdm_requester_encap_get_digests_case5(void **state)
216+
{
217+
libspdm_return_t status;
218+
libspdm_test_context_t *spdm_test_context;
219+
libspdm_context_t *spdm_context;
220+
size_t response_size;
221+
uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
222+
spdm_digest_response_t *spdm_response;
223+
libspdm_session_info_t *session_info;
224+
uint32_t session_id;
225+
226+
spdm_test_context = *state;
227+
spdm_context = spdm_test_context->spdm_context;
228+
spdm_test_context->case_id = 0x5;
229+
spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13
230+
<< SPDM_VERSION_NUMBER_SHIFT_BIT;
231+
spdm_context->connection_info.connection_state =
232+
LIBSPDM_CONNECTION_STATE_NEGOTIATED;
233+
spdm_context->local_context.capability.flags |=
234+
SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
235+
spdm_context->connection_info.algorithm.base_hash_algo =
236+
m_libspdm_use_hash_algo;
237+
spdm_context->local_context.local_cert_chain_provision[0] =
238+
m_local_certificate_chain;
239+
spdm_context->local_context.local_cert_chain_provision_size[0] =
240+
sizeof(m_local_certificate_chain);
241+
libspdm_set_mem(m_local_certificate_chain, sizeof(m_local_certificate_chain),
242+
(uint8_t)(0xFF));
243+
244+
session_id = 0xFFFFFFFF;
245+
spdm_context->latest_session_id = session_id;
246+
spdm_context->last_spdm_request_session_id_valid = true;
247+
spdm_context->last_spdm_request_session_id = session_id;
248+
session_info = &spdm_context->session_info[0];
249+
libspdm_session_info_init(spdm_context, session_info, session_id, true);
250+
libspdm_secured_message_set_session_state(
251+
session_info->secured_message_context,
252+
LIBSPDM_SESSION_STATE_ESTABLISHED);
253+
254+
#if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
255+
spdm_context->transcript.message_m.buffer_size =
256+
spdm_context->transcript.message_m.max_buffer_size;
257+
#endif
258+
/* Sub Case 1: Set multi_key_conn_req to true*/
259+
spdm_context->connection_info.multi_key_conn_req = true;
260+
libspdm_reset_message_encap_d(spdm_context, session_info);
261+
262+
response_size = sizeof(response);
263+
status = libspdm_get_encap_response_digest(spdm_context,
264+
m_spdm_get_digests_request2_size,
265+
&m_spdm_get_digests_request2,
266+
&response_size, response);
267+
assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
268+
assert_int_equal(
269+
response_size,
270+
sizeof(spdm_digest_response_t) + sizeof(spdm_key_pair_id_t) +
271+
sizeof(spdm_certificate_info_t) +
272+
sizeof(spdm_key_usage_bit_mask_t) +
273+
libspdm_get_hash_size(spdm_context->connection_info
274+
.algorithm.base_hash_algo));
275+
spdm_response = (void *)response;
276+
assert_int_equal(spdm_response->header.request_response_code,
277+
SPDM_DIGESTS);
278+
assert_int_equal(session_info->session_transcript.message_encap_d.buffer_size,
279+
sizeof(spdm_digest_response_t) + sizeof(spdm_key_pair_id_t) +
280+
sizeof(spdm_certificate_info_t) +
281+
sizeof(spdm_key_usage_bit_mask_t) +
282+
libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo));
283+
284+
/* Sub Case 2: Set multi_key_conn_req to false*/
285+
spdm_context->connection_info.multi_key_conn_req = false;
286+
libspdm_reset_message_encap_d(spdm_context, session_info);
287+
288+
response_size = sizeof(response);
289+
status = libspdm_get_encap_response_digest(spdm_context,
290+
m_spdm_get_digests_request2_size,
291+
&m_spdm_get_digests_request2,
292+
&response_size, response);
293+
assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
294+
assert_int_equal(
295+
response_size,
296+
sizeof(spdm_digest_response_t) +
297+
libspdm_get_hash_size(spdm_context->connection_info
298+
.algorithm.base_hash_algo));
299+
spdm_response = (void *)response;
300+
assert_int_equal(spdm_response->header.request_response_code,
301+
SPDM_DIGESTS);
302+
assert_int_equal(session_info->session_transcript.message_encap_d.buffer_size, 0);
303+
}
304+
201305
libspdm_test_context_t m_spdm_requester_digests_test_context = {
202306
LIBSPDM_TEST_CONTEXT_VERSION,
203307
false,
@@ -207,13 +311,15 @@ int libspdm_requester_encap_digests_test_main(void)
207311
{
208312
const struct CMUnitTest spdm_requester_digests_tests[] = {
209313
/* Success Case*/
210-
cmocka_unit_test(test_spdm_requester_challenge_auth_case1),
314+
cmocka_unit_test(test_spdm_requester_encap_get_digests_case1),
211315
/* Can be populated with new test.*/
212-
cmocka_unit_test(test_spdm_requester_challenge_auth_case2),
316+
cmocka_unit_test(test_spdm_requester_encap_get_digests_case2),
213317
/* Internal cache full (request message)*/
214-
cmocka_unit_test(test_spdm_requester_challenge_auth_case3),
318+
cmocka_unit_test(test_spdm_requester_encap_get_digests_case3),
215319
/* Internal cache full (response message)*/
216-
cmocka_unit_test(test_spdm_requester_challenge_auth_case4),
320+
cmocka_unit_test(test_spdm_requester_encap_get_digests_case4),
321+
/* Set multi_key_conn_req to check if it responds correctly */
322+
cmocka_unit_test(test_spdm_requester_encap_get_digests_case5),
217323
};
218324

219325
libspdm_setup_test_context(&m_spdm_requester_digests_test_context);

unit_test/test_spdm_requester/get_digests.c

+94
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ static libspdm_return_t libspdm_requester_get_digests_test_send_message(
8484
case 0x18:
8585
return LIBSPDM_STATUS_SUCCESS;
8686
case 0x19:
87+
case 0x1A:
8788
return LIBSPDM_STATUS_SUCCESS;
8889
default:
8990
return LIBSPDM_STATUS_SEND_FAIL;
@@ -945,6 +946,43 @@ static libspdm_return_t libspdm_requester_get_digests_test_receive_message(
945946
}
946947
return LIBSPDM_STATUS_SUCCESS;
947948

949+
case 0x1A: {
950+
spdm_digest_response_t *spdm_response;
951+
uint8_t *digest;
952+
size_t spdm_response_size;
953+
size_t transport_header_size;
954+
955+
((libspdm_context_t *)spdm_context)
956+
->connection_info.algorithm.base_hash_algo =
957+
m_libspdm_use_hash_algo;
958+
spdm_response_size = sizeof(spdm_digest_response_t) +
959+
libspdm_get_hash_size(m_libspdm_use_hash_algo) * SPDM_MAX_SLOT_COUNT;
960+
transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
961+
spdm_response = (void *)((uint8_t *)*response + transport_header_size);
962+
963+
spdm_response->header.request_response_code = SPDM_DIGESTS;
964+
spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
965+
spdm_response->header.param1 = (0x01 << 0);
966+
spdm_response->header.param2 = 0;
967+
spdm_response->header.param2 |= (0x01 << 0);
968+
969+
libspdm_set_mem(m_libspdm_local_certificate_chain,
970+
sizeof(m_libspdm_local_certificate_chain),
971+
(uint8_t)(0xFF));
972+
973+
digest = (void *)(spdm_response + 1);
974+
libspdm_zero_mem (digest,
975+
libspdm_get_hash_size(m_libspdm_use_hash_algo) * SPDM_MAX_SLOT_COUNT);
976+
libspdm_hash_all(m_libspdm_use_hash_algo, m_libspdm_local_certificate_chain,
977+
sizeof(m_libspdm_local_certificate_chain), &digest[0]);
978+
979+
libspdm_transport_test_encode_message(spdm_context, NULL, false,
980+
false, spdm_response_size,
981+
spdm_response, response_size,
982+
response);
983+
}
984+
return LIBSPDM_STATUS_SUCCESS;
985+
948986
default:
949987
return LIBSPDM_STATUS_RECEIVE_FAIL;
950988
}
@@ -1484,6 +1522,61 @@ static void libspdm_test_requester_get_digests_case25(void **state)
14841522
#endif
14851523
}
14861524

1525+
1526+
/**
1527+
* Test 26: a response message is successfully sent ,
1528+
* Set multi_key_conn_rsp to check if it responds correctly
1529+
* Expected Behavior: requester returns the status LIBSPDM_STATUS_SUCCESS
1530+
**/
1531+
static void libspdm_test_requester_get_digests_case26(void **state)
1532+
{
1533+
libspdm_return_t status;
1534+
libspdm_test_context_t *spdm_test_context;
1535+
libspdm_context_t *spdm_context;
1536+
uint8_t slot_mask;
1537+
uint8_t total_digest_buffer[LIBSPDM_MAX_HASH_SIZE * SPDM_MAX_SLOT_COUNT];
1538+
1539+
spdm_test_context = *state;
1540+
spdm_context = spdm_test_context->spdm_context;
1541+
spdm_test_context->case_id = 0x1A;
1542+
spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
1543+
SPDM_VERSION_NUMBER_SHIFT_BIT;
1544+
spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1545+
spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
1546+
spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
1547+
libspdm_set_mem(m_libspdm_local_certificate_chain,
1548+
sizeof(m_libspdm_local_certificate_chain),
1549+
(uint8_t)(0xFF));
1550+
libspdm_reset_message_b(spdm_context);
1551+
1552+
#if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
1553+
spdm_context->transcript.message_m.buffer_size =
1554+
spdm_context->transcript.message_m.max_buffer_size;
1555+
#endif
1556+
/* Sub Case 1: Set multi_key_conn_rsp to true*/
1557+
spdm_context->connection_info.multi_key_conn_rsp = true;
1558+
libspdm_reset_message_d(spdm_context);
1559+
1560+
libspdm_zero_mem(total_digest_buffer, sizeof(total_digest_buffer));
1561+
status = libspdm_get_digest(spdm_context, NULL, &slot_mask, &total_digest_buffer);
1562+
assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1563+
assert_int_equal(
1564+
spdm_context->transcript.message_d.buffer_size,
1565+
sizeof(spdm_digest_response_t) + sizeof(spdm_key_pair_id_t) + sizeof(spdm_certificate_info_t) +
1566+
sizeof(spdm_key_usage_bit_mask_t) +
1567+
libspdm_get_hash_size(
1568+
spdm_context->connection_info.algorithm.base_hash_algo));
1569+
1570+
/* Sub Case 2: Set multi_key_conn_rsp to false*/
1571+
spdm_context->connection_info.multi_key_conn_rsp = false;
1572+
libspdm_reset_message_d(spdm_context);
1573+
1574+
libspdm_zero_mem(total_digest_buffer, sizeof(total_digest_buffer));
1575+
status = libspdm_get_digest(spdm_context, NULL, &slot_mask, &total_digest_buffer);
1576+
assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1577+
assert_int_equal(spdm_context->transcript.message_d.buffer_size,0);
1578+
}
1579+
14871580
static libspdm_test_context_t m_libspdm_requester_get_digests_test_context = {
14881581
LIBSPDM_TEST_CONTEXT_VERSION,
14891582
true,
@@ -1519,6 +1612,7 @@ int libspdm_requester_get_digests_test_main(void)
15191612
cmocka_unit_test(libspdm_test_requester_get_digests_case23),
15201613
cmocka_unit_test(libspdm_test_requester_get_digests_case24),
15211614
cmocka_unit_test(libspdm_test_requester_get_digests_case25),
1615+
cmocka_unit_test(libspdm_test_requester_get_digests_case26),
15221616
};
15231617

15241618
libspdm_setup_test_context(&m_libspdm_requester_get_digests_test_context);

0 commit comments

Comments
 (0)