inc/azure_utpm_c/tpm_codec.h (244 lines of code) (raw):

// Copyright (c) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. #ifndef TPM_CODEC_H #define TPM_CODEC_H #ifdef __cplusplus #include <cstddef> extern "C" { #else #include <stddef.h> #endif /* __cplusplus */ #include "Tpm.h" #include "tpm_comm.h" #include "umock_c/umock_c_prod.h" // TSS status codes typedef enum { TSS_SUCCESS = 0, TSS_E_NOT_IMPL = 0x8000, TSS_E_INVALID_PARAM, TSS_E_SOCK_INIT, TSS_E_SOCK_SHUTDOWN, TSS_E_TPM_CONNECT, TSS_E_TPM_SIM_STARTUP, TSS_E_TPM_SIM_INCOMPAT_VER, // TPM communication failure TSS_E_COMM = 0x80280100, TSS_E_TPM_TRANSACTION = TSS_E_COMM + 0x0001, TSS_E_TPM_SIM_BAD_ACK = TSS_E_COMM + 0x0002, TSS_E_BAD_RESPONSE = TSS_E_COMM + 0x0010, TSS_E_BAD_RESPONSE_LEN = TSS_E_COMM + 0x0011 } TSS_STATUS; // TPM Device management typedef enum { // Flags corresponding to the TpmEndPointInfo values used by the TPM simulator TSS_TpmPlatformAvailable = 0x01, TSS_TpmUsesTbs = 0x02, TSS_TpmInRawMode = 0x04, TSS_TpmSupportsPP = 0x08, // TPM connection type. Flags are mutually exclusive for better error checking TSS_SocketConn = 0x1000, TSS_TbsConn = 0x2000 } TSS_TPM_CONN_INFO; typedef struct { // A set of TSS_TPM_CONN_INFO flags UINT32 TpmInfo; // Handle to the connection to the underlying TPM device //TSS_TPM_CONN_HANDLE TpmConnHandle; TPM_COMM_HANDLE tpm_comm_handle; // Raw response code returned by the last command executed by the given TPM device TPM_RC LastRawResponse; const char* comms_endpoint; } TSS_DEVICE; // TSS extensions of the TPM 2.0 command interafce typedef struct { TPMS_AUTH_COMMAND SessIn; TPMS_AUTH_RESPONSE SessOut; } TSS_SESSION; MOCKABLE_FUNCTION(, TPM_RC, TSS_CreatePwAuthSession, TPM2B_AUTH*, authValue, TSS_SESSION*, session); MOCKABLE_FUNCTION(, TPM_RC, TSS_StartAuthSession, TSS_DEVICE*, tpm, TPM_SE, sessionType, TPMI_ALG_HASH, authHash, TPMA_SESSION, sessAttrs, TSS_SESSION*, session); MOCKABLE_FUNCTION(, UINT32, SignData, TSS_DEVICE*, tpm, TSS_SESSION*, sess, BYTE*, tokenData, UINT32, tokenSize, BYTE*, signatureBuffer, UINT32, sigBufSize); MOCKABLE_FUNCTION(, TPM_RC, TPM2_SequenceUpdate, TSS_DEVICE*, tpm, TSS_SESSION*, session, TPMI_DH_OBJECT, sequenceHandle, TPM2B_MAX_BUFFER*, buffer); MOCKABLE_FUNCTION(, TPM_RC, TPM2_Sign, TSS_DEVICE*, tpm, TSS_SESSION*, session, TPMI_DH_OBJECT, keyHandle, TPM2B_DIGEST*, digest, TPMT_SIG_SCHEME*, inScheme, TPMT_TK_HASHCHECK*, validation, TPMT_SIGNATURE*, signature); MOCKABLE_FUNCTION(, TPM_RC, TSS_StartHmacAuthSession, TSS_DEVICE*, tpm, TPM_SE, sessionType, TPMI_ALG_HASH, authHash, TPMA_SESSION, sessAttrs, TSS_SESSION*, session); MOCKABLE_FUNCTION(, TPM_RC, TSS_CreatePrimary, TSS_DEVICE*, tpm, TSS_SESSION*, sess, TPM_HANDLE, hierarchy, TPM2B_PUBLIC*, inPub, TPM_HANDLE*, outHandle, TPM2B_PUBLIC*, outPub); MOCKABLE_FUNCTION(, TPM_RC, TSS_Create, TSS_DEVICE*, tpm, TSS_SESSION*, sess, TPM_HANDLE, parent, TPM2B_SENSITIVE_CREATE*, sensCreate, TPM2B_PUBLIC*, inPub, TPM2B_PRIVATE*, outPriv, TPM2B_PUBLIC*, outPub); MOCKABLE_FUNCTION(, UINT32, TSS_GetTpmProperty, TSS_DEVICE*, tpm, TPM_PT, prop); MOCKABLE_FUNCTION(, TPM_HANDLE, TSS_CreatePersistentKey, TSS_DEVICE*, tpm_device, TPM_HANDLE, request_handle, TSS_SESSION*, sess, TPMI_DH_OBJECT, hierarchy, TPM2B_PUBLIC*, inPub, TPM2B_PUBLIC*, outPub); TPM_RC TSS_Hash( TSS_DEVICE *tpm, // IN/OUT BYTE *data, // IN UINT32 dataSize, // IN TPMI_ALG_HASH hashAlg, // IN TPM2B_DIGEST *outHash // OUT ); MOCKABLE_FUNCTION(, TPM_RC, TSS_HMAC, TSS_DEVICE*, tpm, TSS_SESSION*, session, TPMI_DH_OBJECT, handle, BYTE*, data, UINT32, dataSize, TPM2B_DIGEST*, outHMAC); TPM_RC TSS_SequenceComplete( TSS_DEVICE *tpm, // IN/OUT TSS_SESSION *session, // IN/OUT TPMI_DH_OBJECT sequenceHandle, // IN BYTE *data, // IN UINT32 dataSize, // IN TPM2B_DIGEST *result // OUT ); TPM_RC TSS_SequenceUpdate( TSS_DEVICE *tpm, // IN/OUT TSS_SESSION *session, // IN/OUT TPMI_DH_OBJECT sequenceHandle, // IN BYTE *data, // IN UINT32 dataSize // IN ); TPM_RC TSS_Sign( TSS_DEVICE *tpm, // IN/OUT TSS_SESSION *session, // IN/OUT TPMI_DH_OBJECT keyHandle, // IN TPM2B_DIGEST *digest, // IN TPMT_SIGNATURE *signature // OUT ); MOCKABLE_FUNCTION(, TPM_RC, TSS_PolicySecret, TSS_DEVICE*, tpm, TSS_SESSION*, session, TPMI_DH_ENTITY, authHandle, TSS_SESSION*, policySession, TPM2B_NONCE*, nonceTPM, INT32, expiration); // Represents fields of the TPMA_OBJECT bit field typedef enum _OBJECT_ATTR { FixedTPM = 0x2, StClear = 0x4, FixedParent = 0x10, SensitiveDataOrigin = 0x20, UserWithAuth = 0x40, AdminWithPolicy = 0x80, NoDA = 0x400, EncryptedDuplication = 0x800, Restricted = 0x10000, Decrypt = 0x20000, Sign = 0x40000, Encrypt = 0x40000 } OBJECT_ATTR; MOCKABLE_FUNCTION(, TPMA_OBJECT, ToTpmaObject, UINT32, attrs); MOCKABLE_FUNCTION(, TPM_RC, Initialize_TPM_Codec, TSS_DEVICE*, tpm); MOCKABLE_FUNCTION(, void, Deinit_TPM_Codec, TSS_DEVICE*, tpm); // TPM 2.0 command interafce MOCKABLE_FUNCTION(, TPM_RC, TPM2_ActivateCredential, TSS_DEVICE*, tpm, TSS_SESSION*, activateSess, TSS_SESSION*, keySess, TPMI_DH_OBJECT, activateHandle, TPMI_DH_OBJECT, keyHandle, TPM2B_ID_OBJECT*, credentialBlob, TPM2B_ENCRYPTED_SECRET*, secret, TPM2B_DIGEST*, certInfo); TPM_RC TPM2_Create( TSS_DEVICE *tpm, // IN/OUT TSS_SESSION *session, // IN/OUT TPMI_DH_OBJECT parentHandle, // IN TPM2B_SENSITIVE_CREATE *inSensitive, // IN TPM2B_PUBLIC *inPublic, // IN TPM2B_DATA *outsideInfo, // IN TPML_PCR_SELECTION *creationPCR, // IN TPM2B_PRIVATE *outPrivate, // OUT TPM2B_PUBLIC *outPublic, // OUT TPM2B_CREATION_DATA *creationData, // OUT TPM2B_DIGEST *creationHash, // OUT TPMT_TK_CREATION *creationTicket // OUT ); TPM_RC TPM2_CreatePrimary( TSS_DEVICE *tpm, // IN/OUT TSS_SESSION *session, // IN/OUT TPMI_DH_OBJECT primaryHandle, // IN TPM2B_SENSITIVE_CREATE *inSensitive, // IN TPM2B_PUBLIC *inPublic, // IN TPM2B_DATA *outsideInfo, // IN TPML_PCR_SELECTION *creationPCR, // IN TPM_HANDLE *objectHandle, // OUT TPM2B_PUBLIC *outPublic, // OUT TPM2B_CREATION_DATA *creationData, // OUT TPM2B_DIGEST *creationHash, // OUT TPMT_TK_CREATION *creationTicket // OUT ); MOCKABLE_FUNCTION(, TPM_RC, TPM2_EncryptDecrypt, TSS_DEVICE*, tpm, TSS_SESSION*, session, TPMI_DH_OBJECT, keyHandle, TPMI_YES_NO, decrypt, TPM_ALG_ID, cipherMode, TPM2B_IV*, ivIn, TPM2B_MAX_BUFFER*, inData, TPM2B_MAX_BUFFER*, outData, TPM2B_IV*, ivOut); MOCKABLE_FUNCTION(, TPM_RC, TPM2_EvictControl, TSS_DEVICE*, tpm, TSS_SESSION*, session, TPMI_RH_PROVISION, auth, TPMI_DH_OBJECT, objectHandle, TPMI_DH_PERSISTENT, persistentHandle); MOCKABLE_FUNCTION(, TPM_RC, TPM2_FlushContext, TSS_DEVICE*, tpm, TPMI_DH_CONTEXT, flushHandle); TPM_RC TPM2_GetCapability( TSS_DEVICE *tpm, // IN/OUT TPM_CAP capability, // IN UINT32 property, // IN UINT32 propertyCount, // IN TPMI_YES_NO *moreData, // OUT TPMS_CAPABILITY_DATA *capabilityData // OUT ); TPM_RC TPM2_Hash( TSS_DEVICE *tpm, // IN/OUT TPM2B_MAX_BUFFER *data, // IN TPMI_ALG_HASH hashAlg, // IN TPMI_RH_HIERARCHY hierarchy, // IN TPM2B_DIGEST *outHash, // OUT TPMT_TK_HASHCHECK *validation // OUT ); TPM_RC TPM2_HashSequenceStart( TSS_DEVICE *tpm, // IN/OUT TPM2B_AUTH *auth, // IN [opt] TPMI_ALG_HASH hashAlg, // IN TPMI_DH_OBJECT *sequenceHandle // OUT ); MOCKABLE_FUNCTION(, TPM_RC, TPM2_HMAC, TSS_DEVICE*, tpm, TSS_SESSION*, session, TPMI_DH_OBJECT, handle, TPM2B_MAX_BUFFER*, buffer, TPMI_ALG_HASH, hashAlg, TPM2B_DIGEST*, outHMAC); TPM_RC TPM2_HMAC_Start( TSS_DEVICE *tpm, // IN/OUT TSS_SESSION *session, // IN/OUT TPMI_DH_OBJECT handle, // IN TPM2B_AUTH *auth, // IN [opt] TPMI_ALG_HASH hashAlg, // IN TPMI_DH_OBJECT *sequenceHandle // OUT ); MOCKABLE_FUNCTION(, TPM_RC, TPM2_Import, TSS_DEVICE*, tpm, TSS_SESSION*, session, TPMI_DH_OBJECT, parentHandle, TPM2B_DATA*, encryptionKey, TPM2B_PUBLIC*, objectPublic, TPM2B_PRIVATE*, duplicate, TPM2B_ENCRYPTED_SECRET*, inSymSeed, TPMT_SYM_DEF_OBJECT*, symmetricAlg, TPM2B_PRIVATE*, outPrivate); MOCKABLE_FUNCTION(, TPM_RC, TPM2_Load, TSS_DEVICE*, tpm, TSS_SESSION*, session, TPMI_DH_OBJECT, parentHandle, TPM2B_PRIVATE*, inPrivate, TPM2B_PUBLIC*, inPublic, TPM_HANDLE*, objectHandle, TPM2B_NAME*, name); TPM_RC TPM2_PolicySecret( TSS_DEVICE *tpm, // IN/OUT TSS_SESSION *session, // IN/OUT TPMI_DH_ENTITY authHandle, // IN TPMI_SH_POLICY policySession, // IN TPM2B_NONCE *nonceTPM, // IN [opt] TPM2B_DIGEST *cpHashA, // IN [opt] TPM2B_NONCE *policyRef, // IN [opt] INT32 expiration, // IN [opt] TPM2B_TIMEOUT *timeout, // OUT TPMT_TK_AUTH *policyTicket // OUT [opt] ); MOCKABLE_FUNCTION(, TPM_RC, TPM2_ReadPublic, TSS_DEVICE*, tpm, TPMI_DH_OBJECT, objectHandle, TPM2B_PUBLIC*, outPublic, TPM2B_NAME*, name, TPM2B_NAME*, qualifiedName); TPM_RC TPM2_StartAuthSession( TSS_DEVICE *tpm, // IN/OUT TPMI_DH_OBJECT tpmKey, // IN TPMI_DH_ENTITY bind, // IN TPM2B_NONCE *nonceCaller, // IN TPM2B_ENCRYPTED_SECRET *encryptedSalt, // IN TPM_SE sessionType, // IN TPMT_SYM_DEF *symmetric, // IN TPMI_ALG_HASH authHash, // IN TPMI_SH_AUTH_SESSION *sessionHandle, // OUT TPM2B_NONCE *nonceTPM // OUT ); TPM_RC TPM2_Startup( TSS_DEVICE *tpm, // IN/OUT TPM_SU startupType // IN ); // // TPM commands handling // UINT32 TSS_BuildCommand( TPM_CC cmdCode, // IN: Command code TPM_HANDLE *handles, // IN (opt): Array of handles used by the command INT32 numHandles, // IN: Number of handles in 'handles' TSS_SESSION **sessions, // IN (opt): Array of sessions INT32 numSessions, // IN: Number of sessions in 'sessions' BYTE *params, // IN (opt): Marshaled command parameters INT32 paramsSize, // IN: Size of 'params' in bytes BYTE *cmdBuffer, // OUT: Command buffer ready for sending to TPM INT32 bufCapacity // IN: Capacity of 'cmdBuffer' in bytes ); TSS_STATUS TSS_SendCommand( TSS_DEVICE *tpm, // IN: TPM device BYTE *cmdBuffer, // IN: Command buffer INT32 cmdSize, // IN: Size of 'cmdBuffer' in bytes BYTE *respBuffer, // IN: Buffer for response to receive from TPM INT32 *respSize // IN/OUT: IN: Capacity of 'respBuffer' in bytes // OUT: Size of data in 'respBuffer' ); UINT16 TSS_GetDigestSize( TPM_ALG_ID hashAlg // IN: hash algorithm to look up ); void TSS_RandomBytes( BYTE *buf, // OUT: buffer to fill with random bytes int bufSize // Number of random bytes to generate ); #ifdef __cplusplus } #endif /* __cplusplus */ #endif // TPM_CODEC_H