// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

#ifndef _IMPLEMENTATION_H_
#define _IMPLEMENTATION_H_

#include    "TpmBuildSwitches.h"
#include    "BaseTypes.h"
#include    "TPMB.h"

#if defined (_MSC_VER)
#pragma warning(disable: 4710)
#endif

#include <stdio.h>
#ifdef DRBG_DEBUG_PRINT
static void
dbgDumpMemBlock(const char* label, BYTE* buf, int size)
{
    const int Cols = 32;
    int i, j, n = Cols;
    printf("%s ", label);
    for (i = 0; i < size; i += Cols) {
        if (i + Cols > size)
            n = size - i;
        for (j = 0; j < n; ++j)
            printf("%02x", buf[i + j]);
        printf("\n");
    }
}
#endif //DRBG_DEBUG_PRINT

#undef TRUE
#undef FALSE


// This table is built in to TpmStructures
// Change these definitions to turn all algorithms or commands on or off
#define      ALG_YES      YES
#define      ALG_NO       NO
#define      CC_YES       YES
#define      CC_NO        NO

// Table 2:3 - Definition of Base Types (BaseTypes)
// Base Types are in BaseTypes.h

// Table 2:4 - Defines for Logic Values (DefinesTable)
#define  TRUE     1
#define  FALSE    0
#define  YES      1
#define  NO       0
#define  SET      1
#define  CLEAR    0


// Table 0:1 - Defines for Processor Values (DefinesTable)
#define  BIG_ENDIAN_TPM       NO
#define  LITTLE_ENDIAN_TPM    YES
#define  AUTO_ALIGN           NO


// Table 0:2 - Defines for Implemented Algorithms (ImplementedDefines)
#define  ALG_RSA               ALG_YES
#define  ALG_SHA1              ALG_YES
#define  ALG_HMAC              ALG_YES
#define  ALG_TDES              ALG_YES
#define  ALG_AES               ALG_YES
#define  ALG_MGF1              ALG_YES
#define  ALG_XOR               ALG_YES
#define  ALG_KEYEDHASH         ALG_YES
#define  ALG_SHA256            ALG_YES
#define  ALG_SHA384            ALG_YES
#define  ALG_SHA512            ALG_YES
#define  ALG_SM3_256           ALG_NO
#define  ALG_SM4               ALG_NO
#define  ALG_RSASSA            (ALG_YES*ALG_RSA)
#define  ALG_RSAES             (ALG_YES*ALG_RSA)
#define  ALG_RSAPSS            (ALG_YES*ALG_RSA)
#define  ALG_OAEP              (ALG_YES*ALG_RSA)
#define  ALG_ECC               ALG_YES
#define  ALG_ECDH              (ALG_YES*ALG_ECC)
#define  ALG_ECDSA             (ALG_YES*ALG_ECC)
#define  ALG_ECDAA             (ALG_YES*ALG_ECC)
#define  ALG_SM2               (ALG_NO*ALG_ECC)
#define  ALG_ECSCHNORR         (ALG_YES*ALG_ECC)
#define  ALG_ECMQV             (ALG_NO*ALG_ECC)
#define  ALG_SYMCIPHER         ALG_YES
#define  ALG_KDF1_SP800_56A    (ALG_YES*ALG_ECC)
#define  ALG_KDF2              ALG_NO
#define  ALG_KDF1_SP800_108    ALG_YES
#define  ALG_CTR               ALG_YES
#define  ALG_OFB               ALG_YES
#define  ALG_CBC               ALG_YES
#define  ALG_CFB               ALG_YES
#define  ALG_ECB               ALG_YES


// Table 0:3 - Defines for Key Size Constants (KeySizesTable)
#define  RSA_KEY_SIZES_BITS         {1024,2048}
#define  RSA_KEY_SIZE_BITS_1024     RSA_ALLOWED_KEY_SIZE_1024
#define  RSA_KEY_SIZE_BITS_2048     RSA_ALLOWED_KEY_SIZE_2048
#define  MAX_RSA_KEY_BITS           2048
#define  MAX_RSA_KEY_BYTES          256


#define  TDES_KEY_SIZES_BITS        {128,192}
#define  TDES_KEY_SIZE_BITS_128     TDES_ALLOWED_KEY_SIZE_128
#define  TDES_KEY_SIZE_BITS_192     TDES_ALLOWED_KEY_SIZE_192
#define  MAX_TDES_KEY_BITS          192
#define  MAX_TDES_KEY_BYTES         24
#define MAX_TDES_BLOCK_SIZE_BYTES                             \
            MAX(TDES_128_BLOCK_SIZE_BYTES,                    \
            MAX(TDES_192_BLOCK_SIZE_BYTES, 0))

#define  AES_KEY_SIZES_BITS         {128,256}
#define  AES_KEY_SIZE_BITS_128      AES_ALLOWED_KEY_SIZE_128
#define  AES_KEY_SIZE_BITS_256      AES_ALLOWED_KEY_SIZE_256
#define  MAX_AES_KEY_BITS           256
#define  MAX_AES_KEY_BYTES          32
#define MAX_AES_BLOCK_SIZE_BYTES                              \
            MAX(AES_128_BLOCK_SIZE_BYTES,                     \
            MAX(AES_256_BLOCK_SIZE_BYTES, 0))

#define  SM4_KEY_SIZES_BITS         {128}
#define  SM4_KEY_SIZE_BITS_128      SM4_ALLOWED_KEY_SIZE_128
#define  MAX_SM4_KEY_BITS           128
#define  MAX_SM4_KEY_BYTES          16
#define MAX_SM4_BLOCK_SIZE_BYTES                              \
            MAX(SM4_128_BLOCK_SIZE_BYTES, 0)

#define  CAMELLIA_KEY_SIZES_BITS    {128}
#define  CAMELLIA_KEY_SIZE_BITS_128    CAMELLIA_ALLOWED_KEY_SIZE_128
#define  MAX_CAMELLIA_KEY_BITS      128
#define  MAX_CAMELLIA_KEY_BYTES     16
#define MAX_CAMELLIA_BLOCK_SIZE_BYTES                         \
            MAX(CAMELLIA_128_BLOCK_SIZE_BYTES, 0)


// Table 0:4 - Defines for Implemented Curves (CurveTableProcessing)
#define  ECC_NIST_P192         NO
#define  ECC_NIST_P224         YES
#define  ECC_NIST_P256         YES
#define  ECC_NIST_P384         NO
#define  ECC_NIST_P521         NO
#define  ECC_BN_P256           YES
#define  ECC_BN_P638           NO
#define  ECC_SM2_P256          NO
#define  ECC_CURVES            \
    {TPM_ECC_BN_P256, TPM_ECC_BN_P638, TPM_ECC_NIST_P192, TPM_ECC_NIST_P224, \
    TPM_ECC_NIST_P256, TPM_ECC_NIST_P384, TPM_ECC_NIST_P521, TPM_ECC_SM2_P256}
#define  ECC_CURVE_COUNT       \
    (ECC_BN_P256 + ECC_BN_P638 + ECC_NIST_P192 + ECC_NIST_P224 + \
    ECC_NIST_P256 + ECC_NIST_P384 + ECC_NIST_P521 + ECC_SM2_P256)
#define  MAX_ECC_KEY_BITS      \
    MAX(ECC_BN_P256*256, MAX(ECC_BN_P638*638, \
    MAX(ECC_NIST_P192*192, MAX(ECC_NIST_P224*224, \
    MAX(ECC_NIST_P256*256, MAX(ECC_NIST_P384*384, \
    MAX(ECC_NIST_P521*521, MAX(ECC_SM2_P256*256, \
    0))))))))
#define  MAX_ECC_KEY_BYTES     BITS_TO_BYTES(MAX_ECC_KEY_BITS)

