Skip to content

Commit 31fbad7

Browse files
committed
Add 1.3 Encap Digest.
Signed-off-by: Jiewen Yao <[email protected]>
1 parent d0260ce commit 31fbad7

File tree

2 files changed

+109
-4
lines changed

2 files changed

+109
-4
lines changed

library/spdm_requester_lib/libspdm_req_encap_digests.c

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ libspdm_return_t libspdm_get_encap_response_digest(void *spdm_context,
2929
uint8_t slot_index;
3030
uint32_t session_id;
3131
libspdm_session_info_t *session_info;
32+
size_t additional_size;
33+
spdm_key_pair_id_t *key_pair_id;
34+
spdm_certificate_info_t *cert_info;
35+
spdm_key_usage_bit_mask_t *key_usage_bit_mask;
3236

3337
context = spdm_context;
3438
spdm_request = request;
@@ -66,9 +70,15 @@ libspdm_return_t libspdm_get_encap_response_digest(void *spdm_context,
6670
context->connection_info.algorithm.base_hash_algo);
6771

6872
slot_count = libspdm_get_cert_slot_count(context);
73+
additional_size = 0;
74+
if ((spdm_request->header.spdm_version >= SPDM_MESSAGE_VERSION_13) &&
75+
context->connection_info.multi_key_conn_req) {
76+
additional_size = sizeof(spdm_key_pair_id_t) + sizeof(spdm_certificate_info_t) +
77+
sizeof(spdm_key_usage_bit_mask_t);
78+
}
6979
LIBSPDM_ASSERT(*response_size >=
70-
sizeof(spdm_digest_response_t) + hash_size * slot_count);
71-
*response_size = sizeof(spdm_digest_response_t) + hash_size * slot_count;
80+
sizeof(spdm_digest_response_t) + (hash_size + additional_size) * slot_count);
81+
*response_size = sizeof(spdm_digest_response_t) + (hash_size + additional_size) * slot_count;
7282
libspdm_zero_mem(response, *response_size);
7383
spdm_response = response;
7484

