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 400 : 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 400 : LIBSPDM_ASSERT(*response_size >= sizeof(spdm_error_response_t));
18 400 : *response_size = sizeof(spdm_error_response_t);
19 400 : spdm_response = response;
20 :
21 400 : spdm_response->header.spdm_version = libspdm_get_connection_version (spdm_context);
22 400 : 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 400 : spdm_response->header.request_response_code = SPDM_ERROR;
27 400 : spdm_response->header.param1 = error_code;
28 400 : spdm_response->header.param2 = error_data;
29 :
30 400 : if (spdm_response->header.spdm_version <= SPDM_MESSAGE_VERSION_11) {
31 260 : LIBSPDM_ASSERT ((error_code != SPDM_ERROR_CODE_RESPONSE_TOO_LARGE) &&
32 : (error_code != SPDM_ERROR_CODE_LARGE_RESPONSE));
33 : }
34 :
35 400 : return LIBSPDM_STATUS_SUCCESS;
36 : }
37 :
38 18 : 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 18 : LIBSPDM_ASSERT(*response_size >=
47 : sizeof(spdm_error_response_t) + extended_error_data_size);
48 18 : response_capacity = *response_size;
49 18 : *response_size = sizeof(spdm_error_response_t) + extended_error_data_size;
50 18 : spdm_response = response;
51 :
52 18 : spdm_response->header.spdm_version = libspdm_get_connection_version (spdm_context);
53 18 : spdm_response->header.request_response_code = SPDM_ERROR;
54 18 : spdm_response->header.param1 = error_code;
55 18 : spdm_response->header.param2 = error_data;
56 18 : libspdm_copy_mem(spdm_response + 1, response_capacity - sizeof(spdm_error_response_t),
57 : extended_error_data, extended_error_data_size);
58 :
59 18 : return LIBSPDM_STATUS_SUCCESS;
60 : }
|