Line data Source code
1 : /**
2 : * Copyright Notice:
3 : * Copyright 2021-2022 DMTF. All rights reserved.
4 : * License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
5 : **/
6 :
7 : #include "internal/libspdm_responder_lib.h"
8 :
9 364 : libspdm_return_t libspdm_generate_error_response(const void *spdm_context,
10 : uint8_t error_code,
11 : uint8_t error_data,
12 : size_t *response_size,
13 : void *response)
14 : {
15 : spdm_error_response_t *spdm_response;
16 :
17 364 : LIBSPDM_ASSERT(*response_size >= sizeof(spdm_error_response_t));
18 364 : *response_size = sizeof(spdm_error_response_t);
19 364 : spdm_response = response;
20 :
21 364 : spdm_response->header.spdm_version = libspdm_get_connection_version (spdm_context);
22 364 : if (spdm_response->header.spdm_version == 0) {
23 : /* if version is not negotiated, then use default version 1.0 */
24 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_10;
25 : }
26 364 : spdm_response->header.request_response_code = SPDM_ERROR;
27 364 : spdm_response->header.param1 = error_code;
28 364 : spdm_response->header.param2 = error_data;
29 :
30 364 : if (spdm_response->header.spdm_version <= SPDM_MESSAGE_VERSION_11) {
31 258 : LIBSPDM_ASSERT ((error_code != SPDM_ERROR_CODE_RESPONSE_TOO_LARGE) &&
32 : (error_code != SPDM_ERROR_CODE_LARGE_RESPONSE));
33 : }
34 :
35 364 : return LIBSPDM_STATUS_SUCCESS;
36 : }
37 :
38 17 : libspdm_return_t libspdm_generate_extended_error_response(
39 : const void *spdm_context, uint8_t error_code, uint8_t error_data,
40 : size_t extended_error_data_size, const uint8_t *extended_error_data,
41 : size_t *response_size, void *response)
42 : {
43 : spdm_error_response_t *spdm_response;
44 : size_t response_capacity;
45 :
46 17 : LIBSPDM_ASSERT(*response_size >=
47 : sizeof(spdm_error_response_t) + extended_error_data_size);
48 17 : response_capacity = *response_size;
49 17 : *response_size = sizeof(spdm_error_response_t) + extended_error_data_size;
50 17 : spdm_response = response;
51 :
52 17 : spdm_response->header.spdm_version = libspdm_get_connection_version (spdm_context);
53 17 : spdm_response->header.request_response_code = SPDM_ERROR;
54 17 : spdm_response->header.param1 = error_code;
55 17 : spdm_response->header.param2 = error_data;
56 17 : libspdm_copy_mem(spdm_response + 1, response_capacity - sizeof(spdm_error_response_t),
57 : extended_error_data, extended_error_data_size);
58 :
59 17 : return LIBSPDM_STATUS_SUCCESS;
60 : }
|