1*758e9fbaSOystein Eftevaag /* SPDX-License-Identifier: BSD-2-Clause */
2*758e9fbaSOystein Eftevaag /*
3*758e9fbaSOystein Eftevaag * Copyright (c) 2015 - 2018 Intel Corporation
4*758e9fbaSOystein Eftevaag * All rights reserved.
5*758e9fbaSOystein Eftevaag */
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 <limits.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 #ifndef _WIN32
18*758e9fbaSOystein Eftevaag #include <sys/time.h>
19*758e9fbaSOystein Eftevaag #include <unistd.h>
20*758e9fbaSOystein Eftevaag #endif
21*758e9fbaSOystein Eftevaag
22*758e9fbaSOystein Eftevaag #include "tss2_mu.h"
23*758e9fbaSOystein Eftevaag #include "tss2_tcti_mssim.h"
24*758e9fbaSOystein Eftevaag
25*758e9fbaSOystein Eftevaag #include "tcti-mssim.h"
26*758e9fbaSOystein Eftevaag #include "tcti-common.h"
27*758e9fbaSOystein Eftevaag #include "util/key-value-parse.h"
28*758e9fbaSOystein Eftevaag #define LOGMODULE tcti
29*758e9fbaSOystein Eftevaag #include "util/log.h"
30*758e9fbaSOystein Eftevaag
31*758e9fbaSOystein Eftevaag /*
32*758e9fbaSOystein Eftevaag * This function wraps the "up-cast" of the opaque TCTI context type to the
33*758e9fbaSOystein Eftevaag * type for the mssim TCTI context. The only safeguard we have to ensure this
34*758e9fbaSOystein Eftevaag * operation is possible is the magic number in the mssim TCTI context.
35*758e9fbaSOystein Eftevaag * If passed a NULL context, or the magic number check fails, this function
36*758e9fbaSOystein Eftevaag * will return NULL.
37*758e9fbaSOystein Eftevaag */
38*758e9fbaSOystein Eftevaag TSS2_TCTI_MSSIM_CONTEXT*
tcti_mssim_context_cast(TSS2_TCTI_CONTEXT * tcti_ctx)39*758e9fbaSOystein Eftevaag tcti_mssim_context_cast (TSS2_TCTI_CONTEXT *tcti_ctx)
40*758e9fbaSOystein Eftevaag {
41*758e9fbaSOystein Eftevaag if (tcti_ctx != NULL && TSS2_TCTI_MAGIC (tcti_ctx) == TCTI_MSSIM_MAGIC) {
42*758e9fbaSOystein Eftevaag return (TSS2_TCTI_MSSIM_CONTEXT*)tcti_ctx;
43*758e9fbaSOystein Eftevaag }
44*758e9fbaSOystein Eftevaag return NULL;
45*758e9fbaSOystein Eftevaag }
46*758e9fbaSOystein Eftevaag /*
47*758e9fbaSOystein Eftevaag * This function down-casts the mssim TCTI context to the common context
48*758e9fbaSOystein Eftevaag * defined in the tcti-common module.
49*758e9fbaSOystein Eftevaag */
50*758e9fbaSOystein Eftevaag TSS2_TCTI_COMMON_CONTEXT*
tcti_mssim_down_cast(TSS2_TCTI_MSSIM_CONTEXT * tcti_mssim)51*758e9fbaSOystein Eftevaag tcti_mssim_down_cast (TSS2_TCTI_MSSIM_CONTEXT *tcti_mssim)
52*758e9fbaSOystein Eftevaag {
53*758e9fbaSOystein Eftevaag if (tcti_mssim == NULL) {
54*758e9fbaSOystein Eftevaag return NULL;
55*758e9fbaSOystein Eftevaag }
56*758e9fbaSOystein Eftevaag return &tcti_mssim->common;
57*758e9fbaSOystein Eftevaag }
58*758e9fbaSOystein Eftevaag /*
59*758e9fbaSOystein Eftevaag * This function is for sending one of the MS_SIM_* platform commands to the
60*758e9fbaSOystein Eftevaag * Microsoft TPM2 simulator. These are sent over the platform socket.
61*758e9fbaSOystein Eftevaag */
tcti_platform_command(TSS2_TCTI_CONTEXT * tctiContext,UINT32 cmd)62*758e9fbaSOystein Eftevaag TSS2_RC tcti_platform_command (
63*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tctiContext,
64*758e9fbaSOystein Eftevaag UINT32 cmd)
65*758e9fbaSOystein Eftevaag {
66*758e9fbaSOystein Eftevaag TSS2_TCTI_MSSIM_CONTEXT *tcti_mssim = tcti_mssim_context_cast (tctiContext);
67*758e9fbaSOystein Eftevaag uint8_t buf [sizeof (cmd)] = { 0 };
68*758e9fbaSOystein Eftevaag UINT32 rsp = 0;
69*758e9fbaSOystein Eftevaag TSS2_RC rc = TSS2_RC_SUCCESS;
70*758e9fbaSOystein Eftevaag int ret;
71*758e9fbaSOystein Eftevaag ssize_t read_ret;
72*758e9fbaSOystein Eftevaag
73*758e9fbaSOystein Eftevaag if (tcti_mssim == NULL) {
74*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_BAD_CONTEXT;
75*758e9fbaSOystein Eftevaag }
76*758e9fbaSOystein Eftevaag rc = Tss2_MU_UINT32_Marshal (cmd, buf, sizeof (cmd), NULL);
77*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
78*758e9fbaSOystein Eftevaag LOG_ERROR ("Failed to marshal platform command %" PRIu32 ", rc: 0x%"
79*758e9fbaSOystein Eftevaag PRIx32, cmd, rc);
80*758e9fbaSOystein Eftevaag return rc;
81*758e9fbaSOystein Eftevaag }
82*758e9fbaSOystein Eftevaag
83*758e9fbaSOystein Eftevaag LOGBLOB_DEBUG(buf, sizeof (cmd), "Sending %zu bytes to socket %" PRIu32
84*758e9fbaSOystein Eftevaag ":", sizeof (cmd), tcti_mssim->platform_sock);
85*758e9fbaSOystein Eftevaag ret = write_all (tcti_mssim->platform_sock, buf, sizeof (cmd));
86*758e9fbaSOystein Eftevaag if (ret < (ssize_t) sizeof (cmd)) {
87*758e9fbaSOystein Eftevaag LOG_ERROR("Failed to send platform command %d with error: %d",
88*758e9fbaSOystein Eftevaag cmd, ret);
89*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_IO_ERROR;
90*758e9fbaSOystein Eftevaag }
91*758e9fbaSOystein Eftevaag
92*758e9fbaSOystein Eftevaag #ifdef _WIN32
93*758e9fbaSOystein Eftevaag read_ret = recv (tcti_mssim->platform_sock, (char *) buf, sizeof (buf), 0);
94*758e9fbaSOystein Eftevaag if (read_ret < (ssize_t) sizeof (buf)) {
95*758e9fbaSOystein Eftevaag LOG_ERROR ("Failed to get response to platform command, errno %d: %s",
96*758e9fbaSOystein Eftevaag WSAGetLastError(), strerror (WSAGetLastError()));
97*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_IO_ERROR;
98*758e9fbaSOystein Eftevaag }
99*758e9fbaSOystein Eftevaag #else
100*758e9fbaSOystein Eftevaag read_ret = read(tcti_mssim->platform_sock, buf, sizeof (buf));
101*758e9fbaSOystein Eftevaag if (read_ret < (ssize_t) sizeof (buf)) {
102*758e9fbaSOystein Eftevaag LOG_ERROR ("Failed to get response to platform command, errno %d: %s",
103*758e9fbaSOystein Eftevaag errno, strerror (errno));
104*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_IO_ERROR;
105*758e9fbaSOystein Eftevaag }
106*758e9fbaSOystein Eftevaag #endif
107*758e9fbaSOystein Eftevaag LOGBLOB_DEBUG (buf, sizeof (buf), "Received %zu bytes from socket 0x%"
108*758e9fbaSOystein Eftevaag PRIx32 ":", read_ret, tcti_mssim->platform_sock);
109*758e9fbaSOystein Eftevaag rc = Tss2_MU_UINT32_Unmarshal (buf, sizeof (rsp), NULL, &rsp);
110*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
111*758e9fbaSOystein Eftevaag LOG_ERROR ("Failed to unmarshal response to platform command. rc: 0x%"
112*758e9fbaSOystein Eftevaag PRIx32, rc);
113*758e9fbaSOystein Eftevaag return rc;
114*758e9fbaSOystein Eftevaag }
115*758e9fbaSOystein Eftevaag if (rsp != 0) {
116*758e9fbaSOystein Eftevaag LOG_INFO ("Platform command failed with error: %" PRIu32, rsp);
117*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_IO_ERROR;
118*758e9fbaSOystein Eftevaag }
119*758e9fbaSOystein Eftevaag return rc;
120*758e9fbaSOystein Eftevaag }
121*758e9fbaSOystein Eftevaag /*
122*758e9fbaSOystein Eftevaag * This function sends the special TPM_SESSION_END message over the provided
123*758e9fbaSOystein Eftevaag * socket.
124*758e9fbaSOystein Eftevaag */
125*758e9fbaSOystein Eftevaag TSS2_RC
send_sim_session_end(SOCKET sock)126*758e9fbaSOystein Eftevaag send_sim_session_end (
127*758e9fbaSOystein Eftevaag SOCKET sock)
128*758e9fbaSOystein Eftevaag {
129*758e9fbaSOystein Eftevaag uint8_t buf [4] = { 0, };
130*758e9fbaSOystein Eftevaag TSS2_RC rc;
131*758e9fbaSOystein Eftevaag
132*758e9fbaSOystein Eftevaag rc = Tss2_MU_UINT32_Marshal (TPM_SESSION_END, buf, sizeof (buf), NULL);
133*758e9fbaSOystein Eftevaag if (rc == TSS2_RC_SUCCESS) {
134*758e9fbaSOystein Eftevaag return rc;
135*758e9fbaSOystein Eftevaag }
136*758e9fbaSOystein Eftevaag return socket_xmit_buf (sock, buf, sizeof (buf));
137*758e9fbaSOystein Eftevaag }
138*758e9fbaSOystein Eftevaag
139*758e9fbaSOystein Eftevaag /*
140*758e9fbaSOystein Eftevaag * This function is used to send the simulator a sort of command message
141*758e9fbaSOystein Eftevaag * that tells it we're about to send it a TPM command. This requires that
142*758e9fbaSOystein Eftevaag * we first send it a 4 byte code that's defined by the simulator. Then
143*758e9fbaSOystein Eftevaag * another byte identifying the locality and finally the size of the TPM
144*758e9fbaSOystein Eftevaag * command buffer that we're about to send. After these 9 bytes are sent
145*758e9fbaSOystein Eftevaag * the simulator will accept a TPM command buffer.
146*758e9fbaSOystein Eftevaag */
147*758e9fbaSOystein Eftevaag #define SIM_CMD_SIZE (sizeof (UINT32) + sizeof (UINT8) + sizeof (UINT32))
148*758e9fbaSOystein Eftevaag TSS2_RC
send_sim_cmd_setup(TSS2_TCTI_MSSIM_CONTEXT * tcti_mssim,UINT32 size)149*758e9fbaSOystein Eftevaag send_sim_cmd_setup (
150*758e9fbaSOystein Eftevaag TSS2_TCTI_MSSIM_CONTEXT *tcti_mssim,
151*758e9fbaSOystein Eftevaag UINT32 size)
152*758e9fbaSOystein Eftevaag {
153*758e9fbaSOystein Eftevaag TSS2_TCTI_COMMON_CONTEXT *tcti_common = tcti_mssim_down_cast (tcti_mssim);
154*758e9fbaSOystein Eftevaag uint8_t buf [SIM_CMD_SIZE] = { 0 };
155*758e9fbaSOystein Eftevaag size_t offset = 0;
156*758e9fbaSOystein Eftevaag TSS2_RC rc;
157*758e9fbaSOystein Eftevaag
158*758e9fbaSOystein Eftevaag rc = Tss2_MU_UINT32_Marshal (MS_SIM_TPM_SEND_COMMAND,
159*758e9fbaSOystein Eftevaag buf,
160*758e9fbaSOystein Eftevaag sizeof (buf),
161*758e9fbaSOystein Eftevaag &offset);
162*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
163*758e9fbaSOystein Eftevaag return rc;
164*758e9fbaSOystein Eftevaag }
165*758e9fbaSOystein Eftevaag
166*758e9fbaSOystein Eftevaag rc = Tss2_MU_UINT8_Marshal (tcti_common->locality,
167*758e9fbaSOystein Eftevaag buf,
168*758e9fbaSOystein Eftevaag sizeof (buf),
169*758e9fbaSOystein Eftevaag &offset);
170*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
171*758e9fbaSOystein Eftevaag return rc;
172*758e9fbaSOystein Eftevaag }
173*758e9fbaSOystein Eftevaag
174*758e9fbaSOystein Eftevaag rc = Tss2_MU_UINT32_Marshal (size, buf, sizeof (buf), &offset);
175*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
176*758e9fbaSOystein Eftevaag return rc;
177*758e9fbaSOystein Eftevaag }
178*758e9fbaSOystein Eftevaag
179*758e9fbaSOystein Eftevaag return socket_xmit_buf (tcti_mssim->tpm_sock, buf, sizeof (buf));
180*758e9fbaSOystein Eftevaag }
181*758e9fbaSOystein Eftevaag
182*758e9fbaSOystein Eftevaag TSS2_RC
tcti_mssim_transmit(TSS2_TCTI_CONTEXT * tcti_ctx,size_t size,const uint8_t * cmd_buf)183*758e9fbaSOystein Eftevaag tcti_mssim_transmit (
184*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tcti_ctx,
185*758e9fbaSOystein Eftevaag size_t size,
186*758e9fbaSOystein Eftevaag const uint8_t *cmd_buf)
187*758e9fbaSOystein Eftevaag {
188*758e9fbaSOystein Eftevaag TSS2_TCTI_MSSIM_CONTEXT *tcti_mssim = tcti_mssim_context_cast (tcti_ctx);
189*758e9fbaSOystein Eftevaag TSS2_TCTI_COMMON_CONTEXT *tcti_common = tcti_mssim_down_cast (tcti_mssim);
190*758e9fbaSOystein Eftevaag tpm_header_t header;
191*758e9fbaSOystein Eftevaag TSS2_RC rc;
192*758e9fbaSOystein Eftevaag
193*758e9fbaSOystein Eftevaag if (tcti_mssim == NULL) {
194*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_BAD_CONTEXT;
195*758e9fbaSOystein Eftevaag }
196*758e9fbaSOystein Eftevaag rc = tcti_common_transmit_checks (tcti_common, cmd_buf);
197*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
198*758e9fbaSOystein Eftevaag return rc;
199*758e9fbaSOystein Eftevaag }
200*758e9fbaSOystein Eftevaag rc = header_unmarshal (cmd_buf, &header);
201*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
202*758e9fbaSOystein Eftevaag return rc;
203*758e9fbaSOystein Eftevaag }
204*758e9fbaSOystein Eftevaag if (header.size != size) {
205*758e9fbaSOystein Eftevaag LOG_ERROR ("Buffer size parameter: %zu, and TPM2 command header size "
206*758e9fbaSOystein Eftevaag "field: %" PRIu32 " disagree.", size, header.size);
207*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_BAD_VALUE;
208*758e9fbaSOystein Eftevaag }
209*758e9fbaSOystein Eftevaag
210*758e9fbaSOystein Eftevaag LOG_DEBUG ("Sending command with TPM_CC 0x%" PRIx32 " and size %" PRIu32,
211*758e9fbaSOystein Eftevaag header.code, header.size);
212*758e9fbaSOystein Eftevaag rc = send_sim_cmd_setup (tcti_mssim, header.size);
213*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
214*758e9fbaSOystein Eftevaag return rc;
215*758e9fbaSOystein Eftevaag }
216*758e9fbaSOystein Eftevaag rc = socket_xmit_buf (tcti_mssim->tpm_sock, cmd_buf, size);
217*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
218*758e9fbaSOystein Eftevaag return rc;
219*758e9fbaSOystein Eftevaag }
220*758e9fbaSOystein Eftevaag
221*758e9fbaSOystein Eftevaag tcti_common->state = TCTI_STATE_RECEIVE;
222*758e9fbaSOystein Eftevaag
223*758e9fbaSOystein Eftevaag return rc;
224*758e9fbaSOystein Eftevaag }
225*758e9fbaSOystein Eftevaag
226*758e9fbaSOystein Eftevaag TSS2_RC
tcti_mssim_cancel(TSS2_TCTI_CONTEXT * tctiContext)227*758e9fbaSOystein Eftevaag tcti_mssim_cancel (
228*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tctiContext)
229*758e9fbaSOystein Eftevaag {
230*758e9fbaSOystein Eftevaag TSS2_TCTI_MSSIM_CONTEXT *tcti_mssim = tcti_mssim_context_cast (tctiContext);
231*758e9fbaSOystein Eftevaag TSS2_TCTI_COMMON_CONTEXT *tcti_common = tcti_mssim_down_cast (tcti_mssim);
232*758e9fbaSOystein Eftevaag TSS2_RC rc;
233*758e9fbaSOystein Eftevaag
234*758e9fbaSOystein Eftevaag if (tcti_mssim == NULL) {
235*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_BAD_CONTEXT;
236*758e9fbaSOystein Eftevaag }
237*758e9fbaSOystein Eftevaag rc = tcti_common_cancel_checks (tcti_common);
238*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
239*758e9fbaSOystein Eftevaag return rc;
240*758e9fbaSOystein Eftevaag }
241*758e9fbaSOystein Eftevaag rc = tcti_platform_command (tctiContext, MS_SIM_CANCEL_ON);
242*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
243*758e9fbaSOystein Eftevaag return rc;
244*758e9fbaSOystein Eftevaag }
245*758e9fbaSOystein Eftevaag
246*758e9fbaSOystein Eftevaag tcti_common->state = TCTI_STATE_TRANSMIT;
247*758e9fbaSOystein Eftevaag tcti_mssim->cancel = 1;
248*758e9fbaSOystein Eftevaag
249*758e9fbaSOystein Eftevaag return rc;
250*758e9fbaSOystein Eftevaag }
251*758e9fbaSOystein Eftevaag
252*758e9fbaSOystein Eftevaag TSS2_RC
tcti_mssim_set_locality(TSS2_TCTI_CONTEXT * tctiContext,uint8_t locality)253*758e9fbaSOystein Eftevaag tcti_mssim_set_locality (
254*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tctiContext,
255*758e9fbaSOystein Eftevaag uint8_t locality)
256*758e9fbaSOystein Eftevaag {
257*758e9fbaSOystein Eftevaag TSS2_TCTI_MSSIM_CONTEXT *tcti_mssim = tcti_mssim_context_cast (tctiContext);
258*758e9fbaSOystein Eftevaag TSS2_TCTI_COMMON_CONTEXT *tcti_common = tcti_mssim_down_cast (tcti_mssim);
259*758e9fbaSOystein Eftevaag TSS2_RC rc;
260*758e9fbaSOystein Eftevaag
261*758e9fbaSOystein Eftevaag if (tcti_mssim == NULL) {
262*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_BAD_CONTEXT;
263*758e9fbaSOystein Eftevaag }
264*758e9fbaSOystein Eftevaag rc = tcti_common_set_locality_checks (tcti_common);
265*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
266*758e9fbaSOystein Eftevaag return rc;
267*758e9fbaSOystein Eftevaag }
268*758e9fbaSOystein Eftevaag
269*758e9fbaSOystein Eftevaag tcti_common->locality = locality;
270*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
271*758e9fbaSOystein Eftevaag }
272*758e9fbaSOystein Eftevaag
273*758e9fbaSOystein Eftevaag TSS2_RC
tcti_mssim_get_poll_handles(TSS2_TCTI_CONTEXT * tctiContext,TSS2_TCTI_POLL_HANDLE * handles,size_t * num_handles)274*758e9fbaSOystein Eftevaag tcti_mssim_get_poll_handles (
275*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tctiContext,
276*758e9fbaSOystein Eftevaag TSS2_TCTI_POLL_HANDLE *handles,
277*758e9fbaSOystein Eftevaag size_t *num_handles)
278*758e9fbaSOystein Eftevaag {
279*758e9fbaSOystein Eftevaag (void)(tctiContext);
280*758e9fbaSOystein Eftevaag (void)(handles);
281*758e9fbaSOystein Eftevaag (void)(num_handles);
282*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_NOT_IMPLEMENTED;
283*758e9fbaSOystein Eftevaag }
284*758e9fbaSOystein Eftevaag
285*758e9fbaSOystein Eftevaag void
tcti_mssim_finalize(TSS2_TCTI_CONTEXT * tctiContext)286*758e9fbaSOystein Eftevaag tcti_mssim_finalize(
287*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tctiContext)
288*758e9fbaSOystein Eftevaag {
289*758e9fbaSOystein Eftevaag TSS2_TCTI_MSSIM_CONTEXT *tcti_mssim = tcti_mssim_context_cast (tctiContext);
290*758e9fbaSOystein Eftevaag
291*758e9fbaSOystein Eftevaag if (tcti_mssim == NULL) {
292*758e9fbaSOystein Eftevaag return;
293*758e9fbaSOystein Eftevaag }
294*758e9fbaSOystein Eftevaag send_sim_session_end (tcti_mssim->platform_sock);
295*758e9fbaSOystein Eftevaag send_sim_session_end (tcti_mssim->tpm_sock);
296*758e9fbaSOystein Eftevaag socket_close (&tcti_mssim->platform_sock);
297*758e9fbaSOystein Eftevaag socket_close (&tcti_mssim->tpm_sock);
298*758e9fbaSOystein Eftevaag }
299*758e9fbaSOystein Eftevaag
300*758e9fbaSOystein Eftevaag TSS2_RC
tcti_mssim_receive(TSS2_TCTI_CONTEXT * tctiContext,size_t * response_size,unsigned char * response_buffer,int32_t timeout)301*758e9fbaSOystein Eftevaag tcti_mssim_receive (
302*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tctiContext,
303*758e9fbaSOystein Eftevaag size_t *response_size,
304*758e9fbaSOystein Eftevaag unsigned char *response_buffer,
305*758e9fbaSOystein Eftevaag int32_t timeout)
306*758e9fbaSOystein Eftevaag {
307*758e9fbaSOystein Eftevaag #ifdef TEST_FAPI_ASYNC
308*758e9fbaSOystein Eftevaag /* Used for simulating a timeout. */
309*758e9fbaSOystein Eftevaag static int wait = 0;
310*758e9fbaSOystein Eftevaag #endif
311*758e9fbaSOystein Eftevaag TSS2_TCTI_MSSIM_CONTEXT *tcti_mssim = tcti_mssim_context_cast (tctiContext);
312*758e9fbaSOystein Eftevaag TSS2_TCTI_COMMON_CONTEXT *tcti_common = tcti_mssim_down_cast (tcti_mssim);
313*758e9fbaSOystein Eftevaag TSS2_RC rc;
314*758e9fbaSOystein Eftevaag UINT32 trash;
315*758e9fbaSOystein Eftevaag int ret;
316*758e9fbaSOystein Eftevaag
317*758e9fbaSOystein Eftevaag if (tcti_mssim == NULL) {
318*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_BAD_CONTEXT;
319*758e9fbaSOystein Eftevaag }
320*758e9fbaSOystein Eftevaag rc = tcti_common_receive_checks (tcti_common, response_size);
321*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
322*758e9fbaSOystein Eftevaag return rc;
323*758e9fbaSOystein Eftevaag }
324*758e9fbaSOystein Eftevaag
325*758e9fbaSOystein Eftevaag if (timeout != TSS2_TCTI_TIMEOUT_BLOCK) {
326*758e9fbaSOystein Eftevaag LOG_TRACE("Asynchronous I/O not actually implemented.");
327*758e9fbaSOystein Eftevaag #ifdef TEST_FAPI_ASYNC
328*758e9fbaSOystein Eftevaag if (wait < 1) {
329*758e9fbaSOystein Eftevaag LOG_TRACE("Simulating Async by requesting another invocation.");
330*758e9fbaSOystein Eftevaag wait += 1;
331*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_TRY_AGAIN;
332*758e9fbaSOystein Eftevaag } else {
333*758e9fbaSOystein Eftevaag LOG_TRACE("Sending the actual result.");
334*758e9fbaSOystein Eftevaag wait = 0;
335*758e9fbaSOystein Eftevaag }
336*758e9fbaSOystein Eftevaag #endif /* TEST_FAPI_ASYNC */
337*758e9fbaSOystein Eftevaag }
338*758e9fbaSOystein Eftevaag
339*758e9fbaSOystein Eftevaag if (tcti_common->header.size == 0) {
340*758e9fbaSOystein Eftevaag /* Receive the size of the response. */
341*758e9fbaSOystein Eftevaag uint8_t size_buf [sizeof (UINT32)];
342*758e9fbaSOystein Eftevaag ret = socket_recv_buf (tcti_mssim->tpm_sock, size_buf, sizeof (UINT32));
343*758e9fbaSOystein Eftevaag if (ret != sizeof (UINT32)) {
344*758e9fbaSOystein Eftevaag rc = TSS2_TCTI_RC_IO_ERROR;
345*758e9fbaSOystein Eftevaag goto out;
346*758e9fbaSOystein Eftevaag }
347*758e9fbaSOystein Eftevaag
348*758e9fbaSOystein Eftevaag rc = Tss2_MU_UINT32_Unmarshal (size_buf,
349*758e9fbaSOystein Eftevaag sizeof (size_buf),
350*758e9fbaSOystein Eftevaag 0,
351*758e9fbaSOystein Eftevaag &tcti_common->header.size);
352*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
353*758e9fbaSOystein Eftevaag LOG_WARNING ("Failed to unmarshal size from tpm2 simulator "
354*758e9fbaSOystein Eftevaag "protocol: 0x%" PRIu32, rc);
355*758e9fbaSOystein Eftevaag goto out;
356*758e9fbaSOystein Eftevaag }
357*758e9fbaSOystein Eftevaag
358*758e9fbaSOystein Eftevaag LOG_DEBUG ("response size: %" PRIu32, tcti_common->header.size);
359*758e9fbaSOystein Eftevaag }
360*758e9fbaSOystein Eftevaag
361*758e9fbaSOystein Eftevaag if (response_buffer == NULL) {
362*758e9fbaSOystein Eftevaag *response_size = tcti_common->header.size;
363*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
364*758e9fbaSOystein Eftevaag }
365*758e9fbaSOystein Eftevaag
366*758e9fbaSOystein Eftevaag if (*response_size < tcti_common->header.size) {
367*758e9fbaSOystein Eftevaag *response_size = tcti_common->header.size;
368*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_INSUFFICIENT_BUFFER;
369*758e9fbaSOystein Eftevaag }
370*758e9fbaSOystein Eftevaag *response_size = tcti_common->header.size;
371*758e9fbaSOystein Eftevaag
372*758e9fbaSOystein Eftevaag /* Receive the TPM response. */
373*758e9fbaSOystein Eftevaag LOG_DEBUG ("Reading response of size %" PRIu32, tcti_common->header.size);
374*758e9fbaSOystein Eftevaag ret = socket_recv_buf (tcti_mssim->tpm_sock,
375*758e9fbaSOystein Eftevaag (unsigned char *)response_buffer,
376*758e9fbaSOystein Eftevaag tcti_common->header.size);
377*758e9fbaSOystein Eftevaag if (ret < (ssize_t)tcti_common->header.size) {
378*758e9fbaSOystein Eftevaag rc = TSS2_TCTI_RC_IO_ERROR;
379*758e9fbaSOystein Eftevaag goto out;
380*758e9fbaSOystein Eftevaag }
381*758e9fbaSOystein Eftevaag LOGBLOB_DEBUG(response_buffer, tcti_common->header.size,
382*758e9fbaSOystein Eftevaag "Response buffer received:");
383*758e9fbaSOystein Eftevaag
384*758e9fbaSOystein Eftevaag /* Receive the appended four bytes of 0's */
385*758e9fbaSOystein Eftevaag ret = socket_recv_buf (tcti_mssim->tpm_sock,
386*758e9fbaSOystein Eftevaag (unsigned char *)&trash,
387*758e9fbaSOystein Eftevaag 4);
388*758e9fbaSOystein Eftevaag if (ret != 4) {
389*758e9fbaSOystein Eftevaag rc = TSS2_TCTI_RC_IO_ERROR;
390*758e9fbaSOystein Eftevaag goto out;
391*758e9fbaSOystein Eftevaag }
392*758e9fbaSOystein Eftevaag
393*758e9fbaSOystein Eftevaag if (tcti_mssim->cancel) {
394*758e9fbaSOystein Eftevaag rc = tcti_platform_command (tctiContext, MS_SIM_CANCEL_OFF);
395*758e9fbaSOystein Eftevaag tcti_mssim->cancel = 0;
396*758e9fbaSOystein Eftevaag }
397*758e9fbaSOystein Eftevaag /*
398*758e9fbaSOystein Eftevaag * Executing code beyond this point transitions the state machine to
399*758e9fbaSOystein Eftevaag * TRANSMIT. Another call to this function will not be possible until
400*758e9fbaSOystein Eftevaag * another command is sent to the TPM.
401*758e9fbaSOystein Eftevaag */
402*758e9fbaSOystein Eftevaag out:
403*758e9fbaSOystein Eftevaag tcti_common->header.size = 0;
404*758e9fbaSOystein Eftevaag tcti_common->state = TCTI_STATE_TRANSMIT;
405*758e9fbaSOystein Eftevaag
406*758e9fbaSOystein Eftevaag return rc;
407*758e9fbaSOystein Eftevaag }
408*758e9fbaSOystein Eftevaag
409*758e9fbaSOystein Eftevaag /**
410*758e9fbaSOystein Eftevaag * This function sends the Microsoft simulator the MS_SIM_POWER_ON and
411*758e9fbaSOystein Eftevaag * MS_SIM_NV_ON commands using the platform command mechanism. Without
412*758e9fbaSOystein Eftevaag * these the simulator will respond with zero sized buffer which causes
413*758e9fbaSOystein Eftevaag * the TSS to freak out. Sending this command more than once is harmless,
414*758e9fbaSOystein Eftevaag * so it's advisable to call this function as part of the TCTI context
415*758e9fbaSOystein Eftevaag * initialization just to be sure.
416*758e9fbaSOystein Eftevaag *
417*758e9fbaSOystein Eftevaag * NOTE: The caller will still need to call Tss2_Sys_Startup. If they
418*758e9fbaSOystein Eftevaag * don't, an error will be returned from each call till they do but
419*758e9fbaSOystein Eftevaag * the error will at least be meaningful (TPM2_RC_INITIALIZE).
420*758e9fbaSOystein Eftevaag */
421*758e9fbaSOystein Eftevaag static TSS2_RC
simulator_setup(TSS2_TCTI_CONTEXT * tctiContext)422*758e9fbaSOystein Eftevaag simulator_setup (
423*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tctiContext)
424*758e9fbaSOystein Eftevaag {
425*758e9fbaSOystein Eftevaag TSS2_RC rc;
426*758e9fbaSOystein Eftevaag
427*758e9fbaSOystein Eftevaag LOG_TRACE ("Initializing TCTI context 0x%" PRIxPTR,
428*758e9fbaSOystein Eftevaag (uintptr_t)tctiContext);
429*758e9fbaSOystein Eftevaag rc = tcti_platform_command (tctiContext, MS_SIM_POWER_ON);
430*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
431*758e9fbaSOystein Eftevaag LOG_WARNING ("Failed to send MS_SIM_POWER_ON platform command.");
432*758e9fbaSOystein Eftevaag return rc;
433*758e9fbaSOystein Eftevaag }
434*758e9fbaSOystein Eftevaag
435*758e9fbaSOystein Eftevaag rc = tcti_platform_command (tctiContext, MS_SIM_NV_ON);
436*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
437*758e9fbaSOystein Eftevaag LOG_WARNING ("Failed to send MS_SIM_NV_ON platform command.");
438*758e9fbaSOystein Eftevaag }
439*758e9fbaSOystein Eftevaag
440*758e9fbaSOystein Eftevaag return rc;
441*758e9fbaSOystein Eftevaag }
442*758e9fbaSOystein Eftevaag
443*758e9fbaSOystein Eftevaag /*
444*758e9fbaSOystein Eftevaag * This is a utility function to extract a TCP port number from a string.
445*758e9fbaSOystein Eftevaag * The string must be 6 characters long. If the supplied string contains an
446*758e9fbaSOystein Eftevaag * invalid port number then 0 is returned.
447*758e9fbaSOystein Eftevaag */
448*758e9fbaSOystein Eftevaag static uint16_t
string_to_port(char port_str[6])449*758e9fbaSOystein Eftevaag string_to_port (char port_str[6])
450*758e9fbaSOystein Eftevaag {
451*758e9fbaSOystein Eftevaag uint32_t port = 0;
452*758e9fbaSOystein Eftevaag
453*758e9fbaSOystein Eftevaag if (sscanf (port_str, "%" SCNu32, &port) == EOF || port > UINT16_MAX) {
454*758e9fbaSOystein Eftevaag return 0;
455*758e9fbaSOystein Eftevaag }
456*758e9fbaSOystein Eftevaag return port;
457*758e9fbaSOystein Eftevaag }
458*758e9fbaSOystein Eftevaag /*
459*758e9fbaSOystein Eftevaag * This function is a callback conforming to the KeyValueFunc prototype. It
460*758e9fbaSOystein Eftevaag * is called by the key-value-parse module for each key / value pair extracted
461*758e9fbaSOystein Eftevaag * from the configuration string. Its sole purpose is to identify valid keys
462*758e9fbaSOystein Eftevaag * from the conf string and to store their corresponding values in the
463*758e9fbaSOystein Eftevaag * mssim_conf_t structure which is passed through the 'user_data' parameter.
464*758e9fbaSOystein Eftevaag */
465*758e9fbaSOystein Eftevaag TSS2_RC
mssim_kv_callback(const key_value_t * key_value,void * user_data)466*758e9fbaSOystein Eftevaag mssim_kv_callback (const key_value_t *key_value,
467*758e9fbaSOystein Eftevaag void *user_data)
468*758e9fbaSOystein Eftevaag {
469*758e9fbaSOystein Eftevaag mssim_conf_t *mssim_conf = (mssim_conf_t*)user_data;
470*758e9fbaSOystein Eftevaag
471*758e9fbaSOystein Eftevaag LOG_TRACE ("key_value: 0x%" PRIxPTR " and user_data: 0x%" PRIxPTR,
472*758e9fbaSOystein Eftevaag (uintptr_t)key_value, (uintptr_t)user_data);
473*758e9fbaSOystein Eftevaag if (key_value == NULL || user_data == NULL) {
474*758e9fbaSOystein Eftevaag LOG_WARNING ("%s passed NULL parameter", __func__);
475*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_GENERAL_FAILURE;
476*758e9fbaSOystein Eftevaag }
477*758e9fbaSOystein Eftevaag LOG_DEBUG ("key: %s / value: %s\n", key_value->key, key_value->value);
478*758e9fbaSOystein Eftevaag if (strcmp (key_value->key, "host") == 0) {
479*758e9fbaSOystein Eftevaag mssim_conf->host = key_value->value;
480*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
481*758e9fbaSOystein Eftevaag } else if (strcmp (key_value->key, "port") == 0) {
482*758e9fbaSOystein Eftevaag mssim_conf->port = string_to_port (key_value->value);
483*758e9fbaSOystein Eftevaag if (mssim_conf->port == 0) {
484*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_BAD_VALUE;
485*758e9fbaSOystein Eftevaag }
486*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
487*758e9fbaSOystein Eftevaag } else {
488*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_BAD_VALUE;
489*758e9fbaSOystein Eftevaag }
490*758e9fbaSOystein Eftevaag }
491*758e9fbaSOystein Eftevaag void
tcti_mssim_init_context_data(TSS2_TCTI_COMMON_CONTEXT * tcti_common)492*758e9fbaSOystein Eftevaag tcti_mssim_init_context_data (
493*758e9fbaSOystein Eftevaag TSS2_TCTI_COMMON_CONTEXT *tcti_common)
494*758e9fbaSOystein Eftevaag {
495*758e9fbaSOystein Eftevaag TSS2_TCTI_MAGIC (tcti_common) = TCTI_MSSIM_MAGIC;
496*758e9fbaSOystein Eftevaag TSS2_TCTI_VERSION (tcti_common) = TCTI_VERSION;
497*758e9fbaSOystein Eftevaag TSS2_TCTI_TRANSMIT (tcti_common) = tcti_mssim_transmit;
498*758e9fbaSOystein Eftevaag TSS2_TCTI_RECEIVE (tcti_common) = tcti_mssim_receive;
499*758e9fbaSOystein Eftevaag TSS2_TCTI_FINALIZE (tcti_common) = tcti_mssim_finalize;
500*758e9fbaSOystein Eftevaag TSS2_TCTI_CANCEL (tcti_common) = tcti_mssim_cancel;
501*758e9fbaSOystein Eftevaag TSS2_TCTI_GET_POLL_HANDLES (tcti_common) = tcti_mssim_get_poll_handles;
502*758e9fbaSOystein Eftevaag TSS2_TCTI_SET_LOCALITY (tcti_common) = tcti_mssim_set_locality;
503*758e9fbaSOystein Eftevaag TSS2_TCTI_MAKE_STICKY (tcti_common) = tcti_make_sticky_not_implemented;
504*758e9fbaSOystein Eftevaag tcti_common->state = TCTI_STATE_TRANSMIT;
505*758e9fbaSOystein Eftevaag tcti_common->locality = 0;
506*758e9fbaSOystein Eftevaag memset (&tcti_common->header, 0, sizeof (tcti_common->header));
507*758e9fbaSOystein Eftevaag }
508*758e9fbaSOystein Eftevaag /*
509*758e9fbaSOystein Eftevaag * This is an implementation of the standard TCTI initialization function for
510*758e9fbaSOystein Eftevaag * this module.
511*758e9fbaSOystein Eftevaag */
512*758e9fbaSOystein Eftevaag TSS2_RC
Tss2_Tcti_Mssim_Init(TSS2_TCTI_CONTEXT * tctiContext,size_t * size,const char * conf)513*758e9fbaSOystein Eftevaag Tss2_Tcti_Mssim_Init (
514*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tctiContext,
515*758e9fbaSOystein Eftevaag size_t *size,
516*758e9fbaSOystein Eftevaag const char *conf)
517*758e9fbaSOystein Eftevaag {
518*758e9fbaSOystein Eftevaag TSS2_TCTI_MSSIM_CONTEXT *tcti_mssim = (TSS2_TCTI_MSSIM_CONTEXT*)tctiContext;
519*758e9fbaSOystein Eftevaag TSS2_TCTI_COMMON_CONTEXT *tcti_common = tcti_mssim_down_cast (tcti_mssim);
520*758e9fbaSOystein Eftevaag TSS2_RC rc;
521*758e9fbaSOystein Eftevaag char *conf_copy = NULL;
522*758e9fbaSOystein Eftevaag mssim_conf_t mssim_conf = MSSIM_CONF_DEFAULT_INIT;
523*758e9fbaSOystein Eftevaag
524*758e9fbaSOystein Eftevaag if (conf == NULL) {
525*758e9fbaSOystein Eftevaag LOG_TRACE ("tctiContext: 0x%" PRIxPTR ", size: 0x%" PRIxPTR ""
526*758e9fbaSOystein Eftevaag " default configuration will be used.",
527*758e9fbaSOystein Eftevaag (uintptr_t)tctiContext, (uintptr_t)size);
528*758e9fbaSOystein Eftevaag } else {
529*758e9fbaSOystein Eftevaag LOG_TRACE ("tctiContext: 0x%" PRIxPTR ", size: 0x%" PRIxPTR ", conf: %s",
530*758e9fbaSOystein Eftevaag (uintptr_t)tctiContext, (uintptr_t)size, conf);
531*758e9fbaSOystein Eftevaag }
532*758e9fbaSOystein Eftevaag if (size == NULL) {
533*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_BAD_VALUE;
534*758e9fbaSOystein Eftevaag }
535*758e9fbaSOystein Eftevaag if (tctiContext == NULL) {
536*758e9fbaSOystein Eftevaag *size = sizeof (TSS2_TCTI_MSSIM_CONTEXT);
537*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
538*758e9fbaSOystein Eftevaag }
539*758e9fbaSOystein Eftevaag
540*758e9fbaSOystein Eftevaag if (conf != NULL) {
541*758e9fbaSOystein Eftevaag LOG_TRACE ("conf is not NULL");
542*758e9fbaSOystein Eftevaag if (strlen (conf) > TCTI_MSSIM_CONF_MAX) {
543*758e9fbaSOystein Eftevaag LOG_WARNING ("Provided conf string exceeds maximum of %u",
544*758e9fbaSOystein Eftevaag TCTI_MSSIM_CONF_MAX);
545*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_BAD_VALUE;
546*758e9fbaSOystein Eftevaag }
547*758e9fbaSOystein Eftevaag conf_copy = strdup (conf);
548*758e9fbaSOystein Eftevaag if (conf_copy == NULL) {
549*758e9fbaSOystein Eftevaag LOG_ERROR ("Failed to allocate buffer: %s", strerror (errno));
550*758e9fbaSOystein Eftevaag rc = TSS2_TCTI_RC_GENERAL_FAILURE;
551*758e9fbaSOystein Eftevaag goto fail_out;
552*758e9fbaSOystein Eftevaag }
553*758e9fbaSOystein Eftevaag LOG_DEBUG ("Dup'd conf string to: 0x%" PRIxPTR,
554*758e9fbaSOystein Eftevaag (uintptr_t)conf_copy);
555*758e9fbaSOystein Eftevaag rc = parse_key_value_string (conf_copy,
556*758e9fbaSOystein Eftevaag mssim_kv_callback,
557*758e9fbaSOystein Eftevaag &mssim_conf);
558*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
559*758e9fbaSOystein Eftevaag goto fail_out;
560*758e9fbaSOystein Eftevaag }
561*758e9fbaSOystein Eftevaag }
562*758e9fbaSOystein Eftevaag LOG_DEBUG ("Initializing mssim TCTI with host: %s, port: %" PRIu16,
563*758e9fbaSOystein Eftevaag mssim_conf.host, mssim_conf.port);
564*758e9fbaSOystein Eftevaag
565*758e9fbaSOystein Eftevaag tcti_mssim->tpm_sock = -1;
566*758e9fbaSOystein Eftevaag tcti_mssim->platform_sock = -1;
567*758e9fbaSOystein Eftevaag
568*758e9fbaSOystein Eftevaag rc = socket_connect (mssim_conf.host,
569*758e9fbaSOystein Eftevaag mssim_conf.port,
570*758e9fbaSOystein Eftevaag &tcti_mssim->tpm_sock);
571*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
572*758e9fbaSOystein Eftevaag goto fail_out;
573*758e9fbaSOystein Eftevaag }
574*758e9fbaSOystein Eftevaag
575*758e9fbaSOystein Eftevaag rc = socket_connect (mssim_conf.host,
576*758e9fbaSOystein Eftevaag mssim_conf.port + 1,
577*758e9fbaSOystein Eftevaag &tcti_mssim->platform_sock);
578*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
579*758e9fbaSOystein Eftevaag goto fail_out;
580*758e9fbaSOystein Eftevaag }
581*758e9fbaSOystein Eftevaag
582*758e9fbaSOystein Eftevaag tcti_mssim_init_context_data (tcti_common);
583*758e9fbaSOystein Eftevaag rc = simulator_setup (tctiContext);
584*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
585*758e9fbaSOystein Eftevaag goto fail_out;
586*758e9fbaSOystein Eftevaag }
587*758e9fbaSOystein Eftevaag
588*758e9fbaSOystein Eftevaag if (conf_copy != NULL) {
589*758e9fbaSOystein Eftevaag free (conf_copy);
590*758e9fbaSOystein Eftevaag }
591*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
592*758e9fbaSOystein Eftevaag
593*758e9fbaSOystein Eftevaag fail_out:
594*758e9fbaSOystein Eftevaag if (conf_copy != NULL) {
595*758e9fbaSOystein Eftevaag free (conf_copy);
596*758e9fbaSOystein Eftevaag }
597*758e9fbaSOystein Eftevaag socket_close (&tcti_mssim->tpm_sock);
598*758e9fbaSOystein Eftevaag socket_close (&tcti_mssim->platform_sock);
599*758e9fbaSOystein Eftevaag
600*758e9fbaSOystein Eftevaag return rc;
601*758e9fbaSOystein Eftevaag }
602*758e9fbaSOystein Eftevaag
603*758e9fbaSOystein Eftevaag /* public info structure */
604*758e9fbaSOystein Eftevaag const TSS2_TCTI_INFO tss2_tcti_info = {
605*758e9fbaSOystein Eftevaag .version = TCTI_VERSION,
606*758e9fbaSOystein Eftevaag .name = "tcti-socket",
607*758e9fbaSOystein Eftevaag .description = "TCTI module for communication with the Microsoft TPM2 Simulator.",
608*758e9fbaSOystein Eftevaag .config_help = "Key / value string in the form \"host=localhost,port=2321\".",
609*758e9fbaSOystein Eftevaag .init = Tss2_Tcti_Mssim_Init,
610*758e9fbaSOystein Eftevaag };
611*758e9fbaSOystein Eftevaag
612*758e9fbaSOystein Eftevaag const TSS2_TCTI_INFO*
Tss2_Tcti_Info(void)613*758e9fbaSOystein Eftevaag Tss2_Tcti_Info (void)
614*758e9fbaSOystein Eftevaag {
615*758e9fbaSOystein Eftevaag return &tss2_tcti_info;
616*758e9fbaSOystein Eftevaag }
617