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 "hal/base.h"
8 : #include "internal/libspdm_common_lib.h"
9 :
10 : uint8_t g_key_exchange_start_mut_auth = 0;
11 : bool g_mandatory_mut_auth = false;
12 : uint8_t g_key_exchange_req_slot_id = 0;
13 :
14 : #if LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP
15 : bool g_generate_key_exchange_opaque_data = false;
16 : size_t libspdm_secret_lib_finish_opaque_data_size;
17 : bool g_generate_finish_opaque_data = false;
18 :
19 35 : bool libspdm_key_exchange_rsp_opaque_data(
20 : void *spdm_context,
21 : spdm_version_number_t spdm_version,
22 : uint8_t measurement_hash_type,
23 : uint8_t slot_id,
24 : uint8_t session_policy,
25 : const void *req_opaque_data,
26 : size_t req_opaque_data_size,
27 : void *opaque_data,
28 : size_t *opaque_data_size)
29 : {
30 35 : if (g_generate_key_exchange_opaque_data) {
31 : size_t version_selection_data_size;
32 3 : version_selection_data_size = sizeof(spdm_general_opaque_data_table_header_t) +
33 : sizeof(secured_message_opaque_element_table_header_t) +
34 : sizeof(secured_message_opaque_element_version_selection_t);
35 :
36 3 : LIBSPDM_ASSERT(*opaque_data_size >= version_selection_data_size);
37 3 : *opaque_data_size = version_selection_data_size;
38 :
39 3 : if (opaque_data != NULL) {
40 : spdm_general_opaque_data_table_header_t *spdm_general_opaque_data_table_header;
41 : secured_message_opaque_element_table_header_t *opaque_element_table_header;
42 : secured_message_opaque_element_version_selection_t *opaque_element_version_section;
43 :
44 2 : spdm_general_opaque_data_table_header = opaque_data;
45 2 : spdm_general_opaque_data_table_header->total_elements = 1;
46 2 : libspdm_write_uint24(spdm_general_opaque_data_table_header->reserved, 0);
47 :
48 2 : opaque_element_table_header = (void *)(spdm_general_opaque_data_table_header + 1);
49 2 : opaque_element_table_header->id = SPDM_REGISTRY_ID_DMTF;
50 2 : opaque_element_table_header->vendor_len = 0;
51 2 : opaque_element_table_header->opaque_element_data_len =
52 : sizeof(secured_message_opaque_element_version_selection_t);
53 2 : opaque_element_version_section = (void *)(opaque_element_table_header + 1);
54 2 : opaque_element_version_section->sm_data_version =
55 : SECURED_MESSAGE_OPAQUE_ELEMENT_SMDATA_DATA_VERSION;
56 2 : opaque_element_version_section->sm_data_id =
57 : SECURED_MESSAGE_OPAQUE_ELEMENT_SMDATA_ID_VERSION_SELECTION;
58 2 : opaque_element_version_section->selected_version =
59 : SECURED_SPDM_VERSION_11 << SPDM_VERSION_NUMBER_SHIFT_BIT;
60 : }
61 :
62 3 : return true;
63 : }
64 32 : return false;
65 : }
66 :
67 1 : bool libspdm_finish_rsp_opaque_data(
68 : void *spdm_context,
69 : uint32_t session_id,
70 : spdm_version_number_t spdm_version,
71 : uint8_t req_slot_id,
72 : const void *req_opaque_data,
73 : size_t req_opaque_data_size,
74 : void *opaque_data,
75 : size_t *opaque_data_size)
76 : {
77 1 : if (g_generate_finish_opaque_data) {
78 1 : LIBSPDM_ASSERT(libspdm_secret_lib_finish_opaque_data_size <= *opaque_data_size);
79 :
80 1 : *opaque_data_size = libspdm_secret_lib_finish_opaque_data_size;
81 :
82 1 : if (opaque_data != NULL) {
83 9 : for (size_t index = 0; index < *opaque_data_size; index++)
84 : {
85 8 : ((uint8_t *)opaque_data)[index] = (uint8_t)(index + 1);
86 : }
87 : }
88 : } else {
89 0 : *opaque_data_size = 0;
90 : }
91 :
92 1 : return true;
93 : }
94 :
95 : #if LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP
96 22 : extern uint8_t libspdm_key_exchange_start_mut_auth(
97 : void *spdm_context,
98 : uint32_t session_id,
99 : spdm_version_number_t spdm_version,
100 : uint8_t slot_id,
101 : uint8_t *req_slot_id,
102 : uint8_t session_policy,
103 : size_t opaque_data_length,
104 : const void *opaque_data,
105 : bool *mandatory_mut_auth)
106 : {
107 22 : *req_slot_id = g_key_exchange_req_slot_id;
108 22 : *mandatory_mut_auth = g_mandatory_mut_auth;
109 :
110 22 : return g_key_exchange_start_mut_auth;
111 : }
112 : #endif /* LIBSPDM_ENABLE_CAPABILITY_MUT_AUTH_CAP */
113 : #endif /* LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP */
|