xref: /aosp_15_r20/external/tpm2-tss/src/tss2-esys/esys_context.c (revision 758e9fba6fc9adbf15340f70c73baee7b168b1c9)
1*758e9fbaSOystein Eftevaag /* SPDX-License-Identifier: BSD-2-Clause */
2*758e9fbaSOystein Eftevaag /*******************************************************************************
3*758e9fbaSOystein Eftevaag  * Copyright 2017, Fraunhofer SIT sponsored by Infineon Technologies AG
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 #include <stdlib.h>
11*758e9fbaSOystein Eftevaag 
12*758e9fbaSOystein Eftevaag #include "tss2_esys.h"
13*758e9fbaSOystein Eftevaag #include "tss2_tctildr.h"
14*758e9fbaSOystein Eftevaag 
15*758e9fbaSOystein Eftevaag #include "esys_iutil.h"
16*758e9fbaSOystein Eftevaag #include "tss2-tcti/tctildr-interface.h"
17*758e9fbaSOystein Eftevaag #define LOGMODULE esys
18*758e9fbaSOystein Eftevaag #include "util/log.h"
19*758e9fbaSOystein Eftevaag #include "util/aux_util.h"
20*758e9fbaSOystein Eftevaag 
21*758e9fbaSOystein Eftevaag /** Initialize an ESYS_CONTEXT for further use.
22*758e9fbaSOystein Eftevaag  *
23*758e9fbaSOystein Eftevaag  * Initialize an ESYS_CONTEXT that holds all the state and metadata information
24*758e9fbaSOystein Eftevaag  * during an interaction with the TPM.
25*758e9fbaSOystein Eftevaag  * If not specified, load a TCTI in this order:
26*758e9fbaSOystein Eftevaag  *       Library libtss2-tcti-default.so (link to the preferred TCTI)
27*758e9fbaSOystein Eftevaag  *       Library libtss2-tcti-tabrmd.so (tabrmd)
28*758e9fbaSOystein Eftevaag  *       Device /dev/tpmrm0 (kernel resident resource manager)
29*758e9fbaSOystein Eftevaag  *       Device /dev/tpm0 (hardware TPM)
30*758e9fbaSOystein Eftevaag  *       TCP socket localhost:2321 (TPM simulator)
31*758e9fbaSOystein Eftevaag  * @param esys_context [out] The ESYS_CONTEXT.
32*758e9fbaSOystein Eftevaag  * @param tcti [in] The TCTI context used to connect to the TPM (may be NULL).
33*758e9fbaSOystein Eftevaag  * @param abiVersion [in,out] The abi version to check and the abi version
34*758e9fbaSOystein Eftevaag  *        supported by this implementation (may be NULL).
35*758e9fbaSOystein Eftevaag  * @retval TSS2_ESYS_RC_SUCCESS if the function call was a success.
36*758e9fbaSOystein Eftevaag  * @retval TSS2_ESYS_RC_BAD_REFERENCE if esysContext is NULL.
37*758e9fbaSOystein Eftevaag  * @retval TSS2_ESYS_RC_MEMORY if the ESAPI cannot allocate enough memory to
38*758e9fbaSOystein Eftevaag  *         create the context.
39*758e9fbaSOystein Eftevaag  * @retval TSS2_RCs produced by lower layers of the software stack may be
40*758e9fbaSOystein Eftevaag  *         returned to the caller unaltered unless handled internally.
41*758e9fbaSOystein Eftevaag  */
42*758e9fbaSOystein Eftevaag TSS2_RC
Esys_Initialize(ESYS_CONTEXT ** esys_context,TSS2_TCTI_CONTEXT * tcti,TSS2_ABI_VERSION * abiVersion)43*758e9fbaSOystein Eftevaag Esys_Initialize(ESYS_CONTEXT ** esys_context, TSS2_TCTI_CONTEXT * tcti,
44*758e9fbaSOystein Eftevaag                 TSS2_ABI_VERSION * abiVersion)
45*758e9fbaSOystein Eftevaag {
46*758e9fbaSOystein Eftevaag     TSS2_RC r;
47*758e9fbaSOystein Eftevaag     size_t syssize;
48*758e9fbaSOystein Eftevaag 
49*758e9fbaSOystein Eftevaag     _ESYS_ASSERT_NON_NULL(esys_context);
50*758e9fbaSOystein Eftevaag     *esys_context = NULL;
51*758e9fbaSOystein Eftevaag 
52*758e9fbaSOystein Eftevaag     /* Allocate memory for the ESYS context
53*758e9fbaSOystein Eftevaag      * After this errors must jump to cleanup_return instead of returning. */
54*758e9fbaSOystein Eftevaag     *esys_context = calloc(1, sizeof(ESYS_CONTEXT));
55*758e9fbaSOystein Eftevaag     return_if_null(*esys_context, "Out of memory.", TSS2_ESYS_RC_MEMORY);
56*758e9fbaSOystein Eftevaag 
57*758e9fbaSOystein Eftevaag     /* Allocate memory for the SYS context */
58*758e9fbaSOystein Eftevaag     syssize = Tss2_Sys_GetContextSize(0);
59*758e9fbaSOystein Eftevaag     (*esys_context)->sys = calloc(1, syssize);
60*758e9fbaSOystein Eftevaag     goto_if_null((*esys_context)->sys, "Error: During malloc.",
61*758e9fbaSOystein Eftevaag                  TSS2_ESYS_RC_MEMORY, cleanup_return);
62*758e9fbaSOystein Eftevaag 
63*758e9fbaSOystein Eftevaag     /* Store the application provided tcti to be return on Esys_GetTcti(). */
64*758e9fbaSOystein Eftevaag     (*esys_context)->tcti_app_param = tcti;
65*758e9fbaSOystein Eftevaag 
66*758e9fbaSOystein Eftevaag     /* If no tcti was provided, initialize the default one. */
67*758e9fbaSOystein Eftevaag     if (tcti == NULL) {
68*758e9fbaSOystein Eftevaag         r = Tss2_TctiLdr_Initialize (NULL, &tcti);
69*758e9fbaSOystein Eftevaag         goto_if_error(r, "Initialize default tcti.", cleanup_return);
70*758e9fbaSOystein Eftevaag     }
71*758e9fbaSOystein Eftevaag 
72*758e9fbaSOystein Eftevaag     /* Initialize the ESAPI */
73*758e9fbaSOystein Eftevaag     r = Tss2_Sys_Initialize((*esys_context)->sys, syssize, tcti, abiVersion);
74*758e9fbaSOystein Eftevaag     goto_if_error(r, "During syscontext initialization", cleanup_return);
75*758e9fbaSOystein Eftevaag 
76*758e9fbaSOystein Eftevaag     /* Use random number for initial esys handle value to provide pseudo
77*758e9fbaSOystein Eftevaag        namespace for handles */
78*758e9fbaSOystein Eftevaag     (*esys_context)->esys_handle_cnt = ESYS_TR_MIN_OBJECT + (rand() % 6000000);
79*758e9fbaSOystein Eftevaag 
80*758e9fbaSOystein Eftevaag     /* Initialize crypto backend. */
81*758e9fbaSOystein Eftevaag     r = iesys_initialize_crypto();
82*758e9fbaSOystein Eftevaag     goto_if_error(r, "Initialize crypto backend.", cleanup_return);
83*758e9fbaSOystein Eftevaag 
84*758e9fbaSOystein Eftevaag     return TSS2_RC_SUCCESS;
85*758e9fbaSOystein Eftevaag 
86*758e9fbaSOystein Eftevaag cleanup_return:
87*758e9fbaSOystein Eftevaag     /* If we created the tcti ourselves, we must clean it up */
88*758e9fbaSOystein Eftevaag     if ((*esys_context)->tcti_app_param == NULL && tcti != NULL) {
89*758e9fbaSOystein Eftevaag         Tss2_TctiLdr_Finalize(&tcti);
90*758e9fbaSOystein Eftevaag     }
91*758e9fbaSOystein Eftevaag 
92*758e9fbaSOystein Eftevaag     /* No need to finalize (*esys_context)->sys only free since
93*758e9fbaSOystein Eftevaag        it is the last goto in this function. */
94*758e9fbaSOystein Eftevaag     free((*esys_context)->sys);
95*758e9fbaSOystein Eftevaag     free(*esys_context);
96*758e9fbaSOystein Eftevaag     *esys_context = NULL;
97*758e9fbaSOystein Eftevaag     return r;
98*758e9fbaSOystein Eftevaag }
99*758e9fbaSOystein Eftevaag 
100*758e9fbaSOystein Eftevaag /** Finalize an ESYS_CONTEXT
101*758e9fbaSOystein Eftevaag  *
102*758e9fbaSOystein Eftevaag  * After interactions with the TPM the context holding the metadata needs to be
103*758e9fbaSOystein Eftevaag  * freed. Since additional internal memory allocations may have happened during
104*758e9fbaSOystein Eftevaag  * use of the context, it needs to be finalized correctly.
105*758e9fbaSOystein Eftevaag  * @param esys_context [in,out] The ESYS_CONTEXT. (will be freed and set to NULL)
106*758e9fbaSOystein Eftevaag  */
107*758e9fbaSOystein Eftevaag void
Esys_Finalize(ESYS_CONTEXT ** esys_context)108*758e9fbaSOystein Eftevaag Esys_Finalize(ESYS_CONTEXT ** esys_context)
109*758e9fbaSOystein Eftevaag {
110*758e9fbaSOystein Eftevaag     TSS2_RC r;
111*758e9fbaSOystein Eftevaag     TSS2_TCTI_CONTEXT *tctcontext = NULL;
112*758e9fbaSOystein Eftevaag 
113*758e9fbaSOystein Eftevaag     if (esys_context == NULL || *esys_context == NULL) {
114*758e9fbaSOystein Eftevaag         LOG_WARNING("Finalizing NULL context.");
115*758e9fbaSOystein Eftevaag         return;
116*758e9fbaSOystein Eftevaag     }
117*758e9fbaSOystein Eftevaag 
118*758e9fbaSOystein Eftevaag     /* Flush from TPM and free all resource objects first */
119*758e9fbaSOystein Eftevaag     iesys_DeleteAllResourceObjects(*esys_context);
120*758e9fbaSOystein Eftevaag 
121*758e9fbaSOystein Eftevaag     /* If no tcti context was provided during initialization, then we need to
122*758e9fbaSOystein Eftevaag        finalize the tcti context. So we retrieve here before finalizing the
123*758e9fbaSOystein Eftevaag        SAPI context. */
124*758e9fbaSOystein Eftevaag     if ((*esys_context)->tcti_app_param == NULL) {
125*758e9fbaSOystein Eftevaag         r = Tss2_Sys_GetTctiContext((*esys_context)->sys, &tctcontext);
126*758e9fbaSOystein Eftevaag         if (r != TSS2_RC_SUCCESS) {
127*758e9fbaSOystein Eftevaag             LOG_ERROR("Internal error in Tss2_Sys_GetTctiContext.");
128*758e9fbaSOystein Eftevaag             tctcontext = NULL;
129*758e9fbaSOystein Eftevaag         }
130*758e9fbaSOystein Eftevaag     }
131*758e9fbaSOystein Eftevaag 
132*758e9fbaSOystein Eftevaag     /* Finalize the syscontext */
133*758e9fbaSOystein Eftevaag     Tss2_Sys_Finalize((*esys_context)->sys);
134*758e9fbaSOystein Eftevaag     free((*esys_context)->sys);
135*758e9fbaSOystein Eftevaag 
136*758e9fbaSOystein Eftevaag     /* If no tcti context was provided during initialization, then we need to
137*758e9fbaSOystein Eftevaag        finalize the tcti context here. */
138*758e9fbaSOystein Eftevaag     if (tctcontext != NULL) {
139*758e9fbaSOystein Eftevaag         Tss2_TctiLdr_Finalize(&tctcontext);
140*758e9fbaSOystein Eftevaag     }
141*758e9fbaSOystein Eftevaag 
142*758e9fbaSOystein Eftevaag     /* Free esys_context */
143*758e9fbaSOystein Eftevaag     free(*esys_context);
144*758e9fbaSOystein Eftevaag     *esys_context = NULL;
145*758e9fbaSOystein Eftevaag }
146*758e9fbaSOystein Eftevaag 
147*758e9fbaSOystein Eftevaag /** Return the used TCTI context.
148*758e9fbaSOystein Eftevaag  *
149*758e9fbaSOystein Eftevaag  * If a tcti context was passed into Esys_Initialize then this tcti context is
150*758e9fbaSOystein Eftevaag  * return. If NULL was passed in, then NULL will be returned.
151*758e9fbaSOystein Eftevaag  * This function is useful before Esys_Finalize to retrieve the tcti context and
152*758e9fbaSOystein Eftevaag  * perform a clean Tss2_Tcti_Finalize.
153*758e9fbaSOystein Eftevaag  * @param esys_context [in] The ESYS_CONTEXT.
154*758e9fbaSOystein Eftevaag  * @param tcti [out] The TCTI context used to connect to the TPM (may be NULL).
155*758e9fbaSOystein Eftevaag  * @retval TSS2_RC_SUCCESS on Success.
156*758e9fbaSOystein Eftevaag  * @retval TSS2_ESYS_RC_BAD_REFERENCE if esysContext or tcti is NULL.
157*758e9fbaSOystein Eftevaag  */
158*758e9fbaSOystein Eftevaag TSS2_RC
Esys_GetTcti(ESYS_CONTEXT * esys_context,TSS2_TCTI_CONTEXT ** tcti)159*758e9fbaSOystein Eftevaag Esys_GetTcti(ESYS_CONTEXT * esys_context, TSS2_TCTI_CONTEXT ** tcti)
160*758e9fbaSOystein Eftevaag {
161*758e9fbaSOystein Eftevaag     _ESYS_ASSERT_NON_NULL(esys_context);
162*758e9fbaSOystein Eftevaag     _ESYS_ASSERT_NON_NULL(tcti);
163*758e9fbaSOystein Eftevaag     *tcti = esys_context->tcti_app_param;
164*758e9fbaSOystein Eftevaag     return TSS2_RC_SUCCESS;
165*758e9fbaSOystein Eftevaag }
166*758e9fbaSOystein Eftevaag 
167*758e9fbaSOystein Eftevaag /** Return the poll handles of the used TCTI.
168*758e9fbaSOystein Eftevaag  *
169*758e9fbaSOystein Eftevaag  * The connection to the TPM is held using a TCTI. These may optionally provide
170*758e9fbaSOystein Eftevaag  * handles that can be used to poll for incoming data. This is useful when
171*758e9fbaSOystein Eftevaag  * using the asynchronous function of ESAPI in an event-loop model.
172*758e9fbaSOystein Eftevaag  * @param esys_context [in] The ESYS_CONTEXT.
173*758e9fbaSOystein Eftevaag  * @param handles [out] The poll handles (callee-allocated, use free())
174*758e9fbaSOystein Eftevaag  * @param count [out] The number of poll handles.
175*758e9fbaSOystein Eftevaag  * @retval TSS2_RC_SUCCESS on Success.
176*758e9fbaSOystein Eftevaag  * @retval TSS2_ESYS_RC_BAD_REFERENCE if esysContext, handles or count is NULL.
177*758e9fbaSOystein Eftevaag  * @retval TSS2_RCs produced by lower layers of the software stack.
178*758e9fbaSOystein Eftevaag  */
179*758e9fbaSOystein Eftevaag TSS2_RC
Esys_GetPollHandles(ESYS_CONTEXT * esys_context,TSS2_TCTI_POLL_HANDLE ** handles,size_t * count)180*758e9fbaSOystein Eftevaag Esys_GetPollHandles(ESYS_CONTEXT * esys_context,
181*758e9fbaSOystein Eftevaag                     TSS2_TCTI_POLL_HANDLE ** handles, size_t * count)
182*758e9fbaSOystein Eftevaag {
183*758e9fbaSOystein Eftevaag     TSS2_RC r;
184*758e9fbaSOystein Eftevaag     TSS2_TCTI_CONTEXT *tcti_context;
185*758e9fbaSOystein Eftevaag 
186*758e9fbaSOystein Eftevaag     _ESYS_ASSERT_NON_NULL(esys_context);
187*758e9fbaSOystein Eftevaag     _ESYS_ASSERT_NON_NULL(handles);
188*758e9fbaSOystein Eftevaag     _ESYS_ASSERT_NON_NULL(count);
189*758e9fbaSOystein Eftevaag 
190*758e9fbaSOystein Eftevaag     /* Get the tcti-context to use */
191*758e9fbaSOystein Eftevaag     r = Tss2_Sys_GetTctiContext(esys_context->sys, &tcti_context);
192*758e9fbaSOystein Eftevaag     return_if_error(r, "Invalid SAPI or TCTI context.");
193*758e9fbaSOystein Eftevaag 
194*758e9fbaSOystein Eftevaag     /* Allocate the memory to hold the poll handles */
195*758e9fbaSOystein Eftevaag     r = Tss2_Tcti_GetPollHandles(tcti_context, NULL, count);
196*758e9fbaSOystein Eftevaag     return_if_error(r, "Error getting poll handle count.");
197*758e9fbaSOystein Eftevaag     *handles = calloc(*count, sizeof(TSS2_TCTI_POLL_HANDLE));
198*758e9fbaSOystein Eftevaag     return_if_null(*handles, "Out of memory.", TSS2_ESYS_RC_MEMORY);
199*758e9fbaSOystein Eftevaag 
200*758e9fbaSOystein Eftevaag     /* Retrieve the poll handles */
201*758e9fbaSOystein Eftevaag     r = Tss2_Tcti_GetPollHandles(tcti_context, *handles, count);
202*758e9fbaSOystein Eftevaag     return_if_error(r, "Error getting poll handles.");
203*758e9fbaSOystein Eftevaag     return r;
204*758e9fbaSOystein Eftevaag }
205*758e9fbaSOystein Eftevaag 
206*758e9fbaSOystein Eftevaag /** Set the timeout of Esys asynchronous functions.
207*758e9fbaSOystein Eftevaag  *
208*758e9fbaSOystein Eftevaag  * Sets the timeout for the _finish() functions in the asynchronous versions of
209*758e9fbaSOystein Eftevaag  * the Esys commands.
210*758e9fbaSOystein Eftevaag  * @param esys_context [in] The ESYS_CONTEXT.
211*758e9fbaSOystein Eftevaag  * @param timeout [in] The timeout in ms or -1 to block indefinately.
212*758e9fbaSOystein Eftevaag  * @retval TSS2_RC_SUCCESS on Success.
213*758e9fbaSOystein Eftevaag  * @retval TSS2_ESYS_RC_BAD_REFERENCE if esysContext is NULL.
214*758e9fbaSOystein Eftevaag  */
215*758e9fbaSOystein Eftevaag TSS2_RC
Esys_SetTimeout(ESYS_CONTEXT * esys_context,int32_t timeout)216*758e9fbaSOystein Eftevaag Esys_SetTimeout(ESYS_CONTEXT * esys_context, int32_t timeout)
217*758e9fbaSOystein Eftevaag {
218*758e9fbaSOystein Eftevaag     _ESYS_ASSERT_NON_NULL(esys_context);
219*758e9fbaSOystein Eftevaag     esys_context->timeout = timeout;
220*758e9fbaSOystein Eftevaag     return TSS2_RC_SUCCESS;
221*758e9fbaSOystein Eftevaag }
222*758e9fbaSOystein Eftevaag 
223*758e9fbaSOystein Eftevaag /** Helper function that returns sys contest from the give esys context.
224*758e9fbaSOystein Eftevaag  *
225*758e9fbaSOystein Eftevaag  * Function returns sys contest from the give esys context.
226*758e9fbaSOystein Eftevaag  * @param esys_context [in] ESYS context.
227*758e9fbaSOystein Eftevaag  * @param sys_context [out] SYS context.
228*758e9fbaSOystein Eftevaag  * @retval TSS2_RC_SUCCESS on Success.
229*758e9fbaSOystein Eftevaag  * @retval TSS2_ESYS_RC_BAD_REFERENCE if esys_context of sys_context are NULL.
230*758e9fbaSOystein Eftevaag  */
231*758e9fbaSOystein Eftevaag TSS2_RC
Esys_GetSysContext(ESYS_CONTEXT * esys_context,TSS2_SYS_CONTEXT ** sys_context)232*758e9fbaSOystein Eftevaag Esys_GetSysContext(ESYS_CONTEXT *esys_context, TSS2_SYS_CONTEXT **sys_context)
233*758e9fbaSOystein Eftevaag {
234*758e9fbaSOystein Eftevaag     if (esys_context == NULL || sys_context == NULL)
235*758e9fbaSOystein Eftevaag         return TSS2_ESYS_RC_BAD_REFERENCE;
236*758e9fbaSOystein Eftevaag 
237*758e9fbaSOystein Eftevaag     *sys_context = esys_context->sys;
238*758e9fbaSOystein Eftevaag 
239*758e9fbaSOystein Eftevaag     return TSS2_RC_SUCCESS;
240*758e9fbaSOystein Eftevaag }
241