// Table 0:5 - Defines for Implemented Commands (ImplementedDefines)
#define  CC_ActivateCredential            CC_YES
#define  CC_Certify                       CC_YES
#define  CC_CertifyCreation               CC_YES
#define  CC_ChangeEPS                     CC_YES
#define  CC_ChangePPS                     CC_YES
#define  CC_Clear                         CC_YES
#define  CC_ClearControl                  CC_YES
#define  CC_ClockRateAdjust               CC_YES
#define  CC_ClockSet                      CC_YES
#define  CC_Commit                        (CC_YES*ALG_ECC)
#define  CC_ContextLoad                   CC_YES
#define  CC_ContextSave                   CC_YES
#define  CC_Create                        CC_YES
#define  CC_CreatePrimary                 CC_YES
#define  CC_DictionaryAttackLockReset     CC_YES
#define  CC_DictionaryAttackParameters    CC_YES
#define  CC_Duplicate                     CC_YES
#define  CC_ECC_Parameters                (CC_YES*ALG_ECC)
#define  CC_ECDH_KeyGen                   (CC_YES*ALG_ECC)
#define  CC_ECDH_ZGen                     (CC_YES*ALG_ECC)
#define  CC_EncryptDecrypt                CC_YES
#define  CC_EventSequenceComplete         CC_YES
#define  CC_EvictControl                  CC_YES
#define  CC_FieldUpgradeData              CC_NO
#define  CC_FieldUpgradeStart             CC_NO
#define  CC_FirmwareRead                  CC_NO
#define  CC_FlushContext                  CC_YES
#define  CC_GetCapability                 CC_YES
#define  CC_GetCommandAuditDigest         CC_YES
#define  CC_GetRandom                     CC_YES
#define  CC_GetSessionAuditDigest         CC_YES
#define  CC_GetTestResult                 CC_YES
#define  CC_GetTime                       CC_YES
#define  CC_Hash                          CC_YES
#define  CC_HashSequenceStart             CC_YES
#define  CC_HierarchyChangeAuth           CC_YES
#define  CC_HierarchyControl              CC_YES
#define  CC_HMAC                          CC_YES
#define  CC_HMAC_Start                    CC_YES
#define  CC_Import                        CC_YES
#define  CC_IncrementalSelfTest           CC_YES
#define  CC_Load                          CC_YES
#define  CC_LoadExternal                  CC_YES
#define  CC_MakeCredential                CC_YES
#define  CC_NV_Certify                    CC_YES
#define  CC_NV_ChangeAuth                 CC_YES
#define  CC_NV_DefineSpace                CC_YES
#define  CC_NV_Extend                     CC_YES
#define  CC_NV_GlobalWriteLock            CC_YES
#define  CC_NV_Increment                  CC_YES
#define  CC_NV_Read                       CC_YES
#define  CC_NV_ReadLock                   CC_YES
#define  CC_NV_ReadPublic                 CC_YES
#define  CC_NV_SetBits                    CC_YES
#define  CC_NV_UndefineSpace              CC_YES
#define  CC_NV_UndefineSpaceSpecial       CC_YES
#define  CC_NV_Write                      CC_YES
#define  CC_NV_WriteLock                  CC_YES
#define  CC_ObjectChangeAuth              CC_YES
#define  CC_PCR_Allocate                  CC_YES
#define  CC_PCR_Event                     CC_YES
#define  CC_PCR_Extend                    CC_YES
#define  CC_PCR_Read                      CC_YES
#define  CC_PCR_Reset                     CC_YES
#define  CC_PCR_SetAuthPolicy             CC_YES
#define  CC_PCR_SetAuthValue              CC_YES
#define  CC_PolicyAuthorize               CC_YES
#define  CC_PolicyAuthValue               CC_YES
#define  CC_PolicyCommandCode             CC_YES
#define  CC_PolicyCounterTimer            CC_YES
#define  CC_PolicyCpHash                  CC_YES
#define  CC_PolicyDuplicationSelect       CC_YES
#define  CC_PolicyGetDigest               CC_YES
#define  CC_PolicyLocality                CC_YES
#define  CC_PolicyNameHash                CC_YES
#define  CC_PolicyNV                      CC_YES
#define  CC_PolicyOR                      CC_YES
#define  CC_PolicyPassword                CC_YES
#define  CC_PolicyPCR                     CC_YES
#define  CC_PolicyPhysicalPresence        CC_YES
#define  CC_PolicyRestart                 CC_YES
#define  CC_PolicySecret                  CC_YES
#define  CC_PolicySigned                  CC_YES
#define  CC_PolicyTicket                  CC_YES
#define  CC_PP_Commands                   CC_YES
#define  CC_Quote                         CC_YES
#define  CC_ReadClock                     CC_YES
#define  CC_ReadPublic                    CC_YES
#define  CC_Rewrap                        CC_YES
#define  CC_RSA_Decrypt                   (CC_YES*ALG_RSA)
#define  CC_RSA_Encrypt                   (CC_YES*ALG_RSA)
#define  CC_SelfTest                      CC_YES
#define  CC_SequenceComplete              CC_YES
#define  CC_SequenceUpdate                CC_YES
#define  CC_SetAlgorithmSet               CC_YES
#define  CC_SetCommandCodeAuditStatus     CC_YES
#define  CC_SetPrimaryPolicy              CC_YES
#define  CC_Shutdown                      CC_YES
#define  CC_Sign                          CC_YES
#define  CC_StartAuthSession              CC_YES
#define  CC_Startup                       CC_YES
#define  CC_StirRandom                    CC_YES
#define  CC_TestParms                     CC_YES
#define  CC_Unseal                        CC_YES
#define  CC_VerifySignature               CC_YES
#define  CC_ZGen_2Phase                   (CC_YES*ALG_ECC)
#define  CC_EC_Ephemeral                  (CC_YES*ALG_ECC)
#define  CC_PolicyNvWritten               CC_YES
#define  CC_PolicyTemplate                CC_YES
#define  CC_CreateLoaded                  CC_YES
#define  CC_PolicyAuthorizeNV             CC_YES
#define  CC_EncryptDecrypt2               CC_YES
#define  CC_Vendor_TCG_Test               CC_YES


// Table 0:6 - Defines for PLATFORM Values (DefinesTable)
#define  PLATFORM_FAMILY         TPM_SPEC_FAMILY
#define  PLATFORM_LEVEL          TPM_SPEC_LEVEL
#define  PLATFORM_VERSION        TPM_SPEC_VERSION
#define  PLATFORM_YEAR           TPM_SPEC_YEAR
#define  PLATFORM_DAY_OF_YEAR    TPM_SPEC_DAY_OF_YEAR


// Table 0:7 - Defines for Implementation Values (DefinesTable)
#define  FIELD_UPGRADE_IMPLEMENTED      NO
#define  RADIX_BITS                     32
#define  HASH_ALIGNMENT                 4
#define  SYMMETRIC_ALIGNMENT            4
#define  HASH_LIB                       OSSL
#define  SYM_LIB                        OSSL
#define  MATH_LIB                       OSSL
#define  BSIZE                          UINT16
#define  IMPLEMENTATION_PCR             24
#define  PLATFORM_PCR                   24
#define  DRTM_PCR                       17
#define  HCRTM_PCR                      0
#define  NUM_LOCALITIES                 5
#define  MAX_HANDLE_NUM                 3
#define  MAX_ACTIVE_SESSIONS            64
#define  CONTEXT_SLOT                   UINT16
#define  CONTEXT_COUNTER                UINT64
#define  MAX_LOADED_SESSIONS            3
#define  MAX_SESSION_NUM                3
#define  MAX_LOADED_OBJECTS             3
#define  MIN_EVICT_OBJECTS              2
#define  NUM_POLICY_PCR_GROUP           1
#define  NUM_AUTHVALUE_PCR_GROUP        1
#define  MAX_CONTEXT_SIZE               2474
#define  MAX_DIGEST_BUFFER              1024
#define  MAX_NV_INDEX_SIZE              2048
#define  MAX_NV_BUFFER_SIZE             1024
#define  MAX_CAP_BUFFER                 1024
#define  NV_MEMORY_SIZE                 16384
#define  MIN_COUNTER_INDICES            8
#define  NUM_STATIC_PCR                 16
#define  MAX_ALG_LIST_SIZE              64
#define  PRIMARY_SEED_SIZE              32
#define  CONTEXT_ENCRYPT_ALGORITHM      AES
#define  NV_CLOCK_UPDATE_INTERVAL       12
#define  NUM_POLICY_PCR                 1
#define  MAX_COMMAND_SIZE               4096
#define  MAX_RESPONSE_SIZE              4096
#define  ORDERLY_BITS                   8
#define  MAX_SYM_DATA                   128
#define  MAX_RNG_ENTROPY_SIZE           64
#define  RAM_INDEX_SPACE                512
#define  RSA_DEFAULT_PUBLIC_EXPONENT    0x00010001
#define  ENABLE_PCR_NO_INCREMENT        YES
#define  CRT_FORMAT_RSA                 YES
#define  VENDOR_COMMAND_COUNT           0
#define  MAX_VENDOR_BUFFER_SIZE         1024


