LCOV - code coverage report
Current view: top level - unit_test/test_spdm_responder - set_certificate_rsp.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 99.3 % 460 457
Test Date: 2026-02-22 08:11:49 Functions: 100.0 % 14 14

            Line data    Source code
       1              : /**
       2              :  *  Copyright Notice:
       3              :  *  Copyright 2021-2026 DMTF. All rights reserved.
       4              :  *  License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
       5              :  **/
       6              : 
       7              : #include "spdm_unit_test.h"
       8              : #include "internal/libspdm_responder_lib.h"
       9              : 
      10              : #if defined(_WIN32) || (defined(__clang__) && (defined (LIBSPDM_CPU_AARCH64) || \
      11              :     defined(LIBSPDM_CPU_ARM)))
      12              : #else
      13              :     #include <fcntl.h>
      14              :     #include <unistd.h>
      15              :     #include <sys/stat.h>
      16              : #endif
      17              : 
      18              : #if LIBSPDM_ENABLE_CAPABILITY_SET_CERT_CAP
      19              : 
      20              : extern bool g_in_trusted_environment;
      21              : extern bool g_set_cert_is_busy;
      22              : 
      23              : /**
      24              :  * Test 1: receives a valid SET_CERTIFICATE request message from Requester to set cert in slot_id:0 with device_cert model
      25              :  * Expected Behavior: produces a valid SET_CERTIFICATE_RSP response message
      26              :  **/
      27            1 : static void rsp_set_certificate_rsp_case1(void **state)
      28              : {
      29              :     libspdm_return_t status;
      30              :     libspdm_test_context_t *spdm_test_context;
      31              :     libspdm_context_t *spdm_context;
      32              :     size_t response_size;
      33              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
      34              :     spdm_set_certificate_response_t *spdm_response;
      35              :     void *cert_chain;
      36              :     size_t cert_chain_size;
      37              :     spdm_set_certificate_request_t *m_libspdm_set_certificate_request;
      38              : 
      39              :     void *cert_chain_slot_1;
      40              :     uint8_t *new_cert_chain;
      41              :     size_t new_cert_chain_size;
      42              :     size_t root_cert_hash_size;
      43              : 
      44            1 :     spdm_test_context = *state;
      45            1 :     spdm_context = spdm_test_context->spdm_context;
      46            1 :     spdm_test_context->case_id = 0x1;
      47            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
      48              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
      49              : 
      50            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
      51            1 :     spdm_context->local_context.capability.flags |=
      52              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
      53            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
      54            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
      55              : 
      56            1 :     spdm_context->local_context.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
      57            1 :     spdm_context->local_context.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
      58              : 
      59            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
      60              :                                                     m_libspdm_use_asym_algo, &cert_chain,
      61              :                                                     &cert_chain_size, NULL, NULL);
      62              : 
      63            1 :     m_libspdm_set_certificate_request = malloc(sizeof(spdm_set_certificate_request_t) +
      64              :                                                cert_chain_size);
      65              : 
      66            1 :     m_libspdm_set_certificate_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
      67            1 :     m_libspdm_set_certificate_request->header.request_response_code = SPDM_SET_CERTIFICATE;
      68            1 :     m_libspdm_set_certificate_request->header.param1 = 0;
      69            1 :     m_libspdm_set_certificate_request->header.param2 = 0;
      70              : 
      71            1 :     libspdm_copy_mem(m_libspdm_set_certificate_request + 1,
      72              :                      LIBSPDM_MAX_CERT_CHAIN_SIZE,
      73              :                      (uint8_t *)cert_chain, cert_chain_size);
      74              : 
      75            1 :     size_t m_libspdm_set_certificate_request_size = sizeof(spdm_set_certificate_request_t) +
      76              :                                                     cert_chain_size;
      77              : 
      78            1 :     response_size = sizeof(response);
      79            1 :     status = libspdm_get_response_set_certificate(spdm_context,
      80              :                                                   m_libspdm_set_certificate_request_size,
      81              :                                                   m_libspdm_set_certificate_request,
      82              :                                                   &response_size, response);
      83            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
      84            1 :     assert_int_equal(response_size, sizeof(spdm_set_certificate_response_t));
      85            1 :     spdm_response = (void *)response;
      86            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_SET_CERTIFICATE_RSP);
      87              : 
      88            1 :     free(cert_chain);
      89            1 :     free(m_libspdm_set_certificate_request);
      90              : 
      91              :     /*test overwrite same slot_id cert*/
      92              : 
      93              :     /*read a different cert_chain*/
      94            1 :     libspdm_read_responder_public_certificate_chain_per_slot(1, m_libspdm_use_hash_algo,
      95              :                                                              m_libspdm_use_asym_algo,
      96              :                                                              &cert_chain_slot_1,
      97              :                                                              &cert_chain_size, NULL, NULL);
      98              : 
      99            1 :     m_libspdm_set_certificate_request = malloc(sizeof(spdm_set_certificate_request_t) +
     100              :                                                cert_chain_size);
     101              : 
     102            1 :     m_libspdm_set_certificate_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     103            1 :     m_libspdm_set_certificate_request->header.request_response_code = SPDM_SET_CERTIFICATE;
     104              :     /*write the same slot_id 0*/
     105            1 :     m_libspdm_set_certificate_request->header.param1 = 0;
     106            1 :     m_libspdm_set_certificate_request->header.param2 = 0;
     107              : 
     108            1 :     libspdm_copy_mem(m_libspdm_set_certificate_request + 1,
     109              :                      LIBSPDM_MAX_CERT_CHAIN_SIZE,
     110              :                      (uint8_t *)cert_chain_slot_1, cert_chain_size);
     111              : 
     112            1 :     m_libspdm_set_certificate_request_size = sizeof(spdm_set_certificate_request_t) +
     113              :                                              cert_chain_size;
     114              : 
     115            1 :     response_size = sizeof(response);
     116            1 :     status = libspdm_get_response_set_certificate(spdm_context,
     117              :                                                   m_libspdm_set_certificate_request_size,
     118              :                                                   m_libspdm_set_certificate_request,
     119              :                                                   &response_size, response);
     120            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     121            1 :     assert_int_equal(response_size, sizeof(spdm_set_certificate_response_t));
     122            1 :     spdm_response = (void *)response;
     123            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_SET_CERTIFICATE_RSP);
     124              : 
     125              :     /*check that the cert_chain is overwritten*/
     126            1 :     libspdm_read_input_file("slot_id_0_cert_chain.der",
     127              :                             (void **)&new_cert_chain, &new_cert_chain_size);
     128              : 
     129              :     /*get actual cert_chain size*/
     130            1 :     root_cert_hash_size = libspdm_get_hash_size(
     131              :         spdm_context->local_context.algorithm.base_hash_algo);
     132            1 :     cert_chain_size = cert_chain_size - sizeof(spdm_cert_chain_t) - root_cert_hash_size;
     133              : 
     134              :     /*point to actual cert_chain*/
     135            1 :     cert_chain_slot_1 = (void*)((uint8_t *)cert_chain_slot_1
     136            1 :                                 + sizeof(spdm_cert_chain_t) + root_cert_hash_size);
     137              : 
     138            1 :     assert_memory_equal(cert_chain_slot_1, new_cert_chain, cert_chain_size);
     139              : 
     140            1 :     free(new_cert_chain);
     141              : 
     142              :     /*point to total cert_chain_slot_1: it is important*/
     143            1 :     cert_chain_slot_1 = (void*)((uint8_t *)cert_chain_slot_1
     144            1 :                                 - sizeof(spdm_cert_chain_t) - root_cert_hash_size);
     145            1 :     free(cert_chain_slot_1);
     146            1 :     free(m_libspdm_set_certificate_request);
     147            1 : }
     148              : 
     149              : /**
     150              :  * Test 2: Wrong SET_CERTIFICATE message size (larger than expected)
     151              :  * Expected Behavior: generate an ERROR_RESPONSE with code SPDM_ERROR_CODE_INVALID_REQUEST
     152              :  **/
     153            1 : static void rsp_set_certificate_rsp_case2(void **state)
     154              : {
     155              :     libspdm_return_t status;
     156              :     libspdm_test_context_t *spdm_test_context;
     157              :     libspdm_context_t *spdm_context;
     158              :     size_t response_size;
     159              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     160              :     spdm_set_certificate_response_t *spdm_response;
     161              :     void *cert_chain;
     162              :     size_t cert_chain_size;
     163              : 
     164            1 :     spdm_test_context = *state;
     165            1 :     spdm_context = spdm_test_context->spdm_context;
     166            1 :     spdm_test_context->case_id = 0x2;
     167            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     168              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     169              : 
     170            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     171            1 :     spdm_context->local_context.capability.flags |=
     172              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
     173            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     174            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     175              : 
     176            1 :     spdm_context->local_context.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     177            1 :     spdm_context->local_context.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     178              : 
     179            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     180              :                                                     m_libspdm_use_asym_algo, &cert_chain,
     181              :                                                     &cert_chain_size, NULL, NULL);
     182              : 
     183              :     spdm_set_certificate_request_t *m_libspdm_set_certificate_request;
     184            1 :     m_libspdm_set_certificate_request = malloc(sizeof(spdm_set_certificate_request_t) +
     185              :                                                cert_chain_size);
     186              : 
     187            1 :     m_libspdm_set_certificate_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     188            1 :     m_libspdm_set_certificate_request->header.request_response_code = SPDM_SET_CERTIFICATE;
     189            1 :     m_libspdm_set_certificate_request->header.param1 = 0;
     190            1 :     m_libspdm_set_certificate_request->header.param2 = 0;
     191              : 
     192            1 :     libspdm_copy_mem(m_libspdm_set_certificate_request + 1,
     193              :                      LIBSPDM_MAX_CERT_CHAIN_SIZE,
     194              :                      (uint8_t *)cert_chain, cert_chain_size);
     195              : 
     196              :     /* Bad request size: only have header size*/
     197            1 :     size_t m_libspdm_set_certificate_request_size = sizeof(spdm_set_certificate_request_t);
     198              : 
     199            1 :     response_size = sizeof(response);
     200            1 :     status = libspdm_get_response_set_certificate(spdm_context,
     201              :                                                   m_libspdm_set_certificate_request_size,
     202              :                                                   m_libspdm_set_certificate_request,
     203              :                                                   &response_size, response);
     204            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     205            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     206            1 :     spdm_response = (void *)response;
     207            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     208            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
     209            1 :     assert_int_equal(spdm_response->header.param2, 0);
     210              : 
     211            1 :     free(cert_chain);
     212            1 :     free(m_libspdm_set_certificate_request);
     213            1 : }
     214              : 
     215              : 
     216              : /**
     217              :  * Test 3: Force response_state = LIBSPDM_RESPONSE_STATE_BUSY when asked SET_CERTIFICATE
     218              :  * Expected Behavior: generate an ERROR_RESPONSE with code SPDM_ERROR_CODE_BUSY
     219              :  **/
     220            1 : static void rsp_set_certificate_rsp_case3(void **state)
     221              : {
     222              :     libspdm_return_t status;
     223              :     libspdm_test_context_t *spdm_test_context;
     224              :     libspdm_context_t *spdm_context;
     225              :     size_t response_size;
     226              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     227              :     spdm_set_certificate_response_t *spdm_response;
     228              :     void *cert_chain;
     229              :     size_t cert_chain_size;
     230              : 
     231            1 :     spdm_test_context = *state;
     232            1 :     spdm_context = spdm_test_context->spdm_context;
     233            1 :     spdm_test_context->case_id = 0x3;
     234            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     235              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     236            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_BUSY;
     237              : 
     238            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     239            1 :     spdm_context->local_context.capability.flags |=
     240              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
     241            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     242            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     243              : 
     244            1 :     spdm_context->local_context.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     245            1 :     spdm_context->local_context.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     246              : 
     247            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     248              :                                                     m_libspdm_use_asym_algo, &cert_chain,
     249              :                                                     &cert_chain_size, NULL, NULL);
     250              : 
     251              :     spdm_set_certificate_request_t *m_libspdm_set_certificate_request;
     252            1 :     m_libspdm_set_certificate_request = malloc(sizeof(spdm_set_certificate_request_t) +
     253              :                                                cert_chain_size);
     254              : 
     255            1 :     m_libspdm_set_certificate_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     256            1 :     m_libspdm_set_certificate_request->header.request_response_code = SPDM_SET_CERTIFICATE;
     257            1 :     m_libspdm_set_certificate_request->header.param1 = 0;
     258            1 :     m_libspdm_set_certificate_request->header.param2 = 0;
     259              : 
     260            1 :     libspdm_copy_mem(m_libspdm_set_certificate_request + 1,
     261              :                      LIBSPDM_MAX_CERT_CHAIN_SIZE,
     262              :                      (uint8_t *)cert_chain, cert_chain_size);
     263              : 
     264              :     /* Bad request size: right request size + 1*/
     265            1 :     size_t m_libspdm_set_certificate_request_size = sizeof(spdm_set_certificate_request_t) +
     266            1 :                                                     cert_chain_size + 1;
     267              : 
     268            1 :     response_size = sizeof(response);
     269            1 :     status = libspdm_get_response_set_certificate(spdm_context,
     270              :                                                   m_libspdm_set_certificate_request_size,
     271              :                                                   m_libspdm_set_certificate_request,
     272              :                                                   &response_size, response);
     273            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     274            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     275            1 :     spdm_response = (void *)response;
     276            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     277            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_BUSY);
     278            1 :     assert_int_equal(spdm_response->header.param2, 0);
     279            1 :     assert_int_equal(spdm_context->response_state, LIBSPDM_RESPONSE_STATE_BUSY);
     280              : 
     281            1 :     free(cert_chain);
     282            1 :     free(m_libspdm_set_certificate_request);
     283            1 : }
     284              : 
     285              : 
     286              : /**
     287              :  * Test 4: Force response_state = LIBSPDM_RESPONSE_STATE_NEED_RESYNC when asked SET_CERTIFICATE
     288              :  * Expected Behavior: generate an ERROR_RESPONSE with code SPDM_ERROR_CODE_REQUEST_RESYNCH
     289              :  **/
     290            1 : static void rsp_set_certificate_rsp_case4(void **state)
     291              : {
     292              :     libspdm_return_t status;
     293              :     libspdm_test_context_t *spdm_test_context;
     294              :     libspdm_context_t *spdm_context;
     295              :     size_t response_size;
     296              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     297              :     spdm_set_certificate_response_t *spdm_response;
     298              :     void *cert_chain;
     299              :     size_t cert_chain_size;
     300              :     spdm_set_certificate_request_t *m_libspdm_set_certificate_request;
     301              : 
     302            1 :     spdm_test_context = *state;
     303            1 :     spdm_context = spdm_test_context->spdm_context;
     304            1 :     spdm_test_context->case_id = 0x4;
     305            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     306              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     307            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NEED_RESYNC;
     308              : 
     309            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     310            1 :     spdm_context->local_context.capability.flags |=
     311              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
     312            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     313            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     314              : 
     315            1 :     spdm_context->local_context.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     316            1 :     spdm_context->local_context.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     317              : 
     318            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     319              :                                                     m_libspdm_use_asym_algo, &cert_chain,
     320              :                                                     &cert_chain_size, NULL, NULL);
     321              : 
     322            1 :     m_libspdm_set_certificate_request = malloc(sizeof(spdm_set_certificate_request_t) +
     323              :                                                cert_chain_size);
     324              : 
     325            1 :     m_libspdm_set_certificate_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     326            1 :     m_libspdm_set_certificate_request->header.request_response_code = SPDM_SET_CERTIFICATE;
     327            1 :     m_libspdm_set_certificate_request->header.param1 = 0;
     328            1 :     m_libspdm_set_certificate_request->header.param2 = 0;
     329              : 
     330            1 :     libspdm_copy_mem(m_libspdm_set_certificate_request + 1,
     331              :                      LIBSPDM_MAX_CERT_CHAIN_SIZE,
     332              :                      (uint8_t *)cert_chain, cert_chain_size);
     333              : 
     334            1 :     size_t m_libspdm_set_certificate_request_size = sizeof(spdm_set_certificate_request_t) +
     335              :                                                     cert_chain_size;
     336              : 
     337            1 :     response_size = sizeof(response);
     338            1 :     status = libspdm_get_response_set_certificate(spdm_context,
     339              :                                                   m_libspdm_set_certificate_request_size,
     340              :                                                   m_libspdm_set_certificate_request,
     341              :                                                   &response_size, response);
     342            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     343            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     344            1 :     spdm_response = (void *)response;
     345            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     346            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_REQUEST_RESYNCH);
     347            1 :     assert_int_equal(spdm_response->header.param2, 0);
     348            1 :     assert_int_equal(spdm_context->response_state, LIBSPDM_RESPONSE_STATE_NEED_RESYNC);
     349              : 
     350            1 :     free(cert_chain);
     351            1 :     free(m_libspdm_set_certificate_request);
     352            1 : }
     353              : 
     354              : /**
     355              :  * Test 5: receives a valid SET_CERTIFICATE request message from Requester to set cert in slot_id:1 with session
     356              :  * Expected Behavior: produces a valid SET_CERTIFICATE_RSP response message
     357              :  **/
     358            1 : static void rsp_set_certificate_rsp_case5(void **state)
     359              : {
     360              :     libspdm_return_t status;
     361              :     libspdm_test_context_t *spdm_test_context;
     362              :     libspdm_context_t *spdm_context;
     363              :     size_t response_size;
     364              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     365              :     spdm_set_certificate_response_t *spdm_response;
     366              :     void *cert_chain;
     367              :     size_t cert_chain_size;
     368              :     spdm_set_certificate_request_t *m_libspdm_set_certificate_request;
     369              : 
     370              :     libspdm_session_info_t *session_info;
     371              :     uint32_t session_id;
     372              : 
     373            1 :     spdm_test_context = *state;
     374            1 :     spdm_context = spdm_test_context->spdm_context;
     375            1 :     spdm_test_context->case_id = 0x5;
     376            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     377              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     378              :     /*responset_state need to set normal*/
     379            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
     380            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     381            1 :     spdm_context->local_context.capability.flags |=
     382              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
     383            1 :     spdm_context->local_context.capability.flags |=
     384              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
     385            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     386            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     387              : 
     388            1 :     spdm_context->local_context.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     389            1 :     spdm_context->local_context.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     390              : 
     391            1 :     session_id = 0xFFFFFFFF;
     392            1 :     spdm_context->latest_session_id = session_id;
     393            1 :     spdm_context->last_spdm_request_session_id_valid = true;
     394            1 :     spdm_context->last_spdm_request_session_id = session_id;
     395            1 :     session_info = &spdm_context->session_info[0];
     396            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
     397              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     398            1 :     libspdm_secured_message_set_session_state(
     399              :         session_info->secured_message_context,
     400              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
     401              : 
     402            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     403              :                                                     m_libspdm_use_asym_algo, &cert_chain,
     404              :                                                     &cert_chain_size, NULL, NULL);
     405              : 
     406            1 :     m_libspdm_set_certificate_request = malloc(sizeof(spdm_set_certificate_request_t) +
     407              :                                                cert_chain_size);
     408              : 
     409            1 :     m_libspdm_set_certificate_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     410            1 :     m_libspdm_set_certificate_request->header.request_response_code = SPDM_SET_CERTIFICATE;
     411            1 :     m_libspdm_set_certificate_request->header.param1 = 1;
     412            1 :     m_libspdm_set_certificate_request->header.param2 = 0;
     413              : 
     414            1 :     libspdm_copy_mem(m_libspdm_set_certificate_request + 1,
     415              :                      LIBSPDM_MAX_CERT_CHAIN_SIZE,
     416              :                      (uint8_t *)cert_chain, cert_chain_size);
     417              : 
     418            1 :     size_t m_libspdm_set_certificate_request_size = sizeof(spdm_set_certificate_request_t) +
     419              :                                                     cert_chain_size;
     420              : 
     421            1 :     response_size = sizeof(response);
     422            1 :     status = libspdm_get_response_set_certificate(spdm_context,
     423              :                                                   m_libspdm_set_certificate_request_size,
     424              :                                                   m_libspdm_set_certificate_request,
     425              :                                                   &response_size, response);
     426            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     427            1 :     assert_int_equal(response_size, sizeof(spdm_set_certificate_response_t));
     428            1 :     spdm_response = (void *)response;
     429            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_SET_CERTIFICATE_RSP);
     430              : 
     431            1 :     free(cert_chain);
     432            1 :     free(m_libspdm_set_certificate_request);
     433            1 : }
     434              : 
     435              : /**
     436              :  * Test 6: receives a valid SET_CERTIFICATE request message from Requester with need_reset
     437              :  * Expected Behavior: The Responder return need reset
     438              :  **/
     439            1 : static void rsp_set_certificate_rsp_case6(void **state)
     440              : {
     441              :     libspdm_return_t status;
     442              :     libspdm_test_context_t *spdm_test_context;
     443              :     libspdm_context_t *spdm_context;
     444              :     size_t response_size;
     445              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     446              :     spdm_set_certificate_response_t *spdm_response;
     447              :     void *cert_chain;
     448              :     size_t cert_chain_size;
     449              :     spdm_set_certificate_request_t *m_libspdm_set_certificate_request;
     450              : 
     451            1 :     spdm_test_context = *state;
     452            1 :     spdm_context = spdm_test_context->spdm_context;
     453            1 :     spdm_test_context->case_id = 0x6;
     454            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     455              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     456              : 
     457            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     458            1 :     spdm_context->local_context.capability.flags |=
     459              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
     460            1 :     spdm_context->local_context.capability.flags |=
     461              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_INSTALL_RESET_CAP;
     462            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     463            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     464              : 
     465            1 :     spdm_context->local_context.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     466            1 :     spdm_context->local_context.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     467              : 
     468            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     469              :                                                     m_libspdm_use_asym_algo, &cert_chain,
     470              :                                                     &cert_chain_size, NULL, NULL);
     471              : 
     472            1 :     m_libspdm_set_certificate_request = malloc(sizeof(spdm_set_certificate_request_t) +
     473              :                                                cert_chain_size);
     474              : 
     475            1 :     m_libspdm_set_certificate_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     476            1 :     m_libspdm_set_certificate_request->header.request_response_code = SPDM_SET_CERTIFICATE;
     477            1 :     m_libspdm_set_certificate_request->header.param1 = 0;
     478            1 :     m_libspdm_set_certificate_request->header.param2 = 0;
     479              : 
     480            1 :     libspdm_copy_mem(m_libspdm_set_certificate_request + 1,
     481              :                      LIBSPDM_MAX_CERT_CHAIN_SIZE,
     482              :                      (uint8_t *)cert_chain, cert_chain_size);
     483              : 
     484            1 :     size_t m_libspdm_set_certificate_request_size = sizeof(spdm_set_certificate_request_t) +
     485              :                                                     cert_chain_size;
     486              : 
     487            1 :     response_size = sizeof(response);
     488            1 :     status = libspdm_get_response_set_certificate(spdm_context,
     489              :                                                   m_libspdm_set_certificate_request_size,
     490              :                                                   m_libspdm_set_certificate_request,
     491              :                                                   &response_size, response);
     492            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     493            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     494            1 :     spdm_response = (void *)response;
     495            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     496            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_RESET_REQUIRED);
     497            1 :     assert_int_equal(spdm_response->header.param2, 0);
     498              : 
     499            1 :     free(cert_chain);
     500            1 :     free(m_libspdm_set_certificate_request);
     501            1 : }
     502              : 
     503              : /**
     504              :  * Test 7: receives a valid SET_CERTIFICATE request message from Requester to set cert in slot_id:0 with alias_cert model
     505              :  * Expected Behavior: produces a valid SET_CERTIFICATE_RSP response message
     506              :  **/
     507            1 : static void rsp_set_certificate_rsp_case7(void **state)
     508              : {
     509              :     libspdm_return_t status;
     510              :     libspdm_test_context_t *spdm_test_context;
     511              :     libspdm_context_t *spdm_context;
     512              :     size_t response_size;
     513              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     514              :     spdm_set_certificate_response_t *spdm_response;
     515              :     void *cert_chain;
     516              :     size_t cert_chain_size;
     517              :     spdm_set_certificate_request_t *m_libspdm_set_certificate_request;
     518              : 
     519            1 :     spdm_test_context = *state;
     520            1 :     spdm_context = spdm_test_context->spdm_context;
     521            1 :     spdm_test_context->case_id = 0x7;
     522            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     523              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     524              : 
     525            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     526            1 :     spdm_context->local_context.capability.flags |=
     527              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
     528            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     529            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     530            1 :     spdm_context->local_context.capability.flags &=
     531              :         ~SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_INSTALL_RESET_CAP;
     532              : 
     533            1 :     spdm_context->local_context.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     534            1 :     spdm_context->local_context.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     535              : 
     536              :     /*set alias cert mode*/
     537            1 :     spdm_context->local_context.capability.flags |=
     538              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ALIAS_CERT_CAP;
     539              :     /*read alias cert(alias cert chain is partial)*/
     540            1 :     libspdm_read_responder_public_certificate_chain_alias_cert_till_dev_cert_ca(
     541              :         m_libspdm_use_hash_algo, m_libspdm_use_asym_algo,
     542              :         &cert_chain, &cert_chain_size, NULL, NULL);
     543              : 
     544            1 :     m_libspdm_set_certificate_request = malloc(sizeof(spdm_set_certificate_request_t) +
     545              :                                                cert_chain_size);
     546              : 
     547            1 :     m_libspdm_set_certificate_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     548            1 :     m_libspdm_set_certificate_request->header.request_response_code = SPDM_SET_CERTIFICATE;
     549            1 :     m_libspdm_set_certificate_request->header.param1 = 0;
     550            1 :     m_libspdm_set_certificate_request->header.param2 = 0;
     551              : 
     552            1 :     libspdm_copy_mem(m_libspdm_set_certificate_request + 1,
     553              :                      LIBSPDM_MAX_CERT_CHAIN_SIZE,
     554              :                      (uint8_t *)cert_chain, cert_chain_size);
     555              : 
     556            1 :     size_t m_libspdm_set_certificate_request_size = sizeof(spdm_set_certificate_request_t) +
     557              :                                                     cert_chain_size;
     558              : 
     559            1 :     response_size = sizeof(response);
     560            1 :     status = libspdm_get_response_set_certificate(spdm_context,
     561              :                                                   m_libspdm_set_certificate_request_size,
     562              :                                                   m_libspdm_set_certificate_request,
     563              :                                                   &response_size, response);
     564            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     565            1 :     assert_int_equal(response_size, sizeof(spdm_set_certificate_response_t));
     566            1 :     spdm_response = (void *)response;
     567            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_SET_CERTIFICATE_RSP);
     568              : 
     569            1 :     free(cert_chain);
     570            1 :     free(m_libspdm_set_certificate_request);
     571            1 : }
     572              : 
     573              : /**
     574              :  * Test 8: receives a SET_CERTIFICATE request message to set cert in slot_id:1 without session and with trusted environment
     575              :  * Expected Behavior: produces a valid SET_CERTIFICATE_RSP response message
     576              :  **/
     577            1 : static void rsp_set_certificate_rsp_case8(void **state)
     578              : {
     579              :     libspdm_return_t status;
     580              :     libspdm_test_context_t *spdm_test_context;
     581              :     libspdm_context_t *spdm_context;
     582              :     size_t response_size;
     583              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     584              :     spdm_set_certificate_response_t *spdm_response;
     585              :     void *cert_chain;
     586              :     size_t cert_chain_size;
     587              :     spdm_set_certificate_request_t *m_libspdm_set_certificate_request;
     588              : 
     589            1 :     spdm_test_context = *state;
     590            1 :     spdm_context = spdm_test_context->spdm_context;
     591            1 :     spdm_test_context->case_id = 0x8;
     592            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     593              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     594              :     /*responset_state need to set normal*/
     595            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
     596            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     597            1 :     spdm_context->local_context.capability.flags |=
     598              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
     599            1 :     spdm_context->local_context.capability.flags &=
     600              :         ~SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_INSTALL_RESET_CAP;
     601            1 :     spdm_context->local_context.capability.flags &=
     602              :         ~SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ALIAS_CERT_CAP;
     603            1 :     spdm_context->local_context.capability.flags |=
     604              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
     605            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     606            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     607              : 
     608            1 :     spdm_context->last_spdm_request_session_id_valid = false;
     609            1 :     g_in_trusted_environment = true;
     610              : 
     611            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     612              :                                                     m_libspdm_use_asym_algo, &cert_chain,
     613              :                                                     &cert_chain_size, NULL, NULL);
     614              : 
     615            1 :     m_libspdm_set_certificate_request = malloc(sizeof(spdm_set_certificate_request_t) +
     616              :                                                cert_chain_size);
     617              : 
     618            1 :     m_libspdm_set_certificate_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     619            1 :     m_libspdm_set_certificate_request->header.request_response_code = SPDM_SET_CERTIFICATE;
     620            1 :     m_libspdm_set_certificate_request->header.param1 = 1;
     621            1 :     m_libspdm_set_certificate_request->header.param2 = 0;
     622              : 
     623            1 :     libspdm_copy_mem(m_libspdm_set_certificate_request + 1,
     624              :                      LIBSPDM_MAX_CERT_CHAIN_SIZE,
     625              :                      (uint8_t *)cert_chain, cert_chain_size);
     626              : 
     627            1 :     size_t m_libspdm_set_certificate_request_size = sizeof(spdm_set_certificate_request_t) +
     628              :                                                     cert_chain_size;
     629              : 
     630            1 :     response_size = sizeof(response);
     631            1 :     status = libspdm_get_response_set_certificate(spdm_context,
     632              :                                                   m_libspdm_set_certificate_request_size,
     633              :                                                   m_libspdm_set_certificate_request,
     634              :                                                   &response_size, response);
     635            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     636            1 :     assert_int_equal(response_size, sizeof(spdm_set_certificate_response_t));
     637            1 :     spdm_response = (void *)response;
     638            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_SET_CERTIFICATE_RSP);
     639              : 
     640            1 :     free(cert_chain);
     641            1 :     free(m_libspdm_set_certificate_request);
     642            1 : }
     643              : 
     644              : /**
     645              :  * Test 9: receives a SET_CERTIFICATE request message to set cert in slot_id:1 without session and without trusted environment
     646              :  * Expected Behavior: produces a valid ERROR response message
     647              :  **/
     648            1 : static void rsp_set_certificate_rsp_case9(void **state)
     649              : {
     650              :     libspdm_return_t status;
     651              :     libspdm_test_context_t *spdm_test_context;
     652              :     libspdm_context_t *spdm_context;
     653              :     size_t response_size;
     654              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     655              :     spdm_set_certificate_response_t *spdm_response;
     656              :     void *cert_chain;
     657              :     size_t cert_chain_size;
     658              :     spdm_set_certificate_request_t *m_libspdm_set_certificate_request;
     659              : 
     660            1 :     spdm_test_context = *state;
     661            1 :     spdm_context = spdm_test_context->spdm_context;
     662            1 :     spdm_test_context->case_id = 0x9;
     663            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     664              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     665              :     /*responset_state need to set normal*/
     666            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
     667            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     668            1 :     spdm_context->local_context.capability.flags |=
     669              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
     670            1 :     spdm_context->local_context.capability.flags &=
     671              :         ~SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_INSTALL_RESET_CAP;
     672            1 :     spdm_context->local_context.capability.flags &=
     673              :         ~SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ALIAS_CERT_CAP;
     674            1 :     spdm_context->local_context.capability.flags |=
     675              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
     676            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     677            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     678              : 
     679            1 :     spdm_context->last_spdm_request_session_id_valid = false;
     680            1 :     g_in_trusted_environment = false;
     681              : 
     682            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     683              :                                                     m_libspdm_use_asym_algo, &cert_chain,
     684              :                                                     &cert_chain_size, NULL, NULL);
     685              : 
     686            1 :     m_libspdm_set_certificate_request = malloc(sizeof(spdm_set_certificate_request_t) +
     687              :                                                cert_chain_size);
     688              : 
     689            1 :     m_libspdm_set_certificate_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     690            1 :     m_libspdm_set_certificate_request->header.request_response_code = SPDM_SET_CERTIFICATE;
     691            1 :     m_libspdm_set_certificate_request->header.param1 = 1;
     692            1 :     m_libspdm_set_certificate_request->header.param2 = 0;
     693              : 
     694            1 :     libspdm_copy_mem(m_libspdm_set_certificate_request + 1,
     695              :                      LIBSPDM_MAX_CERT_CHAIN_SIZE,
     696              :                      (uint8_t *)cert_chain, cert_chain_size);
     697              : 
     698            1 :     size_t m_libspdm_set_certificate_request_size = sizeof(spdm_set_certificate_request_t) +
     699              :                                                     cert_chain_size;
     700              : 
     701            1 :     response_size = sizeof(response);
     702            1 :     status = libspdm_get_response_set_certificate(spdm_context,
     703              :                                                   m_libspdm_set_certificate_request_size,
     704              :                                                   m_libspdm_set_certificate_request,
     705              :                                                   &response_size, response);
     706            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     707            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     708            1 :     spdm_response = (void *)response;
     709            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     710            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_UNEXPECTED_REQUEST);
     711            1 :     assert_int_equal(spdm_response->header.param2, 0);
     712              : 
     713            1 :     free(cert_chain);
     714            1 :     free(m_libspdm_set_certificate_request);
     715            1 : }
     716              : 
     717              : /**
     718              :  * Test 10: receives a valid SET_CERTIFICATE request message from Requester to erase cert in slot_id:1 with session
     719              :  * Expected Behavior: produces a valid SET_CERTIFICATE_RSP response message
     720              :  **/
     721            1 : static void rsp_set_certificate_rsp_case10(void **state)
     722              : {
     723              :     libspdm_return_t status;
     724              :     libspdm_test_context_t *spdm_test_context;
     725              :     libspdm_context_t *spdm_context;
     726              :     size_t response_size;
     727              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     728              :     spdm_set_certificate_response_t *spdm_response;
     729              :     spdm_set_certificate_request_t *m_libspdm_set_certificate_request;
     730              : 
     731              :     libspdm_session_info_t *session_info;
     732              :     uint32_t session_id;
     733              :     uint8_t slot_id;
     734              : #if defined(_WIN32) || (defined(__clang__) && (defined (LIBSPDM_CPU_AARCH64) || \
     735              :     defined(LIBSPDM_CPU_ARM)))
     736              :     FILE *fp_out;
     737              : #else
     738              :     int64_t fp_out;
     739              :     struct stat file_stat;
     740              : #endif
     741              :     size_t cert_file_size;
     742              : 
     743            1 :     char file_name[] = "slot_id_0_cert_chain.der";
     744            1 :     slot_id = 1;
     745              : 
     746            1 :     spdm_test_context = *state;
     747            1 :     spdm_context = spdm_test_context->spdm_context;
     748            1 :     spdm_test_context->case_id = 0xA;
     749            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     750              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     751              :     /*responset_state need to set normal*/
     752            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
     753            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     754            1 :     spdm_context->local_context.capability.flags |=
     755              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
     756            1 :     spdm_context->local_context.capability.flags |=
     757              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
     758            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     759            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     760              : 
     761            1 :     spdm_context->local_context.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     762            1 :     spdm_context->local_context.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     763              : 
     764            1 :     session_id = 0xFFFFFFFF;
     765            1 :     spdm_context->latest_session_id = session_id;
     766            1 :     spdm_context->last_spdm_request_session_id_valid = true;
     767            1 :     spdm_context->last_spdm_request_session_id = session_id;
     768            1 :     session_info = &spdm_context->session_info[0];
     769            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
     770              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     771            1 :     libspdm_secured_message_set_session_state(
     772              :         session_info->secured_message_context,
     773              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
     774              : 
     775            1 :     m_libspdm_set_certificate_request = malloc(sizeof(spdm_set_certificate_request_t));
     776              : 
     777            1 :     m_libspdm_set_certificate_request->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     778            1 :     m_libspdm_set_certificate_request->header.request_response_code = SPDM_SET_CERTIFICATE;
     779            1 :     m_libspdm_set_certificate_request->header.param1 = slot_id |
     780              :                                                        SPDM_SET_CERTIFICATE_REQUEST_ATTRIBUTES_ERASE;
     781            1 :     m_libspdm_set_certificate_request->header.param2 = 0;
     782              : 
     783            1 :     size_t m_libspdm_set_certificate_request_size = sizeof(spdm_set_certificate_request_t);
     784              : 
     785            1 :     response_size = sizeof(response);
     786            1 :     status = libspdm_get_response_set_certificate(spdm_context,
     787              :                                                   m_libspdm_set_certificate_request_size,
     788              :                                                   m_libspdm_set_certificate_request,
     789              :                                                   &response_size, response);
     790            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     791            1 :     assert_int_equal(response_size, sizeof(spdm_set_certificate_response_t));
     792            1 :     spdm_response = (void *)response;
     793            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_SET_CERTIFICATE_RSP);
     794            1 :     assert_int_equal(spdm_response->header.param1, slot_id);
     795              : 
     796              :     /*change the file name, for example: slot_id_1_cert_chain.der*/
     797            1 :     file_name[8] = (char)(slot_id + '0');
     798              : 
     799              : #if defined(_WIN32) || (defined(__clang__) && (defined (LIBSPDM_CPU_AARCH64) || \
     800              :     defined(LIBSPDM_CPU_ARM)))
     801              :     if ((fp_out = fopen(file_name, "r")) == NULL) {
     802              :         printf("Unable to open file %s\n", file_name);
     803              :         assert_false(true);
     804              :     }
     805              : 
     806              :     /*check the cert is erased*/
     807              :     fseek(fp_out, 0, SEEK_END);
     808              :     cert_file_size = ftell(fp_out);
     809              :     assert_int_equal(cert_file_size, 0);
     810              : 
     811              :     fclose(fp_out);
     812              : #else
     813            1 :     if ((fp_out = open(file_name, O_RDONLY)) == -1) {
     814            0 :         printf("Unable to open file %s\n", file_name);
     815            0 :         assert_false(true);
     816              :     }
     817              : 
     818            1 :     if (fstat(fp_out, &file_stat) != 0) {
     819            0 :         assert_false(true);
     820              :     }
     821              : 
     822            1 :     cert_file_size = file_stat.st_size;
     823            1 :     assert_int_equal(cert_file_size, 0);
     824              : 
     825            1 :     close(fp_out);
     826              : #endif
     827              : 
     828            1 :     free(m_libspdm_set_certificate_request);
     829            1 : }
     830              : 
     831              : /**
     832              :  * Test 11: receives a valid SET_CERTIFICATE request message from Requester to set cert in slot_id:1 with key_pair_id
     833              :  * Expected Behavior: produces a valid SET_CERTIFICATE_RSP response message
     834              :  **/
     835            1 : static void rsp_set_certificate_rsp_case11(void **state)
     836              : {
     837              :     libspdm_return_t status;
     838              :     libspdm_test_context_t *spdm_test_context;
     839              :     libspdm_context_t *spdm_context;
     840              :     size_t response_size;
     841              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     842              :     spdm_set_certificate_response_t *spdm_response;
     843              :     void *cert_chain;
     844              :     size_t cert_chain_size;
     845              :     spdm_set_certificate_request_t *m_libspdm_set_certificate_request;
     846              :     uint8_t slot_id;
     847              :     uint8_t key_pair_id;
     848              : 
     849            1 :     spdm_test_context = *state;
     850            1 :     spdm_context = spdm_test_context->spdm_context;
     851            1 :     spdm_test_context->case_id = 0xB;
     852            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     853              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     854            1 :     slot_id = 1;
     855            1 :     key_pair_id = 1;
     856              : 
     857            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     858            1 :     spdm_context->local_context.capability.flags |=
     859              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
     860            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     861            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     862            1 :     spdm_context->connection_info.multi_key_conn_rsp = true;
     863              : 
     864            1 :     spdm_context->local_context.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     865            1 :     spdm_context->local_context.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     866              : 
     867            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     868              :                                                     m_libspdm_use_asym_algo, &cert_chain,
     869              :                                                     &cert_chain_size, NULL, NULL);
     870              : 
     871            1 :     m_libspdm_set_certificate_request = malloc(sizeof(spdm_set_certificate_request_t) +
     872              :                                                cert_chain_size);
     873              : 
     874            1 :     m_libspdm_set_certificate_request->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     875            1 :     m_libspdm_set_certificate_request->header.request_response_code = SPDM_SET_CERTIFICATE;
     876            1 :     m_libspdm_set_certificate_request->header.param1 =
     877              :         slot_id | (SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT <<
     878              :                    SPDM_SET_CERTIFICATE_REQUEST_ATTRIBUTES_CERT_MODEL_OFFSET);
     879            1 :     m_libspdm_set_certificate_request->header.param2 = key_pair_id;
     880              : 
     881            1 :     libspdm_copy_mem(m_libspdm_set_certificate_request + 1,
     882              :                      LIBSPDM_MAX_CERT_CHAIN_SIZE,
     883              :                      (uint8_t *)cert_chain, cert_chain_size);
     884              : 
     885            1 :     size_t m_libspdm_set_certificate_request_size = sizeof(spdm_set_certificate_request_t) +
     886              :                                                     cert_chain_size;
     887              : 
     888            1 :     response_size = sizeof(response);
     889            1 :     status = libspdm_get_response_set_certificate(spdm_context,
     890              :                                                   m_libspdm_set_certificate_request_size,
     891              :                                                   m_libspdm_set_certificate_request,
     892              :                                                   &response_size, response);
     893            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     894            1 :     assert_int_equal(response_size, sizeof(spdm_set_certificate_response_t));
     895            1 :     spdm_response = (void *)response;
     896            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_SET_CERTIFICATE_RSP);
     897              : 
     898            1 :     free(cert_chain);
     899            1 :     free(m_libspdm_set_certificate_request);
     900            1 : }
     901              : 
     902              : /**
     903              :  * Test 12: Illegal combination of MULTI_KEY_CONN_RSP = true, Erase = false, and SetCertModel = 0.
     904              :  * Expected Behavior: produces SPDM_ERROR_CODE_INVALID_REQUEST message.
     905              :  **/
     906            1 : static void rsp_set_certificate_rsp_case12(void **state)
     907              : {
     908              :     libspdm_return_t status;
     909              :     libspdm_test_context_t *spdm_test_context;
     910              :     libspdm_context_t *spdm_context;
     911              :     size_t response_size;
     912              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     913              :     spdm_set_certificate_response_t *spdm_response;
     914              :     void *cert_chain;
     915              :     size_t cert_chain_size;
     916              :     spdm_set_certificate_request_t *m_libspdm_set_certificate_request;
     917              :     uint8_t slot_id;
     918              :     uint8_t key_pair_id;
     919              : 
     920            1 :     spdm_test_context = *state;
     921            1 :     spdm_context = spdm_test_context->spdm_context;
     922            1 :     spdm_test_context->case_id = 0xc;
     923            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     924              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     925            1 :     slot_id = 1;
     926            1 :     key_pair_id = 1;
     927              : 
     928            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     929            1 :     spdm_context->local_context.capability.flags |=
     930              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
     931            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     932            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     933            1 :     spdm_context->connection_info.multi_key_conn_rsp = true;
     934              : 
     935            1 :     spdm_context->local_context.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     936            1 :     spdm_context->local_context.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     937              : 
     938            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     939              :                                                     m_libspdm_use_asym_algo, &cert_chain,
     940              :                                                     &cert_chain_size, NULL, NULL);
     941              : 
     942            1 :     m_libspdm_set_certificate_request = malloc(sizeof(spdm_set_certificate_request_t) +
     943              :                                                cert_chain_size);
     944              : 
     945            1 :     m_libspdm_set_certificate_request->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     946            1 :     m_libspdm_set_certificate_request->header.request_response_code = SPDM_SET_CERTIFICATE;
     947            1 :     m_libspdm_set_certificate_request->header.param1 =
     948              :         slot_id | (SPDM_CERTIFICATE_INFO_CERT_MODEL_NONE <<
     949              :                    SPDM_SET_CERTIFICATE_REQUEST_ATTRIBUTES_CERT_MODEL_OFFSET);
     950            1 :     m_libspdm_set_certificate_request->header.param2 = key_pair_id;
     951              : 
     952            1 :     libspdm_copy_mem(m_libspdm_set_certificate_request + 1,
     953              :                      LIBSPDM_MAX_CERT_CHAIN_SIZE,
     954              :                      (uint8_t *)cert_chain, cert_chain_size);
     955              : 
     956            1 :     size_t m_libspdm_set_certificate_request_size = sizeof(spdm_set_certificate_request_t) +
     957              :                                                     cert_chain_size;
     958              : 
     959            1 :     response_size = sizeof(response);
     960            1 :     status = libspdm_get_response_set_certificate(spdm_context,
     961              :                                                   m_libspdm_set_certificate_request_size,
     962              :                                                   m_libspdm_set_certificate_request,
     963              :                                                   &response_size, response);
     964              : 
     965            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     966            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     967            1 :     spdm_response = (void *)response;
     968            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     969            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
     970            1 :     assert_int_equal(spdm_response->header.param2, 0);
     971              : 
     972            1 :     free(cert_chain);
     973            1 :     free(m_libspdm_set_certificate_request);
     974            1 : }
     975              : 
     976              : /**
     977              :  * Test 13: The Responder cannot complete request due to busy response when writing to NVM.
     978              :  * Expected Behavior: The Responder returns a Busy error response.
     979              :  **/
     980            1 : static void rsp_set_certificate_rsp_case13(void **state)
     981              : {
     982              :     libspdm_return_t status;
     983              :     libspdm_test_context_t *spdm_test_context;
     984              :     libspdm_context_t *spdm_context;
     985              :     size_t response_size;
     986              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     987              :     spdm_set_certificate_response_t *spdm_response;
     988              :     void *cert_chain;
     989              :     size_t cert_chain_size;
     990              :     spdm_set_certificate_request_t *m_libspdm_set_certificate_request;
     991              : 
     992            1 :     spdm_test_context = *state;
     993            1 :     spdm_context = spdm_test_context->spdm_context;
     994            1 :     spdm_test_context->case_id = 0xd;
     995            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     996              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     997              : 
     998            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     999            1 :     spdm_context->local_context.capability.flags |=
    1000              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
    1001            1 :     spdm_context->local_context.capability.flags |=
    1002              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_INSTALL_RESET_CAP;
    1003            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1004            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    1005              : 
    1006            1 :     spdm_context->local_context.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1007            1 :     spdm_context->local_context.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    1008              : 
    1009            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1010              :                                                     m_libspdm_use_asym_algo, &cert_chain,
    1011              :                                                     &cert_chain_size, NULL, NULL);
    1012              : 
    1013            1 :     m_libspdm_set_certificate_request = malloc(sizeof(spdm_set_certificate_request_t) +
    1014              :                                                cert_chain_size);
    1015              : 
    1016            1 :     m_libspdm_set_certificate_request->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1017            1 :     m_libspdm_set_certificate_request->header.request_response_code = SPDM_SET_CERTIFICATE;
    1018            1 :     m_libspdm_set_certificate_request->header.param1 = 0;
    1019            1 :     m_libspdm_set_certificate_request->header.param2 = 0;
    1020              : 
    1021            1 :     libspdm_copy_mem(m_libspdm_set_certificate_request + 1,
    1022              :                      LIBSPDM_MAX_CERT_CHAIN_SIZE,
    1023              :                      (uint8_t *)cert_chain, cert_chain_size);
    1024              : 
    1025            1 :     size_t m_libspdm_set_certificate_request_size = sizeof(spdm_set_certificate_request_t) +
    1026              :                                                     cert_chain_size;
    1027              : 
    1028              :     /* Unable to write to NVM due to busy condition. */
    1029            1 :     g_set_cert_is_busy = true;
    1030              : 
    1031            1 :     response_size = sizeof(response);
    1032            1 :     status = libspdm_get_response_set_certificate(spdm_context,
    1033              :                                                   m_libspdm_set_certificate_request_size,
    1034              :                                                   m_libspdm_set_certificate_request,
    1035              :                                                   &response_size, response);
    1036            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1037            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
    1038            1 :     spdm_response = (void *)response;
    1039            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
    1040            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_BUSY);
    1041            1 :     assert_int_equal(spdm_response->header.param2, 0);
    1042              : 
    1043            1 :     g_set_cert_is_busy = false;
    1044              : 
    1045            1 :     free(cert_chain);
    1046            1 :     free(m_libspdm_set_certificate_request);
    1047            1 : }
    1048              : 
    1049            1 : int libspdm_rsp_set_certificate_rsp_test(void)
    1050              : {
    1051            1 :     const struct CMUnitTest test_cases[] = {
    1052              :         /* Success Case for set_certificate to slot_id:0 with device_cert mode*/
    1053              :         cmocka_unit_test(rsp_set_certificate_rsp_case1),
    1054              :         /* Bad request size*/
    1055              :         cmocka_unit_test(rsp_set_certificate_rsp_case2),
    1056              :         /* response_state: LIBSPDM_RESPONSE_STATE_BUSY*/
    1057              :         cmocka_unit_test(rsp_set_certificate_rsp_case3),
    1058              :         /* response_state: LIBSPDM_RESPONSE_STATE_NEED_RESYNC*/
    1059              :         cmocka_unit_test(rsp_set_certificate_rsp_case4),
    1060              :         /* Success Case for set_certificate to slot_id:1 with session*/
    1061              :         cmocka_unit_test(rsp_set_certificate_rsp_case5),
    1062              :         /* Responder requires a reset to complete the SET_CERTIFICATE request */
    1063              :         cmocka_unit_test(rsp_set_certificate_rsp_case6),
    1064              :         /* Success Case for set_certificate to slot_id:0 with alias_cert mode*/
    1065              :         cmocka_unit_test(rsp_set_certificate_rsp_case7),
    1066              :         /* Success Case for set_certificate to slot_id:1 without session and with trusted environment */
    1067              :         cmocka_unit_test(rsp_set_certificate_rsp_case8),
    1068              :         /* Error Case for set_certificate to slot_id:1 without session and without trusted environment */
    1069              :         cmocka_unit_test(rsp_set_certificate_rsp_case9),
    1070              :         /* Success Case for erase certificate to slot_id:1 with session*/
    1071              :         cmocka_unit_test(rsp_set_certificate_rsp_case10),
    1072              :         /* Success Case for set_certificate to slot_id:1 with key_pair_id*/
    1073              :         cmocka_unit_test(rsp_set_certificate_rsp_case11),
    1074              :         cmocka_unit_test(rsp_set_certificate_rsp_case12),
    1075              :         cmocka_unit_test(rsp_set_certificate_rsp_case13),
    1076              :     };
    1077              : 
    1078            1 :     libspdm_test_context_t test_context = {
    1079              :         LIBSPDM_TEST_CONTEXT_VERSION,
    1080              :         false,
    1081              :     };
    1082              : 
    1083            1 :     libspdm_setup_test_context(&test_context);
    1084              : 
    1085            1 :     return cmocka_run_group_tests(test_cases,
    1086              :                                   libspdm_unit_test_group_setup,
    1087              :                                   libspdm_unit_test_group_teardown);
    1088              : }
    1089              : 
    1090              : #endif /* LIBSPDM_ENABLE_CAPABILITY_SET_CERT_CAP*/
        

Generated by: LCOV version 2.0-1