Line data Source code
1 : /**
2 : * Copyright Notice:
3 : * Copyright 2023-2025 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 "spdm_unit_test.h"
8 : #include "internal/libspdm_requester_lib.h"
9 : #include "internal/libspdm_responder_lib.h"
10 :
11 : #if LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES
12 :
13 : #pragma pack(1)
14 : typedef struct {
15 : spdm_message_header_t header;
16 : uint16_t standard_id;
17 : uint8_t vendor_id_len;
18 : uint8_t vendor_id[SPDM_MAX_VENDOR_ID_LENGTH];
19 : uint16_t data_len;
20 : uint8_t data[16];
21 : } libspdm_vendor_request_test;
22 :
23 : typedef struct {
24 : spdm_message_header_t header;
25 : uint16_t standard_id;
26 : uint8_t vendor_id_len;
27 : uint8_t vendor_id[SPDM_MAX_VENDOR_ID_LENGTH];
28 : uint16_t data_len;
29 : uint8_t data[64];
30 : } libspdm_vendor_response_test;
31 : #pragma pack()
32 :
33 : static size_t m_libspdm_local_buffer_size;
34 : static uint8_t m_libspdm_local_buffer[LIBSPDM_MAX_MESSAGE_VCA_BUFFER_SIZE];
35 :
36 1 : static libspdm_return_t libspdm_requester_vendor_cmds_test_send_message(
37 : void *spdm_context, size_t request_size, const void *request,
38 : uint64_t timeout)
39 : {
40 : libspdm_test_context_t *spdm_test_context;
41 :
42 1 : spdm_test_context = libspdm_get_test_context();
43 1 : switch (spdm_test_context->case_id) {
44 1 : case 0x1: {
45 1 : const uint8_t *ptr = (const uint8_t *)request;
46 :
47 1 : m_libspdm_local_buffer_size = 0;
48 1 : libspdm_copy_mem(m_libspdm_local_buffer, sizeof(m_libspdm_local_buffer),
49 : ptr, request_size);
50 1 : m_libspdm_local_buffer_size += request_size;
51 : }
52 1 : return LIBSPDM_STATUS_SUCCESS;
53 0 : default:
54 0 : return LIBSPDM_STATUS_SEND_FAIL;
55 : }
56 : }
57 :
58 : /* Acts as the Responder Integration */
59 1 : static libspdm_return_t libspdm_requester_vendor_cmds_test_receive_message(
60 : void *spdm_context, size_t *response_size,
61 : void **response, uint64_t timeout)
62 : {
63 : libspdm_test_context_t *spdm_test_context;
64 1 : libspdm_return_t status = LIBSPDM_STATUS_SUCCESS;
65 :
66 1 : uint32_t* session_id = NULL;
67 1 : bool is_app_message = false;
68 1 : size_t transport_message_size = sizeof(libspdm_vendor_request_test);
69 :
70 1 : spdm_test_context = libspdm_get_test_context();
71 1 : switch (spdm_test_context->case_id) {
72 1 : case 0x1: {
73 : libspdm_vendor_response_test *spdm_response;
74 1 : libspdm_vendor_request_test* spdm_request = NULL;
75 : size_t spdm_response_size;
76 : size_t transport_header_size;
77 1 : status = libspdm_transport_test_decode_message(
78 : spdm_context, &session_id, &is_app_message, true,
79 : m_libspdm_local_buffer_size, m_libspdm_local_buffer,
80 : &transport_message_size, (void **)(&spdm_request));
81 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
82 :
83 1 : spdm_response_size = sizeof(libspdm_vendor_response_test);
84 1 : transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
85 1 : spdm_response = (void *)((uint8_t *)*response + transport_header_size);
86 :
87 1 : libspdm_zero_mem(spdm_response, spdm_response_size);
88 1 : spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_10;
89 1 : spdm_response->header.request_response_code = SPDM_VENDOR_DEFINED_RESPONSE;
90 1 : spdm_response->header.param1 = 0;
91 1 : spdm_response->header.param2 = 0;
92 :
93 1 : spdm_response->standard_id = spdm_request->standard_id;
94 1 : spdm_response->vendor_id_len = spdm_request->vendor_id_len;
95 : /* usually 2 bytes for vendor id */
96 1 : assert_int_equal(spdm_response->vendor_id_len, sizeof(uint16_t));
97 1 : libspdm_copy_mem(spdm_response->vendor_id, spdm_request->vendor_id_len,
98 1 : spdm_request->vendor_id, spdm_request->vendor_id_len);
99 1 : spdm_response->data_len = sizeof(spdm_response->data);
100 1 : libspdm_set_mem(spdm_response->data, sizeof(spdm_response->data), 0xff);
101 :
102 1 : status = libspdm_transport_test_encode_message(spdm_context, NULL, false,
103 : false, spdm_response_size,
104 : spdm_response,
105 : response_size, response);
106 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
107 : }
108 1 : return LIBSPDM_STATUS_SUCCESS;
109 :
110 0 : default:
111 0 : return LIBSPDM_STATUS_RECEIVE_FAIL;
112 : }
113 : }
114 :
115 : /**
116 : * Test 1: Sending a vendor defined request
117 : * Expected behavior: client returns a status of LIBSPDM_STATUS_SUCCESS and expected response
118 : **/
119 1 : static void libspdm_test_requester_vendor_cmds_case1(void **state)
120 : {
121 : libspdm_return_t status;
122 : libspdm_test_context_t *spdm_test_context;
123 : libspdm_context_t *spdm_context;
124 : libspdm_vendor_request_test request;
125 1 : libspdm_vendor_response_test response = {0};
126 1 : response.vendor_id_len = sizeof(response.vendor_id);
127 1 : response.data_len = sizeof(response.data);
128 :
129 1 : spdm_test_context = *state;
130 1 : spdm_context = spdm_test_context->spdm_context;
131 1 : spdm_test_context->case_id = 0x1;
132 1 : spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_10 <<
133 : SPDM_VERSION_NUMBER_SHIFT_BIT;
134 1 : spdm_context->connection_info.connection_state =
135 : LIBSPDM_CONNECTION_STATE_NEGOTIATED;
136 1 : spdm_context->local_context.is_requester = true;
137 :
138 1 : request.standard_id = 6;
139 1 : request.vendor_id_len = 2;
140 1 : request.vendor_id[0] = 0xAA;
141 1 : request.vendor_id[1] = 0xAA;
142 1 : request.data_len = sizeof(request.data);
143 1 : libspdm_set_mem(request.data, sizeof(request.data), 0xAA);
144 :
145 1 : status = libspdm_vendor_send_request_receive_response(spdm_context, NULL,
146 1 : request.standard_id,
147 1 : request.vendor_id_len,
148 1 : request.vendor_id, request.data_len,
149 : request.data,
150 : &response.standard_id,
151 : &response.vendor_id_len,
152 : response.vendor_id, &response.data_len,
153 : response.data);
154 1 : assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
155 1 : assert_int_equal(
156 : spdm_context->connection_info.version >> SPDM_VERSION_NUMBER_SHIFT_BIT,
157 : SPDM_MESSAGE_VERSION_10);
158 :
159 1 : printf("case 1 %d\n", response.data[0]);
160 1 : }
161 :
162 1 : int libspdm_requester_vendor_cmds_test_main(void)
163 : {
164 1 : const struct CMUnitTest spdm_requester_vendor_cmds_tests[] = {
165 : cmocka_unit_test(libspdm_test_requester_vendor_cmds_case1),
166 : };
167 :
168 1 : libspdm_test_context_t test_context = {
169 : LIBSPDM_TEST_CONTEXT_VERSION,
170 : true,
171 : libspdm_requester_vendor_cmds_test_send_message,
172 : libspdm_requester_vendor_cmds_test_receive_message,
173 : };
174 :
175 1 : libspdm_setup_test_context(&test_context);
176 :
177 1 : return cmocka_run_group_tests(spdm_requester_vendor_cmds_tests,
178 : libspdm_unit_test_group_setup,
179 : libspdm_unit_test_group_teardown);
180 : }
181 :
182 : #endif /* LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES */
|