// Table 1:2 - Definition of TPM_ALG_ID Constants  (TPM_ALG_ID_Processing)
typedef  UINT16             TPM_ALG_ID;
#define  ALG_ERROR_VALUE             0x0000
#define  TPM_ALG_ERROR               (TPM_ALG_ID)(ALG_ERROR_VALUE)
#define  ALG_RSA_VALUE               0x0001
#if defined ALG_RSA && ALG_RSA == YES
#define  TPM_ALG_RSA                 (TPM_ALG_ID)(ALG_RSA_VALUE)
#endif
#define  ALG_TDES_VALUE              0x0003
#if defined ALG_TDES && ALG_TDES == YES
#define  TPM_ALG_TDES                (TPM_ALG_ID)(ALG_TDES_VALUE)
#endif
#define  ALG_SHA_VALUE               0x0004
#if defined ALG_SHA && ALG_SHA == YES
#define  TPM_ALG_SHA                 (TPM_ALG_ID)(ALG_SHA_VALUE)
#endif
#define  ALG_SHA1_VALUE              0x0004
#if defined ALG_SHA1 && ALG_SHA1 == YES
#define  TPM_ALG_SHA1                (TPM_ALG_ID)(ALG_SHA1_VALUE)
#endif
#define  ALG_HMAC_VALUE              0x0005
#if defined ALG_HMAC && ALG_HMAC == YES
#define  TPM_ALG_HMAC                (TPM_ALG_ID)(ALG_HMAC_VALUE)
#endif
#define  ALG_AES_VALUE               0x0006
#if defined ALG_AES && ALG_AES == YES
#define  TPM_ALG_AES                 (TPM_ALG_ID)(ALG_AES_VALUE)
#endif
#define  ALG_MGF1_VALUE              0x0007
#if defined ALG_MGF1 && ALG_MGF1 == YES
#define  TPM_ALG_MGF1                (TPM_ALG_ID)(ALG_MGF1_VALUE)
#endif
#define  ALG_KEYEDHASH_VALUE         0x0008
#if defined ALG_KEYEDHASH && ALG_KEYEDHASH == YES
#define  TPM_ALG_KEYEDHASH           (TPM_ALG_ID)(ALG_KEYEDHASH_VALUE)
#endif
#define  ALG_XOR_VALUE               0x000A
#if defined ALG_XOR && ALG_XOR == YES
#define  TPM_ALG_XOR                 (TPM_ALG_ID)(ALG_XOR_VALUE)
#endif
#define  ALG_SHA256_VALUE            0x000B
#if defined ALG_SHA256 && ALG_SHA256 == YES
#define  TPM_ALG_SHA256              (TPM_ALG_ID)(ALG_SHA256_VALUE)
#endif
#define  ALG_SHA384_VALUE            0x000C
#if defined ALG_SHA384 && ALG_SHA384 == YES
#define  TPM_ALG_SHA384              (TPM_ALG_ID)(ALG_SHA384_VALUE)
#endif
#define  ALG_SHA512_VALUE            0x000D
#if defined ALG_SHA512 && ALG_SHA512 == YES
#define  TPM_ALG_SHA512              (TPM_ALG_ID)(ALG_SHA512_VALUE)
#endif
#define  ALG_NULL_VALUE              0x0010
#define  TPM_ALG_NULL                (TPM_ALG_ID)(ALG_NULL_VALUE)
#define  ALG_SM3_256_VALUE           0x0012
#if defined ALG_SM3_256 && ALG_SM3_256 == YES
#define  TPM_ALG_SM3_256             (TPM_ALG_ID)(ALG_SM3_256_VALUE)
#endif
#define  ALG_SM4_VALUE               0x0013
#if defined ALG_SM4 && ALG_SM4 == YES
#define  TPM_ALG_SM4                 (TPM_ALG_ID)(ALG_SM4_VALUE)
#endif
#define  ALG_RSASSA_VALUE            0x0014
#if defined ALG_RSASSA && ALG_RSASSA == YES
#define  TPM_ALG_RSASSA              (TPM_ALG_ID)(ALG_RSASSA_VALUE)
#endif
#define  ALG_RSAES_VALUE             0x0015
#if defined ALG_RSAES && ALG_RSAES == YES
#define  TPM_ALG_RSAES               (TPM_ALG_ID)(ALG_RSAES_VALUE)
#endif
#define  ALG_RSAPSS_VALUE            0x0016
#if defined ALG_RSAPSS && ALG_RSAPSS == YES
#define  TPM_ALG_RSAPSS              (TPM_ALG_ID)(ALG_RSAPSS_VALUE)
#endif
#define  ALG_OAEP_VALUE              0x0017
#if defined ALG_OAEP && ALG_OAEP == YES
#define  TPM_ALG_OAEP                (TPM_ALG_ID)(ALG_OAEP_VALUE)
#endif
#define  ALG_ECDSA_VALUE             0x0018
#if defined ALG_ECDSA && ALG_ECDSA == YES
#define  TPM_ALG_ECDSA               (TPM_ALG_ID)(ALG_ECDSA_VALUE)
#endif
#define  ALG_ECDH_VALUE              0x0019
#if defined ALG_ECDH && ALG_ECDH == YES
#define  TPM_ALG_ECDH                (TPM_ALG_ID)(ALG_ECDH_VALUE)
#endif
#define  ALG_ECDAA_VALUE             0x001A
#if defined ALG_ECDAA && ALG_ECDAA == YES
#define  TPM_ALG_ECDAA               (TPM_ALG_ID)(ALG_ECDAA_VALUE)
#endif
#define  ALG_SM2_VALUE               0x001B
#if defined ALG_SM2 && ALG_SM2 == YES
#define  TPM_ALG_SM2                 (TPM_ALG_ID)(ALG_SM2_VALUE)
#endif
#define  ALG_ECSCHNORR_VALUE         0x001C
#if defined ALG_ECSCHNORR && ALG_ECSCHNORR == YES
#define  TPM_ALG_ECSCHNORR           (TPM_ALG_ID)(ALG_ECSCHNORR_VALUE)
#endif
#define  ALG_ECMQV_VALUE             0x001D
#if defined ALG_ECMQV && ALG_ECMQV == YES
#define  TPM_ALG_ECMQV               (TPM_ALG_ID)(ALG_ECMQV_VALUE)
#endif
#define  ALG_KDF1_SP800_56A_VALUE    0x0020
#if defined ALG_KDF1_SP800_56A && ALG_KDF1_SP800_56A == YES
#define  TPM_ALG_KDF1_SP800_56A      (TPM_ALG_ID)(ALG_KDF1_SP800_56A_VALUE)
#endif
#define  ALG_KDF2_VALUE              0x0021
#if defined ALG_KDF2 && ALG_KDF2 == YES
#define  TPM_ALG_KDF2                (TPM_ALG_ID)(ALG_KDF2_VALUE)
#endif
#define  ALG_KDF1_SP800_108_VALUE    0x0022
#if defined ALG_KDF1_SP800_108 && ALG_KDF1_SP800_108 == YES
#define  TPM_ALG_KDF1_SP800_108      (TPM_ALG_ID)(ALG_KDF1_SP800_108_VALUE)
#endif
#define  ALG_ECC_VALUE               0x0023
#if defined ALG_ECC && ALG_ECC == YES
#define  TPM_ALG_ECC                 (TPM_ALG_ID)(ALG_ECC_VALUE)
#endif
#define  ALG_SYMCIPHER_VALUE         0x0025
#if defined ALG_SYMCIPHER && ALG_SYMCIPHER == YES
#define  TPM_ALG_SYMCIPHER           (TPM_ALG_ID)(ALG_SYMCIPHER_VALUE)
#endif
#define  ALG_CAMELLIA_VALUE          0x0026
#if defined ALG_CAMELLIA && ALG_CAMELLIA == YES
#define  TPM_ALG_CAMELLIA            (TPM_ALG_ID)(ALG_CAMELLIA_VALUE)
#endif
#define  ALG_CTR_VALUE               0x0040
#if defined ALG_CTR && ALG_CTR == YES
#define  TPM_ALG_CTR                 (TPM_ALG_ID)(ALG_CTR_VALUE)
#endif
#define  ALG_OFB_VALUE               0x0041
#if defined ALG_OFB && ALG_OFB == YES
#define  TPM_ALG_OFB                 (TPM_ALG_ID)(ALG_OFB_VALUE)
#endif
#define  ALG_CBC_VALUE               0x0042
#if defined ALG_CBC && ALG_CBC == YES
#define  TPM_ALG_CBC                 (TPM_ALG_ID)(ALG_CBC_VALUE)
#endif
#define  ALG_CFB_VALUE               0x0043
#if defined ALG_CFB && ALG_CFB == YES
#define  TPM_ALG_CFB                 (TPM_ALG_ID)(ALG_CFB_VALUE)
#endif
#define  ALG_ECB_VALUE               0x0044
#if defined ALG_ECB && ALG_ECB == YES
#define  TPM_ALG_ECB                 (TPM_ALG_ID)(ALG_ECB_VALUE)
#endif
#define  TPM_ALG_FIRST               (TPM_ALG_ID)(0x0001)
#define  ALG_FIRST_VALUE             0x0001
#define  TPM_ALG_LAST                (TPM_ALG_ID)(0x0044)
#define  ALG_LAST_VALUE              0x0044

// Table 1:3 - Definition of TPM_ECC_CURVE Constants  (EnumTable)
typedef  UINT16             TPM_ECC_CURVE;
#define  TPM_ECC_NONE         (TPM_ECC_CURVE)(0x0000)
#define  TPM_ECC_NIST_P192    (TPM_ECC_CURVE)(0x0001)
#define  TPM_ECC_NIST_P224    (TPM_ECC_CURVE)(0x0002)
#define  TPM_ECC_NIST_P256    (TPM_ECC_CURVE)(0x0003)
#define  TPM_ECC_NIST_P384    (TPM_ECC_CURVE)(0x0004)
#define  TPM_ECC_NIST_P521    (TPM_ECC_CURVE)(0x0005)
#define  TPM_ECC_BN_P256      (TPM_ECC_CURVE)(0x0010)
#define  TPM_ECC_BN_P638      (TPM_ECC_CURVE)(0x0011)
#define  TPM_ECC_SM2_P256     (TPM_ECC_CURVE)(0x0020)

// Table 1:4 - Defines for NIST_P192 ECC Values (EccTable)
// Data is in CryptEccData.c

// Table 1:5 - Defines for NIST_P224 ECC Values (EccTable)
// Data is in CryptEccData.c

