xref: /aosp_15_r20/external/tpm2-tss/src/tss2-tcti/tcti-tbs.c (revision 758e9fba6fc9adbf15340f70c73baee7b168b1c9)
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)&params, &(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