LCOV - code coverage report
Current view: top level - unit_test/test_spdm_requester - set_certificate.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 84.9 % 258 219
Test Date: 2026-02-22 08:11:49 Functions: 100.0 % 11 11

            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_requester_lib.h"
       9              : #include "internal/libspdm_secured_message_lib.h"
      10              : 
      11              : #if LIBSPDM_ENABLE_CAPABILITY_SET_CERT_CAP
      12              : 
      13            6 : static libspdm_return_t send_message(
      14              :     void *spdm_context, size_t request_size, const void *request, uint64_t timeout)
      15              : {
      16              :     libspdm_test_context_t *spdm_test_context;
      17              :     uint32_t *session_id;
      18              :     libspdm_session_info_t *session_info;
      19              :     bool is_app_message;
      20              :     uint8_t *app_message;
      21              :     size_t app_message_size;
      22              :     uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
      23              :     spdm_set_certificate_request_t *spdm_request;
      24              : 
      25            6 :     memcpy(message_buffer, request, request_size);
      26            6 :     libspdm_transport_test_decode_message(spdm_context, &session_id, &is_app_message, true,
      27              :                                           request_size, message_buffer, &app_message_size,
      28              :                                           (void **)&app_message);
      29              : 
      30            6 :     spdm_test_context = libspdm_get_test_context();
      31            6 :     switch (spdm_test_context->case_id) {
      32            1 :     case 0x1:
      33            1 :         return LIBSPDM_STATUS_SEND_FAIL;
      34            1 :     case 0x2:
      35            1 :         spdm_request = (spdm_set_certificate_request_t *)app_message;
      36              : 
      37            1 :         assert_int_equal(spdm_request->header.spdm_version, SPDM_MESSAGE_VERSION_12);
      38            1 :         assert_int_equal(spdm_request->header.request_response_code, SPDM_SET_CERTIFICATE);
      39            1 :         assert_int_equal(spdm_request->header.param1 & SPDM_SET_CERTIFICATE_REQUEST_SLOT_ID_MASK,
      40              :                          0);
      41            1 :         assert_int_equal(spdm_request->header.param2, 0);
      42              : 
      43            1 :         return LIBSPDM_STATUS_SUCCESS;
      44            0 :     case 0x3:
      45            0 :         assert_true(false);
      46              : 
      47            0 :         return LIBSPDM_STATUS_SUCCESS;
      48            0 :     case 0x4:
      49            0 :         return LIBSPDM_STATUS_SUCCESS;
      50            1 :     case 0x5:
      51            1 :         session_id = NULL;
      52            1 :         session_info = libspdm_get_session_info_via_session_id(spdm_context, 0xFFFFFFFF);
      53            1 :         if (session_info == NULL) {
      54            0 :             return LIBSPDM_STATUS_SEND_FAIL;
      55              :         }
      56            1 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "Request (0x%zx):\n", request_size));
      57            1 :         libspdm_dump_hex(request, request_size);
      58              : 
      59            1 :         libspdm_get_scratch_buffer (spdm_context, (void **)&app_message, &app_message_size);
      60            1 :         libspdm_transport_test_decode_message(
      61              :             spdm_context, &session_id, &is_app_message,
      62              :             false, request_size, message_buffer,
      63              :             &app_message_size, (void **)&app_message);
      64              : 
      65              :         /* WALKAROUND: If just use single context to encode
      66              :          * message and then decode message */
      67              :         ((libspdm_secured_message_context_t
      68            1 :           *)(session_info->secured_message_context))
      69            1 :         ->application_secret.request_data_sequence_number--;
      70              : 
      71            1 :         return LIBSPDM_STATUS_SUCCESS;
      72            1 :     case 0x6:
      73            1 :         spdm_request = (spdm_set_certificate_request_t *)app_message;
      74              : 
      75            1 :         assert_int_equal(spdm_request->header.spdm_version, SPDM_MESSAGE_VERSION_12);
      76            1 :         assert_int_equal(spdm_request->header.request_response_code, SPDM_SET_CERTIFICATE);
      77            1 :         assert_int_equal(spdm_request->header.param1 & SPDM_SET_CERTIFICATE_REQUEST_SLOT_ID_MASK,
      78              :                          0);
      79            1 :         assert_int_equal(spdm_request->header.param2, 0);
      80              : 
      81            1 :         return LIBSPDM_STATUS_SUCCESS;
      82            1 :     case 0x7:
      83            1 :         spdm_request = (spdm_set_certificate_request_t *)app_message;
      84              : 
      85            1 :         assert_int_equal(spdm_request->header.spdm_version, SPDM_MESSAGE_VERSION_13);
      86            1 :         assert_int_equal(spdm_request->header.request_response_code, SPDM_SET_CERTIFICATE);
      87            1 :         assert_int_equal(spdm_request->header.param1 & SPDM_SET_CERTIFICATE_REQUEST_SLOT_ID_MASK,
      88              :                          0);
      89            1 :         assert_int_equal((spdm_request->header.param1 &
      90              :                           SPDM_SET_CERTIFICATE_REQUEST_ATTRIBUTES_CERT_MODEL_MASK) >>
      91              :                          SPDM_SET_CERTIFICATE_REQUEST_ATTRIBUTES_CERT_MODEL_OFFSET,
      92              :                          SPDM_CERTIFICATE_INFO_CERT_MODEL_NONE);
      93            1 :         assert_int_equal(spdm_request->header.param1 &
      94              :                          SPDM_SET_CERTIFICATE_REQUEST_ATTRIBUTES_ERASE,
      95              :                          SPDM_SET_CERTIFICATE_REQUEST_ATTRIBUTES_ERASE);
      96            1 :         assert_int_equal(spdm_request->header.param2, 0);
      97              : 
      98            1 :         return LIBSPDM_STATUS_SUCCESS;
      99            0 :     case 0x8:
     100            0 :         assert_true(false);
     101            0 :         return LIBSPDM_STATUS_SEND_FAIL;
     102            1 :     case 0x9:
     103            1 :         spdm_request = (spdm_set_certificate_request_t *)app_message;
     104              : 
     105            1 :         assert_int_equal(spdm_request->header.spdm_version, SPDM_MESSAGE_VERSION_13);
     106            1 :         assert_int_equal(spdm_request->header.request_response_code, SPDM_SET_CERTIFICATE);
     107            1 :         assert_int_equal(spdm_request->header.param1 & SPDM_SET_CERTIFICATE_REQUEST_SLOT_ID_MASK,
     108              :                          3);
     109            1 :         assert_int_equal((spdm_request->header.param1 &
     110              :                           SPDM_SET_CERTIFICATE_REQUEST_ATTRIBUTES_CERT_MODEL_MASK) >>
     111              :                          SPDM_SET_CERTIFICATE_REQUEST_ATTRIBUTES_CERT_MODEL_OFFSET,
     112              :                          SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT);
     113            1 :         assert_int_equal(spdm_request->header.param2, 1);
     114              : 
     115            1 :         return LIBSPDM_STATUS_SUCCESS;
     116              : 
     117            0 :     default:
     118            0 :         return LIBSPDM_STATUS_SEND_FAIL;
     119              :     }
     120              : }
     121              : 
     122            5 : static libspdm_return_t receive_message(
     123              :     void *spdm_context, size_t *response_size, void **response, uint64_t timeout)
     124              : {
     125              :     libspdm_test_context_t *spdm_test_context;
     126              : 
     127            5 :     spdm_test_context = libspdm_get_test_context();
     128            5 :     switch (spdm_test_context->case_id) {
     129            0 :     case 0x1:
     130            0 :         return LIBSPDM_STATUS_RECEIVE_FAIL;
     131              : 
     132            1 :     case 0x2: {
     133              :         spdm_set_certificate_response_t *spdm_response;
     134              :         size_t spdm_response_size;
     135              :         size_t transport_header_size;
     136              : 
     137            1 :         spdm_response_size = sizeof(spdm_set_certificate_response_t);
     138            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     139            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     140              : 
     141            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     142            1 :         spdm_response->header.request_response_code = SPDM_SET_CERTIFICATE_RSP;
     143            1 :         spdm_response->header.param1 = 0;
     144            1 :         spdm_response->header.param2 = 0;
     145              : 
     146            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     147              :                                               false, spdm_response_size,
     148              :                                               spdm_response, response_size,
     149              :                                               response);
     150              :     }
     151            1 :         return LIBSPDM_STATUS_SUCCESS;
     152              : 
     153            0 :     case 0x3: {
     154              :         spdm_set_certificate_response_t *spdm_response;
     155              :         size_t spdm_response_size;
     156              :         size_t transport_header_size;
     157              : 
     158            0 :         spdm_response_size = sizeof(spdm_set_certificate_response_t);
     159            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     160            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     161              : 
     162            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     163            0 :         spdm_response->header.request_response_code = SPDM_SET_CERTIFICATE_RSP;
     164            0 :         spdm_response->header.param1 = 0;
     165            0 :         spdm_response->header.param2 = 0;
     166              : 
     167            0 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     168              :                                               false, spdm_response_size,
     169              :                                               spdm_response, response_size,
     170              :                                               response);
     171              :     }
     172            0 :         return LIBSPDM_STATUS_SUCCESS;
     173              : 
     174            0 :     case 0x4: {
     175              :         spdm_set_certificate_response_t *spdm_response;
     176              :         size_t spdm_response_size;
     177              :         size_t transport_header_size;
     178              : 
     179            0 :         spdm_response_size = sizeof(spdm_set_certificate_response_t);
     180            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     181            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     182              : 
     183            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     184            0 :         spdm_response->header.request_response_code = SPDM_SET_CERTIFICATE_RSP;
     185            0 :         spdm_response->header.param1 = 1;
     186            0 :         spdm_response->header.param2 = 0;
     187              : 
     188            0 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     189              :                                               false, spdm_response_size,
     190              :                                               spdm_response, response_size,
     191              :                                               response);
     192              :     }
     193            0 :         return LIBSPDM_STATUS_SUCCESS;
     194              : 
     195            1 :     case 0x05: {
     196              :         spdm_set_certificate_response_t *spdm_response;
     197              :         size_t spdm_response_size;
     198              :         size_t transport_header_size;
     199              :         uint32_t session_id;
     200              :         libspdm_session_info_t *session_info;
     201              :         uint8_t *scratch_buffer;
     202              :         size_t scratch_buffer_size;
     203              : 
     204            1 :         session_id = 0xFFFFFFFF;
     205              : 
     206            1 :         spdm_response_size = sizeof(spdm_set_certificate_response_t);
     207            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     208            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     209              : 
     210            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     211            1 :         spdm_response->header.request_response_code = SPDM_SET_CERTIFICATE_RSP;
     212              :         /*slot id is 1*/
     213            1 :         spdm_response->header.param1 = 1;
     214            1 :         spdm_response->header.param2 = 0;
     215              : 
     216              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
     217              :          * transport_message is always in sender buffer. */
     218            1 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
     219            1 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
     220              :                           scratch_buffer_size - transport_header_size,
     221              :                           spdm_response, spdm_response_size);
     222            1 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
     223            1 :         libspdm_transport_test_encode_message(spdm_context, &session_id, false,
     224              :                                               false, spdm_response_size,
     225              :                                               spdm_response, response_size,
     226              :                                               response);
     227            1 :         session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
     228            1 :         if (session_info == NULL) {
     229            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
     230              :         }
     231              :         /* WALKAROUND: If just use single context to encode message and then decode message */
     232              :         ((libspdm_secured_message_context_t
     233            1 :           *)(session_info->secured_message_context))
     234            1 :         ->application_secret.response_data_sequence_number--;
     235              :     }
     236            1 :         return LIBSPDM_STATUS_SUCCESS;
     237              : 
     238            1 :     case 0x6: {
     239              :         spdm_set_certificate_response_t *spdm_response;
     240              :         size_t spdm_response_size;
     241              :         size_t transport_header_size;
     242              : 
     243            1 :         spdm_response_size = sizeof(spdm_set_certificate_response_t);
     244            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     245            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     246              : 
     247            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     248            1 :         spdm_response->header.request_response_code = SPDM_ERROR;
     249            1 :         spdm_response->header.param1 = SPDM_ERROR_CODE_RESET_REQUIRED;
     250            1 :         spdm_response->header.param2 = 0;
     251              : 
     252            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     253              :                                               false, spdm_response_size,
     254              :                                               spdm_response, response_size,
     255              :                                               response);
     256              :     }
     257            1 :         return LIBSPDM_STATUS_SUCCESS;
     258              : 
     259            1 :     case 0x7: {
     260              :         spdm_set_certificate_response_t *spdm_response;
     261              :         size_t spdm_response_size;
     262              :         size_t transport_header_size;
     263              : 
     264            1 :         spdm_response_size = sizeof(spdm_set_certificate_response_t);
     265            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     266            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     267              : 
     268            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     269            1 :         spdm_response->header.request_response_code = SPDM_SET_CERTIFICATE_RSP;
     270            1 :         spdm_response->header.param1 = 0;
     271            1 :         spdm_response->header.param2 = 0;
     272              : 
     273            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     274              :                                               false, spdm_response_size,
     275              :                                               spdm_response, response_size,
     276              :                                               response);
     277              :     }
     278            1 :         return LIBSPDM_STATUS_SUCCESS;
     279              : 
     280            0 :     case 0x8:
     281            0 :         assert_true(false);
     282            0 :         return LIBSPDM_STATUS_RECEIVE_FAIL;
     283              : 
     284            1 :     case 0x9: {
     285              :         spdm_set_certificate_response_t *spdm_response;
     286              :         size_t spdm_response_size;
     287              :         size_t transport_header_size;
     288              : 
     289            1 :         spdm_response_size = sizeof(spdm_set_certificate_response_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 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     294            1 :         spdm_response->header.request_response_code = SPDM_SET_CERTIFICATE_RSP;
     295            1 :         spdm_response->header.param1 = 3;
     296            1 :         spdm_response->header.param2 = 0;
     297              : 
     298            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     299              :                                               false, spdm_response_size,
     300              :                                               spdm_response, response_size,
     301              :                                               response);
     302              :     }
     303            1 :         return LIBSPDM_STATUS_SUCCESS;
     304              : 
     305            0 :     default:
     306            0 :         return LIBSPDM_STATUS_RECEIVE_FAIL;
     307              :     }
     308              : }
     309              : 
     310              : 
     311              : /**
     312              :  * Test 1: message could not be sent
     313              :  * Expected Behavior: get a RETURN_DEVICE_ERROR return code
     314              :  **/
     315            1 : static void req_set_certificate_case1(void **state)
     316              : {
     317              :     libspdm_return_t status;
     318              :     libspdm_test_context_t *spdm_test_context;
     319              :     libspdm_context_t *spdm_context;
     320              : 
     321              :     void *data;
     322              :     size_t data_size;
     323              : 
     324            1 :     spdm_test_context = *state;
     325            1 :     spdm_context = spdm_test_context->spdm_context;
     326            1 :     spdm_test_context->case_id = 0x1;
     327            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     328              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     329              : 
     330            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     331            1 :     spdm_context->connection_info.capability.flags |=
     332              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
     333              : 
     334            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     335              :                                                     m_libspdm_use_asym_algo,
     336              :                                                     &data, &data_size, NULL, NULL);
     337              : 
     338            1 :     status = libspdm_set_certificate(spdm_context, NULL, 0, data, data_size);
     339              : 
     340            1 :     assert_int_equal(status, LIBSPDM_STATUS_SEND_FAIL);
     341            1 :     free(data);
     342            1 : }
     343              : 
     344              : /**
     345              :  * Test 2: Successful response to set certificate for slot 0
     346              :  * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code
     347              :  **/
     348            1 : static void req_set_certificate_case2(void **state)
     349              : {
     350              :     libspdm_return_t status;
     351              :     libspdm_test_context_t *spdm_test_context;
     352              :     libspdm_context_t *spdm_context;
     353              : 
     354              :     void *data;
     355              :     size_t data_size;
     356              : 
     357            1 :     spdm_test_context = *state;
     358            1 :     spdm_context = spdm_test_context->spdm_context;
     359            1 :     spdm_test_context->case_id = 0x2;
     360            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     361              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     362              : 
     363            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     364            1 :     spdm_context->connection_info.capability.flags |=
     365              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
     366              : 
     367            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     368              :                                                     m_libspdm_use_asym_algo,
     369              :                                                     &data, &data_size, NULL, NULL);
     370              : 
     371            1 :     status = libspdm_set_certificate(spdm_context, NULL, 0, data, data_size);
     372              : 
     373            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     374            1 :     free(data);
     375            1 : }
     376              : 
     377              : /**
     378              :  * Test 3: Unsuccessful response to set certificate for slot 0, because cert_chain is NULL.
     379              :  * Expected Behavior: get a LIBSPDM_STATUS_INVALID_PARAMETER return code
     380              :  **/
     381            1 : static void req_set_certificate_case3(void **state)
     382              : {
     383              :     libspdm_return_t status;
     384              :     libspdm_test_context_t *spdm_test_context;
     385              :     libspdm_context_t *spdm_context;
     386              : 
     387            1 :     spdm_test_context = *state;
     388            1 :     spdm_context = spdm_test_context->spdm_context;
     389            1 :     spdm_test_context->case_id = 0x3;
     390            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     391              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     392              : 
     393            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     394            1 :     spdm_context->connection_info.capability.flags |=
     395              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
     396              : 
     397            1 :     status = libspdm_set_certificate(spdm_context, NULL, 0, NULL, 0);
     398              : 
     399            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_PARAMETER);
     400            1 : }
     401              : 
     402              : /**
     403              :  * Test 5: Successful response to set certificate for slot 1 in secure session
     404              :  * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code
     405              :  **/
     406            1 : static void req_set_certificate_case5(void **state)
     407              : {
     408              :     libspdm_return_t status;
     409              :     libspdm_test_context_t *spdm_test_context;
     410              :     libspdm_context_t *spdm_context;
     411              :     uint32_t session_id;
     412              :     libspdm_session_info_t *session_info;
     413              : 
     414              :     void *data;
     415              :     size_t data_size;
     416              : 
     417            1 :     spdm_test_context = *state;
     418            1 :     spdm_context = spdm_test_context->spdm_context;
     419            1 :     spdm_test_context->case_id = 0x05;
     420            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     421              : 
     422            1 :     spdm_context->connection_info.capability.flags |=
     423              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
     424            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
     425            1 :     spdm_context->connection_info.capability.flags |=
     426              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
     427            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
     428            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
     429            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
     430            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
     431            1 :     spdm_context->connection_info.capability.flags |=
     432              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
     433            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
     434            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
     435              : 
     436            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     437              :                                                     m_libspdm_use_asym_algo, &data,
     438              :                                                     &data_size, NULL, NULL);
     439              : 
     440            1 :     session_id = 0xFFFFFFFF;
     441            1 :     session_info = &spdm_context->session_info[0];
     442            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
     443              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     444            1 :     libspdm_secured_message_set_session_state(session_info->secured_message_context,
     445              :                                               LIBSPDM_SESSION_STATE_ESTABLISHED);
     446              : 
     447              :     /* slot id is 1*/
     448            1 :     status = libspdm_set_certificate(spdm_context, &session_id, 1, data, data_size);
     449            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     450              : 
     451            1 :     free(data);
     452            1 : }
     453              : 
     454              : /**
     455              :  * Test 6: Successful response to set certificate for slot 0 with a reset required
     456              :  * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code
     457              :  **/
     458            1 : static void req_set_certificate_case6(void **state)
     459              : {
     460              :     libspdm_return_t status;
     461              :     libspdm_test_context_t *spdm_test_context;
     462              :     libspdm_context_t *spdm_context;
     463              : 
     464              :     void *data;
     465              :     size_t data_size;
     466              : 
     467            1 :     spdm_test_context = *state;
     468            1 :     spdm_context = spdm_test_context->spdm_context;
     469            1 :     spdm_test_context->case_id = 0x6;
     470            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     471              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     472              : 
     473            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     474            1 :     spdm_context->connection_info.capability.flags |=
     475              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP |
     476              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_INSTALL_RESET_CAP;
     477              : 
     478            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     479              :                                                     m_libspdm_use_asym_algo,
     480              :                                                     &data, &data_size, NULL, NULL);
     481              : 
     482            1 :     status = libspdm_set_certificate(spdm_context, NULL, 0, data, data_size);
     483              : 
     484            1 :     assert_int_equal(status, LIBSPDM_STATUS_RESET_REQUIRED_PEER);
     485            1 :     free(data);
     486            1 : }
     487              : 
     488              : /**
     489              :  * Test 7: Successful response to erase certificate for slot 0
     490              :  * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code
     491              :  **/
     492            1 : static void req_set_certificate_case7(void **state)
     493              : {
     494              :     libspdm_return_t status;
     495              :     libspdm_test_context_t *spdm_test_context;
     496              :     libspdm_context_t *spdm_context;
     497              : 
     498            1 :     spdm_test_context = *state;
     499            1 :     spdm_context = spdm_test_context->spdm_context;
     500            1 :     spdm_test_context->case_id = 0x7;
     501            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     502              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     503              : 
     504            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     505            1 :     spdm_context->connection_info.capability.flags |=
     506              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
     507              : 
     508            1 :     status = libspdm_set_certificate_ex(spdm_context, NULL, 0, NULL, 0,
     509              :                                         SPDM_SET_CERTIFICATE_REQUEST_ATTRIBUTES_ERASE, 0);
     510              : 
     511            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     512            1 : }
     513              : 
     514              : /**
     515              :  * Test 8: Illegal combination of MULTI_KEY_CONN_RSP = true, Erase = false, and SetCertModel = 0.
     516              :  * Expected Behavior: function returns LIBSPDM_STATUS_INVALID_PARAMETER.
     517              :  **/
     518            1 : static void req_set_certificate_case8(void **state)
     519              : {
     520              :     libspdm_return_t status;
     521              :     libspdm_test_context_t *spdm_test_context;
     522              :     libspdm_context_t *spdm_context;
     523              : 
     524              :     void *data;
     525              :     size_t data_size;
     526              : 
     527            1 :     spdm_test_context = *state;
     528            1 :     spdm_context = spdm_test_context->spdm_context;
     529            1 :     spdm_test_context->case_id = 0x8;
     530            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     531              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     532              : 
     533            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     534            1 :     spdm_context->connection_info.capability.flags |=
     535              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
     536            1 :     spdm_context->connection_info.multi_key_conn_rsp = true;
     537              : 
     538            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     539              :                                                     m_libspdm_use_asym_algo,
     540              :                                                     &data, &data_size, NULL, NULL);
     541              : 
     542            1 :     status = libspdm_set_certificate_ex(spdm_context, NULL, 0, data, data_size,
     543              :                                         (SPDM_CERTIFICATE_INFO_CERT_MODEL_NONE <<
     544              :                                          SPDM_SET_CERTIFICATE_REQUEST_ATTRIBUTES_CERT_MODEL_OFFSET),
     545              :                                         1);
     546              : 
     547            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_PARAMETER);
     548            1 : }
     549              : 
     550              : /**
     551              :  * Test 9: Set MULTI_KEY_CONN_RSP = true, Erase = false, and SetCertModel = DeviceCert.
     552              :  * Expected Behavior: function returns LIBSPDM_STATUS_SUCCESS.
     553              :  **/
     554            1 : static void req_set_certificate_case9(void **state)
     555              : {
     556              :     libspdm_return_t status;
     557              :     libspdm_test_context_t *spdm_test_context;
     558              :     libspdm_context_t *spdm_context;
     559              : 
     560              :     void *data;
     561              :     size_t data_size;
     562              : 
     563            1 :     spdm_test_context = *state;
     564            1 :     spdm_context = spdm_test_context->spdm_context;
     565            1 :     spdm_test_context->case_id = 0x9;
     566            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     567              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     568              : 
     569            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     570            1 :     spdm_context->connection_info.capability.flags |=
     571              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
     572            1 :     spdm_context->connection_info.multi_key_conn_rsp = true;
     573              : 
     574            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     575              :                                                     m_libspdm_use_asym_algo,
     576              :                                                     &data, &data_size, NULL, NULL);
     577              : 
     578            1 :     status = libspdm_set_certificate_ex(spdm_context, NULL, 3, data, data_size,
     579              :                                         (SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT <<
     580              :                                          SPDM_SET_CERTIFICATE_REQUEST_ATTRIBUTES_CERT_MODEL_OFFSET),
     581              :                                         1);
     582              : 
     583            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     584            1 : }
     585              : 
     586            1 : int libspdm_req_set_certificate_test(void)
     587              : {
     588            1 :     const struct CMUnitTest test_cases[] = {
     589              :         /* SendRequest failed*/
     590              :         cmocka_unit_test(req_set_certificate_case1),
     591              :         /* Successful response to set certificate*/
     592              :         cmocka_unit_test(req_set_certificate_case2),
     593              :         /* Set null cert_chain for slot 0*/
     594              :         cmocka_unit_test(req_set_certificate_case3),
     595              :         /* Successful response to set certificate for slot 1 in secure session*/
     596              :         cmocka_unit_test(req_set_certificate_case5),
     597              :         /* Successful response to set certificate with a reset required */
     598              :         cmocka_unit_test(req_set_certificate_case6),
     599              :         /* Successful response to erase certificate*/
     600              :         cmocka_unit_test(req_set_certificate_case7),
     601              :         cmocka_unit_test(req_set_certificate_case8),
     602              :         cmocka_unit_test(req_set_certificate_case9),
     603              :     };
     604              : 
     605            1 :     libspdm_test_context_t test_context = {
     606              :         LIBSPDM_TEST_CONTEXT_VERSION,
     607              :         true,
     608              :         send_message,
     609              :         receive_message,
     610              :     };
     611              : 
     612            1 :     libspdm_setup_test_context(&test_context);
     613              : 
     614            1 :     return cmocka_run_group_tests(test_cases,
     615              :                                   libspdm_unit_test_group_setup,
     616              :                                   libspdm_unit_test_group_teardown);
     617              : }
     618              : 
     619              : #endif /* LIBSPDM_ENABLE_CAPABILITY_SET_CERT_CAP*/
        

Generated by: LCOV version 2.0-1