// Table 1:6 - Defines for NIST_P256 ECC Values (EccTable)
// Data is in CryptEccData.c

// Table 1:7 - Defines for NIST_P384 ECC Values (EccTable)
// Data is in CryptEccData.c

// Table 1:8 - Defines for NIST_P521 ECC Values (EccTable)
// Data is in CryptEccData.c

// Table 1:9 - Defines for BN_P256 ECC Values (EccTable)
// Data is in CryptEccData.c

// Table 1:10 - Defines for BN_P638 ECC Values (EccTable)
// Data is in CryptEccData.c

// Table 1:11 - Defines for SM2_P256 ECC Values (EccTable)
// Data is in CryptEccData.c

// Table 1:12 - Defines for SHA1 Hash Values (DefinesTable)
#define  SHA1_DIGEST_SIZE    20
#define  SHA1_BLOCK_SIZE     64
#define  SHA1_DER_SIZE       15
#define  SHA1_DER            \
    0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x0E, \
    0x03, 0x02, 0x1A, 0x05, 0x00, 0x04, 0x14


// Table 1:13 - Defines for SHA256 Hash Values (DefinesTable)
#define  SHA256_DIGEST_SIZE    32
#define  SHA256_BLOCK_SIZE     64
#define  SHA256_DER_SIZE       19
#define  SHA256_DER            \
    0x30, 0x31, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, \
    0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, \
    0x00, 0x04, 0x20


// Table 1:14 - Defines for SHA384 Hash Values (DefinesTable)
#define  SHA384_DIGEST_SIZE    48
#define  SHA384_BLOCK_SIZE     128
#define  SHA384_DER_SIZE       19
#define  SHA384_DER            \
    0x30, 0x41, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, \
    0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0x05, \
    0x00, 0x04, 0x30


// Table 1:15 - Defines for SHA512 Hash Values (DefinesTable)
#define  SHA512_DIGEST_SIZE    64
#define  SHA512_BLOCK_SIZE     128
#define  SHA512_DER_SIZE       19
#define  SHA512_DER            \
    0x30, 0x51, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, \
    0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05, \
    0x00, 0x04, 0x40


// Table 1:16 - Defines for SM3_256 Hash Values (DefinesTable)
#define  SM3_256_DIGEST_SIZE    32
#define  SM3_256_BLOCK_SIZE     64
#define  SM3_256_DER_SIZE       18
#define  SM3_256_DER            \
    0x30, 0x30, 0x30, 0x0C, 0x06, 0x08, 0x2A, 0x81, \
    0x1C, 0x81, 0x45, 0x01, 0x83, 0x11, 0x05, 0x00, \
    0x04, 0x20


// Table 1:17 - Defines for AES Symmetric Cipher Algorithm Constants (SymmetricTable)
#define  AES_ALLOWED_KEY_SIZE_128    YES
#define  AES_ALLOWED_KEY_SIZE_192    YES
#define  AES_ALLOWED_KEY_SIZE_256    YES
#define  AES_128_BLOCK_SIZE_BYTES    16
#define  AES_192_BLOCK_SIZE_BYTES    16
#define  AES_256_BLOCK_SIZE_BYTES    16

// Table 1:18 - Defines for SM4 Symmetric Cipher Algorithm Constants (SymmetricTable)
#define  SM4_ALLOWED_KEY_SIZE_128    YES
#define  SM4_128_BLOCK_SIZE_BYTES    16

// Table 1:19 - Defines for CAMELLIA Symmetric Cipher Algorithm Constants (SymmetricTable)
#define  CAMELLIA_ALLOWED_KEY_SIZE_128    YES
#define  CAMELLIA_ALLOWED_KEY_SIZE_192    YES
#define  CAMELLIA_ALLOWED_KEY_SIZE_256    YES
#define  CAMELLIA_128_BLOCK_SIZE_BYTES    16
#define  CAMELLIA_192_BLOCK_SIZE_BYTES    16
#define  CAMELLIA_256_BLOCK_SIZE_BYTES    16

// Table 1:17 - Defines for TDES Symmetric Cipher Algorithm Constants (SymmetricTable)
#define  TDES_ALLOWED_KEY_SIZE_128    YES
#define  TDES_ALLOWED_KEY_SIZE_192    YES
#define  TDES_128_BLOCK_SIZE_BYTES    8
#define  TDES_192_BLOCK_SIZE_BYTES    8

