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: 2025-09-14 08:11:04 Functions: 100.0 % 17 17

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

Generated by: LCOV version 2.0-1