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: 2025-11-02 08:10:32 Functions: 100.0 % 5 5

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

Generated by: LCOV version 2.0-1