1*758e9fbaSOystein Eftevaag /* SPDX-License-Identifier: BSD-2-Clause */
2*758e9fbaSOystein Eftevaag /*******************************************************************************
3*758e9fbaSOystein Eftevaag * Copyright 2017-2018, Fraunhofer SIT sponsored by Infineon Technologies AG
4*758e9fbaSOystein Eftevaag * All rights reserved.
5*758e9fbaSOystein Eftevaag * Copyright 2019, Intel Corporation
6*758e9fbaSOystein Eftevaag * Copyright (c) 2019, Wind River Systems.
7*758e9fbaSOystein Eftevaag * All rights reserved.
8*758e9fbaSOystein Eftevaag *
9*758e9fbaSOystein Eftevaag * Redistribution and use in source and binary forms, with or without
10*758e9fbaSOystein Eftevaag * modification, are permitted provided that the following conditions are met:
11*758e9fbaSOystein Eftevaag *
12*758e9fbaSOystein Eftevaag * 1. Redistributions of source code must retain the above copyright notice,
13*758e9fbaSOystein Eftevaag * this list of conditions and the following disclaimer.
14*758e9fbaSOystein Eftevaag *
15*758e9fbaSOystein Eftevaag * 2. Redistributions in binary form must reproduce the above copyright notice,
16*758e9fbaSOystein Eftevaag * this list of conditions and the following disclaimer in the documentation
17*758e9fbaSOystein Eftevaag * and/or other materials provided with the distribution.
18*758e9fbaSOystein Eftevaag *
19*758e9fbaSOystein Eftevaag * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20*758e9fbaSOystein Eftevaag * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21*758e9fbaSOystein Eftevaag * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*758e9fbaSOystein Eftevaag * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23*758e9fbaSOystein Eftevaag * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*758e9fbaSOystein Eftevaag * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*758e9fbaSOystein Eftevaag * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*758e9fbaSOystein Eftevaag * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*758e9fbaSOystein Eftevaag * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*758e9fbaSOystein Eftevaag * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
29*758e9fbaSOystein Eftevaag * THE POSSIBILITY OF SUCH DAMAGE.
30*758e9fbaSOystein Eftevaag *******************************************************************************/
31*758e9fbaSOystein Eftevaag
32*758e9fbaSOystein Eftevaag #ifdef HAVE_CONFIG_H
33*758e9fbaSOystein Eftevaag #include <config.h>
34*758e9fbaSOystein Eftevaag #endif
35*758e9fbaSOystein Eftevaag
36*758e9fbaSOystein Eftevaag #include <stdlib.h>
37*758e9fbaSOystein Eftevaag #include <errno.h>
38*758e9fbaSOystein Eftevaag #include <string.h>
39*758e9fbaSOystein Eftevaag #include <inttypes.h>
40*758e9fbaSOystein Eftevaag
41*758e9fbaSOystein Eftevaag #include "tctildr.h"
42*758e9fbaSOystein Eftevaag #include "tss2_tcti_mssim.h"
43*758e9fbaSOystein Eftevaag #ifdef _WIN32
44*758e9fbaSOystein Eftevaag #include "tss2_tcti_tbs.h"
45*758e9fbaSOystein Eftevaag #else /* _WIN32 */
46*758e9fbaSOystein Eftevaag #include "tss2_tcti_device.h"
47*758e9fbaSOystein Eftevaag #endif
48*758e9fbaSOystein Eftevaag #define LOGMODULE tcti
49*758e9fbaSOystein Eftevaag #include "util/log.h"
50*758e9fbaSOystein Eftevaag
51*758e9fbaSOystein Eftevaag #define ARRAY_SIZE(X) (sizeof(X)/sizeof(X[0]))
52*758e9fbaSOystein Eftevaag #define NAME_ARRAY_SIZE 3
53*758e9fbaSOystein Eftevaag
54*758e9fbaSOystein Eftevaag struct {
55*758e9fbaSOystein Eftevaag const char *names [NAME_ARRAY_SIZE];
56*758e9fbaSOystein Eftevaag TSS2_TCTI_INIT_FUNC init;
57*758e9fbaSOystein Eftevaag char *conf;
58*758e9fbaSOystein Eftevaag char *description;
59*758e9fbaSOystein Eftevaag } tctis [] = {
60*758e9fbaSOystein Eftevaag #if defined(_WIN32) && !defined(__MINGW32__)
61*758e9fbaSOystein Eftevaag {
62*758e9fbaSOystein Eftevaag .names = {
63*758e9fbaSOystein Eftevaag "libtss2-tcti-tbs.so.0",
64*758e9fbaSOystein Eftevaag "libtss2-tcti-tbs.so",
65*758e9fbaSOystein Eftevaag "tbs",
66*758e9fbaSOystein Eftevaag },
67*758e9fbaSOystein Eftevaag .init = Tss2_Tcti_Tbs_Init,
68*758e9fbaSOystein Eftevaag .description = "Access to TBS",
69*758e9fbaSOystein Eftevaag },
70*758e9fbaSOystein Eftevaag #elif defined (__VXWORKS__)
71*758e9fbaSOystein Eftevaag {
72*758e9fbaSOystein Eftevaag .names = {
73*758e9fbaSOystein Eftevaag "libtss2-tcti-device.so.0",
74*758e9fbaSOystein Eftevaag "libtss2-tcti-device.so",
75*758e9fbaSOystein Eftevaag "device",
76*758e9fbaSOystein Eftevaag },
77*758e9fbaSOystein Eftevaag .init = Tss2_Tcti_Device_Init,
78*758e9fbaSOystein Eftevaag .conf = "/tpm0",
79*758e9fbaSOystein Eftevaag .description = "Access to /tpm0",
80*758e9fbaSOystein Eftevaag },
81*758e9fbaSOystein Eftevaag #else /* _WIN32 */
82*758e9fbaSOystein Eftevaag #ifdef TCTI_DEVICE
83*758e9fbaSOystein Eftevaag {
84*758e9fbaSOystein Eftevaag .names = {
85*758e9fbaSOystein Eftevaag "libtss2-tcti-device.so.0",
86*758e9fbaSOystein Eftevaag "libtss2-tcti-device.so",
87*758e9fbaSOystein Eftevaag "device",
88*758e9fbaSOystein Eftevaag },
89*758e9fbaSOystein Eftevaag .init = Tss2_Tcti_Device_Init,
90*758e9fbaSOystein Eftevaag .conf = "/dev/tpmrm0",
91*758e9fbaSOystein Eftevaag .description = "Access to /dev/tpmrm0",
92*758e9fbaSOystein Eftevaag },
93*758e9fbaSOystein Eftevaag {
94*758e9fbaSOystein Eftevaag .names = {
95*758e9fbaSOystein Eftevaag "libtss2-tcti-device.so.0",
96*758e9fbaSOystein Eftevaag "libtss2-tcti-device.so",
97*758e9fbaSOystein Eftevaag "device",
98*758e9fbaSOystein Eftevaag },
99*758e9fbaSOystein Eftevaag .init = Tss2_Tcti_Device_Init,
100*758e9fbaSOystein Eftevaag .conf = "/dev/tpm0",
101*758e9fbaSOystein Eftevaag .description = "Access to /dev/tpm0",
102*758e9fbaSOystein Eftevaag },
103*758e9fbaSOystein Eftevaag #endif /* TCTI_DEVICE */
104*758e9fbaSOystein Eftevaag #endif /* _WIN32 */
105*758e9fbaSOystein Eftevaag #ifdef TCTI_MSSIM
106*758e9fbaSOystein Eftevaag {
107*758e9fbaSOystein Eftevaag .names = {
108*758e9fbaSOystein Eftevaag "libtss2-tcti-mssim.so.0",
109*758e9fbaSOystein Eftevaag "libtss2-tcti-mssim.so",
110*758e9fbaSOystein Eftevaag "mssim",
111*758e9fbaSOystein Eftevaag },
112*758e9fbaSOystein Eftevaag .init = Tss2_Tcti_Mssim_Init,
113*758e9fbaSOystein Eftevaag .description = "Access to simulator using MS protocol, default conf",
114*758e9fbaSOystein Eftevaag },
115*758e9fbaSOystein Eftevaag #endif /* TCTI_MSSIM */
116*758e9fbaSOystein Eftevaag };
117*758e9fbaSOystein Eftevaag TSS2_RC
tctildr_get_default(TSS2_TCTI_CONTEXT ** tcticontext,void ** dlhandle)118*758e9fbaSOystein Eftevaag tctildr_get_default(TSS2_TCTI_CONTEXT ** tcticontext, void **dlhandle)
119*758e9fbaSOystein Eftevaag {
120*758e9fbaSOystein Eftevaag TSS2_RC rc;
121*758e9fbaSOystein Eftevaag
122*758e9fbaSOystein Eftevaag (void)dlhandle;
123*758e9fbaSOystein Eftevaag if (tcticontext == NULL) {
124*758e9fbaSOystein Eftevaag LOG_ERROR("tcticontext must not be NULL");
125*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_BAD_REFERENCE;
126*758e9fbaSOystein Eftevaag }
127*758e9fbaSOystein Eftevaag *tcticontext = NULL;
128*758e9fbaSOystein Eftevaag
129*758e9fbaSOystein Eftevaag for (size_t i = 0; i < ARRAY_SIZE(tctis); i++) {
130*758e9fbaSOystein Eftevaag LOG_DEBUG("Attempting to connect using standard TCTI: %s",
131*758e9fbaSOystein Eftevaag tctis[i].description);
132*758e9fbaSOystein Eftevaag rc = tcti_from_init (tctis[i].init,
133*758e9fbaSOystein Eftevaag tctis[i].conf,
134*758e9fbaSOystein Eftevaag tcticontext);
135*758e9fbaSOystein Eftevaag if (rc == TSS2_RC_SUCCESS)
136*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
137*758e9fbaSOystein Eftevaag LOG_DEBUG("Failed to load standard TCTI number %zu", i);
138*758e9fbaSOystein Eftevaag }
139*758e9fbaSOystein Eftevaag
140*758e9fbaSOystein Eftevaag LOG_ERROR("No standard TCTI could be loaded");
141*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_IO_ERROR;
142*758e9fbaSOystein Eftevaag }
143*758e9fbaSOystein Eftevaag TSS2_RC
tctildr_get_tcti(const char * name,const char * conf,TSS2_TCTI_CONTEXT ** tcti,void ** data)144*758e9fbaSOystein Eftevaag tctildr_get_tcti (const char *name,
145*758e9fbaSOystein Eftevaag const char* conf,
146*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT **tcti,
147*758e9fbaSOystein Eftevaag void **data)
148*758e9fbaSOystein Eftevaag {
149*758e9fbaSOystein Eftevaag TSS2_RC rc;
150*758e9fbaSOystein Eftevaag
151*758e9fbaSOystein Eftevaag if (tcti == NULL) {
152*758e9fbaSOystein Eftevaag LOG_ERROR("tcticontext must not be NULL");
153*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_BAD_REFERENCE;
154*758e9fbaSOystein Eftevaag }
155*758e9fbaSOystein Eftevaag *tcti = NULL;
156*758e9fbaSOystein Eftevaag if (name == NULL) {
157*758e9fbaSOystein Eftevaag return tctildr_get_default (tcti, data);
158*758e9fbaSOystein Eftevaag }
159*758e9fbaSOystein Eftevaag
160*758e9fbaSOystein Eftevaag for (size_t i = 0; i < ARRAY_SIZE(tctis); ++i) {
161*758e9fbaSOystein Eftevaag for (size_t j = 0; j < NAME_ARRAY_SIZE; ++j) {
162*758e9fbaSOystein Eftevaag if (strcmp (name, tctis[i].names[j]))
163*758e9fbaSOystein Eftevaag continue;
164*758e9fbaSOystein Eftevaag LOG_DEBUG("initializing TCTI with name \"%s\"",
165*758e9fbaSOystein Eftevaag tctis[i].names[j]);
166*758e9fbaSOystein Eftevaag rc = tcti_from_init (tctis[i].init, conf, tcti);
167*758e9fbaSOystein Eftevaag if (rc == TSS2_RC_SUCCESS)
168*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
169*758e9fbaSOystein Eftevaag }
170*758e9fbaSOystein Eftevaag }
171*758e9fbaSOystein Eftevaag LOG_ERROR("Unable to initialize TCTI with name: \"%s\"", name);
172*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_IO_ERROR;
173*758e9fbaSOystein Eftevaag }
174*758e9fbaSOystein Eftevaag
175*758e9fbaSOystein Eftevaag void
tctildr_finalize_data(void ** data)176*758e9fbaSOystein Eftevaag tctildr_finalize_data(void **data)
177*758e9fbaSOystein Eftevaag {
178*758e9fbaSOystein Eftevaag (void)data;
179*758e9fbaSOystein Eftevaag return;
180*758e9fbaSOystein Eftevaag }
181*758e9fbaSOystein Eftevaag
182*758e9fbaSOystein Eftevaag TSS2_RC
tctildr_get_info(const char * name,const TSS2_TCTI_INFO ** info,void ** data)183*758e9fbaSOystein Eftevaag tctildr_get_info (const char *name,
184*758e9fbaSOystein Eftevaag const TSS2_TCTI_INFO **info,
185*758e9fbaSOystein Eftevaag void **data)
186*758e9fbaSOystein Eftevaag {
187*758e9fbaSOystein Eftevaag (void)name;
188*758e9fbaSOystein Eftevaag (void)info;
189*758e9fbaSOystein Eftevaag (void)data;
190*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_NOT_SUPPORTED;
191*758e9fbaSOystein Eftevaag }
192