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