/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2022 Microsoft Corporation
* Copyright (C) 2024 Free Software Foundation, Inc.
*
* GRUB 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 3 of the License, or
* (at your option) any later version.
*
* GRUB 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 GRUB. If not, see .
*/
#ifndef GRUB_TPM2_INTERNAL_STRUCTS_HEADER
#define GRUB_TPM2_INTERNAL_STRUCTS_HEADER 1
#include
/*
* TPM response header
* This struct is used to calculate the minimum size of the TPM 2.0 response.
* The format of the response:
*
* +----------------------+
* | UINT16 tag |
* +----------------------+
* | UINT32 repsonse_size |
* +----------------------+
* | UINT32 response_code |
* +======================+
* | response_data | (optional)
* +======================+
*/
struct __attribute__ ((__packed__)) TPM_RESPONSE_HEADER
{
grub_uint16_t tag;
grub_uint32_t response_size;
TPM_RC_t response_code;
};
typedef struct TPM_RESPONSE_HEADER TPM_RESPONSE_HEADER_t;
/* TPMS_TAGGED_PROPERTY Structure */
struct TPMS_TAGGED_PROPERTY
{
TPM_PT_t property;
grub_uint32_t value;
};
typedef struct TPMS_TAGGED_PROPERTY TPMS_TAGGED_PROPERTY_t;
/* TPML_TAGGED_TPM_PROPERTY Structure */
struct TPML_TAGGED_TPM_PROPERTY
{
grub_uint32_t count;
TPMS_TAGGED_PROPERTY_t tpmProperty[TPM_MAX_TPM_PROPERTIES];
};
typedef struct TPML_TAGGED_TPM_PROPERTY TPML_TAGGED_TPM_PROPERTY_t;
/* TPMU_CAPABILITIES Structure */
union TPMU_CAPABILITIES
{
TPML_TAGGED_TPM_PROPERTY_t tpmProperties;
};
typedef union TPMU_CAPABILITIES TPMU_CAPABILITIES_t;
/* TPMS_CAPABILITY_DATA Structure */
struct TPMS_CAPABILITY_DATA
{
TPM_CAP_t capability;
TPMU_CAPABILITIES_t data;
};
typedef struct TPMS_CAPABILITY_DATA TPMS_CAPABILITY_DATA_t;
/* TPMS_PCR_SELECT Structure */
struct TPMS_PCR_SELECT
{
grub_uint8_t sizeOfSelect;
grub_uint8_t pcrSelect[TPM_PCR_SELECT_MAX];
};
typedef struct TPMS_PCR_SELECT TPMS_PCR_SELECT_t;
/* TPMS_PCR_SELECTION Structure */
struct TPMS_PCR_SELECTION
{
TPMI_ALG_HASH_t hash;
grub_uint8_t sizeOfSelect;
grub_uint8_t pcrSelect[TPM_PCR_SELECT_MAX];
};
typedef struct TPMS_PCR_SELECTION TPMS_PCR_SELECTION_t;
static inline void TPMS_PCR_SELECTION_SelectPCR(TPMS_PCR_SELECTION_t *self, grub_uint32_t n)
{
self->pcrSelect[(n / 8)] |= (1 << (n % 8));
}
/* TPML_PCR_SELECTION Structure */
struct TPML_PCR_SELECTION
{
grub_uint32_t count;
TPMS_PCR_SELECTION_t pcrSelections[TPM_NUM_PCR_BANKS];
};
typedef struct TPML_PCR_SELECTION TPML_PCR_SELECTION_t;
/* TPMU_HA Structure */
union TPMU_HA
{
grub_uint8_t sha1[TPM_SHA1_DIGEST_SIZE];
grub_uint8_t sha256[TPM_SHA256_DIGEST_SIZE];
grub_uint8_t sha384[TPM_SHA384_DIGEST_SIZE];
grub_uint8_t sha512[TPM_SHA512_DIGEST_SIZE];
grub_uint8_t sm3_256[TPM_SM3_256_DIGEST_SIZE];
};
typedef union TPMU_HA TPMU_HA_t;
/* TPM2B Structure */
struct TPM2B
{
grub_uint16_t size;
grub_uint8_t buffer[1];
};
typedef struct TPM2B TPM2B_t;
/* TPM2B_DIGEST Structure */
struct TPM2B_DIGEST
{
grub_uint16_t size;
grub_uint8_t buffer[sizeof(TPMU_HA_t)];
};
typedef struct TPM2B_DIGEST TPM2B_DIGEST_t;
/* TPML_DIGEST Structure */
struct TPML_DIGEST
{
grub_uint32_t count;
TPM2B_DIGEST_t digests[8];
};
typedef struct TPML_DIGEST TPML_DIGEST_t;
/* TPM2B_NONCE Type */
typedef TPM2B_DIGEST_t TPM2B_NONCE_t;
/* TPM2B_EVENT Structure */
struct TPM2B_EVENT {
grub_uint16_t size;
grub_uint8_t buffer[1024];
};
typedef struct TPM2B_EVENT TPM2B_EVENT_t;
/* TPMA_SESSION Structure */
struct TPMA_SESSION
{
#ifdef GRUB_TARGET_WORDS_BIGENDIAN
grub_uint8_t audit:1;
grub_uint8_t encrypt:1;
grub_uint8_t decrypt:1;
grub_uint8_t reserved:2;
grub_uint8_t auditReset:1;
grub_uint8_t auditExclusive:1;
grub_uint8_t continueSession:1;
#else
grub_uint8_t continueSession:1;
grub_uint8_t auditExclusive:1;
grub_uint8_t auditReset:1;
grub_uint8_t reserved:2;
grub_uint8_t decrypt:1;
grub_uint8_t encrypt:1;
grub_uint8_t audit:1;
#endif
};
typedef struct TPMA_SESSION TPMA_SESSION_t;
/* TPM2B_AUTH Type */
typedef TPM2B_DIGEST_t TPM2B_AUTH_t;
/* TPMS_AUTH_COMMAND Structure */
struct TPMS_AUTH_COMMAND
{
TPMI_SH_AUTH_SESSION_t sessionHandle;
TPM2B_NONCE_t nonce;
TPMA_SESSION_t sessionAttributes;
TPM2B_AUTH_t hmac;
};
typedef struct TPMS_AUTH_COMMAND TPMS_AUTH_COMMAND_t;
/* TPMS_AUTH_RESPONSE Structure */
struct TPMS_AUTH_RESPONSE
{
TPM2B_NONCE_t nonce;
TPMA_SESSION_t sessionAttributes;
TPM2B_AUTH_t hmac;
};
typedef struct TPMS_AUTH_RESPONSE TPMS_AUTH_RESPONSE_t;
/* TPM2B_SENSITIVE_DATA Structure */
struct TPM2B_SENSITIVE_DATA
{
grub_uint16_t size;
grub_uint8_t buffer[TPM_MAX_SYM_DATA];
};
typedef struct TPM2B_SENSITIVE_DATA TPM2B_SENSITIVE_DATA_t;
/* TPMS_SENSITIVE_CREATE Structure */
struct TPMS_SENSITIVE_CREATE
{
TPM2B_AUTH_t userAuth;
TPM2B_SENSITIVE_DATA_t data;
};
typedef struct TPMS_SENSITIVE_CREATE TPMS_SENSITIVE_CREATE_t;
/* TPM2B_SENSITIVE_CREATE Structure */
struct TPM2B_SENSITIVE_CREATE
{
grub_uint16_t size;
TPMS_SENSITIVE_CREATE_t sensitive;
};
typedef struct TPM2B_SENSITIVE_CREATE TPM2B_SENSITIVE_CREATE_t;
/* TPMA_OBJECT Structure */
struct TPMA_OBJECT
{
#ifdef GRUB_TARGET_WORDS_BIGENDIAN
grub_uint32_t reserved5:13;
grub_uint32_t sign:1;
grub_uint32_t decrypt:1;
grub_uint32_t restricted:1;
grub_uint32_t reserved4:4;
grub_uint32_t encryptedDuplication:1;
grub_uint32_t noDA:1;
grub_uint32_t reserved3:2;
grub_uint32_t adminWithPolicy:1;
grub_uint32_t userWithAuth:1;
grub_uint32_t sensitiveDataOrigin:1;
grub_uint32_t fixedParent:1;
grub_uint32_t reserved2:1;
grub_uint32_t stClear:1;
grub_uint32_t fixedTPM:1;
grub_uint32_t reserved1:1;
#else
grub_uint32_t reserved1:1;
grub_uint32_t fixedTPM:1;
grub_uint32_t stClear:1;
grub_uint32_t reserved2:1;
grub_uint32_t fixedParent:1;
grub_uint32_t sensitiveDataOrigin:1;
grub_uint32_t userWithAuth:1;
grub_uint32_t adminWithPolicy:1;
grub_uint32_t reserved3:2;
grub_uint32_t noDA:1;
grub_uint32_t encryptedDuplication:1;
grub_uint32_t reserved4:4;
grub_uint32_t restricted:1;
grub_uint32_t decrypt:1;
grub_uint32_t sign:1;
grub_uint32_t reserved5:13;
#endif
};
typedef struct TPMA_OBJECT TPMA_OBJECT_t;
/* TPMS_SCHEME_HASH Structure */
struct TPMS_SCHEME_HASH
{
TPMI_ALG_HASH_t hashAlg;
};
typedef struct TPMS_SCHEME_HASH TPMS_SCHEME_HASH_t;
/* TPMS_SCHEME_HASH Types */
typedef TPMS_SCHEME_HASH_t TPMS_KEY_SCHEME_ECDH_t;
typedef TPMS_SCHEME_HASH_t TPMS_KEY_SCHEME_ECMQV_t;
typedef TPMS_SCHEME_HASH_t TPMS_SIG_SCHEME_RSASSA_t;
typedef TPMS_SCHEME_HASH_t TPMS_SIG_SCHEME_RSAPSS_t;
typedef TPMS_SCHEME_HASH_t TPMS_SIG_SCHEME_ECDSA_t;
typedef TPMS_SCHEME_HASH_t TPMS_SIG_SCHEME_ECDAA_t;
typedef TPMS_SCHEME_HASH_t TPMS_SIG_SCHEME_SM2_t;
typedef TPMS_SCHEME_HASH_t TPMS_SIG_SCHEME_ECSCHNORR_t;
typedef TPMS_SCHEME_HASH_t TPMS_ENC_SCHEME_RSAES_t;
typedef TPMS_SCHEME_HASH_t TPMS_ENC_SCHEME_OAEP_t;
typedef TPMS_SCHEME_HASH_t TPMS_SCHEME_KDF2_t;
typedef TPMS_SCHEME_HASH_t TPMS_SCHEME_MGF1_t;
typedef TPMS_SCHEME_HASH_t TPMS_SCHEME_KDF1_SP800_56A_t;
typedef TPMS_SCHEME_HASH_t TPMS_SCHEME_KDF1_SP800_108_t;
/* TPMS_SCHEME_HMAC Type */
typedef TPMS_SCHEME_HASH_t TPMS_SCHEME_HMAC_t;
/* TPMS_SCHEME_XOR Structure */
struct TPMS_SCHEME_XOR
{
TPMI_ALG_HASH_t hashAlg;
TPMI_ALG_KDF_t kdf;
};
typedef struct TPMS_SCHEME_XOR TPMS_SCHEME_XOR_t;
/* TPMU_SCHEME_KEYEDHASH Union */
union TPMU_SCHEME_KEYEDHASH
{
TPMS_SCHEME_HMAC_t hmac;
TPMS_SCHEME_XOR_t exclusiveOr;
};
typedef union TPMU_SCHEME_KEYEDHASH TPMU_SCHEME_KEYEDHASH_t;
/* TPMT_KEYEDHASH_SCHEME Structure */
struct TPMT_KEYEDHASH_SCHEME
{
TPMI_ALG_KEYEDHASH_SCHEME_t scheme;
TPMU_SCHEME_KEYEDHASH_t details;
};
typedef struct TPMT_KEYEDHASH_SCHEME TPMT_KEYEDHASH_SCHEME_t;
/* TPMS_KEYEDHASH_PARMS Structure */
struct TPMS_KEYEDHASH_PARMS
{
TPMT_KEYEDHASH_SCHEME_t scheme;
};
typedef struct TPMS_KEYEDHASH_PARMS TPMS_KEYEDHASH_PARMS_t;
/* TPMU_SYM_KEY_BITS Union */
union TPMU_SYM_KEY_BITS
{
TPM_KEY_BITS_t aes;
TPM_KEY_BITS_t exclusiveOr;
TPM_KEY_BITS_t sm4;
TPM_KEY_BITS_t camellia;
};
typedef union TPMU_SYM_KEY_BITS TPMU_SYM_KEY_BITS_t;
/* TPMU_SYM_MODE Union */
union TPMU_SYM_MODE
{
TPMI_ALG_SYM_MODE_t aes;
TPMI_ALG_SYM_MODE_t sm4;
TPMI_ALG_SYM_MODE_t camellia;
TPMI_ALG_SYM_MODE_t sym;
};
typedef union TPMU_SYM_MODE TPMU_SYM_MODE_t;
/* TPMT_SYM_DEF_OBJECT Structure */
struct TPMT_SYM_DEF_OBJECT
{
TPMI_ALG_SYM_OBJECT_t algorithm;
TPMU_SYM_KEY_BITS_t keyBits;
TPMU_SYM_MODE_t mode;
};
typedef struct TPMT_SYM_DEF_OBJECT TPMT_SYM_DEF_OBJECT_t;
/* TPMS_SYMCIPHER_PARMS Structure */
struct TPMS_SYMCIPHER_PARMS
{
TPMT_SYM_DEF_OBJECT_t sym;
};
typedef struct TPMS_SYMCIPHER_PARMS TPMS_SYMCIPHER_PARMS_t;
/* TPMU_ASYM_SCHEME Union */
union TPMU_ASYM_SCHEME
{
TPMS_KEY_SCHEME_ECDH_t ecdh;
TPMS_KEY_SCHEME_ECMQV_t ecmqv;
TPMS_SIG_SCHEME_RSASSA_t rsassa;
TPMS_SIG_SCHEME_RSAPSS_t rsapss;
TPMS_SIG_SCHEME_ECDSA_t ecdsa;
TPMS_SIG_SCHEME_ECDAA_t ecdaa;
TPMS_SIG_SCHEME_SM2_t sm2;
TPMS_SIG_SCHEME_ECSCHNORR_t ecschnorr;
TPMS_ENC_SCHEME_RSAES_t rsaes;
TPMS_ENC_SCHEME_OAEP_t oaep;
TPMS_SCHEME_HASH_t anySig;
unsigned char padding[4];
};
typedef union TPMU_ASYM_SCHEME TPMU_ASYM_SCHEME_t;
/* TPMT_RSA_SCHEME Structure */
struct TPMT_RSA_SCHEME
{
TPMI_ALG_RSA_SCHEME_t scheme;
TPMU_ASYM_SCHEME_t details;
};
typedef struct TPMT_RSA_SCHEME TPMT_RSA_SCHEME_t;
/* TPMS_RSA_PARMS Structure */
struct TPMS_RSA_PARMS
{
TPMT_SYM_DEF_OBJECT_t symmetric;
TPMT_RSA_SCHEME_t scheme;
TPM_KEY_BITS_t keyBits;
grub_uint32_t exponent;
};
typedef struct TPMS_RSA_PARMS TPMS_RSA_PARMS_t;
/* TPMT_ECC_SCHEME Structure */
struct TPMT_ECC_SCHEME
{
TPMI_ALG_ECC_SCHEME_t scheme;
TPMU_ASYM_SCHEME_t details;
};
typedef struct TPMT_ECC_SCHEME TPMT_ECC_SCHEME_t;
/* TPMU_KDF_SCHEME Union */
union TPMU_KDF_SCHEME
{
TPMS_SCHEME_MGF1_t mgf1;
TPMS_SCHEME_KDF1_SP800_56A_t kdf1_sp800_56a;
TPMS_SCHEME_KDF2_t kdf2;
TPMS_SCHEME_KDF1_SP800_108_t kdf1_sp800_108;
};
typedef union TPMU_KDF_SCHEME TPMU_KDF_SCHEME_t;
/* TPMT_KDF_SCHEME Structure */
struct TPMT_KDF_SCHEME
{
TPMI_ALG_KDF_t scheme;
TPMU_KDF_SCHEME_t details;
};
typedef struct TPMT_KDF_SCHEME TPMT_KDF_SCHEME_t;
/* TPMS_ECC_PARMS Structure */
struct TPMS_ECC_PARMS
{
TPMT_SYM_DEF_OBJECT_t symmetric;
TPMT_ECC_SCHEME_t scheme;
TPMI_ECC_CURVE_t curveID;
TPMT_KDF_SCHEME_t kdf;
};
typedef struct TPMS_ECC_PARMS TPMS_ECC_PARMS_t;
/* TPMT_ASYM_SCHEME Structure */
struct TPMT_ASYM_SCHEME
{
TPMI_ALG_ASYM_SCHEME_t scheme;
TPMU_ASYM_SCHEME_t details;
};
typedef struct TPMT_ASYM_SCHEME TPMT_ASYM_SCHEME_t;
/* TPMS_ASYM_PARMS Structure */
struct TPMS_ASYM_PARMS
{
TPMT_SYM_DEF_OBJECT_t symmetric;
TPMT_ASYM_SCHEME_t scheme;
};
typedef struct TPMS_ASYM_PARMS TPMS_ASYM_PARMS_t;
/* TPMU_PUBLIC_PARMS Union */
union TPMU_PUBLIC_PARMS
{
TPMS_KEYEDHASH_PARMS_t keyedHashDetail;
TPMS_SYMCIPHER_PARMS_t symDetail;
TPMS_RSA_PARMS_t rsaDetail;
TPMS_ECC_PARMS_t eccDetail;
TPMS_ASYM_PARMS_t asymDetail;
};
typedef union TPMU_PUBLIC_PARMS TPMU_PUBLIC_PARMS_t;
/* TPMT_PUBLIC_PARMS Structure */
struct TPMT_PUBLIC_PARMS {
TPMI_ALG_PUBLIC_t type;
TPMU_PUBLIC_PARMS_t parameters;
};
typedef struct TPMT_PUBLIC_PARMS TPMT_PUBLIC_PARMS_t;
/* TPM2B_PUBLIC_KEY_RSA Structure */
struct TPM2B_PUBLIC_KEY_RSA
{
grub_uint16_t size;
grub_uint8_t buffer[TPM_MAX_RSA_KEY_BYTES];
};
typedef struct TPM2B_PUBLIC_KEY_RSA TPM2B_PUBLIC_KEY_RSA_t;
/* TPM2B_ECC_PARAMETER Structure */
struct TPM2B_ECC_PARAMETER
{
grub_uint16_t size;
grub_uint8_t buffer[TPM_MAX_ECC_KEY_BYTES];
};
typedef struct TPM2B_ECC_PARAMETER TPM2B_ECC_PARAMETER_t;
/* TPMS_ECC_POINT Structure */
struct TPMS_ECC_POINT
{
TPM2B_ECC_PARAMETER_t x;
TPM2B_ECC_PARAMETER_t y;
};
typedef struct TPMS_ECC_POINT TPMS_ECC_POINT_t;
/* TPMU_ENCRYPTED_SECRET Union */
union TPMU_ENCRYPTED_SECRET
{
grub_uint8_t ecc[sizeof(TPMS_ECC_POINT_t)];
grub_uint8_t rsa[TPM_MAX_RSA_KEY_BYTES];
grub_uint8_t symmetric[sizeof(TPM2B_DIGEST_t)];
grub_uint8_t keyedHash[sizeof(TPM2B_DIGEST_t)];
};
typedef union TPMU_ENCRYPTED_SECRET TPMU_ENCRYPTED_SECRET_t;
/* TPM2B_ENCRYPTED_SECRET Structure */
struct TPM2B_ENCRYPTED_SECRET
{
grub_uint16_t size;
grub_uint8_t secret[sizeof(TPMU_ENCRYPTED_SECRET_t)];
};
typedef struct TPM2B_ENCRYPTED_SECRET TPM2B_ENCRYPTED_SECRET_t;
/* TPMU_PUBLIC_ID Union */
union TPMU_PUBLIC_ID
{
TPM2B_DIGEST_t keyedHash;
TPM2B_DIGEST_t sym;
TPM2B_PUBLIC_KEY_RSA_t rsa;
TPMS_ECC_POINT_t ecc;
};
typedef union TPMU_PUBLIC_ID TPMU_PUBLIC_ID_t;
/* TPMT_PUBLIC Structure */
struct TPMT_PUBLIC
{
TPMI_ALG_PUBLIC_t type;
TPMI_ALG_HASH_t nameAlg;
TPMA_OBJECT_t objectAttributes;
TPM2B_DIGEST_t authPolicy;
TPMU_PUBLIC_PARMS_t parameters;
TPMU_PUBLIC_ID_t unique;
};
typedef struct TPMT_PUBLIC TPMT_PUBLIC_t;
/* TPM2B_PUBLIC Structure */
struct TPM2B_PUBLIC
{
grub_uint16_t size;
TPMT_PUBLIC_t publicArea;
};
typedef struct TPM2B_PUBLIC TPM2B_PUBLIC_t;
/* TPMT_HA Structure */
struct TPMT_HA
{
TPMI_ALG_HASH_t hashAlg;
TPMU_HA_t digest;
};
typedef struct TPMT_HA TPMT_HA_t;
/* TPM2B_DATA Structure */
struct TPM2B_DATA
{
grub_uint16_t size;
grub_uint8_t buffer[sizeof(TPMT_HA_t)];
};
typedef struct TPM2B_DATA TPM2B_DATA_t;
/* TPMA_LOCALITY Structure */
struct TPMA_LOCALITY
{
#ifdef GRUB_TARGET_WORDS_BIGENDIAN
grub_uint8_t Extended:3;
grub_uint8_t TPM_LOC_FOUR:1;
grub_uint8_t TPM_LOC_THREE:1;
grub_uint8_t TPM_LOC_TWO:1;
grub_uint8_t TPM_LOC_ONE:1;
grub_uint8_t TPM_LOC_ZERO:1;
#else
grub_uint8_t TPM_LOC_ZERO:1;
grub_uint8_t TPM_LOC_ONE:1;
grub_uint8_t TPM_LOC_TWO:1;
grub_uint8_t TPM_LOC_THREE:1;
grub_uint8_t TPM_LOC_FOUR:1;
grub_uint8_t Extended:3;
#endif
};
typedef struct TPMA_LOCALITY TPMA_LOCALITY_t;
/* TPMU_NAME Union */
union TPMU_NAME
{
TPMT_HA_t digest;
TPM_HANDLE_t handle;
};
typedef union TPMU_NAME TPMU_NAME_t;
/* TPM2B_NAME Structure */
struct TPM2B_NAME
{
grub_uint16_t size;
grub_uint8_t name[sizeof(TPMU_NAME_t)];
};
typedef struct TPM2B_NAME TPM2B_NAME_t;
/* TPMS_CREATION_DATA Structure */
struct TPMS_CREATION_DATA
{
TPML_PCR_SELECTION_t pcrSelect;
TPM2B_DIGEST_t pcrDigest;
TPMA_LOCALITY_t locality;
TPM_ALG_ID_t parentNameAlg;
TPM2B_NAME_t parentName;
TPM2B_NAME_t parentQualifiedName;
TPM2B_DATA_t outsideInfo;
};
typedef struct TPMS_CREATION_DATA TPMS_CREATION_DATA_t;
/* TPM2B_CREATION_DATA Structure */
struct TPM2B_CREATION_DATA
{
grub_uint16_t size;
TPMS_CREATION_DATA_t creationData;
};
typedef struct TPM2B_CREATION_DATA TPM2B_CREATION_DATA_t;
/* TPMT_SYM_DEF Structure */
struct TPMT_SYM_DEF
{
TPMI_ALG_SYM_t algorithm;
TPMU_SYM_KEY_BITS_t keyBits;
TPMU_SYM_MODE_t mode;
};
typedef struct TPMT_SYM_DEF TPMT_SYM_DEF_t;
/* TPM2B_MAX_BUFFER Structure */
struct TPM2B_MAX_BUFFER
{
grub_uint16_t size;
grub_uint8_t buffer[TPM_MAX_DIGEST_BUFFER];
};
typedef struct TPM2B_MAX_BUFFER TPM2B_MAX_BUFFER_t;
/* TPMT_TK_HASHCHECK Structure */
struct TPMT_TK_HASHCHECK
{
TPM_ST_t tag;
TPMI_RH_HIERARCHY_t hierarchy;
TPM2B_DIGEST_t digest;
};
typedef struct TPMT_TK_HASHCHECK TPMT_TK_HASHCHECK_t;
/* TPM2B_SYM_KEY Structure */
struct TPM2B_SYM_KEY
{
grub_uint16_t size;
grub_uint8_t buffer[TPM_MAX_SYM_KEY_BYTES];
};
typedef struct TPM2B_SYM_KEY TPM2B_SYM_KEY_t;
/* TPM2B_PRIVATE_KEY_RSA Structure */
struct TPM2B_PRIVATE_KEY_RSA
{
grub_uint16_t size;
grub_uint8_t buffer[TPM_MAX_RSA_KEY_BYTES/2];
};
typedef struct TPM2B_PRIVATE_KEY_RSA TPM2B_PRIVATE_KEY_RSA_t;
/* TPM2B_PRIVATE_VENDOR_SPECIFIC Structure */
struct TPM2B_PRIVATE_VENDOR_SPECIFIC
{
grub_uint16_t size;
grub_uint8_t buffer[TPM_PRIVATE_VENDOR_SPECIFIC_BYTES];
};
typedef struct TPM2B_PRIVATE_VENDOR_SPECIFIC TPM2B_PRIVATE_VENDOR_SPECIFIC_t;
/* TPM2B_PRIVATE_VENDOR_SPECIFIC Union */
union TPMU_SENSITIVE_COMPOSITE
{
TPM2B_PRIVATE_KEY_RSA_t rsa;
TPM2B_ECC_PARAMETER_t ecc;
TPM2B_SENSITIVE_DATA_t bits;
TPM2B_SYM_KEY_t sym;
TPM2B_PRIVATE_VENDOR_SPECIFIC_t any;
};
typedef union TPMU_SENSITIVE_COMPOSITE TPMU_SENSITIVE_COMPOSITE_t;
/* TPMT_SENSITIVE Structure */
struct TPMT_SENSITIVE
{
TPMI_ALG_PUBLIC_t sensitiveType;
TPM2B_AUTH_t authValue;
TPM2B_DIGEST_t seedValue;
TPMU_SENSITIVE_COMPOSITE_t sensitive;
};
typedef struct TPMT_SENSITIVE TPMT_SENSITIVE_t;
/* TPM2B_SENSITIVE Structure */
struct TPM2B_SENSITIVE
{
grub_uint16_t size;
TPMT_SENSITIVE_t sensitiveArea;
};
typedef struct TPM2B_SENSITIVE TPM2B_SENSITIVE_t;
/*
* _PRIVATE Structure
*
* Although '_PRIVATE' is the name defined in the TPM2 SPEC, it is too generic,
* so here we add the '__TPM2B' prefix to make the struct specific for 'TPM2B_PRIVATE'.
*/
struct __TPM2B_PRIVATE
{
TPM2B_DIGEST_t integrityOuter;
TPM2B_DIGEST_t integrityInner;
TPM2B_SENSITIVE_t sensitive;
};
typedef struct __TPM2B_PRIVATE __TPM2B_PRIVATE_t;
/* TPM2B_PRIVATE Structure */
struct TPM2B_PRIVATE
{
grub_uint16_t size;
grub_uint8_t buffer[sizeof(__TPM2B_PRIVATE_t)];
};
typedef struct TPM2B_PRIVATE TPM2B_PRIVATE_t;
/* TPML_DIGEST_VALUES Structure */
struct TPML_DIGEST_VALUES
{
grub_uint32_t count;
TPMT_HA_t digests[TPM_NUM_PCR_BANKS];
};
typedef struct TPML_DIGEST_VALUES TPML_DIGEST_VALUES_t;
/* TPM2B_MAX_NV_BUFFER Structure */
struct TPM2B_MAX_NV_BUFFER
{
grub_uint16_t size;
grub_uint8_t buffer[TPM_MAX_NV_BUFFER_SIZE];
};
typedef struct TPM2B_MAX_NV_BUFFER TPM2B_MAX_NV_BUFFER_t;
/* TPMS_NV_PUBLIC Structure */
struct TPMS_NV_PUBLIC
{
TPMI_RH_NV_INDEX_t nvIndex;
TPMI_ALG_HASH_t nameAlg;
TPMA_NV_t attributes;
TPM2B_DIGEST_t authPolicy;
grub_uint16_t dataSize;
};
typedef struct TPMS_NV_PUBLIC TPMS_NV_PUBLIC_t;
/* TPM2B_NV_PUBLIC Structure */
struct TPM2B_NV_PUBLIC
{
grub_uint16_t size;
TPMS_NV_PUBLIC_t nvPublic;
};
typedef struct TPM2B_NV_PUBLIC TPM2B_NV_PUBLIC_t;
/* TPMT_TK_CREATION Structure */
struct TPMT_TK_CREATION
{
TPM_ST_t tag;
TPMI_RH_HIERARCHY_t hierarchy;
TPM2B_DIGEST_t digest;
};
typedef struct TPMT_TK_CREATION TPMT_TK_CREATION_t;
/* TPMS_EMPTY Structure */
struct TPMS_EMPTY {
grub_uint8_t empty[1]; /* a structure with no member */
};
typedef struct TPMS_EMPTY TPMS_EMPTY_t;
/* TPMS_SIGNATURE_RSA Structure */
struct TPMS_SIGNATURE_RSA {
TPMI_ALG_HASH_t hash;
TPM2B_PUBLIC_KEY_RSA_t sig;
};
typedef struct TPMS_SIGNATURE_RSA TPMS_SIGNATURE_RSA_t;
/* Definition of Types for RSA Signature */
typedef TPMS_SIGNATURE_RSA_t TPMS_SIGNATURE_RSASSA_t;
typedef TPMS_SIGNATURE_RSA_t TPMS_SIGNATURE_RSAPSS_t;
/* TPMS_SIGNATURE_ECC Structure */
struct TPMS_SIGNATURE_ECC {
TPMI_ALG_HASH_t hash;
TPM2B_ECC_PARAMETER_t signatureR;
TPM2B_ECC_PARAMETER_t signatureS;
};
typedef struct TPMS_SIGNATURE_ECC TPMS_SIGNATURE_ECC_t;
/* Definition of Types for ECC TPMS_SIGNATURE_ECC */
typedef TPMS_SIGNATURE_ECC_t TPMS_SIGNATURE_ECDSA_t;
typedef TPMS_SIGNATURE_ECC_t TPMS_SIGNATURE_ECDAA_t;
typedef TPMS_SIGNATURE_ECC_t TPMS_SIGNATURE_SM2_t;
typedef TPMS_SIGNATURE_ECC_t TPMS_SIGNATURE_ECSCHNORR_t;
/* TPMU_SIGNATURE Structure */
union TPMU_SIGNATURE {
TPMS_SIGNATURE_RSASSA_t rsassa;
TPMS_SIGNATURE_RSAPSS_t rsapss;
TPMS_SIGNATURE_ECDSA_t ecdsa;
TPMS_SIGNATURE_ECDAA_t ecdaa;
TPMS_SIGNATURE_SM2_t sm2;
TPMS_SIGNATURE_ECSCHNORR_t ecschnorr;
TPMT_HA_t hmac;
TPMS_SCHEME_HASH_t any;
TPMS_EMPTY_t null;
};
typedef union TPMU_SIGNATURE TPMU_SIGNATURE_t;
/* TPMT_SIGNATURE Structure */
struct TPMT_SIGNATURE {
TPMI_ALG_SIG_SCHEME_t sigAlg;
TPMU_SIGNATURE_t signature;
};
typedef struct TPMT_SIGNATURE TPMT_SIGNATURE_t;
static inline TPMI_ALG_HASH_t
TPMT_SIGNATURE_get_hash_alg (TPMT_SIGNATURE_t *sig)
{
switch (sig->sigAlg)
{
case TPM_ALG_RSASSA:
return sig->signature.rsassa.hash;
case TPM_ALG_RSAPSS:
return sig->signature.rsapss.hash;
case TPM_ALG_ECDSA:
return sig->signature.ecdsa.hash;
case TPM_ALG_ECDAA:
return sig->signature.ecdaa.hash;
case TPM_ALG_SM2:
return sig->signature.sm2.hash;
case TPM_ALG_ECSCHNORR:
return sig->signature.ecschnorr.hash;
case TPM_ALG_HMAC:
return sig->signature.hmac.hashAlg;
default:
break;
}
return TPM_ALG_NULL;
}
/* TPMT_TK_VERIFIED Structure */
struct TPMT_TK_VERIFIED {
TPM_ST_t tag;
TPMI_RH_HIERARCHY_t hierarchy;
TPM2B_DIGEST_t digest;
};
typedef struct TPMT_TK_VERIFIED TPMT_TK_VERIFIED_t;
#endif /* ! GRUB_TPM2_INTERNAL_STRUCTS_HEADER */