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

            Line data    Source code
       1              : /**
       2              :  *  Copyright Notice:
       3              :  *  Copyright 2025-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              : #include "spdm_unit_test.h"
       7              : #include "internal/libspdm_responder_lib.h"
       8              : 
       9              : #if (LIBSPDM_ENABLE_CAPABILITY_ENCAP_CAP) && (LIBSPDM_SEND_GET_ENDPOINT_INFO_SUPPORT) && \
      10              :     (LIBSPDM_ENABLE_CAPABILITY_ENDPOINT_INFO_CAP)
      11              : 
      12              : #define LIBSPDM_TEST_ENDPOINT_INFO_BUFFER_SIZE 0x20
      13              : 
      14              : static uint8_t m_endpoint_info_buffer_receive[LIBSPDM_TEST_ENDPOINT_INFO_BUFFER_SIZE];
      15              : static uint8_t m_endpoint_info_buffer_send[LIBSPDM_TEST_ENDPOINT_INFO_BUFFER_SIZE];
      16              : 
      17            5 : libspdm_return_t get_endpoint_info_callback (
      18              :     void *spdm_context,
      19              :     uint8_t subcode,
      20              :     uint8_t param2,
      21              :     uint8_t request_attributes,
      22              :     uint32_t endpoint_info_size,
      23              :     const void *endpoint_info)
      24              : {
      25            5 :     LIBSPDM_ASSERT (endpoint_info_size <= LIBSPDM_TEST_ENDPOINT_INFO_BUFFER_SIZE);
      26            5 :     libspdm_copy_mem (m_endpoint_info_buffer_send, endpoint_info_size,
      27              :                       endpoint_info, endpoint_info_size);
      28            5 :     return LIBSPDM_STATUS_SUCCESS;
      29              : }
      30              : 
      31              : /**
      32              :  * Test 1: Normal case, request a endpoint info with signature
      33              :  * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code, correct endpoint_info
      34              :  *                    and an empty transcript.message_encap_e
      35              :  **/
      36            1 : static void rsp_encap_get_endpoint_info_case1(void **state)
      37              : {
      38              :     libspdm_return_t status;
      39              :     libspdm_test_context_t *spdm_test_context;
      40              :     libspdm_context_t *spdm_context;
      41              :     spdm_endpoint_info_response_t *spdm_response;
      42              :     uint8_t temp_buf[LIBSPDM_SENDER_BUFFER_SIZE];
      43              :     bool need_continue;
      44              :     uint8_t *ptr;
      45              :     size_t sig_size;
      46              :     size_t response_size;
      47              :     uint32_t endpoint_info_size;
      48              :     void *data;
      49              :     size_t data_size;
      50              : 
      51            1 :     spdm_test_context = *state;
      52            1 :     spdm_test_context->case_id = 0x1;
      53            1 :     spdm_context = spdm_test_context->spdm_context;
      54            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
      55              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
      56            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
      57            1 :     spdm_context->connection_info.capability.flags = 0;
      58            1 :     spdm_context->connection_info.capability.flags |=
      59              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_EP_INFO_CAP_SIG;
      60            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
      61            1 :     spdm_context->connection_info.algorithm.req_base_asym_alg = m_libspdm_use_req_asym_algo;
      62            1 :     spdm_context->get_endpoint_info_callback = get_endpoint_info_callback;
      63              : 
      64            1 :     libspdm_read_requester_public_certificate_chain(m_libspdm_use_hash_algo,
      65              :                                                     m_libspdm_use_req_asym_algo, &data,
      66              :                                                     &data_size, NULL, NULL);
      67            1 :     libspdm_reset_message_a(spdm_context);
      68            1 :     libspdm_reset_message_encap_e(spdm_context, NULL);
      69              : 
      70            3 :     for (uint32_t index = 0; index < 2; index++) {
      71              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
      72              :         spdm_context->connection_info.peer_used_cert_chain[index].buffer_size = data_size;
      73              :         libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[index].buffer,
      74              :                          sizeof(spdm_context->connection_info.peer_used_cert_chain[index].buffer),
      75              :                          data, data_size);
      76              : #else
      77            2 :         libspdm_hash_all(
      78              :             spdm_context->connection_info.algorithm.base_hash_algo,
      79              :             data, data_size,
      80            2 :             spdm_context->connection_info.peer_used_cert_chain[index].buffer_hash);
      81            2 :         spdm_context->connection_info.peer_used_cert_chain[index].buffer_hash_size =
      82            2 :             libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
      83            2 :         libspdm_get_leaf_cert_public_key_from_cert_chain(
      84              :             spdm_context->connection_info.algorithm.base_hash_algo,
      85            2 :             spdm_context->connection_info.algorithm.req_base_asym_alg,
      86              :             data, data_size,
      87              :             &spdm_context->connection_info.peer_used_cert_chain[index].leaf_cert_public_key);
      88              : #endif
      89              :     }
      90              : 
      91              :     /* Subcase 1: slot_id = 0 */
      92            1 :     spdm_context->encap_context.req_slot_id = 0;
      93            1 :     endpoint_info_size = LIBSPDM_TEST_ENDPOINT_INFO_BUFFER_SIZE;
      94            1 :     libspdm_generate_device_endpoint_info(
      95              :         spdm_context, SPDM_GET_ENDPOINT_INFO_REQUEST_SUBCODE_DEVICE_CLASS_IDENTIFIER,
      96              :         SPDM_GET_ENDPOINT_INFO_REQUEST_ATTRIBUTE_SIGNATURE_REQUESTED,
      97              :         &endpoint_info_size, m_endpoint_info_buffer_receive);
      98            1 :     sig_size = libspdm_get_asym_signature_size(m_libspdm_use_req_asym_algo);
      99              : 
     100            1 :     response_size = sizeof(spdm_endpoint_info_response_t) +
     101              :                     SPDM_NONCE_SIZE + sizeof(uint32_t) +
     102            1 :                     endpoint_info_size + sig_size;
     103              : 
     104            1 :     spdm_response = (void *)temp_buf;
     105            1 :     spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     106            1 :     spdm_response->header.request_response_code = SPDM_ENDPOINT_INFO;
     107            1 :     spdm_response->header.param1 = 0;
     108            1 :     spdm_response->header.param2 = spdm_context->encap_context.req_slot_id &
     109              :                                    SPDM_ENDPOINT_INFO_RESPONSE_SLOT_ID_MASK;
     110            1 :     spdm_response->reserved = 0;
     111              : 
     112            1 :     ptr = (void *)(spdm_response + 1);
     113            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE, ptr);
     114            1 :     ptr += SPDM_NONCE_SIZE;
     115              : 
     116            1 :     *(uint32_t *)ptr = endpoint_info_size; /* ep_info_len */
     117            1 :     ptr += sizeof(uint32_t);
     118              : 
     119            1 :     libspdm_copy_mem(ptr, endpoint_info_size, m_endpoint_info_buffer_receive, endpoint_info_size);
     120            1 :     ptr += endpoint_info_size;
     121              : 
     122            1 :     libspdm_requester_data_sign(
     123              :         spdm_context,
     124            1 :         spdm_response->header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     125              :             0, SPDM_ENDPOINT_INFO,
     126              :             m_libspdm_use_req_asym_algo, m_libspdm_use_req_pqc_asym_algo, m_libspdm_use_hash_algo,
     127              :             false, (uint8_t*)spdm_response, response_size - sig_size,
     128              :             ptr, &sig_size);
     129              : 
     130            1 :     status = libspdm_process_encap_response_endpoint_info(spdm_context, response_size,
     131              :                                                           spdm_response, &need_continue);
     132            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     133           13 :     for (uint32_t index = 0; index < endpoint_info_size; index++) {
     134           12 :         assert_int_equal (m_endpoint_info_buffer_receive[index],
     135              :                           m_endpoint_info_buffer_send[index]);
     136              :     }
     137              :     /* Completion of GET_ENDPOINT_INFO sets mut IL1/IL2 to null. */
     138              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     139              :     assert_int_equal(spdm_context->transcript.message_encap_e.buffer_size, 0);
     140              : #else
     141            1 :     assert_null(spdm_context->transcript.digest_context_encap_il1il2);
     142              : #endif
     143              : 
     144              : 
     145              :     /* Subcase 2: slot_id = 1 */
     146            1 :     spdm_context->encap_context.req_slot_id = 1;
     147            1 :     endpoint_info_size = LIBSPDM_TEST_ENDPOINT_INFO_BUFFER_SIZE;
     148            1 :     libspdm_generate_device_endpoint_info(
     149              :         spdm_context, SPDM_GET_ENDPOINT_INFO_REQUEST_SUBCODE_DEVICE_CLASS_IDENTIFIER,
     150              :         SPDM_GET_ENDPOINT_INFO_REQUEST_ATTRIBUTE_SIGNATURE_REQUESTED,
     151              :         &endpoint_info_size, m_endpoint_info_buffer_receive);
     152            1 :     sig_size = libspdm_get_asym_signature_size(m_libspdm_use_req_asym_algo);
     153              : 
     154            1 :     response_size = sizeof(spdm_endpoint_info_response_t) +
     155              :                     SPDM_NONCE_SIZE + sizeof(uint32_t) +
     156            1 :                     endpoint_info_size + sig_size;
     157              : 
     158            1 :     spdm_response = (void *)temp_buf;
     159            1 :     spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     160            1 :     spdm_response->header.request_response_code = SPDM_ENDPOINT_INFO;
     161            1 :     spdm_response->header.param1 = 0;
     162            1 :     spdm_response->header.param2 = spdm_context->encap_context.req_slot_id &
     163              :                                    SPDM_ENDPOINT_INFO_RESPONSE_SLOT_ID_MASK;
     164            1 :     spdm_response->reserved = 0;
     165              : 
     166            1 :     ptr = (void *)(spdm_response + 1);
     167            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE, ptr);
     168            1 :     ptr += SPDM_NONCE_SIZE;
     169              : 
     170            1 :     *(uint32_t *)ptr = endpoint_info_size; /* ep_info_len */
     171            1 :     ptr += sizeof(uint32_t);
     172              : 
     173            1 :     libspdm_copy_mem(ptr, endpoint_info_size, m_endpoint_info_buffer_receive, endpoint_info_size);
     174            1 :     ptr += endpoint_info_size;
     175              : 
     176            1 :     libspdm_requester_data_sign(
     177              :         spdm_context,
     178            1 :         spdm_response->header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     179              :             0, SPDM_ENDPOINT_INFO,
     180              :             m_libspdm_use_req_asym_algo, m_libspdm_use_req_pqc_asym_algo, m_libspdm_use_hash_algo,
     181              :             false, (uint8_t*)spdm_response, response_size - sig_size,
     182              :             ptr, &sig_size);
     183              : 
     184            1 :     status = libspdm_process_encap_response_endpoint_info(spdm_context, response_size,
     185              :                                                           spdm_response, &need_continue);
     186            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     187           13 :     for (uint32_t index = 0; index < endpoint_info_size; index++) {
     188           12 :         assert_int_equal (m_endpoint_info_buffer_receive[index],
     189              :                           m_endpoint_info_buffer_send[index]);
     190              :     }
     191              :     /* Completion of GET_ENDPOINT_INFO sets mut IL1/IL2 to null. */
     192              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     193              :     assert_int_equal(spdm_context->transcript.message_encap_e.buffer_size, 0);
     194              : #else
     195            1 :     assert_null(spdm_context->transcript.digest_context_encap_il1il2);
     196              : #endif
     197            1 : }
     198              : 
     199              : /**
     200              :  * Test 2: Normal case, request a endpoint info with signature, req_slot_id = 0xFF
     201              :  * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code, correct endpoint_info
     202              :  *                    and an empty transcript.message_encap_e
     203              :  **/
     204            1 : static void rsp_encap_get_endpoint_info_case2(void **state)
     205              : {
     206              :     libspdm_return_t status;
     207              :     libspdm_test_context_t *spdm_test_context;
     208              :     libspdm_context_t *spdm_context;
     209              :     spdm_endpoint_info_response_t *spdm_response;
     210              :     uint8_t temp_buf[LIBSPDM_SENDER_BUFFER_SIZE];
     211              :     bool need_continue;
     212              :     uint8_t *ptr;
     213              :     size_t sig_size;
     214              :     size_t response_size;
     215              :     uint32_t endpoint_info_size;
     216              :     void *data;
     217              :     size_t data_size;
     218              : 
     219            1 :     spdm_test_context = *state;
     220            1 :     spdm_test_context->case_id = 0x2;
     221            1 :     spdm_context = spdm_test_context->spdm_context;
     222            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     223              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     224            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     225            1 :     spdm_context->connection_info.capability.flags = 0;
     226            1 :     spdm_context->connection_info.capability.flags |=
     227              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_EP_INFO_CAP_SIG;
     228            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     229            1 :     spdm_context->connection_info.algorithm.req_base_asym_alg = m_libspdm_use_req_asym_algo;
     230            1 :     spdm_context->get_endpoint_info_callback = get_endpoint_info_callback;
     231              : 
     232            1 :     libspdm_read_requester_public_key(m_libspdm_use_req_asym_algo, &data, &data_size);
     233            1 :     spdm_context->local_context.peer_public_key_provision = data;
     234            1 :     spdm_context->local_context.peer_public_key_provision_size = data_size;
     235              : 
     236            1 :     spdm_context->encap_context.req_slot_id = 0xFF;
     237            1 :     endpoint_info_size = LIBSPDM_TEST_ENDPOINT_INFO_BUFFER_SIZE;
     238            1 :     libspdm_generate_device_endpoint_info(
     239              :         spdm_context, SPDM_GET_ENDPOINT_INFO_REQUEST_SUBCODE_DEVICE_CLASS_IDENTIFIER,
     240              :         SPDM_GET_ENDPOINT_INFO_REQUEST_ATTRIBUTE_SIGNATURE_REQUESTED,
     241              :         &endpoint_info_size, m_endpoint_info_buffer_receive);
     242            1 :     sig_size = libspdm_get_asym_signature_size(m_libspdm_use_req_asym_algo);
     243              : 
     244            1 :     response_size = sizeof(spdm_endpoint_info_response_t) +
     245              :                     SPDM_NONCE_SIZE + sizeof(uint32_t) +
     246            1 :                     endpoint_info_size + sig_size;
     247              : 
     248            1 :     spdm_response = (void *)temp_buf;
     249            1 :     spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     250            1 :     spdm_response->header.request_response_code = SPDM_ENDPOINT_INFO;
     251            1 :     spdm_response->header.param1 = 0;
     252            1 :     spdm_response->header.param2 = spdm_context->encap_context.req_slot_id &
     253              :                                    SPDM_ENDPOINT_INFO_RESPONSE_SLOT_ID_MASK;
     254            1 :     spdm_response->reserved = 0;
     255              : 
     256            1 :     ptr = (void *)(spdm_response + 1);
     257            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE, ptr);
     258            1 :     ptr += SPDM_NONCE_SIZE;
     259              : 
     260            1 :     *(uint32_t *)ptr = endpoint_info_size; /* ep_info_len */
     261            1 :     ptr += sizeof(uint32_t);
     262              : 
     263            1 :     libspdm_copy_mem(ptr, endpoint_info_size, m_endpoint_info_buffer_receive, endpoint_info_size);
     264            1 :     ptr += endpoint_info_size;
     265              : 
     266            1 :     libspdm_requester_data_sign(
     267              :         spdm_context,
     268            1 :         spdm_response->header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     269              :             0, SPDM_ENDPOINT_INFO,
     270              :             m_libspdm_use_req_asym_algo, m_libspdm_use_req_pqc_asym_algo, m_libspdm_use_hash_algo,
     271              :             false, (uint8_t*)spdm_response, response_size - sig_size,
     272              :             ptr, &sig_size);
     273              : 
     274            1 :     status = libspdm_process_encap_response_endpoint_info(spdm_context, response_size,
     275              :                                                           spdm_response, &need_continue);
     276            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     277           13 :     for (uint32_t index = 0; index < endpoint_info_size; index++) {
     278           12 :         assert_int_equal (m_endpoint_info_buffer_receive[index],
     279              :                           m_endpoint_info_buffer_send[index]);
     280              :     }
     281              :     /* Completion of GET_ENDPOINT_INFO sets mut IL1/IL2 to null. */
     282              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     283              :     assert_int_equal(spdm_context->transcript.message_encap_e.buffer_size, 0);
     284              : #else
     285            1 :     assert_null(spdm_context->transcript.digest_context_encap_il1il2);
     286              : #endif
     287            1 : }
     288              : 
     289              : /**
     290              :  * Test 3: Normal case, request a endpoint info without signature
     291              :  * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code, correct endpoint_info
     292              :  **/
     293            1 : static void rsp_encap_get_endpoint_info_case3(void **state)
     294              : {
     295              :     libspdm_return_t status;
     296              :     libspdm_test_context_t *spdm_test_context;
     297              :     libspdm_context_t *spdm_context;
     298              :     spdm_endpoint_info_response_t *spdm_response;
     299              :     uint8_t temp_buf[LIBSPDM_SENDER_BUFFER_SIZE];
     300              :     bool need_continue;
     301              :     uint8_t *ptr;
     302              :     size_t response_size;
     303              :     uint32_t endpoint_info_size;
     304              : 
     305            1 :     spdm_test_context = *state;
     306            1 :     spdm_test_context->case_id = 0x3;
     307            1 :     spdm_context = spdm_test_context->spdm_context;
     308            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     309              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     310            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     311            1 :     spdm_context->connection_info.capability.flags = 0;
     312            1 :     spdm_context->connection_info.capability.flags |=
     313              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_EP_INFO_CAP_NO_SIG;
     314            1 :     spdm_context->get_endpoint_info_callback = get_endpoint_info_callback;
     315              : 
     316            1 :     spdm_context->encap_context.req_slot_id = 0;
     317            1 :     endpoint_info_size = LIBSPDM_TEST_ENDPOINT_INFO_BUFFER_SIZE;
     318            1 :     libspdm_generate_device_endpoint_info(
     319              :         spdm_context, SPDM_GET_ENDPOINT_INFO_REQUEST_SUBCODE_DEVICE_CLASS_IDENTIFIER,
     320              :         SPDM_GET_ENDPOINT_INFO_REQUEST_ATTRIBUTE_SIGNATURE_REQUESTED,
     321              :         &endpoint_info_size, m_endpoint_info_buffer_receive);
     322              : 
     323            1 :     response_size = sizeof(spdm_endpoint_info_response_t) +
     324            1 :                     sizeof(uint32_t) + endpoint_info_size;
     325              : 
     326            1 :     spdm_response = (void *)temp_buf;
     327            1 :     spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     328            1 :     spdm_response->header.request_response_code = SPDM_ENDPOINT_INFO;
     329            1 :     spdm_response->header.param1 = 0;
     330            1 :     spdm_response->header.param2 = spdm_context->encap_context.req_slot_id &
     331              :                                    SPDM_ENDPOINT_INFO_RESPONSE_SLOT_ID_MASK;
     332            1 :     spdm_response->reserved = 0;
     333              : 
     334            1 :     ptr = (void *)(spdm_response + 1);
     335            1 :     *(uint32_t *)ptr = endpoint_info_size; /* ep_info_len */
     336            1 :     ptr += sizeof(uint32_t);
     337              : 
     338            1 :     libspdm_copy_mem(ptr, endpoint_info_size, m_endpoint_info_buffer_receive, endpoint_info_size);
     339            1 :     ptr += endpoint_info_size;
     340              : 
     341            1 :     status = libspdm_process_encap_response_endpoint_info(spdm_context, response_size,
     342              :                                                           spdm_response, &need_continue);
     343            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     344           13 :     for (uint32_t index = 0; index < endpoint_info_size; index++) {
     345           12 :         assert_int_equal (m_endpoint_info_buffer_receive[index],
     346              :                           m_endpoint_info_buffer_send[index]);
     347              :     }
     348            1 : }
     349              : 
     350              : /**
     351              :  * Test 4: Normal case, request a endpoint info with signature within session
     352              :  * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code, correct endpoint_info
     353              :  *                    and an empty session_transcript.message_encap_e
     354              :  **/
     355            1 : static void rsp_encap_get_endpoint_info_case4(void **state)
     356              : {
     357              :     libspdm_return_t status;
     358              :     libspdm_test_context_t *spdm_test_context;
     359              :     libspdm_context_t *spdm_context;
     360              :     spdm_endpoint_info_response_t *spdm_response;
     361              :     uint8_t temp_buf[LIBSPDM_SENDER_BUFFER_SIZE];
     362              :     bool need_continue;
     363              :     uint8_t *ptr;
     364              :     size_t sig_size;
     365              :     size_t response_size;
     366              :     uint32_t endpoint_info_size;
     367              :     void *data;
     368              :     size_t data_size;
     369              :     uint32_t session_id;
     370              :     libspdm_session_info_t *session_info;
     371              : 
     372            1 :     spdm_test_context = *state;
     373            1 :     spdm_test_context->case_id = 0x4;
     374            1 :     spdm_context = spdm_test_context->spdm_context;
     375            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     376              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     377            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     378            1 :     spdm_context->connection_info.capability.flags = 0;
     379            1 :     spdm_context->connection_info.capability.flags |=
     380              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_EP_INFO_CAP_SIG;
     381            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     382            1 :     spdm_context->connection_info.algorithm.req_base_asym_alg = m_libspdm_use_req_asym_algo;
     383            1 :     spdm_context->get_endpoint_info_callback = get_endpoint_info_callback;
     384              : 
     385            1 :     libspdm_read_requester_public_certificate_chain(m_libspdm_use_hash_algo,
     386              :                                                     m_libspdm_use_req_asym_algo, &data,
     387              :                                                     &data_size, NULL, NULL);
     388              : 
     389            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
     390            1 :     spdm_context->connection_info.capability.flags |=
     391              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
     392            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
     393              : 
     394            1 :     spdm_context->local_context.capability.flags = 0;
     395            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
     396            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
     397            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
     398            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
     399            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
     400              : 
     401            1 :     session_id = 0xFFFFFFFF;
     402            1 :     session_info = &spdm_context->session_info[0];
     403            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
     404              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     405            1 :     libspdm_secured_message_set_session_state(
     406              :         session_info->secured_message_context,
     407              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
     408              : 
     409            1 :     libspdm_reset_message_a(spdm_context);
     410            1 :     libspdm_reset_message_encap_e(spdm_context, session_info);
     411              : 
     412            3 :     for (uint32_t index = 0; index < 2; index++) {
     413              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     414              :         spdm_context->connection_info.peer_used_cert_chain[index].buffer_size = data_size;
     415              :         libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[index].buffer,
     416              :                          sizeof(spdm_context->connection_info.peer_used_cert_chain[index].buffer),
     417              :                          data, data_size);
     418              : #else
     419            2 :         libspdm_hash_all(
     420              :             spdm_context->connection_info.algorithm.base_hash_algo,
     421              :             data, data_size,
     422            2 :             spdm_context->connection_info.peer_used_cert_chain[index].buffer_hash);
     423            2 :         spdm_context->connection_info.peer_used_cert_chain[index].buffer_hash_size =
     424            2 :             libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
     425            2 :         libspdm_get_leaf_cert_public_key_from_cert_chain(
     426              :             spdm_context->connection_info.algorithm.base_hash_algo,
     427            2 :             spdm_context->connection_info.algorithm.req_base_asym_alg,
     428              :             data, data_size,
     429              :             &spdm_context->connection_info.peer_used_cert_chain[index].leaf_cert_public_key);
     430              : #endif
     431              :     }
     432              : 
     433            1 :     spdm_context->encap_context.req_slot_id = 0;
     434            1 :     endpoint_info_size = LIBSPDM_TEST_ENDPOINT_INFO_BUFFER_SIZE;
     435            1 :     libspdm_generate_device_endpoint_info(
     436              :         spdm_context, SPDM_GET_ENDPOINT_INFO_REQUEST_SUBCODE_DEVICE_CLASS_IDENTIFIER,
     437              :         SPDM_GET_ENDPOINT_INFO_REQUEST_ATTRIBUTE_SIGNATURE_REQUESTED,
     438              :         &endpoint_info_size, m_endpoint_info_buffer_receive);
     439            1 :     sig_size = libspdm_get_asym_signature_size(m_libspdm_use_req_asym_algo);
     440              : 
     441            1 :     response_size = sizeof(spdm_endpoint_info_response_t) +
     442              :                     SPDM_NONCE_SIZE + sizeof(uint32_t) +
     443            1 :                     endpoint_info_size + sig_size;
     444              : 
     445            1 :     spdm_response = (void *)temp_buf;
     446            1 :     spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     447            1 :     spdm_response->header.request_response_code = SPDM_ENDPOINT_INFO;
     448            1 :     spdm_response->header.param1 = 0;
     449            1 :     spdm_response->header.param2 = spdm_context->encap_context.req_slot_id &
     450              :                                    SPDM_ENDPOINT_INFO_RESPONSE_SLOT_ID_MASK;
     451            1 :     spdm_response->reserved = 0;
     452              : 
     453            1 :     ptr = (void *)(spdm_response + 1);
     454            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE, ptr);
     455            1 :     ptr += SPDM_NONCE_SIZE;
     456              : 
     457            1 :     *(uint32_t *)ptr = endpoint_info_size; /* ep_info_len */
     458            1 :     ptr += sizeof(uint32_t);
     459              : 
     460            1 :     libspdm_copy_mem(ptr, endpoint_info_size, m_endpoint_info_buffer_receive, endpoint_info_size);
     461            1 :     ptr += endpoint_info_size;
     462              : 
     463            1 :     libspdm_requester_data_sign(
     464              :         spdm_context,
     465            1 :         spdm_response->header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     466              :             0, SPDM_ENDPOINT_INFO,
     467              :             m_libspdm_use_req_asym_algo, m_libspdm_use_req_pqc_asym_algo, m_libspdm_use_hash_algo,
     468              :             false, (uint8_t*)spdm_response, response_size - sig_size,
     469              :             ptr, &sig_size);
     470              : 
     471            1 :     status = libspdm_process_encap_response_endpoint_info(spdm_context, response_size,
     472              :                                                           spdm_response, &need_continue);
     473            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     474           13 :     for (uint32_t index = 0; index < endpoint_info_size; index++) {
     475           12 :         assert_int_equal (m_endpoint_info_buffer_receive[index],
     476              :                           m_endpoint_info_buffer_send[index]);
     477              :     }
     478              :     /* Completion of GET_ENDPOINT_INFO sets mut IL1/IL2 to null. */
     479              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     480              :     assert_int_equal(session_info->session_transcript.message_encap_e.buffer_size, 0);
     481              : #else
     482            1 :     assert_null(session_info->session_transcript.digest_context_encap_il1il2);
     483              : #endif
     484            1 : }
     485              : 
     486            1 : int libspdm_rsp_encap_get_endpoint_info_test(void)
     487              : {
     488            1 :     const struct CMUnitTest test_cases[] = {
     489              :         /* Success requeset endpoint info with signature */
     490              :         cmocka_unit_test(rsp_encap_get_endpoint_info_case1),
     491              :         /* Success requeset endpoint info with signature, req_slot_id = 0xFF */
     492              :         cmocka_unit_test(rsp_encap_get_endpoint_info_case2),
     493              :         /* Success requeset endpoint info without signature */
     494              :         cmocka_unit_test(rsp_encap_get_endpoint_info_case3),
     495              :         /* Success requeset endpoint info with signature in a session */
     496              :         cmocka_unit_test(rsp_encap_get_endpoint_info_case4),
     497              :     };
     498              : 
     499            1 :     libspdm_test_context_t test_context = {
     500              :         LIBSPDM_TEST_CONTEXT_VERSION,
     501              :         false,
     502              :     };
     503              : 
     504            1 :     libspdm_setup_test_context(&test_context);
     505              : 
     506            1 :     return cmocka_run_group_tests(test_cases,
     507              :                                   libspdm_unit_test_group_setup,
     508              :                                   libspdm_unit_test_group_teardown);
     509              : }
     510              : 
     511              : #endif /* (LIBSPDM_ENABLE_CAPABILITY_ENCAP_CAP) && (...) */
        

Generated by: LCOV version 2.0-1