// Table 2:12 - Definition of TPM_CC Constants  (TPM_CC_Processing)
typedef  UINT32             TPM_CC;
#ifndef CC_NV_UndefineSpaceSpecial
#   define CC_NV_UndefineSpaceSpecial NO
#endif
#if CC_NV_UndefineSpaceSpecial == YES
#define  TPM_CC_NV_UndefineSpaceSpecial       (TPM_CC)(0x0000011f)
#endif
#ifndef CC_EvictControl
#   define CC_EvictControl NO
#endif
#if CC_EvictControl == YES
#define  TPM_CC_EvictControl                  (TPM_CC)(0x00000120)
#endif
#ifndef CC_HierarchyControl
#   define CC_HierarchyControl NO
#endif
#if CC_HierarchyControl == YES
#define  TPM_CC_HierarchyControl              (TPM_CC)(0x00000121)
#endif
#ifndef CC_NV_UndefineSpace
#   define CC_NV_UndefineSpace NO
#endif
#if CC_NV_UndefineSpace == YES
#define  TPM_CC_NV_UndefineSpace              (TPM_CC)(0x00000122)
#endif
#ifndef CC_ChangeEPS
#   define CC_ChangeEPS NO
#endif
#if CC_ChangeEPS == YES
#define  TPM_CC_ChangeEPS                     (TPM_CC)(0x00000124)
#endif
#ifndef CC_ChangePPS
#   define CC_ChangePPS NO
#endif
#if CC_ChangePPS == YES
#define  TPM_CC_ChangePPS                     (TPM_CC)(0x00000125)
#endif
#ifndef CC_Clear
#   define CC_Clear NO
#endif
#if CC_Clear == YES
#define  TPM_CC_Clear                         (TPM_CC)(0x00000126)
#endif
#ifndef CC_ClearControl
#   define CC_ClearControl NO
#endif
#if CC_ClearControl == YES
#define  TPM_CC_ClearControl                  (TPM_CC)(0x00000127)
#endif
#ifndef CC_ClockSet
#   define CC_ClockSet NO
#endif
#if CC_ClockSet == YES
#define  TPM_CC_ClockSet                      (TPM_CC)(0x00000128)
#endif
#ifndef CC_HierarchyChangeAuth
#   define CC_HierarchyChangeAuth NO
#endif
#if CC_HierarchyChangeAuth == YES
#define  TPM_CC_HierarchyChangeAuth           (TPM_CC)(0x00000129)
#endif
#ifndef CC_NV_DefineSpace
#   define CC_NV_DefineSpace NO
#endif
#if CC_NV_DefineSpace == YES
#define  TPM_CC_NV_DefineSpace                (TPM_CC)(0x0000012a)
#endif
#ifndef CC_PCR_Allocate
#   define CC_PCR_Allocate NO
#endif
#if CC_PCR_Allocate == YES
#define  TPM_CC_PCR_Allocate                  (TPM_CC)(0x0000012b)
#endif
#ifndef CC_PCR_SetAuthPolicy
#   define CC_PCR_SetAuthPolicy NO
#endif
#if CC_PCR_SetAuthPolicy == YES
#define  TPM_CC_PCR_SetAuthPolicy             (TPM_CC)(0x0000012c)
#endif
#ifndef CC_PP_Commands
#   define CC_PP_Commands NO
#endif
#if CC_PP_Commands == YES
#define  TPM_CC_PP_Commands                   (TPM_CC)(0x0000012d)
#endif
#ifndef CC_SetPrimaryPolicy
#   define CC_SetPrimaryPolicy NO
#endif
#if CC_SetPrimaryPolicy == YES
#define  TPM_CC_SetPrimaryPolicy              (TPM_CC)(0x0000012e)
#endif
#ifndef CC_FieldUpgradeStart
#   define CC_FieldUpgradeStart NO
#endif
#if CC_FieldUpgradeStart == YES
#define  TPM_CC_FieldUpgradeStart             (TPM_CC)(0x0000012f)
#endif
#ifndef CC_ClockRateAdjust
#   define CC_ClockRateAdjust NO
#endif
#if CC_ClockRateAdjust == YES
#define  TPM_CC_ClockRateAdjust               (TPM_CC)(0x00000130)
#endif
#ifndef CC_CreatePrimary
#   define CC_CreatePrimary NO
#endif
#if CC_CreatePrimary == YES
#define  TPM_CC_CreatePrimary                 (TPM_CC)(0x00000131)
#endif
#ifndef CC_NV_GlobalWriteLock
#   define CC_NV_GlobalWriteLock NO
#endif
#if CC_NV_GlobalWriteLock == YES
#define  TPM_CC_NV_GlobalWriteLock            (TPM_CC)(0x00000132)
#endif
#ifndef CC_GetCommandAuditDigest
#   define CC_GetCommandAuditDigest NO
#endif
#if CC_GetCommandAuditDigest == YES
#define  TPM_CC_GetCommandAuditDigest         (TPM_CC)(0x00000133)
#endif
#ifndef CC_NV_Increment
#   define CC_NV_Increment NO
#endif
#if CC_NV_Increment == YES
#define  TPM_CC_NV_Increment                  (TPM_CC)(0x00000134)
#endif
#ifndef CC_NV_SetBits
#   define CC_NV_SetBits NO
#endif
#if CC_NV_SetBits == YES
#define  TPM_CC_NV_SetBits                    (TPM_CC)(0x00000135)
#endif
#ifndef CC_NV_Extend
#   define CC_NV_Extend NO
#endif
#if CC_NV_Extend == YES
#define  TPM_CC_NV_Extend                     (TPM_CC)(0x00000136)
#endif
#ifndef CC_NV_Write
#   define CC_NV_Write NO
#endif
#if CC_NV_Write == YES
#define  TPM_CC_NV_Write                      (TPM_CC)(0x00000137)
#endif
#ifndef CC_NV_WriteLock
#   define CC_NV_WriteLock NO
#endif
#if CC_NV_WriteLock == YES
#define  TPM_CC_NV_WriteLock                  (TPM_CC)(0x00000138)
#endif
#ifndef CC_DictionaryAttackLockReset
#   define CC_DictionaryAttackLockReset NO
#endif
#if CC_DictionaryAttackLockReset == YES
#define  TPM_CC_DictionaryAttackLockReset     (TPM_CC)(0x00000139)
#endif
#ifndef CC_DictionaryAttackParameters
#   define CC_DictionaryAttackParameters NO
#endif
#if CC_DictionaryAttackParameters == YES
#define  TPM_CC_DictionaryAttackParameters    (TPM_CC)(0x0000013a)
#endif
#ifndef CC_NV_ChangeAuth
#   define CC_NV_ChangeAuth NO
#endif
#if CC_NV_ChangeAuth == YES
#define  TPM_CC_NV_ChangeAuth                 (TPM_CC)(0x0000013b)
#endif
#ifndef CC_PCR_Event
#   define CC_PCR_Event NO
#endif
#if CC_PCR_Event == YES
#define  TPM_CC_PCR_Event                     (TPM_CC)(0x0000013c)
#endif
#ifndef CC_PCR_Reset
#   define CC_PCR_Reset NO
#endif
#if CC_PCR_Reset == YES
#define  TPM_CC_PCR_Reset                     (TPM_CC)(0x0000013d)
#endif
#ifndef CC_SequenceComplete
#   define CC_SequenceComplete NO
#endif
#if CC_SequenceComplete == YES
#define  TPM_CC_SequenceComplete              (TPM_CC)(0x0000013e)
#endif
#ifndef CC_SetAlgorithmSet
#   define CC_SetAlgorithmSet NO
#endif
#if CC_SetAlgorithmSet == YES
#define  TPM_CC_SetAlgorithmSet               (TPM_CC)(0x0000013f)
#endif
#ifndef CC_SetCommandCodeAuditStatus
#   define CC_SetCommandCodeAuditStatus NO
#endif
#if CC_SetCommandCodeAuditStatus == YES
#define  TPM_CC_SetCommandCodeAuditStatus     (TPM_CC)(0x00000140)
#endif
#ifndef CC_FieldUpgradeData
#   define CC_FieldUpgradeData NO
#endif
#if CC_FieldUpgradeData == YES
#define  TPM_CC_FieldUpgradeData              (TPM_CC)(0x00000141)
#endif
#ifndef CC_IncrementalSelfTest
#   define CC_IncrementalSelfTest NO
#endif
#if CC_IncrementalSelfTest == YES
#define  TPM_CC_IncrementalSelfTest           (TPM_CC)(0x00000142)
#endif
#ifndef CC_SelfTest
#   define CC_SelfTest NO
#endif
#if CC_SelfTest == YES
#define  TPM_CC_SelfTest                      (TPM_CC)(0x00000143)
#endif
#ifndef CC_Startup
#   define CC_Startup NO
#endif
#if CC_Startup == YES
#define  TPM_CC_Startup                       (TPM_CC)(0x00000144)
#endif
#ifndef CC_Shutdown
#   define CC_Shutdown NO
#endif
#if CC_Shutdown == YES
#define  TPM_CC_Shutdown                      (TPM_CC)(0x00000145)
#endif
#ifndef CC_StirRandom
#   define CC_StirRandom NO
#endif
#if CC_StirRandom == YES
#define  TPM_CC_StirRandom                    (TPM_CC)(0x00000146)
#endif
#ifndef CC_ActivateCredential
#   define CC_ActivateCredential NO
#endif
#if CC_ActivateCredential == YES
#define  TPM_CC_ActivateCredential            (TPM_CC)(0x00000147)
#endif
#ifndef CC_Certify
#   define CC_Certify NO
#endif
#if CC_Certify == YES
#define  TPM_CC_Certify                       (TPM_CC)(0x00000148)
#endif
#ifndef CC_PolicyNV
#   define CC_PolicyNV NO
#endif
#if CC_PolicyNV == YES
#define  TPM_CC_PolicyNV                      (TPM_CC)(0x00000149)
#endif
#ifndef CC_CertifyCreation
#   define CC_CertifyCreation NO
#endif
#if CC_CertifyCreation == YES
#define  TPM_CC_CertifyCreation               (TPM_CC)(0x0000014a)
#endif
#ifndef CC_Duplicate
#   define CC_Duplicate NO
#endif
#if CC_Duplicate == YES
#define  TPM_CC_Duplicate                     (TPM_CC)(0x0000014b)
#endif
#ifndef CC_GetTime
#   define CC_GetTime NO
#endif
#if CC_GetTime == YES
#define  TPM_CC_GetTime                       (TPM_CC)(0x0000014c)
#endif
#ifndef CC_GetSessionAuditDigest
#   define CC_GetSessionAuditDigest NO
#endif
#if CC_GetSessionAuditDigest == YES
#define  TPM_CC_GetSessionAuditDigest         (TPM_CC)(0x0000014d)
#endif
#ifndef CC_NV_Read
#   define CC_NV_Read NO
#endif
#if CC_NV_Read == YES
#define  TPM_CC_NV_Read                       (TPM_CC)(0x0000014e)
#endif
#ifndef CC_NV_ReadLock
#   define CC_NV_ReadLock NO
#endif
#if CC_NV_ReadLock == YES
#define  TPM_CC_NV_ReadLock                   (TPM_CC)(0x0000014f)
#endif
#ifndef CC_ObjectChangeAuth
#   define CC_ObjectChangeAuth NO
#endif
#if CC_ObjectChangeAuth == YES
#define  TPM_CC_ObjectChangeAuth              (TPM_CC)(0x00000150)
#endif
#ifndef CC_PolicySecret
#   define CC_PolicySecret NO
#endif
#if CC_PolicySecret == YES
#define  TPM_CC_PolicySecret                  (TPM_CC)(0x00000151)
#endif
#ifndef CC_Rewrap
#   define CC_Rewrap NO
#endif
#if CC_Rewrap == YES
#define  TPM_CC_Rewrap                        (TPM_CC)(0x00000152)
#endif
#ifndef CC_Create
#   define CC_Create NO
#endif
#if CC_Create == YES
#define  TPM_CC_Create                        (TPM_CC)(0x00000153)
#endif
#ifndef CC_ECDH_ZGen
#   define CC_ECDH_ZGen NO
#endif
#if CC_ECDH_ZGen == YES
#define  TPM_CC_ECDH_ZGen                     (TPM_CC)(0x00000154)
#endif
#ifndef CC_HMAC
#   define CC_HMAC NO
#endif
#if CC_HMAC == YES
#define  TPM_CC_HMAC                          (TPM_CC)(0x00000155)
#endif
#ifndef CC_Import
#   define CC_Import NO
#endif
#if CC_Import == YES
#define  TPM_CC_Import                        (TPM_CC)(0x00000156)
#endif
#ifndef CC_Load
#   define CC_Load NO
#endif
#if CC_Load == YES
#define  TPM_CC_Load                          (TPM_CC)(0x00000157)
#endif
#ifndef CC_Quote
#   define CC_Quote NO
#endif
#if CC_Quote == YES
#define  TPM_CC_Quote                         (TPM_CC)(0x00000158)
#endif
#ifndef CC_RSA_Decrypt
#   define CC_RSA_Decrypt NO
#endif
#if CC_RSA_Decrypt == YES
#define  TPM_CC_RSA_Decrypt                   (TPM_CC)(0x00000159)
#endif
#ifndef CC_HMAC_Start
#   define CC_HMAC_Start NO
#endif
#if CC_HMAC_Start == YES
#define  TPM_CC_HMAC_Start                    (TPM_CC)(0x0000015b)
#endif
#ifndef CC_SequenceUpdate
#   define CC_SequenceUpdate NO
#endif
#if CC_SequenceUpdate == YES
#define  TPM_CC_SequenceUpdate                (TPM_CC)(0x0000015c)
#endif
#ifndef CC_Sign
#   define CC_Sign NO
#endif
#if CC_Sign == YES
#define  TPM_CC_Sign                          (TPM_CC)(0x0000015d)
#endif
#ifndef CC_Unseal
#   define CC_Unseal NO
#endif
#if CC_Unseal == YES
#define  TPM_CC_Unseal                        (TPM_CC)(0x0000015e)
#endif
#ifndef CC_PolicySigned
#   define CC_PolicySigned NO
#endif
#if CC_PolicySigned == YES
#define  TPM_CC_PolicySigned                  (TPM_CC)(0x00000160)
#endif
#ifndef CC_ContextLoad
#   define CC_ContextLoad NO
#endif
#if CC_ContextLoad == YES
#define  TPM_CC_ContextLoad                   (TPM_CC)(0x00000161)
#endif
#ifndef CC_ContextSave
#   define CC_ContextSave NO
#endif
#if CC_ContextSave == YES
#define  TPM_CC_ContextSave                   (TPM_CC)(0x00000162)
#endif
#ifndef CC_ECDH_KeyGen
#   define CC_ECDH_KeyGen NO
#endif
#if CC_ECDH_KeyGen == YES
#define  TPM_CC_ECDH_KeyGen                   (TPM_CC)(0x00000163)
#endif
#ifndef CC_EncryptDecrypt
#   define CC_EncryptDecrypt NO
#endif
#if CC_EncryptDecrypt == YES
#define  TPM_CC_EncryptDecrypt                (TPM_CC)(0x00000164)
#endif
#ifndef CC_FlushContext
#   define CC_FlushContext NO
#endif
#if CC_FlushContext == YES
#define  TPM_CC_FlushContext                  (TPM_CC)(0x00000165)
#endif
#ifndef CC_LoadExternal
#   define CC_LoadExternal NO
#endif
#if CC_LoadExternal == YES
#define  TPM_CC_LoadExternal                  (TPM_CC)(0x00000167)
#endif
#ifndef CC_MakeCredential
#   define CC_MakeCredential NO
#endif
#if CC_MakeCredential == YES
#define  TPM_CC_MakeCredential                (TPM_CC)(0x00000168)
#endif
#ifndef CC_NV_ReadPublic
#   define CC_NV_ReadPublic NO
#endif
#if CC_NV_ReadPublic == YES
#define  TPM_CC_NV_ReadPublic                 (TPM_CC)(0x00000169)
#endif
#ifndef CC_PolicyAuthorize
#   define CC_PolicyAuthorize NO
#endif
#if CC_PolicyAuthorize == YES
#define  TPM_CC_PolicyAuthorize               (TPM_CC)(0x0000016a)
#endif
#ifndef CC_PolicyAuthValue
#   define CC_PolicyAuthValue NO
#endif
#if CC_PolicyAuthValue == YES
#define  TPM_CC_PolicyAuthValue               (TPM_CC)(0x0000016b)
#endif
#ifndef CC_PolicyCommandCode
#   define CC_PolicyCommandCode NO
#endif
#if CC_PolicyCommandCode == YES
#define  TPM_CC_PolicyCommandCode             (TPM_CC)(0x0000016c)
#endif
#ifndef CC_PolicyCounterTimer
#   define CC_PolicyCounterTimer NO
#endif
#if CC_PolicyCounterTimer == YES
#define  TPM_CC_PolicyCounterTimer            (TPM_CC)(0x0000016d)
#endif
#ifndef CC_PolicyCpHash
#   define CC_PolicyCpHash NO
#endif
#if CC_PolicyCpHash == YES
#define  TPM_CC_PolicyCpHash                  (TPM_CC)(0x0000016e)
#endif
#ifndef CC_PolicyLocality
#   define CC_PolicyLocality NO
#endif
#if CC_PolicyLocality == YES
#define  TPM_CC_PolicyLocality                (TPM_CC)(0x0000016f)
#endif
#ifndef CC_PolicyNameHash
#   define CC_PolicyNameHash NO
#endif
#if CC_PolicyNameHash == YES
#define  TPM_CC_PolicyNameHash                (TPM_CC)(0x00000170)
#endif
#ifndef CC_PolicyOR
#   define CC_PolicyOR NO
#endif
#if CC_PolicyOR == YES
#define  TPM_CC_PolicyOR                      (TPM_CC)(0x00000171)
#endif
#ifndef CC_PolicyTicket
#   define CC_PolicyTicket NO
#endif
#if CC_PolicyTicket == YES
#define  TPM_CC_PolicyTicket                  (TPM_CC)(0x00000172)
#endif
#ifndef CC_ReadPublic
#   define CC_ReadPublic NO
#endif
#if CC_ReadPublic == YES
#define  TPM_CC_ReadPublic                    (TPM_CC)(0x00000173)
#endif
#ifndef CC_RSA_Encrypt
#   define CC_RSA_Encrypt NO
#endif
#if CC_RSA_Encrypt == YES
#define  TPM_CC_RSA_Encrypt                   (TPM_CC)(0x00000174)
#endif
#ifndef CC_StartAuthSession
#   define CC_StartAuthSession NO
#endif
#if CC_StartAuthSession == YES
#define  TPM_CC_StartAuthSession              (TPM_CC)(0x00000176)
#endif
#ifndef CC_VerifySignature
#   define CC_VerifySignature NO
#endif
#if CC_VerifySignature == YES
#define  TPM_CC_VerifySignature               (TPM_CC)(0x00000177)
#endif
#ifndef CC_ECC_Parameters
#   define CC_ECC_Parameters NO
#endif
#if CC_ECC_Parameters == YES
#define  TPM_CC_ECC_Parameters                (TPM_CC)(0x00000178)
#endif
#ifndef CC_FirmwareRead
#   define CC_FirmwareRead NO
#endif
#if CC_FirmwareRead == YES
#define  TPM_CC_FirmwareRead                  (TPM_CC)(0x00000179)
#endif
#ifndef CC_GetCapability
#   define CC_GetCapability NO
#endif
#if CC_GetCapability == YES
#define  TPM_CC_GetCapability                 (TPM_CC)(0x0000017a)
#endif
#ifndef CC_GetRandom
#   define CC_GetRandom NO
#endif
#if CC_GetRandom == YES
#define  TPM_CC_GetRandom                     (TPM_CC)(0x0000017b)
#endif
#ifndef CC_GetTestResult
#   define CC_GetTestResult NO
#endif
#if CC_GetTestResult == YES
#define  TPM_CC_GetTestResult                 (TPM_CC)(0x0000017c)
#endif
#ifndef CC_Hash
#   define CC_Hash NO
#endif
#if CC_Hash == YES
#define  TPM_CC_Hash                          (TPM_CC)(0x0000017d)
#endif
#ifndef CC_PCR_Read
#   define CC_PCR_Read NO
#endif
#if CC_PCR_Read == YES
#define  TPM_CC_PCR_Read                      (TPM_CC)(0x0000017e)
#endif
#ifndef CC_PolicyPCR
#   define CC_PolicyPCR NO
#endif
#if CC_PolicyPCR == YES
#define  TPM_CC_PolicyPCR                     (TPM_CC)(0x0000017f)
#endif
#ifndef CC_PolicyRestart
#   define CC_PolicyRestart NO
#endif
#if CC_PolicyRestart == YES
#define  TPM_CC_PolicyRestart                 (TPM_CC)(0x00000180)
#endif
#ifndef CC_ReadClock
#   define CC_ReadClock NO
#endif
#if CC_ReadClock == YES
#define  TPM_CC_ReadClock                     (TPM_CC)(0x00000181)
#endif
#ifndef CC_PCR_Extend
#   define CC_PCR_Extend NO
#endif
#if CC_PCR_Extend == YES
#define  TPM_CC_PCR_Extend                    (TPM_CC)(0x00000182)
#endif
#ifndef CC_PCR_SetAuthValue
#   define CC_PCR_SetAuthValue NO
#endif
#if CC_PCR_SetAuthValue == YES
#define  TPM_CC_PCR_SetAuthValue              (TPM_CC)(0x00000183)
#endif
#ifndef CC_NV_Certify
#   define CC_NV_Certify NO
#endif
#if CC_NV_Certify == YES
#define  TPM_CC_NV_Certify                    (TPM_CC)(0x00000184)
#endif
#ifndef CC_EventSequenceComplete
#   define CC_EventSequenceComplete NO
#endif
#if CC_EventSequenceComplete == YES
#define  TPM_CC_EventSequenceComplete         (TPM_CC)(0x00000185)
#endif
#ifndef CC_HashSequenceStart
#   define CC_HashSequenceStart NO
#endif
#if CC_HashSequenceStart == YES
#define  TPM_CC_HashSequenceStart             (TPM_CC)(0x00000186)
#endif
#ifndef CC_PolicyPhysicalPresence
#   define CC_PolicyPhysicalPresence NO
#endif
#if CC_PolicyPhysicalPresence == YES
#define  TPM_CC_PolicyPhysicalPresence        (TPM_CC)(0x00000187)
#endif
#ifndef CC_PolicyDuplicationSelect
#   define CC_PolicyDuplicationSelect NO
#endif
#if CC_PolicyDuplicationSelect == YES
#define  TPM_CC_PolicyDuplicationSelect       (TPM_CC)(0x00000188)
#endif
#ifndef CC_PolicyGetDigest
#   define CC_PolicyGetDigest NO
#endif
#if CC_PolicyGetDigest == YES
#define  TPM_CC_PolicyGetDigest               (TPM_CC)(0x00000189)
#endif
#ifndef CC_TestParms
#   define CC_TestParms NO
#endif
#if CC_TestParms == YES
#define  TPM_CC_TestParms                     (TPM_CC)(0x0000018a)
#endif
#ifndef CC_Commit
#   define CC_Commit NO
#endif
#if CC_Commit == YES
#define  TPM_CC_Commit                        (TPM_CC)(0x0000018b)
#endif
#ifndef CC_PolicyPassword
#   define CC_PolicyPassword NO
#endif
#if CC_PolicyPassword == YES
#define  TPM_CC_PolicyPassword                (TPM_CC)(0x0000018c)
#endif
#ifndef CC_ZGen_2Phase
#   define CC_ZGen_2Phase NO
#endif
#if CC_ZGen_2Phase == YES
#define  TPM_CC_ZGen_2Phase                   (TPM_CC)(0x0000018d)
#endif
#ifndef CC_EC_Ephemeral
#   define CC_EC_Ephemeral NO
#endif
#if CC_EC_Ephemeral == YES
#define  TPM_CC_EC_Ephemeral                  (TPM_CC)(0x0000018e)
#endif
#ifndef CC_PolicyNvWritten
#   define CC_PolicyNvWritten NO
#endif
#if CC_PolicyNvWritten == YES
#define  TPM_CC_PolicyNvWritten               (TPM_CC)(0x0000018f)
#endif
#ifndef CC_PolicyTemplate
#   define CC_PolicyTemplate NO
#endif
#if CC_PolicyTemplate == YES
#define  TPM_CC_PolicyTemplate                (TPM_CC)(0x00000190)
#endif
#ifndef CC_CreateLoaded
#   define CC_CreateLoaded NO
#endif
#if CC_CreateLoaded == YES
#define  TPM_CC_CreateLoaded                  (TPM_CC)(0x00000191)
#endif
#ifndef CC_PolicyAuthorizeNV
#   define CC_PolicyAuthorizeNV NO
#endif
#if CC_PolicyAuthorizeNV == YES
#define  TPM_CC_PolicyAuthorizeNV             (TPM_CC)(0x00000192)
#endif
#ifndef CC_EncryptDecrypt2
#   define CC_EncryptDecrypt2 NO
#endif
#if CC_EncryptDecrypt2 == YES
#define  TPM_CC_EncryptDecrypt2               (TPM_CC)(0x00000193)
#endif
#define  CC_VEND                              (TPM_CC)(0x20000000)
#ifndef CC_Vendor_TCG_Test
#   define CC_Vendor_TCG_Test NO
#endif
#if CC_Vendor_TCG_Test == YES
#define  TPM_CC_Vendor_TCG_Test               (TPM_CC)(0x20000000)
#endif


