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

Generated by: LCOV version 2.0-1