Skip to content

Commit 707af3b

Browse files
steven-bellockjyao1
authored andcommitted
Return correct VDM error
Fix #3038. Signed-off-by: Steven Bellock <[email protected]>
1 parent cafb330 commit 707af3b

File tree

2 files changed

+71
-24
lines changed

2 files changed

+71
-24
lines changed

library/spdm_responder_lib/libspdm_rsp_vendor_response.c

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/**
22
* Copyright Notice:
3-
* Copyright 2023-2024 DMTF. All rights reserved.
3+
* Copyright 2023-2025 DMTF. All rights reserved.
44
* License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
55
**/
66

@@ -78,23 +78,23 @@ libspdm_return_t libspdm_get_vendor_defined_response(libspdm_context_t *spdm_con
7878
session_id = &session_info->session_id;
7979
}
8080

81-
/* Check if caller is using the old Vendor Defined API */
81+
/* Check if caller is using the old Vendor Defined API. */
8282
if ((spdm_context->vendor_response_callback == NULL ||
8383
spdm_context->vendor_response_get_id == NULL)) {
84-
8584
if (spdm_context->get_response_func != NULL) {
86-
8785
return ((libspdm_get_response_func)spdm_context->get_response_func)(
8886
spdm_context,
8987
session_id,
9088
false,
9189
request_size,
9290
request,
9391
response_size,
94-
response
95-
);
92+
response);
9693
} else
97-
return LIBSPDM_STATUS_UNSUPPORTED_CAP;
94+
return libspdm_generate_error_response(spdm_context,
95+
SPDM_ERROR_CODE_UNSUPPORTED_REQUEST,
96+
SPDM_VENDOR_DEFINED_REQUEST,
97+
response_size, response);
9898
}
9999

100100
spdm_request = request;
@@ -127,28 +127,17 @@ libspdm_return_t libspdm_get_vendor_defined_response(libspdm_context_t *spdm_con
127127
SPDM_ERROR_CODE_INVALID_REQUEST, 0,
128128
response_size, response);
129129
}
130-
req_vendor_id = ((const uint8_t *)request) +
131-
sizeof(spdm_vendor_defined_request_msg_t);
130+
131+
req_vendor_id = ((const uint8_t *)request) + sizeof(spdm_vendor_defined_request_msg_t);
132132
req_size = *(const uint16_t *)(req_vendor_id + spdm_request->len);
133+
133134
if (request_size < sizeof(spdm_vendor_defined_request_msg_t) +
134135
spdm_request->len + sizeof(uint16_t) + req_size) {
135136
return libspdm_generate_error_response(spdm_context,
136137
SPDM_ERROR_CODE_INVALID_REQUEST, 0,
137138
response_size, response);
138139
}
139140

140-
if (spdm_context->vendor_response_get_id == NULL) {
141-
return libspdm_generate_error_response(spdm_context,
142-
SPDM_ERROR_CODE_INVALID_REQUEST, 0,
143-
response_size, response);
144-
}
145-
146-
if (spdm_context->vendor_response_callback == NULL) {
147-
return libspdm_generate_error_response(spdm_context,
148-
SPDM_ERROR_CODE_INVALID_REQUEST, 0,
149-
response_size, response);
150-
}
151-
152141
libspdm_reset_message_buffer_via_request_code(spdm_context, NULL,
153142
spdm_request->header.request_response_code);
154143

unit_test/test_spdm_responder/error_test/vendor_response_err.c

Lines changed: 61 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/**
22
* Copyright Notice:
3-
* Copyright 2023-2024 DMTF. All rights reserved.
3+
* Copyright 2023-2025 DMTF. All rights reserved.
44
* License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
55
**/
66

@@ -31,7 +31,15 @@ typedef struct {
3131
} libspdm_vendor_response_test;
3232
#pragma pack()
3333

34-
libspdm_return_t libspdm_vendor_response_func_err_test(
34+
static void set_standard_state(libspdm_context_t *spdm_context)
35+
{
36+
spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
37+
SPDM_VERSION_NUMBER_SHIFT_BIT;
38+
spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_NEGOTIATED;
39+
spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
40+
}
41+
42+
static libspdm_return_t libspdm_vendor_response_func_err_test(
3543
void *spdm_context,
3644
uint16_t req_standard_id,
3745
uint8_t req_vendor_id_len,
@@ -119,10 +127,61 @@ static void libspdm_test_responder_vendor_cmds_err_case1(void **state)
119127
response.data_len = (uint16_t)response_len;
120128
}
121129

130+
/**
131+
* Test 2: Responder does not support VDMs.
132+
* Expected behavior: Responder replies with UnsupportedRequest.
133+
**/
134+
static void libspdm_test_responder_vendor_cmds_err_case2(void **state)
135+
{
136+
libspdm_return_t status;
137+
libspdm_test_context_t *spdm_test_context;
138+
libspdm_context_t *spdm_context;
139+
libspdm_vendor_request_test request;
140+
uint8_t response_buffer[LIBSPDM_MAX_SPDM_MSG_SIZE] = {0};
141+
size_t response_size;
142+
spdm_error_response_t *response;
143+
144+
spdm_test_context = *state;
145+
spdm_context = spdm_test_context->spdm_context;
146+
spdm_test_context->case_id = 0x2;
147+
148+
set_standard_state(spdm_context);
149+
150+
status = libspdm_register_vendor_callback_func(spdm_context, NULL);
151+
status = libspdm_register_vendor_get_id_callback_func(spdm_context, NULL);
152+
153+
request.header.spdm_version = SPDM_MESSAGE_VERSION_10;
154+
request.header.request_response_code = SPDM_VENDOR_DEFINED_REQUEST;
155+
request.header.param1 = 0;
156+
request.header.param2 = 0;
157+
request.standard_id = SPDM_REGISTRY_ID_IANA;
158+
request.vendor_id_len = 4;
159+
request.vendor_id[0] = 33;
160+
request.data_len = 2;
161+
request.data[0] = 0;
162+
request.data[1] = 1;
163+
164+
response_size = sizeof(response_buffer);
165+
166+
status = libspdm_get_vendor_defined_response(spdm_context, sizeof(request),
167+
&request, &response_size, &response_buffer);
168+
169+
assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
170+
assert_int_equal(response_size, sizeof(spdm_error_response_t));
171+
172+
response = (spdm_error_response_t *)response_buffer;
173+
174+
assert_int_equal(response->header.spdm_version, SPDM_MESSAGE_VERSION_10);
175+
assert_int_equal(response->header.request_response_code, SPDM_ERROR);
176+
assert_int_equal(response->header.param1, SPDM_ERROR_CODE_UNSUPPORTED_REQUEST);
177+
assert_int_equal(response->header.param2, SPDM_VENDOR_DEFINED_REQUEST);
178+
}
179+
122180
int libspdm_responder_vendor_cmds_error_test_main(void)
123181
{
124182
const struct CMUnitTest spdm_responder_vendor_cmds_tests[] = {
125183
cmocka_unit_test(libspdm_test_responder_vendor_cmds_err_case1),
184+
cmocka_unit_test(libspdm_test_responder_vendor_cmds_err_case2),
126185
};
127186

128187
libspdm_test_context_t test_context = {
@@ -137,5 +196,4 @@ int libspdm_responder_vendor_cmds_error_test_main(void)
137196
libspdm_unit_test_group_teardown);
138197
}
139198

140-
141199
#endif /* LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES */

0 commit comments

Comments
 (0)