LCOV - code coverage report
Current view: top level - unit_test/test_spdm_common - context_data.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 96.1 % 693 666
Test Date: 2026-06-14 09:11:02 Functions: 100.0 % 28 28

            Line data    Source code
       1              : /**
       2              :  *  Copyright Notice:
       3              :  *  Copyright 2021-2026 DMTF. All rights reserved.
       4              :  *  License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
       5              :  **/
       6              : 
       7              : #include "spdm_unit_test.h"
       8              : #include "internal/libspdm_requester_lib.h"
       9              : #include "internal/libspdm_responder_lib.h"
      10              : #include "internal/libspdm_secured_message_lib.h"
      11              : 
      12              : libspdm_return_t spdm_device_acquire_sender_buffer (
      13              :     void *context, void **msg_buf_ptr);
      14              : 
      15              : void spdm_device_release_sender_buffer (void *context, const void *msg_buf_ptr);
      16              : 
      17              : libspdm_return_t spdm_device_acquire_receiver_buffer (
      18              :     void *context, void **msg_buf_ptr);
      19              : 
      20              : void spdm_device_release_receiver_buffer (void *context, const void *msg_buf_ptr);
      21              : 
      22              : static uint32_t libspdm_opaque_data = 0xDEADBEEF;
      23              : 
      24              : /**
      25              :  * This function verifies peer certificate chain buffer including spdm_cert_chain_t header.
      26              :  *
      27              :  * @param  spdm_context            A pointer to the SPDM context.
      28              :  * @param  cert_chain_buffer       Certificate chain buffer including spdm_cert_chain_t header.
      29              :  * @param  cert_chain_buffer_size  Size in bytes of the certificate chain buffer.
      30              :  * @param  trust_anchor            A buffer to hold the trust_anchor which is used to validate the
      31              :  *                                 peer certificate, if not NULL.
      32              :  * @param  trust_anchor_size       A buffer to hold the trust_anchor_size, if not NULL.
      33              :  *
      34              :  * @retval true  Peer certificate chain buffer verification passed.
      35              :  * @retval false Peer certificate chain buffer verification failed.
      36              :  **/
      37            9 : static bool libspdm_verify_peer_cert_chain_buffer(void *spdm_context,
      38              :                                                   const void *cert_chain_buffer,
      39              :                                                   size_t cert_chain_buffer_size,
      40              :                                                   const void **trust_anchor,
      41              :                                                   size_t *trust_anchor_size)
      42              : {
      43              :     bool result;
      44              : 
      45              :     /*verify peer cert chain integrity*/
      46            9 :     result = libspdm_verify_peer_cert_chain_buffer_integrity(spdm_context, cert_chain_buffer,
      47              :                                                              cert_chain_buffer_size);
      48            9 :     if (!result) {
      49            0 :         return false;
      50              :     }
      51              : 
      52              :     /*verify peer cert chain authority*/
      53            9 :     result = libspdm_verify_peer_cert_chain_buffer_authority(spdm_context, cert_chain_buffer,
      54              :                                                              cert_chain_buffer_size, trust_anchor,
      55              :                                                              trust_anchor_size);
      56            9 :     if (!result) {
      57            3 :         return false;
      58              :     }
      59              : 
      60            6 :     return true;
      61              : }
      62              : 
      63              : /**
      64              :  * Return the size in bytes of multi element opaque data supported version.
      65              :  *
      66              :  * @param  version_count                 Secure version count.
      67              :  *
      68              :  * @return the size in bytes of opaque data supported version.
      69              :  **/
      70           38 : size_t libspdm_get_multi_element_opaque_data_supported_version_data_size(
      71              :     libspdm_context_t *spdm_context, uint8_t version_count, uint8_t element_num)
      72              : {
      73              :     size_t size;
      74              :     uint8_t element_index;
      75              : 
      76           38 :     if (libspdm_get_connection_version (spdm_context) >= SPDM_MESSAGE_VERSION_12) {
      77           19 :         size = sizeof(spdm_general_opaque_data_table_header_t);
      78           64 :         for (element_index = 0; element_index < element_num; element_index++) {
      79           45 :             size += sizeof(secured_message_opaque_element_table_header_t) +
      80              :                     sizeof(secured_message_opaque_element_supported_version_t) +
      81           45 :                     sizeof(spdm_version_number_t) * version_count;
      82              :             /* Add Padding*/
      83           45 :             size = (size + 3) & ~3;
      84              :         }
      85              :     } else {
      86           19 :         size = sizeof(secured_message_general_opaque_data_table_header_t);
      87           64 :         for (element_index = 0; element_index < element_num; element_index++) {
      88           45 :             size += sizeof(secured_message_opaque_element_table_header_t) +
      89              :                     sizeof(secured_message_opaque_element_supported_version_t) +
      90           45 :                     sizeof(spdm_version_number_t) * version_count;
      91              :             /* Add Padding*/
      92           45 :             size = (size + 3) & ~3;
      93              :         }
      94              :     }
      95              : 
      96           38 :     return size;
      97              : }
      98              : 
      99              : /**
     100              :  * Build opaque data supported version test.
     101              :  *
     102              :  * @param  data_out_size[in]                 size in bytes of the data_out.
     103              :  *                                           On input, it means the size in bytes of data_out buffer.
     104              :  *                                           On output, it means the size in bytes of copied data_out buffer if LIBSPDM_STATUS_SUCCESS is returned,
     105              :  *                                           and means the size in bytes of desired data_out buffer if RETURN_BUFFER_TOO_SMALL is returned.
     106              :  * @param  data_out[in]                      A pointer to the destination buffer to store the opaque data supported version.
     107              :  * @param  element_num[in]                   in this test function, the element number < 9 is right. because element id is changed with element_index
     108              :  **/
     109              : libspdm_return_t
     110            4 : libspdm_build_multi_element_opaque_data_supported_version_test(libspdm_context_t *spdm_context,
     111              :                                                                size_t *data_out_size,
     112              :                                                                void *data_out,
     113              :                                                                uint8_t element_num)
     114              : {
     115              :     size_t final_data_size;
     116              :     secured_message_general_opaque_data_table_header_t
     117              :     *general_opaque_data_table_header;
     118              :     spdm_general_opaque_data_table_header_t
     119              :     *spdm_general_opaque_data_table_header;
     120              :     secured_message_opaque_element_table_header_t
     121              :     *opaque_element_table_header;
     122              :     secured_message_opaque_element_supported_version_t
     123              :     *opaque_element_support_version;
     124              :     spdm_version_number_t *versions_list;
     125              :     void *end;
     126              :     uint8_t element_index;
     127              : 
     128            4 :     if (spdm_context->local_context.secured_message_version.secured_message_version_count == 0) {
     129            0 :         *data_out_size = 0;
     130            0 :         return LIBSPDM_STATUS_SUCCESS;
     131              :     }
     132              : 
     133              :     final_data_size =
     134            4 :         libspdm_get_multi_element_opaque_data_supported_version_data_size(
     135              :             spdm_context,
     136            4 :             spdm_context->local_context.secured_message_version.secured_message_version_count,
     137              :             element_num);
     138            4 :     if (*data_out_size < final_data_size) {
     139            0 :         *data_out_size = final_data_size;
     140            0 :         return LIBSPDM_STATUS_BUFFER_TOO_SMALL;
     141              :     }
     142              : 
     143            4 :     if (libspdm_get_connection_version (spdm_context) >= SPDM_MESSAGE_VERSION_12) {
     144            2 :         spdm_general_opaque_data_table_header = data_out;
     145            2 :         spdm_general_opaque_data_table_header->total_elements = element_num;
     146            2 :         libspdm_write_uint24(spdm_general_opaque_data_table_header->reserved, 0);
     147            2 :         opaque_element_table_header =
     148              :             (void *)(spdm_general_opaque_data_table_header + 1);
     149              :     } else {
     150            2 :         general_opaque_data_table_header = data_out;
     151            2 :         general_opaque_data_table_header->spec_id =
     152              :             SECURED_MESSAGE_OPAQUE_DATA_SPEC_ID;
     153            2 :         general_opaque_data_table_header->opaque_version =
     154              :             SECURED_MESSAGE_OPAQUE_VERSION;
     155            2 :         general_opaque_data_table_header->total_elements = element_num;
     156            2 :         general_opaque_data_table_header->reserved = 0;
     157            2 :         opaque_element_table_header =
     158              :             (void *)(general_opaque_data_table_header + 1);
     159              :     }
     160              : 
     161           34 :     for (element_index = 0; element_index < element_num; element_index++) {
     162              :         /*id is changed with element_index*/
     163           30 :         opaque_element_table_header->id = element_index;
     164           30 :         opaque_element_table_header->vendor_len = 0;
     165           30 :         opaque_element_table_header->opaque_element_data_len =
     166           30 :             sizeof(secured_message_opaque_element_supported_version_t) +
     167           30 :             sizeof(spdm_version_number_t) *
     168           30 :             spdm_context->local_context.secured_message_version.secured_message_version_count;
     169              : 
     170           30 :         opaque_element_support_version =
     171              :             (void *)(opaque_element_table_header + 1);
     172           30 :         opaque_element_support_version->sm_data_version =
     173              :             SECURED_MESSAGE_OPAQUE_ELEMENT_SMDATA_DATA_VERSION;
     174           30 :         opaque_element_support_version->sm_data_id =
     175              :             SECURED_MESSAGE_OPAQUE_ELEMENT_SMDATA_ID_SUPPORTED_VERSION;
     176           30 :         opaque_element_support_version->version_count =
     177           30 :             spdm_context->local_context.secured_message_version.secured_message_version_count;
     178              : 
     179           30 :         versions_list = (void *)(opaque_element_support_version + 1);
     180              : 
     181           30 :         libspdm_copy_mem(versions_list,
     182           30 :                          *data_out_size - ((uint8_t*)versions_list - (uint8_t*)data_out),
     183           30 :                          spdm_context->local_context.secured_message_version.secured_message_version,
     184           30 :                          spdm_context->local_context.secured_message_version.secured_message_version_count *
     185              :                          sizeof(spdm_version_number_t));
     186              : 
     187              :         /*move to next element*/
     188           30 :         if (libspdm_get_connection_version (spdm_context) >= SPDM_MESSAGE_VERSION_12) {
     189           15 :             opaque_element_table_header =
     190              :                 (secured_message_opaque_element_table_header_t *)(
     191              :                     (uint8_t *)opaque_element_table_header +
     192           15 :                     libspdm_get_multi_element_opaque_data_supported_version_data_size(
     193              :                         spdm_context,
     194           15 :                         spdm_context->local_context.secured_message_version.secured_message_version_count,
     195           15 :                         1) -
     196              :                     sizeof(spdm_general_opaque_data_table_header_t));
     197              :         } else {
     198           15 :             opaque_element_table_header =
     199              :                 (secured_message_opaque_element_table_header_t *)(
     200              :                     (uint8_t *)opaque_element_table_header +
     201           15 :                     libspdm_get_multi_element_opaque_data_supported_version_data_size(
     202              :                         spdm_context,
     203           15 :                         spdm_context->local_context.secured_message_version.secured_message_version_count,
     204           15 :                         1) -
     205              :                     sizeof(secured_message_general_opaque_data_table_header_t));
     206              :         }
     207              : 
     208              :         /* Zero Padding. *data_out_size does not need to be changed, because data is 0 padded */
     209           30 :         end = versions_list +
     210           30 :               spdm_context->local_context.secured_message_version.secured_message_version_count;
     211           30 :         libspdm_zero_mem(end, (size_t)data_out + final_data_size - (size_t)end);
     212              :     }
     213              : 
     214            4 :     LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO,
     215              :                    "successful build multi element opaque data supported version! \n"));
     216            4 :     return LIBSPDM_STATUS_SUCCESS;
     217              : }
     218              : 
     219              : /**
     220              :  * Return the size in bytes of multi element opaque data selection version.
     221              :  *
     222              :  * @param  version_count                 Secure version count.
     223              :  *
     224              :  * @return the size in bytes of opaque data selection version.
     225              :  **/
     226            8 : size_t libspdm_get_multi_element_opaque_data_version_selection_data_size(
     227              :     const libspdm_context_t *spdm_context, uint8_t element_num)
     228              : {
     229              :     size_t size;
     230              :     uint8_t element_index;
     231              : 
     232            8 :     if (spdm_context->local_context.secured_message_version.secured_message_version_count == 0) {
     233            0 :         return 0;
     234              :     }
     235              : 
     236            8 :     if (libspdm_get_connection_version (spdm_context) >= SPDM_MESSAGE_VERSION_12) {
     237            4 :         size = sizeof(spdm_general_opaque_data_table_header_t);
     238           34 :         for (element_index = 0; element_index < element_num; element_index++) {
     239           30 :             size += sizeof(secured_message_opaque_element_table_header_t) +
     240              :                     sizeof(secured_message_opaque_element_version_selection_t);
     241              :             /* Add Padding*/
     242           30 :             size = (size + 3) & ~3;
     243              :         }
     244              :     } else {
     245            4 :         size = sizeof(secured_message_general_opaque_data_table_header_t);
     246           34 :         for (element_index = 0; element_index < element_num; element_index++) {
     247           30 :             size += sizeof(secured_message_opaque_element_table_header_t) +
     248              :                     sizeof(secured_message_opaque_element_version_selection_t);
     249              :             /* Add Padding*/
     250           30 :             size = (size + 3) & ~3;
     251              :         }
     252              :     }
     253              : 
     254            8 :     return size;
     255              : }
     256              : 
     257            4 : static libspdm_return_t libspdm_build_opaque_data_version_selection_data_test(
     258              :     const libspdm_context_t *spdm_context, spdm_version_number_t secured_message_version,
     259              :     size_t *data_out_size, void *data_out, uint8_t element_num)
     260              : {
     261              :     size_t final_data_size;
     262              :     secured_message_general_opaque_data_table_header_t
     263              :     *general_opaque_data_table_header;
     264              :     spdm_general_opaque_data_table_header_t
     265              :     *spdm_general_opaque_data_table_header;
     266              :     secured_message_opaque_element_table_header_t
     267              :     *opaque_element_table_header;
     268              :     secured_message_opaque_element_version_selection_t
     269              :     *opaque_element_version_section;
     270              :     void *end;
     271              :     uint8_t element_index;
     272              :     size_t current_element_len;
     273              : 
     274            4 :     if (spdm_context->local_context.secured_message_version.secured_message_version_count == 0) {
     275            0 :         *data_out_size = 0;
     276            0 :         return LIBSPDM_STATUS_SUCCESS;
     277              :     }
     278              : 
     279            4 :     final_data_size = libspdm_get_multi_element_opaque_data_version_selection_data_size(
     280              :         spdm_context, element_num);
     281              : 
     282            4 :     if (*data_out_size < final_data_size) {
     283            0 :         *data_out_size = final_data_size;
     284            0 :         return LIBSPDM_STATUS_BUFFER_TOO_SMALL;
     285              :     }
     286              : 
     287            4 :     if (libspdm_get_connection_version (spdm_context) >= SPDM_MESSAGE_VERSION_12) {
     288            2 :         spdm_general_opaque_data_table_header = data_out;
     289            2 :         spdm_general_opaque_data_table_header->total_elements = element_num;
     290            2 :         libspdm_write_uint24(spdm_general_opaque_data_table_header->reserved, 0);
     291              : 
     292            2 :         opaque_element_table_header = (void *)(spdm_general_opaque_data_table_header + 1);
     293              :     } else {
     294            2 :         general_opaque_data_table_header = data_out;
     295            2 :         general_opaque_data_table_header->spec_id = SECURED_MESSAGE_OPAQUE_DATA_SPEC_ID;
     296            2 :         general_opaque_data_table_header->opaque_version = SECURED_MESSAGE_OPAQUE_VERSION;
     297            2 :         general_opaque_data_table_header->total_elements = element_num;
     298            2 :         general_opaque_data_table_header->reserved = 0;
     299              : 
     300            2 :         opaque_element_table_header = (void *)(general_opaque_data_table_header + 1);
     301              :     }
     302              : 
     303           34 :     for (element_index = 0; element_index < element_num; element_index++) {
     304              :         /*id is changed with element_index*/
     305           30 :         opaque_element_table_header->id = element_index;
     306           30 :         opaque_element_table_header->vendor_len = 0;
     307           30 :         opaque_element_table_header->opaque_element_data_len =
     308              :             sizeof(secured_message_opaque_element_version_selection_t);
     309              : 
     310           30 :         opaque_element_version_section = (void *)(opaque_element_table_header + 1);
     311           30 :         opaque_element_version_section->sm_data_version =
     312              :             SECURED_MESSAGE_OPAQUE_ELEMENT_SMDATA_DATA_VERSION;
     313           30 :         opaque_element_version_section->sm_data_id =
     314              :             SECURED_MESSAGE_OPAQUE_ELEMENT_SMDATA_ID_VERSION_SELECTION;
     315           30 :         opaque_element_version_section->selected_version = secured_message_version;
     316              : 
     317              :         /*move to next element*/
     318           30 :         current_element_len = sizeof(secured_message_opaque_element_table_header_t) +
     319           30 :                               opaque_element_table_header->opaque_element_data_len;
     320              :         /* Add Padding*/
     321           30 :         current_element_len = (current_element_len + 3) & ~3;
     322              : 
     323           30 :         opaque_element_table_header =
     324              :             (secured_message_opaque_element_table_header_t *)(
     325              :                 (uint8_t *)opaque_element_table_header + current_element_len);
     326              :     }
     327              : 
     328              :     /* Zero Padding*/
     329            4 :     end = opaque_element_version_section + 1;
     330            4 :     libspdm_zero_mem(end, (size_t)data_out + final_data_size - (size_t)end);
     331              : 
     332            4 :     LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO,
     333              :                    "successful build multi element opaque data selection version! \n"));
     334              : 
     335            4 :     return LIBSPDM_STATUS_SUCCESS;
     336              : }
     337              : 
     338              : 
     339              : /**
     340              :  * Test 1: Basic test - tests happy path of setting and getting opaque data from
     341              :  * context successfully.
     342              :  **/
     343            1 : static void libspdm_test_common_context_data_case1(void **state)
     344              : {
     345              :     libspdm_return_t status;
     346              :     libspdm_test_context_t *spdm_test_context;
     347              :     libspdm_context_t *spdm_context;
     348            1 :     void *data = (void *)&libspdm_opaque_data;
     349            1 :     void *return_data = NULL;
     350            1 :     size_t data_return_size = 0;
     351              : 
     352            1 :     spdm_test_context = *state;
     353            1 :     spdm_context = spdm_test_context->spdm_context;
     354            1 :     spdm_test_context->case_id = 0x1;
     355              : 
     356            1 :     status = libspdm_set_data(spdm_context, LIBSPDM_DATA_APP_CONTEXT_DATA,
     357              :                               NULL, &data, sizeof(data));
     358            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     359              : 
     360            1 :     data_return_size = sizeof(return_data);
     361            1 :     status = libspdm_get_data(spdm_context, LIBSPDM_DATA_APP_CONTEXT_DATA,
     362              :                               NULL, &return_data, &data_return_size);
     363            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     364              : 
     365            1 :     assert_memory_equal(data, return_data, sizeof(data));
     366            1 :     assert_int_equal(data_return_size, sizeof(void*));
     367              : 
     368              :     /* check that nothing changed at the data location */
     369            1 :     assert_int_equal(libspdm_opaque_data, 0xDEADBEEF);
     370            1 : }
     371              : 
     372              : /**
     373              :  * Test 2: Test failure paths of setting opaque data in context. libspdm_set_data
     374              :  * should fail when an invalid size is passed.
     375              :  **/
     376            1 : static void libspdm_test_common_context_data_case2(void **state)
     377              : {
     378              :     libspdm_return_t status;
     379              :     libspdm_test_context_t *spdm_test_context;
     380              :     libspdm_context_t *spdm_context;
     381            1 :     void *data = (void *)&libspdm_opaque_data;
     382            1 :     void *return_data = NULL;
     383            1 :     void *current_return_data = NULL;
     384            1 :     size_t data_return_size = 0;
     385              : 
     386            1 :     spdm_test_context = *state;
     387            1 :     spdm_context = spdm_test_context->spdm_context;
     388            1 :     spdm_test_context->case_id = 0x2;
     389              : 
     390              :     /**
     391              :      * Get current opaque data in context. May have been set in previous
     392              :      * tests. This will be used to compare later to ensure the value hasn't
     393              :      * changed after a failed set data.
     394              :      */
     395            1 :     data_return_size = sizeof(current_return_data);
     396            1 :     status = libspdm_get_data(spdm_context, LIBSPDM_DATA_APP_CONTEXT_DATA,
     397              :                               NULL, &current_return_data, &data_return_size);
     398            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     399            1 :     assert_int_equal(data_return_size, sizeof(void*));
     400              : 
     401              :     /* Ensure nothing has changed between subsequent calls to get data */
     402            1 :     assert_ptr_equal(current_return_data, &libspdm_opaque_data);
     403              : 
     404              :     /*
     405              :      * Set data with invalid size, it should fail. Read back to ensure that
     406              :      * no data was set.
     407              :      */
     408            1 :     status = libspdm_set_data(spdm_context, LIBSPDM_DATA_APP_CONTEXT_DATA,
     409              :                               NULL, &data, 500);
     410            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_PARAMETER);
     411              : 
     412            1 :     data_return_size = sizeof(return_data);
     413            1 :     status = libspdm_get_data(spdm_context, LIBSPDM_DATA_APP_CONTEXT_DATA,
     414              :                               NULL, &return_data, &data_return_size);
     415            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     416            1 :     assert_ptr_equal(return_data, current_return_data);
     417            1 :     assert_int_equal(data_return_size, sizeof(void*));
     418              : 
     419              :     /* check that nothing changed at the data location */
     420            1 :     assert_int_equal(libspdm_opaque_data, 0xDEADBEEF);
     421            1 : }
     422              : 
     423              : /**
     424              :  * Test 3: Test failure paths of setting opaque data in context. libspdm_set_data
     425              :  * should fail when data contains NULL value.
     426              :  **/
     427            1 : static void libspdm_test_common_context_data_case3(void **state)
     428              : {
     429              :     libspdm_return_t status;
     430              :     libspdm_test_context_t *spdm_test_context;
     431              :     libspdm_context_t *spdm_context;
     432            1 :     void *data = NULL;
     433            1 :     void *return_data = NULL;
     434            1 :     void *current_return_data = NULL;
     435            1 :     size_t data_return_size = 0;
     436              : 
     437            1 :     spdm_test_context = *state;
     438            1 :     spdm_context = spdm_test_context->spdm_context;
     439            1 :     spdm_test_context->case_id = 0x3;
     440              : 
     441              :     /**
     442              :      * Get current opaque data in context. May have been set in previous
     443              :      * tests. This will be used to compare later to ensure the value hasn't
     444              :      * changed after a failed set data.
     445              :      */
     446            1 :     data_return_size = sizeof(current_return_data);
     447            1 :     status = libspdm_get_data(spdm_context, LIBSPDM_DATA_APP_CONTEXT_DATA,
     448              :                               NULL, &current_return_data, &data_return_size);
     449            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     450            1 :     assert_int_equal(data_return_size, sizeof(void*));
     451              : 
     452              :     /* Ensure nothing has changed between subsequent calls to get data */
     453            1 :     assert_ptr_equal(current_return_data, &libspdm_opaque_data);
     454              : 
     455              : 
     456              :     /*
     457              :      * Set data with NULL data, it should fail. Read back to ensure that
     458              :      * no data was set.
     459              :      */
     460            1 :     status = libspdm_set_data(spdm_context, LIBSPDM_DATA_APP_CONTEXT_DATA,
     461              :                               NULL, &data, sizeof(void *));
     462            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_PARAMETER);
     463              : 
     464            1 :     data_return_size = sizeof(return_data);
     465            1 :     status = libspdm_get_data(spdm_context, LIBSPDM_DATA_APP_CONTEXT_DATA,
     466              :                               NULL, &return_data, &data_return_size);
     467            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     468            1 :     assert_ptr_equal(return_data, current_return_data);
     469            1 :     assert_int_equal(data_return_size, sizeof(void*));
     470              : 
     471              :     /* check that nothing changed at the data location */
     472            1 :     assert_int_equal(libspdm_opaque_data, 0xDEADBEEF);
     473              : 
     474            1 : }
     475              : 
     476              : /**
     477              :  * Test 4: Test failure paths of getting opaque data in context. libspdm_get_data
     478              :  * should fail when the size of buffer to get is too small.
     479              :  **/
     480            1 : static void libspdm_test_common_context_data_case4(void **state)
     481              : {
     482              :     libspdm_return_t status;
     483              :     libspdm_test_context_t *spdm_test_context;
     484              :     libspdm_context_t *spdm_context;
     485            1 :     void *data = (void *)&libspdm_opaque_data;
     486            1 :     void *return_data = NULL;
     487            1 :     size_t data_return_size = 0;
     488              : 
     489            1 :     spdm_test_context = *state;
     490            1 :     spdm_context = spdm_test_context->spdm_context;
     491            1 :     spdm_test_context->case_id = 0x4;
     492              : 
     493              :     /*
     494              :      * Set data successfully.
     495              :      */
     496            1 :     status = libspdm_set_data(spdm_context, LIBSPDM_DATA_APP_CONTEXT_DATA,
     497              :                               NULL, &data, sizeof(void *));
     498            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     499              : 
     500              :     /*
     501              :      * Fail get data due to insufficient buffer for return value. returned
     502              :      * data size must return required buffer size.
     503              :      */
     504            1 :     data_return_size = sizeof(void*) - 1;
     505            1 :     status = libspdm_get_data(spdm_context, LIBSPDM_DATA_APP_CONTEXT_DATA,
     506              :                               NULL, &return_data, &data_return_size);
     507            1 :     assert_int_equal(status, LIBSPDM_STATUS_BUFFER_TOO_SMALL);
     508            1 :     assert_int_equal(data_return_size, sizeof(void*));
     509              : 
     510              :     /* check that nothing changed at the data location */
     511            1 :     assert_int_equal(libspdm_opaque_data, 0xDEADBEEF);
     512            1 : }
     513              : 
     514              : /**
     515              :  * Test 5: There is no root cert.
     516              :  * Expected Behavior: Return true result.
     517              :  **/
     518            1 : void libspdm_test_verify_peer_cert_chain_buffer_case5(void **state)
     519              : {
     520              :     libspdm_test_context_t *spdm_test_context;
     521              :     libspdm_context_t *spdm_context;
     522              :     void *data;
     523              :     size_t data_size;
     524              :     void *hash;
     525              :     size_t hash_size;
     526              :     const uint8_t *root_cert;
     527              :     size_t root_cert_size;
     528              : 
     529              :     const void *trust_anchor;
     530              :     size_t trust_anchor_size;
     531              :     bool result;
     532              :     uint8_t root_cert_index;
     533              : 
     534            1 :     spdm_test_context = *state;
     535            1 :     spdm_context = spdm_test_context->spdm_context;
     536            1 :     spdm_test_context->case_id = 0x5;
     537              :     /* Setting SPDM context as the first steps of the protocol has been accomplished*/
     538            1 :     spdm_context->connection_info.connection_state =
     539              :         LIBSPDM_CONNECTION_STATE_AFTER_DIGESTS;
     540            1 :     spdm_context->connection_info.capability.flags |=
     541              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
     542              :     /* Loading Root certificate and saving its hash*/
     543            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     544              :                                                          m_libspdm_use_asym_algo, &data,
     545              :                                                          &data_size, &hash, &hash_size)) {
     546            0 :         assert(false);
     547              :     }
     548            1 :     if (!libspdm_x509_get_cert_from_cert_chain(
     549            1 :             (uint8_t *)data + sizeof(spdm_cert_chain_t) + hash_size,
     550            1 :             data_size - sizeof(spdm_cert_chain_t) - hash_size, 0, &root_cert, &root_cert_size)) {
     551            0 :         assert(false);
     552              :     }
     553              : 
     554            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     555            1 :     spdm_context->connection_info.algorithm.base_asym_algo= m_libspdm_use_asym_algo;
     556            1 :     spdm_context->local_context.is_requester = true;
     557              : 
     558              :     /*clear root cert array*/
     559           11 :     for (root_cert_index = 0; root_cert_index < LIBSPDM_MAX_ROOT_CERT_SUPPORT; root_cert_index++) {
     560           10 :         spdm_context->local_context.peer_root_cert_provision_size[root_cert_index] = 0;
     561           10 :         spdm_context->local_context.peer_root_cert_provision[root_cert_index] = NULL;
     562              :     }
     563            1 :     result = libspdm_verify_peer_cert_chain_buffer(spdm_context, data, data_size, &trust_anchor,
     564              :                                                    &trust_anchor_size);
     565            1 :     assert_int_equal (result, true);
     566              : 
     567            1 :     free(data);
     568            1 : }
     569              : 
     570              : /**
     571              :  * Test 6: There is one root cert. And the root cert has two case: match root cert, mismatch root cert.
     572              :  *
     573              :  * case                                              Expected Behavior
     574              :  * there is one match root cert;                     return false
     575              :  * there is one mismatch root cert;                  return true, and the return trust_anchor is root cert.
     576              :  **/
     577            1 : void libspdm_test_verify_peer_cert_chain_buffer_case6(void **state)
     578              : {
     579              :     libspdm_test_context_t *spdm_test_context;
     580              :     libspdm_context_t *spdm_context;
     581              :     void *data;
     582              :     size_t data_size;
     583              :     void *hash;
     584              :     size_t hash_size;
     585              :     const uint8_t *root_cert;
     586              :     size_t root_cert_size;
     587              : 
     588              :     void *data_test;
     589              :     size_t data_size_test;
     590              :     void *hash_test;
     591              :     size_t hash_size_test;
     592              :     const uint8_t *root_cert_test;
     593              :     size_t root_cert_size_test;
     594            1 :     uint32_t m_libspdm_use_asym_algo_test =SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048;
     595              : 
     596              :     const void *trust_anchor;
     597              :     size_t trust_anchor_size;
     598              :     bool result;
     599              :     uint8_t root_cert_index;
     600              : 
     601            1 :     spdm_test_context = *state;
     602            1 :     spdm_context = spdm_test_context->spdm_context;
     603            1 :     spdm_test_context->case_id = 0x6;
     604              :     /* Setting SPDM context as the first steps of the protocol has been accomplished*/
     605            1 :     spdm_context->connection_info.connection_state =
     606              :         LIBSPDM_CONNECTION_STATE_AFTER_DIGESTS;
     607            1 :     spdm_context->connection_info.capability.flags |=
     608              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
     609            1 :     spdm_context->local_context.is_requester = true;
     610              : 
     611              :     /* Loading Root certificate and saving its hash*/
     612            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     613              :                                                          m_libspdm_use_asym_algo, &data,
     614              :                                                          &data_size, &hash, &hash_size)) {
     615            0 :         assert(false);
     616              :     }
     617            1 :     if (!libspdm_x509_get_cert_from_cert_chain(
     618            1 :             (uint8_t *)data + sizeof(spdm_cert_chain_t) + hash_size,
     619            1 :             data_size - sizeof(spdm_cert_chain_t) - hash_size, 0, &root_cert, &root_cert_size)) {
     620            0 :         assert(false);
     621              :     }
     622              :     /* Loading Other test Root certificate and saving its hash*/
     623            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     624              :                                                          m_libspdm_use_asym_algo_test, &data_test,
     625              :                                                          &data_size_test, &hash_test, &hash_size_test)) {
     626            0 :         return;
     627              :     }
     628            1 :     libspdm_x509_get_cert_from_cert_chain(
     629            1 :         (uint8_t *)data_test + sizeof(spdm_cert_chain_t) + hash_size_test,
     630            1 :         data_size_test - sizeof(spdm_cert_chain_t) - hash_size_test, 0,
     631              :         &root_cert_test, &root_cert_size_test);
     632              : 
     633            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     634            1 :     spdm_context->connection_info.algorithm.base_asym_algo= m_libspdm_use_asym_algo;
     635              : 
     636              :     /*clear root cert array*/
     637           11 :     for (root_cert_index = 0; root_cert_index < LIBSPDM_MAX_ROOT_CERT_SUPPORT; root_cert_index++) {
     638           10 :         spdm_context->local_context.peer_root_cert_provision_size[root_cert_index] = 0;
     639           10 :         spdm_context->local_context.peer_root_cert_provision[root_cert_index] = NULL;
     640              :     }
     641              : 
     642              :     /*case: match root cert case*/
     643            1 :     spdm_context->local_context.peer_root_cert_provision_size[0] =root_cert_size_test;
     644            1 :     spdm_context->local_context.peer_root_cert_provision[0] = root_cert_test;
     645            1 :     result = libspdm_verify_peer_cert_chain_buffer(spdm_context, data, data_size, &trust_anchor,
     646              :                                                    &trust_anchor_size);
     647            1 :     assert_int_equal (result, false);
     648              : 
     649              :     /*case: mismatch root cert case*/
     650            1 :     spdm_context->local_context.peer_root_cert_provision_size[0] =root_cert_size;
     651            1 :     spdm_context->local_context.peer_root_cert_provision[0] = root_cert;
     652            1 :     result = libspdm_verify_peer_cert_chain_buffer(spdm_context, data, data_size, &trust_anchor,
     653              :                                                    &trust_anchor_size);
     654            1 :     assert_int_equal (result, true);
     655            1 :     assert_ptr_equal (trust_anchor, root_cert);
     656              : 
     657            1 :     free(data);
     658            1 :     free(data_test);
     659              : }
     660              : 
     661              : /**
     662              :  * Test 7: There are LIBSPDM_MAX_ROOT_CERT_SUPPORT/2 root cert.
     663              :  *
     664              :  * case                                              Expected Behavior
     665              :  * there is no match root cert;                      return false
     666              :  * there is one match root cert in the end;          return true, and the return trust_anchor is root cert.
     667              :  * there is one match root cert in the middle;       return true, and the return trust_anchor is root cert.
     668              :  **/
     669            1 : void libspdm_test_verify_peer_cert_chain_buffer_case7(void **state)
     670              : {
     671              :     libspdm_test_context_t *spdm_test_context;
     672              :     libspdm_context_t *spdm_context;
     673              :     void *data;
     674              :     size_t data_size;
     675              :     void *hash;
     676              :     size_t hash_size;
     677              :     const uint8_t *root_cert;
     678              :     size_t root_cert_size;
     679              : 
     680              :     void *data_test;
     681              :     size_t data_size_test;
     682              :     void *hash_test;
     683              :     size_t hash_size_test;
     684              :     const uint8_t *root_cert_test;
     685              :     size_t root_cert_size_test;
     686            1 :     uint32_t m_libspdm_use_asym_algo_test =SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048;
     687              : 
     688              :     const void *trust_anchor;
     689              :     size_t trust_anchor_size;
     690              :     bool result;
     691              :     uint8_t root_cert_index;
     692              : 
     693            1 :     spdm_test_context = *state;
     694            1 :     spdm_context = spdm_test_context->spdm_context;
     695            1 :     spdm_test_context->case_id = 0x7;
     696              :     /* Setting SPDM context as the first steps of the protocol has been accomplished*/
     697            1 :     spdm_context->connection_info.connection_state =
     698              :         LIBSPDM_CONNECTION_STATE_AFTER_DIGESTS;
     699            1 :     spdm_context->connection_info.capability.flags |=
     700              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
     701            1 :     spdm_context->local_context.is_requester = true;
     702              :     /* Loading Root certificate and saving its hash*/
     703            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     704              :                                                          m_libspdm_use_asym_algo, &data,
     705              :                                                          &data_size, &hash, &hash_size)) {
     706            0 :         assert(false);
     707              :     }
     708            1 :     if (!libspdm_x509_get_cert_from_cert_chain(
     709            1 :             (uint8_t *)data + sizeof(spdm_cert_chain_t) + hash_size,
     710            1 :             data_size - sizeof(spdm_cert_chain_t) - hash_size, 0, &root_cert, &root_cert_size)) {
     711            0 :         assert(false);
     712              :     }
     713              :     /* Loading Other test Root certificate and saving its hash*/
     714            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     715              :                                                          m_libspdm_use_asym_algo_test, &data_test,
     716              :                                                          &data_size_test, &hash_test, &hash_size_test)) {
     717            0 :         return;
     718              :     }
     719            1 :     libspdm_x509_get_cert_from_cert_chain(
     720            1 :         (uint8_t *)data_test + sizeof(spdm_cert_chain_t) + hash_size_test,
     721            1 :         data_size_test - sizeof(spdm_cert_chain_t) - hash_size_test, 0,
     722              :         &root_cert_test, &root_cert_size_test);
     723              : 
     724            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     725            1 :     spdm_context->connection_info.algorithm.base_asym_algo= m_libspdm_use_asym_algo;
     726              : 
     727              :     /*clear root cert array*/
     728           11 :     for (root_cert_index = 0; root_cert_index < LIBSPDM_MAX_ROOT_CERT_SUPPORT; root_cert_index++) {
     729           10 :         spdm_context->local_context.peer_root_cert_provision_size[root_cert_index] = 0;
     730           10 :         spdm_context->local_context.peer_root_cert_provision[root_cert_index] = NULL;
     731              :     }
     732              : 
     733              :     /*case: there is no match root cert*/
     734            6 :     for (root_cert_index = 0; root_cert_index < (LIBSPDM_MAX_ROOT_CERT_SUPPORT / 2);
     735            5 :          root_cert_index++) {
     736            5 :         spdm_context->local_context.peer_root_cert_provision_size[root_cert_index] =
     737              :             root_cert_size_test;
     738            5 :         spdm_context->local_context.peer_root_cert_provision[root_cert_index] = root_cert_test;
     739              :     }
     740            1 :     result = libspdm_verify_peer_cert_chain_buffer(spdm_context, data, data_size, &trust_anchor,
     741              :                                                    &trust_anchor_size);
     742            1 :     assert_int_equal (result, false);
     743              : 
     744              :     /*case: there is no match root cert in the end*/
     745              :     spdm_context->local_context.peer_root_cert_provision_size[LIBSPDM_MAX_ROOT_CERT_SUPPORT / 2 -
     746            1 :                                                               1] =root_cert_size;
     747              :     spdm_context->local_context.peer_root_cert_provision[LIBSPDM_MAX_ROOT_CERT_SUPPORT / 2 -
     748            1 :                                                          1] = root_cert;
     749            1 :     result = libspdm_verify_peer_cert_chain_buffer(spdm_context, data, data_size, &trust_anchor,
     750              :                                                    &trust_anchor_size);
     751            1 :     assert_int_equal (result, true);
     752            1 :     assert_ptr_equal (trust_anchor, root_cert);
     753              : 
     754              :     /*case: there is no match root cert in the middle*/
     755              :     spdm_context->local_context.peer_root_cert_provision_size[LIBSPDM_MAX_ROOT_CERT_SUPPORT /
     756            1 :                                                               4] =root_cert_size;
     757              :     spdm_context->local_context.peer_root_cert_provision[LIBSPDM_MAX_ROOT_CERT_SUPPORT /
     758            1 :                                                          4] = root_cert;
     759            1 :     result = libspdm_verify_peer_cert_chain_buffer(spdm_context, data, data_size, &trust_anchor,
     760              :                                                    &trust_anchor_size);
     761            1 :     assert_int_equal (result, true);
     762            1 :     assert_ptr_equal (trust_anchor, root_cert);
     763              : 
     764            1 :     free(data);
     765            1 :     free(data_test);
     766              : }
     767              : 
     768              : 
     769              : /**
     770              :  * Test 8: There are full(LIBSPDM_MAX_ROOT_CERT_SUPPORT - 1) root cert.
     771              :  *
     772              :  * case                                              Expected Behavior
     773              :  * there is no match root cert;                      return false
     774              :  * there is one match root cert in the end;          return true, and the return trust_anchor is root cert.
     775              :  * there is one match root cert in the middle;       return true, and the return trust_anchor is root cert.
     776              :  **/
     777            1 : void libspdm_test_verify_peer_cert_chain_buffer_case8(void **state)
     778              : {
     779              :     libspdm_test_context_t *spdm_test_context;
     780              :     libspdm_context_t *spdm_context;
     781              :     void *data;
     782              :     size_t data_size;
     783              :     void *hash;
     784              :     size_t hash_size;
     785              :     const uint8_t *root_cert;
     786              :     size_t root_cert_size;
     787              : 
     788              :     void *data_test;
     789              :     size_t data_size_test;
     790              :     void *hash_test;
     791              :     size_t hash_size_test;
     792              :     const uint8_t *root_cert_test;
     793              :     size_t root_cert_size_test;
     794            1 :     uint32_t m_libspdm_use_asym_algo_test =SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048;
     795              : 
     796              :     const void *trust_anchor;
     797              :     size_t trust_anchor_size;
     798              :     bool result;
     799              :     uint8_t root_cert_index;
     800              : 
     801            1 :     spdm_test_context = *state;
     802            1 :     spdm_context = spdm_test_context->spdm_context;
     803            1 :     spdm_test_context->case_id = 0x8;
     804              :     /* Setting SPDM context as the first steps of the protocol has been accomplished*/
     805            1 :     spdm_context->connection_info.connection_state =
     806              :         LIBSPDM_CONNECTION_STATE_AFTER_DIGESTS;
     807            1 :     spdm_context->connection_info.capability.flags |=
     808              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
     809            1 :     spdm_context->local_context.is_requester = true;
     810              :     /* Loading Root certificate and saving its hash*/
     811            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     812              :                                                          m_libspdm_use_asym_algo, &data,
     813              :                                                          &data_size, &hash, &hash_size)) {
     814            0 :         assert(false);
     815              :     }
     816            1 :     if (!libspdm_x509_get_cert_from_cert_chain(
     817            1 :             (uint8_t *)data + sizeof(spdm_cert_chain_t) + hash_size,
     818            1 :             data_size - sizeof(spdm_cert_chain_t) - hash_size, 0, &root_cert, &root_cert_size)) {
     819            0 :         assert(false);
     820              :     }
     821              :     /* Loading Other test Root certificate and saving its hash*/
     822            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     823              :                                                          m_libspdm_use_asym_algo_test, &data_test,
     824              :                                                          &data_size_test, &hash_test, &hash_size_test)) {
     825            0 :         return;
     826              :     }
     827            1 :     libspdm_x509_get_cert_from_cert_chain(
     828            1 :         (uint8_t *)data_test + sizeof(spdm_cert_chain_t) + hash_size_test,
     829            1 :         data_size_test - sizeof(spdm_cert_chain_t) - hash_size_test, 0,
     830              :         &root_cert_test, &root_cert_size_test);
     831              : 
     832            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     833            1 :     spdm_context->connection_info.algorithm.base_asym_algo= m_libspdm_use_asym_algo;
     834              : 
     835              :     /*case: there is no match root cert*/
     836           11 :     for (root_cert_index = 0; root_cert_index < LIBSPDM_MAX_ROOT_CERT_SUPPORT; root_cert_index++) {
     837           10 :         spdm_context->local_context.peer_root_cert_provision_size[root_cert_index] =
     838              :             root_cert_size_test;
     839           10 :         spdm_context->local_context.peer_root_cert_provision[root_cert_index] = root_cert_test;
     840              :     }
     841            1 :     result = libspdm_verify_peer_cert_chain_buffer(spdm_context, data, data_size, &trust_anchor,
     842              :                                                    &trust_anchor_size);
     843            1 :     assert_int_equal (result, false);
     844              : 
     845              :     /*case: there is no match root cert in the end*/
     846              :     spdm_context->local_context.peer_root_cert_provision_size[LIBSPDM_MAX_ROOT_CERT_SUPPORT -
     847            1 :                                                               1] =root_cert_size;
     848              :     spdm_context->local_context.peer_root_cert_provision[LIBSPDM_MAX_ROOT_CERT_SUPPORT -
     849            1 :                                                          1] = root_cert;
     850            1 :     result = libspdm_verify_peer_cert_chain_buffer(spdm_context, data, data_size, &trust_anchor,
     851              :                                                    &trust_anchor_size);
     852            1 :     assert_int_equal (result, true);
     853            1 :     assert_ptr_equal (trust_anchor, root_cert);
     854              : 
     855              :     /*case: there is no match root cert in the middle*/
     856           11 :     for (root_cert_index = 0; root_cert_index < LIBSPDM_MAX_ROOT_CERT_SUPPORT; root_cert_index++) {
     857           10 :         spdm_context->local_context.peer_root_cert_provision_size[root_cert_index] =
     858              :             root_cert_size_test;
     859           10 :         spdm_context->local_context.peer_root_cert_provision[root_cert_index] = root_cert_test;
     860              :     }
     861              :     spdm_context->local_context.peer_root_cert_provision_size[LIBSPDM_MAX_ROOT_CERT_SUPPORT /
     862            1 :                                                               2] =root_cert_size;
     863              :     spdm_context->local_context.peer_root_cert_provision[LIBSPDM_MAX_ROOT_CERT_SUPPORT /
     864            1 :                                                          2] = root_cert;
     865            1 :     result = libspdm_verify_peer_cert_chain_buffer(spdm_context, data, data_size, &trust_anchor,
     866              :                                                    &trust_anchor_size);
     867            1 :     assert_int_equal (result, true);
     868            1 :     assert_ptr_equal (trust_anchor, root_cert);
     869              : 
     870            1 :     free(data);
     871            1 :     free(data_test);
     872              : }
     873              : 
     874              : /**
     875              :  * Test 9: test set data for root cert.
     876              :  *
     877              :  * case                                              Expected Behavior
     878              :  * there is null root cert;                          return LIBSPDM_STATUS_SUCCESS, and the root cert is set successfully.
     879              :  * there is full root cert;                          return RETURN_OUT_OF_RESOURCES.
     880              :  **/
     881            1 : static void libspdm_test_set_data_case9(void **state)
     882              : {
     883              :     libspdm_return_t status;
     884              :     libspdm_test_context_t *spdm_test_context;
     885              :     libspdm_context_t *spdm_context;
     886              :     libspdm_data_parameter_t parameter;
     887              : 
     888              :     void *data;
     889              :     size_t data_size;
     890              :     void *hash;
     891              :     size_t hash_size;
     892              :     const uint8_t *root_cert;
     893              :     uint8_t root_cert_buffer[LIBSPDM_MAX_CERT_CHAIN_SIZE];
     894              :     size_t root_cert_size;
     895              : 
     896              :     uint8_t root_cert_index;
     897              : 
     898            1 :     spdm_test_context = *state;
     899            1 :     spdm_context = spdm_test_context->spdm_context;
     900            1 :     spdm_test_context->case_id = 0x9;
     901              : 
     902              :     /* Loading Root certificate and saving its hash*/
     903            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     904              :                                                          m_libspdm_use_asym_algo, &data,
     905              :                                                          &data_size, &hash, &hash_size)) {
     906            0 :         assert(false);
     907              :     }
     908            1 :     if (!libspdm_x509_get_cert_from_cert_chain(
     909            1 :             (uint8_t *)data + sizeof(spdm_cert_chain_t) + hash_size,
     910            1 :             data_size - sizeof(spdm_cert_chain_t) - hash_size, 0, &root_cert, &root_cert_size)) {
     911            0 :         assert(false);
     912              :     }
     913            1 :     memcpy(root_cert_buffer, root_cert, root_cert_size);
     914              : 
     915              :     /*case: there is null root cert*/
     916           11 :     for (root_cert_index = 0; root_cert_index < LIBSPDM_MAX_ROOT_CERT_SUPPORT; root_cert_index++) {
     917           10 :         spdm_context->local_context.peer_root_cert_provision_size[root_cert_index] = 0;
     918           10 :         spdm_context->local_context.peer_root_cert_provision[root_cert_index] = NULL;
     919              :     }
     920            1 :     parameter.location = LIBSPDM_DATA_LOCATION_LOCAL;
     921            1 :     status = libspdm_set_data(spdm_context, LIBSPDM_DATA_PEER_PUBLIC_ROOT_CERT,
     922              :                               &parameter, root_cert_buffer, root_cert_size);
     923            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
     924            1 :     assert_int_equal (spdm_context->local_context.peer_root_cert_provision_size[0], root_cert_size);
     925            1 :     assert_ptr_equal (spdm_context->local_context.peer_root_cert_provision[0], root_cert_buffer);
     926              : 
     927              :     /*case: there is full root cert*/
     928           11 :     for (root_cert_index = 0; root_cert_index < LIBSPDM_MAX_ROOT_CERT_SUPPORT; root_cert_index++) {
     929           10 :         spdm_context->local_context.peer_root_cert_provision_size[root_cert_index] = root_cert_size;
     930           10 :         spdm_context->local_context.peer_root_cert_provision[root_cert_index] = root_cert_buffer;
     931              :     }
     932            1 :     status = libspdm_set_data(spdm_context, LIBSPDM_DATA_PEER_PUBLIC_ROOT_CERT,
     933              :                               &parameter, root_cert_buffer, root_cert_size);
     934            1 :     assert_int_equal (status, LIBSPDM_STATUS_BUFFER_FULL);
     935              : 
     936            1 :     free(data);
     937            1 : }
     938              : 
     939              : 
     940              : /**
     941              :  * Test 10: There is no root cert.
     942              :  * Expected Behavior: Return true result.
     943              :  **/
     944            1 : void libspdm_test_process_opaque_data_supported_version_data_case10(void **state)
     945              : {
     946              :     libspdm_return_t status;
     947              :     libspdm_test_context_t *spdm_test_context;
     948              :     libspdm_context_t *spdm_context;
     949              :     size_t opaque_data_size;
     950              :     uint8_t element_num;
     951              :     spdm_version_number_t secured_message_version;
     952              : 
     953            1 :     spdm_test_context = *state;
     954            1 :     spdm_context = spdm_test_context->spdm_context;
     955            1 :     spdm_test_context->case_id = 0xA;
     956              : 
     957            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     958              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     959              : 
     960            1 :     spdm_context->local_context.secured_message_version.secured_message_version_count = 1;
     961              : 
     962            1 :     element_num = 2;
     963            1 :     opaque_data_size =
     964            1 :         libspdm_get_multi_element_opaque_data_supported_version_data_size(
     965              :             spdm_context,
     966            1 :             spdm_context->local_context.secured_message_version.secured_message_version_count,
     967              :             element_num);
     968              : 
     969              :     uint8_t *opaque_data_ptr;
     970            1 :     opaque_data_ptr = malloc(opaque_data_size);
     971              : 
     972            1 :     libspdm_build_multi_element_opaque_data_supported_version_test(
     973              :         spdm_context, &opaque_data_size, opaque_data_ptr, element_num);
     974              : 
     975            1 :     status = libspdm_process_opaque_data_supported_version_data(spdm_context,
     976              :                                                                 opaque_data_size,
     977              :                                                                 opaque_data_ptr,
     978              :                                                                 &secured_message_version);
     979              : 
     980            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
     981              : 
     982            1 :     free(opaque_data_ptr);
     983            1 : }
     984              : 
     985            1 : void libspdm_test_process_opaque_data_supported_version_data_case11(void **state)
     986              : {
     987              :     libspdm_return_t status;
     988              :     libspdm_test_context_t *spdm_test_context;
     989              :     libspdm_context_t *spdm_context;
     990              :     size_t opaque_data_size;
     991              :     uint8_t element_num;
     992              :     spdm_version_number_t secured_message_version;
     993              : 
     994            1 :     spdm_test_context = *state;
     995            1 :     spdm_context = spdm_test_context->spdm_context;
     996            1 :     spdm_test_context->case_id = 0xB;
     997              : 
     998            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     999              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1000              : 
    1001            1 :     spdm_context->local_context.secured_message_version.secured_message_version_count = 1;
    1002              : 
    1003              :     /*make element id wrong*/
    1004            1 :     element_num = SPDM_REGISTRY_ID_MAX + 2;
    1005            1 :     opaque_data_size =
    1006            1 :         libspdm_get_multi_element_opaque_data_supported_version_data_size(
    1007              :             spdm_context,
    1008            1 :             spdm_context->local_context.secured_message_version.secured_message_version_count,
    1009              :             element_num);
    1010              : 
    1011              :     uint8_t *opaque_data_ptr;
    1012            1 :     opaque_data_ptr = malloc(opaque_data_size);
    1013              : 
    1014            1 :     libspdm_build_multi_element_opaque_data_supported_version_test(
    1015              :         spdm_context, &opaque_data_size, opaque_data_ptr, element_num);
    1016              : 
    1017            1 :     status = libspdm_process_opaque_data_supported_version_data(spdm_context,
    1018              :                                                                 opaque_data_size,
    1019              :                                                                 opaque_data_ptr,
    1020              :                                                                 &secured_message_version);
    1021              : 
    1022            1 :     assert_int_equal (status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
    1023              : 
    1024            1 :     free(opaque_data_ptr);
    1025            1 : }
    1026              : 
    1027            1 : void libspdm_test_process_opaque_data_supported_version_data_case12(void **state)
    1028              : {
    1029              :     libspdm_return_t status;
    1030              :     libspdm_test_context_t *spdm_test_context;
    1031              :     libspdm_context_t *spdm_context;
    1032              :     size_t opaque_data_size;
    1033              :     uint8_t element_num;
    1034              :     spdm_version_number_t secured_message_version;
    1035              : 
    1036            1 :     spdm_test_context = *state;
    1037            1 :     spdm_context = spdm_test_context->spdm_context;
    1038            1 :     spdm_test_context->case_id = 0xC;
    1039              : 
    1040            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
    1041              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1042              : 
    1043            1 :     spdm_context->local_context.secured_message_version.secured_message_version_count = 1;
    1044              : 
    1045            1 :     element_num = 2;
    1046            1 :     opaque_data_size =
    1047            1 :         libspdm_get_multi_element_opaque_data_supported_version_data_size(
    1048              :             spdm_context,
    1049            1 :             spdm_context->local_context.secured_message_version.secured_message_version_count,
    1050              :             element_num);
    1051              : 
    1052              :     uint8_t *opaque_data_ptr;
    1053            1 :     opaque_data_ptr = malloc(opaque_data_size);
    1054              : 
    1055            1 :     libspdm_build_multi_element_opaque_data_supported_version_test(
    1056              :         spdm_context, &opaque_data_size, opaque_data_ptr, element_num);
    1057              : 
    1058            1 :     status = libspdm_process_opaque_data_supported_version_data(spdm_context,
    1059              :                                                                 opaque_data_size,
    1060              :                                                                 opaque_data_ptr,
    1061              :                                                                 &secured_message_version);
    1062              : 
    1063            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
    1064              : 
    1065            1 :     free(opaque_data_ptr);
    1066            1 : }
    1067              : 
    1068            1 : void libspdm_test_process_opaque_data_supported_version_data_case13(void **state)
    1069              : {
    1070              :     libspdm_return_t status;
    1071              :     libspdm_test_context_t *spdm_test_context;
    1072              :     libspdm_context_t *spdm_context;
    1073              :     size_t opaque_data_size;
    1074              :     uint8_t element_num;
    1075              :     spdm_version_number_t secured_message_version;
    1076              : 
    1077            1 :     spdm_test_context = *state;
    1078            1 :     spdm_context = spdm_test_context->spdm_context;
    1079            1 :     spdm_test_context->case_id = 0xD;
    1080              : 
    1081            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
    1082              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1083              : 
    1084            1 :     spdm_context->local_context.secured_message_version.secured_message_version_count = 1;
    1085              : 
    1086              :     /*make element id wrong*/
    1087            1 :     element_num = SPDM_REGISTRY_ID_MAX + 2;
    1088            1 :     opaque_data_size =
    1089            1 :         libspdm_get_multi_element_opaque_data_supported_version_data_size(
    1090              :             spdm_context,
    1091            1 :             spdm_context->local_context.secured_message_version.secured_message_version_count,
    1092              :             element_num);
    1093              : 
    1094              :     uint8_t *opaque_data_ptr;
    1095            1 :     opaque_data_ptr = malloc(opaque_data_size);
    1096              : 
    1097            1 :     libspdm_build_multi_element_opaque_data_supported_version_test(
    1098              :         spdm_context, &opaque_data_size, opaque_data_ptr, element_num);
    1099              : 
    1100            1 :     status = libspdm_process_opaque_data_supported_version_data(spdm_context,
    1101              :                                                                 opaque_data_size,
    1102              :                                                                 opaque_data_ptr,
    1103              :                                                                 &secured_message_version);
    1104              : 
    1105            1 :     assert_int_equal (status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
    1106              : 
    1107            1 :     free(opaque_data_ptr);
    1108            1 : }
    1109              : 
    1110              : 
    1111            1 : void libspdm_test_process_opaque_data_selection_version_data_case14(void **state)
    1112              : {
    1113              :     libspdm_return_t status;
    1114              :     libspdm_test_context_t *spdm_test_context;
    1115              :     libspdm_context_t *spdm_context;
    1116              :     size_t opaque_data_size;
    1117              :     uint8_t element_num;
    1118              :     spdm_version_number_t secured_message_version;
    1119              : 
    1120            1 :     spdm_test_context = *state;
    1121            1 :     spdm_context = spdm_test_context->spdm_context;
    1122            1 :     spdm_test_context->case_id = 0xE;
    1123              : 
    1124            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1125              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1126              : 
    1127            1 :     spdm_context->local_context.secured_message_version.secured_message_version_count = 1;
    1128            1 :     spdm_context->local_context.secured_message_version.secured_message_version[0] =
    1129              :         SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT;
    1130              : 
    1131            1 :     element_num = 2;
    1132            1 :     opaque_data_size =
    1133            1 :         libspdm_get_multi_element_opaque_data_version_selection_data_size(
    1134              :             spdm_context,
    1135              :             element_num);
    1136              : 
    1137              :     uint8_t *opaque_data_ptr;
    1138            1 :     opaque_data_ptr = malloc(opaque_data_size);
    1139              : 
    1140            1 :     libspdm_build_opaque_data_version_selection_data_test(
    1141              :         spdm_context, SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, &opaque_data_size,
    1142              :             opaque_data_ptr, element_num);
    1143              : 
    1144            1 :     status = libspdm_process_opaque_data_version_selection_data(spdm_context,
    1145              :                                                                 opaque_data_size,
    1146              :                                                                 opaque_data_ptr,
    1147              :                                                                 &secured_message_version);
    1148              : 
    1149            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
    1150            1 :     assert_int_equal (secured_message_version,
    1151              :                       SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT);
    1152              : 
    1153            1 :     free(opaque_data_ptr);
    1154            1 : }
    1155              : 
    1156              : 
    1157            1 : void libspdm_test_process_opaque_data_selection_version_data_case15(void **state)
    1158              : {
    1159              :     libspdm_return_t status;
    1160              :     libspdm_test_context_t *spdm_test_context;
    1161              :     libspdm_context_t *spdm_context;
    1162              :     size_t opaque_data_size;
    1163              :     uint8_t element_num;
    1164              :     spdm_version_number_t secured_message_version;
    1165              : 
    1166            1 :     spdm_test_context = *state;
    1167            1 :     spdm_context = spdm_test_context->spdm_context;
    1168            1 :     spdm_test_context->case_id = 0xF;
    1169              : 
    1170            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1171              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1172              : 
    1173            1 :     spdm_context->local_context.secured_message_version.secured_message_version_count = 1;
    1174            1 :     spdm_context->local_context.secured_message_version.secured_message_version[0] =
    1175              :         SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT;
    1176              : 
    1177              :     /*make element id wrong*/
    1178            1 :     element_num = SPDM_REGISTRY_ID_MAX + 2;
    1179            1 :     opaque_data_size =
    1180            1 :         libspdm_get_multi_element_opaque_data_version_selection_data_size(
    1181              :             spdm_context,
    1182              :             element_num);
    1183              : 
    1184              :     uint8_t *opaque_data_ptr;
    1185            1 :     opaque_data_ptr = malloc(opaque_data_size);
    1186              : 
    1187            1 :     libspdm_build_opaque_data_version_selection_data_test(
    1188              :         spdm_context, SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, &opaque_data_size,
    1189              :             opaque_data_ptr, element_num);
    1190              : 
    1191            1 :     status = libspdm_process_opaque_data_version_selection_data(spdm_context,
    1192              :                                                                 opaque_data_size,
    1193              :                                                                 opaque_data_ptr,
    1194              :                                                                 &secured_message_version);
    1195              : 
    1196            1 :     assert_int_equal (status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
    1197              : 
    1198            1 :     free(opaque_data_ptr);
    1199            1 : }
    1200              : 
    1201              : 
    1202            1 : void libspdm_test_process_opaque_data_selection_version_data_case16(void **state)
    1203              : {
    1204              :     libspdm_return_t status;
    1205              :     libspdm_test_context_t *spdm_test_context;
    1206              :     libspdm_context_t *spdm_context;
    1207              :     size_t opaque_data_size;
    1208              :     uint8_t element_num;
    1209              :     spdm_version_number_t secured_message_version;
    1210              : 
    1211            1 :     spdm_test_context = *state;
    1212            1 :     spdm_context = spdm_test_context->spdm_context;
    1213            1 :     spdm_test_context->case_id = 0x10;
    1214              : 
    1215            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
    1216              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1217              : 
    1218            1 :     spdm_context->local_context.secured_message_version.secured_message_version_count = 1;
    1219            1 :     spdm_context->local_context.secured_message_version.secured_message_version[0] =
    1220              :         SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT;
    1221              : 
    1222            1 :     element_num = 2;
    1223            1 :     opaque_data_size = libspdm_get_multi_element_opaque_data_version_selection_data_size(
    1224              :         spdm_context, element_num);
    1225              : 
    1226              :     uint8_t *opaque_data_ptr;
    1227            1 :     opaque_data_ptr = malloc(opaque_data_size);
    1228              : 
    1229            1 :     libspdm_build_opaque_data_version_selection_data_test(
    1230              :         spdm_context, SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, &opaque_data_size,
    1231              :             opaque_data_ptr, element_num);
    1232              : 
    1233            1 :     status = libspdm_process_opaque_data_version_selection_data(spdm_context,
    1234              :                                                                 opaque_data_size,
    1235              :                                                                 opaque_data_ptr,
    1236              :                                                                 &secured_message_version);
    1237              : 
    1238            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
    1239              : 
    1240            1 :     free(opaque_data_ptr);
    1241            1 : }
    1242              : 
    1243            1 : void libspdm_test_process_opaque_data_selection_version_data_case17(void **state)
    1244              : {
    1245              :     libspdm_return_t status;
    1246              :     libspdm_test_context_t *spdm_test_context;
    1247              :     libspdm_context_t *spdm_context;
    1248              :     size_t opaque_data_size;
    1249              :     uint8_t element_num;
    1250              :     spdm_version_number_t secured_message_version;
    1251              : 
    1252            1 :     spdm_test_context = *state;
    1253            1 :     spdm_context = spdm_test_context->spdm_context;
    1254            1 :     spdm_test_context->case_id = 0x11;
    1255              : 
    1256            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
    1257              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1258              : 
    1259            1 :     spdm_context->local_context.secured_message_version.secured_message_version_count = 1;
    1260            1 :     spdm_context->local_context.secured_message_version.secured_message_version[0] =
    1261              :         SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT;
    1262              : 
    1263              :     /*make element id wrong*/
    1264            1 :     element_num = SPDM_REGISTRY_ID_MAX + 2;
    1265            1 :     opaque_data_size =
    1266            1 :         libspdm_get_multi_element_opaque_data_version_selection_data_size(
    1267              :             spdm_context,
    1268              :             element_num);
    1269              : 
    1270              :     uint8_t *opaque_data_ptr;
    1271            1 :     opaque_data_ptr = malloc(opaque_data_size);
    1272              : 
    1273            1 :     libspdm_build_opaque_data_version_selection_data_test(
    1274              :         spdm_context, SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, &opaque_data_size,
    1275              :             opaque_data_ptr, element_num);
    1276              : 
    1277            1 :     status = libspdm_process_opaque_data_version_selection_data(spdm_context,
    1278              :                                                                 opaque_data_size,
    1279              :                                                                 opaque_data_ptr,
    1280              :                                                                 &secured_message_version);
    1281              : 
    1282            1 :     assert_int_equal (status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
    1283              : 
    1284            1 :     free(opaque_data_ptr);
    1285            1 : }
    1286              : 
    1287            1 : void libspdm_test_secured_message_context_location_selection_case18(void **state)
    1288              : {
    1289              :     libspdm_return_t status;
    1290              :     libspdm_test_context_t *spdm_test_context;
    1291              :     libspdm_context_t *spdm_context;
    1292              :     void *secured_message_contexts[LIBSPDM_MAX_SESSION_COUNT];
    1293              :     size_t index;
    1294              : 
    1295            1 :     spdm_test_context = *state;
    1296            1 :     spdm_test_context->case_id = 0x12;
    1297              : 
    1298            1 :     spdm_context = (libspdm_context_t *)malloc(libspdm_get_context_size_without_secured_context());
    1299              : 
    1300            5 :     for (index = 0; index < LIBSPDM_MAX_SESSION_COUNT; index++)
    1301              :     {
    1302            4 :         secured_message_contexts[index] =
    1303            4 :             (void *)malloc(libspdm_secured_message_get_context_size());
    1304              :     }
    1305              : 
    1306            1 :     status = libspdm_init_context_with_secured_context(spdm_context, secured_message_contexts,
    1307              :                                                        LIBSPDM_MAX_SESSION_COUNT);
    1308            1 :     assert_int_equal (status, LIBSPDM_STATUS_SUCCESS);
    1309              : 
    1310            5 :     for (index = 0; index < LIBSPDM_MAX_SESSION_COUNT; index++)
    1311              :     {
    1312              :         /* Ensure the SPDM context points to the specified memory. */
    1313            4 :         assert_ptr_equal(spdm_context->session_info[index].secured_message_context,
    1314              :                          secured_message_contexts[index]);
    1315              :     }
    1316              : 
    1317            1 :     free(spdm_context);
    1318            5 :     for (index = 0; index < LIBSPDM_MAX_SESSION_COUNT; index++)
    1319              :     {
    1320            4 :         free(secured_message_contexts[index]);
    1321              :     }
    1322            1 : }
    1323              : 
    1324            1 : static void libspdm_test_export_master_secret_case19(void **state)
    1325              : {
    1326              :     uint8_t target_buffer[LIBSPDM_MAX_HASH_SIZE];
    1327              :     bool result;
    1328              :     libspdm_secured_message_context_t secured_message_context;
    1329              :     size_t export_master_secret_size;
    1330              : 
    1331              :     /* Get the entire EMS when the reported size of the target buffer is larger than the size of the
    1332              :      * EMS. */
    1333           65 :     for (int index = 0; index < LIBSPDM_MAX_HASH_SIZE; index++) {
    1334           64 :         secured_message_context.export_master_secret[index] = (uint8_t)index;
    1335           64 :         target_buffer[index] = 0x00;
    1336              :     }
    1337              : 
    1338            1 :     secured_message_context.hash_size = LIBSPDM_MAX_HASH_SIZE;
    1339            1 :     export_master_secret_size = LIBSPDM_MAX_HASH_SIZE + 0x100;
    1340              : 
    1341            1 :     result = libspdm_secured_message_export_master_secret(&secured_message_context,
    1342              :                                                           &target_buffer,
    1343              :                                                           &export_master_secret_size);
    1344            1 :     assert_int_equal(result, true);
    1345              : 
    1346            1 :     libspdm_secured_message_clear_export_master_secret(&secured_message_context);
    1347              : 
    1348           65 :     for (int index = 0; index < LIBSPDM_MAX_HASH_SIZE; index++) {
    1349           64 :         assert_int_equal(target_buffer[index], index);
    1350           64 :         assert_int_equal(secured_message_context.export_master_secret[index], 0x00);
    1351              :     }
    1352            1 :     assert_int_equal(export_master_secret_size, LIBSPDM_MAX_HASH_SIZE);
    1353              : 
    1354              :     /* Get the entire EMS when the size of the target buffer is the same size as the EMS. */
    1355           65 :     for (int index = 0; index < LIBSPDM_MAX_HASH_SIZE; index++) {
    1356           64 :         secured_message_context.export_master_secret[index] = (uint8_t)index;
    1357           64 :         target_buffer[index] = 0x00;
    1358              :     }
    1359              : 
    1360            1 :     secured_message_context.hash_size = LIBSPDM_MAX_HASH_SIZE;
    1361            1 :     export_master_secret_size = LIBSPDM_MAX_HASH_SIZE;
    1362              : 
    1363            1 :     result = libspdm_secured_message_export_master_secret(&secured_message_context,
    1364              :                                                           &target_buffer,
    1365              :                                                           &export_master_secret_size);
    1366            1 :     assert_int_equal(result, true);
    1367              : 
    1368           65 :     for (int index = 0; index < LIBSPDM_MAX_HASH_SIZE; index++) {
    1369           64 :         assert_int_equal(target_buffer[index], index);
    1370              :     }
    1371            1 :     assert_int_equal(export_master_secret_size, LIBSPDM_MAX_HASH_SIZE);
    1372              : 
    1373              :     /* Get the truncated EMS when the size of the target buffer is less than the size of the EMS. */
    1374           65 :     for (int index = 0; index < LIBSPDM_MAX_HASH_SIZE; index++) {
    1375           64 :         secured_message_context.export_master_secret[index] = (uint8_t)index;
    1376           64 :         target_buffer[index] = 0x00;
    1377              :     }
    1378              : 
    1379            1 :     secured_message_context.hash_size = LIBSPDM_MAX_HASH_SIZE;
    1380            1 :     export_master_secret_size = LIBSPDM_MAX_HASH_SIZE - 4;
    1381              : 
    1382            1 :     result = libspdm_secured_message_export_master_secret(&secured_message_context,
    1383              :                                                           &target_buffer,
    1384              :                                                           &export_master_secret_size);
    1385            1 :     assert_int_equal(result, true);
    1386              : 
    1387           65 :     for (int index = 0; index < LIBSPDM_MAX_HASH_SIZE; index++) {
    1388           64 :         if (index < LIBSPDM_MAX_HASH_SIZE - 4) {
    1389           60 :             assert_int_equal(target_buffer[index], index);
    1390              :         } else {
    1391            4 :             assert_int_equal(target_buffer[index], 0x00);
    1392              :         }
    1393              :     }
    1394            1 :     assert_int_equal(export_master_secret_size, LIBSPDM_MAX_HASH_SIZE - 4);
    1395            1 : }
    1396              : 
    1397            1 : static void libspdm_test_check_context_case20(void **state)
    1398              : {
    1399              :     void *context;
    1400              :     bool result;
    1401              : 
    1402            1 :     context = (void *)malloc (libspdm_get_context_size());
    1403              : 
    1404            1 :     libspdm_init_context (context);
    1405              : 
    1406            1 :     result = libspdm_check_context (context);
    1407            1 :     assert_int_equal(false, result);
    1408              : 
    1409            1 :     libspdm_register_transport_layer_func(context,
    1410              :                                           LIBSPDM_MAX_SPDM_MSG_SIZE,
    1411              :                                           LIBSPDM_TEST_TRANSPORT_HEADER_SIZE,
    1412              :                                           LIBSPDM_TEST_TRANSPORT_TAIL_SIZE,
    1413              :                                           libspdm_transport_test_encode_message,
    1414              :                                           libspdm_transport_test_decode_message);
    1415              : 
    1416            1 :     libspdm_register_device_buffer_func(context,
    1417              :                                         LIBSPDM_MAX_SENDER_RECEIVER_BUFFER_SIZE,
    1418              :                                         LIBSPDM_MAX_SENDER_RECEIVER_BUFFER_SIZE,
    1419              :                                         spdm_device_acquire_sender_buffer,
    1420              :                                         spdm_device_release_sender_buffer,
    1421              :                                         spdm_device_acquire_receiver_buffer,
    1422              :                                         spdm_device_release_receiver_buffer);
    1423              : 
    1424            1 :     result = libspdm_check_context (context);
    1425            1 :     assert_int_equal(true, result);
    1426              : 
    1427            1 :     libspdm_register_transport_layer_func(context,
    1428              :                                           SPDM_MIN_DATA_TRANSFER_SIZE_VERSION_12,
    1429              :                                           LIBSPDM_TEST_TRANSPORT_HEADER_SIZE,
    1430              :                                           LIBSPDM_TEST_TRANSPORT_TAIL_SIZE,
    1431              :                                           libspdm_transport_test_encode_message,
    1432              :                                           libspdm_transport_test_decode_message);
    1433              : 
    1434            1 :     result = libspdm_check_context (context);
    1435            1 :     assert_int_equal(false, result);
    1436            1 : }
    1437              : 
    1438            1 : static void libspdm_test_max_session_count_case21(void **state)
    1439              : {
    1440              :     libspdm_context_t *spdm_context;
    1441              :     libspdm_data_parameter_t parameter;
    1442              :     size_t index;
    1443              :     size_t round;
    1444              :     uint16_t req_id;
    1445              :     uint16_t rsp_id;
    1446              :     uint32_t session_id;
    1447              :     void *session_info;
    1448              :     uint32_t dhe_session_count;
    1449              :     uint32_t psk_session_count;
    1450              : 
    1451            7 :     for (round = 0; round <= 5; round++) {
    1452              :         /* prepare parameter */
    1453            6 :         switch (round) {
    1454            1 :         case 0:
    1455            1 :             dhe_session_count = 1;
    1456            1 :             psk_session_count = 1;
    1457            1 :             break;
    1458            1 :         case 1:
    1459            1 :             dhe_session_count = LIBSPDM_MAX_SESSION_COUNT / 2;
    1460            1 :             psk_session_count = LIBSPDM_MAX_SESSION_COUNT - dhe_session_count;
    1461            1 :             break;
    1462            1 :         case 2:
    1463            1 :             dhe_session_count = 1;
    1464            1 :             psk_session_count = LIBSPDM_MAX_SESSION_COUNT - 1;
    1465            1 :             break;
    1466            1 :         case 3:
    1467            1 :             dhe_session_count = LIBSPDM_MAX_SESSION_COUNT - 1;
    1468            1 :             psk_session_count = 1;
    1469            1 :             break;
    1470            1 :         case 4:
    1471            1 :             dhe_session_count = 0;
    1472            1 :             psk_session_count = LIBSPDM_MAX_SESSION_COUNT;
    1473            1 :             break;
    1474            1 :         case 5:
    1475            1 :             dhe_session_count = LIBSPDM_MAX_SESSION_COUNT;
    1476            1 :             psk_session_count = 0;
    1477            1 :             break;
    1478            0 :         default:
    1479            0 :             dhe_session_count = 0;
    1480            0 :             psk_session_count = 0;
    1481            0 :             break;
    1482              :         }
    1483              : 
    1484              :         /* test */
    1485            6 :         spdm_context = (libspdm_context_t *)malloc(libspdm_get_context_size());
    1486            6 :         libspdm_init_context (spdm_context);
    1487            6 :         spdm_context->connection_info.capability.flags =
    1488              :             SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP |
    1489              :             SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
    1490            6 :         spdm_context->local_context.capability.flags =
    1491              :             SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP |
    1492              :             SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
    1493            6 :         spdm_context->connection_info.algorithm.base_hash_algo =
    1494              :             SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256;
    1495            6 :         spdm_context->connection_info.algorithm.dhe_named_group =
    1496              :             SPDM_ALGORITHMS_DHE_NAMED_GROUP_SECP_256_R1;
    1497            6 :         spdm_context->connection_info.algorithm.aead_cipher_suite =
    1498              :             SPDM_ALGORITHMS_AEAD_CIPHER_SUITE_AES_256_GCM;
    1499            6 :         spdm_context->connection_info.algorithm.key_schedule =
    1500              :             SPDM_ALGORITHMS_KEY_SCHEDULE_SPDM;
    1501              : 
    1502            6 :         libspdm_zero_mem(&parameter, sizeof(parameter));
    1503            6 :         parameter.location = LIBSPDM_DATA_LOCATION_LOCAL;
    1504            6 :         if (dhe_session_count != 0) {
    1505            5 :             libspdm_set_data (spdm_context, LIBSPDM_DATA_MAX_DHE_SESSION_COUNT, &parameter,
    1506              :                               &dhe_session_count, sizeof(dhe_session_count));
    1507              :         }
    1508            6 :         if (psk_session_count != 0) {
    1509            5 :             libspdm_set_data (spdm_context, LIBSPDM_DATA_MAX_PSK_SESSION_COUNT, &parameter,
    1510              :                               &psk_session_count, sizeof(psk_session_count));
    1511              :         }
    1512              : 
    1513            6 :         if (dhe_session_count != 0) {
    1514           16 :             for (index = 0; index < dhe_session_count; index++)
    1515              :             {
    1516           11 :                 req_id = libspdm_allocate_req_session_id (spdm_context, false);
    1517           11 :                 assert_int_not_equal (req_id, INVALID_SESSION_ID & 0xFFFF);
    1518              : 
    1519           11 :                 rsp_id = libspdm_allocate_rsp_session_id (spdm_context, false);
    1520           11 :                 assert_int_not_equal (rsp_id, (INVALID_SESSION_ID & 0xFFFF0000) >> 16);
    1521              : 
    1522           11 :                 session_id = libspdm_generate_session_id (req_id, rsp_id);
    1523           11 :                 session_info = libspdm_assign_session_id (spdm_context, session_id,
    1524              :                                                           SECURED_SPDM_VERSION_11 <<
    1525              :                                                           SPDM_VERSION_NUMBER_SHIFT_BIT,
    1526              :                                                           false);
    1527           11 :                 assert_ptr_not_equal (session_info, NULL);
    1528              :             }
    1529            5 :             req_id = libspdm_allocate_req_session_id (spdm_context, false);
    1530            5 :             assert_int_equal (req_id, INVALID_SESSION_ID & 0xFFFF);
    1531              : 
    1532            5 :             rsp_id = libspdm_allocate_rsp_session_id (spdm_context, false);
    1533            5 :             assert_int_equal (rsp_id, (INVALID_SESSION_ID & 0xFFFF0000) >> 16);
    1534              :         }
    1535              : 
    1536            6 :         if (psk_session_count != 0) {
    1537           16 :             for (index = 0; index < psk_session_count; index++)
    1538              :             {
    1539           11 :                 req_id = libspdm_allocate_req_session_id (spdm_context, true);
    1540           11 :                 assert_int_not_equal (req_id, INVALID_SESSION_ID & 0xFFFF);
    1541              : 
    1542           11 :                 rsp_id = libspdm_allocate_rsp_session_id (spdm_context, true);
    1543           11 :                 assert_int_not_equal (rsp_id, (INVALID_SESSION_ID & 0xFFFF0000) >> 16);
    1544              : 
    1545           11 :                 session_id = libspdm_generate_session_id (req_id, rsp_id);
    1546           11 :                 session_info = libspdm_assign_session_id (spdm_context, session_id,
    1547              :                                                           SECURED_SPDM_VERSION_11 <<
    1548              :                                                           SPDM_VERSION_NUMBER_SHIFT_BIT,
    1549              :                                                           true);
    1550           11 :                 assert_ptr_not_equal (session_info, NULL);
    1551              :             }
    1552            5 :             req_id = libspdm_allocate_req_session_id (spdm_context, true);
    1553            5 :             assert_int_equal (req_id, INVALID_SESSION_ID & 0xFFFF);
    1554              : 
    1555            5 :             rsp_id = libspdm_allocate_rsp_session_id (spdm_context, true);
    1556            5 :             assert_int_equal (rsp_id, (INVALID_SESSION_ID & 0xFFFF0000) >> 16);
    1557              :         }
    1558              : 
    1559            6 :         free(spdm_context);
    1560              :     }
    1561            1 : }
    1562              : 
    1563              : #pragma pack(1)
    1564              : 
    1565              : typedef struct {
    1566              :     spdm_general_opaque_data_table_header_t opaque_header;
    1567              :     spdm_svh_iana_cbor_header_t cbor_header;
    1568              :     uint8_t cbor_vendor_id[10];
    1569              :     uint16_t cbor_opaque_len;
    1570              :     uint8_t cbor_opaque[10];
    1571              :     /* uint8_t cbor_align[]; */
    1572              :     spdm_svh_vesa_header_t vesa_header;
    1573              :     uint16_t vesa_opaque_len;
    1574              :     uint8_t vesa_opaque[9];
    1575              :     uint8_t vesa_align[3];
    1576              :     spdm_svh_jedec_header_t jedec_header;
    1577              :     uint16_t jedec_opaque_len;
    1578              :     uint8_t jedec_opaque[8];
    1579              :     uint8_t jedec_align[2];
    1580              :     spdm_svh_cxl_header_t cxl_header;
    1581              :     uint16_t cxl_opaque_len;
    1582              :     uint8_t cxl_opaque[7];
    1583              :     uint8_t cxl_align[3];
    1584              :     spdm_svh_mipi_header_t mipi_header;
    1585              :     uint16_t mipi_opaque_len;
    1586              :     uint8_t mipi_opaque[6];
    1587              :     /* uint8_t mipi_align[0]; */
    1588              :     spdm_svh_hdbaset_header_t hdbaset_header;
    1589              :     uint16_t hdbaset_opaque_len;
    1590              :     uint8_t hdbaset_opaque[5];
    1591              :     uint8_t hdbaset_align[3];
    1592              :     spdm_svh_iana_header_t iana_header;
    1593              :     uint16_t iana_opaque_len;
    1594              :     uint8_t iana_opaque[4];
    1595              :     /* uint8_t iana_align[0]; */
    1596              :     spdm_svh_pcisig_header_t pcisig_header;
    1597              :     uint16_t pcisig_opaque_len;
    1598              :     uint8_t pcisig_opaque[3];
    1599              :     uint8_t pcisig_align[3];
    1600              :     spdm_svh_usb_header_t usb_header;
    1601              :     uint16_t usb_opaque_len;
    1602              :     uint8_t usb_opaque[2];
    1603              :     /* uint8_t usb_align[0]; */
    1604              :     spdm_svh_tcg_header_t tcg_header;
    1605              :     uint16_t tcg_opaque_len;
    1606              :     uint8_t tcg_opaque[1];
    1607              :     uint8_t tcg_align[1];
    1608              :     spdm_svh_dmtf_dsp_header_t dmtf_dsp_header;
    1609              :     uint16_t dmtf_dsp_opaque_len;
    1610              :     uint8_t dmtf_dsp_opaque[11];
    1611              :     uint8_t dmtf_dsp_align[3];
    1612              :     spdm_svh_dmtf_header_t dmtf_sm_ver_sel_header;
    1613              :     uint16_t dmtf_sm_ver_sel_opaque_len;
    1614              :     secured_message_opaque_element_version_selection_t dmtf_sm_ver_sel_opaque;
    1615              :     /* uint8_t dmtf_sm_ver_sel_align[0]; */
    1616              :     spdm_svh_dmtf_header_t dmtf_sm_sup_ver_header;
    1617              :     uint16_t dmtf_sm_sup_ver_opaque_len;
    1618              :     secured_message_opaque_element_supported_version_t dmtf_sm_sup_ver_opaque;
    1619              :     spdm_version_number_t dmtf_sm_sup_ver_versions_list[3];
    1620              :     uint8_t dmtf_sm_sup_ver_align[3];
    1621              : } test_spdm12_opaque_data_table_t;
    1622              : 
    1623              : #pragma pack()
    1624              : 
    1625            1 : static void libspdm_test_process_opaque_data_case22(void **state)
    1626              : {
    1627              :     libspdm_return_t status;
    1628              :     libspdm_test_context_t *spdm_test_context;
    1629              :     libspdm_context_t *spdm_context;
    1630              :     const void *get_element_ptr;
    1631              :     size_t get_element_len;
    1632              :     size_t opaque_data_size;
    1633              :     uint8_t *opaque_data_ptr;
    1634              :     test_spdm12_opaque_data_table_t opaque_data;
    1635              : 
    1636            1 :     spdm_test_context = *state;
    1637            1 :     spdm_context = spdm_test_context->spdm_context;
    1638            1 :     spdm_test_context->case_id = 0x16;
    1639              : 
    1640            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
    1641              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1642              : 
    1643            1 :     spdm_context->local_context.secured_message_version.secured_message_version_count = 1;
    1644              : 
    1645            1 :     libspdm_set_mem ((uint8_t *)&opaque_data, sizeof(opaque_data), 0xFF);
    1646            1 :     opaque_data.opaque_header.total_elements = SPDM_REGISTRY_ID_MAX + 2;
    1647            1 :     opaque_data.cbor_header.header.id = SPDM_REGISTRY_ID_IANA_CBOR;
    1648            1 :     opaque_data.cbor_header.header.vendor_id_len = sizeof(opaque_data.cbor_vendor_id);
    1649            1 :     opaque_data.cbor_opaque_len = sizeof(opaque_data.cbor_opaque);
    1650            1 :     opaque_data.vesa_header.header.id = SPDM_REGISTRY_ID_VESA;
    1651            1 :     opaque_data.vesa_header.header.vendor_id_len = 0;
    1652            1 :     opaque_data.vesa_opaque_len = sizeof(opaque_data.vesa_opaque);
    1653            1 :     opaque_data.jedec_header.header.id = SPDM_REGISTRY_ID_JEDEC;
    1654            1 :     opaque_data.jedec_header.header.vendor_id_len = sizeof(opaque_data.jedec_header.vendor_id);
    1655            1 :     opaque_data.jedec_opaque_len = sizeof(opaque_data.jedec_opaque);
    1656            1 :     opaque_data.cxl_header.header.id = SPDM_REGISTRY_ID_CXL;
    1657            1 :     opaque_data.cxl_header.header.vendor_id_len = sizeof(opaque_data.cxl_header.vendor_id);
    1658            1 :     opaque_data.cxl_opaque_len = sizeof(opaque_data.cxl_opaque);
    1659            1 :     opaque_data.mipi_header.header.id = SPDM_REGISTRY_ID_MIPI;
    1660            1 :     opaque_data.mipi_header.header.vendor_id_len = sizeof(opaque_data.mipi_header.vendor_id);
    1661            1 :     opaque_data.mipi_opaque_len = sizeof(opaque_data.mipi_opaque);
    1662            1 :     opaque_data.hdbaset_header.header.id = SPDM_REGISTRY_ID_HDBASET;
    1663            1 :     opaque_data.hdbaset_header.header.vendor_id_len = sizeof(opaque_data.hdbaset_header.vendor_id);
    1664            1 :     opaque_data.hdbaset_opaque_len = sizeof(opaque_data.hdbaset_opaque);
    1665            1 :     opaque_data.iana_header.header.id = SPDM_REGISTRY_ID_IANA;
    1666            1 :     opaque_data.iana_header.header.vendor_id_len = sizeof(opaque_data.iana_header.vendor_id);
    1667            1 :     opaque_data.iana_opaque_len = sizeof(opaque_data.iana_opaque);
    1668            1 :     opaque_data.pcisig_header.header.id = SPDM_REGISTRY_ID_PCISIG;
    1669            1 :     opaque_data.pcisig_header.header.vendor_id_len = sizeof(opaque_data.pcisig_header.vendor_id);
    1670            1 :     opaque_data.pcisig_opaque_len = sizeof(opaque_data.pcisig_opaque);
    1671            1 :     opaque_data.usb_header.header.id = SPDM_REGISTRY_ID_USB;
    1672            1 :     opaque_data.usb_header.header.vendor_id_len = sizeof(opaque_data.usb_header.vendor_id);
    1673            1 :     opaque_data.usb_opaque_len = sizeof(opaque_data.usb_opaque);
    1674            1 :     opaque_data.tcg_header.header.id = SPDM_REGISTRY_ID_TCG;
    1675            1 :     opaque_data.tcg_header.header.vendor_id_len = sizeof(opaque_data.tcg_header.vendor_id);
    1676            1 :     opaque_data.tcg_opaque_len = sizeof(opaque_data.tcg_opaque);
    1677            1 :     opaque_data.dmtf_dsp_header.header.id = SPDM_REGISTRY_ID_DMTF_DSP;
    1678            1 :     opaque_data.dmtf_dsp_header.header.vendor_id_len = sizeof(opaque_data.dmtf_dsp_header.vendor_id);
    1679            1 :     opaque_data.dmtf_dsp_opaque_len = sizeof(opaque_data.dmtf_dsp_opaque);
    1680            1 :     opaque_data.dmtf_sm_ver_sel_header.header.id = SPDM_REGISTRY_ID_DMTF;
    1681            1 :     opaque_data.dmtf_sm_ver_sel_header.header.vendor_id_len = 0;
    1682            1 :     opaque_data.dmtf_sm_ver_sel_opaque_len = sizeof(opaque_data.dmtf_sm_ver_sel_opaque);
    1683            1 :     opaque_data.dmtf_sm_ver_sel_opaque.sm_data_version =
    1684              :         SECURED_MESSAGE_OPAQUE_ELEMENT_SMDATA_DATA_VERSION;
    1685            1 :     opaque_data.dmtf_sm_ver_sel_opaque.sm_data_id =
    1686              :         SECURED_MESSAGE_OPAQUE_ELEMENT_SMDATA_ID_VERSION_SELECTION;
    1687            1 :     opaque_data.dmtf_sm_ver_sel_opaque.selected_version = SECURED_SPDM_VERSION_12 << 8;
    1688            1 :     opaque_data.dmtf_sm_sup_ver_header.header.id = SPDM_REGISTRY_ID_DMTF;
    1689            1 :     opaque_data.dmtf_sm_sup_ver_header.header.vendor_id_len = 0;
    1690            1 :     opaque_data.dmtf_sm_sup_ver_opaque_len = sizeof(opaque_data.dmtf_sm_sup_ver_opaque) +
    1691              :                                              sizeof(opaque_data.dmtf_sm_sup_ver_versions_list);
    1692            1 :     opaque_data.dmtf_sm_sup_ver_opaque.sm_data_version =
    1693              :         SECURED_MESSAGE_OPAQUE_ELEMENT_SMDATA_DATA_VERSION;
    1694            1 :     opaque_data.dmtf_sm_sup_ver_opaque.sm_data_id =
    1695              :         SECURED_MESSAGE_OPAQUE_ELEMENT_SMDATA_ID_SUPPORTED_VERSION;
    1696            1 :     opaque_data.dmtf_sm_sup_ver_opaque.version_count =
    1697              :         LIBSPDM_ARRAY_SIZE(opaque_data.dmtf_sm_sup_ver_versions_list);
    1698            1 :     opaque_data.dmtf_sm_sup_ver_versions_list[0] = SECURED_SPDM_VERSION_10 << 8;
    1699            1 :     opaque_data.dmtf_sm_sup_ver_versions_list[1] = SECURED_SPDM_VERSION_11 << 8;
    1700            1 :     opaque_data.dmtf_sm_sup_ver_versions_list[2] = SECURED_SPDM_VERSION_12 << 8;
    1701              : 
    1702            1 :     opaque_data_ptr = (uint8_t *)&opaque_data;
    1703            1 :     opaque_data_size = sizeof(opaque_data);
    1704            1 :     status = libspdm_get_sm_data_element_from_opaque_data(spdm_context,
    1705              :                                                           opaque_data_size, opaque_data_ptr,
    1706              :                                                           SECURED_MESSAGE_OPAQUE_ELEMENT_SMDATA_ID_VERSION_SELECTION,
    1707              :                                                           &get_element_ptr, &get_element_len
    1708              :                                                           );
    1709            1 :     assert_int_equal (status, true);
    1710            1 :     status = libspdm_get_sm_data_element_from_opaque_data(spdm_context,
    1711              :                                                           opaque_data_size, opaque_data_ptr,
    1712              :                                                           SECURED_MESSAGE_OPAQUE_ELEMENT_SMDATA_ID_SUPPORTED_VERSION,
    1713              :                                                           &get_element_ptr, &get_element_len
    1714              :                                                           );
    1715            1 :     assert_int_equal (status, true);
    1716            1 : }
    1717              : 
    1718              : static libspdm_test_context_t m_libspdm_common_context_data_test_context = {
    1719              :     LIBSPDM_TEST_CONTEXT_VERSION,
    1720              :     true,
    1721              :     NULL,
    1722              :     NULL,
    1723              : };
    1724              : 
    1725            1 : int libspdm_common_context_data_test_main(void)
    1726              : {
    1727            1 :     const struct CMUnitTest spdm_common_context_data_tests[] = {
    1728              :         cmocka_unit_test(libspdm_test_common_context_data_case1),
    1729              :         cmocka_unit_test(libspdm_test_common_context_data_case2),
    1730              :         cmocka_unit_test(libspdm_test_common_context_data_case3),
    1731              :         cmocka_unit_test(libspdm_test_common_context_data_case4),
    1732              : 
    1733              :         cmocka_unit_test(libspdm_test_verify_peer_cert_chain_buffer_case5),
    1734              :         cmocka_unit_test(libspdm_test_verify_peer_cert_chain_buffer_case6),
    1735              :         cmocka_unit_test(libspdm_test_verify_peer_cert_chain_buffer_case7),
    1736              :         cmocka_unit_test(libspdm_test_verify_peer_cert_chain_buffer_case8),
    1737              : 
    1738              :         cmocka_unit_test(libspdm_test_set_data_case9),
    1739              : 
    1740              :         /* Successful response V1.1 for multi element opaque data supported version, element number is 2*/
    1741              :         cmocka_unit_test(libspdm_test_process_opaque_data_supported_version_data_case10),
    1742              :         /* Failed response V1.1 for multi element opaque data supported version, element id is wrong*/
    1743              :         cmocka_unit_test(libspdm_test_process_opaque_data_supported_version_data_case11),
    1744              :         /* Successful response V1.2 for multi element opaque data supported version, element number is 2*/
    1745              :         cmocka_unit_test(libspdm_test_process_opaque_data_supported_version_data_case12),
    1746              :         /* Failed response V1.2 for multi element opaque data supported version, element id is wrong*/
    1747              :         cmocka_unit_test(libspdm_test_process_opaque_data_supported_version_data_case13),
    1748              :         /* Successful response V1.1 for multi element opaque data selection version, element number is 2*/
    1749              :         cmocka_unit_test(libspdm_test_process_opaque_data_selection_version_data_case14),
    1750              :         /* Failed response V1.1 for multi element opaque data selection version, element number is wrong*/
    1751              :         cmocka_unit_test(libspdm_test_process_opaque_data_selection_version_data_case15),
    1752              :         /* Successful response V1.2 for multi element opaque data selection version, element number is 2*/
    1753              :         cmocka_unit_test(libspdm_test_process_opaque_data_selection_version_data_case16),
    1754              :         /* Failed response V1.2 for multi element opaque data selection version, element number is wrong*/
    1755              :         cmocka_unit_test(libspdm_test_process_opaque_data_selection_version_data_case17),
    1756              : 
    1757              :         /* Successful initialization and setting of secured message context location. */
    1758              :         cmocka_unit_test(libspdm_test_secured_message_context_location_selection_case18),
    1759              : 
    1760              :         /* Test that the Export Master Secret can be exported and cleared. */
    1761              :         cmocka_unit_test(libspdm_test_export_master_secret_case19),
    1762              :         cmocka_unit_test(libspdm_test_check_context_case20),
    1763              : 
    1764              :         /* Test the max DHE/PSK session count */
    1765              :         cmocka_unit_test(libspdm_test_max_session_count_case21),
    1766              : 
    1767              :         /* Successful response V1.2 for multi element */
    1768              :         cmocka_unit_test(libspdm_test_process_opaque_data_case22),
    1769              :     };
    1770              : 
    1771            1 :     libspdm_setup_test_context(&m_libspdm_common_context_data_test_context);
    1772              : 
    1773            1 :     return cmocka_run_group_tests(spdm_common_context_data_tests,
    1774              :                                   libspdm_unit_test_group_setup,
    1775              :                                   libspdm_unit_test_group_teardown);
    1776              : }
        

Generated by: LCOV version 2.0-1