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: 2025-10-12 08:10:56 Functions: 100.0 % 11 11

            Line data    Source code
       1              : /**
       2              :  *  Copyright Notice:
       3              :  *  Copyright 2021-2025 DMTF. All rights reserved.
       4              :  *  License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
       5              :  **/
       6              : 
       7              : #include "spdm_unit_test.h"
       8              : #include "internal/libspdm_requester_lib.h"
       9              : #include "internal/libspdm_secured_message_lib.h"
      10              : 
      11              : #if LIBSPDM_ENABLE_CAPABILITY_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(
     228              :             spdm_context, session_id);
     229            1 :         if (session_info == NULL) {
     230            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
     231              :         }
     232              :         /* WALKAROUND: If just use single context to encode message and then decode message */
     233              :         ((libspdm_secured_message_context_t
     234            1 :           *)(session_info->secured_message_context))
     235            1 :         ->application_secret.response_data_sequence_number--;
     236              :     }
     237            1 :         return LIBSPDM_STATUS_SUCCESS;
     238              : 
     239            1 :     case 0x6: {
     240              :         spdm_set_certificate_response_t *spdm_response;
     241              :         size_t spdm_response_size;
     242              :         size_t transport_header_size;
     243              : 
     244            1 :         spdm_response_size = sizeof(spdm_set_certificate_response_t);
     245            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     246            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     247              : 
     248            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_12;
     249            1 :         spdm_response->header.request_response_code = SPDM_ERROR;
     250            1 :         spdm_response->header.param1 = SPDM_ERROR_CODE_RESET_REQUIRED;
     251            1 :         spdm_response->header.param2 = 0;
     252              : 
     253            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     254              :                                               false, spdm_response_size,
     255              :                                               spdm_response, response_size,
     256              :                                               response);
     257              :     }
     258            1 :         return LIBSPDM_STATUS_SUCCESS;
     259              : 
     260            1 :     case 0x7: {
     261              :         spdm_set_certificate_response_t *spdm_response;
     262              :         size_t spdm_response_size;
     263              :         size_t transport_header_size;
     264              : 
     265            1 :         spdm_response_size = sizeof(spdm_set_certificate_response_t);
     266            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     267            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     268              : 
     269            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     270            1 :         spdm_response->header.request_response_code = SPDM_SET_CERTIFICATE_RSP;
     271            1 :         spdm_response->header.param1 = 0;
     272            1 :         spdm_response->header.param2 = 0;
     273              : 
     274            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     275              :                                               false, spdm_response_size,
     276              :                                               spdm_response, response_size,
     277              :                                               response);
     278              :     }
     279            1 :         return LIBSPDM_STATUS_SUCCESS;
     280              : 
     281            0 :     case 0x8:
     282            0 :         assert_true(false);
     283            0 :         return LIBSPDM_STATUS_RECEIVE_FAIL;
     284              : 
     285            1 :     case 0x9: {
     286              :         spdm_set_certificate_response_t *spdm_response;
     287              :         size_t spdm_response_size;
     288              :         size_t transport_header_size;
     289              : 
     290            1 :         spdm_response_size = sizeof(spdm_set_certificate_response_t);
     291            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     292            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     293              : 
     294            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     295            1 :         spdm_response->header.request_response_code = SPDM_SET_CERTIFICATE_RSP;
     296            1 :         spdm_response->header.param1 = 3;
     297            1 :         spdm_response->header.param2 = 0;
     298              : 
     299            1 :         libspdm_transport_test_encode_message(spdm_context, NULL, false,
     300              :                                               false, spdm_response_size,
     301              :                                               spdm_response, response_size,
     302              :                                               response);
     303              :     }
     304            1 :         return LIBSPDM_STATUS_SUCCESS;
     305              : 
     306            0 :     default:
     307            0 :         return LIBSPDM_STATUS_RECEIVE_FAIL;
     308              :     }
     309              : }
     310              : 
     311              : 
     312              : /**
     313              :  * Test 1: message could not be sent
     314              :  * Expected Behavior: get a RETURN_DEVICE_ERROR return code
     315              :  **/
     316            1 : static void req_set_certificate_case1(void **state)
     317              : {
     318              :     libspdm_return_t status;
     319              :     libspdm_test_context_t *spdm_test_context;
     320              :     libspdm_context_t *spdm_context;
     321              : 
     322              :     void *data;
     323              :     size_t data_size;
     324              : 
     325            1 :     spdm_test_context = *state;
     326            1 :     spdm_context = spdm_test_context->spdm_context;
     327            1 :     spdm_test_context->case_id = 0x1;
     328            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     329              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     330              : 
     331            1 :     spdm_context->connection_info.connection_state =
     332              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     333            1 :     spdm_context->connection_info.capability.flags |=
     334              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
     335              : 
     336            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     337              :                                                     m_libspdm_use_asym_algo,
     338              :                                                     &data, &data_size, NULL, NULL);
     339              : 
     340            1 :     status = libspdm_set_certificate(spdm_context, NULL, 0, data, data_size);
     341              : 
     342            1 :     assert_int_equal(status, LIBSPDM_STATUS_SEND_FAIL);
     343            1 :     free(data);
     344            1 : }
     345              : 
     346              : /**
     347              :  * Test 2: Successful response to set certificate for slot 0
     348              :  * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code
     349              :  **/
     350            1 : static void req_set_certificate_case2(void **state)
     351              : {
     352              :     libspdm_return_t status;
     353              :     libspdm_test_context_t *spdm_test_context;
     354              :     libspdm_context_t *spdm_context;
     355              : 
     356              :     void *data;
     357              :     size_t data_size;
     358              : 
     359            1 :     spdm_test_context = *state;
     360            1 :     spdm_context = spdm_test_context->spdm_context;
     361            1 :     spdm_test_context->case_id = 0x2;
     362            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     363              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     364              : 
     365            1 :     spdm_context->connection_info.connection_state =
     366              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     367            1 :     spdm_context->connection_info.capability.flags |=
     368              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
     369              : 
     370            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     371              :                                                     m_libspdm_use_asym_algo,
     372              :                                                     &data, &data_size, NULL, NULL);
     373              : 
     374            1 :     status = libspdm_set_certificate(spdm_context, NULL, 0, data, data_size);
     375              : 
     376            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     377            1 :     free(data);
     378            1 : }
     379              : 
     380              : /**
     381              :  * Test 3: Unsuccessful response to set certificate for slot 0, because cert_chain is NULL.
     382              :  * Expected Behavior: get a LIBSPDM_STATUS_INVALID_PARAMETER return code
     383              :  **/
     384            1 : static void req_set_certificate_case3(void **state)
     385              : {
     386              :     libspdm_return_t status;
     387              :     libspdm_test_context_t *spdm_test_context;
     388              :     libspdm_context_t *spdm_context;
     389              : 
     390            1 :     spdm_test_context = *state;
     391            1 :     spdm_context = spdm_test_context->spdm_context;
     392            1 :     spdm_test_context->case_id = 0x3;
     393            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     394              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     395              : 
     396            1 :     spdm_context->connection_info.connection_state =
     397              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     398            1 :     spdm_context->connection_info.capability.flags |=
     399              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
     400              : 
     401            1 :     status = libspdm_set_certificate(spdm_context, NULL, 0, NULL, 0);
     402              : 
     403            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_PARAMETER);
     404            1 : }
     405              : 
     406              : /**
     407              :  * Test 5: Successful response to set certificate for slot 1 in secure session
     408              :  * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code
     409              :  **/
     410            1 : static void req_set_certificate_case5(void **state)
     411              : {
     412              :     libspdm_return_t status;
     413              :     libspdm_test_context_t *spdm_test_context;
     414              :     libspdm_context_t *spdm_context;
     415              :     uint32_t session_id;
     416              :     libspdm_session_info_t *session_info;
     417              : 
     418              :     void *data;
     419              :     size_t data_size;
     420              : 
     421            1 :     spdm_test_context = *state;
     422            1 :     spdm_context = spdm_test_context->spdm_context;
     423            1 :     spdm_test_context->case_id = 0x05;
     424            1 :     spdm_context->connection_info.connection_state =
     425              :         LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     426              : 
     427            1 :     spdm_context->connection_info.capability.flags |=
     428              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
     429            1 :     spdm_context->connection_info.capability.flags |=
     430              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
     431            1 :     spdm_context->connection_info.capability.flags |=
     432              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
     433            1 :     spdm_context->connection_info.capability.flags |=
     434              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
     435            1 :     spdm_context->local_context.capability.flags |=
     436              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
     437            1 :     spdm_context->local_context.capability.flags |=
     438              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
     439            1 :     spdm_context->local_context.capability.flags |=
     440              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
     441            1 :     spdm_context->connection_info.capability.flags |=
     442              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
     443            1 :     spdm_context->connection_info.algorithm.dhe_named_group =
     444              :         m_libspdm_use_dhe_algo;
     445            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
     446              :         m_libspdm_use_aead_algo;
     447              : 
     448            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     449              :                                                     m_libspdm_use_asym_algo, &data,
     450              :                                                     &data_size, NULL, NULL);
     451              : 
     452            1 :     session_id = 0xFFFFFFFF;
     453            1 :     session_info = &spdm_context->session_info[0];
     454            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
     455              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     456            1 :     libspdm_secured_message_set_session_state(session_info->secured_message_context,
     457              :                                               LIBSPDM_SESSION_STATE_ESTABLISHED);
     458              : 
     459              :     /* slot id is 1*/
     460            1 :     status = libspdm_set_certificate(spdm_context, &session_id, 1, data, data_size);
     461            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     462              : 
     463            1 :     free(data);
     464            1 : }
     465              : 
     466              : /**
     467              :  * Test 6: Successful response to set certificate for slot 0 with a reset required
     468              :  * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code
     469              :  **/
     470            1 : static void req_set_certificate_case6(void **state)
     471              : {
     472              :     libspdm_return_t status;
     473              :     libspdm_test_context_t *spdm_test_context;
     474              :     libspdm_context_t *spdm_context;
     475              : 
     476              :     void *data;
     477              :     size_t data_size;
     478              : 
     479            1 :     spdm_test_context = *state;
     480            1 :     spdm_context = spdm_test_context->spdm_context;
     481            1 :     spdm_test_context->case_id = 0x6;
     482            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
     483              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     484              : 
     485            1 :     spdm_context->connection_info.connection_state =
     486              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     487            1 :     spdm_context->connection_info.capability.flags |=
     488              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP |
     489              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_INSTALL_RESET_CAP;
     490              : 
     491            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     492              :                                                     m_libspdm_use_asym_algo,
     493              :                                                     &data, &data_size, NULL, NULL);
     494              : 
     495            1 :     status = libspdm_set_certificate(spdm_context, NULL, 0, data, data_size);
     496              : 
     497            1 :     assert_int_equal(status, LIBSPDM_STATUS_RESET_REQUIRED_PEER);
     498            1 :     free(data);
     499            1 : }
     500              : 
     501              : /**
     502              :  * Test 7: Successful response to erase certificate for slot 0
     503              :  * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code
     504              :  **/
     505            1 : static void req_set_certificate_case7(void **state)
     506              : {
     507              :     libspdm_return_t status;
     508              :     libspdm_test_context_t *spdm_test_context;
     509              :     libspdm_context_t *spdm_context;
     510              : 
     511            1 :     spdm_test_context = *state;
     512            1 :     spdm_context = spdm_test_context->spdm_context;
     513            1 :     spdm_test_context->case_id = 0x7;
     514            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     515              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     516              : 
     517            1 :     spdm_context->connection_info.connection_state =
     518              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     519            1 :     spdm_context->connection_info.capability.flags |=
     520              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
     521              : 
     522            1 :     status = libspdm_set_certificate_ex(spdm_context, NULL, 0, NULL, 0,
     523              :                                         SPDM_SET_CERTIFICATE_REQUEST_ATTRIBUTES_ERASE, 0);
     524              : 
     525            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     526            1 : }
     527              : 
     528              : /**
     529              :  * Test 8: Illegal combination of MULTI_KEY_CONN_RSP = true, Erase = false, and SetCertModel = 0.
     530              :  * Expected Behavior: function returns LIBSPDM_STATUS_INVALID_PARAMETER.
     531              :  **/
     532            1 : static void req_set_certificate_case8(void **state)
     533              : {
     534              :     libspdm_return_t status;
     535              :     libspdm_test_context_t *spdm_test_context;
     536              :     libspdm_context_t *spdm_context;
     537              : 
     538              :     void *data;
     539              :     size_t data_size;
     540              : 
     541            1 :     spdm_test_context = *state;
     542            1 :     spdm_context = spdm_test_context->spdm_context;
     543            1 :     spdm_test_context->case_id = 0x8;
     544            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     545              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     546              : 
     547            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     548            1 :     spdm_context->connection_info.capability.flags |=
     549              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
     550            1 :     spdm_context->connection_info.multi_key_conn_rsp = true;
     551              : 
     552            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     553              :                                                     m_libspdm_use_asym_algo,
     554              :                                                     &data, &data_size, NULL, NULL);
     555              : 
     556            1 :     status = libspdm_set_certificate_ex(spdm_context, NULL, 0, data, data_size,
     557              :                                         (SPDM_CERTIFICATE_INFO_CERT_MODEL_NONE <<
     558              :                                          SPDM_SET_CERTIFICATE_REQUEST_ATTRIBUTES_CERT_MODEL_OFFSET),
     559              :                                         1);
     560              : 
     561            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_PARAMETER);
     562            1 : }
     563              : 
     564              : /**
     565              :  * Test 9: Set MULTI_KEY_CONN_RSP = true, Erase = false, and SetCertModel = DeviceCert.
     566              :  * Expected Behavior: function returns LIBSPDM_STATUS_SUCCESS.
     567              :  **/
     568            1 : static void req_set_certificate_case9(void **state)
     569              : {
     570              :     libspdm_return_t status;
     571              :     libspdm_test_context_t *spdm_test_context;
     572              :     libspdm_context_t *spdm_context;
     573              : 
     574              :     void *data;
     575              :     size_t data_size;
     576              : 
     577            1 :     spdm_test_context = *state;
     578            1 :     spdm_context = spdm_test_context->spdm_context;
     579            1 :     spdm_test_context->case_id = 0x9;
     580            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     581              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     582              : 
     583            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     584            1 :     spdm_context->connection_info.capability.flags |=
     585              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
     586            1 :     spdm_context->connection_info.multi_key_conn_rsp = true;
     587              : 
     588            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     589              :                                                     m_libspdm_use_asym_algo,
     590              :                                                     &data, &data_size, NULL, NULL);
     591              : 
     592            1 :     status = libspdm_set_certificate_ex(spdm_context, NULL, 3, data, data_size,
     593              :                                         (SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT <<
     594              :                                          SPDM_SET_CERTIFICATE_REQUEST_ATTRIBUTES_CERT_MODEL_OFFSET),
     595              :                                         1);
     596              : 
     597            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     598            1 : }
     599              : 
     600            1 : int libspdm_req_set_certificate_test(void)
     601              : {
     602            1 :     const struct CMUnitTest test_cases[] = {
     603              :         /* SendRequest failed*/
     604              :         cmocka_unit_test(req_set_certificate_case1),
     605              :         /* Successful response to set certificate*/
     606              :         cmocka_unit_test(req_set_certificate_case2),
     607              :         /* Set null cert_chain for slot 0*/
     608              :         cmocka_unit_test(req_set_certificate_case3),
     609              :         /* Successful response to set certificate for slot 1 in secure session*/
     610              :         cmocka_unit_test(req_set_certificate_case5),
     611              :         /* Successful response to set certificate with a reset required */
     612              :         cmocka_unit_test(req_set_certificate_case6),
     613              :         /* Successful response to erase certificate*/
     614              :         cmocka_unit_test(req_set_certificate_case7),
     615              :         cmocka_unit_test(req_set_certificate_case8),
     616              :         cmocka_unit_test(req_set_certificate_case9),
     617              :     };
     618              : 
     619            1 :     libspdm_test_context_t test_context = {
     620              :         LIBSPDM_TEST_CONTEXT_VERSION,
     621              :         true,
     622              :         send_message,
     623              :         receive_message,
     624              :     };
     625              : 
     626            1 :     libspdm_setup_test_context(&test_context);
     627              : 
     628            1 :     return cmocka_run_group_tests(test_cases,
     629              :                                   libspdm_unit_test_group_setup,
     630              :                                   libspdm_unit_test_group_teardown);
     631              : }
     632              : 
     633              : #endif /* LIBSPDM_ENABLE_CAPABILITY_SET_CERT_CAP*/
        

Generated by: LCOV version 2.0-1