LCOV - code coverage report
Current view: top level - os_stub/spdm_device_secret_lib_sample - read_pub_cert.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 33.0 % 706 233
Test Date: 2025-12-21 08:10:27 Functions: 77.8 % 9 7

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

Generated by: LCOV version 2.0-1