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 <errno.h>
12*758e9fbaSOystein Eftevaag #include <inttypes.h>
13*758e9fbaSOystein Eftevaag #include <stdio.h>
14*758e9fbaSOystein Eftevaag #include <stdlib.h>
15*758e9fbaSOystein Eftevaag #include <string.h>
16*758e9fbaSOystein Eftevaag
17*758e9fbaSOystein Eftevaag #include "tss2_tcti_device.h"
18*758e9fbaSOystein Eftevaag #include "tss2_tcti_mssim.h"
19*758e9fbaSOystein Eftevaag #ifdef TCTI_FUZZING
20*758e9fbaSOystein Eftevaag #include "tss2_tcti_fuzzing.h"
21*758e9fbaSOystein Eftevaag #endif /* TCTI_FUZZING */
22*758e9fbaSOystein Eftevaag
23*758e9fbaSOystein Eftevaag #include "context-util.h"
24*758e9fbaSOystein Eftevaag #include "tss2-tcti/tcti-mssim.h"
25*758e9fbaSOystein Eftevaag
26*758e9fbaSOystein Eftevaag #ifdef TCTI_DEVICE
27*758e9fbaSOystein Eftevaag /*
28*758e9fbaSOystein Eftevaag * Initialize a TSS2_TCTI_CONTEXT for the device TCTI.
29*758e9fbaSOystein Eftevaag */
30*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *
tcti_device_init(char const * device_path)31*758e9fbaSOystein Eftevaag tcti_device_init(char const *device_path)
32*758e9fbaSOystein Eftevaag {
33*758e9fbaSOystein Eftevaag size_t size;
34*758e9fbaSOystein Eftevaag TSS2_RC rc;
35*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tcti_ctx;
36*758e9fbaSOystein Eftevaag
37*758e9fbaSOystein Eftevaag rc = Tss2_Tcti_Device_Init(NULL, &size, 0);
38*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
39*758e9fbaSOystein Eftevaag fprintf(stderr,
40*758e9fbaSOystein Eftevaag "Failed to get allocation size for device tcti context: "
41*758e9fbaSOystein Eftevaag "0x%x\n", rc);
42*758e9fbaSOystein Eftevaag return NULL;
43*758e9fbaSOystein Eftevaag }
44*758e9fbaSOystein Eftevaag tcti_ctx = (TSS2_TCTI_CONTEXT *) calloc(1, size);
45*758e9fbaSOystein Eftevaag if (tcti_ctx == NULL) {
46*758e9fbaSOystein Eftevaag fprintf(stderr,
47*758e9fbaSOystein Eftevaag "Allocation for device TCTI context failed: %s\n",
48*758e9fbaSOystein Eftevaag strerror(errno));
49*758e9fbaSOystein Eftevaag return NULL;
50*758e9fbaSOystein Eftevaag }
51*758e9fbaSOystein Eftevaag rc = Tss2_Tcti_Device_Init(tcti_ctx, &size, device_path);
52*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
53*758e9fbaSOystein Eftevaag fprintf(stderr, "Failed to initialize device TCTI context: 0x%x\n", rc);
54*758e9fbaSOystein Eftevaag free(tcti_ctx);
55*758e9fbaSOystein Eftevaag return NULL;
56*758e9fbaSOystein Eftevaag }
57*758e9fbaSOystein Eftevaag return tcti_ctx;
58*758e9fbaSOystein Eftevaag }
59*758e9fbaSOystein Eftevaag #endif /* TCTI_DEVICE */
60*758e9fbaSOystein Eftevaag
61*758e9fbaSOystein Eftevaag #ifdef TCTI_MSSIM
62*758e9fbaSOystein Eftevaag /*
63*758e9fbaSOystein Eftevaag * Initialize a socket TCTI instance using the provided options structure.
64*758e9fbaSOystein Eftevaag * The hostname and port are the only configuration options used.
65*758e9fbaSOystein Eftevaag * The caller is returned a TCTI context structure that is allocated by this
66*758e9fbaSOystein Eftevaag * function. This structure must be freed by the caller.
67*758e9fbaSOystein Eftevaag */
68*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *
tcti_socket_init(char const * host,uint16_t port)69*758e9fbaSOystein Eftevaag tcti_socket_init(char const *host, uint16_t port)
70*758e9fbaSOystein Eftevaag {
71*758e9fbaSOystein Eftevaag size_t size;
72*758e9fbaSOystein Eftevaag TSS2_RC rc;
73*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tcti_ctx;
74*758e9fbaSOystein Eftevaag char conf_str[TCTI_MSSIM_CONF_MAX] = { 0 };
75*758e9fbaSOystein Eftevaag
76*758e9fbaSOystein Eftevaag snprintf(conf_str, TCTI_MSSIM_CONF_MAX, "host=%s,port=%" PRIu16, host, port);
77*758e9fbaSOystein Eftevaag rc = Tss2_Tcti_Mssim_Init(NULL, &size, conf_str);
78*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
79*758e9fbaSOystein Eftevaag fprintf(stderr, "Faled to get allocation size for tcti context: "
80*758e9fbaSOystein Eftevaag "0x%x\n", rc);
81*758e9fbaSOystein Eftevaag return NULL;
82*758e9fbaSOystein Eftevaag }
83*758e9fbaSOystein Eftevaag tcti_ctx = (TSS2_TCTI_CONTEXT *) calloc(1, size);
84*758e9fbaSOystein Eftevaag if (tcti_ctx == NULL) {
85*758e9fbaSOystein Eftevaag fprintf(stderr, "Allocation for tcti context failed: %s\n",
86*758e9fbaSOystein Eftevaag strerror(errno));
87*758e9fbaSOystein Eftevaag return NULL;
88*758e9fbaSOystein Eftevaag }
89*758e9fbaSOystein Eftevaag rc = Tss2_Tcti_Mssim_Init(tcti_ctx, &size, conf_str);
90*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
91*758e9fbaSOystein Eftevaag fprintf(stderr, "Failed to initialize tcti context: 0x%x\n", rc);
92*758e9fbaSOystein Eftevaag free(tcti_ctx);
93*758e9fbaSOystein Eftevaag return NULL;
94*758e9fbaSOystein Eftevaag }
95*758e9fbaSOystein Eftevaag return tcti_ctx;
96*758e9fbaSOystein Eftevaag }
97*758e9fbaSOystein Eftevaag #endif /* TCTI_MSSIM */
98*758e9fbaSOystein Eftevaag
99*758e9fbaSOystein Eftevaag #ifdef TCTI_FUZZING
100*758e9fbaSOystein Eftevaag /*
101*758e9fbaSOystein Eftevaag * Initialize a fuzzing TCTI instance using the provided options structure.
102*758e9fbaSOystein Eftevaag * The fuzzing_lengths.log file is the only configuration option used.
103*758e9fbaSOystein Eftevaag * The caller is returned a TCTI context structure that is allocated by this
104*758e9fbaSOystein Eftevaag * function. This structure must be freed by the caller.
105*758e9fbaSOystein Eftevaag */
106*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *
tcti_fuzzing_init()107*758e9fbaSOystein Eftevaag tcti_fuzzing_init()
108*758e9fbaSOystein Eftevaag {
109*758e9fbaSOystein Eftevaag size_t size;
110*758e9fbaSOystein Eftevaag TSS2_RC rc;
111*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tcti_ctx;
112*758e9fbaSOystein Eftevaag
113*758e9fbaSOystein Eftevaag rc = Tss2_Tcti_Fuzzing_Init(NULL, &size, NULL);
114*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
115*758e9fbaSOystein Eftevaag fprintf(stderr, "Faled to get allocation size for tcti context: "
116*758e9fbaSOystein Eftevaag "0x%x\n", rc);
117*758e9fbaSOystein Eftevaag return NULL;
118*758e9fbaSOystein Eftevaag }
119*758e9fbaSOystein Eftevaag tcti_ctx = (TSS2_TCTI_CONTEXT *) calloc(1, size);
120*758e9fbaSOystein Eftevaag if (tcti_ctx == NULL) {
121*758e9fbaSOystein Eftevaag fprintf(stderr, "Allocation for tcti context failed: %s\n",
122*758e9fbaSOystein Eftevaag strerror(errno));
123*758e9fbaSOystein Eftevaag return NULL;
124*758e9fbaSOystein Eftevaag }
125*758e9fbaSOystein Eftevaag rc = Tss2_Tcti_Fuzzing_Init(tcti_ctx, &size, NULL);
126*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
127*758e9fbaSOystein Eftevaag fprintf(stderr, "Failed to initialize tcti context: 0x%x\n", rc);
128*758e9fbaSOystein Eftevaag free(tcti_ctx);
129*758e9fbaSOystein Eftevaag return NULL;
130*758e9fbaSOystein Eftevaag }
131*758e9fbaSOystein Eftevaag return tcti_ctx;
132*758e9fbaSOystein Eftevaag }
133*758e9fbaSOystein Eftevaag #endif /* TCTI_FUZZING */
134*758e9fbaSOystein Eftevaag
135*758e9fbaSOystein Eftevaag /*
136*758e9fbaSOystein Eftevaag * Initialize a SAPI context using the TCTI context provided by the caller.
137*758e9fbaSOystein Eftevaag * This function allocates memory for the SAPI context and returns it to the
138*758e9fbaSOystein Eftevaag * caller. This memory must be freed by the caller.
139*758e9fbaSOystein Eftevaag */
140*758e9fbaSOystein Eftevaag TSS2_SYS_CONTEXT *
sapi_init_from_tcti_ctx(TSS2_TCTI_CONTEXT * tcti_ctx)141*758e9fbaSOystein Eftevaag sapi_init_from_tcti_ctx(TSS2_TCTI_CONTEXT * tcti_ctx)
142*758e9fbaSOystein Eftevaag {
143*758e9fbaSOystein Eftevaag TSS2_SYS_CONTEXT *sapi_ctx;
144*758e9fbaSOystein Eftevaag TSS2_RC rc;
145*758e9fbaSOystein Eftevaag size_t size;
146*758e9fbaSOystein Eftevaag TSS2_ABI_VERSION abi_version = {
147*758e9fbaSOystein Eftevaag .tssCreator = 1,
148*758e9fbaSOystein Eftevaag .tssFamily = 2,
149*758e9fbaSOystein Eftevaag .tssLevel = 1,
150*758e9fbaSOystein Eftevaag .tssVersion = 108,
151*758e9fbaSOystein Eftevaag };
152*758e9fbaSOystein Eftevaag
153*758e9fbaSOystein Eftevaag size = Tss2_Sys_GetContextSize(0);
154*758e9fbaSOystein Eftevaag sapi_ctx = (TSS2_SYS_CONTEXT *) calloc(1, size);
155*758e9fbaSOystein Eftevaag if (sapi_ctx == NULL) {
156*758e9fbaSOystein Eftevaag fprintf(stderr,
157*758e9fbaSOystein Eftevaag "Failed to allocate 0x%zx bytes for the SAPI context\n", size);
158*758e9fbaSOystein Eftevaag return NULL;
159*758e9fbaSOystein Eftevaag }
160*758e9fbaSOystein Eftevaag rc = Tss2_Sys_Initialize(sapi_ctx, size, tcti_ctx, &abi_version);
161*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
162*758e9fbaSOystein Eftevaag fprintf(stderr, "Failed to initialize SAPI context: 0x%x\n", rc);
163*758e9fbaSOystein Eftevaag free(sapi_ctx);
164*758e9fbaSOystein Eftevaag return NULL;
165*758e9fbaSOystein Eftevaag }
166*758e9fbaSOystein Eftevaag return sapi_ctx;
167*758e9fbaSOystein Eftevaag }
168*758e9fbaSOystein Eftevaag
169*758e9fbaSOystein Eftevaag /*
170*758e9fbaSOystein Eftevaag * Initialize a SAPI context to use a socket TCTI. Get configuration data from
171*758e9fbaSOystein Eftevaag * the provided structure.
172*758e9fbaSOystein Eftevaag */
173*758e9fbaSOystein Eftevaag TSS2_SYS_CONTEXT *
sapi_init_from_opts(test_opts_t * options)174*758e9fbaSOystein Eftevaag sapi_init_from_opts(test_opts_t * options)
175*758e9fbaSOystein Eftevaag {
176*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tcti_ctx;
177*758e9fbaSOystein Eftevaag TSS2_SYS_CONTEXT *sapi_ctx;
178*758e9fbaSOystein Eftevaag
179*758e9fbaSOystein Eftevaag tcti_ctx = tcti_init_from_opts(options);
180*758e9fbaSOystein Eftevaag if (tcti_ctx == NULL)
181*758e9fbaSOystein Eftevaag return NULL;
182*758e9fbaSOystein Eftevaag sapi_ctx = sapi_init_from_tcti_ctx(tcti_ctx);
183*758e9fbaSOystein Eftevaag if (sapi_ctx == NULL)
184*758e9fbaSOystein Eftevaag return NULL;
185*758e9fbaSOystein Eftevaag return sapi_ctx;
186*758e9fbaSOystein Eftevaag }
187*758e9fbaSOystein Eftevaag
188*758e9fbaSOystein Eftevaag /*
189*758e9fbaSOystein Eftevaag * Initialize a TSS2_TCTI_CONTEXT using whatever TCTI data is in the options
190*758e9fbaSOystein Eftevaag * structure. This is a mechanism that allows the calling application to be
191*758e9fbaSOystein Eftevaag * mostly ignorant of which TCTI they're creating / initializing.
192*758e9fbaSOystein Eftevaag */
193*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *
tcti_init_from_opts(test_opts_t * options)194*758e9fbaSOystein Eftevaag tcti_init_from_opts(test_opts_t * options)
195*758e9fbaSOystein Eftevaag {
196*758e9fbaSOystein Eftevaag switch (options->tcti_type) {
197*758e9fbaSOystein Eftevaag #ifdef TCTI_DEVICE
198*758e9fbaSOystein Eftevaag case DEVICE_TCTI:
199*758e9fbaSOystein Eftevaag return tcti_device_init(options->device_file);
200*758e9fbaSOystein Eftevaag #endif /* TCTI_DEVICE */
201*758e9fbaSOystein Eftevaag #ifdef TCTI_MSSIM
202*758e9fbaSOystein Eftevaag case SOCKET_TCTI:
203*758e9fbaSOystein Eftevaag return tcti_socket_init(options->socket_address, options->socket_port);
204*758e9fbaSOystein Eftevaag #endif /* TCTI_MSSIM */
205*758e9fbaSOystein Eftevaag #ifdef TCTI_FUZZING
206*758e9fbaSOystein Eftevaag case FUZZING_TCTI:
207*758e9fbaSOystein Eftevaag return tcti_fuzzing_init();
208*758e9fbaSOystein Eftevaag #endif /* TCTI_FUZZING */
209*758e9fbaSOystein Eftevaag default:
210*758e9fbaSOystein Eftevaag return NULL;
211*758e9fbaSOystein Eftevaag }
212*758e9fbaSOystein Eftevaag }
213*758e9fbaSOystein Eftevaag
214*758e9fbaSOystein Eftevaag /*
215*758e9fbaSOystein Eftevaag * Teardown / Finalize TCTI context and free memory.
216*758e9fbaSOystein Eftevaag */
217*758e9fbaSOystein Eftevaag void
tcti_teardown(TSS2_TCTI_CONTEXT * tcti_context)218*758e9fbaSOystein Eftevaag tcti_teardown(TSS2_TCTI_CONTEXT * tcti_context)
219*758e9fbaSOystein Eftevaag {
220*758e9fbaSOystein Eftevaag if (tcti_context) {
221*758e9fbaSOystein Eftevaag Tss2_Tcti_Finalize(tcti_context);
222*758e9fbaSOystein Eftevaag free(tcti_context);
223*758e9fbaSOystein Eftevaag }
224*758e9fbaSOystein Eftevaag }
225*758e9fbaSOystein Eftevaag
226*758e9fbaSOystein Eftevaag /*
227*758e9fbaSOystein Eftevaag * Teardown and free the resources associated with a SAPI context structure.
228*758e9fbaSOystein Eftevaag */
229*758e9fbaSOystein Eftevaag void
sapi_teardown(TSS2_SYS_CONTEXT * sapi_context)230*758e9fbaSOystein Eftevaag sapi_teardown(TSS2_SYS_CONTEXT * sapi_context)
231*758e9fbaSOystein Eftevaag {
232*758e9fbaSOystein Eftevaag Tss2_Sys_Finalize(sapi_context);
233*758e9fbaSOystein Eftevaag free(sapi_context);
234*758e9fbaSOystein Eftevaag }
235*758e9fbaSOystein Eftevaag
236*758e9fbaSOystein Eftevaag /*
237*758e9fbaSOystein Eftevaag * Teardown and free the resources associated with a SAPI context structure.
238*758e9fbaSOystein Eftevaag * This includes tearing down the TCTI as well.
239*758e9fbaSOystein Eftevaag */
240*758e9fbaSOystein Eftevaag void
sapi_teardown_full(TSS2_SYS_CONTEXT * sapi_context)241*758e9fbaSOystein Eftevaag sapi_teardown_full(TSS2_SYS_CONTEXT * sapi_context)
242*758e9fbaSOystein Eftevaag {
243*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tcti_context = NULL;
244*758e9fbaSOystein Eftevaag TSS2_RC rc;
245*758e9fbaSOystein Eftevaag
246*758e9fbaSOystein Eftevaag rc = Tss2_Sys_GetTctiContext(sapi_context, &tcti_context);
247*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS)
248*758e9fbaSOystein Eftevaag return;
249*758e9fbaSOystein Eftevaag
250*758e9fbaSOystein Eftevaag sapi_teardown(sapi_context);
251*758e9fbaSOystein Eftevaag tcti_teardown(tcti_context);
252*758e9fbaSOystein Eftevaag }
253