LCOV - code coverage report
Current view: top level - unit_test/test_spdm_requester - get_measurement_extension_log.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 96.6 % 537 519
Test Date: 2026-09-13 08:13:44 Functions: 100.0 % 15 15

            Line data    Source code
       1              : /**
       2              :  *  Copyright Notice:
       3              :  *  Copyright 2025-2026 DMTF. All rights reserved.
       4              :  *  License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
       5              :  **/
       6              : 
       7              : #include "spdm_unit_test.h"
       8              : #include "internal/libspdm_requester_lib.h"
       9              : #include "internal/libspdm_secured_message_lib.h"
      10              : 
      11              : #if LIBSPDM_ENABLE_CAPABILITY_MEL_CAP
      12              : 
      13              : #define LIBSPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE 0x1000
      14              : 
      15              : static uint8_t m_libspdm_mel_test[LIBSPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE];
      16              : static size_t m_libspdm_mel_len;
      17              : static uint8_t m_libspdm_mel_number;
      18              : 
      19            4 : static void generate_mel_entry_test(void)
      20              : {
      21              :     spdm_measurement_extension_log_dmtf_t *measurement_extension_log;
      22              :     uint32_t mel_index;
      23              :     spdm_mel_entry_dmtf_t *mel_entry;
      24              :     size_t mel_entry_size;
      25            4 :     uint8_t rom_informational[] = "ROM";
      26              : 
      27              :     /*generate MEL*/
      28            4 :     libspdm_zero_mem(m_libspdm_mel_test, sizeof(m_libspdm_mel_test));
      29            4 :     measurement_extension_log = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
      30              : 
      31            4 :     measurement_extension_log->number_of_entries = 0;
      32            4 :     measurement_extension_log->mel_entries_len = 0;
      33            4 :     measurement_extension_log->reserved = 0;
      34              : 
      35            4 :     m_libspdm_mel_len = sizeof(spdm_measurement_extension_log_dmtf_t);
      36            4 :     mel_entry = (spdm_mel_entry_dmtf_t *)((uint8_t *)measurement_extension_log +
      37              :                                           sizeof(spdm_measurement_extension_log_dmtf_t));
      38              : 
      39            4 :     mel_index = 0;
      40            4 :     mel_entry_size = 0;
      41              : 
      42              :     while (1)
      43              :     {
      44         1092 :         if((m_libspdm_mel_len + sizeof(spdm_mel_entry_dmtf_t) + sizeof(rom_informational)) >
      45              :            sizeof(m_libspdm_mel_test)) {
      46            4 :             break;
      47              :         }
      48              : 
      49         1088 :         mel_entry->mel_index = mel_index;
      50         1088 :         mel_entry->meas_index = LIBSPDM_MEASUREMENT_INDEX_HEM;
      51              : 
      52         1088 :         libspdm_write_uint24(mel_entry->reserved, 0);
      53         1088 :         mel_entry->measurement_block_dmtf_header.dmtf_spec_measurement_value_type =
      54              :             SPDM_MEASUREMENT_BLOCK_MEASUREMENT_TYPE_VERSION |
      55              :             SPDM_MEASUREMENT_BLOCK_MEASUREMENT_TYPE_RAW_BIT_STREAM;
      56         1088 :         mel_entry->measurement_block_dmtf_header.dmtf_spec_measurement_value_size =
      57              :             sizeof(rom_informational);
      58         1088 :         libspdm_copy_mem((void *)(mel_entry + 1), sizeof(rom_informational),
      59              :                          rom_informational, sizeof(rom_informational));
      60              : 
      61         1088 :         mel_entry_size = (sizeof(spdm_mel_entry_dmtf_t) + sizeof(rom_informational));
      62         1088 :         m_libspdm_mel_len += mel_entry_size;
      63              : 
      64         1088 :         measurement_extension_log->number_of_entries = mel_index;
      65         1088 :         measurement_extension_log->mel_entries_len += (uint32_t)mel_entry_size;
      66         1088 :         measurement_extension_log->reserved = 0;
      67              : 
      68         1088 :         mel_entry = (spdm_mel_entry_dmtf_t *)
      69         1088 :                     ((uint8_t *)mel_entry + sizeof(spdm_mel_entry_dmtf_t)+
      70         1088 :                      mel_entry->measurement_block_dmtf_header.dmtf_spec_measurement_value_size);
      71              : 
      72         1088 :         mel_index++;
      73              :     }
      74            4 : }
      75              : 
      76              : /*generate different long mel according to the m_libspdm_mel_number*/
      77            7 : static void generate_long_mel(uint32_t measurement_hash_algo)
      78              : {
      79              :     spdm_measurement_extension_log_dmtf_t *measurement_extension_log;
      80              :     spdm_mel_entry_dmtf_t *mel_entry1;
      81              :     spdm_mel_entry_dmtf_t *mel_entry2;
      82              :     spdm_mel_entry_dmtf_t *mel_entry3;
      83              :     spdm_mel_entry_dmtf_t *mel_entry;
      84              :     uint8_t index;
      85              : 
      86            7 :     uint8_t rom_informational[] = "ROM";
      87            7 :     uint8_t bootfv_informational[] = "Boot FW";
      88            7 :     uint32_t version = 0x0100030A;
      89              : 
      90              :     /*generate MEL*/
      91            7 :     measurement_extension_log = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
      92              : 
      93            7 :     measurement_extension_log->number_of_entries = m_libspdm_mel_number;
      94            7 :     measurement_extension_log->mel_entries_len =
      95            7 :         measurement_extension_log->number_of_entries * sizeof(spdm_mel_entry_dmtf_t) +
      96            7 :         sizeof(rom_informational) - 1 + sizeof(bootfv_informational) - 1 +
      97            7 :         sizeof(version) * (m_libspdm_mel_number - 2);
      98            7 :     measurement_extension_log->reserved = 0;
      99              : 
     100              :     /*MEL Entry 1: informational ROM */
     101            7 :     mel_entry1 = (spdm_mel_entry_dmtf_t *)((uint8_t *)measurement_extension_log +
     102              :                                            sizeof(spdm_measurement_extension_log_dmtf_t));
     103            7 :     mel_entry1->mel_index = 1;
     104            7 :     mel_entry1->meas_index = LIBSPDM_MEASUREMENT_INDEX_HEM;
     105            7 :     libspdm_write_uint24(mel_entry1->reserved, 0);
     106            7 :     mel_entry1->measurement_block_dmtf_header.dmtf_spec_measurement_value_type =
     107              :         SPDM_MEASUREMENT_BLOCK_MEASUREMENT_TYPE_INFORMATIONAL |
     108              :         SPDM_MEASUREMENT_BLOCK_MEASUREMENT_TYPE_RAW_BIT_STREAM;
     109            7 :     mel_entry1->measurement_block_dmtf_header.dmtf_spec_measurement_value_size =
     110              :         sizeof(rom_informational) - 1;
     111            7 :     libspdm_copy_mem((void *)(mel_entry1 + 1), sizeof(rom_informational) - 1,
     112              :                      rom_informational, sizeof(rom_informational) - 1);
     113              : 
     114              :     /*MEL Entry 2: informational Boot FW */
     115            7 :     mel_entry2 = (spdm_mel_entry_dmtf_t *)((uint8_t *)(mel_entry1 + 1) +
     116              :                                            sizeof(rom_informational) - 1);
     117            7 :     mel_entry2->mel_index = 2;
     118            7 :     mel_entry2->meas_index = LIBSPDM_MEASUREMENT_INDEX_HEM;
     119            7 :     libspdm_write_uint24(mel_entry2->reserved, 0);
     120            7 :     mel_entry2->measurement_block_dmtf_header.dmtf_spec_measurement_value_type =
     121              :         SPDM_MEASUREMENT_BLOCK_MEASUREMENT_TYPE_INFORMATIONAL |
     122              :         SPDM_MEASUREMENT_BLOCK_MEASUREMENT_TYPE_RAW_BIT_STREAM;
     123            7 :     mel_entry2->measurement_block_dmtf_header.dmtf_spec_measurement_value_size =
     124              :         sizeof(bootfv_informational) - 1;
     125            7 :     libspdm_copy_mem((void *)(mel_entry2 + 1), sizeof(bootfv_informational) - 1,
     126              :                      bootfv_informational, sizeof(bootfv_informational) - 1);
     127              : 
     128              :     /*MEL Entry 3: version 0x0100030A */
     129            7 :     mel_entry3 = (spdm_mel_entry_dmtf_t *)((uint8_t *)(mel_entry2 + 1) +
     130              :                                            sizeof(bootfv_informational) - 1);
     131            7 :     mel_entry3->mel_index = 3;
     132            7 :     mel_entry3->meas_index = LIBSPDM_MEASUREMENT_INDEX_HEM;
     133            7 :     libspdm_write_uint24(mel_entry3->reserved, 0);
     134            7 :     mel_entry3->measurement_block_dmtf_header.dmtf_spec_measurement_value_type =
     135              :         SPDM_MEASUREMENT_BLOCK_MEASUREMENT_TYPE_VERSION |
     136              :         SPDM_MEASUREMENT_BLOCK_MEASUREMENT_TYPE_RAW_BIT_STREAM;
     137            7 :     mel_entry3->measurement_block_dmtf_header.dmtf_spec_measurement_value_size = sizeof(version);
     138            7 :     libspdm_copy_mem((void *)(mel_entry3 + 1), sizeof(version), &version, sizeof(version));
     139              : 
     140              :     /*MEL Entry 4 -> m_libspdm_mel_number: version 0x0100030A */
     141            7 :     mel_entry = (spdm_mel_entry_dmtf_t *)((uint8_t *)(mel_entry3 + 1) + sizeof(version));
     142          694 :     for (index = 4; index <= m_libspdm_mel_number; index++) {
     143          687 :         mel_entry->mel_index = index;
     144          687 :         mel_entry->meas_index = LIBSPDM_MEASUREMENT_INDEX_HEM;
     145          687 :         libspdm_write_uint24(mel_entry->reserved, 0);
     146          687 :         mel_entry->measurement_block_dmtf_header.dmtf_spec_measurement_value_type =
     147              :             SPDM_MEASUREMENT_BLOCK_MEASUREMENT_TYPE_VERSION |
     148              :             SPDM_MEASUREMENT_BLOCK_MEASUREMENT_TYPE_RAW_BIT_STREAM;
     149          687 :         mel_entry->measurement_block_dmtf_header.dmtf_spec_measurement_value_size = sizeof(version);
     150          687 :         libspdm_copy_mem((void *)(mel_entry + 1), sizeof(version), &version, sizeof(version));
     151          687 :         mel_entry = (spdm_mel_entry_dmtf_t *)((uint8_t *)(mel_entry + 1) + sizeof(version));
     152              :     }
     153            7 : }
     154              : 
     155           16 : static libspdm_return_t send_message(
     156              :     void *spdm_context, size_t request_size, const void *request, uint64_t timeout)
     157              : {
     158              :     libspdm_test_context_t *spdm_test_context;
     159              : 
     160           16 :     spdm_test_context = libspdm_get_test_context();
     161           16 :     switch (spdm_test_context->case_id) {
     162            1 :     case 0x1:
     163            1 :         return LIBSPDM_STATUS_SEND_FAIL;
     164           15 :     case 0x2:
     165              :     case 0x3:
     166              :     case 0x4:
     167              :     case 0x5:
     168              :     case 0x6:
     169              :     case 0x7:
     170              :     case 0x8:
     171              :     case 0x9:
     172              :     case 0xA:
     173           15 :         return LIBSPDM_STATUS_SUCCESS;
     174            0 :     default:
     175            0 :         return LIBSPDM_STATUS_SEND_FAIL;
     176              :     }
     177              : }
     178              : 
     179           15 : static libspdm_return_t receive_message(
     180              :     void *spdm_context, size_t *response_size, void **response, uint64_t timeout)
     181              : {
     182              :     libspdm_test_context_t *spdm_test_context;
     183              : 
     184           15 :     spdm_test_context = libspdm_get_test_context();
     185           15 :     switch (spdm_test_context->case_id) {
     186            0 :     case 0x1:
     187            0 :         return LIBSPDM_STATUS_RECEIVE_FAIL;
     188              : 
     189            1 :     case 0x2: {
     190              :         spdm_measurement_extension_log_response_t *spdm_response;
     191              :         size_t spdm_response_size;
     192              :         size_t transport_header_size;
     193              :         uint32_t portion_length;
     194              :         uint32_t remainder_length;
     195              :         size_t count;
     196              :         static size_t calling_index = 0;
     197              :         spdm_measurement_extension_log_dmtf_t *spdm_mel;
     198              : 
     199            1 :         spdm_mel = NULL;
     200            1 :         m_libspdm_mel_len = 0;
     201              : 
     202            1 :         libspdm_measurement_extension_log_collection(
     203              :             spdm_context,
     204              :             m_libspdm_use_mel_spec,
     205              :             m_libspdm_use_measurement_spec,
     206              :             m_libspdm_use_measurement_hash_algo,
     207              :             (void **)&spdm_mel, &m_libspdm_mel_len);
     208              : 
     209            1 :         count = (m_libspdm_mel_len + LIBSPDM_MAX_MEL_BLOCK_LEN - 1) / LIBSPDM_MAX_MEL_BLOCK_LEN;
     210            1 :         if (calling_index != count - 1) {
     211            0 :             portion_length = LIBSPDM_MAX_MEL_BLOCK_LEN;
     212            0 :             remainder_length =
     213            0 :                 (uint32_t)(m_libspdm_mel_len - LIBSPDM_MAX_MEL_BLOCK_LEN * (calling_index + 1));
     214              :         } else {
     215            1 :             portion_length = (uint32_t)(
     216              :                 m_libspdm_mel_len -
     217            1 :                 LIBSPDM_MAX_MEL_BLOCK_LEN * (count - 1));
     218            1 :             remainder_length = 0;
     219              :         }
     220              : 
     221            1 :         spdm_response_size = sizeof(spdm_measurement_extension_log_response_t) + portion_length;
     222            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     223            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     224              : 
     225            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     226            1 :         spdm_response->header.request_response_code = SPDM_MEASUREMENT_EXTENSION_LOG;
     227            1 :         spdm_response->header.param1 = 0;
     228            1 :         spdm_response->header.param2 = 0;
     229            1 :         spdm_response->portion_length = portion_length;
     230            1 :         spdm_response->remainder_length = remainder_length;
     231            1 :         libspdm_copy_mem(spdm_response + 1,
     232            1 :                          (size_t)(*response) + *response_size - (size_t)(spdm_response + 1),
     233            1 :                          (uint8_t *)spdm_mel +
     234            1 :                          LIBSPDM_MAX_MEL_BLOCK_LEN * calling_index,
     235              :                          portion_length);
     236              : 
     237            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     238              :                                               false, spdm_response_size,
     239              :                                               spdm_response, response_size,
     240              :                                               response);
     241              : 
     242            1 :         calling_index++;
     243            1 :         if (calling_index == count) {
     244            1 :             calling_index = 0;
     245              :         }
     246              :     }
     247            1 :         return LIBSPDM_STATUS_SUCCESS;
     248            1 :     case 0x3: {
     249              :         spdm_measurement_extension_log_response_t *spdm_response;
     250              :         size_t spdm_response_size;
     251              :         size_t transport_header_size;
     252              :         uint32_t portion_length;
     253              :         uint32_t remainder_length;
     254              :         size_t count;
     255              :         static size_t calling_index = 0;
     256              :         spdm_measurement_extension_log_dmtf_t *spdm_mel;
     257              :         spdm_measurement_extension_log_dmtf_t *measurement_extension_log;
     258              :         size_t mel_new_len;
     259              :         size_t mel_send_len;
     260              : 
     261            1 :         spdm_mel = NULL;
     262            1 :         m_libspdm_mel_len = 0;
     263            1 :         mel_new_len = 0;
     264            1 :         mel_send_len = 0;
     265            1 :         m_libspdm_mel_number = 3;
     266              : 
     267            1 :         generate_long_mel(m_libspdm_use_measurement_hash_algo);
     268              : 
     269            1 :         measurement_extension_log = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
     270            1 :         spdm_mel = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
     271            1 :         m_libspdm_mel_len = (size_t)(measurement_extension_log->mel_entries_len) +
     272              :                             sizeof(spdm_measurement_extension_log_dmtf_t);
     273              : 
     274            1 :         if (calling_index == 1) {
     275            0 :             m_libspdm_mel_number = 4;
     276            0 :             generate_long_mel(m_libspdm_use_measurement_hash_algo);
     277            0 :             measurement_extension_log = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
     278            0 :             mel_new_len = (size_t)(measurement_extension_log->mel_entries_len) +
     279              :                           sizeof(spdm_measurement_extension_log_dmtf_t);
     280              :         }
     281              : 
     282            1 :         mel_send_len = (m_libspdm_mel_len > mel_new_len) ? m_libspdm_mel_len : mel_new_len;
     283              : 
     284            1 :         count = (mel_send_len + LIBSPDM_MAX_MEL_BLOCK_LEN - 1) / LIBSPDM_MAX_MEL_BLOCK_LEN;
     285            1 :         if (calling_index != count - 1) {
     286            0 :             portion_length = LIBSPDM_MAX_MEL_BLOCK_LEN;
     287            0 :             remainder_length =
     288            0 :                 (uint32_t)(mel_send_len - LIBSPDM_MAX_MEL_BLOCK_LEN * (calling_index + 1));
     289              :         } else {
     290            1 :             portion_length = (uint32_t)(
     291              :                 m_libspdm_mel_len -
     292            1 :                 LIBSPDM_MAX_MEL_BLOCK_LEN * (count - 1));
     293            1 :             remainder_length = (uint32_t)(
     294            1 :                 mel_send_len -
     295            1 :                 LIBSPDM_MAX_MEL_BLOCK_LEN * (count - 1) -
     296              :                 portion_length);
     297              :         }
     298              : 
     299            1 :         spdm_response_size = sizeof(spdm_measurement_extension_log_response_t) + portion_length;
     300            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     301            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     302              : 
     303            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     304            1 :         spdm_response->header.request_response_code = SPDM_MEASUREMENT_EXTENSION_LOG;
     305            1 :         spdm_response->header.param1 = 0;
     306            1 :         spdm_response->header.param2 = 0;
     307            1 :         spdm_response->portion_length = portion_length;
     308            1 :         spdm_response->remainder_length = remainder_length;
     309            1 :         libspdm_copy_mem(spdm_response + 1,
     310            1 :                          (size_t)(*response) + *response_size - (size_t)(spdm_response + 1),
     311              :                          (uint8_t *)spdm_mel +
     312            1 :                          LIBSPDM_MAX_MEL_BLOCK_LEN * calling_index,
     313              :                          portion_length);
     314              : 
     315            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     316              :                                               false, spdm_response_size,
     317              :                                               spdm_response, response_size,
     318              :                                               response);
     319              : 
     320            1 :         calling_index++;
     321            1 :         if (calling_index == count) {
     322            1 :             calling_index = 0;
     323              :         }
     324              :     }
     325            1 :         return LIBSPDM_STATUS_SUCCESS;
     326            2 :     case 0x4: {
     327              :         spdm_measurement_extension_log_response_t *spdm_response;
     328              :         size_t spdm_response_size;
     329              :         size_t transport_header_size;
     330              :         uint32_t portion_length;
     331              :         uint32_t remainder_length;
     332              :         size_t count;
     333              :         static size_t calling_index = 0;
     334              :         spdm_measurement_extension_log_dmtf_t *spdm_mel;
     335              :         spdm_measurement_extension_log_dmtf_t *measurement_extension_log;
     336              :         size_t mel_new_len;
     337              :         size_t mel_send_len;
     338              : 
     339            2 :         spdm_mel = NULL;
     340            2 :         m_libspdm_mel_len = 0;
     341            2 :         mel_new_len = 0;
     342            2 :         mel_send_len = 0;
     343            2 :         m_libspdm_mel_number = 100;
     344              : 
     345            2 :         generate_long_mel(m_libspdm_use_measurement_hash_algo);
     346              : 
     347            2 :         measurement_extension_log = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
     348            2 :         spdm_mel = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
     349            2 :         m_libspdm_mel_len = (size_t)(measurement_extension_log->mel_entries_len) +
     350              :                             sizeof(spdm_measurement_extension_log_dmtf_t);
     351              : 
     352            2 :         if (calling_index == 1) {
     353            1 :             m_libspdm_mel_number = 105;
     354            1 :             generate_long_mel(m_libspdm_use_measurement_hash_algo);
     355            1 :             measurement_extension_log = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
     356            1 :             mel_new_len = (size_t)(measurement_extension_log->mel_entries_len) +
     357              :                           sizeof(spdm_measurement_extension_log_dmtf_t);
     358              :         }
     359              : 
     360            2 :         mel_send_len = (m_libspdm_mel_len > mel_new_len) ? m_libspdm_mel_len : mel_new_len;
     361              : 
     362            2 :         count = (m_libspdm_mel_len + LIBSPDM_MAX_MEL_BLOCK_LEN - 1) / LIBSPDM_MAX_MEL_BLOCK_LEN;
     363            2 :         if (calling_index != count - 1) {
     364            1 :             portion_length = LIBSPDM_MAX_MEL_BLOCK_LEN;
     365            1 :             remainder_length =
     366            1 :                 (uint32_t)(mel_send_len - LIBSPDM_MAX_MEL_BLOCK_LEN * (calling_index + 1));
     367              :         } else {
     368            1 :             portion_length = (uint32_t)(
     369              :                 m_libspdm_mel_len -
     370            1 :                 LIBSPDM_MAX_MEL_BLOCK_LEN * (count - 1));
     371            1 :             remainder_length = (uint32_t)(
     372            1 :                 mel_send_len -
     373            1 :                 LIBSPDM_MAX_MEL_BLOCK_LEN * (count - 1) -
     374              :                 portion_length);
     375              :         }
     376              : 
     377            2 :         spdm_response_size = sizeof(spdm_measurement_extension_log_response_t) + portion_length;
     378            2 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     379            2 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     380              : 
     381            2 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     382            2 :         spdm_response->header.request_response_code = SPDM_MEASUREMENT_EXTENSION_LOG;
     383            2 :         spdm_response->header.param1 = 0;
     384            2 :         spdm_response->header.param2 = 0;
     385            2 :         spdm_response->portion_length = portion_length;
     386            2 :         spdm_response->remainder_length = remainder_length;
     387            2 :         libspdm_copy_mem(spdm_response + 1,
     388            2 :                          (size_t)(*response) + *response_size - (size_t)(spdm_response + 1),
     389              :                          (uint8_t *)spdm_mel +
     390            2 :                          LIBSPDM_MAX_MEL_BLOCK_LEN * calling_index,
     391              :                          portion_length);
     392              : 
     393            2 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     394              :                                               false, spdm_response_size,
     395              :                                               spdm_response, response_size,
     396              :                                               response);
     397              : 
     398            2 :         calling_index++;
     399            2 :         if (calling_index == count) {
     400            1 :             calling_index = 0;
     401              :         }
     402              :     }
     403            2 :         return LIBSPDM_STATUS_SUCCESS;
     404            2 :     case 0x5: {
     405              :         spdm_measurement_extension_log_response_t *spdm_response;
     406              :         size_t spdm_response_size;
     407              :         size_t transport_header_size;
     408              :         uint32_t portion_length;
     409              :         uint32_t remainder_length;
     410              :         size_t count;
     411              :         static size_t calling_index = 0;
     412              :         spdm_measurement_extension_log_dmtf_t *spdm_mel;
     413              :         spdm_measurement_extension_log_dmtf_t *measurement_extension_log;
     414              :         size_t mel_new_len;
     415              :         size_t mel_send_len;
     416              : 
     417            2 :         spdm_mel = NULL;
     418            2 :         m_libspdm_mel_len = 0;
     419            2 :         mel_new_len = 0;
     420            2 :         mel_send_len = 0;
     421            2 :         m_libspdm_mel_number = 100;
     422              : 
     423            2 :         generate_long_mel(m_libspdm_use_measurement_hash_algo);
     424              : 
     425            2 :         measurement_extension_log = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
     426            2 :         spdm_mel = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
     427            2 :         m_libspdm_mel_len = (size_t)(measurement_extension_log->mel_entries_len) +
     428              :                             sizeof(spdm_measurement_extension_log_dmtf_t);
     429              : 
     430            2 :         if (calling_index == 1) {
     431            1 :             m_libspdm_mel_number = 200;
     432            1 :             generate_long_mel(m_libspdm_use_measurement_hash_algo);
     433            1 :             measurement_extension_log = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
     434            1 :             mel_new_len = (size_t)(measurement_extension_log->mel_entries_len) +
     435              :                           sizeof(spdm_measurement_extension_log_dmtf_t);
     436              :         }
     437              : 
     438            2 :         mel_send_len = (m_libspdm_mel_len > mel_new_len) ? m_libspdm_mel_len : mel_new_len;
     439              : 
     440            2 :         count = (m_libspdm_mel_len + LIBSPDM_MAX_MEL_BLOCK_LEN - 1) / LIBSPDM_MAX_MEL_BLOCK_LEN;
     441            2 :         if (calling_index != count - 1) {
     442            1 :             portion_length = LIBSPDM_MAX_MEL_BLOCK_LEN;
     443            1 :             remainder_length =
     444            1 :                 (uint32_t)(mel_send_len - LIBSPDM_MAX_MEL_BLOCK_LEN * (calling_index + 1));
     445              :         } else {
     446            1 :             portion_length = (uint32_t)(
     447              :                 m_libspdm_mel_len -
     448            1 :                 LIBSPDM_MAX_MEL_BLOCK_LEN * (count - 1));
     449            1 :             remainder_length = (uint32_t)(
     450            1 :                 mel_send_len -
     451            1 :                 LIBSPDM_MAX_MEL_BLOCK_LEN * (count - 1) -
     452              :                 portion_length);
     453              :         }
     454              : 
     455            2 :         spdm_response_size = sizeof(spdm_measurement_extension_log_response_t) + portion_length;
     456            2 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     457            2 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     458              : 
     459            2 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     460            2 :         spdm_response->header.request_response_code = SPDM_MEASUREMENT_EXTENSION_LOG;
     461            2 :         spdm_response->header.param1 = 0;
     462            2 :         spdm_response->header.param2 = 0;
     463            2 :         spdm_response->portion_length = portion_length;
     464            2 :         spdm_response->remainder_length = remainder_length;
     465            2 :         libspdm_copy_mem(spdm_response + 1,
     466            2 :                          (size_t)(*response) + *response_size - (size_t)(spdm_response + 1),
     467              :                          (uint8_t *)spdm_mel +
     468            2 :                          LIBSPDM_MAX_MEL_BLOCK_LEN * calling_index,
     469              :                          portion_length);
     470              : 
     471            2 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     472              :                                               false, spdm_response_size,
     473              :                                               spdm_response, response_size,
     474              :                                               response);
     475              : 
     476            2 :         calling_index++;
     477            2 :         if (calling_index == count) {
     478            1 :             calling_index = 0;
     479              :         }
     480              :     }
     481            2 :         return LIBSPDM_STATUS_SUCCESS;
     482            4 :     case 0x6:
     483              :     {
     484              :         spdm_measurement_extension_log_response_t *spdm_response;
     485              :         size_t spdm_response_size;
     486              :         size_t transport_header_size;
     487              :         uint32_t portion_length;
     488              :         uint32_t remainder_length;
     489              :         spdm_measurement_extension_log_dmtf_t *spdm_mel;
     490              : 
     491              :         static size_t count = 0;
     492              :         static size_t calling_index = 0;
     493              : 
     494            4 :         if (calling_index == 0) {
     495            1 :             count = (m_libspdm_mel_len / LIBSPDM_MAX_MEL_BLOCK_LEN) + 1;
     496              :         }
     497              : 
     498            4 :         spdm_mel = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
     499              : 
     500            4 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     501            4 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     502              : 
     503            4 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     504            4 :         spdm_response->header.request_response_code = SPDM_MEASUREMENT_EXTENSION_LOG;
     505            4 :         spdm_response->header.param1 = 0;
     506            4 :         spdm_response->header.param2 = 0;
     507              : 
     508            4 :         if(m_libspdm_mel_len > LIBSPDM_MAX_MEL_BLOCK_LEN) {
     509            3 :             portion_length = LIBSPDM_MAX_MEL_BLOCK_LEN;
     510            3 :             remainder_length = (uint32_t)(m_libspdm_mel_len - LIBSPDM_MAX_MEL_BLOCK_LEN);
     511              :         } else {
     512            1 :             portion_length  = (uint32_t)m_libspdm_mel_len;
     513            1 :             remainder_length = 0;
     514              :         }
     515              : 
     516            4 :         spdm_response->portion_length = portion_length;
     517            4 :         spdm_response->remainder_length = remainder_length;
     518              : 
     519            4 :         libspdm_copy_mem(spdm_response + 1,
     520            4 :                          (size_t)(*response) + *response_size - (size_t)(spdm_response + 1),
     521              :                          (uint8_t *)spdm_mel +
     522            4 :                          LIBSPDM_MAX_MEL_BLOCK_LEN * calling_index,
     523              :                          portion_length);
     524              : 
     525            4 :         spdm_response_size = sizeof(spdm_measurement_extension_log_response_t) + portion_length;
     526              : 
     527            4 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     528              :                                               false, spdm_response_size,
     529              :                                               spdm_response, response_size,
     530              :                                               response);
     531              : 
     532            4 :         m_libspdm_mel_len -= portion_length;
     533            4 :         calling_index++;
     534              : 
     535            4 :         if (calling_index == count) {
     536            0 :             calling_index = 0;
     537            0 :             m_libspdm_mel_len = 0;
     538              :         }
     539              :     }
     540            4 :         return LIBSPDM_STATUS_SUCCESS;
     541              : 
     542            2 :     case 0x7:
     543              :     {
     544              :         spdm_measurement_extension_log_response_t *spdm_response;
     545              :         size_t spdm_response_size;
     546              :         size_t transport_header_size;
     547              :         spdm_measurement_extension_log_dmtf_t *spdm_mel;
     548              : 
     549              :         static size_t calling_index = 0;
     550              : 
     551            2 :         spdm_mel = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
     552              : 
     553            2 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     554            2 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     555              : 
     556            2 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     557            2 :         spdm_response->header.request_response_code = SPDM_MEASUREMENT_EXTENSION_LOG;
     558            2 :         spdm_response->header.param1 = 0;
     559            2 :         spdm_response->header.param2 = 0;
     560            2 :         if (calling_index == 0) {
     561            1 :             spdm_response->portion_length = LIBSPDM_MAX_MEL_BLOCK_LEN;
     562            1 :             spdm_response->remainder_length = LIBSPDM_MAX_MEL_BLOCK_LEN;
     563              :         } else {
     564              :             /* The total amount of messages actually sent by the responder is less than the negotiated total mel len*/
     565            1 :             spdm_response->portion_length = LIBSPDM_MAX_MEL_BLOCK_LEN / 2;
     566            1 :             spdm_response->remainder_length = 0;
     567              :         }
     568              : 
     569            2 :         libspdm_copy_mem(spdm_response + 1,
     570            2 :                          (size_t)(*response) + *response_size - (size_t)(spdm_response + 1),
     571              :                          (uint8_t *)spdm_mel,
     572              :                          LIBSPDM_MAX_MEL_BLOCK_LEN);
     573              : 
     574            2 :         spdm_response_size = sizeof(spdm_measurement_extension_log_response_t) +
     575              :                              LIBSPDM_MAX_MEL_BLOCK_LEN;
     576              : 
     577            2 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     578              :                                               false, spdm_response_size,
     579              :                                               spdm_response, response_size,
     580              :                                               response);
     581            2 :         calling_index++;
     582              :     }
     583            2 :         return LIBSPDM_STATUS_SUCCESS;
     584            1 :     case 0x8:
     585              :     {
     586              :         spdm_measurement_extension_log_response_t *spdm_response;
     587              :         size_t spdm_response_size;
     588              :         size_t transport_header_size;
     589              :         spdm_measurement_extension_log_dmtf_t *spdm_mel;
     590              : 
     591            1 :         spdm_mel = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
     592              : 
     593            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     594            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     595              : 
     596            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     597            1 :         spdm_response->header.request_response_code = SPDM_MEASUREMENT_EXTENSION_LOG;
     598            1 :         spdm_response->header.param1 = 0;
     599            1 :         spdm_response->header.param2 = 0;
     600              :         /* Portion_length is greater than the LIBSPDM_MAX_MEL_BLOCK_LEN */
     601            1 :         spdm_response->portion_length = LIBSPDM_MAX_MEL_BLOCK_LEN + 1;
     602            1 :         spdm_response->remainder_length = 0;
     603              : 
     604            1 :         libspdm_copy_mem(spdm_response + 1,
     605            1 :                          (size_t)(*response) + *response_size - (size_t)(spdm_response + 1),
     606              :                          (uint8_t *)spdm_mel,
     607              :                          LIBSPDM_MAX_MEL_BLOCK_LEN);
     608              : 
     609            1 :         spdm_response_size = sizeof(spdm_measurement_extension_log_response_t) +
     610              :                              LIBSPDM_MAX_MEL_BLOCK_LEN;
     611              : 
     612            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     613              :                                               false, spdm_response_size,
     614              :                                               spdm_response, response_size,
     615              :                                               response);
     616              :     }
     617            1 :         return LIBSPDM_STATUS_SUCCESS;
     618              : 
     619            1 :     case 0x9:
     620              :     {
     621              :         spdm_measurement_extension_log_response_t *spdm_response;
     622              :         size_t spdm_response_size;
     623              :         size_t transport_header_size;
     624              :         spdm_measurement_extension_log_dmtf_t *spdm_mel;
     625              : 
     626            1 :         spdm_mel = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
     627              : 
     628            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     629            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     630              : 
     631            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     632            1 :         spdm_response->header.request_response_code = SPDM_MEASUREMENT_EXTENSION_LOG;
     633            1 :         spdm_response->header.param1 = 0;
     634            1 :         spdm_response->header.param2 = 0;
     635              :         /* The total MEL length is larger than SPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE*/
     636            1 :         spdm_response->portion_length = LIBSPDM_MAX_MEL_BLOCK_LEN;
     637            1 :         spdm_response->remainder_length = SPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE;
     638              : 
     639            1 :         libspdm_copy_mem(spdm_response + 1,
     640            1 :                          (size_t)(*response) + *response_size - (size_t)(spdm_response + 1),
     641              :                          (uint8_t *)spdm_mel,
     642              :                          LIBSPDM_MAX_MEL_BLOCK_LEN);
     643              : 
     644            1 :         spdm_response_size = sizeof(spdm_measurement_extension_log_response_t) +
     645              :                              LIBSPDM_MAX_MEL_BLOCK_LEN;
     646              : 
     647            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     648              :                                               false, spdm_response_size,
     649              :                                               spdm_response, response_size,
     650              :                                               response);
     651              :     }
     652            1 :         return LIBSPDM_STATUS_SUCCESS;
     653              : 
     654            1 :     case 0xA:
     655              :     {
     656              :         spdm_measurement_extension_log_response_t *spdm_response;
     657              :         size_t spdm_response_size;
     658              :         size_t transport_header_size;
     659              :         spdm_measurement_extension_log_dmtf_t *spdm_mel;
     660              : 
     661            1 :         spdm_mel = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
     662              : 
     663            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     664            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     665              : 
     666            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     667            1 :         spdm_response->header.request_response_code = SPDM_MEASUREMENT_EXTENSION_LOG;
     668            1 :         spdm_response->header.param1 = 0;
     669            1 :         spdm_response->header.param2 = 0;
     670              :         /* The entire MEL is delivered in a single response. */
     671            1 :         spdm_response->portion_length = LIBSPDM_MAX_MEL_BLOCK_LEN;
     672            1 :         spdm_response->remainder_length = 0;
     673              : 
     674            1 :         libspdm_copy_mem(spdm_response + 1,
     675            1 :                          (size_t)(*response) + *response_size - (size_t)(spdm_response + 1),
     676              :                          (uint8_t *)spdm_mel,
     677              :                          LIBSPDM_MAX_MEL_BLOCK_LEN);
     678              : 
     679            1 :         spdm_response_size = sizeof(spdm_measurement_extension_log_response_t) +
     680              :                              LIBSPDM_MAX_MEL_BLOCK_LEN;
     681              : 
     682            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     683              :                                               false, spdm_response_size,
     684              :                                               spdm_response, response_size,
     685              :                                               response);
     686              :     }
     687            1 :         return LIBSPDM_STATUS_SUCCESS;
     688              : 
     689            0 :     default:
     690            0 :         return LIBSPDM_STATUS_RECEIVE_FAIL;
     691              :     }
     692              : }
     693              : 
     694              : /**
     695              :  * Test 1: message could not be sent
     696              :  * Expected Behavior: get a LIBSPDM_STATUS_SEND_FAIL, with no MEL messages received
     697              :  **/
     698            1 : static void req_get_measurement_extension_log_case1(void **state)
     699              : {
     700              :     libspdm_return_t status;
     701              :     libspdm_test_context_t *spdm_test_context;
     702              :     libspdm_context_t *spdm_context;
     703              :     size_t spdm_mel_size;
     704              :     uint8_t spdm_mel[LIBSPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE];
     705              : 
     706            1 :     spdm_test_context = *state;
     707            1 :     spdm_context = spdm_test_context->spdm_context;
     708            1 :     spdm_test_context->case_id = 0x1;
     709            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     710              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     711            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     712            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEL_CAP;
     713              : 
     714            1 :     libspdm_reset_message_b(spdm_context);
     715              : 
     716            1 :     spdm_mel_size = sizeof(spdm_mel);
     717            1 :     libspdm_zero_mem(spdm_mel, sizeof(spdm_mel));
     718              : 
     719            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     720            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     721              :         m_libspdm_use_measurement_hash_algo;
     722            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     723            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     724            1 :     spdm_context->local_context.algorithm.measurement_spec = SPDM_MEASUREMENT_SPECIFICATION_DMTF;
     725              : 
     726            1 :     status = libspdm_get_measurement_extension_log(spdm_context, NULL, &spdm_mel_size, spdm_mel);
     727            1 :     assert_int_equal(status, LIBSPDM_STATUS_SEND_FAIL);
     728            1 : }
     729              : 
     730              : /**
     731              :  * Test 2: Normal case, request a MEL, the MEL size remains unchanged
     732              :  * Expected Behavior: receives a valid MEL
     733              :  **/
     734            1 : static void req_get_measurement_extension_log_case2(void **state)
     735              : {
     736              :     libspdm_return_t status;
     737              :     libspdm_test_context_t *spdm_test_context;
     738              :     libspdm_context_t *spdm_context;
     739              :     size_t spdm_mel_size;
     740              :     uint8_t spdm_mel[LIBSPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE];
     741              : 
     742            1 :     spdm_test_context = *state;
     743            1 :     spdm_context = spdm_test_context->spdm_context;
     744            1 :     spdm_test_context->case_id = 0x2;
     745            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     746              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     747            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     748            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEL_CAP;
     749              : 
     750            1 :     libspdm_reset_message_b(spdm_context);
     751            1 :     spdm_mel_size = sizeof(spdm_mel);
     752            1 :     libspdm_zero_mem(spdm_mel, sizeof(spdm_mel));
     753              : 
     754            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     755            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     756              :         m_libspdm_use_measurement_hash_algo;
     757            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     758            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     759            1 :     spdm_context->local_context.algorithm.measurement_spec = SPDM_MEASUREMENT_SPECIFICATION_DMTF;
     760              : 
     761            1 :     status = libspdm_get_measurement_extension_log(spdm_context, NULL, &spdm_mel_size, spdm_mel);
     762            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     763            1 :     assert_int_equal(spdm_mel_size, m_libspdm_mel_len);
     764            1 : }
     765              : 
     766              : /**
     767              :  * Test 3: Normal case, request a MEL, the MEL size become more bigger when get MEL
     768              :  * The original MEL number is 3, the new MEL number is 4.
     769              :  * Expected Behavior: receives a valid MEL, and the MEL size is same with the before MEL size.
     770              :  **/
     771            1 : static void req_get_measurement_extension_log_case3(void **state)
     772              : {
     773              :     libspdm_return_t status;
     774              :     libspdm_test_context_t *spdm_test_context;
     775              :     libspdm_context_t *spdm_context;
     776              :     size_t spdm_mel_size;
     777              :     uint8_t spdm_mel[LIBSPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE];
     778              : 
     779            1 :     spdm_test_context = *state;
     780            1 :     spdm_context = spdm_test_context->spdm_context;
     781              : 
     782            1 :     spdm_test_context->case_id = 0x3;
     783            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     784              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     785            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     786            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEL_CAP;
     787              : 
     788            1 :     libspdm_reset_message_b(spdm_context);
     789            1 :     spdm_mel_size = sizeof(spdm_mel);
     790            1 :     libspdm_zero_mem(spdm_mel, sizeof(spdm_mel));
     791              : 
     792            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     793            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     794              :         m_libspdm_use_measurement_hash_algo;
     795            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     796            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     797            1 :     spdm_context->local_context.algorithm.measurement_spec = SPDM_MEASUREMENT_SPECIFICATION_DMTF;
     798              : 
     799            1 :     status = libspdm_get_measurement_extension_log(spdm_context, NULL, &spdm_mel_size, spdm_mel);
     800            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     801            1 :     assert_int_equal(spdm_mel_size, m_libspdm_mel_len);
     802            1 : }
     803              : 
     804              : /**
     805              :  * Test 4: Normal case, request a MEL, the MEL size become more bigger when get MEL
     806              :  * The original MEL number is 100, the new MEL number is 105.
     807              :  * Expected Behavior: receives a valid MEL, and the MEL size is same with the before MEL size.
     808              :  **/
     809            1 : static void req_get_measurement_extension_log_case4(void **state)
     810              : {
     811              :     libspdm_return_t status;
     812              :     libspdm_test_context_t *spdm_test_context;
     813              :     libspdm_context_t *spdm_context;
     814              :     size_t spdm_mel_size;
     815              :     uint8_t spdm_mel[LIBSPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE];
     816              : 
     817            1 :     spdm_test_context = *state;
     818            1 :     spdm_context = spdm_test_context->spdm_context;
     819            1 :     spdm_test_context->case_id = 0x4;
     820            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     821              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     822            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     823            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEL_CAP;
     824              : 
     825            1 :     libspdm_reset_message_b(spdm_context);
     826            1 :     spdm_mel_size = sizeof(spdm_mel);
     827            1 :     libspdm_zero_mem(spdm_mel, sizeof(spdm_mel));
     828              : 
     829            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     830            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     831              :         m_libspdm_use_measurement_hash_algo;
     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            1 :     spdm_context->local_context.algorithm.measurement_spec = SPDM_MEASUREMENT_SPECIFICATION_DMTF;
     835              : 
     836            1 :     status = libspdm_get_measurement_extension_log(spdm_context, NULL, &spdm_mel_size, spdm_mel);
     837            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     838            1 :     assert_int_equal(spdm_mel_size, m_libspdm_mel_len);
     839            1 : }
     840              : 
     841              : /**
     842              :  * Test 5: Normal case, request a MEL, the MEL size become more bigger when get MEL
     843              :  * The original MEL number is 100, the new MEL number is 200.
     844              :  * Expected Behavior: receives a valid MEL, and the MEL size is same with the before MEL size.
     845              :  **/
     846            1 : static void req_get_measurement_extension_log_case5(void **state)
     847              : {
     848              :     libspdm_return_t status;
     849              :     libspdm_test_context_t *spdm_test_context;
     850              :     libspdm_context_t *spdm_context;
     851              :     size_t spdm_mel_size;
     852              :     uint8_t spdm_mel[LIBSPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE];
     853              : 
     854            1 :     spdm_test_context = *state;
     855            1 :     spdm_context = spdm_test_context->spdm_context;
     856            1 :     spdm_test_context->case_id = 0x5;
     857            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     858              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     859            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     860            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEL_CAP;
     861              : 
     862            1 :     libspdm_reset_message_b(spdm_context);
     863            1 :     spdm_mel_size = sizeof(spdm_mel);
     864            1 :     libspdm_zero_mem(spdm_mel, sizeof(spdm_mel));
     865              : 
     866            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     867            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     868              :         m_libspdm_use_measurement_hash_algo;
     869            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     870            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     871            1 :     spdm_context->local_context.algorithm.measurement_spec = SPDM_MEASUREMENT_SPECIFICATION_DMTF;
     872              : 
     873            1 :     status = libspdm_get_measurement_extension_log(spdm_context, NULL, &spdm_mel_size, spdm_mel);
     874            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     875            1 :     assert_int_equal(spdm_mel_size, m_libspdm_mel_len);
     876            1 : }
     877              : 
     878              : /**
     879              :  * Test 6: Normal case, request a LIBSPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE MEL
     880              :  * Expected Behavior: receives a valid MEL
     881              :  **/
     882            1 : static void req_get_measurement_extension_log_case6(void **state)
     883              : {
     884              :     libspdm_return_t status;
     885              :     libspdm_test_context_t *spdm_test_context;
     886              :     libspdm_context_t *spdm_context;
     887              :     size_t spdm_mel_size;
     888              :     uint8_t spdm_mel[LIBSPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE];
     889              :     size_t mel_buffer_size;
     890              : 
     891            1 :     spdm_test_context = *state;
     892            1 :     spdm_context = spdm_test_context->spdm_context;
     893            1 :     spdm_test_context->case_id = 0x6;
     894            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     895              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     896            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     897            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEL_CAP;
     898            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     899            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     900              :         m_libspdm_use_measurement_hash_algo;
     901            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     902            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     903            1 :     spdm_context->local_context.algorithm.measurement_spec = SPDM_MEASUREMENT_SPECIFICATION_DMTF;
     904              : 
     905            1 :     libspdm_reset_message_b(spdm_context);
     906            1 :     spdm_mel_size = sizeof(spdm_mel);
     907            1 :     libspdm_zero_mem(spdm_mel, sizeof(spdm_mel));
     908              : 
     909            1 :     generate_mel_entry_test();
     910            1 :     mel_buffer_size = m_libspdm_mel_len;
     911              : 
     912            1 :     status = libspdm_get_measurement_extension_log(spdm_context, NULL, &spdm_mel_size, spdm_mel);
     913              : 
     914            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     915            1 :     assert_int_equal(spdm_mel_size, mel_buffer_size);
     916            1 :     assert_memory_equal(m_libspdm_mel_test, (void *)spdm_mel, spdm_mel_size);
     917            1 : }
     918              : 
     919              : /**
     920              :  * Test 7: The total amount of messages actually sent by the responder is less than the negotiated total mel len.
     921              :  * Expected Behavior: returns with status LIBSPDM_STATUS_INVALID_MSG_FIELD.
     922              :  **/
     923            1 : static void req_get_measurement_extension_log_case7(void **state)
     924              : {
     925              :     libspdm_return_t status;
     926              :     libspdm_test_context_t *spdm_test_context;
     927              :     libspdm_context_t *spdm_context;
     928              :     size_t spdm_mel_size;
     929              :     uint8_t spdm_mel[LIBSPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE];
     930              : 
     931            1 :     spdm_test_context = *state;
     932            1 :     spdm_context = spdm_test_context->spdm_context;
     933            1 :     spdm_test_context->case_id = 0x7;
     934            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     935              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     936            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     937            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEL_CAP;
     938            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     939            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     940              :         m_libspdm_use_measurement_hash_algo;
     941            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     942            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     943            1 :     spdm_context->local_context.algorithm.measurement_spec = SPDM_MEASUREMENT_SPECIFICATION_DMTF;
     944              : 
     945            1 :     libspdm_reset_message_b(spdm_context);
     946            1 :     spdm_mel_size = sizeof(spdm_mel);
     947            1 :     libspdm_zero_mem(spdm_mel, sizeof(spdm_mel));
     948              : 
     949            1 :     generate_mel_entry_test();
     950              : 
     951            1 :     status = libspdm_get_measurement_extension_log(spdm_context, NULL, &spdm_mel_size, spdm_mel);
     952              : 
     953            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
     954            1 : }
     955              : 
     956              : /**
     957              :  * Test 8: Portion_length is greater than the LIBSPDM_MAX_MEL_BLOCK_LEN
     958              :  * Expected Behavior: returns with status LIBSPDM_STATUS_INVALID_MSG_FIELD.
     959              :  **/
     960            1 : static void req_get_measurement_extension_log_case8(void **state)
     961              : {
     962              :     libspdm_return_t status;
     963              :     libspdm_test_context_t *spdm_test_context;
     964              :     libspdm_context_t *spdm_context;
     965              :     size_t spdm_mel_size;
     966              :     uint8_t spdm_mel[LIBSPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE];
     967              :     uint32_t original_max_spdm_msg_size;
     968              : 
     969            1 :     spdm_test_context = *state;
     970            1 :     spdm_context = spdm_test_context->spdm_context;
     971            1 :     spdm_test_context->case_id = 0x8;
     972            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     973              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     974            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     975            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEL_CAP;
     976            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     977            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     978              :         m_libspdm_use_measurement_hash_algo;
     979            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     980            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     981            1 :     spdm_context->local_context.algorithm.measurement_spec = SPDM_MEASUREMENT_SPECIFICATION_DMTF;
     982            1 :     original_max_spdm_msg_size = spdm_context->local_context.capability.max_spdm_msg_size;
     983            1 :     spdm_context->local_context.capability.max_spdm_msg_size =
     984              :         LIBSPDM_MAX_MEL_BLOCK_LEN +
     985              :         sizeof(spdm_measurement_extension_log_response_t);
     986              : 
     987            1 :     libspdm_reset_message_b(spdm_context);
     988            1 :     spdm_mel_size = sizeof(spdm_mel);
     989            1 :     libspdm_zero_mem(spdm_mel, sizeof(spdm_mel));
     990              : 
     991            1 :     generate_mel_entry_test();
     992              : 
     993            1 :     status = libspdm_get_measurement_extension_log(spdm_context, NULL, &spdm_mel_size, spdm_mel);
     994              : 
     995            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
     996            1 :     spdm_context->local_context.capability.max_spdm_msg_size = original_max_spdm_msg_size;
     997            1 : }
     998              : 
     999              : /**
    1000              :  * Test 9: The total MEL length is larger than SPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE
    1001              :  * Expected Behavior: returns with status LIBSPDM_STATUS_INVALID_MSG_FIELD.
    1002              :  **/
    1003            1 : static void req_get_measurement_extension_log_case9(void **state)
    1004              : {
    1005              :     libspdm_return_t status;
    1006              :     libspdm_test_context_t *spdm_test_context;
    1007              :     libspdm_context_t *spdm_context;
    1008              :     size_t spdm_mel_size;
    1009              :     uint8_t spdm_mel[LIBSPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE];
    1010              : 
    1011            1 :     spdm_test_context = *state;
    1012            1 :     spdm_context = spdm_test_context->spdm_context;
    1013            1 :     spdm_test_context->case_id = 0x9;
    1014            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
    1015              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1016            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    1017            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEL_CAP;
    1018            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
    1019            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    1020              :         m_libspdm_use_measurement_hash_algo;
    1021            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1022            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    1023            1 :     spdm_context->local_context.algorithm.measurement_spec = SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    1024              : 
    1025            1 :     libspdm_reset_message_b(spdm_context);
    1026            1 :     spdm_mel_size = sizeof(spdm_mel);
    1027            1 :     libspdm_zero_mem(spdm_mel, sizeof(spdm_mel));
    1028              : 
    1029            1 :     generate_mel_entry_test();
    1030              : 
    1031            1 :     status = libspdm_get_measurement_extension_log(spdm_context, NULL, &spdm_mel_size, spdm_mel);
    1032              : 
    1033            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
    1034            1 : }
    1035              : 
    1036              : /**
    1037              :  * Test 10: The Requester's MEL buffer is smaller than the MEASUREMENT_EXTENSION_LOG response's
    1038              :  * PortionLength.
    1039              :  * Expected Behavior: get a LIBSPDM_STATUS_BUFFER_TOO_SMALL return code
    1040              :  **/
    1041            1 : static void req_get_measurement_extension_log_case10(void **state)
    1042              : {
    1043              :     libspdm_return_t status;
    1044              :     libspdm_test_context_t *spdm_test_context;
    1045              :     libspdm_context_t *spdm_context;
    1046              :     size_t spdm_mel_size;
    1047              :     uint8_t spdm_mel[LIBSPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE];
    1048              : 
    1049            1 :     spdm_test_context = *state;
    1050            1 :     spdm_context = spdm_test_context->spdm_context;
    1051            1 :     spdm_test_context->case_id = 0xA;
    1052            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
    1053              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1054            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    1055            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEL_CAP;
    1056              : 
    1057            1 :     libspdm_reset_message_b(spdm_context);
    1058            1 :     libspdm_zero_mem(spdm_mel, sizeof(spdm_mel));
    1059              : 
    1060            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
    1061            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    1062              :         m_libspdm_use_measurement_hash_algo;
    1063            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1064            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    1065            1 :     spdm_context->local_context.algorithm.measurement_spec = SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    1066              : 
    1067              :     /* Case 0xA responds with a PortionLength of LIBSPDM_MAX_MEL_BLOCK_LEN. */
    1068            1 :     spdm_mel_size = LIBSPDM_MAX_MEL_BLOCK_LEN - 1;
    1069              : 
    1070            1 :     status = libspdm_get_measurement_extension_log(spdm_context, NULL, &spdm_mel_size, spdm_mel);
    1071            1 :     assert_int_equal(status, LIBSPDM_STATUS_BUFFER_TOO_SMALL);
    1072            1 : }
    1073              : 
    1074            1 : int libspdm_req_get_measurement_extension_log_test(void)
    1075              : {
    1076            1 :     const struct CMUnitTest test_cases[] = {
    1077              :         /* SendRequest failed*/
    1078              :         cmocka_unit_test(req_get_measurement_extension_log_case1),
    1079              :         /* Successful response, the MEL size remains unchanged*/
    1080              :         cmocka_unit_test(req_get_measurement_extension_log_case2),
    1081              :         /* Successful response, the MEL size become more bigger when get MEL. MEL number change from 3 to 4*/
    1082              :         cmocka_unit_test(req_get_measurement_extension_log_case3),
    1083              :         /* Successful response, the MEL size become more bigger when get MEL. MEL number change from 100 to 105*/
    1084              :         cmocka_unit_test(req_get_measurement_extension_log_case4),
    1085              :         /* Successful response, the MEL size become more bigger when get MEL. MEL number change from 100 to 200*/
    1086              :         cmocka_unit_test(req_get_measurement_extension_log_case5),
    1087              :         /* Successful response , LIBSPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE*/
    1088              :         cmocka_unit_test(req_get_measurement_extension_log_case6),
    1089              :         /* Failed response , The total amount of messages actually sent by the responder is less than the negotiated total mel len*/
    1090              :         cmocka_unit_test(req_get_measurement_extension_log_case7),
    1091              :         /* Failed response , Portion_length is greater than the LIBSPDM_MAX_MEL_BLOCK_LEN*/
    1092              :         cmocka_unit_test(req_get_measurement_extension_log_case8),
    1093              :         /* Failed response , The total MEL length is larger than SPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE*/
    1094              :         cmocka_unit_test(req_get_measurement_extension_log_case9),
    1095              :         /* Failed response , The caller's MEL buffer is smaller than the portion length*/
    1096              :         cmocka_unit_test(req_get_measurement_extension_log_case10),
    1097              :     };
    1098              : 
    1099            1 :     libspdm_test_context_t test_context = {
    1100              :         LIBSPDM_TEST_CONTEXT_VERSION,
    1101              :         true,
    1102              :         send_message,
    1103              :         receive_message,
    1104              :     };
    1105              : 
    1106            1 :     libspdm_setup_test_context(&test_context);
    1107              : 
    1108            1 :     return cmocka_run_group_tests(test_cases,
    1109              :                                   libspdm_unit_test_group_setup,
    1110              :                                   libspdm_unit_test_group_teardown);
    1111              : }
    1112              : 
    1113              : #endif /* LIBSPDM_ENABLE_CAPABILITY_MEL_CAP */
        

Generated by: LCOV version 2.0-1