1 /* SPDX-License-Identifier: BSD-2-Clause */
2 /***********************************************************************
3 * Copyright (c) 2017-2018, Intel Corporation
4 *
5 * All rights reserved.
6 ***********************************************************************/
7 #ifdef HAVE_CONFIG_H
8 #include <config.h>
9 #endif
10
11 #include <stdio.h>
12 #include <stdlib.h>
13
14 #include "tss2_sys.h"
15
16 #define LOGMODULE test
17 #include "util/log.h"
18 #include "test.h"
19 #include "sys-util.h"
20
21 /*
22 * System API tests including invalid cases
23 */
24 int
test_invoke(TSS2_SYS_CONTEXT * sys_context)25 test_invoke (TSS2_SYS_CONTEXT *sys_context)
26 {
27 TPM2B_MAX_BUFFER outData = TPM2B_NAMED_INIT(TPM2B_MAX_BUFFER, buffer);
28 TPM2B_PUBLIC outPublic;
29 TPM2B_NAME name = TPM2B_NAME_INIT;
30 TPM2B_NAME qualifiedName;
31 TPM2_HANDLE handle = 0;
32 TPM2_CC commandCode;
33 size_t rpBufferUsedSize;
34 const uint8_t *rpBuffer;
35 TSS2_RC rc;
36
37 LOG_INFO("System API test");
38 /* Test for bad reference. */
39 rc = Tss2_Sys_GetTestResult_Prepare(0);
40 if (rc != TSS2_SYS_RC_BAD_REFERENCE) {
41 LOG_ERROR("Invalid prepare test FAILED! Response Code : 0x%x", rc);
42 exit(1);
43 }
44
45 /* Test for bad sequence: after ExecuteAsync */
46 rc = Tss2_Sys_GetTestResult_Prepare(sys_context);
47 if (rc != TSS2_RC_SUCCESS) {
48 LOG_ERROR("Prepare test FAILED! Response Code : 0x%x", rc);
49 exit(1);
50 }
51
52 rc = Tss2_Sys_ExecuteAsync(sys_context);
53 if (rc != TSS2_RC_SUCCESS) {
54 LOG_ERROR("Prepare test FAILED! Response Code : 0x%x", rc);
55 exit(1);
56 }
57
58 rc = Tss2_Sys_GetTestResult_Prepare(sys_context);
59 if (rc != TSS2_SYS_RC_BAD_SEQUENCE) {
60 LOG_ERROR("Invalid prepare test FAILED! Response Code : 0x%x", rc);
61 exit(1);
62 }
63
64 rc = Tss2_Sys_ExecuteFinish(sys_context, -1);
65 if (rc != TSS2_RC_SUCCESS) {
66 LOG_ERROR("Prepare test FAILED! Response Code : 0x%x", rc);
67 exit(1);
68 }
69
70 /* Test for bad sequence: after Execute */
71 rc = Tss2_Sys_GetTestResult_Prepare(sys_context);
72 if (rc != TSS2_RC_SUCCESS) {
73 LOG_ERROR("Prepare test FAILED! Response Code : 0x%x", rc);
74 exit(1);
75 }
76
77 rc = Tss2_Sys_Execute(sys_context);
78 if (rc != TSS2_RC_SUCCESS) {
79 LOG_ERROR("Prepare test FAILED! Response Code : 0x%x", rc);
80 exit(1);
81 }
82
83 rc = Tss2_Sys_GetTestResult_Prepare(sys_context);
84 if (rc != TSS2_RC_SUCCESS) {
85 LOG_ERROR("Prepare test FAILED! Response Code : 0x%x", rc);
86 exit(1);
87 }
88
89 rc = Tss2_Sys_GetTestResult_Prepare(sys_context);
90 if (rc != TSS2_RC_SUCCESS) {
91 LOG_ERROR("Prepare test FAILED! Response Code : 0x%x", rc);
92 exit(1);
93 }
94
95 /* Test for other NULL params */
96 rc = Tss2_Sys_Create_Prepare(sys_context, 0xffffffff, 0, 0, 0, 0);
97 if (rc != TSS2_SYS_RC_BAD_REFERENCE) {
98 LOG_ERROR("Invalid prepare test FAILED! Response Code : 0x%x", rc);
99 exit(1);
100 }
101
102 rc = Tss2_Sys_GetTestResult(sys_context, 0, &outData, &rc, 0);
103 if (rc != TSS2_RC_SUCCESS) {
104 LOG_ERROR("GetTestResult test FAILED! Response Code : 0x%x", rc);
105 exit(1);
106 }
107
108 /* Check for BAD_SEQUENCE error. */
109 rc = Tss2_Sys_ExecuteAsync(sys_context);
110 if (rc != TSS2_SYS_RC_BAD_SEQUENCE) {
111 LOG_ERROR("SYS invalid test FAILED! Response Code : 0x%x", rc);
112 exit(1);
113 }
114
115 /* Check for BAD_SEQUENCE error. */
116 rc = Tss2_Sys_Execute(sys_context);
117 if (rc != TSS2_SYS_RC_BAD_SEQUENCE) {
118 LOG_ERROR("SYS invalid test FAILED! Response Code : 0x%x", rc);
119 exit(1);
120 }
121
122 /* Test the synchronous, non-one-call interface. */
123 rc = Tss2_Sys_GetTestResult_Prepare(sys_context);
124 if (rc != TSS2_RC_SUCCESS) {
125 LOG_ERROR("SYS test FAILED! Response Code : 0x%x", rc);
126 exit(1);
127 }
128
129 /* Check for BAD_REFERENCE error. */
130 rc = Tss2_Sys_Execute(0);
131 if (rc != TSS2_SYS_RC_BAD_REFERENCE) {
132 LOG_ERROR("SYS invalid test FAILED! Response Code : 0x%x", rc);
133 exit(1);
134 }
135
136 /* Execute the command synchronously. */
137 rc = Tss2_Sys_Execute(sys_context);
138 if (rc != TSS2_RC_SUCCESS) {
139 LOG_ERROR("SYS test FAILED! Response Code : 0x%x", rc);
140 exit(1);
141 }
142
143 /* Check for BAD_SEQUENCE error. */
144 rc = Tss2_Sys_Execute(sys_context);
145 if (rc != TSS2_SYS_RC_BAD_SEQUENCE) {
146 LOG_ERROR("SYS invalid test FAILED! Response Code : 0x%x", rc);
147 exit(1);
148 }
149
150 /* Check for BAD_SEQUENCE error. */
151 rc = Tss2_Sys_ExecuteAsync(sys_context);
152 if (rc != TSS2_SYS_RC_BAD_SEQUENCE) {
153 LOG_ERROR("SYS invalid test FAILED! Response Code : 0x%x", rc);
154 exit(1);
155 }
156
157 /* Now test the asynchronous, non-one-call interface. */
158 rc = Tss2_Sys_GetTestResult_Prepare(sys_context);
159 if (rc != TSS2_RC_SUCCESS) {
160 LOG_ERROR("SYS test FAILED! Response Code : 0x%x", rc);
161 exit(1);
162 }
163
164 rc = Tss2_Sys_GetTestResult_Complete(sys_context, &outData, &rc);
165 if (rc != TSS2_SYS_RC_BAD_SEQUENCE) {
166 LOG_ERROR("SYS invalid test FAILED! Response Code : 0x%x", rc);
167 exit(1);
168 }
169
170 /* Check for BAD_REFERENCE error. */
171 rc = Tss2_Sys_ExecuteAsync(0);
172 if (rc != TSS2_SYS_RC_BAD_REFERENCE) {
173 LOG_ERROR("SYS invalid test FAILED! Response Code : 0x%x", rc);
174 exit(1);
175 }
176
177 /* Test ExecuteFinish for BAD_SEQUENCE */
178 rc = Tss2_Sys_ExecuteFinish(sys_context, TSS2_TCTI_TIMEOUT_BLOCK);
179 if (rc != TSS2_SYS_RC_BAD_SEQUENCE) {
180 LOG_ERROR("SYS invalid test FAILED! Response Code : 0x%x", rc);
181 exit(1);
182 }
183
184 /* Execute the command asynchronously. */
185 rc = Tss2_Sys_ExecuteAsync(sys_context);
186 if (rc != TSS2_RC_SUCCESS) {
187 LOG_ERROR("SYS test FAILED! Response Code : 0x%x", rc);
188 exit(1);
189 }
190
191 /* Check for BAD_SEQUENCE error. */
192 rc = Tss2_Sys_ExecuteAsync(sys_context);
193 if (rc != TSS2_SYS_RC_BAD_SEQUENCE) {
194 LOG_ERROR("SYS invalid test FAILED! Response Code : 0x%x", rc);
195 exit(1);
196 }
197
198 /* Check for BAD_SEQUENCE error. */
199 rc = Tss2_Sys_Execute(sys_context);
200 if (rc != TSS2_SYS_RC_BAD_SEQUENCE) {
201 LOG_ERROR("SYS invalid test FAILED! Response Code : 0x%x", rc);
202 exit(1);
203 }
204
205 /* Test ExecuteFinish for BAD_REFERENCE */
206 rc = Tss2_Sys_ExecuteFinish(0, TSS2_TCTI_TIMEOUT_BLOCK);
207 if (rc != TSS2_SYS_RC_BAD_REFERENCE) {
208 LOG_ERROR("SYS invalid test FAILED! Response Code : 0x%x", rc);
209 exit(1);
210 }
211
212 /* Test XXXX_Complete for bad sequence: after _Prepare
213 * and before ExecuteFinish */
214 rc = Tss2_Sys_GetTestResult_Complete(sys_context, &outData, &rc);
215 if (rc != TSS2_SYS_RC_BAD_SEQUENCE) {
216 LOG_ERROR("SYS invalid test FAILED! Response Code : 0x%x", rc);
217 exit(1);
218 }
219
220 /* Get the command response. Wait a maximum of 20ms
221 * for response. */
222 rc = Tss2_Sys_ExecuteFinish(sys_context, TSS2_TCTI_TIMEOUT_BLOCK);
223 if (rc != TSS2_RC_SUCCESS) {
224 LOG_ERROR("SYS test FAILED! Response Code : 0x%x", rc);
225 exit(1);
226 }
227
228 rc = Tss2_Sys_ExecuteFinish(sys_context, TSS2_TCTI_TIMEOUT_BLOCK);
229 if (rc != TSS2_SYS_RC_BAD_SEQUENCE) {
230 LOG_ERROR("SYS invalid test FAILED! Response Code : 0x%x", rc);
231 exit(1);
232 }
233
234 /* Check for BAD_SEQUENCE error. */
235 rc = Tss2_Sys_ExecuteAsync(sys_context);
236 if (rc != TSS2_SYS_RC_BAD_SEQUENCE) {
237 LOG_ERROR("SYS invalid test FAILED! Response Code : 0x%x", rc);
238 exit(1);
239 }
240
241 /* Test _Complete for bad reference cases. */
242 rc = Tss2_Sys_GetTestResult_Complete(0, &outData, &rc);
243 if (rc != TSS2_SYS_RC_BAD_REFERENCE) {
244 LOG_ERROR("SYS invalid test FAILED! Response Code : 0x%x", rc);
245 exit(1);
246 }
247
248 rc = Tss2_Sys_ReadPublic_Prepare(sys_context, handle);
249 if (rc != TSS2_RC_SUCCESS) {
250 LOG_ERROR("SYS test FAILED! Response Code : 0x%x", rc);
251 exit(1);
252 }
253
254 /* Execute the command synchronously. */
255 rc = Tss2_Sys_ExecuteAsync(sys_context);
256 if (rc != TSS2_RC_SUCCESS) {
257 LOG_ERROR("SYS test FAILED! Response Code : 0x%x", rc);
258 exit(1);
259 }
260
261 /* Test _Complete for bad sequence case when ExecuteFinish has never
262 * been done on a context. */
263 rc = Tss2_Sys_ReadPublic_Complete(sys_context, &outPublic, &name, &qualifiedName);
264 if (rc != TSS2_SYS_RC_BAD_SEQUENCE) {
265 LOG_ERROR("SYS invalid test FAILED! Response Code : 0x%x", rc);
266 exit(1);
267 }
268
269 rc = Tss2_Sys_GetRpBuffer(sys_context, &rpBufferUsedSize, &rpBuffer);
270 if (rc != TSS2_SYS_RC_BAD_SEQUENCE) {
271 LOG_ERROR("SYS invalid test FAILED! Response Code : 0x%x", rc);
272 exit(1);
273 }
274 /* CheckFailed(rc, TSS2_SYS_RC_BAD_SEQUENCE); */
275
276 /* Execute the command synchronously. */
277 rc = Tss2_Sys_ExecuteFinish(sys_context, TSS2_TCTI_TIMEOUT_BLOCK);
278 if (rc != TPM2_RC_VALUE + TPM2_RC_1) {
279 LOG_ERROR("SYS test FAILED! Response Code : 0x%x", rc);
280 exit(1);
281 }
282
283 /* Test one-call for null sys_context pointer. */
284 rc = Tss2_Sys_Startup(0, TPM2_SU_CLEAR);
285 if (rc != TSS2_SYS_RC_BAD_REFERENCE) {
286 LOG_ERROR("SYS invalid test FAILED! Response Code : 0x%x", rc);
287 exit(1);
288 }
289
290 /* Test one-call for NULL input parameter that should be a pointer. */
291 rc = Tss2_Sys_Create(sys_context, 0xffffffff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
292 if (rc != TSS2_SYS_RC_BAD_REFERENCE) {
293 LOG_ERROR("SYS invalid test FAILED! Response Code : 0x%x", rc);
294 exit(1);
295 }
296
297 /* Test GetCommandCode for bad reference */
298 rc = Tss2_Sys_GetCommandCode(0, (UINT8 *)&commandCode);
299 if (rc != TSS2_SYS_RC_BAD_REFERENCE) {
300 LOG_ERROR("SYS invalid test FAILED! Response Code : 0x%x", rc);
301 exit(1);
302 }
303
304 rc = Tss2_Sys_GetCommandCode(sys_context, NULL);
305 if (rc != TSS2_SYS_RC_BAD_REFERENCE) {
306 LOG_ERROR("SYS invalid test FAILED! Response Code : 0x%x", rc);
307 exit(1);
308 }
309
310 LOG_INFO("System API test Passed!");
311 return 0;
312 }
313