@@ -14,6 +14,7 @@ libspdm_return_t libspdm_get_encap_request_challenge(libspdm_context_t *spdm_con
14
14
void * encap_request )
15
15
{
16
16
spdm_challenge_request_t * spdm_request ;
17
+ size_t spdm_request_size ;
17
18
libspdm_return_t status ;
18
19
19
20
spdm_context -> encap_context .last_encap_request_size = 0 ;
@@ -28,10 +29,15 @@ libspdm_return_t libspdm_get_encap_request_challenge(libspdm_context_t *spdm_con
28
29
return LIBSPDM_STATUS_UNSUPPORTED_CAP ;
29
30
}
30
31
31
- if (* encap_request_size < sizeof (spdm_challenge_request_t )) {
32
+ spdm_request_size = sizeof (spdm_challenge_request_t );
33
+ if (libspdm_get_connection_version (spdm_context ) >= SPDM_MESSAGE_VERSION_13 ) {
34
+ spdm_request_size = sizeof (spdm_challenge_request_t ) + SPDM_REQ_CONTEXT_SIZE ;
35
+ }
36
+
37
+ if (* encap_request_size < spdm_request_size ) {
32
38
return LIBSPDM_STATUS_INVALID_MSG_SIZE ;
33
39
}
34
- * encap_request_size = sizeof ( spdm_challenge_request_t ) ;
40
+ * encap_request_size = spdm_request_size ;
35
41
36
42
spdm_request = encap_request ;
37
43
@@ -46,6 +52,13 @@ libspdm_return_t libspdm_get_encap_request_challenge(libspdm_context_t *spdm_con
46
52
LIBSPDM_DEBUG ((LIBSPDM_DEBUG_INFO , "Encap RequesterNonce - " ));
47
53
LIBSPDM_INTERNAL_DUMP_DATA (spdm_request -> nonce , SPDM_NONCE_SIZE );
48
54
LIBSPDM_DEBUG ((LIBSPDM_DEBUG_INFO , "\n" ));
55
+ if (spdm_request -> header .spdm_version >= SPDM_MESSAGE_VERSION_13 ) {
56
+ libspdm_copy_mem (spdm_request + 1 , SPDM_REQ_CONTEXT_SIZE ,
57
+ spdm_context -> encap_context .req_context , SPDM_REQ_CONTEXT_SIZE );
58
+ LIBSPDM_DEBUG ((LIBSPDM_DEBUG_INFO , "Encap RequesterContext - " ));
59
+ LIBSPDM_INTERNAL_DUMP_DATA ((uint8_t * )(spdm_request + 1 ), SPDM_REQ_CONTEXT_SIZE );
60
+ LIBSPDM_DEBUG ((LIBSPDM_DEBUG_INFO , "\n" ));
61
+ }
49
62
50
63
libspdm_reset_message_buffer_via_request_code (spdm_context , NULL ,
51
64
spdm_request -> header .request_response_code );
@@ -54,15 +67,15 @@ libspdm_return_t libspdm_get_encap_request_challenge(libspdm_context_t *spdm_con
54
67
/* Cache data*/
55
68
56
69
status = libspdm_append_message_mut_c (spdm_context , spdm_request ,
57
- * encap_request_size );
70
+ spdm_request_size );
58
71
if (LIBSPDM_STATUS_IS_ERROR (status )) {
59
72
return LIBSPDM_STATUS_BUFFER_FULL ;
60
73
}
61
74
62
75
libspdm_copy_mem (& spdm_context -> encap_context .last_encap_request_header ,
63
76
sizeof (spdm_context -> encap_context .last_encap_request_header ),
64
77
& spdm_request -> header , sizeof (spdm_message_header_t ));
65
- spdm_context -> encap_context .last_encap_request_size = * encap_request_size ;
78
+ spdm_context -> encap_context .last_encap_request_size = spdm_request_size ;
66
79
67
80
return LIBSPDM_STATUS_SUCCESS ;
68
81
}
@@ -106,6 +119,11 @@ libspdm_return_t libspdm_process_encap_response_challenge_auth(
106
119
if (spdm_response_size < sizeof (spdm_challenge_auth_response_t )) {
107
120
return LIBSPDM_STATUS_INVALID_MSG_SIZE ;
108
121
}
122
+ if (spdm_response -> header .spdm_version >= SPDM_MESSAGE_VERSION_13 ) {
123
+ if (spdm_response_size < sizeof (spdm_challenge_auth_response_t ) + SPDM_REQ_CONTEXT_SIZE ) {
124
+ return LIBSPDM_STATUS_INVALID_MSG_SIZE ;
125
+ }
126
+ }
109
127
110
128
auth_attribute = spdm_response -> header .param1 ;
111
129
if (spdm_context -> encap_context .req_slot_id == 0xFF ) {
@@ -182,20 +200,28 @@ libspdm_return_t libspdm_process_encap_response_challenge_auth(
182
200
}
183
201
ptr += sizeof (uint16_t );
184
202
185
- if (spdm_response_size <
186
- sizeof (spdm_challenge_auth_response_t ) + hash_size +
187
- SPDM_NONCE_SIZE + measurement_summary_hash_size +
188
- sizeof (uint16_t ) + opaque_length + signature_size ) {
189
- return LIBSPDM_STATUS_INVALID_MSG_SIZE ;
190
- }
191
- spdm_response_size = sizeof (spdm_challenge_auth_response_t ) +
192
- hash_size + SPDM_NONCE_SIZE +
193
- measurement_summary_hash_size + sizeof (uint16_t ) +
194
- opaque_length + signature_size ;
195
- status = libspdm_append_message_mut_c (spdm_context , spdm_response ,
196
- spdm_response_size - signature_size );
197
- if (LIBSPDM_STATUS_IS_ERROR (status )) {
198
- return LIBSPDM_STATUS_BUFFER_FULL ;
203
+ if (spdm_response -> header .spdm_version >= SPDM_MESSAGE_VERSION_13 ) {
204
+ if (spdm_response_size <
205
+ sizeof (spdm_challenge_auth_response_t ) + hash_size +
206
+ SPDM_NONCE_SIZE + measurement_summary_hash_size +
207
+ sizeof (uint16_t ) + opaque_length + SPDM_REQ_CONTEXT_SIZE + signature_size ) {
208
+ return LIBSPDM_STATUS_INVALID_MSG_SIZE ;
209
+ }
210
+ spdm_response_size = sizeof (spdm_challenge_auth_response_t ) +
211
+ hash_size + SPDM_NONCE_SIZE +
212
+ measurement_summary_hash_size + sizeof (uint16_t ) +
213
+ opaque_length + SPDM_REQ_CONTEXT_SIZE + signature_size ;
214
+ } else {
215
+ if (spdm_response_size <
216
+ sizeof (spdm_challenge_auth_response_t ) + hash_size +
217
+ SPDM_NONCE_SIZE + measurement_summary_hash_size +
218
+ sizeof (uint16_t ) + opaque_length + signature_size ) {
219
+ return LIBSPDM_STATUS_INVALID_MSG_SIZE ;
220
+ }
221
+ spdm_response_size = sizeof (spdm_challenge_auth_response_t ) +
222
+ hash_size + SPDM_NONCE_SIZE +
223
+ measurement_summary_hash_size + sizeof (uint16_t ) +
224
+ opaque_length + signature_size ;
199
225
}
200
226
201
227
LIBSPDM_DEBUG_CODE (
@@ -206,6 +232,23 @@ libspdm_return_t libspdm_process_encap_response_challenge_auth(
206
232
);
207
233
ptr += opaque_length ;
208
234
235
+ if (spdm_response -> header .spdm_version >= SPDM_MESSAGE_VERSION_13 ) {
236
+ if (!libspdm_consttime_is_mem_equal (spdm_context -> encap_context .req_context , ptr ,
237
+ SPDM_REQ_CONTEXT_SIZE )) {
238
+ return LIBSPDM_STATUS_INVALID_MSG_FIELD ;
239
+ }
240
+ LIBSPDM_DEBUG ((LIBSPDM_DEBUG_INFO , "Encap RequesterContext - " ));
241
+ LIBSPDM_INTERNAL_DUMP_DATA (ptr , SPDM_REQ_CONTEXT_SIZE );
242
+ LIBSPDM_DEBUG ((LIBSPDM_DEBUG_INFO , "\n" ));
243
+ ptr += SPDM_REQ_CONTEXT_SIZE ;
244
+ }
245
+
246
+ status = libspdm_append_message_mut_c (spdm_context , spdm_response ,
247
+ spdm_response_size - signature_size );
248
+ if (LIBSPDM_STATUS_IS_ERROR (status )) {
249
+ return LIBSPDM_STATUS_BUFFER_FULL ;
250
+ }
251
+
209
252
signature = ptr ;
210
253
LIBSPDM_DEBUG ((LIBSPDM_DEBUG_INFO , "Encap signature (0x%x):\n" , signature_size ));
211
254
LIBSPDM_INTERNAL_DUMP_HEX (signature , signature_size );
0 commit comments