@@ -119,10 +119,13 @@ bool libspdm_get_element_from_opaque_data(libspdm_context_t *spdm_context,
119
119
* general_opaque_data_table_header ;
120
120
const spdm_general_opaque_data_table_header_t
121
121
* spdm_general_opaque_data_table_header ;
122
- const secured_message_opaque_element_table_header_t
122
+ const opaque_element_table_header_t
123
123
* opaque_element_table_header ;
124
+ uint16_t opaque_element_data_len ;
125
+ const secured_message_opaque_element_table_header_t
126
+ * secured_message_element_table_header ;
124
127
const secured_message_opaque_element_header_t
125
- * secured_message_element_header ;
128
+ * secured_message_element_header ;
126
129
127
130
bool result ;
128
131
uint8_t element_num ;
@@ -177,19 +180,30 @@ bool libspdm_get_element_from_opaque_data(libspdm_context_t *spdm_context,
177
180
178
181
for (element_index = 0 ; element_index < element_num ; element_index ++ ) {
179
182
/*ensure the opaque_element_table_header is valid*/
180
- if (total_element_len + sizeof (secured_message_opaque_element_table_header_t ) >
183
+ if (total_element_len + sizeof (opaque_element_table_header_t ) >
181
184
data_element_size ) {
182
185
return false;
183
186
}
184
187
185
188
/*check element header id*/
186
- if ((opaque_element_table_header -> id > SPDM_REGISTRY_ID_MAX ) ||
187
- (opaque_element_table_header -> vendor_len != 0 )) {
189
+ if ((opaque_element_table_header -> id > SPDM_REGISTRY_ID_MAX )) {
190
+ return false;
191
+ }
192
+
193
+ if (total_element_len + sizeof (opaque_element_table_header_t ) +
194
+ opaque_element_table_header -> vendor_len + 2 >
195
+ data_element_size ) {
188
196
return false;
189
197
}
190
198
191
- current_element_len = sizeof (secured_message_opaque_element_table_header_t ) +
192
- opaque_element_table_header -> opaque_element_data_len ;
199
+ opaque_element_data_len = libspdm_read_uint16 (
200
+ (const uint8_t * )opaque_element_table_header +
201
+ sizeof (opaque_element_table_header_t ) +
202
+ opaque_element_table_header -> vendor_len );
203
+
204
+ current_element_len = sizeof (opaque_element_table_header_t ) +
205
+ opaque_element_table_header -> vendor_len +
206
+ 2 + opaque_element_data_len ;
193
207
/* Add Padding*/
194
208
current_element_len = (current_element_len + 3 ) & ~3 ;
195
209
@@ -200,25 +214,29 @@ bool libspdm_get_element_from_opaque_data(libspdm_context_t *spdm_context,
200
214
}
201
215
202
216
if (opaque_element_table_header -> id == element_id ) {
203
- secured_message_element_header = (const void * )(opaque_element_table_header + 1 );
204
- if ((const uint8_t * )secured_message_element_header +
205
- sizeof (secured_message_opaque_element_header_t ) >
206
- (const uint8_t * )data_in + data_in_size ) {
207
- return false;
208
- }
217
+ secured_message_element_table_header = (const void * )opaque_element_table_header ;
218
+ if (secured_message_element_table_header -> vendor_len == 0 ) {
219
+ secured_message_element_header =
220
+ (const void * )(secured_message_element_table_header + 1 );
221
+ if ((const uint8_t * )secured_message_element_header +
222
+ sizeof (secured_message_opaque_element_header_t ) >
223
+ (const uint8_t * )data_in + data_in_size ) {
224
+ return false;
225
+ }
209
226
210
- if ((secured_message_element_header -> sm_data_id == sm_data_id ) &&
211
- (secured_message_element_header -> sm_data_version ==
212
- SECURED_MESSAGE_OPAQUE_ELEMENT_SMDATA_DATA_VERSION )) {
213
- /*get element by element id*/
214
- * get_element_ptr = opaque_element_table_header ;
215
- * get_element_len = current_element_len ;
216
- result = true;
227
+ if ((secured_message_element_header -> sm_data_id == sm_data_id ) &&
228
+ (secured_message_element_header -> sm_data_version ==
229
+ SECURED_MESSAGE_OPAQUE_ELEMENT_SMDATA_DATA_VERSION )) {
230
+ /*get element by element id*/
231
+ * get_element_ptr = opaque_element_table_header ;
232
+ * get_element_len = current_element_len ;
233
+ result = true;
234
+ }
217
235
}
218
236
}
219
237
220
238
/*move to next element*/
221
- opaque_element_table_header = (const secured_message_opaque_element_table_header_t * )
239
+ opaque_element_table_header = (const opaque_element_table_header_t * )
222
240
((const uint8_t * )opaque_element_table_header +
223
241
current_element_len );
224
242
}
0 commit comments