LCOV - code coverage report
Current view: top level - os_stub/spdm_device_secret_lib_sample - read_pub_cert_pqc.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 0.0 % 904 0
Test Date: 2025-12-21 08:10:27 Functions: 0.0 % 9 0

            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 <stdarg.h>
       8              : #include <stddef.h>
       9              : #include <setjmp.h>
      10              : #include <stdint.h>
      11              : #include <stdlib.h>
      12              : #include <stdio.h>
      13              : #include <assert.h>
      14              : #include <string.h>
      15              : 
      16              : #include <base.h>
      17              : #include "library/memlib.h"
      18              : #include "spdm_device_secret_lib_internal.h"
      19              : 
      20            0 : bool libspdm_read_pqc_responder_root_public_certificate(uint32_t base_hash_algo,
      21              :                                                         uint32_t pqc_asym_algo,
      22              :                                                         void **data, size_t *size,
      23              :                                                         void **hash,
      24              :                                                         size_t *hash_size)
      25              : {
      26              :     bool res;
      27              :     void *file_data;
      28              :     size_t file_size;
      29              :     spdm_cert_chain_t *cert_chain;
      30              :     size_t cert_chain_size;
      31              :     char *file;
      32              :     size_t digest_size;
      33              : 
      34            0 :     *data = NULL;
      35            0 :     *size = 0;
      36            0 :     if (hash != NULL) {
      37            0 :         *hash = NULL;
      38              :     }
      39            0 :     if (hash_size != NULL) {
      40            0 :         *hash_size = 0;
      41              :     }
      42              : 
      43            0 :     if (pqc_asym_algo == 0) {
      44            0 :         return false;
      45              :     }
      46              : 
      47            0 :     switch (pqc_asym_algo) {
      48            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_44:
      49            0 :         file = "mldsa44/ca.cert.der";
      50            0 :         break;
      51            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_65:
      52            0 :         file = "mldsa65/ca.cert.der";
      53            0 :         break;
      54            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_87:
      55            0 :         file = "mldsa87/ca.cert.der";
      56            0 :         break;
      57            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128S:
      58            0 :         file = "slh-dsa-sha2-128s/ca.cert.der";
      59            0 :         break;
      60            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128S:
      61            0 :         file = "slh-dsa-shake-128s/ca.cert.der";
      62            0 :         break;
      63            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128F:
      64            0 :         file = "slh-dsa-sha2-128f/ca.cert.der";
      65            0 :         break;
      66            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128F:
      67            0 :         file = "slh-dsa-shake-128f/ca.cert.der";
      68            0 :         break;
      69            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192S:
      70            0 :         file = "slh-dsa-sha2-192s/ca.cert.der";
      71            0 :         break;
      72            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192S:
      73            0 :         file = "slh-dsa-shake-192s/ca.cert.der";
      74            0 :         break;
      75            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192F:
      76            0 :         file = "slh-dsa-sha2-192f/ca.cert.der";
      77            0 :         break;
      78            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192F:
      79            0 :         file = "slh-dsa-shake-192f/ca.cert.der";
      80            0 :         break;
      81            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256S:
      82            0 :         file = "slh-dsa-sha2-256s/ca.cert.der";
      83            0 :         break;
      84            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256S:
      85            0 :         file = "slh-dsa-shake-256s/ca.cert.der";
      86            0 :         break;
      87            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256F:
      88            0 :         file = "slh-dsa-sha2-256f/ca.cert.der";
      89            0 :         break;
      90            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256F:
      91            0 :         file = "slh-dsa-shake-256f/ca.cert.der";
      92            0 :         break;
      93            0 :     default:
      94            0 :         LIBSPDM_ASSERT(false);
      95            0 :         return false;
      96              :     }
      97            0 :     res = libspdm_read_input_file(file, &file_data, &file_size);
      98            0 :     if (!res) {
      99            0 :         return res;
     100              :     }
     101              : 
     102            0 :     digest_size = libspdm_get_hash_size(base_hash_algo);
     103              : 
     104            0 :     cert_chain_size = sizeof(spdm_cert_chain_t) + digest_size + file_size;
     105            0 :     cert_chain = (void *)malloc(cert_chain_size);
     106            0 :     if (cert_chain == NULL) {
     107            0 :         free(file_data);
     108            0 :         return false;
     109              :     }
     110            0 :     cert_chain->length = (uint32_t)cert_chain_size;
     111              : 
     112            0 :     res = libspdm_hash_all(base_hash_algo, file_data, file_size,
     113            0 :                            (uint8_t *)(cert_chain + 1));
     114            0 :     if (!res) {
     115            0 :         free(file_data);
     116            0 :         free(cert_chain);
     117            0 :         return res;
     118              :     }
     119            0 :     libspdm_copy_mem((uint8_t *)cert_chain + sizeof(spdm_cert_chain_t) + digest_size,
     120            0 :                      cert_chain_size - (sizeof(spdm_cert_chain_t) + digest_size),
     121              :                      file_data, file_size);
     122              : 
     123            0 :     *data = cert_chain;
     124            0 :     *size = cert_chain_size;
     125            0 :     if (hash != NULL) {
     126            0 :         *hash = (cert_chain + 1);
     127              :     }
     128            0 :     if (hash_size != NULL) {
     129            0 :         *hash_size = digest_size;
     130              :     }
     131              : 
     132            0 :     free(file_data);
     133            0 :     return true;
     134              : }
     135              : 
     136            0 : bool libspdm_read_pqc_responder_root_public_certificate_slot(uint8_t slot_id,
     137              :                                                              uint32_t base_hash_algo,
     138              :                                                              uint32_t pqc_asym_algo,
     139              :                                                              void **data, size_t *size,
     140              :                                                              void **hash,
     141              :                                                              size_t *hash_size)
     142              : {
     143              :     bool res;
     144              :     void *file_data;
     145              :     size_t file_size;
     146              :     spdm_cert_chain_t *cert_chain;
     147              :     size_t cert_chain_size;
     148              :     char *file;
     149              :     size_t digest_size;
     150              : 
     151            0 :     *data = NULL;
     152            0 :     *size = 0;
     153            0 :     if (hash != NULL) {
     154            0 :         *hash = NULL;
     155              :     }
     156            0 :     if (hash_size != NULL) {
     157            0 :         *hash_size = 0;
     158              :     }
     159              : 
     160            0 :     if (pqc_asym_algo == 0) {
     161            0 :         return false;
     162              :     }
     163              : 
     164            0 :     if (slot_id == 0) {
     165            0 :         switch (pqc_asym_algo) {
     166            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_44:
     167            0 :             file = "mldsa44/ca.cert.der";
     168            0 :             break;
     169            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_65:
     170            0 :             file = "mldsa65/ca.cert.der";
     171            0 :             break;
     172            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_87:
     173            0 :             file = "mldsa87/ca.cert.der";
     174            0 :             break;
     175            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128S:
     176            0 :             file = "slh-dsa-sha2-128s/ca.cert.der";
     177            0 :             break;
     178            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128S:
     179            0 :             file = "slh-dsa-shake-128s/ca.cert.der";
     180            0 :             break;
     181            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128F:
     182            0 :             file = "slh-dsa-sha2-128f/ca.cert.der";
     183            0 :             break;
     184            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128F:
     185            0 :             file = "slh-dsa-shake-128f/ca.cert.der";
     186            0 :             break;
     187            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192S:
     188            0 :             file = "slh-dsa-sha2-192s/ca.cert.der";
     189            0 :             break;
     190            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192S:
     191            0 :             file = "slh-dsa-shake-192s/ca.cert.der";
     192            0 :             break;
     193            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192F:
     194            0 :             file = "slh-dsa-sha2-192f/ca.cert.der";
     195            0 :             break;
     196            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192F:
     197            0 :             file = "slh-dsa-shake-192f/ca.cert.der";
     198            0 :             break;
     199            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256S:
     200            0 :             file = "slh-dsa-sha2-256s/ca.cert.der";
     201            0 :             break;
     202            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256S:
     203            0 :             file = "slh-dsa-shake-256s/ca.cert.der";
     204            0 :             break;
     205            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256F:
     206            0 :             file = "slh-dsa-sha2-256f/ca.cert.der";
     207            0 :             break;
     208            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256F:
     209            0 :             file = "slh-dsa-shake-256f/ca.cert.der";
     210            0 :             break;
     211            0 :         default:
     212            0 :             LIBSPDM_ASSERT(false);
     213            0 :             return false;
     214              :         }
     215              :     } else {
     216            0 :         switch (pqc_asym_algo) {
     217            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_44:
     218            0 :             file = "mldsa44/ca1.cert.der";
     219            0 :             break;
     220            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_65:
     221            0 :             file = "mldsa65/ca1.cert.der";
     222            0 :             break;
     223            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_87:
     224            0 :             file = "mldsa87/ca1.cert.der";
     225            0 :             break;
     226            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128S:
     227            0 :             file = "slh-dsa-sha2-128s/ca1.cert.der";
     228            0 :             break;
     229            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128S:
     230            0 :             file = "slh-dsa-shake-128s/ca1.cert.der";
     231            0 :             break;
     232            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128F:
     233            0 :             file = "slh-dsa-sha2-128f/ca1.cert.der";
     234            0 :             break;
     235            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128F:
     236            0 :             file = "slh-dsa-shake-128f/ca1.cert.der";
     237            0 :             break;
     238            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192S:
     239            0 :             file = "slh-dsa-sha2-192s/ca1.cert.der";
     240            0 :             break;
     241            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192S:
     242            0 :             file = "slh-dsa-shake-192s/ca1.cert.der";
     243            0 :             break;
     244            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192F:
     245            0 :             file = "slh-dsa-sha2-192f/ca1.cert.der";
     246            0 :             break;
     247            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192F:
     248            0 :             file = "slh-dsa-shake-192f/ca1.cert.der";
     249            0 :             break;
     250            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256S:
     251            0 :             file = "slh-dsa-sha2-256s/ca1.cert.der";
     252            0 :             break;
     253            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256S:
     254            0 :             file = "slh-dsa-shake-256s/ca1.cert.der";
     255            0 :             break;
     256            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256F:
     257            0 :             file = "slh-dsa-sha2-256f/ca1.cert.der";
     258            0 :             break;
     259            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256F:
     260            0 :             file = "slh-dsa-shake-256f/ca1.cert.der";
     261            0 :             break;
     262            0 :         default:
     263            0 :             LIBSPDM_ASSERT(false);
     264            0 :             return false;
     265              :         }
     266              :     }
     267            0 :     res = libspdm_read_input_file(file, &file_data, &file_size);
     268            0 :     if (!res) {
     269            0 :         return res;
     270              :     }
     271              : 
     272            0 :     digest_size = libspdm_get_hash_size(base_hash_algo);
     273              : 
     274            0 :     cert_chain_size = sizeof(spdm_cert_chain_t) + digest_size + file_size;
     275            0 :     cert_chain = (void *)malloc(cert_chain_size);
     276            0 :     if (cert_chain == NULL) {
     277            0 :         free(file_data);
     278            0 :         return false;
     279              :     }
     280            0 :     cert_chain->length = (uint32_t)cert_chain_size;
     281              : 
     282            0 :     res = libspdm_hash_all(base_hash_algo, file_data, file_size,
     283            0 :                            (uint8_t *)(cert_chain + 1));
     284            0 :     if (!res) {
     285            0 :         free(file_data);
     286            0 :         free(cert_chain);
     287            0 :         return res;
     288              :     }
     289            0 :     libspdm_copy_mem((uint8_t *)cert_chain + sizeof(spdm_cert_chain_t) + digest_size,
     290            0 :                      cert_chain_size - (sizeof(spdm_cert_chain_t) + digest_size),
     291              :                      file_data, file_size);
     292              : 
     293            0 :     *data = cert_chain;
     294            0 :     *size = cert_chain_size;
     295            0 :     if (hash != NULL) {
     296            0 :         *hash = (cert_chain + 1);
     297              :     }
     298            0 :     if (hash_size != NULL) {
     299            0 :         *hash_size = digest_size;
     300              :     }
     301              : 
     302            0 :     free(file_data);
     303            0 :     return true;
     304              : }
     305              : 
     306            0 : bool libspdm_read_pqc_requester_root_public_certificate(uint32_t base_hash_algo,
     307              :                                                         uint32_t req_pqc_asym_alg,
     308              :                                                         void **data, size_t *size,
     309              :                                                         void **hash,
     310              :                                                         size_t *hash_size)
     311              : {
     312              :     bool res;
     313              :     void *file_data;
     314              :     size_t file_size;
     315              :     spdm_cert_chain_t *cert_chain;
     316              :     size_t cert_chain_size;
     317              :     char *file;
     318              :     size_t digest_size;
     319              : 
     320            0 :     *data = NULL;
     321            0 :     *size = 0;
     322            0 :     if (hash != NULL) {
     323            0 :         *hash = NULL;
     324              :     }
     325            0 :     if (hash_size != NULL) {
     326            0 :         *hash_size = 0;
     327              :     }
     328              : 
     329            0 :     if (req_pqc_asym_alg == 0) {
     330            0 :         return false;
     331              :     }
     332              : 
     333            0 :     switch (req_pqc_asym_alg) {
     334            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_44:
     335            0 :         file = "mldsa44/ca.cert.der";
     336            0 :         break;
     337            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_65:
     338            0 :         file = "mldsa65/ca.cert.der";
     339            0 :         break;
     340            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_87:
     341            0 :         file = "mldsa87/ca.cert.der";
     342            0 :         break;
     343            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128S:
     344            0 :         file = "slh-dsa-sha2-128s/ca.cert.der";
     345            0 :         break;
     346            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128S:
     347            0 :         file = "slh-dsa-shake-128s/ca.cert.der";
     348            0 :         break;
     349            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128F:
     350            0 :         file = "slh-dsa-sha2-128f/ca.cert.der";
     351            0 :         break;
     352            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128F:
     353            0 :         file = "slh-dsa-shake-128f/ca.cert.der";
     354            0 :         break;
     355            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192S:
     356            0 :         file = "slh-dsa-sha2-192s/ca.cert.der";
     357            0 :         break;
     358            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192S:
     359            0 :         file = "slh-dsa-shake-192s/ca.cert.der";
     360            0 :         break;
     361            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192F:
     362            0 :         file = "slh-dsa-sha2-192f/ca.cert.der";
     363            0 :         break;
     364            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192F:
     365            0 :         file = "slh-dsa-shake-192f/ca.cert.der";
     366            0 :         break;
     367            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256S:
     368            0 :         file = "slh-dsa-sha2-256s/ca.cert.der";
     369            0 :         break;
     370            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256S:
     371            0 :         file = "slh-dsa-shake-256s/ca.cert.der";
     372            0 :         break;
     373            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256F:
     374            0 :         file = "slh-dsa-sha2-256f/ca.cert.der";
     375            0 :         break;
     376            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256F:
     377            0 :         file = "slh-dsa-shake-256f/ca.cert.der";
     378            0 :         break;
     379            0 :     default:
     380            0 :         LIBSPDM_ASSERT(false);
     381            0 :         return false;
     382              :     }
     383              : 
     384            0 :     digest_size = libspdm_get_hash_size(base_hash_algo);
     385              : 
     386            0 :     res = libspdm_read_input_file(file, &file_data, &file_size);
     387            0 :     if (!res) {
     388            0 :         return res;
     389              :     }
     390              : 
     391            0 :     cert_chain_size = sizeof(spdm_cert_chain_t) + digest_size + file_size;
     392            0 :     cert_chain = (void *)malloc(cert_chain_size);
     393            0 :     if (cert_chain == NULL) {
     394            0 :         free(file_data);
     395            0 :         return false;
     396              :     }
     397            0 :     cert_chain->length = (uint32_t)cert_chain_size;
     398            0 :     res = libspdm_hash_all(base_hash_algo, file_data, file_size,
     399            0 :                            (uint8_t *)(cert_chain + 1));
     400            0 :     if (!res) {
     401            0 :         free(file_data);
     402            0 :         free(cert_chain);
     403            0 :         return res;
     404              :     }
     405            0 :     libspdm_copy_mem((uint8_t *)cert_chain + sizeof(spdm_cert_chain_t) + digest_size,
     406            0 :                      cert_chain_size - (sizeof(spdm_cert_chain_t) + digest_size),
     407              :                      file_data, file_size);
     408              : 
     409            0 :     *data = cert_chain;
     410            0 :     *size = cert_chain_size;
     411            0 :     if (hash != NULL) {
     412            0 :         *hash = (cert_chain + 1);
     413              :     }
     414            0 :     if (hash_size != NULL) {
     415            0 :         *hash_size = digest_size;
     416              :     }
     417              : 
     418            0 :     free(file_data);
     419            0 :     return true;
     420              : }
     421              : 
     422            0 : bool libspdm_read_pqc_responder_public_certificate_chain(
     423              :     uint32_t base_hash_algo, uint32_t pqc_asym_algo, void **data,
     424              :     size_t *size, void **hash, size_t *hash_size)
     425              : {
     426              :     bool res;
     427              :     void *file_data;
     428              :     size_t file_size;
     429              :     spdm_cert_chain_t *cert_chain;
     430              :     size_t cert_chain_size;
     431              :     char *file;
     432              :     const uint8_t *root_cert;
     433              :     size_t root_cert_len;
     434              :     size_t digest_size;
     435              :     bool is_requester_cert;
     436              :     uint8_t cert_model;
     437              : 
     438            0 :     is_requester_cert = false;
     439              : 
     440              :     /*default is device cert*/
     441            0 :     cert_model = SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT;
     442              : 
     443            0 :     *data = NULL;
     444            0 :     *size = 0;
     445            0 :     if (hash != NULL) {
     446            0 :         *hash = NULL;
     447              :     }
     448            0 :     if (hash_size != NULL) {
     449            0 :         *hash_size = 0;
     450              :     }
     451              : 
     452            0 :     if (pqc_asym_algo == 0) {
     453            0 :         return false;
     454              :     }
     455              : 
     456            0 :     switch (pqc_asym_algo) {
     457            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_44:
     458            0 :         file = "mldsa44/bundle_responder.certchain.der";
     459            0 :         break;
     460            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_65:
     461            0 :         file = "mldsa65/bundle_responder.certchain.der";
     462            0 :         break;
     463            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_87:
     464            0 :         file = "mldsa87/bundle_responder.certchain.der";
     465            0 :         break;
     466            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128S:
     467            0 :         file = "slh-dsa-sha2-128s/bundle_responder.certchain.der";
     468            0 :         break;
     469            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128S:
     470            0 :         file = "slh-dsa-shake-128s/bundle_responder.certchain.der";
     471            0 :         break;
     472            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128F:
     473            0 :         file = "slh-dsa-sha2-128f/bundle_responder.certchain.der";
     474            0 :         break;
     475            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128F:
     476            0 :         file = "slh-dsa-shake-128f/bundle_responder.certchain.der";
     477            0 :         break;
     478            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192S:
     479            0 :         file = "slh-dsa-sha2-192s/bundle_responder.certchain.der";
     480            0 :         break;
     481            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192S:
     482            0 :         file = "slh-dsa-shake-192s/bundle_responder.certchain.der";
     483            0 :         break;
     484            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192F:
     485            0 :         file = "slh-dsa-sha2-192f/bundle_responder.certchain.der";
     486            0 :         break;
     487            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192F:
     488            0 :         file = "slh-dsa-shake-192f/bundle_responder.certchain.der";
     489            0 :         break;
     490            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256S:
     491            0 :         file = "slh-dsa-sha2-256s/bundle_responder.certchain.der";
     492            0 :         break;
     493            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256S:
     494            0 :         file = "slh-dsa-shake-256s/bundle_responder.certchain.der";
     495            0 :         break;
     496            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256F:
     497            0 :         file = "slh-dsa-sha2-256f/bundle_responder.certchain.der";
     498            0 :         break;
     499            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256F:
     500            0 :         file = "slh-dsa-shake-256f/bundle_responder.certchain.der";
     501            0 :         break;
     502            0 :     default:
     503            0 :         LIBSPDM_ASSERT(false);
     504            0 :         return false;
     505              :     }
     506            0 :     res = libspdm_read_input_file(file, &file_data, &file_size);
     507            0 :     if (!res) {
     508            0 :         return res;
     509              :     }
     510              : 
     511            0 :     digest_size = libspdm_get_hash_size(base_hash_algo);
     512              : 
     513            0 :     cert_chain_size = sizeof(spdm_cert_chain_t) + digest_size + file_size;
     514            0 :     cert_chain = (void *)malloc(cert_chain_size);
     515            0 :     if (cert_chain == NULL) {
     516            0 :         free(file_data);
     517            0 :         return false;
     518              :     }
     519            0 :     cert_chain->length = (uint32_t)cert_chain_size;
     520              : 
     521            0 :     res = libspdm_verify_cert_chain_data(
     522              :         SPDM_MESSAGE_VERSION_14,
     523              :         file_data, file_size,
     524              :         0, pqc_asym_algo, base_hash_algo,
     525              :         is_requester_cert, cert_model);
     526            0 :     if (!res) {
     527            0 :         free(file_data);
     528            0 :         free(cert_chain);
     529            0 :         return res;
     530              :     }
     531              : 
     532              : 
     533              :     /* Get Root Certificate and calculate hash value*/
     534              : 
     535            0 :     res = libspdm_x509_get_cert_from_cert_chain(file_data, file_size, 0, &root_cert,
     536              :                                                 &root_cert_len);
     537            0 :     if (!res) {
     538            0 :         free(file_data);
     539            0 :         free(cert_chain);
     540            0 :         return res;
     541              :     }
     542              : 
     543            0 :     res = libspdm_hash_all(base_hash_algo, root_cert, root_cert_len,
     544            0 :                            (uint8_t *)(cert_chain + 1));
     545            0 :     if (!res) {
     546            0 :         free(file_data);
     547            0 :         free(cert_chain);
     548            0 :         return res;
     549              :     }
     550            0 :     libspdm_copy_mem((uint8_t *)cert_chain + sizeof(spdm_cert_chain_t) + digest_size,
     551            0 :                      cert_chain_size - (sizeof(spdm_cert_chain_t) + digest_size),
     552              :                      file_data, file_size);
     553              : 
     554            0 :     *data = cert_chain;
     555            0 :     *size = cert_chain_size;
     556            0 :     if (hash != NULL) {
     557            0 :         *hash = (cert_chain + 1);
     558              :     }
     559            0 :     if (hash_size != NULL) {
     560            0 :         *hash_size = digest_size;
     561              :     }
     562              : 
     563            0 :     free(file_data);
     564            0 :     return true;
     565              : }
     566              : 
     567              : /*This alias cert chain is partial, from root CA to device certificate CA.*/
     568            0 : bool libspdm_read_pqc_responder_public_certificate_chain_alias_cert_till_dev_cert_ca(
     569              :     uint32_t base_hash_algo, uint32_t pqc_asym_algo, void **data,
     570              :     size_t *size, void **hash, size_t *hash_size)
     571              : {
     572              :     bool res;
     573              :     void *file_data;
     574              :     size_t file_size;
     575              :     spdm_cert_chain_t *cert_chain;
     576              :     size_t cert_chain_size;
     577              :     char *file;
     578              :     const uint8_t *root_cert;
     579              :     size_t root_cert_len;
     580              :     const uint8_t *leaf_cert;
     581              :     size_t leaf_cert_len;
     582              :     size_t digest_size;
     583              :     bool is_requester_cert;
     584              :     uint8_t cert_model;
     585              : 
     586            0 :     is_requester_cert = false;
     587              : 
     588              :     /*default is alias cert*/
     589            0 :     cert_model = SPDM_CERTIFICATE_INFO_CERT_MODEL_ALIAS_CERT;
     590              : 
     591            0 :     *data = NULL;
     592            0 :     *size = 0;
     593            0 :     if (hash != NULL) {
     594            0 :         *hash = NULL;
     595              :     }
     596            0 :     if (hash_size != NULL) {
     597            0 :         *hash_size = 0;
     598              :     }
     599              : 
     600            0 :     if (pqc_asym_algo == 0) {
     601            0 :         return false;
     602              :     }
     603              : 
     604            0 :     switch (pqc_asym_algo) {
     605            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_44:
     606            0 :         file = "mldsa44/bundle_responder.certchain_alias_cert_partial_set.der";
     607            0 :         break;
     608            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_65:
     609            0 :         file = "mldsa65/bundle_responder.certchain_alias_cert_partial_set.der";
     610            0 :         break;
     611            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_87:
     612            0 :         file = "mldsa87/bundle_responder.certchain_alias_cert_partial_set.der";
     613            0 :         break;
     614            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128S:
     615            0 :         file = "slh-dsa-sha2-128s/bundle_responder.certchain_alias_cert_partial_set.der";
     616            0 :         break;
     617            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128S:
     618            0 :         file = "slh-dsa-shake-128s/bundle_responder.certchain_alias_cert_partial_set.der";
     619            0 :         break;
     620            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128F:
     621            0 :         file = "slh-dsa-sha2-128f/bundle_responder.certchain_alias_cert_partial_set.der";
     622            0 :         break;
     623            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128F:
     624            0 :         file = "slh-dsa-shake-128f/bundle_responder.certchain_alias_cert_partial_set.der";
     625            0 :         break;
     626            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192S:
     627            0 :         file = "slh-dsa-sha2-192s/bundle_responder.certchain_alias_cert_partial_set.der";
     628            0 :         break;
     629            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192S:
     630            0 :         file = "slh-dsa-shake-192s/bundle_responder.certchain_alias_cert_partial_set.der";
     631            0 :         break;
     632            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192F:
     633            0 :         file = "slh-dsa-sha2-192f/bundle_responder.certchain_alias_cert_partial_set.der";
     634            0 :         break;
     635            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192F:
     636            0 :         file = "slh-dsa-shake-192f/bundle_responder.certchain_alias_cert_partial_set.der";
     637            0 :         break;
     638            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256S:
     639            0 :         file = "slh-dsa-sha2-256s/bundle_responder.certchain_alias_cert_partial_set.der";
     640            0 :         break;
     641            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256S:
     642            0 :         file = "slh-dsa-shake-256s/bundle_responder.certchain_alias_cert_partial_set.der";
     643            0 :         break;
     644            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256F:
     645            0 :         file = "slh-dsa-sha2-256f/bundle_responder.certchain_alias_cert_partial_set.der";
     646            0 :         break;
     647            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256F:
     648            0 :         file = "slh-dsa-shake-256f/bundle_responder.certchain_alias_cert_partial_set.der";
     649            0 :         break;
     650            0 :     default:
     651            0 :         LIBSPDM_ASSERT(false);
     652            0 :         return false;
     653              :     }
     654            0 :     res = libspdm_read_input_file(file, &file_data, &file_size);
     655            0 :     if (!res) {
     656            0 :         return res;
     657              :     }
     658              : 
     659            0 :     digest_size = libspdm_get_hash_size(base_hash_algo);
     660              : 
     661            0 :     cert_chain_size = sizeof(spdm_cert_chain_t) + digest_size + file_size;
     662            0 :     cert_chain = (void *)malloc(cert_chain_size);
     663            0 :     if (cert_chain == NULL) {
     664            0 :         free(file_data);
     665            0 :         return false;
     666              :     }
     667            0 :     cert_chain->length = (uint32_t)cert_chain_size;
     668              : 
     669              :     /* Get leaf Certificate*/
     670            0 :     res = libspdm_x509_get_cert_from_cert_chain(file_data, file_size, -1, &leaf_cert,
     671              :                                                 &leaf_cert_len);
     672            0 :     if (!res) {
     673            0 :         free(file_data);
     674            0 :         free(cert_chain);
     675            0 :         return res;
     676              :     }
     677              : 
     678            0 :     res = libspdm_x509_set_cert_certificate_check(
     679              :         SPDM_MESSAGE_VERSION_14,
     680              :         leaf_cert, leaf_cert_len,
     681              :         0, pqc_asym_algo, base_hash_algo,
     682              :         is_requester_cert, cert_model);
     683            0 :     if (!res) {
     684            0 :         free(file_data);
     685            0 :         free(cert_chain);
     686            0 :         return res;
     687              :     }
     688              : 
     689              :     /* Get Root Certificate*/
     690            0 :     res = libspdm_x509_get_cert_from_cert_chain(file_data, file_size, 0, &root_cert,
     691              :                                                 &root_cert_len);
     692            0 :     if (!res) {
     693            0 :         free(file_data);
     694            0 :         free(cert_chain);
     695            0 :         return res;
     696              :     }
     697              : 
     698              :     /*verify cert_chain*/
     699            0 :     res = libspdm_x509_verify_cert_chain(root_cert, root_cert_len, file_data, file_size);
     700            0 :     if (!res) {
     701            0 :         free(file_data);
     702            0 :         free(cert_chain);
     703            0 :         return res;
     704              :     }
     705              : 
     706              :     /*calculate hash value*/
     707            0 :     res = libspdm_hash_all(base_hash_algo, root_cert, root_cert_len,
     708            0 :                            (uint8_t *)(cert_chain + 1));
     709            0 :     if (!res) {
     710            0 :         free(file_data);
     711            0 :         free(cert_chain);
     712            0 :         return res;
     713              :     }
     714            0 :     libspdm_copy_mem((uint8_t *)cert_chain + sizeof(spdm_cert_chain_t) + digest_size,
     715            0 :                      cert_chain_size - (sizeof(spdm_cert_chain_t) + digest_size),
     716              :                      file_data, file_size);
     717              : 
     718            0 :     *data = cert_chain;
     719            0 :     *size = cert_chain_size;
     720            0 :     if (hash != NULL) {
     721            0 :         *hash = (cert_chain + 1);
     722              :     }
     723            0 :     if (hash_size != NULL) {
     724            0 :         *hash_size = digest_size;
     725              :     }
     726              : 
     727            0 :     free(file_data);
     728            0 :     return true;
     729              : }
     730              : 
     731              : /*This alias cert chain is entire, from root CA to leaf certificate.*/
     732            0 : bool libspdm_read_pqc_responder_public_certificate_chain_alias_cert(
     733              :     uint32_t base_hash_algo, uint32_t pqc_asym_algo, void **data,
     734              :     size_t *size, void **hash, size_t *hash_size)
     735              : {
     736              :     bool res;
     737              :     void *file_data;
     738              :     size_t file_size;
     739              :     spdm_cert_chain_t *cert_chain;
     740              :     size_t cert_chain_size;
     741              :     char *file;
     742              :     const uint8_t *root_cert;
     743              :     size_t root_cert_len;
     744              :     const uint8_t *leaf_cert;
     745              :     size_t leaf_cert_len;
     746              :     size_t digest_size;
     747              :     bool is_requester_cert;
     748              :     uint8_t cert_model;
     749              : 
     750            0 :     is_requester_cert = false;
     751              : 
     752              :     /*default is alias cert*/
     753            0 :     cert_model = SPDM_CERTIFICATE_INFO_CERT_MODEL_ALIAS_CERT;
     754              : 
     755            0 :     *data = NULL;
     756            0 :     *size = 0;
     757            0 :     if (hash != NULL) {
     758            0 :         *hash = NULL;
     759              :     }
     760            0 :     if (hash_size != NULL) {
     761            0 :         *hash_size = 0;
     762              :     }
     763              : 
     764            0 :     if (pqc_asym_algo == 0) {
     765            0 :         return false;
     766              :     }
     767              : 
     768            0 :     switch (pqc_asym_algo) {
     769            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_44:
     770            0 :         file = "mldsa44/bundle_responder.certchain_alias.der";
     771            0 :         break;
     772            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_65:
     773            0 :         file = "mldsa65/bundle_responder.certchain_alias.der";
     774            0 :         break;
     775            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_87:
     776            0 :         file = "mldsa87/bundle_responder.certchain_alias.der";
     777            0 :         break;
     778            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128S:
     779            0 :         file = "slh-dsa-sha2-128s/bundle_responder.certchain_alias.der";
     780            0 :         break;
     781            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128S:
     782            0 :         file = "slh-dsa-shake-128s/bundle_responder.certchain_alias.der";
     783            0 :         break;
     784            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128F:
     785            0 :         file = "slh-dsa-sha2-128f/bundle_responder.certchain_alias.der";
     786            0 :         break;
     787            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128F:
     788            0 :         file = "slh-dsa-shake-128f/bundle_responder.certchain_alias.der";
     789            0 :         break;
     790            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192S:
     791            0 :         file = "slh-dsa-sha2-192s/bundle_responder.certchain_alias.der";
     792            0 :         break;
     793            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192S:
     794            0 :         file = "slh-dsa-shake-192s/bundle_responder.certchain_alias.der";
     795            0 :         break;
     796            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192F:
     797            0 :         file = "slh-dsa-sha2-192f/bundle_responder.certchain_alias.der";
     798            0 :         break;
     799            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192F:
     800            0 :         file = "slh-dsa-shake-192f/bundle_responder.certchain_alias.der";
     801            0 :         break;
     802            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256S:
     803            0 :         file = "slh-dsa-sha2-256s/bundle_responder.certchain_alias.der";
     804            0 :         break;
     805            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256S:
     806            0 :         file = "slh-dsa-shake-256s/bundle_responder.certchain_alias.der";
     807            0 :         break;
     808            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256F:
     809            0 :         file = "slh-dsa-sha2-256f/bundle_responder.certchain_alias.der";
     810            0 :         break;
     811            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256F:
     812            0 :         file = "slh-dsa-shake-256f/bundle_responder.certchain_alias.der";
     813            0 :         break;
     814            0 :     default:
     815            0 :         LIBSPDM_ASSERT(false);
     816            0 :         return false;
     817              :     }
     818            0 :     res = libspdm_read_input_file(file, &file_data, &file_size);
     819            0 :     if (!res) {
     820            0 :         return res;
     821              :     }
     822              : 
     823            0 :     digest_size = libspdm_get_hash_size(base_hash_algo);
     824              : 
     825            0 :     cert_chain_size = sizeof(spdm_cert_chain_t) + digest_size + file_size;
     826            0 :     cert_chain = (void *)malloc(cert_chain_size);
     827            0 :     if (cert_chain == NULL) {
     828            0 :         free(file_data);
     829            0 :         return false;
     830              :     }
     831            0 :     cert_chain->length = (uint32_t)cert_chain_size;
     832              : 
     833              :     /* Get leaf Certificate*/
     834            0 :     res = libspdm_x509_get_cert_from_cert_chain(file_data, file_size, -1, &leaf_cert,
     835              :                                                 &leaf_cert_len);
     836            0 :     if (!res) {
     837            0 :         free(file_data);
     838            0 :         free(cert_chain);
     839            0 :         return res;
     840              :     }
     841              : 
     842            0 :     res = libspdm_x509_certificate_check(
     843              :         SPDM_MESSAGE_VERSION_14,
     844              :         leaf_cert, leaf_cert_len,
     845              :         0, pqc_asym_algo, base_hash_algo,
     846              :         is_requester_cert, cert_model);
     847            0 :     if (!res) {
     848            0 :         free(file_data);
     849            0 :         free(cert_chain);
     850            0 :         return res;
     851              :     }
     852              : 
     853              :     /* Get Root Certificate*/
     854            0 :     res = libspdm_x509_get_cert_from_cert_chain(file_data, file_size, 0, &root_cert,
     855              :                                                 &root_cert_len);
     856            0 :     if (!res) {
     857            0 :         free(file_data);
     858            0 :         free(cert_chain);
     859            0 :         return res;
     860              :     }
     861              : 
     862              :     /*verify cert_chain*/
     863            0 :     res = libspdm_x509_verify_cert_chain(root_cert, root_cert_len, file_data, file_size);
     864            0 :     if (!res) {
     865            0 :         free(file_data);
     866            0 :         free(cert_chain);
     867            0 :         return res;
     868              :     }
     869              : 
     870              :     /*calculate hash value*/
     871            0 :     res = libspdm_hash_all(base_hash_algo, root_cert, root_cert_len,
     872            0 :                            (uint8_t *)(cert_chain + 1));
     873            0 :     if (!res) {
     874            0 :         free(file_data);
     875            0 :         free(cert_chain);
     876            0 :         return res;
     877              :     }
     878            0 :     libspdm_copy_mem((uint8_t *)cert_chain + sizeof(spdm_cert_chain_t) + digest_size,
     879            0 :                      cert_chain_size - (sizeof(spdm_cert_chain_t) + digest_size),
     880              :                      file_data, file_size);
     881              : 
     882            0 :     *data = cert_chain;
     883            0 :     *size = cert_chain_size;
     884            0 :     if (hash != NULL) {
     885            0 :         *hash = (cert_chain + 1);
     886              :     }
     887            0 :     if (hash_size != NULL) {
     888            0 :         *hash_size = digest_size;
     889              :     }
     890              : 
     891            0 :     free(file_data);
     892            0 :     return true;
     893              : }
     894              : 
     895            0 : bool libspdm_read_pqc_responder_public_certificate_chain_per_slot(
     896              :     uint8_t slot_id, uint32_t base_hash_algo, uint32_t pqc_asym_algo,
     897              :     void **data, size_t *size, void **hash, size_t *hash_size)
     898              : {
     899              :     bool res;
     900              :     void *file_data;
     901              :     size_t file_size;
     902              :     spdm_cert_chain_t *cert_chain;
     903              :     size_t cert_chain_size;
     904              :     char *file;
     905              :     const uint8_t *root_cert;
     906              :     size_t root_cert_len;
     907              :     size_t digest_size;
     908              :     bool is_requester_cert;
     909              :     uint8_t cert_model;
     910              : 
     911            0 :     is_requester_cert = false;
     912              : 
     913              :     /*default is device cert*/
     914            0 :     cert_model = SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT;
     915              : 
     916            0 :     *data = NULL;
     917            0 :     *size = 0;
     918            0 :     if (hash != NULL) {
     919            0 :         *hash = NULL;
     920              :     }
     921            0 :     if (hash_size != NULL) {
     922            0 :         *hash_size = 0;
     923              :     }
     924              : 
     925            0 :     if (pqc_asym_algo == 0) {
     926            0 :         return false;
     927              :     }
     928              : 
     929            0 :     if (slot_id == 0) {
     930            0 :         switch (pqc_asym_algo) {
     931            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_44:
     932            0 :             file = "mldsa44/bundle_responder.certchain.der";
     933            0 :             break;
     934            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_65:
     935            0 :             file = "mldsa65/bundle_responder.certchain.der";
     936            0 :             break;
     937            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_87:
     938            0 :             file = "mldsa87/bundle_responder.certchain.der";
     939            0 :             break;
     940            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128S:
     941            0 :             file = "slh-dsa-sha2-128s/bundle_responder.certchain.der";
     942            0 :             break;
     943            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128S:
     944            0 :             file = "slh-dsa-shake-128s/bundle_responder.certchain.der";
     945            0 :             break;
     946            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128F:
     947            0 :             file = "slh-dsa-sha2-128f/bundle_responder.certchain.der";
     948            0 :             break;
     949            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128F:
     950            0 :             file = "slh-dsa-shake-128f/bundle_responder.certchain.der";
     951            0 :             break;
     952            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192S:
     953            0 :             file = "slh-dsa-sha2-192s/bundle_responder.certchain.der";
     954            0 :             break;
     955            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192S:
     956            0 :             file = "slh-dsa-shake-192s/bundle_responder.certchain.der";
     957            0 :             break;
     958            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192F:
     959            0 :             file = "slh-dsa-sha2-192f/bundle_responder.certchain.der";
     960            0 :             break;
     961            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192F:
     962            0 :             file = "slh-dsa-shake-192f/bundle_responder.certchain.der";
     963            0 :             break;
     964            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256S:
     965            0 :             file = "slh-dsa-sha2-256s/bundle_responder.certchain.der";
     966            0 :             break;
     967            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256S:
     968            0 :             file = "slh-dsa-shake-256s/bundle_responder.certchain.der";
     969            0 :             break;
     970            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256F:
     971            0 :             file = "slh-dsa-sha2-256f/bundle_responder.certchain.der";
     972            0 :             break;
     973            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256F:
     974            0 :             file = "slh-dsa-shake-256f/bundle_responder.certchain.der";
     975            0 :             break;
     976            0 :         default:
     977            0 :             LIBSPDM_ASSERT(false);
     978            0 :             return false;
     979              :         }
     980              :     } else {
     981            0 :         switch (pqc_asym_algo) {
     982            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_44:
     983            0 :             file = "mldsa44/bundle_responder.certchain1.der";
     984            0 :             break;
     985            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_65:
     986            0 :             file = "mldsa65/bundle_responder.certchain1.der";
     987            0 :             break;
     988            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_87:
     989            0 :             file = "mldsa87/bundle_responder.certchain1.der";
     990            0 :             break;
     991            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128S:
     992            0 :             file = "slh-dsa-sha2-128s/bundle_responder.certchain1.der";
     993            0 :             break;
     994            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128S:
     995            0 :             file = "slh-dsa-shake-128s/bundle_responder.certchain1.der";
     996            0 :             break;
     997            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128F:
     998            0 :             file = "slh-dsa-sha2-128f/bundle_responder.certchain1.der";
     999            0 :             break;
    1000            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128F:
    1001            0 :             file = "slh-dsa-shake-128f/bundle_responder.certchain1.der";
    1002            0 :             break;
    1003            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192S:
    1004            0 :             file = "slh-dsa-sha2-192s/bundle_responder.certchain1.der";
    1005            0 :             break;
    1006            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192S:
    1007            0 :             file = "slh-dsa-shake-192s/bundle_responder.certchain1.der";
    1008            0 :             break;
    1009            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192F:
    1010            0 :             file = "slh-dsa-sha2-192f/bundle_responder.certchain1.der";
    1011            0 :             break;
    1012            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192F:
    1013            0 :             file = "slh-dsa-shake-192f/bundle_responder.certchain1.der";
    1014            0 :             break;
    1015            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256S:
    1016            0 :             file = "slh-dsa-sha2-256s/bundle_responder.certchain1.der";
    1017            0 :             break;
    1018            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256S:
    1019            0 :             file = "slh-dsa-shake-256s/bundle_responder.certchain1.der";
    1020            0 :             break;
    1021            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256F:
    1022            0 :             file = "slh-dsa-sha2-256f/bundle_responder.certchain1.der";
    1023            0 :             break;
    1024            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256F:
    1025            0 :             file = "slh-dsa-shake-256f/bundle_responder.certchain1.der";
    1026            0 :             break;
    1027            0 :         default:
    1028            0 :             LIBSPDM_ASSERT(false);
    1029            0 :             return false;
    1030              :         }
    1031              :     }
    1032            0 :     res = libspdm_read_input_file(file, &file_data, &file_size);
    1033            0 :     if (!res) {
    1034            0 :         return res;
    1035              :     }
    1036              : 
    1037            0 :     digest_size = libspdm_get_hash_size(base_hash_algo);
    1038              : 
    1039            0 :     cert_chain_size = sizeof(spdm_cert_chain_t) + digest_size + file_size;
    1040            0 :     cert_chain = (void *)malloc(cert_chain_size);
    1041            0 :     if (cert_chain == NULL) {
    1042            0 :         free(file_data);
    1043            0 :         return false;
    1044              :     }
    1045            0 :     cert_chain->length = (uint32_t)cert_chain_size;
    1046              : 
    1047            0 :     res = libspdm_verify_cert_chain_data(
    1048              :         SPDM_MESSAGE_VERSION_14,
    1049              :         file_data, file_size,
    1050              :         0, pqc_asym_algo, base_hash_algo,
    1051              :         is_requester_cert, cert_model);
    1052            0 :     if (!res) {
    1053            0 :         free(file_data);
    1054            0 :         free(cert_chain);
    1055            0 :         return res;
    1056              :     }
    1057              : 
    1058              : 
    1059              :     /* Get Root Certificate and calculate hash value*/
    1060              : 
    1061            0 :     res = libspdm_x509_get_cert_from_cert_chain(file_data, file_size, 0, &root_cert,
    1062              :                                                 &root_cert_len);
    1063            0 :     if (!res) {
    1064            0 :         free(file_data);
    1065            0 :         free(cert_chain);
    1066            0 :         return res;
    1067              :     }
    1068              : 
    1069            0 :     res = libspdm_hash_all(base_hash_algo, root_cert, root_cert_len,
    1070            0 :                            (uint8_t *)(cert_chain + 1));
    1071            0 :     if (!res) {
    1072            0 :         free(file_data);
    1073            0 :         free(cert_chain);
    1074            0 :         return res;
    1075              :     }
    1076            0 :     libspdm_copy_mem((uint8_t *)cert_chain + sizeof(spdm_cert_chain_t) + digest_size,
    1077            0 :                      cert_chain_size - (sizeof(spdm_cert_chain_t) + digest_size),
    1078              :                      file_data, file_size);
    1079              : 
    1080            0 :     *data = cert_chain;
    1081            0 :     *size = cert_chain_size;
    1082            0 :     if (hash != NULL) {
    1083            0 :         *hash = (cert_chain + 1);
    1084              :     }
    1085            0 :     if (hash_size != NULL) {
    1086            0 :         *hash_size = digest_size;
    1087              :     }
    1088              : 
    1089            0 :     free(file_data);
    1090            0 :     return true;
    1091              : }
    1092              : 
    1093              : 
    1094            0 : bool libspdm_read_pqc_requester_public_certificate_chain(
    1095              :     uint32_t base_hash_algo, uint32_t req_pqc_asym_alg, void **data,
    1096              :     size_t *size, void **hash, size_t *hash_size)
    1097              : {
    1098              :     bool res;
    1099              :     void *file_data;
    1100              :     size_t file_size;
    1101              :     spdm_cert_chain_t *cert_chain;
    1102              :     size_t cert_chain_size;
    1103              :     char *file;
    1104              :     const uint8_t *root_cert;
    1105              :     size_t root_cert_len;
    1106              :     size_t digest_size;
    1107              :     bool is_requester_cert;
    1108              :     uint8_t cert_model;
    1109              : 
    1110            0 :     is_requester_cert = false;
    1111              : 
    1112              :     /*default is device cert*/
    1113            0 :     cert_model = SPDM_CERTIFICATE_INFO_CERT_MODEL_DEVICE_CERT;
    1114              : 
    1115            0 :     *data = NULL;
    1116            0 :     *size = 0;
    1117            0 :     if (hash != NULL) {
    1118            0 :         *hash = NULL;
    1119              :     }
    1120            0 :     if (hash_size != NULL) {
    1121            0 :         *hash_size = 0;
    1122              :     }
    1123              : 
    1124            0 :     if (req_pqc_asym_alg == 0) {
    1125            0 :         return false;
    1126              :     }
    1127              : 
    1128            0 :     switch (req_pqc_asym_alg) {
    1129            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_44:
    1130            0 :         file = "mldsa44/bundle_requester.certchain.der";
    1131            0 :         break;
    1132            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_65:
    1133            0 :         file = "mldsa65/bundle_requester.certchain.der";
    1134            0 :         break;
    1135            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_87:
    1136            0 :         file = "mldsa87/bundle_requester.certchain.der";
    1137            0 :         break;
    1138            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128S:
    1139            0 :         file = "slh-dsa-sha2-128s/bundle_requester.certchain.der";
    1140            0 :         break;
    1141            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128S:
    1142            0 :         file = "slh-dsa-shake-128s/bundle_requester.certchain.der";
    1143            0 :         break;
    1144            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128F:
    1145            0 :         file = "slh-dsa-sha2-128f/bundle_requester.certchain.der";
    1146            0 :         break;
    1147            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128F:
    1148            0 :         file = "slh-dsa-shake-128f/bundle_requester.certchain.der";
    1149            0 :         break;
    1150            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192S:
    1151            0 :         file = "slh-dsa-sha2-192s/bundle_requester.certchain.der";
    1152            0 :         break;
    1153            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192S:
    1154            0 :         file = "slh-dsa-shake-192s/bundle_requester.certchain.der";
    1155            0 :         break;
    1156            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192F:
    1157            0 :         file = "slh-dsa-sha2-192f/bundle_requester.certchain.der";
    1158            0 :         break;
    1159            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192F:
    1160            0 :         file = "slh-dsa-shake-192f/bundle_requester.certchain.der";
    1161            0 :         break;
    1162            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256S:
    1163            0 :         file = "slh-dsa-sha2-256s/bundle_requester.certchain.der";
    1164            0 :         break;
    1165            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256S:
    1166            0 :         file = "slh-dsa-shake-256s/bundle_requester.certchain.der";
    1167            0 :         break;
    1168            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256F:
    1169            0 :         file = "slh-dsa-sha2-256f/bundle_requester.certchain.der";
    1170            0 :         break;
    1171            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256F:
    1172            0 :         file = "slh-dsa-shake-256f/bundle_requester.certchain.der";
    1173            0 :         break;
    1174            0 :     default:
    1175            0 :         LIBSPDM_ASSERT(false);
    1176            0 :         return false;
    1177              :     }
    1178            0 :     res = libspdm_read_input_file(file, &file_data, &file_size);
    1179            0 :     if (!res) {
    1180            0 :         return res;
    1181              :     }
    1182              : 
    1183            0 :     digest_size = libspdm_get_hash_size(base_hash_algo);
    1184              : 
    1185            0 :     cert_chain_size = sizeof(spdm_cert_chain_t) + digest_size + file_size;
    1186            0 :     cert_chain = (void *)malloc(cert_chain_size);
    1187            0 :     if (cert_chain == NULL) {
    1188            0 :         free(file_data);
    1189            0 :         return false;
    1190              :     }
    1191            0 :     cert_chain->length = (uint32_t)cert_chain_size;
    1192              : 
    1193            0 :     res = libspdm_verify_cert_chain_data(
    1194              :         SPDM_MESSAGE_VERSION_14,
    1195              :         file_data, file_size,
    1196              :         0, req_pqc_asym_alg, base_hash_algo,
    1197              :         is_requester_cert, cert_model);
    1198            0 :     if (!res) {
    1199            0 :         free(file_data);
    1200            0 :         free(cert_chain);
    1201            0 :         return res;
    1202              :     }
    1203              : 
    1204              : 
    1205              :     /* Get Root Certificate and calculate hash value*/
    1206              : 
    1207            0 :     res = libspdm_x509_get_cert_from_cert_chain(file_data, file_size, 0, &root_cert,
    1208              :                                                 &root_cert_len);
    1209            0 :     if (!res) {
    1210            0 :         free(file_data);
    1211            0 :         free(cert_chain);
    1212            0 :         return res;
    1213              :     }
    1214              : 
    1215            0 :     res = libspdm_hash_all(base_hash_algo, root_cert, root_cert_len,
    1216            0 :                            (uint8_t *)(cert_chain + 1));
    1217            0 :     if (!res) {
    1218            0 :         free(file_data);
    1219            0 :         free(cert_chain);
    1220            0 :         return res;
    1221              :     }
    1222            0 :     libspdm_copy_mem((uint8_t *)cert_chain + sizeof(spdm_cert_chain_t) + digest_size,
    1223            0 :                      cert_chain_size - (sizeof(spdm_cert_chain_t) + digest_size),
    1224              :                      file_data, file_size);
    1225              : 
    1226            0 :     *data = cert_chain;
    1227            0 :     *size = cert_chain_size;
    1228            0 :     if (hash != NULL) {
    1229            0 :         *hash = (cert_chain + 1);
    1230              :     }
    1231            0 :     if (hash_size != NULL) {
    1232            0 :         *hash_size = digest_size;
    1233              :     }
    1234              : 
    1235            0 :     free(file_data);
    1236            0 :     return true;
    1237              : }
    1238              : 
    1239            0 : bool libspdm_read_responder_pqc_certificate(uint32_t pqc_asym_algo,
    1240              :                                             void **data, size_t *size)
    1241              : {
    1242              :     bool res;
    1243              :     char *file;
    1244              : 
    1245            0 :     switch (pqc_asym_algo) {
    1246            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_44:
    1247            0 :         file = "mldsa44/end_responder.cert.der";
    1248            0 :         break;
    1249            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_65:
    1250            0 :         file = "mldsa65/end_responder.cert.der";
    1251            0 :         break;
    1252            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_87:
    1253            0 :         file = "mldsa87/end_responder.cert.der";
    1254            0 :         break;
    1255            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128S:
    1256            0 :         file = "slh-dsa-sha2-128s/end_responder.cert.der";
    1257            0 :         break;
    1258            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128S:
    1259            0 :         file = "slh-dsa-shake-128s/end_responder.cert.der";
    1260            0 :         break;
    1261            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128F:
    1262            0 :         file = "slh-dsa-sha2-128f/end_responder.cert.der";
    1263            0 :         break;
    1264            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128F:
    1265            0 :         file = "slh-dsa-shake-128f/end_responder.cert.der";
    1266            0 :         break;
    1267            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192S:
    1268            0 :         file = "slh-dsa-sha2-192s/end_responder.cert.der";
    1269            0 :         break;
    1270            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192S:
    1271            0 :         file = "slh-dsa-shake-192s/end_responder.cert.der";
    1272            0 :         break;
    1273            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192F:
    1274            0 :         file = "slh-dsa-sha2-192f/end_responder.cert.der";
    1275            0 :         break;
    1276            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192F:
    1277            0 :         file = "slh-dsa-shake-192f/end_responder.cert.der";
    1278            0 :         break;
    1279            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256S:
    1280            0 :         file = "slh-dsa-sha2-256s/end_responder.cert.der";
    1281            0 :         break;
    1282            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256S:
    1283            0 :         file = "slh-dsa-shake-256s/end_responder.cert.der";
    1284            0 :         break;
    1285            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256F:
    1286            0 :         file = "slh-dsa-sha2-256f/end_responder.cert.der";
    1287            0 :         break;
    1288            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256F:
    1289            0 :         file = "slh-dsa-shake-256f/end_responder.cert.der";
    1290            0 :         break;
    1291            0 :     default:
    1292            0 :         LIBSPDM_ASSERT(false);
    1293            0 :         return false;
    1294              :     }
    1295            0 :     res = libspdm_read_input_file(file, data, size);
    1296            0 :     return res;
    1297              : }
        

Generated by: LCOV version 2.0-1