1*758e9fbaSOystein Eftevaag /* SPDX-License-Identifier: BSD-2-Clause */
2*758e9fbaSOystein Eftevaag /***********************************************************************
3*758e9fbaSOystein Eftevaag * Copyright (c) 2017-2018, Intel Corporation
4*758e9fbaSOystein Eftevaag *
5*758e9fbaSOystein Eftevaag * All rights reserved.
6*758e9fbaSOystein Eftevaag ***********************************************************************/
7*758e9fbaSOystein Eftevaag #ifdef HAVE_CONFIG_H
8*758e9fbaSOystein Eftevaag #include <config.h>
9*758e9fbaSOystein Eftevaag #endif
10*758e9fbaSOystein Eftevaag
11*758e9fbaSOystein Eftevaag #include <inttypes.h>
12*758e9fbaSOystein Eftevaag #include <stdarg.h>
13*758e9fbaSOystein Eftevaag #include <stdbool.h>
14*758e9fbaSOystein Eftevaag #include <stdio.h>
15*758e9fbaSOystein Eftevaag #include <string.h>
16*758e9fbaSOystein Eftevaag #include <poll.h>
17*758e9fbaSOystein Eftevaag
18*758e9fbaSOystein Eftevaag #include <setjmp.h>
19*758e9fbaSOystein Eftevaag #include <cmocka.h>
20*758e9fbaSOystein Eftevaag
21*758e9fbaSOystein Eftevaag #include "tss2_mu.h"
22*758e9fbaSOystein Eftevaag #include "tss2_tcti_device.h"
23*758e9fbaSOystein Eftevaag
24*758e9fbaSOystein Eftevaag #include "tss2-tcti/tcti-common.h"
25*758e9fbaSOystein Eftevaag #include "tss2-tcti/tcti-device.h"
26*758e9fbaSOystein Eftevaag
27*758e9fbaSOystein Eftevaag /*
28*758e9fbaSOystein Eftevaag * Size of the TPM2 buffer used in these tests. In some cases this will be
29*758e9fbaSOystein Eftevaag * the command sent (transmit tests) and in others it's used as the response
30*758e9fbaSOystein Eftevaag * buffer returned by the TCTI. The only field used by the TCTI is the size
31*758e9fbaSOystein Eftevaag * field.
32*758e9fbaSOystein Eftevaag */
33*758e9fbaSOystein Eftevaag #define BUF_SIZE 20
34*758e9fbaSOystein Eftevaag static uint8_t tpm2_buf [BUF_SIZE] = {
35*758e9fbaSOystein Eftevaag 0x80, 0x02, /* TAG */
36*758e9fbaSOystein Eftevaag 0x00, 0x00, 0x00, 0x14, /* size (BUF_SIZE) */
37*758e9fbaSOystein Eftevaag 0x00, 0x00, 0x00, 0x00, /* rc (success) */
38*758e9fbaSOystein Eftevaag 0xde, 0xad, 0xbe, 0xef, /* junk data */
39*758e9fbaSOystein Eftevaag 0xca, 0xfe, 0xba, 0xbe,
40*758e9fbaSOystein Eftevaag 0xfe, 0xef
41*758e9fbaSOystein Eftevaag };
42*758e9fbaSOystein Eftevaag int
43*758e9fbaSOystein Eftevaag __real_open(const char *pathname, int flags, ...);
44*758e9fbaSOystein Eftevaag /* wrap function for open required to test init */
45*758e9fbaSOystein Eftevaag int
__wrap_open(const char * pathname,int flags,...)46*758e9fbaSOystein Eftevaag __wrap_open(const char *pathname, int flags, ...)
47*758e9fbaSOystein Eftevaag {
48*758e9fbaSOystein Eftevaag const char* pathname_prefix_dev = "/dev";
49*758e9fbaSOystein Eftevaag if (strncmp(pathname, pathname_prefix_dev, strlen(pathname_prefix_dev)) == 0) {
50*758e9fbaSOystein Eftevaag return mock_type (int);
51*758e9fbaSOystein Eftevaag } else {
52*758e9fbaSOystein Eftevaag /* only mock opening of device files as the open() syscall is needed
53*758e9fbaSOystein Eftevaag for code coverage reports as well */
54*758e9fbaSOystein Eftevaag return __real_open(pathname, flags);
55*758e9fbaSOystein Eftevaag }
56*758e9fbaSOystein Eftevaag }
57*758e9fbaSOystein Eftevaag /**
58*758e9fbaSOystein Eftevaag * When passed all NULL values ensure that we get back the expected RC
59*758e9fbaSOystein Eftevaag * indicating bad values.
60*758e9fbaSOystein Eftevaag */
61*758e9fbaSOystein Eftevaag static void
tcti_device_init_all_null_test(void ** state)62*758e9fbaSOystein Eftevaag tcti_device_init_all_null_test (void **state)
63*758e9fbaSOystein Eftevaag {
64*758e9fbaSOystein Eftevaag TSS2_RC rc;
65*758e9fbaSOystein Eftevaag
66*758e9fbaSOystein Eftevaag rc = Tss2_Tcti_Device_Init (NULL, NULL, NULL);
67*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_TCTI_RC_BAD_VALUE);
68*758e9fbaSOystein Eftevaag }
69*758e9fbaSOystein Eftevaag /* Determine the size of a TCTI context structure. Requires calling the
70*758e9fbaSOystein Eftevaag * initialization function for the device TCTI with the first parameter
71*758e9fbaSOystein Eftevaag * (the TCTI context) NULL.
72*758e9fbaSOystein Eftevaag */
73*758e9fbaSOystein Eftevaag static void
tcti_device_init_size_test(void ** state)74*758e9fbaSOystein Eftevaag tcti_device_init_size_test (void **state)
75*758e9fbaSOystein Eftevaag {
76*758e9fbaSOystein Eftevaag size_t tcti_size = 0;
77*758e9fbaSOystein Eftevaag TSS2_RC ret = TSS2_RC_SUCCESS;
78*758e9fbaSOystein Eftevaag
79*758e9fbaSOystein Eftevaag ret = Tss2_Tcti_Device_Init (NULL, &tcti_size, NULL);
80*758e9fbaSOystein Eftevaag assert_int_equal (ret, TSS2_RC_SUCCESS);
81*758e9fbaSOystein Eftevaag }
82*758e9fbaSOystein Eftevaag /* Test the failure of opening a specified device file */
83*758e9fbaSOystein Eftevaag static void
tcti_device_init_conf_fail(void ** state)84*758e9fbaSOystein Eftevaag tcti_device_init_conf_fail (void **state)
85*758e9fbaSOystein Eftevaag {
86*758e9fbaSOystein Eftevaag size_t tcti_size = 0;
87*758e9fbaSOystein Eftevaag TSS2_RC ret = TSS2_RC_SUCCESS;
88*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *ctx = NULL;
89*758e9fbaSOystein Eftevaag
90*758e9fbaSOystein Eftevaag ret = Tss2_Tcti_Device_Init (NULL, &tcti_size, NULL);
91*758e9fbaSOystein Eftevaag assert_true (ret == TSS2_RC_SUCCESS);
92*758e9fbaSOystein Eftevaag ctx = calloc (1, tcti_size);
93*758e9fbaSOystein Eftevaag assert_non_null (ctx);
94*758e9fbaSOystein Eftevaag errno = ENOENT; /* No such file or directory */
95*758e9fbaSOystein Eftevaag will_return (__wrap_open, -1);
96*758e9fbaSOystein Eftevaag ret = Tss2_Tcti_Device_Init (ctx, &tcti_size, "/dev/nonexistent");
97*758e9fbaSOystein Eftevaag assert_true (ret == TSS2_TCTI_RC_IO_ERROR);
98*758e9fbaSOystein Eftevaag
99*758e9fbaSOystein Eftevaag free(ctx);
100*758e9fbaSOystein Eftevaag }
101*758e9fbaSOystein Eftevaag /* Test the device file recognition if no config string was specified */
102*758e9fbaSOystein Eftevaag static void
tcti_device_init_conf_default_fail(void ** state)103*758e9fbaSOystein Eftevaag tcti_device_init_conf_default_fail (void **state)
104*758e9fbaSOystein Eftevaag {
105*758e9fbaSOystein Eftevaag size_t tcti_size = 0;
106*758e9fbaSOystein Eftevaag TSS2_RC ret = TSS2_RC_SUCCESS;
107*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *ctx = NULL;
108*758e9fbaSOystein Eftevaag
109*758e9fbaSOystein Eftevaag ret = Tss2_Tcti_Device_Init (NULL, &tcti_size, NULL);
110*758e9fbaSOystein Eftevaag assert_true (ret == TSS2_RC_SUCCESS);
111*758e9fbaSOystein Eftevaag ctx = calloc (1, tcti_size);
112*758e9fbaSOystein Eftevaag assert_non_null (ctx);
113*758e9fbaSOystein Eftevaag errno = EACCES; /* Permission denied */
114*758e9fbaSOystein Eftevaag will_return (__wrap_open, -1);
115*758e9fbaSOystein Eftevaag will_return (__wrap_open, -1);
116*758e9fbaSOystein Eftevaag ret = Tss2_Tcti_Device_Init (ctx, &tcti_size, NULL);
117*758e9fbaSOystein Eftevaag assert_true (ret == TSS2_TCTI_RC_IO_ERROR);
118*758e9fbaSOystein Eftevaag
119*758e9fbaSOystein Eftevaag free(ctx);
120*758e9fbaSOystein Eftevaag }
121*758e9fbaSOystein Eftevaag /* Test the device file recognition if no config string was specified */
122*758e9fbaSOystein Eftevaag static void
tcti_device_init_conf_default_success(void ** state)123*758e9fbaSOystein Eftevaag tcti_device_init_conf_default_success (void **state)
124*758e9fbaSOystein Eftevaag {
125*758e9fbaSOystein Eftevaag size_t tcti_size = 0;
126*758e9fbaSOystein Eftevaag TSS2_RC ret = TSS2_RC_SUCCESS;
127*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *ctx = NULL;
128*758e9fbaSOystein Eftevaag
129*758e9fbaSOystein Eftevaag ret = Tss2_Tcti_Device_Init (NULL, &tcti_size, NULL);
130*758e9fbaSOystein Eftevaag assert_true (ret == TSS2_RC_SUCCESS);
131*758e9fbaSOystein Eftevaag ctx = calloc (1, tcti_size);
132*758e9fbaSOystein Eftevaag assert_non_null (ctx);
133*758e9fbaSOystein Eftevaag will_return (__wrap_open, 3);
134*758e9fbaSOystein Eftevaag ret = Tss2_Tcti_Device_Init (ctx, &tcti_size, NULL);
135*758e9fbaSOystein Eftevaag assert_true (ret == TSS2_RC_SUCCESS);
136*758e9fbaSOystein Eftevaag
137*758e9fbaSOystein Eftevaag free(ctx);
138*758e9fbaSOystein Eftevaag }
139*758e9fbaSOystein Eftevaag /* wrap functions for read & write required to test receive / transmit */
140*758e9fbaSOystein Eftevaag ssize_t
__wrap_read(int fd,void * buf,size_t count)141*758e9fbaSOystein Eftevaag __wrap_read (int fd, void *buf, size_t count)
142*758e9fbaSOystein Eftevaag {
143*758e9fbaSOystein Eftevaag ssize_t ret = mock_type (ssize_t);
144*758e9fbaSOystein Eftevaag uint8_t *buf_in = mock_type (uint8_t*);
145*758e9fbaSOystein Eftevaag
146*758e9fbaSOystein Eftevaag memcpy (buf, buf_in, ret);
147*758e9fbaSOystein Eftevaag return ret;
148*758e9fbaSOystein Eftevaag }
149*758e9fbaSOystein Eftevaag ssize_t
__wrap_write(int fd,const void * buffer,size_t buffer_size)150*758e9fbaSOystein Eftevaag __wrap_write (int fd, const void *buffer, size_t buffer_size)
151*758e9fbaSOystein Eftevaag {
152*758e9fbaSOystein Eftevaag ssize_t ret = mock_type (ssize_t);
153*758e9fbaSOystein Eftevaag uint8_t *buf_out = mock_type (uint8_t*);
154*758e9fbaSOystein Eftevaag
155*758e9fbaSOystein Eftevaag memcpy (buf_out, buffer, ret);
156*758e9fbaSOystein Eftevaag return ret;
157*758e9fbaSOystein Eftevaag }
158*758e9fbaSOystein Eftevaag
159*758e9fbaSOystein Eftevaag int
__wrap_poll(struct pollfd * fds,nfds_t nfds,int timeout)160*758e9fbaSOystein Eftevaag __wrap_poll (struct pollfd *fds, nfds_t nfds, int timeout)
161*758e9fbaSOystein Eftevaag {
162*758e9fbaSOystein Eftevaag int ret = mock_type (int);
163*758e9fbaSOystein Eftevaag
164*758e9fbaSOystein Eftevaag fds->revents = fds->events;
165*758e9fbaSOystein Eftevaag return ret;
166*758e9fbaSOystein Eftevaag }
167*758e9fbaSOystein Eftevaag
168*758e9fbaSOystein Eftevaag /* Setup functions to create the context for the device TCTI */
169*758e9fbaSOystein Eftevaag static int
tcti_device_setup(void ** state)170*758e9fbaSOystein Eftevaag tcti_device_setup (void **state)
171*758e9fbaSOystein Eftevaag {
172*758e9fbaSOystein Eftevaag size_t tcti_size = 0;
173*758e9fbaSOystein Eftevaag TSS2_RC ret = TSS2_RC_SUCCESS;
174*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *ctx = NULL;
175*758e9fbaSOystein Eftevaag
176*758e9fbaSOystein Eftevaag ret = Tss2_Tcti_Device_Init (NULL, &tcti_size, NULL);
177*758e9fbaSOystein Eftevaag assert_true (ret == TSS2_RC_SUCCESS);
178*758e9fbaSOystein Eftevaag ctx = calloc (1, tcti_size);
179*758e9fbaSOystein Eftevaag assert_non_null (ctx);
180*758e9fbaSOystein Eftevaag will_return (__wrap_open, 3);
181*758e9fbaSOystein Eftevaag ret = Tss2_Tcti_Device_Init (ctx, &tcti_size, "/dev/null");
182*758e9fbaSOystein Eftevaag assert_true (ret == TSS2_RC_SUCCESS);
183*758e9fbaSOystein Eftevaag
184*758e9fbaSOystein Eftevaag *state = ctx;
185*758e9fbaSOystein Eftevaag return 0;
186*758e9fbaSOystein Eftevaag }
187*758e9fbaSOystein Eftevaag
188*758e9fbaSOystein Eftevaag static int
tcti_device_teardown(void ** state)189*758e9fbaSOystein Eftevaag tcti_device_teardown (void **state)
190*758e9fbaSOystein Eftevaag {
191*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *ctx = (TSS2_TCTI_CONTEXT*)*state;
192*758e9fbaSOystein Eftevaag
193*758e9fbaSOystein Eftevaag Tss2_Tcti_Finalize (ctx);
194*758e9fbaSOystein Eftevaag free (ctx);
195*758e9fbaSOystein Eftevaag
196*758e9fbaSOystein Eftevaag return 0;
197*758e9fbaSOystein Eftevaag
198*758e9fbaSOystein Eftevaag }
199*758e9fbaSOystein Eftevaag /*
200*758e9fbaSOystein Eftevaag * This test ensures that the GetPollHandles function in the device TCTI
201*758e9fbaSOystein Eftevaag * returns the expected value. Since this TCTI does not support async I/O
202*758e9fbaSOystein Eftevaag * on account of limitations in the kernel it just returns the
203*758e9fbaSOystein Eftevaag * NOT_IMPLEMENTED response code.
204*758e9fbaSOystein Eftevaag */
205*758e9fbaSOystein Eftevaag static void
tcti_device_get_poll_handles_test(void ** state)206*758e9fbaSOystein Eftevaag tcti_device_get_poll_handles_test (void **state)
207*758e9fbaSOystein Eftevaag {
208*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *ctx = (TSS2_TCTI_CONTEXT*)*state;
209*758e9fbaSOystein Eftevaag size_t num_handles = 5;
210*758e9fbaSOystein Eftevaag TSS2_TCTI_POLL_HANDLE handles [5] = { 0 };
211*758e9fbaSOystein Eftevaag TSS2_RC rc;
212*758e9fbaSOystein Eftevaag
213*758e9fbaSOystein Eftevaag rc = Tss2_Tcti_GetPollHandles (ctx, handles, &num_handles);
214*758e9fbaSOystein Eftevaag #ifdef TCTI_ASYNC
215*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_RC_SUCCESS);
216*758e9fbaSOystein Eftevaag assert_int_equal (num_handles, 1);
217*758e9fbaSOystein Eftevaag #else
218*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_TCTI_RC_NOT_IMPLEMENTED);
219*758e9fbaSOystein Eftevaag #endif
220*758e9fbaSOystein Eftevaag }
221*758e9fbaSOystein Eftevaag /*
222*758e9fbaSOystein Eftevaag */
223*758e9fbaSOystein Eftevaag static void
tcti_device_receive_null_size_test(void ** state)224*758e9fbaSOystein Eftevaag tcti_device_receive_null_size_test (void **state)
225*758e9fbaSOystein Eftevaag {
226*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *ctx = (TSS2_TCTI_CONTEXT*)*state;
227*758e9fbaSOystein Eftevaag TSS2_TCTI_COMMON_CONTEXT *tcti_common = tcti_common_context_cast (ctx);
228*758e9fbaSOystein Eftevaag TSS2_RC rc;
229*758e9fbaSOystein Eftevaag
230*758e9fbaSOystein Eftevaag /* Keep state machine check in `receive` from returning error. */
231*758e9fbaSOystein Eftevaag tcti_common->state = TCTI_STATE_RECEIVE;
232*758e9fbaSOystein Eftevaag rc = Tss2_Tcti_Receive (ctx,
233*758e9fbaSOystein Eftevaag NULL, /* NULL 'size' parameter */
234*758e9fbaSOystein Eftevaag NULL,
235*758e9fbaSOystein Eftevaag TSS2_TCTI_TIMEOUT_BLOCK);
236*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_TCTI_RC_BAD_REFERENCE);
237*758e9fbaSOystein Eftevaag rc = Tss2_Tcti_Receive (ctx,
238*758e9fbaSOystein Eftevaag NULL, /* NULL 'size' parameter */
239*758e9fbaSOystein Eftevaag (uint8_t*)1, /* non-NULL buffer */
240*758e9fbaSOystein Eftevaag TSS2_TCTI_TIMEOUT_BLOCK);
241*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_TCTI_RC_BAD_REFERENCE);
242*758e9fbaSOystein Eftevaag }
243*758e9fbaSOystein Eftevaag /*
244*758e9fbaSOystein Eftevaag * A test case for a successful call to the receive function. This requires
245*758e9fbaSOystein Eftevaag * that the context and the command buffer be valid (including the size
246*758e9fbaSOystein Eftevaag * field being set appropriately). The result should be an RC indicating
247*758e9fbaSOystein Eftevaag * success and the size parameter be updated to reflect the size of the
248*758e9fbaSOystein Eftevaag * data received.
249*758e9fbaSOystein Eftevaag */
250*758e9fbaSOystein Eftevaag static void
tcti_device_receive_success(void ** state)251*758e9fbaSOystein Eftevaag tcti_device_receive_success (void **state)
252*758e9fbaSOystein Eftevaag {
253*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *ctx = (TSS2_TCTI_CONTEXT*)*state;
254*758e9fbaSOystein Eftevaag TSS2_TCTI_COMMON_CONTEXT *tcti_common = tcti_common_context_cast (ctx);
255*758e9fbaSOystein Eftevaag TSS2_RC rc;
256*758e9fbaSOystein Eftevaag /* output buffer for response */
257*758e9fbaSOystein Eftevaag uint8_t buf_out [BUF_SIZE + 5] = { 0 };
258*758e9fbaSOystein Eftevaag size_t size = BUF_SIZE + 5;
259*758e9fbaSOystein Eftevaag
260*758e9fbaSOystein Eftevaag /* Keep state machine check in `receive` from returning error. */
261*758e9fbaSOystein Eftevaag tcti_common->state = TCTI_STATE_RECEIVE;
262*758e9fbaSOystein Eftevaag will_return (__wrap_poll, 1);
263*758e9fbaSOystein Eftevaag will_return (__wrap_read, BUF_SIZE);
264*758e9fbaSOystein Eftevaag will_return (__wrap_read, tpm2_buf);
265*758e9fbaSOystein Eftevaag rc = Tss2_Tcti_Receive (ctx,
266*758e9fbaSOystein Eftevaag &size,
267*758e9fbaSOystein Eftevaag buf_out,
268*758e9fbaSOystein Eftevaag TSS2_TCTI_TIMEOUT_BLOCK);
269*758e9fbaSOystein Eftevaag assert_true (rc == TSS2_RC_SUCCESS);
270*758e9fbaSOystein Eftevaag assert_int_equal (BUF_SIZE, size);
271*758e9fbaSOystein Eftevaag assert_memory_equal (tpm2_buf, buf_out, size);
272*758e9fbaSOystein Eftevaag }
273*758e9fbaSOystein Eftevaag /*
274*758e9fbaSOystein Eftevaag * Ensure that when the 'read' results in an EOF, we get a response code
275*758e9fbaSOystein Eftevaag * indicating as much. EOF happens if / when the device driver kills our
276*758e9fbaSOystein Eftevaag * connection.
277*758e9fbaSOystein Eftevaag */
278*758e9fbaSOystein Eftevaag static void
tcti_device_receive_eof_test(void ** state)279*758e9fbaSOystein Eftevaag tcti_device_receive_eof_test (void **state)
280*758e9fbaSOystein Eftevaag {
281*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *ctx = (TSS2_TCTI_CONTEXT*)*state;
282*758e9fbaSOystein Eftevaag TSS2_TCTI_COMMON_CONTEXT *tcti_common = tcti_common_context_cast (ctx);
283*758e9fbaSOystein Eftevaag TSS2_RC rc;
284*758e9fbaSOystein Eftevaag /* output buffer for response */
285*758e9fbaSOystein Eftevaag uint8_t buf_out [BUF_SIZE + 5] = { 0 };
286*758e9fbaSOystein Eftevaag size_t size = BUF_SIZE + 5;
287*758e9fbaSOystein Eftevaag
288*758e9fbaSOystein Eftevaag /* Keep state machine check in `receive` from returning error. */
289*758e9fbaSOystein Eftevaag tcti_common->state = TCTI_STATE_RECEIVE;
290*758e9fbaSOystein Eftevaag will_return (__wrap_poll, 1);
291*758e9fbaSOystein Eftevaag will_return (__wrap_read, 0);
292*758e9fbaSOystein Eftevaag will_return (__wrap_read, tpm2_buf);
293*758e9fbaSOystein Eftevaag rc = Tss2_Tcti_Receive (ctx,
294*758e9fbaSOystein Eftevaag &size,
295*758e9fbaSOystein Eftevaag buf_out,
296*758e9fbaSOystein Eftevaag TSS2_TCTI_TIMEOUT_BLOCK);
297*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_TCTI_RC_NO_CONNECTION);
298*758e9fbaSOystein Eftevaag }
299*758e9fbaSOystein Eftevaag /*
300*758e9fbaSOystein Eftevaag * This is a weird test: The device TCTI can't read the header for the
301*758e9fbaSOystein Eftevaag * response buffer separately from the body. This means it can't know the size
302*758e9fbaSOystein Eftevaag * of the response before reading the whole thing. In the event that the caller
303*758e9fbaSOystein Eftevaag * provides a buffer that isn't large enough to hold the full response the TCTI
304*758e9fbaSOystein Eftevaag * will just read as much data as the buffer will hold. Subsequent interactions
305*758e9fbaSOystein Eftevaag * with the kernel driver will likely result in an error.
306*758e9fbaSOystein Eftevaag */
307*758e9fbaSOystein Eftevaag static void
tcti_device_receive_buffer_lt_response(void ** state)308*758e9fbaSOystein Eftevaag tcti_device_receive_buffer_lt_response (void **state)
309*758e9fbaSOystein Eftevaag {
310*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *ctx = (TSS2_TCTI_CONTEXT*)*state;
311*758e9fbaSOystein Eftevaag TSS2_TCTI_COMMON_CONTEXT *tcti_common = tcti_common_context_cast (ctx);
312*758e9fbaSOystein Eftevaag TSS2_RC rc;
313*758e9fbaSOystein Eftevaag uint8_t buf_out [BUF_SIZE] = { 0 };
314*758e9fbaSOystein Eftevaag /* set size to lt the size in the header of the TPM2 response buffer */
315*758e9fbaSOystein Eftevaag size_t size = BUF_SIZE - 1;
316*758e9fbaSOystein Eftevaag
317*758e9fbaSOystein Eftevaag /* Keep state machine check in `receive` from returning error. */
318*758e9fbaSOystein Eftevaag tcti_common->state = TCTI_STATE_RECEIVE;
319*758e9fbaSOystein Eftevaag will_return (__wrap_poll, 1);
320*758e9fbaSOystein Eftevaag will_return (__wrap_read, size);
321*758e9fbaSOystein Eftevaag will_return (__wrap_read, tpm2_buf);
322*758e9fbaSOystein Eftevaag rc = Tss2_Tcti_Receive (ctx,
323*758e9fbaSOystein Eftevaag &size,
324*758e9fbaSOystein Eftevaag buf_out,
325*758e9fbaSOystein Eftevaag TSS2_TCTI_TIMEOUT_BLOCK);
326*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_TCTI_RC_GENERAL_FAILURE);
327*758e9fbaSOystein Eftevaag }
328*758e9fbaSOystein Eftevaag /*
329*758e9fbaSOystein Eftevaag * A test case for a successful call to the transmit function. This requires
330*758e9fbaSOystein Eftevaag * that the context and the cmmand buffer be valid. The only indication of
331*758e9fbaSOystein Eftevaag * success is the RC.
332*758e9fbaSOystein Eftevaag */
333*758e9fbaSOystein Eftevaag static void
tcti_device_transmit_success(void ** state)334*758e9fbaSOystein Eftevaag tcti_device_transmit_success (void **state)
335*758e9fbaSOystein Eftevaag {
336*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *ctx = (TSS2_TCTI_CONTEXT*)*state;
337*758e9fbaSOystein Eftevaag TSS2_RC rc;
338*758e9fbaSOystein Eftevaag /* output buffer for response */
339*758e9fbaSOystein Eftevaag uint8_t buf_out [BUF_SIZE] = { 0 };
340*758e9fbaSOystein Eftevaag
341*758e9fbaSOystein Eftevaag will_return (__wrap_write, BUF_SIZE);
342*758e9fbaSOystein Eftevaag will_return (__wrap_write, buf_out);
343*758e9fbaSOystein Eftevaag rc = Tss2_Tcti_Transmit (ctx,
344*758e9fbaSOystein Eftevaag BUF_SIZE,
345*758e9fbaSOystein Eftevaag tpm2_buf);
346*758e9fbaSOystein Eftevaag assert_true (rc == TSS2_RC_SUCCESS);
347*758e9fbaSOystein Eftevaag assert_memory_equal (tpm2_buf, buf_out, BUF_SIZE);
348*758e9fbaSOystein Eftevaag }
349*758e9fbaSOystein Eftevaag /*
350*758e9fbaSOystein Eftevaag * A test case for a successful poll
351*758e9fbaSOystein Eftevaag */
352*758e9fbaSOystein Eftevaag static void
tcti_device_poll_success(void ** state)353*758e9fbaSOystein Eftevaag tcti_device_poll_success (void **state)
354*758e9fbaSOystein Eftevaag {
355*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *ctx = (TSS2_TCTI_CONTEXT*)*state;
356*758e9fbaSOystein Eftevaag TSS2_TCTI_COMMON_CONTEXT *tcti_common = tcti_common_context_cast (ctx);
357*758e9fbaSOystein Eftevaag TSS2_RC rc;
358*758e9fbaSOystein Eftevaag /* output buffer for response */
359*758e9fbaSOystein Eftevaag uint8_t buf_out [BUF_SIZE] = { 0 };
360*758e9fbaSOystein Eftevaag size_t size = BUF_SIZE;
361*758e9fbaSOystein Eftevaag
362*758e9fbaSOystein Eftevaag /* Keep state machine check in `receive` from returning error. */
363*758e9fbaSOystein Eftevaag tcti_common->state = TCTI_STATE_RECEIVE;
364*758e9fbaSOystein Eftevaag will_return (__wrap_poll, 1);
365*758e9fbaSOystein Eftevaag will_return (__wrap_read, BUF_SIZE);
366*758e9fbaSOystein Eftevaag will_return (__wrap_read, tpm2_buf);
367*758e9fbaSOystein Eftevaag
368*758e9fbaSOystein Eftevaag rc = Tss2_Tcti_Receive (ctx,
369*758e9fbaSOystein Eftevaag &size,
370*758e9fbaSOystein Eftevaag buf_out,
371*758e9fbaSOystein Eftevaag TSS2_TCTI_TIMEOUT_BLOCK);
372*758e9fbaSOystein Eftevaag
373*758e9fbaSOystein Eftevaag assert_true (rc == TSS2_RC_SUCCESS);
374*758e9fbaSOystein Eftevaag assert_int_equal (BUF_SIZE, size);
375*758e9fbaSOystein Eftevaag assert_memory_equal (tpm2_buf, buf_out, size);
376*758e9fbaSOystein Eftevaag }
377*758e9fbaSOystein Eftevaag /*
378*758e9fbaSOystein Eftevaag * A test case for poll timeout
379*758e9fbaSOystein Eftevaag */
380*758e9fbaSOystein Eftevaag static void
tcti_device_poll_timeout(void ** state)381*758e9fbaSOystein Eftevaag tcti_device_poll_timeout (void **state)
382*758e9fbaSOystein Eftevaag {
383*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *ctx = (TSS2_TCTI_CONTEXT*)*state;
384*758e9fbaSOystein Eftevaag TSS2_TCTI_COMMON_CONTEXT *tcti_common = tcti_common_context_cast (ctx);
385*758e9fbaSOystein Eftevaag TSS2_RC rc;
386*758e9fbaSOystein Eftevaag /* output buffer for response */
387*758e9fbaSOystein Eftevaag uint8_t buf_out [BUF_SIZE] = { 0 };
388*758e9fbaSOystein Eftevaag size_t size = BUF_SIZE;
389*758e9fbaSOystein Eftevaag
390*758e9fbaSOystein Eftevaag /* Keep state machine check in `receive` from returning error. */
391*758e9fbaSOystein Eftevaag tcti_common->state = TCTI_STATE_RECEIVE;
392*758e9fbaSOystein Eftevaag will_return (__wrap_poll, 0);
393*758e9fbaSOystein Eftevaag
394*758e9fbaSOystein Eftevaag rc = Tss2_Tcti_Receive (ctx,
395*758e9fbaSOystein Eftevaag &size,
396*758e9fbaSOystein Eftevaag buf_out,
397*758e9fbaSOystein Eftevaag TSS2_TCTI_TIMEOUT_BLOCK);
398*758e9fbaSOystein Eftevaag
399*758e9fbaSOystein Eftevaag assert_true (rc == TSS2_TCTI_RC_TRY_AGAIN);
400*758e9fbaSOystein Eftevaag }
401*758e9fbaSOystein Eftevaag /*
402*758e9fbaSOystein Eftevaag * A test case for poll io-error
403*758e9fbaSOystein Eftevaag */
404*758e9fbaSOystein Eftevaag static void
tcti_device_poll_io_error(void ** state)405*758e9fbaSOystein Eftevaag tcti_device_poll_io_error (void **state)
406*758e9fbaSOystein Eftevaag {
407*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *ctx = (TSS2_TCTI_CONTEXT*)*state;
408*758e9fbaSOystein Eftevaag TSS2_TCTI_COMMON_CONTEXT *tcti_common = tcti_common_context_cast (ctx);
409*758e9fbaSOystein Eftevaag TSS2_RC rc;
410*758e9fbaSOystein Eftevaag /* output buffer for response */
411*758e9fbaSOystein Eftevaag uint8_t buf_out [BUF_SIZE] = { 0 };
412*758e9fbaSOystein Eftevaag size_t size = BUF_SIZE;
413*758e9fbaSOystein Eftevaag
414*758e9fbaSOystein Eftevaag /* Keep state machine check in `receive` from returning error. */
415*758e9fbaSOystein Eftevaag tcti_common->state = TCTI_STATE_RECEIVE;
416*758e9fbaSOystein Eftevaag will_return (__wrap_poll, -1);
417*758e9fbaSOystein Eftevaag
418*758e9fbaSOystein Eftevaag rc = Tss2_Tcti_Receive (ctx,
419*758e9fbaSOystein Eftevaag &size,
420*758e9fbaSOystein Eftevaag buf_out,
421*758e9fbaSOystein Eftevaag TSS2_TCTI_TIMEOUT_BLOCK);
422*758e9fbaSOystein Eftevaag
423*758e9fbaSOystein Eftevaag assert_true (rc == TSS2_TCTI_RC_IO_ERROR);
424*758e9fbaSOystein Eftevaag }
425*758e9fbaSOystein Eftevaag
426*758e9fbaSOystein Eftevaag int
main(int argc,char * argv[])427*758e9fbaSOystein Eftevaag main(int argc, char* argv[])
428*758e9fbaSOystein Eftevaag {
429*758e9fbaSOystein Eftevaag const struct CMUnitTest tests[] = {
430*758e9fbaSOystein Eftevaag cmocka_unit_test (tcti_device_init_all_null_test),
431*758e9fbaSOystein Eftevaag cmocka_unit_test(tcti_device_init_size_test),
432*758e9fbaSOystein Eftevaag cmocka_unit_test(tcti_device_init_conf_fail),
433*758e9fbaSOystein Eftevaag cmocka_unit_test(tcti_device_init_conf_default_fail),
434*758e9fbaSOystein Eftevaag cmocka_unit_test(tcti_device_init_conf_default_success),
435*758e9fbaSOystein Eftevaag cmocka_unit_test_setup_teardown (tcti_device_get_poll_handles_test,
436*758e9fbaSOystein Eftevaag tcti_device_setup,
437*758e9fbaSOystein Eftevaag tcti_device_teardown),
438*758e9fbaSOystein Eftevaag cmocka_unit_test_setup_teardown (tcti_device_receive_null_size_test,
439*758e9fbaSOystein Eftevaag tcti_device_setup,
440*758e9fbaSOystein Eftevaag tcti_device_teardown),
441*758e9fbaSOystein Eftevaag cmocka_unit_test_setup_teardown (tcti_device_receive_success,
442*758e9fbaSOystein Eftevaag tcti_device_setup,
443*758e9fbaSOystein Eftevaag tcti_device_teardown),
444*758e9fbaSOystein Eftevaag cmocka_unit_test_setup_teardown (tcti_device_receive_eof_test,
445*758e9fbaSOystein Eftevaag tcti_device_setup,
446*758e9fbaSOystein Eftevaag tcti_device_teardown),
447*758e9fbaSOystein Eftevaag cmocka_unit_test_setup_teardown (tcti_device_receive_buffer_lt_response,
448*758e9fbaSOystein Eftevaag tcti_device_setup,
449*758e9fbaSOystein Eftevaag tcti_device_teardown),
450*758e9fbaSOystein Eftevaag cmocka_unit_test_setup_teardown (tcti_device_transmit_success,
451*758e9fbaSOystein Eftevaag tcti_device_setup,
452*758e9fbaSOystein Eftevaag tcti_device_teardown),
453*758e9fbaSOystein Eftevaag cmocka_unit_test_setup_teardown (tcti_device_poll_success,
454*758e9fbaSOystein Eftevaag tcti_device_setup,
455*758e9fbaSOystein Eftevaag tcti_device_teardown),
456*758e9fbaSOystein Eftevaag cmocka_unit_test_setup_teardown (tcti_device_poll_timeout,
457*758e9fbaSOystein Eftevaag tcti_device_setup,
458*758e9fbaSOystein Eftevaag tcti_device_teardown),
459*758e9fbaSOystein Eftevaag cmocka_unit_test_setup_teardown (tcti_device_poll_io_error,
460*758e9fbaSOystein Eftevaag tcti_device_setup,
461*758e9fbaSOystein Eftevaag tcti_device_teardown),
462*758e9fbaSOystein Eftevaag };
463*758e9fbaSOystein Eftevaag return cmocka_run_group_tests (tests, NULL, NULL);
464*758e9fbaSOystein Eftevaag }
465