mirror of https://github.com/wolfSSL/wolfTPM.git
3702 lines
105 KiB
C
3702 lines
105 KiB
C
/* tpm2.h
|
|
*
|
|
* Copyright (C) 2006-2022 wolfSSL Inc.
|
|
*
|
|
* This file is part of wolfTPM.
|
|
*
|
|
* wolfTPM is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* wolfTPM is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
|
|
*/
|
|
|
|
#ifndef __TPM2_H__
|
|
#define __TPM2_H__
|
|
|
|
#include <wolftpm/tpm2_types.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
/** @defgroup TPM2_Standard TPM2 Standard Commands
|
|
*
|
|
* wolfTPM has support for all TPM 2.0 Commands as defined in the TCG specification.
|
|
*
|
|
* wolfTPM has internal TIS layer to enable communication with a TPM 2.0 on every system:
|
|
* * Baremetal
|
|
* * RTOS
|
|
* * Windows systems
|
|
* * Hybrid SoC
|
|
* * Linux using /dev/tpm0
|
|
* * Linux using devspi
|
|
* * Linux using i2c driver
|
|
*
|
|
* Typically, a wolfTPM developer would use the wolfTPM2 wrappers for quicker development.
|
|
*
|
|
* If you want to use TPM 2.0 Commands directly See tpm2.h under Files -> File List above.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
/* ---------------------------------------------------------------------------*/
|
|
/* TYPES */
|
|
/* ---------------------------------------------------------------------------*/
|
|
|
|
typedef UINT32 TPM_ALGORITHM_ID;
|
|
typedef UINT32 TPM_MODIFIER_INDICATOR;
|
|
typedef UINT32 TPM_AUTHORIZATION_SIZE;
|
|
typedef UINT32 TPM_PARAMETER_SIZE;
|
|
typedef UINT16 TPM_KEY_SIZE;
|
|
typedef UINT16 TPM_KEY_BITS;
|
|
typedef UINT32 TPM_GENERATED;
|
|
|
|
/* ---------------------------------------------------------------------------*/
|
|
/* ENUMERATIONS */
|
|
/* ---------------------------------------------------------------------------*/
|
|
|
|
#define TPM_SPEC_FAMILY 0x322E3000
|
|
#define TPM_SPEC_LEVEL 0
|
|
#define TPM_SPEC_VERSION 138
|
|
#define TPM_SPEC_YEAR 2016
|
|
#define TPM_SPEC_DAY_OF_YEAR 273
|
|
|
|
#define TPM_GENERATED_VALUE 0xff544347
|
|
|
|
|
|
typedef enum {
|
|
TPM_ALG_ERROR = 0x0000,
|
|
TPM_ALG_RSA = 0x0001,
|
|
TPM_ALG_SHA = 0x0004,
|
|
TPM_ALG_SHA1 = TPM_ALG_SHA,
|
|
TPM_ALG_HMAC = 0x0005,
|
|
TPM_ALG_AES = 0x0006,
|
|
TPM_ALG_MGF1 = 0x0007,
|
|
TPM_ALG_KEYEDHASH = 0x0008,
|
|
TPM_ALG_XOR = 0x000A,
|
|
TPM_ALG_SHA256 = 0x000B,
|
|
TPM_ALG_SHA384 = 0x000C,
|
|
TPM_ALG_SHA512 = 0x000D,
|
|
TPM_ALG_NULL = 0x0010,
|
|
TPM_ALG_SM3_256 = 0x0012,
|
|
TPM_ALG_SM4 = 0x0013,
|
|
TPM_ALG_RSASSA = 0x0014,
|
|
TPM_ALG_RSAES = 0x0015,
|
|
TPM_ALG_RSAPSS = 0x0016,
|
|
TPM_ALG_OAEP = 0x0017,
|
|
TPM_ALG_ECDSA = 0x0018,
|
|
TPM_ALG_ECDH = 0x0019,
|
|
TPM_ALG_ECDAA = 0x001A,
|
|
TPM_ALG_SM2 = 0x001B,
|
|
TPM_ALG_ECSCHNORR = 0x001C,
|
|
TPM_ALG_ECMQV = 0x001D,
|
|
TPM_ALG_KDF1_SP800_56A = 0x0020,
|
|
TPM_ALG_KDF2 = 0x0021,
|
|
TPM_ALG_KDF1_SP800_108 = 0x0022,
|
|
TPM_ALG_ECC = 0x0023,
|
|
TPM_ALG_SYMCIPHER = 0x0025,
|
|
TPM_ALG_CAMELLIA = 0x0026,
|
|
TPM_ALG_CTR = 0x0040,
|
|
TPM_ALG_OFB = 0x0041,
|
|
TPM_ALG_CBC = 0x0042,
|
|
TPM_ALG_CFB = 0x0043,
|
|
TPM_ALG_ECB = 0x0044,
|
|
} TPM_ALG_ID_T;
|
|
typedef UINT16 TPM_ALG_ID;
|
|
|
|
typedef enum {
|
|
TPM_ECC_NONE = 0x0000,
|
|
TPM_ECC_NIST_P192 = 0x0001,
|
|
TPM_ECC_NIST_P224 = 0x0002,
|
|
TPM_ECC_NIST_P256 = 0x0003,
|
|
TPM_ECC_NIST_P384 = 0x0004,
|
|
TPM_ECC_NIST_P521 = 0x0005,
|
|
TPM_ECC_BN_P256 = 0x0010,
|
|
TPM_ECC_BN_P638 = 0x0011,
|
|
TPM_ECC_SM2_P256 = 0x0020,
|
|
} TPM_ECC_CURVE_T;
|
|
typedef UINT16 TPM_ECC_CURVE;
|
|
|
|
/* Command Codes */
|
|
typedef enum {
|
|
TPM_CC_FIRST = 0x0000011F,
|
|
TPM_CC_NV_UndefineSpaceSpecial = TPM_CC_FIRST,
|
|
TPM_CC_EvictControl = 0x00000120,
|
|
TPM_CC_HierarchyControl = 0x00000121,
|
|
TPM_CC_NV_UndefineSpace = 0x00000122,
|
|
TPM_CC_ChangeEPS = 0x00000124,
|
|
TPM_CC_ChangePPS = 0x00000125,
|
|
TPM_CC_Clear = 0x00000126,
|
|
TPM_CC_ClearControl = 0x00000127,
|
|
TPM_CC_ClockSet = 0x00000128,
|
|
TPM_CC_HierarchyChangeAuth = 0x00000129,
|
|
TPM_CC_NV_DefineSpace = 0x0000012A,
|
|
TPM_CC_PCR_Allocate = 0x0000012B,
|
|
TPM_CC_PCR_SetAuthPolicy = 0x0000012C,
|
|
TPM_CC_PP_Commands = 0x0000012D,
|
|
TPM_CC_SetPrimaryPolicy = 0x0000012E,
|
|
TPM_CC_FieldUpgradeStart = 0x0000012F,
|
|
TPM_CC_ClockRateAdjust = 0x00000130,
|
|
TPM_CC_CreatePrimary = 0x00000131,
|
|
TPM_CC_NV_GlobalWriteLock = 0x00000132,
|
|
TPM_CC_GetCommandAuditDigest = 0x00000133,
|
|
TPM_CC_NV_Increment = 0x00000134,
|
|
TPM_CC_NV_SetBits = 0x00000135,
|
|
TPM_CC_NV_Extend = 0x00000136,
|
|
TPM_CC_NV_Write = 0x00000137,
|
|
TPM_CC_NV_WriteLock = 0x00000138,
|
|
TPM_CC_DictionaryAttackLockReset = 0x00000139,
|
|
TPM_CC_DictionaryAttackParameters = 0x0000013A,
|
|
TPM_CC_NV_ChangeAuth = 0x0000013B,
|
|
TPM_CC_PCR_Event = 0x0000013C,
|
|
TPM_CC_PCR_Reset = 0x0000013D,
|
|
TPM_CC_SequenceComplete = 0x0000013E,
|
|
TPM_CC_SetAlgorithmSet = 0x0000013F,
|
|
TPM_CC_SetCommandCodeAuditStatus = 0x00000140,
|
|
TPM_CC_FieldUpgradeData = 0x00000141,
|
|
TPM_CC_IncrementalSelfTest = 0x00000142,
|
|
TPM_CC_SelfTest = 0x00000143,
|
|
TPM_CC_Startup = 0x00000144,
|
|
TPM_CC_Shutdown = 0x00000145,
|
|
TPM_CC_StirRandom = 0x00000146,
|
|
TPM_CC_ActivateCredential = 0x00000147,
|
|
TPM_CC_Certify = 0x00000148,
|
|
TPM_CC_PolicyNV = 0x00000149,
|
|
TPM_CC_CertifyCreation = 0x0000014A,
|
|
TPM_CC_Duplicate = 0x0000014B,
|
|
TPM_CC_GetTime = 0x0000014C,
|
|
TPM_CC_GetSessionAuditDigest = 0x0000014D,
|
|
TPM_CC_NV_Read = 0x0000014E,
|
|
TPM_CC_NV_ReadLock = 0x0000014F,
|
|
TPM_CC_ObjectChangeAuth = 0x00000150,
|
|
TPM_CC_PolicySecret = 0x00000151,
|
|
TPM_CC_Rewrap = 0x00000152,
|
|
TPM_CC_Create = 0x00000153,
|
|
TPM_CC_ECDH_ZGen = 0x00000154,
|
|
TPM_CC_HMAC = 0x00000155,
|
|
TPM_CC_Import = 0x00000156,
|
|
TPM_CC_Load = 0x00000157,
|
|
TPM_CC_Quote = 0x00000158,
|
|
TPM_CC_RSA_Decrypt = 0x00000159,
|
|
TPM_CC_HMAC_Start = 0x0000015B,
|
|
TPM_CC_SequenceUpdate = 0x0000015C,
|
|
TPM_CC_Sign = 0x0000015D,
|
|
TPM_CC_Unseal = 0x0000015E,
|
|
TPM_CC_PolicySigned = 0x00000160,
|
|
TPM_CC_ContextLoad = 0x00000161,
|
|
TPM_CC_ContextSave = 0x00000162,
|
|
TPM_CC_ECDH_KeyGen = 0x00000163,
|
|
TPM_CC_EncryptDecrypt = 0x00000164,
|
|
TPM_CC_FlushContext = 0x00000165,
|
|
TPM_CC_LoadExternal = 0x00000167,
|
|
TPM_CC_MakeCredential = 0x00000168,
|
|
TPM_CC_NV_ReadPublic = 0x00000169,
|
|
TPM_CC_PolicyAuthorize = 0x0000016A,
|
|
TPM_CC_PolicyAuthValue = 0x0000016B,
|
|
TPM_CC_PolicyCommandCode = 0x0000016C,
|
|
TPM_CC_PolicyCounterTimer = 0x0000016D,
|
|
TPM_CC_PolicyCpHash = 0x0000016E,
|
|
TPM_CC_PolicyLocality = 0x0000016F,
|
|
TPM_CC_PolicyNameHash = 0x00000170,
|
|
TPM_CC_PolicyOR = 0x00000171,
|
|
TPM_CC_PolicyTicket = 0x00000172,
|
|
TPM_CC_ReadPublic = 0x00000173,
|
|
TPM_CC_RSA_Encrypt = 0x00000174,
|
|
TPM_CC_StartAuthSession = 0x00000176,
|
|
TPM_CC_VerifySignature = 0x00000177,
|
|
TPM_CC_ECC_Parameters = 0x00000178,
|
|
TPM_CC_FirmwareRead = 0x00000179,
|
|
TPM_CC_GetCapability = 0x0000017A,
|
|
TPM_CC_GetRandom = 0x0000017B,
|
|
TPM_CC_GetTestResult = 0x0000017C,
|
|
TPM_CC_Hash = 0x0000017D,
|
|
TPM_CC_PCR_Read = 0x0000017E,
|
|
TPM_CC_PolicyPCR = 0x0000017F,
|
|
TPM_CC_PolicyRestart = 0x00000180,
|
|
TPM_CC_ReadClock = 0x00000181,
|
|
TPM_CC_PCR_Extend = 0x00000182,
|
|
TPM_CC_PCR_SetAuthValue = 0x00000183,
|
|
TPM_CC_NV_Certify = 0x00000184,
|
|
TPM_CC_EventSequenceComplete = 0x00000185,
|
|
TPM_CC_HashSequenceStart = 0x00000186,
|
|
TPM_CC_PolicyPhysicalPresence = 0x00000187,
|
|
TPM_CC_PolicyDuplicationSelect = 0x00000188,
|
|
TPM_CC_PolicyGetDigest = 0x00000189,
|
|
TPM_CC_TestParms = 0x0000018A,
|
|
TPM_CC_Commit = 0x0000018B,
|
|
TPM_CC_PolicyPassword = 0x0000018C,
|
|
TPM_CC_ZGen_2Phase = 0x0000018D,
|
|
TPM_CC_EC_Ephemeral = 0x0000018E,
|
|
TPM_CC_PolicyNvWritten = 0x0000018F,
|
|
TPM_CC_PolicyTemplate = 0x00000190,
|
|
TPM_CC_CreateLoaded = 0x00000191,
|
|
TPM_CC_PolicyAuthorizeNV = 0x00000192,
|
|
TPM_CC_EncryptDecrypt2 = 0x00000193,
|
|
TPM_CC_LAST = TPM_CC_EncryptDecrypt2,
|
|
|
|
CC_VEND = 0x20000000,
|
|
TPM_CC_Vendor_TCG_Test = CC_VEND + 0x0000,
|
|
#if defined(WOLFTPM_ST33) || defined(WOLFTPM_AUTODETECT)
|
|
TPM_CC_SetMode = CC_VEND + 0x0307,
|
|
TPM_CC_SetCommandSet = CC_VEND + 0x0309,
|
|
TPM_CC_GetRandom2 = CC_VEND + 0x030E,
|
|
#endif
|
|
#ifdef WOLFTPM_ST33
|
|
TPM_CC_RestoreEK = CC_VEND + 0x030A,
|
|
TPM_CC_SetCommandSetLock = CC_VEND + 0x030B,
|
|
TPM_CC_GPIO_Config = CC_VEND + 0x030F,
|
|
#endif
|
|
#ifdef WOLFTPM_NUVOTON
|
|
TPM_CC_NTC2_PreConfig = CC_VEND + 0x0211,
|
|
TPM_CC_NTC2_GetConfig = CC_VEND + 0x0213,
|
|
#endif
|
|
} TPM_CC_T;
|
|
typedef UINT32 TPM_CC;
|
|
|
|
/* Response Codes */
|
|
typedef enum {
|
|
TPM_RC_SUCCESS = 0x000,
|
|
TPM_RC_BAD_TAG = 0x01E,
|
|
|
|
RC_VER1 = 0x100,
|
|
TPM_RC_INITIALIZE = RC_VER1 + 0x000,
|
|
TPM_RC_FAILURE = RC_VER1 + 0x001,
|
|
TPM_RC_SEQUENCE = RC_VER1 + 0x003,
|
|
TPM_RC_PRIVATE = RC_VER1 + 0x00B,
|
|
TPM_RC_HMAC = RC_VER1 + 0x019,
|
|
TPM_RC_DISABLED = RC_VER1 + 0x020,
|
|
TPM_RC_EXCLUSIVE = RC_VER1 + 0x021,
|
|
TPM_RC_AUTH_TYPE = RC_VER1 + 0x024,
|
|
TPM_RC_AUTH_MISSING = RC_VER1 + 0x025,
|
|
TPM_RC_POLICY = RC_VER1 + 0x026,
|
|
TPM_RC_PCR = RC_VER1 + 0x027,
|
|
TPM_RC_PCR_CHANGED = RC_VER1 + 0x028,
|
|
TPM_RC_UPGRADE = RC_VER1 + 0x02D,
|
|
TPM_RC_TOO_MANY_CONTEXTS = RC_VER1 + 0x02E,
|
|
TPM_RC_AUTH_UNAVAILABLE = RC_VER1 + 0x02F,
|
|
TPM_RC_REBOOT = RC_VER1 + 0x030,
|
|
TPM_RC_UNBALANCED = RC_VER1 + 0x031,
|
|
TPM_RC_COMMAND_SIZE = RC_VER1 + 0x042,
|
|
TPM_RC_COMMAND_CODE = RC_VER1 + 0x043,
|
|
TPM_RC_AUTHSIZE = RC_VER1 + 0x044,
|
|
TPM_RC_AUTH_CONTEXT = RC_VER1 + 0x045,
|
|
TPM_RC_NV_RANGE = RC_VER1 + 0x046,
|
|
TPM_RC_NV_SIZE = RC_VER1 + 0x047,
|
|
TPM_RC_NV_LOCKED = RC_VER1 + 0x048,
|
|
TPM_RC_NV_AUTHORIZATION = RC_VER1 + 0x049,
|
|
TPM_RC_NV_UNINITIALIZED = RC_VER1 + 0x04A,
|
|
TPM_RC_NV_SPACE = RC_VER1 + 0x04B,
|
|
TPM_RC_NV_DEFINED = RC_VER1 + 0x04C,
|
|
TPM_RC_BAD_CONTEXT = RC_VER1 + 0x050,
|
|
TPM_RC_CPHASH = RC_VER1 + 0x051,
|
|
TPM_RC_PARENT = RC_VER1 + 0x052,
|
|
TPM_RC_NEEDS_TEST = RC_VER1 + 0x053,
|
|
TPM_RC_NO_RESULT = RC_VER1 + 0x054,
|
|
TPM_RC_SENSITIVE = RC_VER1 + 0x055,
|
|
RC_MAX_FM0 = RC_VER1 + 0x07F,
|
|
|
|
RC_FMT1 = 0x080,
|
|
TPM_RC_ASYMMETRIC = RC_FMT1 + 0x001,
|
|
TPM_RC_ATTRIBUTES = RC_FMT1 + 0x002,
|
|
TPM_RC_HASH = RC_FMT1 + 0x003,
|
|
TPM_RC_VALUE = RC_FMT1 + 0x004,
|
|
TPM_RC_HIERARCHY = RC_FMT1 + 0x005,
|
|
TPM_RC_KEY_SIZE = RC_FMT1 + 0x007,
|
|
TPM_RC_MGF = RC_FMT1 + 0x008,
|
|
TPM_RC_MODE = RC_FMT1 + 0x009,
|
|
TPM_RC_TYPE = RC_FMT1 + 0x00A,
|
|
TPM_RC_HANDLE = RC_FMT1 + 0x00B,
|
|
TPM_RC_KDF = RC_FMT1 + 0x00C,
|
|
TPM_RC_RANGE = RC_FMT1 + 0x00D,
|
|
TPM_RC_AUTH_FAIL = RC_FMT1 + 0x00E,
|
|
TPM_RC_NONCE = RC_FMT1 + 0x00F,
|
|
TPM_RC_PP = RC_FMT1 + 0x010,
|
|
TPM_RC_SCHEME = RC_FMT1 + 0x012,
|
|
TPM_RC_SIZE = RC_FMT1 + 0x015,
|
|
TPM_RC_SYMMETRIC = RC_FMT1 + 0x016,
|
|
TPM_RC_TAG = RC_FMT1 + 0x017,
|
|
TPM_RC_SELECTOR = RC_FMT1 + 0x018,
|
|
TPM_RC_INSUFFICIENT = RC_FMT1 + 0x01A,
|
|
TPM_RC_SIGNATURE = RC_FMT1 + 0x01B,
|
|
TPM_RC_KEY = RC_FMT1 + 0x01C,
|
|
TPM_RC_POLICY_FAIL = RC_FMT1 + 0x01D,
|
|
TPM_RC_INTEGRITY = RC_FMT1 + 0x01F,
|
|
TPM_RC_TICKET = RC_FMT1 + 0x020,
|
|
TPM_RC_RESERVED_BITS = RC_FMT1 + 0x021,
|
|
TPM_RC_BAD_AUTH = RC_FMT1 + 0x022,
|
|
TPM_RC_EXPIRED = RC_FMT1 + 0x023,
|
|
TPM_RC_POLICY_CC = RC_FMT1 + 0x024,
|
|
TPM_RC_BINDING = RC_FMT1 + 0x025,
|
|
TPM_RC_CURVE = RC_FMT1 + 0x026,
|
|
TPM_RC_ECC_POINT = RC_FMT1 + 0x027,
|
|
RC_MAX_FMT1 = RC_FMT1 + 0x03F,
|
|
|
|
RC_WARN = 0x900,
|
|
TPM_RC_CONTEXT_GAP = RC_WARN + 0x001,
|
|
TPM_RC_OBJECT_MEMORY = RC_WARN + 0x002,
|
|
TPM_RC_SESSION_MEMORY = RC_WARN + 0x003,
|
|
TPM_RC_MEMORY = RC_WARN + 0x004,
|
|
TPM_RC_SESSION_HANDLES = RC_WARN + 0x005,
|
|
TPM_RC_OBJECT_HANDLES = RC_WARN + 0x006,
|
|
TPM_RC_LOCALITY = RC_WARN + 0x007,
|
|
TPM_RC_YIELDED = RC_WARN + 0x008,
|
|
TPM_RC_CANCELED = RC_WARN + 0x009,
|
|
TPM_RC_TESTING = RC_WARN + 0x00A,
|
|
TPM_RC_REFERENCE_H0 = RC_WARN + 0x010,
|
|
TPM_RC_REFERENCE_H1 = RC_WARN + 0x011,
|
|
TPM_RC_REFERENCE_H2 = RC_WARN + 0x012,
|
|
TPM_RC_REFERENCE_H3 = RC_WARN + 0x013,
|
|
TPM_RC_REFERENCE_H4 = RC_WARN + 0x014,
|
|
TPM_RC_REFERENCE_H5 = RC_WARN + 0x015,
|
|
TPM_RC_REFERENCE_H6 = RC_WARN + 0x016,
|
|
TPM_RC_REFERENCE_S0 = RC_WARN + 0x018,
|
|
TPM_RC_REFERENCE_S1 = RC_WARN + 0x019,
|
|
TPM_RC_REFERENCE_S2 = RC_WARN + 0x01A,
|
|
TPM_RC_REFERENCE_S3 = RC_WARN + 0x01B,
|
|
TPM_RC_REFERENCE_S4 = RC_WARN + 0x01C,
|
|
TPM_RC_REFERENCE_S5 = RC_WARN + 0x01D,
|
|
TPM_RC_REFERENCE_S6 = RC_WARN + 0x01E,
|
|
TPM_RC_NV_RATE = RC_WARN + 0x020,
|
|
TPM_RC_LOCKOUT = RC_WARN + 0x021,
|
|
TPM_RC_RETRY = RC_WARN + 0x022,
|
|
TPM_RC_NV_UNAVAILABLE = RC_WARN + 0x023,
|
|
RC_MAX_WARN = RC_WARN + 0x03F,
|
|
|
|
TPM_RC_NOT_USED = RC_WARN + 0x07F,
|
|
|
|
TPM_RC_H = 0x000,
|
|
TPM_RC_P = 0x040,
|
|
TPM_RC_S = 0x800,
|
|
TPM_RC_1 = 0x100,
|
|
TPM_RC_2 = 0x200,
|
|
TPM_RC_3 = 0x300,
|
|
TPM_RC_4 = 0x400,
|
|
TPM_RC_5 = 0x500,
|
|
TPM_RC_6 = 0x600,
|
|
TPM_RC_7 = 0x700,
|
|
TPM_RC_8 = 0x800,
|
|
TPM_RC_9 = 0x900,
|
|
TPM_RC_A = 0xA00,
|
|
TPM_RC_B = 0xB00,
|
|
TPM_RC_C = 0xC00,
|
|
TPM_RC_D = 0xD00,
|
|
TPM_RC_E = 0xE00,
|
|
TPM_RC_F = 0xF00,
|
|
TPM_RC_N_MASK = 0xF00,
|
|
|
|
/* use negative codes for internal errors */
|
|
TPM_RC_TIMEOUT = -100,
|
|
} TPM_RC_T;
|
|
typedef INT32 TPM_RC; /* type is unsigned 16-bits, but internally use signed 32-bit */
|
|
|
|
typedef enum {
|
|
TPM_CLOCK_COARSE_SLOWER = -3,
|
|
TPM_CLOCK_MEDIUM_SLOWER = -2,
|
|
TPM_CLOCK_FINE_SLOWER = -1,
|
|
TPM_CLOCK_NO_CHANGE = 0,
|
|
TPM_CLOCK_FINE_FASTER = 1,
|
|
TPM_CLOCK_MEDIUM_FASTER = 2,
|
|
TPM_CLOCK_COARSE_FASTER = 3,
|
|
} TPM_CLOCK_ADJUST_T;
|
|
typedef UINT8 TPM_CLOCK_ADJUST;
|
|
|
|
/* EA Arithmetic Operands */
|
|
typedef enum {
|
|
TPM_EO_EQ = 0x0000,
|
|
TPM_EO_NEQ = 0x0001,
|
|
TPM_EO_SIGNED_GT = 0x0002,
|
|
TPM_EO_UNSIGNED_GT = 0x0003,
|
|
TPM_EO_SIGNED_LT = 0x0004,
|
|
TPM_EO_UNSIGNED_LT = 0x0005,
|
|
TPM_EO_SIGNED_GE = 0x0006,
|
|
TPM_EO_UNSIGNED_GE = 0x0007,
|
|
TPM_EO_SIGNED_LE = 0x0008,
|
|
TPM_EO_UNSIGNED_LE = 0x0009,
|
|
TPM_EO_BITSET = 0x000A,
|
|
TPM_EO_BITCLEAR = 0x000B,
|
|
} TPM_EO_T;
|
|
typedef UINT16 TPM_EO;
|
|
|
|
/* Structure Tags */
|
|
typedef enum {
|
|
TPM_ST_RSP_COMMAND = 0x00C4,
|
|
TPM_ST_NULL = 0X8000,
|
|
TPM_ST_NO_SESSIONS = 0x8001,
|
|
TPM_ST_SESSIONS = 0x8002,
|
|
TPM_ST_ATTEST_NV = 0x8014,
|
|
TPM_ST_ATTEST_COMMAND_AUDIT = 0x8015,
|
|
TPM_ST_ATTEST_SESSION_AUDIT = 0x8016,
|
|
TPM_ST_ATTEST_CERTIFY = 0x8017,
|
|
TPM_ST_ATTEST_QUOTE = 0x8018,
|
|
TPM_ST_ATTEST_TIME = 0x8019,
|
|
TPM_ST_ATTEST_CREATION = 0x801A,
|
|
TPM_ST_CREATION = 0x8021,
|
|
TPM_ST_VERIFIED = 0x8022,
|
|
TPM_ST_AUTH_SECRET = 0x8023,
|
|
TPM_ST_HASHCHECK = 0x8024,
|
|
TPM_ST_AUTH_SIGNED = 0x8025,
|
|
TPM_ST_FU_MANIFEST = 0x8029,
|
|
} TPM_ST_T;
|
|
typedef UINT16 TPM_ST;
|
|
|
|
/* Session Type */
|
|
typedef enum {
|
|
TPM_SE_HMAC = 0x00,
|
|
TPM_SE_POLICY = 0x01,
|
|
TPM_SE_TRIAL = 0x03,
|
|
} TPM_SE_T;
|
|
typedef UINT8 TPM_SE;
|
|
|
|
|
|
/* Startup Type */
|
|
typedef enum {
|
|
TPM_SU_CLEAR = 0x0000,
|
|
TPM_SU_STATE = 0x0001,
|
|
} TPM_SU_T;
|
|
typedef UINT16 TPM_SU;
|
|
|
|
/* Capabilities */
|
|
typedef enum {
|
|
TPM_CAP_FIRST = 0x00000000,
|
|
TPM_CAP_ALGS = TPM_CAP_FIRST,
|
|
TPM_CAP_HANDLES = 0x00000001,
|
|
TPM_CAP_COMMANDS = 0x00000002,
|
|
TPM_CAP_PP_COMMANDS = 0x00000003,
|
|
TPM_CAP_AUDIT_COMMANDS = 0x00000004,
|
|
TPM_CAP_PCRS = 0x00000005,
|
|
TPM_CAP_TPM_PROPERTIES = 0x00000006,
|
|
TPM_CAP_PCR_PROPERTIES = 0x00000007,
|
|
TPM_CAP_ECC_CURVES = 0x00000008,
|
|
TPM_CAP_LAST = TPM_CAP_ECC_CURVES,
|
|
|
|
TPM_CAP_VENDOR_PROPERTY = 0x00000100,
|
|
} TPM_CAP_T;
|
|
typedef UINT32 TPM_CAP;
|
|
|
|
/* Property Tag */
|
|
typedef enum {
|
|
TPM_PT_NONE = 0x00000000,
|
|
PT_GROUP = 0x00000100,
|
|
|
|
PT_FIXED = PT_GROUP * 1,
|
|
TPM_PT_FAMILY_INDICATOR = PT_FIXED + 0,
|
|
TPM_PT_LEVEL = PT_FIXED + 1,
|
|
TPM_PT_REVISION = PT_FIXED + 2,
|
|
TPM_PT_DAY_OF_YEAR = PT_FIXED + 3,
|
|
TPM_PT_YEAR = PT_FIXED + 4,
|
|
TPM_PT_MANUFACTURER = PT_FIXED + 5,
|
|
TPM_PT_VENDOR_STRING_1 = PT_FIXED + 6,
|
|
TPM_PT_VENDOR_STRING_2 = PT_FIXED + 7,
|
|
TPM_PT_VENDOR_STRING_3 = PT_FIXED + 8,
|
|
TPM_PT_VENDOR_STRING_4 = PT_FIXED + 9,
|
|
TPM_PT_VENDOR_TPM_TYPE = PT_FIXED + 10,
|
|
TPM_PT_FIRMWARE_VERSION_1 = PT_FIXED + 11,
|
|
TPM_PT_FIRMWARE_VERSION_2 = PT_FIXED + 12,
|
|
TPM_PT_INPUT_BUFFER = PT_FIXED + 13,
|
|
TPM_PT_HR_TRANSIENT_MIN = PT_FIXED + 14,
|
|
TPM_PT_HR_PERSISTENT_MIN = PT_FIXED + 15,
|
|
TPM_PT_HR_LOADED_MIN = PT_FIXED + 16,
|
|
TPM_PT_ACTIVE_SESSIONS_MAX = PT_FIXED + 17,
|
|
TPM_PT_PCR_COUNT = PT_FIXED + 18,
|
|
TPM_PT_PCR_SELECT_MIN = PT_FIXED + 19,
|
|
TPM_PT_CONTEXT_GAP_MAX = PT_FIXED + 20,
|
|
TPM_PT_NV_COUNTERS_MAX = PT_FIXED + 22,
|
|
TPM_PT_NV_INDEX_MAX = PT_FIXED + 23,
|
|
TPM_PT_MEMORY = PT_FIXED + 24,
|
|
TPM_PT_CLOCK_UPDATE = PT_FIXED + 25,
|
|
TPM_PT_CONTEXT_HASH = PT_FIXED + 26,
|
|
TPM_PT_CONTEXT_SYM = PT_FIXED + 27,
|
|
TPM_PT_CONTEXT_SYM_SIZE = PT_FIXED + 28,
|
|
TPM_PT_ORDERLY_COUNT = PT_FIXED + 29,
|
|
TPM_PT_MAX_COMMAND_SIZE = PT_FIXED + 30,
|
|
TPM_PT_MAX_RESPONSE_SIZE = PT_FIXED + 31,
|
|
TPM_PT_MAX_DIGEST = PT_FIXED + 32,
|
|
TPM_PT_MAX_OBJECT_CONTEXT = PT_FIXED + 33,
|
|
TPM_PT_MAX_SESSION_CONTEXT = PT_FIXED + 34,
|
|
TPM_PT_PS_FAMILY_INDICATOR = PT_FIXED + 35,
|
|
TPM_PT_PS_LEVEL = PT_FIXED + 36,
|
|
TPM_PT_PS_REVISION = PT_FIXED + 37,
|
|
TPM_PT_PS_DAY_OF_YEAR = PT_FIXED + 38,
|
|
TPM_PT_PS_YEAR = PT_FIXED + 39,
|
|
TPM_PT_SPLIT_MAX = PT_FIXED + 40,
|
|
TPM_PT_TOTAL_COMMANDS = PT_FIXED + 41,
|
|
TPM_PT_LIBRARY_COMMANDS = PT_FIXED + 42,
|
|
TPM_PT_VENDOR_COMMANDS = PT_FIXED + 43,
|
|
TPM_PT_NV_BUFFER_MAX = PT_FIXED + 44,
|
|
TPM_PT_MODES = PT_FIXED + 45,
|
|
TPM_PT_MAX_CAP_BUFFER = PT_FIXED + 46,
|
|
|
|
PT_VAR = PT_GROUP * 2,
|
|
TPM_PT_PERMANENT = PT_VAR + 0,
|
|
TPM_PT_STARTUP_CLEAR = PT_VAR + 1,
|
|
TPM_PT_HR_NV_INDEX = PT_VAR + 2,
|
|
TPM_PT_HR_LOADED = PT_VAR + 3,
|
|
TPM_PT_HR_LOADED_AVAIL = PT_VAR + 4,
|
|
TPM_PT_HR_ACTIVE = PT_VAR + 5,
|
|
TPM_PT_HR_ACTIVE_AVAIL = PT_VAR + 6,
|
|
TPM_PT_HR_TRANSIENT_AVAIL = PT_VAR + 7,
|
|
TPM_PT_HR_PERSISTENT = PT_VAR + 8,
|
|
TPM_PT_HR_PERSISTENT_AVAIL = PT_VAR + 9,
|
|
TPM_PT_NV_COUNTERS = PT_VAR + 10,
|
|
TPM_PT_NV_COUNTERS_AVAIL = PT_VAR + 11,
|
|
TPM_PT_ALGORITHM_SET = PT_VAR + 12,
|
|
TPM_PT_LOADED_CURVES = PT_VAR + 13,
|
|
TPM_PT_LOCKOUT_COUNTER = PT_VAR + 14,
|
|
TPM_PT_MAX_AUTH_FAIL = PT_VAR + 15,
|
|
TPM_PT_LOCKOUT_INTERVAL = PT_VAR + 16,
|
|
TPM_PT_LOCKOUT_RECOVERY = PT_VAR + 17,
|
|
TPM_PT_NV_WRITE_RECOVERY = PT_VAR + 18,
|
|
TPM_PT_AUDIT_COUNTER_0 = PT_VAR + 19,
|
|
TPM_PT_AUDIT_COUNTER_1 = PT_VAR + 20,
|
|
} TPM_PT_T;
|
|
typedef UINT32 TPM_PT;
|
|
|
|
/* PCR Property Tag */
|
|
typedef enum {
|
|
TPM_PT_PCR_FIRST = 0x00000000,
|
|
TPM_PT_PCR_SAVE = TPM_PT_PCR_FIRST,
|
|
TPM_PT_PCR_EXTEND_L0 = 0x00000001,
|
|
TPM_PT_PCR_RESET_L0 = 0x00000002,
|
|
TPM_PT_PCR_EXTEND_L1 = 0x00000003,
|
|
TPM_PT_PCR_RESET_L1 = 0x00000004,
|
|
TPM_PT_PCR_EXTEND_L2 = 0x00000005,
|
|
TPM_PT_PCR_RESET_L2 = 0x00000006,
|
|
TPM_PT_PCR_EXTEND_L3 = 0x00000007,
|
|
TPM_PT_PCR_RESET_L3 = 0x00000008,
|
|
TPM_PT_PCR_EXTEND_L4 = 0x00000009,
|
|
TPM_PT_PCR_RESET_L4 = 0x0000000A,
|
|
TPM_PT_PCR_NO_INCREMENT = 0x00000011,
|
|
TPM_PT_PCR_DRTM_RESET = 0x00000012,
|
|
TPM_PT_PCR_POLICY = 0x00000013,
|
|
TPM_PT_PCR_AUTH = 0x00000014,
|
|
TPM_PT_PCR_LAST = TPM_PT_PCR_AUTH,
|
|
} TPM_PT_PCR_T;
|
|
typedef UINT32 TPM_PT_PCR;
|
|
|
|
/* Platform Specific */
|
|
typedef enum {
|
|
TPM_PS_MAIN = 0x00000000,
|
|
TPM_PS_PC = 0x00000001,
|
|
TPM_PS_PDA = 0x00000002,
|
|
TPM_PS_CELL_PHONE = 0x00000003,
|
|
TPM_PS_SERVER = 0x00000004,
|
|
TPM_PS_PERIPHERAL = 0x00000005,
|
|
TPM_PS_TSS = 0x00000006,
|
|
TPM_PS_STORAGE = 0x00000007,
|
|
TPM_PS_AUTHENTICATION = 0x00000008,
|
|
TPM_PS_EMBEDDED = 0x00000009,
|
|
TPM_PS_HARDCOPY = 0x0000000A,
|
|
TPM_PS_INFRASTRUCTURE = 0x0000000B,
|
|
TPM_PS_VIRTUALIZATION = 0x0000000C,
|
|
TPM_PS_TNC = 0x0000000D,
|
|
TPM_PS_MULTI_TENANT = 0x0000000E,
|
|
TPM_PS_TC = 0x0000000F,
|
|
} TPM_PS_T;
|
|
typedef UINT32 TPM_PS;
|
|
|
|
|
|
/* HANDLES */
|
|
typedef UINT32 TPM_HANDLE;
|
|
|
|
/* Handle Types */
|
|
typedef enum {
|
|
TPM_HT_PCR = 0x00,
|
|
TPM_HT_NV_INDEX = 0x01,
|
|
TPM_HT_HMAC_SESSION = 0x02,
|
|
TPM_HT_LOADED_SESSION = 0x02,
|
|
TPM_HT_POLICY_SESSION = 0x03,
|
|
TPM_HT_ACTIVE_SESSION = 0x03,
|
|
TPM_HT_PERMANENT = 0x40,
|
|
TPM_HT_TRANSIENT = 0x80,
|
|
TPM_HT_PERSISTENT = 0x81,
|
|
} TPM_HT_T;
|
|
typedef UINT8 TPM_HT;
|
|
|
|
/* Permanent Handles */
|
|
typedef enum {
|
|
TPM_RH_FIRST = 0x40000000,
|
|
TPM_RH_SRK = TPM_RH_FIRST,
|
|
TPM_RH_OWNER = 0x40000001,
|
|
TPM_RH_REVOKE = 0x40000002,
|
|
TPM_RH_TRANSPORT = 0x40000003,
|
|
TPM_RH_OPERATOR = 0x40000004,
|
|
TPM_RH_ADMIN = 0x40000005,
|
|
TPM_RH_EK = 0x40000006,
|
|
TPM_RH_NULL = 0x40000007,
|
|
TPM_RH_UNASSIGNED = 0x40000008,
|
|
TPM_RS_PW = 0x40000009,
|
|
TPM_RH_LOCKOUT = 0x4000000A,
|
|
TPM_RH_ENDORSEMENT = 0x4000000B,
|
|
TPM_RH_PLATFORM = 0x4000000C,
|
|
TPM_RH_PLATFORM_NV = 0x4000000D,
|
|
TPM_RH_AUTH_00 = 0x40000010,
|
|
TPM_RH_AUTH_FF = 0x4000010F,
|
|
TPM_RH_LAST = TPM_RH_AUTH_FF,
|
|
} TPM_RH_T;
|
|
typedef UINT32 TPM_RH;
|
|
|
|
/* Handle Value Constants */
|
|
/* Using defines, not "enum TPM_HC_T" to avoid pedantic error:
|
|
* "ISO C restricts enumerator values to range of 'int'"
|
|
*/
|
|
#define HR_HANDLE_MASK 0x00FFFFFFUL
|
|
#define HR_RANGE_MASK 0xFF000000UL
|
|
#define HR_SHIFT 24
|
|
#define HR_PCR ((UINT32)TPM_HT_PCR << HR_SHIFT)
|
|
#define HR_HMAC_SESSION ((UINT32)TPM_HT_HMAC_SESSION << HR_SHIFT)
|
|
#define HR_POLICY_SESSION ((UINT32)TPM_HT_POLICY_SESSION << HR_SHIFT)
|
|
#define HR_TRANSIENT ((UINT32)TPM_HT_TRANSIENT << HR_SHIFT)
|
|
#define HR_PERSISTENT ((UINT32)TPM_HT_PERSISTENT << HR_SHIFT)
|
|
#define HR_NV_INDEX ((UINT32)TPM_HT_NV_INDEX << HR_SHIFT)
|
|
#define HR_PERMANENT ((UINT32)TPM_HT_PERMANENT << HR_SHIFT)
|
|
#define PCR_FIRST (HR_PCR + 0)
|
|
#define PCR_LAST (PCR_FIRST + IMPLEMENTATION_PCR-1)
|
|
#define HMAC_SESSION_FIRST (HR_HMAC_SESSION + 0)
|
|
#define HMAC_SESSION_LAST (HMAC_SESSION_FIRST+MAX_ACTIVE_SESSIONS-1)
|
|
#define LOADED_SESSION_FIRST HMAC_SESSION_FIRST
|
|
#define LOADED_SESSION_LAST HMAC_SESSION_LAST
|
|
#define POLICY_SESSION_FIRST (HR_POLICY_SESSION + 0)
|
|
#define POLICY_SESSION_LAST (POLICY_SESSION_FIRST+MAX_ACTIVE_SESSIONS-1)
|
|
#define TRANSIENT_FIRST (HR_TRANSIENT + 0)
|
|
#define ACTIVE_SESSION_FIRST POLICY_SESSION_FIRST
|
|
#define ACTIVE_SESSION_LAST POLICY_SESSION_LAST
|
|
#define TRANSIENT_LAST (TRANSIENT_FIRST+MAX_LOADED_OBJECTS-1)
|
|
#define PERSISTENT_FIRST (HR_PERSISTENT + 0)
|
|
#define PERSISTENT_LAST (PERSISTENT_FIRST + 0x00FFFFFFUL)
|
|
#define PLATFORM_PERSISTENT (PERSISTENT_FIRST + 0x00800000UL)
|
|
#define NV_INDEX_FIRST (HR_NV_INDEX + 0)
|
|
#define NV_INDEX_LAST (NV_INDEX_FIRST + 0x00FFFFFFUL)
|
|
#define PERMANENT_FIRST TPM_RH_FIRST
|
|
#define PERMANENT_LAST TPM_RH_LAST
|
|
typedef UINT32 TPM_HC;
|
|
|
|
|
|
/* Attributes */
|
|
typedef UINT32 TPMA_ALGORITHM;
|
|
enum TPMA_ALGORITHM_mask {
|
|
TPMA_ALGORITHM_asymmetric = 0x00000001,
|
|
TPMA_ALGORITHM_symmetric = 0x00000002,
|
|
TPMA_ALGORITHM_hash = 0x00000004,
|
|
TPMA_ALGORITHM_object = 0x00000008,
|
|
TPMA_ALGORITHM_signing = 0x00000010,
|
|
TPMA_ALGORITHM_encrypting = 0x00000020,
|
|
TPMA_ALGORITHM_method = 0x00000040,
|
|
};
|
|
|
|
typedef UINT32 TPMA_OBJECT;
|
|
enum TPMA_OBJECT_mask {
|
|
TPMA_OBJECT_fixedTPM = 0x00000002,
|
|
TPMA_OBJECT_stClear = 0x00000004,
|
|
TPMA_OBJECT_fixedParent = 0x00000010,
|
|
TPMA_OBJECT_sensitiveDataOrigin = 0x00000020,
|
|
TPMA_OBJECT_userWithAuth = 0x00000040,
|
|
TPMA_OBJECT_adminWithPolicy = 0x00000080,
|
|
TPMA_OBJECT_derivedDataOrigin = 0x00000200,
|
|
TPMA_OBJECT_noDA = 0x00000400,
|
|
TPMA_OBJECT_encryptedDuplication= 0x00000800,
|
|
TPMA_OBJECT_restricted = 0x00010000,
|
|
TPMA_OBJECT_decrypt = 0x00020000,
|
|
TPMA_OBJECT_sign = 0x00040000,
|
|
};
|
|
|
|
typedef BYTE TPMA_SESSION;
|
|
enum TPMA_SESSION_mask {
|
|
TPMA_SESSION_continueSession = 0x01,
|
|
TPMA_SESSION_auditExclusive = 0x02,
|
|
TPMA_SESSION_auditReset = 0x04,
|
|
TPMA_SESSION_decrypt = 0x20,
|
|
TPMA_SESSION_encrypt = 0x40,
|
|
TPMA_SESSION_audit = 0x80,
|
|
};
|
|
|
|
typedef BYTE TPMA_LOCALITY;
|
|
enum TPMA_LOCALITY_mask {
|
|
TPM_LOC_ZERO = 0x01,
|
|
TPM_LOC_ONE = 0x02,
|
|
TPM_LOC_TWO = 0x04,
|
|
TPM_LOC_THREE = 0x08,
|
|
TPM_LOC_FOUR = 0x10,
|
|
};
|
|
|
|
typedef UINT32 TPMA_PERMANENT;
|
|
enum TPMA_PERMANENT_mask {
|
|
TPMA_PERMANENT_ownerAuthSet = 0x00000001,
|
|
TPMA_PERMANENT_endorsementAuthSet = 0x00000002,
|
|
TPMA_PERMANENT_lockoutAuthSet = 0x00000004,
|
|
TPMA_PERMANENT_disableClear = 0x00000100,
|
|
TPMA_PERMANENT_inLockout = 0x00000200,
|
|
TPMA_PERMANENT_tpmGeneratedEPS = 0x00000400,
|
|
};
|
|
|
|
typedef UINT32 TPMA_STARTUP_CLEAR;
|
|
/* Using defines, not "enum TPMA_STARTUP_CLEAR_mask" to avoid pedantic error:
|
|
* "ISO C restricts enumerator values to range of 'int'"
|
|
*/
|
|
#define TPMA_STARTUP_CLEAR_phEnable 0x00000001UL
|
|
#define TPMA_STARTUP_CLEAR_shEnable 0x00000002UL
|
|
#define TPMA_STARTUP_CLEAR_ehEnable 0x00000004UL
|
|
#define TPMA_STARTUP_CLEAR_phEnableNV 0x00000008UL
|
|
#define TPMA_STARTUP_CLEAR_orderly 0x80000000UL
|
|
|
|
typedef UINT32 TPMA_MEMORY;
|
|
enum TPMA_MEMORY_mask {
|
|
TPMA_MEMORY_sharedRAM = 0x00000001,
|
|
TPMA_MEMORY_sharedNV = 0x00000002,
|
|
TPMA_MEMORY_objectCopiedToRam = 0x00000004,
|
|
};
|
|
|
|
typedef UINT32 TPMA_CC;
|
|
enum TPMA_CC_mask {
|
|
TPMA_CC_commandIndex = 0x0000FFFF,
|
|
TPMA_CC_nv = 0x00400000,
|
|
TPMA_CC_extensive = 0x00800000,
|
|
TPMA_CC_flushed = 0x01000000,
|
|
TPMA_CC_cHandles = 0x0E000000,
|
|
TPMA_CC_rHandle = 0x10000000,
|
|
TPMA_CC_V = 0x20000000,
|
|
};
|
|
|
|
|
|
|
|
/* Interface Types */
|
|
|
|
typedef BYTE TPMI_YES_NO;
|
|
typedef TPM_HANDLE TPMI_DH_OBJECT;
|
|
typedef TPM_HANDLE TPMI_DH_PARENT;
|
|
typedef TPM_HANDLE TPMI_DH_PERSISTENT;
|
|
typedef TPM_HANDLE TPMI_DH_ENTITY;
|
|
typedef TPM_HANDLE TPMI_DH_PCR;
|
|
typedef TPM_HANDLE TPMI_SH_AUTH_SESSION;
|
|
typedef TPM_HANDLE TPMI_SH_HMAC;
|
|
typedef TPM_HANDLE TPMI_SH_POLICY;
|
|
typedef TPM_HANDLE TPMI_DH_CONTEXT;
|
|
typedef TPM_HANDLE TPMI_RH_HIERARCHY;
|
|
typedef TPM_HANDLE TPMI_RH_ENABLES;
|
|
typedef TPM_HANDLE TPMI_RH_HIERARCHY_AUTH;
|
|
typedef TPM_HANDLE TPMI_RH_PLATFORM;
|
|
typedef TPM_HANDLE TPMI_RH_OWNER;
|
|
typedef TPM_HANDLE TPMI_RH_ENDORSEMENT;
|
|
typedef TPM_HANDLE TPMI_RH_PROVISION;
|
|
typedef TPM_HANDLE TPMI_RH_CLEAR;
|
|
typedef TPM_HANDLE TPMI_RH_NV_AUTH;
|
|
typedef TPM_HANDLE TPMI_RH_LOCKOUT;
|
|
typedef TPM_HANDLE TPMI_RH_NV_INDEX;
|
|
|
|
typedef TPM_ALG_ID TPMI_ALG_HASH;
|
|
typedef TPM_ALG_ID TPMI_ALG_ASYM;
|
|
typedef TPM_ALG_ID TPMI_ALG_SYM;
|
|
typedef TPM_ALG_ID TPMI_ALG_SYM_OBJECT;
|
|
typedef TPM_ALG_ID TPMI_ALG_SYM_MODE;
|
|
typedef TPM_ALG_ID TPMI_ALG_KDF;
|
|
typedef TPM_ALG_ID TPMI_ALG_SIG_SCHEME;
|
|
typedef TPM_ALG_ID TPMI_ECC_KEY_EXCHANGE;
|
|
|
|
typedef TPM_ST TPMI_ST_COMMAND_TAG;
|
|
|
|
|
|
/* Structures */
|
|
|
|
typedef struct TPMS_ALGORITHM_DESCRIPTION {
|
|
TPM_ALG_ID alg;
|
|
TPMA_ALGORITHM attributes;
|
|
} TPMS_ALGORITHM_DESCRIPTION;
|
|
|
|
|
|
typedef union TPMU_HA {
|
|
BYTE sha512[TPM_SHA512_DIGEST_SIZE];
|
|
BYTE sha384[TPM_SHA384_DIGEST_SIZE];
|
|
BYTE sha256[TPM_SHA256_DIGEST_SIZE];
|
|
BYTE sha224[TPM_SHA224_DIGEST_SIZE];
|
|
BYTE sha[TPM_SHA_DIGEST_SIZE];
|
|
BYTE md5[TPM_MD5_DIGEST_SIZE];
|
|
BYTE H[TPM_MAX_DIGEST_SIZE];
|
|
} TPMU_HA;
|
|
|
|
typedef struct TPMT_HA {
|
|
TPMI_ALG_HASH hashAlg;
|
|
TPMU_HA digest;
|
|
} TPMT_HA;
|
|
|
|
typedef struct TPM2B_DIGEST {
|
|
UINT16 size;
|
|
BYTE buffer[sizeof(TPMU_HA)];
|
|
} TPM2B_DIGEST;
|
|
|
|
typedef struct TPM2B_DATA {
|
|
UINT16 size;
|
|
BYTE buffer[sizeof(TPMT_HA)];
|
|
} TPM2B_DATA;
|
|
|
|
typedef TPM2B_DIGEST TPM2B_NONCE;
|
|
typedef TPM2B_DIGEST TPM2B_AUTH;
|
|
typedef TPM2B_DIGEST TPM2B_OPERAND;
|
|
|
|
typedef struct TPM2B_EVENT {
|
|
UINT16 size;
|
|
BYTE buffer[1024];
|
|
} TPM2B_EVENT;
|
|
|
|
typedef struct TPM2B_MAX_BUFFER {
|
|
UINT16 size;
|
|
BYTE buffer[MAX_DIGEST_BUFFER];
|
|
} TPM2B_MAX_BUFFER;
|
|
|
|
typedef struct TPM2B_MAX_NV_BUFFER {
|
|
UINT16 size;
|
|
BYTE buffer[MAX_NV_BUFFER_SIZE];
|
|
} TPM2B_MAX_NV_BUFFER;
|
|
|
|
|
|
typedef TPM2B_DIGEST TPM2B_TIMEOUT;
|
|
|
|
typedef struct TPM2B_IV {
|
|
UINT16 size;
|
|
BYTE buffer[MAX_SYM_BLOCK_SIZE];
|
|
} TPM2B_IV;
|
|
|
|
|
|
/* Names */
|
|
typedef union TPMU_NAME {
|
|
TPMT_HA digest;
|
|
TPM_HANDLE handle;
|
|
} TPMU_NAME;
|
|
|
|
typedef struct TPM2B_NAME {
|
|
UINT16 size;
|
|
BYTE name[sizeof(TPMU_NAME)];
|
|
} TPM2B_NAME;
|
|
|
|
|
|
/* PCR */
|
|
|
|
typedef struct TPMS_PCR_SELECT {
|
|
BYTE sizeofSelect;
|
|
BYTE pcrSelect[PCR_SELECT_MIN];
|
|
} TPMS_PCR_SELECT;
|
|
|
|
|
|
typedef struct TPMS_PCR_SELECTION {
|
|
TPMI_ALG_HASH hash;
|
|
BYTE sizeofSelect;
|
|
BYTE pcrSelect[PCR_SELECT_MIN];
|
|
} TPMS_PCR_SELECTION;
|
|
|
|
|
|
/* Tickets */
|
|
|
|
typedef struct TPMT_TK_CREATION {
|
|
TPM_ST tag;
|
|
TPMI_RH_HIERARCHY hierarchy;
|
|
TPM2B_DIGEST digest;
|
|
} TPMT_TK_CREATION;
|
|
|
|
typedef struct TPMT_TK_VERIFIED {
|
|
TPM_ST tag;
|
|
TPMI_RH_HIERARCHY hierarchy;
|
|
TPM2B_DIGEST digest;
|
|
} TPMT_TK_VERIFIED;
|
|
|
|
typedef struct TPMT_TK_AUTH {
|
|
TPM_ST tag;
|
|
TPMI_RH_HIERARCHY hierarchy;
|
|
TPM2B_DIGEST digest;
|
|
} TPMT_TK_AUTH;
|
|
|
|
typedef struct TPMT_TK_HASHCHECK {
|
|
TPM_ST tag;
|
|
TPMI_RH_HIERARCHY hierarchy;
|
|
TPM2B_DIGEST digest;
|
|
} TPMT_TK_HASHCHECK;
|
|
|
|
typedef struct TPMS_ALG_PROPERTY {
|
|
TPM_ALG_ID alg;
|
|
TPMA_ALGORITHM algProperties;
|
|
} TPMS_ALG_PROPERTY;
|
|
|
|
typedef struct TPMS_TAGGED_PROPERTY {
|
|
TPM_PT property;
|
|
UINT32 value;
|
|
} TPMS_TAGGED_PROPERTY;
|
|
|
|
typedef struct TPMS_TAGGED_PCR_SELECT {
|
|
TPM_PT_PCR tag;
|
|
BYTE sizeofSelect;
|
|
BYTE pcrSelect[PCR_SELECT_MAX];
|
|
} TPMS_TAGGED_PCR_SELECT;
|
|
|
|
typedef struct TPMS_TAGGED_POLICY {
|
|
TPM_HANDLE handle;
|
|
TPMT_HA policyHash;
|
|
} TPMS_TAGGED_POLICY;
|
|
|
|
|
|
/* Lists */
|
|
|
|
typedef struct TPML_CC {
|
|
UINT32 count;
|
|
TPM_CC commandCodes[MAX_CAP_CC];
|
|
} TPML_CC;
|
|
|
|
typedef struct TPML_CCA {
|
|
UINT32 count;
|
|
TPMA_CC commandAttributes[MAX_CAP_CC];
|
|
} TPML_CCA;
|
|
|
|
typedef struct TPML_ALG {
|
|
UINT32 count;
|
|
TPM_ALG_ID algorithms[MAX_ALG_LIST_SIZE];
|
|
} TPML_ALG;
|
|
|
|
typedef struct TPML_HANDLE {
|
|
UINT32 count;
|
|
TPM_HANDLE handle[MAX_CAP_HANDLES];
|
|
} TPML_HANDLE;
|
|
|
|
typedef struct TPML_DIGEST {
|
|
UINT32 count;
|
|
TPM2B_DIGEST digests[8];
|
|
} TPML_DIGEST;
|
|
|
|
typedef struct TPML_DIGEST_VALUES {
|
|
UINT32 count;
|
|
TPMT_HA digests[HASH_COUNT];
|
|
} TPML_DIGEST_VALUES;
|
|
|
|
typedef struct TPML_PCR_SELECTION {
|
|
UINT32 count;
|
|
TPMS_PCR_SELECTION pcrSelections[HASH_COUNT];
|
|
} TPML_PCR_SELECTION;
|
|
|
|
typedef struct TPML_ALG_PROPERTY {
|
|
UINT32 count;
|
|
TPMS_ALG_PROPERTY algProperties[MAX_CAP_ALGS];
|
|
} TPML_ALG_PROPERTY;
|
|
|
|
typedef struct TPML_TAGGED_TPM_PROPERTY {
|
|
UINT32 count;
|
|
TPMS_TAGGED_PROPERTY tpmProperty[MAX_TPM_PROPERTIES];
|
|
} TPML_TAGGED_TPM_PROPERTY;
|
|
|
|
typedef struct TPML_TAGGED_PCR_PROPERTY {
|
|
UINT32 count;
|
|
TPMS_TAGGED_PCR_SELECT pcrProperty[MAX_PCR_PROPERTIES];
|
|
} TPML_TAGGED_PCR_PROPERTY;
|
|
|
|
typedef struct TPML_ECC_CURVE {
|
|
UINT32 count;
|
|
TPM_ECC_CURVE eccCurves[MAX_ECC_CURVES];
|
|
} TPML_ECC_CURVE;
|
|
|
|
typedef struct TPML_TAGGED_POLICY {
|
|
UINT32 count;
|
|
TPMS_TAGGED_POLICY policies[MAX_TAGGED_POLICIES];
|
|
} TPML_TAGGED_POLICY;
|
|
|
|
|
|
/* Capabilities Structures */
|
|
|
|
typedef union TPMU_CAPABILITIES {
|
|
TPML_ALG_PROPERTY algorithms; /* TPM_CAP_ALGS */
|
|
TPML_HANDLE handles; /* TPM_CAP_HANDLES */
|
|
TPML_CCA command; /* TPM_CAP_COMMANDS */
|
|
TPML_CC ppCommands; /* TPM_CAP_PP_COMMANDS */
|
|
TPML_CC auditCommands; /* TPM_CAP_AUDIT_COMMANDS */
|
|
TPML_PCR_SELECTION assignedPCR; /* TPM_CAP_PCRS */
|
|
TPML_TAGGED_TPM_PROPERTY tpmProperties; /* TPM_CAP_TPM_PROPERTIES */
|
|
TPML_TAGGED_PCR_PROPERTY pcrProperties; /* TPM_CAP_PCR_PROPERTIES */
|
|
TPML_ECC_CURVE eccCurves; /* TPM_CAP_ECC_CURVES */
|
|
TPML_TAGGED_POLICY authPolicies; /* TPM_CAP_AUTH_POLICIES */
|
|
} TPMU_CAPABILITIES;
|
|
|
|
typedef struct TPMS_CAPABILITY_DATA {
|
|
TPM_CAP capability;
|
|
TPMU_CAPABILITIES data;
|
|
} TPMS_CAPABILITY_DATA;
|
|
|
|
typedef struct TPMS_CLOCK_INFO {
|
|
UINT64 clock;
|
|
UINT32 resetCount;
|
|
UINT32 restartCount;
|
|
TPMI_YES_NO safe;
|
|
} TPMS_CLOCK_INFO;
|
|
|
|
typedef struct TPMS_TIME_INFO {
|
|
UINT64 time;
|
|
TPMS_CLOCK_INFO clockInfo;
|
|
} TPMS_TIME_INFO;
|
|
|
|
typedef struct TPMS_TIME_ATTEST_INFO {
|
|
TPMS_TIME_INFO time;
|
|
UINT64 firmwareVersion;
|
|
} TPMS_TIME_ATTEST_INFO;
|
|
|
|
typedef struct TPMS_CERTIFY_INFO {
|
|
TPM2B_NAME name;
|
|
TPM2B_NAME qualifiedName;
|
|
} TPMS_CERTIFY_INFO;
|
|
|
|
typedef struct TPMS_QUOTE_INFO {
|
|
TPML_PCR_SELECTION pcrSelect;
|
|
TPM2B_DIGEST pcrDigest;
|
|
} TPMS_QUOTE_INFO;
|
|
|
|
typedef struct TPMS_COMMAND_AUDIT_INFO {
|
|
UINT64 auditCounter;
|
|
TPM_ALG_ID digestAlg;
|
|
TPM2B_DIGEST auditDigest;
|
|
TPM2B_DIGEST commandDigest;
|
|
} TPMS_COMMAND_AUDIT_INFO;
|
|
|
|
typedef struct TPMS_SESSION_AUDIT_INFO {
|
|
TPMI_YES_NO exclusiveSession;
|
|
TPM2B_DIGEST sessionDigest;
|
|
} TPMS_SESSION_AUDIT_INFO;
|
|
|
|
typedef struct TPMS_CREATION_INFO {
|
|
TPM2B_NAME objectName;
|
|
TPM2B_DIGEST creationHash;
|
|
} TPMS_CREATION_INFO;
|
|
|
|
typedef struct TPMS_NV_CERTIFY_INFO {
|
|
TPM2B_NAME indexName;
|
|
UINT16 offset;
|
|
TPM2B_MAX_NV_BUFFER nvContents;
|
|
} TPMS_NV_CERTIFY_INFO;
|
|
|
|
|
|
typedef TPM_ST TPMI_ST_ATTEST;
|
|
typedef union TPMU_ATTEST {
|
|
TPMS_CERTIFY_INFO certify; /* TPM_ST_ATTEST_CERTIFY */
|
|
TPMS_CREATION_INFO creation; /* TPM_ST_ATTEST_CREATION */
|
|
TPMS_QUOTE_INFO quote; /* TPM_ST_ATTEST_QUOTE */
|
|
TPMS_COMMAND_AUDIT_INFO commandAudit; /* TPM_ST_ATTEST_COMMAND_AUDIT */
|
|
TPMS_SESSION_AUDIT_INFO sessionAudit; /* TPM_ST_ATTEST_SESSION_AUDIT */
|
|
TPMS_TIME_ATTEST_INFO time; /* TPM_ST_ATTEST_TIME */
|
|
TPMS_NV_CERTIFY_INFO nv; /* TPM_ST_ATTEST_NV */
|
|
} TPMU_ATTEST;
|
|
|
|
typedef struct TPMS_ATTEST {
|
|
TPM_GENERATED magic;
|
|
TPMI_ST_ATTEST type;
|
|
TPM2B_NAME qualifiedSigner;
|
|
TPM2B_DATA extraData;
|
|
TPMS_CLOCK_INFO clockInfo;
|
|
UINT64 firmwareVersion;
|
|
TPMU_ATTEST attested;
|
|
} TPMS_ATTEST;
|
|
|
|
typedef struct TPM2B_ATTEST {
|
|
UINT16 size;
|
|
BYTE attestationData[sizeof(TPMS_ATTEST)];
|
|
} TPM2B_ATTEST;
|
|
|
|
|
|
/* Algorithm Parameters and Structures */
|
|
|
|
/* Symmetric */
|
|
typedef TPM_KEY_BITS TPMI_AES_KEY_BITS;
|
|
|
|
typedef union TPMU_SYM_KEY_BITS {
|
|
TPMI_AES_KEY_BITS aes;
|
|
TPM_KEY_BITS sym;
|
|
TPMI_ALG_HASH xorr;
|
|
} TPMU_SYM_KEY_BITS;
|
|
|
|
typedef union TPMU_SYM_MODE {
|
|
TPMI_ALG_SYM_MODE aes;
|
|
TPMI_ALG_SYM_MODE sym;
|
|
} TPMU_SYM_MODE;
|
|
|
|
typedef struct TPMT_SYM_DEF {
|
|
TPMI_ALG_SYM algorithm;
|
|
TPMU_SYM_KEY_BITS keyBits;
|
|
TPMU_SYM_MODE mode;
|
|
/*TPMU_SYM_DETAILS details;*/ /* not used */
|
|
} TPMT_SYM_DEF;
|
|
|
|
typedef TPMT_SYM_DEF TPMT_SYM_DEF_OBJECT;
|
|
|
|
typedef struct TPM2B_SYM_KEY {
|
|
UINT16 size;
|
|
BYTE buffer[MAX_SYM_KEY_BYTES];
|
|
} TPM2B_SYM_KEY;
|
|
|
|
typedef struct TPMS_SYMCIPHER_PARMS {
|
|
TPMT_SYM_DEF_OBJECT sym;
|
|
} TPMS_SYMCIPHER_PARMS;
|
|
|
|
typedef struct TPM2B_LABEL {
|
|
UINT16 size;
|
|
BYTE buffer[LABEL_MAX_BUFFER];
|
|
} TPM2B_LABEL;
|
|
|
|
typedef struct TPMS_DERIVE {
|
|
TPM2B_LABEL label;
|
|
TPM2B_LABEL context;
|
|
} TPMS_DERIVE;
|
|
|
|
typedef struct TPM2B_DERIVE {
|
|
UINT16 size;
|
|
BYTE buffer[sizeof(TPMS_DERIVE)];
|
|
} TPM2B_DERIVE;
|
|
|
|
typedef union TPMU_SENSITIVE_CREATE {
|
|
BYTE create[MAX_SYM_DATA];
|
|
TPMS_DERIVE derive;
|
|
} TPMU_SENSITIVE_CREATE;
|
|
|
|
typedef struct TPM2B_SENSITIVE_DATA {
|
|
UINT16 size;
|
|
BYTE buffer[sizeof(TPMU_SENSITIVE_CREATE)];
|
|
} TPM2B_SENSITIVE_DATA;
|
|
|
|
typedef struct TPMS_SENSITIVE_CREATE {
|
|
TPM2B_AUTH userAuth;
|
|
TPM2B_SENSITIVE_DATA data;
|
|
} TPMS_SENSITIVE_CREATE;
|
|
|
|
typedef struct TPM2B_SENSITIVE_CREATE {
|
|
UINT16 size;
|
|
TPMS_SENSITIVE_CREATE sensitive;
|
|
} TPM2B_SENSITIVE_CREATE;
|
|
|
|
typedef struct TPMS_SCHEME_HASH {
|
|
TPMI_ALG_HASH hashAlg;
|
|
} TPMS_SCHEME_HASH;
|
|
|
|
typedef struct TPMS_SCHEME_ECDAA {
|
|
TPMI_ALG_HASH hashAlg;
|
|
UINT16 count;
|
|
} TPMS_SCHEME_ECDAA;
|
|
|
|
typedef TPM_ALG_ID TPMI_ALG_KEYEDHASH_SCHEME;
|
|
typedef TPMS_SCHEME_HASH TPMS_SCHEME_HMAC;
|
|
|
|
typedef union TPMU_SCHEME_KEYEDHASH {
|
|
TPMS_SCHEME_HMAC hmac;
|
|
} TPMU_SCHEME_KEYEDHASH;
|
|
|
|
typedef struct TPMT_KEYEDHASH_SCHEME {
|
|
TPMI_ALG_KEYEDHASH_SCHEME scheme;
|
|
TPMU_SCHEME_KEYEDHASH details;
|
|
} TPMT_KEYEDHASH_SCHEME;
|
|
|
|
|
|
/* Asymmetric */
|
|
|
|
typedef TPMS_SCHEME_HASH TPMS_SIG_SCHEME_RSASSA;
|
|
typedef TPMS_SCHEME_HASH TPMS_SIG_SCHEME_RSAPSS;
|
|
typedef TPMS_SCHEME_HASH TPMS_SIG_SCHEME_ECDSA;
|
|
|
|
typedef TPMS_SCHEME_ECDAA TPMS_SIG_SCHEME_ECDAA;
|
|
|
|
|
|
typedef union TPMU_SIG_SCHEME {
|
|
TPMS_SIG_SCHEME_RSASSA rsassa;
|
|
TPMS_SIG_SCHEME_RSAPSS rsapss;
|
|
TPMS_SIG_SCHEME_ECDSA ecdsa;
|
|
TPMS_SIG_SCHEME_ECDAA ecdaa;
|
|
TPMS_SCHEME_HMAC hmac;
|
|
TPMS_SCHEME_HASH any;
|
|
} TPMU_SIG_SCHEME;
|
|
|
|
typedef struct TPMT_SIG_SCHEME {
|
|
TPMI_ALG_SIG_SCHEME scheme;
|
|
TPMU_SIG_SCHEME details;
|
|
} TPMT_SIG_SCHEME;
|
|
|
|
|
|
/* Encryption / Key Exchange Schemes */
|
|
typedef TPMS_SCHEME_HASH TPMS_ENC_SCHEME_OAEP;
|
|
typedef TPMS_SCHEME_HASH TPMS_KEY_SCHEME_ECDH;
|
|
typedef TPMS_SCHEME_HASH TPMS_KEY_SCHEME_ECMQV;
|
|
|
|
/* Key Derivation Schemes */
|
|
typedef TPMS_SCHEME_HASH TPMS_SCHEME_MGF1;
|
|
typedef TPMS_SCHEME_HASH TPMS_SCHEME_KDF1_SP800_56A;
|
|
typedef TPMS_SCHEME_HASH TPMS_SCHEME_KDF2;
|
|
typedef TPMS_SCHEME_HASH TPMS_SCHEME_KDF1_SP800_108;
|
|
|
|
typedef union TPMU_KDF_SCHEME {
|
|
TPMS_SCHEME_MGF1 mgf1;
|
|
TPMS_SCHEME_KDF1_SP800_56A kdf1_sp800_56a;
|
|
TPMS_SCHEME_KDF2 kdf2;
|
|
TPMS_SCHEME_KDF1_SP800_108 kdf1_sp800_108;
|
|
TPMS_SCHEME_HASH any;
|
|
} TPMU_KDF_SCHEME;
|
|
|
|
typedef struct TPMT_KDF_SCHEME {
|
|
TPMI_ALG_KDF scheme;
|
|
TPMU_KDF_SCHEME details;
|
|
} TPMT_KDF_SCHEME;
|
|
|
|
typedef TPM_ALG_ID TPMI_ALG_ASYM_SCHEME;
|
|
typedef union TPMU_ASYM_SCHEME {
|
|
TPMS_KEY_SCHEME_ECDH ecdh;
|
|
TPMS_SIG_SCHEME_RSASSA rsassa;
|
|
TPMS_SIG_SCHEME_RSAPSS rsapss;
|
|
TPMS_SIG_SCHEME_ECDSA ecdsa;
|
|
TPMS_ENC_SCHEME_OAEP oaep;
|
|
TPMS_SCHEME_HASH anySig;
|
|
} TPMU_ASYM_SCHEME;
|
|
|
|
typedef struct TPMT_ASYM_SCHEME {
|
|
TPMI_ALG_ASYM_SCHEME scheme;
|
|
TPMU_ASYM_SCHEME details;
|
|
} TPMT_ASYM_SCHEME;
|
|
|
|
/* RSA */
|
|
typedef TPM_ALG_ID TPMI_ALG_RSA_SCHEME;
|
|
typedef struct TPMT_RSA_SCHEME {
|
|
TPMI_ALG_RSA_SCHEME scheme;
|
|
TPMU_ASYM_SCHEME details;
|
|
} TPMT_RSA_SCHEME;
|
|
|
|
typedef TPM_ALG_ID TPMI_ALG_RSA_DECRYPT;
|
|
typedef struct TPMT_RSA_DECRYPT {
|
|
TPMI_ALG_RSA_DECRYPT scheme;
|
|
TPMU_ASYM_SCHEME details;
|
|
} TPMT_RSA_DECRYPT;
|
|
|
|
typedef struct TPM2B_PUBLIC_KEY_RSA {
|
|
UINT16 size;
|
|
BYTE buffer[MAX_RSA_KEY_BYTES];
|
|
} TPM2B_PUBLIC_KEY_RSA;
|
|
|
|
typedef TPM_KEY_BITS TPMI_RSA_KEY_BITS;
|
|
typedef struct TPM2B_PRIVATE_KEY_RSA {
|
|
UINT16 size;
|
|
BYTE buffer[MAX_RSA_KEY_BYTES/2];
|
|
} TPM2B_PRIVATE_KEY_RSA;
|
|
|
|
|
|
/* ECC */
|
|
typedef struct TPM2B_ECC_PARAMETER {
|
|
UINT16 size;
|
|
BYTE buffer[MAX_ECC_KEY_BYTES];
|
|
} TPM2B_ECC_PARAMETER;
|
|
|
|
typedef struct TPMS_ECC_POINT {
|
|
TPM2B_ECC_PARAMETER x;
|
|
TPM2B_ECC_PARAMETER y;
|
|
} TPMS_ECC_POINT;
|
|
|
|
typedef struct TPM2B_ECC_POINT {
|
|
UINT16 size;
|
|
TPMS_ECC_POINT point;
|
|
} TPM2B_ECC_POINT;
|
|
|
|
|
|
typedef TPM_ALG_ID TPMI_ALG_ECC_SCHEME;
|
|
typedef TPM_ECC_CURVE TPMI_ECC_CURVE;
|
|
typedef TPMT_SIG_SCHEME TPMT_ECC_SCHEME;
|
|
|
|
typedef struct TPMS_ALGORITHM_DETAIL_ECC {
|
|
TPM_ECC_CURVE curveID;
|
|
UINT16 keySize;
|
|
TPMT_KDF_SCHEME kdf;
|
|
TPMT_ECC_SCHEME sign;
|
|
TPM2B_ECC_PARAMETER p;
|
|
TPM2B_ECC_PARAMETER a;
|
|
TPM2B_ECC_PARAMETER b;
|
|
TPM2B_ECC_PARAMETER gX;
|
|
TPM2B_ECC_PARAMETER gY;
|
|
TPM2B_ECC_PARAMETER n;
|
|
TPM2B_ECC_PARAMETER h;
|
|
} TPMS_ALGORITHM_DETAIL_ECC;
|
|
|
|
|
|
/* Signatures */
|
|
|
|
typedef struct TPMS_SIGNATURE_RSA {
|
|
TPMI_ALG_HASH hash;
|
|
TPM2B_PUBLIC_KEY_RSA sig;
|
|
} TPMS_SIGNATURE_RSA;
|
|
|
|
typedef TPMS_SIGNATURE_RSA TPMS_SIGNATURE_RSASSA;
|
|
typedef TPMS_SIGNATURE_RSA TPMS_SIGNATURE_RSAPSS;
|
|
|
|
typedef struct TPMS_SIGNATURE_ECC {
|
|
TPMI_ALG_HASH hash;
|
|
TPM2B_ECC_PARAMETER signatureR;
|
|
TPM2B_ECC_PARAMETER signatureS;
|
|
} TPMS_SIGNATURE_ECC;
|
|
|
|
typedef TPMS_SIGNATURE_ECC TPMS_SIGNATURE_ECDSA;
|
|
typedef TPMS_SIGNATURE_ECC TPMS_SIGNATURE_ECDAA;
|
|
|
|
typedef union TPMU_SIGNATURE {
|
|
TPMS_SIGNATURE_ECDSA ecdsa;
|
|
TPMS_SIGNATURE_ECDAA ecdaa;
|
|
TPMS_SIGNATURE_RSASSA rsassa;
|
|
TPMS_SIGNATURE_RSAPSS rsapss;
|
|
TPMT_HA hmac;
|
|
TPMS_SCHEME_HASH any;
|
|
} TPMU_SIGNATURE;
|
|
|
|
typedef struct TPMT_SIGNATURE {
|
|
TPMI_ALG_SIG_SCHEME sigAlg;
|
|
TPMU_SIGNATURE signature;
|
|
} TPMT_SIGNATURE;
|
|
|
|
|
|
/* Key/Secret Exchange */
|
|
|
|
typedef union TPMU_ENCRYPTED_SECRET {
|
|
BYTE ecc[sizeof(TPMS_ECC_POINT)]; /* TPM_ALG_ECC */
|
|
BYTE rsa[MAX_RSA_KEY_BYTES]; /* TPM_ALG_RSA */
|
|
BYTE symmetric[sizeof(TPM2B_DIGEST)]; /* TPM_ALG_SYMCIPHER */
|
|
BYTE keyedHash[sizeof(TPM2B_DIGEST)]; /* TPM_ALG_KEYEDHASH */
|
|
} TPMU_ENCRYPTED_SECRET;
|
|
|
|
typedef struct TPM2B_ENCRYPTED_SECRET {
|
|
UINT16 size;
|
|
BYTE secret[sizeof(TPMU_ENCRYPTED_SECRET)];
|
|
} TPM2B_ENCRYPTED_SECRET;
|
|
|
|
|
|
/* Key/Object Complex */
|
|
|
|
typedef TPM_ALG_ID TPMI_ALG_PUBLIC;
|
|
|
|
typedef union TPMU_PUBLIC_ID {
|
|
TPM2B_DIGEST keyedHash; /* TPM_ALG_KEYEDHASH */
|
|
TPM2B_DIGEST sym; /* TPM_ALG_SYMCIPHER */
|
|
TPM2B_PUBLIC_KEY_RSA rsa; /* TPM_ALG_RSA */
|
|
TPMS_ECC_POINT ecc; /* TPM_ALG_ECC */
|
|
TPMS_DERIVE derive;
|
|
} TPMU_PUBLIC_ID;
|
|
|
|
typedef struct TPMS_KEYEDHASH_PARMS {
|
|
TPMT_KEYEDHASH_SCHEME scheme;
|
|
} TPMS_KEYEDHASH_PARMS;
|
|
|
|
|
|
typedef struct TPMS_ASYM_PARMS {
|
|
TPMT_SYM_DEF_OBJECT symmetric;
|
|
TPMT_ASYM_SCHEME scheme;
|
|
} TPMS_ASYM_PARMS;
|
|
|
|
typedef struct TPMS_RSA_PARMS {
|
|
TPMT_SYM_DEF_OBJECT symmetric;
|
|
TPMT_RSA_SCHEME scheme;
|
|
TPMI_RSA_KEY_BITS keyBits;
|
|
UINT32 exponent;
|
|
} TPMS_RSA_PARMS;
|
|
|
|
typedef struct TPMS_ECC_PARMS {
|
|
TPMT_SYM_DEF_OBJECT symmetric;
|
|
TPMT_ECC_SCHEME scheme;
|
|
TPMI_ECC_CURVE curveID;
|
|
TPMT_KDF_SCHEME kdf;
|
|
} TPMS_ECC_PARMS;
|
|
|
|
typedef union TPMU_PUBLIC_PARMS {
|
|
TPMS_KEYEDHASH_PARMS keyedHashDetail;
|
|
TPMS_SYMCIPHER_PARMS symDetail;
|
|
TPMS_RSA_PARMS rsaDetail;
|
|
TPMS_ECC_PARMS eccDetail;
|
|
TPMS_ASYM_PARMS asymDetail;
|
|
} TPMU_PUBLIC_PARMS;
|
|
|
|
typedef struct TPMT_PUBLIC_PARMS {
|
|
TPMI_ALG_PUBLIC type;
|
|
TPMU_PUBLIC_PARMS parameters;
|
|
} TPMT_PUBLIC_PARMS;
|
|
|
|
|
|
typedef struct TPMT_PUBLIC {
|
|
TPMI_ALG_PUBLIC type;
|
|
TPMI_ALG_HASH nameAlg;
|
|
TPMA_OBJECT objectAttributes;
|
|
TPM2B_DIGEST authPolicy;
|
|
TPMU_PUBLIC_PARMS parameters;
|
|
TPMU_PUBLIC_ID unique;
|
|
} TPMT_PUBLIC;
|
|
|
|
typedef struct TPM2B_PUBLIC {
|
|
UINT16 size;
|
|
TPMT_PUBLIC publicArea;
|
|
} TPM2B_PUBLIC;
|
|
|
|
typedef struct TPM2B_TEMPLATE {
|
|
UINT16 size;
|
|
BYTE buffer[sizeof(TPMT_PUBLIC)];
|
|
} TPM2B_TEMPLATE;
|
|
|
|
|
|
/* Private Structures */
|
|
|
|
typedef struct TPM2B_PRIVATE_VENDOR_SPECIFIC {
|
|
UINT16 size;
|
|
BYTE buffer[PRIVATE_VENDOR_SPECIFIC_BYTES];
|
|
} TPM2B_PRIVATE_VENDOR_SPECIFIC;
|
|
|
|
typedef union TPMU_SENSITIVE_COMPOSITE {
|
|
TPM2B_PRIVATE_KEY_RSA rsa; /* TPM_ALG_RSA */
|
|
TPM2B_ECC_PARAMETER ecc; /* TPM_ALG_ECC */
|
|
TPM2B_SENSITIVE_DATA bits; /* TPM_ALG_KEYEDHASH */
|
|
TPM2B_SYM_KEY sym; /* TPM_ALG_SYMCIPHER */
|
|
TPM2B_PRIVATE_VENDOR_SPECIFIC any;
|
|
} TPMU_SENSITIVE_COMPOSITE;
|
|
|
|
|
|
typedef struct TPMT_SENSITIVE {
|
|
TPMI_ALG_PUBLIC sensitiveType;
|
|
TPM2B_AUTH authValue;
|
|
TPM2B_DIGEST seedValue;
|
|
TPMU_SENSITIVE_COMPOSITE sensitive;
|
|
} TPMT_SENSITIVE;
|
|
|
|
typedef struct TPM2B_SENSITIVE {
|
|
UINT16 size;
|
|
TPMT_SENSITIVE sensitiveArea;
|
|
} TPM2B_SENSITIVE;
|
|
|
|
|
|
typedef struct TPMT_PRIVATE {
|
|
TPM2B_DIGEST integrityOuter;
|
|
TPM2B_DIGEST integrityInner;
|
|
TPM2B_SENSITIVE sensitive;
|
|
} TPMT_PRIVATE;
|
|
|
|
typedef struct TPM2B_PRIVATE {
|
|
UINT16 size;
|
|
BYTE buffer[sizeof(TPMT_PRIVATE)];
|
|
} TPM2B_PRIVATE;
|
|
|
|
|
|
/* Identity Object */
|
|
|
|
typedef struct TPMS_ID_OBJECT {
|
|
TPM2B_DIGEST integrityHMAC;
|
|
TPM2B_DIGEST encIdentity;
|
|
} TPMS_ID_OBJECT;
|
|
|
|
typedef struct TPM2B_ID_OBJECT {
|
|
UINT16 size;
|
|
BYTE buffer[sizeof(TPMS_ID_OBJECT)];
|
|
} TPM2B_ID_OBJECT;
|
|
|
|
|
|
/* NV Storage Structures */
|
|
|
|
typedef UINT32 TPM_NV_INDEX;
|
|
/* Using defines, not "enum TPM_NV_INDEX_mask" to avoid pedantic error:
|
|
* "ISO C restricts enumerator values to range of 'int'"
|
|
*/
|
|
#define TPM_NV_INDEX_index 0x00FFFFFFUL
|
|
#define TPM_NV_INDEX_RH_NV 0xFF000000UL
|
|
|
|
|
|
typedef enum TPM_NT {
|
|
TPM_NT_ORDINARY = 0x0,
|
|
TPM_NT_COUNTER = 0x1,
|
|
TPM_NT_BITS = 0x2,
|
|
TPM_NT_EXTEND = 0x4,
|
|
TPM_NT_PIN_FAIL = 0x8,
|
|
TPM_NT_PIN_PASS = 0x9,
|
|
} TPM_NT;
|
|
|
|
|
|
typedef struct TPMS_NV_PIN_COUNTER_PARAMETERS {
|
|
UINT32 pinCount;
|
|
UINT32 pinLimit;
|
|
} TPMS_NV_PIN_COUNTER_PARAMETERS;
|
|
|
|
typedef UINT32 TPMA_NV;
|
|
/* Using defines, not "enum TPMA_NV_mask" to avoid pedantic error:
|
|
* "ISO C restricts enumerator values to range of 'int'"
|
|
*/
|
|
#define TPMA_NV_PPWRITE 0x00000001UL
|
|
#define TPMA_NV_OWNERWRITE 0x00000002UL
|
|
#define TPMA_NV_AUTHWRITE 0x00000004UL
|
|
#define TPMA_NV_POLICYWRITE 0x00000008UL
|
|
#define TPMA_NV_TPM_NT 0x000000F0UL
|
|
#define TPMA_NV_POLICY_DELETE 0x00000400UL
|
|
#define TPMA_NV_WRITELOCKED 0x00000800UL
|
|
#define TPMA_NV_WRITEALL 0x00001000UL
|
|
#define TPMA_NV_WRITEDEFINE 0x00002000UL
|
|
#define TPMA_NV_WRITE_STCLEAR 0x00004000UL
|
|
#define TPMA_NV_GLOBALLOCK 0x00008000UL
|
|
#define TPMA_NV_PPREAD 0x00010000UL
|
|
#define TPMA_NV_OWNERREAD 0x00020000UL
|
|
#define TPMA_NV_AUTHREAD 0x00040000UL
|
|
#define TPMA_NV_POLICYREAD 0x00080000UL
|
|
#define TPMA_NV_NO_DA 0x02000000UL
|
|
#define TPMA_NV_ORDERLY 0x04000000UL
|
|
#define TPMA_NV_CLEAR_STCLEAR 0x08000000UL
|
|
#define TPMA_NV_READLOCKED 0x10000000UL
|
|
#define TPMA_NV_WRITTEN 0x20000000UL
|
|
#define TPMA_NV_PLATFORMCREATE 0x40000000UL
|
|
#define TPMA_NV_READ_STCLEAR 0x80000000UL
|
|
|
|
typedef struct TPMS_NV_PUBLIC {
|
|
TPMI_RH_NV_INDEX nvIndex;
|
|
TPMI_ALG_HASH nameAlg;
|
|
TPMA_NV attributes;
|
|
TPM2B_DIGEST authPolicy;
|
|
UINT16 dataSize;
|
|
} TPMS_NV_PUBLIC;
|
|
|
|
typedef struct TPM2B_NV_PUBLIC {
|
|
UINT16 size;
|
|
TPMS_NV_PUBLIC nvPublic;
|
|
} TPM2B_NV_PUBLIC;
|
|
|
|
|
|
/* Context Data */
|
|
|
|
typedef struct TPM2B_CONTEXT_SENSITIVE {
|
|
UINT16 size;
|
|
BYTE buffer[MAX_CONTEXT_SIZE];
|
|
} TPM2B_CONTEXT_SENSITIVE;
|
|
|
|
typedef struct TPMS_CONTEXT_DATA {
|
|
TPM2B_DIGEST integrity;
|
|
TPM2B_CONTEXT_SENSITIVE encrypted;
|
|
} TPMS_CONTEXT_DATA;
|
|
|
|
typedef struct TPM2B_CONTEXT_DATA {
|
|
UINT16 size;
|
|
BYTE buffer[sizeof(TPMS_CONTEXT_DATA)];
|
|
} TPM2B_CONTEXT_DATA;
|
|
|
|
typedef struct TPMS_CONTEXT {
|
|
UINT64 sequence;
|
|
TPMI_DH_CONTEXT savedHandle;
|
|
TPMI_RH_HIERARCHY hierarchy;
|
|
TPM2B_CONTEXT_DATA contextBlob;
|
|
} TPMS_CONTEXT;
|
|
|
|
|
|
typedef struct TPMS_CREATION_DATA {
|
|
TPML_PCR_SELECTION pcrSelect;
|
|
TPM2B_DIGEST pcrDigest;
|
|
TPMA_LOCALITY locality;
|
|
TPM_ALG_ID parentNameAlg;
|
|
TPM2B_NAME parentName;
|
|
TPM2B_NAME parentQualifiedName;
|
|
TPM2B_DATA outsideInfo;
|
|
} TPMS_CREATION_DATA;
|
|
|
|
typedef struct TPM2B_CREATION_DATA {
|
|
UINT16 size;
|
|
TPMS_CREATION_DATA creationData;
|
|
} TPM2B_CREATION_DATA;
|
|
|
|
|
|
/* Authorization Structures */
|
|
typedef struct TPMS_AUTH_COMMAND {
|
|
TPMI_SH_AUTH_SESSION sessionHandle;
|
|
TPM2B_NONCE nonce; /* nonceCaller */
|
|
TPMA_SESSION sessionAttributes;
|
|
TPM2B_AUTH hmac;
|
|
} TPMS_AUTH_COMMAND;
|
|
|
|
typedef struct TPMS_AUTH_RESPONSE {
|
|
TPM2B_NONCE nonce;
|
|
TPMA_SESSION sessionAttributes;
|
|
TPM2B_AUTH hmac;
|
|
} TPMS_AUTH_RESPONSE;
|
|
|
|
/* Implementation specific authorization session information */
|
|
typedef struct TPM2_AUTH_SESSION {
|
|
/* BEGIN */
|
|
/* This section should match TPMS_AUTH_COMMAND */
|
|
TPMI_SH_AUTH_SESSION sessionHandle;
|
|
TPM2B_NONCE nonceCaller;
|
|
TPMA_SESSION sessionAttributes;
|
|
TPM2B_AUTH auth;
|
|
/* END */
|
|
|
|
/* additional auth data required for implementation */
|
|
TPM2B_NONCE nonceTPM;
|
|
TPMT_SYM_DEF symmetric;
|
|
TPMI_ALG_HASH authHash;
|
|
TPM2B_NAME name;
|
|
} TPM2_AUTH_SESSION;
|
|
|
|
/* Macros to determine TPM 2.0 Session type */
|
|
#define TPM2_IS_PWD_SESSION(sessionHandle) ((sessionHandle) == TPM_RS_PW)
|
|
#define TPM2_IS_HMAC_SESSION(sessionHandle) ((sessionHandle & 0xFF000000) == HMAC_SESSION_FIRST)
|
|
#define TPM2_IS_POLICY_SESSION(sessionHandle) ((sessionHandle & 0xFF000000) == POLICY_SESSION_FIRST)
|
|
|
|
/* Predetermined TPM 2.0 Indexes */
|
|
#define TPM_20_TPM_MFG_NV_SPACE ((TPM_HT_NV_INDEX << 24) | (0x00 << 22))
|
|
#define TPM_20_PLATFORM_MFG_NV_SPACE ((TPM_HT_NV_INDEX << 24) | (0x01 << 22))
|
|
#define TPM_20_OWNER_NV_SPACE ((TPM_HT_NV_INDEX << 24) | (0x02 << 22))
|
|
#define TPM_20_TCG_NV_SPACE ((TPM_HT_NV_INDEX << 24) | (0x03 << 22))
|
|
|
|
#define TPM_20_NV_INDEX_EK_CERTIFICATE (TPM_20_PLATFORM_MFG_NV_SPACE + 2)
|
|
#define TPM_20_NV_INDEX_EK_NONCE (TPM_20_PLATFORM_MFG_NV_SPACE + 3)
|
|
#define TPM_20_NV_INDEX_EK_TEMPLATE (TPM_20_PLATFORM_MFG_NV_SPACE + 4)
|
|
|
|
/* Predetermined TPM 2.0 Endorsement policy auth template for SHA2-256 */
|
|
static const BYTE TPM_20_EK_AUTH_POLICY[] = {
|
|
0x83, 0x71, 0x97, 0x67, 0x44, 0x84, 0xb3, 0xf8, 0x1a, 0x90, 0xcc,
|
|
0x8d, 0x46, 0xa5, 0xd7, 0x24, 0xfd, 0x52, 0xd7, 0x6e, 0x06, 0x52,
|
|
0x0b, 0x64, 0xf2, 0xa1, 0xda, 0x1b, 0x33, 0x14, 0x69, 0xaa,
|
|
};
|
|
|
|
|
|
|
|
/* HAL IO Callbacks */
|
|
struct TPM2_CTX;
|
|
|
|
#ifdef WOLFTPM_SWTPM
|
|
struct wolfTPM_tcpContext {
|
|
int fd;
|
|
};
|
|
#endif /* WOLFTPM_SWTPM */
|
|
|
|
#ifdef WOLFTPM_WINAPI
|
|
#include <tbs.h>
|
|
#include <winerror.h>
|
|
|
|
struct wolfTPM_winContext {
|
|
TBS_HCONTEXT tbs_context;
|
|
};
|
|
/* may be needed with msys */
|
|
#ifndef TPM_E_COMMAND_BLOCKED
|
|
#define TPM_E_COMMAND_BLOCKED (0x80280400)
|
|
#endif
|
|
|
|
#define WOLFTPM_IS_COMMAND_UNAVAILABLE(code) ((code) == (int)TPM_RC_COMMAND_CODE || (code) == (int)TPM_E_COMMAND_BLOCKED)
|
|
#else
|
|
#define WOLFTPM_IS_COMMAND_UNAVAILABLE(code) (code == (int)TPM_RC_COMMAND_CODE)
|
|
#endif /* WOLFTPM_WINAPI */
|
|
|
|
/* make sure advanced IO is enabled for I2C */
|
|
#ifdef WOLFTPM_I2C
|
|
#undef WOLFTPM_ADV_IO
|
|
#define WOLFTPM_ADV_IO
|
|
#endif
|
|
|
|
#ifdef WOLFTPM_ADV_IO
|
|
typedef int (*TPM2HalIoCb)(struct TPM2_CTX*, INT32 isRead, UINT32 addr,
|
|
BYTE* xferBuf, UINT16 xferSz, void* userCtx);
|
|
#else
|
|
typedef int (*TPM2HalIoCb)(struct TPM2_CTX*, const BYTE* txBuf, BYTE* rxBuf,
|
|
UINT16 xferSz, void* userCtx);
|
|
#endif
|
|
|
|
#if !defined(WOLFTPM2_NO_WOLFCRYPT) && !defined(WC_NO_RNG) && \
|
|
!defined(WOLFTPM2_USE_HW_RNG)
|
|
#define WOLFTPM2_USE_WOLF_RNG
|
|
#endif
|
|
|
|
#if MAX_RESPONSE_SIZE > MAX_COMMAND_SIZE
|
|
#define XFER_MAX_SIZE MAX_RESPONSE_SIZE
|
|
#else
|
|
#define XFER_MAX_SIZE MAX_COMMAND_SIZE
|
|
#endif
|
|
|
|
typedef struct TPM2_CTX {
|
|
TPM2HalIoCb ioCb;
|
|
void* userCtx;
|
|
#ifdef WOLFTPM_SWTPM
|
|
struct wolfTPM_tcpContext tcpCtx;
|
|
#endif
|
|
#ifdef WOLFTPM_WINAPI
|
|
struct wolfTPM_winContext winCtx;
|
|
#endif
|
|
#ifndef WOLFTPM2_NO_WOLFCRYPT
|
|
#ifndef WOLFTPM_NO_LOCK
|
|
wolfSSL_Mutex hwLock;
|
|
int lockCount;
|
|
#endif
|
|
#ifdef WOLFTPM2_USE_WOLF_RNG
|
|
WC_RNG rng;
|
|
#endif
|
|
#endif /* !WOLFTPM2_NO_WOLFCRYPT */
|
|
|
|
/* TPM TIS Info */
|
|
int locality;
|
|
word32 caps;
|
|
word32 did_vid;
|
|
|
|
/* Pointer to current TPM auth sessions */
|
|
TPM2_AUTH_SESSION* session;
|
|
|
|
/* Command / Response Buffer */
|
|
byte cmdBuf[XFER_MAX_SIZE];
|
|
|
|
byte rid;
|
|
/* Informational Bits - use unsigned int for best compiler compatibility */
|
|
#ifndef WOLFTPM2_NO_WOLFCRYPT
|
|
#ifndef WOLFTPM_NO_LOCK
|
|
unsigned int hwLockInit:1;
|
|
#endif
|
|
#ifndef WC_NO_RNG
|
|
unsigned int rngInit:1;
|
|
#endif
|
|
#endif
|
|
} TPM2_CTX;
|
|
|
|
|
|
/* TPM Specification Functions */
|
|
typedef struct {
|
|
TPM_SU startupType;
|
|
} Startup_In;
|
|
WOLFTPM_API TPM_RC TPM2_Startup(Startup_In* in);
|
|
|
|
typedef struct {
|
|
TPM_SU shutdownType;
|
|
} Shutdown_In;
|
|
WOLFTPM_API TPM_RC TPM2_Shutdown(Shutdown_In* in);
|
|
|
|
|
|
typedef struct {
|
|
TPM_CAP capability;
|
|
UINT32 property;
|
|
UINT32 propertyCount;
|
|
} GetCapability_In;
|
|
typedef struct {
|
|
TPMI_YES_NO moreData;
|
|
TPMS_CAPABILITY_DATA capabilityData;
|
|
} GetCapability_Out;
|
|
WOLFTPM_API TPM_RC TPM2_GetCapability(GetCapability_In* in,
|
|
GetCapability_Out* out);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_YES_NO fullTest;
|
|
} SelfTest_In;
|
|
WOLFTPM_API TPM_RC TPM2_SelfTest(SelfTest_In* in);
|
|
|
|
typedef struct {
|
|
TPML_ALG toTest;
|
|
} IncrementalSelfTest_In;
|
|
typedef struct {
|
|
TPML_ALG toDoList;
|
|
} IncrementalSelfTest_Out;
|
|
WOLFTPM_API TPM_RC TPM2_IncrementalSelfTest(IncrementalSelfTest_In* in,
|
|
IncrementalSelfTest_Out* out);
|
|
|
|
typedef struct {
|
|
TPM2B_MAX_BUFFER outData;
|
|
UINT16 testResult; /* TPM_RC */
|
|
} GetTestResult_Out;
|
|
WOLFTPM_API TPM_RC TPM2_GetTestResult(GetTestResult_Out* out);
|
|
|
|
|
|
typedef struct {
|
|
UINT16 bytesRequested;
|
|
} GetRandom_In;
|
|
typedef struct {
|
|
TPM2B_DIGEST randomBytes; /* hardware max is 32-bytes */
|
|
} GetRandom_Out;
|
|
WOLFTPM_API TPM_RC TPM2_GetRandom(GetRandom_In* in, GetRandom_Out* out);
|
|
|
|
typedef struct {
|
|
TPM2B_SENSITIVE_DATA inData;
|
|
} StirRandom_In;
|
|
WOLFTPM_API TPM_RC TPM2_StirRandom(StirRandom_In* in);
|
|
|
|
typedef struct {
|
|
TPML_PCR_SELECTION pcrSelectionIn;
|
|
} PCR_Read_In;
|
|
typedef struct {
|
|
UINT32 pcrUpdateCounter;
|
|
TPML_PCR_SELECTION pcrSelectionOut;
|
|
TPML_DIGEST pcrValues;
|
|
} PCR_Read_Out;
|
|
WOLFTPM_API TPM_RC TPM2_PCR_Read(PCR_Read_In* in, PCR_Read_Out* out);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_DH_PCR pcrHandle;
|
|
TPML_DIGEST_VALUES digests;
|
|
} PCR_Extend_In;
|
|
WOLFTPM_API TPM_RC TPM2_PCR_Extend(PCR_Extend_In* in);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT parentHandle;
|
|
TPM2B_SENSITIVE_CREATE inSensitive;
|
|
TPM2B_PUBLIC inPublic;
|
|
TPM2B_DATA outsideInfo;
|
|
TPML_PCR_SELECTION creationPCR;
|
|
} Create_In;
|
|
typedef struct {
|
|
TPM2B_PRIVATE outPrivate;
|
|
TPM2B_PUBLIC outPublic;
|
|
TPM2B_CREATION_DATA creationData;
|
|
TPM2B_DIGEST creationHash;
|
|
TPMT_TK_CREATION creationTicket;
|
|
} Create_Out;
|
|
WOLFTPM_API TPM_RC TPM2_Create(Create_In* in, Create_Out* out);
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT parentHandle;
|
|
TPM2B_SENSITIVE_CREATE inSensitive;
|
|
TPM2B_PUBLIC inPublic;
|
|
} CreateLoaded_In;
|
|
typedef struct {
|
|
TPM_HANDLE objectHandle;
|
|
TPM2B_PRIVATE outPrivate;
|
|
TPM2B_PUBLIC outPublic;
|
|
TPM2B_NAME name;
|
|
} CreateLoaded_Out;
|
|
WOLFTPM_API TPM_RC TPM2_CreateLoaded(CreateLoaded_In* in,
|
|
CreateLoaded_Out* out);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_RH_HIERARCHY primaryHandle;
|
|
TPM2B_SENSITIVE_CREATE inSensitive;
|
|
TPM2B_PUBLIC inPublic;
|
|
TPM2B_DATA outsideInfo;
|
|
TPML_PCR_SELECTION creationPCR;
|
|
} CreatePrimary_In;
|
|
typedef struct {
|
|
TPM_HANDLE objectHandle;
|
|
TPM2B_PUBLIC outPublic;
|
|
TPM2B_CREATION_DATA creationData;
|
|
TPM2B_DIGEST creationHash;
|
|
TPMT_TK_CREATION creationTicket;
|
|
TPM2B_NAME name;
|
|
} CreatePrimary_Out;
|
|
WOLFTPM_API TPM_RC TPM2_CreatePrimary(CreatePrimary_In* in,
|
|
CreatePrimary_Out* out);
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT parentHandle;
|
|
TPM2B_PRIVATE inPrivate;
|
|
TPM2B_PUBLIC inPublic;
|
|
} Load_In;
|
|
typedef struct {
|
|
TPM_HANDLE objectHandle;
|
|
TPM2B_NAME name;
|
|
} Load_Out;
|
|
WOLFTPM_API TPM_RC TPM2_Load(Load_In* in, Load_Out* out);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_DH_CONTEXT flushHandle;
|
|
} FlushContext_In;
|
|
WOLFTPM_API TPM_RC TPM2_FlushContext(FlushContext_In* in);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT itemHandle;
|
|
} Unseal_In;
|
|
typedef struct {
|
|
TPM2B_SENSITIVE_DATA outData;
|
|
} Unseal_Out;
|
|
WOLFTPM_API TPM_RC TPM2_Unseal(Unseal_In* in, Unseal_Out* out);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT tpmKey;
|
|
TPMI_DH_ENTITY bind;
|
|
TPM2B_NONCE nonceCaller;
|
|
TPM2B_ENCRYPTED_SECRET encryptedSalt;
|
|
TPM_SE sessionType;
|
|
TPMT_SYM_DEF symmetric;
|
|
TPMI_ALG_HASH authHash;
|
|
} StartAuthSession_In;
|
|
typedef struct {
|
|
TPMI_SH_AUTH_SESSION sessionHandle;
|
|
TPM2B_NONCE nonceTPM;
|
|
} StartAuthSession_Out;
|
|
WOLFTPM_API TPM_RC TPM2_StartAuthSession(StartAuthSession_In* in,
|
|
StartAuthSession_Out* out);
|
|
|
|
typedef struct {
|
|
TPMI_SH_POLICY sessionHandle;
|
|
} PolicyRestart_In;
|
|
WOLFTPM_API TPM_RC TPM2_PolicyRestart(PolicyRestart_In* in);
|
|
|
|
|
|
typedef struct {
|
|
TPM2B_SENSITIVE inPrivate;
|
|
TPM2B_PUBLIC inPublic;
|
|
TPMI_RH_HIERARCHY hierarchy;
|
|
} LoadExternal_In;
|
|
typedef struct {
|
|
TPM_HANDLE objectHandle;
|
|
TPM2B_NAME name;
|
|
} LoadExternal_Out;
|
|
WOLFTPM_API TPM_RC TPM2_LoadExternal(LoadExternal_In* in,
|
|
LoadExternal_Out* out);
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT objectHandle;
|
|
} ReadPublic_In;
|
|
typedef struct {
|
|
TPM2B_PUBLIC outPublic;
|
|
TPM2B_NAME name;
|
|
TPM2B_NAME qualifiedName;
|
|
} ReadPublic_Out;
|
|
WOLFTPM_API TPM_RC TPM2_ReadPublic(ReadPublic_In* in, ReadPublic_Out* out);
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT activateHandle;
|
|
TPMI_DH_OBJECT keyHandle;
|
|
TPM2B_ID_OBJECT credentialBlob;
|
|
TPM2B_ENCRYPTED_SECRET secret;
|
|
} ActivateCredential_In;
|
|
typedef struct {
|
|
TPM2B_DIGEST certInfo;
|
|
} ActivateCredential_Out;
|
|
WOLFTPM_API TPM_RC TPM2_ActivateCredential(ActivateCredential_In* in,
|
|
ActivateCredential_Out* out);
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT handle;
|
|
TPM2B_DIGEST credential;
|
|
TPM2B_NAME objectName;
|
|
} MakeCredential_In;
|
|
typedef struct {
|
|
TPM2B_ID_OBJECT credentialBlob;
|
|
TPM2B_ENCRYPTED_SECRET secret;
|
|
} MakeCredential_Out;
|
|
WOLFTPM_API TPM_RC TPM2_MakeCredential(MakeCredential_In* in,
|
|
MakeCredential_Out* out);
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT objectHandle;
|
|
TPMI_DH_OBJECT parentHandle;
|
|
TPM2B_AUTH newAuth;
|
|
} ObjectChangeAuth_In;
|
|
typedef struct {
|
|
TPM2B_PRIVATE outPrivate;
|
|
} ObjectChangeAuth_Out;
|
|
WOLFTPM_API TPM_RC TPM2_ObjectChangeAuth(ObjectChangeAuth_In* in,
|
|
ObjectChangeAuth_Out* out);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT objectHandle;
|
|
TPMI_DH_OBJECT newParentHandle;
|
|
TPM2B_DATA encryptionKeyIn;
|
|
TPMT_SYM_DEF_OBJECT symmetricAlg;
|
|
} Duplicate_In;
|
|
typedef struct {
|
|
TPM2B_DATA encryptionKeyOut;
|
|
TPM2B_PRIVATE duplicate;
|
|
TPM2B_ENCRYPTED_SECRET outSymSeed;
|
|
} Duplicate_Out;
|
|
WOLFTPM_API TPM_RC TPM2_Duplicate(Duplicate_In* in, Duplicate_Out* out);
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT oldParent;
|
|
TPMI_DH_OBJECT newParent;
|
|
TPM2B_PRIVATE inDuplicate;
|
|
TPM2B_NAME name;
|
|
TPM2B_ENCRYPTED_SECRET inSymSeed;
|
|
} Rewrap_In;
|
|
typedef struct {
|
|
TPM2B_PRIVATE outDuplicate;
|
|
TPM2B_ENCRYPTED_SECRET outSymSeed;
|
|
} Rewrap_Out;
|
|
WOLFTPM_API TPM_RC TPM2_Rewrap(Rewrap_In* in, Rewrap_Out* out);
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT parentHandle;
|
|
TPM2B_DATA encryptionKey;
|
|
TPM2B_PUBLIC objectPublic;
|
|
TPM2B_PRIVATE duplicate;
|
|
TPM2B_ENCRYPTED_SECRET inSymSeed;
|
|
TPMT_SYM_DEF_OBJECT symmetricAlg;
|
|
} Import_In;
|
|
typedef struct {
|
|
TPM2B_PRIVATE outPrivate;
|
|
} Import_Out;
|
|
WOLFTPM_API TPM_RC TPM2_Import(Import_In* in, Import_Out* out);
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT keyHandle;
|
|
TPM2B_PUBLIC_KEY_RSA message;
|
|
TPMT_RSA_DECRYPT inScheme;
|
|
TPM2B_DATA label;
|
|
} RSA_Encrypt_In;
|
|
typedef struct {
|
|
TPM2B_PUBLIC_KEY_RSA outData;
|
|
} RSA_Encrypt_Out;
|
|
WOLFTPM_API TPM_RC TPM2_RSA_Encrypt(RSA_Encrypt_In* in, RSA_Encrypt_Out* out);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT keyHandle;
|
|
TPM2B_PUBLIC_KEY_RSA cipherText;
|
|
TPMT_RSA_DECRYPT inScheme;
|
|
TPM2B_DATA label;
|
|
} RSA_Decrypt_In;
|
|
typedef struct {
|
|
TPM2B_PUBLIC_KEY_RSA message;
|
|
} RSA_Decrypt_Out;
|
|
WOLFTPM_API TPM_RC TPM2_RSA_Decrypt(RSA_Decrypt_In* in, RSA_Decrypt_Out* out);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT keyHandle;
|
|
} ECDH_KeyGen_In;
|
|
typedef struct {
|
|
TPM2B_ECC_POINT zPoint;
|
|
TPM2B_ECC_POINT pubPoint;
|
|
} ECDH_KeyGen_Out;
|
|
WOLFTPM_API TPM_RC TPM2_ECDH_KeyGen(ECDH_KeyGen_In* in, ECDH_KeyGen_Out* out);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT keyHandle;
|
|
TPM2B_ECC_POINT inPoint;
|
|
} ECDH_ZGen_In;
|
|
typedef struct {
|
|
TPM2B_ECC_POINT outPoint;
|
|
} ECDH_ZGen_Out;
|
|
WOLFTPM_API TPM_RC TPM2_ECDH_ZGen(ECDH_ZGen_In* in, ECDH_ZGen_Out* out);
|
|
|
|
typedef struct {
|
|
TPMI_ECC_CURVE curveID;
|
|
} ECC_Parameters_In;
|
|
typedef struct {
|
|
TPMS_ALGORITHM_DETAIL_ECC parameters;
|
|
} ECC_Parameters_Out;
|
|
WOLFTPM_API TPM_RC TPM2_ECC_Parameters(ECC_Parameters_In* in,
|
|
ECC_Parameters_Out* out);
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT keyA;
|
|
TPM2B_ECC_POINT inQsB;
|
|
TPM2B_ECC_POINT inQeB;
|
|
TPMI_ECC_KEY_EXCHANGE inScheme;
|
|
UINT16 counter;
|
|
} ZGen_2Phase_In;
|
|
typedef struct {
|
|
TPM2B_ECC_POINT outZ1;
|
|
TPM2B_ECC_POINT outZ2;
|
|
} ZGen_2Phase_Out;
|
|
WOLFTPM_API TPM_RC TPM2_ZGen_2Phase(ZGen_2Phase_In* in, ZGen_2Phase_Out* out);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT keyHandle;
|
|
TPMI_YES_NO decrypt;
|
|
TPMI_ALG_SYM_MODE mode;
|
|
TPM2B_IV ivIn;
|
|
TPM2B_MAX_BUFFER inData;
|
|
} EncryptDecrypt_In;
|
|
typedef struct {
|
|
TPM2B_MAX_BUFFER outData;
|
|
TPM2B_IV ivOut;
|
|
} EncryptDecrypt_Out;
|
|
WOLFTPM_API TPM_RC TPM2_EncryptDecrypt(EncryptDecrypt_In* in,
|
|
EncryptDecrypt_Out* out);
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT keyHandle;
|
|
TPM2B_MAX_BUFFER inData;
|
|
TPMI_YES_NO decrypt;
|
|
TPMI_ALG_SYM_MODE mode;
|
|
TPM2B_IV ivIn;
|
|
} EncryptDecrypt2_In;
|
|
typedef struct {
|
|
TPM2B_MAX_BUFFER outData;
|
|
TPM2B_IV ivOut;
|
|
} EncryptDecrypt2_Out;
|
|
WOLFTPM_API TPM_RC TPM2_EncryptDecrypt2(EncryptDecrypt2_In* in,
|
|
EncryptDecrypt2_Out* out);
|
|
|
|
|
|
typedef struct {
|
|
TPM2B_MAX_BUFFER data;
|
|
TPMI_ALG_HASH hashAlg;
|
|
TPMI_RH_HIERARCHY hierarchy;
|
|
} Hash_In;
|
|
typedef struct {
|
|
TPM2B_DIGEST outHash;
|
|
TPMT_TK_HASHCHECK validation;
|
|
} Hash_Out;
|
|
WOLFTPM_API TPM_RC TPM2_Hash(Hash_In* in, Hash_Out* out);
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT handle;
|
|
TPM2B_MAX_BUFFER buffer;
|
|
TPMI_ALG_HASH hashAlg;
|
|
} HMAC_In;
|
|
typedef struct {
|
|
TPM2B_DIGEST outHMAC;
|
|
} HMAC_Out;
|
|
WOLFTPM_API TPM_RC TPM2_HMAC(HMAC_In* in, HMAC_Out* out);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT handle;
|
|
TPM2B_AUTH auth;
|
|
TPMI_ALG_HASH hashAlg;
|
|
} HMAC_Start_In;
|
|
typedef struct {
|
|
TPMI_DH_OBJECT sequenceHandle;
|
|
} HMAC_Start_Out;
|
|
WOLFTPM_API TPM_RC TPM2_HMAC_Start(HMAC_Start_In* in, HMAC_Start_Out* out);
|
|
|
|
|
|
typedef struct {
|
|
TPM2B_AUTH auth;
|
|
TPMI_ALG_HASH hashAlg;
|
|
} HashSequenceStart_In;
|
|
typedef struct {
|
|
TPMI_DH_OBJECT sequenceHandle;
|
|
} HashSequenceStart_Out;
|
|
WOLFTPM_API TPM_RC TPM2_HashSequenceStart(HashSequenceStart_In* in,
|
|
HashSequenceStart_Out* out);
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT sequenceHandle;
|
|
TPM2B_MAX_BUFFER buffer;
|
|
} SequenceUpdate_In;
|
|
WOLFTPM_API TPM_RC TPM2_SequenceUpdate(SequenceUpdate_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT sequenceHandle;
|
|
TPM2B_MAX_BUFFER buffer;
|
|
TPMI_RH_HIERARCHY hierarchy;
|
|
} SequenceComplete_In;
|
|
typedef struct {
|
|
TPM2B_DIGEST result;
|
|
TPMT_TK_HASHCHECK validation;
|
|
} SequenceComplete_Out;
|
|
WOLFTPM_API TPM_RC TPM2_SequenceComplete(SequenceComplete_In* in,
|
|
SequenceComplete_Out* out);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_DH_PCR pcrHandle;
|
|
TPMI_DH_OBJECT sequenceHandle;
|
|
TPM2B_MAX_BUFFER buffer;
|
|
} EventSequenceComplete_In;
|
|
typedef struct {
|
|
TPML_DIGEST_VALUES results;
|
|
} EventSequenceComplete_Out;
|
|
WOLFTPM_API TPM_RC TPM2_EventSequenceComplete(EventSequenceComplete_In* in,
|
|
EventSequenceComplete_Out* out);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT objectHandle;
|
|
TPMI_DH_OBJECT signHandle;
|
|
TPM2B_DATA qualifyingData;
|
|
TPMT_SIG_SCHEME inScheme;
|
|
} Certify_In;
|
|
typedef struct {
|
|
TPM2B_ATTEST certifyInfo;
|
|
TPMT_SIGNATURE signature;
|
|
} Certify_Out;
|
|
WOLFTPM_API TPM_RC TPM2_Certify(Certify_In* in, Certify_Out* out);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT signHandle;
|
|
TPMI_DH_OBJECT objectHandle;
|
|
TPM2B_DATA qualifyingData;
|
|
TPM2B_DIGEST creationHash;
|
|
TPMT_SIG_SCHEME inScheme;
|
|
TPMT_TK_CREATION creationTicket;
|
|
} CertifyCreation_In;
|
|
typedef struct {
|
|
TPM2B_ATTEST certifyInfo;
|
|
TPMT_SIGNATURE signature;
|
|
} CertifyCreation_Out;
|
|
WOLFTPM_API TPM_RC TPM2_CertifyCreation(CertifyCreation_In* in, CertifyCreation_Out* out);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT signHandle;
|
|
TPM2B_DATA qualifyingData;
|
|
TPMT_SIG_SCHEME inScheme;
|
|
TPML_PCR_SELECTION PCRselect;
|
|
} Quote_In;
|
|
typedef struct {
|
|
TPM2B_ATTEST quoted;
|
|
TPMT_SIGNATURE signature;
|
|
} Quote_Out;
|
|
WOLFTPM_API TPM_RC TPM2_Quote(Quote_In* in, Quote_Out* out);
|
|
|
|
typedef struct {
|
|
TPMI_RH_ENDORSEMENT privacyAdminHandle;
|
|
TPMI_DH_OBJECT signHandle;
|
|
TPMI_SH_HMAC sessionHandle;
|
|
TPM2B_DATA qualifyingData;
|
|
TPMT_SIG_SCHEME inScheme;
|
|
} GetSessionAuditDigest_In;
|
|
typedef struct {
|
|
TPM2B_ATTEST auditInfo;
|
|
TPMT_SIGNATURE signature;
|
|
} GetSessionAuditDigest_Out;
|
|
WOLFTPM_API TPM_RC TPM2_GetSessionAuditDigest(GetSessionAuditDigest_In* in,
|
|
GetSessionAuditDigest_Out* out);
|
|
|
|
typedef struct {
|
|
TPMI_RH_ENDORSEMENT privacyHandle;
|
|
TPMI_DH_OBJECT signHandle;
|
|
TPM2B_DATA qualifyingData;
|
|
TPMT_SIG_SCHEME inScheme;
|
|
} GetCommandAuditDigest_In;
|
|
typedef struct {
|
|
TPM2B_ATTEST auditInfo;
|
|
TPMT_SIGNATURE signature;
|
|
} GetCommandAuditDigest_Out;
|
|
WOLFTPM_API TPM_RC TPM2_GetCommandAuditDigest(GetCommandAuditDigest_In* in,
|
|
GetCommandAuditDigest_Out* out);
|
|
|
|
typedef struct {
|
|
TPMI_RH_ENDORSEMENT privacyAdminHandle;
|
|
TPMI_DH_OBJECT signHandle;
|
|
TPM2B_DATA qualifyingData;
|
|
TPMT_SIG_SCHEME inScheme;
|
|
} GetTime_In;
|
|
typedef struct {
|
|
TPM2B_ATTEST timeInfo;
|
|
TPMT_SIGNATURE signature;
|
|
} GetTime_Out;
|
|
WOLFTPM_API TPM_RC TPM2_GetTime(GetTime_In* in, GetTime_Out* out);
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT signHandle;
|
|
TPM2B_ECC_POINT P1;
|
|
TPM2B_SENSITIVE_DATA s2;
|
|
TPM2B_ECC_PARAMETER y2;
|
|
} Commit_In;
|
|
typedef struct {
|
|
TPM2B_ECC_POINT K;
|
|
TPM2B_ECC_POINT L;
|
|
TPM2B_ECC_POINT E;
|
|
UINT16 counter;
|
|
} Commit_Out;
|
|
WOLFTPM_API TPM_RC TPM2_Commit(Commit_In* in, Commit_Out* out);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_ECC_CURVE curveID;
|
|
} EC_Ephemeral_In;
|
|
typedef struct {
|
|
TPM2B_ECC_POINT Q;
|
|
UINT16 counter;
|
|
} EC_Ephemeral_Out;
|
|
WOLFTPM_API TPM_RC TPM2_EC_Ephemeral(EC_Ephemeral_In* in,
|
|
EC_Ephemeral_Out* out);
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT keyHandle;
|
|
TPM2B_DIGEST digest;
|
|
TPMT_SIGNATURE signature;
|
|
} VerifySignature_In;
|
|
typedef struct {
|
|
TPMT_TK_VERIFIED validation;
|
|
} VerifySignature_Out;
|
|
WOLFTPM_API TPM_RC TPM2_VerifySignature(VerifySignature_In* in,
|
|
VerifySignature_Out* out);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT keyHandle;
|
|
TPM2B_DIGEST digest;
|
|
TPMT_SIG_SCHEME inScheme;
|
|
TPMT_TK_HASHCHECK validation;
|
|
} Sign_In;
|
|
typedef struct {
|
|
TPMT_SIGNATURE signature;
|
|
} Sign_Out;
|
|
WOLFTPM_API TPM_RC TPM2_Sign(Sign_In* in, Sign_Out* out);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_RH_PROVISION auth;
|
|
TPMI_ALG_HASH auditAlg;
|
|
TPML_CC setList;
|
|
TPML_CC clearList;
|
|
} SetCommandCodeAuditStatus_In;
|
|
WOLFTPM_API TPM_RC TPM2_SetCommandCodeAuditStatus(
|
|
SetCommandCodeAuditStatus_In* in);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_DH_PCR pcrHandle;
|
|
TPM2B_EVENT eventData;
|
|
} PCR_Event_In;
|
|
typedef struct {
|
|
TPML_DIGEST_VALUES digests;
|
|
} PCR_Event_Out;
|
|
WOLFTPM_API TPM_RC TPM2_PCR_Event(PCR_Event_In* in, PCR_Event_Out* out);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_RH_PLATFORM authHandle;
|
|
TPML_PCR_SELECTION pcrAllocation;
|
|
} PCR_Allocate_In;
|
|
typedef struct {
|
|
TPMI_YES_NO allocationSuccess;
|
|
UINT32 maxPCR;
|
|
UINT32 sizeNeeded;
|
|
UINT32 sizeAvailable;
|
|
} PCR_Allocate_Out;
|
|
WOLFTPM_API TPM_RC TPM2_PCR_Allocate(PCR_Allocate_In* in,
|
|
PCR_Allocate_Out* out);
|
|
|
|
typedef struct {
|
|
TPMI_RH_PLATFORM authHandle;
|
|
TPM2B_DIGEST authPolicy;
|
|
TPMI_ALG_HASH hashAlg;
|
|
TPMI_DH_PCR pcrNum;
|
|
} PCR_SetAuthPolicy_In;
|
|
WOLFTPM_API TPM_RC TPM2_PCR_SetAuthPolicy(PCR_SetAuthPolicy_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_DH_PCR pcrHandle;
|
|
TPM2B_DIGEST auth;
|
|
} PCR_SetAuthValue_In;
|
|
WOLFTPM_API TPM_RC TPM2_PCR_SetAuthValue(PCR_SetAuthValue_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_DH_PCR pcrHandle;
|
|
} PCR_Reset_In;
|
|
WOLFTPM_API TPM_RC TPM2_PCR_Reset(PCR_Reset_In* in);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT authObject;
|
|
TPMI_SH_POLICY policySession;
|
|
TPM2B_NONCE nonceTPM;
|
|
TPM2B_DIGEST cpHashA;
|
|
TPM2B_NONCE policyRef;
|
|
INT32 expiration;
|
|
TPMT_SIGNATURE auth;
|
|
} PolicySigned_In;
|
|
typedef struct {
|
|
TPM2B_TIMEOUT timeout;
|
|
TPMT_TK_AUTH policyTicket;
|
|
} PolicySigned_Out;
|
|
WOLFTPM_API TPM_RC TPM2_PolicySigned(PolicySigned_In* in,
|
|
PolicySigned_Out* out);
|
|
|
|
typedef struct {
|
|
TPMI_DH_ENTITY authHandle;
|
|
TPMI_SH_POLICY policySession;
|
|
TPM2B_NONCE nonceTPM;
|
|
TPM2B_DIGEST cpHashA;
|
|
TPM2B_NONCE policyRef;
|
|
INT32 expiration;
|
|
} PolicySecret_In;
|
|
typedef struct {
|
|
TPM2B_TIMEOUT timeout;
|
|
TPMT_TK_AUTH policyTicket;
|
|
} PolicySecret_Out;
|
|
WOLFTPM_API TPM_RC TPM2_PolicySecret(PolicySecret_In* in,
|
|
PolicySecret_Out* out);
|
|
|
|
typedef struct {
|
|
TPMI_SH_POLICY policySession;
|
|
TPM2B_TIMEOUT timeout;
|
|
TPM2B_DIGEST cpHashA;
|
|
TPM2B_NONCE policyRef;
|
|
TPM2B_NAME authName;
|
|
TPMT_TK_AUTH ticket;
|
|
} PolicyTicket_In;
|
|
WOLFTPM_API TPM_RC TPM2_PolicyTicket(PolicyTicket_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_SH_POLICY policySession;
|
|
TPML_DIGEST pHashList;
|
|
} PolicyOR_In;
|
|
WOLFTPM_API TPM_RC TPM2_PolicyOR(PolicyOR_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_SH_POLICY policySession;
|
|
TPM2B_DIGEST pcrDigest;
|
|
TPML_PCR_SELECTION pcrs;
|
|
} PolicyPCR_In;
|
|
WOLFTPM_API TPM_RC TPM2_PolicyPCR(PolicyPCR_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_SH_POLICY policySession;
|
|
TPMA_LOCALITY locality;
|
|
} PolicyLocality_In;
|
|
WOLFTPM_API TPM_RC TPM2_PolicyLocality(PolicyLocality_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_RH_NV_AUTH authHandle;
|
|
TPMI_RH_NV_INDEX nvIndex;
|
|
TPMI_SH_POLICY policySession;
|
|
TPM2B_OPERAND operandB;
|
|
UINT16 offset;
|
|
TPM_EO operation;
|
|
} PolicyNV_In;
|
|
WOLFTPM_API TPM_RC TPM2_PolicyNV(PolicyNV_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_SH_POLICY policySession;
|
|
TPM2B_OPERAND operandB;
|
|
UINT16 offset;
|
|
TPM_EO operation;
|
|
} PolicyCounterTimer_In;
|
|
WOLFTPM_API TPM_RC TPM2_PolicyCounterTimer(PolicyCounterTimer_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_SH_POLICY policySession;
|
|
TPM_CC code;
|
|
} PolicyCommandCode_In;
|
|
WOLFTPM_API TPM_RC TPM2_PolicyCommandCode(PolicyCommandCode_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_SH_POLICY policySession;
|
|
} PolicyPhysicalPresence_In;
|
|
WOLFTPM_API TPM_RC TPM2_PolicyPhysicalPresence(PolicyPhysicalPresence_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_SH_POLICY policySession;
|
|
TPM2B_DIGEST cpHashA;
|
|
} PolicyCpHash_In;
|
|
WOLFTPM_API TPM_RC TPM2_PolicyCpHash(PolicyCpHash_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_SH_POLICY policySession;
|
|
TPM2B_DIGEST nameHash;
|
|
} PolicyNameHash_In;
|
|
WOLFTPM_API TPM_RC TPM2_PolicyNameHash(PolicyNameHash_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_SH_POLICY policySession;
|
|
TPM2B_NAME objectName;
|
|
TPM2B_NAME newParentName;
|
|
TPMI_YES_NO includeObject;
|
|
} PolicyDuplicationSelect_In;
|
|
WOLFTPM_API TPM_RC TPM2_PolicyDuplicationSelect(PolicyDuplicationSelect_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_SH_POLICY policySession;
|
|
TPM2B_DIGEST approvedPolicy;
|
|
TPM2B_NONCE policyRef;
|
|
TPM2B_NAME keySign;
|
|
TPMT_TK_VERIFIED checkTicket;
|
|
} PolicyAuthorize_In;
|
|
WOLFTPM_API TPM_RC TPM2_PolicyAuthorize(PolicyAuthorize_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_SH_POLICY policySession;
|
|
} PolicyAuthValue_In;
|
|
WOLFTPM_API TPM_RC TPM2_PolicyAuthValue(PolicyAuthValue_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_SH_POLICY policySession;
|
|
} PolicyPassword_In;
|
|
WOLFTPM_API TPM_RC TPM2_PolicyPassword(PolicyPassword_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_SH_POLICY policySession;
|
|
} PolicyGetDigest_In;
|
|
typedef struct {
|
|
TPM2B_DIGEST policyDigest;
|
|
} PolicyGetDigest_Out;
|
|
WOLFTPM_API TPM_RC TPM2_PolicyGetDigest(PolicyGetDigest_In* in, PolicyGetDigest_Out* out);
|
|
|
|
typedef struct {
|
|
TPMI_SH_POLICY policySession;
|
|
TPMI_YES_NO writtenSet;
|
|
} PolicyNvWritten_In;
|
|
WOLFTPM_API TPM_RC TPM2_PolicyNvWritten(PolicyNvWritten_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_SH_POLICY policySession;
|
|
TPM2B_DIGEST templateHash;
|
|
} PolicyTemplate_In;
|
|
WOLFTPM_API TPM_RC TPM2_PolicyTemplate(PolicyTemplate_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_RH_NV_AUTH authHandle;
|
|
TPMI_RH_NV_INDEX nvIndex;
|
|
TPMI_SH_POLICY policySession;
|
|
} PolicyAuthorizeNV_In;
|
|
WOLFTPM_API TPM_RC TPM2_PolicyAuthorizeNV(PolicyAuthorizeNV_In* in);
|
|
|
|
|
|
|
|
WOLFTPM_API void _TPM_Hash_Start(void);
|
|
WOLFTPM_API void _TPM_Hash_Data(UINT32 dataSize, BYTE *data);
|
|
WOLFTPM_API void _TPM_Hash_End(void);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_RH_HIERARCHY authHandle;
|
|
TPMI_RH_ENABLES enable;
|
|
TPMI_YES_NO state;
|
|
} HierarchyControl_In;
|
|
WOLFTPM_API TPM_RC TPM2_HierarchyControl(HierarchyControl_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_RH_HIERARCHY_AUTH authHandle;
|
|
TPM2B_DIGEST authPolicy;
|
|
TPMI_ALG_HASH hashAlg;
|
|
} SetPrimaryPolicy_In;
|
|
WOLFTPM_API TPM_RC TPM2_SetPrimaryPolicy(SetPrimaryPolicy_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_RH_PLATFORM authHandle;
|
|
} ChangeSeed_In;
|
|
|
|
typedef ChangeSeed_In ChangePPS_In;
|
|
WOLFTPM_API TPM_RC TPM2_ChangePPS(ChangePPS_In* in);
|
|
|
|
typedef ChangeSeed_In ChangeEPS_In;
|
|
WOLFTPM_API TPM_RC TPM2_ChangeEPS(ChangeEPS_In* in);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_RH_CLEAR authHandle;
|
|
} Clear_In;
|
|
WOLFTPM_API TPM_RC TPM2_Clear(Clear_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_RH_CLEAR auth;
|
|
TPMI_YES_NO disable;
|
|
} ClearControl_In;
|
|
WOLFTPM_API TPM_RC TPM2_ClearControl(ClearControl_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_RH_HIERARCHY_AUTH authHandle;
|
|
TPM2B_AUTH newAuth;
|
|
} HierarchyChangeAuth_In;
|
|
WOLFTPM_API TPM_RC TPM2_HierarchyChangeAuth(HierarchyChangeAuth_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_RH_LOCKOUT lockHandle;
|
|
} DictionaryAttackLockReset_In;
|
|
WOLFTPM_API TPM_RC TPM2_DictionaryAttackLockReset(DictionaryAttackLockReset_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_RH_LOCKOUT lockHandle;
|
|
UINT32 newMaxTries;
|
|
UINT32 newRecoveryTime;
|
|
UINT32 lockoutRecovery;
|
|
} DictionaryAttackParameters_In;
|
|
WOLFTPM_API TPM_RC TPM2_DictionaryAttackParameters(DictionaryAttackParameters_In* in);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_RH_PLATFORM auth;
|
|
TPML_CC setList;
|
|
TPML_CC clearList;
|
|
} PP_Commands_In;
|
|
WOLFTPM_API TPM_RC TPM2_PP_Commands(PP_Commands_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_RH_PLATFORM authHandle;
|
|
UINT32 algorithmSet;
|
|
} SetAlgorithmSet_In;
|
|
WOLFTPM_API TPM_RC TPM2_SetAlgorithmSet(SetAlgorithmSet_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_RH_PLATFORM authorization;
|
|
TPMI_DH_OBJECT keyHandle;
|
|
TPM2B_DIGEST fuDigest;
|
|
TPMT_SIGNATURE manifestSignature;
|
|
} FieldUpgradeStart_In;
|
|
WOLFTPM_API TPM_RC TPM2_FieldUpgradeStart(FieldUpgradeStart_In* in);
|
|
|
|
typedef struct {
|
|
TPM2B_MAX_BUFFER fuData;
|
|
} FieldUpgradeData_In;
|
|
typedef struct {
|
|
TPMT_HA nextDigest;
|
|
TPMT_HA firstDigest;
|
|
} FieldUpgradeData_Out;
|
|
WOLFTPM_API TPM_RC TPM2_FieldUpgradeData(FieldUpgradeData_In* in,
|
|
FieldUpgradeData_Out* out);
|
|
|
|
typedef struct {
|
|
UINT32 sequenceNumber;
|
|
} FirmwareRead_In;
|
|
typedef struct {
|
|
TPM2B_MAX_BUFFER fuData;
|
|
} FirmwareRead_Out;
|
|
WOLFTPM_API TPM_RC TPM2_FirmwareRead(FirmwareRead_In* in, FirmwareRead_Out* out);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_DH_CONTEXT saveHandle;
|
|
} ContextSave_In;
|
|
typedef struct {
|
|
TPMS_CONTEXT context;
|
|
} ContextSave_Out;
|
|
WOLFTPM_API TPM_RC TPM2_ContextSave(ContextSave_In* in, ContextSave_Out* out);
|
|
|
|
typedef struct {
|
|
TPMS_CONTEXT context;
|
|
} ContextLoad_In;
|
|
typedef struct {
|
|
TPMI_DH_CONTEXT loadedHandle;
|
|
} ContextLoad_Out;
|
|
WOLFTPM_API TPM_RC TPM2_ContextLoad(ContextLoad_In* in, ContextLoad_Out* out);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_RH_PROVISION auth;
|
|
TPMI_DH_OBJECT objectHandle;
|
|
TPMI_DH_PERSISTENT persistentHandle;
|
|
} EvictControl_In;
|
|
WOLFTPM_API TPM_RC TPM2_EvictControl(EvictControl_In* in);
|
|
|
|
|
|
typedef struct {
|
|
TPMS_TIME_INFO currentTime;
|
|
} ReadClock_Out;
|
|
WOLFTPM_API TPM_RC TPM2_ReadClock(ReadClock_Out* out);
|
|
|
|
typedef struct {
|
|
TPMI_RH_PROVISION auth;
|
|
UINT64 newTime;
|
|
} ClockSet_In;
|
|
WOLFTPM_API TPM_RC TPM2_ClockSet(ClockSet_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_RH_PROVISION auth;
|
|
TPM_CLOCK_ADJUST rateAdjust;
|
|
} ClockRateAdjust_In;
|
|
WOLFTPM_API TPM_RC TPM2_ClockRateAdjust(ClockRateAdjust_In* in);
|
|
|
|
|
|
typedef struct {
|
|
TPMT_PUBLIC_PARMS parameters;
|
|
} TestParms_In;
|
|
WOLFTPM_API TPM_RC TPM2_TestParms(TestParms_In* in);
|
|
|
|
|
|
typedef struct {
|
|
TPMI_RH_PROVISION authHandle;
|
|
TPM2B_AUTH auth;
|
|
TPM2B_NV_PUBLIC publicInfo;
|
|
} NV_DefineSpace_In;
|
|
WOLFTPM_API TPM_RC TPM2_NV_DefineSpace(NV_DefineSpace_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_RH_PROVISION authHandle;
|
|
TPMI_RH_NV_INDEX nvIndex;
|
|
} NV_UndefineSpace_In;
|
|
WOLFTPM_API TPM_RC TPM2_NV_UndefineSpace(NV_UndefineSpace_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_RH_NV_INDEX nvIndex;
|
|
TPMI_RH_PLATFORM platform;
|
|
} NV_UndefineSpaceSpecial_In;
|
|
WOLFTPM_API TPM_RC TPM2_NV_UndefineSpaceSpecial(NV_UndefineSpaceSpecial_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_RH_NV_INDEX nvIndex;
|
|
} NV_ReadPublic_In;
|
|
typedef struct {
|
|
TPM2B_NV_PUBLIC nvPublic;
|
|
TPM2B_NAME nvName;
|
|
} NV_ReadPublic_Out;
|
|
WOLFTPM_API TPM_RC TPM2_NV_ReadPublic(NV_ReadPublic_In* in, NV_ReadPublic_Out* out);
|
|
|
|
typedef struct {
|
|
TPMI_RH_NV_AUTH authHandle;
|
|
TPMI_RH_NV_INDEX nvIndex;
|
|
TPM2B_MAX_NV_BUFFER data;
|
|
UINT16 offset;
|
|
} NV_Write_In;
|
|
WOLFTPM_API TPM_RC TPM2_NV_Write(NV_Write_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_RH_NV_AUTH authHandle;
|
|
TPMI_RH_NV_INDEX nvIndex;
|
|
} NV_Increment_In;
|
|
WOLFTPM_API TPM_RC TPM2_NV_Increment(NV_Increment_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_RH_NV_AUTH authHandle;
|
|
TPMI_RH_NV_INDEX nvIndex;
|
|
TPM2B_MAX_NV_BUFFER data;
|
|
} NV_Extend_In;
|
|
WOLFTPM_API TPM_RC TPM2_NV_Extend(NV_Extend_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_RH_NV_AUTH authHandle;
|
|
TPMI_RH_NV_INDEX nvIndex;
|
|
UINT64 bits;
|
|
} NV_SetBits_In;
|
|
WOLFTPM_API TPM_RC TPM2_NV_SetBits(NV_SetBits_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_RH_NV_AUTH authHandle;
|
|
TPMI_RH_NV_INDEX nvIndex;
|
|
} NV_WriteLock_In;
|
|
WOLFTPM_API TPM_RC TPM2_NV_WriteLock(NV_WriteLock_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_RH_PROVISION authHandle;
|
|
} NV_GlobalWriteLock_In;
|
|
WOLFTPM_API TPM_RC TPM2_NV_GlobalWriteLock(NV_GlobalWriteLock_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_RH_NV_AUTH authHandle;
|
|
TPMI_RH_NV_INDEX nvIndex;
|
|
UINT16 size;
|
|
UINT16 offset;
|
|
} NV_Read_In;
|
|
typedef struct {
|
|
TPM2B_MAX_NV_BUFFER data;
|
|
} NV_Read_Out;
|
|
WOLFTPM_API TPM_RC TPM2_NV_Read(NV_Read_In* in, NV_Read_Out* out);
|
|
|
|
typedef struct {
|
|
TPMI_RH_NV_AUTH authHandle;
|
|
TPMI_RH_NV_INDEX nvIndex;
|
|
} NV_ReadLock_In;
|
|
WOLFTPM_API TPM_RC TPM2_NV_ReadLock(NV_ReadLock_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_RH_NV_INDEX nvIndex;
|
|
TPM2B_AUTH newAuth;
|
|
} NV_ChangeAuth_In;
|
|
WOLFTPM_API TPM_RC TPM2_NV_ChangeAuth(NV_ChangeAuth_In* in);
|
|
|
|
typedef struct {
|
|
TPMI_DH_OBJECT signHandle;
|
|
TPMI_RH_NV_AUTH authHandle;
|
|
TPMI_RH_NV_INDEX nvIndex;
|
|
TPM2B_DATA qualifyingData;
|
|
TPMT_SIG_SCHEME inScheme;
|
|
UINT16 size;
|
|
UINT16 offset;
|
|
} NV_Certify_In;
|
|
typedef struct {
|
|
TPM2B_ATTEST certifyInfo;
|
|
TPMT_SIGNATURE signature;
|
|
} NV_Certify_Out;
|
|
WOLFTPM_API TPM_RC TPM2_NV_Certify(NV_Certify_In* in, NV_Certify_Out* out);
|
|
|
|
|
|
/* Vendor Specific API's */
|
|
#if defined(WOLFTPM_ST33) || defined(WOLFTPM_AUTODETECT)
|
|
/* Enable command code vendor API */
|
|
typedef struct {
|
|
TPMI_RH_HIERARCHY authHandle;
|
|
TPM_CC commandCode;
|
|
UINT32 enableFlag;
|
|
UINT32 lockFlag;
|
|
} SetCommandSet_In;
|
|
WOLFTPM_API int TPM2_SetCommandSet(SetCommandSet_In* in);
|
|
|
|
enum {
|
|
TPMLib_2 = 0x01,
|
|
TPMFips = 0x02,
|
|
TPMLowPowerOff = 0x00,
|
|
TPMLowPowerByRegister = 0x04,
|
|
TPMLowPowerByGpio = 0x08,
|
|
TPMLowPowerAuto = 0x0C,
|
|
};
|
|
typedef struct TPM_MODE_SET {
|
|
BYTE CmdToLowPower;
|
|
BYTE BootToLowPower;
|
|
BYTE modeLock;
|
|
BYTE mode;
|
|
} TPM_MODE_SET;
|
|
typedef struct {
|
|
TPMI_RH_HIERARCHY authHandle;
|
|
TPM_MODE_SET modeSet;
|
|
} SetMode_In;
|
|
WOLFTPM_API int TPM2_SetMode(SetMode_In* in);
|
|
|
|
/* The TPM2_GetRandom2 command does not require any authorization */
|
|
typedef GetRandom_In GetRandom2_In; /* same input */
|
|
typedef struct {
|
|
TPM2B_MAX_BUFFER randomBytes;
|
|
} GetRandom2_Out;
|
|
/* If bytesRequested is longer than TPM2B_MAX_BUFFER can accommodate, no
|
|
* error is returned, but the TPM returns as much data as a TPM2B_DATA
|
|
* buffer can contain. */
|
|
WOLFTPM_API TPM_RC TPM2_GetRandom2(GetRandom2_In* in, GetRandom2_Out* out);
|
|
#endif
|
|
|
|
/* Vendor Specific GPIO */
|
|
#ifdef WOLFTPM_ST33
|
|
|
|
#ifdef WOLFTPM_I2C
|
|
#define MAX_GPIO_COUNT 4
|
|
#else /* SPI variant */
|
|
#define MAX_GPIO_COUNT 2
|
|
#endif
|
|
|
|
/* ST33 variants can have different count of GPIO available:
|
|
* - SPI variant - 0, 1 or 2
|
|
* - I2C variant - 0, 1, 2, 3 or 4
|
|
* The user can configure this option at build or use default value. */
|
|
#ifndef TPM_GPIO_COUNT
|
|
#define TPM_GPIO_COUNT MAX_GPIO_COUNT
|
|
#endif
|
|
|
|
#define TPM_GPIO_NUM_MIN (TPM_GPIO_A)
|
|
#define TPM_GPIO_NUM_MAX (TPM_GPIO_A + TPM_GPIO_COUNT - 1)
|
|
|
|
/* GPIO configuration uses specific range of NV space */
|
|
#define TPM_NV_GPIO_SPACE 0x01C40000
|
|
|
|
typedef enum {
|
|
TPM_GPIO_PP = 0x00000000, /* GPIO A by default is a Physical Presence pin */
|
|
TPM_GPIO_LP = 0x00000001, /* GPIO B can only be used as an input */
|
|
#ifdef WOLFTPM_I2C
|
|
/* Only the I2C variant of ST33 has GPIO C and D */
|
|
TPM_GPIO_C = 0x00000002,
|
|
TPM_GPIO_D = 0x00000003,
|
|
#endif
|
|
} TPMI_GPIO_NAME_T;
|
|
typedef UINT32 TPMI_GPIO_NAME;
|
|
|
|
/* For portability and readability in code */
|
|
#define TPM_GPIO_A TPM_GPIO_PP
|
|
#define TPM_GPIO_B TPM_GPIO_LP
|
|
|
|
typedef enum {
|
|
TPM_GPIO_MODE_STANDARD = 0x00000000,
|
|
TPM_GPIO_MODE_FLOATING = 0x00000001,
|
|
TPM_GPIO_MODE_PULLUP = 0x00000002,
|
|
TPM_GPIO_MODE_PULLDOWN = 0x00000003,
|
|
TPM_GPIO_MODE_OPENDRAIN = 0x00000004,
|
|
TPM_GPIO_MODE_PUSHPULL = 0x00000005,
|
|
TPM_GPIO_MODE_UNCONFIG = 0x00000006,
|
|
TPM_GPIO_MODE_DEFAULT = TPM_GPIO_MODE_PULLDOWN,
|
|
TPM_GPIO_MODE_MAX = TPM_GPIO_MODE_UNCONFIG,
|
|
TPM_GPIO_MODE_INPUT_MIN = TPM_GPIO_MODE_FLOATING,
|
|
TPM_GPIO_MODE_INPUT_MAX = TPM_GPIO_MODE_PULLDOWN
|
|
} TPMI_GPIO_MODE_T;
|
|
typedef UINT32 TPMI_GPIO_MODE;
|
|
|
|
typedef struct TPMS_GPIO_CONFIG {
|
|
TPMI_GPIO_NAME name;
|
|
TPMI_RH_NV_INDEX index;
|
|
TPMI_GPIO_MODE mode;
|
|
} TPMS_GPIO_CONFIG;
|
|
|
|
typedef struct TPML_GPIO_CONFIG {
|
|
UINT32 count;
|
|
TPMS_GPIO_CONFIG gpio[MAX_GPIO_COUNT];
|
|
} TPML_GPIO_CONFIG;
|
|
|
|
typedef struct {
|
|
TPMI_RH_PLATFORM authHandle;
|
|
TPML_GPIO_CONFIG config;
|
|
} GpioConfig_In;
|
|
WOLFTPM_API int TPM2_GPIO_Config(GpioConfig_In* in);
|
|
|
|
#elif defined(WOLFTPM_NUVOTON)
|
|
|
|
#define MAX_GPIO_COUNT 2
|
|
|
|
/* NPCT7XX supports a maximum of 2 GPIO for user control */
|
|
/* Added in FW-US version 7.2.3.0 or later */
|
|
#ifndef TPM_GPIO_COUNT
|
|
#define TPM_GPIO_COUNT MAX_GPIO_COUNT
|
|
#endif
|
|
|
|
/* For portability */
|
|
#undef TPM_GPIO_A
|
|
#define TPM_GPIO_A 3 /* NPCT75xx GPIO start at number 3 */
|
|
|
|
#define TPM_GPIO_NUM_MIN (TPM_GPIO_A)
|
|
#define TPM_GPIO_NUM_MAX (TPM_GPIO_A + TPM_GPIO_COUNT - 1)
|
|
|
|
/* GPIO configuration uses specific range of NV space */
|
|
#define TPM_NV_GPIO_SPACE 0x01C40003
|
|
|
|
/* Nuvoton GPIO Modes */
|
|
typedef enum {
|
|
TPM_GPIO_MODE_PUSHPULL = 1,
|
|
TPM_GPIO_MODE_OPENDRAIN = 2,
|
|
TPM_GPIO_MODE_PULLUP = 3,
|
|
TPM_GPIO_MODE_UNCONFIG = 4,
|
|
TPM_GPIO_MODE_DEFAULT = TPM_GPIO_MODE_PUSHPULL,
|
|
TPM_GPIO_MODE_MAX = TPM_GPIO_MODE_UNCONFIG,
|
|
TPM_GPIO_MODE_INPUT_MIN = TPM_GPIO_MODE_PULLUP,
|
|
TPM_GPIO_MODE_INPUT_MAX = TPM_GPIO_MODE_PULLUP
|
|
} TPMI_GPIO_MODE_T;
|
|
typedef UINT32 TPMI_GPIO_MODE;
|
|
|
|
typedef struct {
|
|
BYTE Base0;
|
|
BYTE Base1;
|
|
BYTE GpioAltCfg;
|
|
BYTE GpioInitValue;
|
|
BYTE GpioPullUp;
|
|
BYTE GpioPushPull;
|
|
BYTE Cfg_A;
|
|
BYTE Cfg_B;
|
|
BYTE Cfg_C;
|
|
BYTE Cfg_D;
|
|
BYTE Cfg_E;
|
|
BYTE Cfg_F;
|
|
BYTE Cfg_G;
|
|
BYTE Cfg_H;
|
|
BYTE Cfg_I;
|
|
BYTE Cfg_J;
|
|
BYTE isValid;
|
|
BYTE isLocked;
|
|
} CFG_STRUCT;
|
|
|
|
typedef struct {
|
|
TPMI_RH_PLATFORM authHandle;
|
|
CFG_STRUCT preConfig;
|
|
} NTC2_PreConfig_In;
|
|
WOLFTPM_API int TPM2_NTC2_PreConfig(NTC2_PreConfig_In* in);
|
|
|
|
typedef struct {
|
|
CFG_STRUCT preConfig;
|
|
} NTC2_GetConfig_Out;
|
|
WOLFTPM_API int TPM2_NTC2_GetConfig(NTC2_GetConfig_Out* out);
|
|
|
|
#endif /* WOLFTPM_ST33 || WOLFTPM_AUTODETECT */
|
|
|
|
|
|
/* Non-standard API's */
|
|
|
|
/** @defgroup TPM2_Proprietary TPM2 Proprietary
|
|
*
|
|
* This module describes TPM2 commands specific only to wolfTPM.
|
|
*
|
|
* Typically, these commands include helpers for handling TPM 2.0 data structures.
|
|
*
|
|
* There are also functions to help debugging and testing during development.
|
|
*
|
|
*/
|
|
|
|
#define _TPM_Init TPM2_Init
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Initializes a TPM with HAL IO callback and user supplied context.
|
|
When using wolfTPM with --enable-devtpm or --enable-swtpm configuration, the ioCb and userCtx are not used.
|
|
\note TPM2_Init_minimal() calls TPM2_Init_ex() with both ioCb and userCtx set to NULL.
|
|
In other modes, the ioCb shall be set in order to use TIS.
|
|
Example ioCB for baremetal and RTOS applications are provided in hal/tpm_io.c
|
|
|
|
\return TPM_RC_SUCCESS: successful
|
|
\return TPM_RC_FAILURE: general error (possibly IO)
|
|
\return BAD_FUNC_ARG check arguments provided
|
|
|
|
\param ctx pointer to a TPM2_CTX struct
|
|
\param ioCb pointer to TPM2HalIoCb (HAL IO) callback function
|
|
\param userCtx pointer to the user's context that will be stored as a member of the ctx struct
|
|
|
|
_Example_
|
|
\code
|
|
int rc;
|
|
TPM2_CTX tpm2Ctx;
|
|
|
|
rc = TPM2_Init(&tpm2Ctx, TPM2_IoCb, userCtx);
|
|
if (rc != TPM_RC_SUCCESS) {
|
|
// TPM2_Init failed
|
|
}
|
|
\endcode
|
|
|
|
\sa TPM2_Startup
|
|
\sa TPM2_GetRCString
|
|
\sa TPM2_Init_minimal
|
|
\sa TPM2_Init_ex
|
|
\sa wolfTPM2_Init
|
|
*/
|
|
WOLFTPM_API TPM_RC TPM2_Init(TPM2_CTX* ctx, TPM2HalIoCb ioCb, void* userCtx);
|
|
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Initializes a TPM with timeoutTries, HAL IO callback and user supplied context.
|
|
\note It is recommended to use TPM2_Init instead of using TPM2_Init_ex directly.
|
|
|
|
\return TPM_RC_SUCCESS: successful
|
|
\return TPM_RC_FAILURE: general error (possibly IO)
|
|
\return BAD_FUNC_ARG check arguments provided
|
|
|
|
\param ctx pointer to a TPM2_CTX struct
|
|
\param ioCb pointer to TPM2HalIoCb (HAL IO) callback function
|
|
\param userCtx pointer to the user's context that will be stored as a member of the ctx struct
|
|
\param timeoutTries specifies the number of attempts to confirm that TPM2 startup has completed
|
|
|
|
\sa TPM2_GetRCString
|
|
\sa TPM2_Init_minimal
|
|
\sa TPM2_Init
|
|
\sa wolfTPM2_Init_ex
|
|
*/
|
|
WOLFTPM_API TPM_RC TPM2_Init_ex(TPM2_CTX* ctx, TPM2HalIoCb ioCb, void* userCtx,
|
|
int timeoutTries);
|
|
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Initializes a TPM and sets the wolfTPM2 context that will be used.
|
|
This function is typically used for rich operating systems, like Windows.
|
|
\note It is recommended to use TPM2_Init instead of using TPM2_Init_minimal directly.
|
|
|
|
\return TPM_RC_SUCCESS: successful
|
|
\return TPM_RC_FAILURE: general error (possibly IO)
|
|
\return BAD_FUNC_ARG check arguments provided
|
|
|
|
\param ctx pointer to a TPM2_CTX struct
|
|
|
|
\sa TPM2_GetRCString
|
|
\sa TPM2_Init
|
|
*/
|
|
WOLFTPM_API TPM_RC TPM2_Init_minimal(TPM2_CTX* ctx);
|
|
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Deinitializes a TPM and wolfcrypt (if it was initialized)
|
|
|
|
\return TPM_RC_SUCCESS: successful
|
|
\return TPM_RC_FAILURE: could not acquire the lock on the wolfTPM2 context
|
|
\return BAD_FUNC_ARG: the TPM2 device structure is a NULL pointer
|
|
|
|
\param ctx pointer to a TPM2_CTX struct
|
|
|
|
_Example_
|
|
\code
|
|
int rc;
|
|
TPM2_CTX tpm2Ctx;
|
|
|
|
rc = TPM2_Cleanup(&tpm2Ctx->dev);
|
|
if (rc != TPM_RC_SUCCESS) {
|
|
// TPM2_Cleanup failed
|
|
}
|
|
\endcode
|
|
|
|
\sa TPM2_GetRCString
|
|
\sa TPM2_Init
|
|
\sa wolfTPM2_Cleanup
|
|
*/
|
|
WOLFTPM_API TPM_RC TPM2_Cleanup(TPM2_CTX* ctx);
|
|
|
|
/* Other API's - Not in TPM Specification */
|
|
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Makes sure the TPM2 startup has completed and extracts the TPM device information
|
|
\note This function is used in TPM2_Init_ex
|
|
|
|
\return TPM_RC_SUCCESS: successful
|
|
\return TPM_RC_FAILURE: general error (possibly IO)
|
|
\return BAD_FUNC_ARG: check the provided arguments
|
|
\return TPM_RC_TIMEOUT: timeout occurred
|
|
|
|
\param ctx pointer to a TPM2_CTX struct
|
|
\param timeoutTries specifies the number of attempts to check if TPM2 startup has completed
|
|
|
|
\sa TPM2_GetRCString
|
|
\sa TPM2_TIS_StartupWait
|
|
\sa TPM2_TIS_RequestLocality
|
|
\sa TPM2_TIS_GetInfo
|
|
\sa TPM2_Init_ex
|
|
*/
|
|
WOLFTPM_API TPM_RC TPM2_ChipStartup(TPM2_CTX* ctx, int timeoutTries);
|
|
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Sets the user's context and IO callbacks needed for TPM communication
|
|
\brief Typically, TPM2_Init or wolfTPM2_Init are used to set the HAL IO.
|
|
\note SetHalIoCb will fail if built with devtpm or swtpm as the callback
|
|
is not used for TPM. For other configuration builds, ioCb must be
|
|
set to a non-NULL function pointer and userCtx is optional.
|
|
|
|
\return TPM_RC_SUCCESS: successful
|
|
\return TPM_RC_FAILURE: could not acquire the lock on the wolfTPM2 context
|
|
\return BAD_FUNC_ARG: the TPM2 device structure is a NULL pointer
|
|
|
|
\param ctx pointer to a TPM2_CTX struct
|
|
\param ioCb pointer to TPM2HalIoCb (HAL IO) callback function
|
|
\param userCtx pointer to the user's context that will be stored as a member of the ctx struct
|
|
|
|
\sa TPM2_GetRCString
|
|
\sa TPM2_Init
|
|
\sa wolfTPM2_Init
|
|
*/
|
|
WOLFTPM_API TPM_RC TPM2_SetHalIoCb(TPM2_CTX* ctx, TPM2HalIoCb ioCb, void* userCtx);
|
|
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Sets the structure holding the TPM Authorizations.
|
|
\brief Rarely used, because TPM2_Init functions and wolfTPM2_Init perform this initialization as well
|
|
TPM 2.0 Commands can have up to three authorization slots,
|
|
therefore it is recommended to supply an array of size
|
|
MAX_SESSION_NUM to TPM2_SetSessionAuth(see example below).
|
|
|
|
\return TPM_RC_SUCCESS: successful
|
|
\return TPM_RC_FAILURE: could not acquire the lock on the wolfTPM2 context
|
|
\return BAD_FUNC_ARG: the TPM2 context structure is a NULL pointer
|
|
|
|
\param session pointer to an array of type TPM2_AUTH_SESSION
|
|
|
|
_Example_
|
|
\code
|
|
int rc;
|
|
TPM2_AUTH_SESSION session[MAX_SESSION_NUM];
|
|
|
|
XMEMSET(session, 0, sizeof(session));
|
|
session[0].sessionHandle = TPM_RS_PW;
|
|
|
|
rc = TPM2_SetSessionAuth(session);
|
|
if (rc != TPM_RC_SUCCESS) {
|
|
// TPM2_SetSessionAuth failed
|
|
}
|
|
\endcode
|
|
|
|
\sa TPM2_GetRCString
|
|
\sa TPM2_Init
|
|
\sa wolfTPM2_Init
|
|
*/
|
|
WOLFTPM_API TPM_RC TPM2_SetSessionAuth(TPM2_AUTH_SESSION *session);
|
|
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Determine the number of currently set TPM Authorizations
|
|
|
|
\return the number of active TPM Authorizations (between one and three)
|
|
\return BAD_FUNC_ARG: check the arguments provided for a NULL pointer
|
|
|
|
\param ctx pointer to a TPM2_CTX struct
|
|
|
|
_Example_
|
|
\code
|
|
int authCount;
|
|
TPM2_CTX tpm2Ctx;
|
|
|
|
authCount = TPM2_GetSessionAuthCount(tpm2ctx);
|
|
if (authCount == BAD_FUNC_ARG) {
|
|
// TPM2_GetSessionAuthCount failed
|
|
}
|
|
\endcode
|
|
|
|
\sa TPM2_CTX
|
|
\sa TPM2_AUTH_SESSION
|
|
*/
|
|
WOLFTPM_API int TPM2_GetSessionAuthCount(TPM2_CTX* ctx);
|
|
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Sets a new TPM2 context for use
|
|
|
|
\param ctx pointer to a TPM2_CTX struct
|
|
|
|
_Example_
|
|
\code
|
|
TPM2_CTX tpm2Ctx;
|
|
|
|
TPM2_SetActiveCtx(tpm2ctx);
|
|
\endcode
|
|
|
|
\sa TPM2_CTX
|
|
\sa TPM2_AUTH_SESSION
|
|
*/
|
|
WOLFTPM_API void TPM2_SetActiveCtx(TPM2_CTX* ctx);
|
|
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Provides a pointer to the TPM2 context in use
|
|
|
|
\return ctx pointer to a TPM2_CTX struct
|
|
|
|
_Example_
|
|
\code
|
|
TPM2_CTX *tpm2Ctx;
|
|
|
|
tpm2Ctx = TPM2_GetActiveCtx();
|
|
\endcode
|
|
|
|
\sa TPM2_CTX
|
|
\sa TPM2_AUTH_SESSION
|
|
*/
|
|
WOLFTPM_API TPM2_CTX* TPM2_GetActiveCtx(void);
|
|
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Determine the size in bytes of a TPM 2.0 hash digest
|
|
|
|
\return the size of a TPM 2.0 hash digest as number of bytes
|
|
\return 0 if hash type is invalid
|
|
|
|
\param hashAlg a valid TPM 2.0 hash type
|
|
|
|
_Example_
|
|
\code
|
|
int digestSize = 0;
|
|
TPMI_ALG_HASH hashAlg = TPM_ALG_SHA256;
|
|
|
|
digestSize = TPM2_GetHashDigestSize(hashAlg);
|
|
if (digestSize > 0) {
|
|
//digestSize contains a valid value
|
|
}
|
|
\endcode
|
|
*/
|
|
WOLFTPM_API int TPM2_GetHashDigestSize(TPMI_ALG_HASH hashAlg);
|
|
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Translate a TPM2 hash type to its corresponding wolfcrypt hash type
|
|
|
|
\return a value specifying a hash type to use with wolfcrypt
|
|
\return 0 if hash type is invalid
|
|
|
|
\param hashAlg a valid TPM 2.0 hash type
|
|
|
|
_Example_
|
|
\code
|
|
int wc_hashType;
|
|
TPMI_ALG_HASH hashAlg = TPM_ALG_SHA256;
|
|
|
|
wc_hashType = TPM2_GetHashDigestSize(hashAlg);
|
|
if (wc_hashType > 0) {
|
|
//wc_hashType contains a valid wolfcrypt hash type
|
|
}
|
|
\endcode
|
|
*/
|
|
WOLFTPM_API int TPM2_GetHashType(TPMI_ALG_HASH hashAlg);
|
|
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Generate a fresh nonce of random numbers
|
|
\note Can use the TPM random number generator if WOLFTPM2_USE_HW_RNG is defined
|
|
|
|
\return TPM_RC_SUCCESS: successful
|
|
\return TPM_RC_FAILURE: generic failure (TPM IO issue or wolfcrypt configuration)
|
|
\return BAD_FUNC_ARG: check the provided arguments
|
|
|
|
\param nonceBuf pointer to a BYTE buffer
|
|
\param nonceSz size of the nonce in bytes
|
|
|
|
_Example_
|
|
\code
|
|
int rc, nonceSize = 32;
|
|
BYTE freshNonce[32];
|
|
|
|
rc = TPM2_GetNonce(&freshNonce, nonceSize);
|
|
if (rc != TPM_RC_SUCCESS) {
|
|
//TPM2_GetNonce failed
|
|
}
|
|
\endcode
|
|
*/
|
|
WOLFTPM_API int TPM2_GetNonce(byte* nonceBuf, int nonceSz);
|
|
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Helper function to prepare a correct PCR selection
|
|
For example, when preparing to create a TPM2_Quote
|
|
|
|
\param pcr pointer to a structure of type TPML_PCR_SELECTION
|
|
\param alg value of type TPM_ALG_ID specifying the type of hash algorithm used
|
|
\param pcrIndex value between 0 and 23 specifying the PCR register for use
|
|
|
|
_Example_
|
|
\code
|
|
int pcrIndex = 16; // This is a PCR register for DEBUG & testing purposes
|
|
PCR_Read_In pcrRead;
|
|
|
|
TPM2_SetupPCRSel(&pcrRead.pcrSelectionIn, TPM_ALG_SHA256, pcrIndex);
|
|
\endcode
|
|
|
|
\sa TPM2_PCR_Read
|
|
\sa TPM2_PCR_Extend
|
|
\sa TPM2_PCR_Reset
|
|
\sa TPM2_Quote
|
|
*/
|
|
WOLFTPM_API void TPM2_SetupPCRSel(TPML_PCR_SELECTION* pcr, TPM_ALG_ID alg,
|
|
int pcrIndex);
|
|
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Helper function to prepare a correct PCR selection with multiple indices
|
|
For example, when preparing to create a TPM2_Quote
|
|
|
|
\param pcr pointer to a structure of type TPML_PCR_SELECTION
|
|
\param alg value of type TPM_ALG_ID specifying the type of hash algorithm used
|
|
\param pcrArray array of values between 0 and 23 specifying the PCR register for use
|
|
\param pcrArrayLen length of the pcrArray
|
|
|
|
_Example_
|
|
\code
|
|
int pcrIndex = 16; // This is a PCR register for DEBUG & testing purposes
|
|
PCR_Read_In pcrRead;
|
|
|
|
TPM2_SetupPCRSel(&pcrRead.pcrSelectionIn, TPM_ALG_SHA256, pcrIndex);
|
|
\endcode
|
|
|
|
\sa TPM2_PCR_Read
|
|
\sa TPM2_PCR_Extend
|
|
\sa TPM2_PCR_Reset
|
|
\sa TPM2_Quote
|
|
*/
|
|
WOLFTPM_API void TPM2_SetupPCRSelArray(TPML_PCR_SELECTION* pcr, TPM_ALG_ID alg,
|
|
byte* pcrArray, word32 pcrArrayLen);
|
|
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Get a human readable string for any TPM 2.0 return code
|
|
|
|
\return pointer to a string constant
|
|
|
|
\param rc integer value representing a TPM return code
|
|
|
|
_Example_
|
|
\code
|
|
int rc;
|
|
|
|
rc = wolfTPM2_Init(&dev, TPM2_IoCb, userCtx);
|
|
if (rc != TPM_RC_SUCCESS) {
|
|
printf("wolfTPM2_Init failed 0x%x: %s\n", rc, TPM2_GetRCString(rc));
|
|
return rc;
|
|
}
|
|
\endcode
|
|
*/
|
|
WOLFTPM_API const char* TPM2_GetRCString(int rc);
|
|
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Get a human readable string for any TPM 2.0 algorithm
|
|
|
|
\return pointer to a string constant
|
|
|
|
\param alg value of type TPM_ALG_ID specifying a valid TPM 2.0 algorithm
|
|
|
|
_Example_
|
|
\code
|
|
int paramEncAlg = TPM_ALG_CFB;
|
|
|
|
printf("\tUse Parameter Encryption: %s\n", TPM2_GetAlgName(paramEncAlg));
|
|
\endcode
|
|
*/
|
|
WOLFTPM_API const char* TPM2_GetAlgName(TPM_ALG_ID alg);
|
|
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Determine the size in bytes of any TPM ECC Curve
|
|
|
|
\return 0 in case of invalid curve type
|
|
\return integer value representing the number of bytes
|
|
|
|
\param curveID value of type TPM_ECC_CURVE
|
|
|
|
_Example_
|
|
\code
|
|
int bytes;
|
|
TPM_ECC_CURVE curve = TPM_ECC_NIST_P256;
|
|
|
|
bytes = TPM2_GetCurveSize(curve);
|
|
if (bytes == 0) {
|
|
//TPM2_GetCurveSize failed
|
|
}
|
|
\endcode
|
|
*/
|
|
WOLFTPM_API int TPM2_GetCurveSize(TPM_ECC_CURVE curveID);
|
|
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Translate a wolfcrypt curve type to its corresponding TPM curve type
|
|
|
|
\return integer value representing a wolfcrypt curve type
|
|
\return ECC_CURVE_OID_E in case of invalid curve type
|
|
|
|
\param curveID pointer to a BYTE buffer
|
|
|
|
_Example_
|
|
\code
|
|
int tpmCurve;
|
|
int wc_curve = ECC_SECP256R1;
|
|
|
|
tpmCurve = TPM2_GetTpmCurve(curve);
|
|
\\in this case tpmCurve will be TPM_ECC_NIST_P256
|
|
if (tpmCurve = ECC_CURVE_OID_E) {
|
|
//TPM2_GetTpmCurve failed
|
|
}
|
|
\endcode
|
|
|
|
\sa TPM2_GetWolfCurve
|
|
*/
|
|
WOLFTPM_API int TPM2_GetTpmCurve(int curveID);
|
|
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Translate a TPM curve type to its corresponding wolfcrypt curve type
|
|
|
|
\return integer value representing a TPM curve type
|
|
\return -1 or ECC_CURVE_OID_E in case of invalid curve type
|
|
|
|
\param curve_id pointer to a BYTE buffer
|
|
|
|
_Example_
|
|
\code
|
|
int tpmCurve = TPM_ECC_NIST_P256;
|
|
int wc_curve;
|
|
|
|
wc_curve = TPM2_GetWolfCurve(tpmCurve);
|
|
\\in this case tpmCurve will be ECC_SECP256R1
|
|
if (wc_curve = ECC_CURVE_OID_E || wc_curve == -1) {
|
|
//TPM2_GetWolfCurve failed
|
|
}
|
|
\endcode
|
|
|
|
\sa TPM2_GetTpmCurve
|
|
*/
|
|
WOLFTPM_API int TPM2_GetWolfCurve(int curve_id);
|
|
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Parses TPM2B_ATTEST and populates the data in TPMS_ATTEST structure
|
|
\note This is public API of the helper function TPM2_Packet_ParseAttest
|
|
|
|
\return TPM_RC_SUCCESS: successful
|
|
\return BAD_FUNC_ARG: check the provided arguments
|
|
|
|
\param in pointer to a structure of a TPM2B_ATTEST type
|
|
\param out pointer to a structure of a TPMS_ATTEST type
|
|
|
|
_Example_
|
|
\code
|
|
TPM2B_ATTEST in; //for example, as part of a TPM2_Quote
|
|
TPMS_ATTEST out
|
|
|
|
rc = TPM2_GetNonce(&in, &out);
|
|
if (rc != TPM_RC_SUCCESS) {
|
|
//TPM2_ParseAttest failed
|
|
}
|
|
\endcode
|
|
*/
|
|
WOLFTPM_API int TPM2_ParseAttest(const TPM2B_ATTEST* in, TPMS_ATTEST* out);
|
|
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Computes fresh NV Index name based on a nvPublic structure
|
|
|
|
\return TPM_RC_SUCCESS: successful
|
|
\return negative integer value in case of an error
|
|
\return BAD_FUNC_ARG: check the provided arguments
|
|
\return NOT_COMPILED_IN: check if wolfcrypt is enabled
|
|
|
|
\param nvPublic
|
|
\param buffer pointer to a structure of a TPMS_ATTEST type
|
|
\param size pointer to a variable of UINT16 type to store the size of the nvIndex
|
|
|
|
_Example_
|
|
\code
|
|
TPMS_NV_PUBLIC nvPublic;
|
|
BYTE buffer[TPM_MAX_DIGEST_SIZE];
|
|
UINT16 size;
|
|
|
|
rc = TPM2_HashNvPublic(&nvPublic, &buffer, &size);
|
|
if (rc != TPM_RC_SUCCESS) {
|
|
//TPM2_HashNvPublic failed
|
|
}
|
|
\endcode
|
|
*/
|
|
WOLFTPM_API int TPM2_HashNvPublic(TPMS_NV_PUBLIC* nvPublic, byte* buffer, UINT16* size);
|
|
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Populates TPM2B_PUBLIC structure based on a user provided buffer
|
|
\note Public API of the helper function TPM2_Packet_AppendPublic
|
|
|
|
\return TPM_RC_SUCCESS: successful
|
|
\return TPM_RC_FAILURE: insufficient buffer size
|
|
\return BAD_FUNC_ARG: check the provided arguments
|
|
|
|
\param buf pointer to a user buffer
|
|
\param size integer value of word32 type, specifying the size of the user buffer
|
|
\param sizeUsed pointer to an integer variable, stores the used size of pub->buffer
|
|
\param pub pointer to an empty structure of TPM2B_PUBLIC type
|
|
|
|
_Example_
|
|
\code
|
|
TPM2B_PUBLIC pub; //empty
|
|
int sizeUsed, rc;
|
|
BYTE buffer[sizeof(TPM2B_PUBLIC)];
|
|
word32 size = sizeof(buffer);
|
|
|
|
rc = TPM2_AppendPublic(&buffer, size, &sizeUsed, &pub);
|
|
if (rc != TPM_RC_SUCCESS) {
|
|
//TPM2_AppendPublic failed
|
|
}
|
|
\endcode
|
|
|
|
\sa TPM2_ParsePublic
|
|
*/
|
|
WOLFTPM_API int TPM2_AppendPublic(byte* buf, word32 size, int* sizeUsed, TPM2B_PUBLIC* pub);
|
|
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Parses TPM2B_PUBLIC structure and stores in a user provided buffer
|
|
\note Public API of the helper function TPM2_Packet_ParsePublic
|
|
|
|
\return TPM_RC_SUCCESS: successful
|
|
\return TPM_RC_FAILURE: insufficient buffer size
|
|
\return BAD_FUNC_ARG: check the provided arguments
|
|
|
|
\param pub pointer to a populated structure of TPM2B_PUBLIC type
|
|
\param buf pointer to an empty user buffer
|
|
\param size integer value of word32 type, specifying the available size of the user buffer
|
|
\param sizeUsed pointer to an integer variable, stores the used size of the user buffer
|
|
|
|
_Example_
|
|
\code
|
|
TPM2B_PUBLIC pub; //populated
|
|
int sizeUsed, rc;
|
|
BYTE buffer[sizeof(TPM2B_PUBLIC)];
|
|
word32 size = sizeof(buffer);
|
|
|
|
rc = TPM2_ParsePublic(&pub, buffer, size, &sizeUsed);
|
|
if (rc != TPM_RC_SUCCESS) {
|
|
//TPM2_ParsePublic failed
|
|
}
|
|
\endcode
|
|
|
|
\sa TPM2_AppendPublic
|
|
*/
|
|
WOLFTPM_API int TPM2_ParsePublic(TPM2B_PUBLIC* pub, byte* buf, word32 size, int* sizeUsed);
|
|
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Provides the Name of a TPM object
|
|
\note The object is reference by its TPM handle and session index
|
|
|
|
\return TPM_RC_SUCCESS: successful
|
|
\return BAD_FUNC_ARG: check the provided arguments
|
|
|
|
\param ctx pointer to a TPM2 context
|
|
\param handleValue value of UINT32 type, specifying a valid TPM handle
|
|
\param handleCnt total number of handles used in the current TPM command/session
|
|
\param idx index value, between one and three, specifying a valid TPM Authorization session
|
|
\param name pointer to an empty structure of TPM2B_NAME type
|
|
|
|
_Example_
|
|
\code
|
|
int rc;
|
|
UINT32 handleValue = TRANSIENT_FIRST;
|
|
handleCount = 1;
|
|
sessionIdx = 0;
|
|
TPM2B_NAME name;
|
|
|
|
rc = TPM2_GetName(ctx, handleValue, handleCount, sessionIdx, &name);
|
|
if (rc != TPM_RC_SUCCESS) {
|
|
//TPM2_GetName failed
|
|
}
|
|
\endcode
|
|
*/
|
|
WOLFTPM_LOCAL int TPM2_GetName(TPM2_CTX* ctx, UINT32 handleValue, int handleCnt, int idx, TPM2B_NAME* name);
|
|
|
|
#ifdef WOLFTPM2_USE_WOLF_RNG
|
|
WOLFTPM_API int TPM2_GetWolfRng(WC_RNG** rng);
|
|
#endif
|
|
|
|
typedef enum {
|
|
TPM_VENDOR_UNKNOWN = 0,
|
|
TPM_VENDOR_INFINEON = 0x15d1,
|
|
TPM_VENDOR_STM = 0x104a,
|
|
TPM_VENDOR_MCHP = 0x1114,
|
|
TPM_VENDOR_NUVOTON = 0x1050,
|
|
TPM_VENDOR_NATIONTECH = 0x1B4E,
|
|
} TPM_Vendor_t;
|
|
|
|
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Provides the vendorID of the active TPM2 context
|
|
\note Depends on correctly read TPM device info during TPM Init
|
|
|
|
\return integer value of UINT16 type, specifying the vendor ID
|
|
\return 0 if TPM2 context is invalid or NULL
|
|
|
|
_Example_
|
|
\code
|
|
TPM2_CTX *tpm2Ctx;
|
|
|
|
tpm2Ctx = TPM2_GetActiveCtx();
|
|
\endcode
|
|
|
|
\sa TPM2_GetCapabilities
|
|
\sa TPM2_Init
|
|
*/
|
|
WOLFTPM_API UINT16 TPM2_GetVendorID(void);
|
|
|
|
|
|
/* Internal helper API for ensuring memory is forcefully zero'd */
|
|
WOLFTPM_LOCAL void TPM2_ForceZero(void* mem, word32 len);
|
|
|
|
|
|
#ifdef DEBUG_WOLFTPM
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Helper function to print a binary buffer in a formatted way
|
|
\note Requires DEBUG_WOLFTPM to be defined
|
|
|
|
\param buffer pointer to a buffer of BYTE type
|
|
\param length integer value of word32 type, containing the size of the buffer
|
|
|
|
_Example_
|
|
\code
|
|
BYTE buffer[] = {0x01,0x02,0x03,0x04};
|
|
length = sizeof(buffer);
|
|
|
|
TPM2_PrintBin(&buffer, length);
|
|
\endcode
|
|
|
|
\sa TPM2_PrintAuth
|
|
\sa TPM2_PrintPublicArea
|
|
*/
|
|
WOLFTPM_API void TPM2_PrintBin(const byte* buffer, word32 length);
|
|
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Helper function to print a structure of TPMS_AUTH_COMMAND type in a human readable way
|
|
\note Requires DEBUG_WOLFTPM to be defined
|
|
|
|
\param authCmd pointer to a populated structure of TPMS_AUTH_COMMAND type
|
|
|
|
_Example_
|
|
\code
|
|
TPMS_AUTH_COMMAND authCmd; //for example, part of a TPM Authorization session
|
|
|
|
TPM2_PrintAuthCmd(&authCmd);
|
|
\endcode
|
|
|
|
\sa TPM2_PrintBin
|
|
\sa TPM2_PrintPublicArea
|
|
*/
|
|
WOLFTPM_API void TPM2_PrintAuth(const TPMS_AUTH_COMMAND* authCmd);
|
|
|
|
/*!
|
|
\ingroup TPM2_Proprietary
|
|
\brief Helper function to print a structure of TPM2B_PUBLIC type in a human readable way
|
|
\note Requires DEBUG_WOLFTPM to be defined
|
|
|
|
\param pub pointer to a populated structure of TPM2B_PUBLIC type
|
|
|
|
_Example_
|
|
\code
|
|
TPM2B_PUBLIC pub; //for example, part of the output of a successful TPM2_Create
|
|
|
|
TPM2_PrintPublicArea(&pub);
|
|
\endcode
|
|
|
|
\sa TPM2_PrintBin
|
|
\sa TPM2_PrintAuth
|
|
\sa TPM2_Create
|
|
\sa TPM2_ReadPublic
|
|
*/
|
|
WOLFTPM_API void TPM2_PrintPublicArea(const TPM2B_PUBLIC* pub);
|
|
#else
|
|
#define TPM2_PrintBin(b, l)
|
|
#define TPM2_PrintAuth(b)
|
|
#define TPM2_PrintPublicArea(b)
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
} /* extern "C" */
|
|
#endif
|
|
|
|
#endif /* __TPM2_H__ */
|