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.1 % 510 490
Test Date: 2025-06-29 08:09:00 Functions: 100.0 % 14 14

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

Generated by: LCOV version 2.0-1