Skip to content

Commit e84dce8

Browse files
Handle "error" if no encapsulated request
Fix #3031. Signed-off-by: Steven Bellock <[email protected]>
1 parent 449d44c commit e84dce8

File tree

2 files changed

+130
-4
lines changed

2 files changed

+130
-4
lines changed

library/spdm_requester_lib/libspdm_req_encap_request.c

+30-4
Original file line numberDiff line numberDiff line change
@@ -235,13 +235,39 @@ libspdm_return_t libspdm_encapsulated_request(libspdm_context_t *spdm_context,
235235
libspdm_release_receiver_buffer (spdm_context);
236236
return status;
237237
}
238-
if (libspdm_encapsulated_request_response->header.request_response_code !=
239-
SPDM_ENCAPSULATED_REQUEST) {
238+
if (libspdm_encapsulated_request_response->header.spdm_version !=
239+
spdm_get_encapsulated_request_request->header.spdm_version) {
240240
libspdm_release_receiver_buffer (spdm_context);
241241
return LIBSPDM_STATUS_INVALID_MSG_FIELD;
242242
}
243-
if (libspdm_encapsulated_request_response->header.spdm_version !=
244-
spdm_get_encapsulated_request_request->header.spdm_version) {
243+
if (libspdm_encapsulated_request_response->header.request_response_code == SPDM_ERROR) {
244+
const uint8_t error_code = libspdm_encapsulated_request_response->header.param1;
245+
246+
libspdm_release_receiver_buffer(spdm_context);
247+
248+
if (spdm_response_size < sizeof(spdm_error_response_t)) {
249+
libspdm_release_receiver_buffer (spdm_context);
250+
return LIBSPDM_STATUS_INVALID_MSG_SIZE;
251+
}
252+
253+
if (mut_auth_requested == 0) {
254+
/* Responder can send NoPendingRequests or UnexpectedRequest if it has no
255+
encapsulated request for the Requester. */
256+
if ((libspdm_get_connection_version(spdm_context) >= SPDM_MESSAGE_VERSION_13) &&
257+
(error_code == SPDM_ERROR_CODE_NO_PENDING_REQUESTS)) {
258+
259+
return LIBSPDM_STATUS_SUCCESS;
260+
}
261+
if ((libspdm_get_connection_version(spdm_context) < SPDM_MESSAGE_VERSION_13) &&
262+
(error_code == SPDM_ERROR_CODE_UNEXPECTED_REQUEST)) {
263+
return LIBSPDM_STATUS_SUCCESS;
264+
}
265+
}
266+
return LIBSPDM_STATUS_ERROR_PEER;
267+
}
268+
269+
if (libspdm_encapsulated_request_response->header.request_response_code !=
270+
SPDM_ENCAPSULATED_REQUEST) {
245271
libspdm_release_receiver_buffer (spdm_context);
246272
return LIBSPDM_STATUS_INVALID_MSG_FIELD;
247273
}

unit_test/test_spdm_requester/encap_request.c

+100
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ libspdm_return_t libspdm_requester_encap_request_test_send_message(void *spdm_co
8686
}
8787
return LIBSPDM_STATUS_SUCCESS;
8888
}
89+
case 0xb:
90+
return LIBSPDM_STATUS_SUCCESS;
91+
case 0xc:
92+
return LIBSPDM_STATUS_SUCCESS;
8993
default:
9094
return LIBSPDM_STATUS_SEND_FAIL;
9195
}
@@ -568,6 +572,44 @@ libspdm_return_t libspdm_requester_encap_request_test_receive_message(
568572
}
569573
return LIBSPDM_STATUS_SUCCESS;
570574

