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: 100.0 % 554 554
Test Date: 2025-06-29 08:09:00 Functions: 100.0 % 20 20

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

Generated by: LCOV version 2.0-1