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

            Line data    Source code
       1              : /**
       2              :  *  Copyright Notice:
       3              :  *  Copyright 2024-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              : #include "internal/libspdm_requester_lib.h"
      10              : 
      11              : #if LIBSPDM_ENABLE_CAPABILITY_SET_KEY_PAIR_INFO_CAP
      12              : 
      13              : /**
      14              :  * Test 1: Successful response to set key pair info with key pair id 4
      15              :  * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code, and correct response message size and fields
      16              :  **/
      17            1 : static void rsp_set_key_pair_info_ack_case1(void **state)
      18              : {
      19              :     libspdm_return_t status;
      20              :     libspdm_test_context_t *spdm_test_context;
      21              :     libspdm_context_t *spdm_context;
      22              :     size_t response_size;
      23              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
      24              :     spdm_set_key_pair_info_ack_response_t *spdm_response;
      25              : 
      26              :     uint8_t key_pair_id;
      27              :     size_t set_key_pair_info_request_size;
      28              :     spdm_set_key_pair_info_request_t *set_key_pair_info_request;
      29              :     uint8_t *ptr;
      30              :     uint16_t desired_key_usage;
      31              :     uint32_t desired_asym_algo;
      32              :     uint8_t desired_assoc_cert_slot_mask;
      33              : 
      34            1 :     set_key_pair_info_request = malloc(sizeof(spdm_set_key_pair_info_request_t) +
      35              :                                        sizeof(uint8_t) + sizeof(uint16_t) + sizeof(uint32_t) +
      36              :                                        sizeof(uint8_t));
      37              : 
      38            1 :     spdm_test_context = *state;
      39            1 :     spdm_context = spdm_test_context->spdm_context;
      40            1 :     spdm_test_context->case_id = 0x1;
      41            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
      42              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
      43            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
      44            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
      45            1 :     spdm_context->local_context.capability.flags |=
      46              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_KEY_PAIR_INFO_CAP;
      47              : 
      48            1 :     key_pair_id = 4;
      49              : 
      50            1 :     response_size = sizeof(response);
      51              : 
      52              :     /*change: remove an association with slot*/
      53            1 :     set_key_pair_info_request_size =
      54              :         sizeof(spdm_set_key_pair_info_request_t) +
      55              :         sizeof(uint8_t) + sizeof(uint16_t) + sizeof(uint32_t) + sizeof(uint8_t);
      56              : 
      57            1 :     libspdm_zero_mem(set_key_pair_info_request, set_key_pair_info_request_size);
      58            1 :     set_key_pair_info_request->header.spdm_version = SPDM_MESSAGE_VERSION_13;
      59            1 :     set_key_pair_info_request->header.request_response_code = SPDM_SET_KEY_PAIR_INFO;
      60            1 :     set_key_pair_info_request->header.param1 = SPDM_SET_KEY_PAIR_INFO_CHANGE_OPERATION;
      61            1 :     set_key_pair_info_request->header.param2 = 0;
      62            1 :     set_key_pair_info_request->key_pair_id = key_pair_id;
      63              : 
      64            1 :     status = libspdm_get_response_set_key_pair_info_ack(
      65              :         spdm_context, set_key_pair_info_request_size,
      66              :         set_key_pair_info_request, &response_size, response);
      67            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
      68            1 :     assert_int_equal(response_size, sizeof(spdm_set_key_pair_info_ack_response_t));
      69            1 :     spdm_response = (void *)response;
      70            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_SET_KEY_PAIR_INFO_ACK);
      71              : 
      72              :     /*erase: erase the keyusage and asymalgo*/
      73            1 :     set_key_pair_info_request->header.param1 = SPDM_SET_KEY_PAIR_INFO_ERASE_OPERATION;
      74            1 :     set_key_pair_info_request_size = sizeof(spdm_set_key_pair_info_request_t);
      75            1 :     status = libspdm_get_response_set_key_pair_info_ack(
      76              :         spdm_context, set_key_pair_info_request_size,
      77              :         set_key_pair_info_request, &response_size, response);
      78            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
      79            1 :     assert_int_equal(response_size, sizeof(spdm_set_key_pair_info_ack_response_t));
      80            1 :     spdm_response = (void *)response;
      81            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_SET_KEY_PAIR_INFO_ACK);
      82              : 
      83              :     /*generate: generate a new key pair*/
      84            1 :     desired_key_usage = SPDM_KEY_USAGE_BIT_MASK_KEY_EX_USE;
      85            1 :     desired_asym_algo = SPDM_KEY_PAIR_ASYM_ALGO_CAP_ECC256;
      86            1 :     desired_assoc_cert_slot_mask = 0x08;
      87            1 :     set_key_pair_info_request_size =
      88              :         sizeof(spdm_set_key_pair_info_request_t) +
      89              :         sizeof(uint8_t) + sizeof(uint16_t) + sizeof(uint32_t) + sizeof(uint8_t);
      90              : 
      91            1 :     libspdm_zero_mem(set_key_pair_info_request, set_key_pair_info_request_size);
      92            1 :     set_key_pair_info_request->header.spdm_version = SPDM_MESSAGE_VERSION_13;
      93            1 :     set_key_pair_info_request->header.request_response_code = SPDM_SET_KEY_PAIR_INFO;
      94            1 :     set_key_pair_info_request->header.param1 = SPDM_SET_KEY_PAIR_INFO_CHANGE_OPERATION;
      95            1 :     set_key_pair_info_request->header.param2 = 0;
      96            1 :     set_key_pair_info_request->key_pair_id = key_pair_id;
      97              : 
      98            1 :     ptr = (uint8_t*)(set_key_pair_info_request + 1);
      99            1 :     ptr += sizeof(uint8_t);
     100              : 
     101            1 :     libspdm_write_uint16(ptr, desired_key_usage);
     102            1 :     ptr += sizeof(uint16_t);
     103              : 
     104            1 :     libspdm_write_uint32(ptr, desired_asym_algo);
     105            1 :     ptr += sizeof(uint32_t);
     106              : 
     107            1 :     *ptr = desired_assoc_cert_slot_mask;
     108              : 
     109            1 :     status = libspdm_get_response_set_key_pair_info_ack(
     110              :         spdm_context, set_key_pair_info_request_size,
     111              :         set_key_pair_info_request, &response_size, response);
     112            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     113            1 :     assert_int_equal(response_size, sizeof(spdm_set_key_pair_info_ack_response_t));
     114            1 :     spdm_response = (void *)response;
     115            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_SET_KEY_PAIR_INFO_ACK);
     116            1 :     free(set_key_pair_info_request);
     117            1 : }
     118              : 
     119              : /**
     120              :  * Test 2: Can be populated with new test.
     121              :  **/
     122            1 : static void rsp_set_key_pair_info_ack_case2(void **state)
     123              : {
     124            1 : }
     125              : 
     126              : /**
     127              :  * Test 3: The collection of multiple sub-cases.
     128              :  **/
     129            1 : static void rsp_set_key_pair_info_ack_case3(void **state)
     130              : {
     131              :     libspdm_return_t status;
     132              :     libspdm_test_context_t *spdm_test_context;
     133              :     libspdm_context_t *spdm_context;
     134              :     size_t response_size;
     135              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     136              :     spdm_set_key_pair_info_ack_response_t *spdm_response;
     137              : 
     138              :     uint8_t key_pair_id;
     139              :     size_t set_key_pair_info_request_size;
     140              :     spdm_set_key_pair_info_request_t *set_key_pair_info_request;
     141              :     uint8_t *ptr;
     142              :     uint16_t desired_key_usage;
     143              :     uint32_t desired_asym_algo;
     144              :     uint8_t desired_assoc_cert_slot_mask;
     145              :     uint8_t desired_pqc_asym_algo_len;
     146              :     uint32_t desired_pqc_asym_algo;
     147              : 
     148              :     uint8_t temp_buf[LIBSPDM_RECEIVER_BUFFER_SIZE];
     149            1 :     set_key_pair_info_request = (spdm_set_key_pair_info_request_t *)temp_buf;
     150              : 
     151            1 :     spdm_test_context = *state;
     152            1 :     spdm_context = spdm_test_context->spdm_context;
     153            1 :     spdm_test_context->case_id = 0x3;
     154            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_14 <<
     155              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     156            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     157            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     158            1 :     spdm_context->local_context.capability.flags |=
     159              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_KEY_PAIR_INFO_CAP;
     160              : 
     161            1 :     key_pair_id = 4;
     162              : 
     163              :     /*set responder need reset, spdm 1.4 */
     164            1 :     spdm_context->local_context.capability.flags |=
     165              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_KEY_PAIR_RESET_CAP;
     166              : 
     167              :     /*Before reset, change: remove an association with slot*/
     168            1 :     set_key_pair_info_request_size =
     169              :         sizeof(spdm_set_key_pair_info_request_t) +
     170              :         sizeof(uint8_t) + sizeof(uint16_t) + sizeof(uint32_t) + sizeof(uint8_t) +
     171              :         sizeof(uint8_t);
     172              : 
     173            1 :     libspdm_zero_mem(set_key_pair_info_request, set_key_pair_info_request_size);
     174            1 :     set_key_pair_info_request->header.spdm_version = SPDM_MESSAGE_VERSION_14;
     175            1 :     set_key_pair_info_request->header.request_response_code = SPDM_SET_KEY_PAIR_INFO;
     176            1 :     set_key_pair_info_request->header.param1 = SPDM_SET_KEY_PAIR_INFO_CHANGE_OPERATION;
     177            1 :     set_key_pair_info_request->header.param2 = 0;
     178            1 :     set_key_pair_info_request->key_pair_id = key_pair_id;
     179              : 
     180            1 :     response_size = sizeof(response);
     181            1 :     status = libspdm_get_response_set_key_pair_info_ack(
     182              :         spdm_context, set_key_pair_info_request_size,
     183              :         set_key_pair_info_request, &response_size, response);
     184            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     185            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     186            1 :     spdm_response = (void *)response;
     187            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     188            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_RESET_REQUIRED);
     189            1 :     assert_int_equal(spdm_response->header.param2, 0);
     190              : 
     191              :     /* Sub Case 1: If KeyPairErase is set, all fields after the KeyPairID field in this request should not exist. */
     192            1 :     desired_key_usage = SPDM_KEY_USAGE_BIT_MASK_KEY_EX_USE;
     193            1 :     desired_asym_algo = SPDM_KEY_PAIR_ASYM_ALGO_CAP_ECC256;
     194            1 :     desired_pqc_asym_algo_len = sizeof(desired_pqc_asym_algo);
     195            1 :     desired_pqc_asym_algo = 0;
     196            1 :     desired_assoc_cert_slot_mask = 0x08;
     197            1 :     set_key_pair_info_request_size =
     198              :         sizeof(spdm_set_key_pair_info_request_t) +
     199              :         sizeof(uint8_t) + sizeof(uint16_t) + sizeof(uint32_t) + sizeof(uint8_t) +
     200              :         sizeof(uint8_t) + sizeof(uint32_t);
     201              : 
     202            1 :     libspdm_zero_mem(set_key_pair_info_request, set_key_pair_info_request_size);
     203            1 :     set_key_pair_info_request->header.spdm_version = SPDM_MESSAGE_VERSION_14;
     204            1 :     set_key_pair_info_request->header.request_response_code = SPDM_SET_KEY_PAIR_INFO;
     205            1 :     set_key_pair_info_request->header.param1 = SPDM_SET_KEY_PAIR_INFO_ERASE_OPERATION;
     206            1 :     set_key_pair_info_request->header.param2 = 0;
     207            1 :     set_key_pair_info_request->key_pair_id = key_pair_id;
     208              : 
     209            1 :     ptr = (uint8_t*)(set_key_pair_info_request + 1);
     210            1 :     ptr += sizeof(uint8_t);
     211              : 
     212            1 :     libspdm_write_uint16(ptr, desired_key_usage);
     213            1 :     ptr += sizeof(uint16_t);
     214              : 
     215            1 :     libspdm_write_uint32(ptr, desired_asym_algo);
     216            1 :     ptr += sizeof(uint32_t);
     217              : 
     218            1 :     *ptr = desired_assoc_cert_slot_mask;
     219            1 :     ptr += sizeof(uint8_t);
     220              : 
     221            1 :     *ptr = desired_pqc_asym_algo_len;
     222            1 :     ptr += sizeof(uint8_t);
     223              : 
     224            1 :     libspdm_write_uint32(ptr, desired_pqc_asym_algo);
     225              : 
     226            1 :     response_size = sizeof(response);
     227            1 :     status = libspdm_get_response_set_key_pair_info_ack(
     228              :         spdm_context, set_key_pair_info_request_size,
     229              :         set_key_pair_info_request, &response_size, response);
     230            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     231            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     232            1 :     spdm_response = (void *)response;
     233            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     234            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_OPERATION_FAILED);
     235            1 :     assert_int_equal(spdm_response->header.param2, 0);
     236              : 
     237              :     /*Sub Case 2: When GenerateKeyPair is set, the fields of DesiredKeyUsage, DesiredAsymAlgo and DesiredAssocCertSlotMask should exist. */
     238            1 :     set_key_pair_info_request_size = sizeof(spdm_set_key_pair_info_request_t);
     239              : 
     240            1 :     libspdm_zero_mem(set_key_pair_info_request, set_key_pair_info_request_size);
     241            1 :     set_key_pair_info_request->header.spdm_version = SPDM_MESSAGE_VERSION_14;
     242            1 :     set_key_pair_info_request->header.request_response_code = SPDM_SET_KEY_PAIR_INFO;
     243            1 :     set_key_pair_info_request->header.param1 = SPDM_SET_KEY_PAIR_INFO_GENERATE_OPERATION;
     244            1 :     set_key_pair_info_request->header.param2 = 0;
     245            1 :     set_key_pair_info_request->key_pair_id = key_pair_id;
     246              : 
     247            1 :     response_size = sizeof(response);
     248            1 :     status = libspdm_get_response_set_key_pair_info_ack(
     249              :         spdm_context, set_key_pair_info_request_size,
     250              :         set_key_pair_info_request, &response_size, response);
     251            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     252            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     253            1 :     spdm_response = (void *)response;
     254            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     255            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
     256            1 :     assert_int_equal(spdm_response->header.param2, 0);
     257              : 
     258              :     /*Sub Case 3: key_pair_id = 0 */
     259            1 :     set_key_pair_info_request_size = sizeof(spdm_set_key_pair_info_request_t);
     260              : 
     261            1 :     libspdm_zero_mem(set_key_pair_info_request, set_key_pair_info_request_size);
     262            1 :     set_key_pair_info_request->header.spdm_version = SPDM_MESSAGE_VERSION_14;
     263            1 :     set_key_pair_info_request->header.request_response_code = SPDM_SET_KEY_PAIR_INFO;
     264            1 :     set_key_pair_info_request->header.param1 = SPDM_SET_KEY_PAIR_INFO_GENERATE_OPERATION;
     265            1 :     set_key_pair_info_request->header.param2 = 0;
     266            1 :     set_key_pair_info_request->key_pair_id = 0;
     267              : 
     268            1 :     response_size = sizeof(response);
     269            1 :     status = libspdm_get_response_set_key_pair_info_ack(
     270              :         spdm_context, set_key_pair_info_request_size,
     271              :         set_key_pair_info_request, &response_size, response);
     272            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     273            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     274            1 :     spdm_response = (void *)response;
     275            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     276            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
     277            1 :     assert_int_equal(spdm_response->header.param2, 0);
     278              : 
     279              :     /* Sub Case 4: DesiredAsymAlgo must not have multiple bits set. */
     280            1 :     desired_key_usage = SPDM_KEY_USAGE_BIT_MASK_KEY_EX_USE;
     281            1 :     desired_asym_algo = SPDM_KEY_PAIR_ASYM_ALGO_CAP_ECC256 |
     282              :                         SPDM_KEY_PAIR_ASYM_ALGO_CAP_ECC384;
     283            1 :     desired_pqc_asym_algo_len = sizeof(desired_pqc_asym_algo);
     284            1 :     desired_pqc_asym_algo = 0;
     285            1 :     desired_assoc_cert_slot_mask = 0x08;
     286            1 :     set_key_pair_info_request_size =
     287              :         sizeof(spdm_set_key_pair_info_request_t) +
     288              :         sizeof(uint8_t) + sizeof(uint16_t) + sizeof(uint32_t) + sizeof(uint8_t) +
     289              :         sizeof(uint8_t) + sizeof(uint32_t);
     290              : 
     291            1 :     libspdm_zero_mem(set_key_pair_info_request, set_key_pair_info_request_size);
     292            1 :     set_key_pair_info_request->header.spdm_version = SPDM_MESSAGE_VERSION_14;
     293            1 :     set_key_pair_info_request->header.request_response_code = SPDM_SET_KEY_PAIR_INFO;
     294            1 :     set_key_pair_info_request->header.param1 = SPDM_SET_KEY_PAIR_INFO_CHANGE_OPERATION;
     295            1 :     set_key_pair_info_request->header.param2 = 0;
     296            1 :     set_key_pair_info_request->key_pair_id = key_pair_id;
     297              : 
     298            1 :     ptr = (uint8_t*)(set_key_pair_info_request + 1);
     299            1 :     ptr += sizeof(uint8_t);
     300              : 
     301            1 :     libspdm_write_uint16(ptr, desired_key_usage);
     302            1 :     ptr += sizeof(uint16_t);
     303              : 
     304            1 :     libspdm_write_uint32(ptr, desired_asym_algo);
     305            1 :     ptr += sizeof(uint32_t);
     306              : 
     307            1 :     *ptr = desired_assoc_cert_slot_mask;
     308            1 :     ptr += sizeof(uint8_t);
     309              : 
     310            1 :     *ptr = desired_pqc_asym_algo_len;
     311            1 :     ptr += sizeof(uint8_t);
     312              : 
     313            1 :     libspdm_write_uint32(ptr, desired_pqc_asym_algo);
     314              : 
     315            1 :     response_size = sizeof(response);
     316            1 :     status = libspdm_get_response_set_key_pair_info_ack(
     317              :         spdm_context, set_key_pair_info_request_size,
     318              :         set_key_pair_info_request, &response_size, response);
     319            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     320            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     321            1 :     spdm_response = (void *)response;
     322            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     323            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
     324            1 :     assert_int_equal(spdm_response->header.param2, 0);
     325              : 
     326              :     /*Before reset, change: remove an association with slot*/
     327            1 :     set_key_pair_info_request_size =
     328              :         sizeof(spdm_set_key_pair_info_request_t) +
     329              :         sizeof(uint8_t) + sizeof(uint16_t) + sizeof(uint32_t) + sizeof(uint8_t) +
     330              :         sizeof(uint8_t);
     331              : 
     332            1 :     libspdm_zero_mem(set_key_pair_info_request, set_key_pair_info_request_size);
     333            1 :     set_key_pair_info_request->header.spdm_version = SPDM_MESSAGE_VERSION_14;
     334            1 :     set_key_pair_info_request->header.request_response_code = SPDM_SET_KEY_PAIR_INFO;
     335            1 :     set_key_pair_info_request->header.param1 = SPDM_SET_KEY_PAIR_INFO_CHANGE_OPERATION;
     336            1 :     set_key_pair_info_request->header.param2 = 0;
     337            1 :     set_key_pair_info_request->key_pair_id = 0x1;
     338              : 
     339            1 :     response_size = sizeof(response);
     340            1 :     status = libspdm_get_response_set_key_pair_info_ack(
     341              :         spdm_context, set_key_pair_info_request_size,
     342              :         set_key_pair_info_request, &response_size, response);
     343            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     344            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     345            1 :     spdm_response = (void *)response;
     346            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     347            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_RESET_REQUIRED);
     348            1 :     assert_int_equal(spdm_response->header.param2, 0);
     349            1 : }
     350              : 
     351              : /**
     352              :  * Test 4: Successful response to set key pair info with key pair id 4: need reset, spdm 1.4
     353              :  * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code, and correct response message size and fields
     354              :  **/
     355            1 : static void rsp_set_key_pair_info_ack_case4(void **state)
     356              : {
     357              :     /* reference case 2 */
     358              :     libspdm_return_t status;
     359              :     libspdm_test_context_t *spdm_test_context;
     360              :     libspdm_context_t *spdm_context;
     361              :     size_t response_size;
     362              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     363              :     spdm_set_key_pair_info_ack_response_t *spdm_response;
     364              : 
     365              :     uint8_t key_pair_id;
     366              :     size_t set_key_pair_info_request_size;
     367              :     spdm_set_key_pair_info_request_t *set_key_pair_info_request;
     368              :     uint8_t *ptr;
     369              :     uint16_t desired_key_usage;
     370              :     uint32_t desired_asym_algo;
     371              :     uint8_t desired_assoc_cert_slot_mask;
     372              :     uint8_t desired_pqc_asym_algo_len;
     373              :     uint32_t desired_pqc_asym_algo;
     374              : 
     375            1 :     set_key_pair_info_request = malloc(sizeof(spdm_set_key_pair_info_request_t) +
     376              :                                        sizeof(uint8_t) + sizeof(uint16_t) + sizeof(uint32_t) +
     377              :                                        sizeof(uint8_t) + sizeof(uint8_t) + sizeof(uint32_t));
     378              : 
     379            1 :     spdm_test_context = *state;
     380            1 :     spdm_context = spdm_test_context->spdm_context;
     381            1 :     spdm_test_context->case_id = 0x4;
     382            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_14 <<
     383              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     384            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
     385            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     386            1 :     spdm_context->local_context.capability.flags = 0; /* clear flags */
     387            1 :     spdm_context->local_context.capability.flags |=
     388              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_KEY_PAIR_INFO_CAP;
     389              : 
     390            1 :     key_pair_id = 4;
     391              : 
     392              :     /*set responder need reset, spdm 1.4 */
     393            1 :     spdm_context->local_context.capability.flags |=
     394              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_KEY_PAIR_RESET_CAP;
     395              : 
     396            1 :     response_size = sizeof(response);
     397              : 
     398              :     /*Before reset, change: remove an association with slot*/
     399            1 :     set_key_pair_info_request_size =
     400              :         sizeof(spdm_set_key_pair_info_request_t) +
     401              :         sizeof(uint8_t) + sizeof(uint16_t) + sizeof(uint32_t) + sizeof(uint8_t) +
     402              :         sizeof(uint8_t);
     403              : 
     404            1 :     libspdm_zero_mem(set_key_pair_info_request, set_key_pair_info_request_size);
     405            1 :     set_key_pair_info_request->header.spdm_version = SPDM_MESSAGE_VERSION_14;
     406            1 :     set_key_pair_info_request->header.request_response_code = SPDM_SET_KEY_PAIR_INFO;
     407            1 :     set_key_pair_info_request->header.param1 = SPDM_SET_KEY_PAIR_INFO_CHANGE_OPERATION;
     408            1 :     set_key_pair_info_request->header.param2 = 0;
     409            1 :     set_key_pair_info_request->key_pair_id = key_pair_id;
     410              : 
     411            1 :     status = libspdm_get_response_set_key_pair_info_ack(
     412              :         spdm_context, set_key_pair_info_request_size,
     413              :         set_key_pair_info_request, &response_size, response);
     414            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     415            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     416            1 :     spdm_response = (void *)response;
     417            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     418            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_RESET_REQUIRED);
     419            1 :     assert_int_equal(spdm_response->header.param2, 0);
     420              : 
     421              :     /*After reset, change: remove an association with slot*/
     422            1 :     status = libspdm_get_response_set_key_pair_info_ack(
     423              :         spdm_context, set_key_pair_info_request_size,
     424              :         set_key_pair_info_request, &response_size, response);
     425            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     426            1 :     assert_int_equal(response_size, sizeof(spdm_set_key_pair_info_ack_response_t));
     427            1 :     spdm_response = (void *)response;
     428            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_SET_KEY_PAIR_INFO_ACK);
     429              : 
     430              :     /*Before reset, erase: erase the keyusage and asymalgo*/
     431            1 :     set_key_pair_info_request->header.param1 = SPDM_SET_KEY_PAIR_INFO_ERASE_OPERATION;
     432            1 :     set_key_pair_info_request_size = sizeof(spdm_set_key_pair_info_request_t);
     433            1 :     status = libspdm_get_response_set_key_pair_info_ack(
     434              :         spdm_context, set_key_pair_info_request_size,
     435              :         set_key_pair_info_request, &response_size, response);
     436            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     437            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     438            1 :     spdm_response = (void *)response;
     439            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     440            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_RESET_REQUIRED);
     441            1 :     assert_int_equal(spdm_response->header.param2, 0);
     442              : 
     443              :     /*After reset, erase: erase the keyusage and asymalgo*/
     444            1 :     status = libspdm_get_response_set_key_pair_info_ack(
     445              :         spdm_context, set_key_pair_info_request_size,
     446              :         set_key_pair_info_request, &response_size, response);
     447            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     448            1 :     assert_int_equal(response_size, sizeof(spdm_set_key_pair_info_ack_response_t));
     449            1 :     spdm_response = (void *)response;
     450            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_SET_KEY_PAIR_INFO_ACK);
     451              : 
     452              : 
     453              :     /*Before reset, generate: generate a new key pair*/
     454            1 :     desired_key_usage = SPDM_KEY_USAGE_BIT_MASK_KEY_EX_USE;
     455            1 :     desired_asym_algo = SPDM_KEY_PAIR_ASYM_ALGO_CAP_ECC256;
     456            1 :     desired_pqc_asym_algo_len = sizeof(desired_pqc_asym_algo);
     457            1 :     desired_pqc_asym_algo = 0;
     458            1 :     desired_assoc_cert_slot_mask = 0x08;
     459            1 :     set_key_pair_info_request_size =
     460              :         sizeof(spdm_set_key_pair_info_request_t) +
     461              :         sizeof(uint8_t) + sizeof(uint16_t) + sizeof(uint32_t) + sizeof(uint8_t) +
     462              :         sizeof(uint8_t) + sizeof(uint32_t);
     463              : 
     464            1 :     libspdm_zero_mem(set_key_pair_info_request, set_key_pair_info_request_size);
     465            1 :     set_key_pair_info_request->header.spdm_version = SPDM_MESSAGE_VERSION_14;
     466            1 :     set_key_pair_info_request->header.request_response_code = SPDM_SET_KEY_PAIR_INFO;
     467            1 :     set_key_pair_info_request->header.param1 = SPDM_SET_KEY_PAIR_INFO_CHANGE_OPERATION;
     468            1 :     set_key_pair_info_request->header.param2 = 0;
     469            1 :     set_key_pair_info_request->key_pair_id = key_pair_id;
     470              : 
     471            1 :     ptr = (uint8_t*)(set_key_pair_info_request + 1);
     472            1 :     ptr += sizeof(uint8_t);
     473              : 
     474            1 :     libspdm_write_uint16(ptr, desired_key_usage);
     475            1 :     ptr += sizeof(uint16_t);
     476              : 
     477            1 :     libspdm_write_uint32(ptr, desired_asym_algo);
     478            1 :     ptr += sizeof(uint32_t);
     479              : 
     480            1 :     *ptr = desired_assoc_cert_slot_mask;
     481            1 :     ptr += sizeof(uint8_t);
     482              : 
     483            1 :     *ptr = desired_pqc_asym_algo_len;
     484            1 :     ptr += sizeof(uint8_t);
     485              : 
     486            1 :     libspdm_write_uint32(ptr, desired_pqc_asym_algo);
     487              : 
     488            1 :     status = libspdm_get_response_set_key_pair_info_ack(
     489              :         spdm_context, set_key_pair_info_request_size,
     490              :         set_key_pair_info_request, &response_size, response);
     491            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     492            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     493            1 :     spdm_response = (void *)response;
     494            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     495            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_RESET_REQUIRED);
     496            1 :     assert_int_equal(spdm_response->header.param2, 0);
     497              : 
     498              :     /*After reset, generate: generate a new key pair*/
     499            1 :     status = libspdm_get_response_set_key_pair_info_ack(
     500              :         spdm_context, set_key_pair_info_request_size,
     501              :         set_key_pair_info_request, &response_size, response);
     502            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     503            1 :     assert_int_equal(response_size, sizeof(spdm_set_key_pair_info_ack_response_t));
     504            1 :     spdm_response = (void *)response;
     505            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_SET_KEY_PAIR_INFO_ACK);
     506            1 :     free(set_key_pair_info_request);
     507            1 : }
     508              : 
     509            1 : int libspdm_rsp_set_key_pair_info_ack_test(void)
     510              : {
     511            1 :     const struct CMUnitTest test_cases[] = {
     512              :         /* Success Case to set key pair info*/
     513              :         cmocka_unit_test(rsp_set_key_pair_info_ack_case1),
     514              :         /* Can be populated with new test*/
     515              :         cmocka_unit_test(rsp_set_key_pair_info_ack_case2),
     516              :         /* The collection of multiple sub-cases.*/
     517              :         cmocka_unit_test(rsp_set_key_pair_info_ack_case3),
     518              :         /* Success Case to set key pair info with reset, spdm 1.4*/
     519              :         cmocka_unit_test(rsp_set_key_pair_info_ack_case4),
     520              :     };
     521              : 
     522            1 :     libspdm_test_context_t test_context = {
     523              :         LIBSPDM_TEST_CONTEXT_VERSION,
     524              :         false,
     525              :     };
     526            1 :     libspdm_setup_test_context(&test_context);
     527              : 
     528            1 :     return cmocka_run_group_tests(test_cases,
     529              :                                   libspdm_unit_test_group_setup,
     530              :                                   libspdm_unit_test_group_teardown);
     531              : }
     532              : 
     533              : #endif /* LIBSPDM_ENABLE_CAPABILITY_SET_KEY_PAIR_INFO_CAP*/
        

Generated by: LCOV version 2.0-1