blob: d470bced074166699fda6e1813a1c6618580035b [file] [log] [blame]
/* SPDX-License-Identifier: BSD-2-Clause */
/*******************************************************************************
* Copyright 2017, Fraunhofer SIT sponsored by Infineon Technologies AG
* All rights reserved.
*******************************************************************************/
#ifndef ESYS_INT_H
#define ESYS_INT_H
#include <stdint.h>
#include "esys_types.h"
#ifdef __cplusplus
extern "C" {
#endif
/** Linked list type for object meta data.
*
* This structure represents a linked list to store meta data information of
* type IESYS_RESOURCE.
*/
typedef struct RSRC_NODE_T {
ESYS_TR esys_handle; /**< The ESYS_TR handle used by the application
to reference this entry. */
TPM2B_AUTH auth; /**< The authValue for this resource object. */
IESYS_RESOURCE rsrc; /**< The meta data for this resource object. */
struct RSRC_NODE_T * next; /**< The next object in the linked list. */
} RSRC_NODE_T;
typedef struct {
ESYS_TR tpmKey;
ESYS_TR bind;
TPM2_SE sessionType;
TPMI_ALG_HASH authHash;
TPM2B_NONCE *nonceCaller;
TPM2B_NONCE nonceCallerData;
TPMT_SYM_DEF *symmetric;
TPMT_SYM_DEF symmetricData;
} StartAuthSession_IN;
typedef struct {
TPM2B_SENSITIVE_CREATE *inSensitive;
TPM2B_SENSITIVE_CREATE inSensitiveData;
} CreatePrimary_IN;
typedef struct {
ESYS_TR saveHandle;
} ContextSave_IN;
typedef struct {
TPMS_CONTEXT *context;
TPMS_CONTEXT contextData;
} ContextLoad_IN;
typedef struct {
TPM2B_PUBLIC *inPublic;
TPM2B_PUBLIC inPublicData;
} Load_IN;
typedef struct {
TPM2B_PUBLIC *inPublic;
TPM2B_PUBLIC inPublicData;
} LoadExternal_IN;
typedef struct {
TPM2B_SENSITIVE_CREATE *inSensitive;
TPM2B_SENSITIVE_CREATE inSensitiveData;
TPM2B_TEMPLATE *inPublic;
TPM2B_TEMPLATE inPublicData;
} CreateLoaded_IN;
typedef struct {
ESYS_TR objectHandle;
TPMI_DH_PERSISTENT persistentHandle;
} EvictControl_IN;
typedef struct {
TPM2B_AUTH *auth;
TPM2B_AUTH authData;
} HMAC_Start_IN;
typedef struct {
ESYS_TR authHandle;
TPM2B_AUTH *newAuth;
TPM2B_AUTH newAuthData;
} HierarchyChangeAuth_IN;
typedef struct {
ESYS_TR sequenceHandle;
} SequenceComplete_IN;
typedef struct {
ESYS_TR policySession;
} Policy_IN;
typedef struct {
ESYS_TR nvIndex;
TPM2B_AUTH *auth;
TPM2B_AUTH authData;
TPM2B_NV_PUBLIC *publicInfo;
TPM2B_NV_PUBLIC publicInfoData;
} NV_IN;
typedef struct {
ESYS_TR flushHandle;
} FlushContext_IN;
/** Union for input parameters.
*
* The input parameters of a command need to be stored if they are needed
* in corresponding _Finish() function.
*/
typedef union {
StartAuthSession_IN StartAuthSession;
CreatePrimary_IN CreatePrimary;
ContextSave_IN ContextSave;
ContextLoad_IN ContextLoad;
Load_IN Load;
LoadExternal_IN LoadExternal;
CreateLoaded_IN CreateLoaded;
EvictControl_IN EvictControl;
HMAC_Start_IN HMAC_Start;
HierarchyChangeAuth_IN HierarchyChangeAuth;
SequenceComplete_IN SequenceComplete;
Policy_IN Policy;
NV_IN NV;
FlushContext_IN FlushContext;
} IESYS_CMD_IN_PARAM;
/** The states for the ESAPI's internal state machine */
enum _ESYS_STATE {
_ESYS_STATE_INIT = 0, /**< The initial state after creation or after
finishing a command. A new command can only
be issued in this state. */
_ESYS_STATE_SENT, /**< The state after sending a command to the TPM
before receiving a response. */
_ESYS_STATE_RESUBMISSION, /**< The state after receiving a response from the
TPM that requires resending of the command.*/
_ESYS_STATE_INTERNALERROR /**< A non-recoverable error occured within the
ESAPI code. */
};
/** The data structure holding internal state information.
*
* Each ESYS_CONTEXT respresents a logically independent connection to the TPM.
* It stores meta data information about object in order to calculate session
* auths and similar things.
*/
struct ESYS_CONTEXT {
enum _ESYS_STATE state; /**< The current state of the ESAPI context. */
TSS2_SYS_CONTEXT *sys; /**< The SYS context used internally to talk to
the TPM. */
ESYS_TR esys_handle_cnt; /**< The next free ESYS_TR number. */
RSRC_NODE_T *rsrc_list; /**< The linked list of all ESYS_TR objects. */
int32_t timeout; /**< The timeout to be used during
Tss2_Sys_ExecuteFinish. */
ESYS_TR session_type[3]; /**< The list of TPM session handles in the
current command execution. */
RSRC_NODE_T *session_tab[3]; /**< The list of TPM session meta data in the
current command execution. */
int encryptNonceIdx; /**< The index of the encrypt session. */
TPM2B_NONCE *encryptNonce; /**< The nonce of the encrypt session, or NULL
if no encrypt session exists. */
int authsCount; /**< The number of session provided during the
command. */
int submissionCount; /**< The current number of submissions of this
command to the TPM. */
TPM2B_DATA salt; /**< The salt used during a StartAuthSession.*/
IESYS_CMD_IN_PARAM in; /**< Temporary storage for Input parameters
needed in corresponding _Finish function*/
ESYS_TR esys_handle; /**< Temporary storage for the object's TPM
handle during Esys_TR_FromTPMPublic. */
TSS2_TCTI_CONTEXT *tcti_app_param;/**< The TCTI context provided by the
application during Esys_Initialize()
to be returned from Esys_GetTcti().*/
void *dlhandle; /**< The handle of dlopen if the tcti was
automatically loaded. */
IESYS_SESSION *enc_session; /**< Ptr to the enc param session.
Used to restore session attributes */
};
/** The number of authomatic resubmissions.
*
* The number of resubmissions before a TPM's TPM2_RC_YIELDED is forwarded to
* the application.
*/
#define _ESYS_MAX_SUBMISSIONS 5
/** Makro testing parameters against null.
*/
#define _ESYS_ASSERT_NON_NULL(x) \
if (x == NULL) { \
LOG_ERROR(str(x) " == NULL."); \
return TSS2_ESYS_RC_BAD_REFERENCE; \
}
#ifdef __cplusplus
}
#endif
#endif /* ESYS_INT_H */