Branch data Line data Source code
1 : : /**
2 : : * Copyright Notice:
3 : : * Copyright 2021-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 : 2242 : size_t libspdm_secured_message_get_context_size(void)
10 : : {
11 : 2242 : return sizeof(libspdm_secured_message_context_t);
12 : : }
13 : :
14 : 7252 : void libspdm_secured_message_init_context(void *spdm_secured_message_context)
15 : : {
16 : : libspdm_secured_message_context_t *secured_message_context;
17 : :
18 : 7252 : secured_message_context = spdm_secured_message_context;
19 : 7252 : libspdm_zero_mem(secured_message_context, sizeof(libspdm_secured_message_context_t));
20 : 7252 : }
21 : :
22 : 2774 : void libspdm_secured_message_set_use_psk(void *spdm_secured_message_context, bool use_psk)
23 : : {
24 : : libspdm_secured_message_context_t *secured_message_context;
25 : :
26 : 2774 : secured_message_context = spdm_secured_message_context;
27 : 2774 : secured_message_context->use_psk = use_psk;
28 : 2774 : }
29 : :
30 : 1380 : void libspdm_secured_message_set_session_state(
31 : : void *spdm_secured_message_context,
32 : : libspdm_session_state_t session_state)
33 : : {
34 : : libspdm_secured_message_context_t *secured_message_context;
35 : :
36 : 1380 : secured_message_context = spdm_secured_message_context;
37 : 1380 : secured_message_context->session_state = session_state;
38 : :
39 [ + + ]: 1380 : if (session_state == LIBSPDM_SESSION_STATE_ESTABLISHED) {
40 : : /* session handshake key should be zeroized after handshake phase. */
41 : 828 : libspdm_clear_handshake_secret(secured_message_context);
42 : 828 : libspdm_clear_master_secret(secured_message_context);
43 : : }
44 : 1380 : }
45 : :
46 : : libspdm_session_state_t
47 : 1502 : libspdm_secured_message_get_session_state(void *spdm_secured_message_context)
48 : : {
49 : : libspdm_secured_message_context_t *secured_message_context;
50 : :
51 : 1502 : secured_message_context = spdm_secured_message_context;
52 : 1502 : return secured_message_context->session_state;
53 : : }
54 : :
55 : 2774 : void libspdm_secured_message_set_session_type(void *spdm_secured_message_context,
56 : : libspdm_session_type_t session_type)
57 : : {
58 : : libspdm_secured_message_context_t *secured_message_context;
59 : :
60 : 2774 : secured_message_context = spdm_secured_message_context;
61 : 2774 : secured_message_context->session_type = session_type;
62 : 2774 : }
63 : :
64 : 2774 : void libspdm_secured_message_set_algorithms(void *spdm_secured_message_context,
65 : : spdm_version_number_t version,
66 : : spdm_version_number_t secured_message_version,
67 : : uint32_t base_hash_algo,
68 : : uint16_t dhe_named_group,
69 : : uint32_t kem_alg,
70 : : uint16_t aead_cipher_suite,
71 : : uint16_t key_schedule)
72 : : {
73 : : libspdm_secured_message_context_t *secured_message_context;
74 : :
75 : 2774 : secured_message_context = spdm_secured_message_context;
76 : 2774 : secured_message_context->version = version;
77 : 2774 : secured_message_context->secured_message_version = secured_message_version;
78 : 2774 : secured_message_context->base_hash_algo = base_hash_algo;
79 : 2774 : secured_message_context->dhe_named_group = dhe_named_group;
80 : 2774 : secured_message_context->kem_alg = kem_alg;
81 : 2774 : secured_message_context->aead_cipher_suite = aead_cipher_suite;
82 : 2774 : secured_message_context->key_schedule = key_schedule;
83 : :
84 : 2774 : secured_message_context->hash_size =
85 : 2774 : libspdm_get_hash_size(secured_message_context->base_hash_algo);
86 [ - + ]: 2774 : if (kem_alg != 0) {
87 : 0 : secured_message_context->shared_key_size = libspdm_get_kem_shared_secret_size(
88 : : secured_message_context->kem_alg);
89 : : } else {
90 : 2774 : secured_message_context->shared_key_size = libspdm_get_dhe_shared_secret_size(
91 : 2774 : secured_message_context->dhe_named_group);
92 : : }
93 : 5548 : secured_message_context->aead_key_size = libspdm_get_aead_key_size(
94 : 2774 : secured_message_context->aead_cipher_suite);
95 : 5548 : secured_message_context->aead_iv_size = libspdm_get_aead_iv_size(
96 : 2774 : secured_message_context->aead_cipher_suite);
97 : 5548 : secured_message_context->aead_tag_size = libspdm_get_aead_tag_size(
98 : 2774 : secured_message_context->aead_cipher_suite);
99 : 2774 : }
100 : :
101 : : #if LIBSPDM_ENABLE_CAPABILITY_PSK_CAP
102 : 194 : void libspdm_secured_message_set_psk_hint(void *spdm_secured_message_context,
103 : : const void *psk_hint,
104 : : size_t psk_hint_size)
105 : : {
106 : : libspdm_secured_message_context_t *secured_message_context;
107 : :
108 : 194 : secured_message_context = spdm_secured_message_context;
109 [ + + + - ]: 194 : if ((psk_hint != NULL) && (psk_hint_size > 0)) {
110 : 190 : secured_message_context->psk_hint_size = psk_hint_size;
111 : 190 : libspdm_copy_mem(secured_message_context->psk_hint,
112 : : LIBSPDM_PSK_MAX_HINT_LENGTH,
113 : : psk_hint,
114 : : psk_hint_size);
115 : : }
116 : 194 : }
117 : : #endif /* LIBSPDM_ENABLE_CAPABILITY_PSK_CAP */
118 : :
119 : 2818 : void libspdm_secured_message_set_max_spdm_session_sequence_number(
120 : : void *spdm_secured_message_context,
121 : : uint64_t max_spdm_session_sequence_number)
122 : : {
123 : : libspdm_secured_message_context_t *secured_message_context;
124 : :
125 : 2818 : secured_message_context = spdm_secured_message_context;
126 : 2818 : secured_message_context->max_spdm_session_sequence_number = max_spdm_session_sequence_number;
127 : 2818 : }
128 : :
129 : 2774 : void libspdm_secured_message_set_sequence_number_endian (
130 : : void *spdm_secured_message_context,
131 : : uint8_t endian_value)
132 : : {
133 : : libspdm_secured_message_context_t *secured_message_context;
134 : :
135 : 2774 : secured_message_context = spdm_secured_message_context;
136 : 2774 : secured_message_context->sequence_number_endian = endian_value;
137 : 2774 : }
138 : :
139 : 4 : bool libspdm_secured_message_import_shared_secret(void *spdm_secured_message_context,
140 : : const void *shared_secret,
141 : : size_t shared_secret_size)
142 : : {
143 : : libspdm_secured_message_context_t *secured_message_context;
144 : :
145 : 4 : secured_message_context = spdm_secured_message_context;
146 [ + + ]: 4 : if (shared_secret_size > secured_message_context->shared_key_size) {
147 : 2 : return false;
148 : : }
149 : 2 : secured_message_context->shared_key_size = shared_secret_size;
150 : 2 : libspdm_copy_mem(secured_message_context->master_secret.shared_secret,
151 : : sizeof(secured_message_context->master_secret.shared_secret),
152 : : shared_secret, shared_secret_size);
153 : 2 : return true;
154 : : }
155 : :
156 : 6 : bool libspdm_secured_message_export_master_secret(
157 : : void *spdm_secured_message_context, void *export_master_secret,
158 : : size_t *export_master_secret_size)
159 : : {
160 : : libspdm_secured_message_context_t *secured_message_context;
161 : :
162 : 6 : secured_message_context = spdm_secured_message_context;
163 : :
164 [ + + ]: 6 : if (*export_master_secret_size > secured_message_context->hash_size) {
165 : 2 : *export_master_secret_size = secured_message_context->hash_size;
166 : : }
167 : :
168 : 6 : libspdm_copy_mem(export_master_secret, *export_master_secret_size,
169 : 6 : secured_message_context->export_master_secret,
170 : : *export_master_secret_size);
171 : :
172 : 6 : return true;
173 : : }
174 : :
175 : 2 : void libspdm_secured_message_clear_export_master_secret(void *spdm_secured_message_context)
176 : : {
177 : : libspdm_secured_message_context_t *secured_message_context;
178 : :
179 : 2 : LIBSPDM_ASSERT(spdm_secured_message_context != NULL);
180 : :
181 : 2 : secured_message_context = spdm_secured_message_context;
182 : :
183 : 2 : libspdm_zero_mem(secured_message_context->export_master_secret,
184 : : sizeof(secured_message_context->export_master_secret));
185 : 2 : }
186 : :
187 : 8 : bool libspdm_secured_message_export_session_keys(void *spdm_secured_message_context,
188 : : void *session_keys,
189 : : size_t *session_keys_size)
190 : : {
191 : : libspdm_secured_message_context_t *secured_message_context;
192 : : size_t struct_size;
193 : : libspdm_secure_session_keys_struct_t *session_keys_struct;
194 : : uint8_t *ptr;
195 : :
196 : 8 : secured_message_context = spdm_secured_message_context;
197 : 8 : struct_size = sizeof(libspdm_secure_session_keys_struct_t) +
198 : 8 : (secured_message_context->aead_key_size +
199 : 8 : secured_message_context->aead_iv_size + sizeof(uint64_t)) * 2;
200 : :
201 [ + + ]: 8 : if (*session_keys_size < struct_size) {
202 : 2 : *session_keys_size = struct_size;
203 : 2 : return false;
204 : : }
205 : :
206 : 6 : session_keys_struct = session_keys;
207 : 6 : session_keys_struct->version = LIBSPDM_SECURE_SESSION_KEYS_STRUCT_VERSION;
208 : 6 : session_keys_struct->aead_key_size = (uint32_t)secured_message_context->aead_key_size;
209 : 6 : session_keys_struct->aead_iv_size = (uint32_t)secured_message_context->aead_iv_size;
210 : :
211 : 6 : ptr = (void *)(session_keys_struct + 1);
212 : 6 : libspdm_copy_mem(ptr,
213 : 6 : *session_keys_size - (ptr - (uint8_t*)session_keys),
214 : 6 : secured_message_context->application_secret.request_data_encryption_key,
215 : : secured_message_context->aead_key_size);
216 : 6 : ptr += secured_message_context->aead_key_size;
217 : 6 : libspdm_copy_mem(ptr,
218 : 6 : *session_keys_size - (ptr - (uint8_t*)session_keys),
219 : 6 : secured_message_context->application_secret.request_data_salt,
220 : : secured_message_context->aead_iv_size);
221 : 6 : ptr += secured_message_context->aead_iv_size;
222 : 6 : libspdm_copy_mem(ptr,
223 : 6 : *session_keys_size - (ptr - (uint8_t*)session_keys),
224 : 6 : &secured_message_context->application_secret.request_data_sequence_number,
225 : : sizeof(uint64_t));
226 : 6 : ptr += sizeof(uint64_t);
227 : 6 : libspdm_copy_mem(ptr,
228 : 6 : *session_keys_size - (ptr - (uint8_t*)session_keys),
229 : 6 : secured_message_context->application_secret.response_data_encryption_key,
230 : : secured_message_context->aead_key_size);
231 : 6 : ptr += secured_message_context->aead_key_size;
232 : 6 : libspdm_copy_mem(ptr,
233 : 6 : *session_keys_size - (ptr - (uint8_t*)session_keys),
234 : 6 : secured_message_context->application_secret.response_data_salt,
235 : : secured_message_context->aead_iv_size);
236 : 6 : ptr += secured_message_context->aead_iv_size;
237 : 6 : libspdm_copy_mem(ptr,
238 : 6 : *session_keys_size - (ptr - (uint8_t*)session_keys),
239 : 6 : &secured_message_context->application_secret.response_data_sequence_number,
240 : : sizeof(uint64_t));
241 : 6 : ptr += sizeof(uint64_t);
242 : :
243 : 6 : *session_keys_size = struct_size;
244 : 6 : return true;
245 : : }
246 : :
247 : 6 : bool libspdm_secured_message_import_session_keys(void *spdm_secured_message_context,
248 : : const void *session_keys,
249 : : size_t session_keys_size)
250 : : {
251 : : libspdm_secured_message_context_t *secured_message_context;
252 : : size_t struct_size;
253 : : const libspdm_secure_session_keys_struct_t *session_keys_struct;
254 : : const uint8_t *ptr;
255 : :
256 : 6 : secured_message_context = spdm_secured_message_context;
257 : 6 : struct_size = sizeof(libspdm_secure_session_keys_struct_t) +
258 : 6 : (secured_message_context->aead_key_size +
259 : 6 : secured_message_context->aead_iv_size + sizeof(uint64_t)) * 2;
260 : :
261 [ + + ]: 6 : if (session_keys_size != struct_size) {
262 : 2 : return false;
263 : : }
264 : :
265 : 4 : session_keys_struct = session_keys;
266 [ + - ]: 4 : if ((session_keys_struct->version !=
267 : 4 : LIBSPDM_SECURE_SESSION_KEYS_STRUCT_VERSION) ||
268 : 4 : (session_keys_struct->aead_key_size !=
269 [ + - ]: 4 : secured_message_context->aead_key_size) ||
270 : 4 : (session_keys_struct->aead_iv_size !=
271 [ - + ]: 4 : secured_message_context->aead_iv_size)) {
272 : 0 : return false;
273 : : }
274 : :
275 : 4 : ptr = (const void *)(session_keys_struct + 1);
276 : 4 : libspdm_copy_mem(secured_message_context->application_secret.request_data_encryption_key,
277 : : sizeof(secured_message_context->application_secret
278 : : .request_data_encryption_key),
279 : : ptr, secured_message_context->aead_key_size);
280 : 4 : ptr += secured_message_context->aead_key_size;
281 : 4 : libspdm_copy_mem(secured_message_context->application_secret.request_data_salt,
282 : : sizeof(secured_message_context->application_secret
283 : : .request_data_salt),
284 : : ptr, secured_message_context->aead_iv_size);
285 : 4 : ptr += secured_message_context->aead_iv_size;
286 : 4 : libspdm_copy_mem(&secured_message_context->application_secret.request_data_sequence_number,
287 : : sizeof(secured_message_context->application_secret
288 : : .request_data_sequence_number),
289 : : ptr, sizeof(uint64_t));
290 : 4 : ptr += sizeof(uint64_t);
291 : 4 : libspdm_copy_mem(secured_message_context->application_secret
292 : 4 : .response_data_encryption_key,
293 : : sizeof(secured_message_context->application_secret
294 : : .response_data_encryption_key),
295 : : ptr, secured_message_context->aead_key_size);
296 : 4 : ptr += secured_message_context->aead_key_size;
297 : 4 : libspdm_copy_mem(secured_message_context->application_secret.response_data_salt,
298 : : sizeof(secured_message_context->application_secret.response_data_salt),
299 : : ptr, secured_message_context->aead_iv_size);
300 : 4 : ptr += secured_message_context->aead_iv_size;
301 : 4 : libspdm_copy_mem(&secured_message_context->application_secret.response_data_sequence_number,
302 : : sizeof(secured_message_context->application_secret
303 : : .response_data_sequence_number),
304 : : ptr, sizeof(uint64_t));
305 : 4 : ptr += sizeof(uint64_t);
306 : 4 : return true;
307 : : }
308 : :
309 : 64 : void libspdm_secured_message_get_last_spdm_error_struct(
310 : : void *spdm_secured_message_context,
311 : : libspdm_error_struct_t *last_spdm_error)
312 : : {
313 : : libspdm_secured_message_context_t *secured_message_context;
314 : :
315 : 64 : secured_message_context = spdm_secured_message_context;
316 : 64 : libspdm_copy_mem(last_spdm_error, sizeof(libspdm_error_struct_t),
317 : 64 : &secured_message_context->last_spdm_error,
318 : : sizeof(libspdm_error_struct_t));
319 : 64 : }
320 : :
321 : 948 : void libspdm_secured_message_set_last_spdm_error_struct(
322 : : void *spdm_secured_message_context,
323 : : const libspdm_error_struct_t *last_spdm_error)
324 : : {
325 : : libspdm_secured_message_context_t *secured_message_context;
326 : :
327 : 948 : secured_message_context = spdm_secured_message_context;
328 : 948 : libspdm_copy_mem(&secured_message_context->last_spdm_error,
329 : : sizeof(secured_message_context->last_spdm_error),
330 : : last_spdm_error,
331 : : sizeof(libspdm_error_struct_t));
332 : 948 : }
|