LCOV - code coverage report
Current view: top level - unit_test/test_spdm_responder - measurement_extension_log.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 137 137
Test Date: 2025-06-29 08:09:00 Functions: 100.0 % 6 6

            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_responder_lib.h"
       9              : 
      10              : #if LIBSPDM_ENABLE_CAPABILITY_MEL_CAP
      11              : 
      12              : spdm_get_measurement_extension_log_request_t m_libspdm_get_measurement_extension_log_request1 = {
      13              :     { SPDM_MESSAGE_VERSION_13, SPDM_GET_MEASUREMENT_EXTENSION_LOG, 0, 0 },
      14              :     0,
      15              :     LIBSPDM_MAX_MEL_BLOCK_LEN
      16              : };
      17              : size_t m_libspdm_get_measurement_extension_log_request1_size =
      18              :     sizeof(m_libspdm_get_measurement_extension_log_request1);
      19              : 
      20              : spdm_get_measurement_extension_log_request_t m_libspdm_get_measurement_extension_log_request2 = {
      21              :     { SPDM_MESSAGE_VERSION_13, SPDM_GET_MEASUREMENT_EXTENSION_LOG, 0, 0 },
      22              :     0,
      23              :     0
      24              : };
      25              : size_t m_libspdm_get_measurement_extension_log_request2_size =
      26              :     sizeof(m_libspdm_get_measurement_extension_log_request2);
      27              : 
      28              : spdm_get_measurement_extension_log_request_t m_libspdm_get_measurement_extension_log_request3 = {
      29              :     { SPDM_MESSAGE_VERSION_13, SPDM_GET_MEASUREMENT_EXTENSION_LOG, 0, 0 },
      30              :     0,
      31              :     LIBSPDM_MAX_MEL_BLOCK_LEN + 1
      32              : };
      33              : size_t m_libspdm_get_measurement_extension_log_request3_size =
      34              :     sizeof(m_libspdm_get_measurement_extension_log_request3);
      35              : 
      36              : spdm_get_measurement_extension_log_request_t m_libspdm_get_measurement_extension_log_request4 = {
      37              :     { SPDM_MESSAGE_VERSION_13, SPDM_GET_MEASUREMENT_EXTENSION_LOG, 0, 0 },
      38              :     LIBSPDM_MAX_MEL_BLOCK_LEN,
      39              :     LIBSPDM_MAX_MEL_BLOCK_LEN
      40              : };
      41              : size_t m_libspdm_get_measurement_extension_log_request4_size =
      42              :     sizeof(m_libspdm_get_measurement_extension_log_request4);
      43              : 
      44              : /**
      45              :  * Test 1: request the first LIBSPDM_MAX_MEL_BLOCK_LEN bytes of the MEL
      46              :  * Expected Behavior: generate a correctly formed MEL message, including its portion_length and remainder_length fields
      47              :  **/
      48            1 : void libspdm_test_responder_measurement_extension_log_case1(void **state)
      49              : {
      50              :     libspdm_return_t status;
      51              :     libspdm_test_context_t *spdm_test_context;
      52              :     libspdm_context_t *spdm_context;
      53              :     size_t response_size;
      54              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
      55              :     spdm_measurement_extension_log_response_t *spdm_response;
      56              :     spdm_measurement_extension_log_dmtf_t *spdm_mel;
      57              :     size_t spdm_mel_len;
      58              : 
      59            1 :     spdm_test_context = *state;
      60            1 :     spdm_context = spdm_test_context->spdm_context;
      61            1 :     spdm_test_context->case_id = 0x1;
      62            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
      63              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
      64            1 :     spdm_context->connection_info.connection_state =
      65              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
      66            1 :     spdm_context->local_context.capability.flags |=
      67              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEL_CAP;
      68            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
      69              :         m_libspdm_use_hash_algo;
      70            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
      71              :         m_libspdm_use_asym_algo;
      72            1 :     spdm_context->connection_info.algorithm.measurement_spec =
      73              :         m_libspdm_use_measurement_spec;
      74            1 :     spdm_context->connection_info.algorithm.mel_spec =
      75              :         m_libspdm_use_mel_spec;
      76            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
      77              :         m_libspdm_use_measurement_hash_algo;
      78              : 
      79            1 :     response_size = sizeof(response);
      80            1 :     status = libspdm_get_response_measurement_extension_log(
      81              :         spdm_context, m_libspdm_get_measurement_extension_log_request1_size,
      82              :         &m_libspdm_get_measurement_extension_log_request1, &response_size, response);
      83            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
      84              : 
      85            1 :     spdm_mel = NULL;
      86            1 :     spdm_mel_len = 0;
      87            1 :     libspdm_measurement_extension_log_collection(
      88              :         spdm_context,
      89              :         m_libspdm_use_mel_spec,
      90              :         m_libspdm_use_measurement_spec,
      91              :         m_libspdm_use_measurement_hash_algo,
      92              :         (void **)&spdm_mel, &spdm_mel_len);
      93              : 
      94            1 :     assert_int_equal(response_size,
      95              :                      sizeof(spdm_measurement_extension_log_response_t) +
      96              :                      spdm_mel_len);
      97            1 :     spdm_response = (void *)response;
      98            1 :     assert_int_equal(spdm_response->header.request_response_code,
      99              :                      SPDM_MEASUREMENT_EXTENSION_LOG);
     100            1 :     assert_int_equal(spdm_response->header.param1, 0);
     101            1 :     assert_int_equal(spdm_response->portion_length, spdm_mel_len);
     102            1 :     assert_int_equal(spdm_response->remainder_length, 0);
     103            1 :     assert_memory_equal(spdm_response + 1, spdm_mel, spdm_mel_len);
     104            1 : }
     105              : 
     106              : /**
     107              :  * Test 2: request.length is less than the MEL len
     108              :  * Expected Behavior: generate a correctly formed MEL message, including its portion_length and remainder_length fields
     109              :  **/
     110            1 : void libspdm_test_responder_measurement_extension_log_case2(void **state)
     111              : {
     112              :     libspdm_return_t status;
     113              :     libspdm_test_context_t *spdm_test_context;
     114              :     libspdm_context_t *spdm_context;
     115              :     size_t response_size;
     116              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     117              :     spdm_measurement_extension_log_response_t  *spdm_response;
     118              :     spdm_measurement_extension_log_dmtf_t *spdm_mel;
     119              :     size_t spdm_mel_len;
     120              : 
     121            1 :     spdm_test_context = *state;
     122            1 :     spdm_context = spdm_test_context->spdm_context;
     123            1 :     spdm_test_context->case_id = 0x2;
     124            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     125              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     126            1 :     spdm_context->connection_info.connection_state =
     127              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     128            1 :     spdm_context->local_context.capability.flags |=
     129              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEL_CAP;
     130            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     131              :         m_libspdm_use_hash_algo;
     132            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     133              :         m_libspdm_use_asym_algo;
     134            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     135              :         m_libspdm_use_measurement_spec;
     136            1 :     spdm_context->connection_info.algorithm.mel_spec =
     137              :         m_libspdm_use_mel_spec;
     138            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     139              :         m_libspdm_use_measurement_hash_algo;
     140              : 
     141            1 :     spdm_mel = NULL;
     142            1 :     spdm_mel_len = 0;
     143            1 :     libspdm_measurement_extension_log_collection(spdm_context,
     144              :                                                  m_libspdm_use_mel_spec,
     145              :                                                  m_libspdm_use_measurement_spec,
     146              :                                                  m_libspdm_use_measurement_hash_algo,
     147              :                                                  (void **)&spdm_mel, &spdm_mel_len);
     148              : 
     149              :     /* Test the validity of the request.length.*/
     150            1 :     m_libspdm_get_measurement_extension_log_request2.length = (uint32_t)spdm_mel_len / 2;
     151              : 
     152            1 :     response_size = sizeof(response);
     153            1 :     status = libspdm_get_response_measurement_extension_log(
     154              :         spdm_context, m_libspdm_get_measurement_extension_log_request2_size,
     155              :         &m_libspdm_get_measurement_extension_log_request2, &response_size, response);
     156            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     157              : 
     158            1 :     assert_int_equal(response_size,
     159              :                      sizeof(spdm_measurement_extension_log_response_t) +
     160              :                      spdm_mel_len / 2);
     161            1 :     spdm_response = (void *)response;
     162            1 :     assert_int_equal(spdm_response->header.request_response_code,
     163              :                      SPDM_MEASUREMENT_EXTENSION_LOG);
     164            1 :     assert_int_equal(spdm_response->header.param1, 0);
     165            1 :     assert_int_equal(spdm_response->portion_length, spdm_mel_len / 2);
     166            1 :     assert_int_equal(spdm_response->remainder_length, spdm_mel_len / 2 + 1);
     167            1 :     assert_memory_equal(spdm_response + 1, (void *)spdm_mel,
     168              :                         response_size - sizeof(spdm_measurement_extension_log_response_t));
     169            1 : }
     170              : 
     171              : /**
     172              :  * Test 3: When the request.length is greater than LIBSPDM_MAX_MEL_BLOCK_LEN.
     173              :  * Expected Behavior: generate a correctly formed MEL message, including its portion_length and remainder_length fields
     174              :  **/
     175            1 : void libspdm_test_responder_measurement_extension_log_case3(void **state)
     176              : {
     177              :     libspdm_return_t status;
     178              :     libspdm_test_context_t *spdm_test_context;
     179              :     libspdm_context_t *spdm_context;
     180              :     size_t response_size;
     181              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     182              :     spdm_measurement_extension_log_response_t *spdm_response;
     183              :     spdm_measurement_extension_log_dmtf_t *spdm_mel;
     184              :     size_t spdm_mel_len;
     185              : 
     186            1 :     spdm_test_context = *state;
     187            1 :     spdm_context = spdm_test_context->spdm_context;
     188            1 :     spdm_test_context->case_id = 0x3;
     189            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     190              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     191            1 :     spdm_context->connection_info.connection_state =
     192              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     193            1 :     spdm_context->local_context.capability.flags |=
     194              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEL_CAP;
     195            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     196              :         m_libspdm_use_hash_algo;
     197            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     198              :         m_libspdm_use_asym_algo;
     199            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     200              :         m_libspdm_use_measurement_spec;
     201            1 :     spdm_context->connection_info.algorithm.mel_spec =
     202              :         m_libspdm_use_mel_spec;
     203            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     204              :         m_libspdm_use_measurement_hash_algo;
     205              : 
     206            1 :     response_size = sizeof(response);
     207            1 :     status = libspdm_get_response_measurement_extension_log(
     208              :         spdm_context, m_libspdm_get_measurement_extension_log_request3_size,
     209              :         &m_libspdm_get_measurement_extension_log_request3, &response_size, response);
     210            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     211              : 
     212            1 :     spdm_mel = NULL;
     213            1 :     spdm_mel_len = 0;
     214            1 :     libspdm_measurement_extension_log_collection(spdm_context,
     215              :                                                  m_libspdm_use_mel_spec,
     216              :                                                  m_libspdm_use_measurement_spec,
     217              :                                                  m_libspdm_use_measurement_hash_algo,
     218              :                                                  (void **)&spdm_mel, &spdm_mel_len);
     219              : 
     220            1 :     assert_int_equal(response_size,
     221              :                      sizeof(spdm_measurement_extension_log_response_t) +
     222              :                      spdm_mel_len);
     223            1 :     spdm_response = (void *)response;
     224            1 :     assert_int_equal(spdm_response->header.request_response_code,
     225              :                      SPDM_MEASUREMENT_EXTENSION_LOG);
     226            1 :     assert_int_equal(spdm_response->header.param1, 0);
     227            1 :     assert_int_equal(spdm_response->portion_length, spdm_mel_len);
     228            1 :     assert_int_equal(spdm_response->remainder_length, 0);
     229            1 :     assert_memory_equal(spdm_response + 1, (void *)spdm_mel,
     230              :                         response_size - sizeof(spdm_measurement_extension_log_response_t));
     231            1 : }
     232              : 
     233              : /**
     234              :  * Test 4: request.offset > spdm mel len , wrong request message
     235              :  * Expected Behavior: Generate error response message
     236              :  **/
     237            1 : void libspdm_test_responder_measurement_extension_log_case4(void **state)
     238              : {
     239              :     libspdm_return_t status;
     240              :     libspdm_test_context_t *spdm_test_context;
     241              :     libspdm_context_t *spdm_context;
     242              :     size_t response_size;
     243              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     244              :     spdm_measurement_extension_log_response_t *spdm_response;
     245              :     spdm_measurement_extension_log_dmtf_t *spdm_mel;
     246              :     size_t spdm_mel_len;
     247              : 
     248            1 :     spdm_test_context = *state;
     249            1 :     spdm_context = spdm_test_context->spdm_context;
     250            1 :     spdm_test_context->case_id = 0x4;
     251            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     252              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     253            1 :     spdm_context->connection_info.connection_state =
     254              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     255            1 :     spdm_context->local_context.capability.flags |=
     256              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEL_CAP;
     257            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     258              :         m_libspdm_use_hash_algo;
     259            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     260              :         m_libspdm_use_asym_algo;
     261            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     262              :         m_libspdm_use_measurement_spec;
     263            1 :     spdm_context->connection_info.algorithm.mel_spec =
     264              :         m_libspdm_use_mel_spec;
     265            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     266              :         m_libspdm_use_measurement_hash_algo;
     267              : 
     268            1 :     spdm_mel = NULL;
     269            1 :     spdm_mel_len = 0;
     270            1 :     libspdm_measurement_extension_log_collection(spdm_context,
     271              :                                                  m_libspdm_use_mel_spec,
     272              :                                                  m_libspdm_use_measurement_spec,
     273              :                                                  m_libspdm_use_measurement_hash_algo,
     274              :                                                  (void **)&spdm_mel, &spdm_mel_len);
     275              :     /* request.offset > total MEL len*/
     276            1 :     m_libspdm_get_measurement_extension_log_request4.offset = (uint32_t)spdm_mel_len +
     277              :                                                               LIBSPDM_MAX_MEL_BLOCK_LEN;
     278              : 
     279            1 :     response_size = sizeof(response);
     280            1 :     status = libspdm_get_response_measurement_extension_log(
     281              :         spdm_context, m_libspdm_get_measurement_extension_log_request4_size,
     282              :         &m_libspdm_get_measurement_extension_log_request4, &response_size, response);
     283              : 
     284            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     285            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     286            1 :     spdm_response = (void *)response;
     287            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     288            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
     289            1 :     assert_int_equal(spdm_response->header.param2, 0);
     290            1 : }
     291              : 
     292              : /**
     293              :  * Test 5: A correct and not zero request.offset.
     294              :  * Expected Behavior: generate a correctly formed MEL message, including its portion_length and remainder_length fields
     295              :  **/
     296            1 : void libspdm_test_responder_measurement_extension_log_case5(void **state)
     297              : {
     298              :     libspdm_return_t status;
     299              :     libspdm_test_context_t *spdm_test_context;
     300              :     libspdm_context_t *spdm_context;
     301              :     size_t response_size;
     302              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     303              :     spdm_measurement_extension_log_response_t  *spdm_response;
     304              :     spdm_measurement_extension_log_dmtf_t *spdm_mel;
     305              :     size_t spdm_mel_len;
     306              : 
     307            1 :     spdm_test_context = *state;
     308            1 :     spdm_context = spdm_test_context->spdm_context;
     309            1 :     spdm_test_context->case_id = 0x5;
     310            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     311              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     312            1 :     spdm_context->connection_info.connection_state =
     313              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     314            1 :     spdm_context->local_context.capability.flags |=
     315              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEL_CAP;
     316            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     317              :         m_libspdm_use_hash_algo;
     318            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     319              :         m_libspdm_use_asym_algo;
     320            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     321              :         m_libspdm_use_measurement_spec;
     322            1 :     spdm_context->connection_info.algorithm.mel_spec =
     323              :         m_libspdm_use_mel_spec;
     324            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     325              :         m_libspdm_use_measurement_hash_algo;
     326              : 
     327            1 :     spdm_mel = NULL;
     328            1 :     spdm_mel_len = 0;
     329            1 :     libspdm_measurement_extension_log_collection(spdm_context,
     330              :                                                  m_libspdm_use_mel_spec,
     331              :                                                  m_libspdm_use_measurement_spec,
     332              :                                                  m_libspdm_use_measurement_hash_algo,
     333              :                                                  (void **)&spdm_mel, &spdm_mel_len);
     334              : 
     335              :     /* Test the validity of the request.offset.*/
     336            1 :     m_libspdm_get_measurement_extension_log_request2.offset = (uint32_t)spdm_mel_len / 2;
     337            1 :     m_libspdm_get_measurement_extension_log_request2.length = LIBSPDM_MAX_MEL_BLOCK_LEN;
     338              : 
     339            1 :     response_size = sizeof(response);
     340            1 :     status = libspdm_get_response_measurement_extension_log(
     341              :         spdm_context, m_libspdm_get_measurement_extension_log_request2_size,
     342              :         &m_libspdm_get_measurement_extension_log_request2, &response_size, response);
     343            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     344              : 
     345            1 :     assert_int_equal(response_size,
     346              :                      sizeof(spdm_measurement_extension_log_response_t) +
     347              :                      spdm_mel_len / 2 + 1);
     348            1 :     spdm_response = (void *)response;
     349            1 :     assert_int_equal(spdm_response->header.request_response_code,
     350              :                      SPDM_MEASUREMENT_EXTENSION_LOG);
     351            1 :     assert_int_equal(spdm_response->header.param1, 0);
     352            1 :     assert_int_equal(spdm_response->portion_length, spdm_mel_len / 2 + 1);
     353            1 :     assert_int_equal(spdm_response->remainder_length, 0);
     354            1 :     assert_memory_equal(spdm_response + 1, (void *)((uint8_t *)spdm_mel + spdm_mel_len / 2),
     355              :                         response_size - sizeof(spdm_measurement_extension_log_response_t));
     356            1 : }
     357              : 
     358            1 : int libspdm_responder_measurement_extension_log_test_main(void)
     359              : {
     360            1 :     const struct CMUnitTest spdm_responder_measurement_extension_log_tests[] = {
     361              :         /* Success Case*/
     362              :         cmocka_unit_test(libspdm_test_responder_measurement_extension_log_case1),
     363              :         /* Success Case, request.length < total MEL len*/
     364              :         cmocka_unit_test(libspdm_test_responder_measurement_extension_log_case2),
     365              :         /* Success Case, request.length > LIBSPDM_MAX_MEL_BLOCK_LEN*/
     366              :         cmocka_unit_test(libspdm_test_responder_measurement_extension_log_case3),
     367              :         /* failed Case,  request.offset > total MEL len*/
     368              :         cmocka_unit_test(libspdm_test_responder_measurement_extension_log_case4),
     369              :         /* Success Case, request.offset < total MEL len*/
     370              :         cmocka_unit_test(libspdm_test_responder_measurement_extension_log_case5),
     371              :     };
     372              : 
     373            1 :     libspdm_test_context_t test_context = {
     374              :         LIBSPDM_TEST_CONTEXT_VERSION,
     375              :         false,
     376              :     };
     377              : 
     378            1 :     libspdm_setup_test_context(&test_context);
     379              : 
     380            1 :     return cmocka_run_group_tests(spdm_responder_measurement_extension_log_tests,
     381              :                                   libspdm_unit_test_group_setup,
     382              :                                   libspdm_unit_test_group_teardown);
     383              : }
     384              : 
     385              : #endif /* LIBSPDM_ENABLE_CAPABILITY_MEL_CAP */
        

Generated by: LCOV version 2.0-1