@@ -77,14 +87,32 @@ libspdm_return_t libspdm_get_encap_response_digest(void *spdm_context,
7787
spdm_response->header.param1 = 0;
7888
spdm_response->header.param2 = 0;
7989

90+
if (spdm_request->header.spdm_version >= SPDM_MESSAGE_VERSION_13) {
91+
spdm_response->header.param1 = context->local_context.local_supported_slot_mask;
92+
}
93+
8094
digest = (void *)(spdm_response + 1);
95+
key_pair_id = (spdm_key_pair_id_t *)((uint8_t *)digest + hash_size * slot_count);
96+
cert_info = (spdm_certificate_info_t *)((uint8_t *)key_pair_id +
97+
sizeof(spdm_key_pair_id_t) * slot_count);
98+
key_usage_bit_mask = (spdm_key_usage_bit_mask_t *)((uint8_t *)cert_info +
99+
sizeof(spdm_certificate_info_t) *
100+
slot_count);
101+
81102
slot_index = 0;
82103
for (index = 0; index < SPDM_MAX_SLOT_COUNT; index++) {
83104
if (context->local_context
84105
.local_cert_chain_provision[index] != NULL) {
85106
spdm_response->header.param2 |= (1 << index);
86107
result = libspdm_generate_cert_chain_hash(context, index,
87108
&digest[hash_size * slot_index]);
109+
if ((spdm_request->header.spdm_version >= SPDM_MESSAGE_VERSION_13) &&
110+
context->connection_info.multi_key_conn_req) {
111+
key_pair_id[slot_index] = context->local_context.local_key_pair_id[index];
112+
cert_info[slot_index] = context->local_context.local_cert_info[index];
113+
key_usage_bit_mask[slot_index] =
114+
context->local_context.local_key_usage_bit_mask[index];
115+
}
88116
slot_index++;
89117
if (!result) {
90118
return libspdm_generate_encap_error_response(

library/spdm_responder_lib/libspdm_rsp_encap_get_digests.c

Lines changed: 79 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,11 @@ libspdm_return_t libspdm_process_encap_response_digest(
7171
libspdm_return_t status;
7272
uint32_t session_id;
7373
libspdm_session_info_t *session_info;
74+
size_t additional_size;
75+
spdm_key_pair_id_t *key_pair_id;
76+
spdm_certificate_info_t *cert_info;
77+
spdm_key_usage_bit_mask_t *key_usage_bit_mask;
78+
size_t slot_index;
7479

7580
spdm_response = encap_response;
7681
spdm_response_size = encap_response_size;
@@ -96,6 +101,17 @@ libspdm_return_t libspdm_process_encap_response_digest(
96101
return LIBSPDM_STATUS_INVALID_MSG_SIZE;
97102
}
98103

104+
LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "provisioned_slot_mask - 0x%02x\n",
105+
spdm_response->header.param2));
106+
if (spdm_response->header.spdm_version >= SPDM_MESSAGE_VERSION_13) {
107+
LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "supported_slot_mask - 0x%02x\n",
108+
spdm_response->header.param1));
109+
if ((spdm_response->header.param1 & spdm_response->header.param2) !=
110+
spdm_response->header.param2) {
111+
return LIBSPDM_STATUS_INVALID_MSG_FIELD;
112+
}
113+
}
114+
99115
digest_size = libspdm_get_hash_size(
100116
spdm_context->connection_info.algorithm.base_hash_algo);
101117
digest_count = 0;
@@ -107,12 +123,19 @@ libspdm_return_t libspdm_process_encap_response_digest(
107123
if (digest_count == 0) {
108124
return LIBSPDM_STATUS_INVALID_MSG_FIELD;
109125
}
126+
127+
additional_size = 0;
128+
if ((spdm_response->header.spdm_version >= SPDM_MESSAGE_VERSION_13) &&
129+
spdm_context->connection_info.multi_key_conn_req) {
130+
additional_size = sizeof(spdm_key_pair_id_t) + sizeof(spdm_certificate_info_t) +
131+
sizeof(spdm_key_usage_bit_mask_t);
132+
}
110133
if (spdm_response_size <
111-
sizeof(spdm_digest_response_t) + digest_count * digest_size) {
134+
sizeof(spdm_digest_response_t) + digest_count * (digest_size + additional_size)) {
112135
return LIBSPDM_STATUS_INVALID_MSG_SIZE;
113136
}
114137
spdm_response_size =
115-
sizeof(spdm_digest_response_t) + digest_count * digest_size;
138+
sizeof(spdm_digest_response_t) + digest_count * (digest_size + additional_size);
116139

117140
/* Cache data*/
118141

@@ -142,12 +165,66 @@ libspdm_return_t libspdm_process_encap_response_digest(
142165
}
143166
}
144167

168+
key_pair_id =
169+
(spdm_key_pair_id_t *)((uint8_t *)(spdm_response + 1) + digest_size * digest_count);
170+
cert_info =
171+
(spdm_certificate_info_t *)((uint8_t *)key_pair_id + sizeof(spdm_key_pair_id_t) *
172+
digest_count);
173+
key_usage_bit_mask =
174+
(spdm_key_usage_bit_mask_t *)((uint8_t *)cert_info + sizeof(spdm_certificate_info_t) *
175+
digest_count);
145176
for (index = 0; index < digest_count; index++) {
146177
LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "digest (0x%x) - ", index));
147178
LIBSPDM_INTERNAL_DUMP_DATA(
148179
(const uint8_t *)(spdm_response + 1) + (digest_size * index), digest_size);
149180
LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "\n"));
150181
}
182+
if ((spdm_response->header.spdm_version >= SPDM_MESSAGE_VERSION_13) &&
183+
spdm_context->connection_info.multi_key_conn_req) {
184+
for (index = 0; index < digest_count; index++) {
185+
LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "key_pair_id (0x%x) - 0x%02x\n", index,
186+
key_pair_id[index]));
187+
}
188+
for (index = 0; index < digest_count; index++) {
189+
LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "cert_info (0x%x) - 0x%02x\n", index,
190+
cert_info[index]));
191+
}
192+
for (index = 0; index < digest_count; index++) {
193+
LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "key_usage_bit_mask (0x%x) - 0x%04x\n", index,
194+
key_usage_bit_mask[index]));
195+
}
196+
}
197+
198+
spdm_context->connection_info.peer_provisioned_slot_mask = spdm_response->header.param2;
199+
if (spdm_response->header.spdm_version >= SPDM_MESSAGE_VERSION_13) {
200+
spdm_context->connection_info.peer_supported_slot_mask = spdm_response->header.param1;
201+
} else {
202+
spdm_context->connection_info.peer_supported_slot_mask = spdm_response->header.param2;
203+
}
204+
libspdm_copy_mem(
205+
spdm_context->connection_info.peer_total_digest_buffer,
206+
sizeof(spdm_context->connection_info.peer_total_digest_buffer),
207+
spdm_response + 1, digest_size * digest_count);
208+
libspdm_zero_mem(spdm_context->connection_info.peer_key_pair_id,
209+
sizeof(spdm_context->connection_info.peer_key_pair_id));
210+
libspdm_zero_mem(spdm_context->connection_info.peer_cert_info,
211+
sizeof(spdm_context->connection_info.peer_cert_info));
212+
libspdm_zero_mem(spdm_context->connection_info.peer_key_usage_bit_mask,
213+
sizeof(spdm_context->connection_info.peer_key_usage_bit_mask));
214+
if ((spdm_response->header.spdm_version >= SPDM_MESSAGE_VERSION_13) &&
215+
spdm_context->connection_info.multi_key_conn_req) {
216+
slot_index = 0;
217+
for (index = 0; index < digest_count; index++) {
218+
if (spdm_response->header.param2 & (1 << index)) {
219+
spdm_context->connection_info.peer_key_pair_id[index] = key_pair_id[slot_index];
220+
spdm_context->connection_info.peer_cert_info[index] =
221+
cert_info[slot_index] & SPDM_CERTIFICATE_INFO_CERT_MODEL_MASK;
222+
spdm_context->connection_info.peer_key_usage_bit_mask[index] =
223+
key_usage_bit_mask[slot_index];
224+
slot_index++;
225+
}
226+
}
227+
}
151228

152229
*need_continue = false;
153230

0 commit comments

Comments
 (0)