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