LCOV - code coverage report
Current view: top level - unit_test/test_spdm_requester - end_session.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 93.6 % 766 717
Test Date: 2026-02-22 08:11:49 Functions: 100.0 % 17 17

            Line data    Source code
       1              : /**
       2              :  *  Copyright Notice:
       3              :  *  Copyright 2021-2026 DMTF. All rights reserved.
       4              :  *  License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
       5              :  **/
       6              : 
       7              : #include "spdm_unit_test.h"
       8              : #include "internal/libspdm_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_dummy_key_buffer[LIBSPDM_MAX_AEAD_KEY_SIZE];
      14              : static uint8_t m_dummy_salt_buffer[LIBSPDM_MAX_AEAD_IV_SIZE];
      15              : 
      16           28 : static void libspdm_secured_message_set_response_data_encryption_key(
      17              :     void *spdm_secured_message_context, const void *key, size_t key_size)
      18              : {
      19              :     libspdm_secured_message_context_t *secured_message_context;
      20              : 
      21           28 :     secured_message_context = spdm_secured_message_context;
      22           28 :     LIBSPDM_ASSERT(key_size == secured_message_context->aead_key_size);
      23           28 :     libspdm_copy_mem(secured_message_context->application_secret.response_data_encryption_key,
      24              :                      sizeof(secured_message_context->application_secret.response_data_encryption_key),
      25              :                      key, secured_message_context->aead_key_size);
      26           28 : }
      27              : 
      28           28 : static void libspdm_secured_message_set_response_data_salt(
      29              :     void *spdm_secured_message_context, const void *salt,
      30              :     size_t salt_size)
      31              : {
      32              :     libspdm_secured_message_context_t *secured_message_context;
      33              : 
      34           28 :     secured_message_context = spdm_secured_message_context;
      35           28 :     LIBSPDM_ASSERT(salt_size == secured_message_context->aead_iv_size);
      36           28 :     libspdm_copy_mem(secured_message_context->application_secret.response_data_salt,
      37              :                      sizeof(secured_message_context->application_secret.response_data_salt),
      38              :                      salt, secured_message_context->aead_iv_size);
      39           28 : }
      40              : 
      41           31 : static libspdm_return_t send_message(
      42              :     void *spdm_context, size_t request_size, const void *request, uint64_t timeout)
      43              : {
      44              :     libspdm_test_context_t *spdm_test_context;
      45              : 
      46           31 :     spdm_test_context = libspdm_get_test_context();
      47           31 :     switch (spdm_test_context->case_id) {
      48            1 :     case 0x1:
      49            1 :         return LIBSPDM_STATUS_SEND_FAIL;
      50            1 :     case 0x2:
      51            1 :         return LIBSPDM_STATUS_SUCCESS;
      52            0 :     case 0x3:
      53            0 :         return LIBSPDM_STATUS_SUCCESS;
      54            1 :     case 0x4:
      55            1 :         return LIBSPDM_STATUS_SUCCESS;
      56            1 :     case 0x5:
      57            1 :         return LIBSPDM_STATUS_SUCCESS;
      58            2 :     case 0x6:
      59            2 :         return LIBSPDM_STATUS_SUCCESS;
      60            1 :     case 0x7:
      61            1 :         return LIBSPDM_STATUS_SUCCESS;
      62            2 :     case 0x8:
      63            2 :         return LIBSPDM_STATUS_SUCCESS;
      64            2 :     case 0x9:
      65            2 :         return LIBSPDM_STATUS_SUCCESS;
      66           18 :     case 0xA:
      67           18 :         return LIBSPDM_STATUS_SUCCESS;
      68            1 :     case 0xB:
      69            1 :         return LIBSPDM_STATUS_SUCCESS;
      70            1 :     case 0xC:
      71            1 :         return LIBSPDM_STATUS_SUCCESS;
      72            0 :     default:
      73            0 :         return LIBSPDM_STATUS_SEND_FAIL;
      74              :     }
      75              : }
      76              : 
      77           30 : static libspdm_return_t receive_message(
      78              :     void *spdm_context, size_t *response_size, void **response, uint64_t timeout)
      79              : {
      80              :     libspdm_test_context_t *spdm_test_context;
      81              : 
      82           30 :     spdm_test_context = libspdm_get_test_context();
      83           30 :     switch (spdm_test_context->case_id) {
      84            0 :     case 0x1:
      85            0 :         return LIBSPDM_STATUS_RECEIVE_FAIL;
      86              : 
      87            1 :     case 0x2: {
      88              :         spdm_end_session_response_t *spdm_response;
      89              :         size_t spdm_response_size;
      90              :         size_t transport_header_size;
      91              :         uint32_t session_id;
      92              :         libspdm_session_info_t *session_info;
      93              :         uint8_t *scratch_buffer;
      94              :         size_t scratch_buffer_size;
      95              : 
      96            1 :         session_id = 0xFFFFFFFF;
      97            1 :         spdm_response_size = sizeof(spdm_end_session_response_t);
      98            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
      99            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     100              : 
     101            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     102            1 :         spdm_response->header.request_response_code = SPDM_END_SESSION_ACK;
     103            1 :         spdm_response->header.param1 = 0;
     104            1 :         spdm_response->header.param2 = 0;
     105              : 
     106              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
     107              :          * transport_message is always in sender buffer. */
     108            1 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
     109            1 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
     110              :                           scratch_buffer_size - transport_header_size,
     111              :                           spdm_response, spdm_response_size);
     112            1 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
     113            1 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
     114              :                                               false, false, spdm_response_size,
     115              :                                               spdm_response, response_size,
     116              :                                               response);
     117            1 :         session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
     118            1 :         if (session_info == NULL) {
     119            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
     120              :         }
     121              :         /* WALKAROUND: If just use single context to encode message and then decode message */
     122              :         ((libspdm_secured_message_context_t
     123            1 :           *)(session_info->secured_message_context))
     124            1 :         ->application_secret.response_data_sequence_number--;
     125              :     }
     126            1 :         return LIBSPDM_STATUS_SUCCESS;
     127              : 
     128            0 :     case 0x3: {
     129              :         spdm_end_session_response_t *spdm_response;
     130              :         size_t spdm_response_size;
     131              :         size_t transport_header_size;
     132              :         uint32_t session_id;
     133              :         libspdm_session_info_t *session_info;
     134              :         uint8_t *scratch_buffer;
     135              :         size_t scratch_buffer_size;
     136              : 
     137            0 :         session_id = 0xFFFFFFFF;
     138            0 :         spdm_response_size = sizeof(spdm_end_session_response_t);
     139            0 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     140            0 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     141              : 
     142            0 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     143            0 :         spdm_response->header.request_response_code = SPDM_END_SESSION_ACK;
     144            0 :         spdm_response->header.param1 = 0;
     145            0 :         spdm_response->header.param2 = 0;
     146              : 
     147              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
     148              :          * transport_message is always in sender buffer. */
     149            0 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
     150            0 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
     151              :                           scratch_buffer_size - transport_header_size,
     152              :                           spdm_response, spdm_response_size);
     153            0 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
     154            0 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
     155              :                                               false, false, spdm_response_size,
     156              :                                               spdm_response, response_size,
     157              :                                               response);
     158            0 :         session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
     159            0 :         if (session_info == NULL) {
     160            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
     161              :         }
     162              :         ((libspdm_secured_message_context_t
     163            0 :           *)(session_info->secured_message_context))
     164            0 :         ->application_secret.response_data_sequence_number--;
     165              :     }
     166            0 :         return LIBSPDM_STATUS_SUCCESS;
     167              : 
     168            1 :     case 0x4: {
     169              :         spdm_error_response_t *spdm_response;
     170              :         size_t spdm_response_size;
     171              :         size_t transport_header_size;
     172              :         uint32_t session_id;
     173              :         libspdm_session_info_t *session_info;
     174              :         uint8_t *scratch_buffer;
     175              :         size_t scratch_buffer_size;
     176              : 
     177            1 :         spdm_response_size = sizeof(spdm_error_response_t);
     178            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     179            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     180              : 
     181            1 :         session_id = 0xFFFFFFFF;
     182            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     183            1 :         spdm_response->header.request_response_code = SPDM_ERROR;
     184            1 :         spdm_response->header.param1 = SPDM_ERROR_CODE_INVALID_REQUEST;
     185            1 :         spdm_response->header.param2 = 0;
     186              : 
     187              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
     188              :          * transport_message is always in sender buffer. */
     189            1 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
     190            1 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
     191              :                           scratch_buffer_size - transport_header_size,
     192              :                           spdm_response, spdm_response_size);
     193            1 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
     194            1 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
     195              :                                               false, false,
     196              :                                               spdm_response_size,
     197              :                                               spdm_response,
     198              :                                               response_size, response);
     199            1 :         session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
     200            1 :         if (session_info == NULL) {
     201            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
     202              :         }
     203              :         ((libspdm_secured_message_context_t
     204            1 :           *)(session_info->secured_message_context))
     205            1 :         ->application_secret.response_data_sequence_number--;
     206              :     }
     207            1 :         return LIBSPDM_STATUS_SUCCESS;
     208              : 
     209            1 :     case 0x5: {
     210              :         spdm_error_response_t *spdm_response;
     211              :         size_t spdm_response_size;
     212              :         size_t transport_header_size;
     213              :         uint32_t session_id;
     214              :         libspdm_session_info_t *session_info;
     215              :         uint8_t *scratch_buffer;
     216              :         size_t scratch_buffer_size;
     217              : 
     218            1 :         spdm_response_size = sizeof(spdm_error_response_t);
     219            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     220            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     221              : 
     222            1 :         session_id = 0xFFFFFFFF;
     223            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     224            1 :         spdm_response->header.request_response_code = SPDM_ERROR;
     225            1 :         spdm_response->header.param1 = SPDM_ERROR_CODE_BUSY;
     226            1 :         spdm_response->header.param2 = 0;
     227              : 
     228              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
     229              :          * transport_message is always in sender buffer. */
     230            1 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
     231            1 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
     232              :                           scratch_buffer_size - transport_header_size,
     233              :                           spdm_response, spdm_response_size);
     234            1 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
     235            1 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
     236              :                                               false, false,
     237              :                                               spdm_response_size,
     238              :                                               spdm_response,
     239              :                                               response_size, response);
     240            1 :         session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
     241            1 :         if (session_info == NULL) {
     242            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
     243              :         }
     244              :         ((libspdm_secured_message_context_t
     245            1 :           *)(session_info->secured_message_context))
     246            1 :         ->application_secret.response_data_sequence_number--;
     247              :     }
     248            1 :         return LIBSPDM_STATUS_SUCCESS;
     249              : 
     250            2 :     case 0x6: {
     251              :         static size_t sub_index1 = 0;
     252            2 :         if (sub_index1 == 0) {
     253              :             spdm_error_response_t *spdm_response;
     254              :             size_t spdm_response_size;
     255              :             size_t transport_header_size;
     256              :             uint32_t session_id;
     257              :             libspdm_session_info_t *session_info;
     258              :             uint8_t *scratch_buffer;
     259              :             size_t scratch_buffer_size;
     260              : 
     261            1 :             spdm_response_size = sizeof(spdm_error_response_t);
     262            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     263            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     264              : 
     265            1 :             session_id = 0xFFFFFFFF;
     266            1 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     267            1 :             spdm_response->header.request_response_code = SPDM_ERROR;
     268            1 :             spdm_response->header.param1 = SPDM_ERROR_CODE_BUSY;
     269            1 :             spdm_response->header.param2 = 0;
     270              : 
     271              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
     272              :              * transport_message is always in sender buffer. */
     273            1 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
     274              :                                         &scratch_buffer_size);
     275            1 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
     276              :                               scratch_buffer_size - transport_header_size,
     277              :                               spdm_response, spdm_response_size);
     278            1 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
     279            1 :             libspdm_transport_test_encode_message(
     280              :                 spdm_context, &session_id, false, false,
     281              :                 spdm_response_size, spdm_response,
     282              :                 response_size, response);
     283            1 :             sub_index1++;
     284            1 :             session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
     285            1 :             if (session_info == NULL) {
     286            0 :                 return LIBSPDM_STATUS_RECEIVE_FAIL;
     287              :             }
     288              :             ((libspdm_secured_message_context_t
     289            1 :               *)(session_info->secured_message_context))
     290              :             ->application_secret
     291            1 :             .response_data_sequence_number--;
     292            1 :         } else if (sub_index1 == 1) {
     293              :             spdm_end_session_response_t *spdm_response;
     294              :             size_t spdm_response_size;
     295              :             size_t transport_header_size;
     296              :             uint32_t session_id;
     297              :             libspdm_session_info_t *session_info;
     298              :             uint8_t *scratch_buffer;
     299              :             size_t scratch_buffer_size;
     300              : 
     301            1 :             session_id = 0xFFFFFFFF;
     302            1 :             spdm_response_size = sizeof(spdm_end_session_response_t);
     303            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     304            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     305              : 
     306            1 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     307            1 :             spdm_response->header.request_response_code = SPDM_END_SESSION_ACK;
     308            1 :             spdm_response->header.param1 = 0;
     309            1 :             spdm_response->header.param2 = 0;
     310              : 
     311              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
     312              :              * transport_message is always in sender buffer. */
     313            1 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
     314              :                                         &scratch_buffer_size);
     315            1 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
     316              :                               scratch_buffer_size - transport_header_size,
     317              :                               spdm_response, spdm_response_size);
     318            1 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
     319            1 :             libspdm_transport_test_encode_message(
     320              :                 spdm_context, &session_id, false, false,
     321              :                 spdm_response_size, spdm_response, response_size,
     322              :                 response);
     323            1 :             session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
     324            1 :             if (session_info == NULL) {
     325            0 :                 return LIBSPDM_STATUS_RECEIVE_FAIL;
     326              :             }
     327              :             ((libspdm_secured_message_context_t
     328            1 :               *)(session_info->secured_message_context))
     329              :             ->application_secret
     330            1 :             .response_data_sequence_number--;
     331              :         }
     332              :     }
     333            2 :         return LIBSPDM_STATUS_SUCCESS;
     334              : 
     335            1 :     case 0x7: {
     336              :         spdm_error_response_t *spdm_response;
     337              :         size_t spdm_response_size;
     338              :         size_t transport_header_size;
     339              :         uint32_t session_id;
     340              :         libspdm_session_info_t *session_info;
     341              :         uint8_t *scratch_buffer;
     342              :         size_t scratch_buffer_size;
     343              : 
     344            1 :         spdm_response_size = sizeof(spdm_error_response_t);
     345            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     346            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     347              : 
     348            1 :         session_id = 0xFFFFFFFF;
     349            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_10;
     350            1 :         spdm_response->header.request_response_code = SPDM_ERROR;
     351            1 :         spdm_response->header.param1 = SPDM_ERROR_CODE_REQUEST_RESYNCH;
     352            1 :         spdm_response->header.param2 = 0;
     353              : 
     354              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
     355              :          * transport_message is always in sender buffer. */
     356            1 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
     357            1 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
     358              :                           scratch_buffer_size - transport_header_size,
     359              :                           spdm_response, spdm_response_size);
     360            1 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
     361            1 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
     362              :                                               false, false,
     363              :                                               spdm_response_size,
     364              :                                               spdm_response,
     365              :                                               response_size, response);
     366            1 :         session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
     367            1 :         if (session_info == NULL) {
     368            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
     369              :         }
     370              :         ((libspdm_secured_message_context_t
     371            1 :           *)(session_info->secured_message_context))
     372            1 :         ->application_secret.response_data_sequence_number--;
     373              :     }
     374            1 :         return LIBSPDM_STATUS_SUCCESS;
     375              : 
     376            2 :     case 0x8: {
     377              :         spdm_error_response_data_response_not_ready_t *spdm_response;
     378              :         size_t spdm_response_size;
     379              :         size_t transport_header_size;
     380              :         uint32_t session_id;
     381              :         libspdm_session_info_t *session_info;
     382              :         uint8_t *scratch_buffer;
     383              :         size_t scratch_buffer_size;
     384              : 
     385            2 :         spdm_response_size = sizeof(spdm_error_response_data_response_not_ready_t);
     386            2 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     387            2 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     388              : 
     389            2 :         session_id = 0xFFFFFFFF;
     390            2 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     391            2 :         spdm_response->header.request_response_code = SPDM_ERROR;
     392            2 :         spdm_response->header.param1 = SPDM_ERROR_CODE_RESPONSE_NOT_READY;
     393            2 :         spdm_response->header.param2 = 0;
     394            2 :         spdm_response->extend_error_data.rd_exponent = 1;
     395            2 :         spdm_response->extend_error_data.rd_tm = 2;
     396            2 :         spdm_response->extend_error_data.request_code = SPDM_END_SESSION;
     397            2 :         spdm_response->extend_error_data.token = 0;
     398              : 
     399              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
     400              :          * transport_message is always in sender buffer. */
     401            2 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
     402            2 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
     403              :                           scratch_buffer_size - transport_header_size,
     404              :                           spdm_response, spdm_response_size);
     405            2 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
     406            2 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
     407              :                                               false, false,
     408              :                                               spdm_response_size,
     409              :                                               spdm_response,
     410              :                                               response_size, response);
     411            2 :         session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
     412            2 :         if (session_info == NULL) {
     413            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
     414              :         }
     415              :         ((libspdm_secured_message_context_t
     416            2 :           *)(session_info->secured_message_context))
     417            2 :         ->application_secret.response_data_sequence_number--;
     418              :     }
     419            2 :         return LIBSPDM_STATUS_SUCCESS;
     420              : 
     421            2 :     case 0x9: {
     422              :         static size_t sub_index2 = 0;
     423            2 :         if (sub_index2 == 0) {
     424              :             spdm_error_response_data_response_not_ready_t
     425              :             *spdm_response;
     426              :             size_t spdm_response_size;
     427              :             size_t transport_header_size;
     428              :             uint32_t session_id;
     429              :             libspdm_session_info_t *session_info;
     430              :             uint8_t *scratch_buffer;
     431              :             size_t scratch_buffer_size;
     432              : 
     433            1 :             spdm_response_size = sizeof(spdm_error_response_data_response_not_ready_t);
     434            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     435            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     436              : 
     437            1 :             session_id = 0xFFFFFFFF;
     438            1 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     439            1 :             spdm_response->header.request_response_code = SPDM_ERROR;
     440            1 :             spdm_response->header.param1 = SPDM_ERROR_CODE_RESPONSE_NOT_READY;
     441            1 :             spdm_response->header.param2 = 0;
     442            1 :             spdm_response->extend_error_data.rd_exponent = 1;
     443            1 :             spdm_response->extend_error_data.rd_tm = 2;
     444            1 :             spdm_response->extend_error_data.request_code = SPDM_END_SESSION;
     445            1 :             spdm_response->extend_error_data.token = 1;
     446              : 
     447              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
     448              :              * transport_message is always in sender buffer. */
     449            1 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
     450              :                                         &scratch_buffer_size);
     451            1 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
     452              :                               scratch_buffer_size - transport_header_size,
     453              :                               spdm_response, spdm_response_size);
     454            1 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
     455            1 :             libspdm_transport_test_encode_message(
     456              :                 spdm_context, &session_id, false, false,
     457              :                 spdm_response_size, spdm_response,
     458              :                 response_size, response);
     459            1 :             sub_index2++;
     460            1 :             session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
     461            1 :             if (session_info == NULL) {
     462            0 :                 return LIBSPDM_STATUS_RECEIVE_FAIL;
     463              :             }
     464              :             ((libspdm_secured_message_context_t
     465            1 :               *)(session_info->secured_message_context))
     466              :             ->application_secret
     467            1 :             .response_data_sequence_number--;
     468            1 :         } else if (sub_index2 == 1) {
     469              :             spdm_end_session_response_t *spdm_response;
     470              :             size_t spdm_response_size;
     471              :             size_t transport_header_size;
     472              :             uint32_t session_id;
     473              :             libspdm_session_info_t *session_info;
     474              :             uint8_t *scratch_buffer;
     475              :             size_t scratch_buffer_size;
     476              : 
     477            1 :             session_id = 0xFFFFFFFF;
     478            1 :             spdm_response_size = sizeof(spdm_end_session_response_t);
     479            1 :             transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     480            1 :             spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     481              : 
     482            1 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     483            1 :             spdm_response->header.request_response_code = SPDM_END_SESSION_ACK;
     484            1 :             spdm_response->header.param1 = 0;
     485            1 :             spdm_response->header.param2 = 0;
     486              : 
     487              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
     488              :              * transport_message is always in sender buffer. */
     489            1 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
     490              :                                         &scratch_buffer_size);
     491            1 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
     492              :                               scratch_buffer_size - transport_header_size,
     493              :                               spdm_response, spdm_response_size);
     494            1 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
     495            1 :             libspdm_transport_test_encode_message(
     496              :                 spdm_context, &session_id, false, false,
     497              :                 spdm_response_size, spdm_response, response_size,
     498              :                 response);
     499            1 :             session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
     500            1 :             if (session_info == NULL) {
     501            0 :                 return LIBSPDM_STATUS_RECEIVE_FAIL;
     502              :             }
     503              :             ((libspdm_secured_message_context_t
     504            1 :               *)(session_info->secured_message_context))
     505              :             ->application_secret
     506            1 :             .response_data_sequence_number--;
     507              :         }
     508              :     }
     509            2 :         return LIBSPDM_STATUS_SUCCESS;
     510              : 
     511           18 :     case 0xA:
     512              :     {
     513              :         static uint16_t error_code = LIBSPDM_ERROR_CODE_RESERVED_00;
     514              : 
     515              :         spdm_error_response_t *spdm_response;
     516              :         size_t spdm_response_size;
     517              :         size_t transport_header_size;
     518              :         uint32_t session_id;
     519              :         libspdm_session_info_t      *session_info;
     520              :         uint8_t *scratch_buffer;
     521              :         size_t scratch_buffer_size;
     522              : 
     523           18 :         spdm_response_size = sizeof(spdm_error_response_t);
     524           18 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     525           18 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     526              : 
     527           18 :         session_id = 0xFFFFFFFF;
     528              : 
     529           18 :         if(error_code <= 0xff) {
     530           18 :             libspdm_zero_mem (spdm_response, spdm_response_size);
     531           18 :             spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     532           18 :             spdm_response->header.request_response_code = SPDM_ERROR;
     533           18 :             spdm_response->header.param1 = (uint8_t) error_code;
     534           18 :             spdm_response->header.param2 = 0;
     535              : 
     536              :             /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
     537              :              * transport_message is always in sender buffer. */
     538           18 :             libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer,
     539              :                                         &scratch_buffer_size);
     540           18 :             libspdm_copy_mem (scratch_buffer + transport_header_size,
     541              :                               scratch_buffer_size - transport_header_size,
     542              :                               spdm_response, spdm_response_size);
     543           18 :             spdm_response = (void *)(scratch_buffer + transport_header_size);
     544           18 :             libspdm_transport_test_encode_message (spdm_context, &session_id, false, false,
     545              :                                                    spdm_response_size, spdm_response,
     546              :                                                    response_size, response);
     547           18 :             session_info = libspdm_get_session_info_via_session_id (spdm_context, session_id);
     548           18 :             ((libspdm_secured_message_context_t*)(session_info->secured_message_context))->
     549           18 :             application_secret.response_data_sequence_number--;
     550              :         }
     551              : 
     552           18 :         error_code++;
     553           18 :         if(error_code == SPDM_ERROR_CODE_BUSY) { /*busy is treated in cases 5 and 6*/
     554            1 :             error_code = SPDM_ERROR_CODE_UNEXPECTED_REQUEST;
     555              :         }
     556              :         /* skip some reserved error codes (0d to 3e) */
     557           18 :         if(error_code == LIBSPDM_ERROR_CODE_RESERVED_0D) {
     558            1 :             error_code = LIBSPDM_ERROR_CODE_RESERVED_3F;
     559              :         }
     560              :         /* skip response not ready, request resync, and some reserved codes (44 to fc) */
     561           18 :         if(error_code == SPDM_ERROR_CODE_RESPONSE_NOT_READY) {
     562            1 :             error_code = LIBSPDM_ERROR_CODE_RESERVED_FD;
     563              :         }
     564              :     }
     565           18 :         return LIBSPDM_STATUS_SUCCESS;
     566            1 :     case 0xB: {
     567              :         spdm_end_session_response_t *spdm_response;
     568              :         size_t spdm_response_size;
     569              :         size_t transport_header_size;
     570              :         uint32_t session_id;
     571              :         libspdm_session_info_t *session_info;
     572              :         uint8_t *scratch_buffer;
     573              :         size_t scratch_buffer_size;
     574              : 
     575            1 :         session_id = 0xFFFFFFFF;
     576            1 :         spdm_response_size = sizeof(spdm_end_session_response_t);
     577            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     578            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     579              : 
     580            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     581            1 :         spdm_response->header.request_response_code = SPDM_END_SESSION_ACK;
     582            1 :         spdm_response->header.param1 = 0;
     583            1 :         spdm_response->header.param2 = 0;
     584              : 
     585              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
     586              :          * transport_message is always in sender buffer. */
     587            1 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
     588            1 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
     589              :                           scratch_buffer_size - transport_header_size,
     590              :                           spdm_response, spdm_response_size);
     591            1 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
     592            1 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
     593              :                                               false, false, spdm_response_size,
     594              :                                               spdm_response, response_size,
     595              :                                               response);
     596            1 :         session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
     597            1 :         if (session_info == NULL) {
     598            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
     599              :         }
     600              :         /* WALKAROUND: If just use single context to encode message and then decode message */
     601              :         ((libspdm_secured_message_context_t
     602            1 :           *)(session_info->secured_message_context))
     603            1 :         ->application_secret.response_data_sequence_number--;
     604              :     }
     605            1 :         return LIBSPDM_STATUS_SUCCESS;
     606            1 :     case 0xC: {
     607              :         spdm_error_response_t *spdm_response;
     608              :         size_t spdm_response_size;
     609              :         size_t transport_header_size;
     610              :         uint32_t session_id;
     611              :         libspdm_session_info_t *session_info;
     612              :         uint8_t *scratch_buffer;
     613              :         size_t scratch_buffer_size;
     614              : 
     615            1 :         spdm_response_size = sizeof(spdm_error_response_t);
     616            1 :         transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
     617            1 :         spdm_response = (void *)((uint8_t *)*response + transport_header_size);
     618              : 
     619            1 :         session_id = 0xFFFFFFFF;
     620            1 :         spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     621            1 :         spdm_response->header.request_response_code = SPDM_ERROR;
     622            1 :         spdm_response->header.param1 = SPDM_ERROR_CODE_DECRYPT_ERROR;
     623            1 :         spdm_response->header.param2 = 0;
     624              : 
     625              :         /* For secure message, message is in sender buffer, we need copy it to scratch buffer.
     626              :          * transport_message is always in sender buffer. */
     627            1 :         libspdm_get_scratch_buffer (spdm_context, (void **)&scratch_buffer, &scratch_buffer_size);
     628            1 :         libspdm_copy_mem (scratch_buffer + transport_header_size,
     629              :                           scratch_buffer_size - transport_header_size,
     630              :                           spdm_response, spdm_response_size);
     631            1 :         spdm_response = (void *)(scratch_buffer + transport_header_size);
     632            1 :         libspdm_transport_test_encode_message(spdm_context, &session_id,
     633              :                                               false, false,
     634              :                                               spdm_response_size,
     635              :                                               spdm_response,
     636              :                                               response_size, response);
     637            1 :         session_info = libspdm_get_session_info_via_session_id( spdm_context, session_id);
     638            1 :         if (session_info == NULL) {
     639            0 :             return LIBSPDM_STATUS_RECEIVE_FAIL;
     640              :         }
     641              :         ((libspdm_secured_message_context_t
     642            1 :           *)(session_info->secured_message_context))
     643            1 :         ->application_secret.response_data_sequence_number--;
     644              :     }
     645            1 :         return LIBSPDM_STATUS_SUCCESS;
     646              : 
     647            0 :     default:
     648            0 :         return LIBSPDM_STATUS_RECEIVE_FAIL;
     649              :     }
     650              : }
     651              : 
     652            1 : static void req_end_session_case1(void **state)
     653              : {
     654              :     libspdm_return_t status;
     655              :     libspdm_test_context_t *spdm_test_context;
     656              :     libspdm_context_t *spdm_context;
     657              :     uint32_t session_id;
     658              :     void *data;
     659              :     size_t data_size;
     660              :     void *hash;
     661              :     size_t hash_size;
     662              :     libspdm_session_info_t *session_info;
     663              : 
     664            1 :     spdm_test_context = *state;
     665            1 :     spdm_context = spdm_test_context->spdm_context;
     666            1 :     spdm_test_context->case_id = 0x1;
     667            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     668              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     669            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     670            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
     671            1 :     spdm_context->connection_info.capability.flags |=
     672              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
     673            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
     674            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
     675            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
     676            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
     677            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     678              :                                                          m_libspdm_use_asym_algo, &data,
     679              :                                                          &data_size, &hash, &hash_size)) {
     680            0 :         assert(false);
     681              :     }
     682            1 :     libspdm_reset_message_a(spdm_context);
     683            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     684            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     685            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
     686            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
     687              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     688              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = data_size;
     689              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
     690              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
     691              :                      data, data_size);
     692              : #endif
     693              : 
     694            1 :     session_id = 0xFFFFFFFF;
     695            1 :     session_info = &spdm_context->session_info[0];
     696            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
     697              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     698            1 :     libspdm_secured_message_set_session_state(
     699              :         session_info->secured_message_context,
     700              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
     701              : 
     702            1 :     status = libspdm_send_receive_end_session(spdm_context, session_id, 0);
     703            1 :     assert_int_equal(status, LIBSPDM_STATUS_SEND_FAIL);
     704            1 :     free(data);
     705            1 : }
     706              : 
     707            1 : static void req_end_session_case2(void **state)
     708              : {
     709              :     libspdm_return_t status;
     710              :     libspdm_test_context_t *spdm_test_context;
     711              :     libspdm_context_t *spdm_context;
     712              :     uint32_t session_id;
     713              :     void *data;
     714              :     size_t data_size;
     715              :     void *hash;
     716              :     size_t hash_size;
     717              :     libspdm_session_info_t *session_info;
     718              : 
     719            1 :     spdm_test_context = *state;
     720            1 :     spdm_context = spdm_test_context->spdm_context;
     721            1 :     spdm_test_context->case_id = 0x2;
     722            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     723              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     724            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     725            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
     726            1 :     spdm_context->connection_info.capability.flags |=
     727              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
     728            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
     729            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
     730            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
     731            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
     732            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     733              :                                                          m_libspdm_use_asym_algo, &data,
     734              :                                                          &data_size, &hash, &hash_size)) {
     735            0 :         assert(false);
     736              :     }
     737            1 :     libspdm_reset_message_a(spdm_context);
     738            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     739            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     740            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
     741            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
     742              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     743              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = data_size;
     744              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
     745              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
     746              :                      data, data_size);
     747              : #endif
     748              : 
     749            1 :     session_id = 0xFFFFFFFF;
     750            1 :     session_info = &spdm_context->session_info[0];
     751            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
     752              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     753            1 :     libspdm_secured_message_set_session_state(
     754              :         session_info->secured_message_context,
     755              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
     756            1 :     libspdm_set_mem(m_dummy_key_buffer,
     757              :                     ((libspdm_secured_message_context_t
     758            1 :                       *)(session_info->secured_message_context))
     759              :                     ->aead_key_size,
     760              :                     (uint8_t)(0xFF));
     761            1 :     libspdm_secured_message_set_response_data_encryption_key(
     762              :         session_info->secured_message_context, m_dummy_key_buffer,
     763              :         ((libspdm_secured_message_context_t
     764            1 :           *)(session_info->secured_message_context))
     765              :         ->aead_key_size);
     766            1 :     libspdm_set_mem(m_dummy_salt_buffer,
     767              :                     ((libspdm_secured_message_context_t
     768            1 :                       *)(session_info->secured_message_context))
     769              :                     ->aead_iv_size,
     770              :                     (uint8_t)(0xFF));
     771            1 :     libspdm_secured_message_set_response_data_salt(
     772              :         session_info->secured_message_context, m_dummy_salt_buffer,
     773              :         ((libspdm_secured_message_context_t
     774            1 :           *)(session_info->secured_message_context))
     775              :         ->aead_iv_size);
     776              :     ((libspdm_secured_message_context_t *)(session_info
     777            1 :                                            ->secured_message_context))
     778            1 :     ->application_secret.response_data_sequence_number = 0;
     779              : 
     780            1 :     status = libspdm_send_receive_end_session(spdm_context, session_id, 0);
     781            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     782            1 :     assert_int_equal(
     783              :         libspdm_secured_message_get_session_state(
     784              :             spdm_context->session_info[0].secured_message_context),
     785              :         LIBSPDM_SESSION_STATE_NOT_STARTED);
     786            1 :     free(data);
     787            1 : }
     788              : 
     789            1 : static void req_end_session_case3(void **state)
     790              : {
     791              :     libspdm_return_t status;
     792              :     libspdm_test_context_t *spdm_test_context;
     793              :     libspdm_context_t *spdm_context;
     794              :     uint32_t session_id;
     795              :     void *data;
     796              :     size_t data_size;
     797              :     void *hash;
     798              :     size_t hash_size;
     799              :     libspdm_session_info_t *session_info;
     800              : 
     801            1 :     spdm_test_context = *state;
     802            1 :     spdm_context = spdm_test_context->spdm_context;
     803            1 :     spdm_test_context->case_id = 0x3;
     804            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     805              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     806            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NOT_STARTED;
     807            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
     808            1 :     spdm_context->connection_info.capability.flags |=
     809              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
     810            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
     811            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
     812            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
     813            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
     814            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     815              :                                                          m_libspdm_use_asym_algo, &data,
     816              :                                                          &data_size, &hash, &hash_size)) {
     817            0 :         assert(false);
     818              :     }
     819            1 :     libspdm_reset_message_a(spdm_context);
     820            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     821            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     822            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
     823            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
     824              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     825              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = data_size;
     826              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
     827              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
     828              :                      data, data_size);
     829              : #endif
     830              : 
     831            1 :     session_id = 0xFFFFFFFF;
     832            1 :     session_info = &spdm_context->session_info[0];
     833            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
     834              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     835            1 :     libspdm_secured_message_set_session_state(
     836              :         session_info->secured_message_context,
     837              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
     838            1 :     libspdm_set_mem(m_dummy_key_buffer,
     839              :                     ((libspdm_secured_message_context_t
     840            1 :                       *)(session_info->secured_message_context))
     841              :                     ->aead_key_size,
     842              :                     (uint8_t)(0xFF));
     843            1 :     libspdm_secured_message_set_response_data_encryption_key(
     844              :         session_info->secured_message_context, m_dummy_key_buffer,
     845              :         ((libspdm_secured_message_context_t
     846            1 :           *)(session_info->secured_message_context))
     847              :         ->aead_key_size);
     848            1 :     libspdm_set_mem(m_dummy_salt_buffer,
     849              :                     ((libspdm_secured_message_context_t
     850            1 :                       *)(session_info->secured_message_context))
     851              :                     ->aead_iv_size,
     852              :                     (uint8_t)(0xFF));
     853            1 :     libspdm_secured_message_set_response_data_salt(
     854              :         session_info->secured_message_context, m_dummy_salt_buffer,
     855              :         ((libspdm_secured_message_context_t
     856            1 :           *)(session_info->secured_message_context))
     857              :         ->aead_iv_size);
     858              :     ((libspdm_secured_message_context_t *)(session_info
     859            1 :                                            ->secured_message_context))
     860            1 :     ->application_secret.response_data_sequence_number = 0;
     861              : 
     862            1 :     status = libspdm_send_receive_end_session(spdm_context, session_id, 0);
     863            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_STATE_LOCAL);
     864            1 :     free(data);
     865            1 : }
     866              : 
     867            1 : static void req_end_session_case4(void **state)
     868              : {
     869              :     libspdm_return_t status;
     870              :     libspdm_test_context_t *spdm_test_context;
     871              :     libspdm_context_t *spdm_context;
     872              :     uint32_t session_id;
     873              :     void *data;
     874              :     size_t data_size;
     875              :     void *hash;
     876              :     size_t hash_size;
     877              :     libspdm_session_info_t *session_info;
     878              : 
     879            1 :     spdm_test_context = *state;
     880            1 :     spdm_context = spdm_test_context->spdm_context;
     881            1 :     spdm_test_context->case_id = 0x4;
     882            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     883              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     884            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     885            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
     886            1 :     spdm_context->connection_info.capability.flags |=
     887              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
     888            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
     889            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
     890            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
     891            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
     892            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     893              :                                                          m_libspdm_use_asym_algo, &data,
     894              :                                                          &data_size, &hash, &hash_size)) {
     895            0 :         assert(false);
     896              :     }
     897            1 :     libspdm_reset_message_a(spdm_context);
     898            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     899            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     900            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
     901            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
     902              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     903              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = data_size;
     904              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
     905              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
     906              :                      data, data_size);
     907              : #endif
     908              : 
     909            1 :     session_id = 0xFFFFFFFF;
     910            1 :     session_info = &spdm_context->session_info[0];
     911            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
     912              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     913            1 :     libspdm_secured_message_set_session_state(
     914              :         session_info->secured_message_context,
     915              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
     916            1 :     libspdm_set_mem(m_dummy_key_buffer,
     917              :                     ((libspdm_secured_message_context_t
     918            1 :                       *)(session_info->secured_message_context))
     919              :                     ->aead_key_size,
     920              :                     (uint8_t)(0xFF));
     921            1 :     libspdm_secured_message_set_response_data_encryption_key(
     922              :         session_info->secured_message_context, m_dummy_key_buffer,
     923              :         ((libspdm_secured_message_context_t
     924            1 :           *)(session_info->secured_message_context))
     925              :         ->aead_key_size);
     926            1 :     libspdm_set_mem(m_dummy_salt_buffer,
     927              :                     ((libspdm_secured_message_context_t
     928            1 :                       *)(session_info->secured_message_context))
     929              :                     ->aead_iv_size,
     930              :                     (uint8_t)(0xFF));
     931            1 :     libspdm_secured_message_set_response_data_salt(
     932              :         session_info->secured_message_context, m_dummy_salt_buffer,
     933              :         ((libspdm_secured_message_context_t
     934            1 :           *)(session_info->secured_message_context))
     935              :         ->aead_iv_size);
     936              :     ((libspdm_secured_message_context_t *)(session_info
     937            1 :                                            ->secured_message_context))
     938            1 :     ->application_secret.response_data_sequence_number = 0;
     939              : 
     940            1 :     status = libspdm_send_receive_end_session(spdm_context, session_id, 0);
     941            1 :     assert_int_equal(status, LIBSPDM_STATUS_ERROR_PEER);
     942            1 :     free(data);
     943            1 : }
     944              : 
     945            1 : static void req_end_session_case5(void **state)
     946              : {
     947              :     libspdm_return_t status;
     948              :     libspdm_test_context_t *spdm_test_context;
     949              :     libspdm_context_t *spdm_context;
     950              :     uint32_t session_id;
     951              :     void *data;
     952              :     size_t data_size;
     953              :     void *hash;
     954              :     size_t hash_size;
     955              :     libspdm_session_info_t *session_info;
     956              : 
     957            1 :     spdm_test_context = *state;
     958            1 :     spdm_context = spdm_test_context->spdm_context;
     959            1 :     spdm_test_context->case_id = 0x5;
     960            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     961              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     962            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     963            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
     964            1 :     spdm_context->connection_info.capability.flags |=
     965              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
     966            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
     967            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
     968            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
     969            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
     970            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     971              :                                                          m_libspdm_use_asym_algo, &data,
     972              :                                                          &data_size, &hash, &hash_size)) {
     973            0 :         assert(false);
     974              :     }
     975            1 :     libspdm_reset_message_a(spdm_context);
     976            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     977            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     978            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
     979            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
     980              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     981              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = data_size;
     982              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
     983              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
     984              :                      data, data_size);
     985              : #endif
     986              : 
     987            1 :     session_id = 0xFFFFFFFF;
     988            1 :     session_info = &spdm_context->session_info[0];
     989            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
     990              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     991            1 :     libspdm_secured_message_set_session_state(
     992              :         session_info->secured_message_context,
     993              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
     994            1 :     libspdm_set_mem(m_dummy_key_buffer,
     995              :                     ((libspdm_secured_message_context_t
     996            1 :                       *)(session_info->secured_message_context))
     997              :                     ->aead_key_size,
     998              :                     (uint8_t)(0xFF));
     999            1 :     libspdm_secured_message_set_response_data_encryption_key(
    1000              :         session_info->secured_message_context, m_dummy_key_buffer,
    1001              :         ((libspdm_secured_message_context_t
    1002            1 :           *)(session_info->secured_message_context))
    1003              :         ->aead_key_size);
    1004            1 :     libspdm_set_mem(m_dummy_salt_buffer,
    1005              :                     ((libspdm_secured_message_context_t
    1006            1 :                       *)(session_info->secured_message_context))
    1007              :                     ->aead_iv_size,
    1008              :                     (uint8_t)(0xFF));
    1009            1 :     libspdm_secured_message_set_response_data_salt(
    1010              :         session_info->secured_message_context, m_dummy_salt_buffer,
    1011              :         ((libspdm_secured_message_context_t
    1012            1 :           *)(session_info->secured_message_context))
    1013              :         ->aead_iv_size);
    1014              :     ((libspdm_secured_message_context_t *)(session_info
    1015            1 :                                            ->secured_message_context))
    1016            1 :     ->application_secret.response_data_sequence_number = 0;
    1017              : 
    1018            1 :     status = libspdm_send_receive_end_session(spdm_context, session_id, 0);
    1019            1 :     assert_int_equal(status, LIBSPDM_STATUS_BUSY_PEER);
    1020            1 :     free(data);
    1021            1 : }
    1022              : 
    1023            1 : static void req_end_session_case6(void **state)
    1024              : {
    1025              :     libspdm_return_t status;
    1026              :     libspdm_test_context_t *spdm_test_context;
    1027              :     libspdm_context_t *spdm_context;
    1028              :     uint32_t session_id;
    1029              :     void *data;
    1030              :     size_t data_size;
    1031              :     void *hash;
    1032              :     size_t hash_size;
    1033              :     libspdm_session_info_t *session_info;
    1034              : 
    1035            1 :     spdm_test_context = *state;
    1036            1 :     spdm_context = spdm_test_context->spdm_context;
    1037            1 :     spdm_test_context->case_id = 0x6;
    1038            1 :     spdm_context->retry_times = 3;
    1039            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1040              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1041            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1042            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    1043            1 :     spdm_context->connection_info.capability.flags |=
    1044              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
    1045            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
    1046            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    1047            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
    1048            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
    1049            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1050              :                                                          m_libspdm_use_asym_algo, &data,
    1051              :                                                          &data_size, &hash, &hash_size)) {
    1052            0 :         assert(false);
    1053              :     }
    1054            1 :     libspdm_reset_message_a(spdm_context);
    1055            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1056            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    1057            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
    1058            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
    1059              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1060              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = data_size;
    1061              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    1062              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    1063              :                      data, data_size);
    1064              : #endif
    1065              : 
    1066            1 :     session_id = 0xFFFFFFFF;
    1067            1 :     session_info = &spdm_context->session_info[0];
    1068            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
    1069              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
    1070            1 :     libspdm_secured_message_set_session_state(
    1071              :         session_info->secured_message_context,
    1072              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
    1073            1 :     libspdm_set_mem(m_dummy_key_buffer,
    1074              :                     ((libspdm_secured_message_context_t
    1075            1 :                       *)(session_info->secured_message_context))
    1076              :                     ->aead_key_size,
    1077              :                     (uint8_t)(0xFF));
    1078            1 :     libspdm_secured_message_set_response_data_encryption_key(
    1079              :         session_info->secured_message_context, m_dummy_key_buffer,
    1080              :         ((libspdm_secured_message_context_t
    1081            1 :           *)(session_info->secured_message_context))
    1082              :         ->aead_key_size);
    1083            1 :     libspdm_set_mem(m_dummy_salt_buffer,
    1084              :                     ((libspdm_secured_message_context_t
    1085            1 :                       *)(session_info->secured_message_context))
    1086              :                     ->aead_iv_size,
    1087              :                     (uint8_t)(0xFF));
    1088            1 :     libspdm_secured_message_set_response_data_salt(
    1089              :         session_info->secured_message_context, m_dummy_salt_buffer,
    1090              :         ((libspdm_secured_message_context_t
    1091            1 :           *)(session_info->secured_message_context))
    1092              :         ->aead_iv_size);
    1093              :     ((libspdm_secured_message_context_t *)(session_info
    1094            1 :                                            ->secured_message_context))
    1095            1 :     ->application_secret.response_data_sequence_number = 0;
    1096              : 
    1097            1 :     status = libspdm_send_receive_end_session(spdm_context, session_id, 0);
    1098            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1099            1 :     assert_int_equal(
    1100              :         libspdm_secured_message_get_session_state(
    1101              :             spdm_context->session_info[0].secured_message_context),
    1102              :         LIBSPDM_SESSION_STATE_NOT_STARTED);
    1103            1 :     free(data);
    1104            1 : }
    1105              : 
    1106            1 : static void req_end_session_case7(void **state)
    1107              : {
    1108              :     libspdm_return_t status;
    1109              :     libspdm_test_context_t *spdm_test_context;
    1110              :     libspdm_context_t *spdm_context;
    1111              :     uint32_t session_id;
    1112              :     void *data;
    1113              :     size_t data_size;
    1114              :     void *hash;
    1115              :     size_t hash_size;
    1116              :     libspdm_session_info_t *session_info;
    1117              : 
    1118            1 :     spdm_test_context = *state;
    1119            1 :     spdm_context = spdm_test_context->spdm_context;
    1120            1 :     spdm_test_context->case_id = 0x7;
    1121            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1122              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1123            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1124            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    1125            1 :     spdm_context->connection_info.capability.flags |=
    1126              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
    1127            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
    1128            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    1129            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
    1130            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
    1131            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1132              :                                                          m_libspdm_use_asym_algo, &data,
    1133              :                                                          &data_size, &hash, &hash_size)) {
    1134            0 :         assert(false);
    1135              :     }
    1136            1 :     libspdm_reset_message_a(spdm_context);
    1137            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1138            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    1139            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
    1140            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
    1141              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1142              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = data_size;
    1143              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    1144              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    1145              :                      data, data_size);
    1146              : #endif
    1147              : 
    1148            1 :     session_id = 0xFFFFFFFF;
    1149            1 :     session_info = &spdm_context->session_info[0];
    1150            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
    1151              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
    1152            1 :     libspdm_secured_message_set_session_state(
    1153              :         session_info->secured_message_context,
    1154              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
    1155            1 :     libspdm_set_mem(m_dummy_key_buffer,
    1156              :                     ((libspdm_secured_message_context_t
    1157            1 :                       *)(session_info->secured_message_context))
    1158              :                     ->aead_key_size,
    1159              :                     (uint8_t)(0xFF));
    1160            1 :     libspdm_secured_message_set_response_data_encryption_key(
    1161              :         session_info->secured_message_context, m_dummy_key_buffer,
    1162              :         ((libspdm_secured_message_context_t
    1163            1 :           *)(session_info->secured_message_context))
    1164              :         ->aead_key_size);
    1165            1 :     libspdm_set_mem(m_dummy_salt_buffer,
    1166              :                     ((libspdm_secured_message_context_t
    1167            1 :                       *)(session_info->secured_message_context))
    1168              :                     ->aead_iv_size,
    1169              :                     (uint8_t)(0xFF));
    1170            1 :     libspdm_secured_message_set_response_data_salt(
    1171              :         session_info->secured_message_context, m_dummy_salt_buffer,
    1172              :         ((libspdm_secured_message_context_t
    1173            1 :           *)(session_info->secured_message_context))
    1174              :         ->aead_iv_size);
    1175              :     ((libspdm_secured_message_context_t *)(session_info
    1176            1 :                                            ->secured_message_context))
    1177            1 :     ->application_secret.response_data_sequence_number = 0;
    1178              : 
    1179            1 :     status = libspdm_send_receive_end_session(spdm_context, session_id, 0);
    1180            1 :     assert_int_equal(status, LIBSPDM_STATUS_RESYNCH_PEER);
    1181            1 :     assert_int_equal(spdm_context->connection_info.connection_state,
    1182              :                      LIBSPDM_CONNECTION_STATE_NOT_STARTED);
    1183            1 :     free(data);
    1184            1 : }
    1185              : 
    1186            1 : static void req_end_session_case8(void **state)
    1187              : {
    1188              :     libspdm_return_t status;
    1189              :     libspdm_test_context_t *spdm_test_context;
    1190              :     libspdm_context_t *spdm_context;
    1191              :     uint32_t session_id;
    1192              :     void *data;
    1193              :     size_t data_size;
    1194              :     void *hash;
    1195              :     size_t hash_size;
    1196              :     libspdm_session_info_t *session_info;
    1197              : 
    1198            1 :     spdm_test_context = *state;
    1199            1 :     spdm_context = spdm_test_context->spdm_context;
    1200            1 :     spdm_test_context->case_id = 0x8;
    1201            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1202              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1203            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1204            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    1205            1 :     spdm_context->connection_info.capability.flags |=
    1206              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
    1207            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
    1208            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    1209            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
    1210            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
    1211            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1212              :                                                          m_libspdm_use_asym_algo, &data,
    1213              :                                                          &data_size, &hash, &hash_size)) {
    1214            0 :         assert(false);
    1215              :     }
    1216            1 :     libspdm_reset_message_a(spdm_context);
    1217            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1218            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    1219            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
    1220            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
    1221              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1222              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = data_size;
    1223              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    1224              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    1225              :                      data, data_size);
    1226              : #endif
    1227              : 
    1228            1 :     session_id = 0xFFFFFFFF;
    1229            1 :     session_info = &spdm_context->session_info[0];
    1230            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
    1231              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
    1232            1 :     libspdm_secured_message_set_session_state(
    1233              :         session_info->secured_message_context,
    1234              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
    1235            1 :     libspdm_set_mem(m_dummy_key_buffer,
    1236              :                     ((libspdm_secured_message_context_t
    1237            1 :                       *)(session_info->secured_message_context))
    1238              :                     ->aead_key_size,
    1239              :                     (uint8_t)(0xFF));
    1240            1 :     libspdm_secured_message_set_response_data_encryption_key(
    1241              :         session_info->secured_message_context, m_dummy_key_buffer,
    1242              :         ((libspdm_secured_message_context_t
    1243            1 :           *)(session_info->secured_message_context))
    1244              :         ->aead_key_size);
    1245            1 :     libspdm_set_mem(m_dummy_salt_buffer,
    1246              :                     ((libspdm_secured_message_context_t
    1247            1 :                       *)(session_info->secured_message_context))
    1248              :                     ->aead_iv_size,
    1249              :                     (uint8_t)(0xFF));
    1250            1 :     libspdm_secured_message_set_response_data_salt(
    1251              :         session_info->secured_message_context, m_dummy_salt_buffer,
    1252              :         ((libspdm_secured_message_context_t
    1253            1 :           *)(session_info->secured_message_context))
    1254              :         ->aead_iv_size);
    1255              :     ((libspdm_secured_message_context_t *)(session_info
    1256            1 :                                            ->secured_message_context))
    1257            1 :     ->application_secret.response_data_sequence_number = 0;
    1258              : 
    1259            1 :     status = libspdm_send_receive_end_session(spdm_context, session_id, 0);
    1260            1 :     assert_int_equal(status, LIBSPDM_STATUS_NOT_READY_PEER);
    1261            1 :     free(data);
    1262            1 : }
    1263              : 
    1264            1 : static void req_end_session_case9(void **state)
    1265              : {
    1266              :     libspdm_return_t status;
    1267              :     libspdm_test_context_t *spdm_test_context;
    1268              :     libspdm_context_t *spdm_context;
    1269              :     uint32_t session_id;
    1270              :     void *data;
    1271              :     size_t data_size;
    1272              :     void *hash;
    1273              :     size_t hash_size;
    1274              :     libspdm_session_info_t *session_info;
    1275              : 
    1276            1 :     spdm_test_context = *state;
    1277            1 :     spdm_context = spdm_test_context->spdm_context;
    1278            1 :     spdm_test_context->case_id = 0x9;
    1279            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1280              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1281            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1282            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    1283            1 :     spdm_context->connection_info.capability.flags |=
    1284              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
    1285            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
    1286            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    1287            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
    1288            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
    1289            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1290              :                                                          m_libspdm_use_asym_algo, &data,
    1291              :                                                          &data_size, &hash, &hash_size)) {
    1292            0 :         assert(false);
    1293              :     }
    1294            1 :     libspdm_reset_message_a(spdm_context);
    1295            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1296            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    1297            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
    1298            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
    1299              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1300              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = data_size;
    1301              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    1302              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    1303              :                      data, data_size);
    1304              : #endif
    1305              : 
    1306            1 :     session_id = 0xFFFFFFFF;
    1307            1 :     session_info = &spdm_context->session_info[0];
    1308            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
    1309              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
    1310            1 :     libspdm_secured_message_set_session_state(
    1311              :         session_info->secured_message_context,
    1312              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
    1313            1 :     libspdm_set_mem(m_dummy_key_buffer,
    1314              :                     ((libspdm_secured_message_context_t
    1315            1 :                       *)(session_info->secured_message_context))
    1316              :                     ->aead_key_size,
    1317              :                     (uint8_t)(0xFF));
    1318            1 :     libspdm_secured_message_set_response_data_encryption_key(
    1319              :         session_info->secured_message_context, m_dummy_key_buffer,
    1320              :         ((libspdm_secured_message_context_t
    1321            1 :           *)(session_info->secured_message_context))
    1322              :         ->aead_key_size);
    1323            1 :     libspdm_set_mem(m_dummy_salt_buffer,
    1324              :                     ((libspdm_secured_message_context_t
    1325            1 :                       *)(session_info->secured_message_context))
    1326              :                     ->aead_iv_size,
    1327              :                     (uint8_t)(0xFF));
    1328            1 :     libspdm_secured_message_set_response_data_salt(
    1329              :         session_info->secured_message_context, m_dummy_salt_buffer,
    1330              :         ((libspdm_secured_message_context_t
    1331            1 :           *)(session_info->secured_message_context))->aead_iv_size);
    1332            1 :     ((libspdm_secured_message_context_t *)(session_info->secured_message_context))
    1333            1 :     ->application_secret.response_data_sequence_number = 0;
    1334              : 
    1335            1 :     status = libspdm_send_receive_end_session(spdm_context, session_id, 0);
    1336              :     if (LIBSPDM_RESPOND_IF_READY_SUPPORT) {
    1337            1 :         assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1338            1 :         assert_int_equal(
    1339              :             libspdm_secured_message_get_session_state(
    1340              :                 spdm_context->session_info[0].secured_message_context),
    1341              :             LIBSPDM_SESSION_STATE_NOT_STARTED);
    1342              :     } else {
    1343              :         assert_int_equal(status, LIBSPDM_STATUS_NOT_READY_PEER);
    1344              :     }
    1345            1 :     free(data);
    1346            1 : }
    1347              : 
    1348            1 : static void req_end_session_case10(void **state) {
    1349              :     libspdm_return_t status;
    1350              :     libspdm_test_context_t    *spdm_test_context;
    1351              :     libspdm_context_t  *spdm_context;
    1352              :     uint32_t session_id;
    1353              :     void                 *data;
    1354              :     size_t data_size;
    1355              :     void                 *hash;
    1356              :     size_t hash_size;
    1357              :     libspdm_session_info_t    *session_info;
    1358              :     uint16_t error_code;
    1359              : 
    1360            1 :     spdm_test_context = *state;
    1361            1 :     spdm_context = spdm_test_context->spdm_context;
    1362            1 :     spdm_test_context->case_id = 0xA;
    1363            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1364              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1365            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    1366            1 :     spdm_context->connection_info.capability.flags |=
    1367              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
    1368            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
    1369            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    1370            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
    1371            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
    1372            1 :     libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
    1373              :                                                      m_libspdm_use_asym_algo,
    1374              :                                                      &data, &data_size,
    1375              :                                                      &hash, &hash_size);
    1376            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1377            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    1378            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
    1379            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
    1380              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1381              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = data_size;
    1382              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    1383              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    1384              :                      data, data_size);
    1385              : #endif
    1386              : 
    1387            1 :     error_code = LIBSPDM_ERROR_CODE_RESERVED_00;
    1388           19 :     while(error_code <= 0xff) {
    1389           18 :         spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1390           18 :         libspdm_reset_message_a(spdm_context);
    1391              : 
    1392           18 :         session_id = 0xFFFFFFFF;
    1393           18 :         session_info = &spdm_context->session_info[0];
    1394           18 :         libspdm_session_info_init (spdm_context, session_info, session_id,
    1395              :                                    SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
    1396           18 :         libspdm_secured_message_set_session_state (session_info->secured_message_context,
    1397              :                                                    LIBSPDM_SESSION_STATE_ESTABLISHED);
    1398           18 :         libspdm_set_mem (m_dummy_key_buffer,
    1399           18 :                          ((libspdm_secured_message_context_t*)(session_info->secured_message_context))->aead_key_size,
    1400              :                          (uint8_t)(0xFF));
    1401           18 :         libspdm_secured_message_set_response_data_encryption_key (
    1402              :             session_info->secured_message_context, m_dummy_key_buffer,
    1403           18 :             ((libspdm_secured_message_context_t*)(session_info->secured_message_context))->aead_key_size);
    1404           18 :         libspdm_set_mem (m_dummy_salt_buffer,
    1405           18 :                          ((libspdm_secured_message_context_t*)(session_info->secured_message_context))->aead_iv_size,
    1406              :                          (uint8_t)(0xFF));
    1407           18 :         libspdm_secured_message_set_response_data_salt (session_info->secured_message_context,
    1408              :                                                         m_dummy_salt_buffer,
    1409              :                                                         ((libspdm_secured_message_context_t*)(
    1410              :                                                              session_info
    1411           18 :                                                              ->
    1412              :                                                              secured_message_context))->aead_iv_size);
    1413           18 :         ((libspdm_secured_message_context_t*)(session_info->secured_message_context))->
    1414           18 :         application_secret.response_data_sequence_number = 0;
    1415              : 
    1416           18 :         status = libspdm_send_receive_end_session (spdm_context, session_id, 0);
    1417           18 :         if(error_code != SPDM_ERROR_CODE_DECRYPT_ERROR) {
    1418           17 :             LIBSPDM_ASSERT_INT_EQUAL_CASE (status, LIBSPDM_STATUS_ERROR_PEER, error_code);
    1419              :         } else {
    1420            1 :             LIBSPDM_ASSERT_INT_EQUAL_CASE (status, LIBSPDM_STATUS_SESSION_MSG_ERROR, error_code);
    1421              :         }
    1422              : 
    1423           18 :         error_code++;
    1424           18 :         if(error_code == SPDM_ERROR_CODE_BUSY) { /*busy is treated in cases 5 and 6*/
    1425            1 :             error_code = SPDM_ERROR_CODE_UNEXPECTED_REQUEST;
    1426              :         }
    1427              :         /* skip some reserved error codes (0d to 3e) */
    1428           18 :         if(error_code == LIBSPDM_ERROR_CODE_RESERVED_0D) {
    1429            1 :             error_code = LIBSPDM_ERROR_CODE_RESERVED_3F;
    1430              :         }
    1431              :         /* skip response not ready, request resync, and some reserved codes (44 to fc) */
    1432           18 :         if(error_code == SPDM_ERROR_CODE_RESPONSE_NOT_READY) {
    1433            1 :             error_code = LIBSPDM_ERROR_CODE_RESERVED_FD;
    1434              :         }
    1435              :     }
    1436              : 
    1437            1 :     free(data);
    1438            1 : }
    1439              : 
    1440            1 : static void req_end_session_case11(void **state)
    1441              : {
    1442              :     libspdm_return_t status;
    1443              :     libspdm_test_context_t *spdm_test_context;
    1444              :     libspdm_context_t *spdm_context;
    1445              :     uint32_t session_id;
    1446              :     void *data;
    1447              :     size_t data_size;
    1448              :     void *hash;
    1449              :     size_t hash_size;
    1450              :     libspdm_session_info_t *session_info;
    1451              : 
    1452            1 :     spdm_test_context = *state;
    1453            1 :     spdm_context = spdm_test_context->spdm_context;
    1454            1 :     spdm_test_context->case_id = 0xB;
    1455            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1456              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1457            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1458            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    1459            1 :     spdm_context->connection_info.capability.flags |=
    1460              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
    1461            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
    1462            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    1463            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
    1464            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
    1465            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1466              :                                                          m_libspdm_use_asym_algo, &data,
    1467              :                                                          &data_size, &hash, &hash_size)) {
    1468            0 :         assert(false);
    1469              :     }
    1470            1 :     libspdm_reset_message_a(spdm_context);
    1471            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1472            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    1473            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
    1474            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
    1475              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1476              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = data_size;
    1477              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    1478              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    1479              :                      data, data_size);
    1480              : #endif
    1481              : 
    1482            1 :     session_id = 0xFFFFFFFF;
    1483            1 :     session_info = &spdm_context->session_info[0];
    1484            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
    1485              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
    1486            1 :     libspdm_secured_message_set_session_state(
    1487              :         session_info->secured_message_context,
    1488              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
    1489            1 :     libspdm_set_mem(m_dummy_key_buffer,
    1490              :                     ((libspdm_secured_message_context_t
    1491            1 :                       *)(session_info->secured_message_context))
    1492              :                     ->aead_key_size,
    1493              :                     (uint8_t)(0xFF));
    1494            1 :     libspdm_secured_message_set_response_data_encryption_key(
    1495              :         session_info->secured_message_context, m_dummy_key_buffer,
    1496              :         ((libspdm_secured_message_context_t
    1497            1 :           *)(session_info->secured_message_context))
    1498              :         ->aead_key_size);
    1499            1 :     libspdm_set_mem(m_dummy_salt_buffer,
    1500              :                     ((libspdm_secured_message_context_t
    1501            1 :                       *)(session_info->secured_message_context))
    1502              :                     ->aead_iv_size,
    1503              :                     (uint8_t)(0xFF));
    1504            1 :     libspdm_secured_message_set_response_data_salt(
    1505              :         session_info->secured_message_context, m_dummy_salt_buffer,
    1506              :         ((libspdm_secured_message_context_t
    1507            1 :           *)(session_info->secured_message_context))
    1508              :         ->aead_iv_size);
    1509              :     ((libspdm_secured_message_context_t *)(session_info
    1510            1 :                                            ->secured_message_context))
    1511            1 :     ->application_secret.response_data_sequence_number = 0;
    1512              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1513              :     session_info->session_transcript.message_m.buffer_size =
    1514              :         spdm_context->transcript.message_m.max_buffer_size;
    1515              :     spdm_context->transcript.message_b.buffer_size =
    1516              :         spdm_context->transcript.message_b.max_buffer_size;
    1517              :     spdm_context->transcript.message_c.buffer_size =
    1518              :         spdm_context->transcript.message_c.max_buffer_size;
    1519              :     spdm_context->transcript.message_mut_b.buffer_size =
    1520              :         spdm_context->transcript.message_mut_b.max_buffer_size;
    1521              :     spdm_context->transcript.message_mut_c.buffer_size =
    1522              :         spdm_context->transcript.message_mut_c.max_buffer_size;
    1523              : #endif
    1524              : 
    1525            1 :     status = libspdm_send_receive_end_session(spdm_context, session_id, 0);
    1526            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1527            1 :     assert_int_equal(
    1528              :         libspdm_secured_message_get_session_state(
    1529              :             spdm_context->session_info[0].secured_message_context),
    1530              :         LIBSPDM_SESSION_STATE_NOT_STARTED);
    1531              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1532              :     assert_int_equal(session_info->session_transcript.message_m.buffer_size, 0);
    1533              :     assert_int_equal(spdm_context->transcript.message_b.buffer_size, 0);
    1534              :     assert_int_equal(spdm_context->transcript.message_c.buffer_size, 0);
    1535              :     assert_int_equal(spdm_context->transcript.message_mut_b.buffer_size, 0);
    1536              :     assert_int_equal(spdm_context->transcript.message_mut_c.buffer_size, 0);
    1537              : #endif
    1538            1 :     free(data);
    1539            1 : }
    1540              : 
    1541              : /**
    1542              :  * Test 12: the requester is setup correctly, but receives an ERROR with SPDM_ERROR_CODE_DECRYPT_ERROR.
    1543              :  * Expected behavior: client returns a Status of INVALID_SESSION_ID  and free the session ID.
    1544              :  **/
    1545            1 : static void req_end_session_case12(void **state)
    1546              : {
    1547              :     libspdm_return_t status;
    1548              :     libspdm_test_context_t *spdm_test_context;
    1549              :     libspdm_context_t *spdm_context;
    1550              :     uint32_t session_id;
    1551              :     void *data;
    1552              :     size_t data_size;
    1553              :     void *hash;
    1554              :     size_t hash_size;
    1555              :     libspdm_session_info_t *session_info;
    1556              : 
    1557            1 :     spdm_test_context = *state;
    1558            1 :     spdm_context = spdm_test_context->spdm_context;
    1559            1 :     spdm_test_context->case_id = 0xC;
    1560            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1561              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1562            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1563            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP;
    1564            1 :     spdm_context->connection_info.capability.flags |=
    1565              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
    1566            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP;
    1567            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_PSK_CAP;
    1568            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP;
    1569            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP;
    1570            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1571              :                                                          m_libspdm_use_asym_algo, &data,
    1572              :                                                          &data_size, &hash, &hash_size)) {
    1573            0 :         assert(false);
    1574              :     }
    1575            1 :     libspdm_reset_message_a(spdm_context);
    1576            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1577            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    1578            1 :     spdm_context->connection_info.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
    1579            1 :     spdm_context->connection_info.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
    1580              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1581              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = data_size;
    1582              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
    1583              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
    1584              :                      data, data_size);
    1585              : #endif
    1586              : 
    1587            1 :     session_id = 0xFFFFFFFF;
    1588            1 :     session_info = &spdm_context->session_info[0];
    1589            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
    1590              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
    1591            1 :     libspdm_secured_message_set_session_state(
    1592              :         session_info->secured_message_context,
    1593              :         LIBSPDM_SESSION_STATE_ESTABLISHED);
    1594            1 :     libspdm_set_mem(m_dummy_key_buffer,
    1595              :                     ((libspdm_secured_message_context_t
    1596            1 :                       *)(session_info->secured_message_context))
    1597              :                     ->aead_key_size,
    1598              :                     (uint8_t)(0xFF));
    1599            1 :     libspdm_secured_message_set_response_data_encryption_key(
    1600              :         session_info->secured_message_context, m_dummy_key_buffer,
    1601              :         ((libspdm_secured_message_context_t
    1602            1 :           *)(session_info->secured_message_context))
    1603              :         ->aead_key_size);
    1604            1 :     libspdm_set_mem(m_dummy_salt_buffer,
    1605              :                     ((libspdm_secured_message_context_t
    1606            1 :                       *)(session_info->secured_message_context))
    1607              :                     ->aead_iv_size,
    1608              :                     (uint8_t)(0xFF));
    1609            1 :     libspdm_secured_message_set_response_data_salt(
    1610              :         session_info->secured_message_context, m_dummy_salt_buffer,
    1611              :         ((libspdm_secured_message_context_t
    1612            1 :           *)(session_info->secured_message_context))
    1613              :         ->aead_iv_size);
    1614              :     ((libspdm_secured_message_context_t *)(session_info
    1615            1 :                                            ->secured_message_context))
    1616            1 :     ->application_secret.response_data_sequence_number = 0;
    1617              : 
    1618            1 :     status = libspdm_send_receive_end_session(spdm_context, session_id, 0);
    1619            1 :     assert_int_equal(status, LIBSPDM_STATUS_SESSION_MSG_ERROR);
    1620            1 :     assert_int_equal(spdm_context->session_info->session_id, INVALID_SESSION_ID);
    1621              : 
    1622            1 :     free(data);
    1623            1 : }
    1624              : 
    1625            1 : int libspdm_req_end_session_test(void)
    1626              : {
    1627            1 :     const struct CMUnitTest test_cases[] = {
    1628              :         /* SendRequest failed*/
    1629              :         cmocka_unit_test(req_end_session_case1),
    1630              :         /* Successful response*/
    1631              :         cmocka_unit_test(req_end_session_case2),
    1632              :         /* connection_state check failed*/
    1633              :         cmocka_unit_test(req_end_session_case3),
    1634              :         /* Error response: SPDM_ERROR_CODE_INVALID_REQUEST*/
    1635              :         cmocka_unit_test(req_end_session_case4),
    1636              :         /* Always SPDM_ERROR_CODE_BUSY*/
    1637              :         cmocka_unit_test(req_end_session_case5),
    1638              :         /* SPDM_ERROR_CODE_BUSY + Successful response*/
    1639              :         cmocka_unit_test(req_end_session_case6),
    1640              :         /* Error response: SPDM_ERROR_CODE_REQUEST_RESYNCH*/
    1641              :         cmocka_unit_test(req_end_session_case7),
    1642              :         /* Always SPDM_ERROR_CODE_RESPONSE_NOT_READY*/
    1643              :         cmocka_unit_test(req_end_session_case8),
    1644              :         /* SPDM_ERROR_CODE_RESPONSE_NOT_READY + Successful response*/
    1645              :         cmocka_unit_test(req_end_session_case9),
    1646              :         /* Unexpected errors*/
    1647              :         cmocka_unit_test(req_end_session_case10),
    1648              :         /* Buffer reset*/
    1649              :         cmocka_unit_test(req_end_session_case11),
    1650              :         /* Error response: SPDM_ERROR_CODE_DECRYPT_ERROR*/
    1651              :         cmocka_unit_test(req_end_session_case12),
    1652              :     };
    1653              : 
    1654            1 :     libspdm_test_context_t test_context = {
    1655              :         LIBSPDM_TEST_CONTEXT_VERSION,
    1656              :         true,
    1657              :         send_message,
    1658              :         receive_message,
    1659              :     };
    1660              : 
    1661            1 :     libspdm_setup_test_context(&test_context);
    1662              : 
    1663            1 :     return cmocka_run_group_tests(test_cases,
    1664              :                                   libspdm_unit_test_group_setup,
    1665              :                                   libspdm_unit_test_group_teardown);
    1666              : }
    1667              : 
    1668              : #endif /* (LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP) || (LIBSPDM_ENABLE_CAPABILITY_PSK_CAP) */
        

Generated by: LCOV version 2.0-1