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.4 % 504 486
Test Date: 2026-02-22 08:11:49 Functions: 100.0 % 14 14

            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           15 : 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           15 :     spdm_test_context = libspdm_get_test_context();
     161           15 :     switch (spdm_test_context->case_id) {
     162            1 :     case 0x1:
     163            1 :         return LIBSPDM_STATUS_SEND_FAIL;
     164           14 :     case 0x2:
     165              :     case 0x3:
     166              :     case 0x4:
     167              :     case 0x5:
     168              :     case 0x6:
     169              :     case 0x7:
     170              :     case 0x8:
     171              :     case 0x9:
     172           14 :         return LIBSPDM_STATUS_SUCCESS;
     173            0 :     default:
     174            0 :         return LIBSPDM_STATUS_SEND_FAIL;
     175              :     }
     176              : }
     177              : 
     178           14 : static libspdm_return_t receive_message(
     179              :     void *spdm_context, size_t *response_size, void **response, uint64_t timeout)
     180              : {
     181              :     libspdm_test_context_t *spdm_test_context;
     182              : 
     183           14 :     spdm_test_context = libspdm_get_test_context();
     184           14 :     switch (spdm_test_context->case_id) {
     185            0 :     case 0x1:
     186            0 :         return LIBSPDM_STATUS_RECEIVE_FAIL;
     187              : 
     188            1 :     case 0x2: {
     189              :         spdm_measurement_extension_log_response_t *spdm_response;
     190              :         size_t spdm_response_size;
     191              :         size_t transport_header_size;
     192              :         uint32_t portion_length;
     193              :         uint32_t remainder_length;
     194              :         size_t count;
     195              :         static size_t calling_index = 0;
     196              :         spdm_measurement_extension_log_dmtf_t *spdm_mel;
     197              : 
     198            1 :         spdm_mel = NULL;
     199            1 :         m_libspdm_mel_len = 0;
     200              : 
     201            1 :         libspdm_measurement_extension_log_collection(
     202              :             spdm_context,
     203              :             m_libspdm_use_mel_spec,
     204              :             m_libspdm_use_measurement_spec,
     205              :             m_libspdm_use_measurement_hash_algo,
     206              :             (void **)&spdm_mel, &m_libspdm_mel_len);
     207              : 
     208            1 :         count = (m_libspdm_mel_len + LIBSPDM_MAX_MEL_BLOCK_LEN - 1) / LIBSPDM_MAX_MEL_BLOCK_LEN;
     209            1 :         if (calling_index != count - 1) {
     210            0 :             portion_length = LIBSPDM_MAX_MEL_BLOCK_LEN;
     211            0 :             remainder_length =
     212            0 :                 (uint32_t)(m_libspdm_mel_len - LIBSPDM_MAX_MEL_BLOCK_LEN * (calling_index + 1));
     213              :         } else {
     214            1 :             portion_length = (uint32_t)(
     215              :                 m_libspdm_mel_len -
     216            1 :                 LIBSPDM_MAX_MEL_BLOCK_LEN * (count - 1));
     217            1 :             remainder_length = 0;
     218              :         }
     219              : 
     220            1 :         spdm_response_size = sizeof(spdm_measurement_extension_log_response_t) + portion_length;
     221            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     222            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     223              : 
     224            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     225            1 :         spdm_response->header.request_response_code = SPDM_MEASUREMENT_EXTENSION_LOG;
     226            1 :         spdm_response->header.param1 = 0;
     227            1 :         spdm_response->header.param2 = 0;
     228            1 :         spdm_response->portion_length = portion_length;
     229            1 :         spdm_response->remainder_length = remainder_length;
     230            1 :         libspdm_copy_mem(spdm_response + 1,
     231            1 :                          (size_t)(*response) + *response_size - (size_t)(spdm_response + 1),
     232            1 :                          (uint8_t *)spdm_mel +
     233            1 :                          LIBSPDM_MAX_MEL_BLOCK_LEN * calling_index,
     234              :                          portion_length);
     235              : 
     236            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     237              :                                               false, spdm_response_size,
     238              :                                               spdm_response, response_size,
     239              :                                               response);
     240              : 
     241            1 :         calling_index++;
     242            1 :         if (calling_index == count) {
     243            1 :             calling_index = 0;
     244              :         }
     245              :     }
     246            1 :         return LIBSPDM_STATUS_SUCCESS;
     247            1 :     case 0x3: {
     248              :         spdm_measurement_extension_log_response_t *spdm_response;
     249              :         size_t spdm_response_size;
     250              :         size_t transport_header_size;
     251              :         uint32_t portion_length;
     252              :         uint32_t remainder_length;
     253              :         size_t count;
     254              :         static size_t calling_index = 0;
     255              :         spdm_measurement_extension_log_dmtf_t *spdm_mel;
     256              :         spdm_measurement_extension_log_dmtf_t *measurement_extension_log;
     257              :         size_t mel_new_len;
     258              :         size_t mel_send_len;
     259              : 
     260            1 :         spdm_mel = NULL;
     261            1 :         m_libspdm_mel_len = 0;
     262            1 :         mel_new_len = 0;
     263            1 :         mel_send_len = 0;
     264            1 :         m_libspdm_mel_number = 3;
     265              : 
     266            1 :         generate_long_mel(m_libspdm_use_measurement_hash_algo);
     267              : 
     268            1 :         measurement_extension_log = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
     269            1 :         spdm_mel = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
     270            1 :         m_libspdm_mel_len = (size_t)(measurement_extension_log->mel_entries_len) +
     271              :                             sizeof(spdm_measurement_extension_log_dmtf_t);
     272              : 
     273            1 :         if (calling_index == 1) {
     274            0 :             m_libspdm_mel_number = 4;
     275            0 :             generate_long_mel(m_libspdm_use_measurement_hash_algo);
     276            0 :             measurement_extension_log = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
     277            0 :             mel_new_len = (size_t)(measurement_extension_log->mel_entries_len) +
     278              :                           sizeof(spdm_measurement_extension_log_dmtf_t);
     279              :         }
     280              : 
     281            1 :         mel_send_len = (m_libspdm_mel_len > mel_new_len) ? m_libspdm_mel_len : mel_new_len;
     282              : 
     283            1 :         count = (mel_send_len + LIBSPDM_MAX_MEL_BLOCK_LEN - 1) / LIBSPDM_MAX_MEL_BLOCK_LEN;
     284            1 :         if (calling_index != count - 1) {
     285            0 :             portion_length = LIBSPDM_MAX_MEL_BLOCK_LEN;
     286            0 :             remainder_length =
     287            0 :                 (uint32_t)(mel_send_len - LIBSPDM_MAX_MEL_BLOCK_LEN * (calling_index + 1));
     288              :         } else {
     289            1 :             portion_length = (uint32_t)(
     290              :                 m_libspdm_mel_len -
     291            1 :                 LIBSPDM_MAX_MEL_BLOCK_LEN * (count - 1));
     292            1 :             remainder_length = (uint32_t)(
     293            1 :                 mel_send_len -
     294            1 :                 LIBSPDM_MAX_MEL_BLOCK_LEN * (count - 1) -
     295              :                 portion_length);
     296              :         }
     297              : 
     298            1 :         spdm_response_size = sizeof(spdm_measurement_extension_log_response_t) + portion_length;
     299            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     300            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     301              : 
     302            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     303            1 :         spdm_response->header.request_response_code = SPDM_MEASUREMENT_EXTENSION_LOG;
     304            1 :         spdm_response->header.param1 = 0;
     305            1 :         spdm_response->header.param2 = 0;
     306            1 :         spdm_response->portion_length = portion_length;
     307            1 :         spdm_response->remainder_length = remainder_length;
     308            1 :         libspdm_copy_mem(spdm_response + 1,
     309            1 :                          (size_t)(*response) + *response_size - (size_t)(spdm_response + 1),
     310              :                          (uint8_t *)spdm_mel +
     311            1 :                          LIBSPDM_MAX_MEL_BLOCK_LEN * calling_index,
     312              :                          portion_length);
     313              : 
     314            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     315              :                                               false, spdm_response_size,
     316              :                                               spdm_response, response_size,
     317              :                                               response);
     318              : 
     319            1 :         calling_index++;
     320            1 :         if (calling_index == count) {
     321            1 :             calling_index = 0;
     322              :         }
     323              :     }
     324            1 :         return LIBSPDM_STATUS_SUCCESS;
     325            2 :     case 0x4: {
     326              :         spdm_measurement_extension_log_response_t *spdm_response;
     327              :         size_t spdm_response_size;
     328              :         size_t transport_header_size;
     329              :         uint32_t portion_length;
     330              :         uint32_t remainder_length;
     331              :         size_t count;
     332              :         static size_t calling_index = 0;
     333              :         spdm_measurement_extension_log_dmtf_t *spdm_mel;
     334              :         spdm_measurement_extension_log_dmtf_t *measurement_extension_log;
     335              :         size_t mel_new_len;
     336              :         size_t mel_send_len;
     337              : 
     338            2 :         spdm_mel = NULL;
     339            2 :         m_libspdm_mel_len = 0;
     340            2 :         mel_new_len = 0;
     341            2 :         mel_send_len = 0;
     342            2 :         m_libspdm_mel_number = 100;
     343              : 
     344            2 :         generate_long_mel(m_libspdm_use_measurement_hash_algo);
     345              : 
     346            2 :         measurement_extension_log = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
     347            2 :         spdm_mel = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
     348            2 :         m_libspdm_mel_len = (size_t)(measurement_extension_log->mel_entries_len) +
     349              :                             sizeof(spdm_measurement_extension_log_dmtf_t);
     350              : 
     351            2 :         if (calling_index == 1) {
     352            1 :             m_libspdm_mel_number = 105;
     353            1 :             generate_long_mel(m_libspdm_use_measurement_hash_algo);
     354            1 :             measurement_extension_log = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
     355            1 :             mel_new_len = (size_t)(measurement_extension_log->mel_entries_len) +
     356              :                           sizeof(spdm_measurement_extension_log_dmtf_t);
     357              :         }
     358              : 
     359            2 :         mel_send_len = (m_libspdm_mel_len > mel_new_len) ? m_libspdm_mel_len : mel_new_len;
     360              : 
     361            2 :         count = (m_libspdm_mel_len + LIBSPDM_MAX_MEL_BLOCK_LEN - 1) / LIBSPDM_MAX_MEL_BLOCK_LEN;
     362            2 :         if (calling_index != count - 1) {
     363            1 :             portion_length = LIBSPDM_MAX_MEL_BLOCK_LEN;
     364            1 :             remainder_length =
     365            1 :                 (uint32_t)(mel_send_len - LIBSPDM_MAX_MEL_BLOCK_LEN * (calling_index + 1));
     366              :         } else {
     367            1 :             portion_length = (uint32_t)(
     368              :                 m_libspdm_mel_len -
     369            1 :                 LIBSPDM_MAX_MEL_BLOCK_LEN * (count - 1));
     370            1 :             remainder_length = (uint32_t)(
     371            1 :                 mel_send_len -
     372            1 :                 LIBSPDM_MAX_MEL_BLOCK_LEN * (count - 1) -
     373              :                 portion_length);
     374              :         }
     375              : 
     376            2 :         spdm_response_size = sizeof(spdm_measurement_extension_log_response_t) + portion_length;
     377            2 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     378            2 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     379              : 
     380            2 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     381            2 :         spdm_response->header.request_response_code = SPDM_MEASUREMENT_EXTENSION_LOG;
     382            2 :         spdm_response->header.param1 = 0;
     383            2 :         spdm_response->header.param2 = 0;
     384            2 :         spdm_response->portion_length = portion_length;
     385            2 :         spdm_response->remainder_length = remainder_length;
     386            2 :         libspdm_copy_mem(spdm_response + 1,
     387            2 :                          (size_t)(*response) + *response_size - (size_t)(spdm_response + 1),
     388              :                          (uint8_t *)spdm_mel +
     389            2 :                          LIBSPDM_MAX_MEL_BLOCK_LEN * calling_index,
     390              :                          portion_length);
     391              : 
     392            2 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     393              :                                               false, spdm_response_size,
     394              :                                               spdm_response, response_size,
     395              :                                               response);
     396              : 
     397            2 :         calling_index++;
     398            2 :         if (calling_index == count) {
     399            1 :             calling_index = 0;
     400              :         }
     401              :     }
     402            2 :         return LIBSPDM_STATUS_SUCCESS;
     403            2 :     case 0x5: {
     404              :         spdm_measurement_extension_log_response_t *spdm_response;
     405              :         size_t spdm_response_size;
     406              :         size_t transport_header_size;
     407              :         uint32_t portion_length;
     408              :         uint32_t remainder_length;
     409              :         size_t count;
     410              :         static size_t calling_index = 0;
     411              :         spdm_measurement_extension_log_dmtf_t *spdm_mel;
     412              :         spdm_measurement_extension_log_dmtf_t *measurement_extension_log;
     413              :         size_t mel_new_len;
     414              :         size_t mel_send_len;
     415              : 
     416            2 :         spdm_mel = NULL;
     417            2 :         m_libspdm_mel_len = 0;
     418            2 :         mel_new_len = 0;
     419            2 :         mel_send_len = 0;
     420            2 :         m_libspdm_mel_number = 100;
     421              : 
     422            2 :         generate_long_mel(m_libspdm_use_measurement_hash_algo);
     423              : 
     424            2 :         measurement_extension_log = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
     425            2 :         spdm_mel = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
     426            2 :         m_libspdm_mel_len = (size_t)(measurement_extension_log->mel_entries_len) +
     427              :                             sizeof(spdm_measurement_extension_log_dmtf_t);
     428              : 
     429            2 :         if (calling_index == 1) {
     430            1 :             m_libspdm_mel_number = 200;
     431            1 :             generate_long_mel(m_libspdm_use_measurement_hash_algo);
     432            1 :             measurement_extension_log = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
     433            1 :             mel_new_len = (size_t)(measurement_extension_log->mel_entries_len) +
     434              :                           sizeof(spdm_measurement_extension_log_dmtf_t);
     435              :         }
     436              : 
     437            2 :         mel_send_len = (m_libspdm_mel_len > mel_new_len) ? m_libspdm_mel_len : mel_new_len;
     438              : 
     439            2 :         count = (m_libspdm_mel_len + LIBSPDM_MAX_MEL_BLOCK_LEN - 1) / LIBSPDM_MAX_MEL_BLOCK_LEN;
     440            2 :         if (calling_index != count - 1) {
     441            1 :             portion_length = LIBSPDM_MAX_MEL_BLOCK_LEN;
     442            1 :             remainder_length =
     443            1 :                 (uint32_t)(mel_send_len - LIBSPDM_MAX_MEL_BLOCK_LEN * (calling_index + 1));
     444              :         } else {
     445            1 :             portion_length = (uint32_t)(
     446              :                 m_libspdm_mel_len -
     447            1 :                 LIBSPDM_MAX_MEL_BLOCK_LEN * (count - 1));
     448            1 :             remainder_length = (uint32_t)(
     449            1 :                 mel_send_len -
     450            1 :                 LIBSPDM_MAX_MEL_BLOCK_LEN * (count - 1) -
     451              :                 portion_length);
     452              :         }
     453              : 
     454            2 :         spdm_response_size = sizeof(spdm_measurement_extension_log_response_t) + portion_length;
     455            2 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     456            2 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     457              : 
     458            2 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     459            2 :         spdm_response->header.request_response_code = SPDM_MEASUREMENT_EXTENSION_LOG;
     460            2 :         spdm_response->header.param1 = 0;
     461            2 :         spdm_response->header.param2 = 0;
     462            2 :         spdm_response->portion_length = portion_length;
     463            2 :         spdm_response->remainder_length = remainder_length;
     464            2 :         libspdm_copy_mem(spdm_response + 1,
     465            2 :                          (size_t)(*response) + *response_size - (size_t)(spdm_response + 1),
     466              :                          (uint8_t *)spdm_mel +
     467            2 :                          LIBSPDM_MAX_MEL_BLOCK_LEN * calling_index,
     468              :                          portion_length);
     469              : 
     470            2 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     471              :                                               false, spdm_response_size,
     472              :                                               spdm_response, response_size,
     473              :                                               response);
     474              : 
     475            2 :         calling_index++;
     476            2 :         if (calling_index == count) {
     477            1 :             calling_index = 0;
     478              :         }
     479              :     }
     480            2 :         return LIBSPDM_STATUS_SUCCESS;
     481            4 :     case 0x6:
     482              :     {
     483              :         spdm_measurement_extension_log_response_t *spdm_response;
     484              :         size_t spdm_response_size;
     485              :         size_t transport_header_size;
     486              :         uint32_t portion_length;
     487              :         uint32_t remainder_length;
     488              :         spdm_measurement_extension_log_dmtf_t *spdm_mel;
     489              : 
     490              :         static size_t count = 0;
     491              :         static size_t calling_index = 0;
     492              : 
     493            4 :         if (calling_index == 0) {
     494            1 :             count = (m_libspdm_mel_len / LIBSPDM_MAX_MEL_BLOCK_LEN) + 1;
     495              :         }
     496              : 
     497            4 :         spdm_mel = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
     498              : 
     499            4 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     500            4 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     501              : 
     502            4 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     503            4 :         spdm_response->header.request_response_code = SPDM_MEASUREMENT_EXTENSION_LOG;
     504            4 :         spdm_response->header.param1 = 0;
     505            4 :         spdm_response->header.param2 = 0;
     506              : 
     507            4 :         if(m_libspdm_mel_len > LIBSPDM_MAX_MEL_BLOCK_LEN) {
     508            3 :             portion_length = LIBSPDM_MAX_MEL_BLOCK_LEN;
     509            3 :             remainder_length = (uint32_t)(m_libspdm_mel_len - LIBSPDM_MAX_MEL_BLOCK_LEN);
     510              :         } else {
     511            1 :             portion_length  = (uint32_t)m_libspdm_mel_len;
     512            1 :             remainder_length = 0;
     513              :         }
     514              : 
     515            4 :         spdm_response->portion_length = portion_length;
     516            4 :         spdm_response->remainder_length = remainder_length;
     517              : 
     518            4 :         libspdm_copy_mem(spdm_response + 1,
     519            4 :                          (size_t)(*response) + *response_size - (size_t)(spdm_response + 1),
     520              :                          (uint8_t *)spdm_mel +
     521            4 :                          LIBSPDM_MAX_MEL_BLOCK_LEN * calling_index,
     522              :                          portion_length);
     523              : 
     524            4 :         spdm_response_size = sizeof(spdm_measurement_extension_log_response_t) + portion_length;
     525              : 
     526            4 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     527              :                                               false, spdm_response_size,
     528              :                                               spdm_response, response_size,
     529              :                                               response);
     530              : 
     531            4 :         m_libspdm_mel_len -= portion_length;
     532            4 :         calling_index++;
     533              : 
     534            4 :         if (calling_index == count) {
     535            0 :             calling_index = 0;
     536            0 :             m_libspdm_mel_len = 0;
     537              :         }
     538              :     }
     539            4 :         return LIBSPDM_STATUS_SUCCESS;
     540              : 
     541            2 :     case 0x7:
     542              :     {
     543              :         spdm_measurement_extension_log_response_t *spdm_response;
     544              :         size_t spdm_response_size;
     545              :         size_t transport_header_size;
     546              :         spdm_measurement_extension_log_dmtf_t *spdm_mel;
     547              : 
     548              :         static size_t calling_index = 0;
     549              : 
     550            2 :         spdm_mel = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
     551              : 
     552            2 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     553            2 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     554              : 
     555            2 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     556            2 :         spdm_response->header.request_response_code = SPDM_MEASUREMENT_EXTENSION_LOG;
     557            2 :         spdm_response->header.param1 = 0;
     558            2 :         spdm_response->header.param2 = 0;
     559            2 :         if (calling_index == 0) {
     560            1 :             spdm_response->portion_length = LIBSPDM_MAX_MEL_BLOCK_LEN;
     561            1 :             spdm_response->remainder_length = LIBSPDM_MAX_MEL_BLOCK_LEN;
     562              :         } else {
     563              :             /* The total amount of messages actually sent by the responder is less than the negotiated total mel len*/
     564            1 :             spdm_response->portion_length = LIBSPDM_MAX_MEL_BLOCK_LEN / 2;
     565            1 :             spdm_response->remainder_length = 0;
     566              :         }
     567              : 
     568            2 :         libspdm_copy_mem(spdm_response + 1,
     569            2 :                          (size_t)(*response) + *response_size - (size_t)(spdm_response + 1),
     570              :                          (uint8_t *)spdm_mel,
     571              :                          LIBSPDM_MAX_MEL_BLOCK_LEN);
     572              : 
     573            2 :         spdm_response_size = sizeof(spdm_measurement_extension_log_response_t) +
     574              :                              LIBSPDM_MAX_MEL_BLOCK_LEN;
     575              : 
     576            2 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     577              :                                               false, spdm_response_size,
     578              :                                               spdm_response, response_size,
     579              :                                               response);
     580            2 :         calling_index++;
     581              :     }
     582            2 :         return LIBSPDM_STATUS_SUCCESS;
     583            1 :     case 0x8:
     584              :     {
     585              :         spdm_measurement_extension_log_response_t *spdm_response;
     586              :         size_t spdm_response_size;
     587              :         size_t transport_header_size;
     588              :         spdm_measurement_extension_log_dmtf_t *spdm_mel;
     589              : 
     590            1 :         spdm_mel = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
     591              : 
     592            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     593            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     594              : 
     595            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     596            1 :         spdm_response->header.request_response_code = SPDM_MEASUREMENT_EXTENSION_LOG;
     597            1 :         spdm_response->header.param1 = 0;
     598            1 :         spdm_response->header.param2 = 0;
     599              :         /* Portion_length is greater than the LIBSPDM_MAX_MEL_BLOCK_LEN */
     600            1 :         spdm_response->portion_length = LIBSPDM_MAX_MEL_BLOCK_LEN + 1;
     601            1 :         spdm_response->remainder_length = 0;
     602              : 
     603            1 :         libspdm_copy_mem(spdm_response + 1,
     604            1 :                          (size_t)(*response) + *response_size - (size_t)(spdm_response + 1),
     605              :                          (uint8_t *)spdm_mel,
     606              :                          LIBSPDM_MAX_MEL_BLOCK_LEN);
     607              : 
     608            1 :         spdm_response_size = sizeof(spdm_measurement_extension_log_response_t) +
     609              :                              LIBSPDM_MAX_MEL_BLOCK_LEN;
     610              : 
     611            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     612              :                                               false, spdm_response_size,
     613              :                                               spdm_response, response_size,
     614              :                                               response);
     615              :     }
     616            1 :         return LIBSPDM_STATUS_SUCCESS;
     617              : 
     618            1 :     case 0x9:
     619              :     {
     620              :         spdm_measurement_extension_log_response_t *spdm_response;
     621              :         size_t spdm_response_size;
     622              :         size_t transport_header_size;
     623              :         spdm_measurement_extension_log_dmtf_t *spdm_mel;
     624              : 
     625            1 :         spdm_mel = (spdm_measurement_extension_log_dmtf_t *)m_libspdm_mel_test;
     626              : 
     627            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     628            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     629              : 
     630            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     631            1 :         spdm_response->header.request_response_code = SPDM_MEASUREMENT_EXTENSION_LOG;
     632            1 :         spdm_response->header.param1 = 0;
     633            1 :         spdm_response->header.param2 = 0;
     634              :         /* The total MEL length is larger than SPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE*/
     635            1 :         spdm_response->portion_length = LIBSPDM_MAX_MEL_BLOCK_LEN;
     636            1 :         spdm_response->remainder_length = SPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE;
     637              : 
     638            1 :         libspdm_copy_mem(spdm_response + 1,
     639            1 :                          (size_t)(*response) + *response_size - (size_t)(spdm_response + 1),
     640              :                          (uint8_t *)spdm_mel,
     641              :                          LIBSPDM_MAX_MEL_BLOCK_LEN);
     642              : 
     643            1 :         spdm_response_size = sizeof(spdm_measurement_extension_log_response_t) +
     644              :                              LIBSPDM_MAX_MEL_BLOCK_LEN;
     645              : 
     646            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     647              :                                               false, spdm_response_size,
     648              :                                               spdm_response, response_size,
     649              :                                               response);
     650              :     }
     651            1 :         return LIBSPDM_STATUS_SUCCESS;
     652              : 
     653            0 :     default:
     654            0 :         return LIBSPDM_STATUS_RECEIVE_FAIL;
     655              :     }
     656              : }
     657              : 
     658              : /**
     659              :  * Test 1: message could not be sent
     660              :  * Expected Behavior: get a LIBSPDM_STATUS_SEND_FAIL, with no MEL messages received
     661              :  **/
     662            1 : static void req_get_measurement_extension_log_case1(void **state)
     663              : {
     664              :     libspdm_return_t status;
     665              :     libspdm_test_context_t *spdm_test_context;
     666              :     libspdm_context_t *spdm_context;
     667              :     size_t spdm_mel_size;
     668              :     uint8_t spdm_mel[LIBSPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE];
     669              : 
     670            1 :     spdm_test_context = *state;
     671            1 :     spdm_context = spdm_test_context->spdm_context;
     672            1 :     spdm_test_context->case_id = 0x1;
     673            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     674              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     675            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     676            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEL_CAP;
     677              : 
     678            1 :     libspdm_reset_message_b(spdm_context);
     679              : 
     680            1 :     spdm_mel_size = sizeof(spdm_mel);
     681            1 :     libspdm_zero_mem(spdm_mel, sizeof(spdm_mel));
     682              : 
     683            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     684            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     685              :         m_libspdm_use_measurement_hash_algo;
     686            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     687            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     688            1 :     spdm_context->local_context.algorithm.measurement_spec = SPDM_MEASUREMENT_SPECIFICATION_DMTF;
     689              : 
     690            1 :     status = libspdm_get_measurement_extension_log(spdm_context, NULL, &spdm_mel_size, spdm_mel);
     691            1 :     assert_int_equal(status, LIBSPDM_STATUS_SEND_FAIL);
     692            1 : }
     693              : 
     694              : /**
     695              :  * Test 2: Normal case, request a MEL, the MEL size remains unchanged
     696              :  * Expected Behavior: receives a valid MEL
     697              :  **/
     698            1 : static void req_get_measurement_extension_log_case2(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 = 0x2;
     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            1 :     spdm_mel_size = sizeof(spdm_mel);
     716            1 :     libspdm_zero_mem(spdm_mel, sizeof(spdm_mel));
     717              : 
     718            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     719            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     720              :         m_libspdm_use_measurement_hash_algo;
     721            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     722            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     723            1 :     spdm_context->local_context.algorithm.measurement_spec = SPDM_MEASUREMENT_SPECIFICATION_DMTF;
     724              : 
     725            1 :     status = libspdm_get_measurement_extension_log(spdm_context, NULL, &spdm_mel_size, spdm_mel);
     726            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     727            1 :     assert_int_equal(spdm_mel_size, m_libspdm_mel_len);
     728            1 : }
     729              : 
     730              : /**
     731              :  * Test 3: Normal case, request a MEL, the MEL size become more bigger when get MEL
     732              :  * The original MEL number is 3, the new MEL number is 4.
     733              :  * Expected Behavior: receives a valid MEL, and the MEL size is same with the before MEL size.
     734              :  **/
     735            1 : static void req_get_measurement_extension_log_case3(void **state)
     736              : {
     737              :     libspdm_return_t status;
     738              :     libspdm_test_context_t *spdm_test_context;
     739              :     libspdm_context_t *spdm_context;
     740              :     size_t spdm_mel_size;
     741              :     uint8_t spdm_mel[LIBSPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE];
     742              : 
     743            1 :     spdm_test_context = *state;
     744            1 :     spdm_context = spdm_test_context->spdm_context;
     745              : 
     746            1 :     spdm_test_context->case_id = 0x3;
     747            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     748              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     749            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     750            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEL_CAP;
     751              : 
     752            1 :     libspdm_reset_message_b(spdm_context);
     753            1 :     spdm_mel_size = sizeof(spdm_mel);
     754            1 :     libspdm_zero_mem(spdm_mel, sizeof(spdm_mel));
     755              : 
     756            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     757            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     758              :         m_libspdm_use_measurement_hash_algo;
     759            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     760            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     761            1 :     spdm_context->local_context.algorithm.measurement_spec = SPDM_MEASUREMENT_SPECIFICATION_DMTF;
     762              : 
     763            1 :     status = libspdm_get_measurement_extension_log(spdm_context, NULL, &spdm_mel_size, spdm_mel);
     764            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     765            1 :     assert_int_equal(spdm_mel_size, m_libspdm_mel_len);
     766            1 : }
     767              : 
     768              : /**
     769              :  * Test 4: Normal case, request a MEL, the MEL size become more bigger when get MEL
     770              :  * The original MEL number is 100, the new MEL number is 105.
     771              :  * Expected Behavior: receives a valid MEL, and the MEL size is same with the before MEL size.
     772              :  **/
     773            1 : static void req_get_measurement_extension_log_case4(void **state)
     774              : {
     775              :     libspdm_return_t status;
     776              :     libspdm_test_context_t *spdm_test_context;
     777              :     libspdm_context_t *spdm_context;
     778              :     size_t spdm_mel_size;
     779              :     uint8_t spdm_mel[LIBSPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE];
     780              : 
     781            1 :     spdm_test_context = *state;
     782            1 :     spdm_context = spdm_test_context->spdm_context;
     783            1 :     spdm_test_context->case_id = 0x4;
     784            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     785              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     786            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     787            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEL_CAP;
     788              : 
     789            1 :     libspdm_reset_message_b(spdm_context);
     790            1 :     spdm_mel_size = sizeof(spdm_mel);
     791            1 :     libspdm_zero_mem(spdm_mel, sizeof(spdm_mel));
     792              : 
     793            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     794            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     795              :         m_libspdm_use_measurement_hash_algo;
     796            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     797            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     798            1 :     spdm_context->local_context.algorithm.measurement_spec = SPDM_MEASUREMENT_SPECIFICATION_DMTF;
     799              : 
     800            1 :     status = libspdm_get_measurement_extension_log(spdm_context, NULL, &spdm_mel_size, spdm_mel);
     801            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     802            1 :     assert_int_equal(spdm_mel_size, m_libspdm_mel_len);
     803            1 : }
     804              : 
     805              : /**
     806              :  * Test 5: Normal case, request a MEL, the MEL size become more bigger when get MEL
     807              :  * The original MEL number is 100, the new MEL number is 200.
     808              :  * Expected Behavior: receives a valid MEL, and the MEL size is same with the before MEL size.
     809              :  **/
     810            1 : static void req_get_measurement_extension_log_case5(void **state)
     811              : {
     812              :     libspdm_return_t status;
     813              :     libspdm_test_context_t *spdm_test_context;
     814              :     libspdm_context_t *spdm_context;
     815              :     size_t spdm_mel_size;
     816              :     uint8_t spdm_mel[LIBSPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE];
     817              : 
     818            1 :     spdm_test_context = *state;
     819            1 :     spdm_context = spdm_test_context->spdm_context;
     820            1 :     spdm_test_context->case_id = 0x5;
     821            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     822              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     823            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     824            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEL_CAP;
     825              : 
     826            1 :     libspdm_reset_message_b(spdm_context);
     827            1 :     spdm_mel_size = sizeof(spdm_mel);
     828            1 :     libspdm_zero_mem(spdm_mel, sizeof(spdm_mel));
     829              : 
     830            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     831            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     832              :         m_libspdm_use_measurement_hash_algo;
     833            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     834            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     835            1 :     spdm_context->local_context.algorithm.measurement_spec = SPDM_MEASUREMENT_SPECIFICATION_DMTF;
     836              : 
     837            1 :     status = libspdm_get_measurement_extension_log(spdm_context, NULL, &spdm_mel_size, spdm_mel);
     838            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     839            1 :     assert_int_equal(spdm_mel_size, m_libspdm_mel_len);
     840            1 : }
     841              : 
     842              : /**
     843              :  * Test 6: Normal case, request a LIBSPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE MEL
     844              :  * Expected Behavior: receives a valid MEL
     845              :  **/
     846            1 : static void req_get_measurement_extension_log_case6(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              :     size_t mel_buffer_size;
     854              : 
     855            1 :     spdm_test_context = *state;
     856            1 :     spdm_context = spdm_test_context->spdm_context;
     857            1 :     spdm_test_context->case_id = 0x6;
     858            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     859              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     860            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     861            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEL_CAP;
     862            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     863            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     864              :         m_libspdm_use_measurement_hash_algo;
     865            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     866            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     867            1 :     spdm_context->local_context.algorithm.measurement_spec = SPDM_MEASUREMENT_SPECIFICATION_DMTF;
     868              : 
     869            1 :     libspdm_reset_message_b(spdm_context);
     870            1 :     spdm_mel_size = sizeof(spdm_mel);
     871            1 :     libspdm_zero_mem(spdm_mel, sizeof(spdm_mel));
     872              : 
     873            1 :     generate_mel_entry_test();
     874            1 :     mel_buffer_size = m_libspdm_mel_len;
     875              : 
     876            1 :     status = libspdm_get_measurement_extension_log(spdm_context, NULL, &spdm_mel_size, spdm_mel);
     877              : 
     878            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     879            1 :     assert_int_equal(spdm_mel_size, mel_buffer_size);
     880            1 :     assert_memory_equal(m_libspdm_mel_test, (void *)spdm_mel, spdm_mel_size);
     881            1 : }
     882              : 
     883              : /**
     884              :  * Test 7: The total amount of messages actually sent by the responder is less than the negotiated total mel len.
     885              :  * Expected Behavior: returns with status LIBSPDM_STATUS_INVALID_MSG_FIELD.
     886              :  **/
     887            1 : static void req_get_measurement_extension_log_case7(void **state)
     888              : {
     889              :     libspdm_return_t status;
     890              :     libspdm_test_context_t *spdm_test_context;
     891              :     libspdm_context_t *spdm_context;
     892              :     size_t spdm_mel_size;
     893              :     uint8_t spdm_mel[LIBSPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE];
     894              : 
     895            1 :     spdm_test_context = *state;
     896            1 :     spdm_context = spdm_test_context->spdm_context;
     897            1 :     spdm_test_context->case_id = 0x7;
     898            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     899              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     900            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     901            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEL_CAP;
     902            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     903            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     904              :         m_libspdm_use_measurement_hash_algo;
     905            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     906            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     907            1 :     spdm_context->local_context.algorithm.measurement_spec = SPDM_MEASUREMENT_SPECIFICATION_DMTF;
     908              : 
     909            1 :     libspdm_reset_message_b(spdm_context);
     910            1 :     spdm_mel_size = sizeof(spdm_mel);
     911            1 :     libspdm_zero_mem(spdm_mel, sizeof(spdm_mel));
     912              : 
     913            1 :     generate_mel_entry_test();
     914              : 
     915            1 :     status = libspdm_get_measurement_extension_log(spdm_context, NULL, &spdm_mel_size, spdm_mel);
     916              : 
     917            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
     918            1 : }
     919              : 
     920              : /**
     921              :  * Test 8: Portion_length is greater than the LIBSPDM_MAX_MEL_BLOCK_LEN
     922              :  * Expected Behavior: returns with status LIBSPDM_STATUS_INVALID_MSG_FIELD.
     923              :  **/
     924            1 : static void req_get_measurement_extension_log_case8(void **state)
     925              : {
     926              :     libspdm_return_t status;
     927              :     libspdm_test_context_t *spdm_test_context;
     928              :     libspdm_context_t *spdm_context;
     929              :     size_t spdm_mel_size;
     930              :     uint8_t spdm_mel[LIBSPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE];
     931              :     uint32_t original_max_spdm_msg_size;
     932              : 
     933            1 :     spdm_test_context = *state;
     934            1 :     spdm_context = spdm_test_context->spdm_context;
     935            1 :     spdm_test_context->case_id = 0x8;
     936            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     937              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     938            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     939            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEL_CAP;
     940            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     941            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     942              :         m_libspdm_use_measurement_hash_algo;
     943            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     944            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     945            1 :     spdm_context->local_context.algorithm.measurement_spec = SPDM_MEASUREMENT_SPECIFICATION_DMTF;
     946            1 :     original_max_spdm_msg_size = spdm_context->local_context.capability.max_spdm_msg_size;
     947            1 :     spdm_context->local_context.capability.max_spdm_msg_size =
     948              :         LIBSPDM_MAX_MEL_BLOCK_LEN +
     949              :         sizeof(spdm_measurement_extension_log_response_t);
     950              : 
     951            1 :     libspdm_reset_message_b(spdm_context);
     952            1 :     spdm_mel_size = sizeof(spdm_mel);
     953            1 :     libspdm_zero_mem(spdm_mel, sizeof(spdm_mel));
     954              : 
     955            1 :     generate_mel_entry_test();
     956              : 
     957            1 :     status = libspdm_get_measurement_extension_log(spdm_context, NULL, &spdm_mel_size, spdm_mel);
     958              : 
     959            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
     960            1 :     spdm_context->local_context.capability.max_spdm_msg_size = original_max_spdm_msg_size;
     961            1 : }
     962              : 
     963              : /**
     964              :  * Test 9: The total MEL length is larger than SPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE
     965              :  * Expected Behavior: returns with status LIBSPDM_STATUS_INVALID_MSG_FIELD.
     966              :  **/
     967            1 : static void req_get_measurement_extension_log_case9(void **state)
     968              : {
     969              :     libspdm_return_t status;
     970              :     libspdm_test_context_t *spdm_test_context;
     971              :     libspdm_context_t *spdm_context;
     972              :     size_t spdm_mel_size;
     973              :     uint8_t spdm_mel[LIBSPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE];
     974              : 
     975            1 :     spdm_test_context = *state;
     976            1 :     spdm_context = spdm_test_context->spdm_context;
     977            1 :     spdm_test_context->case_id = 0x9;
     978            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     979              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     980            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     981            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEL_CAP;
     982            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     983            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     984              :         m_libspdm_use_measurement_hash_algo;
     985            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     986            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     987            1 :     spdm_context->local_context.algorithm.measurement_spec = SPDM_MEASUREMENT_SPECIFICATION_DMTF;
     988              : 
     989            1 :     libspdm_reset_message_b(spdm_context);
     990            1 :     spdm_mel_size = sizeof(spdm_mel);
     991            1 :     libspdm_zero_mem(spdm_mel, sizeof(spdm_mel));
     992              : 
     993            1 :     generate_mel_entry_test();
     994              : 
     995            1 :     status = libspdm_get_measurement_extension_log(spdm_context, NULL, &spdm_mel_size, spdm_mel);
     996              : 
     997            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
     998            1 : }
     999              : 
    1000            1 : int libspdm_req_get_measurement_extension_log_test(void)
    1001              : {
    1002            1 :     const struct CMUnitTest test_cases[] = {
    1003              :         /* SendRequest failed*/
    1004              :         cmocka_unit_test(req_get_measurement_extension_log_case1),
    1005              :         /* Successful response, the MEL size remains unchanged*/
    1006              :         cmocka_unit_test(req_get_measurement_extension_log_case2),
    1007              :         /* Successful response, the MEL size become more bigger when get MEL. MEL number change from 3 to 4*/
    1008              :         cmocka_unit_test(req_get_measurement_extension_log_case3),
    1009              :         /* Successful response, the MEL size become more bigger when get MEL. MEL number change from 100 to 105*/
    1010              :         cmocka_unit_test(req_get_measurement_extension_log_case4),
    1011              :         /* Successful response, the MEL size become more bigger when get MEL. MEL number change from 100 to 200*/
    1012              :         cmocka_unit_test(req_get_measurement_extension_log_case5),
    1013              :         /* Successful response , LIBSPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE*/
    1014              :         cmocka_unit_test(req_get_measurement_extension_log_case6),
    1015              :         /* Failed response , The total amount of messages actually sent by the responder is less than the negotiated total mel len*/
    1016              :         cmocka_unit_test(req_get_measurement_extension_log_case7),
    1017              :         /* Failed response , Portion_length is greater than the LIBSPDM_MAX_MEL_BLOCK_LEN*/
    1018              :         cmocka_unit_test(req_get_measurement_extension_log_case8),
    1019              :         /* Failed response , The total MEL length is larger than SPDM_MAX_MEASUREMENT_EXTENSION_LOG_SIZE*/
    1020              :         cmocka_unit_test(req_get_measurement_extension_log_case9),
    1021              : 
    1022              :     };
    1023              : 
    1024            1 :     libspdm_test_context_t test_context = {
    1025              :         LIBSPDM_TEST_CONTEXT_VERSION,
    1026              :         true,
    1027              :         send_message,
    1028              :         receive_message,
    1029              :     };
    1030              : 
    1031            1 :     libspdm_setup_test_context(&test_context);
    1032              : 
    1033            1 :     return cmocka_run_group_tests(test_cases,
    1034              :                                   libspdm_unit_test_group_setup,
    1035              :                                   libspdm_unit_test_group_teardown);
    1036              : }
    1037              : 
    1038              : #endif /* LIBSPDM_ENABLE_CAPABILITY_MEL_CAP */
        

Generated by: LCOV version 2.0-1