Skip to content

Commit eccd8c5

Browse files
committed
1.3 Add DIGEST to transcript.
Signed-off-by: Jiewen Yao <[email protected]>
1 parent 2ae251e commit eccd8c5

File tree

8 files changed

+256
-0
lines changed

8 files changed

+256
-0
lines changed

include/internal/libspdm_common_lib.h

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,7 @@ typedef struct {
312312
typedef struct {
313313
/* the message_a must be plan text because we do not know the algorithm yet.*/
314314
libspdm_vca_managed_buffer_t message_a;
315+
libspdm_message_d_managed_buffer_t message_d;
315316
#if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
316317
libspdm_message_b_managed_buffer_t message_b;
317318
libspdm_message_c_managed_buffer_t message_c;
@@ -383,6 +384,7 @@ typedef struct {
383384
* F = Concatenate (PSK_FINISH request, PSK_FINISH response)*/
384385

385386
typedef struct {
387+
libspdm_message_d_managed_buffer_t message_encap_d;
386388
#if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
387389
libspdm_message_k_managed_buffer_t message_k;
388390
libspdm_message_f_managed_buffer_t message_f;
@@ -1198,6 +1200,14 @@ void libspdm_append_msg_log(libspdm_context_t *spdm_context, void *message, size
11981200
**/
11991201
void libspdm_reset_message_a(libspdm_context_t *spdm_context);
12001202

1203+
/**
1204+
* Reset message D cache in SPDM context.
1205+
*
1206+
* @param spdm_context A pointer to the SPDM context.
1207+
* @param spdm_session_info A pointer to the SPDM session context.
1208+
**/
1209+
void libspdm_reset_message_d(libspdm_context_t *spdm_context);
1210+
12011211
/**
12021212
* Reset message B cache in SPDM context.
12031213
*
@@ -1244,6 +1254,14 @@ void libspdm_reset_message_m(libspdm_context_t *spdm_context, void *session_info
12441254
**/
12451255
void libspdm_reset_message_k(libspdm_context_t *spdm_context, void *spdm_session_info);
12461256

1257+
/**
1258+
* Reset message EncapD cache in SPDM context.
1259+
*
1260+
* @param spdm_context A pointer to the SPDM context.
1261+
* @param spdm_session_info A pointer to the SPDM session context.
1262+
**/
1263+
void libspdm_reset_message_encap_d(libspdm_context_t *spdm_context, void *spdm_session_info);
1264+
12471265
/**
12481266
* Reset message F cache in SPDM context.
12491267
*
@@ -1264,6 +1282,20 @@ void libspdm_reset_message_f(libspdm_context_t *spdm_context, void *spdm_session
12641282
**/
12651283
libspdm_return_t libspdm_append_message_a(libspdm_context_t *spdm_context, const void *message,
12661284
size_t message_size);
1285+
1286+
/**
1287+
* Append message D cache in SPDM context.
1288+
*
1289+
* @param spdm_context A pointer to the SPDM context.
1290+
* @param message Message buffer.
1291+
* @param message_size Size in bytes of message buffer.
1292+
*
1293+
* @return RETURN_SUCCESS message is appended.
1294+
* @return RETURN_OUT_OF_RESOURCES message is not appended because the internal cache is full.
1295+
**/
1296+
libspdm_return_t libspdm_append_message_d(libspdm_context_t *spdm_context, const void *message,
1297+
size_t message_size);
1298+
12671299
/**
12681300
* Append message B cache in SPDM context.
12691301
*
@@ -1350,6 +1382,23 @@ libspdm_return_t libspdm_append_message_k(libspdm_context_t *spdm_context,
13501382
bool is_requester, const void *message,
13511383
size_t message_size);
13521384

1385+
/**
1386+
* Append message EncapD cache in SPDM context.
1387+
*
1388+
* @param spdm_context A pointer to the SPDM context.
1389+
* @param spdm_session_info A pointer to the SPDM session context.
1390+
* @param is_requester Indicate of the key generation for a requester or a responder.
1391+
* @param message Message buffer.
1392+
* @param message_size Size in bytes of message buffer.
1393+
*
1394+
* @return RETURN_SUCCESS message is appended.
1395+
* @return RETURN_OUT_OF_RESOURCES message is not appended because the internal cache is full.
1396+
**/
1397+
libspdm_return_t libspdm_append_message_encap_d(libspdm_context_t *spdm_context,
1398+
void *spdm_session_info,
1399+
bool is_requester, const void *message,
1400+
size_t message_size);
1401+
13531402
/**
13541403
* Append message F cache in SPDM context.
13551404
*

library/spdm_common_lib/libspdm_com_context_data.c

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1089,6 +1089,16 @@ void libspdm_reset_message_a(libspdm_context_t *spdm_context)
10891089
libspdm_reset_managed_buffer(&spdm_context->transcript.message_a);
10901090
}
10911091

1092+
/**
1093+
* Reset message D cache in SPDM context.
1094+
*
1095+
* @param spdm_context A pointer to the SPDM context.
1096+
**/
1097+
void libspdm_reset_message_d(libspdm_context_t *spdm_context)
1098+
{
1099+
libspdm_reset_managed_buffer(&spdm_context->transcript.message_d);
1100+
}
1101+
10921102
/**
10931103
* Reset message B cache in SPDM context.
10941104
*
@@ -1226,6 +1236,20 @@ void libspdm_reset_message_k(libspdm_context_t *spdm_context, void *session_info
12261236
#endif
12271237
}
12281238

1239+
/**
1240+
* Reset message EncapD cache in SPDM context.
1241+
*
1242+
* @param spdm_context A pointer to the SPDM context.
1243+
* @param spdm_session_info A pointer to the SPDM session context.
1244+
**/
1245+
void libspdm_reset_message_encap_d(libspdm_context_t *spdm_context, void *session_info)
1246+
{
1247+
libspdm_session_info_t *spdm_session_info;
1248+
1249+
spdm_session_info = session_info;
1250+
libspdm_reset_managed_buffer(&spdm_session_info->session_transcript.message_encap_d);
1251+
}
1252+
12291253
/**
12301254
* Reset message F cache in SPDM context.
12311255
*
@@ -1327,6 +1351,24 @@ libspdm_return_t libspdm_append_message_a(libspdm_context_t *spdm_context, const
13271351
message, message_size);
13281352
}
13291353

1354+
/**
1355+
* Append message D cache in SPDM context.
1356+
*
1357+
* @param spdm_context A pointer to the SPDM context.
1358+
* @param message Message buffer.
1359+
* @param message_size Size in bytes of message buffer.
1360+
*
1361+
* @return RETURN_SUCCESS message is appended.
1362+
* @return RETURN_OUT_OF_RESOURCES message is not appended because the internal cache is full.
1363+
**/
1364+
libspdm_return_t libspdm_append_message_d(libspdm_context_t *spdm_context, const void *message,
1365+
size_t message_size)
1366+
{
1367+
libspdm_reset_message_d (spdm_context);
1368+
return libspdm_append_managed_buffer(&spdm_context->transcript.message_d,
1369+
message, message_size);
1370+
}
1371+
13301372
/**
13311373
* Append message B cache in SPDM context.
13321374
*
@@ -1836,6 +1878,19 @@ libspdm_return_t libspdm_append_message_k(libspdm_context_t *spdm_context,
18361878
return LIBSPDM_STATUS_CRYPTO_ERROR;
18371879
}
18381880
if (!spdm_session_info->use_psk) {
1881+
if (spdm_context->connection_info.multi_key_conn_rsp) {
1882+
result = libspdm_hash_update (
1883+
spdm_context->connection_info.algorithm.base_hash_algo,
1884+
spdm_session_info->session_transcript.digest_context_th,
1885+
libspdm_get_managed_buffer(&spdm_context->transcript.message_d),
1886+
libspdm_get_managed_buffer_size(&spdm_context->transcript.message_d));
1887+
if (!result) {
1888+
libspdm_hash_free (spdm_context->connection_info.algorithm.base_hash_algo,
1889+
spdm_session_info->session_transcript.digest_context_th);
1890+
return LIBSPDM_STATUS_CRYPTO_ERROR;
1891+
}
1892+
}
1893+
18391894
result = libspdm_hash_update (
18401895
spdm_context->connection_info.algorithm.base_hash_algo,
18411896
spdm_session_info->session_transcript.digest_context_th,
@@ -1861,6 +1916,32 @@ libspdm_return_t libspdm_append_message_k(libspdm_context_t *spdm_context,
18611916
#endif
18621917
}
18631918

1919+
/**
1920+
* Append message EncapD cache in SPDM context.
1921+
*
1922+
* @param spdm_context A pointer to the SPDM context.
1923+
* @param spdm_session_info A pointer to the SPDM session context.
1924+
* @param is_requester Indicate of the key generation for a requester or a responder.
1925+
* @param message Message buffer.
1926+
* @param message_size Size in bytes of message buffer.
1927+
*
1928+
* @return RETURN_SUCCESS message is appended.
1929+
* @return RETURN_OUT_OF_RESOURCES message is not appended because the internal cache is full.
1930+
**/
1931+
libspdm_return_t libspdm_append_message_encap_d(libspdm_context_t *spdm_context,
1932+
void *session_info,
1933+
bool is_requester, const void *message,
1934+
size_t message_size)
1935+
{
1936+
libspdm_session_info_t *spdm_session_info;
1937+
1938+
spdm_session_info = session_info;
1939+
libspdm_reset_message_encap_d(spdm_context, session_info);
1940+
return libspdm_append_managed_buffer(
1941+
&spdm_session_info->session_transcript.message_encap_d, message,
1942+
message_size);
1943+
}
1944+
18641945
/**
18651946
* Append message F cache in SPDM context.
18661947
*
@@ -1993,6 +2074,22 @@ libspdm_return_t libspdm_append_message_f(libspdm_context_t *spdm_context,
19932074
LIBSPDM_ASSERT (spdm_session_info->session_transcript.digest_context_th != NULL);
19942075
if (!spdm_session_info->session_transcript.message_f_initialized) {
19952076
if (!spdm_session_info->use_psk && spdm_session_info->mut_auth_requested) {
2077+
if (spdm_context->connection_info.multi_key_conn_req) {
2078+
result = libspdm_hash_update (
2079+
spdm_context->connection_info.algorithm.base_hash_algo,
2080+
spdm_session_info->session_transcript.digest_context_th,
2081+
libspdm_get_managed_buffer(&spdm_session_info->session_transcript.
2082+
message_encap_d),
2083+
libspdm_get_managed_buffer_size(&spdm_session_info->session_transcript.
2084+
message_encap_d));
2085+
if (!result) {
2086+
libspdm_hash_free (spdm_context->connection_info.algorithm.base_hash_algo,
2087+
spdm_session_info->session_transcript.digest_context_th);
2088+
spdm_session_info->session_transcript.digest_context_th = NULL;
2089+
return LIBSPDM_STATUS_CRYPTO_ERROR;
2090+
}
2091+
}
2092+
19962093
result = libspdm_hash_update (
19972094
spdm_context->connection_info.algorithm.base_hash_algo,
19982095
spdm_session_info->session_transcript.digest_context_th,
@@ -2636,6 +2733,8 @@ libspdm_return_t libspdm_init_context_with_secured_context(void *spdm_context,
26362733
context->version = LIBSPDM_CONTEXT_STRUCT_VERSION;
26372734
context->transcript.message_a.max_buffer_size =
26382735
sizeof(context->transcript.message_a.buffer);
2736+
context->transcript.message_d.max_buffer_size =
2737+
sizeof(context->transcript.message_d.buffer);
26392738
#if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
26402739
context->transcript.message_b.max_buffer_size =
26412740
sizeof(context->transcript.message_b.buffer);
@@ -2818,13 +2917,15 @@ void libspdm_deinit_context(void *spdm_context)
28182917
#endif
28192918

28202919
libspdm_reset_message_a(context);
2920+
libspdm_reset_message_d(context);
28212921
libspdm_reset_message_b(context);
28222922
libspdm_reset_message_c(context);
28232923
libspdm_reset_message_mut_b(context);
28242924
libspdm_reset_message_mut_c(context);
28252925
for (session_id = 0; session_id < LIBSPDM_MAX_SESSION_COUNT; session_id++) {
28262926
session_info = &context->session_info[session_id];
28272927
libspdm_reset_message_m(context, session_info);
2928+
libspdm_reset_message_encap_d(context, session_info);
28282929
libspdm_reset_message_k(context, session_info);
28292930
libspdm_reset_message_f(context, session_info);
28302931
}

library/spdm_common_lib/libspdm_com_context_data_session.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ void libspdm_session_info_init(libspdm_context_t *spdm_context,
9696
spdm_context->connection_info.algorithm.dhe_named_group,
9797
spdm_context->connection_info.algorithm.aead_cipher_suite,
9898
spdm_context->connection_info.algorithm.key_schedule);
99+
session_info->session_transcript.message_encap_d.max_buffer_size =
100+
sizeof(session_info->session_transcript.message_encap_d.buffer);
99101
#if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
100102
session_info->session_transcript.message_k.max_buffer_size =
101103
sizeof(session_info->session_transcript.message_k.buffer);

library/spdm_common_lib/libspdm_com_crypto_service_session.c

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,20 @@ bool libspdm_calculate_th_for_exchange(
4949
}
5050

5151
if (cert_chain_buffer != NULL) {
52+
if (spdm_context->connection_info.multi_key_conn_rsp) {
53+
LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "message_d data :\n"));
54+
LIBSPDM_INTERNAL_DUMP_HEX(
55+
libspdm_get_managed_buffer(&spdm_context->transcript.message_d),
56+
libspdm_get_managed_buffer_size(&spdm_context->transcript.message_d));
57+
status = libspdm_append_managed_buffer(
58+
th_curr,
59+
libspdm_get_managed_buffer(&spdm_context->transcript.message_d),
60+
libspdm_get_managed_buffer_size(&spdm_context->transcript.message_d));
61+
if (LIBSPDM_STATUS_IS_ERROR(status)) {
62+
return false;
63+
}
64+
}
65+
5266
LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "th_message_ct data :\n"));
5367
LIBSPDM_INTERNAL_DUMP_HEX(cert_chain_buffer, cert_chain_buffer_size);
5468
result = libspdm_hash_all(
@@ -236,6 +250,20 @@ bool libspdm_calculate_th_for_finish(libspdm_context_t *spdm_context,
236250
}
237251

238252
if (cert_chain_buffer != NULL) {
253+
if (spdm_context->connection_info.multi_key_conn_rsp) {
254+
LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "message_d data :\n"));
255+
LIBSPDM_INTERNAL_DUMP_HEX(
256+
libspdm_get_managed_buffer(&spdm_context->transcript.message_d),
257+
libspdm_get_managed_buffer_size(&spdm_context->transcript.message_d));
258+
status = libspdm_append_managed_buffer(
259+
th_curr,
260+
libspdm_get_managed_buffer(&spdm_context->transcript.message_d),
261+
libspdm_get_managed_buffer_size(&spdm_context->transcript.message_d));
262+
if (LIBSPDM_STATUS_IS_ERROR(status)) {
263+
return false;
264+
}
265+
}
266+
239267
LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "th_message_ct data :\n"));
240268
LIBSPDM_INTERNAL_DUMP_HEX(cert_chain_buffer, cert_chain_buffer_size);
241269
result = libspdm_hash_all(
@@ -264,6 +292,20 @@ bool libspdm_calculate_th_for_finish(libspdm_context_t *spdm_context,
264292
}
265293

266294
if (mut_cert_chain_buffer != NULL) {
295+
if (spdm_context->connection_info.multi_key_conn_req) {
296+
LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "message_encap_d data :\n"));
297+
LIBSPDM_INTERNAL_DUMP_HEX(
298+
libspdm_get_managed_buffer(&session_info->session_transcript.message_encap_d),
299+
libspdm_get_managed_buffer_size(&session_info->session_transcript.message_encap_d));
300+
status = libspdm_append_managed_buffer(
301+
th_curr,
302+
libspdm_get_managed_buffer(&session_info->session_transcript.message_encap_d),
303+
libspdm_get_managed_buffer_size(&session_info->session_transcript.message_encap_d));
304+
if (LIBSPDM_STATUS_IS_ERROR(status)) {
305+
return false;
306+
}
307+
}
308+
267309
LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "th_message_cm data :\n"));
268310
LIBSPDM_INTERNAL_DUMP_HEX(mut_cert_chain_buffer, mut_cert_chain_buffer_size);
269311
result = libspdm_hash_all(

library/spdm_requester_lib/libspdm_req_encap_digests.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ libspdm_return_t libspdm_get_encap_response_digest(void *spdm_context,
2727
uint8_t slot_count;
2828
/*populated solt index*/
2929
uint8_t slot_index;
30+
uint32_t session_id;
31+
libspdm_session_info_t *session_info;
3032

3133
context = spdm_context;
3234
spdm_request = request;
@@ -110,6 +112,28 @@ libspdm_return_t libspdm_get_encap_response_digest(void *spdm_context,
110112
response_size, response);
111113
}
112114

115+
if (context->last_spdm_request_session_id_valid) {
116+
session_id = context->last_spdm_request_session_id;
117+
} else {
118+
session_id = context->latest_session_id;
119+
}
120+
if (session_id != INVALID_SESSION_ID) {
121+
session_info = libspdm_get_session_info_via_session_id(context, session_id);
122+
} else {
123+
session_info = NULL;
124+
}
125+
if (session_info != NULL) {
126+
if (context->connection_info.multi_key_conn_req) {
127+
status = libspdm_append_message_encap_d(context, session_info, true,
128+
spdm_response, *response_size);
129+
if (LIBSPDM_STATUS_IS_ERROR(status)) {
130+
return libspdm_generate_encap_error_response(
131+
context, SPDM_ERROR_CODE_UNSPECIFIED, 0,
132+
response_size, response);
133+
}
134+
}
135+
}
136+
113137
return LIBSPDM_STATUS_SUCCESS;
114138
}
115139

library/spdm_requester_lib/libspdm_req_get_digests.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,13 @@ static libspdm_return_t libspdm_try_get_digest(libspdm_context_t *spdm_context,
187187
if (LIBSPDM_STATUS_IS_ERROR(status)) {
188188
goto receive_done;
189189
}
190+
191+
if (spdm_context->connection_info.multi_key_conn_rsp) {
192+
status = libspdm_append_message_d(spdm_context, spdm_response, spdm_response_size);
193+
if (LIBSPDM_STATUS_IS_ERROR(status)) {
194+
goto receive_done;
195+
}
196+
}
190197
}
191198

192199
for (index = 0; index < digest_count; index++) {

library/spdm_responder_lib/libspdm_rsp_digests.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,15 @@ libspdm_return_t libspdm_get_response_digests(libspdm_context_t *spdm_context, s
150150
SPDM_ERROR_CODE_UNSPECIFIED, 0,
151151
response_size, response);
152152
}
153+
154+
if (spdm_context->connection_info.multi_key_conn_rsp) {
155+
status = libspdm_append_message_d(spdm_context, spdm_response, *response_size);
156+
if (LIBSPDM_STATUS_IS_ERROR(status)) {
157+
return libspdm_generate_error_response(spdm_context,
158+
SPDM_ERROR_CODE_UNSPECIFIED, 0,
159+
response_size, response);
160+
}
161+
}
153162
}
154163

155164
if (spdm_context->connection_info.connection_state <

0 commit comments

Comments
 (0)