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: 2025-06-29 08:09:00 Functions: 100.0 % 6 6

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

Generated by: LCOV version 2.0-1