LCOV - code coverage report
Current view: top level - unit_test/test_spdm_requester/error_test - get_measurements_err.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 67.9 % 2096 1423
Test Date: 2025-10-12 08:10:56 Functions: 100.0 % 41 41

            Line data    Source code
       1              : /**
       2              :  *  Copyright Notice:
       3              :  *  Copyright 2021-2025 DMTF. All rights reserved.
       4              :  *  License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
       5              :  **/
       6              : 
       7              : #include "spdm_unit_test.h"
       8              : #include "internal/libspdm_requester_lib.h"
       9              : #include "internal/libspdm_secured_message_lib.h"
      10              : 
      11              : #if LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP
      12              : 
      13              : #define LIBSPDM_ALTERNATIVE_DEFAULT_SLOT_ID 2
      14              : #define LIBSPDM_LARGE_MEASUREMENT_SIZE ((1 << 24) - 1)
      15              : 
      16              : static size_t m_libspdm_local_buffer_size;
      17              : static uint8_t m_libspdm_local_buffer[LIBSPDM_MAX_MESSAGE_L1L2_BUFFER_SIZE];
      18              : 
      19          140 : static size_t libspdm_test_get_measurement_request_size(const void *spdm_context,
      20              :                                                         const void *buffer,
      21              :                                                         size_t buffer_size)
      22              : {
      23              :     const spdm_get_measurements_request_t *spdm_request;
      24              :     size_t message_size;
      25              : 
      26          140 :     spdm_request = buffer;
      27          140 :     message_size = sizeof(spdm_message_header_t);
      28          140 :     if (buffer_size < message_size) {
      29            0 :         return buffer_size;
      30              :     }
      31              : 
      32          140 :     if (spdm_request->header.request_response_code !=
      33              :         SPDM_GET_MEASUREMENTS) {
      34            1 :         return buffer_size;
      35              :     }
      36              : 
      37          139 :     if ((spdm_request->header.param1 &
      38              :          SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE) != 0) {
      39           30 :         if (spdm_request->header.spdm_version >=
      40              :             SPDM_MESSAGE_VERSION_11) {
      41           30 :             if (buffer_size <
      42              :                 sizeof(spdm_get_measurements_request_t)) {
      43            0 :                 return buffer_size;
      44              :             }
      45           30 :             message_size = sizeof(spdm_get_measurements_request_t);
      46              :         } else {
      47            0 :             if (buffer_size <
      48              :                 sizeof(spdm_get_measurements_request_t) -
      49              :                 sizeof(spdm_request->slot_id_param)) {
      50            0 :                 return buffer_size;
      51              :             }
      52            0 :             message_size = sizeof(spdm_get_measurements_request_t) -
      53              :                            sizeof(spdm_request->slot_id_param);
      54              :         }
      55              :     } else {
      56              :         /* already checked before if buffer_size < sizeof(spdm_message_header_t)*/
      57          109 :         message_size = sizeof(spdm_message_header_t);
      58              :     }
      59              : 
      60              :     /* Good message, return actual size*/
      61          139 :     return message_size;
      62              : }
      63              : 
      64          141 : static libspdm_return_t send_message(
      65              :     void *spdm_context, size_t request_size, const void *request, uint64_t timeout)
      66              : {
      67              :     libspdm_test_context_t *spdm_test_context;
      68              :     size_t header_size;
      69              :     size_t message_size;
      70              :     uint32_t *session_id;
      71              :     libspdm_session_info_t *session_info;
      72              :     bool is_app_message;
      73              :     uint8_t *app_message;
      74              :     size_t app_message_size;
      75              :     uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
      76              : 
      77          141 :     memcpy(message_buffer, request, request_size);
      78              : 
      79          141 :     spdm_test_context = libspdm_get_test_context();
      80          141 :     header_size = sizeof(libspdm_test_message_header_t);
      81          141 :     switch (spdm_test_context->case_id) {
      82            1 :     case 0x1:
      83            1 :         return LIBSPDM_STATUS_SEND_FAIL;
      84            0 :     case 0x2:
      85            0 :         m_libspdm_local_buffer_size = 0;
      86            0 :         message_size = libspdm_test_get_measurement_request_size(
      87              :             spdm_context, (const uint8_t *)request + header_size,
      88              :             request_size - header_size);
      89            0 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
      90              :                          (const uint8_t *)request + header_size, message_size);
      91            0 :         m_libspdm_local_buffer_size += message_size;
      92            0 :         return LIBSPDM_STATUS_SUCCESS;
      93            0 :     case 0x3:
      94            0 :         m_libspdm_local_buffer_size = 0;
      95            0 :         message_size = libspdm_test_get_measurement_request_size(
      96              :             spdm_context, (const uint8_t *)request + header_size,
      97              :             request_size - header_size);
      98            0 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
      99              :                          (const uint8_t *)request + header_size, message_size);
     100            0 :         m_libspdm_local_buffer_size += message_size;
     101            0 :         return LIBSPDM_STATUS_SUCCESS;
     102            1 :     case 0x4:
     103            1 :         m_libspdm_local_buffer_size = 0;
     104            1 :         message_size = libspdm_test_get_measurement_request_size(
     105              :             spdm_context, (const uint8_t *)request + header_size,
     106              :             request_size - header_size);
     107            1 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     108              :                          (const uint8_t *)request + header_size, message_size);
     109            1 :         m_libspdm_local_buffer_size += message_size;
     110            1 :         return LIBSPDM_STATUS_SUCCESS;
     111            1 :     case 0x5:
     112            1 :         m_libspdm_local_buffer_size = 0;
     113            1 :         message_size = libspdm_test_get_measurement_request_size(
     114              :             spdm_context, (const uint8_t *)request + header_size,
     115              :             request_size - header_size);
     116            1 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     117              :                          (const uint8_t *)request + header_size, message_size);
     118            1 :         m_libspdm_local_buffer_size += message_size;
     119            1 :         return LIBSPDM_STATUS_SUCCESS;
     120            0 :     case 0x6:
     121            0 :         m_libspdm_local_buffer_size = 0;
     122            0 :         message_size = libspdm_test_get_measurement_request_size(
     123              :             spdm_context, (const uint8_t *)request + header_size,
     124              :             request_size - header_size);
     125            0 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     126              :                          (const uint8_t *)request + header_size, message_size);
     127            0 :         m_libspdm_local_buffer_size += message_size;
     128            0 :         return LIBSPDM_STATUS_SUCCESS;
     129            1 :     case 0x7:
     130            1 :         m_libspdm_local_buffer_size = 0;
     131            1 :         message_size = libspdm_test_get_measurement_request_size(
     132              :             spdm_context, (const uint8_t *)request + header_size,
     133              :             request_size - header_size);
     134            1 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     135              :                          (const uint8_t *)request + header_size, message_size);
     136            1 :         m_libspdm_local_buffer_size += message_size;
     137            1 :         return LIBSPDM_STATUS_SUCCESS;
     138            2 :     case 0x8:
     139            2 :         m_libspdm_local_buffer_size = 0;
     140            2 :         message_size = libspdm_test_get_measurement_request_size(
     141              :             spdm_context, (const uint8_t *)request + header_size,
     142              :             request_size - header_size);
     143            2 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     144              :                          (const uint8_t *)request + header_size, message_size);
     145            2 :         m_libspdm_local_buffer_size += message_size;
     146            2 :         return LIBSPDM_STATUS_SUCCESS;
     147            0 :     case 0x9:
     148            0 :         return LIBSPDM_STATUS_SUCCESS;
     149            0 :     case 0xA:
     150            0 :         m_libspdm_local_buffer_size = 0;
     151            0 :         message_size = libspdm_test_get_measurement_request_size(
     152              :             spdm_context, (const uint8_t *)request + header_size,
     153              :             request_size - header_size);
     154            0 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     155              :                          (const uint8_t *)request + header_size, message_size);
     156            0 :         m_libspdm_local_buffer_size += message_size;
     157            0 :         return LIBSPDM_STATUS_SUCCESS;
     158            1 :     case 0xB:
     159            1 :         m_libspdm_local_buffer_size = 0;
     160            1 :         message_size = libspdm_test_get_measurement_request_size(
     161              :             spdm_context, (const uint8_t *)request + header_size,
     162              :             request_size - header_size);
     163            1 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     164              :                          (const uint8_t *)request + header_size, message_size);
     165            1 :         m_libspdm_local_buffer_size += message_size;
     166            1 :         return LIBSPDM_STATUS_SUCCESS;
     167            1 :     case 0xC:
     168            1 :         m_libspdm_local_buffer_size = 0;
     169            1 :         message_size = libspdm_test_get_measurement_request_size(
     170              :             spdm_context, (const uint8_t *)request + header_size,
     171              :             request_size - header_size);
     172            1 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     173              :                          (const uint8_t *)request + header_size, message_size);
     174            1 :         m_libspdm_local_buffer_size += message_size;
     175            1 :         return LIBSPDM_STATUS_SUCCESS;
     176            1 :     case 0xD:
     177            1 :         m_libspdm_local_buffer_size = 0;
     178            1 :         message_size = libspdm_test_get_measurement_request_size(
     179              :             spdm_context, (const uint8_t *)request + header_size,
     180              :             request_size - header_size);
     181            1 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     182              :                          (const uint8_t *)request + header_size, message_size);
     183            1 :         m_libspdm_local_buffer_size += message_size;
     184            1 :         return LIBSPDM_STATUS_SUCCESS;
     185            1 :     case 0xE:
     186            1 :         m_libspdm_local_buffer_size = 0;
     187            1 :         message_size = libspdm_test_get_measurement_request_size(
     188              :             spdm_context, (const uint8_t *)request + header_size,
     189              :             request_size - header_size);
     190            1 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     191              :                          (const uint8_t *)request + header_size, message_size);
     192            1 :         m_libspdm_local_buffer_size += message_size;
     193            1 :         return LIBSPDM_STATUS_SUCCESS;
     194            1 :     case 0xF:
     195            1 :         m_libspdm_local_buffer_size = 0;
     196            1 :         message_size = libspdm_test_get_measurement_request_size(
     197              :             spdm_context, (const uint8_t *)request + header_size,
     198              :             request_size - header_size);
     199            1 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     200              :                          (const uint8_t *)request + header_size, message_size);
     201            1 :         m_libspdm_local_buffer_size += message_size;
     202            1 :         return LIBSPDM_STATUS_SUCCESS;
     203            1 :     case 0x10:
     204            1 :         m_libspdm_local_buffer_size = 0;
     205            1 :         message_size = libspdm_test_get_measurement_request_size(
     206              :             spdm_context, (const uint8_t *)request + header_size,
     207              :             request_size - header_size);
     208            1 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     209              :                          (const uint8_t *)request + header_size, message_size);
     210            1 :         m_libspdm_local_buffer_size += message_size;
     211            1 :         return LIBSPDM_STATUS_SUCCESS;
     212            3 :     case 0x11:
     213            3 :         m_libspdm_local_buffer_size = 0;
     214            3 :         message_size = libspdm_test_get_measurement_request_size(
     215              :             spdm_context, (const uint8_t *)request + header_size,
     216              :             request_size - header_size);
     217            3 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     218              :                          (const uint8_t *)request + header_size, message_size);
     219            3 :         m_libspdm_local_buffer_size += message_size;
     220            3 :         return LIBSPDM_STATUS_SUCCESS;
     221            0 :     case 0x12:
     222            0 :         m_libspdm_local_buffer_size = 0;
     223            0 :         message_size = libspdm_test_get_measurement_request_size(
     224              :             spdm_context, (const uint8_t *)request + header_size,
     225              :             request_size - header_size);
     226            0 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     227              :                          (const uint8_t *)request + header_size, message_size);
     228            0 :         m_libspdm_local_buffer_size += message_size;
     229            0 :         return LIBSPDM_STATUS_SUCCESS;
     230            1 :     case 0x13:
     231            1 :         m_libspdm_local_buffer_size = 0;
     232            1 :         message_size = libspdm_test_get_measurement_request_size(
     233              :             spdm_context, (const uint8_t *)request + header_size,
     234              :             request_size - header_size);
     235            1 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     236              :                          (const uint8_t *)request + header_size, message_size);
     237            1 :         m_libspdm_local_buffer_size += message_size;
     238            1 :         return LIBSPDM_STATUS_SUCCESS;
     239            1 :     case 0x14:
     240            1 :         m_libspdm_local_buffer_size = 0;
     241            1 :         message_size = libspdm_test_get_measurement_request_size(
     242              :             spdm_context, (const uint8_t *)request + header_size,
     243              :             request_size - header_size);
     244            1 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     245              :                          (const uint8_t *)request + header_size, message_size);
     246            1 :         m_libspdm_local_buffer_size += message_size;
     247            1 :         return LIBSPDM_STATUS_SUCCESS;
     248            1 :     case 0x15:
     249            1 :         m_libspdm_local_buffer_size = 0;
     250            1 :         message_size = libspdm_test_get_measurement_request_size(
     251              :             spdm_context, (const uint8_t *)request + header_size,
     252              :             request_size - header_size);
     253            1 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     254              :                          (const uint8_t *)request + header_size, message_size);
     255            1 :         m_libspdm_local_buffer_size += message_size;
     256            1 :         return LIBSPDM_STATUS_SUCCESS;
     257          100 :     case 0x16:
     258          100 :         m_libspdm_local_buffer_size = 0;
     259          100 :         message_size = libspdm_test_get_measurement_request_size(
     260              :             spdm_context, (const uint8_t *)request + header_size,
     261              :             request_size - header_size);
     262          100 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     263              :                          (const uint8_t *)request + header_size, message_size);
     264          100 :         m_libspdm_local_buffer_size += message_size;
     265          100 :         return LIBSPDM_STATUS_SUCCESS;
     266            0 :     case 0x17:
     267            0 :         m_libspdm_local_buffer_size = 0;
     268            0 :         message_size = libspdm_test_get_measurement_request_size(
     269              :             spdm_context, (const uint8_t *)request + header_size,
     270              :             request_size - header_size);
     271            0 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     272              :                          (const uint8_t *)request + header_size, message_size);
     273            0 :         m_libspdm_local_buffer_size += message_size;
     274            0 :         return LIBSPDM_STATUS_SUCCESS;
     275            1 :     case 0x18:
     276            1 :         m_libspdm_local_buffer_size = 0;
     277            1 :         message_size = libspdm_test_get_measurement_request_size(
     278              :             spdm_context, (const uint8_t *)request + header_size,
     279              :             request_size - header_size);
     280            1 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     281              :                          (const uint8_t *)request + header_size, message_size);
     282            1 :         m_libspdm_local_buffer_size += message_size;
     283            1 :         return LIBSPDM_STATUS_SUCCESS;
     284            1 :     case 0x19:
     285            1 :         m_libspdm_local_buffer_size = 0;
     286            1 :         message_size = libspdm_test_get_measurement_request_size(
     287              :             spdm_context, (const uint8_t *)request + header_size,
     288              :             request_size - header_size);
     289            1 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     290              :                          (const uint8_t *)request + header_size, message_size);
     291            1 :         m_libspdm_local_buffer_size += message_size;
     292            1 :         return LIBSPDM_STATUS_SUCCESS;
     293            1 :     case 0x1A:
     294            1 :         m_libspdm_local_buffer_size = 0;
     295            1 :         message_size = libspdm_test_get_measurement_request_size(
     296              :             spdm_context, (const uint8_t *)request + header_size,
     297              :             request_size - header_size);
     298            1 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     299              :                          (const uint8_t *)request + header_size, message_size);
     300            1 :         m_libspdm_local_buffer_size += message_size;
     301            1 :         return LIBSPDM_STATUS_SUCCESS;
     302            1 :     case 0x1B:
     303            1 :         m_libspdm_local_buffer_size = 0;
     304            1 :         message_size = libspdm_test_get_measurement_request_size(
     305              :             spdm_context, (const uint8_t *)request + header_size,
     306              :             request_size - header_size);
     307            1 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     308              :                          (const uint8_t *)request + header_size, message_size);
     309            1 :         m_libspdm_local_buffer_size += message_size;
     310            1 :         return LIBSPDM_STATUS_SUCCESS;
     311            1 :     case 0x1C:
     312            1 :         m_libspdm_local_buffer_size = 0;
     313            1 :         message_size = libspdm_test_get_measurement_request_size(
     314              :             spdm_context, (const uint8_t *)request + header_size,
     315              :             request_size - header_size);
     316            1 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     317              :                          (const uint8_t *)request + header_size, message_size);
     318            1 :         m_libspdm_local_buffer_size += message_size;
     319            1 :         return LIBSPDM_STATUS_SUCCESS;
     320            0 :     case 0x1D:
     321            0 :         m_libspdm_local_buffer_size = 0;
     322            0 :         message_size = libspdm_test_get_measurement_request_size(
     323              :             spdm_context, (const uint8_t *)request + header_size,
     324              :             request_size - header_size);
     325            0 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     326              :                          (const uint8_t *)request + header_size, message_size);
     327            0 :         m_libspdm_local_buffer_size += message_size;
     328            0 :         return LIBSPDM_STATUS_SUCCESS;
     329            0 :     case 0x1E:
     330            0 :         m_libspdm_local_buffer_size = 0;
     331            0 :         message_size = libspdm_test_get_measurement_request_size(
     332              :             spdm_context, (const uint8_t *)request + header_size,
     333              :             request_size - header_size);
     334            0 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     335              :                          (const uint8_t *)request + header_size, message_size);
     336            0 :         m_libspdm_local_buffer_size += message_size;
     337            0 :         return LIBSPDM_STATUS_SUCCESS;
     338            0 :     case 0x1F:
     339            0 :         m_libspdm_local_buffer_size = 0;
     340            0 :         message_size = libspdm_test_get_measurement_request_size(
     341              :             spdm_context, (const uint8_t *)request + header_size,
     342              :             request_size - header_size);
     343            0 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     344              :                          (const uint8_t *)request + header_size, message_size);
     345            0 :         m_libspdm_local_buffer_size += message_size;
     346            0 :         return LIBSPDM_STATUS_SUCCESS;
     347            0 :     case 0x20:
     348            0 :         m_libspdm_local_buffer_size = 0;
     349            0 :         message_size = libspdm_test_get_measurement_request_size(
     350              :             spdm_context, (const uint8_t *)request + header_size,
     351              :             request_size - header_size);
     352            0 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     353              :                          (const uint8_t *)request + header_size, message_size);
     354            0 :         m_libspdm_local_buffer_size += message_size;
     355            0 :         return LIBSPDM_STATUS_SUCCESS;
     356           18 :     case 0x21:
     357           18 :         m_libspdm_local_buffer_size = 0;
     358           18 :         message_size = libspdm_test_get_measurement_request_size(
     359              :             spdm_context, (const uint8_t *)request + header_size,
     360              :             request_size - header_size);
     361           18 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     362              :                          (const uint8_t *)request + header_size, message_size);
     363           18 :         m_libspdm_local_buffer_size += message_size;
     364           18 :         return LIBSPDM_STATUS_SUCCESS;
     365            0 :     case 0x22:
     366            0 :         m_libspdm_local_buffer_size = 0;
     367            0 :         session_id = NULL;
     368            0 :         session_info = libspdm_get_session_info_via_session_id(
     369              :             spdm_context, 0xFFFFFFFF);
     370            0 :         message_size = libspdm_test_get_measurement_request_size(
     371              :             spdm_context, (const uint8_t *)request + header_size,
     372              :             request_size - header_size);
     373            0 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "Request (0x%zx):\n",
     374              :                        request_size));
     375            0 :         libspdm_dump_hex(request, request_size);
     376            0 :         libspdm_get_scratch_buffer (spdm_context, (void **)&app_message, &app_message_size);
     377            0 :         libspdm_transport_test_decode_message(
     378              :             spdm_context, &session_id, &is_app_message,
     379              :             false, request_size, message_buffer,
     380              :             &app_message_size, (void **)&app_message);
     381              :         ((libspdm_secured_message_context_t
     382            0 :           *)(session_info->secured_message_context))
     383            0 :         ->application_secret.response_data_sequence_number--;
     384            0 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     385              :                          app_message, app_message_size - 3);
     386            0 :         m_libspdm_local_buffer_size += app_message_size - 3;
     387            0 :         return LIBSPDM_STATUS_SUCCESS;
     388            0 :     case 0x23:
     389            0 :         m_libspdm_local_buffer_size = 0;
     390            0 :         message_size = libspdm_test_get_measurement_request_size(
     391              :             spdm_context, (const uint8_t *)request + header_size,
     392              :             request_size - header_size);
     393            0 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     394              :                          (const uint8_t *)request + header_size, message_size);
     395            0 :         m_libspdm_local_buffer_size += message_size;
     396            0 :         return LIBSPDM_STATUS_SUCCESS;
     397            0 :     case 0x24:
     398            0 :         m_libspdm_local_buffer_size = 0;
     399            0 :         message_size = libspdm_test_get_measurement_request_size(
     400              :             spdm_context, (const uint8_t *)request + header_size,
     401              :             request_size - header_size);
     402            0 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     403              :                          (const uint8_t *)request + header_size, message_size);
     404            0 :         m_libspdm_local_buffer_size += message_size;
     405            0 :         return LIBSPDM_STATUS_SUCCESS;
     406            0 :     case 0x25:
     407            0 :         m_libspdm_local_buffer_size = 0;
     408            0 :         message_size = libspdm_test_get_measurement_request_size(
     409              :             spdm_context, (const uint8_t *)request + header_size,
     410              :             request_size - header_size);
     411            0 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
     412              :                          (const uint8_t *)request + header_size, message_size);
     413            0 :         m_libspdm_local_buffer_size += message_size;
     414            0 :         return LIBSPDM_STATUS_SUCCESS;
     415            0 :     default:
     416            0 :         return LIBSPDM_STATUS_SEND_FAIL;
     417              :     }
     418              : }
     419              : 
     420          139 : static libspdm_return_t receive_message(
     421              :     void *spdm_context, size_t *response_size, void **response, uint64_t timeout)
     422              : {
     423              :     libspdm_test_context_t *spdm_test_context;
     424              :     libspdm_return_t status;
     425              : 
     426          139 :     spdm_test_context = libspdm_get_test_context();
     427          139 :     switch (spdm_test_context->case_id) {
     428            0 :     case 0x1:
     429            0 :         return LIBSPDM_STATUS_RECEIVE_FAIL;
     430              : 
     431            0 :     case 0x2: {
     432              :         spdm_measurements_response_t *spdm_response;
     433              :         uint8_t *ptr;
     434              :         uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
     435              :         size_t sig_size;
     436              :         size_t measurment_sig_size;
     437              :         spdm_measurement_block_dmtf_t *measurment_block;
     438              :         size_t spdm_response_size;
     439              :         size_t transport_header_size;
     440              : 
     441              :         ((libspdm_context_t *)spdm_context)
     442            0 :         ->connection_info.algorithm.base_asym_algo =
     443              :             m_libspdm_use_asym_algo;
     444              :         ((libspdm_context_t *)spdm_context)
     445            0 :         ->connection_info.algorithm.base_hash_algo =
     446              :             m_libspdm_use_hash_algo;
     447              :         ((libspdm_context_t *)spdm_context)
     448            0 :         ->connection_info.algorithm.measurement_hash_algo =
     449              :             m_libspdm_use_measurement_hash_algo;
     450            0 :         measurment_sig_size =
     451              :             SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
     452            0 :             libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
     453            0 :         spdm_response_size = sizeof(spdm_measurements_response_t) +
     454              :                              sizeof(spdm_measurement_block_dmtf_t) +
     455            0 :                              libspdm_get_measurement_hash_size(
     456            0 :             m_libspdm_use_measurement_hash_algo) +
     457              :                              measurment_sig_size;
     458            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     459            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     460              : 
     461            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     462            0 :         spdm_response->header.request_response_code = SPDM_MEASUREMENTS;
     463            0 :         spdm_response->header.param1 = 0;
     464            0 :         spdm_response->header.param2 = 0;
     465            0 :         spdm_response->number_of_blocks = 1;
     466            0 :         libspdm_write_uint24(
     467            0 :             spdm_response->measurement_record_length,
     468              :             (uint32_t)(sizeof(spdm_measurement_block_dmtf_t) +
     469            0 :                        libspdm_get_measurement_hash_size(
     470              :                            m_libspdm_use_measurement_hash_algo)));
     471            0 :         measurment_block = (void *)(spdm_response + 1);
     472            0 :         libspdm_set_mem(measurment_block,
     473              :                         sizeof(spdm_measurement_block_dmtf_t) +
     474            0 :                         libspdm_get_measurement_hash_size(
     475              :                             m_libspdm_use_measurement_hash_algo),
     476              :                         1);
     477              :         measurment_block->measurement_block_common_header
     478            0 :         .measurement_specification =
     479              :             SPDM_MEASUREMENT_SPECIFICATION_DMTF;
     480              :         measurment_block->measurement_block_common_header
     481            0 :         .measurement_size =
     482            0 :             (uint16_t)(sizeof(spdm_measurement_block_dmtf_header_t) +
     483            0 :                        libspdm_get_measurement_hash_size(
     484              :                            m_libspdm_use_measurement_hash_algo));
     485            0 :         ptr = (void *)((uint8_t *)spdm_response + spdm_response_size -
     486              :                        measurment_sig_size);
     487            0 :         libspdm_get_random_number(SPDM_NONCE_SIZE, ptr);
     488            0 :         ptr += SPDM_NONCE_SIZE;
     489            0 :         *(uint16_t *)ptr = 0;
     490            0 :         ptr += sizeof(uint16_t);
     491            0 :         libspdm_copy_mem(&m_libspdm_local_buffer[m_libspdm_local_buffer_size],
     492              :                          sizeof(m_libspdm_local_buffer)
     493            0 :                          - (&m_libspdm_local_buffer[m_libspdm_local_buffer_size] -
     494              :                             m_libspdm_local_buffer),
     495            0 :                          spdm_response, (size_t)ptr - (size_t)spdm_response);
     496            0 :         m_libspdm_local_buffer_size += ((size_t)ptr - (size_t)spdm_response);
     497            0 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "m_libspdm_local_buffer_size (0x%zx):\n",
     498              :                        m_libspdm_local_buffer_size));
     499            0 :         libspdm_dump_hex(m_libspdm_local_buffer, m_libspdm_local_buffer_size);
     500            0 :         libspdm_hash_all(m_libspdm_use_hash_algo, m_libspdm_local_buffer,
     501              :                          m_libspdm_local_buffer_size, hash_data);
     502            0 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "HashDataSize (0x%x):\n",
     503              :                        libspdm_get_hash_size(m_libspdm_use_hash_algo)));
     504            0 :         libspdm_dump_hex(m_libspdm_local_buffer, m_libspdm_local_buffer_size);
     505            0 :         sig_size = libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
     506            0 :         libspdm_responder_data_sign(
     507              :             spdm_context,
     508            0 :             spdm_response->header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     509              :                 SPDM_MEASUREMENTS,
     510              :                 m_libspdm_use_asym_algo, m_libspdm_use_pqc_asym_algo, m_libspdm_use_hash_algo,
     511              :                 false, m_libspdm_local_buffer, m_libspdm_local_buffer_size,
     512              :                 ptr, &sig_size);
     513            0 :         ptr += sig_size;
     514              : 
     515            0 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     516              :                                               false, spdm_response_size,
     517              :                                               spdm_response, response_size,
     518              :                                               response);
     519              :     }
     520            0 :         return LIBSPDM_STATUS_SUCCESS;
     521              : 
     522            0 :     case 0x3: {
     523              :         spdm_measurements_response_t *spdm_response;
     524              :         uint8_t *ptr;
     525              :         uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
     526              :         size_t sig_size;
     527              :         size_t measurment_sig_size;
     528              :         spdm_measurement_block_dmtf_t *measurment_block;
     529              :         size_t spdm_response_size;
     530              :         size_t transport_header_size;
     531              : 
     532              :         ((libspdm_context_t *)spdm_context)
     533            0 :         ->connection_info.algorithm.base_asym_algo =
     534              :             m_libspdm_use_asym_algo;
     535              :         ((libspdm_context_t *)spdm_context)
     536            0 :         ->connection_info.algorithm.base_hash_algo =
     537              :             m_libspdm_use_hash_algo;
     538              :         ((libspdm_context_t *)spdm_context)
     539            0 :         ->connection_info.algorithm.measurement_hash_algo =
     540              :             m_libspdm_use_measurement_hash_algo;
     541            0 :         measurment_sig_size =
     542              :             SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
     543            0 :             libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
     544            0 :         spdm_response_size = sizeof(spdm_measurements_response_t) +
     545              :                              sizeof(spdm_measurement_block_dmtf_t) +
     546            0 :                              libspdm_get_measurement_hash_size(
     547            0 :             m_libspdm_use_measurement_hash_algo) +
     548              :                              measurment_sig_size;
     549            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     550            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     551              : 
     552            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     553            0 :         spdm_response->header.request_response_code = SPDM_MEASUREMENTS;
     554            0 :         spdm_response->header.param1 = 0;
     555            0 :         spdm_response->header.param2 = 0;
     556            0 :         spdm_response->number_of_blocks = 1;
     557            0 :         libspdm_write_uint24(
     558            0 :             spdm_response->measurement_record_length,
     559              :             (uint32_t)(sizeof(spdm_measurement_block_dmtf_t) +
     560            0 :                        libspdm_get_measurement_hash_size(
     561              :                            m_libspdm_use_measurement_hash_algo)));
     562            0 :         measurment_block = (void *)(spdm_response + 1);
     563            0 :         libspdm_set_mem(measurment_block,
     564              :                         sizeof(spdm_measurement_block_dmtf_t) +
     565            0 :                         libspdm_get_measurement_hash_size(
     566              :                             m_libspdm_use_measurement_hash_algo),
     567              :                         1);
     568              :         measurment_block->measurement_block_common_header
     569            0 :         .measurement_specification =
     570              :             SPDM_MEASUREMENT_SPECIFICATION_DMTF;
     571              :         measurment_block->measurement_block_common_header
     572            0 :         .measurement_size =
     573            0 :             (uint16_t)(sizeof(spdm_measurement_block_dmtf_header_t) +
     574            0 :                        libspdm_get_measurement_hash_size(
     575              :                            m_libspdm_use_measurement_hash_algo));
     576            0 :         ptr = (void *)((uint8_t *)spdm_response + spdm_response_size -
     577              :                        measurment_sig_size);
     578            0 :         libspdm_get_random_number(SPDM_NONCE_SIZE, ptr);
     579            0 :         ptr += SPDM_NONCE_SIZE;
     580            0 :         *(uint16_t *)ptr = 0;
     581            0 :         ptr += sizeof(uint16_t);
     582            0 :         libspdm_copy_mem(&m_libspdm_local_buffer[m_libspdm_local_buffer_size],
     583              :                          sizeof(m_libspdm_local_buffer)
     584            0 :                          - (&m_libspdm_local_buffer[m_libspdm_local_buffer_size] -
     585              :                             m_libspdm_local_buffer),
     586            0 :                          spdm_response, (size_t)ptr - (size_t)spdm_response);
     587            0 :         m_libspdm_local_buffer_size += ((size_t)ptr - (size_t)spdm_response);
     588            0 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "m_libspdm_local_buffer_size (0x%zx):\n",
     589              :                        m_libspdm_local_buffer_size));
     590            0 :         libspdm_dump_hex(m_libspdm_local_buffer, m_libspdm_local_buffer_size);
     591            0 :         libspdm_hash_all(m_libspdm_use_hash_algo, m_libspdm_local_buffer,
     592              :                          m_libspdm_local_buffer_size, hash_data);
     593            0 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "HashDataSize (0x%x):\n",
     594              :                        libspdm_get_hash_size(m_libspdm_use_hash_algo)));
     595            0 :         libspdm_dump_hex(m_libspdm_local_buffer, m_libspdm_local_buffer_size);
     596            0 :         sig_size = libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
     597            0 :         libspdm_responder_data_sign(
     598              :             spdm_context,
     599            0 :             spdm_response->header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     600              :                 SPDM_MEASUREMENTS,
     601              :                 m_libspdm_use_asym_algo, m_libspdm_use_pqc_asym_algo, m_libspdm_use_hash_algo,
     602              :                 false, m_libspdm_local_buffer, m_libspdm_local_buffer_size,
     603              :                 ptr, &sig_size);
     604            0 :         ptr += sig_size;
     605              : 
     606            0 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     607              :                                               false, spdm_response_size,
     608              :                                               spdm_response, response_size,
     609              :                                               response);
     610              :     }
     611            0 :         return LIBSPDM_STATUS_SUCCESS;
     612              : 
     613            1 :     case 0x4: {
     614              :         spdm_error_response_t *spdm_response;
     615              :         size_t spdm_response_size;
     616              :         size_t transport_header_size;
     617              : 
     618            1 :         spdm_response_size = sizeof(spdm_error_response_t);
     619            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     620            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     621              : 
     622            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     623            1 :         spdm_response->header.request_response_code = SPDM_ERROR;
     624            1 :         spdm_response->header.param1 = SPDM_ERROR_CODE_INVALID_REQUEST;
     625            1 :         spdm_response->header.param2 = 0;
     626              : 
     627            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     628              :                                               false, spdm_response_size,
     629              :                                               spdm_response,
     630              :                                               response_size, response);
     631              :     }
     632            1 :         return LIBSPDM_STATUS_SUCCESS;
     633              : 
     634            1 :     case 0x5: {
     635              :         spdm_error_response_t *spdm_response;
     636              :         size_t spdm_response_size;
     637              :         size_t transport_header_size;
     638              : 
     639            1 :         spdm_response_size = sizeof(spdm_error_response_t);
     640            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     641            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     642              : 
     643            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     644            1 :         spdm_response->header.request_response_code = SPDM_ERROR;
     645            1 :         spdm_response->header.param1 = SPDM_ERROR_CODE_BUSY;
     646            1 :         spdm_response->header.param2 = 0;
     647              : 
     648            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     649              :                                               false, spdm_response_size,
     650              :                                               spdm_response,
     651              :                                               response_size, response);
     652              :     }
     653            1 :         return LIBSPDM_STATUS_SUCCESS;
     654              : 
     655            0 :     case 0x6: {
     656              :         static size_t sub_index1 = 0;
     657            0 :         if (sub_index1 == 0) {
     658              :             spdm_error_response_t *spdm_response;
     659              :             size_t spdm_response_size;
     660              :             size_t transport_header_size;
     661              : 
     662            0 :             spdm_response_size = sizeof(spdm_error_response_t);
     663            0 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     664            0 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     665              : 
     666            0 :             spdm_response->header.spdm_version =
     667              :                 SPDM_MESSAGE_VERSION_11;
     668            0 :             spdm_response->header.request_response_code = SPDM_ERROR;
     669            0 :             spdm_response->header.param1 = SPDM_ERROR_CODE_BUSY;
     670            0 :             spdm_response->header.param2 = 0;
     671              : 
     672            0 :             libspdm_transport_test_encode_message(
     673              :                 spdm_context, NULL, false, false,
     674              :                 spdm_response_size, spdm_response,
     675              :                 response_size, response);
     676            0 :             sub_index1++;
     677            0 :         } else if (sub_index1 == 1) {
     678              :             spdm_measurements_response_t *spdm_response;
     679              :             uint8_t *ptr;
     680              :             uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
     681              :             size_t sig_size;
     682              :             size_t measurment_sig_size;
     683              :             spdm_measurement_block_dmtf_t *measurment_block;
     684              :             size_t spdm_response_size;
     685              :             size_t transport_header_size;
     686              : 
     687              :             ((libspdm_context_t *)spdm_context)
     688            0 :             ->connection_info.algorithm.base_asym_algo =
     689              :                 m_libspdm_use_asym_algo;
     690              :             ((libspdm_context_t *)spdm_context)
     691            0 :             ->connection_info.algorithm.base_hash_algo =
     692              :                 m_libspdm_use_hash_algo;
     693              :             ((libspdm_context_t *)spdm_context)
     694              :             ->connection_info.algorithm
     695            0 :             .measurement_hash_algo =
     696              :                 m_libspdm_use_measurement_hash_algo;
     697            0 :             measurment_sig_size =
     698              :                 SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
     699            0 :                 libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
     700            0 :             spdm_response_size = sizeof(spdm_measurements_response_t) +
     701              :                                  sizeof(spdm_measurement_block_dmtf_t) +
     702            0 :                                  libspdm_get_measurement_hash_size(
     703            0 :                 m_libspdm_use_measurement_hash_algo) +
     704              :                                  measurment_sig_size;
     705            0 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     706            0 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     707              : 
     708            0 :             spdm_response->header.spdm_version =
     709              :                 SPDM_MESSAGE_VERSION_11;
     710            0 :             spdm_response->header.request_response_code =
     711              :                 SPDM_MEASUREMENTS;
     712            0 :             spdm_response->header.param1 = 0;
     713            0 :             spdm_response->header.param2 = 0;
     714            0 :             spdm_response->number_of_blocks = 1;
     715            0 :             libspdm_write_uint24(
     716            0 :                 spdm_response->measurement_record_length,
     717              :                 (uint32_t)(sizeof(spdm_measurement_block_dmtf_t) +
     718            0 :                            libspdm_get_measurement_hash_size(
     719              :                                m_libspdm_use_measurement_hash_algo)));
     720            0 :             measurment_block = (void *)(spdm_response + 1);
     721            0 :             libspdm_set_mem(measurment_block,
     722              :                             sizeof(spdm_measurement_block_dmtf_t) +
     723            0 :                             libspdm_get_measurement_hash_size(
     724              :                                 m_libspdm_use_measurement_hash_algo),
     725              :                             1);
     726              :             measurment_block->measurement_block_common_header
     727            0 :             .measurement_specification =
     728              :                 SPDM_MEASUREMENT_SPECIFICATION_DMTF;
     729              :             measurment_block->measurement_block_common_header
     730            0 :             .measurement_size = (uint16_t)(
     731              :                 sizeof(spdm_measurement_block_dmtf_header_t) +
     732            0 :                 libspdm_get_measurement_hash_size(
     733              :                     m_libspdm_use_measurement_hash_algo));
     734            0 :             ptr = (void *)((uint8_t *)spdm_response + spdm_response_size -
     735              :                            measurment_sig_size);
     736            0 :             libspdm_get_random_number(SPDM_NONCE_SIZE, ptr);
     737            0 :             ptr += SPDM_NONCE_SIZE;
     738            0 :             *(uint16_t *)ptr = 0;
     739            0 :             ptr += sizeof(uint16_t);
     740            0 :             libspdm_copy_mem(&m_libspdm_local_buffer[m_libspdm_local_buffer_size],
     741              :                              sizeof(m_libspdm_local_buffer)
     742            0 :                              - (&m_libspdm_local_buffer[m_libspdm_local_buffer_size] -
     743              :                                 m_libspdm_local_buffer),
     744            0 :                              spdm_response, (size_t)ptr - (size_t)spdm_response);
     745            0 :             m_libspdm_local_buffer_size +=
     746            0 :                 ((size_t)ptr - (size_t)spdm_response);
     747            0 :             LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "m_libspdm_local_buffer_size (0x%zx):\n",
     748              :                            m_libspdm_local_buffer_size));
     749            0 :             libspdm_dump_hex(m_libspdm_local_buffer, m_libspdm_local_buffer_size);
     750            0 :             libspdm_hash_all(m_libspdm_use_hash_algo, m_libspdm_local_buffer,
     751              :                              m_libspdm_local_buffer_size, hash_data);
     752            0 :             LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "HashDataSize (0x%x):\n",
     753              :                            libspdm_get_hash_size(m_libspdm_use_hash_algo)));
     754            0 :             libspdm_dump_hex(m_libspdm_local_buffer, m_libspdm_local_buffer_size);
     755            0 :             sig_size =
     756            0 :                 libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
     757            0 :             libspdm_responder_data_sign(
     758              :                 spdm_context,
     759            0 :                 spdm_response->header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     760              :                     SPDM_MEASUREMENTS,
     761              :                     m_libspdm_use_asym_algo, m_libspdm_use_pqc_asym_algo,
     762              :                     m_libspdm_use_hash_algo,
     763              :                     false, m_libspdm_local_buffer,
     764              :                     m_libspdm_local_buffer_size, ptr,
     765              :                     &sig_size);
     766            0 :             ptr += sig_size;
     767              : 
     768            0 :             libspdm_transport_test_encode_message(
     769              :                 spdm_context, NULL, false, false, spdm_response_size,
     770              :                 spdm_response, response_size, response);
     771              :         }
     772              :     }
     773            0 :         return LIBSPDM_STATUS_SUCCESS;
     774              : 
     775            1 :     case 0x7: {
     776              :         spdm_error_response_t *spdm_response;
     777              :         size_t spdm_response_size;
     778              :         size_t transport_header_size;
     779              : 
     780            1 :         spdm_response_size = sizeof(spdm_error_response_t);
     781            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     782            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     783              : 
     784            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_10;
     785            1 :         spdm_response->header.request_response_code = SPDM_ERROR;
     786            1 :         spdm_response->header.param1 = SPDM_ERROR_CODE_REQUEST_RESYNCH;
     787            1 :         spdm_response->header.param2 = 0;
     788              : 
     789            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     790              :                                               false, spdm_response_size,
     791              :                                               spdm_response,
     792              :                                               response_size, response);
     793              :     }
     794            1 :         return LIBSPDM_STATUS_SUCCESS;
     795              : 
     796            2 :     case 0x8: {
     797              :         spdm_error_response_data_response_not_ready_t *spdm_response;
     798              :         size_t spdm_response_size;
     799              :         size_t transport_header_size;
     800              : 
     801            2 :         spdm_response_size = sizeof(spdm_error_response_data_response_not_ready_t);
     802            2 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     803            2 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     804              : 
     805            2 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     806            2 :         spdm_response->header.request_response_code = SPDM_ERROR;
     807            2 :         spdm_response->header.param1 =
     808              :             SPDM_ERROR_CODE_RESPONSE_NOT_READY;
     809            2 :         spdm_response->header.param2 = 0;
     810            2 :         spdm_response->extend_error_data.rd_exponent = 1;
     811            2 :         spdm_response->extend_error_data.rd_tm = 2;
     812            2 :         spdm_response->extend_error_data.request_code =
     813              :             SPDM_GET_MEASUREMENTS;
     814            2 :         spdm_response->extend_error_data.token = 0;
     815              : 
     816            2 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     817              :                                               false, spdm_response_size,
     818              :                                               spdm_response,
     819              :                                               response_size, response);
     820              :     }
     821            2 :         return LIBSPDM_STATUS_SUCCESS;
     822              : 
     823            0 :     case 0x9:
     824            0 :         return LIBSPDM_STATUS_SUCCESS;
     825              : 
     826            0 :     case 0xA: {
     827              :         spdm_measurements_response_t *spdm_response;
     828              :         size_t spdm_response_size;
     829              :         size_t transport_header_size;
     830              :         uint8_t *ptr;
     831            0 :         spdm_response_size =
     832              :             sizeof(spdm_measurements_response_t)
     833              :             + SPDM_NONCE_SIZE + sizeof(uint16_t);
     834            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     835            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     836            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     837            0 :         spdm_response->header.request_response_code = SPDM_MEASUREMENTS;
     838            0 :         spdm_response->header.param1 = 4;
     839            0 :         spdm_response->header.param2 = 0;
     840            0 :         spdm_response->number_of_blocks = 0;
     841            0 :         libspdm_write_uint24(spdm_response->measurement_record_length, 0);
     842              : 
     843            0 :         ptr = (uint8_t *)spdm_response +
     844              :               sizeof(spdm_measurements_response_t);
     845            0 :         libspdm_get_random_number(SPDM_NONCE_SIZE,ptr);
     846            0 :         ptr += SPDM_NONCE_SIZE;
     847            0 :         *(uint16_t *)ptr = 0;
     848              : 
     849            0 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     850              :                                               false, spdm_response_size,
     851              :                                               spdm_response, response_size,
     852              :                                               response);
     853              :     }
     854            0 :         return LIBSPDM_STATUS_SUCCESS;
     855              : 
     856            0 :     case 0xB: {
     857              :         spdm_measurements_response_t *spdm_response;
     858              :         spdm_measurement_block_dmtf_t *measurment_block;
     859              :         size_t spdm_response_size;
     860              :         size_t transport_header_size;
     861              :         uint8_t *ptr;
     862              :         ((libspdm_context_t *)spdm_context)
     863            0 :         ->connection_info.algorithm.measurement_hash_algo =
     864              :             m_libspdm_use_measurement_hash_algo;
     865            0 :         spdm_response_size = sizeof(spdm_measurements_response_t) +
     866              :                              sizeof(spdm_measurement_block_dmtf_t) +
     867            0 :                              libspdm_get_measurement_hash_size(
     868              :             m_libspdm_use_measurement_hash_algo) +
     869              :                              SPDM_NONCE_SIZE + sizeof(uint16_t);
     870            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     871            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     872              : 
     873            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     874            0 :         spdm_response->header.request_response_code = SPDM_MEASUREMENTS;
     875            0 :         spdm_response->header.param1 = 0;
     876            0 :         spdm_response->header.param2 = 0;
     877            0 :         spdm_response->number_of_blocks = 1;
     878            0 :         libspdm_write_uint24(
     879            0 :             spdm_response->measurement_record_length,
     880              :             (uint32_t)(sizeof(spdm_measurement_block_dmtf_t) +
     881            0 :                        libspdm_get_measurement_hash_size(
     882              :                            m_libspdm_use_measurement_hash_algo)));
     883            0 :         measurment_block = (void *)(spdm_response + 1);
     884            0 :         libspdm_set_mem(measurment_block,
     885              :                         sizeof(spdm_measurement_block_dmtf_t) +
     886            0 :                         libspdm_get_measurement_hash_size(
     887              :                             m_libspdm_use_measurement_hash_algo),
     888              :                         1);
     889              :         measurment_block->measurement_block_common_header
     890            0 :         .measurement_specification =
     891              :             SPDM_MEASUREMENT_SPECIFICATION_DMTF;
     892              :         measurment_block->measurement_block_common_header
     893            0 :         .measurement_size =
     894            0 :             (uint16_t)(sizeof(spdm_measurement_block_dmtf_header_t) +
     895            0 :                        libspdm_get_measurement_hash_size(
     896              :                            m_libspdm_use_measurement_hash_algo));
     897              : 
     898            0 :         ptr = (uint8_t *)spdm_response +
     899              :               sizeof(spdm_measurements_response_t) +
     900            0 :               sizeof(spdm_measurement_block_dmtf_t) +
     901            0 :               libspdm_get_measurement_hash_size(
     902              :             m_libspdm_use_measurement_hash_algo);
     903            0 :         libspdm_get_random_number(SPDM_NONCE_SIZE,ptr);
     904            0 :         *(uint16_t *)(ptr + SPDM_NONCE_SIZE) = 0;
     905              : 
     906            0 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     907              :                                               false, spdm_response_size,
     908              :                                               spdm_response, response_size,
     909              :                                               response);
     910              :     }
     911            0 :         return LIBSPDM_STATUS_SUCCESS;
     912              : 
     913            1 :     case 0xC: {
     914              :         spdm_measurements_response_t *spdm_response;
     915              :         uint8_t *ptr;
     916              :         size_t sig_size;
     917              :         size_t measurment_sig_size;
     918              :         spdm_measurement_block_dmtf_t *measurment_block;
     919              :         size_t spdm_response_size;
     920              :         size_t transport_header_size;
     921              : 
     922              :         ((libspdm_context_t *)spdm_context)
     923            1 :         ->connection_info.algorithm.base_asym_algo =
     924              :             m_libspdm_use_asym_algo;
     925              :         ((libspdm_context_t *)spdm_context)
     926            1 :         ->connection_info.algorithm.base_hash_algo =
     927              :             m_libspdm_use_hash_algo;
     928              :         ((libspdm_context_t *)spdm_context)
     929            1 :         ->connection_info.algorithm.measurement_hash_algo =
     930              :             m_libspdm_use_measurement_hash_algo;
     931              : 
     932            1 :         measurment_sig_size =
     933              :             SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
     934            1 :             libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
     935            1 :         spdm_response_size = sizeof(spdm_measurements_response_t) +
     936              :                              sizeof(spdm_measurement_block_dmtf_t) +
     937            1 :                              libspdm_get_measurement_hash_size(
     938            1 :             m_libspdm_use_measurement_hash_algo) +
     939              :                              measurment_sig_size;
     940            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     941            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     942              : 
     943            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     944            1 :         spdm_response->header.request_response_code = SPDM_MEASUREMENTS;
     945            1 :         spdm_response->header.param1 = 0;
     946            1 :         spdm_response->header.param2 = 0;
     947            1 :         spdm_response->number_of_blocks = 1;
     948            1 :         libspdm_write_uint24(
     949            1 :             spdm_response->measurement_record_length,
     950              :             (uint32_t)(sizeof(spdm_measurement_block_dmtf_t) +
     951            1 :                        libspdm_get_measurement_hash_size(
     952              :                            m_libspdm_use_measurement_hash_algo)));
     953            1 :         measurment_block = (void *)(spdm_response + 1);
     954            1 :         libspdm_set_mem(measurment_block,
     955              :                         sizeof(spdm_measurement_block_dmtf_t) +
     956            1 :                         libspdm_get_measurement_hash_size(
     957              :                             m_libspdm_use_measurement_hash_algo),
     958              :                         1);
     959              :         measurment_block->measurement_block_common_header
     960            1 :         .measurement_specification =
     961              :             SPDM_MEASUREMENT_SPECIFICATION_DMTF;
     962              :         measurment_block->measurement_block_common_header
     963            1 :         .measurement_size =
     964            1 :             (uint16_t)(sizeof(spdm_measurement_block_dmtf_header_t) +
     965            1 :                        libspdm_get_measurement_hash_size(
     966              :                            m_libspdm_use_measurement_hash_algo));
     967            1 :         ptr = (void *)((uint8_t *)spdm_response + spdm_response_size -
     968              :                        measurment_sig_size);
     969            1 :         libspdm_get_random_number(SPDM_NONCE_SIZE, ptr);
     970            1 :         ptr += SPDM_NONCE_SIZE;
     971            1 :         *(uint16_t *)ptr = 0;
     972            1 :         ptr += sizeof(uint16_t);
     973            1 :         sig_size = libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
     974            1 :         libspdm_set_mem(ptr, sig_size, 0);
     975            1 :         ptr += sig_size;
     976              : 
     977            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     978              :                                               false, spdm_response_size,
     979              :                                               spdm_response, response_size,
     980              :                                               response);
     981              :     }
     982            1 :         return LIBSPDM_STATUS_SUCCESS;
     983              : 
     984            1 :     case 0xD: {
     985              :         spdm_measurements_response_t *spdm_response;
     986              :         uint8_t *ptr;
     987              :         uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
     988              :         size_t sig_size;
     989              :         size_t measurment_sig_size;
     990              :         spdm_measurement_block_dmtf_t *measurment_block;
     991              :         size_t spdm_response_size;
     992              :         size_t transport_header_size;
     993              : 
     994              :         ((libspdm_context_t *)spdm_context)
     995            1 :         ->connection_info.algorithm.base_asym_algo =
     996              :             m_libspdm_use_asym_algo;
     997              :         ((libspdm_context_t *)spdm_context)
     998            1 :         ->connection_info.algorithm.base_hash_algo =
     999              :             m_libspdm_use_hash_algo;
    1000              :         ((libspdm_context_t *)spdm_context)
    1001            1 :         ->connection_info.algorithm.measurement_hash_algo =
    1002              :             m_libspdm_use_measurement_hash_algo;
    1003            1 :         measurment_sig_size =
    1004              :             SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
    1005            1 :             libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    1006            1 :         spdm_response_size = sizeof(spdm_measurements_response_t) +
    1007              :                              sizeof(spdm_measurement_block_dmtf_t) +
    1008            1 :                              libspdm_get_measurement_hash_size(
    1009            1 :             m_libspdm_use_measurement_hash_algo) +
    1010              :                              measurment_sig_size;
    1011            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1012            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1013              : 
    1014            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1015            1 :         spdm_response->header.request_response_code = SPDM_MEASUREMENTS;
    1016            1 :         spdm_response->header.param1 = 0;
    1017            1 :         spdm_response->header.param2 = 0;
    1018            1 :         spdm_response->number_of_blocks = 1;
    1019            1 :         libspdm_write_uint24(
    1020            1 :             spdm_response->measurement_record_length,
    1021              :             (uint32_t)(sizeof(spdm_measurement_block_dmtf_t) +
    1022            1 :                        libspdm_get_measurement_hash_size(
    1023              :                            m_libspdm_use_measurement_hash_algo)));
    1024            1 :         measurment_block = (void *)(spdm_response + 1);
    1025            1 :         libspdm_set_mem(measurment_block,
    1026              :                         sizeof(spdm_measurement_block_dmtf_t) +
    1027            1 :                         libspdm_get_measurement_hash_size(
    1028              :                             m_libspdm_use_measurement_hash_algo),
    1029              :                         1);
    1030              :         measurment_block->measurement_block_common_header
    1031            1 :         .measurement_specification =
    1032              :             SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    1033              :         measurment_block->measurement_block_common_header
    1034            1 :         .measurement_size =
    1035            1 :             (uint16_t)(sizeof(spdm_measurement_block_dmtf_header_t) +
    1036            1 :                        libspdm_get_measurement_hash_size(
    1037              :                            m_libspdm_use_measurement_hash_algo));
    1038            1 :         ptr = (void *)((uint8_t *)spdm_response + spdm_response_size -
    1039              :                        measurment_sig_size);
    1040            1 :         libspdm_get_random_number(SPDM_NONCE_SIZE, ptr);
    1041            1 :         ptr += SPDM_NONCE_SIZE;
    1042            1 :         *(uint16_t *)ptr = 0;
    1043            1 :         ptr += sizeof(uint16_t);
    1044            1 :         libspdm_copy_mem(&m_libspdm_local_buffer[m_libspdm_local_buffer_size],
    1045              :                          sizeof(m_libspdm_local_buffer)
    1046            1 :                          - (&m_libspdm_local_buffer[m_libspdm_local_buffer_size] -
    1047              :                             m_libspdm_local_buffer),
    1048            1 :                          spdm_response, (size_t)ptr - (size_t)spdm_response);
    1049            1 :         m_libspdm_local_buffer_size += ((size_t)ptr - (size_t)spdm_response);
    1050            1 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "m_libspdm_local_buffer_size (0x%zx):\n",
    1051              :                        m_libspdm_local_buffer_size));
    1052            1 :         libspdm_dump_hex(m_libspdm_local_buffer, m_libspdm_local_buffer_size);
    1053            1 :         libspdm_hash_all(m_libspdm_use_hash_algo, m_libspdm_local_buffer,
    1054              :                          m_libspdm_local_buffer_size, hash_data);
    1055            1 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "HashDataSize (0x%x):\n",
    1056              :                        libspdm_get_hash_size(m_libspdm_use_hash_algo)));
    1057            1 :         libspdm_dump_hex(m_libspdm_local_buffer, m_libspdm_local_buffer_size);
    1058            1 :         sig_size = libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    1059            1 :         libspdm_get_random_number(sig_size, ptr);
    1060            1 :         ptr += sig_size;
    1061              : 
    1062            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
    1063              :                                               false, spdm_response_size,
    1064              :                                               spdm_response, response_size,
    1065              :                                               response);
    1066              :     }
    1067            1 :         return LIBSPDM_STATUS_SUCCESS;
    1068              : 
    1069            1 :     case 0xE: {
    1070              :         spdm_measurements_response_t *spdm_response;
    1071              :         spdm_measurement_block_dmtf_t *measurment_block;
    1072              :         size_t spdm_response_size;
    1073              :         size_t transport_header_size;
    1074              : 
    1075              :         ((libspdm_context_t *)spdm_context)
    1076            1 :         ->connection_info.algorithm.base_asym_algo =
    1077              :             m_libspdm_use_asym_algo;
    1078              :         ((libspdm_context_t *)spdm_context)
    1079            1 :         ->connection_info.algorithm.base_hash_algo =
    1080              :             m_libspdm_use_hash_algo;
    1081              :         ((libspdm_context_t *)spdm_context)
    1082            1 :         ->connection_info.algorithm.measurement_hash_algo =
    1083              :             m_libspdm_use_measurement_hash_algo;
    1084            1 :         spdm_response_size = sizeof(spdm_measurements_response_t) +
    1085              :                              sizeof(spdm_measurement_block_dmtf_t) +
    1086            1 :                              libspdm_get_measurement_hash_size(
    1087              :             m_libspdm_use_measurement_hash_algo) +
    1088              :                              SPDM_NONCE_SIZE + sizeof(uint16_t);
    1089            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1090            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1091              : 
    1092            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1093            1 :         spdm_response->header.request_response_code = SPDM_MEASUREMENTS;
    1094            1 :         spdm_response->header.param1 = 0;
    1095            1 :         spdm_response->header.param2 = 0;
    1096            1 :         spdm_response->number_of_blocks = 1;
    1097            1 :         libspdm_write_uint24(
    1098            1 :             spdm_response->measurement_record_length,
    1099              :             (uint32_t)(sizeof(spdm_measurement_block_dmtf_t) +
    1100            1 :                        libspdm_get_measurement_hash_size(
    1101              :                            m_libspdm_use_measurement_hash_algo)));
    1102            1 :         measurment_block = (void *)(spdm_response + 1);
    1103            1 :         libspdm_set_mem(measurment_block,
    1104              :                         sizeof(spdm_measurement_block_dmtf_t) +
    1105            1 :                         libspdm_get_measurement_hash_size(
    1106              :                             m_libspdm_use_measurement_hash_algo),
    1107              :                         1);
    1108              :         measurment_block->measurement_block_common_header
    1109            1 :         .measurement_specification =
    1110              :             SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    1111              :         measurment_block->measurement_block_common_header
    1112            1 :         .measurement_size =
    1113            1 :             (uint16_t)(sizeof(spdm_measurement_block_dmtf_header_t) +
    1114            1 :                        libspdm_get_measurement_hash_size(
    1115              :                            m_libspdm_use_measurement_hash_algo));
    1116              : 
    1117            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
    1118              :                                               false, spdm_response_size,
    1119              :                                               spdm_response, response_size,
    1120              :                                               response);
    1121              :     }
    1122            1 :         return LIBSPDM_STATUS_SUCCESS;
    1123              : 
    1124            1 :     case 0xF: {
    1125              :         spdm_measurements_response_t *spdm_response;
    1126              :         uint8_t *ptr;
    1127              :         uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
    1128              :         size_t sig_size;
    1129              :         size_t measurment_sig_size;
    1130              :         spdm_measurement_block_dmtf_t *measurment_block;
    1131              :         size_t spdm_response_size;
    1132              :         size_t transport_header_size;
    1133              : 
    1134              :         ((libspdm_context_t *)spdm_context)
    1135            1 :         ->connection_info.algorithm.base_asym_algo =
    1136              :             m_libspdm_use_asym_algo;
    1137              :         ((libspdm_context_t *)spdm_context)
    1138            1 :         ->connection_info.algorithm.base_hash_algo =
    1139              :             m_libspdm_use_hash_algo;
    1140              :         ((libspdm_context_t *)spdm_context)
    1141            1 :         ->connection_info.algorithm.measurement_hash_algo =
    1142              :             m_libspdm_use_measurement_hash_algo;
    1143            1 :         measurment_sig_size =
    1144              :             SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
    1145            1 :             libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    1146            1 :         spdm_response_size = sizeof(spdm_measurements_response_t) +
    1147              :                              sizeof(spdm_measurement_block_dmtf_t) +
    1148            1 :                              libspdm_get_measurement_hash_size(
    1149            1 :             m_libspdm_use_measurement_hash_algo) +
    1150              :                              measurment_sig_size;
    1151            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1152            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1153              : 
    1154            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1155            1 :         spdm_response->header.request_response_code =
    1156              :             SPDM_MEASUREMENTS + 1;
    1157            1 :         spdm_response->header.param1 = 0;
    1158            1 :         spdm_response->header.param2 = 0;
    1159            1 :         spdm_response->number_of_blocks = 1;
    1160            1 :         libspdm_write_uint24(
    1161            1 :             spdm_response->measurement_record_length,
    1162              :             (uint32_t)(sizeof(spdm_measurement_block_dmtf_t) +
    1163            1 :                        libspdm_get_measurement_hash_size(
    1164              :                            m_libspdm_use_measurement_hash_algo)));
    1165            1 :         measurment_block = (void *)(spdm_response + 1);
    1166            1 :         libspdm_set_mem(measurment_block,
    1167              :                         sizeof(spdm_measurement_block_dmtf_t) +
    1168            1 :                         libspdm_get_measurement_hash_size(
    1169              :                             m_libspdm_use_measurement_hash_algo),
    1170              :                         1);
    1171              :         measurment_block->measurement_block_common_header
    1172            1 :         .measurement_specification =
    1173              :             SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    1174              :         measurment_block->measurement_block_common_header
    1175            1 :         .measurement_size =
    1176            1 :             (uint16_t)(sizeof(spdm_measurement_block_dmtf_header_t) +
    1177            1 :                        libspdm_get_measurement_hash_size(
    1178              :                            m_libspdm_use_measurement_hash_algo));
    1179            1 :         ptr = (void *)((uint8_t *)spdm_response + spdm_response_size -
    1180              :                        measurment_sig_size);
    1181            1 :         libspdm_get_random_number(SPDM_NONCE_SIZE, ptr);
    1182            1 :         ptr += SPDM_NONCE_SIZE;
    1183            1 :         *(uint16_t *)ptr = 0;
    1184            1 :         ptr += sizeof(uint16_t);
    1185            1 :         libspdm_copy_mem(&m_libspdm_local_buffer[m_libspdm_local_buffer_size],
    1186              :                          sizeof(m_libspdm_local_buffer)
    1187            1 :                          - (&m_libspdm_local_buffer[m_libspdm_local_buffer_size] -
    1188              :                             m_libspdm_local_buffer),
    1189            1 :                          spdm_response, (size_t)ptr - (size_t)spdm_response);
    1190            1 :         m_libspdm_local_buffer_size += ((size_t)ptr - (size_t)spdm_response);
    1191            1 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "m_libspdm_local_buffer_size (0x%zx):\n",
    1192              :                        m_libspdm_local_buffer_size));
    1193            1 :         libspdm_dump_hex(m_libspdm_local_buffer, m_libspdm_local_buffer_size);
    1194            1 :         libspdm_hash_all(m_libspdm_use_hash_algo, m_libspdm_local_buffer,
    1195              :                          m_libspdm_local_buffer_size, hash_data);
    1196            1 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "HashDataSize (0x%x):\n",
    1197              :                        libspdm_get_hash_size(m_libspdm_use_hash_algo)));
    1198            1 :         libspdm_dump_hex(m_libspdm_local_buffer, m_libspdm_local_buffer_size);
    1199            1 :         sig_size = libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    1200            1 :         libspdm_responder_data_sign(
    1201              :             spdm_context,
    1202            1 :             spdm_response->header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
    1203              :                 SPDM_MEASUREMENTS,
    1204              :                 m_libspdm_use_asym_algo, m_libspdm_use_pqc_asym_algo, m_libspdm_use_hash_algo,
    1205              :                 false, m_libspdm_local_buffer, m_libspdm_local_buffer_size,
    1206              :                 ptr, &sig_size);
    1207            1 :         ptr += sig_size;
    1208              : 
    1209            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
    1210              :                                               false, spdm_response_size,
    1211              :                                               spdm_response, response_size,
    1212              :                                               response);
    1213              :     }
    1214            1 :         return LIBSPDM_STATUS_SUCCESS;
    1215              : 
    1216            1 :     case 0x10:
    1217            1 :         return LIBSPDM_STATUS_RECEIVE_FAIL;
    1218              : 
    1219            3 :     case 0x11: {
    1220              :         static size_t sub_index0x11 = 0;
    1221              : 
    1222              :         spdm_measurements_response_t *spdm_response;
    1223              :         spdm_measurement_block_dmtf_t *measurment_block;
    1224              :         size_t spdm_response_size;
    1225              :         size_t transport_header_size;
    1226            3 :         spdm_response_size = sizeof(spdm_measurements_response_t);
    1227              : 
    1228              :         ((libspdm_context_t *)spdm_context)
    1229            3 :         ->connection_info.algorithm.measurement_hash_algo =
    1230              :             m_libspdm_use_measurement_hash_algo;
    1231            3 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1232            3 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1233              : 
    1234            3 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1235            3 :         spdm_response->header.request_response_code = SPDM_MEASUREMENTS;
    1236            3 :         spdm_response->header.param1 = 1;
    1237            3 :         spdm_response->header.param2 = 0;
    1238            3 :         if (sub_index0x11 == 0) {
    1239            1 :             spdm_response_size = sizeof(spdm_measurements_response_t) +
    1240              :                                  sizeof(spdm_measurement_block_dmtf_t) +
    1241            1 :                                  libspdm_get_measurement_hash_size(
    1242              :                 m_libspdm_use_measurement_hash_algo) +
    1243              :                                  SPDM_NONCE_SIZE + sizeof(uint16_t);
    1244            1 :             spdm_response->number_of_blocks = 1;
    1245            1 :             libspdm_write_uint24(
    1246            1 :                 spdm_response->measurement_record_length,
    1247              :                 (uint32_t)(sizeof(spdm_measurement_block_dmtf_t) +
    1248            1 :                            libspdm_get_measurement_hash_size(
    1249              :                                m_libspdm_use_measurement_hash_algo)));
    1250            1 :             measurment_block = (void *)(spdm_response + 1);
    1251            1 :             libspdm_set_mem(measurment_block,
    1252              :                             sizeof(spdm_measurement_block_dmtf_t) +
    1253            1 :                             libspdm_get_measurement_hash_size(
    1254              :                                 m_libspdm_use_measurement_hash_algo),
    1255              :                             1);
    1256              :             measurment_block->measurement_block_common_header
    1257            1 :             .measurement_specification =
    1258              :                 SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    1259              :             measurment_block->measurement_block_common_header
    1260            1 :             .measurement_size = (uint16_t)(
    1261              :                 sizeof(spdm_measurement_block_dmtf_header_t) +
    1262            1 :                 libspdm_get_measurement_hash_size(
    1263              :                     m_libspdm_use_measurement_hash_algo));
    1264            2 :         } else if (sub_index0x11 == 1) {
    1265            1 :             spdm_response_size = sizeof(spdm_measurements_response_t) +
    1266              :                                  SPDM_NONCE_SIZE + sizeof(uint16_t);
    1267            1 :             spdm_response->number_of_blocks = 1;
    1268            1 :             libspdm_write_uint24(
    1269            1 :                 spdm_response->measurement_record_length, 0);
    1270            1 :         } else if (sub_index0x11 == 2) {
    1271            1 :             spdm_response_size = sizeof(spdm_measurements_response_t) +
    1272              :                                  sizeof(spdm_measurement_block_dmtf_t) +
    1273            1 :                                  libspdm_get_measurement_hash_size(
    1274              :                 m_libspdm_use_measurement_hash_algo) +
    1275              :                                  SPDM_NONCE_SIZE + sizeof(uint16_t);
    1276            1 :             spdm_response->number_of_blocks = 0;
    1277            1 :             libspdm_write_uint24(
    1278            1 :                 spdm_response->measurement_record_length,
    1279              :                 (uint32_t)(sizeof(spdm_measurement_block_dmtf_t) +
    1280            1 :                            libspdm_get_measurement_hash_size(
    1281              :                                m_libspdm_use_measurement_hash_algo)));
    1282            1 :             measurment_block = (void *)(spdm_response + 1);
    1283            1 :             libspdm_set_mem(measurment_block,
    1284              :                             sizeof(spdm_measurement_block_dmtf_t) +
    1285            1 :                             libspdm_get_measurement_hash_size(
    1286              :                                 m_libspdm_use_measurement_hash_algo),
    1287              :                             1);
    1288              :             measurment_block->measurement_block_common_header
    1289            1 :             .measurement_specification =
    1290              :                 SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    1291              :             measurment_block->measurement_block_common_header
    1292            1 :             .measurement_size = (uint16_t)(
    1293              :                 sizeof(spdm_measurement_block_dmtf_header_t) +
    1294            1 :                 libspdm_get_measurement_hash_size(
    1295              :                     m_libspdm_use_measurement_hash_algo));
    1296              :         }
    1297            3 :         sub_index0x11++;
    1298              : 
    1299            3 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
    1300              :                                               false, spdm_response_size,
    1301              :                                               spdm_response, response_size,
    1302              :                                               response);
    1303              :     }
    1304            3 :         return LIBSPDM_STATUS_SUCCESS;
    1305              : 
    1306            0 :     case 0x12: {
    1307              :         spdm_measurements_response_t *spdm_response;
    1308              :         spdm_measurement_block_dmtf_t *measurment_block;
    1309              :         uint8_t *large_spdm_response;
    1310              :         size_t spdm_response_size;
    1311              :         size_t transport_header_size;
    1312              :         size_t count;
    1313              : 
    1314              :         large_spdm_response =
    1315            0 :             (uint8_t *)malloc(sizeof(spdm_measurements_response_t) +
    1316              :                               LIBSPDM_LARGE_MEASUREMENT_SIZE);
    1317              : 
    1318              :         ((libspdm_context_t *)spdm_context)
    1319            0 :         ->connection_info.algorithm.measurement_hash_algo =
    1320              :             m_libspdm_use_measurement_hash_algo;
    1321            0 :         spdm_response_size = sizeof(spdm_measurements_response_t);
    1322            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1323            0 :         spdm_response = (void *)large_spdm_response;
    1324              : 
    1325            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1326            0 :         spdm_response->header.request_response_code = SPDM_MEASUREMENTS;
    1327            0 :         spdm_response->header.param1 = 0;
    1328            0 :         spdm_response->header.param2 = 0;
    1329            0 :         spdm_response->number_of_blocks = 0xFF;
    1330            0 :         libspdm_write_uint24(spdm_response->measurement_record_length,
    1331              :                              (uint32_t)(LIBSPDM_LARGE_MEASUREMENT_SIZE));
    1332            0 :         measurment_block = (void *)(spdm_response + 1);
    1333            0 :         libspdm_set_mem(measurment_block, LIBSPDM_LARGE_MEASUREMENT_SIZE, 1);
    1334            0 :         for (count = 0; count < spdm_response->number_of_blocks;
    1335            0 :              count++) {
    1336            0 :             measurment_block->measurement_block_common_header.index =
    1337            0 :                 (uint8_t)(count + 1);
    1338              :             measurment_block->measurement_block_common_header
    1339            0 :             .measurement_specification =
    1340              :                 SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    1341              :             measurment_block->measurement_block_common_header
    1342            0 :             .measurement_size = 0xFFFF;
    1343            0 :             spdm_response_size += (size_t)(
    1344              :                 sizeof(spdm_measurement_block_common_header_t) +
    1345              :                 0xFFFF);
    1346              :         }
    1347              : 
    1348            0 :         spdm_response = (void *)((uint8_t *)(*response) + transport_header_size);
    1349            0 :         if (spdm_response_size >  (size_t)(*response) + *response_size - (size_t)spdm_response) {
    1350            0 :             spdm_response_size =  (size_t)(*response) + *response_size - (size_t)spdm_response;
    1351              :         }
    1352            0 :         libspdm_copy_mem (spdm_response, spdm_response_size,
    1353              :                           large_spdm_response, spdm_response_size);
    1354              : 
    1355            0 :         status = libspdm_transport_test_encode_message(
    1356              :             spdm_context, NULL, false, false, spdm_response_size,
    1357              :             spdm_response, response_size, response);
    1358              : 
    1359            0 :         free(large_spdm_response);
    1360              :     }
    1361            0 :         return status;
    1362              : 
    1363            1 :     case 0x13: {
    1364              :         spdm_measurements_response_t *spdm_response;
    1365              :         spdm_measurement_block_dmtf_t *measurment_block;
    1366              :         size_t spdm_response_size;
    1367              :         size_t transport_header_size;
    1368              : 
    1369              :         ((libspdm_context_t *)spdm_context)
    1370            1 :         ->connection_info.algorithm.measurement_hash_algo =
    1371              :             m_libspdm_use_measurement_hash_algo;
    1372            1 :         spdm_response_size = sizeof(spdm_measurements_response_t) +
    1373              :                              sizeof(spdm_measurement_block_dmtf_t) +
    1374            1 :                              libspdm_get_measurement_hash_size(
    1375              :             m_libspdm_use_measurement_hash_algo) +
    1376              :                              SPDM_NONCE_SIZE + sizeof(uint16_t);
    1377            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1378            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1379              : 
    1380            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1381            1 :         spdm_response->header.request_response_code = SPDM_MEASUREMENTS;
    1382            1 :         spdm_response->header.param1 = 0;
    1383            1 :         spdm_response->header.param2 = 0;
    1384            1 :         spdm_response->number_of_blocks = 1;
    1385            1 :         libspdm_write_uint24(
    1386            1 :             spdm_response->measurement_record_length,
    1387              :             (uint32_t)(sizeof(spdm_measurement_block_dmtf_t) +
    1388            1 :                        libspdm_get_measurement_hash_size(
    1389              :                            m_libspdm_use_measurement_hash_algo)));
    1390            1 :         measurment_block = (void *)(spdm_response + 1);
    1391            1 :         libspdm_set_mem(measurment_block,
    1392              :                         sizeof(spdm_measurement_block_dmtf_t) +
    1393            1 :                         libspdm_get_measurement_hash_size(
    1394              :                             m_libspdm_use_measurement_hash_algo),
    1395              :                         1);
    1396            1 :         measurment_block->measurement_block_common_header.index = 1;
    1397              :         measurment_block->measurement_block_common_header
    1398            1 :         .measurement_specification = 0x00000001 | 0x00000002;
    1399              :         measurment_block->measurement_block_common_header
    1400            1 :         .measurement_size =
    1401            1 :             (uint16_t)(sizeof(spdm_measurement_block_dmtf_header_t) +
    1402            1 :                        libspdm_get_measurement_hash_size(
    1403              :                            m_libspdm_use_measurement_hash_algo));
    1404              : 
    1405            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
    1406              :                                               false, spdm_response_size,
    1407              :                                               spdm_response, response_size,
    1408              :                                               response);
    1409              :     }
    1410            1 :         return LIBSPDM_STATUS_SUCCESS;
    1411              : 
    1412            1 :     case 0x14: {
    1413              :         spdm_measurements_response_t *spdm_response;
    1414              :         spdm_measurement_block_dmtf_t *measurment_block;
    1415              :         size_t spdm_response_size;
    1416              :         size_t transport_header_size;
    1417              : 
    1418              :         ((libspdm_context_t *)spdm_context)
    1419            1 :         ->connection_info.algorithm.measurement_hash_algo =
    1420              :             m_libspdm_use_measurement_hash_algo;
    1421            1 :         spdm_response_size = sizeof(spdm_measurements_response_t) +
    1422              :                              sizeof(spdm_measurement_block_dmtf_t) +
    1423            1 :                              libspdm_get_measurement_hash_size(
    1424              :             m_libspdm_use_measurement_hash_algo) +
    1425              :                              SPDM_NONCE_SIZE + sizeof(uint16_t);
    1426            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1427            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1428              : 
    1429            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1430            1 :         spdm_response->header.request_response_code = SPDM_MEASUREMENTS;
    1431            1 :         spdm_response->header.param1 = 0;
    1432            1 :         spdm_response->header.param2 = 0;
    1433            1 :         spdm_response->number_of_blocks = 1;
    1434            1 :         libspdm_write_uint24(
    1435            1 :             spdm_response->measurement_record_length,
    1436              :             (uint32_t)(sizeof(spdm_measurement_block_dmtf_t) +
    1437            1 :                        libspdm_get_measurement_hash_size(
    1438              :                            m_libspdm_use_measurement_hash_algo)));
    1439            1 :         measurment_block = (void *)(spdm_response + 1);
    1440            1 :         libspdm_set_mem(measurment_block,
    1441              :                         sizeof(spdm_measurement_block_dmtf_t) +
    1442            1 :                         libspdm_get_measurement_hash_size(
    1443              :                             m_libspdm_use_measurement_hash_algo),
    1444              :                         1);
    1445            1 :         measurment_block->measurement_block_common_header.index = 1;
    1446              :         measurment_block->measurement_block_common_header
    1447            1 :         .measurement_specification = 0x00000004 | 0x00000002;
    1448              :         measurment_block->measurement_block_common_header
    1449            1 :         .measurement_size =
    1450            1 :             (uint16_t)(sizeof(spdm_measurement_block_dmtf_header_t) +
    1451            1 :                        libspdm_get_measurement_hash_size(
    1452              :                            m_libspdm_use_measurement_hash_algo));
    1453              : 
    1454            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
    1455              :                                               false, spdm_response_size,
    1456              :                                               spdm_response, response_size,
    1457              :                                               response);
    1458              :     }
    1459            1 :         return LIBSPDM_STATUS_SUCCESS;
    1460              : 
    1461            1 :     case 0x15: {
    1462              :         spdm_measurements_response_t *spdm_response;
    1463              :         spdm_measurement_block_dmtf_t *measurment_block;
    1464              :         size_t spdm_response_size;
    1465              :         size_t transport_header_size;
    1466              : 
    1467              :         ((libspdm_context_t *)spdm_context)
    1468            1 :         ->connection_info.algorithm.measurement_hash_algo =
    1469              :             m_libspdm_use_measurement_hash_algo;
    1470            1 :         spdm_response_size = sizeof(spdm_measurements_response_t) +
    1471              :                              sizeof(spdm_measurement_block_dmtf_t) +
    1472            1 :                              libspdm_get_measurement_hash_size(
    1473              :             m_libspdm_use_measurement_hash_algo) +
    1474              :                              SPDM_NONCE_SIZE + sizeof(uint16_t);
    1475            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1476            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1477              : 
    1478            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1479            1 :         spdm_response->header.request_response_code = SPDM_MEASUREMENTS;
    1480            1 :         spdm_response->header.param1 = 0;
    1481            1 :         spdm_response->header.param2 = 0;
    1482            1 :         spdm_response->number_of_blocks = 1;
    1483            1 :         libspdm_write_uint24(
    1484            1 :             spdm_response->measurement_record_length,
    1485              :             (uint32_t)(sizeof(spdm_measurement_block_dmtf_t) +
    1486            1 :                        libspdm_get_measurement_hash_size(
    1487              :                            m_libspdm_use_measurement_hash_algo)));
    1488            1 :         measurment_block = (void *)(spdm_response + 1);
    1489            1 :         libspdm_set_mem(measurment_block,
    1490              :                         sizeof(spdm_measurement_block_dmtf_t) +
    1491            1 :                         libspdm_get_measurement_hash_size(
    1492              :                             m_libspdm_use_measurement_hash_algo),
    1493              :                         1);
    1494            1 :         measurment_block->measurement_block_common_header.index = 1;
    1495              :         measurment_block->measurement_block_common_header
    1496            1 :         .measurement_specification =
    1497            1 :             (uint8_t)(m_libspdm_use_measurement_spec << 1);
    1498              :         measurment_block->measurement_block_common_header
    1499            1 :         .measurement_size =
    1500            1 :             (uint16_t)(sizeof(spdm_measurement_block_dmtf_header_t) +
    1501            1 :                        libspdm_get_measurement_hash_size(
    1502              :                            m_libspdm_use_measurement_hash_algo));
    1503              : 
    1504            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
    1505              :                                               false, spdm_response_size,
    1506              :                                               spdm_response, response_size,
    1507              :                                               response);
    1508              :     }
    1509            1 :         return LIBSPDM_STATUS_SUCCESS;
    1510              : 
    1511          100 :     case 0x16: {
    1512              :         spdm_measurements_response_t *spdm_response;
    1513              :         spdm_measurement_block_dmtf_t *measurment_block;
    1514              :         size_t spdm_response_size;
    1515              :         size_t transport_header_size;
    1516              :         uint8_t *ptr;
    1517              :         ((libspdm_context_t *)spdm_context)
    1518          100 :         ->connection_info.algorithm.measurement_hash_algo =
    1519              :             m_libspdm_use_measurement_hash_algo;
    1520          100 :         spdm_response_size = sizeof(spdm_measurements_response_t) +
    1521              :                              sizeof(spdm_measurement_block_dmtf_t) +
    1522          100 :                              libspdm_get_measurement_hash_size(
    1523              :             m_libspdm_use_measurement_hash_algo) +
    1524              :                              SPDM_NONCE_SIZE + sizeof(uint16_t);
    1525          100 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1526          100 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1527              : 
    1528          100 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1529          100 :         spdm_response->header.request_response_code = SPDM_MEASUREMENTS;
    1530          100 :         spdm_response->header.param1 = 0;
    1531          100 :         spdm_response->header.param2 = 0;
    1532          100 :         spdm_response->number_of_blocks = 1;
    1533          100 :         libspdm_write_uint24(
    1534          100 :             spdm_response->measurement_record_length,
    1535              :             (uint32_t)(sizeof(spdm_measurement_block_dmtf_t) +
    1536          100 :                        libspdm_get_measurement_hash_size(
    1537              :                            m_libspdm_use_measurement_hash_algo)));
    1538          100 :         measurment_block = (void *)(spdm_response + 1);
    1539          100 :         libspdm_set_mem(measurment_block,
    1540              :                         sizeof(spdm_measurement_block_dmtf_t) +
    1541          100 :                         libspdm_get_measurement_hash_size(
    1542              :                             m_libspdm_use_measurement_hash_algo),
    1543              :                         1);
    1544              :         measurment_block->measurement_block_common_header
    1545          100 :         .measurement_specification =
    1546              :             SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    1547              :         measurment_block->measurement_block_common_header
    1548          100 :         .measurement_size =
    1549          100 :             (uint16_t)(sizeof(spdm_measurement_block_dmtf_header_t) +
    1550          100 :                        libspdm_get_measurement_hash_size(
    1551              :                            m_libspdm_use_measurement_hash_algo));
    1552          100 :         *(uint16_t *)((uint8_t *)spdm_response +
    1553              :                       sizeof(spdm_measurements_response_t) +
    1554          100 :                       sizeof(spdm_measurement_block_dmtf_t) +
    1555          100 :                       libspdm_get_measurement_hash_size(
    1556          100 :                           m_libspdm_use_measurement_hash_algo)) = 0;
    1557          100 :         ptr = (uint8_t *)spdm_response + spdm_response_size - SPDM_NONCE_SIZE - sizeof(uint16_t);
    1558          100 :         libspdm_get_random_number(SPDM_NONCE_SIZE,ptr);
    1559          100 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
    1560              :                                               false, spdm_response_size,
    1561              :                                               spdm_response, response_size,
    1562              :                                               response);
    1563              :     }
    1564          100 :         return LIBSPDM_STATUS_SUCCESS;
    1565              : 
    1566            0 :     case 0x17: {
    1567              :         spdm_measurements_response_t *spdm_response;
    1568              :         uint8_t *ptr;
    1569              :         spdm_measurement_block_dmtf_t *measurment_block;
    1570              :         size_t spdm_response_size;
    1571              :         size_t transport_header_size;
    1572              : 
    1573              :         ((libspdm_context_t *)spdm_context)
    1574            0 :         ->connection_info.algorithm.measurement_hash_algo =
    1575              :             m_libspdm_use_measurement_hash_algo;
    1576            0 :         spdm_response_size = sizeof(spdm_measurements_response_t) +
    1577              :                              sizeof(spdm_measurement_block_dmtf_t) +
    1578            0 :                              libspdm_get_measurement_hash_size(
    1579              :             m_libspdm_use_measurement_hash_algo) +
    1580              :                              SPDM_NONCE_SIZE +
    1581              :                              sizeof(uint16_t) + SPDM_MAX_OPAQUE_DATA_SIZE;
    1582            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1583            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1584              : 
    1585            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1586            0 :         spdm_response->header.request_response_code = SPDM_MEASUREMENTS;
    1587            0 :         spdm_response->header.param1 = 0;
    1588            0 :         spdm_response->header.param2 = 0;
    1589            0 :         spdm_response->number_of_blocks = 1;
    1590            0 :         libspdm_write_uint24(
    1591            0 :             spdm_response->measurement_record_length,
    1592              :             (uint32_t)(sizeof(spdm_measurement_block_dmtf_t) +
    1593            0 :                        libspdm_get_measurement_hash_size(
    1594              :                            m_libspdm_use_measurement_hash_algo)));
    1595            0 :         measurment_block = (void *)(spdm_response + 1);
    1596            0 :         libspdm_set_mem(measurment_block,
    1597              :                         sizeof(spdm_measurement_block_dmtf_t) +
    1598            0 :                         libspdm_get_measurement_hash_size(
    1599              :                             m_libspdm_use_measurement_hash_algo),
    1600              :                         1);
    1601              :         measurment_block->measurement_block_common_header
    1602            0 :         .measurement_specification =
    1603              :             SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    1604              :         measurment_block->measurement_block_common_header
    1605            0 :         .measurement_size =
    1606            0 :             (uint16_t)(sizeof(spdm_measurement_block_dmtf_header_t) +
    1607            0 :                        libspdm_get_measurement_hash_size(
    1608              :                            m_libspdm_use_measurement_hash_algo));
    1609              :         /* adding extra fields: opaque_length, opaque_data*/
    1610            0 :         ptr = (void *)((uint8_t *)spdm_response +
    1611              :                        sizeof(spdm_measurements_response_t) +
    1612            0 :                        sizeof(spdm_measurement_block_dmtf_t) +
    1613            0 :                        libspdm_get_measurement_hash_size(
    1614              :                            m_libspdm_use_measurement_hash_algo));
    1615            0 :         libspdm_get_random_number (SPDM_NONCE_SIZE, ptr);
    1616            0 :         ptr += SPDM_NONCE_SIZE;
    1617            0 :         *(uint16_t *)ptr = SPDM_MAX_OPAQUE_DATA_SIZE; /* opaque_length*/
    1618            0 :         ptr += sizeof(uint16_t);
    1619            0 :         libspdm_set_mem(ptr, SPDM_MAX_OPAQUE_DATA_SIZE, 255);
    1620            0 :         ptr += SPDM_MAX_OPAQUE_DATA_SIZE;
    1621              : 
    1622            0 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
    1623              :                                               false, spdm_response_size,
    1624              :                                               spdm_response, response_size,
    1625              :                                               response);
    1626              :     }
    1627            0 :         return LIBSPDM_STATUS_SUCCESS;
    1628              : 
    1629            1 :     case 0x18: {
    1630              :         spdm_measurements_response_t *spdm_response;
    1631              :         uint8_t *ptr;
    1632              :         spdm_measurement_block_dmtf_t *measurment_block;
    1633              :         size_t spdm_response_size;
    1634              :         size_t transport_header_size;
    1635              : 
    1636              :         ((libspdm_context_t *)spdm_context)
    1637            1 :         ->connection_info.algorithm.measurement_hash_algo =
    1638              :             m_libspdm_use_measurement_hash_algo;
    1639            1 :         spdm_response_size = sizeof(spdm_measurements_response_t) +
    1640              :                              sizeof(spdm_measurement_block_dmtf_t) +
    1641            1 :                              libspdm_get_measurement_hash_size(
    1642              :             m_libspdm_use_measurement_hash_algo) +
    1643              :                              SPDM_NONCE_SIZE +
    1644              :                              sizeof(uint16_t) +
    1645              :                              (SPDM_MAX_OPAQUE_DATA_SIZE + 1);
    1646            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1647            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1648              : 
    1649            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1650            1 :         spdm_response->header.request_response_code = SPDM_MEASUREMENTS;
    1651            1 :         spdm_response->header.param1 = 0;
    1652            1 :         spdm_response->header.param2 = 0;
    1653            1 :         spdm_response->number_of_blocks = 1;
    1654            1 :         libspdm_write_uint24(
    1655            1 :             spdm_response->measurement_record_length,
    1656              :             (uint32_t)(sizeof(spdm_measurement_block_dmtf_t) +
    1657            1 :                        libspdm_get_measurement_hash_size(
    1658              :                            m_libspdm_use_measurement_hash_algo)));
    1659            1 :         measurment_block = (void *)(spdm_response + 1);
    1660            1 :         libspdm_set_mem(measurment_block,
    1661              :                         sizeof(spdm_measurement_block_dmtf_t) +
    1662            1 :                         libspdm_get_measurement_hash_size(
    1663              :                             m_libspdm_use_measurement_hash_algo),
    1664              :                         1);
    1665              :         measurment_block->measurement_block_common_header
    1666            1 :         .measurement_specification =
    1667              :             SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    1668              :         measurment_block->measurement_block_common_header
    1669            1 :         .measurement_size =
    1670            1 :             (uint16_t)(sizeof(spdm_measurement_block_dmtf_header_t) +
    1671            1 :                        libspdm_get_measurement_hash_size(
    1672              :                            m_libspdm_use_measurement_hash_algo));
    1673              :         /* adding extra fields: opaque_length, opaque_data*/
    1674            1 :         ptr = (void *)((uint8_t *)spdm_response +
    1675              :                        sizeof(spdm_measurements_response_t) +
    1676            1 :                        sizeof(spdm_measurement_block_dmtf_t) +
    1677            1 :                        libspdm_get_measurement_hash_size(
    1678              :                            m_libspdm_use_measurement_hash_algo));
    1679            1 :         ptr += SPDM_NONCE_SIZE;
    1680            1 :         *(uint16_t *)ptr =
    1681              :             (SPDM_MAX_OPAQUE_DATA_SIZE + 1); /* opaque_length*/
    1682            1 :         ptr += sizeof(uint16_t);
    1683            1 :         libspdm_set_mem(ptr, (SPDM_MAX_OPAQUE_DATA_SIZE + 1), 255);
    1684            1 :         ptr += (SPDM_MAX_OPAQUE_DATA_SIZE + 1);
    1685              : 
    1686            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
    1687              :                                               false, spdm_response_size,
    1688              :                                               spdm_response, response_size,
    1689              :                                               response);
    1690              :     }
    1691            1 :         return LIBSPDM_STATUS_SUCCESS;
    1692              : 
    1693            1 :     case 0x19: {
    1694              :         spdm_measurements_response_t *spdm_response;
    1695              :         uint8_t *ptr;
    1696              :         uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
    1697              :         size_t sig_size;
    1698              :         size_t measurment_sig_size;
    1699              :         spdm_measurement_block_dmtf_t *measurment_block;
    1700              :         size_t spdm_response_size;
    1701              :         size_t transport_header_size;
    1702            1 :         uint16_t opaque_size_test = SPDM_MAX_OPAQUE_DATA_SIZE;
    1703              : 
    1704              :         ((libspdm_context_t *)spdm_context)
    1705            1 :         ->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    1706              :         ((libspdm_context_t *)spdm_context)
    1707            1 :         ->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1708              :         ((libspdm_context_t *)spdm_context)
    1709            1 :         ->connection_info.algorithm.measurement_hash_algo = m_libspdm_use_measurement_hash_algo;
    1710            1 :         measurment_sig_size =
    1711            2 :             SPDM_NONCE_SIZE + sizeof(uint16_t) + opaque_size_test +
    1712            1 :             libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    1713            1 :         spdm_response_size = sizeof(spdm_measurements_response_t) +
    1714              :                              sizeof(spdm_measurement_block_dmtf_t) +
    1715            1 :                              libspdm_get_measurement_hash_size(
    1716            1 :             m_libspdm_use_measurement_hash_algo) + measurment_sig_size;
    1717            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1718            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1719              : 
    1720            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1721            1 :         spdm_response->header.request_response_code = SPDM_MEASUREMENTS;
    1722            1 :         spdm_response->header.param1 = 0;
    1723            1 :         spdm_response->header.param2 = SPDM_MEASUREMENTS_RESPONSE_CONTENT_CHANGE_DETECTED;
    1724            1 :         spdm_response->number_of_blocks = 1;
    1725            1 :         libspdm_write_uint24(
    1726            1 :             spdm_response->measurement_record_length,
    1727              :             (uint32_t)(sizeof(spdm_measurement_block_dmtf_t) +
    1728            1 :                        libspdm_get_measurement_hash_size(
    1729              :                            m_libspdm_use_measurement_hash_algo)));
    1730            1 :         measurment_block = (void *)(spdm_response + 1);
    1731            1 :         libspdm_set_mem(measurment_block,
    1732              :                         sizeof(spdm_measurement_block_dmtf_t) +
    1733            1 :                         libspdm_get_measurement_hash_size(
    1734              :                             m_libspdm_use_measurement_hash_algo), 1);
    1735              :         measurment_block->measurement_block_common_header
    1736            1 :         .measurement_specification = SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    1737              :         measurment_block->measurement_block_common_header
    1738            1 :         .measurement_size =
    1739            1 :             (uint16_t)(sizeof(spdm_measurement_block_dmtf_header_t) +
    1740            1 :                        libspdm_get_measurement_hash_size(
    1741              :                            m_libspdm_use_measurement_hash_algo));
    1742            1 :         ptr = (void *)((uint8_t *)spdm_response + spdm_response_size - measurment_sig_size);
    1743            1 :         libspdm_get_random_number(SPDM_NONCE_SIZE, ptr);
    1744            1 :         ptr += SPDM_NONCE_SIZE;
    1745              : 
    1746            1 :         *(uint16_t *)ptr = opaque_size_test; /* opaque_length*/
    1747            1 :         ptr += sizeof(uint16_t);
    1748            1 :         libspdm_set_mem(ptr, opaque_size_test, 255);
    1749            1 :         ptr += opaque_size_test;
    1750              : 
    1751            1 :         libspdm_copy_mem(&m_libspdm_local_buffer[m_libspdm_local_buffer_size],
    1752              :                          sizeof(m_libspdm_local_buffer)
    1753            1 :                          - (&m_libspdm_local_buffer[m_libspdm_local_buffer_size] -
    1754              :                             m_libspdm_local_buffer),
    1755            1 :                          spdm_response, (size_t)ptr - (size_t)spdm_response);
    1756            1 :         m_libspdm_local_buffer_size += ((size_t)ptr - (size_t)spdm_response);
    1757            1 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "m_libspdm_local_buffer_size (0x%zx):\n",
    1758              :                        m_libspdm_local_buffer_size));
    1759            1 :         libspdm_dump_hex(m_libspdm_local_buffer, m_libspdm_local_buffer_size);
    1760            1 :         libspdm_hash_all(m_libspdm_use_hash_algo, m_libspdm_local_buffer,
    1761              :                          m_libspdm_local_buffer_size, hash_data);
    1762            1 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "HashDataSize (0x%x):\n",
    1763              :                        libspdm_get_hash_size(m_libspdm_use_hash_algo)));
    1764            1 :         libspdm_dump_hex(m_libspdm_local_buffer, m_libspdm_local_buffer_size);
    1765            1 :         sig_size = libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    1766            1 :         libspdm_responder_data_sign(
    1767              :             spdm_context,
    1768            1 :             spdm_response->header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
    1769              :                 SPDM_MEASUREMENTS,
    1770              :                 m_libspdm_use_asym_algo, m_libspdm_use_pqc_asym_algo, m_libspdm_use_hash_algo,
    1771              :                 false, m_libspdm_local_buffer, m_libspdm_local_buffer_size,
    1772              :                 ptr, &sig_size);
    1773            1 :         ptr += sig_size;
    1774              : 
    1775            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
    1776              :                                               false, spdm_response_size,
    1777              :                                               spdm_response, response_size,
    1778              :                                               response);
    1779              :     }
    1780            1 :         return LIBSPDM_STATUS_SUCCESS;
    1781              : 
    1782            1 :     case 0x1A: {
    1783              :         spdm_measurements_response_t *spdm_response;
    1784              :         uint8_t *ptr;
    1785              :         uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
    1786              :         size_t sig_size;
    1787              :         size_t measurment_sig_size;
    1788              :         spdm_measurement_block_dmtf_t *measurment_block;
    1789              :         size_t spdm_response_size;
    1790              :         size_t transport_header_size;
    1791              :         size_t MissingBytes;
    1792            1 :         uint16_t opaque_size_test = SPDM_MAX_OPAQUE_DATA_SIZE;
    1793              : 
    1794            1 :         sig_size = libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    1795            1 :         MissingBytes = sig_size;
    1796              : 
    1797              :         ((libspdm_context_t *)spdm_context)
    1798            1 :         ->connection_info.algorithm.base_asym_algo =
    1799              :             m_libspdm_use_asym_algo;
    1800              :         ((libspdm_context_t *)spdm_context)
    1801            1 :         ->connection_info.algorithm.base_hash_algo =
    1802              :             m_libspdm_use_hash_algo;
    1803              :         ((libspdm_context_t *)spdm_context)
    1804            1 :         ->connection_info.algorithm.measurement_hash_algo =
    1805              :             m_libspdm_use_measurement_hash_algo;
    1806            1 :         measurment_sig_size =
    1807              :             SPDM_NONCE_SIZE + sizeof(uint16_t) +
    1808            2 :             (opaque_size_test - MissingBytes) +
    1809            1 :             libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    1810            1 :         spdm_response_size = sizeof(spdm_measurements_response_t) +
    1811              :                              sizeof(spdm_measurement_block_dmtf_t) +
    1812            1 :                              libspdm_get_measurement_hash_size(
    1813            1 :             m_libspdm_use_measurement_hash_algo) +
    1814              :                              measurment_sig_size;
    1815            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1816            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1817              : 
    1818            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1819            1 :         spdm_response->header.request_response_code = SPDM_MEASUREMENTS;
    1820            1 :         spdm_response->header.param1 = 0;
    1821            1 :         spdm_response->header.param2 = 0;
    1822            1 :         spdm_response->number_of_blocks = 1;
    1823            1 :         libspdm_write_uint24(
    1824            1 :             spdm_response->measurement_record_length,
    1825              :             (uint32_t)(sizeof(spdm_measurement_block_dmtf_t) +
    1826            1 :                        libspdm_get_measurement_hash_size(
    1827              :                            m_libspdm_use_measurement_hash_algo)));
    1828            1 :         measurment_block = (void *)(spdm_response + 1);
    1829            1 :         libspdm_set_mem(measurment_block,
    1830              :                         sizeof(spdm_measurement_block_dmtf_t) +
    1831            1 :                         libspdm_get_measurement_hash_size(
    1832              :                             m_libspdm_use_measurement_hash_algo),
    1833              :                         1);
    1834              :         measurment_block->measurement_block_common_header
    1835            1 :         .measurement_specification =
    1836              :             SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    1837              :         measurment_block->measurement_block_common_header
    1838            1 :         .measurement_size =
    1839            1 :             (uint16_t)(sizeof(spdm_measurement_block_dmtf_header_t) +
    1840            1 :                        libspdm_get_measurement_hash_size(
    1841              :                            m_libspdm_use_measurement_hash_algo));
    1842            1 :         ptr = (void *)((uint8_t *)spdm_response + spdm_response_size -
    1843              :                        measurment_sig_size);
    1844            1 :         libspdm_get_random_number(SPDM_NONCE_SIZE, ptr);
    1845            1 :         ptr += SPDM_NONCE_SIZE;
    1846              : 
    1847            1 :         *(uint16_t *)ptr = opaque_size_test; /* opaque_length*/
    1848            1 :         ptr += sizeof(uint16_t);
    1849            1 :         libspdm_set_mem(ptr, opaque_size_test - MissingBytes, 255);
    1850            1 :         ptr += (opaque_size_test - MissingBytes);
    1851              : 
    1852            1 :         libspdm_copy_mem(&m_libspdm_local_buffer[m_libspdm_local_buffer_size],
    1853              :                          sizeof(m_libspdm_local_buffer)
    1854            1 :                          - (&m_libspdm_local_buffer[m_libspdm_local_buffer_size] -
    1855              :                             m_libspdm_local_buffer),
    1856            1 :                          spdm_response, (size_t)ptr - (size_t)spdm_response);
    1857            1 :         m_libspdm_local_buffer_size += ((size_t)ptr - (size_t)spdm_response);
    1858            1 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "m_libspdm_local_buffer_size (0x%zx):\n",
    1859              :                        m_libspdm_local_buffer_size));
    1860            1 :         libspdm_dump_hex(m_libspdm_local_buffer, m_libspdm_local_buffer_size);
    1861            1 :         libspdm_hash_all(m_libspdm_use_hash_algo, m_libspdm_local_buffer,
    1862              :                          m_libspdm_local_buffer_size, hash_data);
    1863            1 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "HashDataSize (0x%x):\n",
    1864              :                        libspdm_get_hash_size(m_libspdm_use_hash_algo)));
    1865            1 :         libspdm_dump_hex(m_libspdm_local_buffer, m_libspdm_local_buffer_size);
    1866            1 :         libspdm_responder_data_sign(
    1867              :             spdm_context,
    1868            1 :             spdm_response->header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
    1869              :                 SPDM_MEASUREMENTS,
    1870              :                 m_libspdm_use_asym_algo, m_libspdm_use_pqc_asym_algo, m_libspdm_use_hash_algo,
    1871              :                 false, m_libspdm_local_buffer, m_libspdm_local_buffer_size,
    1872              :                 ptr, &sig_size);
    1873            1 :         ptr += sig_size;
    1874              : 
    1875            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
    1876              :                                               false, spdm_response_size,
    1877              :                                               spdm_response, response_size,
    1878              :                                               response);
    1879              :     }
    1880            1 :         return LIBSPDM_STATUS_SUCCESS;
    1881              : 
    1882            1 :     case 0x1B: {
    1883              :         spdm_measurements_response_t *spdm_response;
    1884              :         uint8_t *ptr;
    1885              :         uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
    1886              :         size_t sig_size;
    1887              :         size_t measurment_sig_size;
    1888              :         spdm_measurement_block_dmtf_t *measurment_block;
    1889              :         size_t spdm_response_size;
    1890              :         size_t transport_header_size;
    1891              :         size_t MissingBytes;
    1892            1 :         uint16_t opaque_size_test = SPDM_MAX_OPAQUE_DATA_SIZE;
    1893              : 
    1894            1 :         sig_size = libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    1895            1 :         MissingBytes = sig_size + 1;
    1896              : 
    1897              :         ((libspdm_context_t *)spdm_context)
    1898            1 :         ->connection_info.algorithm.base_asym_algo =
    1899              :             m_libspdm_use_asym_algo;
    1900              :         ((libspdm_context_t *)spdm_context)
    1901            1 :         ->connection_info.algorithm.base_hash_algo =
    1902              :             m_libspdm_use_hash_algo;
    1903              :         ((libspdm_context_t *)spdm_context)
    1904            1 :         ->connection_info.algorithm.measurement_hash_algo =
    1905              :             m_libspdm_use_measurement_hash_algo;
    1906            1 :         measurment_sig_size =
    1907              :             SPDM_NONCE_SIZE + sizeof(uint16_t) +
    1908            2 :             (opaque_size_test - MissingBytes) +
    1909            1 :             libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    1910            1 :         spdm_response_size = sizeof(spdm_measurements_response_t) +
    1911              :                              sizeof(spdm_measurement_block_dmtf_t) +
    1912            1 :                              libspdm_get_measurement_hash_size(
    1913            1 :             m_libspdm_use_measurement_hash_algo) +
    1914              :                              measurment_sig_size;
    1915            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1916            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1917              : 
    1918            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1919            1 :         spdm_response->header.request_response_code = SPDM_MEASUREMENTS;
    1920            1 :         spdm_response->header.param1 = 0;
    1921            1 :         spdm_response->header.param2 = 0;
    1922            1 :         spdm_response->number_of_blocks = 1;
    1923            1 :         libspdm_write_uint24(
    1924            1 :             spdm_response->measurement_record_length,
    1925              :             (uint32_t)(sizeof(spdm_measurement_block_dmtf_t) +
    1926            1 :                        libspdm_get_measurement_hash_size(
    1927              :                            m_libspdm_use_measurement_hash_algo)));
    1928            1 :         measurment_block = (void *)(spdm_response + 1);
    1929            1 :         libspdm_set_mem(measurment_block,
    1930              :                         sizeof(spdm_measurement_block_dmtf_t) +
    1931            1 :                         libspdm_get_measurement_hash_size(
    1932              :                             m_libspdm_use_measurement_hash_algo),
    1933              :                         1);
    1934              :         measurment_block->measurement_block_common_header
    1935            1 :         .measurement_specification =
    1936              :             SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    1937              :         measurment_block->measurement_block_common_header
    1938            1 :         .measurement_size =
    1939            1 :             (uint16_t)(sizeof(spdm_measurement_block_dmtf_header_t) +
    1940            1 :                        libspdm_get_measurement_hash_size(
    1941              :                            m_libspdm_use_measurement_hash_algo));
    1942            1 :         ptr = (void *)((uint8_t *)spdm_response + spdm_response_size -
    1943              :                        measurment_sig_size);
    1944            1 :         libspdm_get_random_number(SPDM_NONCE_SIZE, ptr);
    1945            1 :         ptr += SPDM_NONCE_SIZE;
    1946              : 
    1947            1 :         *(uint16_t *)ptr = opaque_size_test; /* opaque_length*/
    1948            1 :         ptr += sizeof(uint16_t);
    1949            1 :         libspdm_set_mem(ptr, opaque_size_test - MissingBytes, 255);
    1950            1 :         ptr += (opaque_size_test - MissingBytes);
    1951              : 
    1952            1 :         libspdm_copy_mem(&m_libspdm_local_buffer[m_libspdm_local_buffer_size],
    1953              :                          sizeof(m_libspdm_local_buffer)
    1954            1 :                          - (&m_libspdm_local_buffer[m_libspdm_local_buffer_size] -
    1955              :                             m_libspdm_local_buffer),
    1956            1 :                          spdm_response, (size_t)ptr - (size_t)spdm_response);
    1957            1 :         m_libspdm_local_buffer_size += ((size_t)ptr - (size_t)spdm_response);
    1958            1 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "m_libspdm_local_buffer_size (0x%zx):\n",
    1959              :                        m_libspdm_local_buffer_size));
    1960            1 :         libspdm_dump_hex(m_libspdm_local_buffer, m_libspdm_local_buffer_size);
    1961            1 :         libspdm_hash_all(m_libspdm_use_hash_algo, m_libspdm_local_buffer,
    1962              :                          m_libspdm_local_buffer_size, hash_data);
    1963            1 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "HashDataSize (0x%x):\n",
    1964              :                        libspdm_get_hash_size(m_libspdm_use_hash_algo)));
    1965            1 :         libspdm_dump_hex(m_libspdm_local_buffer, m_libspdm_local_buffer_size);
    1966            1 :         libspdm_responder_data_sign(
    1967              :             spdm_context,
    1968            1 :             spdm_response->header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
    1969              :                 SPDM_MEASUREMENTS,
    1970              :                 m_libspdm_use_asym_algo, m_libspdm_use_pqc_asym_algo, m_libspdm_use_hash_algo,
    1971              :                 false, m_libspdm_local_buffer, m_libspdm_local_buffer_size,
    1972              :                 ptr, &sig_size);
    1973            1 :         ptr += sig_size;
    1974              : 
    1975            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
    1976              :                                               false, spdm_response_size,
    1977              :                                               spdm_response, response_size,
    1978              :                                               response);
    1979              :     }
    1980            1 :         return LIBSPDM_STATUS_SUCCESS;
    1981              : 
    1982            1 :     case 0x1C: {
    1983              :         spdm_measurements_response_t *spdm_response;
    1984              :         uint8_t *ptr;
    1985              :         uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
    1986              :         size_t sig_size;
    1987              :         size_t measurment_sig_size;
    1988              :         spdm_measurement_block_dmtf_t *measurment_block;
    1989              :         size_t spdm_response_size;
    1990              :         size_t transport_header_size;
    1991            1 :         uint16_t opaque_size_test = SPDM_MAX_OPAQUE_DATA_SIZE / 2;
    1992            1 :         uint16_t opaque_informed_size = opaque_size_test - 1;
    1993              : 
    1994            1 :         sig_size = libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    1995              : 
    1996              :         ((libspdm_context_t *)spdm_context)
    1997            1 :         ->connection_info.algorithm.base_asym_algo =
    1998              :             m_libspdm_use_asym_algo;
    1999              :         ((libspdm_context_t *)spdm_context)
    2000            1 :         ->connection_info.algorithm.base_hash_algo =
    2001              :             m_libspdm_use_hash_algo;
    2002              :         ((libspdm_context_t *)spdm_context)
    2003            1 :         ->connection_info.algorithm.measurement_hash_algo =
    2004              :             m_libspdm_use_measurement_hash_algo;
    2005            1 :         measurment_sig_size =
    2006            2 :             SPDM_NONCE_SIZE + sizeof(uint16_t) + opaque_size_test +
    2007            1 :             libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    2008            1 :         spdm_response_size = sizeof(spdm_measurements_response_t) +
    2009              :                              sizeof(spdm_measurement_block_dmtf_t) +
    2010            1 :                              libspdm_get_measurement_hash_size(
    2011            1 :             m_libspdm_use_measurement_hash_algo) +
    2012              :                              measurment_sig_size;
    2013            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    2014            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    2015              : 
    2016            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    2017            1 :         spdm_response->header.request_response_code = SPDM_MEASUREMENTS;
    2018            1 :         spdm_response->header.param1 = 0;
    2019            1 :         spdm_response->header.param2 = 0;
    2020            1 :         spdm_response->number_of_blocks = 1;
    2021            1 :         libspdm_write_uint24(
    2022            1 :             spdm_response->measurement_record_length,
    2023              :             (uint32_t)(sizeof(spdm_measurement_block_dmtf_t) +
    2024            1 :                        libspdm_get_measurement_hash_size(
    2025              :                            m_libspdm_use_measurement_hash_algo)));
    2026            1 :         measurment_block = (void *)(spdm_response + 1);
    2027            1 :         libspdm_set_mem(measurment_block,
    2028              :                         sizeof(spdm_measurement_block_dmtf_t) +
    2029            1 :                         libspdm_get_measurement_hash_size(
    2030              :                             m_libspdm_use_measurement_hash_algo),
    2031              :                         1);
    2032              :         measurment_block->measurement_block_common_header
    2033            1 :         .measurement_specification =
    2034              :             SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    2035              :         measurment_block->measurement_block_common_header
    2036            1 :         .measurement_size =
    2037            1 :             (uint16_t)(sizeof(spdm_measurement_block_dmtf_header_t) +
    2038            1 :                        libspdm_get_measurement_hash_size(
    2039              :                            m_libspdm_use_measurement_hash_algo));
    2040            1 :         ptr = (void *)((uint8_t *)spdm_response + spdm_response_size -
    2041              :                        measurment_sig_size);
    2042            1 :         libspdm_get_random_number(SPDM_NONCE_SIZE, ptr);
    2043            1 :         ptr += SPDM_NONCE_SIZE;
    2044              : 
    2045            1 :         *(uint16_t *)ptr = opaque_informed_size; /* opaque_length*/
    2046            1 :         ptr += sizeof(uint16_t);
    2047            1 :         libspdm_set_mem(ptr, opaque_size_test, 255);
    2048            1 :         ptr += (opaque_size_test);
    2049              : 
    2050            1 :         libspdm_copy_mem(&m_libspdm_local_buffer[m_libspdm_local_buffer_size],
    2051              :                          sizeof(m_libspdm_local_buffer)
    2052            1 :                          - (&m_libspdm_local_buffer[m_libspdm_local_buffer_size] -
    2053              :                             m_libspdm_local_buffer),
    2054            1 :                          spdm_response, (size_t)ptr - (size_t)spdm_response);
    2055            1 :         m_libspdm_local_buffer_size += ((size_t)ptr - (size_t)spdm_response);
    2056            1 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "m_libspdm_local_buffer_size (0x%zx):\n",
    2057              :                        m_libspdm_local_buffer_size));
    2058            1 :         libspdm_dump_hex(m_libspdm_local_buffer, m_libspdm_local_buffer_size);
    2059            1 :         libspdm_hash_all(m_libspdm_use_hash_algo, m_libspdm_local_buffer,
    2060              :                          m_libspdm_local_buffer_size, hash_data);
    2061            1 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "HashDataSize (0x%x):\n",
    2062              :                        libspdm_get_hash_size(m_libspdm_use_hash_algo)));
    2063            1 :         libspdm_dump_hex(m_libspdm_local_buffer, m_libspdm_local_buffer_size);
    2064            1 :         libspdm_responder_data_sign(
    2065              :             spdm_context,
    2066            1 :             spdm_response->header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
    2067              :                 SPDM_MEASUREMENTS,
    2068              :                 m_libspdm_use_asym_algo, m_libspdm_use_pqc_asym_algo, m_libspdm_use_hash_algo,
    2069              :                 false, m_libspdm_local_buffer, m_libspdm_local_buffer_size,
    2070              :                 ptr, &sig_size);
    2071            1 :         ptr += sig_size;
    2072              : 
    2073            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
    2074              :                                               false, spdm_response_size,
    2075              :                                               spdm_response, response_size,
    2076              :                                               response);
    2077              :     }
    2078            1 :         return LIBSPDM_STATUS_SUCCESS;
    2079              : 
    2080            0 :     case 0x1D: {
    2081              :         spdm_measurements_response_t *spdm_response;
    2082              :         uint8_t *ptr;
    2083              :         spdm_measurement_block_dmtf_t *measurment_block;
    2084              :         size_t spdm_response_size;
    2085              :         size_t transport_header_size;
    2086            0 :         uint16_t opaque_size_test = SPDM_MAX_OPAQUE_DATA_SIZE / 2;
    2087            0 :         uint16_t opaque_informed_size = opaque_size_test - 1;
    2088              : 
    2089              :         ((libspdm_context_t *)spdm_context)
    2090            0 :         ->connection_info.algorithm.measurement_hash_algo =
    2091              :             m_libspdm_use_measurement_hash_algo;
    2092            0 :         spdm_response_size = sizeof(spdm_measurements_response_t) +
    2093              :                              sizeof(spdm_measurement_block_dmtf_t) +
    2094            0 :                              libspdm_get_measurement_hash_size(
    2095              :             m_libspdm_use_measurement_hash_algo) +
    2096              :                              SPDM_NONCE_SIZE +
    2097            0 :                              sizeof(uint16_t) + opaque_size_test;
    2098            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    2099            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    2100              : 
    2101            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    2102            0 :         spdm_response->header.request_response_code = SPDM_MEASUREMENTS;
    2103            0 :         spdm_response->header.param1 = 0;
    2104            0 :         spdm_response->header.param2 = 0;
    2105            0 :         spdm_response->number_of_blocks = 1;
    2106            0 :         libspdm_write_uint24(
    2107            0 :             spdm_response->measurement_record_length,
    2108              :             (uint32_t)(sizeof(spdm_measurement_block_dmtf_t) +
    2109            0 :                        libspdm_get_measurement_hash_size(
    2110              :                            m_libspdm_use_measurement_hash_algo)));
    2111            0 :         measurment_block = (void *)(spdm_response + 1);
    2112            0 :         libspdm_set_mem(measurment_block,
    2113              :                         sizeof(spdm_measurement_block_dmtf_t) +
    2114            0 :                         libspdm_get_measurement_hash_size(
    2115              :                             m_libspdm_use_measurement_hash_algo),
    2116              :                         1);
    2117              :         measurment_block->measurement_block_common_header
    2118            0 :         .measurement_specification =
    2119              :             SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    2120              :         measurment_block->measurement_block_common_header
    2121            0 :         .measurement_size =
    2122            0 :             (uint16_t)(sizeof(spdm_measurement_block_dmtf_header_t) +
    2123            0 :                        libspdm_get_measurement_hash_size(
    2124              :                            m_libspdm_use_measurement_hash_algo));
    2125              :         /* adding extra fields: opaque_length, opaque_data*/
    2126            0 :         ptr = (void *)((uint8_t *)spdm_response +
    2127              :                        sizeof(spdm_measurements_response_t) +
    2128            0 :                        sizeof(spdm_measurement_block_dmtf_t) +
    2129            0 :                        libspdm_get_measurement_hash_size(
    2130              :                            m_libspdm_use_measurement_hash_algo));
    2131            0 :         libspdm_get_random_number (SPDM_NONCE_SIZE, ptr);
    2132            0 :         ptr += SPDM_NONCE_SIZE;
    2133            0 :         *(uint16_t *)ptr = opaque_informed_size; /* opaque_length*/
    2134            0 :         ptr += sizeof(uint16_t);
    2135            0 :         libspdm_set_mem(ptr, opaque_size_test, 255);
    2136            0 :         ptr += opaque_size_test;
    2137              : 
    2138            0 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
    2139              :                                               false, spdm_response_size,
    2140              :                                               spdm_response, response_size,
    2141              :                                               response);
    2142              :     }
    2143            0 :         return LIBSPDM_STATUS_SUCCESS;
    2144              : 
    2145            0 :     case 0x1E: {
    2146              :         spdm_measurements_response_t *spdm_response;
    2147              :         uint8_t *ptr;
    2148              :         spdm_measurement_block_dmtf_t *measurment_block;
    2149              :         size_t spdm_response_size;
    2150              :         size_t transport_header_size;
    2151            0 :         uint16_t opaque_size_test = 0xFFFF;
    2152            0 :         uint16_t opaque_informed_size = SPDM_MAX_OPAQUE_DATA_SIZE / 2;
    2153              : 
    2154              :         ((libspdm_context_t *)spdm_context)
    2155            0 :         ->connection_info.algorithm.measurement_hash_algo =
    2156              :             m_libspdm_use_measurement_hash_algo;
    2157            0 :         spdm_response_size = sizeof(spdm_measurements_response_t) +
    2158              :                              sizeof(spdm_measurement_block_dmtf_t) +
    2159            0 :                              libspdm_get_measurement_hash_size(
    2160              :             m_libspdm_use_measurement_hash_algo) +
    2161              :                              SPDM_NONCE_SIZE +
    2162            0 :                              sizeof(uint16_t) + opaque_size_test;
    2163            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    2164            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    2165              : 
    2166            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    2167            0 :         spdm_response->header.request_response_code = SPDM_MEASUREMENTS;
    2168            0 :         spdm_response->header.param1 = 0;
    2169            0 :         spdm_response->header.param2 = 0;
    2170            0 :         spdm_response->number_of_blocks = 1;
    2171            0 :         libspdm_write_uint24(
    2172            0 :             spdm_response->measurement_record_length,
    2173              :             (uint32_t)(sizeof(spdm_measurement_block_dmtf_t) +
    2174            0 :                        libspdm_get_measurement_hash_size(
    2175              :                            m_libspdm_use_measurement_hash_algo)));
    2176            0 :         measurment_block = (void *)(spdm_response + 1);
    2177            0 :         libspdm_set_mem(measurment_block,
    2178              :                         sizeof(spdm_measurement_block_dmtf_t) +
    2179            0 :                         libspdm_get_measurement_hash_size(
    2180              :                             m_libspdm_use_measurement_hash_algo),
    2181              :                         1);
    2182              :         measurment_block->measurement_block_common_header
    2183            0 :         .measurement_specification =
    2184              :             SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    2185              :         measurment_block->measurement_block_common_header
    2186            0 :         .measurement_size =
    2187            0 :             (uint16_t)(sizeof(spdm_measurement_block_dmtf_header_t) +
    2188            0 :                        libspdm_get_measurement_hash_size(
    2189              :                            m_libspdm_use_measurement_hash_algo));
    2190              :         /* adding extra fields: NONCE, opaque_length, opaque_data*/
    2191            0 :         ptr = (void *)((uint8_t *)spdm_response +
    2192              :                        sizeof(spdm_measurements_response_t) +
    2193            0 :                        sizeof(spdm_measurement_block_dmtf_t) +
    2194            0 :                        libspdm_get_measurement_hash_size(
    2195              :                            m_libspdm_use_measurement_hash_algo));
    2196            0 :         ptr += SPDM_NONCE_SIZE;
    2197            0 :         *(uint16_t *)ptr = opaque_informed_size; /* opaque_length*/
    2198            0 :         ptr += sizeof(uint16_t);
    2199            0 :         libspdm_set_mem(ptr, opaque_size_test, 255);
    2200            0 :         ptr += opaque_size_test;
    2201              : 
    2202            0 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
    2203              :                                               false, spdm_response_size,
    2204              :                                               spdm_response, response_size,
    2205              :                                               response);
    2206              :     }
    2207            0 :         return LIBSPDM_STATUS_SUCCESS;
    2208              : 
    2209            0 :     case 0x1F: {
    2210              :         spdm_measurements_response_t *spdm_response;
    2211              :         uint8_t *ptr;
    2212              :         spdm_measurement_block_dmtf_t *measurment_block;
    2213              :         size_t spdm_response_size;
    2214              :         size_t transport_header_size;
    2215            0 :         uint16_t opaque_size_test = 0xFFFF;
    2216              : 
    2217              :         ((libspdm_context_t *)spdm_context)
    2218            0 :         ->connection_info.algorithm.measurement_hash_algo =
    2219              :             m_libspdm_use_measurement_hash_algo;
    2220            0 :         spdm_response_size = sizeof(spdm_measurements_response_t) +
    2221              :                              sizeof(spdm_measurement_block_dmtf_t) +
    2222            0 :                              libspdm_get_measurement_hash_size(
    2223              :             m_libspdm_use_measurement_hash_algo) +
    2224            0 :                              SPDM_NONCE_SIZE + sizeof(uint16_t) +
    2225              :                              opaque_size_test;
    2226            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    2227            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    2228              : 
    2229            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    2230            0 :         spdm_response->header.request_response_code = SPDM_MEASUREMENTS;
    2231            0 :         spdm_response->header.param1 = 0;
    2232            0 :         spdm_response->header.param2 = 0;
    2233            0 :         spdm_response->number_of_blocks = 1;
    2234            0 :         libspdm_write_uint24(
    2235            0 :             spdm_response->measurement_record_length,
    2236              :             (uint32_t)(sizeof(spdm_measurement_block_dmtf_t) +
    2237            0 :                        libspdm_get_measurement_hash_size(
    2238              :                            m_libspdm_use_measurement_hash_algo)));
    2239            0 :         measurment_block = (void *)(spdm_response + 1);
    2240            0 :         libspdm_set_mem(measurment_block,
    2241              :                         sizeof(spdm_measurement_block_dmtf_t) +
    2242            0 :                         libspdm_get_measurement_hash_size(
    2243              :                             m_libspdm_use_measurement_hash_algo),
    2244              :                         1);
    2245              :         measurment_block->measurement_block_common_header
    2246            0 :         .measurement_specification =
    2247              :             SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    2248              :         measurment_block->measurement_block_common_header
    2249            0 :         .measurement_size =
    2250            0 :             (uint16_t)(sizeof(spdm_measurement_block_dmtf_header_t) +
    2251            0 :                        libspdm_get_measurement_hash_size(
    2252              :                            m_libspdm_use_measurement_hash_algo));
    2253              :         /* adding extra fields: NONCE, opaque_length, opaque_data*/
    2254            0 :         ptr = (void *)((uint8_t *)spdm_response +
    2255              :                        sizeof(spdm_measurements_response_t) +
    2256            0 :                        sizeof(spdm_measurement_block_dmtf_t) +
    2257            0 :                        libspdm_get_measurement_hash_size(
    2258              :                            m_libspdm_use_measurement_hash_algo));
    2259            0 :         libspdm_get_random_number(SPDM_NONCE_SIZE, ptr);
    2260            0 :         ptr += SPDM_NONCE_SIZE;
    2261            0 :         *(uint16_t *)ptr = (opaque_size_test); /* opaque_length*/
    2262            0 :         ptr += sizeof(uint16_t);
    2263            0 :         libspdm_set_mem(ptr, (opaque_size_test), 255);
    2264            0 :         ptr += (opaque_size_test);
    2265              : 
    2266            0 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
    2267              :                                               false, spdm_response_size,
    2268              :                                               spdm_response, response_size,
    2269              :                                               response);
    2270              :     }
    2271            0 :         return LIBSPDM_STATUS_SUCCESS;
    2272              : 
    2273            0 :     case 0x20: {
    2274              :         spdm_measurements_response_t *spdm_response;
    2275              :         spdm_measurement_block_dmtf_t *measurment_block;
    2276              :         size_t spdm_response_size;
    2277              :         size_t transport_header_size;
    2278              :         uint8_t *ptr;
    2279              :         ((libspdm_context_t *)spdm_context)
    2280            0 :         ->connection_info.algorithm.measurement_hash_algo =
    2281              :             m_libspdm_use_measurement_hash_algo;
    2282            0 :         spdm_response_size = sizeof(spdm_measurements_response_t) +
    2283              :                              2 * (sizeof(spdm_measurement_block_dmtf_t) +
    2284            0 :                                   libspdm_get_measurement_hash_size(
    2285            0 :                                       m_libspdm_use_measurement_hash_algo)) +
    2286              :                              SPDM_NONCE_SIZE;
    2287            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    2288            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    2289              : 
    2290            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    2291            0 :         spdm_response->header.request_response_code = SPDM_MEASUREMENTS;
    2292            0 :         spdm_response->header.param1 = 0;
    2293            0 :         spdm_response->header.param2 = 0;
    2294            0 :         spdm_response->number_of_blocks = 2;
    2295            0 :         *(uint32_t *)spdm_response->measurement_record_length =
    2296            0 :             2 * ((uint32_t)(sizeof(spdm_measurement_block_dmtf_t) +
    2297            0 :                             libspdm_get_measurement_hash_size(
    2298              :                                 m_libspdm_use_measurement_hash_algo)));
    2299            0 :         measurment_block = (void *)(spdm_response + 1);
    2300            0 :         libspdm_set_mem(measurment_block,
    2301            0 :                         2 * (sizeof(spdm_measurement_block_dmtf_t) +
    2302            0 :                              libspdm_get_measurement_hash_size(
    2303              :                                  m_libspdm_use_measurement_hash_algo)),
    2304              :                         1);
    2305            0 :         measurment_block->measurement_block_common_header.index = 1;
    2306              :         measurment_block->measurement_block_common_header
    2307            0 :         .measurement_specification =
    2308              :             SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    2309              :         measurment_block->measurement_block_common_header
    2310            0 :         .measurement_size =
    2311            0 :             (uint16_t)(sizeof(spdm_measurement_block_dmtf_header_t) +
    2312            0 :                        libspdm_get_measurement_hash_size(
    2313              :                            m_libspdm_use_measurement_hash_algo));
    2314            0 :         measurment_block =
    2315              :             (void *)(((uint8_t *)measurment_block) +
    2316            0 :                      (sizeof(spdm_measurement_block_dmtf_t) +
    2317            0 :                       libspdm_get_measurement_hash_size(
    2318              :                           m_libspdm_use_measurement_hash_algo)));
    2319            0 :         measurment_block->measurement_block_common_header.index = 2;
    2320              :         measurment_block->measurement_block_common_header
    2321            0 :         .measurement_specification =
    2322              :             SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    2323              :         measurment_block->measurement_block_common_header
    2324            0 :         .measurement_size =
    2325            0 :             (uint16_t)(sizeof(spdm_measurement_block_dmtf_header_t) +
    2326            0 :                        libspdm_get_measurement_hash_size(
    2327              :                            m_libspdm_use_measurement_hash_algo));
    2328            0 :         ptr =  (uint8_t *)spdm_response + spdm_response_size - SPDM_NONCE_SIZE;
    2329            0 :         libspdm_get_random_number(SPDM_NONCE_SIZE,ptr);
    2330            0 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
    2331              :                                               false, spdm_response_size,
    2332              :                                               spdm_response, response_size,
    2333              :                                               response);
    2334              :     }
    2335            0 :         return LIBSPDM_STATUS_SUCCESS;
    2336              : 
    2337           18 :     case 0x21:
    2338              :     {
    2339              :         static uint16_t error_code = LIBSPDM_ERROR_CODE_RESERVED_00;
    2340              : 
    2341              :         spdm_error_response_t *spdm_response;
    2342              :         size_t spdm_response_size;
    2343              :         size_t transport_header_size;
    2344              : 
    2345           18 :         spdm_response_size = sizeof(spdm_error_response_t);
    2346           18 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    2347           18 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    2348              : 
    2349           18 :         if(error_code <= 0xff) {
    2350           18 :             libspdm_zero_mem (spdm_response, spdm_response_size);
    2351           18 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    2352           18 :             spdm_response->header.request_response_code = SPDM_ERROR;
    2353           18 :             spdm_response->header.param1 = (uint8_t) error_code;
    2354           18 :             spdm_response->header.param2 = 0;
    2355              : 
    2356           18 :             libspdm_transport_test_encode_message (spdm_context, NULL, false, false,
    2357              :                                                    spdm_response_size, spdm_response,
    2358              :                                                    response_size, response);
    2359              :         }
    2360              : 
    2361           18 :         error_code++;
    2362           18 :         if(error_code == SPDM_ERROR_CODE_BUSY) { /*busy is treated in cases 5 and 6*/
    2363            1 :             error_code = SPDM_ERROR_CODE_UNEXPECTED_REQUEST;
    2364              :         }
    2365           18 :         if(error_code == LIBSPDM_ERROR_CODE_RESERVED_0D) { /*skip some reserved error codes (0d to 3e)*/
    2366            1 :             error_code = LIBSPDM_ERROR_CODE_RESERVED_3F;
    2367              :         }
    2368           18 :         if(error_code == SPDM_ERROR_CODE_RESPONSE_NOT_READY) { /*skip response not ready, request resync, and some reserved codes (44 to fc)*/
    2369            1 :             error_code = LIBSPDM_ERROR_CODE_RESERVED_FD;
    2370              :         }
    2371              :     }
    2372           18 :         return LIBSPDM_STATUS_SUCCESS;
    2373            0 :     case 0x22: {
    2374              :         spdm_measurements_response_t *spdm_response;
    2375              :         uint8_t *ptr;
    2376              :         uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
    2377              :         size_t sig_size;
    2378              :         size_t measurment_sig_size;
    2379              :         spdm_measurement_block_dmtf_t *measurment_block;
    2380              :         size_t spdm_response_size;
    2381              :         size_t transport_header_size;
    2382              :         uint32_t session_id;
    2383              :         libspdm_session_info_t *session_info;
    2384              :         uint8_t *scratch_buffer;
    2385              :         size_t scratch_buffer_size;
    2386              : 
    2387            0 :         session_id = 0xFFFFFFFF;
    2388              :         ((libspdm_context_t *)spdm_context)
    2389            0 :         ->connection_info.algorithm.base_asym_algo =
    2390              :             m_libspdm_use_asym_algo;
    2391              :         ((libspdm_context_t *)spdm_context)
    2392            0 :         ->connection_info.algorithm.base_hash_algo =
    2393              :             m_libspdm_use_hash_algo;
    2394              :         ((libspdm_context_t *)spdm_context)
    2395            0 :         ->connection_info.algorithm.measurement_hash_algo =
    2396              :             m_libspdm_use_measurement_hash_algo;
    2397            0 :         measurment_sig_size =
    2398              :             SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
    2399            0 :             libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    2400            0 :         spdm_response_size = sizeof(spdm_measurements_response_t) +
    2401              :                              sizeof(spdm_measurement_block_dmtf_t) +
    2402            0 :                              libspdm_get_measurement_hash_size(
    2403            0 :             m_libspdm_use_measurement_hash_algo) +
    2404              :                              measurment_sig_size;
    2405            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    2406            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    2407              : 
    2408            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    2409            0 :         spdm_response->header.request_response_code = SPDM_MEASUREMENTS;
    2410            0 :         spdm_response->header.param1 = 0;
    2411            0 :         spdm_response->header.param2 = 0;
    2412            0 :         spdm_response->number_of_blocks = 1;
    2413            0 :         libspdm_write_uint24(
    2414            0 :             spdm_response->measurement_record_length,
    2415              :             (uint32_t)(sizeof(spdm_measurement_block_dmtf_t) +
    2416            0 :                        libspdm_get_measurement_hash_size(
    2417              :                            m_libspdm_use_measurement_hash_algo)));
    2418            0 :         measurment_block = (void *)(spdm_response + 1);
    2419            0 :         libspdm_set_mem(measurment_block,
    2420              :                         sizeof(spdm_measurement_block_dmtf_t) +
    2421            0 :                         libspdm_get_measurement_hash_size(
    2422              :                             m_libspdm_use_measurement_hash_algo),
    2423              :                         1);
    2424              :         measurment_block->measurement_block_common_header
    2425            0 :         .measurement_specification =
    2426              :             SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    2427              :         measurment_block->measurement_block_common_header
    2428            0 :         .measurement_size =
    2429            0 :             (uint16_t)(sizeof(spdm_measurement_block_dmtf_header_t) +
    2430            0 :                        libspdm_get_measurement_hash_size(
    2431              :                            m_libspdm_use_measurement_hash_algo));
    2432            0 :         ptr = (void *)((uint8_t *)spdm_response + spdm_response_size -
    2433              :                        measurment_sig_size);
    2434            0 :         libspdm_get_random_number(SPDM_NONCE_SIZE, ptr);
    2435            0 :         ptr += SPDM_NONCE_SIZE;
    2436            0 :         *(uint16_t *)ptr = 0;
    2437            0 :         ptr += sizeof(uint16_t);
    2438            0 :         libspdm_copy_mem(&m_libspdm_local_buffer[m_libspdm_local_buffer_size],
    2439              :                          sizeof(m_libspdm_local_buffer)
    2440            0 :                          - (&m_libspdm_local_buffer[m_libspdm_local_buffer_size] -
    2441              :                             m_libspdm_local_buffer),
    2442            0 :                          spdm_response, (size_t)ptr - (size_t)spdm_response);
    2443            0 :         m_libspdm_local_buffer_size += ((size_t)ptr - (size_t)spdm_response);
    2444            0 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "m_libspdm_local_buffer_size (0x%zx):\n",
    2445              :                        m_libspdm_local_buffer_size));
    2446            0 :         libspdm_dump_hex(m_libspdm_local_buffer, m_libspdm_local_buffer_size);
    2447            0 :         libspdm_hash_all(m_libspdm_use_hash_algo, m_libspdm_local_buffer,
    2448              :                          m_libspdm_local_buffer_size, hash_data);
    2449            0 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "HashDataSize (0x%x):\n",
    2450              :                        libspdm_get_hash_size(m_libspdm_use_hash_algo)));
    2451            0 :         libspdm_dump_hex(m_libspdm_local_buffer, m_libspdm_local_buffer_size);
    2452            0 :         sig_size = libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    2453            0 :         libspdm_responder_data_sign(
    2454              :             spdm_context,
    2455            0 :             spdm_response->header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
    2456              :                 SPDM_MEASUREMENTS,
    2457              :                 m_libspdm_use_asym_algo, m_libspdm_use_pqc_asym_algo, m_libspdm_use_hash_algo,
    2458              :                 false, m_libspdm_local_buffer, m_libspdm_local_buffer_size,
    2459              :                 ptr, &sig_size);
    2460            0 :         ptr += sig_size;
    2461              : 
    2462              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    2463              :          * transport_message is always in sender buffer. */
    2464            0 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
    2465            0 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
    2466              :                           scratch_buffer_size - transport_header_size,
    2467              :                           spdm_response, spdm_response_size);
    2468            0 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
    2469            0 :         libspdm_transport_test_encode_message(spdm_context, &session_id, false,
    2470              :                                               false, spdm_response_size,
    2471              :                                               spdm_response, response_size,
    2472              :                                               response);
    2473            0 :         session_info = libspdm_get_session_info_via_session_id(
    2474              :             spdm_context, session_id);
    2475            0 :         if (session_info == NULL) {
    2476            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    2477              :         }
    2478              :         /* WALKAROUND: If just use single context to encode message and then decode message */
    2479              :         ((libspdm_secured_message_context_t
    2480            0 :           *)(session_info->secured_message_context))
    2481            0 :         ->application_secret.response_data_sequence_number--;
    2482              :     }
    2483            0 :         return LIBSPDM_STATUS_SUCCESS;
    2484              : 
    2485            0 :     case 0x23: {
    2486              :         spdm_measurements_response_t *spdm_response;
    2487              :         spdm_measurement_block_dmtf_t *measurment_block;
    2488              :         uint8_t temp_buf[LIBSPDM_RECEIVER_BUFFER_SIZE];
    2489              :         size_t temp_buf_size;
    2490              :         uint8_t* temp_buf_ptr;
    2491              : 
    2492              :         uint8_t *ptr;
    2493            0 :         ((libspdm_context_t *)spdm_context)->connection_info.algorithm.measurement_hash_algo =
    2494              :             m_libspdm_use_measurement_hash_algo;
    2495            0 :         temp_buf_size = sizeof(spdm_measurements_response_t) +
    2496              :                         sizeof(spdm_measurement_block_dmtf_t) +
    2497            0 :                         libspdm_get_measurement_hash_size(m_libspdm_use_measurement_hash_algo) +
    2498              :                         SPDM_NONCE_SIZE + sizeof(uint16_t);
    2499            0 :         temp_buf_ptr = temp_buf + sizeof(libspdm_test_message_header_t);
    2500            0 :         spdm_response = (void *)temp_buf_ptr;
    2501              : 
    2502            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    2503            0 :         spdm_response->header.request_response_code = SPDM_MEASUREMENTS;
    2504            0 :         spdm_response->header.param1 = 0;
    2505            0 :         spdm_response->header.param2 = 0;
    2506            0 :         spdm_response->number_of_blocks = 1;
    2507            0 :         libspdm_write_uint24(spdm_response->measurement_record_length,
    2508              :                              (uint32_t)(sizeof(spdm_measurement_block_dmtf_t) +
    2509            0 :                                         libspdm_get_measurement_hash_size(
    2510              :                                             m_libspdm_use_measurement_hash_algo)));
    2511            0 :         measurment_block = (void *)(spdm_response + 1);
    2512            0 :         libspdm_set_mem(measurment_block,
    2513              :                         sizeof(spdm_measurement_block_dmtf_t) +
    2514            0 :                         libspdm_get_measurement_hash_size(m_libspdm_use_measurement_hash_algo),
    2515              :                         1);
    2516            0 :         measurment_block->measurement_block_common_header.measurement_specification =
    2517              :             SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    2518            0 :         measurment_block->measurement_block_common_header.measurement_size =
    2519            0 :             (uint16_t)(sizeof(spdm_measurement_block_dmtf_header_t) +
    2520            0 :                        libspdm_get_measurement_hash_size(m_libspdm_use_measurement_hash_algo));
    2521              : 
    2522            0 :         ptr = (uint8_t *)spdm_response +
    2523              :               sizeof(spdm_measurements_response_t) +
    2524            0 :               sizeof(spdm_measurement_block_dmtf_t) +
    2525            0 :               libspdm_get_measurement_hash_size(m_libspdm_use_measurement_hash_algo);
    2526            0 :         libspdm_get_random_number(SPDM_NONCE_SIZE,ptr);
    2527            0 :         *(uint16_t *)(ptr + SPDM_NONCE_SIZE) = 0;
    2528              : 
    2529            0 :         libspdm_copy_mem(&m_libspdm_local_buffer[m_libspdm_local_buffer_size],
    2530              :                          sizeof(m_libspdm_local_buffer) - m_libspdm_local_buffer_size,
    2531              :                          temp_buf_ptr, temp_buf_size);
    2532            0 :         m_libspdm_local_buffer_size += temp_buf_size;
    2533              : 
    2534            0 :         libspdm_transport_test_encode_message(spdm_context, NULL, false, false,
    2535              :                                               temp_buf_size, temp_buf_ptr,
    2536              :                                               response_size, response);
    2537              :     }
    2538            0 :         return LIBSPDM_STATUS_SUCCESS;
    2539              : 
    2540            0 :     case 0x24: {
    2541              :         spdm_measurements_response_t *spdm_response;
    2542              :         uint8_t *ptr;
    2543              :         uint8_t hash_data[LIBSPDM_MAX_HASH_SIZE];
    2544              :         size_t sig_size;
    2545              :         size_t measurment_sig_size;
    2546              :         spdm_measurement_block_dmtf_t *measurment_block;
    2547              :         size_t spdm_response_size;
    2548              :         size_t transport_header_size;
    2549              : 
    2550              :         ((libspdm_context_t *)spdm_context)
    2551            0 :         ->connection_info.algorithm.base_asym_algo =
    2552              :             m_libspdm_use_asym_algo;
    2553              :         ((libspdm_context_t *)spdm_context)
    2554            0 :         ->connection_info.algorithm.base_hash_algo =
    2555              :             m_libspdm_use_hash_algo;
    2556              :         ((libspdm_context_t *)spdm_context)
    2557            0 :         ->connection_info.algorithm.measurement_hash_algo =
    2558              :             m_libspdm_use_measurement_hash_algo;
    2559            0 :         measurment_sig_size =
    2560              :             SPDM_NONCE_SIZE + sizeof(uint16_t) + 0 +
    2561            0 :             libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    2562            0 :         spdm_response_size = sizeof(spdm_measurements_response_t) +
    2563              :                              sizeof(spdm_measurement_block_dmtf_t) +
    2564            0 :                              libspdm_get_measurement_hash_size(
    2565            0 :             m_libspdm_use_measurement_hash_algo) +
    2566              :                              measurment_sig_size;
    2567            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    2568            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    2569              : 
    2570            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    2571            0 :         spdm_response->header.request_response_code = SPDM_MEASUREMENTS;
    2572            0 :         spdm_response->header.param1 = 0;
    2573            0 :         spdm_response->header.param2 = 0;
    2574            0 :         spdm_response->number_of_blocks = 1;
    2575            0 :         libspdm_write_uint24(
    2576            0 :             spdm_response->measurement_record_length,
    2577              :             (uint32_t)(sizeof(spdm_measurement_block_dmtf_t) +
    2578            0 :                        libspdm_get_measurement_hash_size(
    2579              :                            m_libspdm_use_measurement_hash_algo)));
    2580            0 :         measurment_block = (void *)(spdm_response + 1);
    2581            0 :         libspdm_set_mem(measurment_block,
    2582              :                         sizeof(spdm_measurement_block_dmtf_t) +
    2583            0 :                         libspdm_get_measurement_hash_size(
    2584              :                             m_libspdm_use_measurement_hash_algo),
    2585              :                         1);
    2586              :         measurment_block->measurement_block_common_header
    2587            0 :         .measurement_specification =
    2588              :             SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    2589              :         measurment_block->measurement_block_common_header
    2590            0 :         .measurement_size =
    2591            0 :             (uint16_t)(sizeof(spdm_measurement_block_dmtf_header_t) +
    2592            0 :                        libspdm_get_measurement_hash_size(
    2593              :                            m_libspdm_use_measurement_hash_algo));
    2594            0 :         ptr = (void *)((uint8_t *)spdm_response + spdm_response_size -
    2595              :                        measurment_sig_size);
    2596            0 :         libspdm_get_random_number(SPDM_NONCE_SIZE, ptr);
    2597            0 :         ptr += SPDM_NONCE_SIZE;
    2598            0 :         *(uint16_t *)ptr = 0;
    2599            0 :         ptr += sizeof(uint16_t);
    2600            0 :         libspdm_copy_mem(&m_libspdm_local_buffer[m_libspdm_local_buffer_size],
    2601              :                          sizeof(m_libspdm_local_buffer)
    2602            0 :                          - (&m_libspdm_local_buffer[m_libspdm_local_buffer_size] -
    2603              :                             m_libspdm_local_buffer),
    2604            0 :                          spdm_response, (size_t)ptr - (size_t)spdm_response);
    2605            0 :         m_libspdm_local_buffer_size += ((size_t)ptr - (size_t)spdm_response);
    2606            0 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "m_libspdm_local_buffer_size (0x%zx):\n",
    2607              :                        m_libspdm_local_buffer_size));
    2608            0 :         libspdm_dump_hex(m_libspdm_local_buffer, m_libspdm_local_buffer_size);
    2609            0 :         libspdm_hash_all(m_libspdm_use_hash_algo, m_libspdm_local_buffer,
    2610              :                          m_libspdm_local_buffer_size, hash_data);
    2611            0 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "HashDataSize (0x%x):\n",
    2612              :                        libspdm_get_hash_size(m_libspdm_use_hash_algo)));
    2613            0 :         libspdm_dump_hex(m_libspdm_local_buffer, m_libspdm_local_buffer_size);
    2614            0 :         sig_size = libspdm_get_asym_signature_size(m_libspdm_use_asym_algo);
    2615            0 :         libspdm_responder_data_sign(
    2616              :             spdm_context,
    2617            0 :             spdm_response->header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
    2618              :                 SPDM_MEASUREMENTS,
    2619              :                 m_libspdm_use_asym_algo, m_libspdm_use_pqc_asym_algo, m_libspdm_use_hash_algo,
    2620              :                 false, m_libspdm_local_buffer, m_libspdm_local_buffer_size,
    2621              :                 ptr, &sig_size);
    2622            0 :         ptr += sig_size;
    2623              : 
    2624            0 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
    2625              :                                               false, spdm_response_size,
    2626              :                                               spdm_response, response_size,
    2627              :                                               response);
    2628              :     }
    2629            0 :         return LIBSPDM_STATUS_SUCCESS;
    2630            0 :     case 0x25: {
    2631              :         spdm_measurements_response_t *spdm_response;
    2632              :         size_t spdm_response_size;
    2633              :         size_t transport_header_size;
    2634              :         uint8_t *ptr;
    2635            0 :         spdm_response_size =
    2636              :             sizeof(spdm_measurements_response_t)
    2637              :             + SPDM_NONCE_SIZE + sizeof(uint16_t);
    2638            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    2639            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    2640            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    2641            0 :         spdm_response->header.request_response_code = SPDM_MEASUREMENTS;
    2642            0 :         spdm_response->header.param1 = 4;
    2643            0 :         spdm_response->header.param2 = 0;
    2644            0 :         spdm_response->number_of_blocks = 0;
    2645            0 :         libspdm_write_uint24(spdm_response->measurement_record_length, 0);
    2646              : 
    2647            0 :         ptr = (uint8_t *)spdm_response +
    2648              :               sizeof(spdm_measurements_response_t);
    2649            0 :         libspdm_get_random_number(SPDM_NONCE_SIZE,ptr);
    2650            0 :         ptr += SPDM_NONCE_SIZE;
    2651            0 :         *(uint16_t *)ptr = 0;
    2652              : 
    2653            0 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
    2654              :                                               false, spdm_response_size,
    2655              :                                               spdm_response, response_size,
    2656              :                                               response);
    2657              :     }
    2658            0 :         return LIBSPDM_STATUS_SUCCESS;
    2659              : 
    2660            0 :     default:
    2661            0 :         return LIBSPDM_STATUS_RECEIVE_FAIL;
    2662              :     }
    2663              : }
    2664              : 
    2665              : /**
    2666              :  * Test 1: message could not be sent
    2667              :  * Expected Behavior: get a RETURN_DEVICE_ERROR return code, with an empty transcript.message_m
    2668              :  **/
    2669            1 : static void libspdm_test_requester_get_measurements_err_case1(void **state)
    2670              : {
    2671              :     libspdm_return_t status;
    2672              :     libspdm_test_context_t *spdm_test_context;
    2673              :     libspdm_context_t *spdm_context;
    2674              :     uint8_t number_of_block;
    2675              :     uint32_t measurement_record_length;
    2676              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
    2677              :     uint8_t request_attribute;
    2678              :     void *data;
    2679              :     size_t data_size;
    2680              :     void *hash;
    2681              :     size_t hash_size;
    2682              : 
    2683            1 :     spdm_test_context = *state;
    2684            1 :     spdm_context = spdm_test_context->spdm_context;
    2685            1 :     spdm_test_context->case_id = 0x1;
    2686            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    2687              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    2688            1 :     spdm_context->connection_info.connection_state =
    2689              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    2690            1 :     spdm_context->connection_info.capability.flags |=
    2691              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    2692            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    2693              :                                                          m_libspdm_use_asym_algo, &data,
    2694              :                                                          &data_size, &hash, &hash_size)) {
    2695            0 :         assert(false);
    2696              :     }
    2697            1 :     libspdm_reset_message_m(spdm_context, NULL);
    2698            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    2699              :         m_libspdm_use_measurement_spec;
    2700            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    2701              :         m_libspdm_use_measurement_hash_algo;
    2702            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    2703              :         m_libspdm_use_hash_algo;
    2704            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    2705              :         m_libspdm_use_asym_algo;
    2706            1 :     spdm_context->local_context.algorithm.measurement_spec =
    2707              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    2708              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    2709              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    2710              :         data_size;
    2711              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    2712              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    2713              :                      data, data_size);
    2714              : #else
    2715            1 :     libspdm_hash_all(
    2716              :         spdm_context->connection_info.algorithm.base_hash_algo,
    2717              :         data, data_size,
    2718            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
    2719            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
    2720            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
    2721            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
    2722              :         spdm_context->connection_info.algorithm.base_hash_algo,
    2723              :         spdm_context->connection_info.algorithm.base_asym_algo,
    2724              :         data, data_size,
    2725              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
    2726              : #endif
    2727              : 
    2728            1 :     request_attribute =
    2729              :         SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE;
    2730              : 
    2731            1 :     measurement_record_length = sizeof(measurement_record);
    2732            1 :     status = libspdm_get_measurement(spdm_context, NULL, request_attribute, 1,
    2733              :                                      0, NULL, &number_of_block,
    2734              :                                      &measurement_record_length,
    2735              :                                      measurement_record);
    2736            1 :     assert_int_equal(status, LIBSPDM_STATUS_SEND_FAIL);
    2737              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    2738              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
    2739              : #endif
    2740            1 :     free(data);
    2741            1 : }
    2742              : 
    2743              : /**
    2744              :  * Test 2: Responder does not support measurements.
    2745              :  * Expected Behavior: Returns with LIBSPDM_STATUS_UNSUPPORTED_CAP.
    2746              :  **/
    2747            1 : static void libspdm_test_requester_get_measurements_err_case2(void **state)
    2748              : {
    2749              :     libspdm_return_t status;
    2750              :     libspdm_test_context_t *spdm_test_context;
    2751              :     libspdm_context_t *spdm_context;
    2752              :     uint8_t number_of_block;
    2753              :     uint32_t measurement_record_length;
    2754              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
    2755              :     uint8_t request_attribute;
    2756              :     void *data;
    2757              :     size_t data_size;
    2758              :     void *hash;
    2759              :     size_t hash_size;
    2760              : 
    2761            1 :     spdm_test_context = *state;
    2762            1 :     spdm_context = spdm_test_context->spdm_context;
    2763            1 :     spdm_test_context->case_id = 0x2;
    2764            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    2765              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    2766            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    2767            1 :     spdm_context->connection_info.capability.flags = 0;
    2768            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    2769              :                                                          m_libspdm_use_asym_algo, &data,
    2770              :                                                          &data_size, &hash, &hash_size)) {
    2771            0 :         assert(false);
    2772              :     }
    2773            1 :     libspdm_reset_message_m(spdm_context, NULL);
    2774            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    2775              :         m_libspdm_use_measurement_spec;
    2776            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    2777              :         m_libspdm_use_measurement_hash_algo;
    2778            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    2779            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    2780            1 :     spdm_context->local_context.algorithm.measurement_spec =
    2781              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    2782              : 
    2783            1 :     request_attribute = SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE;
    2784              : 
    2785            1 :     measurement_record_length = sizeof(measurement_record);
    2786            1 :     status = libspdm_get_measurement(spdm_context, NULL, request_attribute, 1,
    2787              :                                      0, NULL, &number_of_block,
    2788              :                                      &measurement_record_length,
    2789              :                                      measurement_record);
    2790              : 
    2791            1 :     assert_int_equal(status, LIBSPDM_STATUS_UNSUPPORTED_CAP);
    2792            1 : }
    2793              : 
    2794              : /**
    2795              :  * Test 3: Error case, attempt to get measurements before GET_DIGESTS, GET_CAPABILITIES, and NEGOTIATE_ALGORITHMS
    2796              :  * Expected Behavior: get a RETURN_UNSUPPORTED return code, with an empty transcript.message_m
    2797              :  **/
    2798            1 : static void libspdm_test_requester_get_measurements_err_case3(void **state)
    2799              : {
    2800              :     libspdm_return_t status;
    2801              :     libspdm_test_context_t *spdm_test_context;
    2802              :     libspdm_context_t *spdm_context;
    2803              :     uint8_t number_of_block;
    2804              :     uint32_t measurement_record_length;
    2805              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
    2806              :     uint8_t request_attribute;
    2807              :     void *data;
    2808              :     size_t data_size;
    2809              :     void *hash;
    2810              :     size_t hash_size;
    2811              : 
    2812            1 :     spdm_test_context = *state;
    2813            1 :     spdm_context = spdm_test_context->spdm_context;
    2814            1 :     spdm_test_context->case_id = 0x3;
    2815            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    2816              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    2817            1 :     spdm_context->connection_info.connection_state =
    2818              :         LIBSPDM_CONNECTION_STATE_NOT_STARTED;
    2819            1 :     spdm_context->connection_info.capability.flags |=
    2820              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    2821            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    2822              :                                                          m_libspdm_use_asym_algo, &data,
    2823              :                                                          &data_size, &hash, &hash_size)) {
    2824            0 :         assert(false);
    2825              :     }
    2826            1 :     libspdm_reset_message_m(spdm_context, NULL);
    2827            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    2828              :         m_libspdm_use_measurement_spec;
    2829            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    2830              :         m_libspdm_use_measurement_hash_algo;
    2831            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    2832              :         m_libspdm_use_hash_algo;
    2833            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    2834              :         m_libspdm_use_asym_algo;
    2835            1 :     spdm_context->local_context.algorithm.measurement_spec =
    2836              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    2837              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    2838              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    2839              :         data_size;
    2840              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    2841              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    2842              :                      data, data_size);
    2843              : #else
    2844            1 :     libspdm_hash_all(
    2845              :         spdm_context->connection_info.algorithm.base_hash_algo,
    2846              :         data, data_size,
    2847            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
    2848            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
    2849            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
    2850            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
    2851              :         spdm_context->connection_info.algorithm.base_hash_algo,
    2852              :         spdm_context->connection_info.algorithm.base_asym_algo,
    2853              :         data, data_size,
    2854              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
    2855              : #endif
    2856              : 
    2857            1 :     request_attribute = SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE;
    2858              : 
    2859            1 :     measurement_record_length = sizeof(measurement_record);
    2860            1 :     status = libspdm_get_measurement(spdm_context, NULL, request_attribute, 1,
    2861              :                                      0, NULL, &number_of_block,
    2862              :                                      &measurement_record_length,
    2863              :                                      measurement_record);
    2864            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_STATE_LOCAL);
    2865              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    2866              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
    2867              : #endif
    2868            1 :     free(data);
    2869            1 : }
    2870              : 
    2871              : /**
    2872              :  * Test 4: Error case, always get an error response with code SPDM_ERROR_CODE_INVALID_REQUEST
    2873              :  * Expected Behavior: get a RETURN_DEVICE_ERROR return code, with an empty transcript.message_m
    2874              :  **/
    2875            1 : static void libspdm_test_requester_get_measurements_err_case4(void **state)
    2876              : {
    2877              :     libspdm_return_t status;
    2878              :     libspdm_test_context_t *spdm_test_context;
    2879              :     libspdm_context_t *spdm_context;
    2880              :     uint8_t number_of_block;
    2881              :     uint32_t measurement_record_length;
    2882              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
    2883              :     uint8_t request_attribute;
    2884              :     void *data;
    2885              :     size_t data_size;
    2886              :     void *hash;
    2887              :     size_t hash_size;
    2888              : 
    2889            1 :     spdm_test_context = *state;
    2890            1 :     spdm_context = spdm_test_context->spdm_context;
    2891            1 :     spdm_test_context->case_id = 0x4;
    2892            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    2893              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    2894            1 :     spdm_context->connection_info.connection_state =
    2895              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    2896            1 :     spdm_context->connection_info.capability.flags |=
    2897              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    2898            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    2899              :                                                          m_libspdm_use_asym_algo, &data,
    2900              :                                                          &data_size, &hash, &hash_size)) {
    2901            0 :         assert(false);
    2902              :     }
    2903            1 :     libspdm_reset_message_m(spdm_context, NULL);
    2904            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    2905              :         m_libspdm_use_measurement_spec;
    2906            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    2907              :         m_libspdm_use_measurement_hash_algo;
    2908            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    2909              :         m_libspdm_use_hash_algo;
    2910            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    2911              :         m_libspdm_use_asym_algo;
    2912            1 :     spdm_context->local_context.algorithm.measurement_spec =
    2913              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    2914              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    2915              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    2916              :         data_size;
    2917              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    2918              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    2919              :                      data, data_size);
    2920              : #else
    2921            1 :     libspdm_hash_all(
    2922              :         spdm_context->connection_info.algorithm.base_hash_algo,
    2923              :         data, data_size,
    2924            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
    2925            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
    2926            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
    2927            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
    2928              :         spdm_context->connection_info.algorithm.base_hash_algo,
    2929              :         spdm_context->connection_info.algorithm.base_asym_algo,
    2930              :         data, data_size,
    2931              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
    2932              : #endif
    2933              : 
    2934            1 :     request_attribute =
    2935              :         SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE;
    2936              : 
    2937            1 :     measurement_record_length = sizeof(measurement_record);
    2938            1 :     status = libspdm_get_measurement(spdm_context, NULL, request_attribute, 1,
    2939              :                                      0, NULL, &number_of_block,
    2940              :                                      &measurement_record_length,
    2941              :                                      measurement_record);
    2942            1 :     assert_int_equal(status, LIBSPDM_STATUS_ERROR_PEER);
    2943              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    2944              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
    2945              : #endif
    2946            1 :     free(data);
    2947            1 : }
    2948              : 
    2949              : /**
    2950              :  * Test 5: Error case, always get an error response with code SPDM_ERROR_CODE_BUSY
    2951              :  * Expected Behavior: get a RETURN_DEVICE_ERROR return code, with an empty transcript.message_m
    2952              :  **/
    2953            1 : static void libspdm_test_requester_get_measurements_err_case5(void **state)
    2954              : {
    2955              :     libspdm_return_t status;
    2956              :     libspdm_test_context_t *spdm_test_context;
    2957              :     libspdm_context_t *spdm_context;
    2958              :     uint8_t number_of_block;
    2959              :     uint32_t measurement_record_length;
    2960              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
    2961              :     uint8_t request_attribute;
    2962              :     void *data;
    2963              :     size_t data_size;
    2964              :     void *hash;
    2965              :     size_t hash_size;
    2966              : 
    2967            1 :     spdm_test_context = *state;
    2968            1 :     spdm_context = spdm_test_context->spdm_context;
    2969            1 :     spdm_test_context->case_id = 0x5;
    2970            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    2971              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    2972            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    2973            1 :     spdm_context->connection_info.capability.flags |=
    2974              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    2975            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    2976              :                                                          m_libspdm_use_asym_algo, &data,
    2977              :                                                          &data_size, &hash, &hash_size)) {
    2978            0 :         assert(false);
    2979              :     }
    2980            1 :     libspdm_reset_message_m(spdm_context, NULL);
    2981            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    2982              :         m_libspdm_use_measurement_spec;
    2983            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    2984              :         m_libspdm_use_measurement_hash_algo;
    2985            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    2986              :         m_libspdm_use_hash_algo;
    2987            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    2988              :         m_libspdm_use_asym_algo;
    2989            1 :     spdm_context->local_context.algorithm.measurement_spec =
    2990              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    2991              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    2992              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    2993              :         data_size;
    2994              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    2995              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    2996              :                      data, data_size);
    2997              : #else
    2998            1 :     libspdm_hash_all(
    2999              :         spdm_context->connection_info.algorithm.base_hash_algo,
    3000              :         data, data_size,
    3001            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
    3002            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
    3003            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
    3004            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
    3005              :         spdm_context->connection_info.algorithm.base_hash_algo,
    3006              :         spdm_context->connection_info.algorithm.base_asym_algo,
    3007              :         data, data_size,
    3008              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
    3009              : #endif
    3010              : 
    3011            1 :     request_attribute =
    3012              :         SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE;
    3013              : 
    3014            1 :     measurement_record_length = sizeof(measurement_record);
    3015            1 :     status = libspdm_get_measurement(spdm_context, NULL, request_attribute, 1,
    3016              :                                      0, NULL, &number_of_block,
    3017              :                                      &measurement_record_length,
    3018              :                                      measurement_record);
    3019            1 :     assert_int_equal(status, LIBSPDM_STATUS_BUSY_PEER);
    3020              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    3021              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
    3022              : #endif
    3023            1 :     free(data);
    3024            1 : }
    3025              : 
    3026              : /**
    3027              :  * Test 6: Connection state is less than negotiated.
    3028              :  * Expected Behavior: Returns with LIBSPDM_STATUS_INVALID_STATE_LOCAL.
    3029              :  **/
    3030            1 : static void libspdm_test_requester_get_measurements_err_case6(void **state)
    3031              : {
    3032              :     libspdm_return_t status;
    3033              :     libspdm_test_context_t *spdm_test_context;
    3034              :     libspdm_context_t *spdm_context;
    3035              :     uint8_t number_of_block;
    3036              :     uint32_t measurement_record_length;
    3037              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
    3038              :     uint8_t request_attribute;
    3039              :     void *data;
    3040              :     size_t data_size;
    3041              :     void *hash;
    3042              :     size_t hash_size;
    3043              : 
    3044            1 :     spdm_test_context = *state;
    3045            1 :     spdm_context = spdm_test_context->spdm_context;
    3046            1 :     spdm_test_context->case_id = 0x2;
    3047            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    3048              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    3049            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AFTER_CAPABILITIES;
    3050            1 :     spdm_context->connection_info.capability.flags |=
    3051              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    3052            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    3053              :                                                          m_libspdm_use_asym_algo, &data,
    3054              :                                                          &data_size, &hash, &hash_size)) {
    3055            0 :         assert(false);
    3056              :     }
    3057            1 :     libspdm_reset_message_m(spdm_context, NULL);
    3058            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    3059              :         m_libspdm_use_measurement_spec;
    3060            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    3061              :         m_libspdm_use_measurement_hash_algo;
    3062            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    3063            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    3064            1 :     spdm_context->local_context.algorithm.measurement_spec =
    3065              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    3066            1 :     request_attribute = SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE;
    3067              : 
    3068            1 :     measurement_record_length = sizeof(measurement_record);
    3069            1 :     status = libspdm_get_measurement(spdm_context, NULL, request_attribute, 1,
    3070              :                                      0, NULL, &number_of_block,
    3071              :                                      &measurement_record_length,
    3072              :                                      measurement_record);
    3073              : 
    3074            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_STATE_LOCAL);
    3075            1 : }
    3076              : 
    3077              : /**
    3078              :  * Test 7: Error case, get an error response with code SPDM_ERROR_CODE_REQUEST_RESYNCH
    3079              :  * Expected Behavior: get a RETURN_DEVICE_ERROR return code, with an empty transcript.message_m
    3080              :  **/
    3081            1 : static void libspdm_test_requester_get_measurements_err_case7(void **state)
    3082              : {
    3083              :     libspdm_return_t status;
    3084              :     libspdm_test_context_t *spdm_test_context;
    3085              :     libspdm_context_t *spdm_context;
    3086              :     uint8_t number_of_block;
    3087              :     uint32_t measurement_record_length;
    3088              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
    3089              :     uint8_t request_attribute;
    3090              :     void *data;
    3091              :     size_t data_size;
    3092              :     void *hash;
    3093              :     size_t hash_size;
    3094              : 
    3095            1 :     spdm_test_context = *state;
    3096            1 :     spdm_context = spdm_test_context->spdm_context;
    3097            1 :     spdm_test_context->case_id = 0x7;
    3098            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    3099              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    3100            1 :     spdm_context->connection_info.connection_state =
    3101              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    3102            1 :     spdm_context->connection_info.capability.flags |=
    3103              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    3104            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    3105              :                                                          m_libspdm_use_asym_algo, &data,
    3106              :                                                          &data_size, &hash, &hash_size)) {
    3107            0 :         assert(false);
    3108              :     }
    3109            1 :     libspdm_reset_message_m(spdm_context, NULL);
    3110            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    3111              :         m_libspdm_use_measurement_spec;
    3112            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    3113              :         m_libspdm_use_measurement_hash_algo;
    3114            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    3115              :         m_libspdm_use_hash_algo;
    3116            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    3117              :         m_libspdm_use_asym_algo;
    3118            1 :     spdm_context->local_context.algorithm.measurement_spec =
    3119              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    3120              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    3121              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    3122              :         data_size;
    3123              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    3124              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    3125              :                      data, data_size);
    3126              : #else
    3127            1 :     libspdm_hash_all(
    3128              :         spdm_context->connection_info.algorithm.base_hash_algo,
    3129              :         data, data_size,
    3130            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
    3131            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
    3132            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
    3133            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
    3134              :         spdm_context->connection_info.algorithm.base_hash_algo,
    3135              :         spdm_context->connection_info.algorithm.base_asym_algo,
    3136              :         data, data_size,
    3137              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
    3138              : #endif
    3139              : 
    3140            1 :     request_attribute =
    3141              :         SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE;
    3142              : 
    3143            1 :     measurement_record_length = sizeof(measurement_record);
    3144            1 :     status = libspdm_get_measurement(spdm_context, NULL, request_attribute, 1,
    3145              :                                      0, NULL, &number_of_block,
    3146              :                                      &measurement_record_length,
    3147              :                                      measurement_record);
    3148            1 :     assert_int_equal(status, LIBSPDM_STATUS_RESYNCH_PEER);
    3149            1 :     assert_int_equal(spdm_context->connection_info.connection_state,
    3150              :                      LIBSPDM_CONNECTION_STATE_NOT_STARTED);
    3151              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    3152              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
    3153              : #endif
    3154            1 :     free(data);
    3155            1 : }
    3156              : 
    3157              : /**
    3158              :  * Test 8: Error case, always get an error response with code SPDM_ERROR_CODE_RESPONSE_NOT_READY
    3159              :  * Expected Behavior: get a RETURN_DEVICE_ERROR return code, with an empty transcript.message_m
    3160              :  **/
    3161            1 : static void libspdm_test_requester_get_measurements_err_case8(void **state)
    3162              : {
    3163              :     libspdm_return_t status;
    3164              :     libspdm_test_context_t *spdm_test_context;
    3165              :     libspdm_context_t *spdm_context;
    3166              :     uint8_t number_of_block;
    3167              :     uint32_t measurement_record_length;
    3168              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
    3169              :     uint8_t request_attribute;
    3170              :     void *data;
    3171              :     size_t data_size;
    3172              :     void *hash;
    3173              :     size_t hash_size;
    3174              : 
    3175            1 :     spdm_test_context = *state;
    3176            1 :     spdm_context = spdm_test_context->spdm_context;
    3177            1 :     spdm_test_context->case_id = 0x8;
    3178            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    3179              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    3180            1 :     spdm_context->connection_info.connection_state =
    3181              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    3182            1 :     spdm_context->connection_info.capability.flags |=
    3183              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    3184            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    3185              :                                                          m_libspdm_use_asym_algo, &data,
    3186              :                                                          &data_size, &hash, &hash_size)) {
    3187            0 :         assert(false);
    3188              :     }
    3189            1 :     libspdm_reset_message_m(spdm_context, NULL);
    3190            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    3191              :         m_libspdm_use_measurement_spec;
    3192            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    3193              :         m_libspdm_use_measurement_hash_algo;
    3194            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    3195              :         m_libspdm_use_hash_algo;
    3196            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    3197              :         m_libspdm_use_asym_algo;
    3198            1 :     spdm_context->local_context.algorithm.measurement_spec =
    3199              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    3200              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    3201              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    3202              :         data_size;
    3203              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    3204              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    3205              :                      data, data_size);
    3206              : #else
    3207            1 :     libspdm_hash_all(
    3208              :         spdm_context->connection_info.algorithm.base_hash_algo,
    3209              :         data, data_size,
    3210            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
    3211            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
    3212            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
    3213            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
    3214              :         spdm_context->connection_info.algorithm.base_hash_algo,
    3215              :         spdm_context->connection_info.algorithm.base_asym_algo,
    3216              :         data, data_size,
    3217              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
    3218              : #endif
    3219              : 
    3220            1 :     request_attribute =
    3221              :         SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE;
    3222              : 
    3223            1 :     measurement_record_length = sizeof(measurement_record);
    3224            1 :     status = libspdm_get_measurement(spdm_context, NULL, request_attribute, 1,
    3225              :                                      0, NULL, &number_of_block,
    3226              :                                      &measurement_record_length,
    3227              :                                      measurement_record);
    3228            1 :     assert_int_equal(status, LIBSPDM_STATUS_NOT_READY_PEER);
    3229            1 :     free(data);
    3230            1 : }
    3231              : 
    3232              : /**
    3233              :  * Test 9: Integrator requests signature when Responder does not support signatures.
    3234              :  * Expected Behavior: Returns LIBSPDM_STATUS_INVALID_PARAMETER.
    3235              :  **/
    3236            1 : static void libspdm_test_requester_get_measurements_err_case9(void **state)
    3237              : {
    3238              :     libspdm_return_t status;
    3239              :     libspdm_test_context_t *spdm_test_context;
    3240              :     libspdm_context_t *spdm_context;
    3241              :     uint8_t number_of_block;
    3242              :     uint32_t measurement_record_length;
    3243              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
    3244              :     uint8_t request_attribute;
    3245              :     void *data;
    3246              :     size_t data_size;
    3247              :     void *hash;
    3248              :     size_t hash_size;
    3249              : 
    3250            1 :     spdm_test_context = *state;
    3251            1 :     spdm_context = spdm_test_context->spdm_context;
    3252            1 :     spdm_test_context->case_id = 0x9;
    3253            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    3254              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    3255            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    3256            1 :     spdm_context->connection_info.capability.flags =
    3257              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_NO_SIG;
    3258            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    3259              :                                                          m_libspdm_use_asym_algo, &data,
    3260              :                                                          &data_size, &hash, &hash_size)) {
    3261            0 :         assert(false);
    3262              :     }
    3263            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    3264              :         m_libspdm_use_measurement_spec;
    3265            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    3266              :         m_libspdm_use_measurement_hash_algo;
    3267            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    3268            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    3269            1 :     spdm_context->local_context.algorithm.measurement_spec =
    3270              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    3271            1 :     request_attribute = SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE;
    3272              : 
    3273            1 :     measurement_record_length = sizeof(measurement_record);
    3274            1 :     status = libspdm_get_measurement(spdm_context, NULL, request_attribute, 1,
    3275              :                                      0, NULL, &number_of_block,
    3276              :                                      &measurement_record_length,
    3277              :                                      measurement_record);
    3278              : 
    3279            1 :     spdm_context->connection_info.capability.flags = 0;
    3280              : 
    3281            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_PARAMETER);
    3282            1 : }
    3283              : 
    3284              : /**
    3285              :  * Test 10: Unable to acquire the sender buffer.
    3286              :  * Expected Behavior: Returns with LIBSPDM_STATUS_ACQUIRE_FAIL.
    3287              :  **/
    3288            1 : static void libspdm_test_requester_get_measurements_err_case10(void **state)
    3289              : {
    3290              :     libspdm_return_t status;
    3291              :     libspdm_test_context_t *spdm_test_context;
    3292              :     libspdm_context_t *spdm_context;
    3293              :     uint8_t number_of_block;
    3294              :     uint32_t measurement_record_length;
    3295              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
    3296              :     uint8_t request_attribute;
    3297              :     void *data;
    3298              :     size_t data_size;
    3299              :     void *hash;
    3300              :     size_t hash_size;
    3301              : 
    3302            1 :     spdm_test_context = *state;
    3303            1 :     spdm_context = spdm_test_context->spdm_context;
    3304            1 :     spdm_test_context->case_id = 0xa;
    3305            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    3306              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    3307            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    3308            1 :     spdm_context->connection_info.capability.flags =
    3309              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_NO_SIG;
    3310            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    3311              :                                                          m_libspdm_use_asym_algo, &data,
    3312              :                                                          &data_size, &hash, &hash_size)) {
    3313            0 :         assert(false);
    3314              :     }
    3315              : 
    3316            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
    3317            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    3318              :         m_libspdm_use_measurement_hash_algo;
    3319            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    3320            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    3321            1 :     spdm_context->local_context.algorithm.measurement_spec =
    3322              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    3323            1 :     request_attribute = 0;
    3324            1 :     measurement_record_length = sizeof(measurement_record);
    3325              : 
    3326            1 :     libspdm_force_error (LIBSPDM_ERR_ACQUIRE_SENDER_BUFFER);
    3327            1 :     status = libspdm_get_measurement(spdm_context, NULL, request_attribute, 1,
    3328              :                                      0, NULL, &number_of_block,
    3329              :                                      &measurement_record_length,
    3330              :                                      measurement_record);
    3331            1 :     libspdm_release_error (LIBSPDM_ERR_ACQUIRE_SENDER_BUFFER);
    3332              : 
    3333            1 :     spdm_context->connection_info.capability.flags = 0;
    3334              : 
    3335            1 :     assert_int_equal(status, LIBSPDM_STATUS_ACQUIRE_FAIL);
    3336            1 : }
    3337              : 
    3338              : /**
    3339              :  * Test 11: Unable to acquire the receiver buffer.
    3340              :  * Expected Behavior: Returns with LIBSPDM_STATUS_ACQUIRE_FAIL.
    3341              :  **/
    3342            1 : static void libspdm_test_requester_get_measurements_err_case11(void **state)
    3343              : {
    3344              :     libspdm_return_t status;
    3345              :     libspdm_test_context_t *spdm_test_context;
    3346              :     libspdm_context_t *spdm_context;
    3347              :     uint8_t number_of_block;
    3348              :     uint32_t measurement_record_length;
    3349              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
    3350              :     uint8_t request_attribute;
    3351              :     void *data;
    3352              :     size_t data_size;
    3353              :     void *hash;
    3354              :     size_t hash_size;
    3355              : 
    3356            1 :     spdm_test_context = *state;
    3357            1 :     spdm_context = spdm_test_context->spdm_context;
    3358            1 :     spdm_test_context->case_id = 0xb;
    3359            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    3360              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    3361            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    3362            1 :     spdm_context->connection_info.capability.flags =
    3363              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_NO_SIG;
    3364            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    3365              :                                                          m_libspdm_use_asym_algo, &data,
    3366              :                                                          &data_size, &hash, &hash_size)) {
    3367            0 :         assert(false);
    3368              :     }
    3369              : 
    3370            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
    3371            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    3372              :         m_libspdm_use_measurement_hash_algo;
    3373            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    3374            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    3375            1 :     spdm_context->local_context.algorithm.measurement_spec =
    3376              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    3377              : 
    3378            1 :     request_attribute = 0;
    3379            1 :     measurement_record_length = sizeof(measurement_record);
    3380              : 
    3381            1 :     libspdm_force_error (LIBSPDM_ERR_ACQUIRE_RECEIVER_BUFFER);
    3382            1 :     status = libspdm_get_measurement(spdm_context, NULL, request_attribute, 1,
    3383              :                                      0, NULL, &number_of_block,
    3384              :                                      &measurement_record_length,
    3385              :                                      measurement_record);
    3386            1 :     libspdm_release_error (LIBSPDM_ERR_ACQUIRE_RECEIVER_BUFFER);
    3387              : 
    3388            1 :     spdm_context->connection_info.capability.flags = 0;
    3389              : 
    3390            1 :     assert_int_equal(status, LIBSPDM_STATUS_ACQUIRE_FAIL);
    3391            1 : }
    3392              : 
    3393              : /**
    3394              :  * Test 12: Error case, signature is invalid (all bytes are 0)
    3395              :  * Expected Behavior: get a RETURN_SECURITY_VIOLATION return code
    3396              :  **/
    3397            1 : static void libspdm_test_requester_get_measurements_err_case12(void **state)
    3398              : {
    3399              :     libspdm_return_t status;
    3400              :     libspdm_test_context_t *spdm_test_context;
    3401              :     libspdm_context_t *spdm_context;
    3402              :     uint8_t number_of_block;
    3403              :     uint32_t measurement_record_length;
    3404              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
    3405              :     uint8_t request_attribute;
    3406              :     void *data;
    3407              :     size_t data_size;
    3408              :     void *hash;
    3409              :     size_t hash_size;
    3410              : 
    3411            1 :     spdm_test_context = *state;
    3412            1 :     spdm_context = spdm_test_context->spdm_context;
    3413            1 :     spdm_test_context->case_id = 0xC;
    3414              : 
    3415            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    3416              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    3417            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    3418            1 :     spdm_context->connection_info.capability.flags |=
    3419              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    3420            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    3421              :                                                          m_libspdm_use_asym_algo, &data,
    3422              :                                                          &data_size, &hash, &hash_size)) {
    3423            0 :         assert(false);
    3424              :     }
    3425            1 :     libspdm_reset_message_m(spdm_context, NULL);
    3426            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
    3427            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    3428              :         m_libspdm_use_measurement_hash_algo;
    3429            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    3430            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    3431            1 :     spdm_context->local_context.algorithm.measurement_spec =
    3432              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    3433              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    3434              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    3435              :         data_size;
    3436              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    3437              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    3438              :                      data, data_size);
    3439              : #else
    3440            1 :     libspdm_hash_all(
    3441              :         spdm_context->connection_info.algorithm.base_hash_algo,
    3442              :         data, data_size,
    3443            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
    3444            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
    3445            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
    3446            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
    3447              :         spdm_context->connection_info.algorithm.base_hash_algo,
    3448              :         spdm_context->connection_info.algorithm.base_asym_algo,
    3449              :         data, data_size,
    3450              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
    3451              : #endif
    3452              : 
    3453            1 :     request_attribute = SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE;
    3454              : 
    3455            1 :     measurement_record_length = sizeof(measurement_record);
    3456            1 :     status = libspdm_get_measurement(spdm_context, NULL, request_attribute, 1,
    3457              :                                      0, NULL, &number_of_block,
    3458              :                                      &measurement_record_length,
    3459              :                                      measurement_record);
    3460            1 :     assert_int_equal(status, LIBSPDM_STATUS_VERIF_FAIL);
    3461              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    3462              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
    3463              : #endif
    3464            1 :     free(data);
    3465            1 : }
    3466              : 
    3467              : /**
    3468              :  * Test 13: Error case, signature is invalid (random)
    3469              :  * Expected Behavior: get a RETURN_SECURITY_VIOLATION return code
    3470              :  **/
    3471            1 : static void libspdm_test_requester_get_measurements_err_case13(void **state)
    3472              : {
    3473              :     libspdm_return_t status;
    3474              :     libspdm_test_context_t *spdm_test_context;
    3475              :     libspdm_context_t *spdm_context;
    3476              :     uint8_t number_of_block;
    3477              :     uint32_t measurement_record_length;
    3478              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
    3479              :     uint8_t request_attribute;
    3480              :     void *data;
    3481              :     size_t data_size;
    3482              :     void *hash;
    3483              :     size_t hash_size;
    3484              : 
    3485            1 :     spdm_test_context = *state;
    3486            1 :     spdm_context = spdm_test_context->spdm_context;
    3487            1 :     spdm_test_context->case_id = 0xD;
    3488              : 
    3489            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    3490              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    3491            1 :     spdm_context->connection_info.connection_state =
    3492              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    3493            1 :     spdm_context->connection_info.capability.flags |=
    3494              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    3495            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    3496              :                                                          m_libspdm_use_asym_algo, &data,
    3497              :                                                          &data_size, &hash, &hash_size)) {
    3498            0 :         assert(false);
    3499              :     }
    3500            1 :     libspdm_reset_message_m(spdm_context, NULL);
    3501            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    3502              :         m_libspdm_use_measurement_spec;
    3503            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    3504              :         m_libspdm_use_measurement_hash_algo;
    3505            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    3506              :         m_libspdm_use_hash_algo;
    3507            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    3508              :         m_libspdm_use_asym_algo;
    3509            1 :     spdm_context->local_context.algorithm.measurement_spec =
    3510              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    3511              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    3512              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    3513              :         data_size;
    3514              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    3515              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    3516              :                      data, data_size);
    3517              : #else
    3518            1 :     libspdm_hash_all(
    3519              :         spdm_context->connection_info.algorithm.base_hash_algo,
    3520              :         data, data_size,
    3521            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
    3522            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
    3523            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
    3524            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
    3525              :         spdm_context->connection_info.algorithm.base_hash_algo,
    3526              :         spdm_context->connection_info.algorithm.base_asym_algo,
    3527              :         data, data_size,
    3528              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
    3529              : #endif
    3530              : 
    3531            1 :     request_attribute =
    3532              :         SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE;
    3533              : 
    3534            1 :     measurement_record_length = sizeof(measurement_record);
    3535            1 :     status = libspdm_get_measurement(spdm_context, NULL, request_attribute, 1,
    3536              :                                      0, NULL, &number_of_block,
    3537              :                                      &measurement_record_length,
    3538              :                                      measurement_record);
    3539            1 :     assert_int_equal(status, LIBSPDM_STATUS_VERIF_FAIL);
    3540              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    3541              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
    3542              : #endif
    3543            1 :     free(data);
    3544            1 : }
    3545              : 
    3546              : /**
    3547              :  * Test 14: Error case, request a signed response, but response is malformed (signature absent)
    3548              :  * Expected Behavior: get a RETURN_DEVICE_ERROR return code
    3549              :  **/
    3550            1 : static void libspdm_test_requester_get_measurements_err_case14(void **state)
    3551              : {
    3552              :     libspdm_return_t status;
    3553              :     libspdm_test_context_t *spdm_test_context;
    3554              :     libspdm_context_t *spdm_context;
    3555              :     uint8_t number_of_block;
    3556              :     uint32_t measurement_record_length;
    3557              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
    3558              :     uint8_t request_attribute;
    3559              :     void *data;
    3560              :     size_t data_size;
    3561              :     void *hash;
    3562              :     size_t hash_size;
    3563              : 
    3564            1 :     spdm_test_context = *state;
    3565            1 :     spdm_context = spdm_test_context->spdm_context;
    3566            1 :     spdm_test_context->case_id = 0xE;
    3567              : 
    3568            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    3569              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    3570            1 :     spdm_context->connection_info.connection_state =
    3571              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    3572            1 :     spdm_context->connection_info.capability.flags |=
    3573              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    3574            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    3575              :                                                          m_libspdm_use_asym_algo, &data,
    3576              :                                                          &data_size, &hash, &hash_size)) {
    3577            0 :         assert(false);
    3578              :     }
    3579            1 :     libspdm_reset_message_m(spdm_context, NULL);
    3580            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    3581              :         m_libspdm_use_measurement_spec;
    3582            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    3583              :         m_libspdm_use_measurement_hash_algo;
    3584            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    3585              :         m_libspdm_use_hash_algo;
    3586            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    3587              :         m_libspdm_use_asym_algo;
    3588            1 :     spdm_context->local_context.algorithm.measurement_spec =
    3589              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    3590              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    3591              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    3592              :         data_size;
    3593              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    3594              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    3595              :                      data, data_size);
    3596              : #else
    3597            1 :     libspdm_hash_all(
    3598              :         spdm_context->connection_info.algorithm.base_hash_algo,
    3599              :         data, data_size,
    3600            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
    3601            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
    3602            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
    3603            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
    3604              :         spdm_context->connection_info.algorithm.base_hash_algo,
    3605              :         spdm_context->connection_info.algorithm.base_asym_algo,
    3606              :         data, data_size,
    3607              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
    3608              : #endif
    3609              : 
    3610            1 :     request_attribute =
    3611              :         SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE;
    3612              : 
    3613            1 :     measurement_record_length = sizeof(measurement_record);
    3614            1 :     status = libspdm_get_measurement(spdm_context, NULL, request_attribute, 1,
    3615              :                                      0, NULL, &number_of_block,
    3616              :                                      &measurement_record_length,
    3617              :                                      measurement_record);
    3618            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_SIZE);
    3619              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    3620              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
    3621              : #endif
    3622            1 :     free(data);
    3623            1 : }
    3624              : 
    3625              : /**
    3626              :  * Test 15: Error case, response with wrong response code
    3627              :  * Expected Behavior: get a RETURN_DEVICE_ERROR return code
    3628              :  **/
    3629            1 : static void libspdm_test_requester_get_measurements_err_case15(void **state)
    3630              : {
    3631              :     libspdm_return_t status;
    3632              :     libspdm_test_context_t *spdm_test_context;
    3633              :     libspdm_context_t *spdm_context;
    3634              :     uint8_t number_of_block;
    3635              :     uint32_t measurement_record_length;
    3636              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
    3637              :     uint8_t request_attribute;
    3638              :     void *data;
    3639              :     size_t data_size;
    3640              :     void *hash;
    3641              :     size_t hash_size;
    3642              : 
    3643            1 :     spdm_test_context = *state;
    3644            1 :     spdm_context = spdm_test_context->spdm_context;
    3645            1 :     spdm_test_context->case_id = 0xF;
    3646              : 
    3647            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    3648              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    3649            1 :     spdm_context->connection_info.connection_state =
    3650              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    3651            1 :     spdm_context->connection_info.capability.flags |=
    3652              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    3653            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    3654              :                                                          m_libspdm_use_asym_algo, &data,
    3655              :                                                          &data_size, &hash, &hash_size)) {
    3656            0 :         assert(false);
    3657              :     }
    3658            1 :     libspdm_reset_message_m(spdm_context, NULL);
    3659            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    3660              :         m_libspdm_use_measurement_spec;
    3661            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    3662              :         m_libspdm_use_measurement_hash_algo;
    3663            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    3664              :         m_libspdm_use_hash_algo;
    3665            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    3666              :         m_libspdm_use_asym_algo;
    3667            1 :     spdm_context->local_context.algorithm.measurement_spec =
    3668              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    3669              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    3670              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    3671              :         data_size;
    3672              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    3673              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    3674              :                      data, data_size);
    3675              : #else
    3676            1 :     libspdm_hash_all(
    3677              :         spdm_context->connection_info.algorithm.base_hash_algo,
    3678              :         data, data_size,
    3679            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
    3680            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
    3681            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
    3682            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
    3683              :         spdm_context->connection_info.algorithm.base_hash_algo,
    3684              :         spdm_context->connection_info.algorithm.base_asym_algo,
    3685              :         data, data_size,
    3686              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
    3687              : #endif
    3688              : 
    3689            1 :     request_attribute =
    3690              :         SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE;
    3691              : 
    3692            1 :     measurement_record_length = sizeof(measurement_record);
    3693            1 :     status = libspdm_get_measurement(spdm_context, NULL, request_attribute, 1,
    3694              :                                      0, NULL, &number_of_block,
    3695              :                                      &measurement_record_length,
    3696              :                                      measurement_record);
    3697            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
    3698              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    3699              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
    3700              : #endif
    3701            1 :     free(data);
    3702            1 : }
    3703              : 
    3704              : /**
    3705              :  * Test 16: Unable to receive response.
    3706              :  * Expected Behavior: Returns with LIBSPDM_STATUS_RECEIVE_FAIL.
    3707              :  **/
    3708            1 : static void libspdm_test_requester_get_measurements_err_case16(void **state)
    3709              : {
    3710              :     libspdm_return_t status;
    3711              :     libspdm_test_context_t *spdm_test_context;
    3712              :     libspdm_context_t *spdm_context;
    3713              :     uint8_t number_of_block;
    3714              :     uint32_t measurement_record_length;
    3715              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
    3716              :     uint8_t request_attribute;
    3717              :     void *data;
    3718              :     size_t data_size;
    3719              :     void *hash;
    3720              :     size_t hash_size;
    3721              : 
    3722            1 :     spdm_test_context = *state;
    3723            1 :     spdm_context = spdm_test_context->spdm_context;
    3724            1 :     spdm_test_context->case_id = 0x10;
    3725            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    3726              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    3727            1 :     spdm_context->connection_info.connection_state =
    3728              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    3729            1 :     spdm_context->connection_info.capability.flags |=
    3730              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    3731            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    3732              :                                                          m_libspdm_use_asym_algo, &data,
    3733              :                                                          &data_size, &hash, &hash_size)) {
    3734            0 :         assert(false);
    3735              :     }
    3736            1 :     libspdm_reset_message_m(spdm_context, NULL);
    3737            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
    3738            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    3739              :         m_libspdm_use_measurement_hash_algo;
    3740            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    3741            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    3742            1 :     spdm_context->local_context.algorithm.measurement_spec =
    3743              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    3744            1 :     request_attribute = SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE;
    3745              : 
    3746            1 :     measurement_record_length = sizeof(measurement_record);
    3747            1 :     status = libspdm_get_measurement(spdm_context, NULL, request_attribute, 1,
    3748              :                                      0, NULL, &number_of_block,
    3749              :                                      &measurement_record_length,
    3750              :                                      measurement_record);
    3751              : 
    3752            1 :     assert_int_equal(status, LIBSPDM_STATUS_RECEIVE_FAIL);
    3753            1 : }
    3754              : 
    3755              : /**
    3756              :  * Test 17: Error case, response to get total number of measurements, but response number_of_blocks and/or measurement_record_length are non 0
    3757              :  * Expected Behavior: get a RETURN_DEVICE_ERROR return code
    3758              :  **/
    3759            1 : static void libspdm_test_requester_get_measurements_err_case17(void **state)
    3760              : {
    3761              :     libspdm_return_t status;
    3762              :     libspdm_test_context_t *spdm_test_context;
    3763              :     libspdm_context_t *spdm_context;
    3764              :     uint8_t number_of_blocks;
    3765              :     uint8_t request_attribute;
    3766              :     void *data;
    3767              :     size_t data_size;
    3768              :     void *hash;
    3769              :     size_t hash_size;
    3770              : 
    3771            1 :     spdm_test_context = *state;
    3772            1 :     spdm_context = spdm_test_context->spdm_context;
    3773            1 :     spdm_test_context->case_id = 0x11;
    3774              : 
    3775            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    3776              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    3777            1 :     spdm_context->connection_info.connection_state =
    3778              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    3779            1 :     spdm_context->connection_info.capability.flags |=
    3780              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    3781            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    3782              :                                                          m_libspdm_use_asym_algo, &data,
    3783              :                                                          &data_size, &hash, &hash_size)) {
    3784            0 :         assert(false);
    3785              :     }
    3786            1 :     libspdm_reset_message_m(spdm_context, NULL);
    3787            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    3788              :         m_libspdm_use_measurement_spec;
    3789            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    3790              :         m_libspdm_use_measurement_hash_algo;
    3791            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    3792              :         m_libspdm_use_hash_algo;
    3793            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    3794              :         m_libspdm_use_asym_algo;
    3795            1 :     spdm_context->local_context.algorithm.measurement_spec =
    3796              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    3797              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    3798              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    3799              :         data_size;
    3800              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    3801              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    3802              :                      data, data_size);
    3803              : #else
    3804            1 :     libspdm_hash_all(
    3805              :         spdm_context->connection_info.algorithm.base_hash_algo,
    3806              :         data, data_size,
    3807            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
    3808            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
    3809            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
    3810            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
    3811              :         spdm_context->connection_info.algorithm.base_hash_algo,
    3812              :         spdm_context->connection_info.algorithm.base_asym_algo,
    3813              :         data, data_size,
    3814              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
    3815              : #endif
    3816              : 
    3817            1 :     request_attribute = 0;
    3818              : 
    3819            4 :     for (int i = 0; i < 3; i++) {
    3820              :         /* i=0 => both number_of_blocks and measurement_record_length are non 0
    3821              :          * i=1 => only number_of_blocks is non 0
    3822              :          * i=2 => only is measurement_record_length is non 0*/
    3823            3 :         status = libspdm_get_measurement(
    3824              :             spdm_context, NULL, request_attribute,
    3825              :             SPDM_GET_MEASUREMENTS_REQUEST_MEASUREMENT_OPERATION_TOTAL_NUMBER_OF_MEASUREMENTS,
    3826              :             0, NULL, &number_of_blocks, NULL, NULL);
    3827            3 :         assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
    3828              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    3829              :         assert_int_equal(spdm_context->transcript.message_m.buffer_size,
    3830              :                          0);
    3831              : #endif
    3832              :     }
    3833            1 :     free(data);
    3834            1 : }
    3835              : 
    3836              : /**
    3837              :  * Test 18:
    3838              :  * Expected Behavior:
    3839              :  **/
    3840            1 : static void libspdm_test_requester_get_measurements_err_case18(void **state)
    3841              : {
    3842            1 : }
    3843              : 
    3844              : /**
    3845              :  * Test 19: Error case, measurement_specification field in response has 2 bits set (bit 0 is one of them)
    3846              :  * Expected Behavior: get a RETURN_DEVICE_ERROR return code,
    3847              :  **/
    3848            1 : static void libspdm_test_requester_get_measurements_err_case19(void **state)
    3849              : {
    3850              :     libspdm_return_t status;
    3851              :     libspdm_test_context_t *spdm_test_context;
    3852              :     libspdm_context_t *spdm_context;
    3853              :     uint8_t number_of_block;
    3854              :     uint32_t measurement_record_length;
    3855              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
    3856              :     uint8_t request_attribute;
    3857              :     void *data;
    3858              :     size_t data_size;
    3859              :     void *hash;
    3860              :     size_t hash_size;
    3861              : 
    3862            1 :     spdm_test_context = *state;
    3863            1 :     spdm_context = spdm_test_context->spdm_context;
    3864            1 :     spdm_test_context->case_id = 0x13;
    3865              : 
    3866            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    3867              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    3868            1 :     spdm_context->connection_info.connection_state =
    3869              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    3870            1 :     spdm_context->connection_info.capability.flags |=
    3871              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    3872            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    3873              :                                                          m_libspdm_use_asym_algo, &data,
    3874              :                                                          &data_size, &hash, &hash_size)) {
    3875            0 :         assert(false);
    3876              :     }
    3877            1 :     libspdm_reset_message_m(spdm_context, NULL);
    3878            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    3879              :         m_libspdm_use_measurement_spec;
    3880            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    3881              :         m_libspdm_use_measurement_hash_algo;
    3882            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    3883              :         m_libspdm_use_hash_algo;
    3884            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    3885              :         m_libspdm_use_asym_algo;
    3886            1 :     spdm_context->local_context.algorithm.measurement_spec =
    3887              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    3888              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    3889              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    3890              :         data_size;
    3891              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    3892              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    3893              :                      data, data_size);
    3894              : #else
    3895            1 :     libspdm_hash_all(
    3896              :         spdm_context->connection_info.algorithm.base_hash_algo,
    3897              :         data, data_size,
    3898            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
    3899            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
    3900            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
    3901            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
    3902              :         spdm_context->connection_info.algorithm.base_hash_algo,
    3903              :         spdm_context->connection_info.algorithm.base_asym_algo,
    3904              :         data, data_size,
    3905              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
    3906              : #endif
    3907              : 
    3908            1 :     request_attribute = 0;
    3909              : 
    3910            1 :     measurement_record_length = sizeof(measurement_record);
    3911            1 :     status = libspdm_get_measurement(spdm_context, NULL, request_attribute, 1,
    3912              :                                      0, NULL, &number_of_block,
    3913              :                                      &measurement_record_length,
    3914              :                                      measurement_record);
    3915            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
    3916              : /* #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT*/
    3917              :     /* assert_int_equal (spdm_context->transcript.message_m.buffer_size, 0);*/
    3918              : /* #endif*/
    3919            1 :     free(data);
    3920            1 : }
    3921              : 
    3922              : /**
    3923              :  * Test 20: Error case, measurement_specification field in response has 2 bits set (bit 0 is not one of them)
    3924              :  * Expected Behavior: get a RETURN_DEVICE_ERROR return code,
    3925              :  **/
    3926            1 : static void libspdm_test_requester_get_measurements_err_case20(void **state)
    3927              : {
    3928              :     libspdm_return_t status;
    3929              :     libspdm_test_context_t *spdm_test_context;
    3930              :     libspdm_context_t *spdm_context;
    3931              :     uint8_t number_of_block;
    3932              :     uint32_t measurement_record_length;
    3933              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
    3934              :     uint8_t request_attribute;
    3935              :     void *data;
    3936              :     size_t data_size;
    3937              :     void *hash;
    3938              :     size_t hash_size;
    3939              : 
    3940            1 :     spdm_test_context = *state;
    3941            1 :     spdm_context = spdm_test_context->spdm_context;
    3942            1 :     spdm_test_context->case_id = 0x14;
    3943              : 
    3944            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    3945              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    3946            1 :     spdm_context->connection_info.connection_state =
    3947              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    3948            1 :     spdm_context->connection_info.capability.flags |=
    3949              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    3950            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    3951              :                                                          m_libspdm_use_asym_algo, &data,
    3952              :                                                          &data_size, &hash, &hash_size)) {
    3953            0 :         assert(false);
    3954              :     }
    3955            1 :     libspdm_reset_message_m(spdm_context, NULL);
    3956            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    3957              :         m_libspdm_use_measurement_spec;
    3958            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    3959              :         m_libspdm_use_measurement_hash_algo;
    3960            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    3961              :         m_libspdm_use_hash_algo;
    3962            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    3963              :         m_libspdm_use_asym_algo;
    3964            1 :     spdm_context->local_context.algorithm.measurement_spec =
    3965              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    3966              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    3967              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    3968              :         data_size;
    3969              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    3970              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    3971              :                      data, data_size);
    3972              : #else
    3973            1 :     libspdm_hash_all(
    3974              :         spdm_context->connection_info.algorithm.base_hash_algo,
    3975              :         data, data_size,
    3976            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
    3977            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
    3978            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
    3979            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
    3980              :         spdm_context->connection_info.algorithm.base_hash_algo,
    3981              :         spdm_context->connection_info.algorithm.base_asym_algo,
    3982              :         data, data_size,
    3983              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
    3984              : #endif
    3985              : 
    3986            1 :     request_attribute = 0;
    3987              : 
    3988            1 :     measurement_record_length = sizeof(measurement_record);
    3989            1 :     status = libspdm_get_measurement(spdm_context, NULL, request_attribute, 1,
    3990              :                                      0, NULL, &number_of_block,
    3991              :                                      &measurement_record_length,
    3992              :                                      measurement_record);
    3993            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
    3994              : /* #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT*/
    3995              :     /* assert_int_equal (spdm_context->transcript.message_m.buffer_size, 0);*/
    3996              : /* #endif*/
    3997            1 :     free(data);
    3998            1 : }
    3999              : 
    4000              : /**
    4001              :  * Test 21: Error case, measurement_specification field in response does not "match the selected measurement specification in the ALGORITHMS message"
    4002              :  * Expected Behavior: get a RETURN_DEVICE_ERROR return code,
    4003              :  **/
    4004            1 : static void libspdm_test_requester_get_measurements_err_case21(void **state)
    4005              : {
    4006              :     libspdm_return_t status;
    4007              :     libspdm_test_context_t *spdm_test_context;
    4008              :     libspdm_context_t *spdm_context;
    4009              :     uint8_t number_of_block;
    4010              :     uint32_t measurement_record_length;
    4011              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
    4012              :     uint8_t request_attribute;
    4013              :     void *data;
    4014              :     size_t data_size;
    4015              :     void *hash;
    4016              :     size_t hash_size;
    4017              : 
    4018            1 :     spdm_test_context = *state;
    4019            1 :     spdm_context = spdm_test_context->spdm_context;
    4020            1 :     spdm_test_context->case_id = 0x15;
    4021              : 
    4022            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    4023              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    4024            1 :     spdm_context->connection_info.connection_state =
    4025              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    4026            1 :     spdm_context->connection_info.capability.flags |=
    4027              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    4028            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    4029              :                                                          m_libspdm_use_asym_algo, &data,
    4030              :                                                          &data_size, &hash, &hash_size)) {
    4031            0 :         assert(false);
    4032              :     }
    4033            1 :     libspdm_reset_message_m(spdm_context, NULL);
    4034            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    4035              :         m_libspdm_use_measurement_spec;
    4036            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    4037              :         m_libspdm_use_measurement_hash_algo;
    4038            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    4039              :         m_libspdm_use_hash_algo;
    4040            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    4041              :         m_libspdm_use_asym_algo;
    4042            1 :     spdm_context->local_context.algorithm.measurement_spec =
    4043              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    4044              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    4045              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    4046              :         data_size;
    4047              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    4048              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    4049              :                      data, data_size);
    4050              : #else
    4051            1 :     libspdm_hash_all(
    4052              :         spdm_context->connection_info.algorithm.base_hash_algo,
    4053              :         data, data_size,
    4054            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
    4055            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
    4056            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
    4057            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
    4058              :         spdm_context->connection_info.algorithm.base_hash_algo,
    4059              :         spdm_context->connection_info.algorithm.base_asym_algo,
    4060              :         data, data_size,
    4061              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
    4062              : #endif
    4063              : 
    4064            1 :     request_attribute = 0;
    4065              : 
    4066            1 :     measurement_record_length = sizeof(measurement_record);
    4067            1 :     status = libspdm_get_measurement(spdm_context, NULL, request_attribute, 1,
    4068              :                                      0, NULL, &number_of_block,
    4069              :                                      &measurement_record_length,
    4070              :                                      measurement_record);
    4071            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
    4072              : /* #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT*/
    4073              :     /* assert_int_equal (spdm_context->transcript.message_m.buffer_size, 0);*/
    4074              : /* #endif*/
    4075            1 :     free(data);
    4076            1 : }
    4077              : 
    4078              : /**
    4079              :  * Test 22: request a large number of unsigned measurements before requesting a signature
    4080              :  * Expected Behavior: LIBSPDM_STATUS_SUCCESS return code and correct transcript.message_m.buffer_size while transcript.message_m has room; RETURN_DEVICE_ERROR otherwise
    4081              :  **/
    4082            1 : static void libspdm_test_requester_get_measurements_err_case22(void **state)
    4083              : {
    4084              :     libspdm_return_t status;
    4085              :     libspdm_test_context_t *spdm_test_context;
    4086              :     libspdm_context_t *spdm_context;
    4087              :     uint8_t number_of_block;
    4088              :     uint32_t measurement_record_length;
    4089              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
    4090              :     uint8_t request_attribute;
    4091              :     void *data;
    4092              :     size_t data_size;
    4093              :     void *hash;
    4094              :     size_t hash_size;
    4095              :     size_t NumberOfMessages;
    4096              : #define TOTAL_MESSAGES 100
    4097              : 
    4098            1 :     spdm_test_context = *state;
    4099            1 :     spdm_context = spdm_test_context->spdm_context;
    4100            1 :     spdm_test_context->case_id = 0x16;
    4101              : 
    4102            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    4103              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    4104            1 :     spdm_context->connection_info.connection_state =
    4105              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    4106            1 :     spdm_context->connection_info.capability.flags |=
    4107              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    4108            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    4109              :                                                          m_libspdm_use_asym_algo, &data,
    4110              :                                                          &data_size, &hash, &hash_size)) {
    4111            0 :         assert(false);
    4112              :     }
    4113            1 :     libspdm_reset_message_m(spdm_context, NULL);
    4114            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    4115              :         m_libspdm_use_measurement_spec;
    4116            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    4117              :         m_libspdm_use_measurement_hash_algo;
    4118            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    4119              :         m_libspdm_use_hash_algo;
    4120            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    4121              :         m_libspdm_use_asym_algo;
    4122            1 :     spdm_context->local_context.algorithm.measurement_spec =
    4123              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    4124              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    4125              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    4126              :         data_size;
    4127              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    4128              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    4129              :                      data, data_size);
    4130              : #else
    4131            1 :     libspdm_hash_all(
    4132              :         spdm_context->connection_info.algorithm.base_hash_algo,
    4133              :         data, data_size,
    4134            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
    4135            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
    4136            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
    4137            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
    4138              :         spdm_context->connection_info.algorithm.base_hash_algo,
    4139              :         spdm_context->connection_info.algorithm.base_asym_algo,
    4140              :         data, data_size,
    4141              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
    4142              : #endif
    4143              : 
    4144            1 :     request_attribute = 0;
    4145              : 
    4146            1 :     measurement_record_length = sizeof(measurement_record);
    4147          101 :     for (NumberOfMessages = 1; NumberOfMessages <= TOTAL_MESSAGES;
    4148          100 :          NumberOfMessages++) {
    4149          100 :         status = libspdm_get_measurement(spdm_context, NULL,
    4150              :                                          request_attribute, 1, 0,
    4151              :                                          NULL, &number_of_block,
    4152              :                                          &measurement_record_length,
    4153              :                                          measurement_record);
    4154              :         /* It may fail due to transcript.message_m overflow*/
    4155          100 :         if (status == LIBSPDM_STATUS_SUCCESS) {
    4156              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    4157              :             assert_int_equal(
    4158              :                 spdm_context->transcript.message_m.buffer_size,
    4159              :                 NumberOfMessages *
    4160              :                 (sizeof(spdm_message_header_t) +
    4161              :                  sizeof(spdm_measurements_response_t) +
    4162              :                  sizeof(spdm_measurement_block_dmtf_t) +
    4163              :                  libspdm_get_measurement_hash_size(
    4164              :                      m_libspdm_use_measurement_hash_algo) +
    4165              :                  SPDM_NONCE_SIZE +
    4166              :                  sizeof(uint16_t)));
    4167              : #endif
    4168              :         } else {
    4169              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    4170              :             assert_int_equal(
    4171              :                 spdm_context->transcript.message_m.buffer_size,
    4172              :                 0);
    4173              : #endif
    4174            0 :             break;
    4175              :         }
    4176              :     }
    4177            1 :     free(data);
    4178            1 : }
    4179              : 
    4180              : /**
    4181              :  * Test 23:
    4182              :  * Expected Behavior:
    4183              :  **/
    4184            1 : static void libspdm_test_requester_get_measurements_err_case23(void **state)
    4185              : {
    4186            1 : }
    4187              : 
    4188              : /**
    4189              :  * Test 24: Error case, response contains opaque data larger than the maximum allowed
    4190              :  * Expected Behavior: get a RETURN_DEVICE_ERROR return code, correct transcript.message_m.buffer_size
    4191              :  **/
    4192            1 : static void libspdm_test_requester_get_measurements_err_case24(void **state)
    4193              : {
    4194              :     libspdm_return_t status;
    4195              :     libspdm_test_context_t *spdm_test_context;
    4196              :     libspdm_context_t *spdm_context;
    4197              :     uint8_t number_of_block;
    4198              :     uint32_t measurement_record_length;
    4199              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
    4200              :     uint8_t request_attribute;
    4201              :     void *data;
    4202              :     size_t data_size;
    4203              :     void *hash;
    4204              :     size_t hash_size;
    4205              : 
    4206            1 :     spdm_test_context = *state;
    4207            1 :     spdm_context = spdm_test_context->spdm_context;
    4208            1 :     spdm_test_context->case_id = 0x18;
    4209              : 
    4210            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    4211              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    4212            1 :     spdm_context->connection_info.connection_state =
    4213              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    4214            1 :     spdm_context->connection_info.capability.flags |=
    4215              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    4216            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    4217              :                                                          m_libspdm_use_asym_algo, &data,
    4218              :                                                          &data_size, &hash, &hash_size)) {
    4219            0 :         assert(false);
    4220              :     }
    4221            1 :     libspdm_reset_message_m(spdm_context, NULL);
    4222            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    4223              :         m_libspdm_use_measurement_spec;
    4224            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    4225              :         m_libspdm_use_measurement_hash_algo;
    4226            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    4227              :         m_libspdm_use_hash_algo;
    4228            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    4229              :         m_libspdm_use_asym_algo;
    4230            1 :     spdm_context->local_context.algorithm.measurement_spec =
    4231              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    4232              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    4233              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    4234              :         data_size;
    4235              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    4236              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    4237              :                      data, data_size);
    4238              : #else
    4239            1 :     libspdm_hash_all(
    4240              :         spdm_context->connection_info.algorithm.base_hash_algo,
    4241              :         data, data_size,
    4242            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
    4243            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
    4244            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
    4245            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
    4246              :         spdm_context->connection_info.algorithm.base_hash_algo,
    4247              :         spdm_context->connection_info.algorithm.base_asym_algo,
    4248              :         data, data_size,
    4249              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
    4250              : #endif
    4251              : 
    4252            1 :     request_attribute = 0;
    4253              : 
    4254            1 :     measurement_record_length = sizeof(measurement_record);
    4255            1 :     status = libspdm_get_measurement(spdm_context, NULL, request_attribute, 1,
    4256              :                                      0, NULL, &number_of_block,
    4257              :                                      &measurement_record_length,
    4258              :                                      measurement_record);
    4259            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
    4260              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    4261              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size,
    4262              :                      0);
    4263              : #endif
    4264            1 :     free(data);
    4265            1 : }
    4266              : 
    4267              : /**
    4268              :  * Test 25: Requester does not request a signature and `content_changed` is non-zero in the response.
    4269              :  * Expected Behavior: returns with LIBSPDM_STATUS_INVALID_MSG_FIELD.
    4270              :  **/
    4271            1 : static void libspdm_test_requester_get_measurements_err_case25(void **state)
    4272              : {
    4273              :     libspdm_return_t status;
    4274              :     libspdm_test_context_t *spdm_test_context;
    4275              :     libspdm_context_t *spdm_context;
    4276              :     uint8_t number_of_block;
    4277              :     uint32_t measurement_record_length;
    4278              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
    4279              :     uint8_t request_attribute;
    4280              :     void *data;
    4281              :     size_t data_size;
    4282              :     void *hash;
    4283              :     size_t hash_size;
    4284              : 
    4285            1 :     spdm_test_context = *state;
    4286            1 :     spdm_context = spdm_test_context->spdm_context;
    4287            1 :     spdm_test_context->case_id = 0x19;
    4288              : 
    4289            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
    4290              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    4291            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    4292            1 :     spdm_context->connection_info.capability.flags |=
    4293              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    4294            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    4295              :                                                          m_libspdm_use_asym_algo, &data,
    4296              :                                                          &data_size, &hash, &hash_size)) {
    4297            0 :         assert(false);
    4298              :     }
    4299            1 :     libspdm_reset_message_m(spdm_context, NULL);
    4300            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
    4301            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    4302              :         m_libspdm_use_measurement_hash_algo;
    4303            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    4304            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    4305            1 :     spdm_context->local_context.algorithm.measurement_spec =
    4306              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    4307              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    4308              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = data_size;
    4309              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    4310              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    4311              :                      data, data_size);
    4312              : #else
    4313            1 :     libspdm_hash_all(
    4314              :         spdm_context->connection_info.algorithm.base_hash_algo,
    4315              :         data, data_size,
    4316            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
    4317            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
    4318            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
    4319            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
    4320              :         spdm_context->connection_info.algorithm.base_hash_algo,
    4321              :         spdm_context->connection_info.algorithm.base_asym_algo,
    4322              :         data, data_size,
    4323              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
    4324              : #endif
    4325              : 
    4326            1 :     request_attribute = 0;
    4327              : 
    4328            1 :     measurement_record_length = sizeof(measurement_record);
    4329            1 :     status = libspdm_get_measurement(spdm_context, NULL, request_attribute, 1,
    4330              :                                      0, NULL, &number_of_block,
    4331              :                                      &measurement_record_length,
    4332              :                                      measurement_record);
    4333            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
    4334              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    4335              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
    4336              : #endif
    4337            1 :     free(data);
    4338            1 : }
    4339              : 
    4340              : /**
    4341              :  * Test 26: Error case, request with signature, but response opaque data is S bytes shorter than informed
    4342              :  * Expected Behavior: get a RETURN_DEVICE_ERROR return code, correct transcript.message_m.buffer_size
    4343              :  **/
    4344            1 : static void libspdm_test_requester_get_measurements_err_case26(void **state)
    4345              : {
    4346              :     libspdm_return_t status;
    4347              :     libspdm_test_context_t *spdm_test_context;
    4348              :     libspdm_context_t *spdm_context;
    4349              :     uint8_t number_of_block;
    4350              :     uint32_t measurement_record_length;
    4351              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
    4352              :     uint8_t request_attribute;
    4353              :     void *data;
    4354              :     size_t data_size;
    4355              :     void *hash;
    4356              :     size_t hash_size;
    4357              : 
    4358            1 :     spdm_test_context = *state;
    4359            1 :     spdm_context = spdm_test_context->spdm_context;
    4360            1 :     spdm_test_context->case_id = 0x1A;
    4361              : 
    4362            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    4363              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    4364            1 :     spdm_context->connection_info.connection_state =
    4365              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    4366            1 :     spdm_context->connection_info.capability.flags |=
    4367              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    4368            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    4369              :                                                          m_libspdm_use_asym_algo, &data,
    4370              :                                                          &data_size, &hash, &hash_size)) {
    4371            0 :         assert(false);
    4372              :     }
    4373            1 :     libspdm_reset_message_m(spdm_context, NULL);
    4374            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    4375              :         m_libspdm_use_measurement_spec;
    4376            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    4377              :         m_libspdm_use_measurement_hash_algo;
    4378            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    4379              :         m_libspdm_use_hash_algo;
    4380            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    4381              :         m_libspdm_use_asym_algo;
    4382            1 :     spdm_context->local_context.algorithm.measurement_spec =
    4383              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    4384              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    4385              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    4386              :         data_size;
    4387              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    4388              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    4389              :                      data, data_size);
    4390              : #else
    4391            1 :     libspdm_hash_all(
    4392              :         spdm_context->connection_info.algorithm.base_hash_algo,
    4393              :         data, data_size,
    4394            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
    4395            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
    4396            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
    4397            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
    4398              :         spdm_context->connection_info.algorithm.base_hash_algo,
    4399              :         spdm_context->connection_info.algorithm.base_asym_algo,
    4400              :         data, data_size,
    4401              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
    4402              : #endif
    4403              : 
    4404            1 :     request_attribute =
    4405              :         SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE;
    4406              : 
    4407            1 :     measurement_record_length = sizeof(measurement_record);
    4408            1 :     status = libspdm_get_measurement(spdm_context, NULL, request_attribute, 1,
    4409              :                                      0, NULL, &number_of_block,
    4410              :                                      &measurement_record_length,
    4411              :                                      measurement_record);
    4412            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_SIZE);
    4413              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    4414              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size,
    4415              :                      0);
    4416              : #endif
    4417            1 :     free(data);
    4418            1 : }
    4419              : 
    4420              : /**
    4421              :  * Test 27: Error case, request with signature, but response opaque data is (S+1) bytes shorter than informed
    4422              :  * Expected Behavior: get a RETURN_DEVICE_ERROR return code, correct transcript.message_m.buffer_size
    4423              :  **/
    4424            1 : static void libspdm_test_requester_get_measurements_err_case27(void **state)
    4425              : {
    4426              :     libspdm_return_t status;
    4427              :     libspdm_test_context_t *spdm_test_context;
    4428              :     libspdm_context_t *spdm_context;
    4429              :     uint8_t number_of_block;
    4430              :     uint32_t measurement_record_length;
    4431              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
    4432              :     uint8_t request_attribute;
    4433              :     void *data;
    4434              :     size_t data_size;
    4435              :     void *hash;
    4436              :     size_t hash_size;
    4437              : 
    4438            1 :     spdm_test_context = *state;
    4439            1 :     spdm_context = spdm_test_context->spdm_context;
    4440            1 :     spdm_test_context->case_id = 0x1B;
    4441              : 
    4442            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    4443              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    4444            1 :     spdm_context->connection_info.connection_state =
    4445              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    4446            1 :     spdm_context->connection_info.capability.flags |=
    4447              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    4448            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    4449              :                                                          m_libspdm_use_asym_algo, &data,
    4450              :                                                          &data_size, &hash, &hash_size)) {
    4451            0 :         assert(false);
    4452              :     }
    4453            1 :     libspdm_reset_message_m(spdm_context, NULL);
    4454            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    4455              :         m_libspdm_use_measurement_spec;
    4456            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    4457              :         m_libspdm_use_measurement_hash_algo;
    4458            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    4459              :         m_libspdm_use_hash_algo;
    4460            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    4461              :         m_libspdm_use_asym_algo;
    4462            1 :     spdm_context->local_context.algorithm.measurement_spec =
    4463              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    4464              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    4465              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    4466              :         data_size;
    4467              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    4468              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    4469              :                      data, data_size);
    4470              : #else
    4471            1 :     libspdm_hash_all(
    4472              :         spdm_context->connection_info.algorithm.base_hash_algo,
    4473              :         data, data_size,
    4474            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
    4475            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
    4476            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
    4477            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
    4478              :         spdm_context->connection_info.algorithm.base_hash_algo,
    4479              :         spdm_context->connection_info.algorithm.base_asym_algo,
    4480              :         data, data_size,
    4481              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
    4482              : #endif
    4483              : 
    4484            1 :     request_attribute =
    4485              :         SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE;
    4486              : 
    4487            1 :     measurement_record_length = sizeof(measurement_record);
    4488            1 :     status = libspdm_get_measurement(spdm_context, NULL, request_attribute, 1,
    4489              :                                      0, NULL, &number_of_block,
    4490              :                                      &measurement_record_length,
    4491              :                                      measurement_record);
    4492            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_SIZE);
    4493              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    4494              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size,
    4495              :                      0);
    4496              : #endif
    4497            1 :     free(data);
    4498            1 : }
    4499              : 
    4500              : /**
    4501              :  * Test 28: Error case, request with signature, but response opaque data is 1 byte longer than informed
    4502              :  * Expected Behavior: get a RETURN_DEVICE_ERROR return code, correct transcript.message_m.buffer_size
    4503              :  **/
    4504            1 : static void libspdm_test_requester_get_measurements_err_case28(void **state)
    4505              : {
    4506              :     libspdm_return_t status;
    4507              :     libspdm_test_context_t *spdm_test_context;
    4508              :     libspdm_context_t *spdm_context;
    4509              :     uint8_t number_of_block;
    4510              :     uint32_t measurement_record_length;
    4511              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
    4512              :     uint8_t request_attribute;
    4513              :     void *data;
    4514              :     size_t data_size;
    4515              :     void *hash;
    4516              :     size_t hash_size;
    4517              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    4518              :     size_t ExpectedBufferSize;
    4519              : #endif
    4520            1 :     spdm_test_context = *state;
    4521            1 :     spdm_context = spdm_test_context->spdm_context;
    4522            1 :     spdm_test_context->case_id = 0x1C;
    4523              : 
    4524            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    4525              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    4526            1 :     spdm_context->connection_info.connection_state =
    4527              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    4528            1 :     spdm_context->connection_info.capability.flags |=
    4529              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    4530            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    4531              :                                                          m_libspdm_use_asym_algo, &data,
    4532              :                                                          &data_size, &hash, &hash_size)) {
    4533            0 :         assert(false);
    4534              :     }
    4535            1 :     libspdm_reset_message_m(spdm_context, NULL);
    4536            1 :     spdm_context->connection_info.algorithm.measurement_spec =
    4537              :         m_libspdm_use_measurement_spec;
    4538            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    4539              :         m_libspdm_use_measurement_hash_algo;
    4540            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
    4541              :         m_libspdm_use_hash_algo;
    4542            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
    4543              :         m_libspdm_use_asym_algo;
    4544            1 :     spdm_context->local_context.algorithm.measurement_spec =
    4545              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    4546              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    4547              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    4548              :         data_size;
    4549              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    4550              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    4551              :                      data, data_size);
    4552              : #else
    4553            1 :     libspdm_hash_all(
    4554              :         spdm_context->connection_info.algorithm.base_hash_algo,
    4555              :         data, data_size,
    4556            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
    4557            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
    4558            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
    4559            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
    4560              :         spdm_context->connection_info.algorithm.base_hash_algo,
    4561              :         spdm_context->connection_info.algorithm.base_asym_algo,
    4562              :         data, data_size,
    4563              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
    4564              : #endif
    4565              : 
    4566            1 :     request_attribute =
    4567              :         SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE;
    4568              : 
    4569            1 :     measurement_record_length = sizeof(measurement_record);
    4570            1 :     status = libspdm_get_measurement(spdm_context, NULL, request_attribute, 1,
    4571              :                                      0, NULL, &number_of_block,
    4572              :                                      &measurement_record_length,
    4573              :                                      measurement_record);
    4574            1 :     assert_int_equal(status, LIBSPDM_STATUS_VERIF_FAIL);
    4575              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    4576              :     ExpectedBufferSize = 0;
    4577              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size,
    4578              :                      ExpectedBufferSize);
    4579              : #endif
    4580            1 :     free(data);
    4581            1 : }
    4582              : 
    4583              : /**
    4584              :  * Test 29:
    4585              :  * Expected Behavior:
    4586              :  **/
    4587            1 : static void libspdm_test_requester_get_measurements_err_case29(void **state)
    4588              : {
    4589            1 : }
    4590              : 
    4591              : /**
    4592              :  * Test 30:
    4593              :  * Expected Behavior:
    4594              :  **/
    4595            1 : static void libspdm_test_requester_get_measurements_err_case30(void **state)
    4596              : {
    4597            1 : }
    4598              : 
    4599              : /**
    4600              :  * Test 31: Error case, response contains opaque data larger than the maximum allowed. MAXUINT16 is used
    4601              :  * Expected Behavior: get a RETURN_DEVICE_ERROR return code, correct transcript.message_m.buffer_size
    4602              :  **/
    4603            1 : static void libspdm_test_requester_get_measurements_err_case31(void **state)
    4604              : {
    4605            1 : }
    4606              : 
    4607              : /**
    4608              :  * Test 32:
    4609              :  * Expected Behavior:
    4610              :  **/
    4611            1 : static void libspdm_test_requester_get_measurements_err_case32(void **state)
    4612              : {
    4613            1 : }
    4614              : 
    4615              : /**
    4616              :  * Test 33: receiving an unexpected ERROR message from the responder.
    4617              :  * There are tests for all named codes, including some reserved ones
    4618              :  * (namely, 0x00, 0x0b, 0x0c, 0x3f, 0xfd, 0xfe).
    4619              :  * However, for having specific test cases, it is excluded from this case:
    4620              :  * Busy (0x03), ResponseNotReady (0x42), and RequestResync (0x43).
    4621              :  * Expected behavior: client returns a status of RETURN_DEVICE_ERROR.
    4622              :  **/
    4623            1 : static void libspdm_test_requester_get_measurements_err_case33(void **state) {
    4624              :     libspdm_return_t status;
    4625              :     libspdm_test_context_t    *spdm_test_context;
    4626              :     libspdm_context_t  *spdm_context;
    4627              :     uint8_t number_of_block;
    4628              :     uint32_t measurement_record_length;
    4629              :     uint8_t measurement_record[LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE];
    4630              :     uint8_t request_attribute;
    4631              :     void                 *data;
    4632              :     size_t data_size;
    4633              :     void                 *hash;
    4634              :     size_t hash_size;
    4635              :     uint16_t error_code;
    4636              : 
    4637            1 :     spdm_test_context = *state;
    4638            1 :     spdm_context = spdm_test_context->spdm_context;
    4639            1 :     spdm_test_context->case_id = 0x21;
    4640            1 :     spdm_context->connection_info.capability.flags |=
    4641              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
    4642            1 :     libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
    4643              :                                                      m_libspdm_use_asym_algo,
    4644              :                                                      &data, &data_size,
    4645              :                                                      &hash, &hash_size);
    4646            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
    4647            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    4648              :         m_libspdm_use_measurement_hash_algo;
    4649            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    4650            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    4651            1 :     spdm_context->local_context.algorithm.measurement_spec =
    4652              :         SPDM_MEASUREMENT_SPECIFICATION_DMTF;
    4653              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    4654              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
    4655              :         data_size;
    4656              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    4657              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    4658              :                      data, data_size);
    4659              : #else
    4660            1 :     libspdm_hash_all(
    4661              :         spdm_context->connection_info.algorithm.base_hash_algo,
    4662              :         data, data_size,
    4663            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
    4664            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
    4665            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
    4666            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
    4667              :         spdm_context->connection_info.algorithm.base_hash_algo,
    4668              :         spdm_context->connection_info.algorithm.base_asym_algo,
    4669              :         data, data_size,
    4670              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
    4671              : #endif
    4672              : 
    4673            1 :     request_attribute = SPDM_GET_MEASUREMENTS_REQUEST_ATTRIBUTES_GENERATE_SIGNATURE;
    4674              : 
    4675            1 :     error_code = LIBSPDM_ERROR_CODE_RESERVED_00;
    4676           19 :     while(error_code <= 0xff) {
    4677           18 :         spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
    4678           18 :         libspdm_reset_message_m(spdm_context, NULL);
    4679              : 
    4680           18 :         measurement_record_length = sizeof(measurement_record);
    4681           18 :         status = libspdm_get_measurement (spdm_context, NULL, request_attribute, 1, 0, NULL,
    4682              :                                           &number_of_block, &measurement_record_length,
    4683              :                                           measurement_record);
    4684           18 :         LIBSPDM_ASSERT_INT_EQUAL_CASE (status, LIBSPDM_STATUS_ERROR_PEER, error_code);
    4685              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    4686              :         /* assert_int_equal (spdm_context->transcript.message_m.buffer_size, 0);*/
    4687              :         LIBSPDM_ASSERT_INT_EQUAL_CASE (spdm_context->transcript.message_m.buffer_size, 0,
    4688              :                                        error_code);
    4689              : #endif
    4690              : 
    4691           18 :         error_code++;
    4692           18 :         if(error_code == SPDM_ERROR_CODE_BUSY) { /*busy is treated in cases 5 and 6*/
    4693            1 :             error_code = SPDM_ERROR_CODE_UNEXPECTED_REQUEST;
    4694              :         }
    4695           18 :         if(error_code == LIBSPDM_ERROR_CODE_RESERVED_0D) { /*skip some reserved error codes (0d to 3e)*/
    4696            1 :             error_code = LIBSPDM_ERROR_CODE_RESERVED_3F;
    4697              :         }
    4698           18 :         if(error_code == SPDM_ERROR_CODE_RESPONSE_NOT_READY) { /*skip response not ready, request resync, and some reserved codes (44 to fc)*/
    4699            1 :             error_code = LIBSPDM_ERROR_CODE_RESERVED_FD;
    4700              :         }
    4701              :     }
    4702              : 
    4703            1 :     free(data);
    4704            1 : }
    4705              : 
    4706              : /**
    4707              :  * Test 34:
    4708              :  * Expected Behavior:
    4709              :  **/
    4710            1 : static void libspdm_test_requester_get_measurements_err_case34(void **state)
    4711              : {
    4712            1 : }
    4713              : 
    4714              : /**
    4715              :  * Test 35:
    4716              :  * Expected Behavior:
    4717              :  **/
    4718            1 : static void libspdm_test_requester_get_measurements_err_case35(void **state)
    4719              : {
    4720            1 : }
    4721              : 
    4722            1 : static void libspdm_test_requester_get_measurements_err_case36(void **state)
    4723              : {
    4724            1 : }
    4725              : 
    4726            1 : static void libspdm_test_requester_get_measurements_err_case37(void **state)
    4727              : {
    4728            1 : }
    4729              : 
    4730            1 : int libspdm_req_get_measurements_error_test(void)
    4731              : {
    4732            1 :     const struct CMUnitTest test_cases[] = {
    4733              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case1),
    4734              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case2),
    4735              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case3),
    4736              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case4),
    4737              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case5),
    4738              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case6),
    4739              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case7),
    4740              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case8),
    4741              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case9),
    4742              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case10),
    4743              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case11),
    4744              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case12),
    4745              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case13),
    4746              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case14),
    4747              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case15),
    4748              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case16),
    4749              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case17),
    4750              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case18),
    4751              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case19),
    4752              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case20),
    4753              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case21),
    4754              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case22),
    4755              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case23),
    4756              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case24),
    4757              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case25),
    4758              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case26),
    4759              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case27),
    4760              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case28),
    4761              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case29),
    4762              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case30),
    4763              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case31),
    4764              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case32),
    4765              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case33),
    4766              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case34),
    4767              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case35),
    4768              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case36),
    4769              :         cmocka_unit_test(libspdm_test_requester_get_measurements_err_case37),
    4770              :     };
    4771              : 
    4772            1 :     libspdm_test_context_t test_context = {
    4773              :         LIBSPDM_TEST_CONTEXT_VERSION,
    4774              :         true,
    4775              :         send_message,
    4776              :         receive_message,
    4777              :     };
    4778              : 
    4779            1 :     libspdm_setup_test_context(&test_context);
    4780              : 
    4781            1 :     return cmocka_run_group_tests(test_cases,
    4782              :                                   libspdm_unit_test_group_setup,
    4783              :                                   libspdm_unit_test_group_teardown);
    4784              : }
    4785              : 
    4786              : #endif /* LIBSPDM_ENABLE_CAPABILITY_MEAS_CAP*/
        

Generated by: LCOV version 2.0-1