diff --git a/library/spdm_responder_lib/libspdm_rsp_version.c b/library/spdm_responder_lib/libspdm_rsp_version.c index 61df93c27e2..ce4e20c979a 100644 --- a/library/spdm_responder_lib/libspdm_rsp_version.c +++ b/library/spdm_responder_lib/libspdm_rsp_version.c @@ -15,6 +15,20 @@ typedef struct { } libspdm_version_response_mine_t; #pragma pack() +static libspdm_return_t generate_invalid_version_error(void *response) +{ + spdm_error_response_t *spdm_response; + + spdm_response = response; + + spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_10; + spdm_response->header.request_response_code = SPDM_ERROR; + spdm_response->header.param1 = SPDM_ERROR_CODE_VERSION_MISMATCH; + spdm_response->header.param2 = 0; + + return LIBSPDM_STATUS_SUCCESS; +} + libspdm_return_t libspdm_get_response_version(libspdm_context_t *spdm_context, size_t request_size, const void *request, size_t *response_size, @@ -40,9 +54,9 @@ libspdm_return_t libspdm_get_response_version(libspdm_context_t *spdm_context, s } if (spdm_request->header.spdm_version != SPDM_MESSAGE_VERSION_10) { - return libspdm_generate_error_response(spdm_context, - SPDM_ERROR_CODE_VERSION_MISMATCH, 0, - response_size, response); + /* If the GET_VERSION request is improperly formed then the version of the error message + * must be 1.0, regardless of what the negotiated version is. */ + return generate_invalid_version_error(response); } libspdm_set_connection_state(spdm_context, LIBSPDM_CONNECTION_STATE_NOT_STARTED); diff --git a/unit_test/test_spdm_responder/version.c b/unit_test/test_spdm_responder/version.c index 7b512c9fc85..5cf92edec66 100644 --- a/unit_test/test_spdm_responder/version.c +++ b/unit_test/test_spdm_responder/version.c @@ -188,10 +188,9 @@ void libspdm_test_responder_version_case6(void **state) assert_int_equal(status, LIBSPDM_STATUS_SUCCESS); assert_int_equal(response_size, sizeof(spdm_error_response_t)); spdm_response = (void *)response; - assert_int_equal(spdm_response->header.request_response_code, - SPDM_ERROR); - assert_int_equal(spdm_response->header.param1, - SPDM_ERROR_CODE_VERSION_MISMATCH); + assert_int_equal(spdm_response->header.spdm_version, SPDM_MESSAGE_VERSION_10); + assert_int_equal(spdm_response->header.request_response_code, SPDM_ERROR); + assert_int_equal(spdm_response->header.param1, SPDM_ERROR_CODE_VERSION_MISMATCH); assert_int_equal(spdm_response->header.param2, 0); assert_int_equal(spdm_context->connection_info.connection_state, LIBSPDM_CONNECTION_STATE_AUTHENTICATED);