Skip to content

Commit 5094636

Browse files
Li-Aaronjyao1
authored andcommitted
use libspdm_vendor_send_request_receive_response in pci_doe_spdm_vendor_send_receive_data_ex.
fix #439 Signed-off-by: Aaron Li <[email protected]>
1 parent 775ebc5 commit 5094636

File tree

1 file changed

+30
-113
lines changed

1 file changed

+30
-113
lines changed

library/pci_doe_requester_lib/pci_doe_spdm_vendor_send_receive.c

Lines changed: 30 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -33,132 +33,52 @@ libspdm_return_t pci_doe_spdm_vendor_send_receive_data_ex (
3333
const void *request, size_t request_size,
3434
void *response, size_t *response_size)
3535
{
36-
libspdm_data_parameter_t parameter;
37-
spdm_version_number_t spdm_version;
38-
uint32_t req_cap;
39-
uint32_t rsp_cap;
40-
size_t data_size;
4136
libspdm_return_t status;
42-
uint8_t request_buffer[sizeof(pci_doe_spdm_vendor_defined_request_large_t) +
37+
uint8_t request_buffer[sizeof(pci_protocol_header_t) +
4338
LIBPCIDOE_SPDM_VENDOR_MAX_MESSAGE_SIZE];
44-
pci_doe_spdm_vendor_defined_request_t *spdm_request;
45-
pci_doe_spdm_vendor_defined_request_large_t *spdm_request_large;
46-
size_t spdm_request_size;
47-
uint8_t response_buffer[sizeof(pci_doe_spdm_vendor_defined_response_large_t) +
39+
uint8_t response_buffer[sizeof(pci_protocol_header_t) +
4840
LIBPCIDOE_SPDM_VENDOR_MAX_MESSAGE_SIZE];
49-
pci_doe_spdm_vendor_defined_response_t *spdm_response;
50-
pci_doe_spdm_vendor_defined_response_large_t *spdm_response_large;
51-
size_t spdm_response_size;
52-
bool use_large_payload;
53-
size_t req_header_size;
54-
size_t req_payload_length;
55-
size_t rsp_header_size;
56-
size_t rsp_payload_length;
41+
uint32_t req_payload_length;
42+
uint8_t *req_payload;
43+
uint32_t rsp_payload_length;
44+
uint16_t rsp_standard_id;
45+
uint16_t rsp_vendor_id;
46+
uint8_t rsp_vendor_id_len;
5747
pci_protocol_header_t *rsp_pci_protocol;
5848

59-
spdm_request = (void *)request_buffer;
60-
spdm_response = (void *)response_buffer;
61-
spdm_request_large = (void *)request_buffer;
62-
spdm_response_large = (void *)response_buffer;
63-
LIBSPDM_ASSERT (request_size <= LIBPCIDOE_SPDM_VENDOR_MAX_MESSAGE_SIZE);
64-
LIBSPDM_ASSERT (*response_size < LIBPCIDOE_SPDM_VENDOR_MAX_MESSAGE_SIZE);
49+
req_payload_length = (uint32_t)(sizeof(pci_protocol_header_t) + request_size);
50+
req_payload = (void *)request_buffer;
51+
libspdm_copy_mem(req_payload, sizeof(pci_protocol_header_t), &pci_protocol, sizeof(pci_protocol_header_t));
52+
req_payload += sizeof(pci_protocol_header_t);
53+
libspdm_copy_mem(req_payload, request_size, request, request_size);
6554

66-
libspdm_zero_mem(&parameter, sizeof(parameter));
67-
parameter.location = LIBSPDM_DATA_LOCATION_CONNECTION;
68-
data_size = sizeof(spdm_version);
69-
libspdm_zero_mem(&spdm_version, sizeof(spdm_version));
70-
libspdm_get_data(spdm_context, LIBSPDM_DATA_SPDM_VERSION, &parameter,
71-
&spdm_version, &data_size);
72-
parameter.location = LIBSPDM_DATA_LOCATION_LOCAL;
73-
data_size = sizeof(req_cap);
74-
libspdm_get_data(spdm_context, LIBSPDM_DATA_CAPABILITY_FLAGS, &parameter,
75-
&req_cap, &data_size);
76-
parameter.location = LIBSPDM_DATA_LOCATION_CONNECTION;
77-
data_size = sizeof(rsp_cap);
78-
libspdm_get_data(spdm_context, LIBSPDM_DATA_CAPABILITY_FLAGS, &parameter,
79-
&rsp_cap, &data_size);
80-
if ((spdm_version >= SPDM_MESSAGE_VERSION_14) &&
81-
((req_cap & SPDM_GET_CAPABILITIES_REQUEST_FLAGS_LARGE_RESP_CAP) != 0) &&
82-
((rsp_cap & SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_LARGE_RESP_CAP) != 0)) {
83-
use_large_payload = true;
84-
req_header_size = sizeof(pci_doe_spdm_vendor_defined_request_large_t);
85-
rsp_header_size = sizeof(pci_doe_spdm_vendor_defined_response_large_t);
86-
} else {
87-
use_large_payload = false;
88-
req_header_size = sizeof(pci_doe_spdm_vendor_defined_request_t);
89-
rsp_header_size = sizeof(pci_doe_spdm_vendor_defined_response_t);
90-
}
55+
rsp_vendor_id_len = sizeof(uint16_t);
56+
rsp_payload_length = sizeof(response_buffer);
9157

92-
libspdm_zero_mem(spdm_request, req_header_size);
93-
spdm_request->spdm_header.spdm_version =
94-
(uint8_t)(spdm_version >> SPDM_VERSION_NUMBER_SHIFT_BIT);
95-
spdm_request->spdm_header.param1 = use_large_payload ?
96-
SPDM_VENDOR_DEFINED_REQUEST_LARGE_REQ : 0;
97-
spdm_request->spdm_header.request_response_code = SPDM_VENDOR_DEFINED_REQUEST;
98-
spdm_request->pci_doe_vendor_header.standard_id = SPDM_STANDARD_ID_PCISIG;
99-
spdm_request->pci_doe_vendor_header.len = sizeof(spdm_request->pci_doe_vendor_header.vendor_id);
100-
spdm_request->pci_doe_vendor_header.vendor_id = vendor_id;
101-
req_payload_length = sizeof(pci_protocol_header_t) + request_size;
102-
if (use_large_payload) {
103-
spdm_request_large->pci_doe_vendor_header.payload_length =
104-
(uint16_t)req_payload_length;
105-
spdm_request_large->pci_doe_vendor_header.pci_protocol = pci_protocol;
106-
} else {
107-
spdm_request->pci_doe_vendor_header.payload_length =
108-
(uint16_t)req_payload_length;
109-
spdm_request->pci_doe_vendor_header.pci_protocol = pci_protocol;
110-
}
111-
libspdm_copy_mem((uint8_t *)spdm_request + req_header_size, request_size, request, request_size);
58+
status = libspdm_vendor_send_request_receive_response (
59+
spdm_context, session_id,
60+
SPDM_STANDARD_ID_PCISIG, sizeof(vendor_id), &vendor_id,
61+
req_payload_length, (void *)request_buffer,
62+
&rsp_standard_id, &rsp_vendor_id_len, &rsp_vendor_id,
63+
&rsp_payload_length, (void *)response_buffer
64+
);
11265

113-
spdm_request_size = req_header_size + request_size;
114-
spdm_response_size = rsp_header_size + (*response_size);
115-
status = libspdm_send_receive_data(spdm_context, session_id,
116-
false, spdm_request, spdm_request_size,
117-
spdm_response, &spdm_response_size);
11866
/* clear the copied memory, because it may include secret */
119-
libspdm_zero_mem ((uint8_t *)spdm_request + req_header_size, request_size);
67+
libspdm_zero_mem ((uint8_t *)request_buffer, sizeof(request_buffer));
12068
if (LIBSPDM_STATUS_IS_ERROR(status)) {
12169
return status;
12270
}
12371

124-
if (spdm_response_size < sizeof(spdm_message_header_t)) {
125-
return LIBSPDM_STATUS_INVALID_MSG_SIZE;
126-
}
127-
if (spdm_response->spdm_header.spdm_version != spdm_request->spdm_header.spdm_version) {
128-
return LIBSPDM_STATUS_INVALID_MSG_FIELD;
129-
}
130-
if ((spdm_response->spdm_header.spdm_version >= SPDM_MESSAGE_VERSION_14) &&
131-
((spdm_response->spdm_header.param1 & SPDM_VENDOR_DEFINED_RESPONSE_LARGE_RESP) != 0)) {
132-
use_large_payload = true;
133-
rsp_header_size = sizeof(pci_doe_spdm_vendor_defined_response_large_t);
134-
} else {
135-
use_large_payload = false;
136-
rsp_header_size = sizeof(pci_doe_spdm_vendor_defined_response_t);
137-
}
138-
if (spdm_response_size < rsp_header_size) {
139-
return LIBSPDM_STATUS_INVALID_MSG_SIZE;
140-
}
141-
if (spdm_response->spdm_header.request_response_code != SPDM_VENDOR_DEFINED_RESPONSE) {
72+
if (rsp_standard_id != SPDM_STANDARD_ID_PCISIG) {
14273
return LIBSPDM_STATUS_INVALID_MSG_FIELD;
14374
}
144-
if (spdm_response->pci_doe_vendor_header.standard_id != SPDM_STANDARD_ID_PCISIG) {
75+
if (rsp_vendor_id_len != sizeof(uint16_t)) {
14576
return LIBSPDM_STATUS_INVALID_MSG_FIELD;
14677
}
147-
if (spdm_response->pci_doe_vendor_header.len !=
148-
sizeof(spdm_response->pci_doe_vendor_header.vendor_id)) {
78+
if (rsp_vendor_id != vendor_id) {
14979
return LIBSPDM_STATUS_INVALID_MSG_FIELD;
15080
}
151-
if (spdm_response->pci_doe_vendor_header.vendor_id != vendor_id) {
152-
return LIBSPDM_STATUS_INVALID_MSG_FIELD;
153-
}
154-
155-
if (use_large_payload) {
156-
rsp_payload_length = spdm_response_large->pci_doe_vendor_header.payload_length;
157-
rsp_pci_protocol = &spdm_response_large->pci_doe_vendor_header.pci_protocol;
158-
} else {
159-
rsp_payload_length = spdm_response->pci_doe_vendor_header.payload_length;
160-
rsp_pci_protocol = &spdm_response->pci_doe_vendor_header.pci_protocol;
161-
}
81+
rsp_pci_protocol = (void *)response_buffer;
16282

16383
if (rsp_pci_protocol->protocol_id !=
16484
pci_protocol.protocol_id) {
@@ -167,15 +87,11 @@ libspdm_return_t pci_doe_spdm_vendor_send_receive_data_ex (
16787
if (rsp_payload_length < sizeof(pci_protocol_header_t)) {
16888
return LIBSPDM_STATUS_INVALID_MSG_FIELD;
16989
}
170-
if (rsp_payload_length - sizeof(pci_protocol_header_t) >
171-
spdm_response_size - rsp_header_size) {
172-
return LIBSPDM_STATUS_INVALID_MSG_FIELD;
173-
}
17490

17591
*response_size = rsp_payload_length - sizeof(pci_protocol_header_t);
176-
libspdm_copy_mem (response, *response_size, (uint8_t *)spdm_response + rsp_header_size, *response_size);
92+
libspdm_copy_mem (response, *response_size, (uint8_t *)response_buffer + sizeof(pci_protocol_header_t), *response_size);
17793
/* clear the copied memory, because it may include secret */
178-
libspdm_zero_mem ((uint8_t *)spdm_response + rsp_header_size, *response_size);
94+
libspdm_zero_mem ((uint8_t *)response_buffer, rsp_payload_length);
17995

18096
return LIBSPDM_STATUS_SUCCESS;
18197
}
@@ -193,3 +109,4 @@ libspdm_return_t pci_doe_spdm_vendor_send_receive_data (
193109
response, response_size
194110
);
195111
}
112+

0 commit comments

Comments
 (0)