LCOV - code coverage report
Current view: top level - library/spdm_secured_message_lib - libspdm_secmes_context_data.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 51.3 % 156 80
Test Date: 2026-02-22 08:11:49 Functions: 82.4 % 17 14

            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          236 : size_t libspdm_secured_message_get_context_size(void)
      10              : {
      11          236 :     return sizeof(libspdm_secured_message_context_t);
      12              : }
      13              : 
      14         1210 : void libspdm_secured_message_init_context(void *spdm_secured_message_context)
      15              : {
      16              :     libspdm_secured_message_context_t *secured_message_context;
      17              : 
      18         1210 :     secured_message_context = spdm_secured_message_context;
      19         1210 :     libspdm_zero_mem(secured_message_context, sizeof(libspdm_secured_message_context_t));
      20         1210 : }
      21              : 
      22          742 : void libspdm_secured_message_set_use_psk(void *spdm_secured_message_context, bool use_psk)
      23              : {
      24              :     libspdm_secured_message_context_t *secured_message_context;
      25              : 
      26          742 :     secured_message_context = spdm_secured_message_context;
      27          742 :     secured_message_context->use_psk = use_psk;
      28          742 : }
      29              : 
      30          448 : void libspdm_secured_message_set_session_state(
      31              :     void *spdm_secured_message_context,
      32              :     libspdm_session_state_t session_state)
      33              : {
      34              :     libspdm_secured_message_context_t *secured_message_context;
      35              : 
      36          448 :     secured_message_context = spdm_secured_message_context;
      37          448 :     secured_message_context->session_state = session_state;
      38              : 
      39          448 :     if (session_state == LIBSPDM_SESSION_STATE_ESTABLISHED) {
      40              :         /* session handshake key should be zeroized after handshake phase. */
      41          264 :         libspdm_clear_handshake_secret(secured_message_context);
      42          264 :         libspdm_clear_master_secret(secured_message_context);
      43              :     }
      44          448 : }
      45              : 
      46              : libspdm_session_state_t
      47          558 : libspdm_secured_message_get_session_state(void *spdm_secured_message_context)
      48              : {
      49              :     libspdm_secured_message_context_t *secured_message_context;
      50              : 
      51          558 :     secured_message_context = spdm_secured_message_context;
      52          558 :     return secured_message_context->session_state;
      53              : }
      54              : 
      55          742 : void libspdm_secured_message_set_session_type(void *spdm_secured_message_context,
      56              :                                               libspdm_session_type_t session_type)
      57              : {
      58              :     libspdm_secured_message_context_t *secured_message_context;
      59              : 
      60          742 :     secured_message_context = spdm_secured_message_context;
      61          742 :     secured_message_context->session_type = session_type;
      62          742 : }
      63              : 
      64          742 : void libspdm_secured_message_set_algorithms(void *spdm_secured_message_context,
      65              :                                             spdm_version_number_t version,
      66              :                                             spdm_version_number_t secured_message_version,
      67              :                                             uint32_t base_hash_algo,
      68              :                                             uint16_t dhe_named_group,
      69              :                                             uint32_t kem_alg,
      70              :                                             uint16_t aead_cipher_suite,
      71              :                                             uint16_t key_schedule)
      72              : {
      73              :     libspdm_secured_message_context_t *secured_message_context;
      74              : 
      75          742 :     secured_message_context = spdm_secured_message_context;
      76          742 :     secured_message_context->version = version;
      77          742 :     secured_message_context->secured_message_version = secured_message_version;
      78          742 :     secured_message_context->base_hash_algo = base_hash_algo;
      79          742 :     secured_message_context->dhe_named_group = dhe_named_group;
      80          742 :     secured_message_context->kem_alg = kem_alg;
      81          742 :     secured_message_context->aead_cipher_suite = aead_cipher_suite;
      82          742 :     secured_message_context->key_schedule = key_schedule;
      83              : 
      84          742 :     secured_message_context->hash_size =
      85          742 :         libspdm_get_hash_size(secured_message_context->base_hash_algo);
      86          742 :     if (kem_alg != 0) {
      87            0 :         secured_message_context->shared_key_size = libspdm_get_kem_shared_secret_size(
      88              :             secured_message_context->kem_alg);
      89              :     } else {
      90          742 :         secured_message_context->shared_key_size = libspdm_get_dhe_shared_secret_size(
      91          742 :             secured_message_context->dhe_named_group);
      92              :     }
      93         1484 :     secured_message_context->aead_key_size = libspdm_get_aead_key_size(
      94          742 :         secured_message_context->aead_cipher_suite);
      95         1484 :     secured_message_context->aead_iv_size = libspdm_get_aead_iv_size(
      96          742 :         secured_message_context->aead_cipher_suite);
      97         1484 :     secured_message_context->aead_tag_size = libspdm_get_aead_tag_size(
      98          742 :         secured_message_context->aead_cipher_suite);
      99          742 : }
     100              : 
     101              : #if LIBSPDM_ENABLE_CAPABILITY_PSK_CAP
     102           77 : void libspdm_secured_message_set_psk_hint(void *spdm_secured_message_context,
     103              :                                           const void *psk_hint,
     104              :                                           size_t psk_hint_size)
     105              : {
     106              :     libspdm_secured_message_context_t *secured_message_context;
     107              : 
     108           77 :     secured_message_context = spdm_secured_message_context;
     109           77 :     if ((psk_hint != NULL) && (psk_hint_size > 0)) {
     110           75 :         secured_message_context->psk_hint_size = psk_hint_size;
     111           75 :         libspdm_copy_mem(secured_message_context->psk_hint,
     112              :                          LIBSPDM_PSK_MAX_HINT_LENGTH,
     113              :                          psk_hint,
     114              :                          psk_hint_size);
     115              :     }
     116           77 : }
     117              : #endif /* LIBSPDM_ENABLE_CAPABILITY_PSK_CAP */
     118              : 
     119          742 : void libspdm_secured_message_set_max_spdm_session_sequence_number(
     120              :     void *spdm_secured_message_context,
     121              :     uint64_t max_spdm_session_sequence_number)
     122              : {
     123              :     libspdm_secured_message_context_t *secured_message_context;
     124              : 
     125          742 :     secured_message_context = spdm_secured_message_context;
     126          742 :     secured_message_context->max_spdm_session_sequence_number = max_spdm_session_sequence_number;
     127          742 : }
     128              : 
     129          742 : void libspdm_secured_message_set_sequence_number_endian (
     130              :     void *spdm_secured_message_context,
     131              :     uint8_t endian_value)
     132              : {
     133              :     libspdm_secured_message_context_t *secured_message_context;
     134              : 
     135          742 :     secured_message_context = spdm_secured_message_context;
     136          742 :     secured_message_context->sequence_number_endian = endian_value;
     137          742 : }
     138              : 
     139            0 : bool libspdm_secured_message_import_shared_secret(void *spdm_secured_message_context,
     140              :                                                   const void *shared_secret,
     141              :                                                   size_t shared_secret_size)
     142              : {
     143              :     libspdm_secured_message_context_t *secured_message_context;
     144              : 
     145            0 :     secured_message_context = spdm_secured_message_context;
     146            0 :     if (shared_secret_size > secured_message_context->shared_key_size) {
     147            0 :         return false;
     148              :     }
     149            0 :     secured_message_context->shared_key_size = shared_secret_size;
     150            0 :     libspdm_copy_mem(secured_message_context->master_secret.shared_secret,
     151              :                      sizeof(secured_message_context->master_secret.shared_secret),
     152              :                      shared_secret, shared_secret_size);
     153            0 :     return true;
     154              : }
     155              : 
     156            3 : bool libspdm_secured_message_export_master_secret(
     157              :     void *spdm_secured_message_context, void *export_master_secret,
     158              :     size_t *export_master_secret_size)
     159              : {
     160              :     libspdm_secured_message_context_t *secured_message_context;
     161              : 
     162            3 :     secured_message_context = spdm_secured_message_context;
     163              : 
     164            3 :     if (*export_master_secret_size > secured_message_context->hash_size) {
     165            1 :         *export_master_secret_size = secured_message_context->hash_size;
     166              :     }
     167              : 
     168            3 :     libspdm_copy_mem(export_master_secret, *export_master_secret_size,
     169            3 :                      secured_message_context->export_master_secret,
     170              :                      *export_master_secret_size);
     171              : 
     172            3 :     return true;
     173              : }
     174              : 
     175            1 : void libspdm_secured_message_clear_export_master_secret(void *spdm_secured_message_context)
     176              : {
     177              :     libspdm_secured_message_context_t *secured_message_context;
     178              : 
     179            1 :     LIBSPDM_ASSERT(spdm_secured_message_context != NULL);
     180              : 
     181            1 :     secured_message_context = spdm_secured_message_context;
     182              : 
     183            1 :     libspdm_zero_mem(secured_message_context->export_master_secret,
     184              :                      sizeof(secured_message_context->export_master_secret));
     185            1 : }
     186              : 
     187            0 : bool libspdm_secured_message_export_session_keys(void *spdm_secured_message_context,
     188              :                                                  void *session_keys,
     189              :                                                  size_t *session_keys_size)
     190              : {
     191              :     libspdm_secured_message_context_t *secured_message_context;
     192              :     size_t struct_size;
     193              :     libspdm_secure_session_keys_struct_t *session_keys_struct;
     194              :     uint8_t *ptr;
     195              : 
     196            0 :     secured_message_context = spdm_secured_message_context;
     197            0 :     struct_size = sizeof(libspdm_secure_session_keys_struct_t) +
     198            0 :                   (secured_message_context->aead_key_size +
     199            0 :                    secured_message_context->aead_iv_size + sizeof(uint64_t)) * 2;
     200              : 
     201            0 :     if (*session_keys_size < struct_size) {
     202            0 :         *session_keys_size = struct_size;
     203            0 :         return false;
     204              :     }
     205              : 
     206            0 :     session_keys_struct = session_keys;
     207            0 :     session_keys_struct->version = LIBSPDM_SECURE_SESSION_KEYS_STRUCT_VERSION;
     208            0 :     session_keys_struct->aead_key_size = (uint32_t)secured_message_context->aead_key_size;
     209            0 :     session_keys_struct->aead_iv_size = (uint32_t)secured_message_context->aead_iv_size;
     210              : 
     211            0 :     ptr = (void *)(session_keys_struct + 1);
     212            0 :     libspdm_copy_mem(ptr,
     213            0 :                      *session_keys_size - (ptr - (uint8_t*)session_keys),
     214            0 :                      secured_message_context->application_secret.request_data_encryption_key,
     215              :                      secured_message_context->aead_key_size);
     216            0 :     ptr += secured_message_context->aead_key_size;
     217            0 :     libspdm_copy_mem(ptr,
     218            0 :                      *session_keys_size - (ptr - (uint8_t*)session_keys),
     219            0 :                      secured_message_context->application_secret.request_data_salt,
     220              :                      secured_message_context->aead_iv_size);
     221            0 :     ptr += secured_message_context->aead_iv_size;
     222            0 :     libspdm_copy_mem(ptr,
     223            0 :                      *session_keys_size - (ptr - (uint8_t*)session_keys),
     224            0 :                      &secured_message_context->application_secret.request_data_sequence_number,
     225              :                      sizeof(uint64_t));
     226            0 :     ptr += sizeof(uint64_t);
     227            0 :     libspdm_copy_mem(ptr,
     228            0 :                      *session_keys_size - (ptr - (uint8_t*)session_keys),
     229            0 :                      secured_message_context->application_secret.response_data_encryption_key,
     230              :                      secured_message_context->aead_key_size);
     231            0 :     ptr += secured_message_context->aead_key_size;
     232            0 :     libspdm_copy_mem(ptr,
     233            0 :                      *session_keys_size - (ptr - (uint8_t*)session_keys),
     234            0 :                      secured_message_context->application_secret.response_data_salt,
     235              :                      secured_message_context->aead_iv_size);
     236            0 :     ptr += secured_message_context->aead_iv_size;
     237            0 :     libspdm_copy_mem(ptr,
     238            0 :                      *session_keys_size - (ptr - (uint8_t*)session_keys),
     239            0 :                      &secured_message_context->application_secret.response_data_sequence_number,
     240              :                      sizeof(uint64_t));
     241            0 :     ptr += sizeof(uint64_t);
     242            0 :     return true;
     243              : }
     244              : 
     245            0 : bool libspdm_secured_message_import_session_keys(void *spdm_secured_message_context,
     246              :                                                  const void *session_keys,
     247              :                                                  size_t session_keys_size)
     248              : {
     249              :     libspdm_secured_message_context_t *secured_message_context;
     250              :     size_t struct_size;
     251              :     const libspdm_secure_session_keys_struct_t *session_keys_struct;
     252              :     const uint8_t *ptr;
     253              : 
     254            0 :     secured_message_context = spdm_secured_message_context;
     255            0 :     struct_size = sizeof(libspdm_secure_session_keys_struct_t) +
     256            0 :                   (secured_message_context->aead_key_size +
     257            0 :                    secured_message_context->aead_iv_size + sizeof(uint64_t)) * 2;
     258              : 
     259            0 :     if (session_keys_size != struct_size) {
     260            0 :         return false;
     261              :     }
     262              : 
     263            0 :     session_keys_struct = session_keys;
     264            0 :     if ((session_keys_struct->version !=
     265            0 :          LIBSPDM_SECURE_SESSION_KEYS_STRUCT_VERSION) ||
     266            0 :         (session_keys_struct->aead_key_size !=
     267            0 :          secured_message_context->aead_key_size) ||
     268            0 :         (session_keys_struct->aead_iv_size !=
     269            0 :          secured_message_context->aead_iv_size)) {
     270            0 :         return false;
     271              :     }
     272              : 
     273            0 :     ptr = (const void *)(session_keys_struct + 1);
     274            0 :     libspdm_copy_mem(secured_message_context->application_secret.request_data_encryption_key,
     275              :                      sizeof(secured_message_context->application_secret
     276              :                             .request_data_encryption_key),
     277              :                      ptr, secured_message_context->aead_key_size);
     278            0 :     ptr += secured_message_context->aead_key_size;
     279            0 :     libspdm_copy_mem(secured_message_context->application_secret.request_data_salt,
     280              :                      sizeof(secured_message_context->application_secret
     281              :                             .request_data_salt),
     282              :                      ptr, secured_message_context->aead_iv_size);
     283            0 :     ptr += secured_message_context->aead_iv_size;
     284            0 :     libspdm_copy_mem(&secured_message_context->application_secret.request_data_sequence_number,
     285              :                      sizeof(secured_message_context->application_secret
     286              :                             .request_data_sequence_number),
     287              :                      ptr, sizeof(uint64_t));
     288            0 :     ptr += sizeof(uint64_t);
     289            0 :     libspdm_copy_mem(secured_message_context->application_secret
     290            0 :                      .response_data_encryption_key,
     291              :                      sizeof(secured_message_context->application_secret
     292              :                             .response_data_encryption_key),
     293              :                      ptr, secured_message_context->aead_key_size);
     294            0 :     ptr += secured_message_context->aead_key_size;
     295            0 :     libspdm_copy_mem(secured_message_context->application_secret.response_data_salt,
     296              :                      sizeof(secured_message_context->application_secret.response_data_salt),
     297              :                      ptr, secured_message_context->aead_iv_size);
     298            0 :     ptr += secured_message_context->aead_iv_size;
     299            0 :     libspdm_copy_mem(&secured_message_context->application_secret.response_data_sequence_number,
     300              :                      sizeof(secured_message_context->application_secret
     301              :                             .response_data_sequence_number),
     302              :                      ptr, sizeof(uint64_t));
     303            0 :     ptr += sizeof(uint64_t);
     304            0 :     return true;
     305              : }
     306              : 
     307           28 : void libspdm_secured_message_get_last_spdm_error_struct(
     308              :     void *spdm_secured_message_context,
     309              :     libspdm_error_struct_t *last_spdm_error)
     310              : {
     311              :     libspdm_secured_message_context_t *secured_message_context;
     312              : 
     313           28 :     secured_message_context = spdm_secured_message_context;
     314           28 :     libspdm_copy_mem(last_spdm_error, sizeof(libspdm_error_struct_t),
     315           28 :                      &secured_message_context->last_spdm_error,
     316              :                      sizeof(libspdm_error_struct_t));
     317           28 : }
     318              : 
     319          337 : void libspdm_secured_message_set_last_spdm_error_struct(
     320              :     void *spdm_secured_message_context,
     321              :     const libspdm_error_struct_t *last_spdm_error)
     322              : {
     323              :     libspdm_secured_message_context_t *secured_message_context;
     324              : 
     325          337 :     secured_message_context = spdm_secured_message_context;
     326          337 :     libspdm_copy_mem(&secured_message_context->last_spdm_error,
     327              :                      sizeof(secured_message_context->last_spdm_error),
     328              :                      last_spdm_error,
     329              :                      sizeof(libspdm_error_struct_t));
     330          337 : }
        

Generated by: LCOV version 2.0-1