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

            Line data    Source code
       1              : /**
       2              :  *  Copyright Notice:
       3              :  *  Copyright 2021-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              : #include "internal/libspdm_requester_lib.h"
      10              : 
      11              : #if LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP
      12              : 
      13              : spdm_get_measurements_request_t m_libspdm_get_measurements_request1 = {
      14              :     { SPDM_MESSAGE_VERSION_10, SPDM_GET_MEASUREMENTS, 0,
      15              :       SPDM_GET_MEASUREMENTS_REQUEST_MEASUREMENT_OPERATION_TOTAL_NUMBER_OF_MEASUREMENTS },
      16              : };
      17              : size_t m_libspdm_get_measurements_request1_size = sizeof(spdm_message_header_t);
      18              : 
      19              : spdm_get_measurements_request_t m_libspdm_get_measurements_request3 = {
      20              :     { SPDM_MESSAGE_VERSION_10, SPDM_GET_MEASUREMENTS,
      21              :       SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE, 1 },
      22              : };
      23              : size_t m_libspdm_get_measurements_request3_size =
      24              :     sizeof(m_libspdm_get_measurements_request3) - sizeof(uint8_t);
      25              : 
      26              : spdm_get_measurements_request_t m_libspdm_get_measurements_request4 = {
      27              :     { SPDM_MESSAGE_VERSION_10, SPDM_GET_MEASUREMENTS,
      28              :       SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE, 1 },
      29              : };
      30              : size_t m_libspdm_get_measurements_request4_size = sizeof(spdm_message_header_t);
      31              : 
      32              : spdm_get_measurements_request_t m_libspdm_get_measurements_request5 = {
      33              :     { SPDM_MESSAGE_VERSION_10, SPDM_GET_MEASUREMENTS,
      34              :       SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE,
      35              :       SPDM_GET_MEASUREMENTS_REQUEST_MEASUREMENT_OPERATION_TOTAL_NUMBER_OF_MEASUREMENTS },
      36              : };
      37              : size_t m_libspdm_get_measurements_request5_size =
      38              :     sizeof(m_libspdm_get_measurements_request5) - sizeof(uint8_t);
      39              : 
      40              : spdm_get_measurements_request_t m_libspdm_get_measurements_request6 = {
      41              :     { SPDM_MESSAGE_VERSION_10, SPDM_GET_MEASUREMENTS, 0, 1 },
      42              : };
      43              : size_t m_libspdm_get_measurements_request6_size = sizeof(spdm_message_header_t);
      44              : 
      45              : spdm_get_measurements_request_t m_libspdm_get_measurements_request7 = {
      46              :     { SPDM_MESSAGE_VERSION_10, SPDM_GET_MEASUREMENTS, 0,
      47              :       SPDM_GET_MEASUREMENTS_REQUEST_MEASUREMENT_OPERATION_ALL_MEASUREMENTS },
      48              : };
      49              : size_t m_libspdm_get_measurements_request7_size = sizeof(spdm_message_header_t);
      50              : 
      51              : spdm_get_measurements_request_t m_libspdm_get_measurements_request8 = {
      52              :     { SPDM_MESSAGE_VERSION_10, SPDM_GET_MEASUREMENTS,
      53              :       SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE,
      54              :       SPDM_GET_MEASUREMENTS_REQUEST_MEASUREMENT_OPERATION_ALL_MEASUREMENTS },
      55              : };
      56              : size_t m_libspdm_get_measurements_request8_size =
      57              :     sizeof(m_libspdm_get_measurements_request8) - sizeof(uint8_t);
      58              : 
      59              : spdm_get_measurements_request_t m_libspdm_get_measurements_request9 = {
      60              :     { SPDM_MESSAGE_VERSION_11, SPDM_GET_MEASUREMENTS, 0, 1 },
      61              : };
      62              : size_t m_libspdm_get_measurements_request9_size = sizeof(spdm_message_header_t);
      63              : 
      64              : spdm_get_measurements_request_t m_libspdm_get_measurements_request10 = {
      65              :     { SPDM_MESSAGE_VERSION_11, SPDM_GET_MEASUREMENTS,
      66              :       SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE, 1 },
      67              : };
      68              : size_t m_libspdm_get_measurements_request10_size =
      69              :     sizeof(m_libspdm_get_measurements_request10);
      70              : 
      71              : spdm_get_measurements_request_t m_libspdm_get_measurements_request11 = {
      72              :     { SPDM_MESSAGE_VERSION_11, SPDM_GET_MEASUREMENTS,
      73              :       SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE, 1 },
      74              :     /* nonce
      75              :      * SlotId != 0*/
      76              : };
      77              : size_t m_libspdm_get_measurements_request11_size =
      78              :     sizeof(m_libspdm_get_measurements_request11);
      79              : 
      80              : spdm_get_measurements_request_t m_libspdm_get_measurements_request12 = {
      81              :     { SPDM_MESSAGE_VERSION_11, SPDM_GET_MEASUREMENTS,
      82              :       SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE, 1 },
      83              :     /* nonce
      84              :      * SlotId >= SPDM_MAX_SLOT_COUNT*/
      85              : };
      86              : size_t m_libspdm_get_measurements_request12_size =
      87              :     sizeof(m_libspdm_get_measurements_request12);
      88              : 
      89              : spdm_get_measurements_request_t m_libspdm_get_measurements_request13 = {
      90              :     { SPDM_MESSAGE_VERSION_11, SPDM_GET_MEASUREMENTS, 0, 0xF0 },
      91              : };
      92              : size_t m_libspdm_get_measurements_request13_size = sizeof(spdm_message_header_t);
      93              : 
      94              : spdm_get_measurements_request_t m_libspdm_get_measurements_request14 = {
      95              :     { SPDM_MESSAGE_VERSION_12, SPDM_GET_MEASUREMENTS,
      96              :       SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_RAW_BIT_STREAM_REQUESTED, 1},
      97              : };
      98              : size_t m_libspdm_get_measurements_request14_size = sizeof(spdm_message_header_t);
      99              : 
     100              : spdm_get_measurements_request_t m_libspdm_get_measurements_request15 = {
     101              :     { SPDM_MESSAGE_VERSION_12, SPDM_GET_MEASUREMENTS,
     102              :       SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE, 1},
     103              : };
     104              : size_t m_libspdm_get_measurements_request15_size = sizeof(m_libspdm_get_measurements_request14);
     105              : 
     106              : spdm_get_measurements_request_t m_libspdm_get_measurements_request16 = {
     107              :     { SPDM_MESSAGE_VERSION_12, SPDM_GET_MEASUREMENTS,
     108              :       SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE, 1 },
     109              : };
     110              : size_t m_libspdm_get_measurements_request16_size = sizeof(m_libspdm_get_measurements_request16);
     111              : 
     112              : spdm_get_measurements_request_t m_libspdm_get_measurements_request17 = {
     113              :     { SPDM_MESSAGE_VERSION_13, SPDM_GET_MEASUREMENTS, 0,
     114              :       SPDM_GET_MEASUREMENTS_REQUEST_MEASUREMENT_OPERATION_TOTAL_NUMBER_OF_MEASUREMENTS },
     115              : };
     116              : size_t m_libspdm_get_measurements_request17_size = sizeof(spdm_message_header_t);
     117              : 
     118              : extern size_t libspdm_secret_lib_meas_opaque_data_size;
     119              : 
     120              : /**
     121              :  * Test 1: Successful response to get a number of measurements without signature
     122              :  * Expected Behavior: get a RETURN_SUCCESS return code, correct transcript.message_m size, and correct response message size and fields
     123              :  **/
     124            1 : void libspdm_test_responder_measurements_case1(void **state)
     125              : {
     126              :     libspdm_return_t status;
     127              :     libspdm_test_context_t *spdm_test_context;
     128              :     libspdm_context_t *spdm_context;
     129              :     size_t response_size;
     130              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     131              :     spdm_measurements_response_t *spdm_response;
     132              : 
     133            1 :     spdm_test_context = *state;
     134            1 :     spdm_context = spdm_test_context->spdm_context;
     135            1 :     spdm_test_context->case_id = 0x1;
     136            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
     137              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     138            1 :     spdm_context->connection_info.connection_state =
     139              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     140            1 :     spdm_context->local_context.capability.flags |=
     141              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
     142            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     143              :         m_libspdm_use_hash_algo;
     144            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     145              :         m_libspdm_use_asym_algo;
     146            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     147              :         m_libspdm_use_measurement_spec;
     148            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     149              :         m_libspdm_use_measurement_hash_algo;
     150            1 :     libspdm_reset_message_m(spdm_context, NULL);
     151              : 
     152            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
     153              : 
     154            1 :     response_size = sizeof(response);
     155              : 
     156            1 :     status = libspdm_get_response_measurements(
     157              :         spdm_context, m_libspdm_get_measurements_request1_size,
     158              :         &m_libspdm_get_measurements_request1, &response_size, response);
     159            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     160            1 :     assert_int_equal(response_size,
     161              :                      sizeof(spdm_measurements_response_t) + SPDM_NONCE_SIZE + sizeof(uint16_t));
     162            1 :     spdm_response = (void *)response;
     163            1 :     assert_int_equal(spdm_response->header.request_response_code,
     164              :                      SPDM_MEASUREMENTS);
     165            1 :     assert_int_equal(spdm_response->header.param1,
     166              :                      LIBSPDM_MEASUREMENT_BLOCK_NUMBER);
     167              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     168              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size,
     169              :                      m_libspdm_get_measurements_request1_size +
     170              :                      sizeof(spdm_measurements_response_t) +
     171              :                      SPDM_NONCE_SIZE +
     172              :                      sizeof(uint16_t));
     173              : #endif
     174            1 : }
     175              : 
     176              : /**
     177              :  * Test 2:
     178              :  * Expected Behavior:
     179              :  **/
     180            1 : void libspdm_test_responder_measurements_case2(void **state)
     181              : {
     182            1 : }
     183              : 
     184              : /**
     185              :  * Test 3: Force response_state = SPDM_RESPONSE_STATE_BUSY when asked GET_MEASUREMENTS
     186              :  * Expected Behavior: generate an ERROR_RESPONSE with code SPDM_ERROR_CODE_BUSY
     187              :  **/
     188            1 : void libspdm_test_responder_measurements_case3(void **state)
     189              : {
     190              :     libspdm_return_t status;
     191              :     libspdm_test_context_t *spdm_test_context;
     192              :     libspdm_context_t *spdm_context;
     193              :     size_t response_size;
     194              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     195              :     spdm_measurements_response_t *spdm_response;
     196              : 
     197            1 :     spdm_test_context = *state;
     198            1 :     spdm_context = spdm_test_context->spdm_context;
     199            1 :     spdm_test_context->case_id = 0x3;
     200            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
     201              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     202            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_BUSY;
     203            1 :     spdm_context->connection_info.connection_state =
     204              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     205            1 :     spdm_context->local_context.capability.flags |=
     206              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
     207            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     208              :         m_libspdm_use_hash_algo;
     209            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     210              :         m_libspdm_use_asym_algo;
     211            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     212              :         m_libspdm_use_measurement_spec;
     213            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     214              :         m_libspdm_use_measurement_hash_algo;
     215            1 :     libspdm_reset_message_m(spdm_context, NULL);
     216            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
     217              : 
     218            1 :     response_size = sizeof(response);
     219            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
     220              :                               m_libspdm_get_measurements_request1.nonce);
     221            1 :     status = libspdm_get_response_measurements(
     222              :         spdm_context, m_libspdm_get_measurements_request1_size,
     223              :         &m_libspdm_get_measurements_request1, &response_size, response);
     224            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     225            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     226            1 :     spdm_response = (void *)response;
     227            1 :     assert_int_equal(spdm_response->header.request_response_code,
     228              :                      SPDM_ERROR);
     229            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_BUSY);
     230            1 :     assert_int_equal(spdm_response->header.param2, 0);
     231            1 :     assert_int_equal(spdm_context->response_state,
     232              :                      LIBSPDM_RESPONSE_STATE_BUSY);
     233              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     234              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
     235              : #endif
     236            1 : }
     237              : 
     238              : /**
     239              :  * Test 4: Force response_state = SPDM_RESPONSE_STATE_NEED_RESYNC when asked GET_MEASUREMENTS
     240              :  * Expected Behavior: generate an ERROR_RESPONSE with code SPDM_ERROR_CODE_REQUEST_RESYNCH
     241              :  **/
     242            1 : void libspdm_test_responder_measurements_case4(void **state)
     243              : {
     244              :     libspdm_return_t status;
     245              :     libspdm_test_context_t *spdm_test_context;
     246              :     libspdm_context_t *spdm_context;
     247              :     size_t response_size;
     248              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     249              :     spdm_measurements_response_t *spdm_response;
     250              : 
     251            1 :     spdm_test_context = *state;
     252            1 :     spdm_context = spdm_test_context->spdm_context;
     253            1 :     spdm_test_context->case_id = 0x4;
     254            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
     255              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     256            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NEED_RESYNC;
     257            1 :     spdm_context->connection_info.connection_state =
     258              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     259            1 :     spdm_context->local_context.capability.flags |=
     260              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
     261            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     262              :         m_libspdm_use_hash_algo;
     263            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     264              :         m_libspdm_use_asym_algo;
     265            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     266              :         m_libspdm_use_measurement_spec;
     267            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     268              :         m_libspdm_use_measurement_hash_algo;
     269            1 :     libspdm_reset_message_m(spdm_context, NULL);
     270            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
     271              : 
     272            1 :     response_size = sizeof(response);
     273            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
     274              :                               m_libspdm_get_measurements_request1.nonce);
     275            1 :     status = libspdm_get_response_measurements(
     276              :         spdm_context, m_libspdm_get_measurements_request1_size,
     277              :         &m_libspdm_get_measurements_request1, &response_size, response);
     278            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     279            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     280            1 :     spdm_response = (void *)response;
     281            1 :     assert_int_equal(spdm_response->header.request_response_code,
     282              :                      SPDM_ERROR);
     283            1 :     assert_int_equal(spdm_response->header.param1,
     284              :                      SPDM_ERROR_CODE_REQUEST_RESYNCH);
     285            1 :     assert_int_equal(spdm_response->header.param2, 0);
     286            1 :     assert_int_equal(spdm_context->response_state,
     287              :                      LIBSPDM_RESPONSE_STATE_NEED_RESYNC);
     288              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     289              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
     290              : #endif
     291            1 : }
     292              : 
     293              : #if LIBSPDM_RESPOND_IF_READY_SUPPORT
     294              : /**
     295              :  * Test 5: Force response_state = SPDM_RESPONSE_STATE_NOT_READY when asked GET_MEASUREMENTS
     296              :  * Expected Behavior: generate an ERROR_RESPONSE with code SPDM_ERROR_CODE_RESPONSE_NOT_READY
     297              :  **/
     298            1 : void libspdm_test_responder_measurements_case5(void **state)
     299              : {
     300              :     libspdm_return_t status;
     301              :     libspdm_test_context_t *spdm_test_context;
     302              :     libspdm_context_t *spdm_context;
     303              :     size_t response_size;
     304              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     305              :     spdm_measurements_response_t *spdm_response;
     306              :     spdm_error_data_response_not_ready_t *error_data;
     307              : 
     308            1 :     spdm_test_context = *state;
     309            1 :     spdm_context = spdm_test_context->spdm_context;
     310            1 :     spdm_test_context->case_id = 0x5;
     311            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
     312              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     313            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NOT_READY;
     314            1 :     spdm_context->connection_info.connection_state =
     315              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     316            1 :     spdm_context->local_context.capability.flags |=
     317              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
     318            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     319              :         m_libspdm_use_hash_algo;
     320            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     321              :         m_libspdm_use_asym_algo;
     322            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     323              :         m_libspdm_use_measurement_spec;
     324            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     325              :         m_libspdm_use_measurement_hash_algo;
     326            1 :     libspdm_reset_message_m(spdm_context, NULL);
     327            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
     328              : 
     329            1 :     response_size = sizeof(response);
     330            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
     331              :                               m_libspdm_get_measurements_request1.nonce);
     332            1 :     status = libspdm_get_response_measurements(
     333              :         spdm_context, m_libspdm_get_measurements_request1_size,
     334              :         &m_libspdm_get_measurements_request1, &response_size, response);
     335            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     336            1 :     assert_int_equal(response_size,
     337              :                      sizeof(spdm_error_response_t) +
     338              :                      sizeof(spdm_error_data_response_not_ready_t));
     339            1 :     spdm_response = (void *)response;
     340            1 :     error_data = (spdm_error_data_response_not_ready_t
     341              :                   *)(&spdm_response->number_of_blocks);
     342            1 :     assert_int_equal(spdm_response->header.request_response_code,
     343              :                      SPDM_ERROR);
     344            1 :     assert_int_equal(spdm_response->header.param1,
     345              :                      SPDM_ERROR_CODE_RESPONSE_NOT_READY);
     346            1 :     assert_int_equal(spdm_response->header.param2, 0);
     347            1 :     assert_int_equal(spdm_context->response_state,
     348              :                      LIBSPDM_RESPONSE_STATE_NOT_READY);
     349            1 :     assert_int_equal(error_data->request_code, SPDM_GET_MEASUREMENTS);
     350              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     351              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
     352              : #endif
     353            1 : }
     354              : #endif /* LIBSPDM_RESPOND_IF_READY_SUPPORT */
     355              : 
     356              : /**
     357              :  * Test 6: simulate wrong connection_state when asked GET_MEASUREMENTS
     358              :  *        (missing SPDM_GET_DIGESTS_RECEIVE_FLAG, SPDM_GET_CAPABILITIES_RECEIVE_FLAG and SPDM_NEGOTIATE_ALGORITHMS_RECEIVE_FLAG)
     359              :  * Expected Behavior: generate an ERROR_RESPONSE with code SPDM_ERROR_CODE_UNEXPECTED_REQUEST
     360              :  **/
     361            1 : void libspdm_test_responder_measurements_case6(void **state)
     362              : {
     363              :     libspdm_return_t status;
     364              :     libspdm_test_context_t *spdm_test_context;
     365              :     libspdm_context_t *spdm_context;
     366              :     size_t response_size;
     367              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     368              :     spdm_measurements_response_t *spdm_response;
     369              : 
     370            1 :     spdm_test_context = *state;
     371            1 :     spdm_context = spdm_test_context->spdm_context;
     372            1 :     spdm_test_context->case_id = 0x6;
     373            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
     374              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     375            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
     376            1 :     spdm_context->connection_info.connection_state =
     377              :         LIBSPDM_CONNECTION_STATE_NOT_STARTED;
     378            1 :     spdm_context->local_context.capability.flags |=
     379              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
     380            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     381              :         m_libspdm_use_hash_algo;
     382            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     383              :         m_libspdm_use_asym_algo;
     384            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     385              :         m_libspdm_use_measurement_spec;
     386            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     387              :         m_libspdm_use_measurement_hash_algo;
     388            1 :     libspdm_reset_message_m(spdm_context, NULL);
     389            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
     390              : 
     391            1 :     response_size = sizeof(response);
     392            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
     393              :                               m_libspdm_get_measurements_request1.nonce);
     394            1 :     status = libspdm_get_response_measurements(
     395              :         spdm_context, m_libspdm_get_measurements_request1_size,
     396              :         &m_libspdm_get_measurements_request1, &response_size, response);
     397            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     398            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     399            1 :     spdm_response = (void *)response;
     400            1 :     assert_int_equal(spdm_response->header.request_response_code,
     401              :                      SPDM_ERROR);
     402            1 :     assert_int_equal(spdm_response->header.param1,
     403              :                      SPDM_ERROR_CODE_UNEXPECTED_REQUEST);
     404            1 :     assert_int_equal(spdm_response->header.param2, 0);
     405              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     406              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
     407              : #endif
     408            1 : }
     409              : 
     410              : /**
     411              :  * Test 7: Successful response to get a number of measurements with signature
     412              :  * Expected Behavior: get a RETURN_SUCCESS return code, empty transcript.message_m, and correct response message size and fields
     413              :  **/
     414            1 : void libspdm_test_responder_measurements_case7(void **state)
     415              : {
     416              :     libspdm_return_t status;
     417              :     libspdm_test_context_t *spdm_test_context;
     418              :     libspdm_context_t *spdm_context;
     419              :     size_t response_size;
     420              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     421              :     spdm_measurements_response_t *spdm_response;
     422              :     size_t measurment_sig_size;
     423              : 
     424              :     bool result;
     425              :     uint32_t measurement_record_data_length;
     426              :     uint8_t *measurement_record_data;
     427              :     uint8_t *ptr;
     428              :     uint16_t opaque_length;
     429              :     void *signature;
     430              :     size_t signature_size;
     431              :     libspdm_session_info_t *session_info;
     432              :     void *data;
     433              :     size_t data_size;
     434              :     void *hash;
     435              :     size_t hash_size;
     436              : 
     437            1 :     spdm_test_context = *state;
     438            1 :     spdm_context = spdm_test_context->spdm_context;
     439            1 :     spdm_test_context->case_id = 0x7;
     440            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
     441              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     442            1 :     spdm_context->connection_info.connection_state =
     443              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     444            1 :     spdm_context->local_context.capability.flags |=
     445              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
     446            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     447              :         m_libspdm_use_hash_algo;
     448            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     449              :         m_libspdm_use_asym_algo;
     450            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     451              :         m_libspdm_use_measurement_spec;
     452            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     453              :         m_libspdm_use_measurement_hash_algo;
     454            1 :     libspdm_reset_message_m(spdm_context, NULL);
     455            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
     456            1 :     measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
     457            1 :                           libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
     458              : 
     459            1 :     response_size = sizeof(response);
     460            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
     461              :                               m_libspdm_get_measurements_request5.nonce);
     462            1 :     status = libspdm_get_response_measurements(
     463              :         spdm_context, m_libspdm_get_measurements_request5_size,
     464              :         &m_libspdm_get_measurements_request5, &response_size, response);
     465            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     466            1 :     assert_int_equal(response_size, sizeof(spdm_measurements_response_t) +
     467              :                      measurment_sig_size);
     468            1 :     spdm_response = (void *)response;
     469            1 :     assert_int_equal(spdm_response->header.request_response_code,
     470              :                      SPDM_MEASUREMENTS);
     471            1 :     assert_int_equal(spdm_response->header.param1,
     472              :                      LIBSPDM_MEASUREMENT_BLOCK_NUMBER);
     473              : 
     474            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     475              :                                                     m_libspdm_use_asym_algo, &data,
     476              :                                                     &data_size,
     477              :                                                     &hash, &hash_size);
     478              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     479              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
     480              :         data_size;
     481              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
     482              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
     483              :                      data, data_size);
     484              : #else
     485            1 :     libspdm_hash_all(
     486              :         spdm_context->connection_info.algorithm.base_hash_algo,
     487              :         data, data_size,
     488            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
     489            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
     490            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
     491            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
     492              :         spdm_context->connection_info.algorithm.base_hash_algo,
     493              :         spdm_context->connection_info.algorithm.base_asym_algo,
     494              :         data, data_size,
     495              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
     496              : #endif
     497              : 
     498            1 :     measurement_record_data_length = libspdm_read_uint24(spdm_response->measurement_record_length);
     499            1 :     measurement_record_data = (void *)(spdm_response + 1);
     500            1 :     ptr = measurement_record_data + measurement_record_data_length;
     501            1 :     ptr += SPDM_NONCE_SIZE;
     502            1 :     opaque_length = libspdm_read_uint16((const uint8_t *)ptr);
     503            1 :     ptr += sizeof(uint16_t);
     504            1 :     ptr += opaque_length;
     505            1 :     signature = ptr;
     506            1 :     signature_size = libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
     507            1 :     session_info = NULL;
     508              : 
     509            1 :     status = libspdm_append_message_m(spdm_context, session_info,
     510              :                                       &m_libspdm_get_measurements_request5,
     511              :                                       m_libspdm_get_measurements_request5_size);
     512            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     513              : 
     514            1 :     status = libspdm_append_message_m(spdm_context, session_info, spdm_response,
     515              :                                       response_size - signature_size);
     516            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     517              : 
     518            1 :     result = libspdm_verify_measurement_signature(
     519              :         spdm_context, session_info, signature, signature_size);
     520            1 :     assert_true(result);
     521              : 
     522              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     523              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
     524              : #endif
     525            1 : }
     526              : 
     527              : /**
     528              :  * Test 8: Successful response to get one measurement with signature
     529              :  * Expected Behavior: get a RETURN_SUCCESS return code, empty transcript.message_m, and correct response message size and fields
     530              :  **/
     531            1 : void libspdm_test_responder_measurements_case8(void **state)
     532              : {
     533              :     libspdm_return_t status;
     534              :     libspdm_test_context_t *spdm_test_context;
     535              :     libspdm_context_t *spdm_context;
     536              :     size_t response_size;
     537              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     538              :     spdm_measurements_response_t *spdm_response;
     539              :     size_t measurment_sig_size;
     540              : 
     541            1 :     spdm_test_context = *state;
     542            1 :     spdm_context = spdm_test_context->spdm_context;
     543            1 :     spdm_test_context->case_id = 0x8;
     544            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
     545              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     546            1 :     spdm_context->connection_info.connection_state =
     547              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     548            1 :     spdm_context->local_context.capability.flags |=
     549              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
     550            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     551              :         m_libspdm_use_hash_algo;
     552            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     553              :         m_libspdm_use_asym_algo;
     554            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     555              :         m_libspdm_use_measurement_spec;
     556            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     557              :         m_libspdm_use_measurement_hash_algo;
     558            1 :     libspdm_reset_message_m(spdm_context, NULL);
     559            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
     560            1 :     measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
     561            1 :                           libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
     562            1 :     response_size = sizeof(response);
     563            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
     564              :                               m_libspdm_get_measurements_request3.nonce);
     565            1 :     status = libspdm_get_response_measurements(
     566              :         spdm_context, m_libspdm_get_measurements_request3_size,
     567              :         &m_libspdm_get_measurements_request3, &response_size, response);
     568            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     569            1 :     assert_int_equal(response_size,
     570              :                      sizeof(spdm_measurements_response_t) +
     571              :                      sizeof(spdm_measurement_block_dmtf_t) +
     572              :                      libspdm_get_measurement_hash_size(
     573              :                          m_libspdm_use_measurement_hash_algo) +
     574              :                      measurment_sig_size);
     575            1 :     spdm_response = (void *)response;
     576            1 :     assert_int_equal(spdm_response->header.request_response_code,
     577              :                      SPDM_MEASUREMENTS);
     578              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     579              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
     580              : #endif
     581            1 : }
     582              : 
     583              : /**
     584              :  * Test 9: Error case, Bad request size (sizeof(spdm_message_header_t)x) to get measurement number with signature
     585              :  * Expected Behavior: get a RETURN_SUCCESS return code, empty transcript.message_m size, and Error message as response
     586              :  **/
     587            1 : void libspdm_test_responder_measurements_case9(void **state)
     588              : {
     589              :     libspdm_return_t status;
     590              :     libspdm_test_context_t *spdm_test_context;
     591              :     libspdm_context_t *spdm_context;
     592              :     size_t response_size;
     593              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     594              :     spdm_measurements_response_t *spdm_response;
     595              : 
     596            1 :     spdm_test_context = *state;
     597            1 :     spdm_context = spdm_test_context->spdm_context;
     598            1 :     spdm_test_context->case_id = 0x9;
     599            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
     600              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     601            1 :     spdm_context->connection_info.connection_state =
     602              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     603            1 :     spdm_context->local_context.capability.flags |=
     604              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
     605            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     606              :         m_libspdm_use_hash_algo;
     607            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     608              :         m_libspdm_use_asym_algo;
     609            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     610              :         m_libspdm_use_measurement_spec;
     611            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     612              :         m_libspdm_use_measurement_hash_algo;
     613            1 :     libspdm_reset_message_m(spdm_context, NULL);
     614            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
     615              : 
     616            1 :     response_size = sizeof(response);
     617            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
     618              :                               m_libspdm_get_measurements_request4.nonce);
     619            1 :     status = libspdm_get_response_measurements(
     620              :         spdm_context, m_libspdm_get_measurements_request4_size,
     621              :         &m_libspdm_get_measurements_request4, &response_size, response);
     622            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     623            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     624            1 :     spdm_response = (void *)response;
     625            1 :     assert_int_equal(spdm_response->header.request_response_code,
     626              :                      SPDM_ERROR);
     627            1 :     assert_int_equal(spdm_response->header.param1,
     628              :                      SPDM_ERROR_CODE_INVALID_REQUEST);
     629            1 :     assert_int_equal(spdm_response->header.param2, 0);
     630              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     631              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
     632              : #endif
     633            1 : }
     634              : 
     635              : /**
     636              :  * Test 10: Successful response to get one measurement without signature
     637              :  * Expected Behavior: get a RETURN_SUCCESS return code, correct transcript.message_m size, and correct response message size and fields
     638              :  **/
     639            1 : void libspdm_test_responder_measurements_case10(void **state)
     640              : {
     641              :     libspdm_return_t status;
     642              :     libspdm_test_context_t *spdm_test_context;
     643              :     libspdm_context_t *spdm_context;
     644              :     size_t response_size;
     645              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     646              :     spdm_measurements_response_t *spdm_response;
     647              : 
     648            1 :     spdm_test_context = *state;
     649            1 :     spdm_context = spdm_test_context->spdm_context;
     650            1 :     spdm_test_context->case_id = 0xA;
     651            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
     652              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     653            1 :     spdm_context->connection_info.connection_state =
     654              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     655            1 :     spdm_context->local_context.capability.flags |=
     656              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
     657            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     658              :         m_libspdm_use_hash_algo;
     659            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     660              :         m_libspdm_use_asym_algo;
     661            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     662              :         m_libspdm_use_measurement_spec;
     663            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     664              :         m_libspdm_use_measurement_hash_algo;
     665            1 :     libspdm_reset_message_m(spdm_context, NULL);
     666            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
     667              : 
     668            1 :     response_size = sizeof(response);
     669            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
     670              :                               m_libspdm_get_measurements_request6.nonce);
     671            1 :     status = libspdm_get_response_measurements(
     672              :         spdm_context, m_libspdm_get_measurements_request6_size,
     673              :         &m_libspdm_get_measurements_request6, &response_size, response);
     674            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     675            1 :     assert_int_equal(response_size,
     676              :                      sizeof(spdm_measurements_response_t) +
     677              :                      sizeof(spdm_measurement_block_dmtf_t) +
     678              :                      libspdm_get_measurement_hash_size(
     679              :                          m_libspdm_use_measurement_hash_algo) + SPDM_NONCE_SIZE +
     680              :                      sizeof(uint16_t));
     681            1 :     spdm_response = (void *)response;
     682            1 :     assert_int_equal(spdm_response->header.request_response_code,
     683              :                      SPDM_MEASUREMENTS);
     684              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     685              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size,
     686              :                      m_libspdm_get_measurements_request6_size +
     687              :                      sizeof(spdm_measurements_response_t) +
     688              :                      sizeof(spdm_measurement_block_dmtf_t) +
     689              :                      libspdm_get_measurement_hash_size(
     690              :                          m_libspdm_use_measurement_hash_algo) + SPDM_NONCE_SIZE +
     691              :                      sizeof(uint16_t));
     692              : #endif
     693            1 : }
     694              : 
     695              : /**
     696              :  * Test 11: Successful response to get all measurements with signature
     697              :  * Expected Behavior: get a RETURN_SUCCESS return code, empty transcript.message_m, and correct response message size and fields
     698              :  **/
     699            1 : void libspdm_test_responder_measurements_case11(void **state)
     700              : {
     701              :     libspdm_return_t status;
     702              :     libspdm_test_context_t *spdm_test_context;
     703              :     libspdm_context_t *spdm_context;
     704              :     size_t response_size;
     705              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     706              :     spdm_measurements_response_t *spdm_response;
     707              :     size_t measurment_sig_size;
     708              : 
     709            1 :     spdm_test_context = *state;
     710            1 :     spdm_context = spdm_test_context->spdm_context;
     711            1 :     spdm_test_context->case_id = 0xB;
     712            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
     713              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     714            1 :     spdm_context->connection_info.connection_state =
     715              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     716            1 :     spdm_context->local_context.capability.flags |=
     717              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
     718            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     719              :         m_libspdm_use_hash_algo;
     720            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     721              :         m_libspdm_use_asym_algo;
     722            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     723              :         m_libspdm_use_measurement_spec;
     724            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     725              :         m_libspdm_use_measurement_hash_algo;
     726            1 :     libspdm_reset_message_m(spdm_context, NULL);
     727            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
     728            1 :     measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
     729            1 :                           libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
     730              : 
     731            1 :     response_size = sizeof(response);
     732            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
     733              :                               m_libspdm_get_measurements_request8.nonce);
     734            1 :     status = libspdm_get_response_measurements(
     735              :         spdm_context, m_libspdm_get_measurements_request8_size,
     736              :         &m_libspdm_get_measurements_request8, &response_size, response);
     737            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     738            1 :     assert_int_equal(response_size,
     739              :                      sizeof(spdm_measurements_response_t) +
     740              :                      LIBSPDM_MEASUREMENT_BLOCK_HASH_NUMBER *
     741              :                      (sizeof(spdm_measurement_block_dmtf_t) +
     742              :                       libspdm_get_measurement_hash_size(
     743              :                           m_libspdm_use_measurement_hash_algo)) +
     744              :                      (sizeof(spdm_measurement_block_dmtf_t) +
     745              :                       sizeof(spdm_measurements_secure_version_number_t)) +
     746              :                      (sizeof(spdm_measurement_block_dmtf_t) +
     747              :                       libspdm_get_measurement_hash_size(
     748              :                           m_libspdm_use_measurement_hash_algo)) +
     749              :                      (sizeof(spdm_measurement_block_dmtf_t) +
     750              :                       LIBSPDM_MEASUREMENT_MANIFEST_SIZE) +
     751              :                      (sizeof(spdm_measurement_block_dmtf_t) +
     752              :                       sizeof(spdm_measurements_device_mode_t)) +
     753              :                      measurment_sig_size);
     754            1 :     spdm_response = (void *)response;
     755            1 :     assert_int_equal(spdm_response->header.request_response_code,
     756              :                      SPDM_MEASUREMENTS);
     757            1 :     assert_int_equal(spdm_response->number_of_blocks,
     758              :                      LIBSPDM_MEASUREMENT_BLOCK_NUMBER);
     759              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     760              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
     761              : #endif
     762            1 : }
     763              : 
     764              : /**
     765              :  * Test 12: Successful response to get all measurements without signature
     766              :  * Expected Behavior: get a RETURN_SUCCESS return code, correct transcript.message_m size, and correct response message size and fields
     767              :  **/
     768            1 : void libspdm_test_responder_measurements_case12(void **state)
     769              : {
     770              :     libspdm_return_t status;
     771              :     libspdm_test_context_t *spdm_test_context;
     772              :     libspdm_context_t *spdm_context;
     773              :     size_t response_size;
     774              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     775              :     spdm_measurements_response_t *spdm_response;
     776              : 
     777            1 :     spdm_test_context = *state;
     778            1 :     spdm_context = spdm_test_context->spdm_context;
     779            1 :     spdm_test_context->case_id = 0xC;
     780            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
     781              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     782            1 :     spdm_context->connection_info.connection_state =
     783              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     784            1 :     spdm_context->local_context.capability.flags |=
     785              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
     786            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     787              :         m_libspdm_use_hash_algo;
     788            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     789              :         m_libspdm_use_asym_algo;
     790            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     791              :         m_libspdm_use_measurement_spec;
     792            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     793              :         m_libspdm_use_measurement_hash_algo;
     794            1 :     libspdm_reset_message_m(spdm_context, NULL);
     795            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
     796              : 
     797            1 :     response_size = sizeof(response);
     798            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
     799              :                               m_libspdm_get_measurements_request7.nonce);
     800            1 :     status = libspdm_get_response_measurements(
     801              :         spdm_context, m_libspdm_get_measurements_request7_size,
     802              :         &m_libspdm_get_measurements_request7, &response_size, response);
     803            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     804            1 :     assert_int_equal(response_size,
     805              :                      sizeof(spdm_measurements_response_t) +
     806              :                      LIBSPDM_MEASUREMENT_BLOCK_HASH_NUMBER *
     807              :                      (sizeof(spdm_measurement_block_dmtf_t) +
     808              :                       libspdm_get_measurement_hash_size(
     809              :                           m_libspdm_use_measurement_hash_algo)) +
     810              :                      (sizeof(spdm_measurement_block_dmtf_t) +
     811              :                       sizeof(spdm_measurements_secure_version_number_t)) +
     812              :                      (sizeof(spdm_measurement_block_dmtf_t) +
     813              :                       libspdm_get_measurement_hash_size(
     814              :                           m_libspdm_use_measurement_hash_algo)) +
     815              :                      (sizeof(spdm_measurement_block_dmtf_t) +
     816              :                       LIBSPDM_MEASUREMENT_MANIFEST_SIZE) +
     817              :                      (sizeof(spdm_measurement_block_dmtf_t) +
     818              :                       sizeof(spdm_measurements_device_mode_t)) +
     819              :                      SPDM_NONCE_SIZE + sizeof(uint16_t));
     820            1 :     spdm_response = (void *)response;
     821            1 :     assert_int_equal(spdm_response->header.request_response_code,
     822              :                      SPDM_MEASUREMENTS);
     823            1 :     assert_int_equal(spdm_response->number_of_blocks,
     824              :                      LIBSPDM_MEASUREMENT_BLOCK_NUMBER);
     825              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     826              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size,
     827              :                      m_libspdm_get_measurements_request7_size +
     828              :                      sizeof(spdm_measurements_response_t) +
     829              :                      LIBSPDM_MEASUREMENT_BLOCK_HASH_NUMBER *
     830              :                      (sizeof(spdm_measurement_block_dmtf_t) +
     831              :                       libspdm_get_measurement_hash_size(
     832              :                           m_libspdm_use_measurement_hash_algo)) +
     833              :                      (sizeof(spdm_measurement_block_dmtf_t) +
     834              :                       sizeof(spdm_measurements_secure_version_number_t)) +
     835              :                      (sizeof(spdm_measurement_block_dmtf_t) +
     836              :                       libspdm_get_measurement_hash_size(
     837              :                           m_libspdm_use_measurement_hash_algo)) +
     838              :                      (sizeof(spdm_measurement_block_dmtf_t) +
     839              :                       LIBSPDM_MEASUREMENT_MANIFEST_SIZE) +
     840              :                      (sizeof(spdm_measurement_block_dmtf_t) +
     841              :                       sizeof(spdm_measurements_device_mode_t)) +
     842              :                      SPDM_NONCE_SIZE + sizeof(uint16_t));
     843              : #endif
     844            1 : }
     845              : 
     846              : /**
     847              :  * Test 13:
     848              :  * Expected Behavior:
     849              :  **/
     850            1 : void libspdm_test_responder_measurements_case13(void **state)
     851              : {
     852            1 : }
     853              : 
     854              : /**
     855              :  * Test 14: Error case, signature was required, but there is no nonce and/or slotID
     856              :  * Expected Behavior: get a RETURN_SUCCESS return code, empty transcript.message_m size, and Error message as response
     857              :  **/
     858            1 : void libspdm_test_responder_measurements_case14(void **state)
     859              : {
     860              :     libspdm_return_t status;
     861              :     libspdm_test_context_t *spdm_test_context;
     862              :     libspdm_context_t *spdm_context;
     863              :     size_t response_size;
     864              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     865              :     spdm_measurements_response_t *spdm_response;
     866              :     uint16_t TestMsgSizes[3];
     867              : 
     868            1 :     TestMsgSizes[0] =
     869            1 :         (uint16_t)(m_libspdm_get_measurements_request10_size -
     870              :                    sizeof(m_libspdm_get_measurements_request10.slot_id_param) -
     871              :                    sizeof(m_libspdm_get_measurements_request10.nonce));
     872            1 :     TestMsgSizes[1] =
     873            1 :         (uint16_t)(m_libspdm_get_measurements_request10_size -
     874              :                    sizeof(m_libspdm_get_measurements_request10.slot_id_param));
     875            1 :     TestMsgSizes[2] =
     876            1 :         (uint16_t)(m_libspdm_get_measurements_request10_size -
     877              :                    sizeof(m_libspdm_get_measurements_request10.nonce));
     878              : 
     879            1 :     spdm_test_context = *state;
     880            1 :     spdm_context = spdm_test_context->spdm_context;
     881            1 :     spdm_test_context->case_id = 0xE;
     882            1 :     spdm_context->connection_info.connection_state =
     883              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     884            1 :     spdm_context->local_context.capability.flags = 0;
     885            1 :     spdm_context->local_context.capability.flags |=
     886              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
     887            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     888              :         m_libspdm_use_hash_algo;
     889            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     890              :         m_libspdm_use_asym_algo;
     891            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     892              :         m_libspdm_use_measurement_hash_algo;
     893              : 
     894            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     895              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     896            1 :     libspdm_reset_message_m(spdm_context, NULL);
     897            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
     898              : 
     899            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
     900              :                               m_libspdm_get_measurements_request10.nonce);
     901            4 :     for (int i = 0; i < sizeof(TestMsgSizes) / sizeof(TestMsgSizes[0]);
     902            3 :          i++) {
     903            3 :         response_size = sizeof(response);
     904            3 :         status = libspdm_get_response_measurements(
     905            3 :             spdm_context, TestMsgSizes[i],
     906              :             &m_libspdm_get_measurements_request10, &response_size,
     907              :             response);
     908            3 :         assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     909            3 :         assert_int_equal(response_size, sizeof(spdm_error_response_t));
     910            3 :         spdm_response = (void *)response;
     911            3 :         assert_int_equal(spdm_response->header.request_response_code,
     912              :                          SPDM_ERROR);
     913            3 :         assert_int_equal(spdm_response->header.param1,
     914              :                          SPDM_ERROR_CODE_INVALID_REQUEST);
     915            3 :         assert_int_equal(spdm_response->header.param2, 0);
     916              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     917              :         assert_int_equal(spdm_context->transcript.message_m.buffer_size,
     918              :                          0);
     919              : #endif
     920              :     }
     921            1 : }
     922              : 
     923              : /**
     924              :  * Test 15: Error case, meas_cap = 01b, but signature was requested (request message includes nonce and slotID)
     925              :  * Expected Behavior: get a RETURN_SUCCESS return code, empty transcript.message_m size, and Error message as response
     926              :  **/
     927            1 : void libspdm_test_responder_measurements_case15(void **state)
     928              : {
     929              :     libspdm_return_t status;
     930              :     libspdm_test_context_t *spdm_test_context;
     931              :     libspdm_context_t *spdm_context;
     932              :     size_t response_size;
     933              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     934              :     spdm_measurements_response_t *spdm_response;
     935              :     /* size_t                measurment_sig_size;*/
     936              : 
     937            1 :     spdm_test_context = *state;
     938            1 :     spdm_context = spdm_test_context->spdm_context;
     939            1 :     spdm_test_context->case_id = 0xF;
     940            1 :     spdm_context->connection_info.connection_state =
     941              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     942            1 :     spdm_context->local_context.capability.flags = 0;
     943            1 :     spdm_context->local_context.capability.flags |=
     944              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_NO_SIG;
     945            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     946              :         m_libspdm_use_hash_algo;
     947            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     948              :         m_libspdm_use_asym_algo;
     949            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     950              :         m_libspdm_use_measurement_hash_algo;
     951              : 
     952            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     953              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     954            1 :     libspdm_reset_message_m(spdm_context, NULL);
     955            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
     956              :     /* measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 + libspdm_get_asym_signature_size (m_libspdm_use_asym_algo);*/
     957              : 
     958            1 :     response_size = sizeof(response);
     959            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
     960              :                               m_libspdm_get_measurements_request10.nonce);
     961            1 :     status = libspdm_get_response_measurements(
     962              :         spdm_context, m_libspdm_get_measurements_request10_size,
     963              :         &m_libspdm_get_measurements_request10, &response_size, response);
     964            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     965            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     966            1 :     spdm_response = (void *)response;
     967            1 :     assert_int_equal(spdm_response->header.request_response_code,
     968              :                      SPDM_ERROR);
     969            1 :     assert_int_equal(spdm_response->header.param1,
     970              :                      SPDM_ERROR_CODE_INVALID_REQUEST);
     971            1 :     assert_int_equal(spdm_response->header.param2, 0);
     972              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     973              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
     974              : #endif
     975            1 : }
     976              : 
     977              : /**
     978              :  * Test 16: Error case, meas_cap = 01b, but signature was requested (request message does not include nonce and slotID)
     979              :  * Expected Behavior: get a RETURN_SUCCESS return code, empty transcript.message_m size, and Error message as response
     980              :  **/
     981            1 : void libspdm_test_responder_measurements_case16(void **state)
     982              : {
     983              :     libspdm_return_t status;
     984              :     libspdm_test_context_t *spdm_test_context;
     985              :     libspdm_context_t *spdm_context;
     986              :     size_t response_size;
     987              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     988              :     spdm_measurements_response_t *spdm_response;
     989              :     /* size_t                measurment_sig_size;*/
     990              : 
     991            1 :     spdm_test_context = *state;
     992            1 :     spdm_context = spdm_test_context->spdm_context;
     993            1 :     spdm_test_context->case_id = 0x10;
     994            1 :     spdm_context->connection_info.connection_state =
     995              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     996            1 :     spdm_context->local_context.capability.flags = 0;
     997            1 :     spdm_context->local_context.capability.flags |=
     998              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_NO_SIG;
     999            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1000              :         m_libspdm_use_hash_algo;
    1001            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    1002              :         m_libspdm_use_asym_algo;
    1003            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    1004              :         m_libspdm_use_measurement_hash_algo;
    1005              : 
    1006            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1007              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1008            1 :     libspdm_reset_message_m(spdm_context, NULL);
    1009            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
    1010              :     /* measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 + libspdm_get_asym_signature_size (m_libspdm_use_asym_algo);*/
    1011              : 
    1012            1 :     response_size = sizeof(response);
    1013            1 :     status = libspdm_get_response_measurements(
    1014              :         spdm_context, m_libspdm_get_measurements_request9_size,
    1015              :         &m_libspdm_get_measurements_request10, &response_size, response);
    1016            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1017            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
    1018            1 :     spdm_response = (void *)response;
    1019            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1020              :                      SPDM_ERROR);
    1021            1 :     assert_int_equal(spdm_response->header.param1,
    1022              :                      SPDM_ERROR_CODE_INVALID_REQUEST);
    1023            1 :     assert_int_equal(spdm_response->header.param2, 0);
    1024              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1025              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
    1026              : #endif
    1027            1 : }
    1028              : 
    1029              : /**
    1030              :  * Test 17: Error case, meas_cap = 00
    1031              :  * Expected Behavior: get a RETURN_SUCCESS return code, empty transcript.message_m size, and Error message as response
    1032              :  **/
    1033            1 : void libspdm_test_responder_measurements_case17(void **state)
    1034              : {
    1035              :     libspdm_return_t status;
    1036              :     libspdm_test_context_t *spdm_test_context;
    1037              :     libspdm_context_t *spdm_context;
    1038              :     size_t response_size;
    1039              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1040              :     spdm_measurements_response_t *spdm_response;
    1041              :     /* size_t                measurment_sig_size;*/
    1042              : 
    1043            1 :     spdm_test_context = *state;
    1044            1 :     spdm_context = spdm_test_context->spdm_context;
    1045            1 :     spdm_test_context->case_id = 0x11;
    1046            1 :     spdm_context->connection_info.connection_state =
    1047              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    1048            1 :     spdm_context->local_context.capability.flags = 0;
    1049            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1050              :         m_libspdm_use_hash_algo;
    1051            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    1052              :         m_libspdm_use_asym_algo;
    1053            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    1054              :         m_libspdm_use_measurement_hash_algo;
    1055              : 
    1056            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1057              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1058            1 :     libspdm_reset_message_m(spdm_context, NULL);
    1059            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
    1060              :     /* measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 + libspdm_get_asym_signature_size (m_libspdm_use_asym_algo);*/
    1061              : 
    1062            1 :     response_size = sizeof(response);
    1063            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
    1064              :                               m_libspdm_get_measurements_request9.nonce);
    1065            1 :     status = libspdm_get_response_measurements(
    1066              :         spdm_context, m_libspdm_get_measurements_request9_size,
    1067              :         &m_libspdm_get_measurements_request9, &response_size, response);
    1068            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1069            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
    1070            1 :     spdm_response = (void *)response;
    1071            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1072              :                      SPDM_ERROR);
    1073            1 :     assert_int_equal(spdm_response->header.param1,
    1074              :                      SPDM_ERROR_CODE_UNSUPPORTED_REQUEST);
    1075            1 :     assert_int_equal(
    1076              :         spdm_response->header.param2,
    1077              :         m_libspdm_get_measurements_request10.header.request_response_code);
    1078              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1079              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
    1080              : #endif
    1081            1 : }
    1082              : 
    1083              : /**
    1084              :  * Test 18: Successful response to get one measurement with signature, SlotId different from default
    1085              :  * Expected Behavior: get a RETURN_SUCCESS return code, empty transcript.message_m, and correct response message size and fields
    1086              :  **/
    1087            1 : void libspdm_test_responder_measurements_case18(void **state)
    1088              : {
    1089              :     libspdm_return_t status;
    1090              :     libspdm_test_context_t *spdm_test_context;
    1091              :     libspdm_context_t *spdm_context;
    1092              :     size_t response_size;
    1093              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1094              :     spdm_measurements_response_t *spdm_response;
    1095              :     void *data;
    1096              :     size_t data_size;
    1097              :     size_t measurment_sig_size;
    1098              : 
    1099            1 :     spdm_test_context = *state;
    1100            1 :     spdm_context = spdm_test_context->spdm_context;
    1101            1 :     spdm_test_context->case_id = 0x12;
    1102            1 :     spdm_context->connection_info.connection_state =
    1103              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    1104            1 :     spdm_context->local_context.capability.flags |=
    1105              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    1106            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1107              :         m_libspdm_use_hash_algo;
    1108            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    1109              :         m_libspdm_use_asym_algo;
    1110            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    1111              :         m_libspdm_use_measurement_hash_algo;
    1112              : 
    1113            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1114              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1115            1 :     libspdm_reset_message_m(spdm_context, NULL);
    1116            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
    1117            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1118              :                                                     m_libspdm_use_asym_algo, &data,
    1119              :                                                     &data_size, NULL, NULL);
    1120            1 :     measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
    1121            1 :                           libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    1122            9 :     for (int i = 0; i < SPDM_MAX_SLOT_COUNT; i++) {
    1123            8 :         spdm_context->local_context.local_cert_chain_provision_size[i] =
    1124              :             data_size;
    1125            8 :         spdm_context->local_context.local_cert_chain_provision[i] =
    1126              :             data;
    1127              :     }
    1128              : 
    1129            1 :     response_size = sizeof(response);
    1130            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
    1131              :                               m_libspdm_get_measurements_request11.nonce);
    1132            1 :     status = libspdm_get_response_measurements(
    1133              :         spdm_context, m_libspdm_get_measurements_request11_size,
    1134              :         &m_libspdm_get_measurements_request11, &response_size, response);
    1135            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1136            1 :     assert_int_equal(response_size,
    1137              :                      sizeof(spdm_measurements_response_t) +
    1138              :                      sizeof(spdm_measurement_block_dmtf_t) +
    1139              :                      libspdm_get_measurement_hash_size(
    1140              :                          m_libspdm_use_measurement_hash_algo) +
    1141              :                      measurment_sig_size);
    1142            1 :     spdm_response = (void *)response;
    1143            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1144              :                      SPDM_MEASUREMENTS);
    1145              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1146              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
    1147              : #endif
    1148            1 :     assert_int_equal(m_libspdm_get_measurements_request11.slot_id_param,
    1149              :                      spdm_response->header.param2);
    1150              : 
    1151            1 :     free(data);
    1152            1 : }
    1153              : 
    1154              : /**
    1155              :  * Test 19: Error case, invalid SlotId parameter (SlotId >= SPDM_MAX_SLOT_COUNT)
    1156              :  * Expected Behavior: get a RETURN_SUCCESS return code, empty transcript.message_m size, and Error message as response
    1157              :  **/
    1158            1 : void libspdm_test_responder_measurements_case19(void **state)
    1159              : {
    1160              :     libspdm_return_t status;
    1161              :     libspdm_test_context_t *spdm_test_context;
    1162              :     libspdm_context_t *spdm_context;
    1163              :     size_t response_size;
    1164              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1165              :     spdm_measurements_response_t *spdm_response;
    1166              :     /* size_t                measurment_sig_size;*/
    1167              : 
    1168            1 :     spdm_test_context = *state;
    1169            1 :     spdm_context = spdm_test_context->spdm_context;
    1170            1 :     spdm_test_context->case_id = 0x13;
    1171            1 :     spdm_context->connection_info.connection_state =
    1172              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    1173            1 :     spdm_context->local_context.capability.flags |=
    1174              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    1175            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1176              :         m_libspdm_use_hash_algo;
    1177            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    1178              :         m_libspdm_use_asym_algo;
    1179            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    1180              :         m_libspdm_use_measurement_hash_algo;
    1181              : 
    1182            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1183              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1184            1 :     libspdm_reset_message_m(spdm_context, NULL);
    1185            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
    1186              :     /* measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 + libspdm_get_asym_signature_size (m_libspdm_use_asym_algo);*/
    1187              : 
    1188            1 :     response_size = sizeof(response);
    1189            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
    1190              :                               m_libspdm_get_measurements_request12.nonce);
    1191            1 :     status = libspdm_get_response_measurements(
    1192              :         spdm_context, m_libspdm_get_measurements_request12_size,
    1193              :         &m_libspdm_get_measurements_request12, &response_size, response);
    1194            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1195            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
    1196            1 :     spdm_response = (void *)response;
    1197            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1198              :                      SPDM_ERROR);
    1199            1 :     assert_int_equal(spdm_response->header.param1,
    1200              :                      SPDM_ERROR_CODE_INVALID_REQUEST);
    1201            1 :     assert_int_equal(spdm_response->header.param2, 0);
    1202              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1203              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
    1204              : #endif
    1205            1 : }
    1206              : 
    1207              : /**
    1208              :  * Test 21: Error case, request a measurement index not found
    1209              :  * Expected Behavior: get a RETURN_SUCCESS return code, empty transcript.message_m size, and Error message as response
    1210              :  **/
    1211            1 : void libspdm_test_responder_measurements_case21(void **state)
    1212              : {
    1213              :     libspdm_return_t status;
    1214              :     libspdm_test_context_t *spdm_test_context;
    1215              :     libspdm_context_t *spdm_context;
    1216              :     size_t response_size;
    1217              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1218              :     spdm_measurements_response_t *spdm_response;
    1219              : 
    1220            1 :     spdm_test_context = *state;
    1221            1 :     spdm_context = spdm_test_context->spdm_context;
    1222            1 :     spdm_test_context->case_id = 0x15;
    1223            1 :     spdm_context->connection_info.connection_state =
    1224              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    1225            1 :     spdm_context->local_context.capability.flags |=
    1226              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    1227            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1228              :         m_libspdm_use_hash_algo;
    1229            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    1230              :         m_libspdm_use_asym_algo;
    1231            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    1232              :         m_libspdm_use_measurement_hash_algo;
    1233              : 
    1234            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1235              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1236            1 :     libspdm_reset_message_m(spdm_context, NULL);
    1237            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
    1238              : 
    1239            1 :     response_size = sizeof(response);
    1240            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
    1241              :                               m_libspdm_get_measurements_request13.nonce);
    1242            1 :     status = libspdm_get_response_measurements(
    1243              :         spdm_context, m_libspdm_get_measurements_request13_size,
    1244              :         &m_libspdm_get_measurements_request13, &response_size, response);
    1245            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1246            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
    1247            1 :     spdm_response = (void *)response;
    1248            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1249              :                      SPDM_ERROR);
    1250            1 :     assert_int_equal(spdm_response->header.param1,
    1251              :                      SPDM_ERROR_CODE_INVALID_REQUEST);
    1252            1 :     assert_int_equal(spdm_response->header.param2, 0);
    1253              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1254              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
    1255              : #endif
    1256            1 : }
    1257              : 
    1258              : /**
    1259              :  * Test 22: request a large number of measurements before requesting a signed response
    1260              :  * Expected Behavior: while transcript.message_m is not full, get a RETURN_SUCCESS return code, empty transcript.message_m, and correct response message size and fields
    1261              :  *                    if transcript.message_m has no more room, an error response is expected
    1262              :  **/
    1263            1 : void libspdm_test_responder_measurements_case22(void **state)
    1264              : {
    1265              :     libspdm_return_t status;
    1266              :     libspdm_test_context_t *spdm_test_context;
    1267              :     libspdm_context_t *spdm_context;
    1268              :     size_t response_size;
    1269              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1270              :     spdm_measurements_response_t *spdm_response;
    1271              :     size_t NumberOfMessages;
    1272              : #define TOTAL_MESSAGES 100
    1273              : 
    1274            1 :     spdm_test_context = *state;
    1275            1 :     spdm_context = spdm_test_context->spdm_context;
    1276            1 :     spdm_test_context->case_id = 0x16;
    1277            1 :     spdm_context->connection_info.connection_state =
    1278              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    1279            1 :     spdm_context->local_context.capability.flags |=
    1280              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    1281            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1282              :         m_libspdm_use_hash_algo;
    1283            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    1284              :         m_libspdm_use_asym_algo;
    1285            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    1286              :         m_libspdm_use_measurement_hash_algo;
    1287            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    1288              :         m_libspdm_use_measurement_spec;
    1289              : 
    1290            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1291              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1292            1 :     libspdm_reset_message_m(spdm_context, NULL);
    1293            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
    1294              : 
    1295          101 :     for (NumberOfMessages = 1; NumberOfMessages <= TOTAL_MESSAGES; NumberOfMessages++) {
    1296          100 :         libspdm_get_random_number(SPDM_NONCE_SIZE,
    1297              :                                   m_libspdm_get_measurements_request9.nonce);
    1298          100 :         response_size = sizeof(response);
    1299          100 :         status = libspdm_get_response_measurements(
    1300              :             spdm_context, m_libspdm_get_measurements_request9_size,
    1301              :             &m_libspdm_get_measurements_request9, &response_size,
    1302              :             response);
    1303          100 :         assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1304          100 :         spdm_response = (void *)response;
    1305          100 :         if (spdm_response->header.request_response_code ==
    1306              :             SPDM_MEASUREMENTS) {
    1307          100 :             assert_int_equal(
    1308              :                 spdm_response->header.request_response_code,
    1309              :                 SPDM_MEASUREMENTS);
    1310          100 :             assert_int_equal(
    1311              :                 response_size,
    1312              :                 sizeof(spdm_measurements_response_t) +
    1313              :                 sizeof(spdm_measurement_block_dmtf_t) +
    1314              :                 libspdm_get_measurement_hash_size(
    1315              :                     m_libspdm_use_measurement_hash_algo) + SPDM_NONCE_SIZE +
    1316              :                 sizeof(uint16_t));
    1317              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1318              :             assert_int_equal(
    1319              :                 spdm_context->transcript.message_m.buffer_size,
    1320              :                 NumberOfMessages *
    1321              :                 (m_libspdm_get_measurements_request9_size +
    1322              :                  sizeof(spdm_measurements_response_t) +
    1323              :                  sizeof(spdm_measurement_block_dmtf_t) +
    1324              :                  libspdm_get_measurement_hash_size(
    1325              :                      m_libspdm_use_measurement_hash_algo) + SPDM_NONCE_SIZE +
    1326              :                  sizeof(uint16_t)));
    1327              : #endif
    1328              :         } else {
    1329            0 :             assert_int_equal(
    1330              :                 spdm_response->header.request_response_code,
    1331              :                 SPDM_ERROR);
    1332              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1333              :             assert_int_equal(
    1334              :                 spdm_context->transcript.message_m.buffer_size,
    1335              :                 0);
    1336              : #endif
    1337            0 :             break;
    1338              :         }
    1339              :     }
    1340            1 : }
    1341              : 
    1342              : /**
    1343              :  * Test 23: Successful response to get a session based measurement with signature
    1344              :  * Expected Behavior: get a RETURN_SUCCESS return code, with an empty session_transcript.message_m
    1345              :  **/
    1346            1 : void libspdm_test_responder_measurements_case23(void **state)
    1347              : {
    1348              :     libspdm_return_t status;
    1349              :     libspdm_test_context_t *spdm_test_context;
    1350              :     libspdm_context_t *spdm_context;
    1351              :     size_t response_size;
    1352              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1353              :     spdm_measurements_response_t *spdm_response;
    1354              :     size_t measurment_sig_size;
    1355              :     libspdm_session_info_t *session_info;
    1356              :     uint32_t session_id;
    1357              : 
    1358            1 :     spdm_test_context = *state;
    1359            1 :     spdm_context = spdm_test_context->spdm_context;
    1360            1 :     spdm_test_context->case_id = 0x17;
    1361            1 :     spdm_context->connection_info.connection_state =
    1362              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    1363            1 :     spdm_context->local_context.capability.flags |=
    1364              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    1365            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1366              :         m_libspdm_use_hash_algo;
    1367            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    1368              :         m_libspdm_use_asym_algo;
    1369            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    1370              :         m_libspdm_use_measurement_spec;
    1371            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    1372              :         m_libspdm_use_measurement_hash_algo;
    1373            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
    1374              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1375            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
    1376            1 :     measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
    1377            1 :                           libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    1378              : 
    1379            1 :     response_size = sizeof(response);
    1380            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
    1381              :                               m_libspdm_get_measurements_request5.nonce);
    1382              : 
    1383              : 
    1384            1 :     session_id = 0xFFFFFFFF;
    1385            1 :     spdm_context->latest_session_id = session_id;
    1386            1 :     spdm_context->last_spdm_request_session_id_valid = true;
    1387            1 :     spdm_context->last_spdm_request_session_id = session_id;
    1388            1 :     session_info = &spdm_context->session_info[0];
    1389            1 :     libspdm_session_info_init(spdm_context, session_info, session_id, true);
    1390            1 :     libspdm_secured_message_set_session_state(
    1391              :         session_info->secured_message_context,
    1392              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
    1393            1 :     status = libspdm_get_response_measurements(
    1394              :         spdm_context, m_libspdm_get_measurements_request5_size,
    1395              :         &m_libspdm_get_measurements_request5, &response_size, response);
    1396            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1397            1 :     assert_int_equal(response_size, sizeof(spdm_measurements_response_t) +
    1398              :                      measurment_sig_size);
    1399            1 :     spdm_response = (void *)response;
    1400            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1401              :                      SPDM_MEASUREMENTS);
    1402            1 :     assert_int_equal(spdm_response->header.param1,
    1403              :                      LIBSPDM_MEASUREMENT_BLOCK_NUMBER);
    1404              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1405              :     assert_int_equal(session_info->session_transcript.message_m.buffer_size, 0);
    1406              : #endif
    1407            1 : }
    1408              : 
    1409              : /**
    1410              :  * Test 24: receiving a correct GET_MEASUREMENTS from the requester that does not request a
    1411              :  * signature. Buffer M already has arbitrary data.
    1412              :  * Expected behavior: the responder accepts the request and produces a valid
    1413              :  * MEASUREMENTS response message, and buffer M appends the exchanged GET_MEASUREMENTS and MEASUREMENTS
    1414              :  * messages.
    1415              :  **/
    1416            1 : void libspdm_test_responder_measurements_case24(void **state)
    1417              : {
    1418              :     libspdm_return_t status;
    1419              :     libspdm_test_context_t *spdm_test_context;
    1420              :     libspdm_context_t *spdm_context;
    1421              :     size_t response_size;
    1422              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1423              :     spdm_measurements_response_t *spdm_response;
    1424              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1425              :     size_t arbitrary_size;
    1426              : #endif
    1427              : 
    1428            1 :     spdm_test_context = *state;
    1429            1 :     spdm_context = spdm_test_context->spdm_context;
    1430            1 :     spdm_test_context->case_id = 0x18;
    1431            1 :     spdm_context->connection_info.connection_state =
    1432              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    1433            1 :     spdm_context->local_context.capability.flags |=
    1434              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    1435            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1436            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    1437            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
    1438            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    1439              :         m_libspdm_use_measurement_hash_algo;
    1440            1 :     libspdm_reset_message_m(spdm_context, NULL);
    1441            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
    1442            1 :     spdm_context->last_spdm_request_session_id_valid = 0;
    1443              : 
    1444              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1445              :     /*filling M buffer with arbitrary data*/
    1446              :     arbitrary_size = 18;
    1447              :     libspdm_set_mem(spdm_context->transcript.message_m.buffer, arbitrary_size, (uint8_t) 0xFF);
    1448              :     spdm_context->transcript.message_m.buffer_size = arbitrary_size;
    1449              : #endif
    1450              : 
    1451            1 :     response_size = sizeof(response);
    1452            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE, m_libspdm_get_measurements_request7.nonce);
    1453            1 :     status = libspdm_get_response_measurements(
    1454              :         spdm_context, m_libspdm_get_measurements_request7_size,
    1455              :         &m_libspdm_get_measurements_request7, &response_size, response);
    1456            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1457            1 :     assert_int_equal(response_size,
    1458              :                      sizeof(spdm_measurements_response_t) + LIBSPDM_MEASUREMENT_BLOCK_HASH_NUMBER*
    1459              :                      (sizeof(spdm_measurement_block_dmtf_t) +
    1460              :                       libspdm_get_measurement_hash_size(m_libspdm_use_measurement_hash_algo)) +
    1461              :                      (sizeof(spdm_measurement_block_dmtf_t) +
    1462              :                       sizeof(spdm_measurements_secure_version_number_t)) +
    1463              :                      (sizeof(spdm_measurement_block_dmtf_t) +
    1464              :                       libspdm_get_measurement_hash_size(m_libspdm_use_measurement_hash_algo)) +
    1465              :                      (sizeof(spdm_measurement_block_dmtf_t) + LIBSPDM_MEASUREMENT_MANIFEST_SIZE) +
    1466              :                      (sizeof(spdm_measurement_block_dmtf_t) +
    1467              :                       sizeof(spdm_measurements_device_mode_t)) +
    1468              :                      SPDM_NONCE_SIZE + sizeof(uint16_t));
    1469            1 :     spdm_response = (void *)response;
    1470            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_MEASUREMENTS);
    1471            1 :     assert_int_equal(spdm_response->number_of_blocks, LIBSPDM_MEASUREMENT_BLOCK_NUMBER);
    1472              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1473              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size,
    1474              :                      arbitrary_size + m_libspdm_get_measurements_request7_size +
    1475              :                      sizeof(spdm_measurements_response_t) + LIBSPDM_MEASUREMENT_BLOCK_HASH_NUMBER*
    1476              :                      (sizeof(spdm_measurement_block_dmtf_t) +
    1477              :                       libspdm_get_measurement_hash_size(m_libspdm_use_measurement_hash_algo)) +
    1478              :                      (sizeof(spdm_measurement_block_dmtf_t) +
    1479              :                       sizeof(spdm_measurements_secure_version_number_t)) +
    1480              :                      (sizeof(spdm_measurement_block_dmtf_t) +
    1481              :                       libspdm_get_measurement_hash_size(m_libspdm_use_measurement_hash_algo)) +
    1482              :                      (sizeof(spdm_measurement_block_dmtf_t) + LIBSPDM_MEASUREMENT_MANIFEST_SIZE) +
    1483              :                      (sizeof(spdm_measurement_block_dmtf_t) +
    1484              :                       sizeof(spdm_measurements_device_mode_t)) +
    1485              :                      SPDM_NONCE_SIZE + sizeof(uint16_t));
    1486              : 
    1487              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size,
    1488              :                      arbitrary_size + m_libspdm_get_measurements_request7_size + response_size);
    1489              :     assert_memory_equal(spdm_context->transcript.message_m.buffer + arbitrary_size,
    1490              :                         &m_libspdm_get_measurements_request7,
    1491              :                         m_libspdm_get_measurements_request7_size);
    1492              :     assert_memory_equal(spdm_context->transcript.message_m.buffer + arbitrary_size
    1493              :                         + m_libspdm_get_measurements_request7_size,
    1494              :                         response, response_size);
    1495              : #endif
    1496            1 : }
    1497              : 
    1498            1 : void libspdm_test_responder_measurements_case25(void **state)
    1499              : {
    1500              :     libspdm_return_t status;
    1501              :     libspdm_test_context_t *spdm_test_context;
    1502              :     libspdm_context_t *spdm_context;
    1503              :     size_t response_size;
    1504              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1505              :     spdm_measurements_response_t *spdm_response;
    1506              : 
    1507            1 :     spdm_test_context = *state;
    1508            1 :     spdm_context = spdm_test_context->spdm_context;
    1509            1 :     spdm_test_context->case_id = 0x19;
    1510            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
    1511              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1512            1 :     spdm_context->connection_info.connection_state =
    1513              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    1514            1 :     spdm_context->local_context.capability.flags |=
    1515              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    1516            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1517              :         m_libspdm_use_hash_algo;
    1518            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    1519              :         m_libspdm_use_asym_algo;
    1520            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    1521              :         m_libspdm_use_measurement_spec;
    1522            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    1523              :         m_libspdm_use_measurement_hash_algo;
    1524            1 :     libspdm_reset_message_m(spdm_context, NULL);
    1525            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
    1526              : 
    1527            1 :     response_size = sizeof(response);
    1528            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
    1529              :                               m_libspdm_get_measurements_request14.nonce);
    1530            1 :     status = libspdm_get_response_measurements(
    1531              :         spdm_context, m_libspdm_get_measurements_request14_size,
    1532              :         &m_libspdm_get_measurements_request14, &response_size, response);
    1533            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1534            1 :     assert_int_equal(response_size,
    1535              :                      sizeof(spdm_measurements_response_t) +
    1536              :                      sizeof(spdm_measurement_block_dmtf_t) +
    1537              :                      LIBSPDM_MEASUREMENT_RAW_DATA_SIZE + SPDM_NONCE_SIZE +
    1538              :                      sizeof(uint16_t));
    1539            1 :     spdm_response = (void *)response;
    1540            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1541              :                      SPDM_MEASUREMENTS);
    1542              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1543              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size,
    1544              :                      m_libspdm_get_measurements_request14_size +
    1545              :                      sizeof(spdm_measurements_response_t) +
    1546              :                      sizeof(spdm_measurement_block_dmtf_t) +
    1547              :                      LIBSPDM_MEASUREMENT_RAW_DATA_SIZE + SPDM_NONCE_SIZE +
    1548              :                      sizeof(uint16_t));
    1549              : #endif
    1550            1 : }
    1551              : 
    1552            1 : void libspdm_test_responder_measurements_case26(void **state)
    1553              : {
    1554              :     libspdm_return_t status;
    1555              :     libspdm_test_context_t *spdm_test_context;
    1556              :     libspdm_context_t *spdm_context;
    1557              :     size_t response_size;
    1558              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1559              :     spdm_measurements_response_t *spdm_response;
    1560              :     void *data;
    1561              :     size_t data_size;
    1562              :     size_t measurment_sig_size;
    1563              : 
    1564            1 :     spdm_test_context = *state;
    1565            1 :     spdm_context = spdm_test_context->spdm_context;
    1566            1 :     spdm_test_context->case_id = 0x1A;
    1567            1 :     spdm_context->connection_info.connection_state =
    1568              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    1569            1 :     spdm_context->local_context.capability.flags |=
    1570              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    1571            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1572              :         m_libspdm_use_hash_algo;
    1573            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    1574              :         m_libspdm_use_asym_algo;
    1575            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    1576              :         m_libspdm_use_measurement_hash_algo;
    1577            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1578              :         m_libspdm_use_hash_algo;
    1579            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    1580              :         m_libspdm_use_measurement_spec;
    1581            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
    1582              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1583            1 :     libspdm_reset_message_m(spdm_context, NULL);
    1584            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
    1585            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1586              :                                                     m_libspdm_use_asym_algo, &data,
    1587              :                                                     &data_size, NULL, NULL);
    1588            1 :     measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
    1589            1 :                           libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    1590            9 :     for (int i = 0; i < SPDM_MAX_SLOT_COUNT; i++) {
    1591            8 :         spdm_context->local_context.local_cert_chain_provision_size[i] =
    1592              :             data_size;
    1593            8 :         spdm_context->local_context.local_cert_chain_provision[i] =
    1594              :             data;
    1595              :     }
    1596              : 
    1597            1 :     response_size = sizeof(response);
    1598            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
    1599              :                               m_libspdm_get_measurements_request15.nonce);
    1600            1 :     status = libspdm_get_response_measurements(
    1601              :         spdm_context, m_libspdm_get_measurements_request15_size,
    1602              :         &m_libspdm_get_measurements_request15, &response_size, response);
    1603            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1604            1 :     assert_int_equal(response_size,
    1605              :                      sizeof(spdm_measurements_response_t) +
    1606              :                      sizeof(spdm_measurement_block_dmtf_t) +
    1607              :                      libspdm_get_measurement_hash_size(
    1608              :                          m_libspdm_use_measurement_hash_algo) +
    1609              :                      measurment_sig_size);
    1610            1 :     spdm_response = (void *)response;
    1611            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1612              :                      SPDM_MEASUREMENTS);
    1613              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1614              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
    1615              : #endif
    1616            1 :     assert_int_equal(spdm_response->header.param2, m_libspdm_get_measurements_request15.slot_id_param|
    1617              :                      (SPDM_MEASUREMENTS_RESPONSE_CONTENT_NO_CHANGE_DETECTED &
    1618              :                       SPDM_MEASUREMENTS_RESPONSE_CONTENT_CHANGE_MASK));
    1619              : 
    1620            1 :     free(data);
    1621            1 : }
    1622              : 
    1623            1 : void libspdm_test_responder_measurements_case27(void **state)
    1624              : {
    1625              :     libspdm_return_t status;
    1626              :     libspdm_test_context_t *spdm_test_context;
    1627              :     libspdm_context_t *spdm_context;
    1628              :     size_t response_size;
    1629              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1630              :     spdm_measurements_response_t *spdm_response;
    1631              :     void *data;
    1632              :     size_t data_size;
    1633              :     size_t measurment_sig_size;
    1634              :     uint8_t content_changed;
    1635              :     uint8_t measurements_count;
    1636              :     uint8_t *measurement_record_data;
    1637              :     size_t measurement_record_data_length;
    1638              :     uint8_t expect_measurement_record_data[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
    1639              :     size_t expect_measurement_record_data_length;
    1640              :     uint8_t *opaque_data;
    1641              :     uint16_t *opaque_data_size;
    1642              :     uint8_t expect_opaque_data[SPDM_MAX_OPAQUE_DATA_SIZE];
    1643              :     size_t expect_opaque_data_size;
    1644              : 
    1645            1 :     spdm_test_context = *state;
    1646            1 :     spdm_context = spdm_test_context->spdm_context;
    1647            1 :     spdm_test_context->case_id = 0x1B;
    1648            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    1649            1 :     spdm_context->local_context.capability.flags |=
    1650              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    1651            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1652            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    1653            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    1654              :         m_libspdm_use_measurement_hash_algo;
    1655            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1656            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
    1657            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
    1658              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1659            1 :     spdm_context->connection_info.algorithm.other_params_support =
    1660              :         SPDM_ALGORITHMS_OPAQUE_DATA_FORMAT_1;
    1661            1 :     libspdm_reset_message_m(spdm_context, NULL);
    1662              : 
    1663              :     /*opaque data*/
    1664            1 :     libspdm_secret_lib_meas_opaque_data_size = 0x20;
    1665              : 
    1666            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1667              :                                                     m_libspdm_use_asym_algo, &data,
    1668              :                                                     &data_size, NULL, NULL);
    1669            1 :     measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) +
    1670            1 :                           libspdm_secret_lib_meas_opaque_data_size +
    1671            1 :                           libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    1672            9 :     for (int i = 0; i < SPDM_MAX_SLOT_COUNT; i++) {
    1673            8 :         spdm_context->local_context.local_cert_chain_provision_size[i] = data_size;
    1674            8 :         spdm_context->local_context.local_cert_chain_provision[i] = data;
    1675              :     }
    1676              : 
    1677            1 :     response_size = sizeof(response);
    1678            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE, m_libspdm_get_measurements_request15.nonce);
    1679            1 :     status = libspdm_get_response_measurements(
    1680              :         spdm_context, m_libspdm_get_measurements_request15_size,
    1681              :         &m_libspdm_get_measurements_request15, &response_size, response);
    1682            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1683            1 :     assert_int_equal(response_size,
    1684              :                      sizeof(spdm_measurements_response_t) +
    1685              :                      sizeof(spdm_measurement_block_dmtf_t) +
    1686              :                      libspdm_get_measurement_hash_size(m_libspdm_use_measurement_hash_algo) +
    1687              :                      measurment_sig_size);
    1688            1 :     spdm_response = (void *)response;
    1689            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1690              :                      SPDM_MEASUREMENTS);
    1691              : 
    1692            1 :     expect_measurement_record_data_length = sizeof(expect_measurement_record_data);
    1693            1 :     expect_opaque_data_size = sizeof(expect_opaque_data);
    1694              : 
    1695            1 :     libspdm_measurement_collection(
    1696              : #if LIBSPDM_HAL_PASS_SPDM_CONTEXT
    1697              :         spdm_context,
    1698              : #endif
    1699            1 :         spdm_context->connection_info.version,
    1700            1 :         spdm_context->connection_info.algorithm.measurement_spec,
    1701              :         spdm_context->connection_info.algorithm.measurement_hash_algo,
    1702            1 :         m_libspdm_get_measurements_request15.header.param2,
    1703            1 :         m_libspdm_get_measurements_request15.header.param1,
    1704              :         &content_changed,
    1705              :         &measurements_count,
    1706              :         expect_measurement_record_data,
    1707              :         &expect_measurement_record_data_length);
    1708              : 
    1709            1 :     libspdm_measurement_opaque_data(
    1710              : #if LIBSPDM_HAL_PASS_SPDM_CONTEXT
    1711              :         spdm_context,
    1712              : #endif
    1713            1 :         spdm_context->connection_info.version,
    1714            1 :         spdm_context->connection_info.algorithm.measurement_spec,
    1715              :         spdm_context->connection_info.algorithm.measurement_hash_algo,
    1716            1 :         m_libspdm_get_measurements_request15.header.param2,
    1717            1 :         m_libspdm_get_measurements_request15.header.param1,
    1718              :         expect_opaque_data,
    1719              :         &expect_opaque_data_size);
    1720              : 
    1721            1 :     measurement_record_data = (uint8_t *)response + sizeof(spdm_measurements_response_t);
    1722            1 :     opaque_data_size =
    1723              :         (uint16_t *)(measurement_record_data + sizeof(spdm_measurement_block_dmtf_t) +
    1724            1 :                      libspdm_get_measurement_hash_size(
    1725            1 :                          m_libspdm_use_measurement_hash_algo) +
    1726              :                      SPDM_NONCE_SIZE);
    1727            1 :     opaque_data = (uint8_t *)opaque_data_size + sizeof(uint16_t);
    1728              : 
    1729            1 :     measurement_record_data_length = libspdm_read_uint24(spdm_response->measurement_record_length);
    1730              : 
    1731            1 :     assert_int_equal(measurement_record_data_length, expect_measurement_record_data_length );
    1732            1 :     assert_memory_equal(measurement_record_data, expect_measurement_record_data,
    1733              :                         expect_measurement_record_data_length);
    1734            1 :     assert_int_equal(*opaque_data_size, libspdm_secret_lib_meas_opaque_data_size);
    1735            1 :     assert_memory_equal(opaque_data, expect_opaque_data, libspdm_secret_lib_meas_opaque_data_size);
    1736              : 
    1737              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1738              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
    1739              : #endif
    1740            1 :     assert_int_equal(spdm_response->header.param2, m_libspdm_get_measurements_request15.slot_id_param|
    1741              :                      (SPDM_MEASUREMENTS_RESPONSE_CONTENT_NO_CHANGE_DETECTED &
    1742              :                       SPDM_MEASUREMENTS_RESPONSE_CONTENT_CHANGE_MASK));
    1743              : 
    1744            1 :     free(data);
    1745            1 : }
    1746              : 
    1747              : /**
    1748              :  * Test 28: Successful response to get all measurements with signature using slot_id 0xFF
    1749              :  * Expected Behavior: get a RETURN_SUCCESS return code, empty transcript.message_m, and correct response message size and fields
    1750              :  **/
    1751            1 : void libspdm_test_responder_measurements_case28(void **state)
    1752              : {
    1753              :     libspdm_return_t status;
    1754              :     libspdm_test_context_t *spdm_test_context;
    1755              :     libspdm_context_t *spdm_context;
    1756              :     size_t response_size;
    1757              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1758              :     spdm_measurements_response_t *spdm_response;
    1759              :     void *data;
    1760              :     size_t data_size;
    1761              :     size_t measurment_sig_size;
    1762              : 
    1763            1 :     spdm_test_context = *state;
    1764            1 :     spdm_context = spdm_test_context->spdm_context;
    1765            1 :     spdm_test_context->case_id = 0x1C;
    1766            1 :     spdm_context->connection_info.connection_state =
    1767              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    1768            1 :     spdm_context->local_context.capability.flags |=
    1769              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    1770            1 :     spdm_context->local_context.capability.flags |=
    1771              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PUB_KEY_ID_CAP;
    1772            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1773              :         m_libspdm_use_hash_algo;
    1774            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    1775              :         m_libspdm_use_asym_algo;
    1776            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    1777              :         m_libspdm_use_measurement_hash_algo;
    1778            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1779              :         m_libspdm_use_hash_algo;
    1780            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    1781              :         m_libspdm_use_measurement_spec;
    1782            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
    1783              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1784            1 :     libspdm_reset_message_m(spdm_context, NULL);
    1785              : 
    1786              :     /*opaque data*/
    1787            1 :     libspdm_secret_lib_meas_opaque_data_size = 0x20;
    1788              : 
    1789            1 :     libspdm_read_responder_public_key(m_libspdm_use_asym_algo, &data, &data_size);
    1790            1 :     spdm_context->local_context.local_public_key_provision = data;
    1791            1 :     spdm_context->local_context.local_public_key_provision_size = data_size;
    1792              : 
    1793            1 :     measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) +
    1794            1 :                           libspdm_secret_lib_meas_opaque_data_size +
    1795            1 :                           libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    1796            1 :     response_size = sizeof(response);
    1797            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
    1798              :                               m_libspdm_get_measurements_request16.nonce);
    1799            1 :     m_libspdm_get_measurements_request16.slot_id_param = 0xF;
    1800            1 :     status = libspdm_get_response_measurements(
    1801              :         spdm_context, m_libspdm_get_measurements_request16_size,
    1802              :         &m_libspdm_get_measurements_request16, &response_size, response);
    1803            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1804            1 :     assert_int_equal(response_size,
    1805              :                      sizeof(spdm_measurements_response_t) + sizeof(spdm_measurement_block_dmtf_t) +
    1806              :                      libspdm_get_measurement_hash_size(m_libspdm_use_measurement_hash_algo) +
    1807              :                      measurment_sig_size);
    1808            1 :     spdm_response = (void *)response;
    1809            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1810              :                      SPDM_MEASUREMENTS);
    1811              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1812              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
    1813              : #endif
    1814            1 :     assert_int_equal(spdm_response->header.param2,
    1815              :                      m_libspdm_get_measurements_request16.slot_id_param |
    1816              :                      (SPDM_MEASUREMENTS_RESPONSE_CONTENT_NO_CHANGE_DETECTED &
    1817              :                       SPDM_MEASUREMENTS_RESPONSE_CONTENT_CHANGE_MASK));
    1818              : 
    1819            1 :     free(data);
    1820            1 : }
    1821              : 
    1822              : /**
    1823              :  * Test 29: Based of Test Case 7  Successful response to get a number of measurements
    1824              :  * with signature.
    1825              :  * Signature test with signing in big endian but verification in little endian.
    1826              :  *
    1827              :  * Expected Behavior: Failing signature verification
    1828              :  **/
    1829            1 : void libspdm_test_responder_measurements_case29(void** state)
    1830              : {
    1831              :     libspdm_return_t status;
    1832              :     libspdm_test_context_t* spdm_test_context;
    1833              :     libspdm_context_t* spdm_context;
    1834              :     size_t response_size;
    1835              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1836              :     spdm_measurements_response_t* spdm_response;
    1837              :     size_t measurment_sig_size;
    1838              : 
    1839              :     bool result;
    1840              :     uint32_t measurement_record_data_length;
    1841              :     uint8_t* measurement_record_data;
    1842              :     uint8_t* ptr;
    1843              :     uint16_t opaque_length;
    1844              :     void* signature;
    1845              :     size_t signature_size;
    1846              :     libspdm_session_info_t* session_info;
    1847              :     void* data;
    1848              :     size_t data_size;
    1849              :     void* hash;
    1850              :     size_t hash_size;
    1851              : 
    1852            1 :     spdm_test_context = *state;
    1853            1 :     spdm_context = spdm_test_context->spdm_context;
    1854            1 :     spdm_test_context->case_id = 29;
    1855            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
    1856              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1857            1 :     spdm_context->connection_info.connection_state =
    1858              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    1859            1 :     spdm_context->local_context.capability.flags |=
    1860              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    1861            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1862              :         m_libspdm_use_hash_algo;
    1863            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    1864              :         m_libspdm_use_asym_algo;
    1865            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    1866              :         m_libspdm_use_measurement_spec;
    1867            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    1868              :         m_libspdm_use_measurement_hash_algo;
    1869            1 :     spdm_context->spdm_10_11_verify_signature_endian =
    1870              :         LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_LITTLE_ONLY;
    1871              : 
    1872            1 :     libspdm_reset_message_m(spdm_context, NULL);
    1873            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
    1874            1 :     measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
    1875            1 :                           libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    1876              : 
    1877            1 :     response_size = sizeof(response);
    1878            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
    1879              :                               m_libspdm_get_measurements_request5.nonce);
    1880            1 :     status = libspdm_get_response_measurements(
    1881              :         spdm_context, m_libspdm_get_measurements_request5_size,
    1882              :         &m_libspdm_get_measurements_request5, &response_size, response);
    1883            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1884            1 :     assert_int_equal(response_size, sizeof(spdm_measurements_response_t) +
    1885              :                      measurment_sig_size);
    1886            1 :     spdm_response = (void*)response;
    1887            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1888              :                      SPDM_MEASUREMENTS);
    1889            1 :     assert_int_equal(spdm_response->header.param1,
    1890              :                      LIBSPDM_MEASUREMENT_BLOCK_NUMBER);
    1891              : 
    1892            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1893              :                                                     m_libspdm_use_asym_algo, &data,
    1894              :                                                     &data_size,
    1895              :                                                     &hash, &hash_size);
    1896              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1897              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    1898              :         data_size;
    1899              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    1900              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    1901              :                      data, data_size);
    1902              : #else
    1903            1 :     libspdm_hash_all(
    1904              :         spdm_context->connection_info.algorithm.base_hash_algo,
    1905              :         data, data_size,
    1906            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
    1907            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
    1908            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
    1909            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
    1910              :         spdm_context->connection_info.algorithm.base_hash_algo,
    1911              :         spdm_context->connection_info.algorithm.base_asym_algo,
    1912              :         data, data_size,
    1913              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
    1914              : #endif
    1915              : 
    1916            1 :     measurement_record_data_length = libspdm_read_uint24(spdm_response->measurement_record_length);
    1917            1 :     measurement_record_data = (void*)(spdm_response + 1);
    1918            1 :     ptr = measurement_record_data + measurement_record_data_length;
    1919            1 :     ptr += SPDM_NONCE_SIZE;
    1920            1 :     opaque_length = libspdm_read_uint16((const uint8_t*)ptr);
    1921            1 :     ptr += sizeof(uint16_t);
    1922            1 :     ptr += opaque_length;
    1923            1 :     signature = ptr;
    1924            1 :     signature_size = libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    1925            1 :     session_info = NULL;
    1926              : 
    1927            1 :     status = libspdm_append_message_m(spdm_context, session_info,
    1928              :                                       &m_libspdm_get_measurements_request5,
    1929              :                                       m_libspdm_get_measurements_request5_size);
    1930            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1931              : 
    1932            1 :     status = libspdm_append_message_m(spdm_context, session_info, spdm_response,
    1933              :                                       response_size - signature_size);
    1934            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1935              : 
    1936            1 :     result = libspdm_verify_measurement_signature(
    1937              :         spdm_context, session_info, signature, signature_size);
    1938            1 :     assert_true(result == false);
    1939              : 
    1940              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1941              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
    1942              : #endif
    1943            1 : }
    1944              : 
    1945              : /**
    1946              :  * Test 30: Based of Test Case 7  Successful response to get a number of measurements
    1947              :  * with signature.
    1948              :  * Signature test with signing in big endian but verification in little endian.
    1949              :  *
    1950              :  * Expected Behavior: Failing signature verification
    1951              :  **/
    1952            1 : void libspdm_test_responder_measurements_case30(void** state)
    1953              : {
    1954              :     libspdm_return_t status;
    1955              :     libspdm_test_context_t* spdm_test_context;
    1956              :     libspdm_context_t* spdm_context;
    1957              :     size_t response_size;
    1958              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1959              :     spdm_measurements_response_t* spdm_response;
    1960              :     size_t measurment_sig_size;
    1961              : 
    1962              :     bool result;
    1963              :     uint32_t measurement_record_data_length;
    1964              :     uint8_t* measurement_record_data;
    1965              :     uint8_t* ptr;
    1966              :     uint16_t opaque_length;
    1967              :     void* signature;
    1968              :     size_t signature_size;
    1969              :     libspdm_session_info_t* session_info;
    1970              :     void* data;
    1971              :     size_t data_size;
    1972              :     void* hash;
    1973              :     size_t hash_size;
    1974              : 
    1975            1 :     spdm_test_context = *state;
    1976            1 :     spdm_context = spdm_test_context->spdm_context;
    1977            1 :     spdm_test_context->case_id = 30;
    1978            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
    1979              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1980            1 :     spdm_context->connection_info.connection_state =
    1981              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    1982            1 :     spdm_context->local_context.capability.flags |=
    1983              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    1984            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    1985              :         m_libspdm_use_hash_algo;
    1986            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    1987              :         m_libspdm_use_asym_algo;
    1988            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    1989              :         m_libspdm_use_measurement_spec;
    1990            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    1991              :         m_libspdm_use_measurement_hash_algo;
    1992            1 :     spdm_context->spdm_10_11_verify_signature_endian =
    1993              :         LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_ONLY;
    1994              : 
    1995            1 :     libspdm_reset_message_m(spdm_context, NULL);
    1996            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
    1997            1 :     measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
    1998            1 :                           libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    1999              : 
    2000            1 :     response_size = sizeof(response);
    2001            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
    2002              :                               m_libspdm_get_measurements_request5.nonce);
    2003            1 :     status = libspdm_get_response_measurements(
    2004              :         spdm_context, m_libspdm_get_measurements_request5_size,
    2005              :         &m_libspdm_get_measurements_request5, &response_size, response);
    2006            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    2007            1 :     assert_int_equal(response_size, sizeof(spdm_measurements_response_t) +
    2008              :                      measurment_sig_size);
    2009            1 :     spdm_response = (void*)response;
    2010            1 :     assert_int_equal(spdm_response->header.request_response_code,
    2011              :                      SPDM_MEASUREMENTS);
    2012            1 :     assert_int_equal(spdm_response->header.param1,
    2013              :                      LIBSPDM_MEASUREMENT_BLOCK_NUMBER);
    2014              : 
    2015            1 :     libspdm_read_responder_public_certificate_chain(
    2016              :         m_libspdm_use_hash_algo, m_libspdm_use_asym_algo,
    2017              :         &data, &data_size,
    2018              :         &hash, &hash_size);
    2019              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    2020              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    2021              :         data_size;
    2022              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    2023              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    2024              :                      data, data_size);
    2025              : #else
    2026            1 :     libspdm_hash_all(
    2027              :         spdm_context->connection_info.algorithm.base_hash_algo,
    2028              :         data, data_size,
    2029            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
    2030            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
    2031            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
    2032            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
    2033              :         spdm_context->connection_info.algorithm.base_hash_algo,
    2034              :         spdm_context->connection_info.algorithm.base_asym_algo,
    2035              :         data, data_size,
    2036              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
    2037              : #endif
    2038              : 
    2039            1 :     measurement_record_data_length = libspdm_read_uint24(spdm_response->measurement_record_length);
    2040            1 :     measurement_record_data = (void*)(spdm_response + 1);
    2041            1 :     ptr = measurement_record_data + measurement_record_data_length;
    2042            1 :     ptr += SPDM_NONCE_SIZE;
    2043            1 :     opaque_length = libspdm_read_uint16((const uint8_t*)ptr);
    2044            1 :     ptr += sizeof(uint16_t);
    2045            1 :     ptr += opaque_length;
    2046            1 :     signature = ptr;
    2047            1 :     signature_size = libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    2048            1 :     session_info = NULL;
    2049              : 
    2050            1 :     status = libspdm_append_message_m(
    2051              :         spdm_context, session_info,
    2052              :         &m_libspdm_get_measurements_request5,
    2053              :         m_libspdm_get_measurements_request5_size);
    2054            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    2055              : 
    2056            1 :     status = libspdm_append_message_m(
    2057              :         spdm_context, session_info, spdm_response,
    2058              :         response_size - signature_size);
    2059            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    2060              : 
    2061            1 :     result = libspdm_verify_measurement_signature(
    2062              :         spdm_context, session_info, signature, signature_size);
    2063            1 :     assert_true(result == true);
    2064              : 
    2065              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    2066              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
    2067              : #endif
    2068            1 : }
    2069              : 
    2070              : /**
    2071              :  * Test 31: Based of Test Case 7  Successful response to get a number of measurements
    2072              :  * with signature.
    2073              :  * Signature test with signing in big endian but verification in big or little endian.
    2074              :  *
    2075              :  * Expected Behavior: Passing signature verification
    2076              :  **/
    2077            1 : void libspdm_test_responder_measurements_case31(void** state)
    2078              : {
    2079              :     libspdm_return_t status;
    2080              :     libspdm_test_context_t* spdm_test_context;
    2081              :     libspdm_context_t* spdm_context;
    2082              :     size_t response_size;
    2083              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    2084              :     spdm_measurements_response_t* spdm_response;
    2085              :     size_t measurment_sig_size;
    2086              : 
    2087              :     bool result;
    2088              :     uint32_t measurement_record_data_length;
    2089              :     uint8_t* measurement_record_data;
    2090              :     uint8_t* ptr;
    2091              :     uint16_t opaque_length;
    2092              :     void* signature;
    2093              :     size_t signature_size;
    2094              :     libspdm_session_info_t* session_info;
    2095              :     void* data;
    2096              :     size_t data_size;
    2097              :     void* hash;
    2098              :     size_t hash_size;
    2099              : 
    2100            1 :     spdm_test_context = *state;
    2101            1 :     spdm_context = spdm_test_context->spdm_context;
    2102            1 :     spdm_test_context->case_id = 31;
    2103            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
    2104              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    2105            1 :     spdm_context->connection_info.connection_state =
    2106              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    2107            1 :     spdm_context->local_context.capability.flags |=
    2108              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    2109            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    2110              :         m_libspdm_use_hash_algo;
    2111            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    2112              :         m_libspdm_use_asym_algo;
    2113            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    2114              :         m_libspdm_use_measurement_spec;
    2115            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    2116              :         m_libspdm_use_measurement_hash_algo;
    2117            1 :     spdm_context->spdm_10_11_verify_signature_endian =
    2118              :         LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_OR_LITTLE;
    2119              : 
    2120            1 :     libspdm_reset_message_m(spdm_context, NULL);
    2121            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
    2122            1 :     measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
    2123            1 :                           libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    2124              : 
    2125            1 :     response_size = sizeof(response);
    2126            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
    2127              :                               m_libspdm_get_measurements_request5.nonce);
    2128            1 :     status = libspdm_get_response_measurements(
    2129              :         spdm_context, m_libspdm_get_measurements_request5_size,
    2130              :         &m_libspdm_get_measurements_request5, &response_size, response);
    2131            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    2132            1 :     assert_int_equal(response_size, sizeof(spdm_measurements_response_t) +
    2133              :                      measurment_sig_size);
    2134            1 :     spdm_response = (void*)response;
    2135            1 :     assert_int_equal(spdm_response->header.request_response_code,
    2136              :                      SPDM_MEASUREMENTS);
    2137            1 :     assert_int_equal(spdm_response->header.param1,
    2138              :                      LIBSPDM_MEASUREMENT_BLOCK_NUMBER);
    2139              : 
    2140            1 :     libspdm_read_responder_public_certificate_chain(
    2141              :         m_libspdm_use_hash_algo, m_libspdm_use_asym_algo,
    2142              :         &data, &data_size,
    2143              :         &hash, &hash_size);
    2144              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    2145              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    2146              :         data_size;
    2147              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    2148              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    2149              :                      data, data_size);
    2150              : #else
    2151            1 :     libspdm_hash_all(
    2152              :         spdm_context->connection_info.algorithm.base_hash_algo,
    2153              :         data, data_size,
    2154            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
    2155            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
    2156            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
    2157            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
    2158              :         spdm_context->connection_info.algorithm.base_hash_algo,
    2159              :         spdm_context->connection_info.algorithm.base_asym_algo,
    2160              :         data, data_size,
    2161              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
    2162              : #endif
    2163              : 
    2164            1 :     measurement_record_data_length = libspdm_read_uint24(spdm_response->measurement_record_length);
    2165            1 :     measurement_record_data = (void*)(spdm_response + 1);
    2166            1 :     ptr = measurement_record_data + measurement_record_data_length;
    2167            1 :     ptr += SPDM_NONCE_SIZE;
    2168            1 :     opaque_length = libspdm_read_uint16((const uint8_t*)ptr);
    2169            1 :     ptr += sizeof(uint16_t);
    2170            1 :     ptr += opaque_length;
    2171            1 :     signature = ptr;
    2172            1 :     signature_size = libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    2173            1 :     session_info = NULL;
    2174              : 
    2175            1 :     status = libspdm_append_message_m(
    2176              :         spdm_context, session_info,
    2177              :         &m_libspdm_get_measurements_request5,
    2178              :         m_libspdm_get_measurements_request5_size);
    2179            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    2180              : 
    2181            1 :     status = libspdm_append_message_m(
    2182              :         spdm_context, session_info, spdm_response,
    2183              :         response_size - signature_size);
    2184            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    2185              : 
    2186            1 :     result = libspdm_verify_measurement_signature(
    2187              :         spdm_context, session_info, signature, signature_size);
    2188            1 :     assert_true(result == true);
    2189              : 
    2190              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    2191              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
    2192              : #endif
    2193            1 : }
    2194              : 
    2195              : /**
    2196              :  * Test 32: Based of Test Case 7  Successful response to get a number of measurements
    2197              :  * with signature.
    2198              :  * Signature test with signing in little endian but verification in little endian.
    2199              :  *
    2200              :  * Expected Behavior: Failing signature verification
    2201              :  **/
    2202            1 : void libspdm_test_responder_measurements_case32(void** state)
    2203              : {
    2204              :     libspdm_return_t status;
    2205              :     libspdm_test_context_t* spdm_test_context;
    2206              :     libspdm_context_t* spdm_context;
    2207              :     size_t response_size;
    2208              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    2209              :     spdm_measurements_response_t* spdm_response;
    2210              :     size_t measurment_sig_size;
    2211              : 
    2212              :     bool result;
    2213              :     uint32_t measurement_record_data_length;
    2214              :     uint8_t* measurement_record_data;
    2215              :     uint8_t* ptr;
    2216              :     uint16_t opaque_length;
    2217              :     void* signature;
    2218              :     size_t signature_size;
    2219              :     libspdm_session_info_t* session_info;
    2220              :     void* data;
    2221              :     size_t data_size;
    2222              :     void* hash;
    2223              :     size_t hash_size;
    2224              : 
    2225            1 :     spdm_test_context = *state;
    2226            1 :     spdm_context = spdm_test_context->spdm_context;
    2227            1 :     spdm_test_context->case_id = 32;
    2228            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
    2229              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    2230            1 :     spdm_context->connection_info.connection_state =
    2231              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    2232            1 :     spdm_context->local_context.capability.flags |=
    2233              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    2234            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    2235              :         m_libspdm_use_hash_algo;
    2236            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    2237              :         m_libspdm_use_asym_algo;
    2238            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    2239              :         m_libspdm_use_measurement_spec;
    2240            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    2241              :         m_libspdm_use_measurement_hash_algo;
    2242            1 :     spdm_context->spdm_10_11_verify_signature_endian =
    2243              :         LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_LITTLE_ONLY;
    2244              : 
    2245            1 :     libspdm_reset_message_m(spdm_context, NULL);
    2246            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
    2247            1 :     measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
    2248            1 :                           libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    2249              : 
    2250            1 :     response_size = sizeof(response);
    2251            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
    2252              :                               m_libspdm_get_measurements_request5.nonce);
    2253            1 :     status = libspdm_get_response_measurements(
    2254              :         spdm_context, m_libspdm_get_measurements_request5_size,
    2255              :         &m_libspdm_get_measurements_request5, &response_size, response);
    2256            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    2257            1 :     assert_int_equal(response_size, sizeof(spdm_measurements_response_t) +
    2258              :                      measurment_sig_size);
    2259            1 :     spdm_response = (void*)response;
    2260            1 :     assert_int_equal(spdm_response->header.request_response_code,
    2261              :                      SPDM_MEASUREMENTS);
    2262            1 :     assert_int_equal(spdm_response->header.param1,
    2263              :                      LIBSPDM_MEASUREMENT_BLOCK_NUMBER);
    2264              : 
    2265            1 :     libspdm_read_responder_public_certificate_chain(
    2266              :         m_libspdm_use_hash_algo, m_libspdm_use_asym_algo,
    2267              :         &data, &data_size,
    2268              :         &hash, &hash_size);
    2269              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    2270              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    2271              :         data_size;
    2272              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    2273              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    2274              :                      data, data_size);
    2275              : #else
    2276            1 :     libspdm_hash_all(
    2277              :         spdm_context->connection_info.algorithm.base_hash_algo,
    2278              :         data, data_size,
    2279            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
    2280            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
    2281            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
    2282            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
    2283              :         spdm_context->connection_info.algorithm.base_hash_algo,
    2284              :         spdm_context->connection_info.algorithm.base_asym_algo,
    2285              :         data, data_size,
    2286              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
    2287              : #endif
    2288              : 
    2289            1 :     measurement_record_data_length = libspdm_read_uint24(spdm_response->measurement_record_length);
    2290            1 :     measurement_record_data = (void*)(spdm_response + 1);
    2291            1 :     ptr = measurement_record_data + measurement_record_data_length;
    2292            1 :     ptr += SPDM_NONCE_SIZE;
    2293            1 :     opaque_length = libspdm_read_uint16((const uint8_t*)ptr);
    2294            1 :     ptr += sizeof(uint16_t);
    2295            1 :     ptr += opaque_length;
    2296            1 :     signature = ptr;
    2297            1 :     signature_size = libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    2298              : 
    2299            1 :     libspdm_copy_signature_swap_endian(
    2300              :         m_libspdm_use_asym_algo,
    2301              :         signature, signature_size, signature, signature_size);
    2302              : 
    2303            1 :     session_info = NULL;
    2304              : 
    2305            1 :     status = libspdm_append_message_m(
    2306              :         spdm_context, session_info,
    2307              :         &m_libspdm_get_measurements_request5,
    2308              :         m_libspdm_get_measurements_request5_size);
    2309            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    2310              : 
    2311            1 :     status = libspdm_append_message_m(
    2312              :         spdm_context, session_info, spdm_response,
    2313              :         response_size - signature_size);
    2314            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    2315              : 
    2316            1 :     result = libspdm_verify_measurement_signature(
    2317              :         spdm_context, session_info, signature, signature_size);
    2318            1 :     assert_true(result == true);
    2319              : 
    2320              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    2321              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
    2322              : #endif
    2323            1 : }
    2324              : 
    2325              : /**
    2326              :  * Test 33: Based of Test Case 7  Successful response to get a number of measurements
    2327              :  * with signature.
    2328              :  * Signature test with signing in little endian but verification in big endian.
    2329              :  *
    2330              :  * Expected Behavior: Failing signature verification
    2331              :  **/
    2332            1 : void libspdm_test_responder_measurements_case33(void** state)
    2333              : {
    2334              :     libspdm_return_t status;
    2335              :     libspdm_test_context_t* spdm_test_context;
    2336              :     libspdm_context_t* spdm_context;
    2337              :     size_t response_size;
    2338              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    2339              :     spdm_measurements_response_t* spdm_response;
    2340              :     size_t measurment_sig_size;
    2341              : 
    2342              :     bool result;
    2343              :     uint32_t measurement_record_data_length;
    2344              :     uint8_t* measurement_record_data;
    2345              :     uint8_t* ptr;
    2346              :     uint16_t opaque_length;
    2347              :     void* signature;
    2348              :     size_t signature_size;
    2349              :     libspdm_session_info_t* session_info;
    2350              :     void* data;
    2351              :     size_t data_size;
    2352              :     void* hash;
    2353              :     size_t hash_size;
    2354              : 
    2355            1 :     spdm_test_context = *state;
    2356            1 :     spdm_context = spdm_test_context->spdm_context;
    2357            1 :     spdm_test_context->case_id = 33;
    2358            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
    2359              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    2360            1 :     spdm_context->connection_info.connection_state =
    2361              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    2362            1 :     spdm_context->local_context.capability.flags |=
    2363              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    2364            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    2365              :         m_libspdm_use_hash_algo;
    2366            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    2367              :         m_libspdm_use_asym_algo;
    2368            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    2369              :         m_libspdm_use_measurement_spec;
    2370            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    2371              :         m_libspdm_use_measurement_hash_algo;
    2372            1 :     spdm_context->spdm_10_11_verify_signature_endian =
    2373              :         LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_ONLY;
    2374              : 
    2375            1 :     libspdm_reset_message_m(spdm_context, NULL);
    2376            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
    2377            1 :     measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
    2378            1 :                           libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    2379              : 
    2380            1 :     response_size = sizeof(response);
    2381            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
    2382              :                               m_libspdm_get_measurements_request5.nonce);
    2383            1 :     status = libspdm_get_response_measurements(
    2384              :         spdm_context, m_libspdm_get_measurements_request5_size,
    2385              :         &m_libspdm_get_measurements_request5, &response_size, response);
    2386            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    2387            1 :     assert_int_equal(response_size, sizeof(spdm_measurements_response_t) +
    2388              :                      measurment_sig_size);
    2389            1 :     spdm_response = (void*)response;
    2390            1 :     assert_int_equal(spdm_response->header.request_response_code,
    2391              :                      SPDM_MEASUREMENTS);
    2392            1 :     assert_int_equal(spdm_response->header.param1,
    2393              :                      LIBSPDM_MEASUREMENT_BLOCK_NUMBER);
    2394              : 
    2395            1 :     libspdm_read_responder_public_certificate_chain(
    2396              :         m_libspdm_use_hash_algo, m_libspdm_use_asym_algo,
    2397              :         &data, &data_size,
    2398              :         &hash, &hash_size);
    2399              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    2400              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    2401              :         data_size;
    2402              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    2403              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    2404              :                      data, data_size);
    2405              : #else
    2406            1 :     libspdm_hash_all(
    2407              :         spdm_context->connection_info.algorithm.base_hash_algo,
    2408              :         data, data_size,
    2409            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
    2410            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
    2411            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
    2412            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
    2413              :         spdm_context->connection_info.algorithm.base_hash_algo,
    2414              :         spdm_context->connection_info.algorithm.base_asym_algo,
    2415              :         data, data_size,
    2416              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
    2417              : #endif
    2418              : 
    2419            1 :     measurement_record_data_length = libspdm_read_uint24(spdm_response->measurement_record_length);
    2420            1 :     measurement_record_data = (void*)(spdm_response + 1);
    2421            1 :     ptr = measurement_record_data + measurement_record_data_length;
    2422            1 :     ptr += SPDM_NONCE_SIZE;
    2423            1 :     opaque_length = libspdm_read_uint16((const uint8_t*)ptr);
    2424            1 :     ptr += sizeof(uint16_t);
    2425            1 :     ptr += opaque_length;
    2426            1 :     signature = ptr;
    2427            1 :     signature_size = libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    2428              : 
    2429            1 :     libspdm_copy_signature_swap_endian(
    2430              :         m_libspdm_use_asym_algo,
    2431              :         signature, signature_size, signature, signature_size);
    2432              : 
    2433            1 :     session_info = NULL;
    2434              : 
    2435            1 :     status = libspdm_append_message_m(
    2436              :         spdm_context, session_info,
    2437              :         &m_libspdm_get_measurements_request5,
    2438              :         m_libspdm_get_measurements_request5_size);
    2439            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    2440              : 
    2441            1 :     status = libspdm_append_message_m(
    2442              :         spdm_context, session_info, spdm_response,
    2443              :         response_size - signature_size);
    2444            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    2445              : 
    2446            1 :     result = libspdm_verify_measurement_signature(
    2447              :         spdm_context, session_info, signature, signature_size);
    2448            1 :     assert_true(result == false);
    2449              : 
    2450              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    2451              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
    2452              : #endif
    2453            1 : }
    2454              : 
    2455              : 
    2456              : /**
    2457              :  * Test 34: Based of Test Case 7  Successful response to get a number of measurements
    2458              :  * with signature.
    2459              :  * Signature test with signing in little endian but verification in big or little endian.
    2460              :  *
    2461              :  * Expected Behavior: Passing signature verification
    2462              :  **/
    2463            1 : void libspdm_test_responder_measurements_case34(void** state)
    2464              : {
    2465              :     libspdm_return_t status;
    2466              :     libspdm_test_context_t* spdm_test_context;
    2467              :     libspdm_context_t* spdm_context;
    2468              :     size_t response_size;
    2469              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    2470              :     spdm_measurements_response_t* spdm_response;
    2471              :     size_t measurment_sig_size;
    2472              : 
    2473              :     bool result;
    2474              :     uint32_t measurement_record_data_length;
    2475              :     uint8_t* measurement_record_data;
    2476              :     uint8_t* ptr;
    2477              :     uint16_t opaque_length;
    2478              :     void* signature;
    2479              :     size_t signature_size;
    2480              :     libspdm_session_info_t* session_info;
    2481              :     void* data;
    2482              :     size_t data_size;
    2483              :     void* hash;
    2484              :     size_t hash_size;
    2485              : 
    2486            1 :     spdm_test_context = *state;
    2487            1 :     spdm_context = spdm_test_context->spdm_context;
    2488            1 :     spdm_test_context->case_id = 34;
    2489            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
    2490              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    2491            1 :     spdm_context->connection_info.connection_state =
    2492              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    2493            1 :     spdm_context->local_context.capability.flags |=
    2494              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    2495            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    2496              :         m_libspdm_use_hash_algo;
    2497            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    2498              :         m_libspdm_use_asym_algo;
    2499            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    2500              :         m_libspdm_use_measurement_spec;
    2501            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    2502              :         m_libspdm_use_measurement_hash_algo;
    2503            1 :     spdm_context->spdm_10_11_verify_signature_endian =
    2504              :         LIBSPDM_SPDM_10_11_VERIFY_SIGNATURE_ENDIAN_BIG_OR_LITTLE;
    2505              : 
    2506            1 :     libspdm_reset_message_m(spdm_context, NULL);
    2507            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
    2508            1 :     measurment_sig_size = SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
    2509            1 :                           libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    2510              : 
    2511            1 :     response_size = sizeof(response);
    2512            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
    2513              :                               m_libspdm_get_measurements_request5.nonce);
    2514            1 :     status = libspdm_get_response_measurements(
    2515              :         spdm_context, m_libspdm_get_measurements_request5_size,
    2516              :         &m_libspdm_get_measurements_request5, &response_size, response);
    2517            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    2518            1 :     assert_int_equal(response_size, sizeof(spdm_measurements_response_t) +
    2519              :                      measurment_sig_size);
    2520            1 :     spdm_response = (void*)response;
    2521            1 :     assert_int_equal(spdm_response->header.request_response_code,
    2522              :                      SPDM_MEASUREMENTS);
    2523            1 :     assert_int_equal(spdm_response->header.param1,
    2524              :                      LIBSPDM_MEASUREMENT_BLOCK_NUMBER);
    2525              : 
    2526            1 :     libspdm_read_responder_public_certificate_chain(
    2527              :         m_libspdm_use_hash_algo, m_libspdm_use_asym_algo,
    2528              :         &data, &data_size,
    2529              :         &hash, &hash_size);
    2530              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    2531              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    2532              :         data_size;
    2533              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    2534              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    2535              :                      data, data_size);
    2536              : #else
    2537            1 :     libspdm_hash_all(
    2538              :         spdm_context->connection_info.algorithm.base_hash_algo,
    2539              :         data, data_size,
    2540            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
    2541            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
    2542            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
    2543            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
    2544              :         spdm_context->connection_info.algorithm.base_hash_algo,
    2545              :         spdm_context->connection_info.algorithm.base_asym_algo,
    2546              :         data, data_size,
    2547              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
    2548              : #endif
    2549              : 
    2550            1 :     measurement_record_data_length = libspdm_read_uint24(spdm_response->measurement_record_length);
    2551            1 :     measurement_record_data = (void*)(spdm_response + 1);
    2552            1 :     ptr = measurement_record_data + measurement_record_data_length;
    2553            1 :     ptr += SPDM_NONCE_SIZE;
    2554            1 :     opaque_length = libspdm_read_uint16((const uint8_t*)ptr);
    2555            1 :     ptr += sizeof(uint16_t);
    2556            1 :     ptr += opaque_length;
    2557            1 :     signature = ptr;
    2558            1 :     signature_size = libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    2559            1 :     libspdm_copy_signature_swap_endian(
    2560              :         m_libspdm_use_asym_algo,
    2561              :         signature, signature_size, signature, signature_size);
    2562              : 
    2563            1 :     session_info = NULL;
    2564              : 
    2565            1 :     status = libspdm_append_message_m(
    2566              :         spdm_context, session_info,
    2567              :         &m_libspdm_get_measurements_request5,
    2568              :         m_libspdm_get_measurements_request5_size);
    2569            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    2570              : 
    2571            1 :     status = libspdm_append_message_m(
    2572              :         spdm_context, session_info, spdm_response,
    2573              :         response_size - signature_size);
    2574            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    2575              : 
    2576            1 :     result = libspdm_verify_measurement_signature(
    2577              :         spdm_context, session_info, signature, signature_size);
    2578            1 :     assert_true(result == true);
    2579              : 
    2580              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    2581              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
    2582              : #endif
    2583            1 : }
    2584              : 
    2585              : /**
    2586              :  * Test 35: Successful response V1.3 to get a number of measurements without signature
    2587              :  * Expected Behavior: get a RETURN_SUCCESS return code, correct context field
    2588              :  **/
    2589            1 : void libspdm_test_responder_measurements_case35(void **state)
    2590              : {
    2591              :     libspdm_return_t status;
    2592              :     libspdm_test_context_t *spdm_test_context;
    2593              :     libspdm_context_t *spdm_context;
    2594              :     size_t response_size;
    2595              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    2596              :     spdm_measurements_response_t *spdm_response;
    2597              :     uint8_t *requester_context;
    2598              :     uint8_t *responder_context;
    2599              : 
    2600            1 :     spdm_test_context = *state;
    2601            1 :     spdm_context = spdm_test_context->spdm_context;
    2602            1 :     spdm_test_context->case_id = 35;
    2603            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
    2604              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    2605            1 :     spdm_context->connection_info.connection_state =
    2606              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    2607            1 :     spdm_context->local_context.capability.flags |=
    2608              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    2609            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    2610              :         m_libspdm_use_hash_algo;
    2611            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    2612              :         m_libspdm_use_asym_algo;
    2613            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    2614              :         m_libspdm_use_measurement_spec;
    2615            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    2616              :         m_libspdm_use_measurement_hash_algo;
    2617            1 :     libspdm_reset_message_m(spdm_context, NULL);
    2618              : 
    2619            1 :     libspdm_secret_lib_meas_opaque_data_size = 0;
    2620              : 
    2621            1 :     response_size = sizeof(response);
    2622              : 
    2623            1 :     requester_context = ((uint8_t *)&m_libspdm_get_measurements_request17) +
    2624              :                         m_libspdm_get_measurements_request17_size;
    2625            1 :     libspdm_set_mem(requester_context, SPDM_REQ_CONTEXT_SIZE, 0xAA);
    2626            1 :     m_libspdm_get_measurements_request17_size += SPDM_REQ_CONTEXT_SIZE;
    2627              : 
    2628            1 :     status = libspdm_get_response_measurements(
    2629              :         spdm_context, m_libspdm_get_measurements_request17_size,
    2630              :         &m_libspdm_get_measurements_request17, &response_size, response);
    2631              : 
    2632            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    2633            1 :     assert_int_equal(response_size,
    2634              :                      sizeof(spdm_measurements_response_t) + SPDM_NONCE_SIZE + sizeof(uint16_t) +
    2635              :                      SPDM_REQ_CONTEXT_SIZE);
    2636            1 :     spdm_response = (void *)response;
    2637            1 :     assert_int_equal(spdm_response->header.request_response_code,
    2638              :                      SPDM_MEASUREMENTS);
    2639            1 :     responder_context = (void *)response;
    2640            1 :     responder_context += sizeof(spdm_measurements_response_t) + SPDM_NONCE_SIZE + sizeof(uint16_t);
    2641            1 :     assert_memory_equal((void *)requester_context, responder_context, SPDM_REQ_CONTEXT_SIZE);
    2642              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    2643              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size,
    2644              :                      m_libspdm_get_measurements_request17_size +
    2645              :                      sizeof(spdm_measurements_response_t) +
    2646              :                      SPDM_NONCE_SIZE +
    2647              :                      sizeof(uint16_t) +
    2648              :                      SPDM_REQ_CONTEXT_SIZE);
    2649              : #endif
    2650            1 : }
    2651              : 
    2652              : /**
    2653              :  * Test 36: The key usage bit mask is not set, the SlotID fields in GET_MEASUREMENTS and MEASUREMENTS shall not specify this certificate slot
    2654              :  * Expected Behavior: get a SPDM_ERROR_CODE_INVALID_REQUEST return code
    2655              :  **/
    2656            1 : void libspdm_test_responder_measurements_case36(void **state)
    2657              : {
    2658              :     libspdm_return_t status;
    2659              :     libspdm_test_context_t *spdm_test_context;
    2660              :     libspdm_context_t *spdm_context;
    2661              :     size_t response_size;
    2662              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
    2663              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    2664              :     spdm_get_measurements_request_t *spdm_request;
    2665              :     spdm_measurements_response_t *spdm_response;
    2666              :     uint8_t *requester_context;
    2667              :     uint8_t slot_id;
    2668              :     void *data;
    2669              :     size_t data_size;
    2670              :     size_t request_size;
    2671              : 
    2672            1 :     spdm_test_context = *state;
    2673            1 :     spdm_context = spdm_test_context->spdm_context;
    2674            1 :     spdm_test_context->case_id = 36;
    2675            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
    2676              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    2677            1 :     spdm_context->connection_info.connection_state =
    2678              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    2679            1 :     spdm_context->local_context.capability.flags |=
    2680              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    2681            1 :     spdm_context->local_context.capability.flags |=
    2682              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PUB_KEY_ID_CAP;
    2683            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    2684              :         m_libspdm_use_hash_algo;
    2685            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    2686              :         m_libspdm_use_asym_algo;
    2687            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    2688              :         m_libspdm_use_measurement_hash_algo;
    2689            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    2690              :         m_libspdm_use_hash_algo;
    2691            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    2692              :         m_libspdm_use_measurement_spec;
    2693            1 :     spdm_context->connection_info.multi_key_conn_rsp = true;
    2694            1 :     libspdm_reset_message_m(spdm_context, NULL);
    2695              : 
    2696            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    2697              :                                                     m_libspdm_use_asym_algo, &data,
    2698              :                                                     &data_size, NULL, NULL);
    2699            9 :     for (int i = 0; i < SPDM_MAX_SLOT_COUNT; i++) {
    2700            8 :         spdm_context->local_context.local_cert_chain_provision_size[i] = data_size;
    2701            8 :         spdm_context->local_context.local_cert_chain_provision[i] = data;
    2702              :     }
    2703              : 
    2704            1 :     spdm_request = (void *)request;
    2705            1 :     spdm_request->header.spdm_version = SPDM_MESSAGE_VERSION_13;
    2706            1 :     spdm_request->header.request_response_code = SPDM_GET_MEASUREMENTS;
    2707            1 :     spdm_request->header.param1 = SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE;
    2708            1 :     spdm_request->header.param2 = 1;
    2709            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE, spdm_request->nonce);
    2710              :     /* If set, the SlotID fields in GET_MEASUREMENTS and MEASUREMENTS can specify this certificate slot. If not set,
    2711              :      * the SlotID fields in GET_MEASUREMENTS and MEASUREMENTS shall not specify this certificate slot. */
    2712            1 :     slot_id = 0;
    2713            1 :     spdm_request->slot_id_param = slot_id;
    2714            1 :     spdm_context->local_context.local_key_usage_bit_mask[slot_id] =
    2715              :         SPDM_KEY_USAGE_BIT_MASK_KEY_EX_USE |
    2716              :         SPDM_KEY_USAGE_BIT_MASK_CHALLENGE_USE;
    2717            1 :     requester_context = ((uint8_t *)spdm_request) + sizeof(spdm_get_measurements_request_t);
    2718            1 :     libspdm_set_mem(requester_context, SPDM_REQ_CONTEXT_SIZE, 0xAA);
    2719            1 :     request_size = sizeof(spdm_get_measurements_request_t) + SPDM_REQ_CONTEXT_SIZE;
    2720              : 
    2721            1 :     response_size = sizeof(response);
    2722            1 :     status = libspdm_get_response_measurements(
    2723              :         spdm_context, request_size,
    2724              :         (void *)spdm_request, &response_size, response);
    2725            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    2726            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
    2727            1 :     spdm_response = (void *)response;
    2728            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
    2729            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    2730            1 :     assert_int_equal(spdm_response->header.param2, 0);
    2731            1 : }
    2732              : 
    2733            1 : int libspdm_responder_measurements_test_main(void)
    2734              : {
    2735            1 :     m_libspdm_get_measurements_request11.slot_id_param = SPDM_MAX_SLOT_COUNT - 1;
    2736            1 :     m_libspdm_get_measurements_request12.slot_id_param = SPDM_MAX_SLOT_COUNT + 1;
    2737              : 
    2738            1 :     const struct CMUnitTest spdm_responder_measurements_tests[] = {
    2739              :         /* Success Case to get measurement number without signature*/
    2740              :         cmocka_unit_test(libspdm_test_responder_measurements_case1),
    2741              :         /* Can be populated with new test.*/
    2742              :         cmocka_unit_test(libspdm_test_responder_measurements_case2),
    2743              :         /* response_state: SPDM_RESPONSE_STATE_BUSY*/
    2744              :         cmocka_unit_test(libspdm_test_responder_measurements_case3),
    2745              :         /* response_state: SPDM_RESPONSE_STATE_NEED_RESYNC*/
    2746              :         cmocka_unit_test(libspdm_test_responder_measurements_case4),
    2747              :         #if LIBSPDM_RESPOND_IF_READY_SUPPORT
    2748              :         /* response_state: SPDM_RESPONSE_STATE_NOT_READY*/
    2749              :         cmocka_unit_test(libspdm_test_responder_measurements_case5),
    2750              :         #endif /* LIBSPDM_RESPOND_IF_READY_SUPPORT */
    2751              :         /* connection_state Check*/
    2752              :         cmocka_unit_test(libspdm_test_responder_measurements_case6),
    2753              :         /* Success Case to get measurement number with signature*/
    2754              :         cmocka_unit_test(libspdm_test_responder_measurements_case7),
    2755              :         /* Success Case to get one measurement with signature*/
    2756              :         cmocka_unit_test(libspdm_test_responder_measurements_case8),
    2757              :         /* Bad request size to get one measurement with signature*/
    2758              :         cmocka_unit_test(libspdm_test_responder_measurements_case9),
    2759              :         /* Success Case to get one measurement without signature*/
    2760              :         cmocka_unit_test(libspdm_test_responder_measurements_case10),
    2761              :         /* Success Case to get all measurements with signature*/
    2762              :         cmocka_unit_test(libspdm_test_responder_measurements_case11),
    2763              :         /* Success Case to get all measurements without signature*/
    2764              :         cmocka_unit_test(libspdm_test_responder_measurements_case12),
    2765              :         /* Can be populated with new test.*/
    2766              :         cmocka_unit_test(libspdm_test_responder_measurements_case13),
    2767              :         /* Error Case: sig required, but no nonce and/or SlotID*/
    2768              :         cmocka_unit_test(libspdm_test_responder_measurements_case14),
    2769              :         /* Error Case: sig required, but meas_cap = 01b (including nonce and SlotId on request)*/
    2770              :         cmocka_unit_test(libspdm_test_responder_measurements_case15),
    2771              :         /* Error Case: sig required, but meas_cap = 01b (not including nonce and SlotId on request)*/
    2772              :         cmocka_unit_test(libspdm_test_responder_measurements_case16),
    2773              :         /* Error Case: meas_cap = 00b*/
    2774              :         cmocka_unit_test(libspdm_test_responder_measurements_case17),
    2775              :         /* Success Case: SlotId different from default*/
    2776              :         cmocka_unit_test(libspdm_test_responder_measurements_case18),
    2777              :         /* Bad SlotId parameter (>= SPDM_MAX_SLOT_COUNT)*/
    2778              :         cmocka_unit_test(libspdm_test_responder_measurements_case19),
    2779              :         /* Error Case: request a measurement out of bounds*/
    2780              :         cmocka_unit_test(libspdm_test_responder_measurements_case21),
    2781              :         /* Large number of requests before requiring a signature*/
    2782              :         cmocka_unit_test(libspdm_test_responder_measurements_case22),
    2783              :         /* Successful response to get a session based measurement with signature*/
    2784              :         cmocka_unit_test(libspdm_test_responder_measurements_case23),
    2785              :         /* Buffer verification */
    2786              :         cmocka_unit_test(libspdm_test_responder_measurements_case24),
    2787              :         /* Success Case V1.2 to get one measurement without signature*/
    2788              :         cmocka_unit_test(libspdm_test_responder_measurements_case25),
    2789              :         /* Successful response V1.2 to get one measurement with signature and without opqaue data*/
    2790              :         cmocka_unit_test(libspdm_test_responder_measurements_case26),
    2791              :         /* Successful response V1.2 to get one measurement with signature and with opqaue data*/
    2792              :         cmocka_unit_test(libspdm_test_responder_measurements_case27),
    2793              :         /* Success Case to get measurement with signature using slot_id 0xFF */
    2794              :         cmocka_unit_test(libspdm_test_responder_measurements_case28),
    2795              :         /* Error Case: Big Endian Signature. Little Endian Verify */
    2796              :         cmocka_unit_test(libspdm_test_responder_measurements_case29),
    2797              :         /* Success Case: Big Endian Signature. Big Endian Verify */
    2798              :         cmocka_unit_test(libspdm_test_responder_measurements_case30),
    2799              :         /* Success Case: Big Endian Signature. Big or Little Endian Verify */
    2800              :         cmocka_unit_test(libspdm_test_responder_measurements_case31),
    2801              :         /* Success Case: Little Endian Signature. Little Endian Verify */
    2802              :         cmocka_unit_test(libspdm_test_responder_measurements_case32),
    2803              :         /* Error Case: Little Endian Signature. Big Endian Verify */
    2804              :         cmocka_unit_test(libspdm_test_responder_measurements_case33),
    2805              :         /* Success Case: Little Endian Signature. Big or Little Endian Verify */
    2806              :         cmocka_unit_test(libspdm_test_responder_measurements_case34),
    2807              :         /* Success Case: V1.3 get a correct context field */
    2808              :         cmocka_unit_test(libspdm_test_responder_measurements_case35),
    2809              :         /* The key usage bit mask is not set, failed Case*/
    2810              :         cmocka_unit_test(libspdm_test_responder_measurements_case36),
    2811              :     };
    2812              : 
    2813            1 :     libspdm_test_context_t test_context = {
    2814              :         LIBSPDM_TEST_CONTEXT_VERSION,
    2815              :         false,
    2816              :     };
    2817              : 
    2818            1 :     libspdm_setup_test_context(&test_context);
    2819              : 
    2820            1 :     return cmocka_run_group_tests(spdm_responder_measurements_tests,
    2821              :                                   libspdm_unit_test_group_setup,
    2822              :                                   libspdm_unit_test_group_teardown);
    2823              : }
    2824              : 
    2825              : #endif /* LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP*/
        

Generated by: LCOV version 2.0-1