Line data Source code
1 : /**
2 : * Copyright Notice:
3 : * Copyright 2025-2026 DMTF. All rights reserved.
4 : * License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
5 : **/
6 :
7 : #include "internal/libspdm_secured_message_lib.h"
8 :
9 0 : void *libspdm_secured_message_kem_new(spdm_version_number_t spdm_version,
10 : uint32_t kem_alg, bool is_initiator)
11 : {
12 0 : return libspdm_kem_new(spdm_version, kem_alg, is_initiator);
13 : }
14 :
15 0 : void libspdm_secured_message_kem_free(uint32_t kem_alg, void *kem_context)
16 : {
17 0 : libspdm_kem_free(kem_alg, kem_context);
18 0 : }
19 :
20 0 : bool libspdm_secured_message_kem_generate_key(uint32_t kem_alg,
21 : void *kem_context,
22 : uint8_t *encap_key,
23 : size_t *encap_key_size)
24 : {
25 0 : return libspdm_kem_generate_key(kem_alg, kem_context, encap_key, encap_key_size);
26 : }
27 :
28 0 : bool libspdm_secured_message_kem_encapsulate(
29 : uint32_t kem_alg, void *kem_context,
30 : const uint8_t *peer_encap_key, size_t peer_encap_key_size,
31 : uint8_t *cipher_text, size_t *cipher_text_size,
32 : void *spdm_secured_message_context)
33 : {
34 : libspdm_secured_message_context_t *secured_message_context;
35 : uint8_t final_key[LIBSPDM_MAX_KEM_SS_SIZE];
36 : size_t final_key_size;
37 : bool ret;
38 :
39 0 : secured_message_context = spdm_secured_message_context;
40 :
41 0 : final_key_size = sizeof(final_key);
42 0 : ret = libspdm_kem_encapsulate(kem_alg, kem_context, peer_encap_key,
43 : peer_encap_key_size, cipher_text,
44 : cipher_text_size, final_key,
45 : &final_key_size);
46 0 : if (!ret) {
47 0 : return ret;
48 : }
49 0 : libspdm_copy_mem(secured_message_context->master_secret.shared_secret,
50 : sizeof(secured_message_context->master_secret.shared_secret),
51 : final_key, final_key_size);
52 0 : libspdm_zero_mem(final_key, final_key_size);
53 0 : secured_message_context->shared_key_size = final_key_size;
54 0 : return true;
55 : }
56 :
57 0 : bool libspdm_secured_message_kem_decapsulate(
58 : uint32_t kem_alg, void *kem_context,
59 : const uint8_t *peer_cipher_text, size_t peer_cipher_text_size,
60 : void *spdm_secured_message_context)
61 : {
62 : libspdm_secured_message_context_t *secured_message_context;
63 : uint8_t final_key[LIBSPDM_MAX_KEM_SS_SIZE];
64 : size_t final_key_size;
65 : bool ret;
66 :
67 0 : secured_message_context = spdm_secured_message_context;
68 :
69 0 : final_key_size = sizeof(final_key);
70 0 : ret = libspdm_kem_decapsulate(kem_alg, kem_context, peer_cipher_text,
71 : peer_cipher_text_size, final_key,
72 : &final_key_size);
73 0 : if (!ret) {
74 0 : return ret;
75 : }
76 0 : libspdm_copy_mem(secured_message_context->master_secret.shared_secret,
77 : sizeof(secured_message_context->master_secret.shared_secret),
78 : final_key, final_key_size);
79 0 : libspdm_zero_mem(final_key, final_key_size);
80 0 : secured_message_context->shared_key_size = final_key_size;
81 0 : return true;
82 : }
|