@@ -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