575+
case 0xB:
576+
{
577+
spdm_error_response_t *spdm_response;
578+
579+
temp_buf_size = sizeof(spdm_error_response_t);
580+
libspdm_zero_mem(temp_buf, LIBSPDM_RECEIVER_BUFFER_SIZE);
581+
temp_buf_ptr = temp_buf + sizeof(libspdm_test_message_header_t);
582+
spdm_response = (void *) temp_buf_ptr;
583+
spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_11;
584+
spdm_response->header.request_response_code = SPDM_ERROR;
585+
spdm_response->header.param1 = SPDM_ERROR_CODE_UNEXPECTED_REQUEST;
586+
spdm_response->header.param2 = 0;
587+
588+
libspdm_transport_test_encode_message(spdm_context, NULL, false, false,
589+
temp_buf_size, temp_buf_ptr,
590+
response_size, response);
591+
}
592+
return LIBSPDM_STATUS_SUCCESS;
593+
594+
case 0xC:
595+
{
596+
spdm_error_response_t *spdm_response;
597+
598+
temp_buf_size = sizeof(spdm_error_response_t);
599+
libspdm_zero_mem(temp_buf, LIBSPDM_RECEIVER_BUFFER_SIZE);
600+
temp_buf_ptr = temp_buf + sizeof(libspdm_test_message_header_t);
601+
spdm_response = (void *) temp_buf_ptr;
602+
spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
603+
spdm_response->header.request_response_code = SPDM_ERROR;
604+
spdm_response->header.param1 = SPDM_ERROR_CODE_NO_PENDING_REQUESTS;
605+
spdm_response->header.param2 = 0;
606+
607+
libspdm_transport_test_encode_message(spdm_context, NULL, false, false,
608+
temp_buf_size, temp_buf_ptr,
609+
response_size, response);
610+
}
611+
return LIBSPDM_STATUS_SUCCESS;
612+
571613
default:
572614
return LIBSPDM_STATUS_RECEIVE_FAIL;
573615
}
@@ -977,6 +1019,62 @@ void libspdm_test_requester_encap_request_case10(void **State)
9771019
assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
9781020
}
9791021

1022+
/**
1023+
* Test 11: In a non-mutual-authentication context, Requester sends GET_ENCAPSULATED_REQUEST and
1024+
* Responder replies with UnexpectedRequest.
1025+
* Expected Behavior: return LIBSPDM_STATUS_SUCCESS as Responder did not have a pending request for
1026+
* the Requester.
1027+
**/
1028+
void libspdm_test_requester_encap_request_case11(void **State)
1029+
{
1030+
libspdm_return_t status;
1031+
libspdm_test_context_t *spdm_test_context;
1032+
libspdm_context_t *spdm_context;
1033+
1034+
spdm_test_context = *State;
1035+
spdm_context = spdm_test_context->spdm_context;
1036+
spdm_test_context->case_id = 0xB;
1037+
1038+
spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_11 <<
1039+
SPDM_VERSION_NUMBER_SHIFT_BIT;
1040+
spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1041+
spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
1042+
spdm_context->connection_info.capability.flags |=
1043+
SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
1044+
1045+
libspdm_register_get_encap_response_func(spdm_context, NULL);
1046+
status = libspdm_encapsulated_request(spdm_context, NULL, 0, NULL);
1047+
assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1048+
}
1049+
1050+
/**
1051+
* Test 12: In a non-mutual-authentication context, Requester sends GET_ENCAPSULATED_REQUEST and
1052+
* Responder replies with NoPendingRequests.
1053+
* Expected Behavior: return LIBSPDM_STATUS_SUCCESS as Responder did not have a pending request for
1054+
* the Requester.
1055+
**/
1056+
void libspdm_test_requester_encap_request_case12(void **State)
1057+
{
1058+
libspdm_return_t status;
1059+
libspdm_test_context_t *spdm_test_context;
1060+
libspdm_context_t *spdm_context;
1061+
1062+
spdm_test_context = *State;
1063+
spdm_context = spdm_test_context->spdm_context;
1064+
spdm_test_context->case_id = 0xC;
1065+
1066+
spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
1067+
SPDM_VERSION_NUMBER_SHIFT_BIT;
1068+
spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
1069+
spdm_context->local_context.capability.flags |= SPDM_GET_CAPABILITIES_REQUEST_FLAGS_ENCAP_CAP;
1070+
spdm_context->connection_info.capability.flags |=
1071+
SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP;
1072+
1073+
libspdm_register_get_encap_response_func(spdm_context, NULL);
1074+
status = libspdm_encapsulated_request(spdm_context, NULL, 0, NULL);
1075+
assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
1076+
}
1077+
9801078
int libspdm_requester_encap_request_test_main(void)
9811079
{
9821080
const struct CMUnitTest spdm_requester_encap_request_tests[] = {
@@ -999,6 +1097,8 @@ int libspdm_requester_encap_request_test_main(void)
9991097
cmocka_unit_test(libspdm_test_requester_encap_request_case9),
10001098
/*Error response: GET_ENCAPSULATED_REQUEST message is encapsulated */
10011099
cmocka_unit_test(libspdm_test_requester_encap_request_case10),
1100+
cmocka_unit_test(libspdm_test_requester_encap_request_case11),
1101+
cmocka_unit_test(libspdm_test_requester_encap_request_case12),
10021102
};
10031103

10041104
libspdm_test_context_t test_context = {

0 commit comments

Comments
 (0)