LCOV - code coverage report
Current view: top level - unit_test/test_spdm_responder - encap_response.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 99.5 % 578 575
Test Date: 2025-10-12 08:10:56 Functions: 94.7 % 19 18

            Line data    Source code
       1              : /**
       2              :  *  Copyright Notice:
       3              :  *  Copyright 2021-2025 DMTF. All rights reserved.
       4              :  *  License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
       5              :  **/
       6              : 
       7              : #include "spdm_unit_test.h"
       8              : #include "internal/libspdm_responder_lib.h"
       9              : 
      10              : #if LIBSPDM_ENABLE_CAPABILITY_ENCAP_CAP
      11              : 
      12              : spdm_get_encapsulated_request_request_t m_libspdm_encapsulated_request_t1 = {
      13              :     {SPDM_MESSAGE_VERSION_11, SPDM_GET_ENCAPSULATED_REQUEST, 0, 0}
      14              : };
      15              : size_t m_libspdm_encapsulated_request_t1_size = sizeof(m_libspdm_encapsulated_request_t1);
      16              : 
      17              : spdm_get_encapsulated_request_request_t m_libspdm_encapsulated_request_t2 = {
      18              :     {SPDM_MESSAGE_VERSION_13, SPDM_GET_ENCAPSULATED_REQUEST, 0, 0}
      19              : };
      20              : size_t m_libspdm_encapsulated_request_t2_size = sizeof(m_libspdm_encapsulated_request_t2);
      21              : 
      22              : spdm_deliver_encapsulated_response_request_t m_libspdm_m_deliver_encapsulated_response_request_t1 =
      23              : {
      24              :     {SPDM_MESSAGE_VERSION_11, SPDM_DELIVER_ENCAPSULATED_RESPONSE, 0, 0}
      25              : };
      26              : size_t m_libspdm_m_deliver_encapsulated_response_request_t1_size =
      27              :     sizeof(m_libspdm_m_deliver_encapsulated_response_request_t1);
      28              : 
      29              : static uint8_t m_libspdm_local_certificate_chain[LIBSPDM_MAX_CERT_CHAIN_SIZE];
      30              : 
      31              : spdm_deliver_encapsulated_response_request_t m_libspdm_m_deliver_encapsulated_response_request_t2 =
      32              : {
      33              :     {SPDM_MESSAGE_VERSION_12, SPDM_DELIVER_ENCAPSULATED_RESPONSE, 0xFF, 0}
      34              : };
      35              : size_t m_libspdm_m_deliver_encapsulated_response_request_t2_size =
      36              :     sizeof(m_libspdm_m_deliver_encapsulated_response_request_t2);
      37              : 
      38              : #if (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT)
      39              : 
      40            1 : void libspdm_test_get_response_encapsulated_request_case1(void **State)
      41              : {
      42              :     libspdm_return_t status;
      43              :     libspdm_test_context_t *spdm_test_context;
      44              :     spdm_encapsulated_request_response_t *spdm_response_requester;
      45              :     libspdm_context_t *spdm_context;
      46              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
      47              :     size_t data_size;
      48              :     void *data;
      49              :     size_t response_size;
      50              : 
      51            1 :     spdm_test_context = *State;
      52            1 :     spdm_context = spdm_test_context->spdm_context;
      53            1 :     spdm_test_context->case_id = 0x1;
      54              : 
      55            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
      56              : 
      57            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
      58            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
      59            1 :     spdm_context->encap_context.request_op_code_count =
      60              :         LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
      61            1 :     spdm_context->encap_context.current_request_op_code = 0;
      62            1 :     spdm_context->encap_context.request_op_code_sequence[0] = SPDM_GET_DIGESTS;
      63            1 :     spdm_context->encap_context.request_id = 0;
      64              : 
      65            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
      66            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
      67              : 
      68            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
      69            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
      70            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
      71              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
      72            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
      73              :                                                     m_libspdm_use_asym_algo, &data,
      74              :                                                     &data_size,
      75              :                                                     NULL, NULL);
      76            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
      77            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
      78            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
      79            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
      80            1 :     libspdm_reset_message_b(spdm_context);
      81              : 
      82            1 :     response_size = sizeof(response);
      83            1 :     status = libspdm_get_response_encapsulated_request(spdm_context,
      84              :                                                        m_libspdm_encapsulated_request_t1_size,
      85              :                                                        &m_libspdm_encapsulated_request_t1,
      86              :                                                        &response_size,
      87              :                                                        response);
      88              : 
      89            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
      90            1 :     assert_int_equal(response_size,
      91              :                      sizeof(spdm_encapsulated_request_response_t) + sizeof(spdm_digest_response_t));
      92            1 :     spdm_response_requester = (void *)response;
      93            1 :     assert_int_equal(spdm_response_requester->header.request_response_code,
      94              :                      SPDM_ENCAPSULATED_REQUEST);
      95            1 :     assert_int_equal(spdm_response_requester->header.param1,
      96              :                      0x1);
      97            1 :     assert_int_equal(spdm_response_requester->header.param2, 0);
      98            1 :     free(data);
      99            1 : }
     100              : 
     101            1 : void libspdm_test_get_response_encapsulated_request_case2(void **State)
     102              : {
     103              :     libspdm_return_t status;
     104              :     libspdm_test_context_t *spdm_test_context;
     105              :     spdm_encapsulated_request_response_t *spdm_response_requester;
     106              :     libspdm_context_t *spdm_context;
     107              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     108              :     size_t data_size;
     109              :     void *data;
     110              :     size_t response_size;
     111              : 
     112            1 :     spdm_test_context = *State;
     113            1 :     spdm_context = spdm_test_context->spdm_context;
     114            1 :     spdm_test_context->case_id = 0x2;
     115              : 
     116            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
     117            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
     118            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
     119            1 :     spdm_context->encap_context.request_op_code_count =
     120              :         LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
     121            1 :     spdm_context->encap_context.current_request_op_code = 0;
     122            1 :     spdm_context->encap_context.request_op_code_sequence[0] = SPDM_GET_CERTIFICATE;
     123            1 :     spdm_context->encap_context.request_id = 0;
     124              : 
     125            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     126            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
     127            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     128              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     129            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     130              :                                                     m_libspdm_use_asym_algo, &data,
     131              :                                                     &data_size,
     132              :                                                     NULL, NULL);
     133            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     134            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     135            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     136            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     137            1 :     libspdm_reset_message_b(spdm_context);
     138              : 
     139            1 :     response_size = sizeof(response);
     140              : 
     141            1 :     status = libspdm_get_response_encapsulated_request(spdm_context,
     142              :                                                        m_libspdm_encapsulated_request_t1_size,
     143              :                                                        &m_libspdm_encapsulated_request_t1,
     144              :                                                        &response_size,
     145              :                                                        response);
     146              : 
     147            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     148            1 :     assert_int_equal(response_size,
     149              :                      sizeof(spdm_encapsulated_request_response_t) +
     150              :                      sizeof(spdm_certificate_response_t));
     151            1 :     spdm_response_requester = (void *)response;
     152            1 :     assert_int_equal(spdm_response_requester->header.request_response_code,
     153              :                      SPDM_ENCAPSULATED_REQUEST);
     154            1 :     assert_int_equal(spdm_response_requester->header.param1,
     155              :                      0x1);
     156            1 :     assert_int_equal(spdm_response_requester->header.param2, 0);
     157            1 :     free(data);
     158            1 : }
     159              : 
     160            1 : void libspdm_test_get_response_encapsulated_request_case3(void **State)
     161              : {
     162              :     libspdm_return_t status;
     163              :     libspdm_test_context_t *spdm_test_context;
     164              :     spdm_encapsulated_request_response_t *spdm_response_requester;
     165              :     libspdm_context_t *spdm_context;
     166              :     size_t response_size;
     167              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     168              :     uint8_t m_local_certificate_chain[LIBSPDM_MAX_CERT_CHAIN_SIZE];
     169              : 
     170            1 :     spdm_test_context = *State;
     171            1 :     spdm_context = spdm_test_context->spdm_context;
     172            1 :     spdm_test_context->case_id = 0x3;
     173              : 
     174            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
     175            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
     176            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
     177              : 
     178            1 :     spdm_context->encap_context.current_request_op_code = 0;
     179            1 :     spdm_context->encap_context.request_id = 0;
     180            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     181            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
     182            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     183            1 :     spdm_context->local_context.local_cert_chain_provision[0] = m_local_certificate_chain;
     184            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
     185              :         sizeof(m_local_certificate_chain);
     186            1 :     libspdm_set_mem(m_local_certificate_chain, sizeof(m_local_certificate_chain), (uint8_t)(0xFF));
     187              : 
     188            1 :     response_size = sizeof(response);
     189            1 :     status = libspdm_get_response_encapsulated_request(spdm_context,
     190              :                                                        m_libspdm_encapsulated_request_t1_size,
     191              :                                                        &m_libspdm_encapsulated_request_t1,
     192              :                                                        &response_size,
     193              :                                                        response);
     194              : 
     195            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     196            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     197            1 :     spdm_response_requester = (void *)response;
     198            1 :     assert_int_equal(spdm_response_requester->header.request_response_code,
     199              :                      SPDM_ERROR);
     200            1 :     assert_int_equal(spdm_response_requester->header.param1,
     201              :                      SPDM_ERROR_CODE_UNEXPECTED_REQUEST);
     202            1 :     assert_int_equal(spdm_response_requester->header.param2, 0);
     203            1 : }
     204              : 
     205            1 : void libspdm_test_get_response_encapsulated_request_case4(void **State)
     206              : {
     207              :     libspdm_return_t status;
     208              :     libspdm_test_context_t *spdm_test_context;
     209              :     spdm_encapsulated_request_response_t *spdm_response_requester;
     210              :     libspdm_context_t *spdm_context;
     211              :     size_t response_size;
     212              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     213              :     uint8_t m_local_certificate_chain[LIBSPDM_MAX_CERT_CHAIN_SIZE];
     214              : 
     215            1 :     spdm_test_context = *State;
     216            1 :     spdm_context = spdm_test_context->spdm_context;
     217            1 :     spdm_test_context->case_id = 0x4;
     218              : 
     219            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NEED_RESYNC;
     220            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
     221            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
     222              : 
     223            1 :     spdm_context->encap_context.current_request_op_code = SPDM_GET_DIGESTS;
     224              : 
     225            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     226            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
     227            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     228            1 :     spdm_context->local_context.local_cert_chain_provision[0] = m_local_certificate_chain;
     229            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
     230              :         sizeof(m_local_certificate_chain);
     231            1 :     libspdm_set_mem(m_local_certificate_chain, sizeof(m_local_certificate_chain), (uint8_t)(0xFF));
     232              : 
     233            1 :     response_size = sizeof(response);
     234            1 :     status = libspdm_get_response_encapsulated_request(spdm_context,
     235              :                                                        m_libspdm_encapsulated_request_t1_size,
     236              :                                                        &m_libspdm_encapsulated_request_t1,
     237              :                                                        &response_size,
     238              :                                                        response);
     239            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     240            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     241            1 :     spdm_response_requester = (void *)response;
     242            1 :     assert_int_equal(spdm_response_requester->header.request_response_code,
     243              :                      SPDM_ERROR);
     244            1 :     assert_int_equal(spdm_response_requester->header.param1,
     245              :                      SPDM_ERROR_CODE_REQUEST_RESYNCH);
     246            1 :     assert_int_equal(spdm_response_requester->header.param2, 0);
     247            1 : }
     248              : #endif /* (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT) */
     249              : #if (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_SEND_CHALLENGE_SUPPORT)
     250            1 : void libspdm_test_get_response_encapsulated_request_case5(void **State)
     251              : {
     252              :     libspdm_return_t status;
     253              :     libspdm_test_context_t *spdm_test_context;
     254              :     spdm_encapsulated_request_response_t *spdm_response_requester;
     255              :     libspdm_context_t *spdm_context;
     256              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     257              :     size_t data_size;
     258              :     void *data;
     259              :     size_t response_size;
     260              : 
     261            1 :     spdm_test_context = *State;
     262            1 :     spdm_context = spdm_test_context->spdm_context;
     263            1 :     spdm_test_context->case_id = 0x5;
     264              : 
     265            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
     266            1 :     spdm_context->connection_info.capability.flags = 0;
     267            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
     268            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
     269            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
     270            1 :     spdm_context->encap_context.request_op_code_count =
     271              :         LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
     272            1 :     spdm_context->encap_context.current_request_op_code = 0;
     273            1 :     spdm_context->encap_context.request_op_code_sequence[0] = SPDM_CHALLENGE;
     274            1 :     spdm_context->encap_context.request_id = 0;
     275              : 
     276            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     277            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
     278            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     279              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     280            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     281              :                                                     m_libspdm_use_asym_algo, &data,
     282              :                                                     &data_size,
     283              :                                                     NULL, NULL);
     284            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     285            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     286            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     287            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     288            1 :     libspdm_reset_message_b(spdm_context);
     289              : 
     290            1 :     response_size = sizeof(response);
     291            1 :     status = libspdm_get_response_encapsulated_request(spdm_context,
     292              :                                                        m_libspdm_encapsulated_request_t1_size,
     293              :                                                        &m_libspdm_encapsulated_request_t1,
     294              :                                                        &response_size,
     295              :                                                        response);
     296              : 
     297            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     298            1 :     assert_int_equal(response_size,
     299              :                      sizeof(spdm_encapsulated_request_response_t) +
     300              :                      sizeof(spdm_challenge_request_t));
     301            1 :     spdm_response_requester = (void *)response;
     302            1 :     assert_int_equal(spdm_response_requester->header.request_response_code,
     303              :                      SPDM_ENCAPSULATED_REQUEST);
     304            1 :     assert_int_equal(spdm_response_requester->header.param1,
     305              :                      0x1);
     306            1 :     assert_int_equal(spdm_response_requester->header.param2, 0);
     307            1 :     free(data);
     308            1 : }
     309              : 
     310              : #endif /* LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_SEND_CHALLENGE_SUPPORT) */
     311              : 
     312            1 : void libspdm_test_get_response_encapsulated_request_case6(void **State)
     313              : {
     314              :     libspdm_return_t status;
     315              :     libspdm_test_context_t *spdm_test_context;
     316              :     spdm_encapsulated_request_response_t *spdm_response_requester;
     317              :     libspdm_context_t *spdm_context;
     318              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     319              :     size_t data_size;
     320              :     void *data;
     321              :     size_t response_size;
     322              :     uint32_t session_id;
     323              :     libspdm_session_info_t *session_info;
     324              : 
     325            1 :     spdm_test_context = *State;
     326            1 :     spdm_context = spdm_test_context->spdm_context;
     327            1 :     spdm_test_context->case_id = 0x6;
     328              : 
     329            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
     330            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     331            1 :     spdm_context->connection_info.capability.flags |=
     332              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_UPD_CAP;
     333            1 :     spdm_context->local_context.capability.flags |=
     334              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_UPD_CAP;
     335            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
     336            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
     337            1 :     spdm_context->encap_context.request_op_code_count =
     338              :         LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
     339            1 :     spdm_context->encap_context.current_request_op_code = 0;
     340            1 :     spdm_context->encap_context.request_op_code_sequence[0] = SPDM_KEY_UPDATE;
     341            1 :     spdm_context->encap_context.request_id = 0;
     342              : 
     343            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     344            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
     345            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     346              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     347            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     348              :                                                     m_libspdm_use_asym_algo, &data,
     349              :                                                     &data_size,
     350              :                                                     NULL, NULL);
     351            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     352            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     353            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     354            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     355            1 :     libspdm_reset_message_b(spdm_context);
     356              : 
     357            1 :     session_id = 0xFFFFFFFF;
     358            1 :     spdm_context->latest_session_id = session_id;
     359            1 :     spdm_context->last_spdm_request_session_id_valid = true;
     360            1 :     spdm_context->last_spdm_request_session_id = session_id;
     361            1 :     session_info = &spdm_context->session_info[0];
     362            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
     363              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     364            1 :     libspdm_secured_message_set_session_state(session_info->secured_message_context,
     365              :                                               LIBSPDM_SESSION_STATE_ESTABLISHED);
     366              : 
     367            1 :     response_size = sizeof(response);
     368            1 :     status = libspdm_get_response_encapsulated_request(spdm_context,
     369              :                                                        m_libspdm_encapsulated_request_t1_size,
     370              :                                                        &m_libspdm_encapsulated_request_t1,
     371              :                                                        &response_size,
     372              :                                                        response);
     373              : 
     374            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     375            1 :     assert_int_equal(response_size,
     376              :                      sizeof(spdm_encapsulated_request_response_t) +
     377              :                      sizeof(spdm_key_update_response_t));
     378            1 :     spdm_response_requester = (void *)response;
     379            1 :     assert_int_equal(spdm_response_requester->header.request_response_code,
     380              :                      SPDM_ENCAPSULATED_REQUEST);
     381            1 :     assert_int_equal(spdm_response_requester->header.param1,
     382              :                      0x1);
     383            1 :     assert_int_equal(spdm_response_requester->header.param2, 0);
     384            1 :     free(data);
     385            1 : }
     386              : 
     387            1 : void libspdm_test_get_response_encapsulated_request_case7(void **State)
     388              : {
     389              :     libspdm_return_t status;
     390              :     libspdm_test_context_t *spdm_test_context;
     391              :     spdm_error_response_t *spdm_response_requester;
     392              :     libspdm_context_t *spdm_context;
     393              :     size_t response_size;
     394              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     395              :     uint8_t m_local_certificate_chain[LIBSPDM_MAX_CERT_CHAIN_SIZE];
     396              : 
     397            1 :     spdm_test_context = *State;
     398            1 :     spdm_context = spdm_test_context->spdm_context;
     399            1 :     spdm_test_context->case_id = 0x7;
     400              : 
     401            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     402              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     403            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
     404            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
     405            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
     406              : 
     407            1 :     spdm_context->encap_context.current_request_op_code = 0;
     408            1 :     spdm_context->encap_context.request_id = 0;
     409            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     410            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP;
     411            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     412            1 :     spdm_context->local_context.local_cert_chain_provision[0] = m_local_certificate_chain;
     413            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
     414              :         sizeof(m_local_certificate_chain);
     415            1 :     libspdm_set_mem(m_local_certificate_chain, sizeof(m_local_certificate_chain), 0xFF);
     416              : 
     417            1 :     response_size = sizeof(response);
     418            1 :     status = libspdm_get_response_encapsulated_request(spdm_context,
     419              :                                                        m_libspdm_encapsulated_request_t1_size,
     420              :                                                        &m_libspdm_encapsulated_request_t1,
     421              :                                                        &response_size,
     422              :                                                        response);
     423              : 
     424            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     425            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     426            1 :     spdm_response_requester = (void *)response;
     427            1 :     assert_int_equal(spdm_response_requester->header.request_response_code, SPDM_ERROR);
     428            1 :     assert_int_equal(spdm_response_requester->header.param1, SPDM_ERROR_CODE_NO_PENDING_REQUESTS);
     429            1 :     assert_int_equal(spdm_response_requester->header.param2, 0);
     430            1 : }
     431              : 
     432              : #if LIBSPDM_SEND_GET_ENDPOINT_INFO_SUPPORT
     433            0 : libspdm_return_t get_endpoint_info_callback_encap_response (
     434              :     void *spdm_context,
     435              :     uint8_t subcode,
     436              :     uint8_t param2,
     437              :     uint8_t request_attributes,
     438              :     uint32_t endpoint_info_size,
     439              :     const void *endpoint_info)
     440              : {
     441              :     /* should never reach here */
     442            0 :     LIBSPDM_ASSERT (0);
     443            0 :     return LIBSPDM_STATUS_UNSUPPORTED_CAP;
     444              : }
     445              : 
     446            1 : void libspdm_test_get_response_encapsulated_request_case8(void **State)
     447              : {
     448              :     libspdm_return_t status;
     449              :     libspdm_test_context_t *spdm_test_context;
     450              :     spdm_encapsulated_request_response_t *spdm_response_requester;
     451              :     libspdm_context_t *spdm_context;
     452              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     453              :     size_t data_size;
     454              :     void *data;
     455              :     size_t response_size;
     456              :     uint32_t session_id;
     457              :     libspdm_session_info_t *session_info;
     458              : 
     459            1 :     spdm_test_context = *State;
     460            1 :     spdm_context = spdm_test_context->spdm_context;
     461            1 :     spdm_test_context->case_id = 0x6;
     462              : 
     463            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
     464            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     465            1 :     spdm_context->connection_info.capability.flags |=
     466              :         SPDM_GET_CAPABILITIES_REQUEST_FLAGS_EP_INFO_CAP_SIG;
     467            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
     468            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
     469            1 :     spdm_context->encap_context.request_op_code_count =
     470              :         LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
     471            1 :     spdm_context->encap_context.current_request_op_code = 0;
     472            1 :     spdm_context->encap_context.request_op_code_sequence[0] = SPDM_GET_ENDPOINT_INFO;
     473            1 :     spdm_context->encap_context.request_id = 0;
     474              : 
     475            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     476            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
     477            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     478              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     479            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     480              :                                                     m_libspdm_use_req_asym_algo, &data,
     481              :                                                     &data_size,
     482              :                                                     NULL, NULL);
     483            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     484            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     485            1 :     spdm_context->connection_info.algorithm.req_base_asym_alg = m_libspdm_use_req_asym_algo;
     486            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     487            1 :     spdm_context->get_endpoint_info_callback = get_endpoint_info_callback_encap_response;
     488              : 
     489              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     490              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size =
     491              :         data_size;
     492              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
     493              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
     494              :                      data, data_size);
     495              : #else
     496            1 :     libspdm_hash_all(
     497              :         spdm_context->connection_info.algorithm.base_hash_algo,
     498              :         data, data_size,
     499            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
     500            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
     501            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
     502            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
     503              :         spdm_context->connection_info.algorithm.base_hash_algo,
     504              :         spdm_context->connection_info.algorithm.base_asym_algo,
     505              :         data, data_size,
     506              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
     507              : #endif
     508              : 
     509            1 :     session_id = 0xFFFFFFFF;
     510            1 :     spdm_context->latest_session_id = session_id;
     511            1 :     spdm_context->last_spdm_request_session_id_valid = true;
     512            1 :     spdm_context->last_spdm_request_session_id = session_id;
     513            1 :     session_info = &spdm_context->session_info[0];
     514            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
     515              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     516            1 :     libspdm_secured_message_set_session_state(session_info->secured_message_context,
     517              :                                               LIBSPDM_SESSION_STATE_ESTABLISHED);
     518              : 
     519            1 :     libspdm_reset_message_a(spdm_context);
     520            1 :     libspdm_reset_message_encap_e(spdm_context, session_info);
     521              : 
     522            1 :     response_size = sizeof(response);
     523            1 :     status = libspdm_get_response_encapsulated_request(spdm_context,
     524              :                                                        m_libspdm_encapsulated_request_t2_size,
     525              :                                                        &m_libspdm_encapsulated_request_t2,
     526              :                                                        &response_size,
     527              :                                                        response);
     528              : 
     529            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     530              : 
     531            1 :     assert_int_equal(response_size,
     532              :                      sizeof(spdm_encapsulated_request_response_t) +
     533              :                      sizeof(spdm_get_endpoint_info_request_t) +
     534              :                      SPDM_NONCE_SIZE);
     535            1 :     spdm_response_requester = (void *)response;
     536            1 :     assert_int_equal(spdm_response_requester->header.request_response_code,
     537              :                      SPDM_ENCAPSULATED_REQUEST);
     538            1 :     assert_int_equal(spdm_response_requester->header.param1,
     539              :                      0x1);
     540            1 :     assert_int_equal(spdm_response_requester->header.param2, 0);
     541            1 :     free(data);
     542            1 : }
     543              : #endif /* LIBSPDM_SEND_GET_ENDPOINT_INFO_SUPPORT */
     544              : 
     545            1 : void libspdm_test_get_response_encapsulated_response_ack_case1(void **State)
     546              : {
     547              :     libspdm_return_t status;
     548              :     libspdm_test_context_t *spdm_test_context;
     549              :     libspdm_context_t *spdm_context;
     550              :     spdm_deliver_encapsulated_response_request_t *spdm_response_requester;
     551              :     spdm_digest_response_t *spdm_response_requester_digest;
     552              :     uint8_t temp_buf[LIBSPDM_MAX_SPDM_MSG_SIZE];
     553              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     554              :     size_t spdm_response_requester_size;
     555              :     size_t spdm_response_requester_digest_size;
     556              :     size_t data_size;
     557              :     size_t response_size;
     558              :     uint8_t *digest;
     559              :     void *data;
     560              : 
     561            1 :     spdm_test_context = *State;
     562            1 :     spdm_context = spdm_test_context->spdm_context;
     563              : 
     564            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
     565            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
     566            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
     567            1 :     spdm_context->encap_context.request_op_code_count =
     568              :         LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
     569              : 
     570            1 :     spdm_context->encap_context.current_request_op_code = SPDM_GET_DIGESTS;
     571            1 :     spdm_context->encap_context.request_op_code_sequence[0] = SPDM_GET_DIGESTS;
     572              : 
     573            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     574            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
     575            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     576              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     577            1 :     spdm_context->encap_context.request_id = 0;
     578            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     579              :                                                     m_libspdm_use_asym_algo, &data,
     580              :                                                     &data_size,
     581              :                                                     NULL, NULL);
     582            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     583            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     584            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     585            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     586            1 :     libspdm_reset_message_b(spdm_context);
     587              : 
     588            1 :     spdm_response_requester_size = sizeof(spdm_digest_response_t) +
     589            1 :                                    libspdm_get_hash_size(m_libspdm_use_hash_algo) +
     590              :                                    sizeof(spdm_deliver_encapsulated_response_request_t);
     591              : 
     592            1 :     spdm_response_requester = (void *)temp_buf;
     593            1 :     libspdm_copy_mem(spdm_response_requester,
     594              :                      sizeof(temp_buf),
     595              :                      &m_libspdm_m_deliver_encapsulated_response_request_t1,
     596              :                      m_libspdm_m_deliver_encapsulated_response_request_t1_size);
     597              : 
     598            1 :     spdm_response_requester_digest_size = sizeof(spdm_digest_response_t) +
     599            1 :                                           libspdm_get_hash_size(m_libspdm_use_hash_algo);
     600            1 :     spdm_response_requester_digest =
     601              :         (void *)(temp_buf + sizeof(spdm_deliver_encapsulated_response_request_t));
     602            1 :     spdm_response_requester_digest->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     603            1 :     spdm_response_requester_digest->header.param1 = 0;
     604            1 :     spdm_response_requester_digest->header.request_response_code = SPDM_DIGESTS;
     605            1 :     spdm_response_requester_digest->header.param2 = 0;
     606              : 
     607            1 :     digest = (void *)(spdm_response_requester_digest + 1);
     608            1 :     libspdm_hash_all(m_libspdm_use_hash_algo, m_libspdm_local_certificate_chain,
     609              :                      sizeof(m_libspdm_local_certificate_chain), &digest[0]);
     610            1 :     spdm_response_requester_digest->header.param2 |= (0x01 << 0);
     611              : 
     612            1 :     libspdm_set_mem(m_libspdm_local_certificate_chain,
     613              :                     sizeof(m_libspdm_local_certificate_chain),
     614              :                     (uint8_t)(0xFF));
     615              : 
     616            1 :     libspdm_copy_mem(spdm_response_requester + 1,
     617              :                      spdm_response_requester_digest_size,
     618              :                      spdm_response_requester_digest,
     619              :                      spdm_response_requester_digest_size);
     620              : 
     621            1 :     response_size = sizeof(response);
     622            1 :     status = libspdm_get_response_encapsulated_response_ack(spdm_context,
     623              :                                                             spdm_response_requester_size,
     624              :                                                             spdm_response_requester, &response_size,
     625              :                                                             response);
     626            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     627            1 :     free(data);
     628            1 : }
     629              : 
     630            1 : void libspdm_test_get_response_encapsulated_response_ack_case2(void **State)
     631              : {
     632              :     libspdm_return_t status;
     633              :     libspdm_test_context_t *spdm_test_context;
     634              :     libspdm_context_t *spdm_context;
     635              :     spdm_deliver_encapsulated_response_request_t *spdm_response_requester;
     636              :     spdm_certificate_response_t *spdm_response_requester_certificate;
     637              :     uint8_t temp_buf[LIBSPDM_MAX_SPDM_MSG_SIZE];
     638              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     639              :     size_t spdm_response_requester_size;
     640              :     size_t data_size;
     641              :     size_t response_size;
     642              :     void *data;
     643              :     uint16_t portion_length;
     644              :     uint16_t remainder_length;
     645              :     static size_t calling_index = 0;
     646              : 
     647              :     static void *libspdm_local_certificate_chain;
     648              :     static size_t libspdm_local_certificate_chain_size;
     649              : 
     650            1 :     spdm_test_context = *State;
     651            1 :     spdm_context = spdm_test_context->spdm_context;
     652              : 
     653            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
     654            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
     655            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
     656            1 :     spdm_context->encap_context.request_op_code_count =
     657              :         LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
     658              : 
     659            1 :     spdm_context->encap_context.current_request_op_code = SPDM_GET_CERTIFICATE;
     660            1 :     spdm_context->encap_context.request_op_code_sequence[0] = SPDM_GET_CERTIFICATE;
     661              : 
     662            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     663            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
     664            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     665              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     666            1 :     spdm_context->encap_context.request_id = 0;
     667            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     668              :                                                     m_libspdm_use_asym_algo, &data,
     669              :                                                     &data_size,
     670              :                                                     NULL, NULL);
     671            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     672            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     673            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     674            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     675            1 :     libspdm_reset_message_b(spdm_context);
     676              : 
     677            1 :     spdm_response_requester = (void *)temp_buf;
     678            1 :     libspdm_copy_mem(spdm_response_requester,
     679              :                      sizeof(temp_buf),
     680              :                      &m_libspdm_m_deliver_encapsulated_response_request_t1,
     681              :                      m_libspdm_m_deliver_encapsulated_response_request_t1_size);
     682              : 
     683            1 :     spdm_response_requester_certificate =
     684              :         (void *)(temp_buf + sizeof(spdm_deliver_encapsulated_response_request_t));
     685              : 
     686            1 :     libspdm_read_responder_public_certificate_chain(
     687              :         m_libspdm_use_hash_algo, m_libspdm_use_asym_algo,
     688              :         &libspdm_local_certificate_chain,
     689              :         &libspdm_local_certificate_chain_size, NULL, NULL);
     690              : 
     691            1 :     portion_length = LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN;
     692            1 :     remainder_length =
     693            1 :         (uint16_t)(libspdm_local_certificate_chain_size -
     694              :                    LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN *
     695            1 :                    (calling_index + 1));
     696              : 
     697            1 :     spdm_response_requester_certificate->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     698            1 :     spdm_response_requester_certificate->header.request_response_code = SPDM_CERTIFICATE;
     699            1 :     spdm_response_requester_certificate->header.param1 = 0;
     700            1 :     spdm_response_requester_certificate->header.param2 = 0;
     701            1 :     spdm_response_requester_certificate->portion_length = portion_length;
     702            1 :     spdm_response_requester_certificate->remainder_length = remainder_length;
     703              : 
     704            1 :     libspdm_copy_mem(spdm_response_requester_certificate + 1,
     705              :                      sizeof(temp_buf) - sizeof(*spdm_response_requester_certificate),
     706            1 :                      (uint8_t *)libspdm_local_certificate_chain +
     707            1 :                      LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN * calling_index,
     708              :                      portion_length);
     709              : 
     710            1 :     free(libspdm_local_certificate_chain);
     711              : 
     712            1 :     response_size = sizeof(response);
     713            1 :     spdm_response_requester_size = sizeof(spdm_certificate_response_t) + portion_length +
     714              :                                    sizeof(spdm_deliver_encapsulated_response_request_t);
     715            1 :     status = libspdm_get_response_encapsulated_response_ack(spdm_context,
     716              :                                                             spdm_response_requester_size,
     717              :                                                             spdm_response_requester, &response_size,
     718              :                                                             response);
     719            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     720            1 :     free(data);
     721            1 : }
     722              : 
     723            1 : void libspdm_test_get_response_encapsulated_response_ack_case3(void **State)
     724              : {
     725              :     libspdm_return_t status;
     726              :     libspdm_test_context_t *spdm_test_context;
     727              :     libspdm_context_t *spdm_context;
     728              :     spdm_deliver_encapsulated_response_request_t *spdm_response_requester;
     729              :     spdm_key_update_response_t *spdm_response_requester_key_update;
     730              :     uint8_t temp_buf[LIBSPDM_MAX_SPDM_MSG_SIZE];
     731              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     732              :     size_t spdm_response_requester_size;
     733              :     size_t data_size;
     734              :     size_t response_size;
     735              :     void *data;
     736              :     uint32_t session_id;
     737              :     libspdm_session_info_t *session_info;
     738              : 
     739            1 :     spdm_test_context = *State;
     740            1 :     spdm_context = spdm_test_context->spdm_context;
     741              : 
     742            1 :     spdm_context->last_spdm_request_session_id_valid = true;
     743            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
     744            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
     745            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
     746            1 :     spdm_context->encap_context.request_op_code_count =
     747              :         LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
     748              : 
     749            1 :     spdm_context->encap_context.current_request_op_code = SPDM_KEY_UPDATE;
     750            1 :     spdm_context->encap_context.request_op_code_sequence[0] = SPDM_KEY_UPDATE;
     751              : 
     752            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     753            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
     754            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     755              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     756            1 :     spdm_context->encap_context.request_id = 0;
     757            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     758              :                                                     m_libspdm_use_asym_algo, &data,
     759              :                                                     &data_size,
     760              :                                                     NULL, NULL);
     761            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     762            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     763            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     764            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     765              : 
     766            1 :     libspdm_reset_message_b(spdm_context);
     767              : 
     768            1 :     session_id = 0xFFFFFFFF;
     769            1 :     spdm_context->latest_session_id = session_id;
     770            1 :     spdm_context->last_spdm_request_session_id_valid = true;
     771            1 :     spdm_context->last_spdm_request_session_id = session_id;
     772            1 :     session_info = &spdm_context->session_info[0];
     773            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
     774              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     775            1 :     libspdm_secured_message_set_session_state(session_info->secured_message_context,
     776              :                                               LIBSPDM_SESSION_STATE_ESTABLISHED);
     777              : 
     778            1 :     spdm_context->encap_context.last_encap_request_header.spdm_version = SPDM_MESSAGE_VERSION_11;
     779            1 :     spdm_context->encap_context.last_encap_request_header.request_response_code =
     780              :         SPDM_KEY_UPDATE_ACK;
     781            1 :     spdm_context->encap_context.last_encap_request_header.param1 =
     782              :         SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
     783            1 :     spdm_context->encap_context.last_encap_request_header.param2 = 0;
     784              : 
     785            1 :     spdm_response_requester = (void *)temp_buf;
     786            1 :     libspdm_copy_mem(spdm_response_requester,
     787              :                      sizeof(temp_buf),
     788              :                      &m_libspdm_m_deliver_encapsulated_response_request_t1,
     789              :                      m_libspdm_m_deliver_encapsulated_response_request_t1_size);
     790              : 
     791            1 :     spdm_response_requester_key_update =
     792              :         (void *)(temp_buf + sizeof(spdm_deliver_encapsulated_response_request_t));
     793              : 
     794            1 :     spdm_response_requester_key_update->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     795            1 :     spdm_response_requester_key_update->header.request_response_code =
     796              :         SPDM_KEY_UPDATE_ACK;
     797            1 :     spdm_response_requester_key_update->header.param1 =
     798              :         SPDM_KEY_UPDATE_OPERATIONS_TABLE_UPDATE_KEY;
     799            1 :     spdm_response_requester_key_update->header.param2 = 0;
     800              : 
     801            1 :     response_size = sizeof(response);
     802            1 :     spdm_response_requester_size = sizeof(spdm_key_update_response_t) +
     803              :                                    sizeof(spdm_deliver_encapsulated_response_request_t);
     804            1 :     status = libspdm_get_response_encapsulated_response_ack(spdm_context,
     805              :                                                             spdm_response_requester_size,
     806              :                                                             spdm_response_requester, &response_size,
     807              :                                                             response);
     808            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     809            1 :     free(data);
     810            1 : }
     811              : 
     812            1 : void libspdm_test_get_response_encapsulated_response_ack_case4(void **State)
     813              : {
     814              :     libspdm_return_t status;
     815              :     spdm_encapsulated_request_response_t *spdm_response_requester;
     816              :     libspdm_test_context_t *spdm_test_context;
     817              :     libspdm_context_t *spdm_context;
     818              :     size_t response_size;
     819            1 :     spdm_test_context = *State;
     820            1 :     spdm_context = spdm_test_context->spdm_context;
     821              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     822              : 
     823            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
     824            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
     825            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
     826            1 :     spdm_context->encap_context.request_op_code_count =
     827              :         LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
     828            1 :     spdm_context->encap_context.current_request_op_code = 0;
     829            1 :     libspdm_reset_message_b(spdm_context);
     830              : 
     831            1 :     response_size = sizeof(response);
     832            1 :     status = libspdm_get_response_encapsulated_response_ack(spdm_context,
     833              :                                                             m_libspdm_m_deliver_encapsulated_response_request_t1_size,
     834              :                                                             &m_libspdm_m_deliver_encapsulated_response_request_t1,
     835              :                                                             &response_size,
     836              :                                                             response);
     837            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     838            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     839            1 :     spdm_response_requester = (void *)response;
     840            1 :     assert_int_equal(spdm_response_requester->header.request_response_code,
     841              :                      SPDM_ERROR);
     842            1 :     assert_int_equal(spdm_response_requester->header.param1,
     843              :                      SPDM_ERROR_CODE_INVALID_REQUEST);
     844            1 :     assert_int_equal(spdm_response_requester->header.param2, 0);
     845            1 : }
     846              : 
     847            1 : void libspdm_test_get_response_encapsulated_response_ack_case5(void **State)
     848              : {
     849              :     libspdm_return_t status;
     850              :     spdm_encapsulated_request_response_t *spdm_response_requester;
     851              :     libspdm_test_context_t *spdm_test_context;
     852              :     libspdm_context_t *spdm_context;
     853              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     854              :     size_t response_size;
     855            1 :     spdm_test_context = *State;
     856            1 :     spdm_context = spdm_test_context->spdm_context;
     857              : 
     858            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
     859            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
     860            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
     861            1 :     spdm_context->encap_context.request_op_code_count =
     862              :         LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
     863            1 :     spdm_context->encap_context.current_request_op_code = 0;
     864              : 
     865            1 :     response_size = sizeof(response);
     866            1 :     status = libspdm_get_response_encapsulated_response_ack(spdm_context,
     867              :                                                             m_libspdm_m_deliver_encapsulated_response_request_t1_size,
     868              :                                                             &m_libspdm_m_deliver_encapsulated_response_request_t1,
     869              :                                                             &response_size,
     870              :                                                             response);
     871            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     872            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     873            1 :     spdm_response_requester = (void *)response;
     874            1 :     assert_int_equal(spdm_response_requester->header.request_response_code,
     875              :                      SPDM_ERROR);
     876            1 :     assert_int_equal(spdm_response_requester->header.param1,
     877              :                      SPDM_ERROR_CODE_UNEXPECTED_REQUEST);
     878            1 :     assert_int_equal(spdm_response_requester->header.param2, 0);
     879            1 : }
     880              : 
     881            1 : void libspdm_test_get_response_encapsulated_response_ack_case6(void **State)
     882              : {
     883              :     libspdm_return_t status;
     884              :     spdm_encapsulated_request_response_t *spdm_response_requester;
     885              :     libspdm_test_context_t *spdm_test_context;
     886              :     libspdm_context_t *spdm_context;
     887              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     888              :     size_t response_size;
     889              :     size_t data_size;
     890              :     void *data;
     891              : 
     892            1 :     spdm_test_context = *State;
     893            1 :     spdm_context = spdm_test_context->spdm_context;
     894              : 
     895            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NEED_RESYNC;
     896            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     897            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
     898            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
     899            1 :     spdm_context->encap_context.request_op_code_count =
     900              :         LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
     901              : 
     902            1 :     status = libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     903              :                                                              m_libspdm_use_asym_algo, &data,
     904              :                                                              &data_size,
     905              :                                                              NULL, NULL);
     906            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     907            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     908            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     909            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     910              : 
     911            1 :     response_size = sizeof(response);
     912            1 :     status = libspdm_get_response_encapsulated_response_ack(spdm_context,
     913              :                                                             m_libspdm_m_deliver_encapsulated_response_request_t1_size,
     914              :                                                             &m_libspdm_m_deliver_encapsulated_response_request_t1,
     915              :                                                             &response_size,
     916              :                                                             response);
     917            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     918            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     919            1 :     spdm_response_requester = (void *)response;
     920            1 :     assert_int_equal(spdm_response_requester->header.request_response_code,
     921              :                      SPDM_ERROR);
     922            1 :     assert_int_equal(spdm_response_requester->header.param1,
     923              :                      SPDM_ERROR_CODE_REQUEST_RESYNCH);
     924            1 :     assert_int_equal(spdm_response_requester->header.param2, 0);
     925            1 : }
     926              : 
     927            1 : void libspdm_test_get_response_encapsulated_response_ack_case7(void **State)
     928              : {
     929              :     libspdm_return_t status;
     930              :     libspdm_test_context_t *spdm_test_context;
     931              :     libspdm_context_t *spdm_context;
     932              :     spdm_deliver_encapsulated_response_request_t *spdm_response_requester;
     933              :     spdm_certificate_response_t *spdm_response_requester_certificate;
     934              :     uint8_t temp_buf[LIBSPDM_MAX_SPDM_MSG_SIZE];
     935              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     936              :     size_t spdm_response_requester_size;
     937              :     size_t data_size;
     938              :     size_t response_size;
     939              :     void *data;
     940              :     uint16_t portion_length;
     941              :     uint16_t remainder_length;
     942              :     static size_t calling_index = 0;
     943              : 
     944              :     static void *libspdm_local_certificate_chain;
     945              :     static size_t libspdm_local_certificate_chain_size;
     946              : 
     947            1 :     spdm_test_context = *State;
     948            1 :     spdm_context = spdm_test_context->spdm_context;
     949              : 
     950            1 :     spdm_context->encap_context.request_id = 0xFF;
     951            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
     952            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
     953            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
     954            1 :     spdm_context->encap_context.request_op_code_count =
     955              :         LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
     956              : 
     957            1 :     spdm_context->encap_context.current_request_op_code = SPDM_GET_CERTIFICATE;
     958            1 :     spdm_context->encap_context.request_op_code_sequence[0] = SPDM_GET_CERTIFICATE;
     959              : 
     960            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     961            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
     962            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     963              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     964            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     965              :                                                     m_libspdm_use_asym_algo, &data,
     966              :                                                     &data_size,
     967              :                                                     NULL, NULL);
     968            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     969            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     970            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     971            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     972            1 :     libspdm_reset_message_b(spdm_context);
     973              : 
     974            1 :     spdm_response_requester = (void *)temp_buf;
     975            1 :     libspdm_copy_mem(spdm_response_requester,
     976              :                      sizeof(temp_buf),
     977              :                      &m_libspdm_m_deliver_encapsulated_response_request_t1,
     978              :                      m_libspdm_m_deliver_encapsulated_response_request_t1_size);
     979              : 
     980            1 :     spdm_response_requester_certificate =
     981              :         (void *)(temp_buf + sizeof(spdm_deliver_encapsulated_response_request_t));
     982              : 
     983            1 :     libspdm_read_responder_public_certificate_chain(
     984              :         m_libspdm_use_hash_algo, m_libspdm_use_asym_algo,
     985              :         &libspdm_local_certificate_chain,
     986              :         &libspdm_local_certificate_chain_size, NULL, NULL);
     987              : 
     988            1 :     portion_length = LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN;
     989            1 :     remainder_length =
     990            1 :         (uint16_t)(libspdm_local_certificate_chain_size -
     991              :                    LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN *
     992            1 :                    (calling_index + 1));
     993              : 
     994            1 :     spdm_response_requester_certificate->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     995            1 :     spdm_response_requester_certificate->header.request_response_code = SPDM_CERTIFICATE;
     996            1 :     spdm_response_requester_certificate->header.param1 = 0;
     997            1 :     spdm_response_requester_certificate->header.param2 = 0;
     998            1 :     spdm_response_requester_certificate->portion_length = portion_length;
     999            1 :     spdm_response_requester_certificate->remainder_length = remainder_length;
    1000              : 
    1001            1 :     libspdm_copy_mem(spdm_response_requester_certificate + 1,
    1002              :                      sizeof(temp_buf) - sizeof(*spdm_response_requester_certificate),
    1003            1 :                      (uint8_t *)libspdm_local_certificate_chain +
    1004            1 :                      LIBSPDM_MAX_CERT_CHAIN_BLOCK_LEN * calling_index,
    1005              :                      portion_length);
    1006              : 
    1007            1 :     free(libspdm_local_certificate_chain);
    1008              : 
    1009            1 :     response_size = sizeof(response);
    1010            1 :     spdm_response_requester_size = sizeof(spdm_certificate_response_t) + portion_length +
    1011              :                                    sizeof(spdm_deliver_encapsulated_response_request_t);
    1012            1 :     status = libspdm_get_response_encapsulated_response_ack(spdm_context,
    1013              :                                                             spdm_response_requester_size,
    1014              :                                                             spdm_response_requester, &response_size,
    1015              :                                                             response);
    1016            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1017            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
    1018            1 :     spdm_response_requester = (void *)response;
    1019            1 :     assert_int_equal(spdm_response_requester->header.request_response_code,
    1020              :                      SPDM_ERROR);
    1021            1 :     assert_int_equal(spdm_response_requester->header.param1,
    1022              :                      SPDM_ERROR_CODE_INVALID_REQUEST);
    1023            1 :     assert_int_equal(spdm_response_requester->header.param2, 0);
    1024            1 :     free(data);
    1025            1 : }
    1026              : 
    1027            1 : void libspdm_test_get_response_encapsulated_response_ack_case8(void **State)
    1028              : {
    1029              :     libspdm_return_t status;
    1030              :     libspdm_test_context_t *spdm_test_context;
    1031              :     libspdm_context_t *spdm_context;
    1032              :     spdm_encapsulated_response_ack_response_t *spdm_response;
    1033              :     spdm_deliver_encapsulated_response_request_t *spdm_response_requester;
    1034              :     spdm_digest_response_t *spdm_response_requester_digest;
    1035              :     uint8_t temp_buf[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1036              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1037              :     size_t spdm_response_requester_size;
    1038              :     size_t spdm_response_requester_digest_size;
    1039              :     size_t data_size;
    1040              :     size_t response_size;
    1041              :     uint8_t *digest;
    1042              :     void *data;
    1043              : 
    1044            1 :     spdm_test_context = *State;
    1045            1 :     spdm_context = spdm_test_context->spdm_context;
    1046              : 
    1047            1 :     spdm_context->encap_context.request_id = 0xFF;
    1048            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
    1049            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
    1050            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
    1051            1 :     spdm_context->encap_context.request_op_code_count =
    1052              :         LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
    1053              : 
    1054            1 :     spdm_context->encap_context.current_request_op_code = SPDM_GET_DIGESTS;
    1055            1 :     spdm_context->encap_context.request_op_code_sequence[0] = SPDM_GET_DIGESTS;
    1056              : 
    1057            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1058            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
    1059            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
    1060              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1061            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1062              :                                                     m_libspdm_use_asym_algo, &data,
    1063              :                                                     &data_size,
    1064              :                                                     NULL, NULL);
    1065            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
    1066            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
    1067            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    1068            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1069            1 :     libspdm_reset_message_b(spdm_context);
    1070              : 
    1071            1 :     spdm_response_requester_size = sizeof(spdm_digest_response_t) +
    1072            1 :                                    libspdm_get_hash_size(m_libspdm_use_hash_algo) +
    1073              :                                    sizeof(spdm_deliver_encapsulated_response_request_t);
    1074              : 
    1075            1 :     spdm_response_requester = (void *)temp_buf;
    1076            1 :     libspdm_copy_mem(spdm_response_requester,
    1077              :                      sizeof(temp_buf),
    1078              :                      &m_libspdm_m_deliver_encapsulated_response_request_t2,
    1079              :                      m_libspdm_m_deliver_encapsulated_response_request_t2_size);
    1080              : 
    1081            1 :     spdm_response_requester_digest_size = sizeof(spdm_digest_response_t) +
    1082            1 :                                           libspdm_get_hash_size(m_libspdm_use_hash_algo);
    1083            1 :     spdm_response_requester_digest =
    1084              :         (void *)(temp_buf + sizeof(spdm_deliver_encapsulated_response_request_t));
    1085            1 :     spdm_response_requester_digest->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1086            1 :     spdm_response_requester_digest->header.param1 = 0;
    1087            1 :     spdm_response_requester_digest->header.request_response_code = SPDM_DIGESTS;
    1088            1 :     spdm_response_requester_digest->header.param2 = 0;
    1089              : 
    1090            1 :     digest = (void *)(spdm_response_requester_digest + 1);
    1091            1 :     libspdm_hash_all(m_libspdm_use_hash_algo, m_libspdm_local_certificate_chain,
    1092              :                      sizeof(m_libspdm_local_certificate_chain), &digest[0]);
    1093            1 :     spdm_response_requester_digest->header.param2 |= (0x01 << 0);
    1094              : 
    1095            1 :     libspdm_set_mem(m_libspdm_local_certificate_chain,
    1096              :                     sizeof(m_libspdm_local_certificate_chain),
    1097              :                     (uint8_t)(0xFF));
    1098              : 
    1099            1 :     libspdm_copy_mem(spdm_response_requester + 1,
    1100              :                      spdm_response_requester_digest_size,
    1101              :                      spdm_response_requester_digest,
    1102              :                      spdm_response_requester_digest_size);
    1103              : 
    1104            1 :     response_size = sizeof(response);
    1105            1 :     status = libspdm_get_response_encapsulated_response_ack(spdm_context,
    1106              :                                                             spdm_response_requester_size,
    1107              :                                                             spdm_response_requester, &response_size,
    1108              :                                                             response);
    1109            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1110            1 :     assert_int_equal(response_size, sizeof(spdm_encapsulated_response_ack_response_t));
    1111            1 :     spdm_response = (void *)response;
    1112            1 :     assert_int_equal(spdm_response->header.spdm_version,
    1113              :                      SPDM_MESSAGE_VERSION_12);
    1114            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1115              :                      SPDM_ENCAPSULATED_RESPONSE_ACK);
    1116            1 :     assert_int_equal(spdm_response->header.param1, 0);
    1117            1 :     assert_int_equal(spdm_response->header.param2,
    1118              :                      SPDM_ENCAPSULATED_RESPONSE_ACK_RESPONSE_PAYLOAD_TYPE_ABSENT);
    1119            1 :     assert_int_equal(spdm_response->ack_request_id,
    1120              :                      m_libspdm_m_deliver_encapsulated_response_request_t2.header.param1);
    1121            1 :     free(data);
    1122            1 : }
    1123              : 
    1124              : /**
    1125              :  * Test 9: In an encapsulated request flow, a Responder issue an encapsulated request that can take up to CT time to
    1126              :  * fulfill, then the Requester deliver an encapsulated ERROR message with a ResponseNotReady error code.
    1127              :  * Expected behavior: the Responder shall not encapsulate another request by setting Param2 in ENCAPSULATED_RESPONSE_ACK
    1128              :  * to a value of zero.
    1129              :  **/
    1130            1 : void libspdm_test_get_response_encapsulated_response_ack_case9(void **State)
    1131              : {
    1132              :     libspdm_return_t status;
    1133              :     libspdm_test_context_t *spdm_test_context;
    1134              :     libspdm_context_t *spdm_context;
    1135              :     spdm_encapsulated_response_ack_response_t *spdm_response;
    1136              :     spdm_deliver_encapsulated_response_request_t *spdm_request;
    1137              :     spdm_error_response_data_response_not_ready_t *EncapsulatedResponse;
    1138              :     uint8_t temp_buf[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1139              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1140              :     size_t spdm_request_size;
    1141              :     size_t EncapsulatedResponse_size;
    1142              :     size_t response_size;
    1143              : 
    1144            1 :     spdm_test_context = *State;
    1145            1 :     spdm_context = spdm_test_context->spdm_context;
    1146              : 
    1147            1 :     spdm_context->encap_context.request_id = 0xFF;
    1148            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_PROCESSING_ENCAP;
    1149            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
    1150            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
    1151            1 :     spdm_context->encap_context.request_op_code_count =
    1152              :         LIBSPDM_MAX_ENCAP_REQUEST_OP_CODE_SEQUENCE_COUNT;
    1153              : 
    1154            1 :     spdm_context->encap_context.current_request_op_code = SPDM_GET_DIGESTS;
    1155            1 :     spdm_context->encap_context.request_op_code_sequence[0] = SPDM_GET_DIGESTS;
    1156              : 
    1157            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1158            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CERT_CAP;
    1159            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_12 <<
    1160              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1161            1 :     libspdm_reset_message_b(spdm_context);
    1162              : 
    1163            1 :     spdm_request_size = sizeof(spdm_deliver_encapsulated_response_request_t) +
    1164              :                         sizeof(spdm_error_response_data_response_not_ready_t);
    1165              : 
    1166            1 :     spdm_request = (void *)temp_buf;
    1167            1 :     libspdm_copy_mem(spdm_request,
    1168              :                      sizeof(temp_buf),
    1169              :                      &m_libspdm_m_deliver_encapsulated_response_request_t2,
    1170              :                      m_libspdm_m_deliver_encapsulated_response_request_t2_size);
    1171              : 
    1172            1 :     EncapsulatedResponse_size = sizeof(spdm_error_response_data_response_not_ready_t);
    1173            1 :     EncapsulatedResponse =
    1174              :         (void *)(temp_buf + sizeof(spdm_deliver_encapsulated_response_request_t));
    1175            1 :     EncapsulatedResponse->header.spdm_version = SPDM_MESSAGE_VERSION_12;
    1176            1 :     EncapsulatedResponse->header.request_response_code = SPDM_ERROR;
    1177            1 :     EncapsulatedResponse->header.param1 =
    1178              :         SPDM_ERROR_CODE_RESPONSE_NOT_READY;
    1179            1 :     EncapsulatedResponse->header.param2 = 0;
    1180            1 :     EncapsulatedResponse->extend_error_data.rd_exponent = 1;
    1181            1 :     EncapsulatedResponse->extend_error_data.rd_tm = 1;
    1182            1 :     EncapsulatedResponse->extend_error_data.request_code =
    1183              :         SPDM_GET_DIGESTS;
    1184            1 :     EncapsulatedResponse->extend_error_data.token = 0;
    1185              : 
    1186            1 :     libspdm_copy_mem(spdm_request + 1,
    1187              :                      EncapsulatedResponse_size,
    1188              :                      EncapsulatedResponse,
    1189              :                      EncapsulatedResponse_size);
    1190              : 
    1191            1 :     response_size = sizeof(response);
    1192            1 :     status = libspdm_get_response_encapsulated_response_ack(spdm_context,
    1193              :                                                             spdm_request_size,
    1194              :                                                             spdm_request, &response_size,
    1195              :                                                             response);
    1196            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1197            1 :     assert_int_equal(response_size, sizeof(spdm_encapsulated_response_ack_response_t));
    1198            1 :     spdm_response = (void *)response;
    1199            1 :     assert_int_equal(spdm_response->header.spdm_version,
    1200              :                      SPDM_MESSAGE_VERSION_12);
    1201            1 :     assert_int_equal(spdm_response->header.request_response_code,
    1202              :                      SPDM_ENCAPSULATED_RESPONSE_ACK);
    1203            1 :     assert_int_equal(spdm_response->header.param1, 0);
    1204            1 :     assert_int_equal(spdm_response->header.param2,
    1205              :                      SPDM_ENCAPSULATED_RESPONSE_ACK_RESPONSE_PAYLOAD_TYPE_ABSENT);
    1206            1 :     assert_int_equal(spdm_response->ack_request_id,
    1207              :                      m_libspdm_m_deliver_encapsulated_response_request_t2.header.param1);
    1208            1 : }
    1209              : 
    1210            1 : int libspdm_rsp_encapsulated_response_test(void)
    1211              : {
    1212            1 :     const struct CMUnitTest test_cases[] = {
    1213              : #if (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT)
    1214              :         /*Success Case request_op_code_sequence: SPDM_GET_DIGESTS*/
    1215              :         cmocka_unit_test(libspdm_test_get_response_encapsulated_request_case1),
    1216              :         /*Success Case current_request_op_code: SPDM_GET_CERTIFICATE */
    1217              :         cmocka_unit_test(libspdm_test_get_response_encapsulated_request_case2),
    1218              :         /*response_state : LIBSPDM_RESPONSE_STATE_NORMAL with UnexpectedRequest error. */
    1219              :         cmocka_unit_test(libspdm_test_get_response_encapsulated_request_case3),
    1220              :         /*response_state : LIBSPDM_RESPONSE_STATE_NEED_RESYNC */
    1221              :         cmocka_unit_test(libspdm_test_get_response_encapsulated_request_case4),
    1222              : #endif /* (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT) */
    1223              : #if (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_SEND_CHALLENGE_SUPPORT)
    1224              :         /*Success Case current_request_op_code: SPDM_CHALLENGE */
    1225              :         cmocka_unit_test(libspdm_test_get_response_encapsulated_request_case5),
    1226              : #endif
    1227              :         /* Success Case current_request_op_code: SPDM_KEY_UPDATE */
    1228              :         cmocka_unit_test(libspdm_test_get_response_encapsulated_request_case6),
    1229              :         /*response_state : LIBSPDM_RESPONSE_STATE_NORMAL with NoPendingRequests error. */
    1230              :         cmocka_unit_test(libspdm_test_get_response_encapsulated_request_case7),
    1231              : #if LIBSPDM_SEND_GET_ENDPOINT_INFO_SUPPORT
    1232              :         /* Success Case current_request_op_code: SPDM_GET_ENDPOINT_INFO */
    1233              :         cmocka_unit_test(libspdm_test_get_response_encapsulated_request_case8),
    1234              : #endif /* LIBSPDM_SEND_GET_ENDPOINT_INFO_SUPPORT */
    1235              : 
    1236              : #if (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT)
    1237              :         /*Success Case current_request_op_code: SPDM_GET_DIGESTS*/
    1238              :         cmocka_unit_test(libspdm_test_get_response_encapsulated_response_ack_case1),
    1239              :         /*Success Case current_request_op_code: SPDM_GET_CERTIFICATE*/
    1240              :         cmocka_unit_test(libspdm_test_get_response_encapsulated_response_ack_case2),
    1241              : #endif
    1242              :         /* Success Case current_request_op_code: SPDM_KEY_UPDATE */
    1243              :         cmocka_unit_test(libspdm_test_get_response_encapsulated_response_ack_case3),
    1244              :         /* current_request_op_code: NULL */
    1245              :         cmocka_unit_test(libspdm_test_get_response_encapsulated_response_ack_case4),
    1246              :         /*response_state : LIBSPDM_RESPONSE_STATE_NORMAL */
    1247              :         cmocka_unit_test(libspdm_test_get_response_encapsulated_response_ack_case5),
    1248              :         /*response_state : LIBSPDM_RESPONSE_STATE_NEED_RESYNC */
    1249              :         cmocka_unit_test(libspdm_test_get_response_encapsulated_response_ack_case6),
    1250              : #if (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_SEND_GET_CERTIFICATE_SUPPORT)
    1251              :         /*spdm_request->header.param1 != spdm_context->encap_context.request_id */
    1252              :         cmocka_unit_test(libspdm_test_get_response_encapsulated_response_ack_case7),
    1253              :         /*Success Case  When version is greater than V1.2 */
    1254              :         cmocka_unit_test(libspdm_test_get_response_encapsulated_response_ack_case8),
    1255              : #endif
    1256              :         /*When the Requester delivers an encapsulated ERROR message with a ResponseNotReady error code*/
    1257              :         cmocka_unit_test(libspdm_test_get_response_encapsulated_response_ack_case9),
    1258              :     };
    1259              : 
    1260            1 :     libspdm_test_context_t test_context = {
    1261              :         LIBSPDM_TEST_CONTEXT_VERSION,
    1262              :         false,
    1263              :     };
    1264              : 
    1265            1 :     libspdm_setup_test_context(&test_context);
    1266              : 
    1267            1 :     return cmocka_run_group_tests(test_cases,
    1268              :                                   libspdm_unit_test_group_setup,
    1269              :                                   libspdm_unit_test_group_teardown);
    1270              : }
    1271              : 
    1272              : #endif /* LIBSPDM_ENABLE_CAPABILITY_ENCAP_CAP */
        

Generated by: LCOV version 2.0-1