LCOV - code coverage report
Current view: top level - library/spdm_secured_message_lib - libspdm_secmes_session.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 78.6 % 318 250
Test Date: 2026-02-22 08:11:49 Functions: 45.5 % 22 10

            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          290 : static bool libspdm_generate_aead_key_and_iv(
      10              :     libspdm_secured_message_context_t *secured_message_context,
      11              :     const uint8_t *major_secret, uint8_t *key, uint8_t *iv)
      12              : {
      13              :     bool status;
      14              :     size_t hash_size;
      15              :     size_t key_length;
      16              :     size_t iv_length;
      17              :     uint8_t bin_str5[128];
      18              :     size_t bin_str5_size;
      19              :     uint8_t bin_str6[128];
      20              :     size_t bin_str6_size;
      21              : 
      22          290 :     hash_size = secured_message_context->hash_size;
      23          290 :     key_length = secured_message_context->aead_key_size;
      24          290 :     iv_length = secured_message_context->aead_iv_size;
      25              : 
      26          290 :     bin_str5_size = sizeof(bin_str5);
      27          290 :     libspdm_bin_concat(secured_message_context->version,
      28              :                        SPDM_BIN_STR_5_LABEL, sizeof(SPDM_BIN_STR_5_LABEL) - 1,
      29          290 :                        NULL, (uint16_t)key_length, hash_size, bin_str5,
      30              :                        &bin_str5_size);
      31              : 
      32          290 :     LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "bin_str5 (0x%zx):\n", bin_str5_size));
      33          290 :     LIBSPDM_INTERNAL_DUMP_HEX(bin_str5, bin_str5_size);
      34          290 :     status = libspdm_hkdf_expand(secured_message_context->base_hash_algo,
      35              :                                  major_secret, hash_size, bin_str5,
      36              :                                  bin_str5_size, key, key_length);
      37          290 :     if (!status) {
      38            0 :         return false;
      39              :     }
      40          290 :     LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "key (0x%zx) - ", key_length));
      41          290 :     LIBSPDM_INTERNAL_DUMP_DATA(key, key_length);
      42          290 :     LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "\n"));
      43              : 
      44          290 :     bin_str6_size = sizeof(bin_str6);
      45          290 :     libspdm_bin_concat(secured_message_context->version,
      46              :                        SPDM_BIN_STR_6_LABEL, sizeof(SPDM_BIN_STR_6_LABEL) - 1,
      47          290 :                        NULL, (uint16_t)iv_length, hash_size, bin_str6,
      48              :                        &bin_str6_size);
      49              : 
      50          290 :     LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "bin_str6 (0x%zx):\n", bin_str6_size));
      51          290 :     LIBSPDM_INTERNAL_DUMP_HEX(bin_str6, bin_str6_size);
      52          290 :     status = libspdm_hkdf_expand(secured_message_context->base_hash_algo,
      53              :                                  major_secret, hash_size, bin_str6,
      54              :                                  bin_str6_size, iv, iv_length);
      55          290 :     if (!status) {
      56            0 :         return false;
      57              :     }
      58          290 :     LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "iv (0x%zx) - ", iv_length));
      59          290 :     LIBSPDM_INTERNAL_DUMP_DATA(iv, iv_length);
      60          290 :     LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "\n"));
      61              : 
      62          290 :     return true;
      63              : }
      64              : 
      65          116 : static bool libspdm_generate_finished_key(
      66              :     libspdm_secured_message_context_t *secured_message_context,
      67              :     const uint8_t *handshake_secret, uint8_t *finished_key)
      68              : {
      69              :     bool status;
      70              :     size_t hash_size;
      71              :     uint8_t bin_str7[128];
      72              :     size_t bin_str7_size;
      73              : 
      74          116 :     hash_size = secured_message_context->hash_size;
      75              : 
      76          116 :     bin_str7_size = sizeof(bin_str7);
      77          116 :     libspdm_bin_concat(secured_message_context->version,
      78              :                        SPDM_BIN_STR_7_LABEL, sizeof(SPDM_BIN_STR_7_LABEL) - 1,
      79          116 :                        NULL, (uint16_t)hash_size, hash_size, bin_str7,
      80              :                        &bin_str7_size);
      81              : 
      82          116 :     LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "bin_str7 (0x%zx):\n", bin_str7_size));
      83          116 :     LIBSPDM_INTERNAL_DUMP_HEX(bin_str7, bin_str7_size);
      84          116 :     status = libspdm_hkdf_expand(secured_message_context->base_hash_algo,
      85              :                                  handshake_secret, hash_size, bin_str7,
      86              :                                  bin_str7_size, finished_key, hash_size);
      87          116 :     if (!status) {
      88            0 :         return false;
      89              :     }
      90          116 :     LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "finished_key (0x%zx) - ", hash_size));
      91          116 :     LIBSPDM_INTERNAL_DUMP_DATA(finished_key, hash_size);
      92          116 :     LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "\n"));
      93              : 
      94          116 :     return true;
      95              : }
      96              : 
      97           58 : bool libspdm_generate_session_handshake_key(void *spdm_secured_message_context,
      98              :                                             const uint8_t *th1_hash_data)
      99              : {
     100              :     bool status;
     101              :     size_t hash_size;
     102              :     libspdm_secured_message_context_t *secured_message_context;
     103              :     size_t handshake_secret_size;
     104              :     size_t request_handshake_secret_size;
     105              :     size_t response_handshake_secret_size;
     106              : 
     107           58 :     secured_message_context = spdm_secured_message_context;
     108              : 
     109           58 :     hash_size = secured_message_context->hash_size;
     110           58 :     handshake_secret_size = hash_size;
     111           58 :     request_handshake_secret_size = hash_size;
     112           58 :     response_handshake_secret_size = hash_size;
     113              : 
     114              :     #if LIBSPDM_ENABLE_CAPABILITY_PSK_CAP
     115           58 :     if (secured_message_context->use_psk) {
     116           27 :         status = libspdm_generate_handshake_key (
     117           27 :             secured_message_context->version,
     118              :             NULL,
     119              :             0,
     120              :             false,
     121           27 :             secured_message_context->psk_hint,
     122              :             secured_message_context->psk_hint_size,
     123           27 :             secured_message_context->use_psk,
     124              :             secured_message_context->base_hash_algo,
     125              :             th1_hash_data,
     126           27 :             secured_message_context->master_secret.handshake_secret,
     127              :             &handshake_secret_size,
     128           27 :             secured_message_context->handshake_secret.request_handshake_secret,
     129              :             &request_handshake_secret_size,
     130           27 :             secured_message_context->handshake_secret.response_handshake_secret,
     131              :             &response_handshake_secret_size);
     132              : 
     133           27 :         if (!status) {
     134            0 :             return status;
     135              :         }
     136              :     }
     137              :     #endif /* LIBSPDM_ENABLE_CAPABILITY_PSK_CAP */
     138           58 :     if (!(secured_message_context->use_psk)) {
     139           31 :         if (secured_message_context->kem_alg != 0) {
     140            0 :             LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "[KEM Secret]: "));
     141              :         } else {
     142           31 :             LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "[DHE Secret]: "));
     143              :         }
     144           31 :         LIBSPDM_INTERNAL_DUMP_HEX_STR(
     145              :             secured_message_context->master_secret.shared_secret,
     146              :             secured_message_context->shared_key_size);
     147           31 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "\n"));
     148              : 
     149           31 :         status = libspdm_generate_handshake_key (
     150           31 :             secured_message_context->version,
     151           31 :             secured_message_context->master_secret.shared_secret,
     152              :             secured_message_context->shared_key_size,
     153              :             false,
     154              :             NULL,
     155              :             0,
     156           31 :             secured_message_context->use_psk,
     157              :             secured_message_context->base_hash_algo,
     158              :             th1_hash_data,
     159           31 :             secured_message_context->master_secret.handshake_secret,
     160              :             &handshake_secret_size,
     161           31 :             secured_message_context->handshake_secret.request_handshake_secret,
     162              :             &request_handshake_secret_size,
     163           31 :             secured_message_context->handshake_secret.response_handshake_secret,
     164              :             &response_handshake_secret_size);
     165              : 
     166           31 :         if (!status) {
     167            0 :             return status;
     168              :         }
     169              : 
     170           31 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "handshake_secret (0x%zx) - ", hash_size));
     171           31 :         LIBSPDM_INTERNAL_DUMP_DATA(secured_message_context->master_secret.handshake_secret, hash_size);
     172           31 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "\n"));
     173              : 
     174           31 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "request_handshake_secret (0x%zx) - ", hash_size));
     175           31 :         LIBSPDM_INTERNAL_DUMP_DATA(secured_message_context->handshake_secret.request_handshake_secret, hash_size);
     176           31 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "\n"));
     177              : 
     178           31 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "response_handshake_secret (0x%zx) - ", hash_size));
     179           31 :         LIBSPDM_INTERNAL_DUMP_DATA(secured_message_context->handshake_secret.response_handshake_secret, hash_size);
     180           31 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "\n"));
     181              :     }
     182              : 
     183           58 :     status = libspdm_generate_finished_key(
     184              :         secured_message_context,
     185              :         secured_message_context->handshake_secret
     186           58 :         .request_handshake_secret,
     187           58 :         secured_message_context->handshake_secret.request_finished_key);
     188           58 :     if (!status) {
     189            0 :         return status;
     190              :     }
     191              : 
     192           58 :     status = libspdm_generate_finished_key(
     193              :         secured_message_context,
     194           58 :         secured_message_context->handshake_secret.response_handshake_secret,
     195           58 :         secured_message_context->handshake_secret.response_finished_key);
     196           58 :     if (!status) {
     197            0 :         return status;
     198              :     }
     199              : 
     200           58 :     status = libspdm_generate_aead_key_and_iv(secured_message_context,
     201              :                                               secured_message_context->handshake_secret
     202           58 :                                               .request_handshake_secret,
     203              :                                               secured_message_context->handshake_secret
     204           58 :                                               .request_handshake_encryption_key,
     205              :                                               secured_message_context->handshake_secret
     206           58 :                                               .request_handshake_salt);
     207           58 :     if (!status) {
     208            0 :         return status;
     209              :     }
     210           58 :     secured_message_context->handshake_secret.request_handshake_sequence_number = 0;
     211              : 
     212           58 :     status = libspdm_generate_aead_key_and_iv(
     213              :         secured_message_context,
     214           58 :         secured_message_context->handshake_secret.response_handshake_secret,
     215           58 :         secured_message_context->handshake_secret.response_handshake_encryption_key,
     216           58 :         secured_message_context->handshake_secret.response_handshake_salt);
     217           58 :     if (!status) {
     218            0 :         return status;
     219              :     }
     220              : 
     221           58 :     secured_message_context->handshake_secret.response_handshake_sequence_number = 0;
     222           58 :     libspdm_zero_mem(secured_message_context->master_secret.shared_secret, LIBSPDM_MAX_SHARED_KEY_SIZE);
     223              : 
     224           58 :     return true;
     225              : }
     226              : 
     227           36 : bool libspdm_generate_session_data_key(void *spdm_secured_message_context,
     228              :                                        const uint8_t *th2_hash_data)
     229              : {
     230              :     bool status;
     231              :     size_t hash_size;
     232              :     size_t master_secret_size;
     233              :     size_t request_data_secret_size;
     234              :     size_t response_data_secret_size;
     235              :     size_t export_master_secret_size;
     236              : 
     237              :     libspdm_secured_message_context_t *secured_message_context;
     238              : 
     239           36 :     secured_message_context = spdm_secured_message_context;
     240              : 
     241           36 :     hash_size = secured_message_context->hash_size;
     242           36 :     master_secret_size = hash_size;
     243           36 :     request_data_secret_size = hash_size;
     244           36 :     response_data_secret_size = hash_size;
     245           36 :     export_master_secret_size = hash_size;
     246              : 
     247              :     #if LIBSPDM_ENABLE_CAPABILITY_PSK_CAP
     248           36 :     if (secured_message_context->use_psk) {
     249           13 :         status = libspdm_generate_data_key(
     250           13 :             secured_message_context->version,
     251              :             NULL,
     252              :             0,
     253           13 :             secured_message_context->psk_hint,
     254              :             secured_message_context->psk_hint_size,
     255           13 :             secured_message_context->use_psk,
     256              :             secured_message_context->base_hash_algo,
     257              :             th2_hash_data,
     258           13 :             secured_message_context->master_secret.master_secret,
     259              :             &master_secret_size,
     260           13 :             secured_message_context->application_secret.request_data_secret,
     261              :             &request_data_secret_size,
     262           13 :             secured_message_context->application_secret.response_data_secret,
     263              :             &response_data_secret_size,
     264           13 :             secured_message_context->export_master_secret,
     265              :             &export_master_secret_size);
     266              : 
     267           13 :         if (!status) {
     268            0 :             return status;
     269              :         }
     270              :     }
     271              :     #endif /* LIBSPDM_ENABLE_CAPABILITY_PSK_CAP */
     272           36 :     if (!(secured_message_context->use_psk)) {
     273           23 :         status = libspdm_generate_data_key(
     274           23 :             secured_message_context->version,
     275           23 :             secured_message_context->master_secret.handshake_secret,
     276              :             hash_size,
     277              :             NULL,
     278              :             0,
     279           23 :             secured_message_context->use_psk,
     280              :             secured_message_context->base_hash_algo,
     281              :             th2_hash_data,
     282           23 :             secured_message_context->master_secret.master_secret,
     283              :             &master_secret_size,
     284           23 :             secured_message_context->application_secret.request_data_secret,
     285              :             &request_data_secret_size,
     286           23 :             secured_message_context->application_secret.response_data_secret,
     287              :             &response_data_secret_size,
     288           23 :             secured_message_context->export_master_secret,
     289              :             &export_master_secret_size);
     290              : 
     291           23 :         if (!status) {
     292            0 :             return status;
     293              :         }
     294              : 
     295           23 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "master_secret (0x%zx) - ", hash_size));
     296           23 :         LIBSPDM_INTERNAL_DUMP_DATA(secured_message_context->master_secret.master_secret, hash_size);
     297           23 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "\n"));
     298              : 
     299           23 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "request_data_secret (0x%zx) - ", hash_size));
     300           23 :         LIBSPDM_INTERNAL_DUMP_DATA(secured_message_context->application_secret.request_data_secret, hash_size);
     301           23 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "\n"));
     302              : 
     303           23 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "response_data_secret (0x%zx) - ", hash_size));
     304           23 :         LIBSPDM_INTERNAL_DUMP_DATA(secured_message_context->application_secret.response_data_secret, hash_size);
     305           23 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "\n"));
     306              : 
     307           23 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "export_master_secret (0x%zx) - ", hash_size));
     308           23 :         LIBSPDM_INTERNAL_DUMP_DATA(secured_message_context->export_master_secret, hash_size);
     309           23 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "\n"));
     310              :     }
     311              : 
     312           36 :     status = libspdm_generate_aead_key_and_iv(
     313              :         secured_message_context,
     314           36 :         secured_message_context->application_secret.request_data_secret,
     315           36 :         secured_message_context->application_secret.request_data_encryption_key,
     316           36 :         secured_message_context->application_secret.request_data_salt);
     317           36 :     if (!status) {
     318            0 :         return status;
     319              :     }
     320           36 :     secured_message_context->application_secret.request_data_sequence_number = 0;
     321              : 
     322           36 :     status = libspdm_generate_aead_key_and_iv(
     323              :         secured_message_context,
     324           36 :         secured_message_context->application_secret.response_data_secret,
     325           36 :         secured_message_context->application_secret.response_data_encryption_key,
     326           36 :         secured_message_context->application_secret.response_data_salt);
     327           36 :     if (!status) {
     328            0 :         return status;
     329              :     }
     330           36 :     secured_message_context->application_secret.response_data_sequence_number = 0;
     331              : 
     332           36 :     return true;
     333              : }
     334              : 
     335          102 : bool libspdm_create_update_session_data_key(void *spdm_secured_message_context,
     336              :                                             libspdm_key_update_action_t action)
     337              : {
     338              :     bool status;
     339              :     size_t hash_size;
     340              :     uint8_t bin_str9[128];
     341              :     size_t bin_str9_size;
     342              :     libspdm_secured_message_context_t *secured_message_context;
     343              : 
     344          102 :     secured_message_context = spdm_secured_message_context;
     345              : 
     346          102 :     hash_size = secured_message_context->hash_size;
     347              : 
     348          102 :     bin_str9_size = sizeof(bin_str9);
     349          102 :     libspdm_bin_concat(secured_message_context->version,
     350              :                        SPDM_BIN_STR_9_LABEL, sizeof(SPDM_BIN_STR_9_LABEL) - 1,
     351          102 :                        NULL, (uint16_t)hash_size, hash_size, bin_str9,
     352              :                        &bin_str9_size);
     353              : 
     354          102 :     LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "bin_str9 (0x%zx):\n", bin_str9_size));
     355          102 :     LIBSPDM_INTERNAL_DUMP_HEX(bin_str9, bin_str9_size);
     356              : 
     357          102 :     if (action == LIBSPDM_KEY_UPDATE_ACTION_REQUESTER) {
     358           40 :         libspdm_copy_mem(&secured_message_context->application_secret_backup
     359              :                          .request_data_secret,
     360              :                          sizeof(secured_message_context->application_secret_backup
     361              :                                 .request_data_secret),
     362           40 :                          &secured_message_context->application_secret
     363              :                          .request_data_secret,
     364              :                          LIBSPDM_MAX_HASH_SIZE);
     365           40 :         libspdm_copy_mem(&secured_message_context->application_secret_backup
     366              :                          .request_data_encryption_key,
     367              :                          sizeof(secured_message_context->application_secret_backup
     368              :                                 .request_data_encryption_key),
     369           40 :                          &secured_message_context->application_secret
     370              :                          .request_data_encryption_key,
     371              :                          LIBSPDM_MAX_AEAD_KEY_SIZE);
     372           40 :         libspdm_copy_mem(&secured_message_context->application_secret_backup
     373              :                          .request_data_salt,
     374              :                          sizeof(secured_message_context->application_secret_backup
     375              :                                 .request_data_salt),
     376           40 :                          &secured_message_context->application_secret
     377              :                          .request_data_salt,
     378              :                          LIBSPDM_MAX_AEAD_IV_SIZE);
     379              :         secured_message_context->application_secret_backup
     380           40 :         .request_data_sequence_number =
     381           40 :             secured_message_context->application_secret.request_data_sequence_number;
     382              : 
     383           40 :         status = libspdm_hkdf_expand(
     384              :             secured_message_context->base_hash_algo,
     385           40 :             secured_message_context->application_secret.request_data_secret,
     386              :             hash_size, bin_str9, bin_str9_size,
     387           40 :             secured_message_context->application_secret.request_data_secret,
     388              :             hash_size);
     389           40 :         if (!status) {
     390            0 :             return false;
     391              :         }
     392           40 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "RequestDataSecretUpdate (0x%zx) - ", hash_size));
     393           40 :         LIBSPDM_INTERNAL_DUMP_DATA(secured_message_context->application_secret.request_data_secret,
     394              :                                    hash_size);
     395           40 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "\n"));
     396              : 
     397           40 :         status = libspdm_generate_aead_key_and_iv(
     398              :             secured_message_context,
     399           40 :             secured_message_context->application_secret.request_data_secret,
     400           40 :             secured_message_context->application_secret.request_data_encryption_key,
     401           40 :             secured_message_context->application_secret.request_data_salt);
     402           40 :         if (!status) {
     403            0 :             return status;
     404              :         }
     405           40 :         secured_message_context->application_secret.request_data_sequence_number = 0;
     406              : 
     407           40 :         secured_message_context->requester_backup_valid = true;
     408           62 :     } else if (action == LIBSPDM_KEY_UPDATE_ACTION_RESPONDER) {
     409           62 :         libspdm_copy_mem(&secured_message_context->application_secret_backup
     410              :                          .response_data_secret,
     411              :                          sizeof(secured_message_context->application_secret_backup
     412              :                                 .response_data_secret),
     413           62 :                          &secured_message_context->application_secret
     414              :                          .response_data_secret,
     415              :                          LIBSPDM_MAX_HASH_SIZE);
     416           62 :         libspdm_copy_mem(&secured_message_context->application_secret_backup
     417              :                          .response_data_encryption_key,
     418              :                          sizeof(secured_message_context->application_secret_backup
     419              :                                 .response_data_encryption_key),
     420           62 :                          &secured_message_context->application_secret
     421              :                          .response_data_encryption_key,
     422              :                          LIBSPDM_MAX_AEAD_KEY_SIZE);
     423           62 :         libspdm_copy_mem(&secured_message_context->application_secret_backup
     424              :                          .response_data_salt,
     425              :                          sizeof(secured_message_context->application_secret_backup
     426              :                                 .response_data_salt),
     427           62 :                          &secured_message_context->application_secret
     428              :                          .response_data_salt,
     429              :                          LIBSPDM_MAX_AEAD_IV_SIZE);
     430              :         secured_message_context->application_secret_backup
     431           62 :         .response_data_sequence_number =
     432           62 :             secured_message_context->application_secret.response_data_sequence_number;
     433              : 
     434           62 :         status = libspdm_hkdf_expand(
     435              :             secured_message_context->base_hash_algo,
     436           62 :             secured_message_context->application_secret.response_data_secret,
     437              :             hash_size, bin_str9, bin_str9_size,
     438           62 :             secured_message_context->application_secret.response_data_secret,
     439              :             hash_size);
     440           62 :         if (!status) {
     441            0 :             return false;
     442              :         }
     443           62 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "ResponseDataSecretUpdate (0x%zx) - ",
     444              :                        hash_size));
     445           62 :         LIBSPDM_INTERNAL_DUMP_DATA(secured_message_context->application_secret.response_data_secret,
     446              :                                    hash_size);
     447           62 :         LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "\n"));
     448              : 
     449           62 :         status = libspdm_generate_aead_key_and_iv(
     450              :             secured_message_context,
     451           62 :             secured_message_context->application_secret.response_data_secret,
     452           62 :             secured_message_context->application_secret.response_data_encryption_key,
     453           62 :             secured_message_context->application_secret.response_data_salt);
     454           62 :         if (!status) {
     455            0 :             return status;
     456              :         }
     457           62 :         secured_message_context->application_secret.response_data_sequence_number = 0;
     458              : 
     459           62 :         secured_message_context->responder_backup_valid = true;
     460              :     } else {
     461            0 :         return false;
     462              :     }
     463              : 
     464          102 :     return true;
     465              : }
     466              : 
     467          264 : void libspdm_clear_handshake_secret(void *spdm_secured_message_context)
     468              : {
     469              :     libspdm_secured_message_context_t *secured_message_context;
     470              : 
     471          264 :     secured_message_context = spdm_secured_message_context;
     472              : 
     473          264 :     libspdm_zero_mem(secured_message_context->master_secret.handshake_secret,
     474              :                      LIBSPDM_MAX_HASH_SIZE);
     475          264 :     libspdm_zero_mem(&(secured_message_context->handshake_secret),
     476              :                      sizeof(libspdm_session_info_struct_handshake_secret_t));
     477              : 
     478          264 :     secured_message_context->requester_backup_valid = false;
     479          264 :     secured_message_context->responder_backup_valid = false;
     480          264 : }
     481              : 
     482          264 : void libspdm_clear_master_secret(void *spdm_secured_message_context)
     483              : {
     484              :     libspdm_secured_message_context_t *secured_message_context;
     485              : 
     486          264 :     secured_message_context = spdm_secured_message_context;
     487              : 
     488          264 :     libspdm_zero_mem(secured_message_context->master_secret.master_secret, LIBSPDM_MAX_HASH_SIZE);
     489          264 : }
     490              : 
     491           93 : bool libspdm_activate_update_session_data_key(void *spdm_secured_message_context,
     492              :                                               libspdm_key_update_action_t action,
     493              :                                               bool use_new_key)
     494              : {
     495              :     libspdm_secured_message_context_t *secured_message_context;
     496              : 
     497           93 :     secured_message_context = spdm_secured_message_context;
     498              : 
     499           93 :     if (!use_new_key) {
     500           52 :         if ((action == LIBSPDM_KEY_UPDATE_ACTION_REQUESTER) &&
     501            0 :             secured_message_context->requester_backup_valid) {
     502            0 :             libspdm_copy_mem(&secured_message_context->application_secret
     503              :                              .request_data_secret,
     504              :                              sizeof(secured_message_context->application_secret
     505              :                                     .request_data_secret),
     506            0 :                              &secured_message_context
     507              :                              ->application_secret_backup
     508              :                              .request_data_secret,
     509              :                              LIBSPDM_MAX_HASH_SIZE);
     510            0 :             libspdm_copy_mem(&secured_message_context->application_secret
     511              :                              .request_data_encryption_key,
     512              :                              sizeof(secured_message_context->application_secret
     513              :                                     .request_data_encryption_key),
     514            0 :                              &secured_message_context
     515              :                              ->application_secret_backup
     516              :                              .request_data_encryption_key,
     517              :                              LIBSPDM_MAX_AEAD_KEY_SIZE);
     518            0 :             libspdm_copy_mem(&secured_message_context->application_secret
     519              :                              .request_data_salt,
     520              :                              sizeof(secured_message_context->application_secret
     521              :                                     .request_data_salt),
     522            0 :                              &secured_message_context
     523              :                              ->application_secret_backup
     524              :                              .request_data_salt,
     525              :                              LIBSPDM_MAX_AEAD_IV_SIZE);
     526              :             secured_message_context->application_secret
     527            0 :             .request_data_sequence_number =
     528            0 :                 secured_message_context->application_secret_backup.request_data_sequence_number;
     529           52 :         } else if ((action == LIBSPDM_KEY_UPDATE_ACTION_RESPONDER) &&
     530           52 :                    secured_message_context->responder_backup_valid) {
     531           52 :             libspdm_copy_mem(&secured_message_context->application_secret
     532              :                              .response_data_secret,
     533              :                              sizeof(secured_message_context->application_secret
     534              :                                     .response_data_secret),
     535           52 :                              &secured_message_context
     536              :                              ->application_secret_backup
     537              :                              .response_data_secret,
     538              :                              LIBSPDM_MAX_HASH_SIZE);
     539           52 :             libspdm_copy_mem(&secured_message_context->application_secret
     540              :                              .response_data_encryption_key,
     541              :                              sizeof(secured_message_context->application_secret
     542              :                                     .response_data_encryption_key),
     543           52 :                              &secured_message_context
     544              :                              ->application_secret_backup
     545              :                              .response_data_encryption_key,
     546              :                              LIBSPDM_MAX_AEAD_KEY_SIZE);
     547           52 :             libspdm_copy_mem(&secured_message_context->application_secret
     548              :                              .response_data_salt,
     549              :                              sizeof(secured_message_context->application_secret
     550              :                                     .response_data_salt),
     551           52 :                              &secured_message_context
     552              :                              ->application_secret_backup
     553              :                              .response_data_salt,
     554              :                              LIBSPDM_MAX_AEAD_IV_SIZE);
     555           52 :             secured_message_context->application_secret.response_data_sequence_number =
     556           52 :                 secured_message_context->application_secret_backup.response_data_sequence_number;
     557              :         }
     558              :     }
     559              : 
     560           93 :     if (action == LIBSPDM_KEY_UPDATE_ACTION_REQUESTER) {
     561           35 :         libspdm_zero_mem(&secured_message_context->application_secret_backup.request_data_secret,
     562              :                          LIBSPDM_MAX_HASH_SIZE);
     563           35 :         libspdm_zero_mem(&secured_message_context->application_secret_backup
     564              :                          .request_data_encryption_key,
     565              :                          LIBSPDM_MAX_AEAD_KEY_SIZE);
     566           35 :         libspdm_zero_mem(&secured_message_context->application_secret_backup.request_data_salt,
     567              :                          LIBSPDM_MAX_AEAD_IV_SIZE);
     568           35 :         secured_message_context->application_secret_backup.request_data_sequence_number = 0;
     569           35 :         secured_message_context->requester_backup_valid = false;
     570           58 :     } else if (action == LIBSPDM_KEY_UPDATE_ACTION_RESPONDER) {
     571           58 :         libspdm_zero_mem(&secured_message_context->application_secret_backup.response_data_secret,
     572              :                          LIBSPDM_MAX_HASH_SIZE);
     573           58 :         libspdm_zero_mem(&secured_message_context->application_secret_backup
     574              :                          .response_data_encryption_key,
     575              :                          LIBSPDM_MAX_AEAD_KEY_SIZE);
     576           58 :         libspdm_zero_mem(&secured_message_context->application_secret_backup.response_data_salt,
     577              :                          LIBSPDM_MAX_AEAD_IV_SIZE);
     578           58 :         secured_message_context->application_secret_backup.response_data_sequence_number = 0;
     579           58 :         secured_message_context->responder_backup_valid = false;
     580              :     }
     581              : 
     582           93 :     return true;
     583              : }
     584              : 
     585            0 : void *libspdm_hmac_new_with_request_finished_key(void *spdm_secured_message_context)
     586              : {
     587              :     libspdm_secured_message_context_t *secured_message_context;
     588              : 
     589            0 :     secured_message_context = spdm_secured_message_context;
     590            0 :     return libspdm_hmac_new(secured_message_context->base_hash_algo);
     591              : }
     592              : 
     593            0 : void libspdm_hmac_free_with_request_finished_key(
     594              :     void *spdm_secured_message_context, void *hmac_ctx)
     595              : {
     596              :     libspdm_secured_message_context_t *secured_message_context;
     597              : 
     598            0 :     secured_message_context = spdm_secured_message_context;
     599            0 :     libspdm_hmac_free(secured_message_context->base_hash_algo, hmac_ctx);
     600            0 : }
     601              : 
     602            0 : bool libspdm_hmac_init_with_request_finished_key(
     603              :     void *spdm_secured_message_context, void *hmac_ctx)
     604              : {
     605              :     libspdm_secured_message_context_t *secured_message_context;
     606              : 
     607            0 :     secured_message_context = spdm_secured_message_context;
     608            0 :     return libspdm_hmac_init(
     609              :         secured_message_context->base_hash_algo, hmac_ctx,
     610            0 :         secured_message_context->handshake_secret.request_finished_key,
     611              :         secured_message_context->hash_size);
     612              : }
     613              : 
     614            0 : bool libspdm_hmac_duplicate_with_request_finished_key(
     615              :     void *spdm_secured_message_context,
     616              :     const void *hmac_ctx, void *new_hmac_ctx)
     617              : {
     618              :     libspdm_secured_message_context_t *secured_message_context;
     619              : 
     620            0 :     secured_message_context = spdm_secured_message_context;
     621            0 :     return libspdm_hmac_duplicate(secured_message_context->base_hash_algo, hmac_ctx, new_hmac_ctx);
     622              : }
     623              : 
     624            0 : bool libspdm_hmac_update_with_request_finished_key(
     625              :     void *spdm_secured_message_context,
     626              :     void *hmac_ctx, const void *data,
     627              :     size_t data_size)
     628              : {
     629              :     libspdm_secured_message_context_t *secured_message_context;
     630              : 
     631            0 :     secured_message_context = spdm_secured_message_context;
     632            0 :     return libspdm_hmac_update(secured_message_context->base_hash_algo, hmac_ctx, data, data_size);
     633              : }
     634              : 
     635            0 : bool libspdm_hmac_final_with_request_finished_key(
     636              :     void *spdm_secured_message_context,
     637              :     void *hmac_ctx,  uint8_t *hmac_value)
     638              : {
     639              :     libspdm_secured_message_context_t *secured_message_context;
     640              : 
     641            0 :     secured_message_context = spdm_secured_message_context;
     642            0 :     return libspdm_hmac_final(secured_message_context->base_hash_algo, hmac_ctx, hmac_value);
     643              : }
     644              : 
     645           93 : bool libspdm_hmac_all_with_request_finished_key(void *spdm_secured_message_context,
     646              :                                                 const void *data, size_t data_size,
     647              :                                                 uint8_t *hmac_value)
     648              : {
     649              :     libspdm_secured_message_context_t *secured_message_context;
     650              : 
     651           93 :     secured_message_context = spdm_secured_message_context;
     652          186 :     return libspdm_hmac_all(
     653              :         secured_message_context->base_hash_algo, data, data_size,
     654           93 :         secured_message_context->handshake_secret.request_finished_key,
     655              :         secured_message_context->hash_size, hmac_value);
     656              : }
     657              : 
     658            0 : void *libspdm_hmac_new_with_response_finished_key(void *spdm_secured_message_context)
     659              : {
     660              :     libspdm_secured_message_context_t *secured_message_context;
     661              : 
     662            0 :     secured_message_context = spdm_secured_message_context;
     663            0 :     return libspdm_hmac_new(secured_message_context->base_hash_algo);
     664              : }
     665              : 
     666            0 : void libspdm_hmac_free_with_response_finished_key(
     667              :     void *spdm_secured_message_context, void *hmac_ctx)
     668              : {
     669              :     libspdm_secured_message_context_t *secured_message_context;
     670              : 
     671            0 :     secured_message_context = spdm_secured_message_context;
     672            0 :     libspdm_hmac_free(secured_message_context->base_hash_algo, hmac_ctx);
     673            0 : }
     674              : 
     675            0 : bool libspdm_hmac_init_with_response_finished_key(
     676              :     void *spdm_secured_message_context, void *hmac_ctx)
     677              : {
     678              :     libspdm_secured_message_context_t *secured_message_context;
     679              : 
     680            0 :     secured_message_context = spdm_secured_message_context;
     681            0 :     return libspdm_hmac_init(
     682              :         secured_message_context->base_hash_algo, hmac_ctx,
     683            0 :         secured_message_context->handshake_secret.response_finished_key,
     684              :         secured_message_context->hash_size);
     685              : }
     686              : 
     687            0 : bool libspdm_hmac_duplicate_with_response_finished_key(
     688              :     void *spdm_secured_message_context,
     689              :     const void *hmac_ctx, void *new_hmac_ctx)
     690              : {
     691              :     libspdm_secured_message_context_t *secured_message_context;
     692              : 
     693            0 :     secured_message_context = spdm_secured_message_context;
     694            0 :     return libspdm_hmac_duplicate(secured_message_context->base_hash_algo, hmac_ctx, new_hmac_ctx);
     695              : }
     696              : 
     697            0 : bool libspdm_hmac_update_with_response_finished_key(
     698              :     void *spdm_secured_message_context,
     699              :     void *hmac_ctx, const void *data,
     700              :     size_t data_size)
     701              : {
     702              :     libspdm_secured_message_context_t *secured_message_context;
     703              : 
     704            0 :     secured_message_context = spdm_secured_message_context;
     705            0 :     return libspdm_hmac_update(secured_message_context->base_hash_algo, hmac_ctx, data, data_size);
     706              : }
     707              : 
     708            0 : bool libspdm_hmac_final_with_response_finished_key(
     709              :     void *spdm_secured_message_context,
     710              :     void *hmac_ctx,  uint8_t *hmac_value)
     711              : {
     712              :     libspdm_secured_message_context_t *secured_message_context;
     713              : 
     714            0 :     secured_message_context = spdm_secured_message_context;
     715            0 :     return libspdm_hmac_final(secured_message_context->base_hash_algo, hmac_ctx, hmac_value);
     716              : }
     717              : 
     718           75 : bool libspdm_hmac_all_with_response_finished_key(
     719              :     void *spdm_secured_message_context, const void *data,
     720              :     size_t data_size, uint8_t *hmac_value)
     721              : {
     722              :     libspdm_secured_message_context_t *secured_message_context;
     723              : 
     724           75 :     secured_message_context = spdm_secured_message_context;
     725          150 :     return libspdm_hmac_all(
     726              :         secured_message_context->base_hash_algo, data, data_size,
     727           75 :         secured_message_context->handshake_secret.response_finished_key,
     728              :         secured_message_context->hash_size, hmac_value);
     729              : }
        

Generated by: LCOV version 2.0-1