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