LCOV - code coverage report
Current view: top level - library/spdm_crypt_lib - libspdm_crypt_hmac.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 2.7 % 148 4
Test Date: 2025-06-29 08:09:00 Functions: 14.3 % 7 1

            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 "internal/libspdm_crypt_lib.h"
       8              : 
       9            0 : void *libspdm_hmac_new(uint32_t base_hash_algo)
      10              : {
      11            0 :     switch (base_hash_algo) {
      12            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256:
      13              : #if LIBSPDM_SHA256_SUPPORT
      14            0 :         return libspdm_hmac_sha256_new();
      15              : #else
      16              :         LIBSPDM_ASSERT(false);
      17              :         return NULL;
      18              : #endif
      19            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_384:
      20              : #if LIBSPDM_SHA384_SUPPORT
      21            0 :         return libspdm_hmac_sha384_new();
      22              : #else
      23              :         LIBSPDM_ASSERT(false);
      24              :         return NULL;
      25              : #endif
      26            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_512:
      27              : #if LIBSPDM_SHA512_SUPPORT
      28            0 :         return libspdm_hmac_sha512_new();
      29              : #else
      30              :         LIBSPDM_ASSERT(false);
      31              :         return NULL;
      32              : #endif
      33            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA3_256:
      34              : #if LIBSPDM_SHA3_256_SUPPORT
      35            0 :         return libspdm_hmac_sha3_256_new();
      36              : #else
      37              :         LIBSPDM_ASSERT(false);
      38              :         return NULL;
      39              : #endif
      40            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA3_384:
      41              : #if LIBSPDM_SHA3_384_SUPPORT
      42            0 :         return libspdm_hmac_sha3_384_new();
      43              : #else
      44              :         LIBSPDM_ASSERT(false);
      45              :         return NULL;
      46              : #endif
      47            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA3_512:
      48              : #if LIBSPDM_SHA3_512_SUPPORT
      49            0 :         return libspdm_hmac_sha3_512_new();
      50              : #else
      51              :         LIBSPDM_ASSERT(false);
      52              :         return NULL;
      53              : #endif
      54            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SM3_256:
      55              : #if LIBSPDM_SM3_256_SUPPORT
      56              :         return libspdm_hmac_sm3_256_new();
      57              : #else
      58            0 :         LIBSPDM_ASSERT(false);
      59            0 :         return NULL;
      60              : #endif
      61            0 :     default:
      62            0 :         LIBSPDM_ASSERT(false);
      63            0 :         return NULL;
      64              :     }
      65              : }
      66              : 
      67            0 : void libspdm_hmac_free(uint32_t base_hash_algo, void *hmac_ctx)
      68              : {
      69            0 :     if (hmac_ctx == NULL) {
      70            0 :         return;
      71              :     }
      72            0 :     switch (base_hash_algo) {
      73            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256:
      74              : #if LIBSPDM_SHA256_SUPPORT
      75            0 :         libspdm_hmac_sha256_free(hmac_ctx);
      76              : #else
      77              :         LIBSPDM_ASSERT(false);
      78              : #endif
      79            0 :         break;
      80            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_384:
      81              : #if LIBSPDM_SHA384_SUPPORT
      82            0 :         libspdm_hmac_sha384_free(hmac_ctx);
      83              : #else
      84              :         LIBSPDM_ASSERT(false);
      85              : #endif
      86            0 :         break;
      87            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_512:
      88              : #if LIBSPDM_SHA512_SUPPORT
      89            0 :         libspdm_hmac_sha512_free(hmac_ctx);
      90              : #else
      91              :         LIBSPDM_ASSERT(false);
      92              : #endif
      93            0 :         break;
      94            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA3_256:
      95              : #if LIBSPDM_SHA3_256_SUPPORT
      96            0 :         libspdm_hmac_sha3_256_free(hmac_ctx);
      97              : #else
      98              :         LIBSPDM_ASSERT(false);
      99              : #endif
     100            0 :         break;
     101            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA3_384:
     102              : #if LIBSPDM_SHA3_384_SUPPORT
     103            0 :         libspdm_hmac_sha3_384_free(hmac_ctx);
     104              : #else
     105              :         LIBSPDM_ASSERT(false);
     106              : #endif
     107            0 :         break;
     108            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA3_512:
     109              : #if LIBSPDM_SHA3_512_SUPPORT
     110            0 :         libspdm_hmac_sha3_512_free(hmac_ctx);
     111              : #else
     112              :         LIBSPDM_ASSERT(false);
     113              : #endif
     114            0 :         break;
     115            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SM3_256:
     116              : #if LIBSPDM_SM3_256_SUPPORT
     117              :         libspdm_hmac_sm3_256_free(hmac_ctx);
     118              : #else
     119            0 :         LIBSPDM_ASSERT(false);
     120              : #endif
     121            0 :         break;
     122            0 :     default:
     123            0 :         LIBSPDM_ASSERT(false);
     124            0 :         break;
     125              :     }
     126              : }
     127              : 
     128            0 : bool libspdm_hmac_init(uint32_t base_hash_algo,
     129              :                        void *hmac_ctx, const uint8_t *key,
     130              :                        size_t key_size)
     131              : {
     132            0 :     switch (base_hash_algo) {
     133            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256:
     134              : #if LIBSPDM_SHA256_SUPPORT
     135            0 :         return libspdm_hmac_sha256_set_key(hmac_ctx, key, key_size);
     136              : #else
     137              :         LIBSPDM_ASSERT(false);
     138              :         return false;
     139              : #endif
     140            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_384:
     141              : #if LIBSPDM_SHA384_SUPPORT
     142            0 :         return libspdm_hmac_sha384_set_key(hmac_ctx, key, key_size);
     143              : #else
     144              :         LIBSPDM_ASSERT(false);
     145              :         return false;
     146              : #endif
     147            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_512:
     148              : #if LIBSPDM_SHA512_SUPPORT
     149            0 :         return libspdm_hmac_sha512_set_key(hmac_ctx, key, key_size);
     150              : #else
     151              :         LIBSPDM_ASSERT(false);
     152              :         return false;
     153              : #endif
     154            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA3_256:
     155              : #if LIBSPDM_SHA3_256_SUPPORT
     156            0 :         return libspdm_hmac_sha3_256_set_key(hmac_ctx, key, key_size);
     157              : #else
     158              :         LIBSPDM_ASSERT(false);
     159              :         return false;
     160              : #endif
     161            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA3_384:
     162              : #if LIBSPDM_SHA3_384_SUPPORT
     163            0 :         return libspdm_hmac_sha3_384_set_key(hmac_ctx, key, key_size);
     164              : #else
     165              :         LIBSPDM_ASSERT(false);
     166              :         return false;
     167              : #endif
     168            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA3_512:
     169              : #if LIBSPDM_SHA3_512_SUPPORT
     170            0 :         return libspdm_hmac_sha3_512_set_key(hmac_ctx, key, key_size);
     171              : #else
     172              :         LIBSPDM_ASSERT(false);
     173              :         return false;
     174              : #endif
     175            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SM3_256:
     176              : #if LIBSPDM_SM3_256_SUPPORT
     177              :         return libspdm_hmac_sm3_256_set_key(hmac_ctx, key, key_size);
     178              : #else
     179            0 :         LIBSPDM_ASSERT(false);
     180            0 :         return false;
     181              : #endif
     182            0 :     default:
     183            0 :         LIBSPDM_ASSERT(false);
     184            0 :         return false;
     185              :     }
     186              : }
     187              : 
     188            0 : bool libspdm_hmac_duplicate(uint32_t base_hash_algo, const void *hmac_ctx, void *new_hmac_ctx)
     189              : {
     190            0 :     switch (base_hash_algo) {
     191            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256:
     192              : #if LIBSPDM_SHA256_SUPPORT
     193            0 :         return libspdm_hmac_sha256_duplicate(hmac_ctx, new_hmac_ctx);
     194              : #else
     195              :         LIBSPDM_ASSERT(false);
     196              :         return false;
     197              : #endif
     198            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_384:
     199              : #if LIBSPDM_SHA384_SUPPORT
     200            0 :         return libspdm_hmac_sha384_duplicate(hmac_ctx, new_hmac_ctx);
     201              : #else
     202              :         LIBSPDM_ASSERT(false);
     203              :         return false;
     204              : #endif
     205            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_512:
     206              : #if LIBSPDM_SHA512_SUPPORT
     207            0 :         return libspdm_hmac_sha512_duplicate(hmac_ctx, new_hmac_ctx);
     208              : #else
     209              :         LIBSPDM_ASSERT(false);
     210              :         return false;
     211              : #endif
     212            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA3_256:
     213              : #if LIBSPDM_SHA3_256_SUPPORT
     214            0 :         return libspdm_hmac_sha3_256_duplicate(hmac_ctx, new_hmac_ctx);
     215              : #else
     216              :         LIBSPDM_ASSERT(false);
     217              :         return false;
     218              : #endif
     219            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA3_384:
     220              : #if LIBSPDM_SHA3_384_SUPPORT
     221            0 :         return libspdm_hmac_sha3_384_duplicate(hmac_ctx, new_hmac_ctx);
     222              : #else
     223              :         LIBSPDM_ASSERT(false);
     224              :         return false;
     225              : #endif
     226            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA3_512:
     227              : #if LIBSPDM_SHA3_512_SUPPORT
     228            0 :         return libspdm_hmac_sha3_512_duplicate(hmac_ctx, new_hmac_ctx);
     229              : #else
     230              :         LIBSPDM_ASSERT(false);
     231              :         return false;
     232              : #endif
     233            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SM3_256:
     234              : #if LIBSPDM_SM3_256_SUPPORT
     235              :         return libspdm_hmac_sm3_256_duplicate(hmac_ctx, new_hmac_ctx);
     236              : #else
     237            0 :         LIBSPDM_ASSERT(false);
     238            0 :         return false;
     239              : #endif
     240            0 :     default:
     241            0 :         LIBSPDM_ASSERT(false);
     242            0 :         return false;
     243              :     }
     244              : }
     245              : 
     246            0 : bool libspdm_hmac_update(uint32_t base_hash_algo,
     247              :                          void *hmac_ctx, const void *data,
     248              :                          size_t data_size)
     249              : {
     250            0 :     switch (base_hash_algo) {
     251            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256:
     252              : #if LIBSPDM_SHA256_SUPPORT
     253            0 :         return libspdm_hmac_sha256_update(hmac_ctx, data, data_size);
     254              : #else
     255              :         LIBSPDM_ASSERT(false);
     256              :         return false;
     257              : #endif
     258            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_384:
     259              : #if LIBSPDM_SHA384_SUPPORT
     260            0 :         return libspdm_hmac_sha384_update(hmac_ctx, data, data_size);
     261              : #else
     262              :         LIBSPDM_ASSERT(false);
     263              :         return false;
     264              : #endif
     265            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_512:
     266              : #if LIBSPDM_SHA512_SUPPORT
     267            0 :         return libspdm_hmac_sha512_update(hmac_ctx, data, data_size);
     268              : #else
     269              :         LIBSPDM_ASSERT(false);
     270              :         return false;
     271              : #endif
     272            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA3_256:
     273              : #if LIBSPDM_SHA3_256_SUPPORT
     274            0 :         return libspdm_hmac_sha3_256_update(hmac_ctx, data, data_size);
     275              : #else
     276              :         LIBSPDM_ASSERT(false);
     277              :         return false;
     278              : #endif
     279            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA3_384:
     280              : #if LIBSPDM_SHA3_384_SUPPORT
     281            0 :         return libspdm_hmac_sha3_384_update(hmac_ctx, data, data_size);
     282              : #else
     283              :         LIBSPDM_ASSERT(false);
     284              :         return false;
     285              : #endif
     286            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA3_512:
     287              : #if LIBSPDM_SHA3_512_SUPPORT
     288            0 :         return libspdm_hmac_sha3_512_update(hmac_ctx, data, data_size);
     289              : #else
     290              :         LIBSPDM_ASSERT(false);
     291              :         return false;
     292              : #endif
     293            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SM3_256:
     294              : #if LIBSPDM_SM3_256_SUPPORT
     295              :         return libspdm_hmac_sm3_256_update(hmac_ctx, data, data_size);
     296              : #else
     297            0 :         LIBSPDM_ASSERT(false);
     298            0 :         return false;
     299              : #endif
     300            0 :     default:
     301            0 :         LIBSPDM_ASSERT(false);
     302            0 :         return false;
     303              :     }
     304              : }
     305              : 
     306            0 : bool libspdm_hmac_final(uint32_t base_hash_algo, void *hmac_ctx,  uint8_t *hmac_value)
     307              : {
     308            0 :     switch (base_hash_algo) {
     309            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256:
     310              : #if LIBSPDM_SHA256_SUPPORT
     311            0 :         return libspdm_hmac_sha256_final(hmac_ctx, hmac_value);
     312              : #else
     313              :         LIBSPDM_ASSERT(false);
     314              :         return false;
     315              : #endif
     316            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_384:
     317              : #if LIBSPDM_SHA384_SUPPORT
     318            0 :         return libspdm_hmac_sha384_final(hmac_ctx, hmac_value);
     319              : #else
     320              :         LIBSPDM_ASSERT(false);
     321              :         return false;
     322              : #endif
     323            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_512:
     324              : #if LIBSPDM_SHA512_SUPPORT
     325            0 :         return libspdm_hmac_sha512_final(hmac_ctx, hmac_value);
     326              : #else
     327              :         LIBSPDM_ASSERT(false);
     328              :         return false;
     329              : #endif
     330            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA3_256:
     331              : #if LIBSPDM_SHA3_256_SUPPORT
     332            0 :         return libspdm_hmac_sha3_256_final(hmac_ctx, hmac_value);
     333              : #else
     334              :         LIBSPDM_ASSERT(false);
     335              :         return false;
     336              : #endif
     337            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA3_384:
     338              : #if LIBSPDM_SHA3_384_SUPPORT
     339            0 :         return libspdm_hmac_sha3_384_final(hmac_ctx, hmac_value);
     340              : #else
     341              :         LIBSPDM_ASSERT(false);
     342              :         return false;
     343              : #endif
     344            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA3_512:
     345              : #if LIBSPDM_SHA3_512_SUPPORT
     346            0 :         return libspdm_hmac_sha3_512_final(hmac_ctx, hmac_value);
     347              : #else
     348              :         LIBSPDM_ASSERT(false);
     349              :         return false;
     350              : #endif
     351            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SM3_256:
     352              : #if LIBSPDM_SM3_256_SUPPORT
     353              :         return libspdm_hmac_sm3_256_final(hmac_ctx, hmac_value);
     354              : #else
     355            0 :         LIBSPDM_ASSERT(false);
     356            0 :         return false;
     357              : #endif
     358            0 :     default:
     359            0 :         LIBSPDM_ASSERT(false);
     360            0 :         return false;
     361              :     }
     362              : }
     363              : 
     364          317 : bool libspdm_hmac_all(uint32_t base_hash_algo, const void *data,
     365              :                       size_t data_size, const uint8_t *key,
     366              :                       size_t key_size, uint8_t *hmac_value)
     367              : {
     368          317 :     switch (base_hash_algo) {
     369          317 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256:
     370              : #if LIBSPDM_SHA256_SUPPORT
     371          317 :         return libspdm_hmac_sha256_all(data, data_size, key, key_size, hmac_value);
     372              : #else
     373              :         LIBSPDM_ASSERT(false);
     374              :         return false;
     375              : #endif
     376            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_384:
     377              : #if LIBSPDM_SHA384_SUPPORT
     378            0 :         return libspdm_hmac_sha384_all(data, data_size, key, key_size, hmac_value);
     379              : #else
     380              :         LIBSPDM_ASSERT(false);
     381              :         return false;
     382              : #endif
     383            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_512:
     384              : #if LIBSPDM_SHA512_SUPPORT
     385            0 :         return libspdm_hmac_sha512_all(data, data_size, key, key_size, hmac_value);
     386              : #else
     387              :         LIBSPDM_ASSERT(false);
     388              :         return false;
     389              : #endif
     390            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA3_256:
     391              : #if LIBSPDM_SHA3_256_SUPPORT
     392            0 :         return libspdm_hmac_sha3_256_all(data, data_size, key, key_size, hmac_value);
     393              : #else
     394              :         LIBSPDM_ASSERT(false);
     395              :         return false;
     396              : #endif
     397            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA3_384:
     398              : #if LIBSPDM_SHA3_384_SUPPORT
     399            0 :         return libspdm_hmac_sha3_384_all(data, data_size, key, key_size, hmac_value);
     400              : #else
     401              :         LIBSPDM_ASSERT(false);
     402              :         return false;
     403              : #endif
     404            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA3_512:
     405              : #if LIBSPDM_SHA3_512_SUPPORT
     406            0 :         return libspdm_hmac_sha3_512_all(data, data_size, key, key_size, hmac_value);
     407              : #else
     408              :         LIBSPDM_ASSERT(false);
     409              :         return false;
     410              : #endif
     411            0 :     case SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SM3_256:
     412              : #if LIBSPDM_SM3_256_SUPPORT
     413              :         return libspdm_hmac_sm3_256_all(data, data_size, key, key_size, hmac_value);
     414              : #else
     415            0 :         LIBSPDM_ASSERT(false);
     416            0 :         return false;
     417              : #endif
     418            0 :     default:
     419            0 :         LIBSPDM_ASSERT(false);
     420            0 :         return false;
     421              :     }
     422              : }
        

Generated by: LCOV version 2.0-1