xref: /aosp_15_r20/external/tpm2-tss/test/unit/esys-getpollhandles.c (revision 758e9fba6fc9adbf15340f70c73baee7b168b1c9)
1 /* SPDX-License-Identifier: BSD-2-Clause */
2 /*******************************************************************************
3  * Copyright 2017-2018, Fraunhofer SIT sponsored by Infineon Technologies AG All
4  * rights reserved.
5  ******************************************************************************/
6 
7 #ifdef HAVE_CONFIG_H
8 #include <config.h>
9 #endif
10 
11 #include <stdarg.h>
12 #include <inttypes.h>
13 #include <string.h>
14 #include <stdlib.h>
15 
16 #include <setjmp.h>
17 #include <cmocka.h>
18 
19 #include "tss2_esys.h"
20 
21 #define LOGMODULE tests
22 #include "util/log.h"
23 
24 #define TCTI_FAKE_MAGIC 0x46414b4500000000ULL        /* 'FAKE\0' */
25 #define TCTI_FAKE_VERSION 0x1
26 
27 typedef struct {
28     uint64_t magic;
29     uint32_t version;
30     TSS2_TCTI_TRANSMIT_FCN transmit;
31     TSS2_TCTI_RECEIVE_FCN receive;
32     TSS2_RC(*finalize) (TSS2_TCTI_CONTEXT * tctiContext);
33     TSS2_RC(*cancel) (TSS2_TCTI_CONTEXT * tctiContext);
34     TSS2_RC(*getPollHandles) (TSS2_TCTI_CONTEXT * tctiContext,
35                            TSS2_TCTI_POLL_HANDLE * handles,
36                            size_t * num_handles);
37     TSS2_RC(*setLocality) (TSS2_TCTI_CONTEXT * tctiContext, uint8_t locality);
38 } TSS2_TCTI_CONTEXT_FAKE;
39 
40 
41 TSS2_TCTI_POLL_HANDLE rev[] = {
42     {.fd=66, .events=1, .revents=0},
43     {.fd=99, .events=1, .revents=0}
44 };
45 
46 static TSS2_RC
tcti_fake_getpollhandles(TSS2_TCTI_CONTEXT * tctiContext,TSS2_TCTI_POLL_HANDLE * handles,size_t * num_handles)47 tcti_fake_getpollhandles(TSS2_TCTI_CONTEXT * tctiContext,
48                          TSS2_TCTI_POLL_HANDLE * handles,
49                          size_t * num_handles)
50 {
51     (void) tctiContext;
52     if (handles == NULL) {
53         *num_handles = 2;
54         return TSS2_RC_SUCCESS;
55     }
56     assert_int_equal(*num_handles, 2);
57     memcpy(&handles[0], &rev[0], sizeof(rev));
58     return TSS2_RC_SUCCESS;
59 }
60 
61 static TSS2_RC
tcti_fake_initialize(TSS2_TCTI_CONTEXT * tctiContext,size_t * contextSize)62 tcti_fake_initialize(TSS2_TCTI_CONTEXT * tctiContext, size_t * contextSize)
63 {
64     TSS2_TCTI_CONTEXT_FAKE *tcti_fake =
65         (TSS2_TCTI_CONTEXT_FAKE *) tctiContext;
66 
67     if (tctiContext == NULL && contextSize == NULL) {
68         return TSS2_TCTI_RC_BAD_VALUE;
69     } else if (tctiContext == NULL) {
70         *contextSize = sizeof(*tcti_fake);
71         return TSS2_RC_SUCCESS;
72     }
73 
74     /* Init TCTI context */
75     memset(tcti_fake, 0, sizeof(*tcti_fake));
76     TSS2_TCTI_MAGIC(tctiContext) = TCTI_FAKE_MAGIC;
77     TSS2_TCTI_VERSION(tctiContext) = TCTI_FAKE_VERSION;
78     TSS2_TCTI_TRANSMIT(tctiContext) = (void*)1;
79     TSS2_TCTI_RECEIVE(tctiContext) = (void*)1;
80     TSS2_TCTI_FINALIZE(tctiContext) = NULL;
81     TSS2_TCTI_CANCEL(tctiContext) = NULL;
82     TSS2_TCTI_GET_POLL_HANDLES(tctiContext) = tcti_fake_getpollhandles;
83     TSS2_TCTI_SET_LOCALITY(tctiContext) = NULL;
84 
85     return TSS2_RC_SUCCESS;
86 }
87 
88 
89 static int
setup(void ** state)90 setup(void **state)
91 {
92     TSS2_RC r;
93     ESYS_CONTEXT *ectx;
94     size_t size = sizeof(TSS2_TCTI_CONTEXT_FAKE);
95     TSS2_TCTI_CONTEXT *tcti = malloc(size);
96 
97     r = tcti_fake_initialize(tcti, &size);
98     if (r)
99         return (int)r;
100     r = Esys_Initialize(&ectx, tcti, NULL);
101     *state = (void *)ectx;
102     return (int)r;
103 }
104 
105 static int
teardown(void ** state)106 teardown(void **state)
107 {
108     TSS2_TCTI_CONTEXT *tcti;
109     ESYS_CONTEXT *ectx = (ESYS_CONTEXT *) * state;
110     Esys_GetTcti(ectx, &tcti);
111     Esys_Finalize(&ectx);
112     free(tcti);
113     return 0;
114 }
115 
116 static void
test_GetPollHandles(void ** state)117 test_GetPollHandles(void **state)
118 {
119     TSS2_RC r;
120     ESYS_CONTEXT *ectx = (ESYS_CONTEXT *) * state;
121 
122     TSS2_TCTI_POLL_HANDLE *handles;
123     size_t count;
124 
125     r = Esys_GetPollHandles(ectx, &handles, &count);
126     assert_int_equal(r, TSS2_RC_SUCCESS);
127 
128     assert_int_equal(count, 2);
129     assert_memory_equal((void*)&handles[0], (void*)&rev[0], sizeof(rev));
130     free(handles);
131 }
132 
133 int
main(int argc,char * argv[])134 main(int argc, char *argv[])
135 {
136     const struct CMUnitTest tests[] = {
137         cmocka_unit_test_setup_teardown(test_GetPollHandles, setup, teardown),
138     };
139     return cmocka_run_group_tests(tests, NULL, NULL);
140 }
141