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

Generated by: LCOV version 2.0-1