#ifndef  COMPRESSED_LISTS
#define ADD_FILL    1
#else
#define ADD_FILL   0
#endif

// Size the array of library commands based on whether or not
// the array is packed (only defined commands) or dense
// (having entries for unimplemented commands)
#define LIBRARY_COMMAND_ARRAY_SIZE       (0      \
    + (ADD_FILL || CC_NV_UndefineSpaceSpecial)    /* 0x0000011f */ \
    + (ADD_FILL || CC_EvictControl)               /* 0x00000120 */ \
    + (ADD_FILL || CC_HierarchyControl)           /* 0x00000121 */ \
    + (ADD_FILL || CC_NV_UndefineSpace)           /* 0x00000122 */ \
    + ADD_FILL                                             /* 0x00000123 */ \
    + (ADD_FILL || CC_ChangeEPS)                  /* 0x00000124 */ \
    + (ADD_FILL || CC_ChangePPS)                  /* 0x00000125 */ \
    + (ADD_FILL || CC_Clear)                      /* 0x00000126 */ \
    + (ADD_FILL || CC_ClearControl)               /* 0x00000127 */ \
    + (ADD_FILL || CC_ClockSet)                   /* 0x00000128 */ \
    + (ADD_FILL || CC_HierarchyChangeAuth)        /* 0x00000129 */ \
    + (ADD_FILL || CC_NV_DefineSpace)             /* 0x0000012a */ \
    + (ADD_FILL || CC_PCR_Allocate)               /* 0x0000012b */ \
    + (ADD_FILL || CC_PCR_SetAuthPolicy)          /* 0x0000012c */ \
    + (ADD_FILL || CC_PP_Commands)                /* 0x0000012d */ \
    + (ADD_FILL || CC_SetPrimaryPolicy)           /* 0x0000012e */ \
    + (ADD_FILL || CC_FieldUpgradeStart)          /* 0x0000012f */ \
    + (ADD_FILL || CC_ClockRateAdjust)            /* 0x00000130 */ \
    + (ADD_FILL || CC_CreatePrimary)              /* 0x00000131 */ \
    + (ADD_FILL || CC_NV_GlobalWriteLock)         /* 0x00000132 */ \
    + (ADD_FILL || CC_GetCommandAuditDigest)      /* 0x00000133 */ \
    + (ADD_FILL || CC_NV_Increment)               /* 0x00000134 */ \
    + (ADD_FILL || CC_NV_SetBits)                 /* 0x00000135 */ \
    + (ADD_FILL || CC_NV_Extend)                  /* 0x00000136 */ \
    + (ADD_FILL || CC_NV_Write)                   /* 0x00000137 */ \
    + (ADD_FILL || CC_NV_WriteLock)               /* 0x00000138 */ \
    + (ADD_FILL || CC_DictionaryAttackLockReset)  /* 0x00000139 */ \
    + (ADD_FILL || CC_DictionaryAttackParameters) /* 0x0000013a */ \
    + (ADD_FILL || CC_NV_ChangeAuth)              /* 0x0000013b */ \
    + (ADD_FILL || CC_PCR_Event)                  /* 0x0000013c */ \
    + (ADD_FILL || CC_PCR_Reset)                  /* 0x0000013d */ \
    + (ADD_FILL || CC_SequenceComplete)           /* 0x0000013e */ \
    + (ADD_FILL || CC_SetAlgorithmSet)            /* 0x0000013f */ \
    + (ADD_FILL || CC_SetCommandCodeAuditStatus)  /* 0x00000140 */ \
    + (ADD_FILL || CC_FieldUpgradeData)           /* 0x00000141 */ \
    + (ADD_FILL || CC_IncrementalSelfTest)        /* 0x00000142 */ \
    + (ADD_FILL || CC_SelfTest)                   /* 0x00000143 */ \
    + (ADD_FILL || CC_Startup)                    /* 0x00000144 */ \
    + (ADD_FILL || CC_Shutdown)                   /* 0x00000145 */ \
    + (ADD_FILL || CC_StirRandom)                 /* 0x00000146 */ \
    + (ADD_FILL || CC_ActivateCredential)         /* 0x00000147 */ \
    + (ADD_FILL || CC_Certify)                    /* 0x00000148 */ \
    + (ADD_FILL || CC_PolicyNV)                   /* 0x00000149 */ \
    + (ADD_FILL || CC_CertifyCreation)            /* 0x0000014a */ \
    + (ADD_FILL || CC_Duplicate)                  /* 0x0000014b */ \
    + (ADD_FILL || CC_GetTime)                    /* 0x0000014c */ \
    + (ADD_FILL || CC_GetSessionAuditDigest)      /* 0x0000014d */ \
    + (ADD_FILL || CC_NV_Read)                    /* 0x0000014e */ \
    + (ADD_FILL || CC_NV_ReadLock)                /* 0x0000014f */ \
    + (ADD_FILL || CC_ObjectChangeAuth)           /* 0x00000150 */ \
    + (ADD_FILL || CC_PolicySecret)               /* 0x00000151 */ \
    + (ADD_FILL || CC_Rewrap)                     /* 0x00000152 */ \
    + (ADD_FILL || CC_Create)                     /* 0x00000153 */ \
    + (ADD_FILL || CC_ECDH_ZGen)                  /* 0x00000154 */ \
    + (ADD_FILL || CC_HMAC)                       /* 0x00000155 */ \
    + (ADD_FILL || CC_Import)                     /* 0x00000156 */ \
    + (ADD_FILL || CC_Load)                       /* 0x00000157 */ \
    + (ADD_FILL || CC_Quote)                      /* 0x00000158 */ \
    + (ADD_FILL || CC_RSA_Decrypt)                /* 0x00000159 */ \
    + ADD_FILL                                             /* 0x0000015a */ \
    + (ADD_FILL || CC_HMAC_Start)                 /* 0x0000015b */ \
    + (ADD_FILL || CC_SequenceUpdate)             /* 0x0000015c */ \
    + (ADD_FILL || CC_Sign)                       /* 0x0000015d */ \
    + (ADD_FILL || CC_Unseal)                     /* 0x0000015e */ \
    + ADD_FILL                                             /* 0x0000015f */ \
    + (ADD_FILL || CC_PolicySigned)               /* 0x00000160 */ \
    + (ADD_FILL || CC_ContextLoad)                /* 0x00000161 */ \
    + (ADD_FILL || CC_ContextSave)                /* 0x00000162 */ \
    + (ADD_FILL || CC_ECDH_KeyGen)                /* 0x00000163 */ \
    + (ADD_FILL || CC_EncryptDecrypt)             /* 0x00000164 */ \
    + (ADD_FILL || CC_FlushContext)               /* 0x00000165 */ \
    + ADD_FILL                                             /* 0x00000166 */ \
    + (ADD_FILL || CC_LoadExternal)               /* 0x00000167 */ \
    + (ADD_FILL || CC_MakeCredential)             /* 0x00000168 */ \
    + (ADD_FILL || CC_NV_ReadPublic)              /* 0x00000169 */ \
    + (ADD_FILL || CC_PolicyAuthorize)            /* 0x0000016a */ \
    + (ADD_FILL || CC_PolicyAuthValue)            /* 0x0000016b */ \
    + (ADD_FILL || CC_PolicyCommandCode)          /* 0x0000016c */ \
    + (ADD_FILL || CC_PolicyCounterTimer)         /* 0x0000016d */ \
    + (ADD_FILL || CC_PolicyCpHash)               /* 0x0000016e */ \
    + (ADD_FILL || CC_PolicyLocality)             /* 0x0000016f */ \
    + (ADD_FILL || CC_PolicyNameHash)             /* 0x00000170 */ \
    + (ADD_FILL || CC_PolicyOR)                   /* 0x00000171 */ \
    + (ADD_FILL || CC_PolicyTicket)               /* 0x00000172 */ \
    + (ADD_FILL || CC_ReadPublic)                 /* 0x00000173 */ \
    + (ADD_FILL || CC_RSA_Encrypt)                /* 0x00000174 */ \
    + ADD_FILL                                             /* 0x00000175 */ \
    + (ADD_FILL || CC_StartAuthSession)           /* 0x00000176 */ \
    + (ADD_FILL || CC_VerifySignature)            /* 0x00000177 */ \
    + (ADD_FILL || CC_ECC_Parameters)             /* 0x00000178 */ \
    + (ADD_FILL || CC_FirmwareRead)               /* 0x00000179 */ \
    + (ADD_FILL || CC_GetCapability)              /* 0x0000017a */ \
    + (ADD_FILL || CC_GetRandom)                  /* 0x0000017b */ \
    + (ADD_FILL || CC_GetTestResult)              /* 0x0000017c */ \
    + (ADD_FILL || CC_Hash)                       /* 0x0000017d */ \
    + (ADD_FILL || CC_PCR_Read)                   /* 0x0000017e */ \
    + (ADD_FILL || CC_PolicyPCR)                  /* 0x0000017f */ \
    + (ADD_FILL || CC_PolicyRestart)              /* 0x00000180 */ \
    + (ADD_FILL || CC_ReadClock)                  /* 0x00000181 */ \
    + (ADD_FILL || CC_PCR_Extend)                 /* 0x00000182 */ \
    + (ADD_FILL || CC_PCR_SetAuthValue)           /* 0x00000183 */ \
    + (ADD_FILL || CC_NV_Certify)                 /* 0x00000184 */ \
    + (ADD_FILL || CC_EventSequenceComplete)      /* 0x00000185 */ \
    + (ADD_FILL || CC_HashSequenceStart)          /* 0x00000186 */ \
    + (ADD_FILL || CC_PolicyPhysicalPresence)     /* 0x00000187 */ \
    + (ADD_FILL || CC_PolicyDuplicationSelect)    /* 0x00000188 */ \
    + (ADD_FILL || CC_PolicyGetDigest)            /* 0x00000189 */ \
    + (ADD_FILL || CC_TestParms)                  /* 0x0000018a */ \
    + (ADD_FILL || CC_Commit)                     /* 0x0000018b */ \
    + (ADD_FILL || CC_PolicyPassword)             /* 0x0000018c */ \
    + (ADD_FILL || CC_ZGen_2Phase)                /* 0x0000018d */ \
    + (ADD_FILL || CC_EC_Ephemeral)               /* 0x0000018e */ \
    + (ADD_FILL || CC_PolicyNvWritten)            /* 0x0000018f */ \
    + (ADD_FILL || CC_PolicyTemplate)             /* 0x00000190 */ \
    + (ADD_FILL || CC_CreateLoaded)               /* 0x00000191 */ \
    + (ADD_FILL || CC_PolicyAuthorizeNV)          /* 0x00000192 */ \
    + (ADD_FILL || CC_EncryptDecrypt2)            /* 0x00000193 */ \
    )

