LCOV - code coverage report
Current view: top level - unit_test/test_spdm_requester - encap_challenge_auth.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 240 240
Test Date: 2025-06-29 08:09:00 Functions: 100.0 % 9 9

            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_requester_lib.h"
       9              : 
      10              : #if (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_ENABLE_CAPABILITY_ENCAP_CAP) && \
      11              :     (LIBSPDM_ENABLE_CAPABILITY_CHAL_CAP)
      12              : 
      13              : spdm_challenge_request_t m_spdm_challenge_request1 = {
      14              :     {SPDM_MESSAGE_VERSION_11, SPDM_CHALLENGE, 0,
      15              :      SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH},
      16              : };
      17              : size_t m_spdm_challenge_request1_size = sizeof(m_spdm_challenge_request1);
      18              : 
      19              : spdm_challenge_request_t m_spdm_challenge_request3 = {
      20              :     {SPDM_MESSAGE_VERSION_11, SPDM_CHALLENGE, SPDM_MAX_SLOT_COUNT,
      21              :      SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH},
      22              : };
      23              : size_t m_spdm_challenge_request3_size = sizeof(m_spdm_challenge_request3);
      24              : 
      25              : spdm_challenge_request_t m_spdm_challenge_request4 = {
      26              :     {SPDM_MESSAGE_VERSION_11, SPDM_CHALLENGE, 0xFF,
      27              :      SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH},
      28              : };
      29              : size_t m_spdm_challenge_request4_size = sizeof(m_spdm_challenge_request4);
      30              : 
      31              : spdm_challenge_request_t m_spdm_challenge_request5 = {
      32              :     {SPDM_MESSAGE_VERSION_13, SPDM_CHALLENGE, 0,
      33              :      SPDM_CHALLENGE_REQUEST_NO_MEASUREMENT_SUMMARY_HASH},
      34              : };
      35              : size_t m_spdm_challenge_request5_size = sizeof(m_spdm_challenge_request5);
      36              : 
      37              : extern size_t libspdm_secret_lib_challenge_opaque_data_size;
      38              : 
      39              : /**
      40              :  * Test 1: receiving a correct CHALLENGE message from the requester with
      41              :  * no opaque data, no measurements, and slot number 0.
      42              :  * Expected behavior: the requester accepts the request and produces a valid
      43              :  * CHALLENGE_AUTH response message and Completion of CHALLENGE sets M1/M2 to null.
      44              :  **/
      45            1 : void test_libspdm_requester_encap_challenge_auth_case1(void **state)
      46              : {
      47              :     libspdm_return_t status;
      48              :     libspdm_test_context_t *spdm_test_context;
      49              :     libspdm_context_t *spdm_context;
      50              :     size_t response_size;
      51              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
      52              :     spdm_challenge_auth_response_t *spdm_response;
      53              :     void *data;
      54              :     size_t data_size;
      55              : 
      56            1 :     spdm_test_context = *state;
      57            1 :     spdm_context = spdm_test_context->spdm_context;
      58            1 :     spdm_test_context->case_id = 0x1;
      59              : 
      60            1 :     spdm_context->local_context.capability.flags = 0;
      61            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
      62            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHAL_CAP;
      63            1 :     spdm_context->connection_info.capability.flags = 0;
      64              : 
      65            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
      66            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
      67            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
      68            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
      69              :         m_libspdm_use_measurement_hash_algo;
      70              : 
      71            1 :     spdm_context->connection_info.connection_state =
      72              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
      73            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
      74              :         m_libspdm_use_hash_algo;
      75            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
      76              :         m_libspdm_use_asym_algo;
      77            1 :     spdm_context->connection_info.algorithm.measurement_spec =
      78              :         m_libspdm_use_measurement_spec;
      79            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
      80              :         m_libspdm_use_measurement_hash_algo;
      81              : 
      82            1 :     spdm_context->connection_info.algorithm.req_base_asym_alg =
      83              :         SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048;
      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, &data,
      89              :                                                     &data_size, NULL, NULL);
      90            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
      91            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
      92              :         data_size;
      93              : 
      94            1 :     libspdm_secret_lib_challenge_opaque_data_size = 0;
      95            1 :     libspdm_reset_message_mut_c(spdm_context);
      96              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
      97              :     spdm_context->transcript.message_m.buffer_size =
      98              :         spdm_context->transcript.message_m.max_buffer_size;
      99              : #endif
     100              : 
     101            1 :     response_size = sizeof(response);
     102            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
     103              :                               m_spdm_challenge_request1.nonce);
     104            1 :     status = libspdm_get_encap_response_challenge_auth(
     105              :         spdm_context, m_spdm_challenge_request1_size,
     106              :         &m_spdm_challenge_request1, &response_size, response);
     107            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     108            1 :     assert_int_equal(response_size, sizeof(spdm_challenge_auth_response_t) +
     109              :                      libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo) +
     110              :                      SPDM_NONCE_SIZE + 0 +
     111              :                      sizeof(uint16_t) +
     112              :                      libspdm_secret_lib_challenge_opaque_data_size +
     113              :                      libspdm_get_req_asym_signature_size(
     114              :                          spdm_context->connection_info.algorithm.req_base_asym_alg));
     115            1 :     spdm_response = (void *)response;
     116            1 :     assert_int_equal(spdm_response->header.request_response_code,
     117              :                      SPDM_CHALLENGE_AUTH);
     118            1 :     assert_int_equal(spdm_response->header.param1, 0);
     119            1 :     assert_int_equal(spdm_response->header.param2, 1 << 0);
     120              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     121              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size,
     122              :                      0);
     123              :     assert_int_equal(spdm_context->transcript.message_mut_c.buffer_size, 0);
     124              : #else
     125            1 :     assert_null(spdm_context->transcript.digest_context_mut_m1m2);
     126              : #endif
     127            1 :     free(data);
     128            1 : }
     129              : 
     130              : /**
     131              :  * Test 2:
     132              :  * Expected behavior:
     133              :  **/
     134            1 : void test_libspdm_requester_encap_challenge_auth_case2(void **state)
     135              : {
     136            1 : }
     137              : 
     138              : /**
     139              :  * Test 3: receiving a correct CHALLENGE from the requester, but the requester does not
     140              :  * have the challenge capability set.
     141              :  * Expected behavior: the requester accepts the request and produces a valid
     142              :  * CHALLENGE_AUTH response message.
     143              :  **/
     144            1 : void test_libspdm_requester_encap_challenge_auth_case3(void **state)
     145              : {
     146              :     libspdm_return_t status;
     147              :     libspdm_test_context_t *spdm_test_context;
     148              :     libspdm_context_t *spdm_context;
     149              :     size_t response_size;
     150              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     151              :     spdm_challenge_auth_response_t *spdm_response;
     152              :     void *data;
     153              :     size_t data_size;
     154              : 
     155            1 :     spdm_test_context = *state;
     156            1 :     spdm_context = spdm_test_context->spdm_context;
     157            1 :     spdm_test_context->case_id = 0x3;
     158            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     159            1 :     spdm_context->local_context.capability.flags = 0;
     160              :     /* spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;*/
     161            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     162            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     163            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     164            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     165              :         m_libspdm_use_measurement_hash_algo;
     166              : 
     167            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11
     168              :                                             << SPDM_VERSION_NUMBER_SHIFT_BIT;
     169            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     170              :                                                     m_libspdm_use_asym_algo, &data, &data_size,
     171              :                                                     NULL, NULL);
     172            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     173            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     174              : 
     175            1 :     libspdm_secret_lib_challenge_opaque_data_size = 0;
     176            1 :     libspdm_reset_message_c(spdm_context);
     177              : 
     178            1 :     response_size = sizeof(response);
     179            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE, m_spdm_challenge_request1.nonce);
     180            1 :     status = libspdm_get_encap_response_challenge_auth(spdm_context, m_spdm_challenge_request1_size,
     181              :                                                        &m_spdm_challenge_request1, &response_size,
     182              :                                                        response);
     183            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     184            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     185            1 :     spdm_response = (void *)response;
     186            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     187            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_UNSUPPORTED_REQUEST);
     188            1 :     assert_int_equal(spdm_response->header.param2, SPDM_CHALLENGE);
     189            1 :     free(data);
     190            1 : }
     191              : 
     192              : /**
     193              :  * Test 4: receiving an incorrect CHALLENGE from the requester, with the slot number
     194              :  * larger than the specification limit.
     195              :  * Expected behavior: the requester rejects the request, and produces an ERROR message
     196              :  * indicating the UnexpectedRequest.
     197              :  **/
     198            1 : void test_libspdm_requester_encap_challenge_auth_case4(void **state)
     199              : {
     200              :     libspdm_return_t status;
     201              :     libspdm_test_context_t *spdm_test_context;
     202              :     libspdm_context_t *spdm_context;
     203              :     size_t response_size;
     204              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     205              :     spdm_challenge_auth_response_t *spdm_response;
     206              :     void *data;
     207              :     size_t data_size;
     208              : 
     209            1 :     spdm_test_context = *state;
     210            1 :     spdm_context = spdm_test_context->spdm_context;
     211            1 :     spdm_test_context->case_id = 0x4;
     212            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     213            1 :     spdm_context->local_context.capability.flags = 0;
     214            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
     215            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     216            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     217            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     218            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     219              :         m_libspdm_use_measurement_hash_algo;
     220              : 
     221            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11
     222              :                                             << SPDM_VERSION_NUMBER_SHIFT_BIT;
     223            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     224              :                                                     m_libspdm_use_asym_algo, &data, &data_size,
     225              :                                                     NULL, NULL);
     226            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     227            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     228              : 
     229            1 :     libspdm_secret_lib_challenge_opaque_data_size = 0;
     230            1 :     libspdm_reset_message_c(spdm_context);
     231              : 
     232            1 :     response_size = sizeof(response);
     233            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE, m_spdm_challenge_request1.nonce);
     234            1 :     status = libspdm_get_encap_response_challenge_auth(spdm_context, m_spdm_challenge_request3_size,
     235              :                                                        &m_spdm_challenge_request3, &response_size,
     236              :                                                        response);
     237            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     238            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     239            1 :     spdm_response = (void *)response;
     240            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     241            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
     242            1 :     assert_int_equal(spdm_response->header.param2, 0);
     243            1 :     free(data);
     244            1 : }
     245              : 
     246              : /**
     247              :  * Test 5: receiving a correct CHALLENGE from the requester, but with certificate
     248              :  * unavailable at the requested slot number (1).
     249              :  * Expected behavior: the requester rejects the request, and produces an ERROR message
     250              :  * indicating the UnexpectedRequest.
     251              :  **/
     252            1 : void test_libspdm_requester_encap_challenge_auth_case5(void **state)
     253              : {
     254              :     libspdm_return_t status;
     255              :     libspdm_test_context_t *spdm_test_context;
     256              :     libspdm_context_t *spdm_context;
     257              :     size_t response_size;
     258              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     259              :     spdm_challenge_auth_response_t *spdm_response;
     260              :     void *data;
     261              :     size_t data_size;
     262              : 
     263            1 :     spdm_test_context = *state;
     264            1 :     spdm_context = spdm_test_context->spdm_context;
     265            1 :     spdm_test_context->case_id = 0x05;
     266            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     267            1 :     spdm_context->local_context.capability.flags = 0;
     268            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
     269            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     270            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     271            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     272            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     273              :         m_libspdm_use_measurement_hash_algo;
     274              : 
     275            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11
     276              :                                             << SPDM_VERSION_NUMBER_SHIFT_BIT;
     277            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     278              :                                                     m_libspdm_use_asym_algo, &data, &data_size,
     279              :                                                     NULL, NULL);
     280            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     281            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     282              : 
     283            1 :     libspdm_secret_lib_challenge_opaque_data_size = 0;
     284            1 :     libspdm_reset_message_c(spdm_context);
     285              : 
     286            1 :     response_size = sizeof(response);
     287            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE, m_spdm_challenge_request1.nonce);
     288            1 :     status = libspdm_get_encap_response_challenge_auth(spdm_context, m_spdm_challenge_request3_size,
     289              :                                                        &m_spdm_challenge_request3, &response_size,
     290              :                                                        response);
     291            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     292            1 :     assert_int_equal(response_size, sizeof(spdm_error_response_t));
     293            1 :     spdm_response = (void *)response;
     294            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR);
     295            1 :     assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
     296            1 :     assert_int_equal(spdm_response->header.param2, 0);
     297            1 :     free(data);
     298            1 : }
     299              : 
     300              : /**
     301              :  * Test 6: receiving a correct CHALLENGE message from the requester with
     302              :  * no opaque data, no measurements, and slot number 0xFF.
     303              :  * Expected behavior: the requester accepts the request and produces a valid
     304              :  * CHALLENGE_AUTH response message using provisioned public key (slot number 0xFF).
     305              :  **/
     306            1 : void test_libspdm_requester_encap_challenge_auth_case6(void **state)
     307              : {
     308              :     libspdm_return_t status;
     309              :     libspdm_test_context_t *spdm_test_context;
     310              :     libspdm_context_t *spdm_context;
     311              :     size_t response_size;
     312              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     313              :     spdm_challenge_auth_response_t *spdm_response;
     314              :     void *data;
     315              :     size_t data_size;
     316              : 
     317            1 :     spdm_test_context = *state;
     318            1 :     spdm_context = spdm_test_context->spdm_context;
     319            1 :     spdm_test_context->case_id = 0x6;
     320              : 
     321            1 :     spdm_context->local_context.capability.flags = 0;
     322            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHAL_CAP;
     323              : 
     324            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     325            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     326            1 :     spdm_context->connection_info.algorithm.req_base_asym_alg = m_libspdm_use_req_asym_algo;
     327            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11
     328              :                                             << SPDM_VERSION_NUMBER_SHIFT_BIT;
     329              : 
     330            1 :     libspdm_read_requester_public_key(m_libspdm_use_req_asym_algo, &data, &data_size);
     331            1 :     spdm_context->local_context.local_public_key_provision = data;
     332            1 :     spdm_context->local_context.local_public_key_provision_size = data_size;
     333              : 
     334            1 :     libspdm_secret_lib_challenge_opaque_data_size = 0;
     335            1 :     libspdm_reset_message_c(spdm_context);
     336              : 
     337              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     338              :     spdm_context->transcript.message_m.buffer_size =
     339              :         spdm_context->transcript.message_m.max_buffer_size;
     340              : #endif
     341              : 
     342            1 :     response_size = sizeof(response);
     343            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE, m_spdm_challenge_request4.nonce);
     344            1 :     status = libspdm_get_encap_response_challenge_auth(
     345              :         spdm_context,
     346              :         m_spdm_challenge_request4_size, &m_spdm_challenge_request4,
     347              :         &response_size, response);
     348            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     349            1 :     assert_int_equal(
     350              :         response_size,
     351              :         sizeof(spdm_challenge_auth_response_t) +
     352              :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo) +
     353              :         SPDM_NONCE_SIZE + 0 +
     354              :         sizeof(uint16_t) + 0 +
     355              :         libspdm_get_req_asym_signature_size(
     356              :             spdm_context->connection_info.algorithm.req_base_asym_alg));
     357            1 :     spdm_response = (void *)response;
     358            1 :     assert_int_equal(spdm_response->header.request_response_code, SPDM_CHALLENGE_AUTH);
     359            1 :     assert_int_equal(spdm_response->header.param1, 0xF);
     360            1 :     assert_int_equal(spdm_response->header.param2, 0);
     361              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     362              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size, 0);
     363              : #endif
     364            1 :     free(data);
     365            1 : }
     366              : 
     367              : /**
     368              :  * Test 7: receiving a correct CHALLENGE message from the requester with context field
     369              :  * no opaque data, no measurements, and slot number 0.
     370              :  * Expected behavior:  get a RETURN_SUCCESS return code, correct context field
     371              :  **/
     372            1 : void test_libspdm_requester_encap_challenge_auth_case7(void **state)
     373              : {
     374              :     libspdm_return_t status;
     375              :     libspdm_test_context_t *spdm_test_context;
     376              :     libspdm_context_t *spdm_context;
     377              :     size_t response_size;
     378              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
     379              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     380              :     spdm_challenge_auth_response_t *spdm_response;
     381              :     void *data;
     382              :     size_t data_size;
     383              :     uint8_t *requester_context;
     384              :     uint8_t *responder_context;
     385              : 
     386            1 :     spdm_test_context = *state;
     387            1 :     spdm_context = spdm_test_context->spdm_context;
     388            1 :     spdm_test_context->case_id = 0x7;
     389              : 
     390            1 :     spdm_context->local_context.capability.flags = 0;
     391            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
     392            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHAL_CAP;
     393            1 :     spdm_context->connection_info.capability.flags = 0;
     394              : 
     395            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     396            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     397            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     398            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     399              :         m_libspdm_use_measurement_hash_algo;
     400              : 
     401            1 :     spdm_context->connection_info.connection_state =
     402              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     403            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     404              :         m_libspdm_use_hash_algo;
     405            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     406              :         m_libspdm_use_asym_algo;
     407            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     408              :         m_libspdm_use_measurement_spec;
     409            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     410              :         m_libspdm_use_measurement_hash_algo;
     411            1 :     spdm_context->connection_info.algorithm.req_base_asym_alg =
     412              :         m_libspdm_use_req_asym_algo;
     413              : 
     414            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13
     415              :                                             << SPDM_VERSION_NUMBER_SHIFT_BIT;
     416            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     417              :                                                     m_libspdm_use_asym_algo, &data,
     418              :                                                     &data_size, NULL, NULL);
     419            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     420            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
     421              :         data_size;
     422              : 
     423            1 :     libspdm_reset_message_mut_c(spdm_context);
     424              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     425              :     spdm_context->transcript.message_m.buffer_size =
     426              :         spdm_context->transcript.message_m.max_buffer_size;
     427              : #endif
     428              : 
     429            1 :     response_size = sizeof(response);
     430            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
     431              :                               m_spdm_challenge_request5.nonce);
     432              : 
     433            1 :     libspdm_zero_mem(request, sizeof(request));
     434            1 :     libspdm_copy_mem(request, sizeof(spdm_challenge_request_t),
     435              :                      &m_spdm_challenge_request5, m_spdm_challenge_request5_size);
     436            1 :     requester_context = request + m_spdm_challenge_request5_size;
     437            1 :     libspdm_set_mem(requester_context, SPDM_REQ_CONTEXT_SIZE, 0xAA);
     438            1 :     m_spdm_challenge_request5_size += SPDM_REQ_CONTEXT_SIZE;
     439              : 
     440            1 :     status = libspdm_get_encap_response_challenge_auth(
     441              :         spdm_context, m_spdm_challenge_request5_size,
     442              :         request, &response_size, response);
     443            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     444            1 :     assert_int_equal(response_size, sizeof(spdm_challenge_auth_response_t) +
     445              :                      libspdm_get_hash_size(m_libspdm_use_hash_algo) +
     446              :                      SPDM_NONCE_SIZE + 0 + sizeof(uint16_t) +
     447              :                      libspdm_get_asym_signature_size(m_libspdm_use_req_asym_algo) +
     448              :                      SPDM_REQ_CONTEXT_SIZE);
     449            1 :     spdm_response = (void *)response;
     450            1 :     assert_int_equal(spdm_response->header.request_response_code,
     451              :                      SPDM_CHALLENGE_AUTH);
     452            1 :     assert_int_equal(spdm_response->header.param1, 0);
     453            1 :     assert_int_equal(spdm_response->header.param2, 1 << 0);
     454              : 
     455            1 :     responder_context = (void *)response;
     456            1 :     responder_context += sizeof(spdm_challenge_auth_response_t) +
     457            1 :                          libspdm_get_hash_size(m_libspdm_use_hash_algo) +
     458            1 :                          SPDM_NONCE_SIZE + 0 + sizeof(uint16_t);
     459            1 :     assert_memory_equal(requester_context, responder_context, SPDM_REQ_CONTEXT_SIZE);
     460              : 
     461              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     462              :     assert_int_equal(spdm_context->transcript.message_m.buffer_size,
     463              :                      0);
     464              :     assert_int_equal(spdm_context->transcript.message_mut_c.buffer_size, 0);
     465              : #else
     466            1 :     assert_null(spdm_context->transcript.digest_context_mut_m1m2);
     467              : #endif
     468            1 :     free(data);
     469            1 : }
     470              : 
     471              : /**
     472              :  * Test 8: The key usage bit mask is not set, the SlotID fields in CHALLENGE and CHALLENGE_AUTH shall not specify this certificate slot
     473              :  * Expected behavior: the responder accepts the request, but produces an ERROR message
     474              :  * indicating the invalid state.
     475              :  **/
     476            1 : void test_libspdm_requester_encap_challenge_auth_case8(void **state)
     477              : {
     478              :     libspdm_return_t status;
     479              :     libspdm_test_context_t *spdm_test_context;
     480              :     libspdm_context_t *spdm_context;
     481              :     size_t response_size;
     482              :     uint8_t request[LIBSPDM_MAX_SPDM_MSG_SIZE];
     483              :     uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
     484              :     spdm_challenge_auth_response_t *spdm_response;
     485              :     void *data;
     486              :     size_t data_size;
     487              :     uint8_t *requester_context;
     488              :     uint8_t slot_id;
     489              : 
     490            1 :     spdm_test_context = *state;
     491            1 :     spdm_context = spdm_test_context->spdm_context;
     492            1 :     spdm_test_context->case_id = 0x8;
     493              : 
     494            1 :     spdm_context->local_context.capability.flags = 0;
     495            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
     496            1 :     spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHAL_CAP;
     497            1 :     spdm_context->connection_info.capability.flags = 0;
     498              : 
     499            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     500            1 :     spdm_context->connection_info.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
     501            1 :     spdm_context->connection_info.algorithm.measurement_spec = m_libspdm_use_measurement_spec;
     502            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     503              :         m_libspdm_use_measurement_hash_algo;
     504              : 
     505            1 :     spdm_context->connection_info.connection_state =
     506              :         LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     507            1 :     spdm_context->connection_info.algorithm.base_hash_algo =
     508              :         m_libspdm_use_hash_algo;
     509            1 :     spdm_context->connection_info.algorithm.base_asym_algo =
     510              :         m_libspdm_use_asym_algo;
     511            1 :     spdm_context->connection_info.algorithm.measurement_spec =
     512              :         m_libspdm_use_measurement_spec;
     513            1 :     spdm_context->connection_info.algorithm.measurement_hash_algo =
     514              :         m_libspdm_use_measurement_hash_algo;
     515            1 :     spdm_context->connection_info.algorithm.req_base_asym_alg =
     516              :         m_libspdm_use_req_asym_algo;
     517            1 :     spdm_context->connection_info.multi_key_conn_req = true;
     518              : 
     519            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13
     520              :                                             << SPDM_VERSION_NUMBER_SHIFT_BIT;
     521            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     522              :                                                     m_libspdm_use_asym_algo, &data,
     523              :                                                     &data_size, NULL, NULL);
     524            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     525            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] =
     526              :         data_size;
     527              : 
     528            1 :     libspdm_reset_message_mut_c(spdm_context);
     529              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     530              :     spdm_context->transcript.message_m.buffer_size =
     531              :         spdm_context->transcript.message_m.max_buffer_size;
     532              : #endif
     533              : 
     534              :     /* If set, the SlotID fields in CHALLENGE and CHALLENGE_AUTH can specify this certificate slot. If not set, the
     535              :      * SlotID fields in CHALLENGE and CHALLENGE_AUTH shall not specify this certificate slot. */
     536            1 :     slot_id = 0;
     537            1 :     m_spdm_challenge_request5.header.param1 = slot_id;
     538            1 :     spdm_context->local_context.local_key_usage_bit_mask[slot_id] =
     539              :         SPDM_KEY_USAGE_BIT_MASK_KEY_EX_USE |
     540              :         SPDM_KEY_USAGE_BIT_MASK_MEASUREMENT_USE;
     541              : 
     542            1 :     response_size = sizeof(response);
     543            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE,
     544              :                               m_spdm_challenge_request5.nonce);
     545              : 
     546            1 :     libspdm_zero_mem(request, sizeof(request));
     547            1 :     libspdm_copy_mem(request, sizeof(spdm_challenge_request_t),
     548              :                      &m_spdm_challenge_request5, sizeof(m_spdm_challenge_request5));
     549            1 :     requester_context = request + sizeof(m_spdm_challenge_request5);
     550            1 :     libspdm_set_mem(requester_context, SPDM_REQ_CONTEXT_SIZE, 0xAA);
     551            1 :     m_spdm_challenge_request5_size = sizeof(m_spdm_challenge_request5) + SPDM_REQ_CONTEXT_SIZE;
     552              : 
     553            1 :     status = libspdm_get_encap_response_challenge_auth(
     554              :         spdm_context, m_spdm_challenge_request5_size,
     555              :         request, &response_size, response);
     556            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     557            1 :     assert_int_equal (response_size, sizeof(spdm_error_response_t));
     558            1 :     spdm_response = (void *)response;
     559            1 :     assert_int_equal (spdm_response->header.request_response_code, SPDM_ERROR);
     560            1 :     assert_int_equal (spdm_response->header.param1, SPDM_ERROR_CODE_INVALID_REQUEST);
     561            1 :     assert_int_equal (spdm_response->header.param2, 0);
     562              : 
     563            1 :     free(data);
     564            1 : }
     565              : 
     566            1 : int libspdm_requester_encap_challenge_auth_test_main(void)
     567              : {
     568            1 :     const struct CMUnitTest spdm_requester_challenge_auth_tests[] = {
     569              :         /* Success Case*/
     570              :         cmocka_unit_test(test_libspdm_requester_encap_challenge_auth_case1),
     571              :         /* Can be populated with new test.*/
     572              :         cmocka_unit_test(test_libspdm_requester_encap_challenge_auth_case2),
     573              :         /* connection_state Check*/
     574              :         cmocka_unit_test(test_libspdm_requester_encap_challenge_auth_case3),
     575              :         cmocka_unit_test(test_libspdm_requester_encap_challenge_auth_case4),
     576              :         cmocka_unit_test(test_libspdm_requester_encap_challenge_auth_case5),
     577              :         /* Success Case, use provisioned public key (slot 0xFF) */
     578              :         cmocka_unit_test(test_libspdm_requester_encap_challenge_auth_case6),
     579              :         /* Success Case: V1.3 get a correct context field */
     580              :         cmocka_unit_test(test_libspdm_requester_encap_challenge_auth_case7),
     581              :         /* The key usage bit mask is not set, failed Case*/
     582              :         cmocka_unit_test(test_libspdm_requester_encap_challenge_auth_case8),
     583              :     };
     584              : 
     585            1 :     libspdm_test_context_t test_context = {
     586              :         LIBSPDM_TEST_CONTEXT_VERSION,
     587              :         false,
     588              :     };
     589              : 
     590            1 :     libspdm_setup_test_context(&test_context);
     591              : 
     592            1 :     return cmocka_run_group_tests(spdm_requester_challenge_auth_tests,
     593              :                                   libspdm_unit_test_group_setup,
     594              :                                   libspdm_unit_test_group_teardown);
     595              : }
     596              : 
     597              : #endif /* (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (..) */
        

Generated by: LCOV version 2.0-1