LCOV - code coverage report
Current view: top level - library/spdm_common_lib - libspdm_com_context_data_session.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 75.9 % 116 88
Test Date: 2026-02-22 08:11:49 Functions: 87.5 % 8 7

            Line data    Source code
       1              : /**
       2              :  *  Copyright Notice:
       3              :  *  Copyright 2021-2026 DMTF. All rights reserved.
       4              :  *  License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
       5              :  **/
       6              : 
       7              : #include "internal/libspdm_secured_message_lib.h"
       8              : 
       9          742 : void libspdm_session_info_init(libspdm_context_t *spdm_context,
      10              :                                libspdm_session_info_t *session_info,
      11              :                                uint32_t session_id, spdm_version_number_t secured_message_version,
      12              :                                bool use_psk)
      13              : {
      14              :     libspdm_session_type_t session_type;
      15              :     uint32_t capabilities_flag;
      16              : 
      17          742 :     if (session_id != INVALID_SESSION_ID) {
      18          451 :         if (use_psk) {
      19          335 :             LIBSPDM_ASSERT((spdm_context->max_psk_session_count == 0) ||
      20              :                            (spdm_context->current_psk_session_count <
      21              :                             spdm_context->max_psk_session_count));
      22          335 :             spdm_context->current_psk_session_count++;
      23              :         } else {
      24          116 :             LIBSPDM_ASSERT((spdm_context->max_dhe_session_count == 0) ||
      25              :                            (spdm_context->current_dhe_session_count <
      26              :                             spdm_context->max_dhe_session_count));
      27          116 :             spdm_context->current_dhe_session_count++;
      28              :         }
      29              :     } else {
      30          291 :         if (use_psk) {
      31           58 :             if (spdm_context->current_psk_session_count > 0) {
      32           58 :                 spdm_context->current_psk_session_count--;
      33              :             }
      34              :         } else {
      35          233 :             if (spdm_context->current_dhe_session_count > 0) {
      36           62 :                 spdm_context->current_dhe_session_count--;
      37              :             }
      38              :         }
      39              :     }
      40              : 
      41          742 :     capabilities_flag = spdm_context->connection_info.capability.flags &
      42          742 :                         spdm_context->local_context.capability.flags;
      43          742 :     switch (capabilities_flag &
      44              :             (SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP |
      45              :              SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP)) {
      46          249 :     case 0:
      47          249 :         session_type = LIBSPDM_SESSION_TYPE_NONE;
      48          249 :         break;
      49          379 :     case (SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCRYPT_CAP |
      50              :           SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP):
      51          379 :         session_type = LIBSPDM_SESSION_TYPE_ENC_MAC;
      52          379 :         break;
      53          114 :     case SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MAC_CAP:
      54          114 :         session_type = LIBSPDM_SESSION_TYPE_MAC_ONLY;
      55          114 :         break;
      56            0 :     default:
      57            0 :         LIBSPDM_ASSERT(false);
      58            0 :         session_type = LIBSPDM_SESSION_TYPE_MAX;
      59            0 :         break;
      60              :     }
      61              : 
      62              : #if !(LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT)
      63          742 :     if (session_info->session_transcript.digest_context_th != NULL) {
      64          132 :         libspdm_hash_free (spdm_context->connection_info.algorithm.base_hash_algo,
      65              :                            session_info->session_transcript.digest_context_th);
      66          132 :         session_info->session_transcript.digest_context_th = NULL;
      67              :     }
      68          742 :     if (session_info->session_transcript.digest_context_th_backup != NULL) {
      69           63 :         libspdm_hash_free (spdm_context->connection_info.algorithm.base_hash_algo,
      70              :                            session_info->session_transcript.digest_context_th_backup);
      71           63 :         session_info->session_transcript.digest_context_th_backup = NULL;
      72              :     }
      73              : #endif
      74              : 
      75          742 :     libspdm_zero_mem (&(session_info->last_key_update_request), sizeof(spdm_key_update_request_t));
      76          742 :     libspdm_zero_mem(session_info, offsetof(libspdm_session_info_t, secured_message_context));
      77          742 :     libspdm_secured_message_init_context(session_info->secured_message_context);
      78          742 :     session_info->session_id = session_id;
      79          742 :     session_info->use_psk = use_psk;
      80          742 :     libspdm_secured_message_set_use_psk(session_info->secured_message_context, use_psk);
      81          742 :     libspdm_secured_message_set_session_type(session_info->secured_message_context, session_type);
      82              : 
      83              :     /* DSP0277 1.2 explicitly specifies a little-endian sequence number. 1.0 and 1.1 leave it up to
      84              :      * the Integrator to specify. */
      85          742 :     if ((secured_message_version >> SPDM_VERSION_NUMBER_SHIFT_BIT) >= SECURED_SPDM_VERSION_12) {
      86           15 :         libspdm_secured_message_set_sequence_number_endian(
      87              :             session_info->secured_message_context,
      88              :             LIBSPDM_DATA_SESSION_SEQ_NUM_ENC_LITTLE_DEC_LITTLE);
      89              :     } else {
      90          727 :         libspdm_secured_message_set_sequence_number_endian(session_info->secured_message_context,
      91          727 :                                                            spdm_context->sequence_number_endian);
      92              :     }
      93              : 
      94          742 :     libspdm_secured_message_set_max_spdm_session_sequence_number(
      95              :         session_info->secured_message_context, spdm_context->max_spdm_session_sequence_number);
      96          742 :     libspdm_secured_message_set_algorithms(
      97              :         session_info->secured_message_context,
      98          742 :         spdm_context->connection_info.version,
      99              :         secured_message_version,
     100              :         spdm_context->connection_info.algorithm.base_hash_algo,
     101          742 :         spdm_context->connection_info.algorithm.dhe_named_group,
     102              :         spdm_context->connection_info.algorithm.kem_alg,
     103          742 :         spdm_context->connection_info.algorithm.aead_cipher_suite,
     104          742 :         spdm_context->connection_info.algorithm.key_schedule);
     105          742 :     session_info->session_transcript.message_encap_d.max_buffer_size =
     106              :         sizeof(session_info->session_transcript.message_encap_d.buffer);
     107              : #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
     108              :     session_info->session_transcript.message_k.max_buffer_size =
     109              :         sizeof(session_info->session_transcript.message_k.buffer);
     110              :     session_info->session_transcript.message_f.max_buffer_size =
     111              :         sizeof(session_info->session_transcript.message_f.buffer);
     112              :     session_info->session_transcript.message_m.max_buffer_size =
     113              :         sizeof(session_info->session_transcript.message_m.buffer);
     114              :     session_info->session_transcript.message_e.max_buffer_size =
     115              :         sizeof(session_info->session_transcript.message_e.buffer);
     116              :     session_info->session_transcript.message_encap_e.max_buffer_size =
     117              :         sizeof(session_info->session_transcript.message_encap_e.buffer);
     118              : #endif
     119          742 : }
     120              : 
     121              : #if LIBSPDM_ENABLE_CAPABILITY_PSK_CAP
     122           77 : void libspdm_session_info_set_psk_hint(libspdm_session_info_t *session_info,
     123              :                                        const void *psk_hint,
     124              :                                        size_t psk_hint_size)
     125              : {
     126           77 :     libspdm_secured_message_set_psk_hint(
     127              :         session_info->secured_message_context,
     128              :         psk_hint,
     129              :         psk_hint_size);
     130           77 : }
     131              : #endif /* LIBSPDM_ENABLE_CAPABILITY_PSK_CAP */
     132              : 
     133         1648 : void *libspdm_get_session_info_via_session_id(void *spdm_context, uint32_t session_id)
     134              : {
     135              :     libspdm_context_t *context;
     136              :     libspdm_session_info_t *session_info;
     137              :     size_t index;
     138              : 
     139         1648 :     if (session_id == INVALID_SESSION_ID) {
     140            0 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_ERROR,
     141              :                        "libspdm_get_session_info_via_session_id - Invalid session_id\n"));
     142            0 :         LIBSPDM_ASSERT(false);
     143            0 :         return NULL;
     144              :     }
     145              : 
     146         1648 :     context = spdm_context;
     147              : 
     148         1648 :     session_info = (libspdm_session_info_t *)context->session_info;
     149         1649 :     for (index = 0; index < LIBSPDM_MAX_SESSION_COUNT; index++) {
     150         1649 :         if (session_info[index].session_id == session_id) {
     151         1648 :             return &session_info[index];
     152              :         }
     153              :     }
     154              : 
     155            0 :     LIBSPDM_DEBUG((LIBSPDM_DEBUG_ERROR,
     156              :                    "libspdm_get_session_info_via_session_id - not found session_id\n"));
     157            0 :     return NULL;
     158              : }
     159              : 
     160          845 : void *libspdm_get_secured_message_context_via_session_id(void *spdm_context, uint32_t session_id)
     161              : {
     162              :     libspdm_session_info_t *session_info;
     163              : 
     164          845 :     session_info = libspdm_get_session_info_via_session_id(spdm_context, session_id);
     165          845 :     if (session_info == NULL) {
     166            0 :         return NULL;
     167              :     } else {
     168          845 :         return session_info->secured_message_context;
     169              :     }
     170              : }
     171              : 
     172            0 : void *libspdm_get_secured_message_context_via_session_info(void *spdm_session_info)
     173              : {
     174              :     libspdm_session_info_t *session_info;
     175              : 
     176            0 :     session_info = spdm_session_info;
     177            0 :     if (session_info == NULL) {
     178            0 :         return NULL;
     179              :     } else {
     180            0 :         return session_info->secured_message_context;
     181              :     }
     182              : }
     183              : 
     184           84 : uint32_t libspdm_generate_session_id(uint16_t req_session_id, uint16_t rsp_session_id)
     185              : {
     186              :     uint32_t session_id;
     187           84 :     session_id = (rsp_session_id << 16) | req_session_id;
     188           84 :     return session_id;
     189              : }
     190              : 
     191           84 : libspdm_session_info_t *libspdm_assign_session_id(libspdm_context_t *spdm_context,
     192              :                                                   uint32_t session_id,
     193              :                                                   spdm_version_number_t secured_message_version,
     194              :                                                   bool use_psk)
     195              : {
     196              :     libspdm_session_info_t *session_info;
     197              :     size_t index;
     198              : 
     199           84 :     if (session_id == INVALID_SESSION_ID) {
     200            0 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_ERROR, "libspdm_assign_session_id - Invalid session_id\n"));
     201            0 :         LIBSPDM_ASSERT(false);
     202            0 :         return NULL;
     203              :     }
     204              : 
     205           84 :     session_info = spdm_context->session_info;
     206              : 
     207          420 :     for (index = 0; index < LIBSPDM_MAX_SESSION_COUNT; index++) {
     208          336 :         if (session_info[index].session_id == session_id) {
     209            0 :             LIBSPDM_DEBUG((LIBSPDM_DEBUG_ERROR,
     210              :                            "libspdm_assign_session_id - Duplicated session_id\n"));
     211            0 :             LIBSPDM_ASSERT(false);
     212            0 :             return NULL;
     213              :         }
     214              :     }
     215              : 
     216          130 :     for (index = 0; index < LIBSPDM_MAX_SESSION_COUNT; index++) {
     217          130 :         if (session_info[index].session_id == INVALID_SESSION_ID) {
     218           84 :             libspdm_session_info_init(spdm_context,
     219           84 :                                       &session_info[index], session_id, secured_message_version,
     220              :                                       use_psk);
     221           84 :             spdm_context->latest_session_id = session_id;
     222           84 :             return &session_info[index];
     223              :         }
     224              :     }
     225              : 
     226            0 :     LIBSPDM_DEBUG((LIBSPDM_DEBUG_ERROR, "libspdm_assign_session_id - MAX session_id\n"));
     227            0 :     return NULL;
     228              : }
     229              : 
     230          112 : void libspdm_free_session_id(libspdm_context_t *spdm_context, uint32_t session_id)
     231              : {
     232              :     libspdm_session_info_t *session_info;
     233              :     size_t index;
     234              : 
     235          112 :     if (session_id == INVALID_SESSION_ID) {
     236            0 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_ERROR, "libspdm_free_session_id - Invalid session_id\n"));
     237            0 :         LIBSPDM_ASSERT(false);
     238            0 :         return;
     239              :     }
     240              : 
     241          112 :     if (spdm_context->latest_session_id == session_id) {
     242           42 :         spdm_context->latest_session_id = INVALID_SESSION_ID;
     243              :     }
     244              : 
     245          112 :     session_info = spdm_context->session_info;
     246          114 :     for (index = 0; index < LIBSPDM_MAX_SESSION_COUNT; index++) {
     247          114 :         if (session_info[index].session_id == session_id) {
     248          112 :             libspdm_session_info_init(spdm_context,
     249          112 :                                       &session_info[index],
     250              :                                       INVALID_SESSION_ID, 0,
     251          112 :                                       session_info[index].use_psk);
     252          112 :             return;
     253              :         }
     254              :     }
     255              : 
     256            0 :     LIBSPDM_DEBUG((LIBSPDM_DEBUG_ERROR, "libspdm_free_session_id - MAX session_id\n"));
     257            0 :     LIBSPDM_ASSERT(false);
     258              : }
        

Generated by: LCOV version 2.0-1