LCOV - code coverage report
Current view: top level - unit_test/test_spdm_responder - challenge_auth.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 98.4 % 556 547
Test Date: 2026-06-14 09:11:02 Functions: 100.0 % 20 20

            Line data    Source code
       1              : /**
       2              :  *  Copyright Notice:
       3              :  *  Copyright 2021-2026 DMTF. All rights reserved.
       4              :  *  License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
       5              :  **/
       6              : 
       7              : #include "spdm_unit_test.h"
       8              : #include "internal/libspdm_responder_lib.h"
       9              : 
      10              : #if LIBSPDM_ENABLE_CAPABILITY_CHAL_CAP
      11              : 
      12              : extern uint64_t g_challenge_request_context;
      13              : extern bool g_check_challenge_request_context;
      14              : 
      15              : spdm_challenge_request_t m_libspdm_challenge_request1 = {
      16              :     { SPDM_MESSAGE_VERSION_11, SPDM_CHALLENGE, 0,
      17              :       SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH },
      18              : };
      19              : size_t m_libspdm_challenge_request1_size = sizeof(m_libspdm_challenge_request1);
      20              : 
      21              : spdm_challenge_request_t m_libspdm_challenge_request3 = {
      22              :     { SPDM_MESSAGE_VERSION_11, SPDM_CHALLENGE, SPDM_MAX_SLOT_COUNT,
      23              :       SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH },
      24              : };
      25              : size_t m_libspdm_challenge_request3_size = sizeof(m_libspdm_challenge_request3);
      26              : 
      27              : spdm_challenge_request_t m_libspdm_challenge_request4 = {
      28              :     { SPDM_MESSAGE_VERSION_11, SPDM_CHALLENGE, 1,
      29              :       SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH },
      30              : };
      31              : size_t m_libspdm_challenge_request4_size = sizeof(m_libspdm_challenge_request4);
      32              : 
      33              : spdm_challenge_request_t m_libspdm_challenge_request5 = {
      34              :     { SPDM_MESSAGE_VERSION_11, SPDM_CHALLENGE, 0,
      35              :       SPDM_CHALLENGE_REQUEST_TCB_COMPONENT_MEASUREMENT_HASH },
      36              : };
      37              : size_t m_libspdm_challenge_request5_size = sizeof(m_libspdm_challenge_request5);
      38              : 
      39              : spdm_challenge_request_t m_libspdm_challenge_request6 = {
      40              :     { SPDM_MESSAGE_VERSION_11, SPDM_CHALLENGE, 0,
      41              :       SPDM_CHALLENGE_REQUEST_ALL_MEASUREMENTS_HASH },
      42              : };
      43              : size_t m_libspdm_challenge_request6_size = sizeof(m_libspdm_challenge_request6);
      44              : 
      45              : spdm_challenge_request_t m_libspdm_challenge_request7 = {
      46              :     { SPDM_MESSAGE_VERSION_11, SPDM_CHALLENGE, 0xFF,
      47              :       SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH },
      48              : };
      49              : size_t m_libspdm_challenge_request7_size = sizeof(m_libspdm_challenge_request7);
      50              : 
      51              : spdm_challenge_request_t m_libspdm_challenge_request8 = {
      52              :     {SPDM_MESSAGE_VERSION_13, SPDM_CHALLENGE, 0,
      53              :      SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH},
      54              : };
      55              : size_t m_libspdm_challenge_request8_size = sizeof(m_libspdm_challenge_request8);
      56              : 
      57              : extern size_t libspdm_secret_lib_challenge_opaque_data_size;
      58              : 
      59              : /**
      60              :  * Test 1: receiving a correct CHALLENGE message from the requester with
      61              :  * no opaque data, no measurements, and slot number 0.
      62              :  * Expected behavior: the responder accepts the request and produces a valid
      63              :  * CHALLENGE_AUTH response message.
      64              :  **/
      65            1 : static void rsp_challenge_auth_case1(void **state)
      66              : {
      67              :     libspdm_return_t status;
      68              :     libspdm_test_context_t *spdm_test_context;
      69              :     libspdm_context_t *spdm_context;
      70              :     size_t response_size;
      71              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
      72              :     spdm_challenge_auth_response_t *spdm_response;
      73              :     void *data1;
      74              :     size_t data_size1;
      75              : 
      76            1 :     spdm_test_context = *state;
      77            1 :     spdm_context = spdm_test_context->spdm_context;
      78            1 :     spdm_test_context->case_id = 0x1;
      79            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
      80            1 :     spdm_context->local_context.capability.flags = 0;
      81            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
      82            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
      83            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
      84            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
      85            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
      86              :         m_libspdm_use_measurement_hash_algo;
      87              : 
      88            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
      89              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
      90            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
      91              :                                                          m_libspdm_use_asym_algo, &data1,
      92              :                                                          &data_size1, NULL, NULL)) {
      93            0 :         return;
      94              :     }
      95            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
      96            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size1;
      97              : 
      98            1 :     libspdm_secret_lib_challenge_opaque_data_size = 0;
      99            1 :     libspdm_reset_message_c(spdm_context);
     100              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     101              :     spdm_context->transcript.message_m.buffer_size =
     102              :         spdm_context->transcript.message_m.max_buffer_size;
     103              : #endif
     104              : 
     105            1 :     response_size = sizeof(response);
     106            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE, m_libspdm_challenge_request1.nonce);
     107            1 :     status = libspdm_get_response_challenge_auth(
     108              :         spdm_context, m_libspdm_challenge_request1_size,
     109              :         &m_libspdm_challenge_request1, &response_size, response);
     110            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     111            1 :     assert_int_equal(response_size,
     112              :                      sizeof(spdm_challenge_auth_response_t) +
     113              :                      libspdm_get_hash_size(m_libspdm_use_hash_algo) +
     114              :                      SPDM_NONCE_SIZE + 0 + sizeof(uint16_t) + 0 +
     115              :                      libspdm_get_asym_signature_size(m_libspdm_use_asym_algo));
     116            1 :     spdm_response = (void *)response;
     117            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_CHALLENGE_AUTH);
     118            1 :     assert_int_equal(spdm_response->header.param1, 0);
     119            1 :     assert_int_equal(spdm_response->header.param2, 1 << 0);
     120              :     /* Completion of CHALLENGE sets M1/M2 to null. */
     121              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     122              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
     123              :     assert_int_equal(spdm_context->transcript.message_c.buffer_size, 0);
     124              : #else
     125            1 :     assert_null(spdm_context->transcript.digest_context_m1m2);
     126              : #endif
     127            1 :     free(data1);
     128              : }
     129              : 
     130              : /**
     131              :  * Test 2:
     132              :  * Expected behavior:
     133              :  **/
     134            1 : static void rsp_challenge_auth_case2(void **state)
     135              : {
     136            1 : }
     137              : 
     138              : /**
     139              :  * Test 3: receiving a correct CHALLENGE from the requester, but the responder is in
     140              :  * a Busy state.
     141              :  * Expected behavior: the responder accepts the request, but produces an ERROR message
     142              :  * indicating the Busy state.
     143              :  **/
     144            1 : static void rsp_challenge_auth_case3(void **state)
     145              : {
     146              :     libspdm_return_t status;
     147              :     libspdm_test_context_t *spdm_test_context;
     148              :     libspdm_context_t *spdm_context;
     149              :     size_t response_size;
     150              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     151              :     spdm_challenge_auth_response_t *spdm_response;
     152              :     void *data1;
     153              :     size_t data_size1;
     154              : 
     155            1 :     spdm_test_context = *state;
     156            1 :     spdm_context = spdm_test_context->spdm_context;
     157            1 :     spdm_test_context->case_id = 0x3;
     158            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_BUSY;
     159            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     160            1 :     spdm_context->local_context.capability.flags = 0;
     161            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
     162            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     163            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     164            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     165            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     166              :         m_libspdm_use_measurement_hash_algo;
     167              : 
     168            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     169              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     170            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     171              :                                                          m_libspdm_use_asym_algo, &data1,
     172              :                                                          &data_size1, NULL, NULL)) {
     173            0 :         return;
     174              :     }
     175            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     176            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size1;
     177              : 
     178            1 :     libspdm_secret_lib_challenge_opaque_data_size = 0;
     179            1 :     libspdm_reset_message_c(spdm_context);
     180              : 
     181            1 :     response_size = sizeof(response);
     182            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE, m_libspdm_challenge_request1.nonce);
     183            1 :     status = libspdm_get_response_challenge_auth(
     184              :         spdm_context, m_libspdm_challenge_request1_size,
     185              :         &m_libspdm_challenge_request1, &response_size, response);
     186            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     187            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     188            1 :     spdm_response = (void *)response;
     189            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     190            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_BUSY);
     191            1 :     assert_int_equal(spdm_response->header.param2, 0);
     192            1 :     assert_int_equal(spdm_context->response_state, LIBSPDM_RESPONSE_STATE_BUSY);
     193            1 :     free(data1);
     194              : }
     195              : 
     196              : /**
     197              :  * Test 4: receiving a correct CHALLENGE from the requester, but the responder requires
     198              :  * resynchronization with the requester.
     199              :  * Expected behavior: the responder accepts the request, but produces an ERROR message
     200              :  * indicating the NeedResynch state.
     201              :  **/
     202            1 : static void rsp_challenge_auth_case4(void **state)
     203              : {
     204              :     libspdm_return_t status;
     205              :     libspdm_test_context_t *spdm_test_context;
     206              :     libspdm_context_t *spdm_context;
     207              :     size_t response_size;
     208              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     209              :     spdm_challenge_auth_response_t *spdm_response;
     210              :     void *data1;
     211              :     size_t data_size1;
     212              : 
     213            1 :     spdm_test_context = *state;
     214            1 :     spdm_context = spdm_test_context->spdm_context;
     215            1 :     spdm_test_context->case_id = 0x4;
     216            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NEED_RESYNC;
     217            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     218            1 :     spdm_context->local_context.capability.flags = 0;
     219            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
     220            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     221            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     222            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     223            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     224              :         m_libspdm_use_measurement_hash_algo;
     225              : 
     226            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     227              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     228            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     229              :                                                          m_libspdm_use_asym_algo, &data1,
     230              :                                                          &data_size1, NULL, NULL)) {
     231            0 :         return;
     232              :     }
     233            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     234            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size1;
     235              : 
     236            1 :     libspdm_secret_lib_challenge_opaque_data_size = 0;
     237            1 :     libspdm_reset_message_c(spdm_context);
     238              : 
     239            1 :     response_size = sizeof(response);
     240            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE, m_libspdm_challenge_request1.nonce);
     241            1 :     status = libspdm_get_response_challenge_auth(
     242              :         spdm_context, m_libspdm_challenge_request1_size,
     243              :         &m_libspdm_challenge_request1, &response_size, response);
     244            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     245            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     246            1 :     spdm_response = (void *)response;
     247            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     248            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_REQUEST_RESYNCH);
     249            1 :     assert_int_equal(spdm_response->header.param2, 0);
     250            1 :     assert_int_equal(spdm_context->response_state, LIBSPDM_RESPONSE_STATE_NEED_RESYNC);
     251            1 :     free(data1);
     252              : }
     253              : 
     254              : #if LIBSPDM_RESPOND_IF_READY_SUPPORT
     255              : /**
     256              :  * Test 5: receiving a correct CHALLENGE from the requester, but the responder could not
     257              :  * produce the response in time.
     258              :  * Expected behavior: the responder accepts the request, but produces an ERROR message
     259              :  * indicating the ResponseNotReady state.
     260              :  **/
     261            1 : static void rsp_challenge_auth_case5(void **state)
     262              : {
     263              :     libspdm_return_t status;
     264              :     libspdm_test_context_t *spdm_test_context;
     265              :     libspdm_context_t *spdm_context;
     266              :     size_t response_size;
     267              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     268              :     spdm_challenge_auth_response_t *spdm_response;
     269              :     void *data1;
     270              :     size_t data_size1;
     271              :     spdm_error_data_response_not_ready_t *error_data;
     272              : 
     273            1 :     spdm_test_context = *state;
     274            1 :     spdm_context = spdm_test_context->spdm_context;
     275            1 :     spdm_test_context->case_id = 0x5;
     276            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NOT_READY;
     277            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     278            1 :     spdm_context->local_context.capability.flags = 0;
     279            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
     280            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     281            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     282            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     283            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     284              :         m_libspdm_use_measurement_hash_algo;
     285              : 
     286            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     287              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     288            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     289              :                                                          m_libspdm_use_asym_algo, &data1,
     290              :                                                          &data_size1, NULL, NULL)) {
     291            0 :         return;
     292              :     }
     293            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     294            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size1;
     295              : 
     296            1 :     libspdm_secret_lib_challenge_opaque_data_size = 0;
     297            1 :     libspdm_reset_message_c(spdm_context);
     298              : 
     299            1 :     response_size = sizeof(response);
     300            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE, m_libspdm_challenge_request1.nonce);
     301            1 :     status = libspdm_get_response_challenge_auth(
     302              :         spdm_context, m_libspdm_challenge_request1_size,
     303              :         &m_libspdm_challenge_request1, &response_size, response);
     304            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     305            1 :     assert_int_equal(response_size,
     306              :                      sizeof(spdm_error_response_t) +
     307              :                      sizeof(spdm_error_data_response_not_ready_t));
     308            1 :     spdm_response = (void *)response;
     309            1 :     error_data = (spdm_error_data_response_not_ready_t *)(spdm_response + 1);
     310            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     311            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_RESPONSE_NOT_READY);
     312            1 :     assert_int_equal(spdm_response->header.param2, 0);
     313            1 :     assert_int_equal(spdm_context->response_state, LIBSPDM_RESPONSE_STATE_NOT_READY);
     314            1 :     assert_int_equal(error_data->request_code, SPDM_CHALLENGE);
     315            1 :     free(data1);
     316              : }
     317              : #endif /* LIBSPDM_RESPOND_IF_READY_SUPPORT */
     318              : 
     319              : /**
     320              :  * Test 6: receiving a correct CHALLENGE from the requester, but the responder is not set
     321              :  * no receive a CHALLENGE message because previous messages (namely, GET_CAPABILITIES,
     322              :  * NEGOTIATE_ALGORITHMS or GET_DIGESTS) have not been received.
     323              :  * Expected behavior: the responder rejects the request, and produces an ERROR message
     324              :  * indicating the UnexpectedRequest.
     325              :  **/
     326            1 : static void rsp_challenge_auth_case6(void **state)
     327              : {
     328              :     libspdm_return_t status;
     329              :     libspdm_test_context_t *spdm_test_context;
     330              :     libspdm_context_t *spdm_context;
     331              :     size_t response_size;
     332              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     333              :     spdm_challenge_auth_response_t *spdm_response;
     334              :     void *data1;
     335              :     size_t data_size1;
     336              : 
     337            1 :     spdm_test_context = *state;
     338            1 :     spdm_context = spdm_test_context->spdm_context;
     339            1 :     spdm_test_context->case_id = 0x6;
     340            1 :     spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
     341            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NOT_STARTED;
     342            1 :     spdm_context->local_context.capability.flags = 0;
     343            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
     344            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     345            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     346            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     347            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     348              :         m_libspdm_use_measurement_hash_algo;
     349              : 
     350            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     351              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     352            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     353              :                                                          m_libspdm_use_asym_algo, &data1,
     354              :                                                          &data_size1, NULL, NULL)) {
     355            0 :         return;
     356              :     }
     357            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     358            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size1;
     359              : 
     360            1 :     libspdm_secret_lib_challenge_opaque_data_size = 0;
     361            1 :     libspdm_reset_message_c(spdm_context);
     362              : 
     363            1 :     response_size = sizeof(response);
     364            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE, m_libspdm_challenge_request1.nonce);
     365            1 :     status = libspdm_get_response_challenge_auth(
     366              :         spdm_context, m_libspdm_challenge_request1_size,
     367              :         &m_libspdm_challenge_request1, &response_size, response);
     368            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     369            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     370            1 :     spdm_response = (void *)response;
     371            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     372            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_UNEXPECTED_REQUEST);
     373            1 :     assert_int_equal(spdm_response->header.param2, 0);
     374            1 :     free(data1);
     375              : }
     376              : 
     377              : /**
     378              :  * Test 7: receiving a correct CHALLENGE from the requester, but the responder does not
     379              :  * have the challenge capability set.
     380              :  * Expected behavior: the responder accepts the request and produces a valid
     381              :  * CHALLENGE_AUTH response message.
     382              :  **/
     383            1 : static void rsp_challenge_auth_case7(void **state) {
     384              :     libspdm_return_t status;
     385              :     libspdm_test_context_t    *spdm_test_context;
     386              :     libspdm_context_t  *spdm_context;
     387              :     size_t response_size;
     388              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     389              :     spdm_challenge_auth_response_t *spdm_response;
     390              :     void                 *data1;
     391              :     size_t data_size1;
     392              : 
     393            1 :     spdm_test_context = *state;
     394            1 :     spdm_context = spdm_test_context->spdm_context;
     395            1 :     spdm_test_context->case_id = 0x7;
     396            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     397            1 :     spdm_context->local_context.capability.flags = 0;
     398              :     /* spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;*/
     399            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     400            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     401            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     402            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     403              :         m_libspdm_use_measurement_hash_algo;
     404              : 
     405            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     406              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     407            1 :     libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
     408              :                                                      m_libspdm_use_asym_algo,
     409              :                                                      &data1, &data_size1,
     410              :                                                      NULL, NULL);
     411            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     412            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size1;
     413              : 
     414            1 :     libspdm_secret_lib_challenge_opaque_data_size = 0;
     415            1 :     libspdm_reset_message_c(spdm_context);
     416              : 
     417            1 :     response_size = sizeof(response);
     418            1 :     libspdm_get_random_number (SPDM_NONCE_SIZE, m_libspdm_challenge_request1.nonce);
     419            1 :     status = libspdm_get_response_challenge_auth (spdm_context, m_libspdm_challenge_request1_size,
     420              :                                                   &m_libspdm_challenge_request1, &response_size,
     421              :                                                   response);
     422            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     423            1 :     assert_int_equal (response_size, sizeof(spdm_error_response_t));
     424            1 :     spdm_response = (void *)response;
     425            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_ERROR);
     426            1 :     assert_int_equal (spdm_response->header.param1, SPDM_ERROR_CODE_UNSUPPORTED_REQUEST);
     427            1 :     assert_int_equal (spdm_response->header.param2, SPDM_CHALLENGE);
     428            1 :     free(data1);
     429            1 : }
     430              : 
     431              : /**
     432              :  * Test 8: receiving an incorrect CHALLENGE from the requester, with the slot number
     433              :  * larger than the specification limit.
     434              :  * Expected behavior: the responder rejects the request, and produces an ERROR message
     435              :  * indicating the UnexpectedRequest.
     436              :  **/
     437            1 : static void rsp_challenge_auth_case8(void **state) {
     438              :     libspdm_return_t status;
     439              :     libspdm_test_context_t    *spdm_test_context;
     440              :     libspdm_context_t  *spdm_context;
     441              :     size_t response_size;
     442              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     443              :     spdm_challenge_auth_response_t *spdm_response;
     444              :     void                 *data1;
     445              :     size_t data_size1;
     446              : 
     447            1 :     spdm_test_context = *state;
     448            1 :     spdm_context = spdm_test_context->spdm_context;
     449            1 :     spdm_test_context->case_id = 0x8;
     450            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     451            1 :     spdm_context->local_context.capability.flags = 0;
     452            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
     453            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     454            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     455            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     456            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     457              :         m_libspdm_use_measurement_hash_algo;
     458              : 
     459            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     460              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     461            1 :     libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
     462              :                                                      m_libspdm_use_asym_algo,
     463              :                                                      &data1, &data_size1,
     464              :                                                      NULL, NULL);
     465            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     466            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size1;
     467              : 
     468            1 :     libspdm_secret_lib_challenge_opaque_data_size = 0;
     469            1 :     libspdm_reset_message_c(spdm_context);
     470              : 
     471            1 :     response_size = sizeof(response);
     472            1 :     libspdm_get_random_number (SPDM_NONCE_SIZE, m_libspdm_challenge_request3.nonce);
     473            1 :     status = libspdm_get_response_challenge_auth (spdm_context, m_libspdm_challenge_request3_size,
     474              :                                                   &m_libspdm_challenge_request3, &response_size,
     475              :                                                   response);
     476            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     477            1 :     assert_int_equal (response_size, sizeof(spdm_error_response_t));
     478            1 :     spdm_response = (void *)response;
     479            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_ERROR);
     480            1 :     assert_int_equal (spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
     481            1 :     assert_int_equal (spdm_response->header.param2, 0);
     482            1 :     free(data1);
     483            1 : }
     484              : 
     485              : /**
     486              :  * Test 9: eceiving a correct CHALLENGE message from the requester with
     487              :  * no opaque data, no measurements, and slot number 1.
     488              :  * Expected behavior: the responder accepts the request and produces a valid
     489              :  * CHALLENGE_AUTH response message.
     490              :  **/
     491            1 : static void rsp_challenge_auth_case9(void **state) {
     492              :     libspdm_return_t status;
     493              :     libspdm_test_context_t    *spdm_test_context;
     494              :     libspdm_context_t  *spdm_context;
     495              :     size_t response_size;
     496              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     497              :     spdm_challenge_auth_response_t *spdm_response;
     498              :     void                 *data1;
     499              :     size_t data_size1;
     500              :     size_t index;
     501              :     uint8_t slot_mask;
     502              : 
     503            1 :     spdm_test_context = *state;
     504            1 :     spdm_context = spdm_test_context->spdm_context;
     505            1 :     spdm_test_context->case_id = 0x9;
     506            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     507            1 :     spdm_context->local_context.capability.flags = 0;
     508            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
     509            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     510            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     511            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     512            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     513              :         m_libspdm_use_measurement_hash_algo;
     514              : 
     515            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     516              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     517            1 :     libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
     518              :                                                      m_libspdm_use_asym_algo,
     519              :                                                      &data1, &data_size1,
     520              :                                                      NULL, NULL);
     521            1 :     spdm_context->local_context.local_cert_chain_provision[1] = data1;
     522            1 :     spdm_context->local_context.local_cert_chain_provision_size[1] = data_size1;
     523            1 :     libspdm_secret_lib_challenge_opaque_data_size = 0;
     524            1 :     libspdm_reset_message_c(spdm_context);
     525              : 
     526            1 :     response_size = sizeof(response);
     527            1 :     libspdm_get_random_number (SPDM_NONCE_SIZE, m_libspdm_challenge_request4.nonce);
     528            1 :     status = libspdm_get_response_challenge_auth (spdm_context, m_libspdm_challenge_request4_size,
     529              :                                                   &m_libspdm_challenge_request4, &response_size,
     530              :                                                   response);
     531            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     532            1 :     assert_int_equal (response_size, sizeof(spdm_challenge_auth_response_t) + libspdm_get_hash_size (
     533              :                           m_libspdm_use_hash_algo) + SPDM_NONCE_SIZE + 0 + sizeof(uint16_t) + 0 +
     534              :                       libspdm_get_asym_signature_size ( m_libspdm_use_asym_algo));
     535            1 :     spdm_response = (void *)response;
     536            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_CHALLENGE_AUTH);
     537            1 :     assert_int_equal (spdm_response->header.param1, 1);
     538              : 
     539            1 :     slot_mask = 0;
     540            9 :     for (index = 0; index < SPDM_MAX_SLOT_COUNT; index++) {
     541            8 :         if (spdm_context->local_context.local_cert_chain_provision[index] != NULL) {
     542            2 :             slot_mask |= (1 << index);
     543              :         }
     544              :     }
     545            1 :     assert_int_equal (spdm_response->header.param2, slot_mask);
     546            1 :     free(data1);
     547            1 : }
     548              : 
     549              : /**
     550              :  * Test 10: receiving a correct CHALLENGE from the requester, but with certificate
     551              :  * unavailable at the requested slot number (1).
     552              :  * Expected behavior: the responder rejects the request, and produces an ERROR message
     553              :  * indicating the UnexpectedRequest.
     554              :  **/
     555            1 : static void rsp_challenge_auth_case10(void **state) {
     556              :     libspdm_return_t status;
     557              :     libspdm_test_context_t    *spdm_test_context;
     558              :     libspdm_context_t  *spdm_context;
     559              :     size_t response_size;
     560              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     561              :     spdm_challenge_auth_response_t *spdm_response;
     562              :     void                 *data1;
     563              :     size_t data_size1;
     564              :     size_t index;
     565              : 
     566            1 :     spdm_test_context = *state;
     567            1 :     spdm_context = spdm_test_context->spdm_context;
     568            1 :     spdm_test_context->case_id = 0xA;
     569            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     570            1 :     spdm_context->local_context.capability.flags = 0;
     571            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
     572            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     573            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     574            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     575            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     576              :         m_libspdm_use_measurement_hash_algo;
     577              : 
     578            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     579              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     580            1 :     libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
     581              :                                                      m_libspdm_use_asym_algo,
     582              :                                                      &data1, &data_size1,
     583              :                                                      NULL, NULL);
     584              :     /*clear local_cert_chain_provision*/
     585            9 :     for (index = 0; index <SPDM_MAX_SLOT_COUNT; index++) {
     586            8 :         spdm_context->local_context.local_cert_chain_provision[index] = NULL;
     587            8 :         spdm_context->local_context.local_cert_chain_provision_size[index] = 0;
     588              :     }
     589              : 
     590            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     591            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size1;
     592              : 
     593            1 :     libspdm_secret_lib_challenge_opaque_data_size = 0;
     594            1 :     libspdm_reset_message_c(spdm_context);
     595              : 
     596            1 :     response_size = sizeof(response);
     597            1 :     libspdm_get_random_number (SPDM_NONCE_SIZE, m_libspdm_challenge_request4.nonce);
     598            1 :     status = libspdm_get_response_challenge_auth (spdm_context, m_libspdm_challenge_request4_size,
     599              :                                                   &m_libspdm_challenge_request4, &response_size,
     600              :                                                   response);
     601            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     602            1 :     assert_int_equal (response_size, sizeof(spdm_error_response_t));
     603            1 :     spdm_response = (void *)response;
     604            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_ERROR);
     605            1 :     assert_int_equal (spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
     606            1 :     assert_int_equal (spdm_response->header.param2, 0);
     607            1 :     free(data1);
     608            1 : }
     609              : 
     610              : /**
     611              :  * Test 11: receiving a correct CHALLENGE message from the requester with opaque
     612              :  * data as the bytes of the string "libspdm", no measurements, and slot number 0.
     613              :  * Expected behavior: the responder accepts the request and produces a valid
     614              :  * CHALLENGE_AUTH response message.
     615              :  **/
     616            1 : static void rsp_challenge_auth_case11(void **state) {
     617              :     libspdm_return_t status;
     618              :     libspdm_test_context_t    *spdm_test_context;
     619              :     libspdm_context_t  *spdm_context;
     620              :     size_t response_size;
     621              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     622              :     spdm_challenge_auth_response_t *spdm_response;
     623              :     void                 *data1;
     624              :     size_t data_size1;
     625              : 
     626            1 :     spdm_test_context = *state;
     627            1 :     spdm_context = spdm_test_context->spdm_context;
     628            1 :     spdm_test_context->case_id = 0xB;
     629            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     630            1 :     spdm_context->local_context.capability.flags = 0;
     631            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
     632            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     633            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     634            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     635            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     636              :         m_libspdm_use_measurement_hash_algo;
     637              : 
     638            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     639              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     640            1 :     libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
     641              :                                                      m_libspdm_use_asym_algo,
     642              :                                                      &data1, &data_size1,
     643              :                                                      NULL, NULL);
     644            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     645            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size1;
     646              : 
     647            1 :     libspdm_secret_lib_challenge_opaque_data_size = 8;
     648            1 :     libspdm_reset_message_c(spdm_context);
     649              : 
     650            1 :     response_size = sizeof(response);
     651            1 :     libspdm_get_random_number (SPDM_NONCE_SIZE, m_libspdm_challenge_request1.nonce);
     652            1 :     status = libspdm_get_response_challenge_auth (spdm_context, m_libspdm_challenge_request1_size,
     653              :                                                   &m_libspdm_challenge_request1, &response_size,
     654              :                                                   response);
     655            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     656            1 :     assert_int_equal (response_size, sizeof(spdm_challenge_auth_response_t) + libspdm_get_hash_size (
     657              :                           m_libspdm_use_hash_algo) + SPDM_NONCE_SIZE + 0 + sizeof(uint16_t) + 8 +
     658              :                       libspdm_get_asym_signature_size ( m_libspdm_use_asym_algo));
     659            1 :     spdm_response = (void *)response;
     660            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_CHALLENGE_AUTH);
     661            1 :     assert_int_equal (spdm_response->header.param1, 0);
     662            1 :     assert_int_equal (spdm_response->header.param2, 1 << 0);
     663            1 :     free(data1);
     664            1 : }
     665              : 
     666              : /**
     667              :  * Test 12: receiving a correct CHALLENGE message from the requester with
     668              :  * no opaque data, TCB measurement hash, and slot number 0.
     669              :  * Expected behavior: the responder accepts the request and produces a valid
     670              :  * CHALLENGE_AUTH response message.
     671              :  **/
     672            1 : static void rsp_challenge_auth_case12(void **state) {
     673              :     libspdm_return_t status;
     674              :     libspdm_test_context_t    *spdm_test_context;
     675              :     libspdm_context_t  *spdm_context;
     676              :     size_t response_size;
     677              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     678              :     spdm_challenge_auth_response_t *spdm_response;
     679              :     void                 *data1;
     680              :     size_t data_size1;
     681              : 
     682            1 :     spdm_test_context = *state;
     683            1 :     spdm_context = spdm_test_context->spdm_context;
     684            1 :     spdm_test_context->case_id = 0xC;
     685            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     686            1 :     spdm_context->local_context.capability.flags = 0;
     687            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
     688            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP; /*additional measurement capability*/
     689            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     690            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     691            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     692            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     693              :         m_libspdm_use_measurement_hash_algo;
     694              : 
     695            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     696              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     697            1 :     libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
     698              :                                                      m_libspdm_use_asym_algo,
     699              :                                                      &data1, &data_size1,
     700              :                                                      NULL, NULL);
     701            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     702            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size1;
     703              : 
     704            1 :     libspdm_secret_lib_challenge_opaque_data_size = 0;
     705            1 :     libspdm_reset_message_c(spdm_context);
     706              : 
     707            1 :     response_size = sizeof(response);
     708            1 :     libspdm_get_random_number (SPDM_NONCE_SIZE, m_libspdm_challenge_request5.nonce);
     709            1 :     status = libspdm_get_response_challenge_auth (spdm_context, m_libspdm_challenge_request5_size,
     710              :                                                   &m_libspdm_challenge_request5, &response_size,
     711              :                                                   response);
     712            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     713            1 :     assert_int_equal (response_size, sizeof(spdm_challenge_auth_response_t) + libspdm_get_hash_size (
     714              :                           m_libspdm_use_hash_algo) + SPDM_NONCE_SIZE +
     715              :                       libspdm_get_hash_size (m_libspdm_use_hash_algo) +
     716              :                       sizeof(uint16_t) + 0 +
     717              :                       libspdm_get_asym_signature_size (m_libspdm_use_asym_algo));
     718            1 :     spdm_response = (void *)response;
     719            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_CHALLENGE_AUTH);
     720            1 :     assert_int_equal (spdm_response->header.param1, 0);
     721            1 :     assert_int_equal (spdm_response->header.param2, 1 << 0);
     722            1 :     free(data1);
     723            1 : }
     724              : 
     725              : /**
     726              :  * Test 13: receiving a correct CHALLENGE message from the requester with
     727              :  * no opaque data, all measurement hashes, and slot number 0.
     728              :  * Expected behavior: the responder accepts the request and produces a valid
     729              :  * CHALLENGE_AUTH response message.
     730              :  **/
     731            1 : static void rsp_challenge_auth_case13(void **state) {
     732              :     libspdm_return_t status;
     733              :     libspdm_test_context_t    *spdm_test_context;
     734              :     libspdm_context_t  *spdm_context;
     735              :     size_t response_size;
     736              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     737              :     spdm_challenge_auth_response_t *spdm_response;
     738              :     void                 *data1;
     739              :     size_t data_size1;
     740              : 
     741            1 :     spdm_test_context = *state;
     742            1 :     spdm_context = spdm_test_context->spdm_context;
     743            1 :     spdm_test_context->case_id = 0xD;
     744            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     745            1 :     spdm_context->local_context.capability.flags = 0;
     746            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
     747            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP; /*additional measurement capability*/
     748            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     749            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     750            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     751            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     752              :         m_libspdm_use_measurement_hash_algo;
     753              : 
     754            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     755              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     756            1 :     libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
     757              :                                                      m_libspdm_use_asym_algo,
     758              :                                                      &data1, &data_size1,
     759              :                                                      NULL, NULL);
     760            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     761            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size1;
     762              : 
     763            1 :     libspdm_secret_lib_challenge_opaque_data_size = 0;
     764            1 :     libspdm_reset_message_c(spdm_context);
     765              : 
     766            1 :     response_size = sizeof(response);
     767            1 :     libspdm_get_random_number (SPDM_NONCE_SIZE, m_libspdm_challenge_request6.nonce);
     768            1 :     status = libspdm_get_response_challenge_auth (spdm_context, m_libspdm_challenge_request6_size,
     769              :                                                   &m_libspdm_challenge_request6, &response_size,
     770              :                                                   response);
     771            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     772            1 :     assert_int_equal (response_size, sizeof(spdm_challenge_auth_response_t) + libspdm_get_hash_size (
     773              :                           m_libspdm_use_hash_algo) + SPDM_NONCE_SIZE +
     774              :                       libspdm_get_hash_size (m_libspdm_use_hash_algo) +
     775              :                       sizeof(uint16_t) + 0 +
     776              :                       libspdm_get_asym_signature_size (m_libspdm_use_asym_algo));
     777            1 :     spdm_response = (void *)response;
     778            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_CHALLENGE_AUTH);
     779            1 :     assert_int_equal (spdm_response->header.param1, 0);
     780            1 :     assert_int_equal (spdm_response->header.param2, 1 << 0);
     781            1 :     free(data1);
     782            1 : }
     783              : 
     784              : /**
     785              :  * Test 14: the responder does not have measurements capabilities, but
     786              :  * receives a correct CHALLENGE message from the requester with
     787              :  * no opaque data, all measurement hashes, and slot number 0.
     788              :  * Expected behavior: the responder refuses the CHALLENGE message and produces an
     789              :  * ERROR message indicating the InvalidRequest.
     790              :  **/
     791            1 : static void rsp_challenge_auth_case14(void **state) {
     792              :     libspdm_return_t status;
     793              :     libspdm_test_context_t    *spdm_test_context;
     794              :     libspdm_context_t  *spdm_context;
     795              :     size_t response_size;
     796              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     797              :     spdm_challenge_auth_response_t *spdm_response;
     798              :     void                 *data1;
     799              :     size_t data_size1;
     800              : 
     801            1 :     spdm_test_context = *state;
     802            1 :     spdm_context = spdm_test_context->spdm_context;
     803            1 :     spdm_test_context->case_id = 0xE;
     804            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     805            1 :     spdm_context->local_context.capability.flags = 0;
     806            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
     807              :     /* spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP;   no measurement capability*/
     808            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     809            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     810            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     811            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     812              :         m_libspdm_use_measurement_hash_algo;
     813              : 
     814            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     815              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     816            1 :     libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo,
     817              :                                                      m_libspdm_use_asym_algo,
     818              :                                                      &data1, &data_size1,
     819              :                                                      NULL, NULL);
     820            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     821            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size1;
     822              : 
     823            1 :     libspdm_secret_lib_challenge_opaque_data_size = 0;
     824            1 :     libspdm_reset_message_c(spdm_context);
     825              : 
     826            1 :     response_size = sizeof(response);
     827            1 :     libspdm_get_random_number (SPDM_NONCE_SIZE, m_libspdm_challenge_request6.nonce);
     828            1 :     status = libspdm_get_response_challenge_auth (spdm_context, m_libspdm_challenge_request6_size,
     829              :                                                   &m_libspdm_challenge_request6, &response_size,
     830              :                                                   response);
     831            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     832            1 :     assert_int_equal (response_size, sizeof(spdm_error_response_t));
     833            1 :     spdm_response = (void *)response;
     834            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_ERROR);
     835            1 :     assert_int_equal (spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
     836            1 :     assert_int_equal (spdm_response->header.param2, 0);
     837            1 :     free(data1);
     838            1 : }
     839              : 
     840              : /**
     841              :  * Test 15: receiving a correct CHALLENGE from the requester. Buffers A, B and
     842              :  * C already have arbitrary data.
     843              :  * Expected behavior: the responder accepts the request and produces a valid
     844              :  * CHALLENGE_AUTH response message, and buffer C receives the exchanged CHALLENGE
     845              :  * and CHALLENGE_AUTH (without signature) messages.
     846              :  **/
     847            1 : static void rsp_challenge_auth_case15(void **state)
     848              : {
     849              :     libspdm_return_t status;
     850              :     libspdm_test_context_t *spdm_test_context;
     851              :     libspdm_context_t *spdm_context;
     852              :     size_t response_size;
     853              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     854              :     spdm_challenge_auth_response_t *spdm_response;
     855              :     void *data1;
     856              :     size_t data_size1;
     857              : 
     858            1 :     spdm_test_context = *state;
     859            1 :     spdm_context = spdm_test_context->spdm_context;
     860            1 :     spdm_test_context->case_id = 0xF;
     861            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     862            1 :     spdm_context->local_context.capability.flags = 0;
     863            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
     864            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     865            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     866            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     867            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     868              :         m_libspdm_use_measurement_hash_algo;
     869              : 
     870            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     871              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     872            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     873              :                                                          m_libspdm_use_asym_algo, &data1,
     874              :                                                          &data_size1, NULL, NULL)) {
     875            0 :         return;
     876              :     }
     877            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
     878            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size1;
     879              : 
     880            1 :     libspdm_secret_lib_challenge_opaque_data_size = 0;
     881            1 :     libspdm_reset_message_c(spdm_context);
     882              : 
     883              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     884              :     /*filling buffers with arbitrary data*/
     885              :     libspdm_set_mem(spdm_context->transcript.message_a.buffer, 10, (uint8_t) 0xFF);
     886              :     spdm_context->transcript.message_a.buffer_size = 10;
     887              :     libspdm_set_mem(spdm_context->transcript.message_b.buffer, 8, (uint8_t) 0xEE);
     888              :     spdm_context->transcript.message_b.buffer_size = 8;
     889              :     libspdm_set_mem(spdm_context->transcript.message_c.buffer, 12, (uint8_t) 0xDD);
     890              :     spdm_context->transcript.message_c.buffer_size = 12;
     891              : #endif
     892              : 
     893            1 :     response_size = sizeof(response);
     894            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE, m_libspdm_challenge_request1.nonce);
     895            1 :     status = libspdm_get_response_challenge_auth(
     896              :         spdm_context, m_libspdm_challenge_request1_size,
     897              :         &m_libspdm_challenge_request1, &response_size, response);
     898            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     899            1 :     assert_int_equal(response_size,
     900              :                      sizeof(spdm_challenge_auth_response_t) +
     901              :                      libspdm_get_hash_size(m_libspdm_use_hash_algo) +
     902              :                      SPDM_NONCE_SIZE + 0 + sizeof(uint16_t) + 0 +
     903              :                      libspdm_get_asym_signature_size(m_libspdm_use_asym_algo));
     904            1 :     spdm_response = (void *)response;
     905            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_CHALLENGE_AUTH);
     906            1 :     assert_int_equal(spdm_response->header.param1, 0);
     907            1 :     assert_int_equal(spdm_response->header.param2, 1 << 0);
     908              : 
     909              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     910              :     assert_int_equal(spdm_context->transcript.message_a.buffer_size, 10);
     911              : #endif
     912            1 :     free(data1);
     913              : }
     914              : 
     915              : /**
     916              :  * Test 16: Receive a CHALLENGE request within a secure session.
     917              :  * Expected behavior: the Responder replies with error UnexpectedRequest as that is not legal.
     918              :  **/
     919            1 : static void rsp_challenge_auth_case16(void **state)
     920              : {
     921              :     libspdm_return_t status;
     922              :     libspdm_test_context_t *spdm_test_context;
     923              :     libspdm_context_t *spdm_context;
     924              :     size_t response_size;
     925              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     926              :     spdm_challenge_auth_response_t *spdm_response;
     927              :     libspdm_session_info_t *session_info;
     928              :     uint32_t session_id;
     929              : 
     930            1 :     spdm_test_context = *state;
     931            1 :     spdm_context = spdm_test_context->spdm_context;
     932            1 :     spdm_test_context->case_id = 0x10;
     933            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     934            1 :     spdm_context->local_context.capability.flags = 0;
     935            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
     936            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     937            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     938            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     939            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     940              :         m_libspdm_use_measurement_hash_algo;
     941              : 
     942            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     943              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     944              : 
     945            1 :     session_id = 0xFFFFFFFF;
     946            1 :     spdm_context->latest_session_id = session_id;
     947            1 :     spdm_context->last_spdm_request_session_id_valid = true;
     948            1 :     spdm_context->last_spdm_request_session_id = session_id;
     949            1 :     session_info = &spdm_context->session_info[0];
     950            1 :     libspdm_session_info_init(spdm_context, session_info, session_id,
     951              :                               SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT, true);
     952            1 :     libspdm_secured_message_set_session_state(
     953              :         session_info->secured_message_context, LIBSPDM_SESSION_STATE_ESTABLISHED);
     954              : 
     955            1 :     response_size = sizeof(response);
     956            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE, m_libspdm_challenge_request1.nonce);
     957            1 :     status = libspdm_get_response_challenge_auth(
     958              :         spdm_context, m_libspdm_challenge_request1_size,
     959              :         &m_libspdm_challenge_request1, &response_size, response);
     960              : 
     961            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     962            1 :     assert_int_equal (response_size, sizeof(spdm_error_response_t));
     963            1 :     spdm_response = (void *)response;
     964            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_ERROR);
     965            1 :     assert_int_equal (spdm_response->header.param1, SPDM_ERROR_CODE_UNEXPECTED_REQUEST);
     966            1 :     assert_int_equal (spdm_response->header.param2, 0);
     967              : 
     968              :     /* Clear session */
     969            1 :     libspdm_free_session_id(spdm_context, 0xFFFFFFFF);
     970            1 :     spdm_context->latest_session_id = 0;
     971            1 :     spdm_context->last_spdm_request_session_id_valid = false;
     972            1 : }
     973              : 
     974              : /**
     975              :  * Test 16: receiving a correct CHALLENGE message from the requester with
     976              :  * slot number 0xFF.
     977              :  * Expected behavior: the responder accepts the request and produces a valid
     978              :  * CHALLENGE_AUTH response message.
     979              :  **/
     980            1 : static void rsp_challenge_auth_case17(void **state)
     981              : {
     982              :     libspdm_return_t status;
     983              :     libspdm_test_context_t *spdm_test_context;
     984              :     libspdm_context_t *spdm_context;
     985              :     size_t response_size;
     986              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     987              :     spdm_challenge_auth_response_t *spdm_response;
     988              :     void *data1;
     989              :     size_t data_size1;
     990              : 
     991            1 :     spdm_test_context = *state;
     992            1 :     spdm_context = spdm_test_context->spdm_context;
     993            1 :     spdm_test_context->case_id = 0x11;
     994            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     995            1 :     spdm_context->local_context.capability.flags = 0;
     996            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
     997            1 :     spdm_context->local_context.capability.flags |=
     998              :         SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PUB_KEY_ID_CAP;
     999            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1000            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    1001            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
    1002            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    1003              :         m_libspdm_use_measurement_hash_algo;
    1004              : 
    1005            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
    1006              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1007            1 :     if (!libspdm_read_responder_public_key(m_libspdm_use_asym_algo, &data1, &data_size1)) {
    1008            0 :         return;
    1009              :     }
    1010            1 :     spdm_context->local_context.local_public_key_provision = data1;
    1011            1 :     spdm_context->local_context.local_public_key_provision_size = data_size1;
    1012              : 
    1013            1 :     libspdm_secret_lib_challenge_opaque_data_size = 0;
    1014            1 :     libspdm_reset_message_c(spdm_context);
    1015              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1016              :     spdm_context->transcript.message_m.buffer_size =
    1017              :         spdm_context->transcript.message_m.max_buffer_size;
    1018              : #endif
    1019              : 
    1020            1 :     response_size = sizeof(response);
    1021            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE, m_libspdm_challenge_request7.nonce);
    1022            1 :     status = libspdm_get_response_challenge_auth(
    1023              :         spdm_context, m_libspdm_challenge_request7_size,
    1024              :         &m_libspdm_challenge_request7, &response_size, response);
    1025            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1026            1 :     assert_int_equal(response_size,
    1027              :                      sizeof(spdm_challenge_auth_response_t) +
    1028              :                      libspdm_get_hash_size(m_libspdm_use_hash_algo) +
    1029              :                      SPDM_NONCE_SIZE + 0 + sizeof(uint16_t) + 0 +
    1030              :                      libspdm_get_asym_signature_size(m_libspdm_use_asym_algo));
    1031            1 :     spdm_response = (void *)response;
    1032            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_CHALLENGE_AUTH);
    1033            1 :     assert_int_equal(spdm_response->header.param1, 0xF);
    1034            1 :     assert_int_equal(spdm_response->header.param2, 0);
    1035              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1036              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
    1037              : #endif
    1038            1 :     free(data1);
    1039              : }
    1040              : 
    1041              : /**
    1042              :  * Test 18: Successfully reply to V1.3 to get CHALLENGE message with context field
    1043              :  * no opaque data, no measurements, and slot number 0.
    1044              :  * Expected Behavior: get a LIBSPDM_STATUS_SUCCESS return code, correct context field
    1045              :  **/
    1046            1 : static void rsp_challenge_auth_case18(void **state)
    1047              : {
    1048              :     libspdm_return_t status;
    1049              :     libspdm_test_context_t *spdm_test_context;
    1050              :     libspdm_context_t *spdm_context;
    1051              :     size_t response_size;
    1052              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1053              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1054              : 
    1055              :     spdm_challenge_auth_response_t *spdm_response;
    1056              :     void *data1;
    1057              :     size_t data_size1;
    1058              :     uint8_t *requester_context;
    1059              :     uint8_t *responder_context;
    1060              : 
    1061            1 :     spdm_test_context = *state;
    1062            1 :     spdm_context = spdm_test_context->spdm_context;
    1063            1 :     spdm_test_context->case_id = 0x12;
    1064            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1065            1 :     spdm_context->local_context.capability.flags = 0;
    1066            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
    1067            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1068            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    1069            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
    1070            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    1071              :         m_libspdm_use_measurement_hash_algo;
    1072            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
    1073              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1074            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1075              :                                                          m_libspdm_use_asym_algo, &data1,
    1076              :                                                          &data_size1, NULL, NULL)) {
    1077            0 :         return;
    1078              :     }
    1079            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
    1080            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size1;
    1081            1 :     libspdm_secret_lib_challenge_opaque_data_size = 0;
    1082            1 :     libspdm_reset_message_c(spdm_context);
    1083              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1084              :     spdm_context->transcript.message_m.buffer_size =
    1085              :         spdm_context->transcript.message_m.max_buffer_size;
    1086              : #endif
    1087            1 :     response_size = sizeof(response);
    1088            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE, m_libspdm_challenge_request8.nonce);
    1089              : 
    1090            1 :     libspdm_zero_mem(request, sizeof(request));
    1091            1 :     libspdm_copy_mem(request, sizeof(spdm_challenge_request_t),
    1092              :                      &m_libspdm_challenge_request8, m_libspdm_challenge_request8_size);
    1093            1 :     requester_context = request + m_libspdm_challenge_request8_size;
    1094              : 
    1095            1 :     libspdm_set_mem(requester_context, SPDM_REQ_CONTEXT_SIZE, 0xAA);
    1096            1 :     g_check_challenge_request_context = true;
    1097            1 :     g_challenge_request_context = 0xAAAAAAAA;
    1098            1 :     m_libspdm_challenge_request8_size += SPDM_REQ_CONTEXT_SIZE;
    1099              : 
    1100            1 :     status = libspdm_get_response_challenge_auth(
    1101              :         spdm_context, m_libspdm_challenge_request8_size,
    1102              :         request, &response_size, response);
    1103              : 
    1104            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1105            1 :     assert_int_equal(response_size,
    1106              :                      sizeof(spdm_challenge_auth_response_t) +
    1107              :                      libspdm_get_hash_size(m_libspdm_use_hash_algo) +
    1108              :                      SPDM_NONCE_SIZE + 0 + sizeof(uint16_t) + 0 +
    1109              :                      libspdm_get_asym_signature_size(m_libspdm_use_asym_algo) +
    1110              :                      SPDM_REQ_CONTEXT_SIZE);
    1111            1 :     spdm_response = (void *)response;
    1112            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_CHALLENGE_AUTH);
    1113            1 :     assert_int_equal(spdm_response->header.param1, 0);
    1114            1 :     assert_int_equal(spdm_response->header.param2, 1 << 0);
    1115              : 
    1116            1 :     responder_context = (void *)response;
    1117            1 :     responder_context += sizeof(spdm_challenge_auth_response_t) +
    1118            1 :                          libspdm_get_hash_size(m_libspdm_use_hash_algo) +
    1119            1 :                          SPDM_NONCE_SIZE + 0 + sizeof(uint16_t);
    1120            1 :     assert_memory_equal(requester_context, responder_context, SPDM_REQ_CONTEXT_SIZE);
    1121              : 
    1122            1 :     g_check_challenge_request_context = false;
    1123              : 
    1124              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1125              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
    1126              : #endif
    1127            1 :     free(data1);
    1128              : }
    1129              : 
    1130              : /**
    1131              :  * Test 19: The key usage bit mask is not set, the SlotID fields in CHALLENGE and CHALLENGE_AUTH shall not specify this certificate slot
    1132              :  * Expected behavior: the responder accepts the request, but produces an ERROR message
    1133              :  * indicating the invalid state.
    1134              :  **/
    1135            1 : static void rsp_challenge_auth_case19(void **state)
    1136              : {
    1137              :     libspdm_return_t status;
    1138              :     libspdm_test_context_t *spdm_test_context;
    1139              :     libspdm_context_t *spdm_context;
    1140              :     size_t response_size;
    1141              :     spdm_challenge_auth_response_t *spdm_response;
    1142              :     void *data1;
    1143              :     size_t data_size1;
    1144              :     uint8_t *requester_context;
    1145              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1146              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
    1147              :     uint8_t slot_id;
    1148              : 
    1149            1 :     spdm_test_context = *state;
    1150            1 :     spdm_context = spdm_test_context->spdm_context;
    1151            1 :     spdm_test_context->case_id = 0x13;
    1152            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
    1153            1 :     spdm_context->local_context.capability.flags = 0;
    1154            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
    1155            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
    1156            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
    1157            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
    1158            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
    1159              :         m_libspdm_use_measurement_hash_algo;
    1160            1 :     spdm_context->connection_info.multi_key_conn_rsp = true;
    1161              : 
    1162            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
    1163              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
    1164            1 :     if (!libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
    1165              :                                                          m_libspdm_use_asym_algo, &data1,
    1166              :                                                          &data_size1, NULL, NULL)) {
    1167            0 :         return;
    1168              :     }
    1169            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data1;
    1170            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size1;
    1171              : 
    1172            1 :     libspdm_secret_lib_challenge_opaque_data_size = 0;
    1173            1 :     libspdm_reset_message_c(spdm_context);
    1174              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
    1175              :     spdm_context->transcript.message_m.buffer_size =
    1176              :         spdm_context->transcript.message_m.max_buffer_size;
    1177              : #endif
    1178              : 
    1179              :     /* If set, the SlotID fields in CHALLENGE and CHALLENGE_AUTH can specify this certificate slot. If not set, the
    1180              :      * SlotID fields in CHALLENGE and CHALLENGE_AUTH shall not specify this certificate slot. */
    1181            1 :     slot_id = 0;
    1182            1 :     m_libspdm_challenge_request8.header.param1 = slot_id;
    1183            1 :     spdm_context->local_context.local_key_usage_bit_mask[slot_id] =
    1184              :         SPDM_KEY_USAGE_BIT_MASK_KEY_EX_USE |
    1185              :         SPDM_KEY_USAGE_BIT_MASK_MEASUREMENT_USE;
    1186              : 
    1187            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE, m_libspdm_challenge_request8.nonce);
    1188              : 
    1189            1 :     libspdm_zero_mem(request, sizeof(request));
    1190            1 :     libspdm_copy_mem(request, sizeof(spdm_challenge_request_t),
    1191              :                      &m_libspdm_challenge_request8, sizeof(m_libspdm_challenge_request8));
    1192            1 :     requester_context = request + sizeof(m_libspdm_challenge_request8);
    1193            1 :     libspdm_set_mem(requester_context, SPDM_REQ_CONTEXT_SIZE, 0xAA);
    1194            1 :     m_libspdm_challenge_request8_size = sizeof(m_libspdm_challenge_request8) +
    1195              :                                         SPDM_REQ_CONTEXT_SIZE;
    1196              : 
    1197            1 :     response_size = sizeof(response);
    1198            1 :     status = libspdm_get_response_challenge_auth(
    1199              :         spdm_context, m_libspdm_challenge_request8_size,
    1200              :         request, &response_size, response);
    1201            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
    1202            1 :     assert_int_equal (response_size, sizeof(spdm_error_response_t));
    1203            1 :     spdm_response = (void *)response;
    1204            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_ERROR);
    1205            1 :     assert_int_equal (spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
    1206            1 :     assert_int_equal (spdm_response->header.param2, 0);
    1207            1 :     free(data1);
    1208              : }
    1209              : 
    1210            1 : int libspdm_rsp_challenge_auth_test(void)
    1211              : {
    1212            1 :     const struct CMUnitTest test_cases[] = {
    1213              :         /* Success Case*/
    1214              :         cmocka_unit_test(rsp_challenge_auth_case1),
    1215              :         /* Can be populated with new test.*/
    1216              :         cmocka_unit_test(rsp_challenge_auth_case2),
    1217              :         /* response_state: LIBSPDM_RESPONSE_STATE_BUSY*/
    1218              :         cmocka_unit_test(rsp_challenge_auth_case3),
    1219              :         /* response_state: LIBSPDM_RESPONSE_STATE_NEED_RESYNC*/
    1220              :         cmocka_unit_test(rsp_challenge_auth_case4),
    1221              :         #if LIBSPDM_RESPOND_IF_READY_SUPPORT
    1222              :         /* response_state: LIBSPDM_RESPONSE_STATE_NOT_READY*/
    1223              :         cmocka_unit_test(rsp_challenge_auth_case5),
    1224              :         #endif /* LIBSPDM_RESPOND_IF_READY_SUPPORT */
    1225              :         /* connection_state Check*/
    1226              :         cmocka_unit_test(rsp_challenge_auth_case6),
    1227              :         cmocka_unit_test(rsp_challenge_auth_case7),
    1228              :         cmocka_unit_test(rsp_challenge_auth_case8),
    1229              :         cmocka_unit_test(rsp_challenge_auth_case9),
    1230              :         cmocka_unit_test(rsp_challenge_auth_case10),
    1231              :         cmocka_unit_test(rsp_challenge_auth_case11),
    1232              :         cmocka_unit_test(rsp_challenge_auth_case12),
    1233              :         cmocka_unit_test(rsp_challenge_auth_case13),
    1234              :         cmocka_unit_test(rsp_challenge_auth_case14),
    1235              :         /* Buffer verification*/
    1236              :         cmocka_unit_test(rsp_challenge_auth_case15),
    1237              :         cmocka_unit_test(rsp_challenge_auth_case16),
    1238              :         /* using provisioned public key (slot_id 0xFF) */
    1239              :         cmocka_unit_test(rsp_challenge_auth_case17),
    1240              :         /* Success Case: V1.3 get a correct context field */
    1241              :         cmocka_unit_test(rsp_challenge_auth_case18),
    1242              :         /* The key usage bit mask is not set, failed Case*/
    1243              :         cmocka_unit_test(rsp_challenge_auth_case19),
    1244              : 
    1245              :     };
    1246              : 
    1247            1 :     libspdm_test_context_t test_context = {
    1248              :         LIBSPDM_TEST_CONTEXT_VERSION,
    1249              :         false,
    1250              :     };
    1251              : 
    1252            1 :     libspdm_setup_test_context(&test_context);
    1253              : 
    1254            1 :     return cmocka_run_group_tests(test_cases,
    1255              :                                   libspdm_unit_test_group_setup,
    1256              :                                   libspdm_unit_test_group_teardown);
    1257              : }
    1258              : 
    1259              : #endif /* LIBSPDM_ENABLE_CAPABILITY_CHAL_CAP*/
        

Generated by: LCOV version 2.0-1