#define VENDOR_COMMAND_ARRAY_SIZE   ( 0   \
    + CC_Vendor_TCG_Test            \
    )

#define COMMAND_COUNT           \
            (LIBRARY_COMMAND_ARRAY_SIZE + VENDOR_COMMAND_ARRAY_SIZE)


#ifndef MAX
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#endif

#define MAX_HASH_BLOCK_SIZE  (                   \
    MAX(ALG_SHA1 * SHA1_BLOCK_SIZE,              \
    MAX(ALG_SHA256 * SHA256_BLOCK_SIZE,          \
    MAX(ALG_SHA384 * SHA384_BLOCK_SIZE,          \
    MAX(ALG_SHA512 * SHA512_BLOCK_SIZE,          \
    MAX(ALG_SM3_256 * SM3_256_BLOCK_SIZE,        \
    0 ))))))

#define MAX_DIGEST_SIZE      (                   \
    MAX(ALG_SHA1 * SHA1_DIGEST_SIZE,             \
    MAX(ALG_SHA256 * SHA256_DIGEST_SIZE,         \
    MAX(ALG_SHA384 * SHA384_DIGEST_SIZE,         \
    MAX(ALG_SHA512 * SHA512_DIGEST_SIZE,         \
    MAX(ALG_SM3_256 * SM3_256_DIGEST_SIZE,       \
    0 ))))))


