Line data Source code
1 : /**
2 : * Copyright Notice:
3 : * Copyright 2021-2024 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_requester_lib.h"
8 :
9 167 : uint16_t libspdm_allocate_req_session_id(libspdm_context_t *spdm_context, bool use_psk)
10 : {
11 : uint16_t req_session_id;
12 : libspdm_session_info_t *session_info;
13 : size_t index;
14 :
15 167 : if (use_psk) {
16 59 : if ((spdm_context->max_psk_session_count != 0) &&
17 16 : (spdm_context->current_psk_session_count >= spdm_context->max_psk_session_count)) {
18 5 : LIBSPDM_DEBUG((LIBSPDM_DEBUG_ERROR,
19 : "libspdm_allocate_req_session_id - MAX PSK session\n"));
20 5 : return (INVALID_SESSION_ID & 0xFFFF);
21 : }
22 : } else {
23 108 : if ((spdm_context->max_dhe_session_count != 0) &&
24 16 : (spdm_context->current_dhe_session_count >= spdm_context->max_dhe_session_count)) {
25 5 : LIBSPDM_DEBUG((LIBSPDM_DEBUG_ERROR,
26 : "libspdm_allocate_req_session_id - MAX DHE session\n"));
27 5 : return (INVALID_SESSION_ID & 0xFFFF);
28 : }
29 : }
30 :
31 157 : session_info = spdm_context->session_info;
32 346 : for (index = 0; index < LIBSPDM_MAX_SESSION_COUNT; index++) {
33 346 : if ((session_info[index].session_id & 0xFFFF) == (INVALID_SESSION_ID & 0xFFFF)) {
34 157 : req_session_id = (uint16_t)(0xFFFF - index);
35 157 : return req_session_id;
36 : }
37 : }
38 :
39 0 : LIBSPDM_DEBUG((LIBSPDM_DEBUG_ERROR, "libspdm_allocate_req_session_id - MAX session_id\n"));
40 0 : return (INVALID_SESSION_ID & 0xFFFF);
41 : }
42 :
43 171 : void libspdm_build_opaque_data_supported_version_data(libspdm_context_t *spdm_context,
44 : size_t *data_out_size,
45 : void *data_out)
46 : {
47 : size_t final_data_size;
48 : secured_message_general_opaque_data_table_header_t *general_opaque_data_table_header;
49 : spdm_general_opaque_data_table_header_t *spdm_general_opaque_data_table_header;
50 : secured_message_opaque_element_table_header_t *opaque_element_table_header;
51 : secured_message_opaque_element_supported_version_t *opaque_element_support_version;
52 : spdm_version_number_t *versions_list;
53 : void *end;
54 :
55 171 : if (spdm_context->local_context.secured_message_version.spdm_version_count == 0) {
56 0 : *data_out_size = 0;
57 0 : return;
58 : }
59 :
60 171 : final_data_size = libspdm_get_opaque_data_supported_version_data_size(spdm_context);
61 171 : LIBSPDM_ASSERT(*data_out_size >= final_data_size);
62 :
63 171 : if (libspdm_get_connection_version (spdm_context) >= SPDM_MESSAGE_VERSION_12) {
64 12 : spdm_general_opaque_data_table_header = data_out;
65 12 : spdm_general_opaque_data_table_header->total_elements = 1;
66 12 : libspdm_write_uint24(spdm_general_opaque_data_table_header->reserved, 0);
67 12 : opaque_element_table_header = (void *)(spdm_general_opaque_data_table_header + 1);
68 : } else {
69 159 : general_opaque_data_table_header = data_out;
70 159 : general_opaque_data_table_header->spec_id = SECURED_MESSAGE_OPAQUE_DATA_SPEC_ID;
71 159 : general_opaque_data_table_header->opaque_version = SECURED_MESSAGE_OPAQUE_VERSION;
72 159 : general_opaque_data_table_header->total_elements = 1;
73 159 : general_opaque_data_table_header->reserved = 0;
74 159 : opaque_element_table_header = (void *)(general_opaque_data_table_header + 1);
75 : }
76 :
77 171 : opaque_element_table_header->id = SPDM_REGISTRY_ID_DMTF;
78 171 : opaque_element_table_header->vendor_len = 0;
79 171 : opaque_element_table_header->opaque_element_data_len =
80 171 : sizeof(secured_message_opaque_element_supported_version_t) +
81 171 : sizeof(spdm_version_number_t) *
82 171 : spdm_context->local_context.secured_message_version.spdm_version_count;
83 :
84 171 : opaque_element_support_version = (void *)(opaque_element_table_header + 1);
85 171 : opaque_element_support_version->sm_data_version =
86 : SECURED_MESSAGE_OPAQUE_ELEMENT_SMDATA_DATA_VERSION;
87 171 : opaque_element_support_version->sm_data_id =
88 : SECURED_MESSAGE_OPAQUE_ELEMENT_SMDATA_ID_SUPPORTED_VERSION;
89 171 : opaque_element_support_version->version_count =
90 171 : spdm_context->local_context.secured_message_version.spdm_version_count;
91 :
92 171 : versions_list = (void *)(opaque_element_support_version + 1);
93 171 : libspdm_copy_mem(versions_list,
94 171 : *data_out_size - ((uint8_t*)versions_list - (uint8_t*)data_out),
95 171 : spdm_context->local_context.secured_message_version.spdm_version,
96 171 : spdm_context->local_context.secured_message_version.spdm_version_count *
97 : sizeof(spdm_version_number_t));
98 :
99 : /* Zero Padding. *data_out_size does not need to be changed, because data is 0 padded */
100 171 : end = versions_list + spdm_context->local_context.secured_message_version.spdm_version_count;
101 171 : libspdm_zero_mem(end, (size_t)data_out + final_data_size - (size_t)end);
102 : }
103 :
104 : /**
105 : * Process opaque data version selection.
106 : *
107 : * This function should be called in KEY_EXCHANGE/PSK_EXCHANGE response parsing in requester.
108 : *
109 : * @param data_in_size size in bytes of the data_in.
110 : * @param data_in A pointer to the buffer to store the opaque data version selection.
111 : *
112 : * @retval RETURN_SUCCESS The opaque data version selection is processed successfully.
113 : * @retval RETURN_UNSUPPORTED The data_in is NOT opaque data version selection.
114 : **/
115 40 : libspdm_return_t libspdm_process_opaque_data_version_selection_data(libspdm_context_t *spdm_context,
116 : size_t data_in_size,
117 : void *data_in)
118 : {
119 : const secured_message_opaque_element_table_header_t
120 : *opaque_element_table_header;
121 : const secured_message_opaque_element_version_selection_t
122 : *opaque_element_version_section;
123 :
124 : bool result;
125 : uint8_t secured_message_version_index;
126 : const void *get_element_ptr;
127 : size_t get_element_len;
128 :
129 40 : result = false;
130 40 : get_element_ptr = NULL;
131 :
132 40 : if (spdm_context->local_context.secured_message_version.spdm_version_count == 0) {
133 0 : return LIBSPDM_STATUS_SUCCESS;
134 : }
135 :
136 40 : result = libspdm_get_element_from_opaque_data(
137 : spdm_context, data_in_size,
138 : data_in, SPDM_REGISTRY_ID_DMTF,
139 : SECURED_MESSAGE_OPAQUE_ELEMENT_SMDATA_ID_VERSION_SELECTION,
140 : &get_element_ptr, &get_element_len);
141 40 : if ((!result) || (get_element_ptr == NULL)) {
142 3 : LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO,"get element error!\n"));
143 3 : return LIBSPDM_STATUS_INVALID_MSG_FIELD;
144 : }
145 :
146 37 : opaque_element_table_header = (const secured_message_opaque_element_table_header_t*)
147 : get_element_ptr;
148 :
149 : /* Check for selection version data. */
150 37 : if ((opaque_element_table_header->vendor_len != 0) ||
151 37 : (opaque_element_table_header->opaque_element_data_len !=
152 : sizeof(secured_message_opaque_element_version_selection_t))) {
153 0 : return LIBSPDM_STATUS_INVALID_MSG_FIELD;
154 : }
155 37 : opaque_element_version_section = (const void *)(opaque_element_table_header + 1);
156 :
157 37 : if ((const uint8_t *)opaque_element_version_section +
158 : sizeof(secured_message_opaque_element_version_selection_t) >
159 37 : (const uint8_t *)opaque_element_table_header + get_element_len) {
160 0 : return LIBSPDM_STATUS_INVALID_MSG_FIELD;
161 : }
162 :
163 37 : for (secured_message_version_index = 0;
164 37 : secured_message_version_index <
165 37 : spdm_context->local_context.secured_message_version.spdm_version_count;
166 0 : secured_message_version_index++) {
167 74 : if (libspdm_get_version_from_version_number(opaque_element_version_section->
168 : selected_version)
169 : ==
170 37 : libspdm_get_version_from_version_number(
171 37 : spdm_context->local_context.secured_message_version.spdm_version[
172 : secured_message_version_index])) {
173 37 : libspdm_copy_mem(&(spdm_context->connection_info.secured_message_version),
174 : sizeof(spdm_context->connection_info.secured_message_version),
175 37 : &(opaque_element_version_section->selected_version),
176 : sizeof(spdm_version_number_t));
177 37 : return LIBSPDM_STATUS_SUCCESS;
178 : }
179 : }
180 :
181 0 : return LIBSPDM_STATUS_UNSUPPORTED_CAP;
182 : }
|