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-08-24 08:11:14 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              :     bool is_device_cert_model;
     437              : 
     438            0 :     is_requester_cert = false;
     439              : 
     440              :     /*default is true*/
     441            0 :     is_device_cert_model = true;
     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_with_pqc(file_data, file_size,
     522              :                                                   0, pqc_asym_algo, base_hash_algo,
     523              :                                                   is_requester_cert, is_device_cert_model);
     524            0 :     if (!res) {
     525            0 :         free(file_data);
     526            0 :         free(cert_chain);
     527            0 :         return res;
     528              :     }
     529              : 
     530              : 
     531              :     /* Get Root Certificate and calculate hash value*/
     532              : 
     533            0 :     res = libspdm_x509_get_cert_from_cert_chain(file_data, file_size, 0, &root_cert,
     534              :                                                 &root_cert_len);
     535            0 :     if (!res) {
     536            0 :         free(file_data);
     537            0 :         free(cert_chain);
     538            0 :         return res;
     539              :     }
     540              : 
     541            0 :     res = libspdm_hash_all(base_hash_algo, root_cert, root_cert_len,
     542            0 :                            (uint8_t *)(cert_chain + 1));
     543            0 :     if (!res) {
     544            0 :         free(file_data);
     545            0 :         free(cert_chain);
     546            0 :         return res;
     547              :     }
     548            0 :     libspdm_copy_mem((uint8_t *)cert_chain + sizeof(spdm_cert_chain_t) + digest_size,
     549            0 :                      cert_chain_size - (sizeof(spdm_cert_chain_t) + digest_size),
     550              :                      file_data, file_size);
     551              : 
     552            0 :     *data = cert_chain;
     553            0 :     *size = cert_chain_size;
     554            0 :     if (hash != NULL) {
     555            0 :         *hash = (cert_chain + 1);
     556              :     }
     557            0 :     if (hash_size != NULL) {
     558            0 :         *hash_size = digest_size;
     559              :     }
     560              : 
     561            0 :     free(file_data);
     562            0 :     return true;
     563              : }
     564              : 
     565              : /*This alias cert chain is partial, from root CA to device certificate CA.*/
     566            0 : bool libspdm_read_pqc_responder_public_certificate_chain_alias_cert_till_dev_cert_ca(
     567              :     uint32_t base_hash_algo, uint32_t pqc_asym_algo, void **data,
     568              :     size_t *size, void **hash, size_t *hash_size)
     569              : {
     570              :     bool res;
     571              :     void *file_data;
     572              :     size_t file_size;
     573              :     spdm_cert_chain_t *cert_chain;
     574              :     size_t cert_chain_size;
     575              :     char *file;
     576              :     const uint8_t *root_cert;
     577              :     size_t root_cert_len;
     578              :     const uint8_t *leaf_cert;
     579              :     size_t leaf_cert_len;
     580              :     size_t digest_size;
     581              :     bool is_requester_cert;
     582              :     bool is_device_cert_model;
     583              : 
     584            0 :     is_requester_cert = false;
     585              : 
     586              :     /*default is false*/
     587            0 :     is_device_cert_model = false;
     588              : 
     589            0 :     *data = NULL;
     590            0 :     *size = 0;
     591            0 :     if (hash != NULL) {
     592            0 :         *hash = NULL;
     593              :     }
     594            0 :     if (hash_size != NULL) {
     595            0 :         *hash_size = 0;
     596              :     }
     597              : 
     598            0 :     if (pqc_asym_algo == 0) {
     599            0 :         return false;
     600              :     }
     601              : 
     602            0 :     switch (pqc_asym_algo) {
     603            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_44:
     604            0 :         file = "mldsa44/bundle_responder.certchain_alias_cert_partial_set.der";
     605            0 :         break;
     606            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_65:
     607            0 :         file = "mldsa65/bundle_responder.certchain_alias_cert_partial_set.der";
     608            0 :         break;
     609            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_87:
     610            0 :         file = "mldsa87/bundle_responder.certchain_alias_cert_partial_set.der";
     611            0 :         break;
     612            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128S:
     613            0 :         file = "slh-dsa-sha2-128s/bundle_responder.certchain_alias_cert_partial_set.der";
     614            0 :         break;
     615            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128S:
     616            0 :         file = "slh-dsa-shake-128s/bundle_responder.certchain_alias_cert_partial_set.der";
     617            0 :         break;
     618            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128F:
     619            0 :         file = "slh-dsa-sha2-128f/bundle_responder.certchain_alias_cert_partial_set.der";
     620            0 :         break;
     621            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128F:
     622            0 :         file = "slh-dsa-shake-128f/bundle_responder.certchain_alias_cert_partial_set.der";
     623            0 :         break;
     624            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192S:
     625            0 :         file = "slh-dsa-sha2-192s/bundle_responder.certchain_alias_cert_partial_set.der";
     626            0 :         break;
     627            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192S:
     628            0 :         file = "slh-dsa-shake-192s/bundle_responder.certchain_alias_cert_partial_set.der";
     629            0 :         break;
     630            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192F:
     631            0 :         file = "slh-dsa-sha2-192f/bundle_responder.certchain_alias_cert_partial_set.der";
     632            0 :         break;
     633            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192F:
     634            0 :         file = "slh-dsa-shake-192f/bundle_responder.certchain_alias_cert_partial_set.der";
     635            0 :         break;
     636            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256S:
     637            0 :         file = "slh-dsa-sha2-256s/bundle_responder.certchain_alias_cert_partial_set.der";
     638            0 :         break;
     639            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256S:
     640            0 :         file = "slh-dsa-shake-256s/bundle_responder.certchain_alias_cert_partial_set.der";
     641            0 :         break;
     642            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256F:
     643            0 :         file = "slh-dsa-sha2-256f/bundle_responder.certchain_alias_cert_partial_set.der";
     644            0 :         break;
     645            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256F:
     646            0 :         file = "slh-dsa-shake-256f/bundle_responder.certchain_alias_cert_partial_set.der";
     647            0 :         break;
     648            0 :     default:
     649            0 :         LIBSPDM_ASSERT(false);
     650            0 :         return false;
     651              :     }
     652            0 :     res = libspdm_read_input_file(file, &file_data, &file_size);
     653            0 :     if (!res) {
     654            0 :         return res;
     655              :     }
     656              : 
     657            0 :     digest_size = libspdm_get_hash_size(base_hash_algo);
     658              : 
     659            0 :     cert_chain_size = sizeof(spdm_cert_chain_t) + digest_size + file_size;
     660            0 :     cert_chain = (void *)malloc(cert_chain_size);
     661            0 :     if (cert_chain == NULL) {
     662            0 :         free(file_data);
     663            0 :         return false;
     664              :     }
     665            0 :     cert_chain->length = (uint32_t)cert_chain_size;
     666              : 
     667              :     /* Get leaf Certificate*/
     668            0 :     res = libspdm_x509_get_cert_from_cert_chain(file_data, file_size, -1, &leaf_cert,
     669              :                                                 &leaf_cert_len);
     670            0 :     if (!res) {
     671            0 :         free(file_data);
     672            0 :         free(cert_chain);
     673            0 :         return res;
     674              :     }
     675              : 
     676            0 :     res = libspdm_x509_set_cert_certificate_check_with_pqc(leaf_cert, leaf_cert_len,
     677              :                                                            0, pqc_asym_algo, base_hash_algo,
     678              :                                                            is_requester_cert, is_device_cert_model);
     679            0 :     if (!res) {
     680            0 :         free(file_data);
     681            0 :         free(cert_chain);
     682            0 :         return res;
     683              :     }
     684              : 
     685              :     /* Get Root Certificate*/
     686            0 :     res = libspdm_x509_get_cert_from_cert_chain(file_data, file_size, 0, &root_cert,
     687              :                                                 &root_cert_len);
     688            0 :     if (!res) {
     689            0 :         free(file_data);
     690            0 :         free(cert_chain);
     691            0 :         return res;
     692              :     }
     693              : 
     694              :     /*verify cert_chain*/
     695            0 :     res = libspdm_x509_verify_cert_chain(root_cert, root_cert_len, file_data, file_size);
     696            0 :     if (!res) {
     697            0 :         free(file_data);
     698            0 :         free(cert_chain);
     699            0 :         return res;
     700              :     }
     701              : 
     702              :     /*calculate hash value*/
     703            0 :     res = libspdm_hash_all(base_hash_algo, root_cert, root_cert_len,
     704            0 :                            (uint8_t *)(cert_chain + 1));
     705            0 :     if (!res) {
     706            0 :         free(file_data);
     707            0 :         free(cert_chain);
     708            0 :         return res;
     709              :     }
     710            0 :     libspdm_copy_mem((uint8_t *)cert_chain + sizeof(spdm_cert_chain_t) + digest_size,
     711            0 :                      cert_chain_size - (sizeof(spdm_cert_chain_t) + digest_size),
     712              :                      file_data, file_size);
     713              : 
     714            0 :     *data = cert_chain;
     715            0 :     *size = cert_chain_size;
     716            0 :     if (hash != NULL) {
     717            0 :         *hash = (cert_chain + 1);
     718              :     }
     719            0 :     if (hash_size != NULL) {
     720            0 :         *hash_size = digest_size;
     721              :     }
     722              : 
     723            0 :     free(file_data);
     724            0 :     return true;
     725              : }
     726              : 
     727              : /*This alias cert chain is entire, from root CA to leaf certificate.*/
     728            0 : bool libspdm_read_pqc_responder_public_certificate_chain_alias_cert(
     729              :     uint32_t base_hash_algo, uint32_t pqc_asym_algo, void **data,
     730              :     size_t *size, void **hash, size_t *hash_size)
     731              : {
     732              :     bool res;
     733              :     void *file_data;
     734              :     size_t file_size;
     735              :     spdm_cert_chain_t *cert_chain;
     736              :     size_t cert_chain_size;
     737              :     char *file;
     738              :     const uint8_t *root_cert;
     739              :     size_t root_cert_len;
     740              :     const uint8_t *leaf_cert;
     741              :     size_t leaf_cert_len;
     742              :     size_t digest_size;
     743              :     bool is_requester_cert;
     744              :     bool is_device_cert_model;
     745              : 
     746            0 :     is_requester_cert = false;
     747              : 
     748              :     /*default is false*/
     749            0 :     is_device_cert_model = false;
     750              : 
     751            0 :     *data = NULL;
     752            0 :     *size = 0;
     753            0 :     if (hash != NULL) {
     754            0 :         *hash = NULL;
     755              :     }
     756            0 :     if (hash_size != NULL) {
     757            0 :         *hash_size = 0;
     758              :     }
     759              : 
     760            0 :     if (pqc_asym_algo == 0) {
     761            0 :         return false;
     762              :     }
     763              : 
     764            0 :     switch (pqc_asym_algo) {
     765            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_44:
     766            0 :         file = "mldsa44/bundle_responder.certchain_alias.der";
     767            0 :         break;
     768            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_65:
     769            0 :         file = "mldsa65/bundle_responder.certchain_alias.der";
     770            0 :         break;
     771            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_87:
     772            0 :         file = "mldsa87/bundle_responder.certchain_alias.der";
     773            0 :         break;
     774            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128S:
     775            0 :         file = "slh-dsa-sha2-128s/bundle_responder.certchain_alias.der";
     776            0 :         break;
     777            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128S:
     778            0 :         file = "slh-dsa-shake-128s/bundle_responder.certchain_alias.der";
     779            0 :         break;
     780            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128F:
     781            0 :         file = "slh-dsa-sha2-128f/bundle_responder.certchain_alias.der";
     782            0 :         break;
     783            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128F:
     784            0 :         file = "slh-dsa-shake-128f/bundle_responder.certchain_alias.der";
     785            0 :         break;
     786            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192S:
     787            0 :         file = "slh-dsa-sha2-192s/bundle_responder.certchain_alias.der";
     788            0 :         break;
     789            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192S:
     790            0 :         file = "slh-dsa-shake-192s/bundle_responder.certchain_alias.der";
     791            0 :         break;
     792            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192F:
     793            0 :         file = "slh-dsa-sha2-192f/bundle_responder.certchain_alias.der";
     794            0 :         break;
     795            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192F:
     796            0 :         file = "slh-dsa-shake-192f/bundle_responder.certchain_alias.der";
     797            0 :         break;
     798            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256S:
     799            0 :         file = "slh-dsa-sha2-256s/bundle_responder.certchain_alias.der";
     800            0 :         break;
     801            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256S:
     802            0 :         file = "slh-dsa-shake-256s/bundle_responder.certchain_alias.der";
     803            0 :         break;
     804            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256F:
     805            0 :         file = "slh-dsa-sha2-256f/bundle_responder.certchain_alias.der";
     806            0 :         break;
     807            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256F:
     808            0 :         file = "slh-dsa-shake-256f/bundle_responder.certchain_alias.der";
     809            0 :         break;
     810            0 :     default:
     811            0 :         LIBSPDM_ASSERT(false);
     812            0 :         return false;
     813              :     }
     814            0 :     res = libspdm_read_input_file(file, &file_data, &file_size);
     815            0 :     if (!res) {
     816            0 :         return res;
     817              :     }
     818              : 
     819            0 :     digest_size = libspdm_get_hash_size(base_hash_algo);
     820              : 
     821            0 :     cert_chain_size = sizeof(spdm_cert_chain_t) + digest_size + file_size;
     822            0 :     cert_chain = (void *)malloc(cert_chain_size);
     823            0 :     if (cert_chain == NULL) {
     824            0 :         free(file_data);
     825            0 :         return false;
     826              :     }
     827            0 :     cert_chain->length = (uint32_t)cert_chain_size;
     828              : 
     829              :     /* Get leaf Certificate*/
     830            0 :     res = libspdm_x509_get_cert_from_cert_chain(file_data, file_size, -1, &leaf_cert,
     831              :                                                 &leaf_cert_len);
     832            0 :     if (!res) {
     833            0 :         free(file_data);
     834            0 :         free(cert_chain);
     835            0 :         return res;
     836              :     }
     837              : 
     838            0 :     res = libspdm_x509_certificate_check_with_pqc(leaf_cert, leaf_cert_len,
     839              :                                                   0, pqc_asym_algo, base_hash_algo,
     840              :                                                   is_requester_cert, is_device_cert_model);
     841            0 :     if (!res) {
     842            0 :         free(file_data);
     843            0 :         free(cert_chain);
     844            0 :         return res;
     845              :     }
     846              : 
     847              :     /* Get Root Certificate*/
     848            0 :     res = libspdm_x509_get_cert_from_cert_chain(file_data, file_size, 0, &root_cert,
     849              :                                                 &root_cert_len);
     850            0 :     if (!res) {
     851            0 :         free(file_data);
     852            0 :         free(cert_chain);
     853            0 :         return res;
     854              :     }
     855              : 
     856              :     /*verify cert_chain*/
     857            0 :     res = libspdm_x509_verify_cert_chain(root_cert, root_cert_len, file_data, file_size);
     858            0 :     if (!res) {
     859            0 :         free(file_data);
     860            0 :         free(cert_chain);
     861            0 :         return res;
     862              :     }
     863              : 
     864              :     /*calculate hash value*/
     865            0 :     res = libspdm_hash_all(base_hash_algo, root_cert, root_cert_len,
     866            0 :                            (uint8_t *)(cert_chain + 1));
     867            0 :     if (!res) {
     868            0 :         free(file_data);
     869            0 :         free(cert_chain);
     870            0 :         return res;
     871              :     }
     872            0 :     libspdm_copy_mem((uint8_t *)cert_chain + sizeof(spdm_cert_chain_t) + digest_size,
     873            0 :                      cert_chain_size - (sizeof(spdm_cert_chain_t) + digest_size),
     874              :                      file_data, file_size);
     875              : 
     876            0 :     *data = cert_chain;
     877            0 :     *size = cert_chain_size;
     878            0 :     if (hash != NULL) {
     879            0 :         *hash = (cert_chain + 1);
     880              :     }
     881            0 :     if (hash_size != NULL) {
     882            0 :         *hash_size = digest_size;
     883              :     }
     884              : 
     885            0 :     free(file_data);
     886            0 :     return true;
     887              : }
     888              : 
     889            0 : bool libspdm_read_pqc_responder_public_certificate_chain_per_slot(
     890              :     uint8_t slot_id, uint32_t base_hash_algo, uint32_t pqc_asym_algo,
     891              :     void **data, size_t *size, void **hash, size_t *hash_size)
     892              : {
     893              :     bool res;
     894              :     void *file_data;
     895              :     size_t file_size;
     896              :     spdm_cert_chain_t *cert_chain;
     897              :     size_t cert_chain_size;
     898              :     char *file;
     899              :     const uint8_t *root_cert;
     900              :     size_t root_cert_len;
     901              :     size_t digest_size;
     902              :     bool is_requester_cert;
     903              :     bool is_device_cert_model;
     904              : 
     905            0 :     is_requester_cert = false;
     906              : 
     907              :     /*default is true*/
     908            0 :     is_device_cert_model = true;
     909              : 
     910            0 :     *data = NULL;
     911            0 :     *size = 0;
     912            0 :     if (hash != NULL) {
     913            0 :         *hash = NULL;
     914              :     }
     915            0 :     if (hash_size != NULL) {
     916            0 :         *hash_size = 0;
     917              :     }
     918              : 
     919            0 :     if (pqc_asym_algo == 0) {
     920            0 :         return false;
     921              :     }
     922              : 
     923            0 :     if (slot_id == 0) {
     924            0 :         switch (pqc_asym_algo) {
     925            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_44:
     926            0 :             file = "mldsa44/bundle_responder.certchain.der";
     927            0 :             break;
     928            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_65:
     929            0 :             file = "mldsa65/bundle_responder.certchain.der";
     930            0 :             break;
     931            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_87:
     932            0 :             file = "mldsa87/bundle_responder.certchain.der";
     933            0 :             break;
     934            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128S:
     935            0 :             file = "slh-dsa-sha2-128s/bundle_responder.certchain.der";
     936            0 :             break;
     937            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128S:
     938            0 :             file = "slh-dsa-shake-128s/bundle_responder.certchain.der";
     939            0 :             break;
     940            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128F:
     941            0 :             file = "slh-dsa-sha2-128f/bundle_responder.certchain.der";
     942            0 :             break;
     943            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128F:
     944            0 :             file = "slh-dsa-shake-128f/bundle_responder.certchain.der";
     945            0 :             break;
     946            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192S:
     947            0 :             file = "slh-dsa-sha2-192s/bundle_responder.certchain.der";
     948            0 :             break;
     949            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192S:
     950            0 :             file = "slh-dsa-shake-192s/bundle_responder.certchain.der";
     951            0 :             break;
     952            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192F:
     953            0 :             file = "slh-dsa-sha2-192f/bundle_responder.certchain.der";
     954            0 :             break;
     955            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192F:
     956            0 :             file = "slh-dsa-shake-192f/bundle_responder.certchain.der";
     957            0 :             break;
     958            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256S:
     959            0 :             file = "slh-dsa-sha2-256s/bundle_responder.certchain.der";
     960            0 :             break;
     961            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256S:
     962            0 :             file = "slh-dsa-shake-256s/bundle_responder.certchain.der";
     963            0 :             break;
     964            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256F:
     965            0 :             file = "slh-dsa-sha2-256f/bundle_responder.certchain.der";
     966            0 :             break;
     967            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256F:
     968            0 :             file = "slh-dsa-shake-256f/bundle_responder.certchain.der";
     969            0 :             break;
     970            0 :         default:
     971            0 :             LIBSPDM_ASSERT(false);
     972            0 :             return false;
     973              :         }
     974              :     } else {
     975            0 :         switch (pqc_asym_algo) {
     976            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_44:
     977            0 :             file = "mldsa44/bundle_responder.certchain1.der";
     978            0 :             break;
     979            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_65:
     980            0 :             file = "mldsa65/bundle_responder.certchain1.der";
     981            0 :             break;
     982            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_87:
     983            0 :             file = "mldsa87/bundle_responder.certchain1.der";
     984            0 :             break;
     985            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128S:
     986            0 :             file = "slh-dsa-sha2-128s/bundle_responder.certchain1.der";
     987            0 :             break;
     988            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128S:
     989            0 :             file = "slh-dsa-shake-128s/bundle_responder.certchain1.der";
     990            0 :             break;
     991            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128F:
     992            0 :             file = "slh-dsa-sha2-128f/bundle_responder.certchain1.der";
     993            0 :             break;
     994            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128F:
     995            0 :             file = "slh-dsa-shake-128f/bundle_responder.certchain1.der";
     996            0 :             break;
     997            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192S:
     998            0 :             file = "slh-dsa-sha2-192s/bundle_responder.certchain1.der";
     999            0 :             break;
    1000            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192S:
    1001            0 :             file = "slh-dsa-shake-192s/bundle_responder.certchain1.der";
    1002            0 :             break;
    1003            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192F:
    1004            0 :             file = "slh-dsa-sha2-192f/bundle_responder.certchain1.der";
    1005            0 :             break;
    1006            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192F:
    1007            0 :             file = "slh-dsa-shake-192f/bundle_responder.certchain1.der";
    1008            0 :             break;
    1009            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256S:
    1010            0 :             file = "slh-dsa-sha2-256s/bundle_responder.certchain1.der";
    1011            0 :             break;
    1012            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256S:
    1013            0 :             file = "slh-dsa-shake-256s/bundle_responder.certchain1.der";
    1014            0 :             break;
    1015            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256F:
    1016            0 :             file = "slh-dsa-sha2-256f/bundle_responder.certchain1.der";
    1017            0 :             break;
    1018            0 :         case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256F:
    1019            0 :             file = "slh-dsa-shake-256f/bundle_responder.certchain1.der";
    1020            0 :             break;
    1021            0 :         default:
    1022            0 :             LIBSPDM_ASSERT(false);
    1023            0 :             return false;
    1024              :         }
    1025              :     }
    1026            0 :     res = libspdm_read_input_file(file, &file_data, &file_size);
    1027            0 :     if (!res) {
    1028            0 :         return res;
    1029              :     }
    1030              : 
    1031            0 :     digest_size = libspdm_get_hash_size(base_hash_algo);
    1032              : 
    1033            0 :     cert_chain_size = sizeof(spdm_cert_chain_t) + digest_size + file_size;
    1034            0 :     cert_chain = (void *)malloc(cert_chain_size);
    1035            0 :     if (cert_chain == NULL) {
    1036            0 :         free(file_data);
    1037            0 :         return false;
    1038              :     }
    1039            0 :     cert_chain->length = (uint32_t)cert_chain_size;
    1040              : 
    1041            0 :     res = libspdm_verify_cert_chain_data_with_pqc(file_data, file_size,
    1042              :                                                   0, pqc_asym_algo, base_hash_algo,
    1043              :                                                   is_requester_cert, is_device_cert_model);
    1044            0 :     if (!res) {
    1045            0 :         free(file_data);
    1046            0 :         free(cert_chain);
    1047            0 :         return res;
    1048              :     }
    1049              : 
    1050              : 
    1051              :     /* Get Root Certificate and calculate hash value*/
    1052              : 
    1053            0 :     res = libspdm_x509_get_cert_from_cert_chain(file_data, file_size, 0, &root_cert,
    1054              :                                                 &root_cert_len);
    1055            0 :     if (!res) {
    1056            0 :         free(file_data);
    1057            0 :         free(cert_chain);
    1058            0 :         return res;
    1059              :     }
    1060              : 
    1061            0 :     res = libspdm_hash_all(base_hash_algo, root_cert, root_cert_len,
    1062            0 :                            (uint8_t *)(cert_chain + 1));
    1063            0 :     if (!res) {
    1064            0 :         free(file_data);
    1065            0 :         free(cert_chain);
    1066            0 :         return res;
    1067              :     }
    1068            0 :     libspdm_copy_mem((uint8_t *)cert_chain + sizeof(spdm_cert_chain_t) + digest_size,
    1069            0 :                      cert_chain_size - (sizeof(spdm_cert_chain_t) + digest_size),
    1070              :                      file_data, file_size);
    1071              : 
    1072            0 :     *data = cert_chain;
    1073            0 :     *size = cert_chain_size;
    1074            0 :     if (hash != NULL) {
    1075            0 :         *hash = (cert_chain + 1);
    1076              :     }
    1077            0 :     if (hash_size != NULL) {
    1078            0 :         *hash_size = digest_size;
    1079              :     }
    1080              : 
    1081            0 :     free(file_data);
    1082            0 :     return true;
    1083              : }
    1084              : 
    1085              : 
    1086            0 : bool libspdm_read_pqc_requester_public_certificate_chain(
    1087              :     uint32_t base_hash_algo, uint32_t req_pqc_asym_alg, void **data,
    1088              :     size_t *size, void **hash, size_t *hash_size)
    1089              : {
    1090              :     bool res;
    1091              :     void *file_data;
    1092              :     size_t file_size;
    1093              :     spdm_cert_chain_t *cert_chain;
    1094              :     size_t cert_chain_size;
    1095              :     char *file;
    1096              :     const uint8_t *root_cert;
    1097              :     size_t root_cert_len;
    1098              :     size_t digest_size;
    1099              :     bool is_requester_cert;
    1100              :     bool is_device_cert_model;
    1101              : 
    1102            0 :     is_requester_cert = false;
    1103              : 
    1104              :     /*default is true*/
    1105            0 :     is_device_cert_model = true;
    1106              : 
    1107            0 :     *data = NULL;
    1108            0 :     *size = 0;
    1109            0 :     if (hash != NULL) {
    1110            0 :         *hash = NULL;
    1111              :     }
    1112            0 :     if (hash_size != NULL) {
    1113            0 :         *hash_size = 0;
    1114              :     }
    1115              : 
    1116            0 :     if (req_pqc_asym_alg == 0) {
    1117            0 :         return false;
    1118              :     }
    1119              : 
    1120            0 :     switch (req_pqc_asym_alg) {
    1121            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_44:
    1122            0 :         file = "mldsa44/bundle_requester.certchain.der";
    1123            0 :         break;
    1124            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_65:
    1125            0 :         file = "mldsa65/bundle_requester.certchain.der";
    1126            0 :         break;
    1127            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_87:
    1128            0 :         file = "mldsa87/bundle_requester.certchain.der";
    1129            0 :         break;
    1130            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128S:
    1131            0 :         file = "slh-dsa-sha2-128s/bundle_requester.certchain.der";
    1132            0 :         break;
    1133            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128S:
    1134            0 :         file = "slh-dsa-shake-128s/bundle_requester.certchain.der";
    1135            0 :         break;
    1136            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128F:
    1137            0 :         file = "slh-dsa-sha2-128f/bundle_requester.certchain.der";
    1138            0 :         break;
    1139            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128F:
    1140            0 :         file = "slh-dsa-shake-128f/bundle_requester.certchain.der";
    1141            0 :         break;
    1142            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192S:
    1143            0 :         file = "slh-dsa-sha2-192s/bundle_requester.certchain.der";
    1144            0 :         break;
    1145            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192S:
    1146            0 :         file = "slh-dsa-shake-192s/bundle_requester.certchain.der";
    1147            0 :         break;
    1148            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192F:
    1149            0 :         file = "slh-dsa-sha2-192f/bundle_requester.certchain.der";
    1150            0 :         break;
    1151            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192F:
    1152            0 :         file = "slh-dsa-shake-192f/bundle_requester.certchain.der";
    1153            0 :         break;
    1154            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256S:
    1155            0 :         file = "slh-dsa-sha2-256s/bundle_requester.certchain.der";
    1156            0 :         break;
    1157            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256S:
    1158            0 :         file = "slh-dsa-shake-256s/bundle_requester.certchain.der";
    1159            0 :         break;
    1160            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256F:
    1161            0 :         file = "slh-dsa-sha2-256f/bundle_requester.certchain.der";
    1162            0 :         break;
    1163            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256F:
    1164            0 :         file = "slh-dsa-shake-256f/bundle_requester.certchain.der";
    1165            0 :         break;
    1166            0 :     default:
    1167            0 :         LIBSPDM_ASSERT(false);
    1168            0 :         return false;
    1169              :     }
    1170            0 :     res = libspdm_read_input_file(file, &file_data, &file_size);
    1171            0 :     if (!res) {
    1172            0 :         return res;
    1173              :     }
    1174              : 
    1175            0 :     digest_size = libspdm_get_hash_size(base_hash_algo);
    1176              : 
    1177            0 :     cert_chain_size = sizeof(spdm_cert_chain_t) + digest_size + file_size;
    1178            0 :     cert_chain = (void *)malloc(cert_chain_size);
    1179            0 :     if (cert_chain == NULL) {
    1180            0 :         free(file_data);
    1181            0 :         return false;
    1182              :     }
    1183            0 :     cert_chain->length = (uint32_t)cert_chain_size;
    1184              : 
    1185            0 :     res = libspdm_verify_cert_chain_data_with_pqc(file_data, file_size,
    1186              :                                                   0, req_pqc_asym_alg, base_hash_algo,
    1187              :                                                   is_requester_cert, is_device_cert_model);
    1188            0 :     if (!res) {
    1189            0 :         free(file_data);
    1190            0 :         free(cert_chain);
    1191            0 :         return res;
    1192              :     }
    1193              : 
    1194              : 
    1195              :     /* Get Root Certificate and calculate hash value*/
    1196              : 
    1197            0 :     res = libspdm_x509_get_cert_from_cert_chain(file_data, file_size, 0, &root_cert,
    1198              :                                                 &root_cert_len);
    1199            0 :     if (!res) {
    1200            0 :         free(file_data);
    1201            0 :         free(cert_chain);
    1202            0 :         return res;
    1203              :     }
    1204              : 
    1205            0 :     res = libspdm_hash_all(base_hash_algo, root_cert, root_cert_len,
    1206            0 :                            (uint8_t *)(cert_chain + 1));
    1207            0 :     if (!res) {
    1208            0 :         free(file_data);
    1209            0 :         free(cert_chain);
    1210            0 :         return res;
    1211              :     }
    1212            0 :     libspdm_copy_mem((uint8_t *)cert_chain + sizeof(spdm_cert_chain_t) + digest_size,
    1213            0 :                      cert_chain_size - (sizeof(spdm_cert_chain_t) + digest_size),
    1214              :                      file_data, file_size);
    1215              : 
    1216            0 :     *data = cert_chain;
    1217            0 :     *size = cert_chain_size;
    1218            0 :     if (hash != NULL) {
    1219            0 :         *hash = (cert_chain + 1);
    1220              :     }
    1221            0 :     if (hash_size != NULL) {
    1222            0 :         *hash_size = digest_size;
    1223              :     }
    1224              : 
    1225            0 :     free(file_data);
    1226            0 :     return true;
    1227              : }
    1228              : 
    1229            0 : bool libspdm_read_responder_pqc_certificate(uint32_t pqc_asym_algo,
    1230              :                                             void **data, size_t *size)
    1231              : {
    1232              :     bool res;
    1233              :     char *file;
    1234              : 
    1235            0 :     switch (pqc_asym_algo) {
    1236            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_44:
    1237            0 :         file = "mldsa44/end_responder.cert.der";
    1238            0 :         break;
    1239            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_65:
    1240            0 :         file = "mldsa65/end_responder.cert.der";
    1241            0 :         break;
    1242            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_ML_DSA_87:
    1243            0 :         file = "mldsa87/end_responder.cert.der";
    1244            0 :         break;
    1245            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128S:
    1246            0 :         file = "slh-dsa-sha2-128s/end_responder.cert.der";
    1247            0 :         break;
    1248            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128S:
    1249            0 :         file = "slh-dsa-shake-128s/end_responder.cert.der";
    1250            0 :         break;
    1251            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_128F:
    1252            0 :         file = "slh-dsa-sha2-128f/end_responder.cert.der";
    1253            0 :         break;
    1254            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_128F:
    1255            0 :         file = "slh-dsa-shake-128f/end_responder.cert.der";
    1256            0 :         break;
    1257            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192S:
    1258            0 :         file = "slh-dsa-sha2-192s/end_responder.cert.der";
    1259            0 :         break;
    1260            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192S:
    1261            0 :         file = "slh-dsa-shake-192s/end_responder.cert.der";
    1262            0 :         break;
    1263            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_192F:
    1264            0 :         file = "slh-dsa-sha2-192f/end_responder.cert.der";
    1265            0 :         break;
    1266            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_192F:
    1267            0 :         file = "slh-dsa-shake-192f/end_responder.cert.der";
    1268            0 :         break;
    1269            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256S:
    1270            0 :         file = "slh-dsa-sha2-256s/end_responder.cert.der";
    1271            0 :         break;
    1272            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256S:
    1273            0 :         file = "slh-dsa-shake-256s/end_responder.cert.der";
    1274            0 :         break;
    1275            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHA2_256F:
    1276            0 :         file = "slh-dsa-sha2-256f/end_responder.cert.der";
    1277            0 :         break;
    1278            0 :     case SPDM_ALGORITHMS_PQC_ASYM_ALGO_SLH_DSA_SHAKE_256F:
    1279            0 :         file = "slh-dsa-shake-256f/end_responder.cert.der";
    1280            0 :         break;
    1281            0 :     default:
    1282            0 :         LIBSPDM_ASSERT(false);
    1283            0 :         return false;
    1284              :     }
    1285            0 :     res = libspdm_read_input_file(file, data, size);
    1286            0 :     return res;
    1287              : }
        

Generated by: LCOV version 2.0-1