Signed-off-by: Yann Diorcet <diorcet.y...@gmail.com> --- grub-core/Makefile.core.def | 1 + grub-core/lib/tss2/tss2_iesys.c | 114 ++++++++++++++++++++++++++++++ grub-core/lib/tss2/tss2_iesys.h | 41 +++++++++++ grub-core/lib/tss2/tss2_mu.c | 15 ++++ grub-core/lib/tss2/tss2_mu.h | 8 +++ grub-core/lib/tss2/tss2_structs.h | 41 +++++++++++ grub-core/lib/tss2/tss2_types.h | 22 ++++++ 7 files changed, 242 insertions(+) create mode 100644 grub-core/lib/tss2/tss2_iesys.c create mode 100644 grub-core/lib/tss2/tss2_iesys.h
diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def index f6d312033..9a5a88884 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def @@ -2561,6 +2561,7 @@ module = { name = tss2; common = lib/tss2/buffer.c; common = lib/tss2/tss2_mu.c; + common = lib/tss2/tss2_iesys.c; common = lib/tss2/tpm2_cmd.c; common = lib/tss2/tss2.c; efi = lib/efi/tcg2.c; diff --git a/grub-core/lib/tss2/tss2_iesys.c b/grub-core/lib/tss2/tss2_iesys.c new file mode 100644 index 000000000..ce59c3be3 --- /dev/null +++ b/grub-core/lib/tss2/tss2_iesys.c @@ -0,0 +1,114 @@ +/* + * GRUB -- GRand Unified Bootloader + * 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 <http://www.gnu.org/licenses/>. + */ + +#include <grub/mm.h> +#include <grub/misc.h> + +#include <tss2_mu.h> +#include <tss2_iesys.h> + +void +grub_Tss2_iesys_MU_IESYSC_PARAM_ENCRYPT_Unmarshal(grub_tpm2_buffer_t buffer, TPM_IESYSC_PARAM_ENCRYPT_t *p) +{ + grub_tpm2_buffer_unpack_u32 (buffer, (grub_uint32_t*)p); + if (*p != TPM_ENCRYPT && *p != TPM_NO_ENCRYPT) + { + buffer->error = 1; + } +} + +void +grub_Tss2_iesys_MU_IESYSC_PARAM_DECRYPT_Unmarshal(grub_tpm2_buffer_t buffer, TPM_IESYSC_PARAM_DECRYPT_t *p) +{ + grub_tpm2_buffer_unpack_u32 (buffer, (grub_uint32_t*)p); + if (*p != TPM_DECRYPT && *p != TPM_NO_DECRYPT) + { + buffer->error = 1; + } +} + +void +grub_Tss2_iesys_MU_IESYSC_TYPE_POLICY_AUTH_Unmarshal(grub_tpm2_buffer_t buffer, TPM_IESYSC_TYPE_POLICY_AUTH_t *p) +{ + grub_tpm2_buffer_unpack_u32 (buffer, (grub_uint32_t*)p); + if (*p != TPM_POLICY_PASSWORD && *p != TPM_POLICY_AUTH && *p != TPM_NO_POLICY_AUTH) + { + buffer->error = 1; + } +} + +static void +grub_Tss2_iesys_MU_BYTE_array_Unmarshal(grub_tpm2_buffer_t buffer, grub_uint16_t size, char *p, grub_uint16_t bound) +{ + if (size > bound) + { + buffer->error = 1; + return; + } + grub_tpm2_buffer_unpack (buffer, &p, size); +} + +void +grub_Tss2_IESYS_SESSION_Unmarshal(grub_tpm2_buffer_t buffer, TPM_IESYS_SESSION_t *p) +{ + grub_Tss2_MU_TPM2B_NAME_Unmarshal(buffer, &p->bound_entity); + grub_Tss2_MU_TPM2B_ENCRYPTED_SECRET_Unmarshal(buffer, &p->encryptedSalt); + grub_Tss2_MU_TPM2B_DATA_Unmarshal(buffer, &p->salt); + grub_Tss2_MU_TPMT_SYM_DEF_Unmarshal(buffer, &p->symmetric); + grub_tpm2_buffer_unpack_u16 (buffer, &p->authHash); + grub_Tss2_MU_TPM2B_DIGEST_Unmarshal(buffer, &p->sessionKey); + grub_tpm2_buffer_unpack_u8 (buffer, &p->sessionType); + grub_tpm2_buffer_unpack_u8 (buffer, ((grub_uint8_t *) &p->sessionAttributes)); + grub_Tss2_MU_TPM2B_NONCE_Unmarshal(buffer, &p->nonceCaller); + grub_Tss2_MU_TPM2B_NONCE_Unmarshal(buffer, &p->nonceTPM); + grub_Tss2_iesys_MU_IESYSC_PARAM_ENCRYPT_Unmarshal(buffer, &p->encrypt); + grub_Tss2_iesys_MU_IESYSC_PARAM_DECRYPT_Unmarshal(buffer, &p->decrypt); + grub_Tss2_iesys_MU_IESYSC_TYPE_POLICY_AUTH_Unmarshal(buffer, &p->type_policy_session); + grub_tpm2_buffer_unpack_u16(buffer, &p->sizeSessionValue); + grub_Tss2_iesys_MU_BYTE_array_Unmarshal(buffer, p->sizeSessionValue, &p->sessionValue[0], sizeof(p->sessionValue)); + grub_tpm2_buffer_unpack_u16(buffer, &p->sizeHmacValue); +} + +static void +grub_Tss2_IESYS_RSRC_UNION_Unmarshal(grub_tpm2_buffer_t buffer, grub_uint32_t selector, TPM_IESYS_RSRC_UNION_t *p) +{ + switch (selector) { + case TPM_IESYSC_KEY_RSRC: + grub_Tss2_MU_TPM2B_PUBLIC_Unmarshal(buffer, &p->rsrc_key_pub); + break; + case TPM_IESYSC_NV_RSRC: + grub_Tss2_MU_TPM2B_NV_PUBLIC_Unmarshal(buffer, &p->rsrc_nv_pub); + break; + case TPM_IESYSC_SESSION_RSRC: + grub_Tss2_IESYS_SESSION_Unmarshal(buffer, &p->rsrc_session); + break; + case TPM_IESYSC_WITHOUT_MISC_RSRC: + break; + default: + buffer->error = 1; + }; +} + +void +grub_Tss2_IESYS_RESOURCE_Unmarshal(grub_tpm2_buffer_t buffer, TPM_IESYS_RESOURCE_t *p) +{ + grub_tpm2_buffer_unpack_u32 (buffer, &p->handle); + grub_Tss2_MU_TPM2B_NAME_Unmarshal (buffer, &p->name); + grub_tpm2_buffer_unpack_u32 (buffer, &p->rsrcType); + grub_Tss2_IESYS_RSRC_UNION_Unmarshal(buffer, p->rsrcType, &p->misc); +} \ No newline at end of file diff --git a/grub-core/lib/tss2/tss2_iesys.h b/grub-core/lib/tss2/tss2_iesys.h new file mode 100644 index 000000000..0606a13cf --- /dev/null +++ b/grub-core/lib/tss2/tss2_iesys.h @@ -0,0 +1,41 @@ +/* + * GRUB -- GRand Unified Bootloader + * 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 <http://www.gnu.org/licenses/>. + */ + +#ifndef GRUB_TPM2_IESYS_HEADER +#define GRUB_TPM2_IESYS_HEADER 1 + +#include <tss2_buffer.h> +#include <tss2_structs.h> + +void +grub_Tss2_iesys_MU_IESYSC_PARAM_ENCRYPT_Unmarshal(grub_tpm2_buffer_t buffer, TPM_IESYSC_PARAM_ENCRYPT_t *p); + +void +grub_Tss2_iesys_MU_IESYSC_PARAM_DECRYPT_Unmarshal(grub_tpm2_buffer_t buffer, TPM_IESYSC_PARAM_DECRYPT_t *p); + +void +grub_Tss2_iesys_MU_IESYSC_TYPE_POLICY_AUTH_Unmarshal(grub_tpm2_buffer_t buffer, TPM_IESYSC_TYPE_POLICY_AUTH_t *p); + +void +grub_Tss2_IESYS_SESSION_Unmarshal(grub_tpm2_buffer_t buffer, TPM_IESYS_SESSION_t *p); + +void +grub_Tss2_IESYS_RESOURCE_Unmarshal(grub_tpm2_buffer_t buffer, TPM_IESYS_RESOURCE_t *p); + + +#endif /* ! GRUB_TPM2_IESYS_HEADER */ diff --git a/grub-core/lib/tss2/tss2_mu.c b/grub-core/lib/tss2/tss2_mu.c index 816e5b37f..495899118 100644 --- a/grub-core/lib/tss2/tss2_mu.c +++ b/grub-core/lib/tss2/tss2_mu.c @@ -622,6 +622,21 @@ __Tss2_MU_TPM2B_BUFFER_Unmarshal (grub_tpm2_buffer_t buffer, #define TPM2B_BUFFER_UNMARSHAL(buffer, type, data) \ __Tss2_MU_TPM2B_BUFFER_Unmarshal(buffer, (TPM2B_t *)data, sizeof(type) - sizeof(grub_uint16_t)) +void +grub_Tss2_MU_TPM2B_ENCRYPTED_SECRET_Unmarshal (grub_tpm2_buffer_t buffer, TPM2B_ENCRYPTED_SECRET_t *encrypted_secret) +{ + TPM2B_BUFFER_UNMARSHAL (buffer, TPM2B_ENCRYPTED_SECRET_t, encrypted_secret); +} + +extern void +grub_Tss2_MU_TPMT_SYM_DEF_Unmarshal (grub_tpm2_buffer_t buffer, + TPMT_SYM_DEF_t *p) +{ + grub_tpm2_buffer_unpack_u16 (buffer, &p->algorithm); + grub_Tss2_MU_TPMU_SYM_KEY_BITS_Unmarshal (buffer, p->algorithm, &p->keyBits); + grub_Tss2_MU_TPMU_SYM_MODE_Unmarshal (buffer, p->algorithm, &p->mode); +} + void grub_Tss2_MU_TPMS_AUTH_RESPONSE_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_AUTH_RESPONSE_t *p) diff --git a/grub-core/lib/tss2/tss2_mu.h b/grub-core/lib/tss2/tss2_mu.h index 6440de57c..ef29ba91c 100644 --- a/grub-core/lib/tss2/tss2_mu.h +++ b/grub-core/lib/tss2/tss2_mu.h @@ -201,6 +201,14 @@ extern void grub_Tss2_MU_TPM2B_NV_PUBLIC_Marshal (grub_tpm2_buffer_t buffer, const TPM2B_NV_PUBLIC_t *p); +extern void +grub_Tss2_MU_TPM2B_ENCRYPTED_SECRET_Unmarshal (grub_tpm2_buffer_t buffer, + TPM2B_ENCRYPTED_SECRET_t *encrypted_secret); + +extern void +grub_Tss2_MU_TPMT_SYM_DEF_Unmarshal (grub_tpm2_buffer_t buffer, + TPMT_SYM_DEF_t *p); + extern void grub_Tss2_MU_TPMS_AUTH_RESPONSE_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_AUTH_RESPONSE_t *p); diff --git a/grub-core/lib/tss2/tss2_structs.h b/grub-core/lib/tss2/tss2_structs.h index ca33db3ec..8eb6c227e 100644 --- a/grub-core/lib/tss2/tss2_structs.h +++ b/grub-core/lib/tss2/tss2_structs.h @@ -793,4 +793,45 @@ struct TPMT_TK_VERIFIED { }; typedef struct TPMT_TK_VERIFIED TPMT_TK_VERIFIED_t; + +/** Type for representing TPM-Session + */ +struct TPM_IESYS_SESSION { + TPM2B_NAME_t bound_entity; /**< Entity to which the session is bound */ + TPM2B_ENCRYPTED_SECRET_t encryptedSalt; /**< Encrypted salt which can be provided by application */ + TPM2B_DATA_t salt; /**< Salt computed if no encrypted salt is provided */ + TPMT_SYM_DEF_t symmetric; /**< Algorithm selection for parameter encryption */ + TPMI_ALG_HASH_t authHash; /**< Hashalg used for authorization */ + TPM2B_DIGEST_t sessionKey; /**< sessionKey used for KDFa to compute symKey */ + TPM_SE_t sessionType; /**< Type of the session (HMAC, Policy) */ + TPMA_SESSION_t sessionAttributes; /**< Flags which define the session behaviour */ + TPMA_SESSION_t origSessionAttributes; /**< Copy of flags which define the session behaviour */ + TPM2B_NONCE_t nonceCaller; /**< Nonce computed by the ESAPI for every session call */ + TPM2B_NONCE_t nonceTPM; /**< Nonce which is returned by the TPM for every session call */ + TPM_IESYSC_PARAM_ENCRYPT_t encrypt; /**< Indicate parameter encryption by the TPM */ + TPM_IESYSC_PARAM_DECRYPT_t decrypt; /**< Indicate parameter decryption by the TPM */ + TPM_IESYSC_TYPE_POLICY_AUTH_t type_policy_session; /**< Field to store markers for policy sessions */ + grub_uint16_t sizeSessionValue; /**< Size of sessionKey plus optionally authValue */ + char sessionValue [2*sizeof(TPMU_HA_t)]; /**< sessionKey || AuthValue */ + grub_uint16_t sizeHmacValue; /**< Size of sessionKey plus optionally authValue */ +}; +typedef struct TPM_IESYS_SESSION TPM_IESYS_SESSION_t; + +union TPM_IESYS_RSRC_UNION { + TPM2B_PUBLIC_t rsrc_key_pub; /**< Public info for key objects */ + TPM2B_NV_PUBLIC_t rsrc_nv_pub; /**< Public info for NV ram objects */ + TPM_IESYS_SESSION_t rsrc_session; /**< Internal esapi session information */ + TPMS_EMPTY_t rsrc_empty; /**< no specialized date for resource */ +}; +typedef union TPM_IESYS_RSRC_UNION TPM_IESYS_RSRC_UNION_t; + +struct TPM_IESYS_RESOURCE { + TPM_HANDLE_t handle; /**< Handle used by TPM */ + TPM2B_NAME_t name; /**< TPM name of the object */ + TPM_IESYSC_RESOURCE_TYPE_t rsrcType; /**< Selector for resource type */ + TPM_IESYS_RSRC_UNION_t misc; /**< Resource specific information */ +} ; + +typedef struct TPM_IESYS_RESOURCE TPM_IESYS_RESOURCE_t; + #endif /* ! GRUB_TPM2_INTERNAL_STRUCTS_HEADER */ diff --git a/grub-core/lib/tss2/tss2_types.h b/grub-core/lib/tss2/tss2_types.h index bddde7191..a44c49569 100644 --- a/grub-core/lib/tss2/tss2_types.h +++ b/grub-core/lib/tss2/tss2_types.h @@ -407,4 +407,26 @@ typedef TPM_HANDLE_t TPMI_RH_PROVISION_t; /* TPMI_RH_PROVISION_t Type */ typedef TPM_HANDLE_t TPMI_DH_PERSISTENT_t; +typedef grub_uint32_t TPM_IESYSC_RESOURCE_TYPE_t; + +typedef grub_uint32_t TPM_IESYSC_RESOURCE_TYPE_CONSTANT_t; +#define TPM_IESYSC_KEY_RSRC 1 /**< Tag for key resource */ +#define TPM_IESYSC_NV_RSRC 2 /**< Tag for NV Ram resource */ +#define TPM_IESYSC_SESSION_RSRC 3 /**< Tag for session resources */ +#define TPM_IESYSC_DEGRADED_SESSION_RSRC 4 /**< Tag for degraded session resources */ +#define TPM_IESYSC_WITHOUT_MISC_RSRC 0 /**< Tag for other resources, e.g. PCR register, hierarchies */ + +typedef grub_uint32_t TPM_IESYSC_PARAM_ENCRYPT_t; +#define TPM_ENCRYPT 1 /**< Parameter encryption by TPM */ +#define TPM_NO_ENCRYPT 0 /**< No parameter encryption by TPM */ + +typedef grub_uint32_t TPM_IESYSC_PARAM_DECRYPT_t; +#define TPM_DECRYPT 1 /**< Parameter decryption by TPM */ +#define TPM_NO_DECRYPT 0 /**< No parameter decryption by TPM */ + +typedef grub_uint32_t TPM_IESYSC_TYPE_POLICY_AUTH_t; +#define TPM_POLICY_PASSWORD 2 /**< Marker to include auth value of the authorized object */ +#define TPM_POLICY_AUTH 1 /**< Marker to include the auth value in the HMAC key */ +#define TPM_NO_POLICY_AUTH 0 /**< no special handling */ + #endif /* ! GRUB_TPM2_INTERNAL_TYPES_HEADER */ -- 2.39.5 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel