LCOV - code coverage report
Current view: top level - unit_test/test_spdm_requester - key_update.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 90.3 % 2063 1862
Test Date: 2025-10-12 08:10:56 Functions: 100.0 % 41 41

            Line data    Source code
       1              : /**
       2              :  *  Copyright Notice:
       3              :  *  Copyright 2021-2025 DMTF. All rights reserved.
       4              :  *  License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
       5              :  **/
       6              : 
       7              : #include "spdm_unit_test.h"
       8              : #include "internal/libspdm_requester_lib.h"
       9              : #include "internal/libspdm_secured_message_lib.h"
      10              : 
      11              : #if (LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP) || (LIBSPDM_ENABLE_CAPABILITY_PSK_CAP)
      12              : 
      13              : static uint8_t m_libspdm_last_token;
      14              : static uint8_t m_libspdm_last_rsp_enc_key[LIBSPDM_MAX_AEAD_KEY_SIZE];
      15              : static uint8_t m_libspdm_last_rsp_salt[LIBSPDM_MAX_AEAD_IV_SIZE];
      16              : static uint64_t m_libspdm_last_rsp_sequence_number;
      17              : 
      18           35 : static void libspdm_set_standard_key_update_test_state(
      19              :     libspdm_context_t *spdm_context, uint32_t *session_id)
      20              : {
      21              :     void                   *data;
      22              :     size_t data_size;
      23              :     void                   *hash;
      24              :     size_t hash_size;
      25              :     libspdm_session_info_t    *session_info;
      26              : 
      27           35 :     spdm_context->connection_info.connection_state =
      28              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
      29           35 :     spdm_context->connection_info.capability.flags |=
      30              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_UPD_CAP;
      31           35 :     spdm_context->connection_info.capability.flags |=
      32              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
      33           35 :     spdm_context->connection_info.capability.flags |=
      34              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
      35           35 :     spdm_context->local_context.capability.flags |=
      36              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_UPD_CAP;
      37           35 :     spdm_context->local_context.capability.flags |=
      38              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
      39           35 :     spdm_context->local_context.capability.flags |=
      40              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
      41           35 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
      42              :                                                          m_libspdm_use_asym_algo, &data,
      43              :                                                          &data_size, &hash, &hash_size)) {
      44            0 :         assert(false);
      45              :     }
      46           35 :     spdm_context->transcript.message_a.buffer_size = 0;
      47           35 :     spdm_context->connection_info.algorithm.base_hash_algo =
      48              :         m_libspdm_use_hash_algo;
      49           35 :     spdm_context->connection_info.algorithm.base_asym_algo =
      50              :         m_libspdm_use_asym_algo;
      51           35 :     spdm_context->connection_info.algorithm.dhe_named_group =
      52              :         m_libspdm_use_dhe_algo;
      53           35 :     spdm_context->connection_info.algorithm.aead_cipher_suite =
      54              :         m_libspdm_use_aead_algo;
      55              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
      56              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
      57              :         data_size;
      58              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
      59              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
      60              :                      data, data_size);
      61              : #endif
      62              : 
      63           35 :     *session_id = 0xFFFFFFFF;
      64           35 :     session_info = &spdm_context->session_info[0];
      65           35 :     libspdm_session_info_init(spdm_context, session_info, *session_id,
      66              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
      67           35 :     libspdm_secured_message_set_session_state(
      68              :         session_info->secured_message_context,
      69              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
      70              : 
      71           35 :     free(data);
      72           35 : }
      73              : 
      74           83 : static void libspdm_set_standard_key_update_test_secrets(
      75              :     libspdm_secured_message_context_t *secured_message_context,
      76              :     uint8_t *m_rsp_secret_buffer, uint8_t rsp_secret_fill,
      77              :     uint8_t *m_req_secret_buffer, uint8_t req_secret_fill)
      78              : {
      79           83 :     libspdm_set_mem(m_rsp_secret_buffer, secured_message_context
      80              :                     ->hash_size, rsp_secret_fill);
      81           83 :     libspdm_set_mem(m_req_secret_buffer, secured_message_context
      82              :                     ->hash_size, req_secret_fill);
      83              : 
      84           83 :     libspdm_copy_mem(secured_message_context->application_secret.response_data_secret,
      85              :                      sizeof(secured_message_context->application_secret.response_data_secret),
      86              :                      m_rsp_secret_buffer, secured_message_context->aead_key_size);
      87           83 :     libspdm_copy_mem(secured_message_context->application_secret.request_data_secret,
      88              :                      sizeof(secured_message_context->application_secret.request_data_secret),
      89              :                      m_req_secret_buffer, secured_message_context->aead_key_size);
      90              : 
      91           83 :     libspdm_set_mem(secured_message_context->application_secret
      92           83 :                     .response_data_encryption_key,
      93              :                     secured_message_context->aead_key_size, (uint8_t)(0xFF));
      94           83 :     libspdm_set_mem(secured_message_context->application_secret
      95           83 :                     .response_data_salt,
      96              :                     secured_message_context->aead_iv_size, (uint8_t)(0xFF));
      97              : 
      98              : 
      99           83 :     libspdm_set_mem(secured_message_context->application_secret
     100           83 :                     .request_data_encryption_key,
     101              :                     secured_message_context->aead_key_size, (uint8_t)(0xEE));
     102           83 :     libspdm_set_mem(secured_message_context->application_secret
     103           83 :                     .request_data_salt,
     104              :                     secured_message_context->aead_iv_size, (uint8_t)(0xEE));
     105              : 
     106              :     secured_message_context->application_secret.
     107           83 :     response_data_sequence_number = 0;
     108              :     secured_message_context->application_secret.
     109           83 :     request_data_sequence_number = 0;
     110           83 : }
     111              : 
     112           35 : static void libspdm_compute_secret_update(spdm_version_number_t spdm_version,
     113              :                                           size_t hash_size,
     114              :                                           const uint8_t *in_secret, uint8_t *out_secret,
     115              :                                           size_t out_secret_size)
     116              : {
     117              :     uint8_t bin_str9[128];
     118              :     size_t bin_str9_size;
     119              : 
     120           35 :     bin_str9_size = sizeof(bin_str9);
     121           35 :     libspdm_bin_concat(spdm_version,
     122              :                        SPDM_BIN_STR_9_LABEL, sizeof(SPDM_BIN_STR_9_LABEL) - 1,
     123           35 :                        NULL, (uint16_t)hash_size, hash_size, bin_str9,
     124              :                        &bin_str9_size);
     125              : 
     126           35 :     libspdm_hkdf_expand(m_libspdm_use_hash_algo, in_secret, hash_size, bin_str9,
     127              :                         bin_str9_size, out_secret, out_secret_size);
     128           35 : }
     129              : 
     130          128 : static libspdm_return_t send_message(
     131              :     void *spdm_context, size_t request_size, const void *request, uint64_t timeout)
     132              : {
     133              :     libspdm_test_context_t *spdm_test_context;
     134              : 
     135          128 :     spdm_test_context = libspdm_get_test_context();
     136          128 :     switch (spdm_test_context->case_id) {
     137            1 :     case 0x1:
     138            1 :         return LIBSPDM_STATUS_SEND_FAIL;
     139            2 :     case 0x2: {
     140              :         libspdm_return_t status;
     141              :         uint8_t *decoded_message;
     142              :         size_t decoded_message_size;
     143              :         uint32_t session_id;
     144              :         uint32_t              *message_session_id;
     145              :         bool is_app_message;
     146              :         libspdm_session_info_t *session_info;
     147              :         uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
     148              : 
     149            2 :         message_session_id = NULL;
     150            2 :         session_id = 0xFFFFFFFF;
     151              : 
     152            2 :         session_info = libspdm_get_session_info_via_session_id(
     153              :             spdm_context, session_id);
     154            2 :         if (session_info == NULL) {
     155            0 :             return LIBSPDM_STATUS_SEND_FAIL;
     156              :         }
     157              : 
     158            2 :         memcpy(message_buffer, request, request_size);
     159              : 
     160              :         ((libspdm_secured_message_context_t
     161            2 :           *)(session_info->secured_message_context))
     162            2 :         ->application_secret.request_data_sequence_number--;
     163            2 :         libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message, &decoded_message_size);
     164            2 :         status = libspdm_transport_test_decode_message(spdm_context,
     165              :                                                        &message_session_id, &is_app_message, true,
     166              :                                                        request_size,
     167              :                                                        message_buffer, &decoded_message_size,
     168              :                                                        (void **)&decoded_message);
     169            2 :         if (LIBSPDM_STATUS_IS_ERROR(status)) {
     170            0 :             return LIBSPDM_STATUS_SEND_FAIL;
     171              :         }
     172              : 
     173            2 :         m_libspdm_last_token = ((spdm_key_update_request_t
     174            2 :                                  *) decoded_message)->header.param2;
     175              :     }
     176            2 :         return LIBSPDM_STATUS_SUCCESS;
     177            0 :     case 0x3: {
     178              :         static size_t sub_index = 0;
     179              : 
     180            0 :         if(sub_index > 0) {
     181              :             libspdm_return_t status;
     182              :             uint8_t *decoded_message;
     183              :             size_t decoded_message_size;
     184              :             uint32_t session_id;
     185              :             uint32_t              *message_session_id;
     186              :             bool is_app_message;
     187              :             libspdm_session_info_t *session_info;
     188              :             uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
     189              : 
     190            0 :             message_session_id = NULL;
     191            0 :             session_id = 0xFFFFFFFF;
     192              : 
     193            0 :             session_info = libspdm_get_session_info_via_session_id(
     194              :                 spdm_context, session_id);
     195            0 :             if (session_info == NULL) {
     196            0 :                 return LIBSPDM_STATUS_SEND_FAIL;
     197              :             }
     198              : 
     199            0 :             memcpy(message_buffer, request, request_size);
     200              : 
     201              :             ((libspdm_secured_message_context_t
     202            0 :               *)(session_info->secured_message_context))
     203            0 :             ->application_secret.request_data_sequence_number--;
     204            0 :             libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message,
     205              :                                         &decoded_message_size);
     206            0 :             status = libspdm_transport_test_decode_message(spdm_context,
     207              :                                                            &message_session_id, &is_app_message,
     208              :                                                            true,
     209              :                                                            request_size,
     210              :                                                            message_buffer, &decoded_message_size,
     211              :                                                            (void **)&decoded_message);
     212            0 :             if (LIBSPDM_STATUS_IS_ERROR(status)) {
     213            0 :                 return LIBSPDM_STATUS_SEND_FAIL;
     214              :             }
     215              : 
     216            0 :             m_libspdm_last_token = ((spdm_key_update_request_t
     217            0 :                                      *) decoded_message)->header.param2;
     218              :         }
     219              : 
     220            0 :         sub_index++;
     221              :     }
     222            0 :         return LIBSPDM_STATUS_SUCCESS;
     223            1 :     case 0x4: {
     224              :         static size_t sub_index = 0;
     225              : 
     226            1 :         if(sub_index > 0) {
     227              :             libspdm_return_t status;
     228              :             uint8_t *decoded_message;
     229              :             size_t decoded_message_size;
     230              :             uint32_t session_id;
     231              :             uint32_t              *message_session_id;
     232              :             bool is_app_message;
     233              :             libspdm_session_info_t *session_info;
     234              :             uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
     235              : 
     236            0 :             message_session_id = NULL;
     237            0 :             session_id = 0xFFFFFFFF;
     238              : 
     239            0 :             session_info = libspdm_get_session_info_via_session_id(
     240              :                 spdm_context, session_id);
     241            0 :             if (session_info == NULL) {
     242            0 :                 return LIBSPDM_STATUS_SEND_FAIL;
     243              :             }
     244              : 
     245            0 :             memcpy(message_buffer, request, request_size);
     246              : 
     247              :             ((libspdm_secured_message_context_t
     248            0 :               *)(session_info->secured_message_context))
     249            0 :             ->application_secret.request_data_sequence_number--;
     250            0 :             libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message,
     251              :                                         &decoded_message_size);
     252            0 :             status = libspdm_transport_test_decode_message(spdm_context,
     253              :                                                            &message_session_id, &is_app_message,
     254              :                                                            true,
     255              :                                                            request_size,
     256              :                                                            message_buffer, &decoded_message_size,
     257              :                                                            (void **)&decoded_message);
     258            0 :             if (LIBSPDM_STATUS_IS_ERROR(status)) {
     259            0 :                 return LIBSPDM_STATUS_SEND_FAIL;
     260              :             }
     261              : 
     262            0 :             m_libspdm_last_token = ((spdm_key_update_request_t
     263            0 :                                      *) decoded_message)->header.param2;
     264              :         }
     265              : 
     266            1 :         sub_index++;
     267              :     }
     268            1 :         return LIBSPDM_STATUS_SUCCESS;
     269            1 :     case 0x5: {
     270              :         static size_t sub_index = 0;
     271              : 
     272            1 :         if(sub_index > 0) {
     273              :             libspdm_return_t status;
     274              :             uint8_t *decoded_message;
     275              :             size_t decoded_message_size;
     276              :             uint32_t session_id;
     277              :             uint32_t              *message_session_id;
     278              :             bool is_app_message;
     279              :             libspdm_session_info_t *session_info;
     280              :             uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
     281              : 
     282            0 :             message_session_id = NULL;
     283            0 :             session_id = 0xFFFFFFFF;
     284              : 
     285            0 :             session_info = libspdm_get_session_info_via_session_id(
     286              :                 spdm_context, session_id);
     287            0 :             if (session_info == NULL) {
     288            0 :                 return LIBSPDM_STATUS_SEND_FAIL;
     289              :             }
     290              : 
     291            0 :             memcpy(message_buffer, request, request_size);
     292              : 
     293              :             ((libspdm_secured_message_context_t
     294            0 :               *)(session_info->secured_message_context))
     295            0 :             ->application_secret.request_data_sequence_number--;
     296            0 :             libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message,
     297              :                                         &decoded_message_size);
     298            0 :             status = libspdm_transport_test_decode_message(spdm_context,
     299              :                                                            &message_session_id, &is_app_message,
     300              :                                                            true,
     301              :                                                            request_size,
     302              :                                                            message_buffer, &decoded_message_size,
     303              :                                                            (void **)&decoded_message);
     304            0 :             if (LIBSPDM_STATUS_IS_ERROR(status)) {
     305            0 :                 return LIBSPDM_STATUS_SEND_FAIL;
     306              :             }
     307              : 
     308            0 :             m_libspdm_last_token = ((spdm_key_update_request_t
     309            0 :                                      *) decoded_message)->header.param2;
     310              :         }
     311              : 
     312            1 :         sub_index++;
     313              :     }
     314            1 :         return LIBSPDM_STATUS_SUCCESS;
     315            3 :     case 0x6: {
     316              :         static size_t sub_index = 0;
     317              : 
     318            3 :         if(sub_index > 0) {
     319              :             libspdm_return_t status;
     320              :             uint8_t *decoded_message;
     321              :             size_t decoded_message_size;
     322              :             uint32_t session_id;
     323              :             uint32_t              *message_session_id;
     324              :             bool is_app_message;
     325              :             libspdm_session_info_t *session_info;
     326              :             uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
     327              : 
     328            2 :             message_session_id = NULL;
     329            2 :             session_id = 0xFFFFFFFF;
     330              : 
     331            2 :             session_info = libspdm_get_session_info_via_session_id(
     332              :                 spdm_context, session_id);
     333            2 :             if (session_info == NULL) {
     334            0 :                 return LIBSPDM_STATUS_SEND_FAIL;
     335              :             }
     336              : 
     337            2 :             memcpy(message_buffer, request, request_size);
     338              : 
     339              :             ((libspdm_secured_message_context_t
     340            2 :               *)(session_info->secured_message_context))
     341            2 :             ->application_secret.request_data_sequence_number--;
     342            2 :             libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message,
     343              :                                         &decoded_message_size);
     344            2 :             status = libspdm_transport_test_decode_message(spdm_context,
     345              :                                                            &message_session_id, &is_app_message,
     346              :                                                            true,
     347              :                                                            request_size,
     348              :                                                            message_buffer, &decoded_message_size,
     349              :                                                            (void **)&decoded_message);
     350            2 :             if (LIBSPDM_STATUS_IS_ERROR(status)) {
     351            0 :                 return LIBSPDM_STATUS_SEND_FAIL;
     352              :             }
     353              : 
     354            2 :             m_libspdm_last_token = ((spdm_key_update_request_t
     355            2 :                                      *) decoded_message)->header.param2;
     356              :         }
     357              : 
     358            3 :         sub_index++;
     359              :     }
     360            3 :         return LIBSPDM_STATUS_SUCCESS;
     361            3 :     case 0x7:
     362              :     case 0x8:
     363            3 :         return LIBSPDM_STATUS_SUCCESS;
     364            3 :     case 0x9: {
     365              :         static size_t sub_index = 0;
     366              : 
     367            3 :         if(sub_index != 1) {
     368              :             libspdm_return_t status;
     369              :             uint8_t *decoded_message;
     370              :             size_t decoded_message_size;
     371              :             uint32_t session_id;
     372              :             uint32_t *message_session_id;
     373              :             bool is_app_message;
     374              :             libspdm_session_info_t    *session_info;
     375              :             uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
     376              : 
     377            2 :             message_session_id = NULL;
     378            2 :             session_id = 0xFFFFFFFF;
     379              : 
     380            2 :             session_info = libspdm_get_session_info_via_session_id(
     381              :                 spdm_context, session_id);
     382            2 :             if (session_info == NULL) {
     383            0 :                 return LIBSPDM_STATUS_SEND_FAIL;
     384              :             }
     385              : 
     386            2 :             memcpy(message_buffer, request, request_size);
     387              : 
     388              :             ((libspdm_secured_message_context_t
     389            2 :               *)(session_info->secured_message_context))
     390            2 :             ->application_secret.request_data_sequence_number--;
     391            2 :             libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message,
     392              :                                         &decoded_message_size);
     393            2 :             status = libspdm_transport_test_decode_message(spdm_context,
     394              :                                                            &message_session_id, &is_app_message,
     395              :                                                            true,
     396              :                                                            request_size,
     397              :                                                            message_buffer, &decoded_message_size,
     398              :                                                            (void **)&decoded_message);
     399            2 :             if (LIBSPDM_STATUS_IS_ERROR(status)) {
     400            0 :                 return LIBSPDM_STATUS_SEND_FAIL;
     401              :             }
     402              : 
     403            2 :             m_libspdm_last_token = ((spdm_key_update_request_t
     404            2 :                                      *) decoded_message)->header.param2;
     405              :         }
     406              : 
     407            3 :         sub_index++;
     408              :     }
     409            3 :         return LIBSPDM_STATUS_SUCCESS;
     410           17 :     case 0xA:
     411           17 :         return LIBSPDM_STATUS_SUCCESS;
     412           20 :     case 0xB:
     413              :     case 0xC:
     414              :     case 0xD:
     415              :     case 0xE:
     416              :     case 0xF:
     417              :     case 0x10:
     418              :     case 0x11:
     419              :     case 0x12:
     420              :     case 0x13:
     421              :     case 0x14:
     422              :     case 0x15: {
     423              :         libspdm_return_t status;
     424              :         uint8_t *decoded_message;
     425              :         size_t decoded_message_size;
     426              :         uint32_t session_id;
     427              :         uint32_t              *message_session_id;
     428              :         bool is_app_message;
     429              :         libspdm_session_info_t *session_info;
     430              :         uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
     431              : 
     432           20 :         message_session_id = NULL;
     433           20 :         session_id = 0xFFFFFFFF;
     434              : 
     435           20 :         session_info = libspdm_get_session_info_via_session_id(
     436              :             spdm_context, session_id);
     437           20 :         if (session_info == NULL) {
     438            0 :             return LIBSPDM_STATUS_SEND_FAIL;
     439              :         }
     440              : 
     441           20 :         memcpy(message_buffer, request, request_size);
     442              : 
     443              :         ((libspdm_secured_message_context_t
     444           20 :           *)(session_info->secured_message_context))
     445           20 :         ->application_secret.request_data_sequence_number--;
     446           20 :         libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message, &decoded_message_size);
     447           20 :         status = libspdm_transport_test_decode_message(spdm_context,
     448              :                                                        &message_session_id, &is_app_message, true,
     449              :                                                        request_size,
     450              :                                                        message_buffer, &decoded_message_size,
     451              :                                                        (void **)&decoded_message);
     452           20 :         if (LIBSPDM_STATUS_IS_ERROR(status)) {
     453            0 :             return LIBSPDM_STATUS_SEND_FAIL;
     454              :         }
     455              : 
     456           20 :         m_libspdm_last_token = ((spdm_key_update_request_t
     457           20 :                                  *) decoded_message)->header.param2;
     458              :     }
     459           20 :         return LIBSPDM_STATUS_SUCCESS;
     460            3 :     case 0x16: {
     461              :         static size_t sub_index = 0;
     462              : 
     463            3 :         if(sub_index < 2) {
     464              :             libspdm_return_t status;
     465              :             uint8_t *decoded_message;
     466              :             size_t decoded_message_size;
     467              :             uint32_t session_id;
     468              :             uint32_t *message_session_id;
     469              :             bool is_app_message;
     470              :             libspdm_session_info_t    *session_info;
     471              :             uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
     472              : 
     473            2 :             message_session_id = NULL;
     474            2 :             session_id = 0xFFFFFFFF;
     475              : 
     476            2 :             session_info = libspdm_get_session_info_via_session_id(
     477              :                 spdm_context, session_id);
     478            2 :             if (session_info == NULL) {
     479            0 :                 return LIBSPDM_STATUS_SEND_FAIL;
     480              :             }
     481              : 
     482            2 :             memcpy(message_buffer, request, request_size);
     483              : 
     484              :             ((libspdm_secured_message_context_t
     485            2 :               *)(session_info->secured_message_context))
     486            2 :             ->application_secret.request_data_sequence_number--;
     487            2 :             libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message,
     488              :                                         &decoded_message_size);
     489            2 :             status = libspdm_transport_test_decode_message(spdm_context,
     490              :                                                            &message_session_id, &is_app_message,
     491              :                                                            true,
     492              :                                                            request_size,
     493              :                                                            message_buffer, &decoded_message_size,
     494              :                                                            (void **)&decoded_message);
     495            2 :             if (LIBSPDM_STATUS_IS_ERROR(status)) {
     496            0 :                 return LIBSPDM_STATUS_SEND_FAIL;
     497              :             }
     498              : 
     499            2 :             m_libspdm_last_token = ((spdm_key_update_request_t
     500            2 :                                      *) decoded_message)->header.param2;
     501              :         }
     502              : 
     503            3 :         sub_index++;
     504              :     }
     505            3 :         return LIBSPDM_STATUS_SUCCESS;
     506           34 :     case 0x17: {
     507              :         static size_t sub_index = 0;
     508              : 
     509           34 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "send message: %zu\n", sub_index));
     510              : 
     511           34 :         if(sub_index%2 == 0) {
     512              :             libspdm_return_t status;
     513              :             uint8_t *decoded_message;
     514              :             size_t decoded_message_size;
     515              :             uint32_t session_id;
     516              :             uint32_t *message_session_id;
     517              :             bool is_app_message;
     518              :             libspdm_session_info_t    *session_info;
     519              :             uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
     520              : 
     521           17 :             message_session_id = NULL;
     522           17 :             session_id = 0xFFFFFFFF;
     523              : 
     524           17 :             session_info = libspdm_get_session_info_via_session_id(
     525              :                 spdm_context, session_id);
     526           17 :             if (session_info == NULL) {
     527            0 :                 return LIBSPDM_STATUS_SEND_FAIL;
     528              :             }
     529              : 
     530           17 :             memcpy(message_buffer, request, request_size);
     531              : 
     532              :             ((libspdm_secured_message_context_t
     533           17 :               *)(session_info->secured_message_context))
     534           17 :             ->application_secret.request_data_sequence_number--;
     535           17 :             libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message,
     536              :                                         &decoded_message_size);
     537           17 :             status = libspdm_transport_test_decode_message(spdm_context,
     538              :                                                            &message_session_id, &is_app_message,
     539              :                                                            true,
     540              :                                                            request_size,
     541              :                                                            message_buffer, &decoded_message_size,
     542              :                                                            (void **)&decoded_message);
     543           17 :             if (LIBSPDM_STATUS_IS_ERROR(status)) {
     544            0 :                 return LIBSPDM_STATUS_SEND_FAIL;
     545              :             }
     546              : 
     547           17 :             m_libspdm_last_token = ((spdm_key_update_request_t
     548           17 :                                      *) decoded_message)->header.param2;
     549              : 
     550           17 :             LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "last token: %x\n", m_libspdm_last_token));
     551              :         }
     552              : 
     553           34 :         sub_index++;
     554              :     }
     555           34 :         return LIBSPDM_STATUS_SUCCESS;
     556            6 :     case 0x18:
     557              :     case 0x19:
     558              :     case 0x1A: {
     559              :         libspdm_return_t status;
     560              :         uint8_t *decoded_message;
     561              :         size_t decoded_message_size;
     562              :         uint32_t session_id;
     563              :         uint32_t              *message_session_id;
     564              :         bool is_app_message;
     565              :         libspdm_session_info_t *session_info;
     566              :         uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
     567              : 
     568            6 :         message_session_id = NULL;
     569            6 :         session_id = 0xFFFFFFFF;
     570              : 
     571            6 :         session_info = libspdm_get_session_info_via_session_id(
     572              :             spdm_context, session_id);
     573            6 :         if (session_info == NULL) {
     574            0 :             return LIBSPDM_STATUS_SEND_FAIL;
     575              :         }
     576              : 
     577            6 :         memcpy(message_buffer, request, request_size);
     578              : 
     579              :         ((libspdm_secured_message_context_t
     580            6 :           *)(session_info->secured_message_context))
     581            6 :         ->application_secret.request_data_sequence_number--;
     582            6 :         libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message, &decoded_message_size);
     583            6 :         status = libspdm_transport_test_decode_message(spdm_context,
     584              :                                                        &message_session_id, &is_app_message, true,
     585              :                                                        request_size,
     586              :                                                        message_buffer, &decoded_message_size,
     587              :                                                        (void **)&decoded_message);
     588            6 :         if (LIBSPDM_STATUS_IS_ERROR(status)) {
     589            0 :             return LIBSPDM_STATUS_SEND_FAIL;
     590              :         }
     591              : 
     592            6 :         m_libspdm_last_token = ((spdm_key_update_request_t
     593            6 :                                  *) decoded_message)->header.param2;
     594              :     }
     595            6 :         return LIBSPDM_STATUS_SUCCESS;
     596            2 :     case 0x1B: {
     597              :         libspdm_return_t status;
     598              :         uint8_t *decoded_message;
     599              :         size_t decoded_message_size;
     600              :         uint32_t session_id;
     601              :         uint32_t              *message_session_id;
     602              :         bool is_app_message;
     603              :         libspdm_session_info_t *session_info;
     604              :         uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
     605              : 
     606            2 :         message_session_id = NULL;
     607            2 :         session_id = 0xFFFFFFFF;
     608              : 
     609            2 :         session_info = libspdm_get_session_info_via_session_id(
     610              :             spdm_context, session_id);
     611            2 :         if (session_info == NULL) {
     612            0 :             return LIBSPDM_STATUS_SEND_FAIL;
     613              :         }
     614              : 
     615            2 :         memcpy(message_buffer, request, request_size);
     616              : 
     617              :         ((libspdm_secured_message_context_t
     618            2 :           *)(session_info->secured_message_context))
     619            2 :         ->application_secret.request_data_sequence_number--;
     620            2 :         libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message, &decoded_message_size);
     621            2 :         status = libspdm_transport_test_decode_message(spdm_context,
     622              :                                                        &message_session_id, &is_app_message, true,
     623              :                                                        request_size,
     624              :                                                        message_buffer, &decoded_message_size,
     625              :                                                        (void **)&decoded_message);
     626            2 :         if (LIBSPDM_STATUS_IS_ERROR(status)) {
     627            0 :             return LIBSPDM_STATUS_SEND_FAIL;
     628              :         }
     629              : 
     630            2 :         m_libspdm_last_token = ((spdm_key_update_request_t
     631            2 :                                  *) decoded_message)->header.param2;
     632              :     }
     633            2 :         return LIBSPDM_STATUS_SUCCESS;
     634            1 :     case 0x1C: {
     635              :         static size_t sub_index = 0;
     636              : 
     637            1 :         if(sub_index > 0) {
     638              :             libspdm_return_t status;
     639              :             uint8_t *decoded_message;
     640              :             size_t decoded_message_size;
     641              :             uint32_t session_id;
     642              :             uint32_t              *message_session_id;
     643              :             bool is_app_message;
     644              :             libspdm_session_info_t *session_info;
     645              :             uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
     646              : 
     647            0 :             message_session_id = NULL;
     648            0 :             session_id = 0xFFFFFFFF;
     649              : 
     650            0 :             session_info = libspdm_get_session_info_via_session_id(
     651              :                 spdm_context, session_id);
     652            0 :             if (session_info == NULL) {
     653            0 :                 return LIBSPDM_STATUS_SEND_FAIL;
     654              :             }
     655              : 
     656            0 :             memcpy(message_buffer, request, request_size);
     657              : 
     658              :             ((libspdm_secured_message_context_t
     659            0 :               *)(session_info->secured_message_context))
     660            0 :             ->application_secret.request_data_sequence_number--;
     661            0 :             libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message,
     662              :                                         &decoded_message_size);
     663            0 :             status = libspdm_transport_test_decode_message(spdm_context,
     664              :                                                            &message_session_id, &is_app_message,
     665              :                                                            true,
     666              :                                                            request_size,
     667              :                                                            message_buffer, &decoded_message_size,
     668              :                                                            (void **)&decoded_message);
     669            0 :             if (LIBSPDM_STATUS_IS_ERROR(status)) {
     670            0 :                 return LIBSPDM_STATUS_SEND_FAIL;
     671              :             }
     672              : 
     673            0 :             m_libspdm_last_token = ((spdm_key_update_request_t
     674            0 :                                      *) decoded_message)->header.param2;
     675              :         }
     676              : 
     677            1 :         sub_index++;
     678              :     }
     679            1 :         return LIBSPDM_STATUS_SUCCESS;
     680            4 :     case 0x1D: {
     681              :         static size_t sub_index = 0;
     682              : 
     683            4 :         if(sub_index > 0) {
     684              :             libspdm_return_t status;
     685              :             uint8_t *decoded_message;
     686              :             size_t decoded_message_size;
     687              :             uint32_t session_id;
     688              :             uint32_t              *message_session_id;
     689              :             bool is_app_message;
     690              :             libspdm_session_info_t *session_info;
     691              :             uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
     692              : 
     693            3 :             message_session_id = NULL;
     694            3 :             session_id = 0xFFFFFFFF;
     695              : 
     696            3 :             session_info = libspdm_get_session_info_via_session_id(
     697              :                 spdm_context, session_id);
     698            3 :             if (session_info == NULL) {
     699            0 :                 return LIBSPDM_STATUS_SEND_FAIL;
     700              :             }
     701              : 
     702            3 :             memcpy(message_buffer, request, request_size);
     703              : 
     704              :             ((libspdm_secured_message_context_t
     705            3 :               *)(session_info->secured_message_context))
     706            3 :             ->application_secret.request_data_sequence_number--;
     707            3 :             libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message,
     708              :                                         &decoded_message_size);
     709            3 :             status = libspdm_transport_test_decode_message(spdm_context,
     710              :                                                            &message_session_id, &is_app_message,
     711              :                                                            true,
     712              :                                                            request_size,
     713              :                                                            message_buffer, &decoded_message_size,
     714              :                                                            (void **)&decoded_message);
     715            3 :             if (LIBSPDM_STATUS_IS_ERROR(status)) {
     716            0 :                 return LIBSPDM_STATUS_SEND_FAIL;
     717              :             }
     718              : 
     719            3 :             m_libspdm_last_token = ((spdm_key_update_request_t
     720            3 :                                      *) decoded_message)->header.param2;
     721              :         }
     722              : 
     723            4 :         sub_index++;
     724              :     }
     725            4 :         return LIBSPDM_STATUS_SUCCESS;
     726            3 :     case 0x1E: {
     727              :         static size_t sub_index = 0;
     728              : 
     729            3 :         if(sub_index > 0) {
     730              :             libspdm_return_t status;
     731              :             uint8_t *decoded_message;
     732              :             size_t decoded_message_size;
     733              :             uint32_t session_id;
     734              :             uint32_t              *message_session_id;
     735              :             bool is_app_message;
     736              :             libspdm_session_info_t *session_info;
     737              :             uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
     738              : 
     739            2 :             message_session_id = NULL;
     740            2 :             session_id = 0xFFFFFFFF;
     741              : 
     742            2 :             session_info = libspdm_get_session_info_via_session_id(
     743              :                 spdm_context, session_id);
     744            2 :             if (session_info == NULL) {
     745            0 :                 return LIBSPDM_STATUS_SEND_FAIL;
     746              :             }
     747              : 
     748            2 :             memcpy(message_buffer, request, request_size);
     749              : 
     750              :             ((libspdm_secured_message_context_t
     751            2 :               *)(session_info->secured_message_context))
     752            2 :             ->application_secret.request_data_sequence_number--;
     753            2 :             libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message,
     754              :                                         &decoded_message_size);
     755            2 :             status = libspdm_transport_test_decode_message(spdm_context,
     756              :                                                            &message_session_id, &is_app_message,
     757              :                                                            true,
     758              :                                                            request_size,
     759              :                                                            message_buffer, &decoded_message_size,
     760              :                                                            (void **)&decoded_message);
     761            2 :             if (LIBSPDM_STATUS_IS_ERROR(status)) {
     762            0 :                 return LIBSPDM_STATUS_SEND_FAIL;
     763              :             }
     764              : 
     765            2 :             m_libspdm_last_token = ((spdm_key_update_request_t
     766            2 :                                      *) decoded_message)->header.param2;
     767              :         }
     768              : 
     769            3 :         sub_index++;
     770              :     }
     771            3 :         return LIBSPDM_STATUS_SUCCESS;
     772            3 :     case 0x1F:
     773              :     case 0x20:
     774            3 :         return LIBSPDM_STATUS_SUCCESS;
     775            3 :     case 0x21: {
     776              :         static size_t sub_index = 0;
     777              : 
     778            3 :         if(sub_index != 1) {
     779              :             libspdm_return_t status;
     780              :             uint8_t *decoded_message;
     781              :             size_t decoded_message_size;
     782              :             uint32_t session_id;
     783              :             uint32_t *message_session_id;
     784              :             bool is_app_message;
     785              :             libspdm_session_info_t    *session_info;
     786              :             uint8_t message_buffer[LIBSPDM_SENDER_BUFFER_SIZE];
     787              : 
     788            2 :             message_session_id = NULL;
     789            2 :             session_id = 0xFFFFFFFF;
     790              : 
     791            2 :             session_info = libspdm_get_session_info_via_session_id(
     792              :                 spdm_context, session_id);
     793            2 :             if (session_info == NULL) {
     794            0 :                 return LIBSPDM_STATUS_SEND_FAIL;
     795              :             }
     796              : 
     797            2 :             memcpy(message_buffer, request, request_size);
     798              : 
     799              :             ((libspdm_secured_message_context_t
     800            2 :               *)(session_info->secured_message_context))
     801            2 :             ->application_secret.request_data_sequence_number--;
     802            2 :             libspdm_get_scratch_buffer (spdm_context, (void **)&decoded_message,
     803              :                                         &decoded_message_size);
     804            2 :             status = libspdm_transport_test_decode_message(spdm_context,
     805              :                                                            &message_session_id, &is_app_message,
     806              :                                                            true,
     807              :                                                            request_size,
     808              :                                                            message_buffer, &decoded_message_size,
     809              :                                                            (void **)&decoded_message);
     810            2 :             if (LIBSPDM_STATUS_IS_ERROR(status)) {
     811            0 :                 return LIBSPDM_STATUS_SEND_FAIL;
     812              :             }
     813              : 
     814            2 :             m_libspdm_last_token = ((spdm_key_update_request_t
     815            2 :                                      *) decoded_message)->header.param2;
     816              :         }
     817              : 
     818            3 :         sub_index++;
     819              :     }
     820            3 :         return LIBSPDM_STATUS_SUCCESS;
     821           17 :     case 0x22:
     822           17 :         return LIBSPDM_STATUS_SUCCESS;
     823            1 :     case 0x23:
     824            1 :         return LIBSPDM_STATUS_SUCCESS;
     825            0 :     default:
     826            0 :         return LIBSPDM_STATUS_SEND_FAIL;
     827              :     }
     828              : }
     829              : 
     830          127 : static libspdm_return_t receive_message(
     831              :     void *spdm_context, size_t *response_size, void **response, uint64_t timeout)
     832              : {
     833              :     libspdm_test_context_t *spdm_test_context;
     834              : 
     835          127 :     spdm_test_context = libspdm_get_test_context();
     836          127 :     switch (spdm_test_context->case_id) {
     837            0 :     case 0x1:
     838            0 :         return LIBSPDM_STATUS_RECEIVE_FAIL;
     839              : 
     840            2 :     case 0x2: {
     841              :         static size_t sub_index = 0;
     842              : 
     843              :         spdm_key_update_response_t *spdm_response;
     844              :         size_t spdm_response_size;
     845              :         size_t transport_header_size;
     846              :         uint32_t session_id;
     847              :         libspdm_session_info_t        *session_info;
     848              :         uint8_t *scratch_buffer;
     849              :         size_t scratch_buffer_size;
     850              : 
     851            2 :         spdm_response_size = sizeof(spdm_key_update_response_t);
     852            2 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     853            2 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     854              : 
     855            2 :         session_id = 0xFFFFFFFF;
     856              : 
     857            2 :         session_info = libspdm_get_session_info_via_session_id(
     858              :             spdm_context, session_id);
     859            2 :         if (session_info == NULL) {
     860            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
     861              :         }
     862              : 
     863            2 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     864            2 :         spdm_response->header.request_response_code =
     865              :             SPDM_KEY_UPDATE_ACK;
     866            2 :         if (sub_index == 0) {
     867            1 :             spdm_response->header.param1 =
     868              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
     869            1 :             spdm_response->header.param2 = m_libspdm_last_token;
     870            1 :         } else if (sub_index == 1) {
     871            1 :             spdm_response->header.param1 =
     872              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
     873            1 :             spdm_response->header.param2 = m_libspdm_last_token;
     874              :         }
     875              : 
     876              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
     877              :          * transport_message is always in sender buffer. */
     878            2 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
     879            2 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
     880              :                           scratch_buffer_size - transport_header_size,
     881              :                           spdm_response, spdm_response_size);
     882            2 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
     883            2 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
     884              :                                               false, false, spdm_response_size,
     885              :                                               spdm_response, response_size, response);
     886              :         /* WALKAROUND: If just use single context to encode
     887              :          * message and then decode message */
     888              :         ((libspdm_secured_message_context_t
     889            2 :           *)(session_info->secured_message_context))
     890            2 :         ->application_secret.response_data_sequence_number--;
     891              : 
     892            2 :         sub_index++;
     893              :     }
     894            2 :         return LIBSPDM_STATUS_SUCCESS;
     895              : 
     896            0 :     case 0x3: {
     897              :         static size_t sub_index = 0;
     898              : 
     899              :         spdm_key_update_response_t *spdm_response;
     900              :         size_t spdm_response_size;
     901              :         size_t transport_header_size;
     902              :         uint32_t session_id;
     903              :         libspdm_session_info_t        *session_info;
     904              :         uint8_t *scratch_buffer;
     905              :         size_t scratch_buffer_size;
     906              : 
     907            0 :         spdm_response_size = sizeof(spdm_key_update_response_t);
     908            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     909            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     910              : 
     911            0 :         session_id = 0xFFFFFFFF;
     912              : 
     913            0 :         session_info = libspdm_get_session_info_via_session_id(
     914              :             spdm_context, session_id);
     915            0 :         if (session_info == NULL) {
     916            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
     917              :         }
     918              : 
     919            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     920            0 :         spdm_response->header.request_response_code =
     921              :             SPDM_KEY_UPDATE_ACK;
     922            0 :         if (sub_index == 0) {
     923            0 :             spdm_response->header.param1 =
     924              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
     925            0 :             spdm_response->header.param2 = m_libspdm_last_token;
     926            0 :         } else if (sub_index == 1) {
     927            0 :             spdm_response->header.param1 =
     928              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
     929            0 :             spdm_response->header.param2 = m_libspdm_last_token;
     930              :         }
     931              : 
     932              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
     933              :          * transport_message is always in sender buffer. */
     934            0 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
     935            0 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
     936              :                           scratch_buffer_size - transport_header_size,
     937              :                           spdm_response, spdm_response_size);
     938            0 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
     939            0 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
     940              :                                               false, false, spdm_response_size,
     941              :                                               spdm_response, response_size, response);
     942              :         /* WALKAROUND: If just use single context to encode
     943              :          * message and then decode message */
     944              :         ((libspdm_secured_message_context_t
     945            0 :           *)(session_info->secured_message_context))
     946            0 :         ->application_secret.response_data_sequence_number--;
     947              : 
     948            0 :         sub_index++;
     949              :     }
     950            0 :         return LIBSPDM_STATUS_SUCCESS;
     951              : 
     952            1 :     case 0x4: {
     953              :         spdm_error_response_t *spdm_response;
     954              :         size_t spdm_response_size;
     955              :         size_t transport_header_size;
     956              :         uint32_t session_id;
     957              :         libspdm_session_info_t    *session_info;
     958              :         uint8_t *scratch_buffer;
     959              :         size_t scratch_buffer_size;
     960              : 
     961            1 :         spdm_response_size = sizeof(spdm_error_response_t);
     962            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     963            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     964              : 
     965            1 :         session_id = 0xFFFFFFFF;
     966            1 :         session_info = libspdm_get_session_info_via_session_id(
     967              :             spdm_context, session_id);
     968            1 :         if (session_info == NULL) {
     969            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
     970              :         }
     971              : 
     972            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     973            1 :         spdm_response->header.request_response_code = SPDM_ERROR;
     974            1 :         spdm_response->header.param1 = SPDM_ERROR_CODE_INVALID_REQUEST;
     975            1 :         spdm_response->header.param2 = 0;
     976              : 
     977              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
     978              :          * transport_message is always in sender buffer. */
     979            1 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
     980            1 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
     981              :                           scratch_buffer_size - transport_header_size,
     982              :                           spdm_response, spdm_response_size);
     983            1 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
     984            1 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
     985              :                                               false, false, spdm_response_size,
     986              :                                               spdm_response, response_size, response);
     987              :         /* WALKAROUND: If just use single context to encode
     988              :          * message and then decode message */
     989              :         ((libspdm_secured_message_context_t
     990            1 :           *)(session_info->secured_message_context))
     991            1 :         ->application_secret.response_data_sequence_number--;
     992              :     }
     993            1 :         return LIBSPDM_STATUS_SUCCESS;
     994              : 
     995            1 :     case 0x5: {
     996              :         spdm_error_response_t *spdm_response;
     997              :         size_t spdm_response_size;
     998              :         size_t transport_header_size;
     999              :         uint32_t session_id;
    1000              :         libspdm_session_info_t    *session_info;
    1001              :         uint8_t *scratch_buffer;
    1002              :         size_t scratch_buffer_size;
    1003              : 
    1004            1 :         spdm_response_size = sizeof(spdm_error_response_t);
    1005            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1006            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1007              : 
    1008            1 :         session_id = 0xFFFFFFFF;
    1009            1 :         session_info = libspdm_get_session_info_via_session_id(
    1010              :             spdm_context, session_id);
    1011            1 :         if (session_info == NULL) {
    1012            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    1013              :         }
    1014              : 
    1015            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1016            1 :         spdm_response->header.request_response_code = SPDM_ERROR;
    1017            1 :         spdm_response->header.param1 = SPDM_ERROR_CODE_BUSY;
    1018            1 :         spdm_response->header.param2 = 0;
    1019              : 
    1020              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    1021              :          * transport_message is always in sender buffer. */
    1022            1 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
    1023            1 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
    1024              :                           scratch_buffer_size - transport_header_size,
    1025              :                           spdm_response, spdm_response_size);
    1026            1 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
    1027            1 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
    1028              :                                               false, false, spdm_response_size,
    1029              :                                               spdm_response, response_size, response);
    1030              :         /* WALKAROUND: If just use single context to encode
    1031              :          * message and then decode message */
    1032              :         ((libspdm_secured_message_context_t
    1033            1 :           *)(session_info->secured_message_context))
    1034            1 :         ->application_secret.response_data_sequence_number--;
    1035              :     }
    1036            1 :         return LIBSPDM_STATUS_SUCCESS;
    1037              : 
    1038            3 :     case 0x6: {
    1039              :         static size_t sub_index = 0;
    1040              : 
    1041              :         uint32_t session_id;
    1042              :         libspdm_session_info_t    *session_info;
    1043              : 
    1044            3 :         session_id = 0xFFFFFFFF;
    1045            3 :         session_info = libspdm_get_session_info_via_session_id(
    1046              :             spdm_context, session_id);
    1047            3 :         if (session_info == NULL) {
    1048            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    1049              :         }
    1050              : 
    1051            3 :         if (sub_index == 0) {
    1052              :             spdm_error_response_t *spdm_response;
    1053              :             size_t spdm_response_size;
    1054              :             size_t transport_header_size;
    1055              :             uint8_t *scratch_buffer;
    1056              :             size_t scratch_buffer_size;
    1057              : 
    1058            1 :             spdm_response_size = sizeof(spdm_error_response_t);
    1059            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1060            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1061              : 
    1062            1 :             spdm_response->header.spdm_version =
    1063              :                 SPDM_MESSAGE_VERSION_11;
    1064            1 :             spdm_response->header.request_response_code = SPDM_ERROR;
    1065            1 :             spdm_response->header.param1 = SPDM_ERROR_CODE_BUSY;
    1066            1 :             spdm_response->header.param2 = 0;
    1067              : 
    1068              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    1069              :              * transport_message is always in sender buffer. */
    1070            1 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    1071              :                                         &scratch_buffer_size);
    1072            1 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
    1073              :                               scratch_buffer_size - transport_header_size,
    1074              :                               spdm_response, spdm_response_size);
    1075            1 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
    1076            1 :             libspdm_transport_test_encode_message(spdm_context,
    1077              :                                                   &session_id, false, false,
    1078              :                                                   spdm_response_size, spdm_response,
    1079              :                                                   response_size, response);
    1080              :             /* WALKAROUND: If just use single context to encode
    1081              :              * message and then decode message */
    1082              :             ((libspdm_secured_message_context_t
    1083            1 :               *)(session_info->secured_message_context))
    1084            1 :             ->application_secret.response_data_sequence_number--;
    1085            2 :         } else if (sub_index == 1) {
    1086              :             spdm_key_update_response_t *spdm_response;
    1087              :             size_t spdm_response_size;
    1088              :             size_t transport_header_size;
    1089              :             uint8_t *scratch_buffer;
    1090              :             size_t scratch_buffer_size;
    1091              : 
    1092            1 :             spdm_response_size = sizeof(spdm_key_update_response_t);
    1093            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1094            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1095              : 
    1096            1 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1097            1 :             spdm_response->header.request_response_code =
    1098              :                 SPDM_KEY_UPDATE_ACK;
    1099            1 :             spdm_response->header.param1 =
    1100              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
    1101            1 :             spdm_response->header.param2 = m_libspdm_last_token;
    1102              : 
    1103              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    1104              :              * transport_message is always in sender buffer. */
    1105            1 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    1106              :                                         &scratch_buffer_size);
    1107            1 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
    1108              :                               scratch_buffer_size - transport_header_size,
    1109              :                               spdm_response, spdm_response_size);
    1110            1 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
    1111            1 :             libspdm_transport_test_encode_message(spdm_context,
    1112              :                                                   &session_id, false, false,
    1113              :                                                   spdm_response_size, spdm_response,
    1114              :                                                   response_size, response);
    1115              :             /* WALKAROUND: If just use single context to encode
    1116              :              * message and then decode message */
    1117              :             ((libspdm_secured_message_context_t
    1118            1 :               *)(session_info->secured_message_context))
    1119            1 :             ->application_secret.response_data_sequence_number--;
    1120            1 :         } else if (sub_index == 2) {
    1121              :             spdm_key_update_response_t *spdm_response;
    1122              :             size_t spdm_response_size;
    1123              :             size_t transport_header_size;
    1124              :             uint8_t *scratch_buffer;
    1125              :             size_t scratch_buffer_size;
    1126              : 
    1127            1 :             spdm_response_size = sizeof(spdm_key_update_response_t);
    1128            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1129            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1130              : 
    1131            1 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1132            1 :             spdm_response->header.request_response_code =
    1133              :                 SPDM_KEY_UPDATE_ACK;
    1134            1 :             spdm_response->header.param1 =
    1135              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
    1136            1 :             spdm_response->header.param2 = m_libspdm_last_token;
    1137              : 
    1138              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    1139              :              * transport_message is always in sender buffer. */
    1140            1 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    1141              :                                         &scratch_buffer_size);
    1142            1 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
    1143              :                               scratch_buffer_size - transport_header_size,
    1144              :                               spdm_response, spdm_response_size);
    1145            1 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
    1146            1 :             libspdm_transport_test_encode_message(spdm_context,
    1147              :                                                   &session_id, false, false,
    1148              :                                                   spdm_response_size, spdm_response,
    1149              :                                                   response_size, response);
    1150              :             /* WALKAROUND: If just use single context to encode
    1151              :              * message and then decode message */
    1152              :             ((libspdm_secured_message_context_t
    1153            1 :               *)(session_info->secured_message_context))
    1154            1 :             ->application_secret.response_data_sequence_number--;
    1155              :         }
    1156              : 
    1157            3 :         sub_index++;
    1158              :     }
    1159            3 :         return LIBSPDM_STATUS_SUCCESS;
    1160              : 
    1161            1 :     case 0x7: {
    1162              :         spdm_error_response_t *spdm_response;
    1163              :         size_t spdm_response_size;
    1164              :         size_t transport_header_size;
    1165              :         uint32_t session_id;
    1166              :         libspdm_session_info_t    *session_info;
    1167              :         uint8_t *scratch_buffer;
    1168              :         size_t scratch_buffer_size;
    1169              : 
    1170            1 :         spdm_response_size = sizeof(spdm_error_response_t);
    1171            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1172            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1173              : 
    1174            1 :         session_id = 0xFFFFFFFF;
    1175            1 :         session_info = libspdm_get_session_info_via_session_id(
    1176              :             spdm_context, session_id);
    1177            1 :         if (session_info == NULL) {
    1178            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    1179              :         }
    1180              : 
    1181            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_10;
    1182            1 :         spdm_response->header.request_response_code = SPDM_ERROR;
    1183            1 :         spdm_response->header.param1 = SPDM_ERROR_CODE_REQUEST_RESYNCH;
    1184            1 :         spdm_response->header.param2 = 0;
    1185              : 
    1186              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    1187              :          * transport_message is always in sender buffer. */
    1188            1 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
    1189            1 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
    1190              :                           scratch_buffer_size - transport_header_size,
    1191              :                           spdm_response, spdm_response_size);
    1192            1 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
    1193            1 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
    1194              :                                               false, false, spdm_response_size,
    1195              :                                               spdm_response, response_size, response);
    1196              :         /* WALKAROUND: If just use single context to encode
    1197              :          * message and then decode message */
    1198              :         ((libspdm_secured_message_context_t
    1199            1 :           *)(session_info->secured_message_context))
    1200            1 :         ->application_secret.response_data_sequence_number--;
    1201              :     }
    1202            1 :         return LIBSPDM_STATUS_SUCCESS;
    1203              : 
    1204            2 :     case 0x8: {
    1205              :         spdm_error_response_data_response_not_ready_t *spdm_response;
    1206              :         size_t spdm_response_size;
    1207              :         size_t transport_header_size;
    1208              :         uint32_t session_id;
    1209              :         libspdm_session_info_t    *session_info;
    1210              :         uint8_t *scratch_buffer;
    1211              :         size_t scratch_buffer_size;
    1212              : 
    1213            2 :         spdm_response_size = sizeof(spdm_error_response_data_response_not_ready_t);
    1214            2 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1215            2 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1216              : 
    1217            2 :         session_id = 0xFFFFFFFF;
    1218            2 :         session_info = libspdm_get_session_info_via_session_id(
    1219              :             spdm_context, session_id);
    1220            2 :         if (session_info == NULL) {
    1221            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    1222              :         }
    1223              : 
    1224            2 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1225            2 :         spdm_response->header.request_response_code = SPDM_ERROR;
    1226            2 :         spdm_response->header.param1 =
    1227              :             SPDM_ERROR_CODE_RESPONSE_NOT_READY;
    1228            2 :         spdm_response->header.param2 = 0;
    1229            2 :         spdm_response->extend_error_data.rd_exponent = 1;
    1230            2 :         spdm_response->extend_error_data.rd_tm = 2;
    1231            2 :         spdm_response->extend_error_data.request_code = SPDM_KEY_UPDATE;
    1232            2 :         spdm_response->extend_error_data.token = 0;
    1233              : 
    1234              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    1235              :          * transport_message is always in sender buffer. */
    1236            2 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
    1237            2 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
    1238              :                           scratch_buffer_size - transport_header_size,
    1239              :                           spdm_response, spdm_response_size);
    1240            2 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
    1241            2 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
    1242              :                                               false, false, spdm_response_size,
    1243              :                                               spdm_response, response_size, response);
    1244              :         /* WALKAROUND: If just use single context to encode
    1245              :          * message and then decode message */
    1246              :         ((libspdm_secured_message_context_t
    1247            2 :           *)(session_info->secured_message_context))
    1248            2 :         ->application_secret.response_data_sequence_number--;
    1249              :     }
    1250            2 :         return LIBSPDM_STATUS_SUCCESS;
    1251              : 
    1252            3 :     case 0x9: {
    1253              :         static size_t sub_index = 0;
    1254              : 
    1255              :         uint32_t session_id;
    1256              :         libspdm_session_info_t    *session_info;
    1257              : 
    1258            3 :         session_id = 0xFFFFFFFF;
    1259            3 :         session_info = libspdm_get_session_info_via_session_id(
    1260              :             spdm_context, session_id);
    1261            3 :         if (session_info == NULL) {
    1262            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    1263              :         }
    1264              : 
    1265            3 :         if (sub_index == 0) {
    1266              :             spdm_error_response_data_response_not_ready_t
    1267              :             *spdm_response;
    1268              :             size_t spdm_response_size;
    1269              :             size_t transport_header_size;
    1270              :             uint8_t *scratch_buffer;
    1271              :             size_t scratch_buffer_size;
    1272              : 
    1273            1 :             spdm_response_size = sizeof(spdm_error_response_data_response_not_ready_t);
    1274            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1275            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1276              : 
    1277            1 :             spdm_response->header.spdm_version =
    1278              :                 SPDM_MESSAGE_VERSION_11;
    1279            1 :             spdm_response->header.request_response_code = SPDM_ERROR;
    1280            1 :             spdm_response->header.param1 =
    1281              :                 SPDM_ERROR_CODE_RESPONSE_NOT_READY;
    1282            1 :             spdm_response->header.param2 = 0;
    1283            1 :             spdm_response->extend_error_data.rd_exponent = 1;
    1284            1 :             spdm_response->extend_error_data.rd_tm = 2;
    1285            1 :             spdm_response->extend_error_data.request_code =
    1286              :                 SPDM_KEY_UPDATE;
    1287            1 :             spdm_response->extend_error_data.token = 1;
    1288              : 
    1289              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    1290              :              * transport_message is always in sender buffer. */
    1291            1 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    1292              :                                         &scratch_buffer_size);
    1293            1 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
    1294              :                               scratch_buffer_size - transport_header_size,
    1295              :                               spdm_response, spdm_response_size);
    1296            1 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
    1297            1 :             libspdm_transport_test_encode_message(spdm_context,
    1298              :                                                   &session_id, false, false,
    1299              :                                                   spdm_response_size, spdm_response,
    1300              :                                                   response_size, response);
    1301              :             /* WALKAROUND: If just use single context to encode
    1302              :              * message and then decode message */
    1303              :             ((libspdm_secured_message_context_t
    1304            1 :               *)(session_info->secured_message_context))
    1305            1 :             ->application_secret.response_data_sequence_number--;
    1306            2 :         } else if (sub_index == 1) {
    1307              :             spdm_key_update_response_t *spdm_response;
    1308              :             size_t spdm_response_size;
    1309              :             size_t transport_header_size;
    1310              :             uint8_t *scratch_buffer;
    1311              :             size_t scratch_buffer_size;
    1312              : 
    1313            1 :             spdm_response_size = sizeof(spdm_key_update_response_t);
    1314            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1315            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1316              : 
    1317            1 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1318            1 :             spdm_response->header.request_response_code =
    1319              :                 SPDM_KEY_UPDATE_ACK;
    1320            1 :             spdm_response->header.param1 =
    1321              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
    1322            1 :             spdm_response->header.param2 = m_libspdm_last_token;
    1323              : 
    1324              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    1325              :              * transport_message is always in sender buffer. */
    1326            1 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    1327              :                                         &scratch_buffer_size);
    1328            1 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
    1329              :                               scratch_buffer_size - transport_header_size,
    1330              :                               spdm_response, spdm_response_size);
    1331            1 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
    1332            1 :             libspdm_transport_test_encode_message(spdm_context,
    1333              :                                                   &session_id, false, false,
    1334              :                                                   spdm_response_size, spdm_response,
    1335              :                                                   response_size, response);
    1336              :             /* WALKAROUND: If just use single context to encode
    1337              :              * message and then decode message */
    1338              :             ((libspdm_secured_message_context_t
    1339            1 :               *)(session_info->secured_message_context))
    1340            1 :             ->application_secret.response_data_sequence_number--;
    1341            1 :         } else if (sub_index == 2) {
    1342              :             spdm_key_update_response_t *spdm_response;
    1343              :             size_t spdm_response_size;
    1344              :             size_t transport_header_size;
    1345              :             uint8_t *scratch_buffer;
    1346              :             size_t scratch_buffer_size;
    1347              : 
    1348            1 :             spdm_response_size = sizeof(spdm_key_update_response_t);
    1349            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1350            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1351              : 
    1352            1 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1353            1 :             spdm_response->header.request_response_code =
    1354              :                 SPDM_KEY_UPDATE_ACK;
    1355            1 :             spdm_response->header.param1 =
    1356              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
    1357            1 :             spdm_response->header.param2 = m_libspdm_last_token;
    1358              : 
    1359              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    1360              :              * transport_message is always in sender buffer. */
    1361            1 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    1362              :                                         &scratch_buffer_size);
    1363            1 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
    1364              :                               scratch_buffer_size - transport_header_size,
    1365              :                               spdm_response, spdm_response_size);
    1366            1 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
    1367            1 :             libspdm_transport_test_encode_message(spdm_context,
    1368              :                                                   &session_id, false, false,
    1369              :                                                   spdm_response_size, spdm_response,
    1370              :                                                   response_size, response);
    1371              :             /* WALKAROUND: If just use single context to encode
    1372              :              * message and then decode message */
    1373              :             ((libspdm_secured_message_context_t
    1374            1 :               *)(session_info->secured_message_context))
    1375            1 :             ->application_secret.response_data_sequence_number--;
    1376              :         }
    1377              : 
    1378            3 :         sub_index++;
    1379              :     }
    1380            3 :         return LIBSPDM_STATUS_SUCCESS;
    1381              : 
    1382           17 :     case 0xA: {
    1383              :         static uint16_t error_code = LIBSPDM_ERROR_CODE_RESERVED_00;
    1384              : 
    1385              :         uint32_t session_id;
    1386              :         libspdm_session_info_t    *session_info;
    1387              : 
    1388              :         spdm_error_response_t *spdm_response;
    1389              :         size_t spdm_response_size;
    1390              :         size_t transport_header_size;
    1391              :         uint8_t *scratch_buffer;
    1392              :         size_t scratch_buffer_size;
    1393              : 
    1394           17 :         spdm_response_size = sizeof(spdm_error_response_t);
    1395           17 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1396           17 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1397              : 
    1398           17 :         session_id = 0xFFFFFFFF;
    1399           17 :         session_info = libspdm_get_session_info_via_session_id(
    1400              :             spdm_context, session_id);
    1401           17 :         if (session_info == NULL) {
    1402            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    1403              :         }
    1404              : 
    1405           17 :         if(error_code <= 0xff) {
    1406              :             /* skip SPDM_ERROR_CODE_DECRYPT_ERROR, because this case will free context*/
    1407           17 :             if(error_code == SPDM_ERROR_CODE_DECRYPT_ERROR) {
    1408            1 :                 error_code++;
    1409              :             }
    1410           17 :             libspdm_zero_mem (spdm_response, spdm_response_size);
    1411           17 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1412           17 :             spdm_response->header.request_response_code = SPDM_ERROR;
    1413           17 :             spdm_response->header.param1 = (uint8_t) error_code;
    1414           17 :             spdm_response->header.param2 = 0;
    1415              : 
    1416              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    1417              :              * transport_message is always in sender buffer. */
    1418           17 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    1419              :                                         &scratch_buffer_size);
    1420           17 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
    1421              :                               scratch_buffer_size - transport_header_size,
    1422              :                               spdm_response, spdm_response_size);
    1423           17 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
    1424           17 :             libspdm_transport_test_encode_message(spdm_context,
    1425              :                                                   &session_id, false, false,
    1426              :                                                   spdm_response_size, spdm_response,
    1427              :                                                   response_size, response);
    1428              :             /* WALKAROUND: If just use single context to encode
    1429              :              * message and then decode message */
    1430              :             ((libspdm_secured_message_context_t
    1431           17 :               *)(session_info->secured_message_context))
    1432           17 :             ->application_secret.response_data_sequence_number--;
    1433              :         }
    1434              : 
    1435           17 :         error_code++;
    1436              :         /*busy is treated in cases 5 and 6*/
    1437           17 :         if(error_code == SPDM_ERROR_CODE_BUSY) {
    1438            1 :             error_code = SPDM_ERROR_CODE_UNEXPECTED_REQUEST;
    1439              :         }
    1440              :         /*skip some reserved error codes (0d to 3e)*/
    1441           17 :         if(error_code == LIBSPDM_ERROR_CODE_RESERVED_0D) {
    1442            1 :             error_code = LIBSPDM_ERROR_CODE_RESERVED_3F;
    1443              :         }
    1444              :         /*skip response not ready, request resync, and some reserved codes (44 to fc)*/
    1445           17 :         if(error_code == SPDM_ERROR_CODE_RESPONSE_NOT_READY) {
    1446            1 :             error_code = LIBSPDM_ERROR_CODE_RESERVED_FD;
    1447              :         }
    1448              :     }
    1449           17 :         return LIBSPDM_STATUS_SUCCESS;
    1450              : 
    1451            2 :     case 0xB: {
    1452              :         static size_t sub_index = 0;
    1453              : 
    1454              :         spdm_key_update_response_t *spdm_response;
    1455              :         size_t spdm_response_size;
    1456              :         size_t transport_header_size;
    1457              :         uint32_t session_id;
    1458              :         libspdm_session_info_t        *session_info;
    1459              :         uint8_t *scratch_buffer;
    1460              :         size_t scratch_buffer_size;
    1461              : 
    1462            2 :         spdm_response_size = sizeof(spdm_key_update_response_t);
    1463            2 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1464            2 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1465              : 
    1466            2 :         session_id = 0xFFFFFFFF;
    1467              : 
    1468            2 :         session_info = libspdm_get_session_info_via_session_id(
    1469              :             spdm_context, session_id);
    1470            2 :         if (session_info == NULL) {
    1471            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    1472              :         }
    1473              : 
    1474            2 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1475            2 :         spdm_response->header.request_response_code =
    1476              :             SPDM_KEY_UPDATE_ACK;
    1477            2 :         if (sub_index == 0) {
    1478            1 :             spdm_response->header.param1 =
    1479              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
    1480            1 :             spdm_response->header.param2 = m_libspdm_last_token;
    1481            1 :         } else if (sub_index == 1) {
    1482            1 :             spdm_response->header.param1 =
    1483              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
    1484            1 :             spdm_response->header.param2 = m_libspdm_last_token;
    1485              :         }
    1486              : 
    1487              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    1488              :          * transport_message is always in sender buffer. */
    1489            2 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
    1490            2 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
    1491              :                           scratch_buffer_size - transport_header_size,
    1492              :                           spdm_response, spdm_response_size);
    1493            2 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
    1494            2 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
    1495              :                                               false, false, spdm_response_size,
    1496              :                                               spdm_response, response_size, response);
    1497              :         /* WALKAROUND: If just use single context to encode
    1498              :          * message and then decode message */
    1499              :         ((libspdm_secured_message_context_t
    1500            2 :           *)(session_info->secured_message_context))
    1501            2 :         ->application_secret.response_data_sequence_number--;
    1502              : 
    1503            2 :         sub_index++;
    1504              :     }
    1505            2 :         return LIBSPDM_STATUS_SUCCESS;
    1506              : 
    1507            1 :     case 0xC: {
    1508              :         static size_t sub_index = 0;
    1509              : 
    1510              :         spdm_key_update_response_t *spdm_response;
    1511              :         size_t spdm_response_size;
    1512              :         size_t transport_header_size;
    1513              :         uint32_t session_id;
    1514              :         libspdm_session_info_t        *session_info;
    1515              :         uint8_t *scratch_buffer;
    1516              :         size_t scratch_buffer_size;
    1517              : 
    1518            1 :         spdm_response_size = sizeof(spdm_key_update_response_t);
    1519            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1520            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1521              : 
    1522            1 :         session_id = 0xFFFFFFFF;
    1523              : 
    1524            1 :         session_info = libspdm_get_session_info_via_session_id(
    1525              :             spdm_context, session_id);
    1526            1 :         if (session_info == NULL) {
    1527            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    1528              :         }
    1529              : 
    1530            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1531              :         /*wrong response code*/
    1532            1 :         spdm_response->header.request_response_code =
    1533              :             SPDM_KEY_UPDATE;
    1534            1 :         if (sub_index == 0) {
    1535            1 :             spdm_response->header.param1 =
    1536              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
    1537            1 :             spdm_response->header.param2 = m_libspdm_last_token;
    1538            0 :         } else if (sub_index == 1) {
    1539            0 :             spdm_response->header.param1 =
    1540              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
    1541            0 :             spdm_response->header.param2 = m_libspdm_last_token;
    1542              :         }
    1543              : 
    1544              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    1545              :          * transport_message is always in sender buffer. */
    1546            1 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
    1547            1 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
    1548              :                           scratch_buffer_size - transport_header_size,
    1549              :                           spdm_response, spdm_response_size);
    1550            1 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
    1551            1 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
    1552              :                                               false, false, spdm_response_size,
    1553              :                                               spdm_response, response_size, response);
    1554              :         /* WALKAROUND: If just use single context to encode
    1555              :          * message and then decode message */
    1556              :         ((libspdm_secured_message_context_t
    1557            1 :           *)(session_info->secured_message_context))
    1558            1 :         ->application_secret.response_data_sequence_number--;
    1559              : 
    1560            1 :         sub_index++;
    1561              :     }
    1562            1 :         return LIBSPDM_STATUS_SUCCESS;
    1563              : 
    1564            0 :     case 0xD: {
    1565              :         static size_t sub_index = 0;
    1566              : 
    1567              :         spdm_key_update_response_t *spdm_response;
    1568              :         size_t spdm_response_size;
    1569              :         size_t transport_header_size;
    1570              :         uint32_t session_id;
    1571              :         libspdm_session_info_t        *session_info;
    1572              :         uint8_t *scratch_buffer;
    1573              :         size_t scratch_buffer_size;
    1574              : 
    1575            0 :         spdm_response_size = sizeof(spdm_key_update_response_t);
    1576            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1577            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1578              : 
    1579            0 :         session_id = 0xFFFFFFFF;
    1580              : 
    1581            0 :         session_info = libspdm_get_session_info_via_session_id(
    1582              :             spdm_context, session_id);
    1583            0 :         if (session_info == NULL) {
    1584            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    1585              :         }
    1586              : 
    1587            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1588            0 :         spdm_response->header.request_response_code =
    1589              :             SPDM_KEY_UPDATE_ACK;
    1590            0 :         if (sub_index == 0) {
    1591            0 :             spdm_response->header.param1 =
    1592              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
    1593            0 :             spdm_response->header.param2 = m_libspdm_last_token;
    1594            0 :         } else if (sub_index == 1) {
    1595            0 :             spdm_response->header.param1 =
    1596              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
    1597            0 :             spdm_response->header.param2 = m_libspdm_last_token;
    1598              :         }
    1599              : 
    1600              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    1601              :          * transport_message is always in sender buffer. */
    1602            0 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
    1603            0 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
    1604              :                           scratch_buffer_size - transport_header_size,
    1605              :                           spdm_response, spdm_response_size);
    1606            0 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
    1607            0 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
    1608              :                                               false, false, spdm_response_size,
    1609              :                                               spdm_response, response_size, response);
    1610              :         /* WALKAROUND: If just use single context to encode
    1611              :          * message and then decode message */
    1612              :         ((libspdm_secured_message_context_t
    1613            0 :           *)(session_info->secured_message_context))
    1614            0 :         ->application_secret.response_data_sequence_number--;
    1615              : 
    1616            0 :         sub_index++;
    1617              :     }
    1618            0 :         return LIBSPDM_STATUS_SUCCESS;
    1619              : 
    1620            0 :     case 0xE: {
    1621              :         static size_t sub_index = 0;
    1622              : 
    1623              :         spdm_key_update_response_t *spdm_response;
    1624              :         size_t spdm_response_size;
    1625              :         size_t transport_header_size;
    1626              :         uint32_t session_id;
    1627              :         libspdm_session_info_t        *session_info;
    1628              :         uint8_t *scratch_buffer;
    1629              :         size_t scratch_buffer_size;
    1630              : 
    1631            0 :         spdm_response_size = sizeof(spdm_key_update_response_t);
    1632            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1633            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1634              : 
    1635            0 :         session_id = 0xFFFFFFFF;
    1636              : 
    1637            0 :         session_info = libspdm_get_session_info_via_session_id(
    1638              :             spdm_context, session_id);
    1639            0 :         if (session_info == NULL) {
    1640            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    1641              :         }
    1642              : 
    1643            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1644            0 :         spdm_response->header.request_response_code =
    1645              :             SPDM_KEY_UPDATE_ACK;
    1646            0 :         if (sub_index == 0) {
    1647            0 :             spdm_response->header.param1 =
    1648              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
    1649            0 :             spdm_response->header.param2 = m_libspdm_last_token;
    1650            0 :         } else if (sub_index == 1) {
    1651            0 :             spdm_response->header.param1 =
    1652              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
    1653            0 :             spdm_response->header.param2 = m_libspdm_last_token;
    1654              :         }
    1655              : 
    1656              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    1657              :          * transport_message is always in sender buffer. */
    1658            0 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
    1659            0 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
    1660              :                           scratch_buffer_size - transport_header_size,
    1661              :                           spdm_response, spdm_response_size);
    1662            0 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
    1663            0 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
    1664              :                                               false, false, spdm_response_size,
    1665              :                                               spdm_response, response_size, response);
    1666              :         /* WALKAROUND: If just use single context to encode
    1667              :          * message and then decode message */
    1668              :         ((libspdm_secured_message_context_t
    1669            0 :           *)(session_info->secured_message_context))
    1670            0 :         ->application_secret.response_data_sequence_number--;
    1671              : 
    1672            0 :         sub_index++;
    1673              :     }
    1674            0 :         return LIBSPDM_STATUS_SUCCESS;
    1675              : 
    1676            1 :     case 0xF: {
    1677              :         static size_t sub_index = 0;
    1678              : 
    1679              :         spdm_key_update_response_t *spdm_response;
    1680              :         size_t spdm_response_size;
    1681              :         size_t transport_header_size;
    1682              :         uint32_t session_id;
    1683              :         libspdm_session_info_t        *session_info;
    1684              :         uint8_t *scratch_buffer;
    1685              :         size_t scratch_buffer_size;
    1686              : 
    1687            1 :         spdm_response_size = sizeof(spdm_key_update_response_t);
    1688            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1689            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1690              : 
    1691            1 :         session_id = 0xFFFFFFFF;
    1692              : 
    1693            1 :         session_info = libspdm_get_session_info_via_session_id(
    1694              :             spdm_context, session_id);
    1695            1 :         if (session_info == NULL) {
    1696            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    1697              :         }
    1698              : 
    1699            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1700            1 :         spdm_response->header.request_response_code =
    1701              :             SPDM_KEY_UPDATE_ACK;
    1702            1 :         if (sub_index == 0) {
    1703            1 :             spdm_response->header.param1 =
    1704              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
    1705              :             /*wrong token*/
    1706            1 :             spdm_response->header.param2 = m_libspdm_last_token + 1;
    1707            0 :         } else if (sub_index == 1) {
    1708            0 :             spdm_response->header.param1 =
    1709              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
    1710            0 :             spdm_response->header.param2 = m_libspdm_last_token;
    1711              :         }
    1712              : 
    1713              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    1714              :          * transport_message is always in sender buffer. */
    1715            1 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
    1716            1 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
    1717              :                           scratch_buffer_size - transport_header_size,
    1718              :                           spdm_response, spdm_response_size);
    1719            1 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
    1720            1 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
    1721              :                                               false, false, spdm_response_size,
    1722              :                                               spdm_response, response_size, response);
    1723              :         /* WALKAROUND: If just use single context to encode
    1724              :          * message and then decode message */
    1725              :         ((libspdm_secured_message_context_t
    1726            1 :           *)(session_info->secured_message_context))
    1727            1 :         ->application_secret.response_data_sequence_number--;
    1728              : 
    1729            1 :         sub_index++;
    1730              :     }
    1731            1 :         return LIBSPDM_STATUS_SUCCESS;
    1732              : 
    1733            1 :     case 0x10: {
    1734              :         static size_t sub_index = 0;
    1735              : 
    1736              :         spdm_key_update_response_t *spdm_response;
    1737              :         size_t spdm_response_size;
    1738              :         size_t transport_header_size;
    1739              :         uint32_t session_id;
    1740              :         libspdm_session_info_t        *session_info;
    1741              :         uint8_t *scratch_buffer;
    1742              :         size_t scratch_buffer_size;
    1743              : 
    1744            1 :         spdm_response_size = sizeof(spdm_key_update_response_t);
    1745            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1746            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1747              : 
    1748            1 :         session_id = 0xFFFFFFFF;
    1749              : 
    1750            1 :         session_info = libspdm_get_session_info_via_session_id(
    1751              :             spdm_context, session_id);
    1752            1 :         if (session_info == NULL) {
    1753            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    1754              :         }
    1755              : 
    1756            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1757            1 :         spdm_response->header.request_response_code =
    1758              :             SPDM_KEY_UPDATE_ACK;
    1759            1 :         if (sub_index == 0) {
    1760              :             /*wrong operation code*/
    1761            1 :             spdm_response->header.param1 =
    1762              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_ALL_KEYS;
    1763            1 :             spdm_response->header.param2 = m_libspdm_last_token;
    1764            0 :         } else if (sub_index == 1) {
    1765            0 :             spdm_response->header.param1 =
    1766              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
    1767            0 :             spdm_response->header.param2 = m_libspdm_last_token;
    1768              :         }
    1769              : 
    1770              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    1771              :          * transport_message is always in sender buffer. */
    1772            1 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
    1773            1 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
    1774              :                           scratch_buffer_size - transport_header_size,
    1775              :                           spdm_response, spdm_response_size);
    1776            1 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
    1777            1 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
    1778              :                                               false, false, spdm_response_size,
    1779              :                                               spdm_response, response_size, response);
    1780              :         /* WALKAROUND: If just use single context to encode
    1781              :          * message and then decode message */
    1782              :         ((libspdm_secured_message_context_t
    1783            1 :           *)(session_info->secured_message_context))
    1784            1 :         ->application_secret.response_data_sequence_number--;
    1785              : 
    1786            1 :         sub_index++;
    1787              :     }
    1788            1 :         return LIBSPDM_STATUS_SUCCESS;
    1789              : 
    1790            2 :     case 0x11: {
    1791              :         static size_t sub_index = 0;
    1792              : 
    1793              :         uint32_t session_id;
    1794              :         libspdm_session_info_t    *session_info;
    1795              : 
    1796            2 :         session_id = 0xFFFFFFFF;
    1797            2 :         session_info = libspdm_get_session_info_via_session_id(
    1798              :             spdm_context, session_id);
    1799            2 :         if (session_info == NULL) {
    1800            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    1801              :         }
    1802              : 
    1803            2 :         if (sub_index == 0) {
    1804              :             spdm_key_update_response_t *spdm_response;
    1805              :             size_t spdm_response_size;
    1806              :             size_t transport_header_size;
    1807              :             uint8_t *scratch_buffer;
    1808              :             size_t scratch_buffer_size;
    1809              : 
    1810            1 :             spdm_response_size = sizeof(spdm_key_update_response_t);
    1811            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1812            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1813              : 
    1814            1 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1815            1 :             spdm_response->header.request_response_code =
    1816              :                 SPDM_KEY_UPDATE_ACK;
    1817            1 :             spdm_response->header.param1 =
    1818              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
    1819            1 :             spdm_response->header.param2 = m_libspdm_last_token;
    1820              : 
    1821              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    1822              :              * transport_message is always in sender buffer. */
    1823            1 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    1824              :                                         &scratch_buffer_size);
    1825            1 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
    1826              :                               scratch_buffer_size - transport_header_size,
    1827              :                               spdm_response, spdm_response_size);
    1828            1 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
    1829            1 :             libspdm_transport_test_encode_message(spdm_context,
    1830              :                                                   &session_id, false, false,
    1831              :                                                   spdm_response_size, spdm_response,
    1832              :                                                   response_size, response);
    1833              :             /* WALKAROUND: If just use single context to encode
    1834              :              * message and then decode message */
    1835              :             ((libspdm_secured_message_context_t
    1836            1 :               *)(session_info->secured_message_context))
    1837            1 :             ->application_secret.response_data_sequence_number--;
    1838            1 :         } else if (sub_index == 1) {
    1839              :             spdm_error_response_t *spdm_response;
    1840              :             size_t spdm_response_size;
    1841              :             size_t transport_header_size;
    1842              :             uint8_t *scratch_buffer;
    1843              :             size_t scratch_buffer_size;
    1844              : 
    1845            1 :             spdm_response_size = sizeof(spdm_error_response_t);
    1846            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1847            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1848              : 
    1849            1 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1850            1 :             spdm_response->header.request_response_code = SPDM_ERROR;
    1851            1 :             spdm_response->header.param1 = SPDM_ERROR_CODE_INVALID_REQUEST;
    1852            1 :             spdm_response->header.param2 = 0;
    1853              : 
    1854              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    1855              :              * transport_message is always in sender buffer. */
    1856            1 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    1857              :                                         &scratch_buffer_size);
    1858            1 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
    1859              :                               scratch_buffer_size - transport_header_size,
    1860              :                               spdm_response, spdm_response_size);
    1861            1 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
    1862            1 :             libspdm_transport_test_encode_message(spdm_context,
    1863              :                                                   &session_id, false, false,
    1864              :                                                   spdm_response_size, spdm_response,
    1865              :                                                   response_size, response);
    1866              :             /* WALKAROUND: If just use single context to encode
    1867              :              * message and then decode message */
    1868              :             ((libspdm_secured_message_context_t
    1869            1 :               *)(session_info->secured_message_context))
    1870            1 :             ->application_secret.response_data_sequence_number--;
    1871              :         }
    1872              : 
    1873            2 :         sub_index++;
    1874              :     }
    1875            2 :         return LIBSPDM_STATUS_SUCCESS;
    1876              : 
    1877            5 :     case 0x12: {
    1878              :         static size_t sub_index = 0;
    1879              : 
    1880              :         uint32_t session_id;
    1881              :         libspdm_session_info_t    *session_info;
    1882              : 
    1883            5 :         session_id = 0xFFFFFFFF;
    1884            5 :         session_info = libspdm_get_session_info_via_session_id(
    1885              :             spdm_context, session_id);
    1886            5 :         if (session_info == NULL) {
    1887            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    1888              :         }
    1889              : 
    1890            5 :         if (sub_index == 0) {
    1891              :             spdm_key_update_response_t *spdm_response;
    1892              :             size_t spdm_response_size;
    1893              :             size_t transport_header_size;
    1894              :             uint8_t *scratch_buffer;
    1895              :             size_t scratch_buffer_size;
    1896              : 
    1897            1 :             spdm_response_size = sizeof(spdm_key_update_response_t);
    1898            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1899            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1900              : 
    1901            1 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1902            1 :             spdm_response->header.request_response_code =
    1903              :                 SPDM_KEY_UPDATE_ACK;
    1904            1 :             spdm_response->header.param1 =
    1905              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
    1906            1 :             spdm_response->header.param2 = m_libspdm_last_token;
    1907              : 
    1908              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    1909              :              * transport_message is always in sender buffer. */
    1910            1 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    1911              :                                         &scratch_buffer_size);
    1912            1 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
    1913              :                               scratch_buffer_size - transport_header_size,
    1914              :                               spdm_response, spdm_response_size);
    1915            1 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
    1916            1 :             libspdm_transport_test_encode_message(spdm_context,
    1917              :                                                   &session_id, false, false,
    1918              :                                                   spdm_response_size, spdm_response,
    1919              :                                                   response_size, response);
    1920              :             /* WALKAROUND: If just use single context to encode
    1921              :              * message and then decode message */
    1922              :             ((libspdm_secured_message_context_t
    1923            1 :               *)(session_info->secured_message_context))
    1924            1 :             ->application_secret.response_data_sequence_number--;
    1925              :         } else {
    1926              :             spdm_error_response_t *spdm_response;
    1927              :             size_t spdm_response_size;
    1928              :             size_t transport_header_size;
    1929              :             uint8_t *scratch_buffer;
    1930              :             size_t scratch_buffer_size;
    1931              : 
    1932            4 :             spdm_response_size = sizeof(spdm_error_response_t);
    1933            4 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1934            4 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1935              : 
    1936            4 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1937            4 :             spdm_response->header.request_response_code = SPDM_ERROR;
    1938            4 :             spdm_response->header.param1 = SPDM_ERROR_CODE_BUSY;
    1939            4 :             spdm_response->header.param2 = 0;
    1940              : 
    1941              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    1942              :              * transport_message is always in sender buffer. */
    1943            4 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    1944              :                                         &scratch_buffer_size);
    1945            4 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
    1946              :                               scratch_buffer_size - transport_header_size,
    1947              :                               spdm_response, spdm_response_size);
    1948            4 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
    1949            4 :             libspdm_transport_test_encode_message(spdm_context,
    1950              :                                                   &session_id, false, false,
    1951              :                                                   spdm_response_size, spdm_response,
    1952              :                                                   response_size, response);
    1953              :             /* WALKAROUND: If just use single context to encode
    1954              :              * message and then decode message */
    1955              :             ((libspdm_secured_message_context_t
    1956            4 :               *)(session_info->secured_message_context))
    1957            4 :             ->application_secret.response_data_sequence_number--;
    1958              :         }
    1959              : 
    1960            5 :         sub_index++;
    1961              :     }
    1962            5 :         return LIBSPDM_STATUS_SUCCESS;
    1963              : 
    1964            3 :     case 0x13: {
    1965              :         static size_t sub_index = 0;
    1966              : 
    1967              :         uint32_t session_id;
    1968              :         libspdm_session_info_t    *session_info;
    1969              : 
    1970            3 :         session_id = 0xFFFFFFFF;
    1971            3 :         session_info = libspdm_get_session_info_via_session_id(
    1972              :             spdm_context, session_id);
    1973            3 :         if (session_info == NULL) {
    1974            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    1975              :         }
    1976              : 
    1977            3 :         if (sub_index == 0) {
    1978              :             spdm_key_update_response_t *spdm_response;
    1979              :             size_t spdm_response_size;
    1980              :             size_t transport_header_size;
    1981              :             uint8_t *scratch_buffer;
    1982              :             size_t scratch_buffer_size;
    1983              : 
    1984            1 :             spdm_response_size = sizeof(spdm_key_update_response_t);
    1985            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    1986            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    1987              : 
    1988            1 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    1989            1 :             spdm_response->header.request_response_code =
    1990              :                 SPDM_KEY_UPDATE_ACK;
    1991            1 :             spdm_response->header.param1 =
    1992              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
    1993            1 :             spdm_response->header.param2 = m_libspdm_last_token;
    1994              : 
    1995              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    1996              :              * transport_message is always in sender buffer. */
    1997            1 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    1998              :                                         &scratch_buffer_size);
    1999            1 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
    2000              :                               scratch_buffer_size - transport_header_size,
    2001              :                               spdm_response, spdm_response_size);
    2002            1 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
    2003            1 :             libspdm_transport_test_encode_message(spdm_context,
    2004              :                                                   &session_id, false, false,
    2005              :                                                   spdm_response_size, spdm_response,
    2006              :                                                   response_size, response);
    2007              :             /* WALKAROUND: If just use single context to encode
    2008              :              * message and then decode message */
    2009              :             ((libspdm_secured_message_context_t
    2010            1 :               *)(session_info->secured_message_context))
    2011            1 :             ->application_secret.response_data_sequence_number--;
    2012            2 :         } else if (sub_index == 1) {
    2013              :             spdm_error_response_t *spdm_response;
    2014              :             size_t spdm_response_size;
    2015              :             size_t transport_header_size;
    2016              :             uint8_t *scratch_buffer;
    2017              :             size_t scratch_buffer_size;
    2018              : 
    2019            1 :             spdm_response_size = sizeof(spdm_error_response_t);
    2020            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    2021            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    2022              : 
    2023            1 :             spdm_response->header.spdm_version =
    2024              :                 SPDM_MESSAGE_VERSION_11;
    2025            1 :             spdm_response->header.request_response_code = SPDM_ERROR;
    2026            1 :             spdm_response->header.param1 = SPDM_ERROR_CODE_BUSY;
    2027            1 :             spdm_response->header.param2 = 0;
    2028              : 
    2029              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    2030              :              * transport_message is always in sender buffer. */
    2031            1 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    2032              :                                         &scratch_buffer_size);
    2033            1 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
    2034              :                               scratch_buffer_size - transport_header_size,
    2035              :                               spdm_response, spdm_response_size);
    2036            1 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
    2037            1 :             libspdm_transport_test_encode_message(spdm_context,
    2038              :                                                   &session_id, false, false,
    2039              :                                                   spdm_response_size, spdm_response,
    2040              :                                                   response_size, response);
    2041              :             /* WALKAROUND: If just use single context to encode
    2042              :              * message and then decode message */
    2043              :             ((libspdm_secured_message_context_t
    2044            1 :               *)(session_info->secured_message_context))
    2045            1 :             ->application_secret.response_data_sequence_number--;
    2046            1 :         } else if (sub_index == 2) {
    2047              :             spdm_key_update_response_t *spdm_response;
    2048              :             size_t spdm_response_size;
    2049              :             size_t transport_header_size;
    2050              :             uint8_t *scratch_buffer;
    2051              :             size_t scratch_buffer_size;
    2052              : 
    2053            1 :             spdm_response_size = sizeof(spdm_key_update_response_t);
    2054            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    2055            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    2056              : 
    2057            1 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    2058            1 :             spdm_response->header.request_response_code =
    2059              :                 SPDM_KEY_UPDATE_ACK;
    2060            1 :             spdm_response->header.param1 =
    2061              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
    2062            1 :             spdm_response->header.param2 = m_libspdm_last_token;
    2063              : 
    2064              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    2065              :              * transport_message is always in sender buffer. */
    2066            1 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    2067              :                                         &scratch_buffer_size);
    2068            1 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
    2069              :                               scratch_buffer_size - transport_header_size,
    2070              :                               spdm_response, spdm_response_size);
    2071            1 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
    2072            1 :             libspdm_transport_test_encode_message(spdm_context,
    2073              :                                                   &session_id, false, false,
    2074              :                                                   spdm_response_size, spdm_response,
    2075              :                                                   response_size, response);
    2076              :             /* WALKAROUND: If just use single context to encode
    2077              :              * message and then decode message */
    2078              :             ((libspdm_secured_message_context_t
    2079            1 :               *)(session_info->secured_message_context))
    2080            1 :             ->application_secret.response_data_sequence_number--;
    2081              :         }
    2082              : 
    2083            3 :         sub_index++;
    2084              :     }
    2085            3 :         return LIBSPDM_STATUS_SUCCESS;
    2086              : 
    2087            2 :     case 0x14: {
    2088              :         static size_t sub_index = 0;
    2089              : 
    2090              :         uint32_t session_id;
    2091              :         libspdm_session_info_t    *session_info;
    2092              : 
    2093            2 :         session_id = 0xFFFFFFFF;
    2094            2 :         session_info = libspdm_get_session_info_via_session_id(
    2095              :             spdm_context, session_id);
    2096            2 :         if (session_info == NULL) {
    2097            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    2098              :         }
    2099              : 
    2100            2 :         if (sub_index == 0) {
    2101              :             spdm_key_update_response_t *spdm_response;
    2102              :             size_t spdm_response_size;
    2103              :             size_t transport_header_size;
    2104              :             uint8_t *scratch_buffer;
    2105              :             size_t scratch_buffer_size;
    2106              : 
    2107            1 :             spdm_response_size = sizeof(spdm_key_update_response_t);
    2108            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    2109            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    2110              : 
    2111            1 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    2112            1 :             spdm_response->header.request_response_code =
    2113              :                 SPDM_KEY_UPDATE_ACK;
    2114            1 :             spdm_response->header.param1 =
    2115              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
    2116            1 :             spdm_response->header.param2 = m_libspdm_last_token;
    2117              : 
    2118              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    2119              :              * transport_message is always in sender buffer. */
    2120            1 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    2121              :                                         &scratch_buffer_size);
    2122            1 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
    2123              :                               scratch_buffer_size - transport_header_size,
    2124              :                               spdm_response, spdm_response_size);
    2125            1 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
    2126            1 :             libspdm_transport_test_encode_message(spdm_context,
    2127              :                                                   &session_id, false, false,
    2128              :                                                   spdm_response_size, spdm_response,
    2129              :                                                   response_size, response);
    2130              :             /* WALKAROUND: If just use single context to encode
    2131              :              * message and then decode message */
    2132              :             ((libspdm_secured_message_context_t
    2133            1 :               *)(session_info->secured_message_context))
    2134            1 :             ->application_secret.response_data_sequence_number--;
    2135            1 :         } else if (sub_index == 1) {
    2136              :             spdm_error_response_t *spdm_response;
    2137              :             size_t spdm_response_size;
    2138              :             size_t transport_header_size;
    2139              :             uint8_t *scratch_buffer;
    2140              :             size_t scratch_buffer_size;
    2141              : 
    2142            1 :             spdm_response_size = sizeof(spdm_error_response_t);
    2143            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    2144            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    2145              : 
    2146            1 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_10;
    2147            1 :             spdm_response->header.request_response_code = SPDM_ERROR;
    2148            1 :             spdm_response->header.param1 = SPDM_ERROR_CODE_REQUEST_RESYNCH;
    2149            1 :             spdm_response->header.param2 = 0;
    2150              : 
    2151              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    2152              :              * transport_message is always in sender buffer. */
    2153            1 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    2154              :                                         &scratch_buffer_size);
    2155            1 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
    2156              :                               scratch_buffer_size - transport_header_size,
    2157              :                               spdm_response, spdm_response_size);
    2158            1 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
    2159            1 :             libspdm_transport_test_encode_message(spdm_context,
    2160              :                                                   &session_id, false, false,
    2161              :                                                   spdm_response_size, spdm_response,
    2162              :                                                   response_size, response);
    2163              :             /* WALKAROUND: If just use single context to encode
    2164              :              * message and then decode message */
    2165              :             ((libspdm_secured_message_context_t
    2166            1 :               *)(session_info->secured_message_context))
    2167            1 :             ->application_secret.response_data_sequence_number--;
    2168              :         }
    2169              : 
    2170            2 :         sub_index++;
    2171              :     }
    2172            2 :         return LIBSPDM_STATUS_SUCCESS;
    2173              : 
    2174            3 :     case 0x15: {
    2175              :         static size_t sub_index = 0;
    2176              : 
    2177              :         uint32_t session_id;
    2178              :         libspdm_session_info_t    *session_info;
    2179              : 
    2180            3 :         session_id = 0xFFFFFFFF;
    2181            3 :         session_info = libspdm_get_session_info_via_session_id(
    2182              :             spdm_context, session_id);
    2183            3 :         if (session_info == NULL) {
    2184            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    2185              :         }
    2186              : 
    2187            3 :         if (sub_index == 0) {
    2188              :             spdm_key_update_response_t *spdm_response;
    2189              :             size_t spdm_response_size;
    2190              :             size_t transport_header_size;
    2191              :             uint8_t *scratch_buffer;
    2192              :             size_t scratch_buffer_size;
    2193              : 
    2194            1 :             spdm_response_size = sizeof(spdm_key_update_response_t);
    2195            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    2196            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    2197              : 
    2198            1 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    2199            1 :             spdm_response->header.request_response_code =
    2200              :                 SPDM_KEY_UPDATE_ACK;
    2201            1 :             spdm_response->header.param1 =
    2202              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
    2203            1 :             spdm_response->header.param2 = m_libspdm_last_token;
    2204              : 
    2205              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    2206              :              * transport_message is always in sender buffer. */
    2207            1 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    2208              :                                         &scratch_buffer_size);
    2209            1 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
    2210              :                               scratch_buffer_size - transport_header_size,
    2211              :                               spdm_response, spdm_response_size);
    2212            1 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
    2213            1 :             libspdm_transport_test_encode_message(spdm_context,
    2214              :                                                   &session_id, false, false,
    2215              :                                                   spdm_response_size, spdm_response,
    2216              :                                                   response_size, response);
    2217              :             /* WALKAROUND: If just use single context to encode
    2218              :              * message and then decode message */
    2219              :             ((libspdm_secured_message_context_t
    2220            1 :               *)(session_info->secured_message_context))
    2221            1 :             ->application_secret.response_data_sequence_number--;
    2222              :         } else {
    2223              :             spdm_error_response_data_response_not_ready_t *spdm_response;
    2224              :             size_t spdm_response_size;
    2225              :             size_t transport_header_size;
    2226              :             uint8_t *scratch_buffer;
    2227              :             size_t scratch_buffer_size;
    2228              : 
    2229            2 :             spdm_response_size = sizeof(spdm_error_response_data_response_not_ready_t);
    2230            2 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    2231            2 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    2232              : 
    2233            2 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    2234            2 :             spdm_response->header.request_response_code = SPDM_ERROR;
    2235            2 :             spdm_response->header.param1 =
    2236              :                 SPDM_ERROR_CODE_RESPONSE_NOT_READY;
    2237            2 :             spdm_response->header.param2 = 0;
    2238            2 :             spdm_response->extend_error_data.rd_exponent = 1;
    2239            2 :             spdm_response->extend_error_data.rd_tm = 2;
    2240            2 :             spdm_response->extend_error_data.request_code = SPDM_KEY_UPDATE;
    2241            2 :             spdm_response->extend_error_data.token = 0;
    2242              : 
    2243              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    2244              :              * transport_message is always in sender buffer. */
    2245            2 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    2246              :                                         &scratch_buffer_size);
    2247            2 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
    2248              :                               scratch_buffer_size - transport_header_size,
    2249              :                               spdm_response, spdm_response_size);
    2250            2 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
    2251            2 :             libspdm_transport_test_encode_message(spdm_context,
    2252              :                                                   &session_id, false, false,
    2253              :                                                   spdm_response_size, spdm_response,
    2254              :                                                   response_size, response);
    2255              :             /* WALKAROUND: If just use single context to encode
    2256              :              * message and then decode message */
    2257              :             ((libspdm_secured_message_context_t
    2258            2 :               *)(session_info->secured_message_context))
    2259            2 :             ->application_secret.response_data_sequence_number--;
    2260              :         }
    2261              : 
    2262            3 :         sub_index++;
    2263              :     }
    2264            3 :         return LIBSPDM_STATUS_SUCCESS;
    2265              : 
    2266            3 :     case 0x16: {
    2267              :         static size_t sub_index = 0;
    2268              : 
    2269              :         uint32_t session_id;
    2270              :         libspdm_session_info_t    *session_info;
    2271              : 
    2272            3 :         session_id = 0xFFFFFFFF;
    2273            3 :         session_info = libspdm_get_session_info_via_session_id(
    2274              :             spdm_context, session_id);
    2275            3 :         if (session_info == NULL) {
    2276            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    2277              :         }
    2278              : 
    2279            3 :         if (sub_index == 0) {
    2280              :             spdm_key_update_response_t *spdm_response;
    2281              :             size_t spdm_response_size;
    2282              :             size_t transport_header_size;
    2283              :             uint8_t *scratch_buffer;
    2284              :             size_t scratch_buffer_size;
    2285              : 
    2286            1 :             spdm_response_size = sizeof(spdm_key_update_response_t);
    2287            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    2288            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    2289              : 
    2290            1 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    2291            1 :             spdm_response->header.request_response_code =
    2292              :                 SPDM_KEY_UPDATE_ACK;
    2293            1 :             spdm_response->header.param1 =
    2294              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
    2295            1 :             spdm_response->header.param2 = m_libspdm_last_token;
    2296              : 
    2297              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    2298              :              * transport_message is always in sender buffer. */
    2299            1 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    2300              :                                         &scratch_buffer_size);
    2301            1 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
    2302              :                               scratch_buffer_size - transport_header_size,
    2303              :                               spdm_response, spdm_response_size);
    2304            1 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
    2305            1 :             libspdm_transport_test_encode_message(spdm_context,
    2306              :                                                   &session_id, false, false,
    2307              :                                                   spdm_response_size, spdm_response,
    2308              :                                                   response_size, response);
    2309              :             /* WALKAROUND: If just use single context to encode
    2310              :              * message and then decode message */
    2311              :             ((libspdm_secured_message_context_t
    2312            1 :               *)(session_info->secured_message_context))
    2313            1 :             ->application_secret.response_data_sequence_number--;
    2314            2 :         } else if (sub_index == 1) {
    2315              :             spdm_error_response_data_response_not_ready_t *spdm_response;
    2316              :             size_t spdm_response_size;
    2317              :             size_t transport_header_size;
    2318              :             uint8_t *scratch_buffer;
    2319              :             size_t scratch_buffer_size;
    2320              : 
    2321            1 :             spdm_response_size = sizeof(spdm_error_response_data_response_not_ready_t);
    2322            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    2323            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    2324              : 
    2325            1 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    2326            1 :             spdm_response->header.request_response_code = SPDM_ERROR;
    2327            1 :             spdm_response->header.param1 =
    2328              :                 SPDM_ERROR_CODE_RESPONSE_NOT_READY;
    2329            1 :             spdm_response->header.param2 = 0;
    2330            1 :             spdm_response->extend_error_data.rd_exponent = 1;
    2331            1 :             spdm_response->extend_error_data.rd_tm = 2;
    2332            1 :             spdm_response->extend_error_data.request_code = SPDM_KEY_UPDATE;
    2333            1 :             spdm_response->extend_error_data.token = 0;
    2334              : 
    2335              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    2336              :              * transport_message is always in sender buffer. */
    2337            1 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    2338              :                                         &scratch_buffer_size);
    2339            1 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
    2340              :                               scratch_buffer_size - transport_header_size,
    2341              :                               spdm_response, spdm_response_size);
    2342            1 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
    2343            1 :             libspdm_transport_test_encode_message(spdm_context,
    2344              :                                                   &session_id, false, false,
    2345              :                                                   spdm_response_size, spdm_response,
    2346              :                                                   response_size, response);
    2347              :             /* WALKAROUND: If just use single context to encode
    2348              :              * message and then decode message */
    2349              :             ((libspdm_secured_message_context_t
    2350            1 :               *)(session_info->secured_message_context))
    2351            1 :             ->application_secret.response_data_sequence_number--;
    2352            1 :         } else if (sub_index == 2) {
    2353              :             spdm_key_update_response_t *spdm_response;
    2354              :             size_t spdm_response_size;
    2355              :             size_t transport_header_size;
    2356              :             uint8_t *scratch_buffer;
    2357              :             size_t scratch_buffer_size;
    2358              : 
    2359            1 :             spdm_response_size = sizeof(spdm_key_update_response_t);
    2360            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    2361            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    2362              : 
    2363            1 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    2364            1 :             spdm_response->header.request_response_code =
    2365              :                 SPDM_KEY_UPDATE_ACK;
    2366            1 :             spdm_response->header.param1 =
    2367              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
    2368            1 :             spdm_response->header.param2 = m_libspdm_last_token;
    2369              : 
    2370              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    2371              :              * transport_message is always in sender buffer. */
    2372            1 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    2373              :                                         &scratch_buffer_size);
    2374            1 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
    2375              :                               scratch_buffer_size - transport_header_size,
    2376              :                               spdm_response, spdm_response_size);
    2377            1 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
    2378            1 :             libspdm_transport_test_encode_message(spdm_context,
    2379              :                                                   &session_id, false, false,
    2380              :                                                   spdm_response_size, spdm_response,
    2381              :                                                   response_size, response);
    2382              :             /* WALKAROUND: If just use single context to encode
    2383              :              * message and then decode message */
    2384              :             ((libspdm_secured_message_context_t
    2385            1 :               *)(session_info->secured_message_context))
    2386            1 :             ->application_secret.response_data_sequence_number--;
    2387              :         }
    2388              : 
    2389            3 :         sub_index++;
    2390              :     }
    2391            3 :         return LIBSPDM_STATUS_SUCCESS;
    2392              : 
    2393           34 :     case 0x17: {
    2394              :         static size_t sub_index = 0;
    2395              :         static uint16_t error_code = LIBSPDM_ERROR_CODE_RESERVED_00;
    2396              : 
    2397              :         uint32_t session_id;
    2398              :         libspdm_session_info_t    *session_info;
    2399              : 
    2400           34 :         session_id = 0xFFFFFFFF;
    2401           34 :         session_info = libspdm_get_session_info_via_session_id(
    2402              :             spdm_context, session_id);
    2403           34 :         if (session_info == NULL) {
    2404            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    2405              :         }
    2406              : 
    2407           34 :         if(error_code <= 0xff) {
    2408              :             /* skip SPDM_ERROR_CODE_DECRYPT_ERROR, because this case will free context*/
    2409           34 :             if(error_code == SPDM_ERROR_CODE_DECRYPT_ERROR) {
    2410            1 :                 error_code++;
    2411              :             }
    2412           34 :             if (sub_index%2 == 0) {
    2413              :                 spdm_key_update_response_t *spdm_response;
    2414              :                 size_t spdm_response_size;
    2415              :                 size_t transport_header_size;
    2416              :                 uint8_t *scratch_buffer;
    2417              :                 size_t scratch_buffer_size;
    2418              : 
    2419           17 :                 spdm_response_size = sizeof(spdm_key_update_response_t);
    2420           17 :                 transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    2421           17 :                 spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    2422              : 
    2423           17 :                 spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    2424           17 :                 spdm_response->header.request_response_code =
    2425              :                     SPDM_KEY_UPDATE_ACK;
    2426           17 :                 spdm_response->header.param1 =
    2427              :                     SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
    2428           17 :                 spdm_response->header.param2 = m_libspdm_last_token;
    2429              : 
    2430              :                 /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    2431              :                  * transport_message is always in sender buffer. */
    2432           17 :                 libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    2433              :                                             &scratch_buffer_size);
    2434           17 :                 libspdm_copy_mem (scratch_buffer + transport_header_size,
    2435              :                                   scratch_buffer_size - transport_header_size,
    2436              :                                   spdm_response, spdm_response_size);
    2437           17 :                 spdm_response = (void *)(scratch_buffer + transport_header_size);
    2438           17 :                 libspdm_transport_test_encode_message(spdm_context,
    2439              :                                                       &session_id, false, false,
    2440              :                                                       spdm_response_size, spdm_response,
    2441              :                                                       response_size, response);
    2442              :                 /* WALKAROUND: If just use single context to encode
    2443              :                  * message and then decode message */
    2444              :                 ((libspdm_secured_message_context_t
    2445           17 :                   *)(session_info->secured_message_context))
    2446           17 :                 ->application_secret.response_data_sequence_number--;
    2447              :             } else {
    2448              :                 spdm_error_response_t *spdm_response;
    2449              :                 size_t spdm_response_size;
    2450              :                 size_t transport_header_size;
    2451              :                 uint8_t *scratch_buffer;
    2452              :                 size_t scratch_buffer_size;
    2453              : 
    2454           17 :                 spdm_response_size = sizeof(spdm_error_response_t);
    2455           17 :                 transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    2456           17 :                 spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    2457              : 
    2458           17 :                 libspdm_zero_mem (spdm_response, spdm_response_size);
    2459           17 :                 spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    2460           17 :                 spdm_response->header.request_response_code = SPDM_ERROR;
    2461           17 :                 spdm_response->header.param1 = (uint8_t) error_code;
    2462           17 :                 spdm_response->header.param2 = 0;
    2463              : 
    2464              :                 /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    2465              :                  * transport_message is always in sender buffer. */
    2466           17 :                 libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    2467              :                                             &scratch_buffer_size);
    2468           17 :                 libspdm_copy_mem (scratch_buffer + transport_header_size,
    2469              :                                   scratch_buffer_size - transport_header_size,
    2470              :                                   spdm_response, spdm_response_size);
    2471           17 :                 spdm_response = (void *)(scratch_buffer + transport_header_size);
    2472           17 :                 libspdm_transport_test_encode_message(spdm_context,
    2473              :                                                       &session_id, false, false,
    2474              :                                                       spdm_response_size, spdm_response,
    2475              :                                                       response_size, response);
    2476              :                 /* WALKAROUND: If just use single context to encode
    2477              :                  * message and then decode message */
    2478              :                 ((libspdm_secured_message_context_t
    2479           17 :                   *)(session_info->secured_message_context))
    2480           17 :                 ->application_secret.response_data_sequence_number--;
    2481              : 
    2482           17 :                 error_code++;
    2483              :                 /*busy is treated in cases 5 and 6*/
    2484           17 :                 if(error_code == SPDM_ERROR_CODE_BUSY) {
    2485            1 :                     error_code = SPDM_ERROR_CODE_UNEXPECTED_REQUEST;
    2486              :                 }
    2487              :                 /*skip some reserved error codes (0d to 3e)*/
    2488           17 :                 if(error_code == LIBSPDM_ERROR_CODE_RESERVED_0D) {
    2489            1 :                     error_code = LIBSPDM_ERROR_CODE_RESERVED_3F;
    2490              :                 }
    2491              :                 /*skip response not ready, request resync, and some reserved codes (44 to fc)*/
    2492           17 :                 if(error_code == SPDM_ERROR_CODE_RESPONSE_NOT_READY) {
    2493            1 :                     error_code = LIBSPDM_ERROR_CODE_RESERVED_FD;
    2494              :                 }
    2495              :             }
    2496              :         }
    2497              : 
    2498           34 :         sub_index++;
    2499              :     }
    2500           34 :         return LIBSPDM_STATUS_SUCCESS;
    2501              : 
    2502            2 :     case 0x18: {
    2503              :         static size_t sub_index = 0;
    2504              : 
    2505              :         spdm_key_update_response_t *spdm_response;
    2506              :         size_t spdm_response_size;
    2507              :         size_t transport_header_size;
    2508              :         uint32_t session_id;
    2509              :         libspdm_session_info_t        *session_info;
    2510              :         uint8_t *scratch_buffer;
    2511              :         size_t scratch_buffer_size;
    2512              : 
    2513            2 :         spdm_response_size = sizeof(spdm_key_update_response_t);
    2514            2 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    2515            2 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    2516              : 
    2517            2 :         session_id = 0xFFFFFFFF;
    2518              : 
    2519            2 :         session_info = libspdm_get_session_info_via_session_id(
    2520              :             spdm_context, session_id);
    2521            2 :         if (session_info == NULL) {
    2522            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    2523              :         }
    2524              : 
    2525            2 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    2526            2 :         spdm_response->header.request_response_code =
    2527              :             SPDM_KEY_UPDATE_ACK;
    2528            2 :         if (sub_index == 0) {
    2529            1 :             spdm_response->header.request_response_code =
    2530              :                 SPDM_KEY_UPDATE_ACK;
    2531            1 :             spdm_response->header.param1 =
    2532              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
    2533            1 :             spdm_response->header.param2 = m_libspdm_last_token;
    2534            1 :         } else if (sub_index == 1) {
    2535              :             /*wrong response code*/
    2536            1 :             spdm_response->header.request_response_code =
    2537              :                 SPDM_KEY_UPDATE;
    2538            1 :             spdm_response->header.param1 =
    2539              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
    2540            1 :             spdm_response->header.param2 = m_libspdm_last_token;
    2541              :         }
    2542              : 
    2543              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    2544              :          * transport_message is always in sender buffer. */
    2545            2 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
    2546            2 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
    2547              :                           scratch_buffer_size - transport_header_size,
    2548              :                           spdm_response, spdm_response_size);
    2549            2 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
    2550            2 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
    2551              :                                               false, false, spdm_response_size,
    2552              :                                               spdm_response, response_size, response);
    2553              :         /* WALKAROUND: If just use single context to encode
    2554              :          * message and then decode message */
    2555              :         ((libspdm_secured_message_context_t
    2556            2 :           *)(session_info->secured_message_context))
    2557            2 :         ->application_secret.response_data_sequence_number--;
    2558              : 
    2559            2 :         sub_index++;
    2560              :     }
    2561            2 :         return LIBSPDM_STATUS_SUCCESS;
    2562              : 
    2563            2 :     case 0x19: {
    2564              :         static size_t sub_index = 0;
    2565              : 
    2566              :         spdm_key_update_response_t *spdm_response;
    2567              :         size_t spdm_response_size;
    2568              :         size_t transport_header_size;
    2569              :         uint32_t session_id;
    2570              :         libspdm_session_info_t        *session_info;
    2571              :         uint8_t *scratch_buffer;
    2572              :         size_t scratch_buffer_size;
    2573              : 
    2574            2 :         spdm_response_size = sizeof(spdm_key_update_response_t);
    2575            2 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    2576            2 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    2577              : 
    2578            2 :         session_id = 0xFFFFFFFF;
    2579              : 
    2580            2 :         session_info = libspdm_get_session_info_via_session_id(
    2581              :             spdm_context, session_id);
    2582            2 :         if (session_info == NULL) {
    2583            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    2584              :         }
    2585              : 
    2586            2 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    2587            2 :         spdm_response->header.request_response_code =
    2588              :             SPDM_KEY_UPDATE_ACK;
    2589            2 :         if (sub_index == 0) {
    2590            1 :             spdm_response->header.param1 =
    2591              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
    2592            1 :             spdm_response->header.param2 = m_libspdm_last_token;
    2593            1 :         } else if (sub_index == 1) {
    2594            1 :             spdm_response->header.param1 =
    2595              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
    2596              :             /*wrong token*/
    2597            1 :             spdm_response->header.param2 = m_libspdm_last_token + 1;
    2598              :         }
    2599              : 
    2600              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    2601              :          * transport_message is always in sender buffer. */
    2602            2 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
    2603            2 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
    2604              :                           scratch_buffer_size - transport_header_size,
    2605              :                           spdm_response, spdm_response_size);
    2606            2 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
    2607            2 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
    2608              :                                               false, false, spdm_response_size,
    2609              :                                               spdm_response, response_size, response);
    2610              :         /* WALKAROUND: If just use single context to encode
    2611              :          * message and then decode message */
    2612              :         ((libspdm_secured_message_context_t
    2613            2 :           *)(session_info->secured_message_context))
    2614            2 :         ->application_secret.response_data_sequence_number--;
    2615              : 
    2616            2 :         sub_index++;
    2617              :     }
    2618            2 :         return LIBSPDM_STATUS_SUCCESS;
    2619              : 
    2620            2 :     case 0x1A: {
    2621              :         static size_t sub_index = 0;
    2622              : 
    2623              :         spdm_key_update_response_t *spdm_response;
    2624              :         size_t spdm_response_size;
    2625              :         size_t transport_header_size;
    2626              :         uint32_t session_id;
    2627              :         libspdm_session_info_t        *session_info;
    2628              :         uint8_t *scratch_buffer;
    2629              :         size_t scratch_buffer_size;
    2630              : 
    2631            2 :         spdm_response_size = sizeof(spdm_key_update_response_t);
    2632            2 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    2633            2 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    2634              : 
    2635            2 :         session_id = 0xFFFFFFFF;
    2636              : 
    2637            2 :         session_info = libspdm_get_session_info_via_session_id(
    2638              :             spdm_context, session_id);
    2639            2 :         if (session_info == NULL) {
    2640            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    2641              :         }
    2642              : 
    2643            2 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    2644            2 :         spdm_response->header.request_response_code =
    2645              :             SPDM_KEY_UPDATE_ACK;
    2646            2 :         if (sub_index == 0) {
    2647            1 :             spdm_response->header.param1 =
    2648              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
    2649            1 :             spdm_response->header.param2 = m_libspdm_last_token;
    2650            1 :         } else if (sub_index == 1) {
    2651              :             /*wrong operation code*/
    2652            1 :             spdm_response->header.param1 =
    2653              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
    2654            1 :             spdm_response->header.param2 = m_libspdm_last_token;
    2655              :         }
    2656              : 
    2657              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    2658              :          * transport_message is always in sender buffer. */
    2659            2 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
    2660            2 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
    2661              :                           scratch_buffer_size - transport_header_size,
    2662              :                           spdm_response, spdm_response_size);
    2663            2 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
    2664            2 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
    2665              :                                               false, false, spdm_response_size,
    2666              :                                               spdm_response, response_size, response);
    2667              :         /* WALKAROUND: If just use single context to encode
    2668              :          * message and then decode message */
    2669              :         ((libspdm_secured_message_context_t
    2670            2 :           *)(session_info->secured_message_context))
    2671            2 :         ->application_secret.response_data_sequence_number--;
    2672              : 
    2673            2 :         sub_index++;
    2674              :     }
    2675            2 :         return LIBSPDM_STATUS_SUCCESS;
    2676              : 
    2677            2 :     case 0x1B: {
    2678              :         static size_t sub_index = 0;
    2679              : 
    2680              :         spdm_key_update_response_t *spdm_response;
    2681              :         size_t spdm_response_size;
    2682              :         size_t transport_header_size;
    2683              :         uint32_t session_id;
    2684              :         libspdm_session_info_t        *session_info;
    2685              :         uint8_t *scratch_buffer;
    2686              :         size_t scratch_buffer_size;
    2687              : 
    2688            2 :         spdm_response_size = sizeof(spdm_key_update_response_t);
    2689            2 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    2690            2 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    2691              : 
    2692            2 :         session_id = 0xFFFFFFFF;
    2693              : 
    2694            2 :         session_info = libspdm_get_session_info_via_session_id(
    2695              :             spdm_context, session_id);
    2696            2 :         if (session_info == NULL) {
    2697            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    2698              :         }
    2699              : 
    2700            2 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    2701            2 :         spdm_response->header.request_response_code = SPDM_KEY_UPDATE_ACK;
    2702            2 :         if (sub_index == 0) {
    2703            1 :             spdm_response->header.param1 =
    2704              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_ALL_KEYS;
    2705            1 :             spdm_response->header.param2 = m_libspdm_last_token;
    2706            1 :         } else if (sub_index == 1) {
    2707            1 :             spdm_response->header.param1 =
    2708              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
    2709            1 :             spdm_response->header.param2 = m_libspdm_last_token;
    2710              : 
    2711              :             /* as it is using single context, the keys were updated
    2712              :              * in the requester and do not need to be updated before
    2713              :              * sending the response */
    2714              :         }
    2715              : 
    2716              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    2717              :          * transport_message is always in sender buffer. */
    2718            2 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
    2719            2 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
    2720              :                           scratch_buffer_size - transport_header_size,
    2721              :                           spdm_response, spdm_response_size);
    2722            2 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
    2723            2 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
    2724              :                                               false, false, spdm_response_size,
    2725              :                                               spdm_response, response_size, response);
    2726              :         /* WALKAROUND: If just use single context to encode
    2727              :          * message and then decode message */
    2728              :         ((libspdm_secured_message_context_t
    2729            2 :           *)(session_info->secured_message_context))
    2730            2 :         ->application_secret.response_data_sequence_number--;
    2731              : 
    2732            2 :         sub_index++;
    2733              :     }
    2734            2 :         return LIBSPDM_STATUS_SUCCESS;
    2735              : 
    2736            1 :     case 0x1C: {
    2737              :         spdm_error_response_t *spdm_response;
    2738              :         size_t spdm_response_size;
    2739              :         size_t transport_header_size;
    2740              :         uint32_t session_id;
    2741              :         libspdm_session_info_t    *session_info;
    2742              :         uint8_t *scratch_buffer;
    2743              :         size_t scratch_buffer_size;
    2744              : 
    2745              :         libspdm_secured_message_context_t *secured_message_context;
    2746              :         uint8_t curr_rsp_enc_key[LIBSPDM_MAX_AEAD_KEY_SIZE];
    2747              :         uint8_t curr_rsp_salt[LIBSPDM_MAX_AEAD_IV_SIZE];
    2748              :         uint64_t curr_rsp_sequence_number;
    2749              : 
    2750            1 :         spdm_response_size = sizeof(spdm_key_update_response_t);
    2751            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    2752            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    2753              : 
    2754            1 :         session_id = 0xFFFFFFFF;
    2755            1 :         session_info = libspdm_get_session_info_via_session_id(
    2756              :             spdm_context, session_id);
    2757            1 :         if (session_info == NULL) {
    2758            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    2759              :         }
    2760            1 :         secured_message_context = session_info->secured_message_context;
    2761              : 
    2762              :         /*use previous key to send*/
    2763            1 :         libspdm_copy_mem(curr_rsp_enc_key, sizeof(curr_rsp_enc_key),
    2764              :                          secured_message_context
    2765            1 :                          ->application_secret.response_data_encryption_key,
    2766              :                          secured_message_context->aead_key_size);
    2767            1 :         libspdm_copy_mem(curr_rsp_salt, sizeof(curr_rsp_salt),
    2768              :                          secured_message_context
    2769            1 :                          ->application_secret.response_data_salt,
    2770              :                          secured_message_context->aead_iv_size);
    2771            1 :         curr_rsp_sequence_number = m_libspdm_last_rsp_sequence_number;
    2772              : 
    2773            1 :         libspdm_copy_mem(secured_message_context->application_secret
    2774            1 :                          .response_data_encryption_key,
    2775              :                          sizeof(secured_message_context->application_secret
    2776              :                                 .response_data_encryption_key),
    2777              :                          m_libspdm_last_rsp_enc_key,
    2778              :                          secured_message_context->aead_key_size);
    2779            1 :         libspdm_copy_mem(secured_message_context->application_secret
    2780            1 :                          .response_data_salt,
    2781              :                          sizeof(secured_message_context->application_secret
    2782              :                                 .response_data_salt),
    2783              :                          m_libspdm_last_rsp_salt,
    2784              :                          secured_message_context->aead_iv_size);
    2785              :         secured_message_context->application_secret
    2786            1 :         .response_data_sequence_number = m_libspdm_last_rsp_sequence_number;
    2787              : 
    2788            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    2789            1 :         spdm_response->header.request_response_code = SPDM_ERROR;
    2790            1 :         spdm_response->header.param1 = SPDM_ERROR_CODE_INVALID_REQUEST;
    2791            1 :         spdm_response->header.param2 = 0;
    2792              : 
    2793              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    2794              :          * transport_message is always in sender buffer. */
    2795            1 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
    2796            1 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
    2797              :                           scratch_buffer_size - transport_header_size,
    2798              :                           spdm_response, spdm_response_size);
    2799            1 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
    2800            1 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
    2801              :                                               false, false, spdm_response_size,
    2802              :                                               spdm_response, response_size, response);
    2803              : 
    2804              :         /*restore new key*/
    2805            1 :         libspdm_copy_mem(secured_message_context->application_secret
    2806            1 :                          .response_data_encryption_key,
    2807              :                          sizeof(secured_message_context->application_secret
    2808              :                                 .response_data_encryption_key),
    2809              :                          curr_rsp_enc_key,
    2810              :                          secured_message_context->aead_key_size);
    2811            1 :         libspdm_copy_mem(secured_message_context->application_secret
    2812            1 :                          .response_data_salt,
    2813              :                          sizeof(secured_message_context->application_secret
    2814              :                                 .response_data_salt),
    2815              :                          curr_rsp_salt,
    2816              :                          secured_message_context->aead_iv_size);
    2817              :         secured_message_context->application_secret
    2818            1 :         .response_data_sequence_number = curr_rsp_sequence_number;
    2819              :     }
    2820            1 :         return LIBSPDM_STATUS_SUCCESS;
    2821              : 
    2822            4 :     case 0x1D: {
    2823              :         spdm_error_response_t *spdm_response;
    2824              :         size_t spdm_response_size;
    2825              :         size_t transport_header_size;
    2826              :         uint32_t session_id;
    2827              :         libspdm_session_info_t    *session_info;
    2828              :         uint8_t *scratch_buffer;
    2829              :         size_t scratch_buffer_size;
    2830              : 
    2831              :         libspdm_secured_message_context_t *secured_message_context;
    2832              :         uint8_t curr_rsp_enc_key[LIBSPDM_MAX_AEAD_KEY_SIZE];
    2833              :         uint8_t curr_rsp_salt[LIBSPDM_MAX_AEAD_IV_SIZE];
    2834              :         uint64_t curr_rsp_sequence_number;
    2835              : 
    2836            4 :         spdm_response_size = sizeof(spdm_key_update_response_t);
    2837            4 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    2838            4 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    2839              : 
    2840            4 :         session_id = 0xFFFFFFFF;
    2841            4 :         session_info = libspdm_get_session_info_via_session_id(
    2842              :             spdm_context, session_id);
    2843            4 :         if (session_info == NULL) {
    2844            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    2845              :         }
    2846            4 :         secured_message_context = session_info->secured_message_context;
    2847              : 
    2848              :         /*use previous key to send*/
    2849            4 :         libspdm_copy_mem(curr_rsp_enc_key, sizeof(curr_rsp_enc_key),
    2850              :                          secured_message_context
    2851            4 :                          ->application_secret.response_data_encryption_key,
    2852              :                          secured_message_context->aead_key_size);
    2853            4 :         libspdm_copy_mem(curr_rsp_salt, sizeof(curr_rsp_salt),
    2854              :                          secured_message_context
    2855            4 :                          ->application_secret.response_data_salt,
    2856              :                          secured_message_context->aead_iv_size);
    2857            4 :         curr_rsp_sequence_number = m_libspdm_last_rsp_sequence_number;
    2858              : 
    2859            4 :         libspdm_copy_mem(secured_message_context->application_secret
    2860            4 :                          .response_data_encryption_key,
    2861              :                          sizeof(secured_message_context->application_secret
    2862              :                                 .response_data_encryption_key),
    2863              :                          m_libspdm_last_rsp_enc_key,
    2864              :                          secured_message_context->aead_key_size);
    2865            4 :         libspdm_copy_mem(secured_message_context->application_secret
    2866            4 :                          .response_data_salt,
    2867              :                          sizeof(secured_message_context->application_secret
    2868              :                                 .response_data_salt),
    2869              :                          m_libspdm_last_rsp_salt,
    2870              :                          secured_message_context->aead_iv_size);
    2871              :         secured_message_context->application_secret
    2872            4 :         .response_data_sequence_number = m_libspdm_last_rsp_sequence_number;
    2873              : 
    2874              :         /* once the sequence number is used, it should be increased for next BUSY message.*/
    2875            4 :         m_libspdm_last_rsp_sequence_number++;
    2876              : 
    2877            4 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    2878            4 :         spdm_response->header.request_response_code = SPDM_ERROR;
    2879            4 :         spdm_response->header.param1 = SPDM_ERROR_CODE_BUSY;
    2880            4 :         spdm_response->header.param2 = 0;
    2881              : 
    2882              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    2883              :          * transport_message is always in sender buffer. */
    2884            4 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
    2885            4 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
    2886              :                           scratch_buffer_size - transport_header_size,
    2887              :                           spdm_response, spdm_response_size);
    2888            4 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
    2889            4 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
    2890              :                                               false, false, spdm_response_size,
    2891              :                                               spdm_response, response_size, response);
    2892              : 
    2893              :         /*restore new key*/
    2894            4 :         libspdm_copy_mem(secured_message_context->application_secret
    2895            4 :                          .response_data_encryption_key,
    2896              :                          sizeof(secured_message_context->application_secret
    2897              :                                 .response_data_encryption_key),
    2898              :                          curr_rsp_enc_key,
    2899              :                          secured_message_context->aead_key_size);
    2900            4 :         libspdm_copy_mem(secured_message_context->application_secret
    2901            4 :                          .response_data_salt,
    2902              :                          sizeof(secured_message_context->application_secret
    2903              :                                 .response_data_salt),
    2904              :                          curr_rsp_salt,
    2905              :                          secured_message_context->aead_iv_size);
    2906              :         secured_message_context->application_secret
    2907            4 :         .response_data_sequence_number = curr_rsp_sequence_number;
    2908              :     }
    2909            4 :         return LIBSPDM_STATUS_SUCCESS;
    2910              : 
    2911            3 :     case 0x1E: {
    2912              :         static size_t sub_index = 0;
    2913              : 
    2914              :         uint32_t session_id;
    2915              :         libspdm_session_info_t    *session_info;
    2916              : 
    2917              :         libspdm_secured_message_context_t *secured_message_context;
    2918              : 
    2919            3 :         session_id = 0xFFFFFFFF;
    2920            3 :         session_info = libspdm_get_session_info_via_session_id(
    2921              :             spdm_context, session_id);
    2922            3 :         if (session_info == NULL) {
    2923            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    2924              :         }
    2925            3 :         secured_message_context = session_info->secured_message_context;
    2926              : 
    2927            3 :         if (sub_index == 0) {
    2928              :             spdm_error_response_t *spdm_response;
    2929              :             size_t spdm_response_size;
    2930              :             size_t transport_header_size;
    2931              :             uint8_t *scratch_buffer;
    2932              :             size_t scratch_buffer_size;
    2933              : 
    2934            1 :             spdm_response_size = sizeof(spdm_error_response_t);
    2935            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    2936            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    2937              : 
    2938              :             uint8_t curr_rsp_enc_key[LIBSPDM_MAX_AEAD_KEY_SIZE];
    2939              :             uint8_t curr_rsp_salt[LIBSPDM_MAX_AEAD_IV_SIZE];
    2940              :             uint64_t curr_rsp_sequence_number;
    2941              : 
    2942              :             /*use previous key to send*/
    2943            1 :             libspdm_copy_mem(curr_rsp_enc_key, sizeof(curr_rsp_enc_key),
    2944              :                              secured_message_context
    2945            1 :                              ->application_secret.response_data_encryption_key,
    2946              :                              secured_message_context->aead_key_size);
    2947            1 :             libspdm_copy_mem(curr_rsp_salt, sizeof(curr_rsp_salt),
    2948              :                              secured_message_context
    2949            1 :                              ->application_secret.response_data_salt,
    2950              :                              secured_message_context->aead_iv_size);
    2951            1 :             curr_rsp_sequence_number = m_libspdm_last_rsp_sequence_number;
    2952              : 
    2953            1 :             libspdm_copy_mem(secured_message_context->application_secret
    2954            1 :                              .response_data_encryption_key,
    2955              :                              sizeof(secured_message_context->application_secret
    2956              :                                     .response_data_encryption_key),
    2957              :                              m_libspdm_last_rsp_enc_key,
    2958              :                              secured_message_context->aead_key_size);
    2959            1 :             libspdm_copy_mem(secured_message_context->application_secret
    2960            1 :                              .response_data_salt,
    2961              :                              sizeof(secured_message_context->application_secret
    2962              :                                     .response_data_salt),
    2963              :                              m_libspdm_last_rsp_salt,
    2964              :                              secured_message_context->aead_iv_size);
    2965              :             secured_message_context->application_secret
    2966            1 :             .response_data_sequence_number = m_libspdm_last_rsp_sequence_number;
    2967              : 
    2968            1 :             spdm_response->header.spdm_version =
    2969              :                 SPDM_MESSAGE_VERSION_11;
    2970            1 :             spdm_response->header.request_response_code = SPDM_ERROR;
    2971            1 :             spdm_response->header.param1 = SPDM_ERROR_CODE_BUSY;
    2972            1 :             spdm_response->header.param2 = 0;
    2973              : 
    2974              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    2975              :              * transport_message is always in sender buffer. */
    2976            1 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    2977              :                                         &scratch_buffer_size);
    2978            1 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
    2979              :                               scratch_buffer_size - transport_header_size,
    2980              :                               spdm_response, spdm_response_size);
    2981            1 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
    2982            1 :             libspdm_transport_test_encode_message(spdm_context,
    2983              :                                                   &session_id, false, false,
    2984              :                                                   spdm_response_size, spdm_response,
    2985              :                                                   response_size, response);
    2986              : 
    2987              :             /*restore new key*/
    2988            1 :             libspdm_copy_mem(secured_message_context->application_secret
    2989            1 :                              .response_data_encryption_key,
    2990              :                              sizeof(secured_message_context->application_secret
    2991              :                                     .response_data_encryption_key),
    2992              :                              curr_rsp_enc_key,
    2993              :                              secured_message_context->aead_key_size);
    2994            1 :             libspdm_copy_mem(secured_message_context->application_secret
    2995            1 :                              .response_data_salt,
    2996              :                              sizeof(secured_message_context->application_secret
    2997              :                                     .response_data_salt),
    2998              :                              curr_rsp_salt,
    2999              :                              secured_message_context->aead_iv_size);
    3000              :             secured_message_context->application_secret
    3001            1 :             .response_data_sequence_number = curr_rsp_sequence_number;
    3002            2 :         } else if (sub_index == 1) {
    3003              :             spdm_key_update_response_t *spdm_response;
    3004              :             size_t spdm_response_size;
    3005              :             size_t transport_header_size;
    3006              :             uint8_t *scratch_buffer;
    3007              :             size_t scratch_buffer_size;
    3008              : 
    3009            1 :             spdm_response_size = sizeof(spdm_key_update_response_t);
    3010            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    3011            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    3012              : 
    3013            1 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    3014            1 :             spdm_response->header.request_response_code =
    3015              :                 SPDM_KEY_UPDATE_ACK;
    3016            1 :             spdm_response->header.param1 =
    3017              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_ALL_KEYS;
    3018            1 :             spdm_response->header.param2 = m_libspdm_last_token;
    3019              : 
    3020              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    3021              :              * transport_message is always in sender buffer. */
    3022            1 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    3023              :                                         &scratch_buffer_size);
    3024            1 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
    3025              :                               scratch_buffer_size - transport_header_size,
    3026              :                               spdm_response, spdm_response_size);
    3027            1 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
    3028            1 :             libspdm_transport_test_encode_message(spdm_context,
    3029              :                                                   &session_id, false, false,
    3030              :                                                   spdm_response_size, spdm_response,
    3031              :                                                   response_size, response);
    3032              :             /* WALKAROUND: If just use single context to encode
    3033              :              * message and then decode message */
    3034              :             secured_message_context->application_secret
    3035            1 :             .response_data_sequence_number--;
    3036            1 :         } else if (sub_index == 2) {
    3037              :             spdm_key_update_response_t *spdm_response;
    3038              :             size_t spdm_response_size;
    3039              :             size_t transport_header_size;
    3040              :             uint8_t *scratch_buffer;
    3041              :             size_t scratch_buffer_size;
    3042              : 
    3043            1 :             spdm_response_size = sizeof(spdm_key_update_response_t);
    3044            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    3045            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    3046              : 
    3047            1 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    3048            1 :             spdm_response->header.request_response_code =
    3049              :                 SPDM_KEY_UPDATE_ACK;
    3050            1 :             spdm_response->header.param1 =
    3051              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
    3052            1 :             spdm_response->header.param2 = m_libspdm_last_token;
    3053              : 
    3054              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    3055              :              * transport_message is always in sender buffer. */
    3056            1 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    3057              :                                         &scratch_buffer_size);
    3058            1 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
    3059              :                               scratch_buffer_size - transport_header_size,
    3060              :                               spdm_response, spdm_response_size);
    3061            1 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
    3062            1 :             libspdm_transport_test_encode_message(spdm_context,
    3063              :                                                   &session_id, false, false,
    3064              :                                                   spdm_response_size, spdm_response,
    3065              :                                                   response_size, response);
    3066              :             /* WALKAROUND: If just use single context to encode
    3067              :              * message and then decode message */
    3068              :             secured_message_context->application_secret
    3069            1 :             .response_data_sequence_number--;
    3070              :         }
    3071              : 
    3072            3 :         sub_index++;
    3073              :     }
    3074            3 :         return LIBSPDM_STATUS_SUCCESS;
    3075              : 
    3076            1 :     case 0x1F: {
    3077              :         spdm_error_response_t *spdm_response;
    3078              :         size_t spdm_response_size;
    3079              :         size_t transport_header_size;
    3080              :         uint32_t session_id;
    3081              :         libspdm_session_info_t    *session_info;
    3082              :         uint8_t *scratch_buffer;
    3083              :         size_t scratch_buffer_size;
    3084              : 
    3085              :         libspdm_secured_message_context_t *secured_message_context;
    3086              :         uint8_t curr_rsp_enc_key[LIBSPDM_MAX_AEAD_KEY_SIZE];
    3087              :         uint8_t curr_rsp_salt[LIBSPDM_MAX_AEAD_IV_SIZE];
    3088              :         uint64_t curr_rsp_sequence_number;
    3089              : 
    3090            1 :         spdm_response_size = sizeof(spdm_error_response_t);
    3091            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    3092            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    3093              : 
    3094            1 :         session_id = 0xFFFFFFFF;
    3095            1 :         session_info = libspdm_get_session_info_via_session_id(
    3096              :             spdm_context, session_id);
    3097            1 :         if (session_info == NULL) {
    3098            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    3099              :         }
    3100            1 :         secured_message_context = session_info->secured_message_context;
    3101              : 
    3102              :         /*use previous key to send*/
    3103            1 :         libspdm_copy_mem(curr_rsp_enc_key, sizeof(curr_rsp_enc_key),
    3104              :                          secured_message_context
    3105            1 :                          ->application_secret.response_data_encryption_key,
    3106              :                          secured_message_context->aead_key_size);
    3107            1 :         libspdm_copy_mem(curr_rsp_salt, sizeof(curr_rsp_salt),
    3108              :                          secured_message_context
    3109            1 :                          ->application_secret.response_data_salt,
    3110              :                          secured_message_context->aead_iv_size);
    3111            1 :         curr_rsp_sequence_number = m_libspdm_last_rsp_sequence_number;
    3112              : 
    3113            1 :         libspdm_copy_mem(secured_message_context->application_secret
    3114            1 :                          .response_data_encryption_key,
    3115              :                          sizeof(secured_message_context->application_secret
    3116              :                                 .response_data_encryption_key),
    3117              :                          m_libspdm_last_rsp_enc_key,
    3118              :                          secured_message_context->aead_key_size);
    3119            1 :         libspdm_copy_mem(secured_message_context->application_secret
    3120            1 :                          .response_data_salt,
    3121              :                          sizeof(secured_message_context->application_secret
    3122              :                                 .response_data_salt),
    3123              :                          m_libspdm_last_rsp_salt,
    3124              :                          secured_message_context->aead_iv_size);
    3125              :         secured_message_context->application_secret
    3126            1 :         .response_data_sequence_number = m_libspdm_last_rsp_sequence_number;
    3127              : 
    3128            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_10;
    3129            1 :         spdm_response->header.request_response_code = SPDM_ERROR;
    3130            1 :         spdm_response->header.param1 = SPDM_ERROR_CODE_REQUEST_RESYNCH;
    3131            1 :         spdm_response->header.param2 = 0;
    3132              : 
    3133              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    3134              :          * transport_message is always in sender buffer. */
    3135            1 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
    3136            1 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
    3137              :                           scratch_buffer_size - transport_header_size,
    3138              :                           spdm_response, spdm_response_size);
    3139            1 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
    3140            1 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
    3141              :                                               false, false, spdm_response_size,
    3142              :                                               spdm_response, response_size, response);
    3143              : 
    3144              :         /*restore new key*/
    3145            1 :         libspdm_copy_mem(secured_message_context->application_secret
    3146            1 :                          .response_data_encryption_key,
    3147              :                          sizeof(secured_message_context->application_secret
    3148              :                                 .response_data_encryption_key),
    3149              :                          curr_rsp_enc_key,
    3150              :                          secured_message_context->aead_key_size);
    3151            1 :         libspdm_copy_mem(secured_message_context->application_secret
    3152            1 :                          .response_data_salt,
    3153              :                          sizeof(secured_message_context->application_secret
    3154              :                                 .response_data_salt),
    3155              :                          curr_rsp_salt,
    3156              :                          secured_message_context->aead_iv_size);
    3157              :         secured_message_context->application_secret
    3158            1 :         .response_data_sequence_number = curr_rsp_sequence_number;
    3159              :     }
    3160            1 :         return LIBSPDM_STATUS_SUCCESS;
    3161              : 
    3162            2 :     case 0x20: {
    3163              :         spdm_error_response_data_response_not_ready_t *spdm_response;
    3164              :         size_t spdm_response_size;
    3165              :         size_t transport_header_size;
    3166              :         uint32_t session_id;
    3167              :         libspdm_session_info_t    *session_info;
    3168              :         uint8_t *scratch_buffer;
    3169              :         size_t scratch_buffer_size;
    3170              : 
    3171              :         libspdm_secured_message_context_t *secured_message_context;
    3172              :         uint8_t curr_rsp_enc_key[LIBSPDM_MAX_AEAD_KEY_SIZE];
    3173              :         uint8_t curr_rsp_salt[LIBSPDM_MAX_AEAD_IV_SIZE];
    3174              :         uint64_t curr_rsp_sequence_number;
    3175              : 
    3176            2 :         spdm_response_size = sizeof(spdm_error_response_data_response_not_ready_t);
    3177            2 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    3178            2 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    3179              : 
    3180            2 :         session_id = 0xFFFFFFFF;
    3181            2 :         session_info = libspdm_get_session_info_via_session_id(
    3182              :             spdm_context, session_id);
    3183            2 :         if (session_info == NULL) {
    3184            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    3185              :         }
    3186            2 :         secured_message_context = session_info->secured_message_context;
    3187              : 
    3188              :         /*use previous key to send*/
    3189            2 :         libspdm_copy_mem(curr_rsp_enc_key, sizeof(curr_rsp_enc_key),
    3190              :                          secured_message_context
    3191            2 :                          ->application_secret.response_data_encryption_key,
    3192              :                          secured_message_context->aead_key_size);
    3193            2 :         libspdm_copy_mem(curr_rsp_salt, sizeof(curr_rsp_salt),
    3194              :                          secured_message_context
    3195            2 :                          ->application_secret.response_data_salt,
    3196              :                          secured_message_context->aead_iv_size);
    3197            2 :         curr_rsp_sequence_number = m_libspdm_last_rsp_sequence_number;
    3198              : 
    3199            2 :         libspdm_copy_mem(secured_message_context->application_secret
    3200            2 :                          .response_data_encryption_key,
    3201              :                          sizeof(secured_message_context->application_secret
    3202              :                                 .response_data_encryption_key),
    3203              :                          m_libspdm_last_rsp_enc_key,
    3204              :                          secured_message_context->aead_key_size);
    3205            2 :         libspdm_copy_mem(secured_message_context->application_secret
    3206            2 :                          .response_data_salt,
    3207              :                          sizeof(secured_message_context->application_secret
    3208              :                                 .response_data_salt),
    3209              :                          m_libspdm_last_rsp_salt,
    3210              :                          secured_message_context->aead_iv_size);
    3211              :         secured_message_context->application_secret
    3212            2 :         .response_data_sequence_number = m_libspdm_last_rsp_sequence_number;
    3213              : 
    3214              :         /* once the sequence number is used, it should be increased for next NOT_READY message.*/
    3215            2 :         m_libspdm_last_rsp_sequence_number++;
    3216              : 
    3217            2 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    3218            2 :         spdm_response->header.request_response_code = SPDM_ERROR;
    3219            2 :         spdm_response->header.param1 =
    3220              :             SPDM_ERROR_CODE_RESPONSE_NOT_READY;
    3221            2 :         spdm_response->header.param2 = 0;
    3222            2 :         spdm_response->extend_error_data.rd_exponent = 1;
    3223            2 :         spdm_response->extend_error_data.rd_tm = 2;
    3224            2 :         spdm_response->extend_error_data.request_code = SPDM_KEY_UPDATE;
    3225            2 :         spdm_response->extend_error_data.token = 0;
    3226              : 
    3227              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    3228              :          * transport_message is always in sender buffer. */
    3229            2 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
    3230            2 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
    3231              :                           scratch_buffer_size - transport_header_size,
    3232              :                           spdm_response, spdm_response_size);
    3233            2 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
    3234            2 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
    3235              :                                               false, false, spdm_response_size,
    3236              :                                               spdm_response, response_size, response);
    3237              : 
    3238              :         /*restore new key*/
    3239            2 :         libspdm_copy_mem(secured_message_context->application_secret
    3240            2 :                          .response_data_encryption_key,
    3241              :                          sizeof(secured_message_context->application_secret
    3242              :                                 .response_data_encryption_key),
    3243              :                          curr_rsp_enc_key,
    3244              :                          secured_message_context->aead_key_size);
    3245            2 :         libspdm_copy_mem(secured_message_context->application_secret
    3246            2 :                          .response_data_salt,
    3247              :                          sizeof(secured_message_context->application_secret
    3248              :                                 .response_data_salt),
    3249              :                          curr_rsp_salt,
    3250              :                          secured_message_context->aead_iv_size);
    3251              :         secured_message_context->application_secret
    3252            2 :         .response_data_sequence_number = curr_rsp_sequence_number;
    3253              :     }
    3254            2 :         return LIBSPDM_STATUS_SUCCESS;
    3255              : 
    3256            3 :     case 0x21: {
    3257              :         static size_t sub_index = 0;
    3258              : 
    3259              :         uint32_t session_id;
    3260              :         libspdm_session_info_t    *session_info;
    3261              : 
    3262              :         libspdm_secured_message_context_t *secured_message_context;
    3263              : 
    3264            3 :         session_id = 0xFFFFFFFF;
    3265            3 :         session_info = libspdm_get_session_info_via_session_id(
    3266              :             spdm_context, session_id);
    3267            3 :         if (session_info == NULL) {
    3268            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    3269              :         }
    3270            3 :         secured_message_context = session_info->secured_message_context;
    3271              : 
    3272            3 :         if (sub_index == 0) {
    3273              :             spdm_error_response_data_response_not_ready_t
    3274              :             *spdm_response;
    3275              :             size_t spdm_response_size;
    3276              :             size_t transport_header_size;
    3277              :             uint8_t *scratch_buffer;
    3278              :             size_t scratch_buffer_size;
    3279              : 
    3280              :             uint8_t curr_rsp_enc_key[LIBSPDM_MAX_AEAD_KEY_SIZE];
    3281              :             uint8_t curr_rsp_salt[LIBSPDM_MAX_AEAD_IV_SIZE];
    3282              :             uint64_t curr_rsp_sequence_number;
    3283              : 
    3284            1 :             spdm_response_size = sizeof(spdm_error_response_data_response_not_ready_t);
    3285            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    3286            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    3287              : 
    3288              :             /*use previous key to send*/
    3289            1 :             libspdm_copy_mem(curr_rsp_enc_key, sizeof(curr_rsp_enc_key),
    3290              :                              secured_message_context
    3291            1 :                              ->application_secret.response_data_encryption_key,
    3292              :                              secured_message_context->aead_key_size);
    3293            1 :             libspdm_copy_mem(curr_rsp_salt, sizeof(curr_rsp_salt),
    3294              :                              secured_message_context
    3295            1 :                              ->application_secret.response_data_salt,
    3296              :                              secured_message_context->aead_iv_size);
    3297            1 :             curr_rsp_sequence_number = m_libspdm_last_rsp_sequence_number;
    3298              : 
    3299            1 :             libspdm_copy_mem(secured_message_context->application_secret
    3300            1 :                              .response_data_encryption_key,
    3301              :                              sizeof(secured_message_context->application_secret
    3302              :                                     .response_data_encryption_key),
    3303              :                              m_libspdm_last_rsp_enc_key,
    3304              :                              secured_message_context->aead_key_size);
    3305            1 :             libspdm_copy_mem(secured_message_context->application_secret
    3306            1 :                              .response_data_salt,
    3307              :                              sizeof(secured_message_context->application_secret
    3308              :                                     .response_data_salt),
    3309              :                              m_libspdm_last_rsp_salt,
    3310              :                              secured_message_context->aead_iv_size);
    3311              :             secured_message_context->application_secret
    3312            1 :             .response_data_sequence_number = m_libspdm_last_rsp_sequence_number;
    3313              : 
    3314            1 :             spdm_response->header.spdm_version =
    3315              :                 SPDM_MESSAGE_VERSION_11;
    3316            1 :             spdm_response->header.request_response_code = SPDM_ERROR;
    3317            1 :             spdm_response->header.param1 =
    3318              :                 SPDM_ERROR_CODE_RESPONSE_NOT_READY;
    3319            1 :             spdm_response->header.param2 = 0;
    3320            1 :             spdm_response->extend_error_data.rd_exponent = 1;
    3321            1 :             spdm_response->extend_error_data.rd_tm = 2;
    3322            1 :             spdm_response->extend_error_data.request_code =
    3323              :                 SPDM_KEY_UPDATE;
    3324            1 :             spdm_response->extend_error_data.token = 1;
    3325              : 
    3326              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    3327              :              * transport_message is always in sender buffer. */
    3328            1 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    3329              :                                         &scratch_buffer_size);
    3330            1 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
    3331              :                               scratch_buffer_size - transport_header_size,
    3332              :                               spdm_response, spdm_response_size);
    3333            1 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
    3334            1 :             libspdm_transport_test_encode_message(spdm_context,
    3335              :                                                   &session_id, false, false,
    3336              :                                                   spdm_response_size, spdm_response,
    3337              :                                                   response_size, response);
    3338              : 
    3339              :             /*restore new key*/
    3340            1 :             libspdm_copy_mem(secured_message_context->application_secret
    3341            1 :                              .response_data_encryption_key,
    3342              :                              sizeof(secured_message_context->application_secret
    3343              :                                     .response_data_encryption_key),
    3344              :                              curr_rsp_enc_key,
    3345              :                              secured_message_context->aead_key_size);
    3346            1 :             libspdm_copy_mem(secured_message_context->application_secret
    3347            1 :                              .response_data_salt,
    3348              :                              sizeof(secured_message_context->application_secret
    3349              :                                     .response_data_salt),
    3350              :                              curr_rsp_salt,
    3351              :                              secured_message_context->aead_iv_size);
    3352              :             secured_message_context->application_secret
    3353            1 :             .response_data_sequence_number = curr_rsp_sequence_number;
    3354            2 :         } else if (sub_index == 1) {
    3355              :             spdm_key_update_response_t *spdm_response;
    3356              :             size_t spdm_response_size;
    3357              :             size_t transport_header_size;
    3358              :             uint8_t *scratch_buffer;
    3359              :             size_t scratch_buffer_size;
    3360              : 
    3361            1 :             spdm_response_size = sizeof(spdm_key_update_response_t);
    3362            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    3363            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    3364              : 
    3365            1 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    3366            1 :             spdm_response->header.request_response_code =
    3367              :                 SPDM_KEY_UPDATE_ACK;
    3368            1 :             spdm_response->header.param1 =
    3369              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_ALL_KEYS;
    3370            1 :             spdm_response->header.param2 = m_libspdm_last_token;
    3371              : 
    3372              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    3373              :              * transport_message is always in sender buffer. */
    3374            1 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    3375              :                                         &scratch_buffer_size);
    3376            1 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
    3377              :                               scratch_buffer_size - transport_header_size,
    3378              :                               spdm_response, spdm_response_size);
    3379            1 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
    3380            1 :             libspdm_transport_test_encode_message(spdm_context,
    3381              :                                                   &session_id, false, false,
    3382              :                                                   spdm_response_size, spdm_response,
    3383              :                                                   response_size, response);
    3384              :             /* WALKAROUND: If just use single context to encode
    3385              :              * message and then decode message */
    3386              :             secured_message_context->application_secret
    3387            1 :             .response_data_sequence_number--;
    3388            1 :         } else if (sub_index == 2) {
    3389              :             spdm_key_update_response_t *spdm_response;
    3390              :             size_t spdm_response_size;
    3391              :             size_t transport_header_size;
    3392              :             uint8_t *scratch_buffer;
    3393              :             size_t scratch_buffer_size;
    3394              : 
    3395            1 :             spdm_response_size = sizeof(spdm_key_update_response_t);
    3396            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    3397            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    3398              : 
    3399            1 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    3400            1 :             spdm_response->header.request_response_code =
    3401              :                 SPDM_KEY_UPDATE_ACK;
    3402            1 :             spdm_response->header.param1 =
    3403              :                 SPDM_KEY_UPDATE_OPERATIONS_TABLE_VERIFY_NEW_KEY;
    3404            1 :             spdm_response->header.param2 = m_libspdm_last_token;
    3405              : 
    3406              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    3407              :              * transport_message is always in sender buffer. */
    3408            1 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    3409              :                                         &scratch_buffer_size);
    3410            1 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
    3411              :                               scratch_buffer_size - transport_header_size,
    3412              :                               spdm_response, spdm_response_size);
    3413            1 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
    3414            1 :             libspdm_transport_test_encode_message(spdm_context,
    3415              :                                                   &session_id, false, false,
    3416              :                                                   spdm_response_size, spdm_response,
    3417              :                                                   response_size, response);
    3418              :             /* WALKAROUND: If just use single context to encode
    3419              :              * message and then decode message */
    3420              :             secured_message_context->application_secret
    3421            1 :             .response_data_sequence_number--;
    3422              :         }
    3423              : 
    3424            3 :         sub_index++;
    3425              :     }
    3426            3 :         return LIBSPDM_STATUS_SUCCESS;
    3427              : 
    3428           17 :     case 0x22: {
    3429              :         static uint16_t error_code = LIBSPDM_ERROR_CODE_RESERVED_00;
    3430              : 
    3431              :         uint32_t session_id;
    3432              :         libspdm_session_info_t    *session_info;
    3433              : 
    3434              :         spdm_error_response_t *spdm_response;
    3435              :         size_t spdm_response_size;
    3436              :         size_t transport_header_size;
    3437              :         uint8_t *scratch_buffer;
    3438              :         size_t scratch_buffer_size;
    3439              : 
    3440              :         libspdm_secured_message_context_t *secured_message_context;
    3441              :         uint8_t curr_rsp_enc_key[LIBSPDM_MAX_AEAD_KEY_SIZE];
    3442              :         uint8_t curr_rsp_salt[LIBSPDM_MAX_AEAD_IV_SIZE];
    3443              :         uint64_t curr_rsp_sequence_number;
    3444              : 
    3445           17 :         spdm_response_size = sizeof(spdm_error_response_t);
    3446           17 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    3447           17 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    3448              : 
    3449           17 :         session_id = 0xFFFFFFFF;
    3450           17 :         session_info = libspdm_get_session_info_via_session_id(
    3451              :             spdm_context, session_id);
    3452           17 :         if (session_info == NULL) {
    3453            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    3454              :         }
    3455           17 :         secured_message_context = session_info->secured_message_context;
    3456              : 
    3457           17 :         if(error_code <= 0xff) {
    3458              :             /* skip SPDM_ERROR_CODE_DECRYPT_ERROR, because this case will free context*/
    3459           17 :             if(error_code == SPDM_ERROR_CODE_DECRYPT_ERROR) {
    3460            1 :                 error_code++;
    3461              :             }
    3462              :             /*use previous key to send*/
    3463           17 :             libspdm_copy_mem(curr_rsp_enc_key, sizeof(curr_rsp_enc_key),
    3464              :                              secured_message_context
    3465           17 :                              ->application_secret.response_data_encryption_key,
    3466              :                              secured_message_context->aead_key_size);
    3467           17 :             libspdm_copy_mem(curr_rsp_salt, sizeof(curr_rsp_salt),
    3468              :                              secured_message_context
    3469           17 :                              ->application_secret.response_data_salt,
    3470              :                              secured_message_context->aead_iv_size);
    3471           17 :             curr_rsp_sequence_number = m_libspdm_last_rsp_sequence_number;
    3472              : 
    3473           17 :             libspdm_copy_mem(secured_message_context->application_secret
    3474           17 :                              .response_data_encryption_key,
    3475              :                              sizeof(secured_message_context->application_secret
    3476              :                                     .response_data_encryption_key),
    3477              :                              m_libspdm_last_rsp_enc_key,
    3478              :                              secured_message_context->aead_key_size);
    3479           17 :             libspdm_copy_mem(secured_message_context->application_secret
    3480           17 :                              .response_data_salt,
    3481              :                              sizeof(secured_message_context->application_secret
    3482              :                                     .response_data_salt),
    3483              :                              m_libspdm_last_rsp_salt,
    3484              :                              secured_message_context->aead_iv_size);
    3485              :             secured_message_context->application_secret
    3486           17 :             .response_data_sequence_number = m_libspdm_last_rsp_sequence_number;
    3487              : 
    3488           17 :             libspdm_zero_mem (spdm_response, spdm_response_size);
    3489           17 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    3490           17 :             spdm_response->header.request_response_code = SPDM_ERROR;
    3491           17 :             spdm_response->header.param1 = (uint8_t) error_code;
    3492           17 :             spdm_response->header.param2 = 0;
    3493              : 
    3494              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    3495              :              * transport_message is always in sender buffer. */
    3496           17 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
    3497              :                                         &scratch_buffer_size);
    3498           17 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
    3499              :                               scratch_buffer_size - transport_header_size,
    3500              :                               spdm_response, spdm_response_size);
    3501           17 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
    3502           17 :             libspdm_transport_test_encode_message(spdm_context,
    3503              :                                                   &session_id, false, false,
    3504              :                                                   spdm_response_size, spdm_response,
    3505              :                                                   response_size, response);
    3506              : 
    3507              :             /*restore new key*/
    3508           17 :             libspdm_copy_mem(secured_message_context->application_secret
    3509           17 :                              .response_data_encryption_key,
    3510              :                              sizeof(secured_message_context->application_secret
    3511              :                                     .response_data_encryption_key),
    3512              :                              curr_rsp_enc_key,
    3513              :                              secured_message_context->aead_key_size);
    3514           17 :             libspdm_copy_mem(secured_message_context->application_secret
    3515           17 :                              .response_data_salt,
    3516              :                              sizeof(secured_message_context->application_secret
    3517              :                                     .response_data_salt),
    3518              :                              curr_rsp_salt,
    3519              :                              secured_message_context->aead_iv_size);
    3520              :             secured_message_context->application_secret
    3521           17 :             .response_data_sequence_number = curr_rsp_sequence_number;
    3522              :         }
    3523              : 
    3524           17 :         error_code++;
    3525              :         /*busy is treated in cases 5 and 6*/
    3526           17 :         if(error_code == SPDM_ERROR_CODE_BUSY) {
    3527            1 :             error_code = SPDM_ERROR_CODE_UNEXPECTED_REQUEST;
    3528              :         }
    3529              :         /*skip some reserved error codes (0d to 3e)*/
    3530           17 :         if(error_code == LIBSPDM_ERROR_CODE_RESERVED_0D) {
    3531            1 :             error_code = LIBSPDM_ERROR_CODE_RESERVED_3F;
    3532              :         }
    3533              :         /*skip response not ready, request resync, and some reserved codes (44 to fc)*/
    3534           17 :         if(error_code == SPDM_ERROR_CODE_RESPONSE_NOT_READY) {
    3535            1 :             error_code = LIBSPDM_ERROR_CODE_RESERVED_FD;
    3536              :         }
    3537              :     }
    3538           17 :         return LIBSPDM_STATUS_SUCCESS;
    3539              : 
    3540            1 :     case 0x23: {
    3541              :         spdm_error_response_t *spdm_response;
    3542              :         size_t spdm_response_size;
    3543              :         size_t transport_header_size;
    3544              :         uint32_t session_id;
    3545              :         libspdm_session_info_t    *session_info;
    3546              :         uint8_t *scratch_buffer;
    3547              :         size_t scratch_buffer_size;
    3548              : 
    3549            1 :         spdm_response_size = sizeof(spdm_error_response_t);
    3550            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
    3551            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
    3552              : 
    3553            1 :         session_id = 0xFFFFFFFF;
    3554            1 :         session_info = libspdm_get_session_info_via_session_id(
    3555              :             spdm_context, session_id);
    3556            1 :         if (session_info == NULL) {
    3557            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
    3558              :         }
    3559              : 
    3560            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
    3561            1 :         spdm_response->header.request_response_code = SPDM_ERROR;
    3562            1 :         spdm_response->header.param1 = SPDM_ERROR_CODE_DECRYPT_ERROR;
    3563            1 :         spdm_response->header.param2 = 0;
    3564              : 
    3565              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
    3566              :          * transport_message is always in sender buffer. */
    3567            1 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
    3568            1 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
    3569              :                           scratch_buffer_size - transport_header_size,
    3570              :                           spdm_response, spdm_response_size);
    3571            1 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
    3572            1 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
    3573              :                                               false, false, spdm_response_size,
    3574              :                                               spdm_response, response_size, response);
    3575              :         /* WALKAROUND: If just use single context to encode
    3576              :          * message and then decode message */
    3577              :         ((libspdm_secured_message_context_t
    3578            1 :           *)(session_info->secured_message_context))
    3579            1 :         ->application_secret.response_data_sequence_number--;
    3580              :     }
    3581            1 :         return LIBSPDM_STATUS_SUCCESS;
    3582              : 
    3583            0 :     default:
    3584            0 :         return LIBSPDM_STATUS_RECEIVE_FAIL;
    3585              :     }
    3586              : }
    3587              : 
    3588              : 
    3589              : /**
    3590              :  * Test 1: when no KEY_UPDATE_ACK message is received, and the client
    3591              :  * returns a device error.
    3592              :  * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR.
    3593              :  **/
    3594            1 : static void req_key_update_case1(void **state)
    3595              : {
    3596              :     libspdm_return_t status;
    3597              :     libspdm_test_context_t    *spdm_test_context;
    3598              :     libspdm_context_t         *spdm_context;
    3599              :     uint32_t session_id;
    3600              :     libspdm_session_info_t    *session_info;
    3601              : 
    3602              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    3603              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    3604              : 
    3605            1 :     spdm_test_context = *state;
    3606            1 :     spdm_context = spdm_test_context->spdm_context;
    3607            1 :     spdm_test_context->case_id = 0x1;
    3608              : 
    3609            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    3610              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    3611            1 :     libspdm_set_standard_key_update_test_state(
    3612              :         spdm_context, &session_id);
    3613              : 
    3614            1 :     session_info = &spdm_context->session_info[0];
    3615              : 
    3616            1 :     libspdm_set_standard_key_update_test_secrets(
    3617            1 :         session_info->secured_message_context,
    3618              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    3619              :         m_req_secret_buffer, (uint8_t)(0xEE));
    3620              : 
    3621            1 :     status = libspdm_key_update(
    3622              :         spdm_context, session_id, true);
    3623              : 
    3624            1 :     assert_int_equal(status, LIBSPDM_STATUS_SEND_FAIL);
    3625            1 : }
    3626              : 
    3627              : /**
    3628              :  * Test 2: receiving a correct UPDATE_KEY_ACK message for updating
    3629              :  * only the request data key.
    3630              :  * Expected behavior: client returns a Status of LIBSPDM_STATUS_SUCCESS, the
    3631              :  * request data key is updated, but not the response data key.
    3632              :  **/
    3633            1 : static void req_key_update_case2(void **state)
    3634              : {
    3635              :     libspdm_return_t status;
    3636              :     libspdm_test_context_t    *spdm_test_context;
    3637              :     libspdm_context_t         *spdm_context;
    3638              :     uint32_t session_id;
    3639              :     libspdm_session_info_t    *session_info;
    3640              : 
    3641              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    3642              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    3643              : 
    3644            1 :     spdm_test_context = *state;
    3645            1 :     spdm_context = spdm_test_context->spdm_context;
    3646            1 :     spdm_test_context->case_id = 0x2;
    3647              : 
    3648            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    3649              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    3650            1 :     libspdm_set_standard_key_update_test_state(
    3651              :         spdm_context, &session_id);
    3652              : 
    3653            1 :     session_info = &spdm_context->session_info[0];
    3654              : 
    3655            1 :     libspdm_set_standard_key_update_test_secrets(
    3656            1 :         session_info->secured_message_context,
    3657              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    3658              :         m_req_secret_buffer, (uint8_t)(0xEE));
    3659              : 
    3660              :     /*request side updated*/
    3661            1 :     libspdm_compute_secret_update(spdm_context->connection_info.version,
    3662              :                                   ((libspdm_secured_message_context_t
    3663            1 :                                     *)(session_info->secured_message_context))->hash_size,
    3664              :                                   m_req_secret_buffer, m_req_secret_buffer,
    3665              :                                   sizeof(m_req_secret_buffer));
    3666              :     /*response side *not* updated*/
    3667              : 
    3668            1 :     status = libspdm_key_update(
    3669              :         spdm_context, session_id, true);
    3670              : 
    3671            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    3672            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    3673              :                           *)(session_info->secured_message_context))
    3674              :                         ->application_secret.request_data_secret,
    3675              :                         m_req_secret_buffer, ((libspdm_secured_message_context_t
    3676              :                                                *)(session_info->secured_message_context))->hash_size);
    3677            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    3678              :                           *)(session_info->secured_message_context))
    3679              :                         ->application_secret.response_data_secret,
    3680              :                         m_rsp_secret_buffer, ((libspdm_secured_message_context_t
    3681              :                                                *)(session_info->secured_message_context))->hash_size);
    3682            1 : }
    3683              : 
    3684              : /**
    3685              :  * Test 3: requester state has not been negotiated, as if GET_VERSION,
    3686              :  * GET_CAPABILITIES and NEGOTIATE_ALGORITHMS had not been exchanged.
    3687              :  * Expected behavior: client returns a Status of RETURN_UNSUPPORTED.
    3688              :  **/
    3689            1 : static void req_key_update_case3(void **state)
    3690              : {
    3691              :     libspdm_return_t status;
    3692              :     libspdm_test_context_t    *spdm_test_context;
    3693              :     libspdm_context_t         *spdm_context;
    3694              :     uint32_t session_id;
    3695              :     libspdm_session_info_t    *session_info;
    3696              : 
    3697              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    3698              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    3699              : 
    3700            1 :     spdm_test_context = *state;
    3701            1 :     spdm_context = spdm_test_context->spdm_context;
    3702            1 :     spdm_test_context->case_id = 0x3;
    3703              : 
    3704            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    3705              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    3706            1 :     libspdm_set_standard_key_update_test_state(
    3707              :         spdm_context, &session_id);
    3708              : 
    3709              :     /*state not negotiated*/
    3710            1 :     spdm_context->connection_info.connection_state =
    3711              :         LIBSPDM_CONNECTION_STATE_NOT_STARTED;
    3712              : 
    3713            1 :     session_info = &spdm_context->session_info[0];
    3714              : 
    3715            1 :     libspdm_set_standard_key_update_test_secrets(
    3716            1 :         session_info->secured_message_context,
    3717              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    3718              :         m_req_secret_buffer, (uint8_t)(0xEE));
    3719              : 
    3720            1 :     status = libspdm_key_update(
    3721              :         spdm_context, session_id, true);
    3722              : 
    3723            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_STATE_LOCAL);
    3724            1 : }
    3725              : 
    3726              : /**
    3727              :  * Test 4: the requester is setup correctly (see Test 2), but receives an ERROR
    3728              :  * message indicating InvalidParameters when updating key.
    3729              :  * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, and
    3730              :  * no keys should be updated.
    3731              :  **/
    3732            1 : static void req_key_update_case4(void **state)
    3733              : {
    3734              :     libspdm_return_t status;
    3735              :     libspdm_test_context_t    *spdm_test_context;
    3736              :     libspdm_context_t         *spdm_context;
    3737              :     uint32_t session_id;
    3738              :     libspdm_session_info_t    *session_info;
    3739              : 
    3740              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    3741              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    3742              : 
    3743            1 :     spdm_test_context = *state;
    3744            1 :     spdm_context = spdm_test_context->spdm_context;
    3745            1 :     spdm_test_context->case_id = 0x4;
    3746              : 
    3747            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    3748              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    3749            1 :     libspdm_set_standard_key_update_test_state(
    3750              :         spdm_context, &session_id);
    3751              : 
    3752            1 :     session_info = &spdm_context->session_info[0];
    3753              : 
    3754            1 :     libspdm_set_standard_key_update_test_secrets(
    3755            1 :         session_info->secured_message_context,
    3756              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    3757              :         m_req_secret_buffer, (uint8_t)(0xEE));
    3758              : 
    3759              :     /*no keys are updated*/
    3760              : 
    3761            1 :     status = libspdm_key_update(
    3762              :         spdm_context, session_id, true);
    3763              : 
    3764            1 :     assert_int_equal(status, LIBSPDM_STATUS_ERROR_PEER);
    3765            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    3766              :                           *)(session_info->secured_message_context))
    3767              :                         ->application_secret.request_data_secret,
    3768              :                         m_req_secret_buffer, ((libspdm_secured_message_context_t
    3769              :                                                *)(session_info->secured_message_context))->hash_size);
    3770            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    3771              :                           *)(session_info->secured_message_context))
    3772              :                         ->application_secret.response_data_secret,
    3773              :                         m_rsp_secret_buffer, ((libspdm_secured_message_context_t
    3774              :                                                *)(session_info->secured_message_context))->hash_size);
    3775            1 : }
    3776              : 
    3777              : /**
    3778              :  * Test 5: the requester is setup correctly (see Test 2), but receives an ERROR
    3779              :  * message indicating the Busy status of the responder, when updating key.
    3780              :  * Expected behavior: client returns a Status of RETURN_NO_RESPONSE, and
    3781              :  * no keys should be updated.
    3782              :  **/
    3783            1 : static void req_key_update_case5(void **state)
    3784              : {
    3785              :     libspdm_return_t status;
    3786              :     libspdm_test_context_t    *spdm_test_context;
    3787              :     libspdm_context_t         *spdm_context;
    3788              :     uint32_t session_id;
    3789              :     libspdm_session_info_t    *session_info;
    3790              : 
    3791              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    3792              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    3793              : 
    3794            1 :     spdm_test_context = *state;
    3795            1 :     spdm_context = spdm_test_context->spdm_context;
    3796            1 :     spdm_test_context->case_id = 0x5;
    3797              : 
    3798            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    3799              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    3800            1 :     libspdm_set_standard_key_update_test_state(
    3801              :         spdm_context, &session_id);
    3802              : 
    3803            1 :     session_info = &spdm_context->session_info[0];
    3804              : 
    3805            1 :     libspdm_set_standard_key_update_test_secrets(
    3806            1 :         session_info->secured_message_context,
    3807              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    3808              :         m_req_secret_buffer, (uint8_t)(0xEE));
    3809              : 
    3810              :     /*no keys are updated*/
    3811              : 
    3812            1 :     status = libspdm_key_update(
    3813              :         spdm_context, session_id, true);
    3814              : 
    3815            1 :     assert_int_equal(status, LIBSPDM_STATUS_BUSY_PEER);
    3816            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    3817              :                           *)(session_info->secured_message_context))
    3818              :                         ->application_secret.request_data_secret,
    3819              :                         m_req_secret_buffer, ((libspdm_secured_message_context_t
    3820              :                                                *)(session_info->secured_message_context))->hash_size);
    3821            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    3822              :                           *)(session_info->secured_message_context))
    3823              :                         ->application_secret.response_data_secret,
    3824              :                         m_rsp_secret_buffer, ((libspdm_secured_message_context_t
    3825              :                                                *)(session_info->secured_message_context))->hash_size);
    3826            1 : }
    3827              : 
    3828              : /**
    3829              :  * Test 6: the requester is setup correctly (see Test 2), but, when updating
    3830              :  * key, on the first try, receiving a Busy ERROR message, and on retry,
    3831              :  * receiving a correct KEY_UPDATE_ACK message. The VERIFY_KEY behavior is
    3832              :  * not altered.
    3833              :  * Expected behavior: client returns a Status of LIBSPDM_STATUS_SUCCESS, the
    3834              :  * request data key is updated, but not the response data key.
    3835              :  **/
    3836            1 : static void req_key_update_case6(void **state)
    3837              : {
    3838              :     libspdm_return_t status;
    3839              :     libspdm_test_context_t    *spdm_test_context;
    3840              :     libspdm_context_t         *spdm_context;
    3841              :     uint32_t session_id;
    3842              :     libspdm_session_info_t    *session_info;
    3843              : 
    3844              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    3845              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    3846              : 
    3847            1 :     spdm_test_context = *state;
    3848            1 :     spdm_context = spdm_test_context->spdm_context;
    3849            1 :     spdm_test_context->case_id = 0x6;
    3850              : 
    3851            1 :     spdm_context->retry_times = 3;
    3852            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    3853              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    3854            1 :     libspdm_set_standard_key_update_test_state(
    3855              :         spdm_context, &session_id);
    3856              : 
    3857            1 :     session_info = &spdm_context->session_info[0];
    3858              : 
    3859            1 :     libspdm_set_standard_key_update_test_secrets(
    3860            1 :         session_info->secured_message_context,
    3861              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    3862              :         m_req_secret_buffer, (uint8_t)(0xEE));
    3863              : 
    3864              :     /*request side updated*/
    3865            1 :     libspdm_compute_secret_update(spdm_context->connection_info.version,
    3866              :                                   ((libspdm_secured_message_context_t
    3867            1 :                                     *)(session_info->secured_message_context))->hash_size,
    3868              :                                   m_req_secret_buffer, m_req_secret_buffer,
    3869              :                                   sizeof(m_req_secret_buffer));
    3870              :     /*response side *not* updated*/
    3871              : 
    3872            1 :     status = libspdm_key_update(
    3873              :         spdm_context, session_id, true);
    3874              : 
    3875            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    3876            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    3877              :                           *)(session_info->secured_message_context))
    3878              :                         ->application_secret.request_data_secret,
    3879              :                         m_req_secret_buffer, ((libspdm_secured_message_context_t
    3880              :                                                *)(session_info->secured_message_context))->hash_size);
    3881            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    3882              :                           *)(session_info->secured_message_context))
    3883              :                         ->application_secret.response_data_secret,
    3884              :                         m_rsp_secret_buffer, ((libspdm_secured_message_context_t
    3885              :                                                *)(session_info->secured_message_context))->hash_size);
    3886            1 : }
    3887              : 
    3888              : /**
    3889              :  * Test 7: the requester is setup correctly (see Test 2), but receives an ERROR
    3890              :  * message indicating the RequestResynch status of the responder, when updating
    3891              :  * key.
    3892              :  * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, and the
    3893              :  * communication is reset to expect a new GET_VERSION message.
    3894              :  **/
    3895            1 : static void req_key_update_case7(void **state)
    3896              : {
    3897              :     libspdm_return_t status;
    3898              :     libspdm_test_context_t    *spdm_test_context;
    3899              :     libspdm_context_t         *spdm_context;
    3900              :     uint32_t session_id;
    3901              :     libspdm_session_info_t    *session_info;
    3902              : 
    3903              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    3904              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    3905              : 
    3906            1 :     spdm_test_context = *state;
    3907            1 :     spdm_context = spdm_test_context->spdm_context;
    3908            1 :     spdm_test_context->case_id = 0x7;
    3909              : 
    3910            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    3911              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    3912            1 :     libspdm_set_standard_key_update_test_state(
    3913              :         spdm_context, &session_id);
    3914              : 
    3915            1 :     session_info = &spdm_context->session_info[0];
    3916              : 
    3917            1 :     libspdm_set_standard_key_update_test_secrets(
    3918            1 :         session_info->secured_message_context,
    3919              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    3920              :         m_req_secret_buffer, (uint8_t)(0xEE));
    3921              : 
    3922            1 :     status = libspdm_key_update(
    3923              :         spdm_context, session_id, true);
    3924              : 
    3925            1 :     assert_int_equal(status, LIBSPDM_STATUS_RESYNCH_PEER);
    3926            1 :     assert_int_equal(spdm_context->connection_info.connection_state,
    3927              :                      LIBSPDM_CONNECTION_STATE_NOT_STARTED);
    3928            1 : }
    3929              : 
    3930              : /**
    3931              :  * Test 8: the requester is setup correctly (see Test 2), but receives an ERROR
    3932              :  * message indicating the ResponseNotReady status of the responder, when
    3933              :  * updating key.
    3934              :  * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, and
    3935              :  * no keys should be updated.
    3936              :  **/
    3937            1 : static void req_key_update_case8(void **state)
    3938              : {
    3939              :     libspdm_return_t status;
    3940              :     libspdm_test_context_t    *spdm_test_context;
    3941              :     libspdm_context_t         *spdm_context;
    3942              :     uint32_t session_id;
    3943              :     libspdm_session_info_t    *session_info;
    3944              : 
    3945              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    3946              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    3947              : 
    3948            1 :     spdm_test_context = *state;
    3949            1 :     spdm_context = spdm_test_context->spdm_context;
    3950            1 :     spdm_test_context->case_id = 0x8;
    3951              : 
    3952            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    3953              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    3954            1 :     libspdm_set_standard_key_update_test_state(
    3955              :         spdm_context, &session_id);
    3956              : 
    3957            1 :     session_info = &spdm_context->session_info[0];
    3958              : 
    3959            1 :     libspdm_set_standard_key_update_test_secrets(
    3960            1 :         session_info->secured_message_context,
    3961              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    3962              :         m_req_secret_buffer, (uint8_t)(0xEE));
    3963              : 
    3964              :     /*no keys are updated*/
    3965              : 
    3966            1 :     status = libspdm_key_update(
    3967              :         spdm_context, session_id, true);
    3968              : 
    3969            1 :     assert_int_equal(status, LIBSPDM_STATUS_NOT_READY_PEER);
    3970            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    3971              :                           *)(session_info->secured_message_context))
    3972              :                         ->application_secret.request_data_secret,
    3973              :                         m_req_secret_buffer, ((libspdm_secured_message_context_t
    3974              :                                                *)(session_info->secured_message_context))->hash_size);
    3975            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    3976              :                           *)(session_info->secured_message_context))
    3977              :                         ->application_secret.response_data_secret,
    3978              :                         m_rsp_secret_buffer, ((libspdm_secured_message_context_t
    3979              :                                                *)(session_info->secured_message_context))->hash_size);
    3980            1 : }
    3981              : 
    3982              : /**
    3983              :  * Test 9: the requester is setup correctly (see Test 2), but, when updating
    3984              :  * key, on the first try, receiving a ResponseNotReady ERROR message, and on
    3985              :  * retry, receiving a correct KEY_UPDATE_ACK message. The VERIFY_KEY
    3986              :  * behavior is not altered.
    3987              :  * Expected behavior: client returns a Status of LIBSPDM_STATUS_SUCCESS, the
    3988              :  * request data key is updated, but not the response data key.
    3989              :  **/
    3990            1 : static void req_key_update_case9(void **state)
    3991              : {
    3992              :     libspdm_return_t status;
    3993              :     libspdm_test_context_t    *spdm_test_context;
    3994              :     libspdm_context_t         *spdm_context;
    3995              :     uint32_t session_id;
    3996              :     libspdm_session_info_t    *session_info;
    3997              : 
    3998              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    3999              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4000              : 
    4001            1 :     spdm_test_context = *state;
    4002            1 :     spdm_context = spdm_test_context->spdm_context;
    4003            1 :     spdm_test_context->case_id = 0x9;
    4004              : 
    4005            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    4006              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    4007            1 :     libspdm_set_standard_key_update_test_state(spdm_context, &session_id);
    4008              : 
    4009            1 :     session_info = &spdm_context->session_info[0];
    4010              : 
    4011            1 :     libspdm_set_standard_key_update_test_secrets(
    4012            1 :         session_info->secured_message_context,
    4013              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    4014              :         m_req_secret_buffer, (uint8_t)(0xEE));
    4015              : 
    4016              :     /*request side updated*/
    4017            1 :     libspdm_compute_secret_update(spdm_context->connection_info.version,
    4018              :                                   ((libspdm_secured_message_context_t
    4019            1 :                                     *)(session_info->secured_message_context))->hash_size,
    4020              :                                   m_req_secret_buffer, m_req_secret_buffer,
    4021              :                                   sizeof(m_req_secret_buffer));
    4022              :     /*response side *not* updated*/
    4023              : 
    4024            1 :     status = libspdm_key_update(spdm_context, session_id, true);
    4025              : 
    4026              :     if (LIBSPDM_RESPOND_IF_READY_SUPPORT) {
    4027            1 :         assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    4028            1 :         assert_memory_equal(((libspdm_secured_message_context_t *)
    4029              :                              (session_info->secured_message_context))->application_secret.request_data_secret,
    4030              :                             m_req_secret_buffer, ((libspdm_secured_message_context_t *)
    4031              :                                                   (session_info->secured_message_context))->hash_size);
    4032              : 
    4033            1 :         assert_memory_equal(((libspdm_secured_message_context_t *)
    4034              :                              (session_info->secured_message_context))->application_secret.response_data_secret,
    4035              :                             m_rsp_secret_buffer, ((libspdm_secured_message_context_t *)
    4036              :                                                   (session_info->secured_message_context))->hash_size);
    4037              :     } else {
    4038              :         assert_int_equal(status, LIBSPDM_STATUS_NOT_READY_PEER);
    4039              :     }
    4040              : 
    4041            1 : }
    4042              : 
    4043              : /**
    4044              :  * Test 10: receiving an unexpected ERROR message from the responder,
    4045              :  * when updating key.
    4046              :  * There are tests for all named codes, including some reserved ones
    4047              :  * (namely, 0x00, 0x0b, 0x0c, 0x3f, 0xfd, 0xfe).
    4048              :  * However, for having specific test cases, it is excluded from this case:
    4049              :  * Busy (0x03), ResponseNotReady (0x42), and RequestResync (0x43).
    4050              :  * Expected behavior: client returns a status of RETURN_DEVICE_ERROR, and
    4051              :  * no keys should be updated.
    4052              :  **/
    4053            1 : static void req_key_update_case10(void **state)
    4054              : {
    4055              :     libspdm_return_t status;
    4056              :     libspdm_test_context_t    *spdm_test_context;
    4057              :     libspdm_context_t         *spdm_context;
    4058              :     uint32_t session_id;
    4059              :     libspdm_session_info_t    *session_info;
    4060              :     uint16_t error_code;
    4061              : 
    4062              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4063              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4064              : 
    4065            1 :     spdm_test_context = *state;
    4066            1 :     spdm_context = spdm_test_context->spdm_context;
    4067            1 :     spdm_test_context->case_id = 0xA;
    4068              : 
    4069            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    4070              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    4071            1 :     libspdm_set_standard_key_update_test_state(
    4072              :         spdm_context, &session_id);
    4073              : 
    4074            1 :     session_info = &spdm_context->session_info[0];
    4075              : 
    4076            1 :     error_code = LIBSPDM_ERROR_CODE_RESERVED_00;
    4077           18 :     while(error_code <= 0xff) {
    4078              :         /* skip SPDM_ERROR_CODE_DECRYPT_ERROR, because this case will free context*/
    4079           17 :         if(error_code == SPDM_ERROR_CODE_DECRYPT_ERROR) {
    4080            1 :             error_code++;
    4081              :         }
    4082           17 :         libspdm_set_standard_key_update_test_secrets(
    4083           17 :             session_info->secured_message_context,
    4084              :             m_rsp_secret_buffer, (uint8_t)(0xFF),
    4085              :             m_req_secret_buffer, (uint8_t)(0xEE));
    4086              : 
    4087              :         /*no keys are updated*/
    4088              : 
    4089           17 :         status = libspdm_key_update(
    4090              :             spdm_context, session_id, true);
    4091              : 
    4092           17 :         LIBSPDM_ASSERT_INT_EQUAL_CASE (status, LIBSPDM_STATUS_ERROR_PEER, error_code);
    4093           17 :         assert_memory_equal(((libspdm_secured_message_context_t
    4094              :                               *)(session_info->secured_message_context))
    4095              :                             ->application_secret.request_data_secret,
    4096              :                             m_req_secret_buffer, ((libspdm_secured_message_context_t
    4097              :                                                    *)(session_info->secured_message_context))->hash_size);
    4098           17 :         assert_memory_equal(((libspdm_secured_message_context_t
    4099              :                               *)(session_info->secured_message_context))
    4100              :                             ->application_secret.response_data_secret,
    4101              :                             m_rsp_secret_buffer, ((libspdm_secured_message_context_t
    4102              :                                                    *)(session_info->secured_message_context))->hash_size);
    4103              : 
    4104           17 :         error_code++;
    4105              :         /*busy is treated in cases 5 and 6*/
    4106           17 :         if(error_code == SPDM_ERROR_CODE_BUSY) {
    4107            1 :             error_code = SPDM_ERROR_CODE_UNEXPECTED_REQUEST;
    4108              :         }
    4109              :         /*skip some reserved error codes (0d to 3e)*/
    4110           17 :         if(error_code == LIBSPDM_ERROR_CODE_RESERVED_0D) {
    4111            1 :             error_code = LIBSPDM_ERROR_CODE_RESERVED_3F;
    4112              :         }
    4113              :         /*skip response not ready, request resync, and some reserved codes (44 to fc)*/
    4114           17 :         if(error_code == SPDM_ERROR_CODE_RESPONSE_NOT_READY) {
    4115            1 :             error_code = LIBSPDM_ERROR_CODE_RESERVED_FD;
    4116              :         }
    4117              :     }
    4118            1 : }
    4119              : 
    4120            1 : static void req_key_update_case11(void **state)
    4121              : {
    4122              :     libspdm_return_t status;
    4123              :     libspdm_test_context_t    *spdm_test_context;
    4124              :     libspdm_context_t         *spdm_context;
    4125              :     uint32_t session_id;
    4126              :     libspdm_session_info_t    *session_info;
    4127              : 
    4128              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4129              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4130              : 
    4131            1 :     spdm_test_context = *state;
    4132            1 :     spdm_context = spdm_test_context->spdm_context;
    4133            1 :     spdm_test_context->case_id = 0xB;
    4134              : 
    4135            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    4136              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    4137            1 :     libspdm_set_standard_key_update_test_state(
    4138              :         spdm_context, &session_id);
    4139              : 
    4140            1 :     session_info = &spdm_context->session_info[0];
    4141              : 
    4142            1 :     libspdm_set_standard_key_update_test_secrets(
    4143            1 :         session_info->secured_message_context,
    4144              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    4145              :         m_req_secret_buffer, (uint8_t)(0xEE));
    4146              : 
    4147              :     /*request side updated*/
    4148            1 :     libspdm_compute_secret_update(spdm_context->connection_info.version,
    4149              :                                   ((libspdm_secured_message_context_t
    4150            1 :                                     *)(session_info->secured_message_context))->hash_size,
    4151              :                                   m_req_secret_buffer, m_req_secret_buffer,
    4152              :                                   sizeof(m_req_secret_buffer));
    4153              :     /*response side *not* updated*/
    4154              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    4155              :     session_info->session_transcript.message_m.buffer_size =
    4156              :         session_info->session_transcript.message_m.max_buffer_size;
    4157              :     spdm_context->transcript.message_b.buffer_size =
    4158              :         spdm_context->transcript.message_b.max_buffer_size;
    4159              :     spdm_context->transcript.message_c.buffer_size =
    4160              :         spdm_context->transcript.message_c.max_buffer_size;
    4161              :     spdm_context->transcript.message_mut_b.buffer_size =
    4162              :         spdm_context->transcript.message_mut_b.max_buffer_size;
    4163              :     spdm_context->transcript.message_mut_c.buffer_size =
    4164              :         spdm_context->transcript.message_mut_c.max_buffer_size;
    4165              : #endif
    4166              : 
    4167            1 :     status = libspdm_key_update(
    4168              :         spdm_context, session_id, true);
    4169              : 
    4170            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    4171            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    4172              :                           *)(session_info->secured_message_context))
    4173              :                         ->application_secret.request_data_secret,
    4174              :                         m_req_secret_buffer, ((libspdm_secured_message_context_t
    4175              :                                                *)(session_info->secured_message_context))->hash_size);
    4176            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    4177              :                           *)(session_info->secured_message_context))
    4178              :                         ->application_secret.response_data_secret,
    4179              :                         m_rsp_secret_buffer, ((libspdm_secured_message_context_t
    4180              :                                                *)(session_info->secured_message_context))->hash_size);
    4181              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    4182              :     assert_int_equal(session_info->session_transcript.message_m.buffer_size, 0);
    4183              :     assert_int_equal(spdm_context->transcript.message_b.buffer_size, 0);
    4184              :     assert_int_equal(spdm_context->transcript.message_c.buffer_size, 0);
    4185              :     assert_int_equal(spdm_context->transcript.message_mut_b.buffer_size, 0);
    4186              :     assert_int_equal(spdm_context->transcript.message_mut_c.buffer_size, 0);
    4187              : #endif
    4188            1 : }
    4189              : 
    4190              : /**
    4191              :  * Test 12: requester is not setup correctly to support key update
    4192              :  * (no capabilities). The responder would attempt to return a correct
    4193              :  * KEY_UPDATE_ACK message.
    4194              :  * Expected behavior: client returns a Status of RETURN_UNSUPPORTED,
    4195              :  * and no keys are updated.
    4196              :  **/
    4197            1 : static void req_key_update_case12(void **state)
    4198              : {
    4199              :     libspdm_return_t status;
    4200              :     libspdm_test_context_t    *spdm_test_context;
    4201              :     libspdm_context_t         *spdm_context;
    4202              :     uint32_t session_id;
    4203              :     libspdm_session_info_t    *session_info;
    4204              : 
    4205              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4206              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4207              : 
    4208            1 :     spdm_test_context = *state;
    4209            1 :     spdm_context = spdm_test_context->spdm_context;
    4210            1 :     spdm_test_context->case_id = 0xC;
    4211              : 
    4212            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    4213              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    4214            1 :     libspdm_set_standard_key_update_test_state(
    4215              :         spdm_context, &session_id);
    4216              : 
    4217              :     /*no capabilities*/
    4218            1 :     spdm_context->connection_info.capability.flags &=
    4219              :         ~SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_UPD_CAP;
    4220            1 :     spdm_context->local_context.capability.flags &=
    4221              :         ~SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_UPD_CAP;
    4222              : 
    4223            1 :     session_info = &spdm_context->session_info[0];
    4224              : 
    4225            1 :     libspdm_set_standard_key_update_test_secrets(
    4226            1 :         session_info->secured_message_context,
    4227              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    4228              :         m_req_secret_buffer, (uint8_t)(0xEE));
    4229              : 
    4230              :     /*no keys are updated*/
    4231              : 
    4232            1 :     status = libspdm_key_update(
    4233              :         spdm_context, session_id, true);
    4234              : 
    4235            1 :     assert_int_equal(status, LIBSPDM_STATUS_UNSUPPORTED_CAP);
    4236            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    4237              :                           *)(session_info->secured_message_context))
    4238              :                         ->application_secret.request_data_secret,
    4239              :                         m_req_secret_buffer, ((libspdm_secured_message_context_t
    4240              :                                                *)(session_info->secured_message_context))->hash_size);
    4241            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    4242              :                           *)(session_info->secured_message_context))
    4243              :                         ->application_secret.response_data_secret,
    4244              :                         m_rsp_secret_buffer, ((libspdm_secured_message_context_t
    4245              :                                                *)(session_info->secured_message_context))->hash_size);
    4246            1 : }
    4247              : 
    4248              : /**
    4249              :  * Test 13: receiving an incorrect KEY_UPDATE_ACK message, with wrong
    4250              :  * response code, but all other field correct, when updating key.
    4251              :  * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR,
    4252              :  * no keys are updated.
    4253              :  **/
    4254            1 : static void req_key_update_case13(void **state)
    4255              : {
    4256              :     libspdm_return_t status;
    4257              :     libspdm_test_context_t    *spdm_test_context;
    4258              :     libspdm_context_t         *spdm_context;
    4259              :     uint32_t session_id;
    4260              :     libspdm_session_info_t    *session_info;
    4261              : 
    4262              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4263              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4264              : 
    4265            1 :     spdm_test_context = *state;
    4266            1 :     spdm_context = spdm_test_context->spdm_context;
    4267            1 :     spdm_test_context->case_id = 0xC;
    4268              : 
    4269            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    4270              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    4271            1 :     libspdm_set_standard_key_update_test_state(
    4272              :         spdm_context, &session_id);
    4273              : 
    4274            1 :     session_info = &spdm_context->session_info[0];
    4275              : 
    4276            1 :     libspdm_set_standard_key_update_test_secrets(
    4277            1 :         session_info->secured_message_context,
    4278              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    4279              :         m_req_secret_buffer, (uint8_t)(0xEE));
    4280              : 
    4281              :     /*no keys are updated*/
    4282              : 
    4283            1 :     status = libspdm_key_update(
    4284              :         spdm_context, session_id, true);
    4285              : 
    4286            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
    4287            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    4288              :                           *)(session_info->secured_message_context))
    4289              :                         ->application_secret.request_data_secret,
    4290              :                         m_req_secret_buffer, ((libspdm_secured_message_context_t
    4291              :                                                *)(session_info->secured_message_context))->hash_size);
    4292            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    4293              :                           *)(session_info->secured_message_context))
    4294              :                         ->application_secret.response_data_secret,
    4295              :                         m_rsp_secret_buffer, ((libspdm_secured_message_context_t
    4296              :                                                *)(session_info->secured_message_context))->hash_size);
    4297            1 : }
    4298              : 
    4299              : /**
    4300              :  * Test 14: requester is not setup correctly by not initializing a
    4301              :  * session during KEY_EXCHANGE. The responder would attempt to
    4302              :  * return a correct KEY_UPDATE_ACK message.
    4303              :  * Expected behavior: client returns a Status of RETURN_UNSUPPORTED,
    4304              :  * and no keys are updated.
    4305              :  **/
    4306            1 : static void req_key_update_case14(void **state)
    4307              : {
    4308              :     libspdm_return_t status;
    4309              :     libspdm_test_context_t    *spdm_test_context;
    4310              :     libspdm_context_t         *spdm_context;
    4311              :     uint32_t session_id;
    4312              :     libspdm_session_info_t    *session_info;
    4313              : 
    4314              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4315              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4316              : 
    4317            1 :     spdm_test_context = *state;
    4318            1 :     spdm_context = spdm_test_context->spdm_context;
    4319            1 :     spdm_test_context->case_id = 0xD;
    4320              : 
    4321            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    4322              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    4323            1 :     libspdm_set_standard_key_update_test_state(
    4324              :         spdm_context, &session_id);
    4325              : 
    4326            1 :     session_info = &spdm_context->session_info[0];
    4327              : 
    4328              :     /*session not initialized*/
    4329            1 :     libspdm_secured_message_set_session_state(
    4330              :         session_info->secured_message_context,
    4331              :         LIBSPDM_SESSION_STATE_NOT_STARTED);
    4332              : 
    4333            1 :     libspdm_set_standard_key_update_test_secrets(
    4334            1 :         session_info->secured_message_context,
    4335              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    4336              :         m_req_secret_buffer, (uint8_t)(0xEE));
    4337              : 
    4338              :     /*no keys are updated*/
    4339              : 
    4340            1 :     status = libspdm_key_update(
    4341              :         spdm_context, session_id, true);
    4342              : 
    4343            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_STATE_LOCAL);
    4344            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    4345              :                           *)(session_info->secured_message_context))
    4346              :                         ->application_secret.request_data_secret,
    4347              :                         m_req_secret_buffer, ((libspdm_secured_message_context_t
    4348              :                                                *)(session_info->secured_message_context))->hash_size);
    4349            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    4350              :                           *)(session_info->secured_message_context))
    4351              :                         ->application_secret.response_data_secret,
    4352              :                         m_rsp_secret_buffer, ((libspdm_secured_message_context_t
    4353              :                                                *)(session_info->secured_message_context))->hash_size);
    4354            1 : }
    4355              : 
    4356              : /**
    4357              :  * Test 15: the requester is setup correctly (see Test 2), but receives a
    4358              :  * KEY_UPDATE_ACK response with the wrong token. The VERIFY_KEY behavior
    4359              :  * is not altered.
    4360              :  * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, and
    4361              :  * no keys should be updated.
    4362              :  **/
    4363            1 : static void req_key_update_case15(void **state)
    4364              : {
    4365              :     libspdm_return_t status;
    4366              :     libspdm_test_context_t    *spdm_test_context;
    4367              :     libspdm_context_t         *spdm_context;
    4368              :     uint32_t session_id;
    4369              :     libspdm_session_info_t    *session_info;
    4370              : 
    4371              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4372              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4373              : 
    4374            1 :     spdm_test_context = *state;
    4375            1 :     spdm_context = spdm_test_context->spdm_context;
    4376            1 :     spdm_test_context->case_id = 0xF;
    4377              : 
    4378            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    4379              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    4380            1 :     libspdm_set_standard_key_update_test_state(
    4381              :         spdm_context, &session_id);
    4382              : 
    4383            1 :     session_info = &spdm_context->session_info[0];
    4384              : 
    4385            1 :     libspdm_set_standard_key_update_test_secrets(
    4386            1 :         session_info->secured_message_context,
    4387              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    4388              :         m_req_secret_buffer, (uint8_t)(0xEE));
    4389              : 
    4390              :     /*no keys are updated*/
    4391              : 
    4392            1 :     status = libspdm_key_update(
    4393              :         spdm_context, session_id, true);
    4394              : 
    4395            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
    4396            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    4397              :                           *)(session_info->secured_message_context))
    4398              :                         ->application_secret.request_data_secret,
    4399              :                         m_req_secret_buffer, ((libspdm_secured_message_context_t
    4400              :                                                *)(session_info->secured_message_context))->hash_size);
    4401            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    4402              :                           *)(session_info->secured_message_context))
    4403              :                         ->application_secret.response_data_secret,
    4404              :                         m_rsp_secret_buffer, ((libspdm_secured_message_context_t
    4405              :                                                *)(session_info->secured_message_context))->hash_size);
    4406            1 : }
    4407              : 
    4408              : /**
    4409              :  * Test 16: the requester is setup correctly (see Test 2), but receives a
    4410              :  * KEY_UPDATE_ACK response with the operation code. The VERIFY_KEY
    4411              :  * behavior is not altered.
    4412              :  * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, and
    4413              :  * no keys should be updated.
    4414              :  **/
    4415            1 : static void req_key_update_case16(void **state)
    4416              : {
    4417              :     libspdm_return_t status;
    4418              :     libspdm_test_context_t    *spdm_test_context;
    4419              :     libspdm_context_t         *spdm_context;
    4420              :     uint32_t session_id;
    4421              :     libspdm_session_info_t    *session_info;
    4422              : 
    4423              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4424              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4425              : 
    4426            1 :     spdm_test_context = *state;
    4427            1 :     spdm_context = spdm_test_context->spdm_context;
    4428            1 :     spdm_test_context->case_id = 0x10;
    4429              : 
    4430            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    4431              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    4432            1 :     libspdm_set_standard_key_update_test_state(
    4433              :         spdm_context, &session_id);
    4434              : 
    4435            1 :     session_info = &spdm_context->session_info[0];
    4436              : 
    4437            1 :     libspdm_set_standard_key_update_test_secrets(
    4438            1 :         session_info->secured_message_context,
    4439              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    4440              :         m_req_secret_buffer, (uint8_t)(0xEE));
    4441              : 
    4442              :     /*no keys are updated*/
    4443              : 
    4444            1 :     status = libspdm_key_update(
    4445              :         spdm_context, session_id, true);
    4446              : 
    4447            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
    4448            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    4449              :                           *)(session_info->secured_message_context))
    4450              :                         ->application_secret.request_data_secret,
    4451              :                         m_req_secret_buffer, ((libspdm_secured_message_context_t
    4452              :                                                *)(session_info->secured_message_context))->hash_size);
    4453            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    4454              :                           *)(session_info->secured_message_context))
    4455              :                         ->application_secret.response_data_secret,
    4456              :                         m_rsp_secret_buffer, ((libspdm_secured_message_context_t
    4457              :                                                *)(session_info->secured_message_context))->hash_size);
    4458            1 : }
    4459              : 
    4460              : /**
    4461              :  * Test 17: the requester is setup correctly (see Test 2), but receives an
    4462              :  * ERROR message indicating InvalidParameters when verifying key.
    4463              :  * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, the
    4464              :  * request data key is not rollbacked.
    4465              :  **/
    4466            1 : static void req_key_update_case17(void **state)
    4467              : {
    4468              :     libspdm_return_t status;
    4469              :     libspdm_test_context_t    *spdm_test_context;
    4470              :     libspdm_context_t         *spdm_context;
    4471              :     uint32_t session_id;
    4472              :     libspdm_session_info_t    *session_info;
    4473              : 
    4474              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4475              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4476              : 
    4477            1 :     spdm_test_context = *state;
    4478            1 :     spdm_context = spdm_test_context->spdm_context;
    4479            1 :     spdm_test_context->case_id = 0x11;
    4480              : 
    4481            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    4482              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    4483            1 :     libspdm_set_standard_key_update_test_state(spdm_context, &session_id);
    4484              : 
    4485            1 :     session_info = &spdm_context->session_info[0];
    4486              : 
    4487            1 :     libspdm_set_standard_key_update_test_secrets(
    4488            1 :         session_info->secured_message_context,
    4489              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    4490              :         m_req_secret_buffer, (uint8_t)(0xEE));
    4491              : 
    4492              :     /*request side updated*/
    4493            1 :     libspdm_compute_secret_update(spdm_context->connection_info.version,
    4494              :                                   ((libspdm_secured_message_context_t
    4495            1 :                                     *)(session_info->secured_message_context))->hash_size,
    4496              :                                   m_req_secret_buffer, m_req_secret_buffer,
    4497              :                                   sizeof(m_req_secret_buffer));
    4498              :     /*response side *not* updated*/
    4499              : 
    4500            1 :     status = libspdm_key_update(spdm_context, session_id, true);
    4501              : 
    4502            1 :     assert_int_equal(status, LIBSPDM_STATUS_ERROR_PEER);
    4503            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    4504              :                           *)(session_info->secured_message_context))
    4505              :                         ->application_secret.request_data_secret,
    4506              :                         m_req_secret_buffer, ((libspdm_secured_message_context_t
    4507              :                                                *)(session_info->secured_message_context))->hash_size);
    4508            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    4509              :                           *)(session_info->secured_message_context))
    4510              :                         ->application_secret.response_data_secret,
    4511              :                         m_rsp_secret_buffer, ((libspdm_secured_message_context_t
    4512              :                                                *)(session_info->secured_message_context))->hash_size);
    4513            1 : }
    4514              : 
    4515              : /**
    4516              :  * Test 18: the requester is setup correctly (see Test 2), but receives an
    4517              :  * ERROR message indicating the Busy status of the responder, when verifying
    4518              :  * key.
    4519              :  * Expected behavior: client returns a Status of RETURN_NO_RESPONSE, the
    4520              :  * request data key is not rollbacked.
    4521              :  **/
    4522            1 : static void req_key_update_case18(void **state)
    4523              : {
    4524              :     libspdm_return_t status;
    4525              :     libspdm_test_context_t    *spdm_test_context;
    4526              :     libspdm_context_t         *spdm_context;
    4527              :     uint32_t session_id;
    4528              :     libspdm_session_info_t    *session_info;
    4529              : 
    4530              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4531              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4532              : 
    4533            1 :     spdm_test_context = *state;
    4534            1 :     spdm_context = spdm_test_context->spdm_context;
    4535            1 :     spdm_test_context->case_id = 0x12;
    4536              : 
    4537            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    4538              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    4539            1 :     libspdm_set_standard_key_update_test_state(
    4540              :         spdm_context, &session_id);
    4541              : 
    4542            1 :     session_info = &spdm_context->session_info[0];
    4543              : 
    4544            1 :     libspdm_set_standard_key_update_test_secrets(
    4545            1 :         session_info->secured_message_context,
    4546              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    4547              :         m_req_secret_buffer, (uint8_t)(0xEE));
    4548              : 
    4549              :     /*request side updated*/
    4550            1 :     libspdm_compute_secret_update(spdm_context->connection_info.version,
    4551              :                                   ((libspdm_secured_message_context_t
    4552            1 :                                     *)(session_info->secured_message_context))->hash_size,
    4553              :                                   m_req_secret_buffer, m_req_secret_buffer,
    4554              :                                   sizeof(m_req_secret_buffer));
    4555              :     /*response side *not* updated*/
    4556              : 
    4557            1 :     status = libspdm_key_update(
    4558              :         spdm_context, session_id, true);
    4559              : 
    4560            1 :     assert_int_equal(status, LIBSPDM_STATUS_BUSY_PEER);
    4561            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    4562              :                           *)(session_info->secured_message_context))
    4563              :                         ->application_secret.request_data_secret,
    4564              :                         m_req_secret_buffer, ((libspdm_secured_message_context_t
    4565              :                                                *)(session_info->secured_message_context))->hash_size);
    4566            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    4567              :                           *)(session_info->secured_message_context))
    4568              :                         ->application_secret.response_data_secret,
    4569              :                         m_rsp_secret_buffer, ((libspdm_secured_message_context_t
    4570              :                                                *)(session_info->secured_message_context))->hash_size);
    4571            1 : }
    4572              : 
    4573              : /**
    4574              :  * Test 19: the requester is setup correctly (see Test 2), but, when
    4575              :  * verifying key, on the first try, receiving a Busy ERROR message,
    4576              :  * and on retry, receiving a correct KEY_UPDATE_ACK message. The
    4577              :  * VERIFY_KEY behavior is not altered.
    4578              :  * Expected behavior: client returns a Status of LIBSPDM_STATUS_SUCCESS, the
    4579              :  * request data key is not rollbacked.
    4580              :  **/
    4581            1 : static void req_key_update_case19(void **state)
    4582              : {
    4583              :     libspdm_return_t status;
    4584              :     libspdm_test_context_t    *spdm_test_context;
    4585              :     libspdm_context_t         *spdm_context;
    4586              :     uint32_t session_id;
    4587              :     libspdm_session_info_t    *session_info;
    4588              : 
    4589              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4590              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4591              : 
    4592            1 :     spdm_test_context = *state;
    4593            1 :     spdm_context = spdm_test_context->spdm_context;
    4594            1 :     spdm_test_context->case_id = 0x13;
    4595              : 
    4596            1 :     spdm_context->retry_times = 3;
    4597            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    4598              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    4599            1 :     libspdm_set_standard_key_update_test_state(
    4600              :         spdm_context, &session_id);
    4601              : 
    4602            1 :     session_info = &spdm_context->session_info[0];
    4603              : 
    4604            1 :     libspdm_set_standard_key_update_test_secrets(
    4605            1 :         session_info->secured_message_context,
    4606              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    4607              :         m_req_secret_buffer, (uint8_t)(0xEE));
    4608              : 
    4609              :     /*request side updated*/
    4610            1 :     libspdm_compute_secret_update(spdm_context->connection_info.version,
    4611              :                                   ((libspdm_secured_message_context_t
    4612            1 :                                     *)(session_info->secured_message_context))->hash_size,
    4613              :                                   m_req_secret_buffer, m_req_secret_buffer,
    4614              :                                   sizeof(m_req_secret_buffer));
    4615              :     /*response side *not* updated*/
    4616              : 
    4617            1 :     status = libspdm_key_update(
    4618              :         spdm_context, session_id, true);
    4619              : 
    4620            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    4621            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    4622              :                           *)(session_info->secured_message_context))
    4623              :                         ->application_secret.request_data_secret,
    4624              :                         m_req_secret_buffer, ((libspdm_secured_message_context_t
    4625              :                                                *)(session_info->secured_message_context))->hash_size);
    4626            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    4627              :                           *)(session_info->secured_message_context))
    4628              :                         ->application_secret.response_data_secret,
    4629              :                         m_rsp_secret_buffer, ((libspdm_secured_message_context_t
    4630              :                                                *)(session_info->secured_message_context))->hash_size);
    4631            1 : }
    4632              : 
    4633              : /**
    4634              :  * Test 20: the requester is setup correctly (see Test 2), but receives an
    4635              :  * ERROR message indicating the RequestResynch status of the responder, when
    4636              :  * verifying key.
    4637              :  * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, and the
    4638              :  * communication is reset to expect a new GET_VERSION message.
    4639              :  **/
    4640            1 : static void req_key_update_case20(void **state)
    4641              : {
    4642              :     libspdm_return_t status;
    4643              :     libspdm_test_context_t    *spdm_test_context;
    4644              :     libspdm_context_t         *spdm_context;
    4645              :     uint32_t session_id;
    4646              :     libspdm_session_info_t    *session_info;
    4647              : 
    4648              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4649              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4650              : 
    4651            1 :     spdm_test_context = *state;
    4652            1 :     spdm_context = spdm_test_context->spdm_context;
    4653            1 :     spdm_test_context->case_id = 0x14;
    4654              : 
    4655            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    4656              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    4657            1 :     libspdm_set_standard_key_update_test_state(
    4658              :         spdm_context, &session_id);
    4659              : 
    4660            1 :     session_info = &spdm_context->session_info[0];
    4661              : 
    4662            1 :     libspdm_set_standard_key_update_test_secrets(
    4663            1 :         session_info->secured_message_context,
    4664              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    4665              :         m_req_secret_buffer, (uint8_t)(0xEE));
    4666              : 
    4667            1 :     status = libspdm_key_update(
    4668              :         spdm_context, session_id, true);
    4669              : 
    4670            1 :     assert_int_equal(status, LIBSPDM_STATUS_RESYNCH_PEER);
    4671            1 :     assert_int_equal(spdm_context->connection_info.connection_state,
    4672              :                      LIBSPDM_CONNECTION_STATE_NOT_STARTED);
    4673            1 : }
    4674              : 
    4675              : /**
    4676              :  * Test 21: the requester is setup correctly (see Test 2), but receives an
    4677              :  * ERROR message indicating the ResponseNotReady status of the responder, when
    4678              :  * verifying key.
    4679              :  * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, the
    4680              :  * request data key is not rollbacked.
    4681              :  **/
    4682            1 : static void req_key_update_case21(void **state)
    4683              : {
    4684              :     libspdm_return_t status;
    4685              :     libspdm_test_context_t    *spdm_test_context;
    4686              :     libspdm_context_t         *spdm_context;
    4687              :     uint32_t session_id;
    4688              :     libspdm_session_info_t    *session_info;
    4689              : 
    4690              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4691              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4692              : 
    4693            1 :     spdm_test_context = *state;
    4694            1 :     spdm_context = spdm_test_context->spdm_context;
    4695            1 :     spdm_test_context->case_id = 0x15;
    4696              : 
    4697            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    4698              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    4699            1 :     libspdm_set_standard_key_update_test_state(
    4700              :         spdm_context, &session_id);
    4701              : 
    4702            1 :     session_info = &spdm_context->session_info[0];
    4703              : 
    4704            1 :     libspdm_set_standard_key_update_test_secrets(
    4705            1 :         session_info->secured_message_context,
    4706              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    4707              :         m_req_secret_buffer, (uint8_t)(0xEE));
    4708              : 
    4709              :     /*request side updated*/
    4710            1 :     libspdm_compute_secret_update(spdm_context->connection_info.version,
    4711              :                                   ((libspdm_secured_message_context_t
    4712            1 :                                     *)(session_info->secured_message_context))->hash_size,
    4713              :                                   m_req_secret_buffer, m_req_secret_buffer,
    4714              :                                   sizeof(m_req_secret_buffer));
    4715              :     /*response side *not* updated*/
    4716              : 
    4717            1 :     status = libspdm_key_update(
    4718              :         spdm_context, session_id, true);
    4719              : 
    4720            1 :     assert_int_equal(status, LIBSPDM_STATUS_NOT_READY_PEER);
    4721            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    4722              :                           *)(session_info->secured_message_context))
    4723              :                         ->application_secret.request_data_secret,
    4724              :                         m_req_secret_buffer, ((libspdm_secured_message_context_t
    4725              :                                                *)(session_info->secured_message_context))->hash_size);
    4726            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    4727              :                           *)(session_info->secured_message_context))
    4728              :                         ->application_secret.response_data_secret,
    4729              :                         m_rsp_secret_buffer, ((libspdm_secured_message_context_t
    4730              :                                                *)(session_info->secured_message_context))->hash_size);
    4731            1 : }
    4732              : 
    4733              : /**
    4734              :  * Test 22: the requester is setup correctly (see Test 2), but, when verifying
    4735              :  * key, on the first try, receiving a ResponseNotReady ERROR message, and on
    4736              :  * retry, receiving a correct KEY_UPDATE_ACK message.
    4737              :  * Expected behavior: client returns a Status of LIBSPDM_STATUS_SUCCESS, the
    4738              :  * request data key is not rollbacked.
    4739              :  **/
    4740            1 : static void req_key_update_case22(void **state)
    4741              : {
    4742              :     libspdm_return_t status;
    4743              :     libspdm_test_context_t    *spdm_test_context;
    4744              :     libspdm_context_t         *spdm_context;
    4745              :     uint32_t session_id;
    4746              :     libspdm_session_info_t    *session_info;
    4747              : 
    4748              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4749              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4750              : 
    4751            1 :     spdm_test_context = *state;
    4752            1 :     spdm_context = spdm_test_context->spdm_context;
    4753            1 :     spdm_test_context->case_id = 0x16;
    4754              : 
    4755            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    4756              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    4757            1 :     libspdm_set_standard_key_update_test_state(
    4758              :         spdm_context, &session_id);
    4759              : 
    4760            1 :     session_info = &spdm_context->session_info[0];
    4761              : 
    4762            1 :     libspdm_set_standard_key_update_test_secrets(
    4763            1 :         session_info->secured_message_context,
    4764              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    4765              :         m_req_secret_buffer, (uint8_t)(0xEE));
    4766              : 
    4767              :     /*request side updated*/
    4768            1 :     libspdm_compute_secret_update(spdm_context->connection_info.version,
    4769              :                                   ((libspdm_secured_message_context_t
    4770            1 :                                     *)(session_info->secured_message_context))->hash_size,
    4771              :                                   m_req_secret_buffer, m_req_secret_buffer,
    4772              :                                   sizeof(m_req_secret_buffer));
    4773              :     /*response side *not* updated*/
    4774              : 
    4775            1 :     status = libspdm_key_update(spdm_context, session_id, true);
    4776              : 
    4777              :     if (LIBSPDM_RESPOND_IF_READY_SUPPORT) {
    4778            1 :         assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    4779            1 :         assert_memory_equal(((libspdm_secured_message_context_t
    4780              :                               *)(session_info->secured_message_context))
    4781              :                             ->application_secret.request_data_secret,
    4782              :                             m_req_secret_buffer, ((libspdm_secured_message_context_t
    4783              :                                                    *)(session_info->secured_message_context))->hash_size);
    4784            1 :         assert_memory_equal(((libspdm_secured_message_context_t
    4785              :                               *)(session_info->secured_message_context))
    4786              :                             ->application_secret.response_data_secret,
    4787              :                             m_rsp_secret_buffer, ((libspdm_secured_message_context_t
    4788              :                                                    *)(session_info->secured_message_context))->hash_size);
    4789              :     } else {
    4790              :         assert_int_equal(status, LIBSPDM_STATUS_NOT_READY_PEER);
    4791              :     }
    4792            1 : }
    4793              : 
    4794              : /**
    4795              :  * Test 23: receiving an unexpected ERROR message from the responder,
    4796              :  * when verifying key.
    4797              :  * There are tests for all named codes, including some reserved ones
    4798              :  * (namely, 0x00, 0x0b, 0x0c, 0x3f, 0xfd, 0xfe).
    4799              :  * However, for having specific test cases, it is excluded from this case:
    4800              :  * Busy (0x03), ResponseNotReady (0x42), and RequestResync (0x43).
    4801              :  * Expected behavior: client returns a status of RETURN_DEVICE_ERROR, the
    4802              :  * request data key is not rollbacked.
    4803              :  **/
    4804            1 : static void req_key_update_case23(void **state)
    4805              : {
    4806              :     libspdm_return_t status;
    4807              :     libspdm_test_context_t    *spdm_test_context;
    4808              :     libspdm_context_t         *spdm_context;
    4809              :     uint32_t session_id;
    4810              :     libspdm_session_info_t    *session_info;
    4811              :     uint16_t error_code;
    4812              : 
    4813              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4814              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4815              : 
    4816            1 :     spdm_test_context = *state;
    4817            1 :     spdm_context = spdm_test_context->spdm_context;
    4818            1 :     spdm_test_context->case_id = 0x17;
    4819              : 
    4820            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    4821              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    4822            1 :     libspdm_set_standard_key_update_test_state(
    4823              :         spdm_context, &session_id);
    4824              : 
    4825            1 :     session_info = &spdm_context->session_info[0];
    4826              : 
    4827            1 :     error_code = LIBSPDM_ERROR_CODE_RESERVED_00;
    4828           18 :     while(error_code <= 0xff) {
    4829              :         /* skip SPDM_ERROR_CODE_DECRYPT_ERROR, because this case will free context*/
    4830           17 :         if(error_code == SPDM_ERROR_CODE_DECRYPT_ERROR) {
    4831            1 :             error_code++;
    4832              :         }
    4833           17 :         libspdm_set_standard_key_update_test_secrets(
    4834           17 :             session_info->secured_message_context,
    4835              :             m_rsp_secret_buffer, (uint8_t)(0xFF),
    4836              :             m_req_secret_buffer, (uint8_t)(0xEE));
    4837              : 
    4838              :         /*request side updated*/
    4839           17 :         libspdm_compute_secret_update(spdm_context->connection_info.version,
    4840              :                                       ((libspdm_secured_message_context_t
    4841           17 :                                         *)(session_info->secured_message_context))->hash_size,
    4842              :                                       m_req_secret_buffer, m_req_secret_buffer,
    4843              :                                       sizeof(m_req_secret_buffer));
    4844              :         /*response side *not* updated*/
    4845              : 
    4846           17 :         status = libspdm_key_update(
    4847              :             spdm_context, session_id, true);
    4848              : 
    4849           17 :         LIBSPDM_ASSERT_INT_EQUAL_CASE (status, LIBSPDM_STATUS_ERROR_PEER, error_code);
    4850           17 :         assert_memory_equal(((libspdm_secured_message_context_t
    4851              :                               *)(session_info->secured_message_context))
    4852              :                             ->application_secret.request_data_secret,
    4853              :                             m_req_secret_buffer, ((libspdm_secured_message_context_t
    4854              :                                                    *)(session_info->secured_message_context))->hash_size);
    4855           17 :         assert_memory_equal(((libspdm_secured_message_context_t
    4856              :                               *)(session_info->secured_message_context))
    4857              :                             ->application_secret.response_data_secret,
    4858              :                             m_rsp_secret_buffer, ((libspdm_secured_message_context_t
    4859              :                                                    *)(session_info->secured_message_context))->hash_size);
    4860              : 
    4861           17 :         error_code++;
    4862              :         /*busy is treated in cases 5 and 6*/
    4863           17 :         if(error_code == SPDM_ERROR_CODE_BUSY) {
    4864            1 :             error_code = SPDM_ERROR_CODE_UNEXPECTED_REQUEST;
    4865              :         }
    4866              :         /*skip some reserved error codes (0d to 3e)*/
    4867           17 :         if(error_code == LIBSPDM_ERROR_CODE_RESERVED_0D) {
    4868            1 :             error_code = LIBSPDM_ERROR_CODE_RESERVED_3F;
    4869              :         }
    4870              :         /*skip response not ready, request resync, and some reserved codes (44 to fc)*/
    4871           17 :         if(error_code == SPDM_ERROR_CODE_RESPONSE_NOT_READY) {
    4872            1 :             error_code = LIBSPDM_ERROR_CODE_RESERVED_FD;
    4873              :         }
    4874              :     }
    4875            1 : }
    4876              : 
    4877              : /**
    4878              :  * Test 24: receiving an incorrect KEY_UPDATE_ACK message, with wrong
    4879              :  * response code, but all other field correct, when verifying key.
    4880              :  * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, the
    4881              :  * request data key is not rollbacked.
    4882              :  **/
    4883            1 : static void req_key_update_case24(void **state)
    4884              : {
    4885              :     libspdm_return_t status;
    4886              :     libspdm_test_context_t    *spdm_test_context;
    4887              :     libspdm_context_t         *spdm_context;
    4888              :     uint32_t session_id;
    4889              :     libspdm_session_info_t    *session_info;
    4890              : 
    4891              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4892              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4893              : 
    4894            1 :     spdm_test_context = *state;
    4895            1 :     spdm_context = spdm_test_context->spdm_context;
    4896            1 :     spdm_test_context->case_id = 0x18;
    4897              : 
    4898            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    4899              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    4900            1 :     libspdm_set_standard_key_update_test_state(
    4901              :         spdm_context, &session_id);
    4902              : 
    4903            1 :     session_info = &spdm_context->session_info[0];
    4904              : 
    4905            1 :     libspdm_set_standard_key_update_test_secrets(
    4906            1 :         session_info->secured_message_context,
    4907              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    4908              :         m_req_secret_buffer, (uint8_t)(0xEE));
    4909              : 
    4910              :     /*request side updated*/
    4911            1 :     libspdm_compute_secret_update(spdm_context->connection_info.version,
    4912              :                                   ((libspdm_secured_message_context_t
    4913            1 :                                     *)(session_info->secured_message_context))->hash_size,
    4914              :                                   m_req_secret_buffer, m_req_secret_buffer,
    4915              :                                   sizeof(m_req_secret_buffer));
    4916              :     /*response side *not* updated*/
    4917              : 
    4918            1 :     status = libspdm_key_update(
    4919              :         spdm_context, session_id, true);
    4920              : 
    4921            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
    4922            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    4923              :                           *)(session_info->secured_message_context))
    4924              :                         ->application_secret.request_data_secret,
    4925              :                         m_req_secret_buffer, ((libspdm_secured_message_context_t
    4926              :                                                *)(session_info->secured_message_context))->hash_size);
    4927            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    4928              :                           *)(session_info->secured_message_context))
    4929              :                         ->application_secret.response_data_secret,
    4930              :                         m_rsp_secret_buffer, ((libspdm_secured_message_context_t
    4931              :                                                *)(session_info->secured_message_context))->hash_size);
    4932            1 : }
    4933              : 
    4934              : /**
    4935              :  * Test 25: the requester is setup correctly (see Test 2), and receives a
    4936              :  * correct KEY_UPDATE_ACK to update key. However, it receives a
    4937              :  * KEY_UPDATE_ACK response with the wrong token to verify the key.
    4938              :  * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, the
    4939              :  * request data key is not rollbacked.
    4940              :  **/
    4941            1 : static void req_key_update_case25(void **state)
    4942              : {
    4943              :     libspdm_return_t status;
    4944              :     libspdm_test_context_t    *spdm_test_context;
    4945              :     libspdm_context_t         *spdm_context;
    4946              :     uint32_t session_id;
    4947              :     libspdm_session_info_t    *session_info;
    4948              : 
    4949              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4950              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    4951              : 
    4952            1 :     spdm_test_context = *state;
    4953            1 :     spdm_context = spdm_test_context->spdm_context;
    4954            1 :     spdm_test_context->case_id = 0x19;
    4955              : 
    4956            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    4957              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    4958            1 :     libspdm_set_standard_key_update_test_state(
    4959              :         spdm_context, &session_id);
    4960              : 
    4961            1 :     session_info = &spdm_context->session_info[0];
    4962              : 
    4963            1 :     libspdm_set_standard_key_update_test_secrets(
    4964            1 :         session_info->secured_message_context,
    4965              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    4966              :         m_req_secret_buffer, (uint8_t)(0xEE));
    4967              : 
    4968              :     /*request side updated*/
    4969            1 :     libspdm_compute_secret_update(spdm_context->connection_info.version,
    4970              :                                   ((libspdm_secured_message_context_t
    4971            1 :                                     *)(session_info->secured_message_context))->hash_size,
    4972              :                                   m_req_secret_buffer, m_req_secret_buffer,
    4973              :                                   sizeof(m_req_secret_buffer));
    4974              :     /*response side *not* updated*/
    4975              : 
    4976            1 :     status = libspdm_key_update(
    4977              :         spdm_context, session_id, true);
    4978              : 
    4979            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
    4980            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    4981              :                           *)(session_info->secured_message_context))
    4982              :                         ->application_secret.request_data_secret,
    4983              :                         m_req_secret_buffer, ((libspdm_secured_message_context_t
    4984              :                                                *)(session_info->secured_message_context))->hash_size);
    4985            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    4986              :                           *)(session_info->secured_message_context))
    4987              :                         ->application_secret.response_data_secret,
    4988              :                         m_rsp_secret_buffer, ((libspdm_secured_message_context_t
    4989              :                                                *)(session_info->secured_message_context))->hash_size);
    4990            1 : }
    4991              : 
    4992              : /**
    4993              :  * Test 26: the requester is setup correctly (see Test 2) and receives a
    4994              :  * correct KEY_UPDATE_ACK to update key. However, it receives a
    4995              :  * KEY_UPDATE_ACK response with the wrong operation code to verify the key.
    4996              :  * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, the
    4997              :  * request data key is not rollbacked.
    4998              :  **/
    4999            1 : static void req_key_update_case26(void **state)
    5000              : {
    5001              :     libspdm_return_t status;
    5002              :     libspdm_test_context_t    *spdm_test_context;
    5003              :     libspdm_context_t         *spdm_context;
    5004              :     uint32_t session_id;
    5005              :     libspdm_session_info_t    *session_info;
    5006              : 
    5007              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    5008              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    5009              : 
    5010            1 :     spdm_test_context = *state;
    5011            1 :     spdm_context = spdm_test_context->spdm_context;
    5012            1 :     spdm_test_context->case_id = 0x1A;
    5013              : 
    5014            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    5015              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    5016            1 :     libspdm_set_standard_key_update_test_state(
    5017              :         spdm_context, &session_id);
    5018              : 
    5019            1 :     session_info = &spdm_context->session_info[0];
    5020              : 
    5021            1 :     libspdm_set_standard_key_update_test_secrets(
    5022            1 :         session_info->secured_message_context,
    5023              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    5024              :         m_req_secret_buffer, (uint8_t)(0xEE));
    5025              : 
    5026              :     /*request side updated*/
    5027            1 :     libspdm_compute_secret_update(spdm_context->connection_info.version,
    5028              :                                   ((libspdm_secured_message_context_t
    5029            1 :                                     *)(session_info->secured_message_context))->hash_size,
    5030              :                                   m_req_secret_buffer, m_req_secret_buffer,
    5031              :                                   sizeof(m_req_secret_buffer));
    5032              :     /*response side *not* updated*/
    5033              : 
    5034            1 :     status = libspdm_key_update(
    5035              :         spdm_context, session_id, true);
    5036              : 
    5037            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
    5038            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    5039              :                           *)(session_info->secured_message_context))
    5040              :                         ->application_secret.request_data_secret,
    5041              :                         m_req_secret_buffer, ((libspdm_secured_message_context_t
    5042              :                                                *)(session_info->secured_message_context))->hash_size);
    5043            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    5044              :                           *)(session_info->secured_message_context))
    5045              :                         ->application_secret.response_data_secret,
    5046              :                         m_rsp_secret_buffer, ((libspdm_secured_message_context_t
    5047              :                                                *)(session_info->secured_message_context))->hash_size);
    5048            1 : }
    5049              : 
    5050              : /**
    5051              :  * Test 27: receiving a correct UPDATE_KEY_ACK message for updating
    5052              :  * both the request data key and the response data key.
    5053              :  * Expected behavior: client returns a Status of LIBSPDM_STATUS_SUCCESS, and
    5054              :  * the request data key and response data key are updated.
    5055              :  **/
    5056            1 : static void req_key_update_case27(void **state)
    5057              : {
    5058              :     libspdm_return_t status;
    5059              :     libspdm_test_context_t    *spdm_test_context;
    5060              :     libspdm_context_t         *spdm_context;
    5061              :     uint32_t session_id;
    5062              :     libspdm_session_info_t    *session_info;
    5063              : 
    5064              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    5065              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    5066              : 
    5067            1 :     spdm_test_context = *state;
    5068            1 :     spdm_context = spdm_test_context->spdm_context;
    5069            1 :     spdm_test_context->case_id = 0x1B;
    5070              : 
    5071            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    5072              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    5073            1 :     libspdm_set_standard_key_update_test_state(
    5074              :         spdm_context, &session_id);
    5075              : 
    5076            1 :     session_info = &spdm_context->session_info[0];
    5077              : 
    5078            1 :     libspdm_set_standard_key_update_test_secrets(
    5079            1 :         session_info->secured_message_context,
    5080              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    5081              :         m_req_secret_buffer, (uint8_t)(0xEE));
    5082              : 
    5083              :     /*request side updated*/
    5084            1 :     libspdm_compute_secret_update(spdm_context->connection_info.version,
    5085              :                                   ((libspdm_secured_message_context_t
    5086            1 :                                     *)(session_info->secured_message_context))->hash_size,
    5087              :                                   m_req_secret_buffer, m_req_secret_buffer,
    5088              :                                   sizeof(m_req_secret_buffer));
    5089              :     /*response side updated*/
    5090            1 :     libspdm_compute_secret_update(spdm_context->connection_info.version,
    5091              :                                   ((libspdm_secured_message_context_t
    5092            1 :                                     *)(session_info->secured_message_context))->hash_size,
    5093              :                                   m_rsp_secret_buffer, m_rsp_secret_buffer,
    5094              :                                   sizeof(m_rsp_secret_buffer));
    5095              : 
    5096            1 :     status = libspdm_key_update(
    5097              :         spdm_context, session_id, false);
    5098              : 
    5099            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    5100            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    5101              :                           *)(session_info->secured_message_context))
    5102              :                         ->application_secret.request_data_secret,
    5103              :                         m_req_secret_buffer, ((libspdm_secured_message_context_t
    5104              :                                                *)(session_info->secured_message_context))->hash_size);
    5105            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    5106              :                           *)(session_info->secured_message_context))
    5107              :                         ->application_secret.response_data_secret,
    5108              :                         m_rsp_secret_buffer, ((libspdm_secured_message_context_t
    5109              :                                                *)(session_info->secured_message_context))->hash_size);
    5110            1 : }
    5111              : 
    5112              : /**
    5113              :  * Test 28: the requester is setup correctly (see Test 27), but receives an
    5114              :  * ERROR message indicating InvalidParameters when updating all keys.
    5115              :  * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, and
    5116              :  * no keys should be updated.
    5117              :  **/
    5118            1 : static void req_key_update_case28(void **state)
    5119              : {
    5120              :     libspdm_return_t status;
    5121              :     libspdm_test_context_t    *spdm_test_context;
    5122              :     libspdm_context_t         *spdm_context;
    5123              :     uint32_t session_id;
    5124              :     libspdm_session_info_t    *session_info;
    5125              : 
    5126              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    5127              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    5128              : 
    5129              :     libspdm_secured_message_context_t *secured_message_context;
    5130              : 
    5131            1 :     spdm_test_context = *state;
    5132            1 :     spdm_context = spdm_test_context->spdm_context;
    5133            1 :     spdm_test_context->case_id = 0x1C;
    5134              : 
    5135            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    5136              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    5137            1 :     libspdm_set_standard_key_update_test_state(
    5138              :         spdm_context, &session_id);
    5139              : 
    5140            1 :     session_info = &spdm_context->session_info[0];
    5141            1 :     secured_message_context = session_info->secured_message_context;
    5142              : 
    5143            1 :     libspdm_set_standard_key_update_test_secrets(
    5144            1 :         session_info->secured_message_context,
    5145              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    5146              :         m_req_secret_buffer, (uint8_t)(0xEE));
    5147              : 
    5148              :     /*store previous encryption state*/
    5149            1 :     libspdm_copy_mem(m_libspdm_last_rsp_enc_key, sizeof(m_libspdm_last_rsp_enc_key),
    5150              :                      secured_message_context
    5151            1 :                      ->application_secret.response_data_encryption_key,
    5152              :                      secured_message_context->aead_key_size);
    5153            1 :     libspdm_copy_mem(m_libspdm_last_rsp_salt, sizeof(m_libspdm_last_rsp_salt),
    5154              :                      secured_message_context
    5155            1 :                      ->application_secret.response_data_salt,
    5156              :                      secured_message_context->aead_iv_size);
    5157            1 :     m_libspdm_last_rsp_sequence_number = secured_message_context
    5158            1 :                                          ->application_secret.response_data_sequence_number;
    5159              : 
    5160              :     /*no keys are updated*/
    5161              : 
    5162            1 :     status = libspdm_key_update(
    5163              :         spdm_context, session_id, false);
    5164              : 
    5165            1 :     assert_int_equal(status, LIBSPDM_STATUS_ERROR_PEER);
    5166            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    5167              :                           *)(session_info->secured_message_context))
    5168              :                         ->application_secret.request_data_secret,
    5169              :                         m_req_secret_buffer, ((libspdm_secured_message_context_t
    5170              :                                                *)(session_info->secured_message_context))->hash_size);
    5171            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    5172              :                           *)(session_info->secured_message_context))
    5173              :                         ->application_secret.response_data_secret,
    5174              :                         m_rsp_secret_buffer, ((libspdm_secured_message_context_t
    5175              :                                                *)(session_info->secured_message_context))->hash_size);
    5176            1 : }
    5177              : 
    5178              : /**
    5179              :  * Test 29: the requester is setup correctly (see Test 27), but receives an
    5180              :  * ERROR message indicating the Busy status of the responder, when updating
    5181              :  * all keys.
    5182              :  * Expected behavior: client returns a Status of RETURN_NO_RESPONSE, and
    5183              :  * no keys should be updated.
    5184              :  **/
    5185            1 : static void req_key_update_case29(void **state)
    5186              : {
    5187              :     libspdm_return_t status;
    5188              :     libspdm_test_context_t    *spdm_test_context;
    5189              :     libspdm_context_t         *spdm_context;
    5190              :     uint32_t session_id;
    5191              :     libspdm_session_info_t    *session_info;
    5192              : 
    5193              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    5194              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    5195              : 
    5196              :     libspdm_secured_message_context_t *secured_message_context;
    5197              : 
    5198            1 :     spdm_test_context = *state;
    5199            1 :     spdm_context = spdm_test_context->spdm_context;
    5200            1 :     spdm_test_context->case_id = 0x1D;
    5201              : 
    5202            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    5203              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    5204            1 :     libspdm_set_standard_key_update_test_state(
    5205              :         spdm_context, &session_id);
    5206              : 
    5207            1 :     session_info = &spdm_context->session_info[0];
    5208            1 :     secured_message_context = session_info->secured_message_context;
    5209              : 
    5210            1 :     libspdm_set_standard_key_update_test_secrets(
    5211            1 :         session_info->secured_message_context,
    5212              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    5213              :         m_req_secret_buffer, (uint8_t)(0xEE));
    5214              : 
    5215              :     /*store previous encryption state*/
    5216            1 :     libspdm_copy_mem(m_libspdm_last_rsp_enc_key, sizeof(m_libspdm_last_rsp_enc_key),
    5217              :                      secured_message_context
    5218            1 :                      ->application_secret.response_data_encryption_key,
    5219              :                      secured_message_context->aead_key_size);
    5220            1 :     libspdm_copy_mem(m_libspdm_last_rsp_salt, sizeof(m_libspdm_last_rsp_salt),
    5221              :                      secured_message_context
    5222            1 :                      ->application_secret.response_data_salt,
    5223              :                      secured_message_context->aead_iv_size);
    5224            1 :     m_libspdm_last_rsp_sequence_number = secured_message_context
    5225            1 :                                          ->application_secret.response_data_sequence_number;
    5226              : 
    5227              :     /*no keys are updated*/
    5228              : 
    5229            1 :     status = libspdm_key_update(
    5230              :         spdm_context, session_id, false);
    5231              : 
    5232            1 :     assert_int_equal(status, LIBSPDM_STATUS_BUSY_PEER);
    5233            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    5234              :                           *)(session_info->secured_message_context))
    5235              :                         ->application_secret.request_data_secret,
    5236              :                         m_req_secret_buffer, ((libspdm_secured_message_context_t
    5237              :                                                *)(session_info->secured_message_context))->hash_size);
    5238            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    5239              :                           *)(session_info->secured_message_context))
    5240              :                         ->application_secret.response_data_secret,
    5241              :                         m_rsp_secret_buffer, ((libspdm_secured_message_context_t
    5242              :                                                *)(session_info->secured_message_context))->hash_size);
    5243            1 : }
    5244              : 
    5245              : /**
    5246              :  * Test 30: the requester is setup correctly (see Test 27), but, when updating
    5247              :  * all keys, on the first try, receiving a Busy ERROR message, and on retry,
    5248              :  * receiving a correct KEY_UPDATE_ACK message. The VERIFY_KEY behavior is
    5249              :  * not altered.
    5250              :  * Expected behavior: client returns a Status of LIBSPDM_STATUS_SUCCESS, and
    5251              :  * the request data key and response data key are updated.
    5252              :  **/
    5253            1 : static void req_key_update_case30(void **state)
    5254              : {
    5255              :     libspdm_return_t status;
    5256              :     libspdm_test_context_t    *spdm_test_context;
    5257              :     libspdm_context_t         *spdm_context;
    5258              :     uint32_t session_id;
    5259              :     libspdm_session_info_t    *session_info;
    5260              : 
    5261              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    5262              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    5263              : 
    5264              :     libspdm_secured_message_context_t *secured_message_context;
    5265              : 
    5266            1 :     spdm_test_context = *state;
    5267            1 :     spdm_context = spdm_test_context->spdm_context;
    5268            1 :     spdm_test_context->case_id = 0x1E;
    5269              : 
    5270            1 :     spdm_context->retry_times = 3;
    5271            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    5272              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    5273            1 :     libspdm_set_standard_key_update_test_state(
    5274              :         spdm_context, &session_id);
    5275              : 
    5276            1 :     session_info = &spdm_context->session_info[0];
    5277            1 :     secured_message_context = session_info->secured_message_context;
    5278              : 
    5279            1 :     libspdm_set_standard_key_update_test_secrets(
    5280            1 :         session_info->secured_message_context,
    5281              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    5282              :         m_req_secret_buffer, (uint8_t)(0xEE));
    5283              : 
    5284              :     /*store previous encryption state*/
    5285            1 :     libspdm_copy_mem(m_libspdm_last_rsp_enc_key, sizeof(m_libspdm_last_rsp_enc_key),
    5286              :                      secured_message_context
    5287            1 :                      ->application_secret.response_data_encryption_key,
    5288              :                      secured_message_context->aead_key_size);
    5289            1 :     libspdm_copy_mem(m_libspdm_last_rsp_salt, sizeof(m_libspdm_last_rsp_salt),
    5290              :                      secured_message_context
    5291            1 :                      ->application_secret.response_data_salt,
    5292              :                      secured_message_context->aead_iv_size);
    5293            1 :     m_libspdm_last_rsp_sequence_number = secured_message_context
    5294            1 :                                          ->application_secret.response_data_sequence_number;
    5295              : 
    5296              :     /*request side updated*/
    5297            1 :     libspdm_compute_secret_update(spdm_context->connection_info.version,
    5298              :                                   ((libspdm_secured_message_context_t
    5299            1 :                                     *)(session_info->secured_message_context))->hash_size,
    5300              :                                   m_req_secret_buffer, m_req_secret_buffer,
    5301              :                                   sizeof(m_req_secret_buffer));
    5302              :     /*response side updated*/
    5303            1 :     libspdm_compute_secret_update(spdm_context->connection_info.version,
    5304              :                                   ((libspdm_secured_message_context_t
    5305            1 :                                     *)(session_info->secured_message_context))->hash_size,
    5306              :                                   m_rsp_secret_buffer, m_rsp_secret_buffer,
    5307              :                                   sizeof(m_rsp_secret_buffer));
    5308              : 
    5309            1 :     status = libspdm_key_update(
    5310              :         spdm_context, session_id, false);
    5311              : 
    5312            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    5313            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    5314              :                           *)(session_info->secured_message_context))
    5315              :                         ->application_secret.request_data_secret,
    5316              :                         m_req_secret_buffer, ((libspdm_secured_message_context_t
    5317              :                                                *)(session_info->secured_message_context))->hash_size);
    5318            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    5319              :                           *)(session_info->secured_message_context))
    5320              :                         ->application_secret.response_data_secret,
    5321              :                         m_rsp_secret_buffer, ((libspdm_secured_message_context_t
    5322              :                                                *)(session_info->secured_message_context))->hash_size);
    5323            1 : }
    5324              : 
    5325              : /**
    5326              :  * Test 31: the requester is setup correctly (see Test 27), but receives an
    5327              :  * ERROR message indicating the RequestResynch status of the responder, when
    5328              :  * updating all keys.
    5329              :  * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, and the
    5330              :  * communication is reset to expect a new GET_VERSION message.
    5331              :  **/
    5332            1 : static void req_key_update_case31(void **state)
    5333              : {
    5334              :     libspdm_return_t status;
    5335              :     libspdm_test_context_t    *spdm_test_context;
    5336              :     libspdm_context_t         *spdm_context;
    5337              :     uint32_t session_id;
    5338              :     libspdm_session_info_t    *session_info;
    5339              : 
    5340              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    5341              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    5342              : 
    5343              :     libspdm_secured_message_context_t *secured_message_context;
    5344              : 
    5345            1 :     spdm_test_context = *state;
    5346            1 :     spdm_context = spdm_test_context->spdm_context;
    5347            1 :     spdm_test_context->case_id = 0x1F;
    5348              : 
    5349            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    5350              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    5351            1 :     libspdm_set_standard_key_update_test_state(
    5352              :         spdm_context, &session_id);
    5353              : 
    5354            1 :     session_info = &spdm_context->session_info[0];
    5355            1 :     secured_message_context = session_info->secured_message_context;
    5356              : 
    5357            1 :     libspdm_set_standard_key_update_test_secrets(
    5358            1 :         session_info->secured_message_context,
    5359              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    5360              :         m_req_secret_buffer, (uint8_t)(0xEE));
    5361              : 
    5362              :     /*store previous encryption state*/
    5363            1 :     libspdm_copy_mem(m_libspdm_last_rsp_enc_key, sizeof(m_libspdm_last_rsp_enc_key),
    5364              :                      secured_message_context
    5365            1 :                      ->application_secret.response_data_encryption_key,
    5366              :                      secured_message_context->aead_key_size);
    5367            1 :     libspdm_copy_mem(m_libspdm_last_rsp_salt, sizeof(m_libspdm_last_rsp_salt),
    5368              :                      secured_message_context
    5369            1 :                      ->application_secret.response_data_salt,
    5370              :                      secured_message_context->aead_iv_size);
    5371            1 :     m_libspdm_last_rsp_sequence_number = secured_message_context
    5372            1 :                                          ->application_secret.response_data_sequence_number;
    5373              : 
    5374            1 :     status = libspdm_key_update(
    5375              :         spdm_context, session_id, false);
    5376              : 
    5377            1 :     assert_int_equal(status, LIBSPDM_STATUS_RESYNCH_PEER);
    5378            1 :     assert_int_equal(spdm_context->connection_info.connection_state,
    5379              :                      LIBSPDM_CONNECTION_STATE_NOT_STARTED);
    5380            1 : }
    5381              : 
    5382              : /**
    5383              :  * Test 32: the requester is setup correctly (see Test 27), but receives an
    5384              :  * ERROR message indicating the ResponseNotReady status of the responder, when
    5385              :  * updating all keys.
    5386              :  * Expected behavior: client returns a Status of RETURN_DEVICE_ERROR, and
    5387              :  * no keys should be updated.
    5388              :  **/
    5389            1 : static void req_key_update_case32(void **state)
    5390              : {
    5391              :     libspdm_return_t status;
    5392              :     libspdm_test_context_t    *spdm_test_context;
    5393              :     libspdm_context_t         *spdm_context;
    5394              :     uint32_t session_id;
    5395              :     libspdm_session_info_t    *session_info;
    5396              : 
    5397              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    5398              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    5399              : 
    5400              :     libspdm_secured_message_context_t *secured_message_context;
    5401              : 
    5402            1 :     spdm_test_context = *state;
    5403            1 :     spdm_context = spdm_test_context->spdm_context;
    5404            1 :     spdm_test_context->case_id = 0x20;
    5405              : 
    5406            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    5407              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    5408            1 :     libspdm_set_standard_key_update_test_state(
    5409              :         spdm_context, &session_id);
    5410              : 
    5411            1 :     session_info = &spdm_context->session_info[0];
    5412            1 :     secured_message_context = session_info->secured_message_context;
    5413              : 
    5414            1 :     libspdm_set_standard_key_update_test_secrets(
    5415            1 :         session_info->secured_message_context,
    5416              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    5417              :         m_req_secret_buffer, (uint8_t)(0xEE));
    5418              : 
    5419              :     /*store previous encryption state*/
    5420            1 :     libspdm_copy_mem(m_libspdm_last_rsp_enc_key, sizeof(m_libspdm_last_rsp_enc_key),
    5421              :                      secured_message_context
    5422            1 :                      ->application_secret.response_data_encryption_key,
    5423              :                      secured_message_context->aead_key_size);
    5424            1 :     libspdm_copy_mem(m_libspdm_last_rsp_salt, sizeof(m_libspdm_last_rsp_salt),
    5425              :                      secured_message_context
    5426            1 :                      ->application_secret.response_data_salt,
    5427              :                      secured_message_context->aead_iv_size);
    5428            1 :     m_libspdm_last_rsp_sequence_number = secured_message_context
    5429            1 :                                          ->application_secret.response_data_sequence_number;
    5430              : 
    5431              :     /*no keys are updated*/
    5432              : 
    5433            1 :     status = libspdm_key_update(
    5434              :         spdm_context, session_id, false);
    5435              : 
    5436            1 :     assert_int_equal(status, LIBSPDM_STATUS_NOT_READY_PEER);
    5437            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    5438              :                           *)(session_info->secured_message_context))
    5439              :                         ->application_secret.request_data_secret,
    5440              :                         m_req_secret_buffer, ((libspdm_secured_message_context_t
    5441              :                                                *)(session_info->secured_message_context))->hash_size);
    5442            1 :     assert_memory_equal(((libspdm_secured_message_context_t
    5443              :                           *)(session_info->secured_message_context))
    5444              :                         ->application_secret.response_data_secret,
    5445              :                         m_rsp_secret_buffer, ((libspdm_secured_message_context_t
    5446              :                                                *)(session_info->secured_message_context))->hash_size);
    5447            1 : }
    5448              : 
    5449              : /**
    5450              :  * Test 33: the requester is setup correctly (see Test 27), but, when updating
    5451              :  * all keys, on the first try, receiving a ResponseNotReady ERROR message, and
    5452              :  * on retry, receiving a correct KEY_UPDATE_ACK message. The VERIFY_KEY
    5453              :  * behavior is not altered.
    5454              :  * Expected behavior: client returns a Status of LIBSPDM_STATUS_SUCCESS, and
    5455              :  * the request data key and response data key are updated.
    5456              :  **/
    5457            1 : static void req_key_update_case33(void **state)
    5458              : {
    5459              :     libspdm_return_t status;
    5460              :     libspdm_test_context_t    *spdm_test_context;
    5461              :     libspdm_context_t         *spdm_context;
    5462              :     uint32_t session_id;
    5463              :     libspdm_session_info_t    *session_info;
    5464              : 
    5465              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    5466              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    5467              : 
    5468              :     libspdm_secured_message_context_t *secured_message_context;
    5469              : 
    5470            1 :     spdm_test_context = *state;
    5471            1 :     spdm_context = spdm_test_context->spdm_context;
    5472            1 :     spdm_test_context->case_id = 0x21;
    5473              : 
    5474            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    5475              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    5476            1 :     libspdm_set_standard_key_update_test_state(spdm_context, &session_id);
    5477              : 
    5478            1 :     session_info = &spdm_context->session_info[0];
    5479            1 :     secured_message_context = session_info->secured_message_context;
    5480              : 
    5481            1 :     libspdm_set_standard_key_update_test_secrets(
    5482            1 :         session_info->secured_message_context,
    5483              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    5484              :         m_req_secret_buffer, (uint8_t)(0xEE));
    5485              : 
    5486              :     /*store previous encryption state*/
    5487            1 :     libspdm_copy_mem(m_libspdm_last_rsp_enc_key, sizeof(m_libspdm_last_rsp_enc_key),
    5488              :                      secured_message_context
    5489            1 :                      ->application_secret.response_data_encryption_key,
    5490              :                      secured_message_context->aead_key_size);
    5491            1 :     libspdm_copy_mem(m_libspdm_last_rsp_salt, sizeof(m_libspdm_last_rsp_salt),
    5492              :                      secured_message_context
    5493            1 :                      ->application_secret.response_data_salt,
    5494              :                      secured_message_context->aead_iv_size);
    5495            1 :     m_libspdm_last_rsp_sequence_number = secured_message_context
    5496            1 :                                          ->application_secret.response_data_sequence_number;
    5497              : 
    5498              :     /*request side updated*/
    5499            1 :     libspdm_compute_secret_update(spdm_context->connection_info.version,
    5500              :                                   ((libspdm_secured_message_context_t
    5501            1 :                                     *)(session_info->secured_message_context))->hash_size,
    5502              :                                   m_req_secret_buffer, m_req_secret_buffer,
    5503              :                                   sizeof(m_req_secret_buffer));
    5504              :     /*response side updated*/
    5505            1 :     libspdm_compute_secret_update(spdm_context->connection_info.version,
    5506              :                                   ((libspdm_secured_message_context_t
    5507            1 :                                     *)(session_info->secured_message_context))->hash_size,
    5508              :                                   m_rsp_secret_buffer, m_rsp_secret_buffer,
    5509              :                                   sizeof(m_rsp_secret_buffer));
    5510              : 
    5511            1 :     status = libspdm_key_update(spdm_context, session_id, false);
    5512              : 
    5513              :     if (LIBSPDM_RESPOND_IF_READY_SUPPORT) {
    5514            1 :         assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    5515            1 :         assert_memory_equal(((libspdm_secured_message_context_t
    5516              :                               *)(session_info->secured_message_context))
    5517              :                             ->application_secret.request_data_secret,
    5518              :                             m_req_secret_buffer, ((libspdm_secured_message_context_t
    5519              :                                                    *)(session_info->secured_message_context))->hash_size);
    5520            1 :         assert_memory_equal(((libspdm_secured_message_context_t
    5521              :                               *)(session_info->secured_message_context))
    5522              :                             ->application_secret.response_data_secret,
    5523              :                             m_rsp_secret_buffer, ((libspdm_secured_message_context_t
    5524              :                                                    *)(session_info->secured_message_context))->hash_size);
    5525              :     } else {
    5526              :         assert_int_equal(status, LIBSPDM_STATUS_NOT_READY_PEER);
    5527              :     }
    5528            1 : }
    5529              : 
    5530              : /**
    5531              :  * Test 34: receiving an unexpected ERROR message from the responder,
    5532              :  * when updating all keys.
    5533              :  * There are tests for all named codes, including some reserved ones
    5534              :  * (namely, 0x00, 0x0b, 0x0c, 0x3f, 0xfd, 0xfe).
    5535              :  * However, for having specific test cases, it is excluded from this case:
    5536              :  * Busy (0x03), ResponseNotReady (0x42), and RequestResync (0x43).
    5537              :  * Expected behavior: client returns a status of RETURN_DEVICE_ERROR, and
    5538              :  * no keys should be updated.
    5539              :  **/
    5540            1 : static void req_key_update_case34(void **state)
    5541              : {
    5542              :     libspdm_return_t status;
    5543              :     libspdm_test_context_t    *spdm_test_context;
    5544              :     libspdm_context_t         *spdm_context;
    5545              :     uint32_t session_id;
    5546              :     libspdm_session_info_t    *session_info;
    5547              :     uint16_t error_code;
    5548              : 
    5549              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    5550              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    5551              : 
    5552              :     libspdm_secured_message_context_t *secured_message_context;
    5553              : 
    5554            1 :     spdm_test_context = *state;
    5555            1 :     spdm_context = spdm_test_context->spdm_context;
    5556            1 :     spdm_test_context->case_id = 0x22;
    5557              : 
    5558            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    5559              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    5560            1 :     libspdm_set_standard_key_update_test_state(
    5561              :         spdm_context, &session_id);
    5562              : 
    5563            1 :     session_info = &spdm_context->session_info[0];
    5564            1 :     secured_message_context = session_info->secured_message_context;
    5565              : 
    5566            1 :     error_code = LIBSPDM_ERROR_CODE_RESERVED_00;
    5567           18 :     while(error_code <= 0xff) {
    5568              :         /* skip SPDM_ERROR_CODE_DECRYPT_ERROR, because this case will free context*/
    5569           17 :         if(error_code == SPDM_ERROR_CODE_DECRYPT_ERROR) {
    5570            1 :             error_code++;
    5571              :         }
    5572           17 :         libspdm_set_standard_key_update_test_secrets(
    5573           17 :             session_info->secured_message_context,
    5574              :             m_rsp_secret_buffer, (uint8_t)(0xFF),
    5575              :             m_req_secret_buffer, (uint8_t)(0xEE));
    5576              : 
    5577              :         /*store previous encryption state*/
    5578           17 :         libspdm_copy_mem(m_libspdm_last_rsp_enc_key, sizeof(m_libspdm_last_rsp_enc_key),
    5579              :                          secured_message_context
    5580           17 :                          ->application_secret.response_data_encryption_key,
    5581              :                          secured_message_context->aead_key_size);
    5582           17 :         libspdm_copy_mem(m_libspdm_last_rsp_salt, sizeof(m_libspdm_last_rsp_salt),
    5583              :                          secured_message_context
    5584           17 :                          ->application_secret.response_data_salt,
    5585              :                          secured_message_context->aead_iv_size);
    5586           17 :         m_libspdm_last_rsp_sequence_number = secured_message_context
    5587           17 :                                              ->application_secret.response_data_sequence_number;
    5588              : 
    5589              :         /*no keys are updated*/
    5590              : 
    5591           17 :         status = libspdm_key_update(
    5592              :             spdm_context, session_id, false);
    5593              : 
    5594           17 :         LIBSPDM_ASSERT_INT_EQUAL_CASE (status, LIBSPDM_STATUS_ERROR_PEER, error_code);
    5595           17 :         assert_memory_equal(((libspdm_secured_message_context_t
    5596              :                               *)(session_info->secured_message_context))
    5597              :                             ->application_secret.request_data_secret,
    5598              :                             m_req_secret_buffer, ((libspdm_secured_message_context_t
    5599              :                                                    *)(session_info->secured_message_context))->hash_size);
    5600           17 :         assert_memory_equal(((libspdm_secured_message_context_t
    5601              :                               *)(session_info->secured_message_context))
    5602              :                             ->application_secret.response_data_secret,
    5603              :                             m_rsp_secret_buffer, ((libspdm_secured_message_context_t
    5604              :                                                    *)(session_info->secured_message_context))->hash_size);
    5605              : 
    5606           17 :         error_code++;
    5607              :         /*busy is treated in cases 5 and 6*/
    5608           17 :         if(error_code == SPDM_ERROR_CODE_BUSY) {
    5609            1 :             error_code = SPDM_ERROR_CODE_UNEXPECTED_REQUEST;
    5610              :         }
    5611              :         /*skip some reserved error codes (0d to 3e)*/
    5612           17 :         if(error_code == LIBSPDM_ERROR_CODE_RESERVED_0D) {
    5613            1 :             error_code = LIBSPDM_ERROR_CODE_RESERVED_3F;
    5614              :         }
    5615              :         /*skip response not ready, request resync, and some reserved codes (44 to fc)*/
    5616           17 :         if(error_code == SPDM_ERROR_CODE_RESPONSE_NOT_READY) {
    5617            1 :             error_code = LIBSPDM_ERROR_CODE_RESERVED_FD;
    5618              :         }
    5619              :     }
    5620            1 : }
    5621              : 
    5622              : /**
    5623              :  * Test 35: the requester is setup correctly, but receives an ERROR with SPDM_ERROR_CODE_DECRYPT_ERROR.
    5624              :  * Expected behavior: client returns a Status of INVALID_SESSION_ID  and free the session ID.
    5625              :  **/
    5626            1 : static void req_key_update_case35(void **state)
    5627              : {
    5628              :     libspdm_return_t status;
    5629              :     libspdm_test_context_t    *spdm_test_context;
    5630              :     libspdm_context_t         *spdm_context;
    5631              :     uint32_t session_id;
    5632              :     libspdm_session_info_t    *session_info;
    5633              : 
    5634              :     uint8_t m_req_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    5635              :     uint8_t m_rsp_secret_buffer[LIBSPDM_MAX_HASH_SIZE];
    5636              : 
    5637            1 :     spdm_test_context = *state;
    5638            1 :     spdm_context = spdm_test_context->spdm_context;
    5639            1 :     spdm_test_context->case_id = 0x23;
    5640              : 
    5641            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    5642              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    5643            1 :     libspdm_set_standard_key_update_test_state(spdm_context, &session_id);
    5644              : 
    5645            1 :     session_info = &spdm_context->session_info[0];
    5646              : 
    5647            1 :     libspdm_set_standard_key_update_test_secrets(
    5648            1 :         session_info->secured_message_context,
    5649              :         m_rsp_secret_buffer, (uint8_t)(0xFF),
    5650              :         m_req_secret_buffer, (uint8_t)(0xEE));
    5651              : 
    5652              :     /*no keys are updated*/
    5653              : 
    5654            1 :     status = libspdm_key_update(spdm_context, session_id, true);
    5655              : 
    5656            1 :     assert_int_equal(status, LIBSPDM_STATUS_SESSION_MSG_ERROR);
    5657            1 :     assert_int_equal(spdm_context->session_info->session_id, INVALID_SESSION_ID);
    5658            1 : }
    5659              : 
    5660            1 : int libspdm_req_key_update_test(void)
    5661              : {
    5662            1 :     const struct CMUnitTest test_cases[] = {
    5663              :         /* SendRequest failed*/
    5664              :         cmocka_unit_test(req_key_update_case1),
    5665              :         /* update single key
    5666              :          * Successful response*/
    5667              :         cmocka_unit_test(req_key_update_case2),
    5668              :         /* connection_state check failed*/
    5669              :         cmocka_unit_test(req_key_update_case3),
    5670              :         /* Error response: SPDM_ERROR_CODE_INVALID_REQUEST*/
    5671              :         cmocka_unit_test(req_key_update_case4),
    5672              :         /* Always SPDM_ERROR_CODE_BUSY*/
    5673              :         cmocka_unit_test(req_key_update_case5),
    5674              :         /* SPDM_ERROR_CODE_BUSY + Successful response*/
    5675              :         cmocka_unit_test(req_key_update_case6),
    5676              :         /* Error response: SPDM_ERROR_CODE_REQUEST_RESYNCH*/
    5677              :         cmocka_unit_test(req_key_update_case7),
    5678              :         /* Always SPDM_ERROR_CODE_RESPONSE_NOT_READY*/
    5679              :         cmocka_unit_test(req_key_update_case8),
    5680              :         /* SPDM_ERROR_CODE_RESPONSE_NOT_READY + Successful response*/
    5681              :         cmocka_unit_test(req_key_update_case9),
    5682              :         /* Unexpected errors*/
    5683              :         cmocka_unit_test(req_key_update_case10),
    5684              :         /* Buffer reset*/
    5685              :         cmocka_unit_test(req_key_update_case11),
    5686              :         /* No correct setup*/
    5687              :         cmocka_unit_test(req_key_update_case12),
    5688              :         cmocka_unit_test(req_key_update_case13),
    5689              :         cmocka_unit_test(req_key_update_case14),
    5690              :         /* Wrong parameters*/
    5691              :         cmocka_unit_test(req_key_update_case15),
    5692              :         cmocka_unit_test(req_key_update_case16),
    5693              :         /* verify key
    5694              :          * Error response: SPDM_ERROR_CODE_INVALID_REQUEST*/
    5695              :         cmocka_unit_test(req_key_update_case17),
    5696              :         /* Always SPDM_ERROR_CODE_BUSY*/
    5697              :         cmocka_unit_test(req_key_update_case18),
    5698              :         /* SPDM_ERROR_CODE_BUSY + Successful response*/
    5699              :         cmocka_unit_test(req_key_update_case19),
    5700              :         /* Error response: SPDM_ERROR_CODE_REQUEST_RESYNCH*/
    5701              :         cmocka_unit_test(req_key_update_case20),
    5702              :         /* Always SPDM_ERROR_CODE_RESPONSE_NOT_READY*/
    5703              :         cmocka_unit_test(req_key_update_case21),
    5704              :         /* SPDM_ERROR_CODE_RESPONSE_NOT_READY + Successful response*/
    5705              :         cmocka_unit_test(req_key_update_case22),
    5706              :         /* Unexpected errors*/
    5707              :         cmocka_unit_test(req_key_update_case23),
    5708              :         /* No correct setup*/
    5709              :         cmocka_unit_test(req_key_update_case24),
    5710              :         /* Wrong parameters*/
    5711              :         cmocka_unit_test(req_key_update_case25),
    5712              :         cmocka_unit_test(req_key_update_case26),
    5713              :         /* update all keys
    5714              :          * Successful response*/
    5715              :         cmocka_unit_test(req_key_update_case27),
    5716              :         /* Error response: SPDM_ERROR_CODE_INVALID_REQUEST*/
    5717              :         cmocka_unit_test(req_key_update_case28),
    5718              :         /* Always SPDM_ERROR_CODE_BUSY*/
    5719              :         cmocka_unit_test(req_key_update_case29),
    5720              :         /* SPDM_ERROR_CODE_BUSY + Successful response*/
    5721              :         cmocka_unit_test(req_key_update_case30),
    5722              :         /* Error response: SPDM_ERROR_CODE_REQUEST_RESYNCH*/
    5723              :         cmocka_unit_test(req_key_update_case31),
    5724              :         /* Always SPDM_ERROR_CODE_RESPONSE_NOT_READY*/
    5725              :         cmocka_unit_test(req_key_update_case32),
    5726              :         /* SPDM_ERROR_CODE_RESPONSE_NOT_READY + Successful response*/
    5727              :         cmocka_unit_test(req_key_update_case33),
    5728              :         /* Unexpected errors*/
    5729              :         cmocka_unit_test(req_key_update_case34),
    5730              :         /* Error response: SPDM_ERROR_CODE_DECRYPT_ERROR*/
    5731              :         cmocka_unit_test(req_key_update_case35),
    5732              :     };
    5733              : 
    5734            1 :     libspdm_test_context_t test_context = {
    5735              :         LIBSPDM_TEST_CONTEXT_VERSION,
    5736              :         true,
    5737              :         send_message,
    5738              :         receive_message,
    5739              :     };
    5740              : 
    5741            1 :     libspdm_setup_test_context(&test_context);
    5742              : 
    5743            1 :     return cmocka_run_group_tests(test_cases,
    5744              :                                   libspdm_unit_test_group_setup,
    5745              :                                   libspdm_unit_test_group_teardown);
    5746              : }
    5747              : 
    5748              : #endif /* (LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP) || (LIBSPDM_ENABLE_CAPABILITY_PSK_CAP) */
        

Generated by: LCOV version 2.0-1