LCOV - code coverage report
Current view: top level - library/spdm_crypt_lib - libspdm_crypt_pqc_kem.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 4.7 % 85 4
Test Date: 2025-08-24 08:11:14 Functions: 11.1 % 9 1

            Line data    Source code
       1              : /**
       2              :  *  Copyright Notice:
       3              :  *  Copyright 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           14 : uint32_t libspdm_get_kem_encap_key_size(uint32_t kem_alg)
      10              : {
      11           14 :     switch (kem_alg) {
      12            0 :     case SPDM_ALGORITHMS_KEM_ALG_ML_KEM_512:
      13              : #if LIBSPDM_ML_KEM_512_SUPPORT
      14              :         return 800;
      15              : #else
      16            0 :         return 0;
      17              : #endif
      18            0 :     case SPDM_ALGORITHMS_KEM_ALG_ML_KEM_768:
      19              : #if LIBSPDM_ML_KEM_768_SUPPORT
      20              :         return 1184;
      21              : #else
      22            0 :         return 0;
      23              : #endif
      24            0 :     case SPDM_ALGORITHMS_KEM_ALG_ML_KEM_1024:
      25              : #if LIBSPDM_ML_KEM_1024_SUPPORT
      26              :         return 1568;
      27              : #else
      28            0 :         return 0;
      29              : #endif
      30           14 :     default:
      31           14 :         return 0;
      32              :     }
      33              : }
      34              : 
      35            0 : uint32_t libspdm_get_kem_cipher_text_size(uint32_t kem_alg)
      36              : {
      37            0 :     switch (kem_alg) {
      38            0 :     case SPDM_ALGORITHMS_KEM_ALG_ML_KEM_512:
      39              : #if LIBSPDM_ML_KEM_512_SUPPORT
      40              :         return 768;
      41              : #else
      42            0 :         return 0;
      43              : #endif
      44            0 :     case SPDM_ALGORITHMS_KEM_ALG_ML_KEM_768:
      45              : #if LIBSPDM_ML_KEM_768_SUPPORT
      46              :         return 1088;
      47              : #else
      48            0 :         return 0;
      49              : #endif
      50            0 :     case SPDM_ALGORITHMS_KEM_ALG_ML_KEM_1024:
      51              : #if LIBSPDM_ML_KEM_1024_SUPPORT
      52              :         return 1568;
      53              : #else
      54            0 :         return 0;
      55              : #endif
      56            0 :     default:
      57            0 :         return 0;
      58              :     }
      59              : }
      60              : 
      61            0 : uint32_t libspdm_get_kem_shared_secret_size(uint32_t kem_alg)
      62              : {
      63            0 :     switch (kem_alg) {
      64            0 :     case SPDM_ALGORITHMS_KEM_ALG_ML_KEM_512:
      65              : #if LIBSPDM_ML_KEM_512_SUPPORT
      66              :         return 32;
      67              : #else
      68            0 :         return 0;
      69              : #endif
      70            0 :     case SPDM_ALGORITHMS_KEM_ALG_ML_KEM_768:
      71              : #if LIBSPDM_ML_KEM_768_SUPPORT
      72              :         return 32;
      73              : #else
      74            0 :         return 0;
      75              : #endif
      76            0 :     case SPDM_ALGORITHMS_KEM_ALG_ML_KEM_1024:
      77              : #if LIBSPDM_ML_KEM_1024_SUPPORT
      78              :         return 32;
      79              : #else
      80            0 :         return 0;
      81              : #endif
      82            0 :     default:
      83            0 :         return 0;
      84              :     }
      85              : }
      86              : 
      87            0 : static size_t libspdm_get_kem_nid(uint32_t kem_alg)
      88              : {
      89            0 :     switch (kem_alg) {
      90            0 :     case SPDM_ALGORITHMS_KEM_ALG_ML_KEM_512:
      91            0 :         return LIBSPDM_CRYPTO_NID_ML_KEM_512;
      92            0 :     case SPDM_ALGORITHMS_KEM_ALG_ML_KEM_768:
      93            0 :         return LIBSPDM_CRYPTO_NID_ML_KEM_768;
      94            0 :     case SPDM_ALGORITHMS_KEM_ALG_ML_KEM_1024:
      95            0 :         return LIBSPDM_CRYPTO_NID_ML_KEM_1024;
      96            0 :     default:
      97            0 :         return LIBSPDM_CRYPTO_NID_NULL;
      98              :     }
      99              : }
     100              : 
     101            0 : void *libspdm_kem_new(spdm_version_number_t spdm_version,
     102              :                       uint32_t kem_alg, bool is_initiator)
     103              : {
     104              :     size_t nid;
     105              : 
     106            0 :     nid = libspdm_get_kem_nid(kem_alg);
     107            0 :     if (nid == LIBSPDM_CRYPTO_NID_NULL) {
     108            0 :         return NULL;
     109              :     }
     110              : 
     111            0 :     switch (kem_alg) {
     112            0 :     case SPDM_ALGORITHMS_KEM_ALG_ML_KEM_512:
     113              :     case SPDM_ALGORITHMS_KEM_ALG_ML_KEM_768:
     114              :     case SPDM_ALGORITHMS_KEM_ALG_ML_KEM_1024:
     115              : #if LIBSPDM_ML_KEM_SUPPORT
     116              : #if !LIBSPDM_ML_KEM_512_SUPPORT
     117              :         LIBSPDM_ASSERT(kem_alg != SPDM_ALGORITHMS_KEM_ALG_ML_KEM_512);
     118              : #endif
     119              : #if !LIBSPDM_ML_KEM_768_SUPPORT
     120              :         LIBSPDM_ASSERT(kem_alg != SPDM_ALGORITHMS_KEM_ALG_ML_KEM_768);
     121              : #endif
     122              : #if !LIBSPDM_ML_KEM_1024_SUPPORT
     123              :         LIBSPDM_ASSERT(kem_alg != SPDM_ALGORITHMS_KEM_ALG_ML_KEM_1024);
     124              : #endif
     125              :         return libspdm_mlkem_new_by_name(nid);
     126              : #else
     127            0 :         LIBSPDM_ASSERT(false);
     128            0 :         return NULL;
     129              : #endif
     130            0 :     default:
     131            0 :         LIBSPDM_ASSERT(false);
     132            0 :         return NULL;
     133              :     }
     134              : }
     135              : 
     136            0 : void libspdm_kem_free(uint32_t kem_alg, void *context)
     137              : {
     138            0 :     if (context == NULL) {
     139            0 :         return;
     140              :     }
     141            0 :     switch (kem_alg) {
     142            0 :     case SPDM_ALGORITHMS_KEM_ALG_ML_KEM_512:
     143              :     case SPDM_ALGORITHMS_KEM_ALG_ML_KEM_768:
     144              :     case SPDM_ALGORITHMS_KEM_ALG_ML_KEM_1024:
     145              : #if LIBSPDM_ML_KEM_SUPPORT
     146              :         libspdm_mlkem_free(context);
     147              : #else
     148            0 :         LIBSPDM_ASSERT(false);
     149              : #endif
     150            0 :         break;
     151            0 :     default:
     152            0 :         LIBSPDM_ASSERT(false);
     153            0 :         break;
     154              :     }
     155              : }
     156              : 
     157            0 : bool libspdm_kem_generate_key(uint32_t kem_alg, void *context,
     158              :                               uint8_t *encap_key,
     159              :                               size_t *encap_key_size)
     160              : {
     161            0 :     switch (kem_alg) {
     162            0 :     case SPDM_ALGORITHMS_KEM_ALG_ML_KEM_512:
     163              :     case SPDM_ALGORITHMS_KEM_ALG_ML_KEM_768:
     164              :     case SPDM_ALGORITHMS_KEM_ALG_ML_KEM_1024:
     165              : #if LIBSPDM_ML_KEM_SUPPORT
     166              : #if !LIBSPDM_ML_KEM_512_SUPPORT
     167              :         LIBSPDM_ASSERT(kem_alg != SPDM_ALGORITHMS_KEM_ALG_ML_KEM_512);
     168              : #endif
     169              : #if !LIBSPDM_ML_KEM_768_SUPPORT
     170              :         LIBSPDM_ASSERT(kem_alg != SPDM_ALGORITHMS_KEM_ALG_ML_KEM_768);
     171              : #endif
     172              : #if !LIBSPDM_ML_KEM_1024_SUPPORT
     173              :         LIBSPDM_ASSERT(kem_alg != SPDM_ALGORITHMS_KEM_ALG_ML_KEM_1024);
     174              : #endif
     175              :         return libspdm_mlkem_generate_key(context, encap_key, encap_key_size);
     176              : #else
     177            0 :         LIBSPDM_ASSERT(false);
     178            0 :         return false;
     179              : #endif
     180            0 :     default:
     181            0 :         LIBSPDM_ASSERT(false);
     182            0 :         return false;
     183              :     }
     184              : }
     185              : 
     186            0 : bool libspdm_kem_encapsulate(uint32_t kem_alg, void *context,
     187              :                              const uint8_t *peer_encap_key,
     188              :                              size_t peer_encap_key_size,
     189              :                              uint8_t *cipher_text,
     190              :                              size_t *cipher_text_size,
     191              :                              uint8_t *shared_secret,
     192              :                              size_t *shared_secret_size)
     193              : {
     194            0 :     switch (kem_alg) {
     195            0 :     case SPDM_ALGORITHMS_KEM_ALG_ML_KEM_512:
     196              :     case SPDM_ALGORITHMS_KEM_ALG_ML_KEM_768:
     197              :     case SPDM_ALGORITHMS_KEM_ALG_ML_KEM_1024:
     198              : #if LIBSPDM_ML_KEM_SUPPORT
     199              : #if !LIBSPDM_ML_KEM_512_SUPPORT
     200              :         LIBSPDM_ASSERT(kem_alg != SPDM_ALGORITHMS_KEM_ALG_ML_KEM_512);
     201              : #endif
     202              : #if !LIBSPDM_ML_KEM_768_SUPPORT
     203              :         LIBSPDM_ASSERT(kem_alg != SPDM_ALGORITHMS_KEM_ALG_ML_KEM_768);
     204              : #endif
     205              : #if !LIBSPDM_ML_KEM_1024_SUPPORT
     206              :         LIBSPDM_ASSERT(kem_alg != SPDM_ALGORITHMS_KEM_ALG_ML_KEM_1024);
     207              : #endif
     208              :         return libspdm_mlkem_encapsulate (context, peer_encap_key, peer_encap_key_size,
     209              :                                           cipher_text, cipher_text_size,
     210              :                                           shared_secret, shared_secret_size);
     211              : #else
     212            0 :         LIBSPDM_ASSERT(false);
     213            0 :         return false;
     214              : #endif
     215            0 :     default:
     216            0 :         LIBSPDM_ASSERT(false);
     217            0 :         return false;
     218              :     }
     219              : }
     220              : 
     221            0 : bool libspdm_kem_decapsulate(uint32_t kem_alg, void *context,
     222              :                              const uint8_t *peer_cipher_text,
     223              :                              size_t peer_cipher_text_size,
     224              :                              uint8_t *shared_secret,
     225              :                              size_t *shared_secret_size)
     226              : {
     227            0 :     switch (kem_alg) {
     228            0 :     case SPDM_ALGORITHMS_KEM_ALG_ML_KEM_512:
     229              :     case SPDM_ALGORITHMS_KEM_ALG_ML_KEM_768:
     230              :     case SPDM_ALGORITHMS_KEM_ALG_ML_KEM_1024:
     231              : #if LIBSPDM_ML_KEM_SUPPORT
     232              : #if !LIBSPDM_ML_KEM_512_SUPPORT
     233              :         LIBSPDM_ASSERT(kem_alg != SPDM_ALGORITHMS_KEM_ALG_ML_KEM_512);
     234              : #endif
     235              : #if !LIBSPDM_ML_KEM_768_SUPPORT
     236              :         LIBSPDM_ASSERT(kem_alg != SPDM_ALGORITHMS_KEM_ALG_ML_KEM_768);
     237              : #endif
     238              : #if !LIBSPDM_ML_KEM_1024_SUPPORT
     239              :         LIBSPDM_ASSERT(kem_alg != SPDM_ALGORITHMS_KEM_ALG_ML_KEM_1024);
     240              : #endif
     241              :         return libspdm_mlkem_decapsulate (context, peer_cipher_text, peer_cipher_text_size,
     242              :                                           shared_secret, shared_secret_size);
     243              : #else
     244            0 :         LIBSPDM_ASSERT(false);
     245            0 :         return false;
     246              : #endif
     247            0 :     default:
     248            0 :         LIBSPDM_ASSERT(false);
     249            0 :         return false;
     250              :     }
     251              : }
        

Generated by: LCOV version 2.0-1