LCOV - code coverage report
Current view: top level - unit_test/test_spdm_requester - get_version.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 47.9 % 340 163
Test Date: 2025-06-29 08:09:00 Functions: 100.0 % 8 8

            Line data    Source code
       1              : /**
       2              :  *  Copyright Notice:
       3              :  *  Copyright 2021-2022 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              : 
      10              : #pragma pack(1)
      11              : typedef struct {
      12              :     spdm_message_header_t header;
      13              :     uint8_t reserved;
      14              :     uint8_t version_number_entry_count;
      15              :     spdm_version_number_t version_number_entry[LIBSPDM_MAX_VERSION_COUNT];
      16              : } libspdm_version_response_mine_t;
      17              : #pragma pack()
      18              : 
      19              : static size_t m_libspdm_local_buffer_size;
      20              : static uint8_t m_libspdm_local_buffer[LIBSPDM_MAX_MESSAGE_VCA_BUFFER_SIZE];
      21              : 
      22            6 : static libspdm_return_t libspdm_requester_get_version_test_send_message(
      23              :     void *spdm_context, size_t request_size, const void *request,
      24              :     uint64_t timeout)
      25              : {
      26              :     libspdm_test_context_t *spdm_test_context;
      27              : 
      28            6 :     spdm_test_context = libspdm_get_test_context();
      29            6 :     switch (spdm_test_context->case_id) {
      30            0 :     case 0x1:
      31            0 :         return LIBSPDM_STATUS_SUCCESS;
      32            1 :     case 0x2:
      33            1 :         return LIBSPDM_STATUS_SUCCESS;
      34            0 :     case 0x3:
      35            0 :         return LIBSPDM_STATUS_SUCCESS;
      36            0 :     case 0x4:
      37            0 :         return LIBSPDM_STATUS_SUCCESS;
      38            0 :     case 0x5:
      39            0 :         return LIBSPDM_STATUS_SUCCESS;
      40            2 :     case 0x6:
      41            2 :         return LIBSPDM_STATUS_SUCCESS;
      42            0 :     case 0x7:
      43            0 :         return LIBSPDM_STATUS_SUCCESS;
      44            0 :     case 0x8:
      45            0 :         return LIBSPDM_STATUS_SUCCESS;
      46            0 :     case 0x9:
      47            0 :         return LIBSPDM_STATUS_SUCCESS;
      48            1 :     case 0xA:
      49            1 :         return LIBSPDM_STATUS_SUCCESS;
      50            0 :     case 0xB:
      51            0 :         return LIBSPDM_STATUS_SUCCESS;
      52            0 :     case 0xC:
      53            0 :         return LIBSPDM_STATUS_SUCCESS;
      54            0 :     case 0xD:
      55            0 :         return LIBSPDM_STATUS_SUCCESS;
      56            0 :     case 0xE:
      57            0 :         return LIBSPDM_STATUS_SUCCESS;
      58            1 :     case 0xF:
      59            1 :         return LIBSPDM_STATUS_SUCCESS;
      60            1 :     case 0x10: {
      61            1 :         const uint8_t *ptr = (const uint8_t *)request;
      62              : 
      63            1 :         m_libspdm_local_buffer_size = 0;
      64            1 :         libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
      65            1 :                          &ptr[1], request_size - 1);
      66            1 :         m_libspdm_local_buffer_size += (request_size - 1);
      67              :     }
      68            1 :         return LIBSPDM_STATUS_SUCCESS;
      69            0 :     case 0x11:
      70            0 :         return LIBSPDM_STATUS_SUCCESS;
      71            0 :     case 0x12:
      72            0 :         return LIBSPDM_STATUS_SUCCESS;
      73            0 :     default:
      74            0 :         return LIBSPDM_STATUS_SEND_FAIL;
      75              :     }
      76              : }
      77              : 
      78            6 : static libspdm_return_t libspdm_requester_get_version_test_receive_message(
      79              :     void *spdm_context, size_t *response_size,
      80              :     void **response, uint64_t timeout)
      81              : {
      82              :     libspdm_test_context_t *spdm_test_context;
      83              : 
      84            6 :     spdm_test_context = libspdm_get_test_context();
      85            6 :     switch (spdm_test_context->case_id) {
      86            0 :     case 0x1:
      87            0 :         return LIBSPDM_STATUS_RECEIVE_FAIL;
      88              : 
      89            1 :     case 0x2: {
      90              :         libspdm_version_response_mine_t *spdm_response;
      91              :         size_t spdm_response_size;
      92              :         size_t transport_header_size;
      93              : 
      94            1 :         spdm_response_size = sizeof(libspdm_version_response_mine_t);
      95            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
      96            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
      97              : 
      98            1 :         libspdm_zero_mem(spdm_response, spdm_response_size);
      99            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_10;
     100            1 :         spdm_response->header.request_response_code = SPDM_VERSION;
     101            1 :         spdm_response->header.param1 = 0;
     102            1 :         spdm_response->header.param2 = 0;
     103            1 :         spdm_response->version_number_entry_count = 2;
     104            1 :         spdm_response->version_number_entry[0] = 0x10 << SPDM_VERSION_NUMBER_SHIFT_BIT;
     105            1 :         spdm_response->version_number_entry[1] = 0x11 << SPDM_VERSION_NUMBER_SHIFT_BIT;
     106              : 
     107            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     108              :                                               false, spdm_response_size,
     109              :                                               spdm_response,
     110              :                                               response_size, response);
     111              :     }
     112            1 :         return LIBSPDM_STATUS_SUCCESS;
     113              : 
     114            0 :     case 0x3: {
     115              :         spdm_version_response_t *spdm_response;
     116              :         size_t spdm_response_size;
     117              :         size_t transport_header_size;
     118              : 
     119            0 :         spdm_response_size = sizeof(spdm_version_response_t);
     120            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     121            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     122              : 
     123            0 :         libspdm_zero_mem(spdm_response, spdm_response_size);
     124            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_10;
     125            0 :         spdm_response->header.request_response_code = SPDM_VERSION;
     126            0 :         spdm_response->header.param1 = 0;
     127            0 :         spdm_response->header.param2 = 0;
     128            0 :         spdm_response->version_number_entry_count = 0;
     129              : 
     130            0 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     131              :                                               false, spdm_response_size,
     132              :                                               spdm_response,
     133              :                                               response_size, response);
     134              :     }
     135            0 :         return LIBSPDM_STATUS_SUCCESS;
     136              : 
     137            0 :     case 0x4: {
     138              :         spdm_error_response_t *spdm_response;
     139              :         size_t spdm_response_size;
     140              :         size_t transport_header_size;
     141              : 
     142            0 :         spdm_response_size = sizeof(spdm_error_response_t);
     143            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     144            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     145              : 
     146            0 :         libspdm_zero_mem(spdm_response, spdm_response_size);
     147            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_10;
     148            0 :         spdm_response->header.request_response_code = SPDM_ERROR;
     149            0 :         spdm_response->header.param1 = SPDM_ERROR_CODE_INVALID_REQUEST;
     150            0 :         spdm_response->header.param2 = 0;
     151              : 
     152            0 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     153              :                                               false, spdm_response_size,
     154              :                                               spdm_response,
     155              :                                               response_size, response);
     156              :     }
     157            0 :         return LIBSPDM_STATUS_SUCCESS;
     158              : 
     159            0 :     case 0x5: {
     160              :         spdm_error_response_t *spdm_response;
     161              :         size_t spdm_response_size;
     162              :         size_t transport_header_size;
     163              : 
     164            0 :         spdm_response_size = sizeof(spdm_error_response_t);
     165            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     166            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     167              : 
     168            0 :         libspdm_zero_mem(spdm_response, spdm_response_size);
     169            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_10;
     170            0 :         spdm_response->header.request_response_code = SPDM_ERROR;
     171            0 :         spdm_response->header.param1 = SPDM_ERROR_CODE_BUSY;
     172            0 :         spdm_response->header.param2 = 0;
     173              : 
     174            0 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     175              :                                               false, spdm_response_size,
     176              :                                               spdm_response,
     177              :                                               response_size, response);
     178              :     }
     179            0 :         return LIBSPDM_STATUS_SUCCESS;
     180              : 
     181            2 :     case 0x6: {
     182              :         static size_t sub_index1 = 0;
     183            2 :         if (sub_index1 == 0) {
     184              :             spdm_error_response_t *spdm_response;
     185              :             size_t spdm_response_size;
     186              :             size_t transport_header_size;
     187              : 
     188            1 :             spdm_response_size = sizeof(spdm_error_response_t);
     189            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     190            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     191              : 
     192            1 :             libspdm_zero_mem(spdm_response, spdm_response_size);
     193            1 :             spdm_response->header.spdm_version =
     194              :                 SPDM_MESSAGE_VERSION_10;
     195            1 :             spdm_response->header.request_response_code = SPDM_ERROR;
     196            1 :             spdm_response->header.param1 = SPDM_ERROR_CODE_BUSY;
     197            1 :             spdm_response->header.param2 = 0;
     198              : 
     199            1 :             libspdm_transport_test_encode_message(
     200              :                 spdm_context, NULL, false, false,
     201              :                 spdm_response_size, spdm_response,
     202              :                 response_size, response);
     203            1 :         } else if (sub_index1 == 1) {
     204              :             libspdm_version_response_mine_t *spdm_response;
     205              :             size_t spdm_response_size;
     206              :             size_t transport_header_size;
     207              : 
     208            1 :             spdm_response_size = sizeof(libspdm_version_response_mine_t);
     209            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     210            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     211              : 
     212            1 :             libspdm_zero_mem(spdm_response, spdm_response_size);
     213            1 :             spdm_response->header.spdm_version =
     214              :                 SPDM_MESSAGE_VERSION_10;
     215            1 :             spdm_response->header.request_response_code =
     216              :                 SPDM_VERSION;
     217            1 :             spdm_response->header.param1 = 0;
     218            1 :             spdm_response->header.param2 = 0;
     219            1 :             spdm_response->version_number_entry_count = 2;
     220            1 :             spdm_response->version_number_entry[0] = 0x10 << SPDM_VERSION_NUMBER_SHIFT_BIT;
     221            1 :             spdm_response->version_number_entry[1] = 0x11 << SPDM_VERSION_NUMBER_SHIFT_BIT;
     222              : 
     223            1 :             libspdm_transport_test_encode_message(
     224              :                 spdm_context, NULL, false, false,
     225              :                 spdm_response_size, spdm_response,
     226              :                 response_size, response);
     227              :         }
     228            2 :         sub_index1++;
     229              :     }
     230            2 :         return LIBSPDM_STATUS_SUCCESS;
     231              : 
     232            0 :     case 0x7: {
     233              :         spdm_error_response_t *spdm_response;
     234              :         size_t spdm_response_size;
     235              :         size_t transport_header_size;
     236              : 
     237            0 :         spdm_response_size = sizeof(spdm_error_response_t);
     238            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     239            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     240              : 
     241            0 :         libspdm_zero_mem(spdm_response, spdm_response_size);
     242            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_10;
     243            0 :         spdm_response->header.request_response_code = SPDM_ERROR;
     244            0 :         spdm_response->header.param1 = SPDM_ERROR_CODE_REQUEST_RESYNCH;
     245            0 :         spdm_response->header.param2 = 0;
     246              : 
     247            0 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     248              :                                               false, spdm_response_size,
     249              :                                               spdm_response,
     250              :                                               response_size, response);
     251              :     }
     252            0 :         return LIBSPDM_STATUS_SUCCESS;
     253              : 
     254            0 :     case 0x8: {
     255              :         spdm_error_response_data_response_not_ready_t *spdm_response;
     256              :         size_t spdm_response_size;
     257              :         size_t transport_header_size;
     258              : 
     259            0 :         spdm_response_size = sizeof(spdm_error_response_data_response_not_ready_t);
     260            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     261            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     262              : 
     263            0 :         libspdm_zero_mem(spdm_response, spdm_response_size);
     264            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_10;
     265            0 :         spdm_response->header.request_response_code = SPDM_ERROR;
     266            0 :         spdm_response->header.param1 =
     267              :             SPDM_ERROR_CODE_RESPONSE_NOT_READY;
     268            0 :         spdm_response->header.param2 = 0;
     269            0 :         spdm_response->extend_error_data.rd_exponent = 1;
     270            0 :         spdm_response->extend_error_data.rd_tm = 2;
     271            0 :         spdm_response->extend_error_data.request_code = SPDM_GET_VERSION;
     272            0 :         spdm_response->extend_error_data.token = 0;
     273              : 
     274            0 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     275              :                                               false, spdm_response_size,
     276              :                                               spdm_response,
     277              :                                               response_size, response);
     278              :     }
     279            0 :         return LIBSPDM_STATUS_SUCCESS;
     280              : 
     281            0 :     case 0x9:
     282            0 :         return LIBSPDM_STATUS_SUCCESS;
     283              : 
     284            1 :     case 0xA: {
     285              :         libspdm_version_response_mine_t *spdm_response;
     286              :         size_t spdm_response_size;
     287              :         size_t transport_header_size;
     288              : 
     289            1 :         spdm_response_size = sizeof(libspdm_version_response_mine_t);
     290            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     291            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     292              : 
     293            1 :         libspdm_zero_mem(spdm_response, spdm_response_size);
     294            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_10;
     295            1 :         spdm_response->header.request_response_code = SPDM_VERSION;
     296            1 :         spdm_response->header.param1 = 0;
     297            1 :         spdm_response->header.param2 = 0;
     298            1 :         spdm_response->version_number_entry_count = 2;
     299            1 :         spdm_response->version_number_entry[0] = 0x10 << SPDM_VERSION_NUMBER_SHIFT_BIT;
     300            1 :         spdm_response->version_number_entry[1] = 0x11 << SPDM_VERSION_NUMBER_SHIFT_BIT;
     301            1 :         spdm_response->version_number_entry[2] = 0x12 << SPDM_VERSION_NUMBER_SHIFT_BIT;
     302              : 
     303            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     304              :                                               false, spdm_response_size,
     305              :                                               spdm_response,
     306              :                                               response_size, response);
     307              :     }
     308            1 :         return LIBSPDM_STATUS_SUCCESS;
     309              : 
     310            0 :     case 0xB: {
     311              :         libspdm_version_response_mine_t *spdm_response;
     312              :         size_t spdm_response_size;
     313              :         size_t transport_header_size;
     314              : 
     315            0 :         spdm_response_size = sizeof(libspdm_version_response_mine_t);
     316            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     317            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     318              : 
     319            0 :         libspdm_zero_mem(spdm_response, spdm_response_size);
     320            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_10;
     321            0 :         spdm_response->header.request_response_code = SPDM_VERSION;
     322            0 :         spdm_response->header.param1 = 0;
     323            0 :         spdm_response->header.param2 = 0;
     324            0 :         spdm_response->version_number_entry_count = 2;
     325            0 :         spdm_response->version_number_entry[0] = 0xA0 << SPDM_VERSION_NUMBER_SHIFT_BIT;
     326            0 :         spdm_response->version_number_entry[1] = 0xA1 << SPDM_VERSION_NUMBER_SHIFT_BIT;
     327              : 
     328            0 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     329              :                                               false, spdm_response_size,
     330              :                                               spdm_response,
     331              :                                               response_size, response);
     332              :     }
     333            0 :         return LIBSPDM_STATUS_SUCCESS;
     334              : 
     335            0 :     case 0xC: {
     336              :         libspdm_version_response_mine_t *spdm_response;
     337              :         size_t spdm_response_size;
     338              :         size_t transport_header_size;
     339              : 
     340            0 :         spdm_response_size = sizeof(libspdm_version_response_mine_t);
     341            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     342            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     343              : 
     344            0 :         libspdm_zero_mem(spdm_response, spdm_response_size);
     345            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     346            0 :         spdm_response->header.request_response_code = SPDM_VERSION;
     347            0 :         spdm_response->header.param1 = 0;
     348            0 :         spdm_response->header.param2 = 0;
     349            0 :         spdm_response->version_number_entry_count = 2;
     350            0 :         spdm_response->version_number_entry[0] = 0x10 << SPDM_VERSION_NUMBER_SHIFT_BIT;
     351            0 :         spdm_response->version_number_entry[1] = 0x11 << SPDM_VERSION_NUMBER_SHIFT_BIT;
     352              : 
     353            0 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     354              :                                               false, spdm_response_size,
     355              :                                               spdm_response,
     356              :                                               response_size, response);
     357              :     }
     358            0 :         return LIBSPDM_STATUS_SUCCESS;
     359              : 
     360            0 :     case 0xD: {
     361              :         libspdm_version_response_mine_t *spdm_response;
     362              :         size_t spdm_response_size;
     363              :         size_t transport_header_size;
     364              : 
     365            0 :         spdm_response_size = sizeof(libspdm_version_response_mine_t);
     366            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     367            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     368              : 
     369            0 :         libspdm_zero_mem(spdm_response, spdm_response_size);
     370            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_10;
     371            0 :         spdm_response->header.request_response_code = SPDM_GET_VERSION;
     372            0 :         spdm_response->header.param1 = 0;
     373            0 :         spdm_response->header.param2 = 0;
     374            0 :         spdm_response->version_number_entry_count = 2;
     375            0 :         spdm_response->version_number_entry[0] = 0x10 << SPDM_VERSION_NUMBER_SHIFT_BIT;
     376            0 :         spdm_response->version_number_entry[1] = 0x11 << SPDM_VERSION_NUMBER_SHIFT_BIT;
     377              : 
     378            0 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     379              :                                               false, spdm_response_size,
     380              :                                               spdm_response,
     381              :                                               response_size, response);
     382              :     }
     383            0 :         return LIBSPDM_STATUS_SUCCESS;
     384              : 
     385            0 :     case 0xE:
     386              :     {
     387              :         static uint16_t error_code = LIBSPDM_ERROR_CODE_RESERVED_00;
     388              : 
     389              :         spdm_error_response_t *spdm_response;
     390              :         size_t spdm_response_size;
     391              :         size_t transport_header_size;
     392              : 
     393            0 :         spdm_response_size = sizeof(libspdm_version_response_mine_t);
     394            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     395            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     396              : 
     397            0 :         if(error_code <= 0xff) {
     398            0 :             libspdm_zero_mem (spdm_response, spdm_response_size);
     399            0 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_10;
     400            0 :             spdm_response->header.request_response_code = SPDM_ERROR;
     401            0 :             spdm_response->header.param1 = (uint8_t) error_code;
     402              : 
     403            0 :             libspdm_transport_test_encode_message (spdm_context, NULL, false, false,
     404              :                                                    spdm_response_size, spdm_response,
     405              :                                                    response_size, response);
     406              :         }
     407              : 
     408            0 :         error_code++;
     409            0 :         if(error_code == SPDM_ERROR_CODE_BUSY) { /*busy is treated in cases 5 and 6*/
     410            0 :             error_code = SPDM_ERROR_CODE_UNEXPECTED_REQUEST;
     411              :         }
     412            0 :         if(error_code == LIBSPDM_ERROR_CODE_RESERVED_0D) { /*skip some reserved error codes (0d to 3e)*/
     413            0 :             error_code = LIBSPDM_ERROR_CODE_RESERVED_3F;
     414              :         }
     415            0 :         if(error_code == SPDM_ERROR_CODE_RESPONSE_NOT_READY) { /*skip response not ready, request resync, and some reserved codes (44 to fc)*/
     416            0 :             error_code = LIBSPDM_ERROR_CODE_RESERVED_FD;
     417              :         }
     418              :     }
     419            0 :         return LIBSPDM_STATUS_SUCCESS;
     420              : 
     421            1 :     case 0xF: {
     422              :         libspdm_version_response_mine_t *spdm_response;
     423              :         size_t spdm_response_size;
     424              :         size_t transport_header_size;
     425              : 
     426            1 :         spdm_response_size = sizeof(libspdm_version_response_mine_t);
     427            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     428            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     429              : 
     430            1 :         libspdm_zero_mem(spdm_response, spdm_response_size);
     431            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_10;
     432            1 :         spdm_response->header.request_response_code = SPDM_VERSION;
     433            1 :         spdm_response->header.param1 = 0;
     434            1 :         spdm_response->header.param2 = 0;
     435            1 :         spdm_response->version_number_entry_count = 5;
     436            1 :         spdm_response->version_number_entry[0] = 0x42 << SPDM_VERSION_NUMBER_SHIFT_BIT;
     437            1 :         spdm_response->version_number_entry[1] = 0x52 << SPDM_VERSION_NUMBER_SHIFT_BIT;
     438            1 :         spdm_response->version_number_entry[2] = 0x12 << SPDM_VERSION_NUMBER_SHIFT_BIT;
     439            1 :         spdm_response->version_number_entry[3] = 0x11 << SPDM_VERSION_NUMBER_SHIFT_BIT;
     440            1 :         spdm_response->version_number_entry[4] = 0x10 << SPDM_VERSION_NUMBER_SHIFT_BIT;
     441              : 
     442            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     443              :                                               false, spdm_response_size,
     444              :                                               spdm_response,
     445              :                                               response_size, response);
     446              :     }
     447            1 :         return LIBSPDM_STATUS_SUCCESS;
     448              : 
     449            1 :     case 0x10: {
     450              :         libspdm_version_response_mine_t *spdm_response;
     451              :         size_t spdm_response_size;
     452              :         size_t transport_header_size;
     453              : 
     454            1 :         spdm_response_size = sizeof(libspdm_version_response_mine_t);
     455            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     456            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     457              : 
     458            1 :         libspdm_zero_mem(spdm_response, spdm_response_size);
     459            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_10;
     460            1 :         spdm_response->header.request_response_code = SPDM_VERSION;
     461            1 :         spdm_response->header.param1 = 0;
     462            1 :         spdm_response->header.param2 = 0;
     463            1 :         spdm_response->version_number_entry_count = 2;
     464            1 :         spdm_response->version_number_entry[0] = 0x10 << SPDM_VERSION_NUMBER_SHIFT_BIT;
     465            1 :         spdm_response->version_number_entry[1] = 0x11 << SPDM_VERSION_NUMBER_SHIFT_BIT;
     466              : 
     467            1 :         spdm_response_size = 10;
     468              : 
     469            1 :         libspdm_copy_mem(&m_libspdm_local_buffer[m_libspdm_local_buffer_size],
     470              :                          sizeof(m_libspdm_local_buffer) - m_libspdm_local_buffer_size,
     471              :                          (uint8_t *)spdm_response, spdm_response_size);
     472            1 :         m_libspdm_local_buffer_size += spdm_response_size;
     473              : 
     474            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     475              :                                               false, spdm_response_size,
     476              :                                               spdm_response,
     477              :                                               response_size, response);
     478              :     }
     479            1 :         return LIBSPDM_STATUS_SUCCESS;
     480              : 
     481            0 :     case 0x11: {
     482              :         spdm_message_header_t *spdm_response;
     483              :         size_t spdm_response_size;
     484              :         size_t transport_header_size;
     485              : 
     486            0 :         spdm_response_size = sizeof(spdm_message_header_t);
     487            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     488            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     489              : 
     490            0 :         libspdm_zero_mem(spdm_response, spdm_response_size);
     491            0 :         spdm_response->spdm_version = SPDM_MESSAGE_VERSION_10;
     492            0 :         spdm_response->request_response_code = SPDM_VERSION;
     493            0 :         spdm_response->param1 = 0;
     494            0 :         spdm_response->param2 = 0;
     495              : 
     496            0 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     497              :                                               false, spdm_response_size,
     498              :                                               spdm_response,
     499              :                                               response_size, response);
     500              : 
     501              :     }
     502            0 :         return LIBSPDM_STATUS_SUCCESS;
     503              : 
     504            0 :     case 0x12: {
     505              :         spdm_version_response_t *spdm_response;
     506              :         size_t spdm_response_size;
     507              :         size_t transport_header_size;
     508              : 
     509            0 :         spdm_response_size = sizeof(spdm_version_response_t);
     510            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     511            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     512              : 
     513            0 :         libspdm_zero_mem(spdm_response, spdm_response_size);
     514            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_10;
     515            0 :         spdm_response->header.request_response_code = SPDM_VERSION;
     516            0 :         spdm_response->header.param1 = 0;
     517            0 :         spdm_response->header.param2 = 0;
     518            0 :         spdm_response->version_number_entry_count = LIBSPDM_MAX_VERSION_COUNT;
     519              : 
     520            0 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     521              :                                               false, spdm_response_size,
     522              :                                               spdm_response,
     523              :                                               response_size, response);
     524              : 
     525              :     }
     526            0 :         return LIBSPDM_STATUS_SUCCESS;
     527              : 
     528            0 :     default:
     529            0 :         return LIBSPDM_STATUS_RECEIVE_FAIL;
     530              :     }
     531              : }
     532              : 
     533              : /**
     534              :  * Test 1: Can be populated with new test.
     535              :  **/
     536              : 
     537              : /*
     538              :  * static void libspdm_test_requester_get_version_case1(void **state)
     539              :  * {
     540              :  * }
     541              :  */
     542              : 
     543              : /**
     544              :  * Test 2: receiving a correct VERSION message with available version 1.0 and 1.1.
     545              :  * Expected behavior: client returns a status of LIBSPDM_STATUS_SUCCESS.
     546              :  **/
     547            1 : static void libspdm_test_requester_get_version_case2(void **state)
     548              : {
     549              :     libspdm_return_t status;
     550              :     libspdm_test_context_t *spdm_test_context;
     551              :     libspdm_context_t *spdm_context;
     552              : 
     553            1 :     spdm_test_context = *state;
     554            1 :     spdm_context = spdm_test_context->spdm_context;
     555            1 :     spdm_test_context->case_id = 0x2;
     556              : 
     557            1 :     status = libspdm_get_version(spdm_context, NULL, NULL);
     558            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     559            1 : }
     560              : 
     561              : /**
     562              :  * Test 3: Can be populated with new test.
     563              :  **/
     564              : 
     565              : /*
     566              :  * static void libspdm_test_requester_get_version_case3(void **state)
     567              :  * {
     568              :  * }
     569              :  */
     570              : 
     571              : /**
     572              :  * Test 4: Can be populated with new test.
     573              :  **/
     574              : 
     575              : /*
     576              :  * static void libspdm_test_requester_get_version_case4(void **state)
     577              :  * {
     578              :  * }
     579              :  */
     580              : 
     581              : /**
     582              :  * Test 5: Can be populated with new test.
     583              :  **/
     584              : 
     585              : /*
     586              :  * static void libspdm_test_requester_get_version_case5(void **state)
     587              :  * {
     588              :  * }
     589              :  */
     590              : 
     591              : /**
     592              :  * Test 6: on the first try, receiving a Busy ERROR message, and on retry, receiving
     593              :  * a correct VERSION message with available version 1.0 and 1.1.
     594              :  * Expected behavior: client returns a status of LIBSPDM_STATUS_SUCCESS.
     595              :  **/
     596            1 : static void libspdm_test_requester_get_version_case6(void **state)
     597              : {
     598              :     libspdm_return_t status;
     599              :     libspdm_test_context_t *spdm_test_context;
     600              :     libspdm_context_t *spdm_context;
     601              : 
     602            1 :     spdm_test_context = *state;
     603            1 :     spdm_context = spdm_test_context->spdm_context;
     604            1 :     spdm_test_context->case_id = 0x6;
     605              : 
     606            1 :     spdm_context->retry_times = 3;
     607            1 :     status = libspdm_get_version(spdm_context, NULL, NULL);
     608            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     609            1 : }
     610              : 
     611              : /**
     612              :  * Test 7: Can be populated with new test.
     613              :  **/
     614              : 
     615              : /*
     616              :  * static void libspdm_test_requester_get_version_case7(void **state)
     617              :  * {
     618              :  * }
     619              :  */
     620              : 
     621              : /**
     622              :  * Test 8: Can be populated with new test.
     623              :  **/
     624              : 
     625              : /*
     626              :  * static void libspdm_test_requester_get_version_case8(void **state)
     627              :  * {
     628              :  * }
     629              :  */
     630              : 
     631              : /**
     632              :  * Test 9: Can be populated with new test.
     633              :  **/
     634              : 
     635              : /*
     636              :  * static void libspdm_test_requester_get_version_case9(void **state)
     637              :  * {
     638              :  * }
     639              :  */
     640              : 
     641              : /**
     642              :  * Test 10: receiving a VERSION message with a larger list of available versions than indicated.
     643              :  * The presence of only two versions are indicated, but the VERSION message presents a list
     644              :  * with 3 versions: 1.0, 1.1 and 1.2.
     645              :  * Expected behavior: client returns a status of LIBSPDM_STATUS_SUCCESS, but truncate the message
     646              :  * to consider only the two first versions, as indicated in the message.
     647              :  **/
     648            1 : static void libspdm_test_requester_get_version_case10(void **state)
     649              : {
     650              :     libspdm_return_t status;
     651              :     libspdm_test_context_t *spdm_test_context;
     652              :     libspdm_context_t *spdm_context;
     653              : 
     654            1 :     spdm_test_context = *state;
     655            1 :     spdm_context = spdm_test_context->spdm_context;
     656            1 :     spdm_test_context->case_id = 0xA;
     657              : 
     658            1 :     status = libspdm_get_version(spdm_context, NULL, NULL);
     659            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     660            1 : }
     661              : 
     662              : /**
     663              :  * Test 11: Can be populated with new test.
     664              :  **/
     665              : 
     666              : /*
     667              :  * static void libspdm_test_requester_get_version_case11(void **state)
     668              :  * {
     669              :  * }
     670              :  */
     671              : 
     672              : /**
     673              :  * Test 12: Can be populated with new test.
     674              :  **/
     675              : 
     676              : /*
     677              :  * static void libspdm_test_requester_get_version_case12(void **state)
     678              :  * {
     679              :  * }
     680              :  */
     681              : 
     682              : /**
     683              :  * Test 13: Can be populated with new test.
     684              :  **/
     685              : 
     686              : /*
     687              :  * static void libspdm_test_requester_get_version_case13(void **state)
     688              :  * {
     689              :  * }
     690              :  */
     691              : 
     692              : /**
     693              :  * Test 14: Can be populated with new test.
     694              :  **/
     695              : 
     696              : /*
     697              :  * static void libspdm_test_requester_get_version_case14(void **state)
     698              :  * {
     699              :  * }
     700              :  */
     701              : 
     702              : /**
     703              :  * Test 15: receiving a VERSION message with unordered version list.
     704              :  * Requester list:5.5, 0.9, 1.0, 1.1
     705              :  * Responder list:4.2, 5.2, 1.2, 1.1, 1.0
     706              :  * Expected behavior: client returns a status of LIBSPDM_STATUS_SUCCESS and right negotiated version 1.1.
     707              :  **/
     708            1 : static void libspdm_test_requester_get_version_case15(void **state)
     709              : {
     710              :     libspdm_return_t status;
     711              :     libspdm_test_context_t *spdm_test_context;
     712              :     libspdm_context_t *spdm_context;
     713              : 
     714            1 :     spdm_test_context = *state;
     715            1 :     spdm_context = spdm_test_context->spdm_context;
     716            1 :     spdm_test_context->case_id = 0xF;
     717            1 :     spdm_context->local_context.version.spdm_version_count = 4;
     718            1 :     spdm_context->local_context.version.spdm_version[0] = 0x55 << SPDM_VERSION_NUMBER_SHIFT_BIT;
     719            1 :     spdm_context->local_context.version.spdm_version[1] = 0x09 << SPDM_VERSION_NUMBER_SHIFT_BIT;
     720            1 :     spdm_context->local_context.version.spdm_version[2] = 0x10 << SPDM_VERSION_NUMBER_SHIFT_BIT;
     721            1 :     spdm_context->local_context.version.spdm_version[3] = 0x11 << SPDM_VERSION_NUMBER_SHIFT_BIT;
     722            1 :     status = libspdm_get_version(spdm_context, NULL, NULL);
     723            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     724            1 :     assert_int_equal(
     725              :         spdm_context->connection_info.version >> SPDM_VERSION_NUMBER_SHIFT_BIT, 0x11);
     726            1 : }
     727              : 
     728              : /**
     729              :  * Test 16: receiving a correct VERSION message with available version 1.0 and 1.1.
     730              :  * Buffers A, B and C already have arbitrary data.
     731              :  * Expected behavior: client returns a status of RETURN_SUCCESS, buffers A, B and C
     732              :  * should be first reset, and then buffer A receives only the exchanged GET_VERSION
     733              :  * and VERSION messages.
     734              :  **/
     735            1 : static void libspdm_test_requester_get_version_case16(void **state)
     736              : {
     737              :     libspdm_return_t status;
     738              :     libspdm_test_context_t *spdm_test_context;
     739              :     libspdm_context_t *spdm_context;
     740              : 
     741            1 :     spdm_test_context = *state;
     742            1 :     spdm_context = spdm_test_context->spdm_context;
     743            1 :     spdm_test_context->case_id = 0x10;
     744              : 
     745              :     /*filling buffers with arbitrary data*/
     746            1 :     libspdm_set_mem(spdm_context->transcript.message_a.buffer, 10, (uint8_t) 0xFF);
     747            1 :     spdm_context->transcript.message_a.buffer_size = 10;
     748              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     749              :     libspdm_set_mem(spdm_context->transcript.message_b.buffer, 8, (uint8_t) 0xEE);
     750              :     spdm_context->transcript.message_b.buffer_size = 8;
     751              :     libspdm_set_mem(spdm_context->transcript.message_c.buffer, 12, (uint8_t) 0xDD);
     752              :     spdm_context->transcript.message_c.buffer_size = 12;
     753              : #endif
     754              : 
     755            1 :     status = libspdm_get_version(spdm_context, NULL, NULL);
     756            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     757            1 :     assert_int_equal(spdm_context->transcript.message_a.buffer_size,
     758              :                      m_libspdm_local_buffer_size);
     759            1 :     LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "m_libspdm_local_buffer (0x%zx):\n",
     760              :                    m_libspdm_local_buffer_size));
     761            1 :     libspdm_dump_hex(m_libspdm_local_buffer, m_libspdm_local_buffer_size);
     762            1 :     assert_memory_equal(spdm_context->transcript.message_a.buffer,
     763              :                         m_libspdm_local_buffer, m_libspdm_local_buffer_size);
     764              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     765              :     assert_int_equal(spdm_context->transcript.message_b.buffer_size, 0);
     766              :     assert_int_equal(spdm_context->transcript.message_c.buffer_size, 0);
     767              : #endif
     768            1 : }
     769              : 
     770              : /**
     771              :  * Test 17: Can be populated with new test.
     772              :  **/
     773              : 
     774              : /*
     775              :  * static void libspdm_test_requester_get_version_case17(void **state)
     776              :  * {
     777              :  * }
     778              :  */
     779              : 
     780              : /**
     781              :  * Test 18: Can be populated with new test.
     782              :  **/
     783              : 
     784              : /*
     785              :  * static void libspdm_test_requester_get_version_case18(void **state)
     786              :  * {
     787              :  * }
     788              :  */
     789              : 
     790            1 : int libspdm_requester_get_version_test_main(void)
     791              : {
     792            1 :     const struct CMUnitTest spdm_requester_get_version_tests[] = {
     793              :         /* cmocka_unit_test(libspdm_test_requester_get_version_case1), */
     794              :         cmocka_unit_test(libspdm_test_requester_get_version_case2),
     795              :         /* cmocka_unit_test(libspdm_test_requester_get_version_case3),
     796              :          * cmocka_unit_test(libspdm_test_requester_get_version_case4),
     797              :          * cmocka_unit_test(libspdm_test_requester_get_version_case5), */
     798              :         cmocka_unit_test(libspdm_test_requester_get_version_case6),
     799              :         /* cmocka_unit_test(libspdm_test_requester_get_version_case7),
     800              :          * cmocka_unit_test(libspdm_test_requester_get_version_case8),
     801              :          * cmocka_unit_test(libspdm_test_requester_get_version_case9), */
     802              :         cmocka_unit_test(libspdm_test_requester_get_version_case10),
     803              :         /* cmocka_unit_test(libspdm_test_requester_get_version_case11),
     804              :          * cmocka_unit_test(libspdm_test_requester_get_version_case12),
     805              :          * cmocka_unit_test(libspdm_test_requester_get_version_case13),
     806              :          * cmocka_unit_test(libspdm_test_requester_get_version_case14), */
     807              :         cmocka_unit_test(libspdm_test_requester_get_version_case15),
     808              :         cmocka_unit_test(libspdm_test_requester_get_version_case16),
     809              :         /* cmocka_unit_test(libspdm_test_requester_get_version_case17),
     810              :          * cmocka_unit_test(libspdm_test_requester_get_version_case18), */
     811              :     };
     812              : 
     813            1 :     libspdm_test_context_t test_context = {
     814              :         LIBSPDM_TEST_CONTEXT_VERSION,
     815              :         true,
     816              :         libspdm_requester_get_version_test_send_message,
     817              :         libspdm_requester_get_version_test_receive_message,
     818              :     };
     819              : 
     820            1 :     libspdm_setup_test_context(&test_context);
     821              : 
     822            1 :     return cmocka_run_group_tests(spdm_requester_get_version_tests,
     823              :                                   libspdm_unit_test_group_setup,
     824              :                                   libspdm_unit_test_group_teardown);
     825              : }
        

Generated by: LCOV version 2.0-1