xref: /aosp_15_r20/external/tpm2-tss/src/tss2-esys/esys_int.h (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 #ifndef ESYS_INT_H
7*758e9fbaSOystein Eftevaag #define ESYS_INT_H
8*758e9fbaSOystein Eftevaag 
9*758e9fbaSOystein Eftevaag #include <stdint.h>
10*758e9fbaSOystein Eftevaag #include "esys_types.h"
11*758e9fbaSOystein Eftevaag 
12*758e9fbaSOystein Eftevaag #ifdef __cplusplus
13*758e9fbaSOystein Eftevaag extern "C" {
14*758e9fbaSOystein Eftevaag #endif
15*758e9fbaSOystein Eftevaag 
16*758e9fbaSOystein Eftevaag /** Linked list type for object meta data.
17*758e9fbaSOystein Eftevaag  *
18*758e9fbaSOystein Eftevaag  * This structure represents a linked list to store meta data information of
19*758e9fbaSOystein Eftevaag  * type IESYS_RESOURCE.
20*758e9fbaSOystein Eftevaag  */
21*758e9fbaSOystein Eftevaag typedef struct RSRC_NODE_T {
22*758e9fbaSOystein Eftevaag     ESYS_TR esys_handle;        /**< The ESYS_TR handle used by the application
23*758e9fbaSOystein Eftevaag                                      to reference this entry. */
24*758e9fbaSOystein Eftevaag     TPM2B_AUTH auth;            /**< The authValue for this resource object. */
25*758e9fbaSOystein Eftevaag     IESYS_RESOURCE rsrc;        /**< The meta data for this resource object. */
26*758e9fbaSOystein Eftevaag     struct RSRC_NODE_T * next;  /**< The next object in the linked list. */
27*758e9fbaSOystein Eftevaag } RSRC_NODE_T;
28*758e9fbaSOystein Eftevaag 
29*758e9fbaSOystein Eftevaag typedef struct {
30*758e9fbaSOystein Eftevaag     ESYS_TR tpmKey;
31*758e9fbaSOystein Eftevaag     ESYS_TR bind;
32*758e9fbaSOystein Eftevaag     TPM2_SE sessionType;
33*758e9fbaSOystein Eftevaag     TPMI_ALG_HASH authHash;
34*758e9fbaSOystein Eftevaag     TPM2B_NONCE *nonceCaller;
35*758e9fbaSOystein Eftevaag     TPM2B_NONCE nonceCallerData;
36*758e9fbaSOystein Eftevaag     TPMT_SYM_DEF *symmetric;
37*758e9fbaSOystein Eftevaag     TPMT_SYM_DEF symmetricData;
38*758e9fbaSOystein Eftevaag } StartAuthSession_IN;
39*758e9fbaSOystein Eftevaag 
40*758e9fbaSOystein Eftevaag typedef struct {
41*758e9fbaSOystein Eftevaag     TPM2B_SENSITIVE_CREATE *inSensitive;
42*758e9fbaSOystein Eftevaag     TPM2B_SENSITIVE_CREATE inSensitiveData;
43*758e9fbaSOystein Eftevaag } CreatePrimary_IN;
44*758e9fbaSOystein Eftevaag 
45*758e9fbaSOystein Eftevaag typedef struct {
46*758e9fbaSOystein Eftevaag     ESYS_TR saveHandle;
47*758e9fbaSOystein Eftevaag } ContextSave_IN;
48*758e9fbaSOystein Eftevaag 
49*758e9fbaSOystein Eftevaag typedef struct {
50*758e9fbaSOystein Eftevaag     TPMS_CONTEXT *context;
51*758e9fbaSOystein Eftevaag     TPMS_CONTEXT contextData;
52*758e9fbaSOystein Eftevaag } ContextLoad_IN;
53*758e9fbaSOystein Eftevaag 
54*758e9fbaSOystein Eftevaag typedef struct {
55*758e9fbaSOystein Eftevaag     TPM2B_PUBLIC *inPublic;
56*758e9fbaSOystein Eftevaag     TPM2B_PUBLIC inPublicData;
57*758e9fbaSOystein Eftevaag } Load_IN;
58*758e9fbaSOystein Eftevaag 
59*758e9fbaSOystein Eftevaag typedef struct {
60*758e9fbaSOystein Eftevaag     TPM2B_PUBLIC *inPublic;
61*758e9fbaSOystein Eftevaag     TPM2B_PUBLIC inPublicData;
62*758e9fbaSOystein Eftevaag } LoadExternal_IN;
63*758e9fbaSOystein Eftevaag 
64*758e9fbaSOystein Eftevaag typedef struct {
65*758e9fbaSOystein Eftevaag     TPM2B_SENSITIVE_CREATE *inSensitive;
66*758e9fbaSOystein Eftevaag     TPM2B_SENSITIVE_CREATE inSensitiveData;
67*758e9fbaSOystein Eftevaag     TPM2B_TEMPLATE *inPublic;
68*758e9fbaSOystein Eftevaag     TPM2B_TEMPLATE inPublicData;
69*758e9fbaSOystein Eftevaag } CreateLoaded_IN;
70*758e9fbaSOystein Eftevaag 
71*758e9fbaSOystein Eftevaag typedef struct {
72*758e9fbaSOystein Eftevaag     ESYS_TR objectHandle;
73*758e9fbaSOystein Eftevaag     TPMI_DH_PERSISTENT persistentHandle;
74*758e9fbaSOystein Eftevaag } EvictControl_IN;
75*758e9fbaSOystein Eftevaag 
76*758e9fbaSOystein Eftevaag typedef struct {
77*758e9fbaSOystein Eftevaag     TPM2B_AUTH *auth;
78*758e9fbaSOystein Eftevaag     TPM2B_AUTH authData;
79*758e9fbaSOystein Eftevaag } HMAC_Start_IN;
80*758e9fbaSOystein Eftevaag 
81*758e9fbaSOystein Eftevaag typedef struct {
82*758e9fbaSOystein Eftevaag     ESYS_TR authHandle;
83*758e9fbaSOystein Eftevaag     TPM2B_AUTH *newAuth;
84*758e9fbaSOystein Eftevaag     TPM2B_AUTH newAuthData;
85*758e9fbaSOystein Eftevaag } HierarchyChangeAuth_IN;
86*758e9fbaSOystein Eftevaag 
87*758e9fbaSOystein Eftevaag typedef struct {
88*758e9fbaSOystein Eftevaag     ESYS_TR sequenceHandle;
89*758e9fbaSOystein Eftevaag } SequenceComplete_IN;
90*758e9fbaSOystein Eftevaag 
91*758e9fbaSOystein Eftevaag typedef struct {
92*758e9fbaSOystein Eftevaag     ESYS_TR policySession;
93*758e9fbaSOystein Eftevaag } Policy_IN;
94*758e9fbaSOystein Eftevaag 
95*758e9fbaSOystein Eftevaag typedef struct {
96*758e9fbaSOystein Eftevaag     ESYS_TR nvIndex;
97*758e9fbaSOystein Eftevaag     TPM2B_AUTH *auth;
98*758e9fbaSOystein Eftevaag     TPM2B_AUTH authData;
99*758e9fbaSOystein Eftevaag     TPM2B_NV_PUBLIC *publicInfo;
100*758e9fbaSOystein Eftevaag     TPM2B_NV_PUBLIC publicInfoData;
101*758e9fbaSOystein Eftevaag } NV_IN;
102*758e9fbaSOystein Eftevaag 
103*758e9fbaSOystein Eftevaag typedef struct {
104*758e9fbaSOystein Eftevaag     ESYS_TR flushHandle;
105*758e9fbaSOystein Eftevaag } FlushContext_IN;
106*758e9fbaSOystein Eftevaag 
107*758e9fbaSOystein Eftevaag /** Union for input parameters.
108*758e9fbaSOystein Eftevaag  *
109*758e9fbaSOystein Eftevaag  * The input parameters of a command need to be stored if they are needed
110*758e9fbaSOystein Eftevaag  * in corresponding _Finish() function.
111*758e9fbaSOystein Eftevaag  */
112*758e9fbaSOystein Eftevaag typedef union {
113*758e9fbaSOystein Eftevaag     StartAuthSession_IN StartAuthSession;
114*758e9fbaSOystein Eftevaag     CreatePrimary_IN CreatePrimary;
115*758e9fbaSOystein Eftevaag     ContextSave_IN ContextSave;
116*758e9fbaSOystein Eftevaag     ContextLoad_IN ContextLoad;
117*758e9fbaSOystein Eftevaag     Load_IN Load;
118*758e9fbaSOystein Eftevaag     LoadExternal_IN LoadExternal;
119*758e9fbaSOystein Eftevaag     CreateLoaded_IN CreateLoaded;
120*758e9fbaSOystein Eftevaag     EvictControl_IN EvictControl;
121*758e9fbaSOystein Eftevaag     HMAC_Start_IN HMAC_Start;
122*758e9fbaSOystein Eftevaag     HierarchyChangeAuth_IN HierarchyChangeAuth;
123*758e9fbaSOystein Eftevaag     SequenceComplete_IN SequenceComplete;
124*758e9fbaSOystein Eftevaag     Policy_IN Policy;
125*758e9fbaSOystein Eftevaag     NV_IN NV;
126*758e9fbaSOystein Eftevaag     FlushContext_IN FlushContext;
127*758e9fbaSOystein Eftevaag } IESYS_CMD_IN_PARAM;
128*758e9fbaSOystein Eftevaag 
129*758e9fbaSOystein Eftevaag /** The states for the ESAPI's internal state machine */
130*758e9fbaSOystein Eftevaag enum _ESYS_STATE {
131*758e9fbaSOystein Eftevaag     _ESYS_STATE_INIT = 0,     /**< The initial state after creation or after
132*758e9fbaSOystein Eftevaag                                    finishing a command. A new command can only
133*758e9fbaSOystein Eftevaag                                    be issued in this state. */
134*758e9fbaSOystein Eftevaag     _ESYS_STATE_SENT,         /**< The state after sending a command to the TPM
135*758e9fbaSOystein Eftevaag                                    before receiving a response. */
136*758e9fbaSOystein Eftevaag     _ESYS_STATE_RESUBMISSION, /**< The state after receiving a response from the
137*758e9fbaSOystein Eftevaag                                    TPM that requires resending of the command.*/
138*758e9fbaSOystein Eftevaag     _ESYS_STATE_INTERNALERROR /**< A non-recoverable error occured within the
139*758e9fbaSOystein Eftevaag                                    ESAPI code. */
140*758e9fbaSOystein Eftevaag };
141*758e9fbaSOystein Eftevaag 
142*758e9fbaSOystein Eftevaag /** The data structure holding internal state information.
143*758e9fbaSOystein Eftevaag  *
144*758e9fbaSOystein Eftevaag  * Each ESYS_CONTEXT respresents a logically independent connection to the TPM.
145*758e9fbaSOystein Eftevaag  * It stores meta data information about object in order to calculate session
146*758e9fbaSOystein Eftevaag  * auths and similar things.
147*758e9fbaSOystein Eftevaag  */
148*758e9fbaSOystein Eftevaag struct ESYS_CONTEXT {
149*758e9fbaSOystein Eftevaag     enum _ESYS_STATE state;      /**< The current state of the ESAPI context. */
150*758e9fbaSOystein Eftevaag     TSS2_SYS_CONTEXT *sys;       /**< The SYS context used internally to talk to
151*758e9fbaSOystein Eftevaag                                       the TPM. */
152*758e9fbaSOystein Eftevaag     ESYS_TR esys_handle_cnt;     /**< The next free ESYS_TR number. */
153*758e9fbaSOystein Eftevaag     RSRC_NODE_T *rsrc_list;      /**< The linked list of all ESYS_TR objects. */
154*758e9fbaSOystein Eftevaag     int32_t timeout;             /**< The timeout to be used during
155*758e9fbaSOystein Eftevaag                                       Tss2_Sys_ExecuteFinish. */
156*758e9fbaSOystein Eftevaag     ESYS_TR session_type[3];     /**< The list of TPM session handles in the
157*758e9fbaSOystein Eftevaag                                       current command execution. */
158*758e9fbaSOystein Eftevaag     RSRC_NODE_T *session_tab[3]; /**< The list of TPM session meta data in the
159*758e9fbaSOystein Eftevaag                                       current command execution. */
160*758e9fbaSOystein Eftevaag     int encryptNonceIdx;         /**< The index of the encrypt session. */
161*758e9fbaSOystein Eftevaag     TPM2B_NONCE *encryptNonce;   /**< The nonce of the encrypt session, or NULL
162*758e9fbaSOystein Eftevaag                                       if no encrypt session exists. */
163*758e9fbaSOystein Eftevaag     int authsCount;              /**< The number of session provided during the
164*758e9fbaSOystein Eftevaag                                       command. */
165*758e9fbaSOystein Eftevaag     int submissionCount;         /**< The current number of submissions of this
166*758e9fbaSOystein Eftevaag                                       command to the TPM. */
167*758e9fbaSOystein Eftevaag     TPM2B_DATA salt;             /**< The salt used during a StartAuthSession.*/
168*758e9fbaSOystein Eftevaag     IESYS_CMD_IN_PARAM in;       /**< Temporary storage for Input parameters
169*758e9fbaSOystein Eftevaag                                       needed in corresponding _Finish function*/
170*758e9fbaSOystein Eftevaag     ESYS_TR esys_handle;         /**< Temporary storage for the object's TPM
171*758e9fbaSOystein Eftevaag                                       handle during Esys_TR_FromTPMPublic. */
172*758e9fbaSOystein Eftevaag     TSS2_TCTI_CONTEXT *tcti_app_param;/**< The TCTI context provided by the
173*758e9fbaSOystein Eftevaag                                            application during Esys_Initialize()
174*758e9fbaSOystein Eftevaag                                            to be returned from Esys_GetTcti().*/
175*758e9fbaSOystein Eftevaag     void *dlhandle;              /**< The handle of dlopen if the tcti was
176*758e9fbaSOystein Eftevaag                                       automatically loaded. */
177*758e9fbaSOystein Eftevaag     IESYS_SESSION *enc_session;  /**< Ptr to the enc param session.
178*758e9fbaSOystein Eftevaag                                       Used to restore session attributes */
179*758e9fbaSOystein Eftevaag };
180*758e9fbaSOystein Eftevaag 
181*758e9fbaSOystein Eftevaag /** The number of authomatic resubmissions.
182*758e9fbaSOystein Eftevaag  *
183*758e9fbaSOystein Eftevaag  * The number of resubmissions before a TPM's TPM2_RC_YIELDED is forwarded to
184*758e9fbaSOystein Eftevaag  * the application.
185*758e9fbaSOystein Eftevaag  */
186*758e9fbaSOystein Eftevaag #define _ESYS_MAX_SUBMISSIONS 5
187*758e9fbaSOystein Eftevaag 
188*758e9fbaSOystein Eftevaag /** Makro testing parameters against null.
189*758e9fbaSOystein Eftevaag  */
190*758e9fbaSOystein Eftevaag #define _ESYS_ASSERT_NON_NULL(x) \
191*758e9fbaSOystein Eftevaag     if (x == NULL) { \
192*758e9fbaSOystein Eftevaag         LOG_ERROR(str(x) " == NULL."); \
193*758e9fbaSOystein Eftevaag         return TSS2_ESYS_RC_BAD_REFERENCE; \
194*758e9fbaSOystein Eftevaag     }
195*758e9fbaSOystein Eftevaag 
196*758e9fbaSOystein Eftevaag #ifdef __cplusplus
197*758e9fbaSOystein Eftevaag }
198*758e9fbaSOystein Eftevaag #endif
199*758e9fbaSOystein Eftevaag #endif /* ESYS_INT_H */
200