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 : 634 : size_t libspdm_secured_message_get_context_size(void)
10 : : {
11 : 634 : return sizeof(libspdm_secured_message_context_t);
12 : : }
13 : :
14 : 2534 : void libspdm_secured_message_init_context(void *spdm_secured_message_context)
15 : : {
16 : : libspdm_secured_message_context_t *secured_message_context;
17 : :
18 : 2534 : secured_message_context = spdm_secured_message_context;
19 : 2534 : libspdm_zero_mem(secured_message_context, sizeof(libspdm_secured_message_context_t));
20 : 2534 : }
21 : :
22 : 1270 : 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 : 1270 : secured_message_context = spdm_secured_message_context;
27 : 1270 : secured_message_context->use_psk = use_psk;
28 : 1270 : }
29 : :
30 : 630 : 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 : 630 : secured_message_context = spdm_secured_message_context;
37 : 630 : secured_message_context->session_state = session_state;
38 : :
39 [ + + ]: 630 : if (session_state == LIBSPDM_SESSION_STATE_ESTABLISHED) {
40 : : /* session handshake key should be zeroized after handshake phase. */
41 : 369 : libspdm_clear_handshake_secret(secured_message_context);
42 : 369 : libspdm_clear_master_secret(secured_message_context);
43 : : }
44 : 630 : }
45 : :
46 : : libspdm_session_state_t
47 : 711 : libspdm_secured_message_get_session_state(void *spdm_secured_message_context)
48 : : {
49 : : libspdm_secured_message_context_t *secured_message_context;
50 : :
51 : 711 : secured_message_context = spdm_secured_message_context;
52 : 711 : return secured_message_context->session_state;
53 : : }
54 : :
55 : 1270 : 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 : 1270 : secured_message_context = spdm_secured_message_context;
61 : 1270 : secured_message_context->session_type = session_type;
62 : 1270 : }
63 : :
64 : 1270 : 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 : 1270 : secured_message_context = spdm_secured_message_context;
76 : 1270 : secured_message_context->version = version;
77 : 1270 : secured_message_context->secured_message_version = secured_message_version;
78 : 1270 : secured_message_context->base_hash_algo = base_hash_algo;
79 : 1270 : secured_message_context->dhe_named_group = dhe_named_group;
80 : 1270 : secured_message_context->kem_alg = kem_alg;
81 : 1270 : secured_message_context->aead_cipher_suite = aead_cipher_suite;
82 : 1270 : secured_message_context->key_schedule = key_schedule;
83 : :
84 : 1270 : secured_message_context->hash_size =
85 : 1270 : libspdm_get_hash_size(secured_message_context->base_hash_algo);
86 [ - + ]: 1270 : 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 : 1270 : secured_message_context->shared_key_size = libspdm_get_dhe_shared_secret_size(
91 : 1270 : secured_message_context->dhe_named_group);
92 : : }
93 : 2540 : secured_message_context->aead_key_size = libspdm_get_aead_key_size(
94 : 1270 : secured_message_context->aead_cipher_suite);
95 : 2540 : secured_message_context->aead_iv_size = libspdm_get_aead_iv_size(
96 : 1270 : secured_message_context->aead_cipher_suite);
97 : 2540 : secured_message_context->aead_tag_size = libspdm_get_aead_tag_size(
98 : 1270 : secured_message_context->aead_cipher_suite);
99 : 1270 : }
100 : :
101 : : #if LIBSPDM_ENABLE_CAPABILITY_PSK_CAP
102 : 94 : 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 : 94 : secured_message_context = spdm_secured_message_context;
109 [ + + + - ]: 94 : if ((psk_hint != NULL) && (psk_hint_size > 0)) {
110 : 92 : secured_message_context->psk_hint_size = psk_hint_size;
111 : 92 : libspdm_copy_mem(secured_message_context->psk_hint,
112 : : LIBSPDM_PSK_MAX_HINT_LENGTH,
113 : : psk_hint,
114 : : psk_hint_size);
115 : : }
116 : 94 : }
117 : : #endif /* LIBSPDM_ENABLE_CAPABILITY_PSK_CAP */
118 : :
119 : 1291 : 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 : 1291 : secured_message_context = spdm_secured_message_context;
126 : 1291 : secured_message_context->max_spdm_session_sequence_number = max_spdm_session_sequence_number;
127 : 1291 : }
128 : :
129 : 1270 : 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 : 1270 : secured_message_context = spdm_secured_message_context;
136 : 1270 : secured_message_context->sequence_number_endian = endian_value;
137 : 1270 : }
138 : :
139 : 0 : 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 : 0 : secured_message_context = spdm_secured_message_context;
146 [ # # ]: 0 : if (shared_secret_size > secured_message_context->shared_key_size) {
147 : 0 : return false;
148 : : }
149 : 0 : secured_message_context->shared_key_size = shared_secret_size;
150 : 0 : 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 : 0 : return true;
154 : : }
155 : :
156 : 3 : 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 : 3 : secured_message_context = spdm_secured_message_context;
163 : :
164 [ + + ]: 3 : if (*export_master_secret_size > secured_message_context->hash_size) {
165 : 1 : *export_master_secret_size = secured_message_context->hash_size;
166 : : }
167 : :
168 : 3 : libspdm_copy_mem(export_master_secret, *export_master_secret_size,
169 : 3 : secured_message_context->export_master_secret,
170 : : *export_master_secret_size);
171 : :
172 : 3 : return true;
173 : : }
174 : :
175 : 1 : 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 [ - + ]: 1 : LIBSPDM_ASSERT(spdm_secured_message_context != NULL);
180 : :
181 : 1 : secured_message_context = spdm_secured_message_context;
182 : :
183 : 1 : libspdm_zero_mem(secured_message_context->export_master_secret,
184 : : sizeof(secured_message_context->export_master_secret));
185 : 1 : }
186 : :
187 : 0 : 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 : 0 : secured_message_context = spdm_secured_message_context;
197 : 0 : struct_size = sizeof(libspdm_secure_session_keys_struct_t) +
198 : 0 : (secured_message_context->aead_key_size +
199 : 0 : secured_message_context->aead_iv_size + sizeof(uint64_t)) * 2;
200 : :
201 [ # # ]: 0 : if (*session_keys_size < struct_size) {
202 : 0 : *session_keys_size = struct_size;
203 : 0 : return false;
204 : : }
205 : :
206 : 0 : session_keys_struct = session_keys;
207 : 0 : session_keys_struct->version = LIBSPDM_SECURE_SESSION_KEYS_STRUCT_VERSION;
208 : 0 : session_keys_struct->aead_key_size = (uint32_t)secured_message_context->aead_key_size;
209 : 0 : session_keys_struct->aead_iv_size = (uint32_t)secured_message_context->aead_iv_size;
210 : :
211 : 0 : ptr = (void *)(session_keys_struct + 1);
212 : 0 : libspdm_copy_mem(ptr,
213 : 0 : *session_keys_size - (ptr - (uint8_t*)session_keys),
214 : 0 : secured_message_context->application_secret.request_data_encryption_key,
215 : : secured_message_context->aead_key_size);
216 : 0 : ptr += secured_message_context->aead_key_size;
217 : 0 : libspdm_copy_mem(ptr,
218 : 0 : *session_keys_size - (ptr - (uint8_t*)session_keys),
219 : 0 : secured_message_context->application_secret.request_data_salt,
220 : : secured_message_context->aead_iv_size);
221 : 0 : ptr += secured_message_context->aead_iv_size;
222 : 0 : libspdm_copy_mem(ptr,
223 : 0 : *session_keys_size - (ptr - (uint8_t*)session_keys),
224 : 0 : &secured_message_context->application_secret.request_data_sequence_number,
225 : : sizeof(uint64_t));
226 : 0 : ptr += sizeof(uint64_t);
227 : 0 : libspdm_copy_mem(ptr,
228 : 0 : *session_keys_size - (ptr - (uint8_t*)session_keys),
229 : 0 : secured_message_context->application_secret.response_data_encryption_key,
230 : : secured_message_context->aead_key_size);
231 : 0 : ptr += secured_message_context->aead_key_size;
232 : 0 : libspdm_copy_mem(ptr,
233 : 0 : *session_keys_size - (ptr - (uint8_t*)session_keys),
234 : 0 : secured_message_context->application_secret.response_data_salt,
235 : : secured_message_context->aead_iv_size);
236 : 0 : ptr += secured_message_context->aead_iv_size;
237 : 0 : libspdm_copy_mem(ptr,
238 : 0 : *session_keys_size - (ptr - (uint8_t*)session_keys),
239 : 0 : &secured_message_context->application_secret.response_data_sequence_number,
240 : : sizeof(uint64_t));
241 : 0 : ptr += sizeof(uint64_t);
242 : 0 : return true;
243 : : }
244 : :
245 : 0 : bool libspdm_secured_message_import_session_keys(void *spdm_secured_message_context,
246 : : const void *session_keys,
247 : : size_t session_keys_size)
248 : : {
249 : : libspdm_secured_message_context_t *secured_message_context;
250 : : size_t struct_size;
251 : : const libspdm_secure_session_keys_struct_t *session_keys_struct;
252 : : const uint8_t *ptr;
253 : :
254 : 0 : secured_message_context = spdm_secured_message_context;
255 : 0 : struct_size = sizeof(libspdm_secure_session_keys_struct_t) +
256 : 0 : (secured_message_context->aead_key_size +
257 : 0 : secured_message_context->aead_iv_size + sizeof(uint64_t)) * 2;
258 : :
259 [ # # ]: 0 : if (session_keys_size != struct_size) {
260 : 0 : return false;
261 : : }
262 : :
263 : 0 : session_keys_struct = session_keys;
264 [ # # ]: 0 : if ((session_keys_struct->version !=
265 : 0 : LIBSPDM_SECURE_SESSION_KEYS_STRUCT_VERSION) ||
266 : 0 : (session_keys_struct->aead_key_size !=
267 [ # # ]: 0 : secured_message_context->aead_key_size) ||
268 : 0 : (session_keys_struct->aead_iv_size !=
269 [ # # ]: 0 : secured_message_context->aead_iv_size)) {
270 : 0 : return false;
271 : : }
272 : :
273 : 0 : ptr = (const void *)(session_keys_struct + 1);
274 : 0 : libspdm_copy_mem(secured_message_context->application_secret.request_data_encryption_key,
275 : : sizeof(secured_message_context->application_secret
276 : : .request_data_encryption_key),
277 : : ptr, secured_message_context->aead_key_size);
278 : 0 : ptr += secured_message_context->aead_key_size;
279 : 0 : libspdm_copy_mem(secured_message_context->application_secret.request_data_salt,
280 : : sizeof(secured_message_context->application_secret
281 : : .request_data_salt),
282 : : ptr, secured_message_context->aead_iv_size);
283 : 0 : ptr += secured_message_context->aead_iv_size;
284 : 0 : libspdm_copy_mem(&secured_message_context->application_secret.request_data_sequence_number,
285 : : sizeof(secured_message_context->application_secret
286 : : .request_data_sequence_number),
287 : : ptr, sizeof(uint64_t));
288 : 0 : ptr += sizeof(uint64_t);
289 : 0 : libspdm_copy_mem(secured_message_context->application_secret
290 : 0 : .response_data_encryption_key,
291 : : sizeof(secured_message_context->application_secret
292 : : .response_data_encryption_key),
293 : : ptr, secured_message_context->aead_key_size);
294 : 0 : ptr += secured_message_context->aead_key_size;
295 : 0 : libspdm_copy_mem(secured_message_context->application_secret.response_data_salt,
296 : : sizeof(secured_message_context->application_secret.response_data_salt),
297 : : ptr, secured_message_context->aead_iv_size);
298 : 0 : ptr += secured_message_context->aead_iv_size;
299 : 0 : libspdm_copy_mem(&secured_message_context->application_secret.response_data_sequence_number,
300 : : sizeof(secured_message_context->application_secret
301 : : .response_data_sequence_number),
302 : : ptr, sizeof(uint64_t));
303 : 0 : ptr += sizeof(uint64_t);
304 : 0 : return true;
305 : : }
306 : :
307 : 28 : void libspdm_secured_message_get_last_spdm_error_struct(
308 : : void *spdm_secured_message_context,
309 : : libspdm_error_struct_t *last_spdm_error)
310 : : {
311 : : libspdm_secured_message_context_t *secured_message_context;
312 : :
313 : 28 : secured_message_context = spdm_secured_message_context;
314 : 28 : libspdm_copy_mem(last_spdm_error, sizeof(libspdm_error_struct_t),
315 : 28 : &secured_message_context->last_spdm_error,
316 : : sizeof(libspdm_error_struct_t));
317 : 28 : }
318 : :
319 : 424 : void libspdm_secured_message_set_last_spdm_error_struct(
320 : : void *spdm_secured_message_context,
321 : : const libspdm_error_struct_t *last_spdm_error)
322 : : {
323 : : libspdm_secured_message_context_t *secured_message_context;
324 : :
325 : 424 : secured_message_context = spdm_secured_message_context;
326 : 424 : libspdm_copy_mem(&secured_message_context->last_spdm_error,
327 : : sizeof(secured_message_context->last_spdm_error),
328 : : last_spdm_error,
329 : : sizeof(libspdm_error_struct_t));
330 : 424 : }
|