Skip to content

Commit 65dafb9

Browse files
committed
Add 1.3 Encap Digest.
Signed-off-by: Jiewen Yao <[email protected]>
1 parent 511b9c4 commit 65dafb9

File tree

2 files changed

+113
-4
lines changed

2 files changed

+113
-4
lines changed

Diff for: library/spdm_requester_lib/libspdm_req_encap_digests.c

+30-2
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(

Diff for: library/spdm_responder_lib/libspdm_rsp_encap_get_digests.c

+83-2
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,12 @@ 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;
79+
uint8_t cert_model;
7480

7581
spdm_response = encap_response;
7682
spdm_response_size = encap_response_size;
@@ -96,6 +102,17 @@ libspdm_return_t libspdm_process_encap_response_digest(
96102
return LIBSPDM_STATUS_INVALID_MSG_SIZE;
97103
}
98104

105+
LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "provisioned_slot_mask - 0x%02x\n",
106+
spdm_response->header.param2));
107+
if (spdm_response->header.spdm_version >= SPDM_MESSAGE_VERSION_13) {
108+
LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "supported_slot_mask - 0x%02x\n",
109+
spdm_response->header.param1));
110+
if ((spdm_response->header.param1 & spdm_response->header.param2) !=
111+
spdm_response->header.param2) {
112+
return LIBSPDM_STATUS_INVALID_MSG_FIELD;
113+
}
114+
}
115+
99116
digest_size = libspdm_get_hash_size(
100117
spdm_context->connection_info.algorithm.base_hash_algo);
101118
digest_count = 0;
@@ -107,12 +124,19 @@ libspdm_return_t libspdm_process_encap_response_digest(
107124
if (digest_count == 0) {
108125
return LIBSPDM_STATUS_INVALID_MSG_FIELD;
109126
}
127+
128+
additional_size = 0;
129+
if ((spdm_response->header.spdm_version >= SPDM_MESSAGE_VERSION_13) &&
130+
spdm_context->connection_info.multi_key_conn_req) {
131+
additional_size = sizeof(spdm_key_pair_id_t) + sizeof(spdm_certificate_info_t) +
132+
sizeof(spdm_key_usage_bit_mask_t);
133+
}
110134
if (spdm_response_size <
111-
sizeof(spdm_digest_response_t) + digest_count * digest_size) {
135+
sizeof(spdm_digest_response_t) + digest_count * (digest_size + additional_size)) {
112136
return LIBSPDM_STATUS_INVALID_MSG_SIZE;
113137
}
114138
spdm_response_size =
115-
sizeof(spdm_digest_response_t) + digest_count * digest_size;
139+
sizeof(spdm_digest_response_t) + digest_count * (digest_size + additional_size);
116140

117141
/* Cache data*/
118142

@@ -142,12 +166,69 @@ libspdm_return_t libspdm_process_encap_response_digest(
142166
}
143167
}
144168

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

152233
*need_continue = false;
153234

0 commit comments

Comments
 (0)