#if MAX_DIGEST_SIZE == 0 || MAX_HASH_BLOCK_SIZE == 0
#error "Hash data not valid"
#endif

#define HASH_COUNT (ALG_SHA1+ALG_SHA256+ALG_SHA384+ALG_SHA512+ALG_SM3_256)
// Define the 2B structure that would hold any hash block
TPM2B_TYPE(MAX_HASH_BLOCK, MAX_HASH_BLOCK_SIZE);
// Following typedef is for some old code
typedef TPM2B_MAX_HASH_BLOCK    TPM2B_HASH_BLOCK;

#ifndef MAX
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#endif


#ifndef ALG_AES
#   define ALG_AES         NO
#endif
#ifndef MAX_AES_KEY_BITS
#   define      MAX_AES_KEY_BITS  0
#   define      MAX_AES_BLOCK_SIZE_BYTES 0
#endif

#ifndef ALG_CAMELLIA
#   define ALG_CAMELLIA         NO
#endif
#ifndef MAX_CAMELLIA_KEY_BITS
#   define      MAX_CAMELLIA_KEY_BITS  0
#   define      MAX_CAMELLIA_BLOCK_SIZE_BYTES 0
#endif

#ifndef ALG_SM4
#   define ALG_SM4         NO
#endif
#ifndef MAX_SM4_KEY_BITS
#   define      MAX_SM4_KEY_BITS  0
#   define      MAX_SM4_BLOCK_SIZE_BYTES 0
#endif

#ifndef ALG_TDES
#   define ALG_TDES         NO
#endif
#ifndef MAX_TDES_KEY_BITS
#   define      MAX_TDES_KEY_BITS  0
#   define      MAX_TDES_BLOCK_SIZE_BYTES 0
#endif
#define MAX_SYM_KEY_BITS (                                \
            MAX(MAX_AES_KEY_BITS * ALG_AES,           \
            MAX(MAX_CAMELLIA_KEY_BITS * ALG_CAMELLIA,           \
            MAX(MAX_SM4_KEY_BITS * ALG_SM4,           \
            MAX(MAX_TDES_KEY_BITS * ALG_TDES,           \
            0)))))

#define  MAX_SYM_KEY_BYTES ((MAX_SYM_KEY_BITS + 7) / 8)

#define MAX_SYM_BLOCK_SIZE  (                             \
            MAX(MAX_AES_BLOCK_SIZE_BYTES * ALG_AES,   \
            MAX(MAX_CAMELLIA_BLOCK_SIZE_BYTES * ALG_CAMELLIA,   \
            MAX(MAX_SM4_BLOCK_SIZE_BYTES * ALG_SM4,   \
            MAX(MAX_TDES_BLOCK_SIZE_BYTES * ALG_TDES,   \
            0)))))

#if MAX_SYM_KEY_BITS == 0 || MAX_SYM_BLOCK_SIZE == 0
#   error Bad size for MAX_SYM_KEY_BITS or MAX_SYM_BLOCK_SIZE
#endif


// Define the 2B structure for a seed
TPM2B_TYPE(SEED, PRIMARY_SEED_SIZE);

//#define MAX_PCR_BANKS   1
#ifndef MAX_PCR_BANKS
#define MAX_PCR_BANKS   HASH_COUNT
#endif

#endif  // _IMPLEMENTATION_H_
