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_responder_lib.h"
8 : :
9 : 156 : uint16_t libspdm_allocate_rsp_session_id(const libspdm_context_t *spdm_context, bool use_psk)
10 : : {
11 : : uint16_t rsp_session_id;
12 : : const libspdm_session_info_t *session_info;
13 : : size_t index;
14 : :
15 [ + + ]: 156 : if (use_psk) {
16 [ + + ]: 53 : 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_rsp_session_id - MAX PSK session\n"));
20 : 5 : return (INVALID_SESSION_ID & 0xFFFF0000) >> 16;
21 : : }
22 : : } else {
23 [ + + ]: 103 : 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_rsp_session_id - MAX DHE session\n"));
27 : 5 : return (INVALID_SESSION_ID & 0xFFFF0000) >> 16;
28 : : }
29 : : }
30 : :
31 : 146 : session_info = spdm_context->session_info;
32 [ + - ]: 206 : for (index = 0; index < LIBSPDM_MAX_SESSION_COUNT; index++) {
33 [ + + ]: 206 : if ((session_info[index].session_id & 0xFFFF0000) == (INVALID_SESSION_ID & 0xFFFF0000)) {
34 : 146 : rsp_session_id = (uint16_t)(0xFFFF - index);
35 : 146 : return rsp_session_id;
36 : : }
37 : : }
38 : :
39 : 0 : LIBSPDM_DEBUG((LIBSPDM_DEBUG_ERROR, "libspdm_allocate_rsp_session_id - MAX session_id\n"));
40 : 0 : return (INVALID_SESSION_ID & 0xFFFF0000) >> 16;
41 : : }
42 : :
43 : 104 : void libspdm_build_opaque_data_version_selection_data(const libspdm_context_t *spdm_context,
44 : : spdm_version_number_t secured_message_version,
45 : : size_t *data_out_size,
46 : : void *data_out)
47 : : {
48 : : size_t final_data_size;
49 : : secured_message_general_opaque_data_table_header_t *general_opaque_data_table_header;
50 : : spdm_general_opaque_data_table_header_t *spdm_general_opaque_data_table_header;
51 : : secured_message_opaque_element_table_header_t *opaque_element_table_header;
52 : : secured_message_opaque_element_version_selection_t *opaque_element_version_section;
53 : : void *end;
54 : :
55 [ - + ]: 104 : if (spdm_context->local_context.secured_message_version.secured_message_version_count == 0) {
56 : 0 : *data_out_size = 0;
57 : 0 : return;
58 : : }
59 : :
60 : 104 : final_data_size = libspdm_get_opaque_data_version_selection_data_size(spdm_context);
61 [ - + ]: 104 : LIBSPDM_ASSERT(*data_out_size >= final_data_size);
62 : :
63 [ + + ]: 104 : if (libspdm_get_connection_version (spdm_context) >= SPDM_MESSAGE_VERSION_12) {
64 : 14 : spdm_general_opaque_data_table_header = data_out;
65 : 14 : spdm_general_opaque_data_table_header->total_elements = 1;
66 : 14 : libspdm_write_uint24(spdm_general_opaque_data_table_header->reserved, 0);
67 : :
68 : 14 : opaque_element_table_header = (void *)(spdm_general_opaque_data_table_header + 1);
69 : : } else {
70 : 90 : general_opaque_data_table_header = data_out;
71 : 90 : general_opaque_data_table_header->spec_id = SECURED_MESSAGE_OPAQUE_DATA_SPEC_ID;
72 : 90 : general_opaque_data_table_header->opaque_version = SECURED_MESSAGE_OPAQUE_VERSION;
73 : 90 : general_opaque_data_table_header->total_elements = 1;
74 : 90 : general_opaque_data_table_header->reserved = 0;
75 : :
76 : 90 : opaque_element_table_header = (void *)(general_opaque_data_table_header + 1);
77 : : }
78 : 104 : opaque_element_table_header->id = SPDM_REGISTRY_ID_DMTF;
79 : 104 : opaque_element_table_header->vendor_len = 0;
80 : 104 : opaque_element_table_header->opaque_element_data_len =
81 : : sizeof(secured_message_opaque_element_version_selection_t);
82 : :
83 : 104 : opaque_element_version_section = (void *)(opaque_element_table_header + 1);
84 : 104 : opaque_element_version_section->sm_data_version =
85 : : SECURED_MESSAGE_OPAQUE_ELEMENT_SMDATA_DATA_VERSION;
86 : 104 : opaque_element_version_section->sm_data_id =
87 : : SECURED_MESSAGE_OPAQUE_ELEMENT_SMDATA_ID_VERSION_SELECTION;
88 : 104 : opaque_element_version_section->selected_version = secured_message_version;
89 : :
90 : : /* Zero Padding*/
91 : 104 : end = opaque_element_version_section + 1;
92 : 104 : libspdm_zero_mem(end, (size_t)data_out + final_data_size - (size_t)end);
93 : : }
94 : :
95 : 50 : libspdm_return_t libspdm_process_opaque_data_supported_version_data(
96 : : libspdm_context_t *spdm_context, size_t data_in_size, const void *data_in,
97 : : spdm_version_number_t *secured_message_version)
98 : : {
99 : : const secured_message_opaque_element_table_header_t *opaque_element_table_header;
100 : : const secured_message_opaque_element_supported_version_t *opaque_element_support_version;
101 : : const spdm_version_number_t *versions_list;
102 : : spdm_version_number_t common_version;
103 : : uint8_t version_count;
104 : :
105 : : bool result;
106 : : const void *get_element_ptr;
107 : : size_t get_element_len;
108 : :
109 : 50 : result = false;
110 : 50 : get_element_ptr = NULL;
111 : :
112 [ - + ]: 50 : if (spdm_context->local_context.secured_message_version.secured_message_version_count == 0) {
113 : 0 : return LIBSPDM_STATUS_SUCCESS;
114 : : }
115 : :
116 [ - + ]: 50 : if (data_in_size <
117 : 50 : libspdm_get_untrusted_opaque_data_supported_version_data_size(spdm_context, 1)) {
118 : 0 : return LIBSPDM_STATUS_INVALID_MSG_FIELD;
119 : : }
120 : :
121 : 50 : result = libspdm_get_sm_data_element_from_opaque_data(
122 : : spdm_context, data_in_size,
123 : : data_in, SECURED_MESSAGE_OPAQUE_ELEMENT_SMDATA_ID_SUPPORTED_VERSION,
124 : : &get_element_ptr, &get_element_len);
125 [ + + - + ]: 50 : if ((!result) || (get_element_ptr == NULL)) {
126 : 2 : LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO,"get element error!\n"));
127 : 2 : return LIBSPDM_STATUS_INVALID_MSG_FIELD;
128 : : }
129 : :
130 : 48 : opaque_element_table_header = (const secured_message_opaque_element_table_header_t*)
131 : : get_element_ptr;
132 : :
133 : : /*check for supported version data*/
134 : 48 : opaque_element_support_version = (const void *)(opaque_element_table_header + 1);
135 : :
136 : 48 : if ((const uint8_t *)opaque_element_support_version +
137 : : sizeof(secured_message_opaque_element_supported_version_t) >
138 [ - + ]: 48 : (const uint8_t *)opaque_element_table_header + get_element_len) {
139 : 0 : return LIBSPDM_STATUS_INVALID_MSG_FIELD;
140 : : }
141 : :
142 [ - + ]: 48 : if (opaque_element_support_version->version_count == 0) {
143 : 0 : return LIBSPDM_STATUS_INVALID_MSG_FIELD;
144 : : }
145 : :
146 : 48 : version_count = opaque_element_support_version->version_count;
147 : :
148 [ + - ]: 48 : if ((opaque_element_table_header->vendor_len != 0) ||
149 : 48 : (opaque_element_table_header->opaque_element_data_len !=
150 : 48 : (sizeof(secured_message_opaque_element_supported_version_t) +
151 [ - + ]: 48 : sizeof(spdm_version_number_t) * version_count))) {
152 : 0 : return LIBSPDM_STATUS_INVALID_MSG_FIELD;
153 : : }
154 : :
155 : 48 : versions_list = (const void *)(opaque_element_support_version + 1);
156 : :
157 : 48 : if ((const uint8_t *)versions_list + sizeof(spdm_version_number_t) >
158 [ - + ]: 48 : (const uint8_t *)opaque_element_table_header + get_element_len) {
159 : 0 : return LIBSPDM_STATUS_INVALID_MSG_FIELD;
160 : : }
161 : :
162 : 48 : result = libspdm_negotiate_connection_version(
163 : : &common_version,
164 : 48 : spdm_context->local_context.secured_message_version.secured_message_version,
165 : 48 : spdm_context->local_context.secured_message_version.secured_message_version_count,
166 : : versions_list, version_count);
167 [ - + ]: 48 : if (!result) {
168 : 0 : return LIBSPDM_STATUS_UNSUPPORTED_CAP;
169 : : }
170 : :
171 : 48 : libspdm_copy_mem(secured_message_version, sizeof(spdm_version_number_t),
172 : : &(common_version), sizeof(spdm_version_number_t));
173 : :
174 : 48 : return LIBSPDM_STATUS_SUCCESS;
175 : : }
|