LCOV - code coverage report
Current view: top level - unit_test/test_spdm_responder - encap_get_digests.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 222 222
Test Date: 2026-02-22 08:11:49 Functions: 100.0 % 8 8

            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              : 
      10              : #if (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_ENABLE_CAPABILITY_ENCAP_CAP) && \
      11              :     (LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT)
      12              : 
      13              : uint8_t m_local_digests_chain[LIBSPDM_MAX_CERT_CHAIN_SIZE];
      14              : static uint8_t m_libspdm_local_certificate_chain[LIBSPDM_MAX_CERT_CHAIN_SIZE];
      15              : 
      16              : /**
      17              :  * Test 1: Response message received successfully
      18              :  * Expected Behavior: requester returns the status LIBSPDM_STATUS_SUCCESS and a DIGESTS message is received
      19              :  **/
      20            1 : static void rsp_encap_get_digests_case1(void **state)
      21              : {
      22              :     libspdm_return_t status;
      23              :     libspdm_test_context_t *spdm_test_context;
      24              :     libspdm_context_t *spdm_context;
      25              :     spdm_digest_response_t *spdm_response;
      26              :     uint8_t *digest;
      27              :     uint8_t temp_buf[LIBSPDM_MAX_SPDM_MSG_SIZE];
      28              :     size_t spdm_response_size;
      29              :     bool need_continue;
      30              : 
      31            1 :     spdm_test_context = *state;
      32            1 :     spdm_context = spdm_test_context->spdm_context;
      33            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
      34              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
      35            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
      36            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
      37            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
      38            1 :     libspdm_set_mem(m_libspdm_local_certificate_chain,
      39              :                     sizeof(m_libspdm_local_certificate_chain),
      40              :                     (uint8_t)(0xFF));
      41            1 :     libspdm_reset_message_b(spdm_context);
      42              : 
      43              :     ((libspdm_context_t *)spdm_context)
      44            1 :     ->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
      45            1 :     spdm_response_size = sizeof(spdm_digest_response_t) +
      46            1 :                          libspdm_get_hash_size(m_libspdm_use_hash_algo);
      47            1 :     spdm_response = (void *)temp_buf;
      48            1 :     spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_10;
      49            1 :     spdm_response->header.param1 = 0;
      50            1 :     spdm_response->header.request_response_code = SPDM_DIGESTS;
      51            1 :     spdm_response->header.param2 = 0;
      52            1 :     libspdm_set_mem(m_libspdm_local_certificate_chain,
      53              :                     sizeof(m_libspdm_local_certificate_chain),
      54              :                     (uint8_t)(0xFF));
      55              : 
      56            1 :     digest = (void *)(spdm_response + 1);
      57            1 :     libspdm_hash_all(m_libspdm_use_hash_algo, m_libspdm_local_certificate_chain,
      58              :                      sizeof(m_libspdm_local_certificate_chain), &digest[0]);
      59            1 :     spdm_response->header.param2 |= (0x01 << 0);
      60              : 
      61            1 :     status = libspdm_process_encap_response_digest(spdm_context, spdm_response_size,
      62              :                                                    spdm_response, &need_continue);
      63            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
      64            1 : }
      65              : 
      66              : /**
      67              :  * Test 2: Error response message with error code busy
      68              :  * Expected Behavior: requester returns the status RETURN_DEVICE_ERROR, with no DIGESTS message received
      69              :  **/
      70            1 : static void rsp_encap_get_digests_case2(void **state)
      71              : {
      72              :     libspdm_return_t status;
      73              :     libspdm_test_context_t *spdm_test_context;
      74              :     libspdm_context_t *spdm_context;
      75              :     spdm_error_response_t spdm_response;
      76              :     size_t spdm_response_size;
      77              :     bool need_continue;
      78              : 
      79            1 :     spdm_test_context = *state;
      80            1 :     spdm_context = spdm_test_context->spdm_context;
      81            1 :     spdm_test_context->case_id = 0x2;
      82            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
      83              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
      84            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
      85            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
      86            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
      87            1 :     libspdm_set_mem(m_libspdm_local_certificate_chain,
      88              :                     sizeof(m_libspdm_local_certificate_chain),
      89              :                     (uint8_t)(0xFF));
      90            1 :     libspdm_reset_message_b(spdm_context);
      91              : 
      92            1 :     spdm_response_size = sizeof(spdm_error_response_t);
      93            1 :     spdm_response.header.spdm_version = SPDM_MESSAGE_VERSION_10;
      94            1 :     spdm_response.header.request_response_code = SPDM_ERROR;
      95            1 :     spdm_response.header.param1 = SPDM_ERROR_CODE_INVALID_REQUEST;
      96            1 :     spdm_response.header.param2 = 0;
      97              : 
      98            1 :     status = libspdm_process_encap_response_digest(spdm_context, spdm_response_size,
      99              :                                                    &spdm_response, &need_continue);
     100              : 
     101            1 :     assert_int_equal(status, LIBSPDM_STATUS_UNSUPPORTED_CAP);
     102            1 : }
     103              : 
     104              : /**
     105              :  * Test 3: Error response message with error code busy response seize incorrect
     106              :  * Expected Behavior:  Expected Behavior: requester returns the status RETURN_DEVICE_ERROR, with no DIGESTS message received
     107              :  **/
     108            1 : static void rsp_encap_get_digests_case3(void **state)
     109              : {
     110              :     libspdm_return_t status;
     111              :     libspdm_test_context_t *spdm_test_context;
     112              :     libspdm_context_t *spdm_context;
     113              :     bool need_continue;
     114              : 
     115            1 :     spdm_test_context = *state;
     116            1 :     spdm_context = spdm_test_context->spdm_context;
     117            1 :     spdm_test_context->case_id = 0x3;
     118            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
     119              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     120            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     121            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
     122            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     123            1 :     libspdm_set_mem(m_libspdm_local_certificate_chain,
     124              :                     sizeof(m_libspdm_local_certificate_chain),
     125              :                     (uint8_t)(0xFF));
     126            1 :     libspdm_reset_message_b(spdm_context);
     127              : 
     128              :     spdm_digest_response_t *spdm_response;
     129            1 :     uint8_t temp_buf[LIBSPDM_MAX_SPDM_MSG_SIZE] = {0};
     130              :     size_t spdm_response_size;
     131              : 
     132            1 :     spdm_response_size = 0;
     133            1 :     spdm_response = (void *)temp_buf;
     134              : 
     135            1 :     status = libspdm_process_encap_response_digest(spdm_context, spdm_response_size,
     136              :                                                    spdm_response, &need_continue);
     137            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_SIZE);
     138            1 : }
     139              : 
     140              : /**
     141              :  * Test 4: The code of the request_response_code  summary in the response message is different
     142              :  * Expected Behavior: requester returns the status RETURN_DEVICE_ERROR, with no DIGESTS message received
     143              :  **/
     144            1 : static void rsp_encap_get_digests_case4(void **state)
     145              : {
     146              :     libspdm_return_t status;
     147              :     libspdm_test_context_t *spdm_test_context;
     148              :     libspdm_context_t *spdm_context;
     149              :     bool need_continue;
     150              : 
     151            1 :     spdm_test_context = *state;
     152            1 :     spdm_context = spdm_test_context->spdm_context;
     153            1 :     spdm_test_context->case_id = 0x4;
     154            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
     155              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     156            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     157            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
     158            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     159              : 
     160              :     spdm_digest_response_t *spdm_response;
     161              :     uint8_t *digest;
     162              :     uint8_t temp_buf[LIBSPDM_MAX_SPDM_MSG_SIZE];
     163              :     size_t spdm_response_size;
     164              : 
     165            1 :     spdm_response_size = sizeof(spdm_digest_response_t) +
     166            1 :                          libspdm_get_hash_size(m_libspdm_use_hash_algo);
     167            1 :     spdm_response = (void *)temp_buf;
     168              : 
     169            1 :     spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_10;
     170            1 :     spdm_response->header.request_response_code = SPDM_CERTIFICATE;
     171            1 :     spdm_response->header.param1 = 0;
     172            1 :     spdm_response->header.param2 = 0;
     173            1 :     libspdm_set_mem(m_libspdm_local_certificate_chain,
     174              :                     sizeof(m_libspdm_local_certificate_chain),
     175              :                     (uint8_t)(0xFF));
     176              : 
     177            1 :     digest = (void *)(spdm_response + 1);
     178            1 :     libspdm_hash_all(m_libspdm_use_hash_algo, m_libspdm_local_certificate_chain,
     179              :                      sizeof(m_libspdm_local_certificate_chain), &digest[0]);
     180            1 :     spdm_response->header.param2 |= (1 << 0);
     181              : 
     182            1 :     status = libspdm_process_encap_response_digest(spdm_context, spdm_response_size,
     183              :                                                    spdm_response, &need_continue);
     184            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
     185            1 : }
     186              : 
     187              : /**
     188              :  * Test 5: flag cert_cap from CAPABILITIES is not set meaning the Requester does not support DIGESTS and
     189              :  * CERTIFICATE response messages
     190              :  * Expected Behavior: requester returns the status RETURN_DEVICE_ERROR, with no DIGESTS message received
     191              :  **/
     192            1 : static void rsp_encap_get_digests_case5(void **state)
     193              : {
     194              :     libspdm_return_t status;
     195              :     libspdm_test_context_t *spdm_test_context;
     196              :     libspdm_context_t *spdm_context;
     197              :     spdm_digest_response_t *spdm_response;
     198            1 :     uint8_t temp_buf[LIBSPDM_MAX_SPDM_MSG_SIZE] = {0};
     199              :     size_t spdm_response_size;
     200              :     bool need_continue;
     201              : 
     202            1 :     spdm_test_context = *state;
     203            1 :     spdm_context = spdm_test_context->spdm_context;
     204            1 :     spdm_test_context->case_id = 0x5;
     205            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
     206              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     207            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
     208            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     209            1 :     libspdm_set_mem(m_libspdm_local_certificate_chain,
     210              :                     sizeof(m_libspdm_local_certificate_chain),
     211              :                     (uint8_t)(0xFF));
     212            1 :     libspdm_reset_message_b(spdm_context);
     213              : 
     214            1 :     spdm_response_size = sizeof(spdm_digest_response_t);
     215            1 :     spdm_response = (void *)temp_buf;
     216              : 
     217            1 :     status = libspdm_process_encap_response_digest(spdm_context, spdm_response_size,
     218              :                                                    spdm_response, &need_continue);
     219              : 
     220            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
     221            1 : }
     222              : 
     223              : /**
     224              :  * Test 6: a response message is successfully sent , Set multi_key_conn_req to check if it responds correctly
     225              :  * Expected Behavior: requester returns the status LIBSPDM_STATUS_SUCCESS
     226              :  **/
     227            1 : static void rsp_encap_get_digests_case6(void **state)
     228              : {
     229              :     libspdm_return_t status;
     230              :     libspdm_test_context_t *spdm_test_context;
     231              :     libspdm_context_t *spdm_context;
     232              :     spdm_digest_response_t *spdm_response;
     233              :     uint8_t *digest;
     234              :     size_t hash_size;
     235              :     uint8_t temp_buf[LIBSPDM_MAX_SPDM_MSG_SIZE];
     236              :     size_t spdm_response_size;
     237              :     bool need_continue;
     238              :     uint32_t session_id;
     239              :     libspdm_session_info_t *session_info;
     240              :     spdm_key_pair_id_t *key_pair_id;
     241              :     spdm_certificate_info_t *cert_info;
     242              :     spdm_key_usage_bit_mask_t *key_usage_bit_mask;
     243              : 
     244            1 :     spdm_test_context = *state;
     245            1 :     spdm_context = spdm_test_context->spdm_context;
     246            1 :     spdm_test_context->case_id = 0x6;
     247            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     248              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     249            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     250            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
     251            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     252              : 
     253            1 :     libspdm_reset_message_b(spdm_context);
     254              : 
     255            1 :     spdm_response = (void *)temp_buf;
     256            1 :     libspdm_zero_mem(temp_buf, sizeof(temp_buf));
     257            1 :     spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     258            1 :     spdm_response->header.request_response_code = SPDM_DIGESTS;
     259            1 :     spdm_response->header.param1 = (0x01 << 0);
     260            1 :     spdm_response->header.param2 = 0;
     261            1 :     spdm_response->header.param2 |= (0x01 << 0);
     262            1 :     libspdm_set_mem(m_libspdm_local_certificate_chain,
     263              :                     sizeof(m_libspdm_local_certificate_chain),
     264              :                     (uint8_t)(0xFF));
     265              : 
     266            1 :     hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
     267            1 :     digest = (void *)(spdm_response + 1);
     268            1 :     libspdm_hash_all(m_libspdm_use_hash_algo, m_libspdm_local_certificate_chain,
     269              :                      sizeof(m_libspdm_local_certificate_chain), &digest[0]);
     270            1 :     key_pair_id = (spdm_key_pair_id_t *)((uint8_t *)digest + hash_size);
     271            1 :     cert_info = (spdm_certificate_info_t *)((uint8_t *)key_pair_id + sizeof(spdm_key_pair_id_t));
     272            1 :     key_usage_bit_mask = (spdm_key_usage_bit_mask_t *)((uint8_t *)cert_info +
     273              :                                                        sizeof(spdm_certificate_info_t));
     274            1 :     *key_pair_id = 0;
     275            1 :     *cert_info = SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT;
     276            1 :     *key_usage_bit_mask = SPDM_KEY_USAGE_BIT_MASK_KEY_EX_USE |
     277              :                           SPDM_KEY_USAGE_BIT_MASK_CHALLENGE_USE |
     278              :                           SPDM_KEY_USAGE_BIT_MASK_MEASUREMENT_USE |
     279              :                           SPDM_KEY_USAGE_BIT_MASK_ENDPOINT_INFO_USE;
     280              : 
     281            1 :     session_id = 0xFFFFFFFF;
     282            1 :     spdm_context->latest_session_id = session_id;
     283            1 :     spdm_context->last_spdm_request_session_id_valid = true;
     284            1 :     spdm_context->last_spdm_request_session_id = session_id;
     285            1 :     session_info = &spdm_context->session_info[0];
     286            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
     287              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     288            1 :     libspdm_secured_message_set_session_state(
     289              :         session_info->secured_message_context,
     290              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
     291              : 
     292              :     /* Sub Case 1: Set multi_key_conn_req to true*/
     293            1 :     spdm_context->connection_info.multi_key_conn_req = true;
     294            1 :     libspdm_reset_message_encap_d(session_info);
     295              : 
     296            1 :     spdm_response_size = sizeof(spdm_digest_response_t) + sizeof(spdm_key_pair_id_t) +
     297              :                          sizeof(spdm_certificate_info_t) +
     298              :                          sizeof(spdm_key_usage_bit_mask_t) +
     299            1 :                          libspdm_get_hash_size(m_libspdm_use_hash_algo);
     300              : 
     301            1 :     status = libspdm_process_encap_response_digest(spdm_context, spdm_response_size,
     302              :                                                    spdm_response, &need_continue);
     303            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     304            1 :     assert_int_equal(session_info->session_transcript.message_encap_d.buffer_size,
     305              :                      spdm_response_size);
     306              : 
     307              :     /* Sub Case 2: Set multi_key_conn_req to false*/
     308            1 :     spdm_context->connection_info.multi_key_conn_req = false;
     309            1 :     libspdm_reset_message_encap_d(session_info);
     310              : 
     311            1 :     spdm_response_size = sizeof(spdm_digest_response_t) + sizeof(spdm_key_pair_id_t) +
     312              :                          sizeof(spdm_certificate_info_t) +
     313              :                          sizeof(spdm_key_usage_bit_mask_t) +
     314            1 :                          libspdm_get_hash_size(m_libspdm_use_hash_algo);
     315            1 :     status = libspdm_process_encap_response_digest(spdm_context, spdm_response_size,
     316              :                                                    spdm_response, &need_continue);
     317            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     318            1 :     assert_int_equal(session_info->session_transcript.message_encap_d.buffer_size, 0);
     319            1 : }
     320              : 
     321              : /**
     322              :  * Test 7: a response message is successfully sent ,
     323              :  * Check KeyPairID CertificateInfo and KeyUsageMask
     324              :  * Expected Behavior: requester returns the status LIBSPDM_STATUS_SUCCESS
     325              :  **/
     326            1 : static void rsp_encap_get_digests_case7(void **state)
     327              : {
     328              :     libspdm_return_t status;
     329              :     libspdm_test_context_t *spdm_test_context;
     330              :     libspdm_context_t *spdm_context;
     331              :     spdm_digest_response_t *spdm_response;
     332              :     uint8_t *digest;
     333              :     uint8_t temp_buf[LIBSPDM_MAX_SPDM_MSG_SIZE];
     334              :     size_t spdm_response_size;
     335              :     bool need_continue;
     336              :     uint32_t session_id;
     337              :     libspdm_session_info_t *session_info;
     338              :     spdm_key_pair_id_t *key_pair_id;
     339              :     spdm_certificate_info_t *cert_info;
     340              :     spdm_key_usage_bit_mask_t *key_usage_bit_mask;
     341              :     uint32_t hash_size;
     342              :     uint8_t slot_count;
     343              :     size_t additional_size;
     344              : 
     345            1 :     spdm_test_context = *state;
     346            1 :     spdm_context = spdm_test_context->spdm_context;
     347            1 :     spdm_test_context->case_id = 0x7;
     348            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     349              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     350            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     351            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
     352            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     353              : 
     354            1 :     libspdm_reset_message_b(spdm_context);
     355              : 
     356            1 :     spdm_response = (void *)temp_buf;
     357            1 :     libspdm_zero_mem(temp_buf, sizeof(temp_buf));
     358            1 :     spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     359            1 :     spdm_response->header.request_response_code = SPDM_DIGESTS;
     360            1 :     spdm_response->header.param1 = 0;
     361            1 :     spdm_response->header.param2 = 0;
     362            1 :     libspdm_set_mem(m_libspdm_local_certificate_chain,
     363              :                     sizeof(m_libspdm_local_certificate_chain),
     364              :                     (uint8_t)(0xFF));
     365              : 
     366            1 :     slot_count = SPDM_MAX_SLOT_COUNT;
     367            1 :     additional_size = sizeof(spdm_key_pair_id_t) + sizeof(spdm_certificate_info_t) +
     368              :                       sizeof(spdm_key_usage_bit_mask_t);
     369            1 :     hash_size = libspdm_get_hash_size(m_libspdm_use_hash_algo);
     370              : 
     371            1 :     digest = (void *)(spdm_response + 1);
     372            1 :     libspdm_zero_mem (digest, hash_size * slot_count);
     373            1 :     key_pair_id = (spdm_key_pair_id_t *)((uint8_t *)digest + (hash_size * slot_count));
     374            1 :     cert_info = (spdm_certificate_info_t *)((uint8_t *)key_pair_id +
     375            1 :                                             sizeof(spdm_key_pair_id_t) * slot_count);
     376            1 :     key_usage_bit_mask = (spdm_key_usage_bit_mask_t *)((uint8_t *)cert_info +
     377            1 :                                                        sizeof(spdm_certificate_info_t) *
     378              :                                                        slot_count);
     379              : 
     380            9 :     for (uint8_t index = 0; index < slot_count; index++)
     381              :     {
     382            8 :         libspdm_hash_all(m_libspdm_use_hash_algo, m_libspdm_local_certificate_chain,
     383            8 :                          sizeof(m_libspdm_local_certificate_chain), &digest[hash_size * index]);
     384              : 
     385            8 :         spdm_response->header.param1 |= (1 << index);
     386            8 :         spdm_response->header.param2 |= (1 << index);
     387              :     }
     388            1 :     key_pair_id[0] = 0x00;
     389            1 :     cert_info[0] = SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT;
     390            1 :     key_usage_bit_mask[0] = SPDM_KEY_USAGE_BIT_MASK_KEY_EX_USE;
     391              : 
     392            1 :     key_pair_id[1] = 0x01;
     393            1 :     cert_info[1] = SPDM_CERTIFICATE_INFO_CERT_MODEL_ALIAS_CERT;
     394            1 :     key_usage_bit_mask[1] = SPDM_KEY_USAGE_BIT_MASK_CHALLENGE_USE;
     395              : 
     396            1 :     key_pair_id[2] = 0x02;
     397            1 :     cert_info[2] = SPDM_CERTIFICATE_INFO_CERT_MODEL_GENERIC_CERT;
     398            1 :     key_usage_bit_mask[2] = SPDM_KEY_USAGE_BIT_MASK_MEASUREMENT_USE;
     399              : 
     400            1 :     key_pair_id[3] = 0x03;
     401            1 :     cert_info[3] = SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT;
     402            1 :     key_usage_bit_mask[3] = SPDM_KEY_USAGE_BIT_MASK_ENDPOINT_INFO_USE;
     403              : 
     404            1 :     key_pair_id[4] = 0x04;
     405            1 :     cert_info[4] = SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT;
     406            1 :     key_usage_bit_mask[4] = SPDM_KEY_USAGE_BIT_MASK_STANDARDS_KEY_USE;
     407              : 
     408            1 :     key_pair_id[5] = 0x05;
     409            1 :     cert_info[5] = SPDM_CERTIFICATE_INFO_CERT_MODEL_GENERIC_CERT;
     410            1 :     key_usage_bit_mask[5] = SPDM_KEY_USAGE_BIT_MASK_VENDOR_KEY_USE;
     411              : 
     412            1 :     key_pair_id[6] = 0x06;
     413            1 :     cert_info[6] = SPDM_CERTIFICATE_INFO_CERT_MODEL_GENERIC_CERT;
     414            1 :     key_usage_bit_mask[6] = SPDM_KEY_USAGE_BIT_MASK_VENDOR_KEY_USE;
     415              : 
     416            1 :     key_pair_id[7] = 0x07;
     417            1 :     cert_info[7] = SPDM_CERTIFICATE_INFO_CERT_MODEL_GENERIC_CERT;
     418            1 :     key_usage_bit_mask[7] = SPDM_KEY_USAGE_BIT_MASK_VENDOR_KEY_USE;
     419              : 
     420            1 :     session_id = 0xFFFFFFFF;
     421            1 :     spdm_context->latest_session_id = session_id;
     422            1 :     spdm_context->last_spdm_request_session_id_valid = true;
     423            1 :     spdm_context->last_spdm_request_session_id = session_id;
     424            1 :     session_info = &spdm_context->session_info[0];
     425            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
     426              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     427            1 :     libspdm_secured_message_set_session_state(
     428              :         session_info->secured_message_context,
     429              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
     430              : 
     431            1 :     spdm_context->connection_info.multi_key_conn_req = true;
     432            1 :     libspdm_reset_message_encap_d(session_info);
     433              : 
     434            1 :     spdm_response_size = sizeof(spdm_digest_response_t) +
     435            1 :                          (hash_size + additional_size) * slot_count;
     436              : 
     437            1 :     status = libspdm_process_encap_response_digest(spdm_context, spdm_response_size,
     438              :                                                    spdm_response, &need_continue);
     439            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     440            1 :     assert_int_equal(session_info->session_transcript.message_encap_d.buffer_size,
     441              :                      spdm_response_size);
     442              : 
     443            9 :     for (uint8_t index = 0; index < SPDM_MAX_SLOT_COUNT; index++) {
     444            8 :         assert_memory_equal((void *)&key_pair_id[index],
     445              :                             (void *)&spdm_context->connection_info.peer_key_pair_id[index],
     446              :                             sizeof(spdm_key_pair_id_t));
     447            8 :         assert_memory_equal((void *)&cert_info[index],
     448              :                             (void *)&spdm_context->connection_info.peer_cert_info[index],
     449              :                             sizeof(spdm_certificate_info_t));
     450            8 :         assert_memory_equal((void *)&key_usage_bit_mask[index],
     451              :                             (void *)&spdm_context->connection_info.peer_key_usage_bit_mask[index],
     452              :                             sizeof(spdm_key_usage_bit_mask_t));
     453              :     }
     454            1 : }
     455              : 
     456            1 : int spdm_rsp_encap_get_digests_test(void)
     457              : {
     458            1 :     const struct CMUnitTest test_cases[] = {
     459              :         /* Success Case*/
     460              :         cmocka_unit_test(rsp_encap_get_digests_case1),
     461              :         /* Error response: SPDM_ERROR*/
     462              :         cmocka_unit_test(rsp_encap_get_digests_case2),
     463              :         /* Error response: RETURN_DEVICE_ERROR*/
     464              :         cmocka_unit_test(rsp_encap_get_digests_case3),
     465              :         /* request_response_code wrong in response*/
     466              :         cmocka_unit_test(rsp_encap_get_digests_case4),
     467              :         /* capability flags check failed*/
     468              :         cmocka_unit_test(rsp_encap_get_digests_case5),
     469              :         /* Set multi_key_conn_req to check if it responds correctly */
     470              :         cmocka_unit_test(rsp_encap_get_digests_case6),
     471              :         /* Check KeyPairID CertificateInfo and KeyUsageMask*/
     472              :         cmocka_unit_test(rsp_encap_get_digests_case7),
     473              :     };
     474              : 
     475            1 :     libspdm_test_context_t test_context = {
     476              :         LIBSPDM_TEST_CONTEXT_VERSION,
     477              :         false,
     478              :     };
     479              : 
     480            1 :     libspdm_setup_test_context(&test_context);
     481              : 
     482            1 :     return cmocka_run_group_tests(test_cases,
     483              :                                   libspdm_unit_test_group_setup,
     484              :                                   libspdm_unit_test_group_teardown);
     485              : }
     486              : 
     487              : #endif /* (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (...) */
        

Generated by: LCOV version 2.0-1