LCOV - code coverage report
Current view: top level - unit_test/test_spdm_requester - encap_key_update_ack.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 345 345
Test Date: 2025-11-02 08:10:32 Functions: 100.0 % 18 18

            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              : #include "spdm_unit_test.h"
       7              : #include "internal/libspdm_requester_lib.h"
       8              : #include "internal/libspdm_secured_message_lib.h"
       9              : 
      10              : #if (LIBSPDM_ENABLE_CAPABILITY_ENCAP_CAP) && \
      11              :     ((LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP) || (LIBSPDM_ENABLE_CAPABILITY_PSK_CAP))
      12              : 
      13              : spdm_key_update_request_t m_spdm_key_update_request1 = {
      14              :     {SPDM_MESSAGE_VERSION_11, SPDM_KEY_UPDATE,
      15              :      SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY, 0x3}
      16              : };
      17              : size_t m_spdm_key_update_request1_size = sizeof(m_spdm_key_update_request1);
      18              : 
      19              : spdm_key_update_request_t m_spdm_key_update_request2 = {
      20              :     {SPDM_MESSAGE_VERSION_11, SPDM_KEY_UPDATE,
      21              :      SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY, 0x3}
      22              : };
      23              : size_t m_spdm_key_update_request2_size = LIBSPDM_MAX_SPDM_MSG_SIZE;
      24              : 
      25              : spdm_key_update_request_t m_spdm_key_update_request3 = {
      26              :     {SPDM_MESSAGE_VERSION_11, SPDM_KEY_UPDATE,
      27              :      SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_ALL_KEYS, 0x71}
      28              : };
      29              : size_t m_spdm_key_update_request3_size = sizeof(m_spdm_key_update_request3);
      30              : 
      31              : spdm_key_update_request_t m_spdm_key_update_request4 = {
      32              :     {SPDM_MESSAGE_VERSION_11, SPDM_KEY_UPDATE,
      33              :      SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_ALL_KEYS, 0x71}
      34              : };
      35              : size_t m_spdm_key_update_request4_size = LIBSPDM_MAX_SPDM_MSG_SIZE;
      36              : 
      37              : spdm_key_update_request_t m_spdm_key_update_request5 = {
      38              :     {SPDM_MESSAGE_VERSION_11, SPDM_KEY_UPDATE,
      39              :      SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY, 0x4A}
      40              : };
      41              : size_t m_spdm_key_update_request5_size = sizeof(m_spdm_key_update_request5);
      42              : 
      43              : spdm_key_update_request_t m_spdm_key_update_request6 = {
      44              :     {SPDM_MESSAGE_VERSION_11, SPDM_KEY_UPDATE,
      45              :      SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY, 0x4A}
      46              : };
      47              : size_t m_spdm_key_update_request6_size = LIBSPDM_MAX_SPDM_MSG_SIZE;
      48              : 
      49              : spdm_key_update_request_t m_spdm_key_update_request7 = {
      50              :     {SPDM_MESSAGE_VERSION_11, SPDM_KEY_UPDATE,
      51              :      SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY, 0x92}
      52              : };
      53              : size_t m_spdm_key_update_request7_size = sizeof(m_spdm_key_update_request7);
      54              : 
      55              : spdm_key_update_request_t m_spdm_key_update_request8 = {
      56              :     {SPDM_MESSAGE_VERSION_11, SPDM_KEY_UPDATE,
      57              :      SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_ALL_KEYS, 0x13}
      58              : };
      59              : size_t m_spdm_key_update_request8_size = sizeof(m_spdm_key_update_request8);
      60              : 
      61              : spdm_key_update_request_t m_spdm_key_update_request9 = {
      62              :     {SPDM_MESSAGE_VERSION_11, SPDM_KEY_UPDATE,
      63              :      SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY, 0x22}
      64              : };
      65              : size_t m_spdm_key_update_request9_size = sizeof(m_spdm_key_update_request9);
      66              : 
      67              : spdm_key_update_request_t m_spdm_key_update_request10 = {
      68              :     {SPDM_MESSAGE_VERSION_11, SPDM_KEY_UPDATE, 0xFF, 0x12}
      69              : };
      70              : size_t m_spdm_key_update_request10_size = sizeof(m_spdm_key_update_request10);
      71              : 
      72           14 : static void spdm_set_standard_key_update_test_state(
      73              :     libspdm_context_t *spdm_context,  uint32_t *session_id)
      74              : {
      75              :     libspdm_session_info_t *session_info;
      76              : 
      77           14 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
      78           14 :     spdm_context->connection_info.connection_state =
      79              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
      80           14 :     spdm_context->connection_info.capability.flags |=
      81              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_UPD_CAP;
      82           14 :     spdm_context->connection_info.capability.flags |=
      83              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
      84           14 :     spdm_context->connection_info.capability.flags |=
      85              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
      86           14 :     spdm_context->local_context.capability.flags |=
      87              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_UPD_CAP;
      88           14 :     spdm_context->local_context.capability.flags |=
      89              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
      90           14 :     spdm_context->local_context.capability.flags |=
      91              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
      92              : 
      93           14 :     spdm_context->transcript.message_a.buffer_size = 0;
      94           14 :     spdm_context->connection_info.algorithm.base_hash_algo =
      95              :         m_libspdm_use_hash_algo;
      96           14 :     spdm_context->connection_info.algorithm.base_asym_algo =
      97              :         m_libspdm_use_asym_algo;
      98           14 :     spdm_context->connection_info.algorithm.dhe_named_group =
      99              :         m_libspdm_use_dhe_algo;
     100           14 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
     101              :         m_libspdm_use_aead_algo;
     102              : 
     103           14 :     *session_id = 0xFFFFFFFF;
     104           14 :     spdm_context->latest_session_id = *session_id;
     105           14 :     spdm_context->last_spdm_request_session_id_valid = true;
     106           14 :     spdm_context->last_spdm_request_session_id = *session_id;
     107           14 :     session_info = &spdm_context->session_info[0];
     108           14 :     libspdm_session_info_init(spdm_context, session_info, *session_id,
     109              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     110           14 :     libspdm_secured_message_set_session_state(
     111              :         session_info->secured_message_context,
     112              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
     113           14 : }
     114              : 
     115           13 : static void libspdm_set_standard_key_update_test_secrets(
     116              :     libspdm_secured_message_context_t *secured_message_context,
     117              :     uint8_t *m_rsp_secret_buffer,  uint8_t rsp_secret_fill,
     118              :     uint8_t *m_req_secret_buffer,  uint8_t req_secret_fill)
     119              : {
     120           13 :     libspdm_set_mem(m_rsp_secret_buffer, secured_message_context->hash_size, rsp_secret_fill);
     121           13 :     libspdm_set_mem(m_req_secret_buffer, secured_message_context->hash_size, req_secret_fill);
     122              : 
     123           13 :     libspdm_copy_mem(secured_message_context->application_secret.response_data_secret,
     124              :                      sizeof(secured_message_context->application_secret.response_data_secret),
     125              :                      m_rsp_secret_buffer, secured_message_context->aead_key_size);
     126           13 :     libspdm_copy_mem(secured_message_context->application_secret.request_data_secret,
     127              :                      sizeof(secured_message_context->application_secret.request_data_secret),
     128              :                      m_req_secret_buffer, secured_message_context->aead_key_size);
     129              : 
     130           13 :     libspdm_set_mem(secured_message_context->application_secret
     131           13 :                     .response_data_encryption_key,
     132              :                     secured_message_context->aead_key_size, rsp_secret_fill);
     133           13 :     libspdm_set_mem(secured_message_context->application_secret
     134           13 :                     .response_data_salt,
     135              :                     secured_message_context->aead_iv_size, rsp_secret_fill);
     136              : 
     137           13 :     libspdm_set_mem(secured_message_context->application_secret
     138           13 :                     .request_data_encryption_key,
     139              :                     secured_message_context->aead_key_size, req_secret_fill);
     140           13 :     libspdm_set_mem(secured_message_context->application_secret
     141           13 :                     .request_data_salt,
     142              :                     secured_message_context->aead_iv_size, req_secret_fill);
     143              : 
     144           13 :     secured_message_context->application_secret.response_data_sequence_number = 0;
     145           13 :     secured_message_context->application_secret.request_data_sequence_number = 0;
     146           13 : }
     147              : 
     148            7 : static void libspdm_compute_secret_update(spdm_version_number_t spdm_version,
     149              :                                           size_t hash_size,
     150              :                                           const uint8_t *in_secret,  uint8_t *out_secret,
     151              :                                           size_t out_secret_size)
     152              : {
     153              :     uint8_t bin_str9[128];
     154              :     size_t bin_str9_size;
     155              : 
     156            7 :     bin_str9_size = sizeof(bin_str9);
     157            7 :     libspdm_bin_concat(spdm_version,
     158              :                        SPDM_BIN_STR_9_LABEL, sizeof(SPDM_BIN_STR_9_LABEL) - 1,
     159            7 :                        NULL, (uint16_t)hash_size, hash_size, bin_str9,
     160              :                        &bin_str9_size);
     161              : 
     162            7 :     libspdm_hkdf_expand(m_libspdm_use_hash_algo, in_secret, hash_size, bin_str9,
     163              :                         bin_str9_size, out_secret, out_secret_size);
     164            7 : }
     165              : 
     166              : /**
     167              :  * Test 1: receiving a correct KEY_UPDATE message from the requester with
     168              :  * the UpdateKey operation.
     169              :  * Expected behavior: the encap requester accepts the request, produces a valid
     170              :  * KEY_UPDATE_ACK response message, and the request data key is updated.
     171              :  **/
     172            1 : static void req_encap_key_update_ack_case1(void **state)
     173              : {
     174              :     libspdm_return_t status;
     175              :     libspdm_test_context_t *spdm_test_context;
     176              :     libspdm_context_t *spdm_context;
     177              :     uint32_t session_id;
     178              :     libspdm_session_info_t *session_info;
     179              :     libspdm_secured_message_context_t *secured_message_context;
     180              : 
     181              :     size_t response_size;
     182              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     183              :     spdm_key_update_response_t *spdm_response;
     184              : 
     185              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
     186              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
     187              : 
     188            1 :     spdm_test_context = *state;
     189            1 :     spdm_context = spdm_test_context->spdm_context;
     190            1 :     spdm_test_context->case_id = 0x01;
     191            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     192              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     193              : 
     194            1 :     spdm_set_standard_key_update_test_state(
     195              :         spdm_context, &session_id);
     196              : 
     197            1 :     session_info = &spdm_context->session_info[0];
     198            1 :     secured_message_context = session_info->secured_message_context;
     199              : 
     200            1 :     libspdm_set_standard_key_update_test_secrets(
     201            1 :         session_info->secured_message_context,
     202              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
     203              :         m_req_secret_buffer, (uint8_t)(0xEE));
     204              : 
     205              :     /*request side *not* updated*/
     206              : 
     207              :     /*response side updated */
     208            1 :     libspdm_compute_secret_update(spdm_context->connection_info.version,
     209              :                                   secured_message_context->hash_size,
     210              :                                   m_rsp_secret_buffer, m_rsp_secret_buffer,
     211              :                                   secured_message_context->hash_size);
     212              : 
     213            1 :     response_size = sizeof(response);
     214            1 :     status = libspdm_get_encap_response_key_update(spdm_context,
     215              :                                                    m_spdm_key_update_request1_size,
     216              :                                                    &m_spdm_key_update_request1,
     217              :                                                    &response_size, response);
     218              : 
     219            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     220            1 :     assert_int_equal(response_size, sizeof(spdm_key_update_response_t));
     221            1 :     spdm_response = (void *)response;
     222            1 :     assert_int_equal(spdm_response->header.request_response_code,
     223              :                      SPDM_KEY_UPDATE_ACK);
     224            1 :     assert_int_equal(spdm_response->header.param1,
     225              :                      SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY);
     226            1 :     assert_int_equal(spdm_response->header.param2,
     227              :                      m_spdm_key_update_request1.header.param2);
     228            1 :     assert_memory_equal(secured_message_context
     229              :                         ->application_secret.request_data_secret,
     230              :                         m_req_secret_buffer, secured_message_context->hash_size);
     231            1 :     assert_memory_equal(secured_message_context
     232              :                         ->application_secret.response_data_secret,
     233              :                         m_rsp_secret_buffer, secured_message_context->hash_size);
     234            1 : }
     235              : 
     236              : /**
     237              :  * Test 2: receiving a KEY_UPDATE message larger than specified, with the
     238              :  * UpdateKey operation.
     239              :  * Expected behavior: the encap requester refuses the KEY_UPDATE message and
     240              :  * produces an ERROR message indicating the InvalidRequest. No keys
     241              :  * are updated.
     242              :  **/
     243            1 : static void req_encap_key_update_ack_case2(void **state)
     244              : {
     245              :     libspdm_return_t status;
     246              :     libspdm_test_context_t *spdm_test_context;
     247              :     libspdm_context_t *spdm_context;
     248              :     uint32_t session_id;
     249              :     libspdm_session_info_t *session_info;
     250              :     libspdm_secured_message_context_t *secured_message_context;
     251              : 
     252              :     size_t response_size;
     253              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     254              :     spdm_key_update_response_t *spdm_response;
     255              : 
     256              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
     257              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
     258              : 
     259            1 :     spdm_test_context = *state;
     260            1 :     spdm_context = spdm_test_context->spdm_context;
     261            1 :     spdm_test_context->case_id = 0x02;
     262            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     263              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     264              : 
     265            1 :     spdm_set_standard_key_update_test_state(
     266              :         spdm_context, &session_id);
     267              : 
     268            1 :     session_info = &spdm_context->session_info[0];
     269            1 :     secured_message_context = session_info->secured_message_context;
     270              : 
     271            1 :     libspdm_set_standard_key_update_test_secrets(
     272            1 :         session_info->secured_message_context,
     273              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
     274              :         m_req_secret_buffer, (uint8_t)(0xEE));
     275              : 
     276              :     /*no keys are updated*/
     277              : 
     278            1 :     response_size = sizeof(response);
     279            1 :     status = libspdm_get_encap_response_key_update(spdm_context,
     280              :                                                    m_spdm_key_update_request2_size,
     281              :                                                    &m_spdm_key_update_request2,
     282              :                                                    &response_size, response);
     283              : 
     284            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     285            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     286            1 :     spdm_response = (void *)response;
     287            1 :     assert_int_equal(spdm_response->header.request_response_code,
     288              :                      SPDM_ERROR);
     289            1 :     assert_int_equal(spdm_response->header.param1,
     290              :                      SPDM_ERROR_CODE_INVALID_REQUEST);
     291            1 :     assert_int_equal(spdm_response->header.param2, 0);
     292            1 :     assert_memory_equal(secured_message_context
     293              :                         ->application_secret.request_data_secret,
     294              :                         m_req_secret_buffer, secured_message_context->hash_size);
     295            1 :     assert_memory_equal(secured_message_context
     296              :                         ->application_secret.response_data_secret,
     297              :                         m_rsp_secret_buffer, secured_message_context->hash_size);
     298            1 : }
     299              : 
     300            1 : static void req_encap_key_update_ack_case3(void **state)
     301              : {
     302              :     libspdm_return_t status;
     303              :     libspdm_test_context_t *spdm_test_context;
     304              :     libspdm_context_t *spdm_context;
     305              :     uint32_t session_id;
     306              :     libspdm_session_info_t *session_info;
     307              :     libspdm_secured_message_context_t *secured_message_context;
     308              : 
     309              :     size_t response_size;
     310              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     311              :     spdm_key_update_response_t *spdm_response;
     312              : 
     313              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
     314              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
     315              : 
     316            1 :     spdm_test_context = *state;
     317            1 :     spdm_context = spdm_test_context->spdm_context;
     318            1 :     spdm_test_context->case_id = 0x03;
     319            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     320              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     321              : 
     322            1 :     spdm_set_standard_key_update_test_state(
     323              :         spdm_context, &session_id);
     324              : 
     325              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     326              :     /*"filling" buffers*/
     327              :     spdm_context->transcript.message_m.buffer_size =
     328              :         spdm_context->transcript.message_m.max_buffer_size;
     329              :     spdm_context->transcript.message_b.buffer_size =
     330              :         spdm_context->transcript.message_b.max_buffer_size;
     331              :     spdm_context->transcript.message_c.buffer_size =
     332              :         spdm_context->transcript.message_c.max_buffer_size;
     333              :     spdm_context->transcript.message_mut_b.buffer_size =
     334              :         spdm_context->transcript.message_mut_b.max_buffer_size;
     335              :     spdm_context->transcript.message_mut_c.buffer_size =
     336              :         spdm_context->transcript.message_mut_c.max_buffer_size;
     337              : #endif
     338              : 
     339            1 :     session_info = &spdm_context->session_info[0];
     340            1 :     secured_message_context = session_info->secured_message_context;
     341              : 
     342            1 :     libspdm_set_standard_key_update_test_secrets(
     343            1 :         session_info->secured_message_context,
     344              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
     345              :         m_req_secret_buffer, (uint8_t)(0xEE));
     346              : 
     347              :     /*request side *not* updated*/
     348              : 
     349              :     /*response side updated */
     350            1 :     libspdm_compute_secret_update(spdm_context->connection_info.version,
     351              :                                   secured_message_context->hash_size,
     352              :                                   m_rsp_secret_buffer, m_rsp_secret_buffer,
     353              :                                   secured_message_context->hash_size);
     354              : 
     355            1 :     response_size = sizeof(response);
     356            1 :     status = libspdm_get_encap_response_key_update(spdm_context,
     357              :                                                    m_spdm_key_update_request1_size,
     358              :                                                    &m_spdm_key_update_request1,
     359              :                                                    &response_size, response);
     360              : 
     361            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     362            1 :     assert_int_equal(response_size, sizeof(spdm_key_update_response_t));
     363            1 :     spdm_response = (void *)response;
     364            1 :     assert_int_equal(spdm_response->header.request_response_code,
     365              :                      SPDM_KEY_UPDATE_ACK);
     366            1 :     assert_int_equal(spdm_response->header.param1,
     367              :                      SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY);
     368            1 :     assert_int_equal(spdm_response->header.param2,
     369              :                      m_spdm_key_update_request1.header.param2);
     370              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     371              :     assert_int_equal(session_info->session_transcript.message_m.buffer_size, 0);
     372              :     assert_int_equal(spdm_context->transcript.message_b.buffer_size, 0);
     373              :     assert_int_equal(spdm_context->transcript.message_c.buffer_size, 0);
     374              :     assert_int_equal(spdm_context->transcript.message_mut_b.buffer_size, 0);
     375              :     assert_int_equal(spdm_context->transcript.message_mut_c.buffer_size, 0);
     376              : #endif
     377            1 :     assert_memory_equal(secured_message_context
     378              :                         ->application_secret.request_data_secret,
     379              :                         m_req_secret_buffer, secured_message_context->hash_size);
     380            1 :     assert_memory_equal(secured_message_context
     381              :                         ->application_secret.response_data_secret,
     382              :                         m_rsp_secret_buffer, secured_message_context->hash_size);
     383            1 : }
     384              : 
     385              : /**
     386              :  * Test 4: receiving a correct KEY_UPDATE message from the requester, but the
     387              :  * responder has no capabilities for key update.
     388              :  * Expected behavior: the encap requester refuses the KEY_UPDATE message and
     389              :  * produces an ERROR message indicating the UnsupportedRequest. No keys are
     390              :  * updated.
     391              :  **/
     392            1 : static void req_encap_key_update_ack_case4(void **state)
     393              : {
     394              :     libspdm_return_t status;
     395              :     libspdm_test_context_t *spdm_test_context;
     396              :     libspdm_context_t *spdm_context;
     397              :     uint32_t session_id;
     398              :     libspdm_session_info_t *session_info;
     399              :     libspdm_secured_message_context_t *secured_message_context;
     400              : 
     401              :     size_t response_size;
     402              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     403              :     spdm_key_update_response_t *spdm_response;
     404              : 
     405              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
     406              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
     407              : 
     408            1 :     spdm_test_context = *state;
     409            1 :     spdm_context = spdm_test_context->spdm_context;
     410            1 :     spdm_test_context->case_id = 0x04;
     411            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     412              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     413              : 
     414            1 :     spdm_set_standard_key_update_test_state(
     415              :         spdm_context, &session_id);
     416              : 
     417              :     /*no capabilities*/
     418            1 :     spdm_context->connection_info.capability.flags &=
     419              :         ~SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_UPD_CAP;
     420            1 :     spdm_context->local_context.capability.flags &=
     421              :         ~SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_UPD_CAP;
     422              : 
     423            1 :     session_info = &spdm_context->session_info[0];
     424            1 :     secured_message_context = session_info->secured_message_context;
     425              : 
     426            1 :     libspdm_set_standard_key_update_test_secrets(
     427            1 :         session_info->secured_message_context,
     428              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
     429              :         m_req_secret_buffer, (uint8_t)(0xEE));
     430              : 
     431              :     /*no keys are updated*/
     432              : 
     433            1 :     response_size = sizeof(response);
     434            1 :     status = libspdm_get_encap_response_key_update(spdm_context,
     435              :                                                    m_spdm_key_update_request1_size,
     436              :                                                    &m_spdm_key_update_request1,
     437              :                                                    &response_size, response);
     438              : 
     439            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     440            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     441            1 :     spdm_response = (void *)response;
     442            1 :     assert_int_equal(spdm_response->header.request_response_code,
     443              :                      SPDM_ERROR);
     444            1 :     assert_int_equal(spdm_response->header.param1,
     445              :                      SPDM_ERROR_CODE_UNSUPPORTED_REQUEST);
     446            1 :     assert_int_equal(spdm_response->header.param2, SPDM_KEY_UPDATE);
     447            1 :     assert_memory_equal(secured_message_context
     448              :                         ->application_secret.request_data_secret,
     449              :                         m_req_secret_buffer, secured_message_context->hash_size);
     450            1 :     assert_memory_equal(secured_message_context
     451              :                         ->application_secret.response_data_secret,
     452              :                         m_rsp_secret_buffer, secured_message_context->hash_size);
     453            1 : }
     454              : 
     455              : /**
     456              :  * Test 5: receiving a correct KEY_UPDATE message from the requester, but the
     457              :  * responder is not correctly setup by not initializing a session during
     458              :  * KEY_EXCHANGE.
     459              :  * Expected behavior: the encap requester refuses the KEY_UPDATE message and produces
     460              :  * an ERROR message indicating the UnsupportedRequest. No keys are updated.
     461              :  **/
     462            1 : static void req_encap_key_update_ack_case5(void **state)
     463              : {
     464              :     libspdm_return_t status;
     465              :     libspdm_test_context_t *spdm_test_context;
     466              :     libspdm_context_t *spdm_context;
     467              :     uint32_t session_id;
     468              :     libspdm_session_info_t *session_info;
     469              :     libspdm_secured_message_context_t *secured_message_context;
     470              : 
     471              :     size_t response_size;
     472              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     473              :     spdm_key_update_response_t *spdm_response;
     474              : 
     475              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
     476              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
     477              : 
     478            1 :     spdm_test_context = *state;
     479            1 :     spdm_context = spdm_test_context->spdm_context;
     480            1 :     spdm_test_context->case_id = 0x04;
     481            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     482              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     483              : 
     484            1 :     spdm_set_standard_key_update_test_state(
     485              :         spdm_context, &session_id);
     486              : 
     487            1 :     session_info = &spdm_context->session_info[0];
     488            1 :     secured_message_context = session_info->secured_message_context;
     489              : 
     490              :     /*uninitialized session*/
     491            1 :     libspdm_secured_message_set_session_state(
     492              :         session_info->secured_message_context,
     493              :         LIBSPDM_SESSION_STATE_NOT_STARTED);
     494              : 
     495            1 :     libspdm_set_standard_key_update_test_secrets(
     496            1 :         session_info->secured_message_context,
     497              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
     498              :         m_req_secret_buffer, (uint8_t)(0xEE));
     499              : 
     500              :     /*no keys are updated*/
     501              : 
     502            1 :     response_size = sizeof(response);
     503            1 :     status = libspdm_get_encap_response_key_update(spdm_context,
     504              :                                                    m_spdm_key_update_request1_size,
     505              :                                                    &m_spdm_key_update_request1,
     506              :                                                    &response_size, response);
     507            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     508            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     509            1 :     spdm_response = (void *)response;
     510            1 :     assert_int_equal(spdm_response->header.request_response_code,
     511              :                      SPDM_ERROR);
     512            1 :     assert_int_equal(spdm_response->header.param1,
     513              :                      SPDM_ERROR_CODE_INVALID_REQUEST);
     514            1 :     assert_int_equal(spdm_response->header.param2, 0);
     515            1 :     assert_memory_equal(secured_message_context
     516              :                         ->application_secret.request_data_secret,
     517              :                         m_req_secret_buffer, secured_message_context->hash_size);
     518            1 :     assert_memory_equal(secured_message_context
     519              :                         ->application_secret.response_data_secret,
     520              :                         m_rsp_secret_buffer, secured_message_context->hash_size);
     521            1 : }
     522              : 
     523              : /**
     524              :  * Test 6: receiving a correct KEY_UPDATE message from the requester with
     525              :  * the UpdateAllKeys operation.
     526              :  * Expected behavior: the encap requester refuses the KEY_UPDATE message and produces
     527              :  * an ERROR message indicating the UnsupportedRequest. No keys are updated.
     528              :  **/
     529            1 : static void req_encap_key_update_ack_case6(void **state)
     530              : {
     531              :     libspdm_return_t status;
     532              :     libspdm_test_context_t *spdm_test_context;
     533              :     libspdm_context_t *spdm_context;
     534              :     uint32_t session_id;
     535              : 
     536              :     size_t response_size;
     537              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     538              :     spdm_key_update_response_t *spdm_response;
     539              : 
     540              : 
     541            1 :     spdm_test_context = *state;
     542            1 :     spdm_context = spdm_test_context->spdm_context;
     543            1 :     spdm_test_context->case_id = 0x06;
     544            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     545              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     546              : 
     547            1 :     spdm_set_standard_key_update_test_state(
     548              :         spdm_context, &session_id);
     549              : 
     550            1 :     response_size = sizeof(response);
     551            1 :     status = libspdm_get_encap_response_key_update(spdm_context,
     552              :                                                    m_spdm_key_update_request3_size,
     553              :                                                    &m_spdm_key_update_request3,
     554              :                                                    &response_size, response);
     555              : 
     556            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     557            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     558            1 :     spdm_response = (void *)response;
     559            1 :     assert_int_equal(spdm_response->header.request_response_code,
     560              :                      SPDM_ERROR);
     561            1 :     assert_int_equal(spdm_response->header.param1,
     562              :                      SPDM_ERROR_CODE_INVALID_REQUEST);
     563            1 :     assert_int_equal(spdm_response->header.param2,
     564              :                      0);
     565            1 : }
     566              : 
     567              : /**
     568              :  * Test 7: receiving a KEY_UPDATE message larger than specified, with the
     569              :  * UpdateAllKeys operation.
     570              :  * Expected behavior: the encap requester refuses the KEY_UPDATE message and
     571              :  * produces an ERROR message indicating the InvalidRequest. No keys
     572              :  * are updated.
     573              :  **/
     574            1 : static void req_encap_key_update_ack_case7(void **state)
     575              : {
     576              :     libspdm_return_t status;
     577              :     libspdm_test_context_t *spdm_test_context;
     578              :     libspdm_context_t *spdm_context;
     579              :     uint32_t session_id;
     580              :     libspdm_session_info_t *session_info;
     581              :     libspdm_secured_message_context_t *secured_message_context;
     582              : 
     583              :     size_t response_size;
     584              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     585              :     spdm_key_update_response_t *spdm_response;
     586              : 
     587              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
     588              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
     589              : 
     590            1 :     spdm_test_context = *state;
     591            1 :     spdm_context = spdm_test_context->spdm_context;
     592            1 :     spdm_test_context->case_id = 0x07;
     593            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     594              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     595              : 
     596            1 :     spdm_set_standard_key_update_test_state(
     597              :         spdm_context, &session_id);
     598              : 
     599            1 :     session_info = &spdm_context->session_info[0];
     600            1 :     secured_message_context = session_info->secured_message_context;
     601              : 
     602            1 :     libspdm_set_standard_key_update_test_secrets(
     603            1 :         session_info->secured_message_context,
     604              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
     605              :         m_req_secret_buffer, (uint8_t)(0xEE));
     606              : 
     607              :     /*no keys are updated*/
     608              : 
     609            1 :     response_size = sizeof(response);
     610            1 :     status = libspdm_get_encap_response_key_update(spdm_context,
     611              :                                                    m_spdm_key_update_request4_size,
     612              :                                                    &m_spdm_key_update_request4,
     613              :                                                    &response_size, response);
     614              : 
     615            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     616            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     617            1 :     spdm_response = (void *)response;
     618            1 :     assert_int_equal(spdm_response->header.request_response_code,
     619              :                      SPDM_ERROR);
     620            1 :     assert_int_equal(spdm_response->header.param1,
     621              :                      SPDM_ERROR_CODE_INVALID_REQUEST);
     622            1 :     assert_int_equal(spdm_response->header.param2, 0);
     623            1 :     assert_memory_equal(secured_message_context
     624              :                         ->application_secret.request_data_secret,
     625              :                         m_req_secret_buffer, secured_message_context->hash_size);
     626            1 :     assert_memory_equal(secured_message_context
     627              :                         ->application_secret.response_data_secret,
     628              :                         m_rsp_secret_buffer, secured_message_context->hash_size);
     629            1 : }
     630              : 
     631              : /**
     632              :  * Test 8: receiving a invalid KEY_UPDATE message from the requester with
     633              :  * the VerifyNewKey operation. The responder is setup as if no valid
     634              :  * KEY_UPDATE request with either the UpdateKey or UpdateAllKeys has been
     635              :  * previously received.
     636              :  * Expected behavior: the encap requester refuses the KEY_UPDATE message and
     637              :  * produces an ERROR message indicating the InvalidRequest. No keys are
     638              :  * updated.
     639              :  **/
     640            1 : static void req_encap_key_update_ack_case8(void **state)
     641              : {
     642              :     libspdm_return_t status;
     643              :     libspdm_test_context_t *spdm_test_context;
     644              :     libspdm_context_t *spdm_context;
     645              :     uint32_t session_id;
     646              :     libspdm_session_info_t *session_info;
     647              : 
     648              :     size_t response_size;
     649              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     650              :     spdm_key_update_response_t *spdm_response;
     651              : 
     652              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
     653              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
     654              : 
     655            1 :     spdm_test_context = *state;
     656            1 :     spdm_context = spdm_test_context->spdm_context;
     657            1 :     spdm_test_context->case_id = 0x08;
     658            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     659              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     660              : 
     661            1 :     spdm_set_standard_key_update_test_state(
     662              :         spdm_context, &session_id);
     663              : 
     664            1 :     session_info = &spdm_context->session_info[0];
     665              : 
     666            1 :     libspdm_set_standard_key_update_test_secrets(
     667            1 :         session_info->secured_message_context,
     668              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
     669              :         m_req_secret_buffer, (uint8_t)(0xEE));
     670              : 
     671              :     /*no mocked major secret update*/
     672              : 
     673              :     /*no keys are updated*/
     674              : 
     675            1 :     response_size = sizeof(response);
     676            1 :     status = libspdm_get_encap_response_key_update(spdm_context,
     677              :                                                    m_spdm_key_update_request5_size,
     678              :                                                    &m_spdm_key_update_request5,
     679              :                                                    &response_size, response);
     680              : 
     681            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     682            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     683            1 :     spdm_response = (void *)response;
     684            1 :     assert_int_equal(spdm_response->header.request_response_code,
     685              :                      SPDM_ERROR);
     686            1 :     assert_int_equal(spdm_response->header.param1,
     687              :                      SPDM_ERROR_CODE_INVALID_REQUEST);
     688            1 :     assert_int_equal(spdm_response->header.param2,
     689              :                      0);
     690            1 : }
     691              : 
     692              : /**
     693              :  * Test 9: receiving a KEY_UPDATE message with a reserved operation code.
     694              :  * Expected behavior: the encap requester refuses the KEY_UPDATE message and
     695              :  * produces an ERROR message indicating the InvalidRequest. No keys
     696              :  * are updated.
     697              :  **/
     698            1 : static void req_encap_key_update_ack_case9(void **state)
     699              : {
     700              :     libspdm_return_t status;
     701              :     libspdm_test_context_t *spdm_test_context;
     702              :     libspdm_context_t *spdm_context;
     703              :     uint32_t session_id;
     704              :     libspdm_session_info_t *session_info;
     705              :     libspdm_secured_message_context_t *secured_message_context;
     706              : 
     707              :     size_t response_size;
     708              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     709              :     spdm_key_update_response_t *spdm_response;
     710              : 
     711              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
     712              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
     713              : 
     714            1 :     spdm_test_context = *state;
     715            1 :     spdm_context = spdm_test_context->spdm_context;
     716            1 :     spdm_test_context->case_id = 0x09;
     717            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     718              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     719              : 
     720            1 :     spdm_set_standard_key_update_test_state(
     721              :         spdm_context, &session_id);
     722              : 
     723            1 :     session_info = &spdm_context->session_info[0];
     724            1 :     secured_message_context = session_info->secured_message_context;
     725              : 
     726            1 :     libspdm_set_standard_key_update_test_secrets(
     727            1 :         session_info->secured_message_context,
     728              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
     729              :         m_req_secret_buffer, (uint8_t)(0xEE));
     730              : 
     731              :     /*no keys are updated*/
     732              : 
     733            1 :     response_size = sizeof(response);
     734            1 :     status = libspdm_get_encap_response_key_update(spdm_context,
     735              :                                                    m_spdm_key_update_request10_size,
     736              :                                                    &m_spdm_key_update_request10,
     737              :                                                    &response_size, response);
     738              : 
     739            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     740            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     741            1 :     spdm_response = (void *)response;
     742            1 :     assert_int_equal(spdm_response->header.request_response_code,
     743              :                      SPDM_ERROR);
     744            1 :     assert_int_equal(spdm_response->header.param1,
     745              :                      SPDM_ERROR_CODE_INVALID_REQUEST);
     746            1 :     assert_int_equal(spdm_response->header.param2, 0);
     747            1 :     assert_memory_equal(secured_message_context
     748              :                         ->application_secret.request_data_secret,
     749              :                         m_req_secret_buffer, secured_message_context->hash_size);
     750            1 :     assert_memory_equal(secured_message_context
     751              :                         ->application_secret.response_data_secret,
     752              :                         m_rsp_secret_buffer, secured_message_context->hash_size);
     753            1 : }
     754              : 
     755              : /* UpdateKey + UpdateKey: failed*/
     756            1 : static void req_encap_key_update_ack_case10(void **state)
     757              : {
     758              :     libspdm_return_t status;
     759              :     libspdm_test_context_t *spdm_test_context;
     760              :     libspdm_context_t *spdm_context;
     761              :     uint32_t session_id;
     762              :     libspdm_session_info_t *session_info;
     763              :     libspdm_secured_message_context_t *secured_message_context;
     764              : 
     765              :     size_t response_size;
     766              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     767              :     spdm_key_update_response_t *spdm_response;
     768              : 
     769              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
     770              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
     771              : 
     772            1 :     spdm_test_context = *state;
     773            1 :     spdm_context = spdm_test_context->spdm_context;
     774            1 :     spdm_test_context->case_id = 0x0A;
     775            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     776              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     777              : 
     778            1 :     spdm_set_standard_key_update_test_state(
     779              :         spdm_context, &session_id);
     780              : 
     781            1 :     session_info = &spdm_context->session_info[0];
     782            1 :     secured_message_context = session_info->secured_message_context;
     783              : 
     784            1 :     libspdm_set_standard_key_update_test_secrets(
     785            1 :         session_info->secured_message_context,
     786              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
     787              :         m_req_secret_buffer, (uint8_t)(0xEE));
     788              : 
     789              :     /*request side *not* updated*/
     790              : 
     791              :     /*last request: UpdateKey*/
     792            1 :     session_info->last_key_update_request = m_spdm_key_update_request1;
     793              : 
     794              :     /*response side updated */
     795            1 :     libspdm_compute_secret_update(spdm_context->connection_info.version,
     796              :                                   secured_message_context->hash_size,
     797              :                                   m_rsp_secret_buffer, m_rsp_secret_buffer,
     798              :                                   secured_message_context->hash_size);
     799              : 
     800            1 :     response_size = sizeof(response);
     801            1 :     status = libspdm_get_encap_response_key_update(spdm_context,
     802              :                                                    m_spdm_key_update_request1_size,
     803              :                                                    &m_spdm_key_update_request1,
     804              :                                                    &response_size, response);
     805              : 
     806            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     807            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     808            1 :     spdm_response = (void *)response;
     809            1 :     assert_int_equal(spdm_response->header.request_response_code,
     810              :                      SPDM_ERROR);
     811            1 :     assert_int_equal(spdm_response->header.param1,
     812              :                      SPDM_ERROR_CODE_INVALID_REQUEST);
     813            1 :     assert_int_equal(spdm_response->header.param2,
     814              :                      0);
     815            1 : }
     816              : 
     817              : /* VerifyNewKey + UpdateKey: success*/
     818            1 : static void req_encap_key_update_ack_case11(void **state)
     819              : {
     820              :     libspdm_return_t status;
     821              :     libspdm_test_context_t *spdm_test_context;
     822              :     libspdm_context_t *spdm_context;
     823              :     uint32_t session_id;
     824              :     libspdm_session_info_t *session_info;
     825              :     libspdm_secured_message_context_t *secured_message_context;
     826              : 
     827              :     size_t response_size;
     828              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     829              :     spdm_key_update_response_t *spdm_response;
     830              : 
     831              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
     832              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
     833              : 
     834            1 :     spdm_test_context = *state;
     835            1 :     spdm_context = spdm_test_context->spdm_context;
     836            1 :     spdm_test_context->case_id = 0x0B;
     837            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     838              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     839              : 
     840            1 :     spdm_set_standard_key_update_test_state(
     841              :         spdm_context, &session_id);
     842              : 
     843            1 :     session_info = &spdm_context->session_info[0];
     844            1 :     secured_message_context = session_info->secured_message_context;
     845              : 
     846            1 :     libspdm_set_standard_key_update_test_secrets(
     847            1 :         session_info->secured_message_context,
     848              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
     849              :         m_req_secret_buffer, (uint8_t)(0xEE));
     850              : 
     851              :     /*request side *not* updated*/
     852              : 
     853              :     /*last request: verify new key*/
     854            1 :     session_info->last_key_update_request = m_spdm_key_update_request5;
     855              :     /*verify new key clear last_key_update_request*/
     856            1 :     libspdm_zero_mem (&(session_info->last_key_update_request), sizeof(spdm_key_update_request_t));
     857              : 
     858              :     /*response side updated */
     859            1 :     libspdm_compute_secret_update(spdm_context->connection_info.version,
     860              :                                   secured_message_context->hash_size,
     861              :                                   m_rsp_secret_buffer, m_rsp_secret_buffer,
     862              :                                   secured_message_context->hash_size);
     863              : 
     864            1 :     response_size = sizeof(response);
     865            1 :     status = libspdm_get_encap_response_key_update(spdm_context,
     866              :                                                    m_spdm_key_update_request1_size,
     867              :                                                    &m_spdm_key_update_request1,
     868              :                                                    &response_size, response);
     869              : 
     870            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     871            1 :     assert_int_equal(response_size, sizeof(spdm_key_update_response_t));
     872            1 :     spdm_response = (void *)response;
     873            1 :     assert_int_equal(spdm_response->header.request_response_code,
     874              :                      SPDM_KEY_UPDATE_ACK);
     875            1 :     assert_int_equal(spdm_response->header.param1,
     876              :                      SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY);
     877            1 :     assert_int_equal(spdm_response->header.param2,
     878              :                      m_spdm_key_update_request1.header.param2);
     879            1 :     assert_memory_equal(secured_message_context
     880              :                         ->application_secret.request_data_secret,
     881              :                         m_req_secret_buffer, secured_message_context->hash_size);
     882            1 :     assert_memory_equal(secured_message_context
     883              :                         ->application_secret.response_data_secret,
     884              :                         m_rsp_secret_buffer, secured_message_context->hash_size);
     885            1 : }
     886              : 
     887              : /* VerifyNewKey + VerifyNewKey: failed*/
     888            1 : static void req_encap_key_update_ack_case12(void **state)
     889              : {
     890              :     libspdm_return_t status;
     891              :     libspdm_test_context_t *spdm_test_context;
     892              :     libspdm_context_t *spdm_context;
     893              :     uint32_t session_id;
     894              :     libspdm_session_info_t *session_info;
     895              :     libspdm_secured_message_context_t *secured_message_context;
     896              : 
     897              :     size_t response_size;
     898              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     899              :     spdm_key_update_response_t *spdm_response;
     900              : 
     901              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
     902              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
     903              : 
     904            1 :     spdm_test_context = *state;
     905            1 :     spdm_context = spdm_test_context->spdm_context;
     906            1 :     spdm_test_context->case_id = 0x0C;
     907            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     908              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     909              : 
     910            1 :     spdm_set_standard_key_update_test_state(
     911              :         spdm_context, &session_id);
     912              : 
     913            1 :     session_info = &spdm_context->session_info[0];
     914            1 :     secured_message_context = session_info->secured_message_context;
     915              : 
     916            1 :     libspdm_set_standard_key_update_test_secrets(
     917            1 :         session_info->secured_message_context,
     918              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
     919              :         m_req_secret_buffer, (uint8_t)(0xEE));
     920              : 
     921              :     /*request side *not* updated*/
     922              : 
     923              :     /*last request: verify new key*/
     924            1 :     session_info->last_key_update_request = m_spdm_key_update_request5;
     925              :     /*verify new key clear last_key_update_request*/
     926            1 :     libspdm_zero_mem (&(session_info->last_key_update_request), sizeof(spdm_key_update_request_t));
     927              : 
     928              :     /*response side updated */
     929            1 :     libspdm_compute_secret_update(spdm_context->connection_info.version,
     930              :                                   secured_message_context->hash_size,
     931              :                                   m_rsp_secret_buffer, m_rsp_secret_buffer,
     932              :                                   secured_message_context->hash_size);
     933              : 
     934            1 :     response_size = sizeof(response);
     935            1 :     status = libspdm_get_encap_response_key_update(spdm_context,
     936              :                                                    m_spdm_key_update_request5_size,
     937              :                                                    &m_spdm_key_update_request5,
     938              :                                                    &response_size, response);
     939              : 
     940            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     941            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     942            1 :     spdm_response = (void *)response;
     943            1 :     assert_int_equal(spdm_response->header.request_response_code,
     944              :                      SPDM_ERROR);
     945            1 :     assert_int_equal(spdm_response->header.param1,
     946              :                      SPDM_ERROR_CODE_INVALID_REQUEST);
     947            1 :     assert_int_equal(spdm_response->header.param2,
     948              :                      0);
     949            1 : }
     950              : 
     951              : 
     952              : /* other command + UpdateKey: success*/
     953            1 : static void req_encap_key_update_ack_case13(void **state)
     954              : {
     955              :     libspdm_return_t status;
     956              :     libspdm_test_context_t *spdm_test_context;
     957              :     libspdm_context_t *spdm_context;
     958              :     uint32_t session_id;
     959              :     libspdm_session_info_t *session_info;
     960              :     libspdm_secured_message_context_t *secured_message_context;
     961              : 
     962              :     size_t response_size;
     963              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     964              :     spdm_key_update_response_t *spdm_response;
     965              : 
     966              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
     967              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
     968              : 
     969            1 :     spdm_test_context = *state;
     970            1 :     spdm_context = spdm_test_context->spdm_context;
     971            1 :     spdm_test_context->case_id = 0x0D;
     972            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     973              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     974              : 
     975            1 :     spdm_set_standard_key_update_test_state(
     976              :         spdm_context, &session_id);
     977              : 
     978            1 :     session_info = &spdm_context->session_info[0];
     979            1 :     secured_message_context = session_info->secured_message_context;
     980              : 
     981            1 :     libspdm_set_standard_key_update_test_secrets(
     982            1 :         session_info->secured_message_context,
     983              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
     984              :         m_req_secret_buffer, (uint8_t)(0xEE));
     985              : 
     986              :     /*request side *not* updated*/
     987              : 
     988              :     /*other command with cleared last_key_update_request*/
     989            1 :     libspdm_zero_mem (&(session_info->last_key_update_request), sizeof(spdm_key_update_request_t));
     990              : 
     991              :     /*response side updated */
     992            1 :     libspdm_compute_secret_update(spdm_context->connection_info.version,
     993              :                                   secured_message_context->hash_size,
     994              :                                   m_rsp_secret_buffer, m_rsp_secret_buffer,
     995              :                                   secured_message_context->hash_size);
     996              : 
     997            1 :     response_size = sizeof(response);
     998            1 :     status = libspdm_get_encap_response_key_update(spdm_context,
     999              :                                                    m_spdm_key_update_request1_size,
    1000              :                                                    &m_spdm_key_update_request1,
    1001              :                                                    &response_size, response);
    1002              : 
    1003            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1004            1 :     assert_int_equal(response_size, sizeof(spdm_key_update_response_t));
    1005            1 :     spdm_response = (void *)response;
    1006            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1007              :                      SPDM_KEY_UPDATE_ACK);
    1008            1 :     assert_int_equal(spdm_response->header.param1,
    1009              :                      SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY);
    1010            1 :     assert_int_equal(spdm_response->header.param2,
    1011              :                      m_spdm_key_update_request1.header.param2);
    1012            1 :     assert_memory_equal(secured_message_context
    1013              :                         ->application_secret.request_data_secret,
    1014              :                         m_req_secret_buffer, secured_message_context->hash_size);
    1015            1 :     assert_memory_equal(secured_message_context
    1016              :                         ->application_secret.response_data_secret,
    1017              :                         m_rsp_secret_buffer, secured_message_context->hash_size);
    1018            1 : }
    1019              : 
    1020              : 
    1021              : /* other command + VerifyNewKey: failed*/
    1022            1 : static void req_encap_key_update_ack_case14(void **state)
    1023              : {
    1024              :     libspdm_return_t status;
    1025              :     libspdm_test_context_t *spdm_test_context;
    1026              :     libspdm_context_t *spdm_context;
    1027              :     uint32_t session_id;
    1028              :     libspdm_session_info_t *session_info;
    1029              :     libspdm_secured_message_context_t *secured_message_context;
    1030              : 
    1031              :     size_t response_size;
    1032              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1033              :     spdm_key_update_response_t *spdm_response;
    1034              : 
    1035              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    1036              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    1037              : 
    1038            1 :     spdm_test_context = *state;
    1039            1 :     spdm_context = spdm_test_context->spdm_context;
    1040            1 :     spdm_test_context->case_id = 0x0E;
    1041            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1042              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1043              : 
    1044            1 :     spdm_set_standard_key_update_test_state(
    1045              :         spdm_context, &session_id);
    1046              : 
    1047            1 :     session_info = &spdm_context->session_info[0];
    1048            1 :     secured_message_context = session_info->secured_message_context;
    1049              : 
    1050            1 :     libspdm_set_standard_key_update_test_secrets(
    1051            1 :         session_info->secured_message_context,
    1052              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    1053              :         m_req_secret_buffer, (uint8_t)(0xEE));
    1054              : 
    1055              :     /*request side *not* updated*/
    1056              : 
    1057              :     /*other command with cleared last_key_update_request*/
    1058            1 :     libspdm_zero_mem (&(session_info->last_key_update_request), sizeof(spdm_key_update_request_t));
    1059              : 
    1060              :     /*response side updated */
    1061            1 :     libspdm_compute_secret_update(spdm_context->connection_info.version,
    1062              :                                   secured_message_context->hash_size,
    1063              :                                   m_rsp_secret_buffer, m_rsp_secret_buffer,
    1064              :                                   secured_message_context->hash_size);
    1065              : 
    1066            1 :     response_size = sizeof(response);
    1067            1 :     status = libspdm_get_encap_response_key_update(spdm_context,
    1068              :                                                    m_spdm_key_update_request5_size,
    1069              :                                                    &m_spdm_key_update_request5,
    1070              :                                                    &response_size, response);
    1071              : 
    1072            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1073            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
    1074            1 :     spdm_response = (void *)response;
    1075            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1076              :                      SPDM_ERROR);
    1077            1 :     assert_int_equal(spdm_response->header.param1,
    1078              :                      SPDM_ERROR_CODE_INVALID_REQUEST);
    1079            1 :     assert_int_equal(spdm_response->header.param2,
    1080              :                      0);
    1081            1 : }
    1082              : 
    1083            1 : int libspdm_req_encap_key_update_ack_test(void)
    1084              : {
    1085            1 :     const struct CMUnitTest test_cases[] = {
    1086              :         /* Success Case -- UpdateKey*/
    1087              :         cmocka_unit_test(req_encap_key_update_ack_case1),
    1088              :         /* Bad request size*/
    1089              :         cmocka_unit_test(req_encap_key_update_ack_case2),
    1090              :         /* Buffer reset*/
    1091              :         cmocka_unit_test(req_encap_key_update_ack_case3),
    1092              :         /* Unsupported KEY_UPD capabilities*/
    1093              :         cmocka_unit_test(req_encap_key_update_ack_case4),
    1094              :         /* Uninitialized session*/
    1095              :         cmocka_unit_test(req_encap_key_update_ack_case5),
    1096              :         /* ruquster RETURN_UNSUPPORTED*/
    1097              :         cmocka_unit_test(req_encap_key_update_ack_case6),
    1098              :         /* Bad request size*/
    1099              :         cmocka_unit_test(req_encap_key_update_ack_case7),
    1100              :         /* Uninitialized key update*/
    1101              :         cmocka_unit_test(req_encap_key_update_ack_case8),
    1102              :         /* Invalid operation*/
    1103              :         cmocka_unit_test(req_encap_key_update_ack_case9),
    1104              :         /* UpdateKey + UpdateKey: failed*/
    1105              :         cmocka_unit_test(req_encap_key_update_ack_case10),
    1106              :         /* VerifyNewKey + UpdateKey: success*/
    1107              :         cmocka_unit_test(req_encap_key_update_ack_case11),
    1108              :         /* VerifyNewKey + VerifyNewKey: failed*/
    1109              :         cmocka_unit_test(req_encap_key_update_ack_case12),
    1110              :         /* other command + UpdateKey: success*/
    1111              :         cmocka_unit_test(req_encap_key_update_ack_case13),
    1112              :         /* other command + VerifyNewKey: failed*/
    1113              :         cmocka_unit_test(req_encap_key_update_ack_case14),
    1114              :     };
    1115              : 
    1116            1 :     libspdm_test_context_t test_context = {
    1117              :         LIBSPDM_TEST_CONTEXT_VERSION,
    1118              :         false,
    1119              :     };
    1120              : 
    1121            1 :     libspdm_setup_test_context(&test_context);
    1122              : 
    1123            1 :     return cmocka_run_group_tests(test_cases,
    1124              :                                   libspdm_unit_test_group_setup,
    1125              :                                   libspdm_unit_test_group_teardown);
    1126              : }
    1127              : 
    1128              : #endif /* LIBSPDM_ENABLE_CAPABILITY_ENCAP_CAP && (..) */
        

Generated by: LCOV version 2.0-1