1*758e9fbaSOystein Eftevaag /* SPDX-License-Identifier: BSD-2-Clause */
2*758e9fbaSOystein Eftevaag /*
3*758e9fbaSOystein Eftevaag * Copyright (c) 2018 Intel Corporation
4*758e9fbaSOystein Eftevaag * All rights reserved.
5*758e9fbaSOystein Eftevaag */
6*758e9fbaSOystein Eftevaag /* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. */
7*758e9fbaSOystein Eftevaag
8*758e9fbaSOystein Eftevaag #ifdef HAVE_CONFIG_H
9*758e9fbaSOystein Eftevaag #include <config.h>
10*758e9fbaSOystein Eftevaag #endif
11*758e9fbaSOystein Eftevaag
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 #include <sys/types.h>
17*758e9fbaSOystein Eftevaag #include <windows.h>
18*758e9fbaSOystein Eftevaag #include <Tbs.h>
19*758e9fbaSOystein Eftevaag
20*758e9fbaSOystein Eftevaag #include "tss2_tcti.h"
21*758e9fbaSOystein Eftevaag #include "tss2_tcti_tbs.h"
22*758e9fbaSOystein Eftevaag
23*758e9fbaSOystein Eftevaag #include "tcti-common.h"
24*758e9fbaSOystein Eftevaag #include "tcti-tbs.h"
25*758e9fbaSOystein Eftevaag
26*758e9fbaSOystein Eftevaag #define LOGMODULE tcti
27*758e9fbaSOystein Eftevaag #include "util/log.h"
28*758e9fbaSOystein Eftevaag
29*758e9fbaSOystein Eftevaag /*
30*758e9fbaSOystein Eftevaag * This function wraps the "up-cast" of the opaque TCTI context type to the
31*758e9fbaSOystein Eftevaag * type for the TBS TCTI context. The only safe-guard we have to ensure
32*758e9fbaSOystein Eftevaag * this operation is possible is the magic number for the TBS TCTI context.
33*758e9fbaSOystein Eftevaag * If passed a NULL context, or the magic number check fails, this function
34*758e9fbaSOystein Eftevaag * will return NULL.
35*758e9fbaSOystein Eftevaag */
36*758e9fbaSOystein Eftevaag TSS2_TCTI_TBS_CONTEXT*
tcti_tbs_context_cast(TSS2_TCTI_CONTEXT * tcti_ctx)37*758e9fbaSOystein Eftevaag tcti_tbs_context_cast (TSS2_TCTI_CONTEXT *tcti_ctx)
38*758e9fbaSOystein Eftevaag {
39*758e9fbaSOystein Eftevaag if (tcti_ctx != NULL && TSS2_TCTI_MAGIC (tcti_ctx) == TCTI_TBS_MAGIC) {
40*758e9fbaSOystein Eftevaag return (TSS2_TCTI_TBS_CONTEXT*)tcti_ctx;
41*758e9fbaSOystein Eftevaag }
42*758e9fbaSOystein Eftevaag return NULL;
43*758e9fbaSOystein Eftevaag }
44*758e9fbaSOystein Eftevaag
45*758e9fbaSOystein Eftevaag /*
46*758e9fbaSOystein Eftevaag * This function down-casts the TBS TCTI context to the common context
47*758e9fbaSOystein Eftevaag * defined in the tcti-common module.
48*758e9fbaSOystein Eftevaag */
49*758e9fbaSOystein Eftevaag TSS2_TCTI_COMMON_CONTEXT*
tcti_tbs_down_cast(TSS2_TCTI_TBS_CONTEXT * tcti_tbs)50*758e9fbaSOystein Eftevaag tcti_tbs_down_cast (TSS2_TCTI_TBS_CONTEXT *tcti_tbs)
51*758e9fbaSOystein Eftevaag {
52*758e9fbaSOystein Eftevaag if (tcti_tbs == NULL) {
53*758e9fbaSOystein Eftevaag return NULL;
54*758e9fbaSOystein Eftevaag }
55*758e9fbaSOystein Eftevaag return &tcti_tbs->common;
56*758e9fbaSOystein Eftevaag }
57*758e9fbaSOystein Eftevaag
58*758e9fbaSOystein Eftevaag TSS2_RC
tcti_tbs_transmit(TSS2_TCTI_CONTEXT * tctiContext,size_t command_size,const uint8_t * command_buffer)59*758e9fbaSOystein Eftevaag tcti_tbs_transmit (
60*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tctiContext,
61*758e9fbaSOystein Eftevaag size_t command_size,
62*758e9fbaSOystein Eftevaag const uint8_t *command_buffer)
63*758e9fbaSOystein Eftevaag {
64*758e9fbaSOystein Eftevaag TSS2_TCTI_TBS_CONTEXT *tcti_tbs = tcti_tbs_context_cast (tctiContext);
65*758e9fbaSOystein Eftevaag TSS2_TCTI_COMMON_CONTEXT *tcti_common = tcti_tbs_down_cast (tcti_tbs);
66*758e9fbaSOystein Eftevaag TSS2_RC rc = TSS2_RC_SUCCESS;
67*758e9fbaSOystein Eftevaag
68*758e9fbaSOystein Eftevaag if (tcti_tbs == NULL) {
69*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_BAD_CONTEXT;
70*758e9fbaSOystein Eftevaag }
71*758e9fbaSOystein Eftevaag rc = tcti_common_transmit_checks (tcti_common, command_buffer);
72*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
73*758e9fbaSOystein Eftevaag return rc;
74*758e9fbaSOystein Eftevaag }
75*758e9fbaSOystein Eftevaag
76*758e9fbaSOystein Eftevaag LOGBLOB_DEBUG (command_buffer,
77*758e9fbaSOystein Eftevaag command_size,
78*758e9fbaSOystein Eftevaag "sending %zu byte command buffer:",
79*758e9fbaSOystein Eftevaag command_size);
80*758e9fbaSOystein Eftevaag
81*758e9fbaSOystein Eftevaag memcpy (tcti_tbs->commandBuffer, command_buffer, command_size);
82*758e9fbaSOystein Eftevaag tcti_tbs->commandSize = command_size;
83*758e9fbaSOystein Eftevaag
84*758e9fbaSOystein Eftevaag tcti_common->state = TCTI_STATE_RECEIVE;
85*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
86*758e9fbaSOystein Eftevaag }
87*758e9fbaSOystein Eftevaag
88*758e9fbaSOystein Eftevaag /*
89*758e9fbaSOystein Eftevaag * This receive function deviates from the spec a bit. Calling this function
90*758e9fbaSOystein Eftevaag * with a NULL 'response_buffer' parameter *should* result in the required size
91*758e9fbaSOystein Eftevaag * for the response buffer being returned to the caller. The required size for
92*758e9fbaSOystein Eftevaag * the response buffer is normally stored in the pcbResult parameter of
93*758e9fbaSOystein Eftevaag * the 'TBSip_Submit_Command' function by TBS. To avoid having to maintain
94*758e9fbaSOystein Eftevaag * a response buffer, we are passing the 'response_buffer' parameter directly to
95*758e9fbaSOystein Eftevaag * 'Tbsip_Submit_Command'; this means that in the case when 'response_buffer'
96*758e9fbaSOystein Eftevaag * is NULL, we would not be able to retreive the size without losing the response.
97*758e9fbaSOystein Eftevaag *
98*758e9fbaSOystein Eftevaag * Instead, if the caller queries the size, we return 4k just to be on the
99*758e9fbaSOystein Eftevaag * safe side. We do *not* however verify that the provided buffer is large
100*758e9fbaSOystein Eftevaag * enough to hold the full response (we can't). If the caller provides us with
101*758e9fbaSOystein Eftevaag * a buffer less than 4k we'll read as much of the response as we can given
102*758e9fbaSOystein Eftevaag * the size of the buffer. If the response size is larger than the provided
103*758e9fbaSOystein Eftevaag * buffer we print a warning. This allows "expert applications" to
104*758e9fbaSOystein Eftevaag * precalculate the required response buffer size for whatever commands they
105*758e9fbaSOystein Eftevaag * may send.
106*758e9fbaSOystein Eftevaag */
107*758e9fbaSOystein Eftevaag TSS2_RC
tcti_tbs_receive(TSS2_TCTI_CONTEXT * tctiContext,size_t * response_size,uint8_t * response_buffer,int32_t timeout)108*758e9fbaSOystein Eftevaag tcti_tbs_receive (
109*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tctiContext,
110*758e9fbaSOystein Eftevaag size_t *response_size,
111*758e9fbaSOystein Eftevaag uint8_t *response_buffer,
112*758e9fbaSOystein Eftevaag int32_t timeout)
113*758e9fbaSOystein Eftevaag {
114*758e9fbaSOystein Eftevaag TSS2_TCTI_TBS_CONTEXT *tcti_tbs = tcti_tbs_context_cast (tctiContext);
115*758e9fbaSOystein Eftevaag TSS2_TCTI_COMMON_CONTEXT *tcti_common = tcti_tbs_down_cast (tcti_tbs);
116*758e9fbaSOystein Eftevaag TSS2_RC rc = TSS2_RC_SUCCESS;
117*758e9fbaSOystein Eftevaag TBS_RESULT tbs_rc;
118*758e9fbaSOystein Eftevaag int original_size;
119*758e9fbaSOystein Eftevaag
120*758e9fbaSOystein Eftevaag if (tcti_tbs == NULL) {
121*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_BAD_CONTEXT;
122*758e9fbaSOystein Eftevaag }
123*758e9fbaSOystein Eftevaag
124*758e9fbaSOystein Eftevaag rc = tcti_common_receive_checks (tcti_common, response_size);
125*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
126*758e9fbaSOystein Eftevaag return rc;
127*758e9fbaSOystein Eftevaag }
128*758e9fbaSOystein Eftevaag if (timeout != TSS2_TCTI_TIMEOUT_BLOCK) {
129*758e9fbaSOystein Eftevaag LOG_WARNING ("The underlying IPC mechanism does not support "
130*758e9fbaSOystein Eftevaag "asynchronous I/O. The 'timeout' parameter must be "
131*758e9fbaSOystein Eftevaag "TSS2_TCTI_TIMEOUT_BLOCK");
132*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_BAD_VALUE;
133*758e9fbaSOystein Eftevaag }
134*758e9fbaSOystein Eftevaag if (response_buffer == NULL) {
135*758e9fbaSOystein Eftevaag LOG_DEBUG("Caller queried for size but our TCTI TBS implementation doesn't "
136*758e9fbaSOystein Eftevaag "support this, Returning %d which is the max size for "
137*758e9fbaSOystein Eftevaag "a response buffer.",
138*758e9fbaSOystein Eftevaag TPM2_MAX_RESPONSE_SIZE);
139*758e9fbaSOystein Eftevaag *response_size = TPM2_MAX_RESPONSE_SIZE;
140*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
141*758e9fbaSOystein Eftevaag }
142*758e9fbaSOystein Eftevaag if (*response_size < TPM2_MAX_RESPONSE_SIZE) {
143*758e9fbaSOystein Eftevaag LOG_INFO("Caller provided buffer that *may* not be large enough to "
144*758e9fbaSOystein Eftevaag "hold the response buffer.");
145*758e9fbaSOystein Eftevaag }
146*758e9fbaSOystein Eftevaag
147*758e9fbaSOystein Eftevaag original_size = *response_size;
148*758e9fbaSOystein Eftevaag
149*758e9fbaSOystein Eftevaag tbs_rc = Tbsip_Submit_Command (tcti_tbs->hContext,
150*758e9fbaSOystein Eftevaag TBS_COMMAND_LOCALITY_ZERO,
151*758e9fbaSOystein Eftevaag TBS_COMMAND_PRIORITY_NORMAL,
152*758e9fbaSOystein Eftevaag tcti_tbs->commandBuffer,
153*758e9fbaSOystein Eftevaag tcti_tbs->commandSize,
154*758e9fbaSOystein Eftevaag response_buffer,
155*758e9fbaSOystein Eftevaag (PUINT32) response_size);
156*758e9fbaSOystein Eftevaag if (tbs_rc != TBS_SUCCESS) {
157*758e9fbaSOystein Eftevaag LOG_ERROR ("Failed to submit command to TBS with error: 0x%x", tbs_rc);
158*758e9fbaSOystein Eftevaag rc = TSS2_TCTI_RC_IO_ERROR;
159*758e9fbaSOystein Eftevaag goto out;
160*758e9fbaSOystein Eftevaag }
161*758e9fbaSOystein Eftevaag
162*758e9fbaSOystein Eftevaag LOGBLOB_DEBUG (response_buffer, *response_size, "Response Received");
163*758e9fbaSOystein Eftevaag
164*758e9fbaSOystein Eftevaag if (original_size < *response_size) {
165*758e9fbaSOystein Eftevaag LOG_WARNING("TPM2 response size is larger than the provided "
166*758e9fbaSOystein Eftevaag "buffer: future use of this TCTI will likely fail.");
167*758e9fbaSOystein Eftevaag rc = TSS2_TCTI_RC_INSUFFICIENT_BUFFER;
168*758e9fbaSOystein Eftevaag goto out;
169*758e9fbaSOystein Eftevaag }
170*758e9fbaSOystein Eftevaag
171*758e9fbaSOystein Eftevaag rc = header_unmarshal (response_buffer, &tcti_common->header);
172*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
173*758e9fbaSOystein Eftevaag goto out;
174*758e9fbaSOystein Eftevaag }
175*758e9fbaSOystein Eftevaag
176*758e9fbaSOystein Eftevaag /*
177*758e9fbaSOystein Eftevaag * Executing code beyond this point transitions the state machine to
178*758e9fbaSOystein Eftevaag * TRANSMIT. Another call to this function will not be possible until
179*758e9fbaSOystein Eftevaag * another command is sent to the TPM.
180*758e9fbaSOystein Eftevaag */
181*758e9fbaSOystein Eftevaag out:
182*758e9fbaSOystein Eftevaag tcti_common->state = TCTI_STATE_TRANSMIT;
183*758e9fbaSOystein Eftevaag return rc;
184*758e9fbaSOystein Eftevaag }
185*758e9fbaSOystein Eftevaag
186*758e9fbaSOystein Eftevaag void
tcti_tbs_finalize(TSS2_TCTI_CONTEXT * tctiContext)187*758e9fbaSOystein Eftevaag tcti_tbs_finalize (
188*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tctiContext)
189*758e9fbaSOystein Eftevaag {
190*758e9fbaSOystein Eftevaag TSS2_TCTI_TBS_CONTEXT *tcti_tbs = tcti_tbs_context_cast (tctiContext);
191*758e9fbaSOystein Eftevaag TSS2_TCTI_COMMON_CONTEXT *tcti_common = tcti_tbs_down_cast (tcti_tbs);
192*758e9fbaSOystein Eftevaag TBS_RESULT tbs_rc;
193*758e9fbaSOystein Eftevaag
194*758e9fbaSOystein Eftevaag if (tcti_tbs == NULL) {
195*758e9fbaSOystein Eftevaag return;
196*758e9fbaSOystein Eftevaag }
197*758e9fbaSOystein Eftevaag
198*758e9fbaSOystein Eftevaag if (tcti_tbs->commandBuffer!= NULL) {
199*758e9fbaSOystein Eftevaag free (tcti_tbs->commandBuffer);
200*758e9fbaSOystein Eftevaag tcti_tbs->commandBuffer = NULL;
201*758e9fbaSOystein Eftevaag }
202*758e9fbaSOystein Eftevaag
203*758e9fbaSOystein Eftevaag tbs_rc = Tbsip_Context_Close (tcti_tbs->hContext);
204*758e9fbaSOystein Eftevaag if (tbs_rc != TBS_SUCCESS) {
205*758e9fbaSOystein Eftevaag LOG_WARNING ("Failed to close context with TBS error: 0x%x", tbs_rc);
206*758e9fbaSOystein Eftevaag }
207*758e9fbaSOystein Eftevaag
208*758e9fbaSOystein Eftevaag tcti_common->state = TCTI_STATE_FINAL;
209*758e9fbaSOystein Eftevaag }
210*758e9fbaSOystein Eftevaag
211*758e9fbaSOystein Eftevaag TSS2_RC
tcti_tbs_cancel(TSS2_TCTI_CONTEXT * tctiContext)212*758e9fbaSOystein Eftevaag tcti_tbs_cancel (
213*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tctiContext)
214*758e9fbaSOystein Eftevaag {
215*758e9fbaSOystein Eftevaag TBS_RESULT tbs_rc;
216*758e9fbaSOystein Eftevaag TSS2_RC rc = TSS2_RC_SUCCESS;
217*758e9fbaSOystein Eftevaag TSS2_TCTI_TBS_CONTEXT *tcti_tbs = tcti_tbs_context_cast (tctiContext);
218*758e9fbaSOystein Eftevaag
219*758e9fbaSOystein Eftevaag tbs_rc = Tbsip_Cancel_Commands (tcti_tbs->hContext);
220*758e9fbaSOystein Eftevaag if (tbs_rc != TBS_SUCCESS) {
221*758e9fbaSOystein Eftevaag LOG_WARNING ("Failed to cancel commands with TBS error: 0x%x", tbs_rc);
222*758e9fbaSOystein Eftevaag rc = TSS2_TCTI_RC_GENERAL_FAILURE;
223*758e9fbaSOystein Eftevaag }
224*758e9fbaSOystein Eftevaag
225*758e9fbaSOystein Eftevaag return rc;
226*758e9fbaSOystein Eftevaag }
227*758e9fbaSOystein Eftevaag
228*758e9fbaSOystein Eftevaag TSS2_RC
tcti_tbs_get_poll_handles(TSS2_TCTI_CONTEXT * tctiContext,TSS2_TCTI_POLL_HANDLE * handles,size_t * num_handles)229*758e9fbaSOystein Eftevaag tcti_tbs_get_poll_handles (
230*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tctiContext,
231*758e9fbaSOystein Eftevaag TSS2_TCTI_POLL_HANDLE *handles,
232*758e9fbaSOystein Eftevaag size_t *num_handles)
233*758e9fbaSOystein Eftevaag {
234*758e9fbaSOystein Eftevaag /* TBS doesn't support polling. */
235*758e9fbaSOystein Eftevaag (void)(tctiContext);
236*758e9fbaSOystein Eftevaag (void)(handles);
237*758e9fbaSOystein Eftevaag (void)(num_handles);
238*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_NOT_IMPLEMENTED;
239*758e9fbaSOystein Eftevaag }
240*758e9fbaSOystein Eftevaag
241*758e9fbaSOystein Eftevaag TSS2_RC
tcti_tbs_set_locality(TSS2_TCTI_CONTEXT * tctiContext,uint8_t locality)242*758e9fbaSOystein Eftevaag tcti_tbs_set_locality (
243*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tctiContext,
244*758e9fbaSOystein Eftevaag uint8_t locality)
245*758e9fbaSOystein Eftevaag {
246*758e9fbaSOystein Eftevaag /*
247*758e9fbaSOystein Eftevaag * TBS currently only supports locality 0
248*758e9fbaSOystein Eftevaag */
249*758e9fbaSOystein Eftevaag (void)(tctiContext);
250*758e9fbaSOystein Eftevaag (void)(locality);
251*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_NOT_IMPLEMENTED;
252*758e9fbaSOystein Eftevaag }
253*758e9fbaSOystein Eftevaag
254*758e9fbaSOystein Eftevaag TSS2_RC
Tss2_Tcti_Tbs_Init(TSS2_TCTI_CONTEXT * tctiContext,size_t * size,const char * conf)255*758e9fbaSOystein Eftevaag Tss2_Tcti_Tbs_Init (
256*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tctiContext,
257*758e9fbaSOystein Eftevaag size_t *size,
258*758e9fbaSOystein Eftevaag const char *conf)
259*758e9fbaSOystein Eftevaag {
260*758e9fbaSOystein Eftevaag TSS2_TCTI_TBS_CONTEXT *tcti_tbs;
261*758e9fbaSOystein Eftevaag TSS2_TCTI_COMMON_CONTEXT *tcti_common;
262*758e9fbaSOystein Eftevaag TBS_RESULT tbs_rc;
263*758e9fbaSOystein Eftevaag TBS_CONTEXT_PARAMS2 params;
264*758e9fbaSOystein Eftevaag TPM_DEVICE_INFO info;
265*758e9fbaSOystein Eftevaag
266*758e9fbaSOystein Eftevaag if (tctiContext == NULL) {
267*758e9fbaSOystein Eftevaag if (size == NULL) {
268*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_BAD_VALUE;
269*758e9fbaSOystein Eftevaag }
270*758e9fbaSOystein Eftevaag *size = sizeof (TSS2_TCTI_TBS_CONTEXT);
271*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
272*758e9fbaSOystein Eftevaag }
273*758e9fbaSOystein Eftevaag
274*758e9fbaSOystein Eftevaag /* Init TCTI context */
275*758e9fbaSOystein Eftevaag TSS2_TCTI_MAGIC (tctiContext) = TCTI_TBS_MAGIC;
276*758e9fbaSOystein Eftevaag TSS2_TCTI_VERSION (tctiContext) = TCTI_VERSION;
277*758e9fbaSOystein Eftevaag TSS2_TCTI_TRANSMIT (tctiContext) = tcti_tbs_transmit;
278*758e9fbaSOystein Eftevaag TSS2_TCTI_RECEIVE (tctiContext) = tcti_tbs_receive;
279*758e9fbaSOystein Eftevaag TSS2_TCTI_FINALIZE (tctiContext) = tcti_tbs_finalize;
280*758e9fbaSOystein Eftevaag TSS2_TCTI_CANCEL (tctiContext) = tcti_tbs_cancel;
281*758e9fbaSOystein Eftevaag TSS2_TCTI_GET_POLL_HANDLES (tctiContext) = tcti_tbs_get_poll_handles;
282*758e9fbaSOystein Eftevaag TSS2_TCTI_SET_LOCALITY (tctiContext) = tcti_tbs_set_locality;
283*758e9fbaSOystein Eftevaag TSS2_TCTI_MAKE_STICKY (tctiContext) = tcti_make_sticky_not_implemented;
284*758e9fbaSOystein Eftevaag tcti_tbs = tcti_tbs_context_cast (tctiContext);
285*758e9fbaSOystein Eftevaag tcti_common = tcti_tbs_down_cast (tcti_tbs);
286*758e9fbaSOystein Eftevaag tcti_common->state = TCTI_STATE_TRANSMIT;
287*758e9fbaSOystein Eftevaag
288*758e9fbaSOystein Eftevaag memset (&tcti_common->header, 0, sizeof (tcti_common->header));
289*758e9fbaSOystein Eftevaag tcti_common->locality = 0;
290*758e9fbaSOystein Eftevaag
291*758e9fbaSOystein Eftevaag params.includeTpm20 = 1;
292*758e9fbaSOystein Eftevaag params.includeTpm12 = 0;
293*758e9fbaSOystein Eftevaag params.version = TBS_CONTEXT_VERSION_TWO;
294*758e9fbaSOystein Eftevaag tbs_rc = Tbsi_Context_Create ((PCTBS_CONTEXT_PARAMS)¶ms, &(tcti_tbs->hContext));
295*758e9fbaSOystein Eftevaag if (tbs_rc != TBS_SUCCESS) {
296*758e9fbaSOystein Eftevaag LOG_WARNING ("Failed to create context with TBS error: 0x%x", tbs_rc);
297*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_IO_ERROR;
298*758e9fbaSOystein Eftevaag }
299*758e9fbaSOystein Eftevaag
300*758e9fbaSOystein Eftevaag tbs_rc = Tbsi_GetDeviceInfo (sizeof (info), &info);
301*758e9fbaSOystein Eftevaag if (tbs_rc != TBS_SUCCESS) {
302*758e9fbaSOystein Eftevaag LOG_WARNING ("Failed to get device information with TBS error: 0x%x", tbs_rc);
303*758e9fbaSOystein Eftevaag Tbsip_Context_Close (tcti_tbs->hContext);
304*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_IO_ERROR;
305*758e9fbaSOystein Eftevaag }
306*758e9fbaSOystein Eftevaag if (info.tpmVersion != TPM_VERSION_20) {
307*758e9fbaSOystein Eftevaag LOG_WARNING ("Failed to create context, TPM version is incorrect");
308*758e9fbaSOystein Eftevaag Tbsip_Context_Close (tcti_tbs->hContext);
309*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_IO_ERROR;
310*758e9fbaSOystein Eftevaag }
311*758e9fbaSOystein Eftevaag
312*758e9fbaSOystein Eftevaag tcti_tbs->commandBuffer = malloc (sizeof (BYTE) * TPM2_MAX_COMMAND_SIZE);
313*758e9fbaSOystein Eftevaag if (tcti_tbs->commandBuffer == NULL) {
314*758e9fbaSOystein Eftevaag LOG_WARNING ("Failed to allocate memory for the result buffer when creating context");
315*758e9fbaSOystein Eftevaag Tbsip_Context_Close (tcti_tbs->hContext);
316*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_IO_ERROR;
317*758e9fbaSOystein Eftevaag }
318*758e9fbaSOystein Eftevaag
319*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
320*758e9fbaSOystein Eftevaag }
321*758e9fbaSOystein Eftevaag
322*758e9fbaSOystein Eftevaag const TSS2_TCTI_INFO tss2_tcti_info = {
323*758e9fbaSOystein Eftevaag .version = TCTI_VERSION,
324*758e9fbaSOystein Eftevaag .name = "tcti-tbs",
325*758e9fbaSOystein Eftevaag .description = "TCTI module for communication with Windows TPM Base Services",
326*758e9fbaSOystein Eftevaag .config_help = "Configuration is not used",
327*758e9fbaSOystein Eftevaag .init = Tss2_Tcti_Tbs_Init,
328*758e9fbaSOystein Eftevaag };
329*758e9fbaSOystein Eftevaag
330*758e9fbaSOystein Eftevaag const TSS2_TCTI_INFO*
Tss2_Tcti_Info(void)331*758e9fbaSOystein Eftevaag Tss2_Tcti_Info (void)
332*758e9fbaSOystein Eftevaag {
333*758e9fbaSOystein Eftevaag return &tss2_tcti_info;
334*758e9fbaSOystein Eftevaag }
335