LCOV - code coverage report
Current view: top level - unit_test/test_spdm_responder - encap_challenge.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 225 225
Test Date: 2025-09-14 08:11:04 Functions: 100.0 % 7 7

            Line data    Source code
       1              : /**
       2              :  *  Copyright Notice:
       3              :  *  Copyright 2021-2025 DMTF. All rights reserved.
       4              :  *  License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
       5              :  **/
       6              : 
       7              : #include "spdm_unit_test.h"
       8              : #include "internal/libspdm_responder_lib.h"
       9              : 
      10              : #if (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (LIBSPDM_ENABLE_CAPABILITY_ENCAP_CAP) && \
      11              :     (LIBSPDM_SEND_CHALLENGE_SUPPORT)
      12              : 
      13              : static uint8_t m_requester_context[SPDM_REQ_CONTEXT_SIZE];
      14              : 
      15            1 : void libspdm_test_responder_encap_challenge_case1(void **state)
      16              : {
      17              :     libspdm_return_t status;
      18              :     libspdm_test_context_t *spdm_test_context;
      19              :     libspdm_context_t *spdm_context;
      20              :     spdm_challenge_auth_response_t *spdm_response;
      21              :     uint8_t temp_buf[LIBSPDM_SENDER_BUFFER_SIZE];
      22              :     uint8_t *ptr;
      23              :     size_t response_size;
      24              :     size_t sig_size;
      25              :     bool need_continue;
      26              :     void *data;
      27              :     size_t data_size;
      28              : 
      29            1 :     spdm_test_context = *state;
      30            1 :     spdm_context = spdm_test_context->spdm_context;
      31              : 
      32            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
      33              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
      34            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
      35            1 :     spdm_context->connection_info.capability.flags = 0;
      36            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
      37            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
      38            1 :     spdm_context->connection_info.algorithm.req_base_asym_alg = m_libspdm_use_req_asym_algo;
      39            1 :     libspdm_read_requester_public_certificate_chain(m_libspdm_use_hash_algo,
      40              :                                                     m_libspdm_use_req_asym_algo, &data,
      41              :                                                     &data_size,
      42              :                                                     NULL, NULL);
      43            1 :     libspdm_reset_message_mut_c(spdm_context);
      44              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
      45              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = data_size;
      46              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
      47              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
      48              :                      data, data_size);
      49              : #else
      50            1 :     libspdm_hash_all(
      51              :         spdm_context->connection_info.algorithm.base_hash_algo,
      52              :         data, data_size,
      53            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
      54            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
      55            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
      56            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
      57              :         spdm_context->connection_info.algorithm.base_hash_algo,
      58            1 :         spdm_context->connection_info.algorithm.req_base_asym_alg,
      59              :         data, data_size,
      60              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
      61              : #endif
      62            1 :     spdm_context->encap_context.req_slot_id = 0;
      63              : 
      64            1 :     sig_size = libspdm_get_asym_signature_size(m_libspdm_use_req_asym_algo);
      65            1 :     response_size = sizeof(spdm_challenge_auth_response_t) +
      66            1 :                     libspdm_get_hash_size(m_libspdm_use_hash_algo) +
      67            1 :                     SPDM_NONCE_SIZE + 0 + sizeof(uint16_t) + 0 + sig_size;
      68            1 :     spdm_response = (void *)temp_buf;
      69            1 :     spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
      70            1 :     spdm_response->header.request_response_code = SPDM_CHALLENGE_AUTH;
      71            1 :     spdm_response->header.param1 = 0;
      72            1 :     spdm_response->header.param2 = (1 << 0);
      73              : 
      74            1 :     ptr = (void *)(spdm_response + 1);
      75            1 :     libspdm_hash_all(m_libspdm_use_hash_algo, data, data_size, ptr);
      76            1 :     ptr += libspdm_get_hash_size(m_libspdm_use_hash_algo);
      77            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE, ptr);
      78            1 :     ptr += SPDM_NONCE_SIZE;
      79              : 
      80            1 :     *(uint16_t *)ptr = 0;
      81            1 :     ptr += sizeof(uint16_t);
      82              : 
      83            1 :     libspdm_requester_data_sign(
      84              :         spdm_context,
      85            1 :         spdm_response->header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
      86              :             SPDM_CHALLENGE_AUTH,
      87              :             m_libspdm_use_req_asym_algo, m_libspdm_use_req_pqc_asym_algo, m_libspdm_use_hash_algo,
      88              :             false, (uint8_t*)spdm_response, response_size - sig_size,
      89              :             ptr, &sig_size);
      90              : 
      91            1 :     status =  libspdm_process_encap_response_challenge_auth(spdm_context, response_size,
      92              :                                                             spdm_response,
      93              :                                                             &need_continue);
      94            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
      95              :     /* Completion of CHALLENGE sets M1/M2 to null. */
      96              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
      97              :     assert_int_equal(spdm_context->transcript.message_mut_c.buffer_size, 0);
      98              : #else
      99            1 :     assert_null(spdm_context->transcript.digest_context_mut_m1m2);
     100              : #endif
     101            1 :     free(data);
     102            1 : }
     103              : 
     104            1 : void libspdm_test_responder_encap_challenge_case2(void **state)
     105              : {
     106              :     libspdm_return_t status;
     107              :     libspdm_test_context_t *spdm_test_context;
     108              :     libspdm_context_t *spdm_context;
     109              :     spdm_error_response_t *spdm_response;
     110              :     uint8_t temp_buf[LIBSPDM_MAX_SPDM_MSG_SIZE];
     111              :     size_t response_size;
     112              :     void *data;
     113              :     size_t data_size;
     114              : 
     115            1 :     spdm_test_context = *state;
     116            1 :     spdm_context = spdm_test_context->spdm_context;
     117              : 
     118            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     119            1 :     spdm_context->connection_info.capability.flags = 0;
     120            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
     121            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     122              :                                                     m_libspdm_use_asym_algo, &data,
     123              :                                                     &data_size,
     124              :                                                     NULL, NULL);
     125            1 :     libspdm_reset_message_a(spdm_context);
     126            1 :     libspdm_reset_message_b(spdm_context);
     127            1 :     libspdm_reset_message_c(spdm_context);
     128              : 
     129            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     130            1 :     spdm_context->connection_info.algorithm.req_base_asym_alg = m_libspdm_use_req_asym_algo;
     131              : 
     132            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     133              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     134              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     135              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = data_size;
     136              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
     137              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
     138              :                      data, data_size);
     139              : #else
     140            1 :     libspdm_hash_all(
     141              :         spdm_context->connection_info.algorithm.base_hash_algo,
     142              :         data, data_size,
     143            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
     144            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
     145            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
     146            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
     147              :         spdm_context->connection_info.algorithm.base_hash_algo,
     148            1 :         spdm_context->connection_info.algorithm.req_base_asym_alg,
     149              :         data, data_size,
     150              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
     151              : #endif
     152            1 :     spdm_context->encap_context.req_slot_id = 0;
     153              : 
     154            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     155            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     156              : 
     157            1 :     response_size = sizeof(spdm_error_response_t);
     158            1 :     spdm_response = (void *)temp_buf;
     159            1 :     spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     160            1 :     spdm_response->header.request_response_code = SPDM_ERROR;
     161            1 :     spdm_response->header.param1 = 0;
     162            1 :     spdm_response->header.param2 = 0;
     163              : 
     164            1 :     status =   libspdm_process_encap_response_challenge_auth(spdm_context, response_size,
     165              :                                                              spdm_response,
     166              :                                                              NULL);
     167            1 :     assert_int_equal(status, LIBSPDM_STATUS_UNSUPPORTED_CAP);
     168            1 :     free(data);
     169            1 : }
     170              : 
     171              : 
     172            1 : void libspdm_test_responder_encap_challenge_case3(void **state)
     173              : {
     174              :     libspdm_return_t status;
     175              :     libspdm_test_context_t *spdm_test_context;
     176              :     libspdm_context_t *spdm_context;
     177              :     spdm_challenge_auth_response_t *spdm_response;
     178              :     uint8_t temp_buf[LIBSPDM_MAX_SPDM_MSG_SIZE];
     179              :     size_t response_size;
     180              :     void *data;
     181              :     size_t data_size;
     182              : 
     183            1 :     spdm_test_context = *state;
     184            1 :     spdm_context = spdm_test_context->spdm_context;
     185              : 
     186            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     187            1 :     spdm_context->connection_info.capability.flags = 0;
     188            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
     189            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     190              :                                                     m_libspdm_use_asym_algo, &data,
     191              :                                                     &data_size,
     192              :                                                     NULL, NULL);
     193            1 :     libspdm_reset_message_a(spdm_context);
     194            1 :     libspdm_reset_message_b(spdm_context);
     195            1 :     libspdm_reset_message_c(spdm_context);
     196              : 
     197            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     198            1 :     spdm_context->connection_info.algorithm.req_base_asym_alg = m_libspdm_use_req_asym_algo;
     199              : 
     200            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     201              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     202              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     203              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = data_size;
     204              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
     205              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
     206              :                      data, data_size);
     207              : #else
     208            1 :     libspdm_hash_all(
     209              :         spdm_context->connection_info.algorithm.base_hash_algo,
     210              :         data, data_size,
     211            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
     212            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
     213            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
     214            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
     215              :         spdm_context->connection_info.algorithm.base_hash_algo,
     216            1 :         spdm_context->connection_info.algorithm.req_base_asym_alg,
     217              :         data, data_size,
     218              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
     219              : #endif
     220            1 :     spdm_context->encap_context.req_slot_id = 0;
     221              : 
     222            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     223            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     224              : 
     225            1 :     response_size = sizeof(spdm_error_response_t);
     226            1 :     spdm_response = (void *)temp_buf;
     227            1 :     spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     228            1 :     spdm_response->header.request_response_code = SPDM_CERTIFICATE;
     229            1 :     spdm_response->header.param1 = 0;
     230            1 :     spdm_response->header.param2 = 0;
     231              : 
     232            1 :     status =   libspdm_process_encap_response_challenge_auth(spdm_context, response_size,
     233              :                                                              spdm_response,
     234              :                                                              NULL);
     235            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
     236            1 :     free(data);
     237            1 : }
     238              : 
     239            1 : void libspdm_test_responder_encap_challenge_case4(void **state)
     240              : {
     241              :     libspdm_return_t status;
     242              :     libspdm_test_context_t *spdm_test_context;
     243              :     libspdm_context_t *spdm_context;
     244              :     spdm_challenge_auth_response_t *spdm_response;
     245              :     uint8_t temp_buf[LIBSPDM_MAX_SPDM_MSG_SIZE];
     246              :     size_t response_size;
     247              :     void *data;
     248              :     size_t data_size;
     249              : 
     250            1 :     spdm_test_context = *state;
     251            1 :     spdm_context = spdm_test_context->spdm_context;
     252              : 
     253            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     254            1 :     spdm_context->connection_info.capability.flags = 0;
     255            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
     256            1 :     libspdm_read_responder_public_certificate_chain(m_libspdm_use_hash_algo,
     257              :                                                     m_libspdm_use_asym_algo, &data,
     258              :                                                     &data_size,
     259              :                                                     NULL, NULL);
     260            1 :     libspdm_reset_message_a(spdm_context);
     261            1 :     libspdm_reset_message_b(spdm_context);
     262            1 :     libspdm_reset_message_c(spdm_context);
     263              : 
     264            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     265            1 :     spdm_context->connection_info.algorithm.req_base_asym_alg = m_libspdm_use_req_asym_algo;
     266              : 
     267            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     268              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     269              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     270              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = data_size;
     271              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
     272              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
     273              :                      data, data_size);
     274              : #else
     275            1 :     libspdm_hash_all(
     276              :         spdm_context->connection_info.algorithm.base_hash_algo,
     277              :         data, data_size,
     278            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
     279            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
     280            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
     281            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
     282              :         spdm_context->connection_info.algorithm.base_hash_algo,
     283            1 :         spdm_context->connection_info.algorithm.req_base_asym_alg,
     284              :         data, data_size,
     285              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
     286              : #endif
     287            1 :     spdm_context->encap_context.req_slot_id = 0;
     288              : 
     289            1 :     spdm_context->local_context.local_cert_chain_provision_size[0] = data_size;
     290            1 :     spdm_context->local_context.local_cert_chain_provision[0] = data;
     291              : 
     292            1 :     response_size = sizeof(spdm_error_response_t);
     293            1 :     spdm_response = (void *)temp_buf;
     294            1 :     spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     295            1 :     spdm_response->header.request_response_code = SPDM_CHALLENGE_AUTH;
     296            1 :     spdm_response->header.param1 = 0;
     297            1 :     spdm_response->header.param2 = 0;
     298              : 
     299            1 :     status =   libspdm_process_encap_response_challenge_auth(spdm_context, response_size,
     300              :                                                              spdm_response,
     301              :                                                              NULL);
     302            1 :     assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
     303            1 :     free(data);
     304            1 : }
     305              : 
     306            1 : void libspdm_test_responder_encap_challenge_case5(void **state)
     307              : {
     308              :     libspdm_return_t status;
     309              :     libspdm_test_context_t *spdm_test_context;
     310              :     libspdm_context_t *spdm_context;
     311              :     spdm_challenge_auth_response_t *spdm_response;
     312              :     uint8_t temp_buf[LIBSPDM_MAX_SPDM_MSG_SIZE];
     313              :     size_t response_size;
     314              :     size_t sig_size;
     315              :     uint8_t *ptr;
     316              :     bool need_continue;
     317              :     void *data;
     318              :     size_t data_size;
     319              : 
     320            1 :     spdm_test_context = *state;
     321            1 :     spdm_context = spdm_test_context->spdm_context;
     322            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
     323              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     324            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     325            1 :     spdm_context->connection_info.capability.flags = 0;
     326            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
     327            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     328            1 :     spdm_context->connection_info.algorithm.req_base_asym_alg = m_libspdm_use_req_asym_algo;
     329              : 
     330            1 :     libspdm_read_requester_public_key(m_libspdm_use_req_asym_algo, &data, &data_size);
     331            1 :     spdm_context->local_context.peer_public_key_provision = data;
     332            1 :     spdm_context->local_context.peer_public_key_provision_size = data_size;
     333              : 
     334            1 :     spdm_context->encap_context.req_slot_id = 0xFF;
     335              : 
     336            1 :     libspdm_reset_message_a(spdm_context);
     337            1 :     libspdm_reset_message_b(spdm_context);
     338            1 :     libspdm_reset_message_c(spdm_context);
     339              : 
     340            1 :     sig_size = libspdm_get_asym_signature_size(m_libspdm_use_req_asym_algo);
     341            1 :     response_size = sizeof(spdm_challenge_auth_response_t) +
     342            1 :                     libspdm_get_hash_size(m_libspdm_use_hash_algo) +
     343            1 :                     SPDM_NONCE_SIZE + 0 + sizeof(uint16_t) + 0 + sig_size;
     344            1 :     spdm_response = (void *)temp_buf;
     345            1 :     spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
     346            1 :     spdm_response->header.request_response_code = SPDM_CHALLENGE_AUTH;
     347            1 :     spdm_response->header.param1 = (0xFF & SPDM_CHALLENGE_AUTH_RESPONSE_ATTRIBUTE_SLOT_ID_MASK);
     348            1 :     spdm_response->header.param2 = 0;
     349              : 
     350            1 :     ptr = (void *)(spdm_response + 1);
     351            1 :     libspdm_hash_all(m_libspdm_use_hash_algo, data, data_size, ptr);
     352            1 :     ptr += libspdm_get_hash_size(m_libspdm_use_hash_algo);
     353            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE, ptr);
     354            1 :     ptr += SPDM_NONCE_SIZE;
     355              : 
     356            1 :     *(uint16_t *)ptr = 0;
     357            1 :     ptr += sizeof(uint16_t);
     358              : 
     359            1 :     libspdm_requester_data_sign(
     360              :         spdm_context,
     361            1 :         spdm_response->header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     362              :             SPDM_CHALLENGE_AUTH,
     363              :             m_libspdm_use_req_asym_algo, m_libspdm_use_req_pqc_asym_algo, m_libspdm_use_hash_algo,
     364              :             false, (uint8_t*)spdm_response, response_size - sig_size,
     365              :             ptr, &sig_size);
     366              : 
     367            1 :     status = libspdm_process_encap_response_challenge_auth(spdm_context, response_size,
     368              :                                                            spdm_response,
     369              :                                                            &need_continue);
     370            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     371            1 :     free(data);
     372            1 : }
     373              : 
     374              : /**
     375              :  * Test 6: Successful case , With the correct challenge context field
     376              :  * Expected Behavior: client returns a status of RETURN_SUCCESS.
     377              :  **/
     378            1 : void libspdm_test_responder_encap_challenge_case6(void **state)
     379              : {
     380              :     libspdm_return_t status;
     381              :     libspdm_test_context_t *spdm_test_context;
     382              :     libspdm_context_t *spdm_context;
     383              :     spdm_challenge_auth_response_t *spdm_response;
     384              :     uint8_t temp_buf[LIBSPDM_SENDER_BUFFER_SIZE];
     385              :     uint8_t *ptr;
     386              :     size_t response_size;
     387              :     size_t sig_size;
     388              :     bool need_continue;
     389              :     void *data;
     390              :     size_t data_size;
     391              : 
     392            1 :     spdm_test_context = *state;
     393            1 :     spdm_context = spdm_test_context->spdm_context;
     394              : 
     395            1 :     spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
     396              :                                             SPDM_VERSION_NUMBER_SHIFT_BIT;
     397            1 :     spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
     398            1 :     spdm_context->connection_info.capability.flags = 0;
     399            1 :     spdm_context->connection_info.capability.flags |= SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP;
     400            1 :     spdm_context->connection_info.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
     401            1 :     spdm_context->connection_info.algorithm.req_base_asym_alg = m_libspdm_use_req_asym_algo;
     402            1 :     libspdm_read_requester_public_certificate_chain(m_libspdm_use_hash_algo,
     403              :                                                     m_libspdm_use_req_asym_algo, &data,
     404              :                                                     &data_size,
     405              :                                                     NULL, NULL);
     406            1 :     libspdm_reset_message_mut_c(spdm_context);
     407              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     408              :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_size = data_size;
     409              :     libspdm_copy_mem(spdm_context->connection_info.peer_used_cert_chain[0].buffer,
     410              :                      sizeof(spdm_context->connection_info.peer_used_cert_chain[0].buffer),
     411              :                      data, data_size);
     412              : #else
     413            1 :     libspdm_hash_all(
     414              :         spdm_context->connection_info.algorithm.base_hash_algo,
     415              :         data, data_size,
     416            1 :         spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash);
     417            1 :     spdm_context->connection_info.peer_used_cert_chain[0].buffer_hash_size =
     418            1 :         libspdm_get_hash_size(spdm_context->connection_info.algorithm.base_hash_algo);
     419            1 :     libspdm_get_leaf_cert_public_key_from_cert_chain(
     420              :         spdm_context->connection_info.algorithm.base_hash_algo,
     421            1 :         spdm_context->connection_info.algorithm.req_base_asym_alg,
     422              :         data, data_size,
     423              :         &spdm_context->connection_info.peer_used_cert_chain[0].leaf_cert_public_key);
     424              : #endif
     425            1 :     spdm_context->encap_context.req_slot_id = 0;
     426            1 :     libspdm_set_mem(m_requester_context, SPDM_REQ_CONTEXT_SIZE, 0xAA);
     427            1 :     libspdm_copy_mem(spdm_context->encap_context.req_context, SPDM_REQ_CONTEXT_SIZE,
     428              :                      m_requester_context, SPDM_REQ_CONTEXT_SIZE);
     429              : 
     430              : 
     431            1 :     sig_size = libspdm_get_asym_signature_size(m_libspdm_use_req_asym_algo);
     432            1 :     response_size = sizeof(spdm_challenge_auth_response_t) +
     433            1 :                     libspdm_get_hash_size(m_libspdm_use_hash_algo) +
     434            1 :                     SPDM_NONCE_SIZE + 0 + sizeof(uint16_t) + 0 + SPDM_REQ_CONTEXT_SIZE + sig_size;
     435            1 :     spdm_response = (void *)temp_buf;
     436            1 :     spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
     437            1 :     spdm_response->header.request_response_code = SPDM_CHALLENGE_AUTH;
     438            1 :     spdm_response->header.param1 = 0;
     439            1 :     spdm_response->header.param2 = (1 << 0);
     440              : 
     441            1 :     ptr = (void *)(spdm_response + 1);
     442            1 :     libspdm_hash_all(m_libspdm_use_hash_algo, data, data_size, ptr);
     443            1 :     ptr += libspdm_get_hash_size(m_libspdm_use_hash_algo);
     444            1 :     libspdm_get_random_number(SPDM_NONCE_SIZE, ptr);
     445            1 :     ptr += SPDM_NONCE_SIZE;
     446              : 
     447            1 :     *(uint16_t *)ptr = 0;
     448            1 :     ptr += sizeof(uint16_t);
     449              : 
     450            1 :     libspdm_set_mem(ptr, SPDM_REQ_CONTEXT_SIZE, 0xAA);
     451            1 :     ptr += SPDM_REQ_CONTEXT_SIZE;
     452              : 
     453            1 :     libspdm_requester_data_sign(
     454              :         spdm_context,
     455            1 :         spdm_response->header.spdm_version << SPDM_VERSION_NUMBER_SHIFT_BIT,
     456              :             SPDM_CHALLENGE_AUTH,
     457              :             m_libspdm_use_req_asym_algo, m_libspdm_use_req_pqc_asym_algo, m_libspdm_use_hash_algo,
     458              :             false, (uint8_t*)spdm_response, response_size - sig_size,
     459              :             ptr, &sig_size);
     460              : 
     461            1 :     status =  libspdm_process_encap_response_challenge_auth(spdm_context, response_size,
     462              :                                                             spdm_response,
     463              :                                                             &need_continue);
     464            1 :     assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
     465              : 
     466              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     467              :     assert_int_equal(spdm_context->transcript.message_mut_c.buffer_size, 0);
     468              : #else
     469            1 :     assert_null(spdm_context->transcript.digest_context_mut_m1m2);
     470              : #endif
     471            1 :     free(data);
     472            1 : }
     473              : 
     474            1 : int libspdm_responder_encap_challenge_auth_test_main(void)
     475              : {
     476            1 :     const struct CMUnitTest spdm_responder_challenge_tests[] = {
     477              :         cmocka_unit_test(libspdm_test_responder_encap_challenge_case1),
     478              :         /* Error response: SPDM_ERROR*/
     479              :         cmocka_unit_test(libspdm_test_responder_encap_challenge_case2),
     480              :         /* Error request_response_code  : SPDM_CERTIFICATE */
     481              :         cmocka_unit_test(libspdm_test_responder_encap_challenge_case3),
     482              :         /* Error spdm_response_size */
     483              :         cmocka_unit_test(libspdm_test_responder_encap_challenge_case4),
     484              :         /* Success Case, use provisioned public key (slot 0xFF) */
     485              :         cmocka_unit_test(libspdm_test_responder_encap_challenge_case5),
     486              :         /* Success Case, V1.3 With the correct challenge context field */
     487              :         cmocka_unit_test(libspdm_test_responder_encap_challenge_case6),
     488              :     };
     489              : 
     490            1 :     libspdm_test_context_t test_context = {
     491              :         LIBSPDM_TEST_CONTEXT_VERSION,
     492              :         false,
     493              :     };
     494              : 
     495            1 :     libspdm_setup_test_context(&test_context);
     496              : 
     497            1 :     return cmocka_run_group_tests(spdm_responder_challenge_tests,
     498              :                                   libspdm_unit_test_group_setup,
     499              :                                   libspdm_unit_test_group_teardown);
     500              : }
     501              : 
     502              : #endif /* (LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP) && (...) */
        

Generated by: LCOV version 2.0-1