Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package grub2 for openSUSE:Factory checked in at 2024-12-05 17:05:11 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/grub2 (Old) and /work/SRC/openSUSE:Factory/.grub2.new.28523 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "grub2" Thu Dec 5 17:05:11 2024 rev:343 rq:1228130 version:2.12 Changes: -------- --- /work/SRC/openSUSE:Factory/grub2/grub2.changes 2024-11-30 13:27:34.317020946 +0100 +++ /work/SRC/openSUSE:Factory/.grub2.new.28523/grub2.changes 2024-12-05 17:05:15.813107651 +0100 @@ -1,0 +2,22 @@ +Tue Dec 3 07:18:32 UTC 2024 - Gary Ching-Pang Lin <g...@suse.com> + +- Update the TPM2 patches to the upstream final version + * Update 0001-key_protector-Add-key-protectors-framework.patch + * Replace 0002-tpm2-Add-TPM-Software-Stack-TSS.patch with + grub2-add-tss2-support.patch + * Replace 0003-key_protector-Add-TPM2-Key-Protector.patch with + 0001-key_protector-Add-TPM2-Key-Protector.patch + * Replace 0005-util-grub-protect-Add-new-tool.patch with + 0001-util-grub-protect-Add-new-tool.patch + * Replace 0001-tpm2-Implement-NV-index.patch with + 0001-tpm2_key_protector-Implement-NV-index.patch + * Replace 0001-tpm2-Support-authorized-policy.patch with + 0001-tpm2_key_protector-Support-authorized-policy.patch +- Refresh the TPM2 related patches + * grub-read-pcr.patch + * 0001-tpm2-Add-extra-RSA-SRK-types.patch + * grub2-bsc1220338-key_protector-implement-the-blocklist.patch + * safe_tpm_pcr_snapshot.patch + * tpm-record-pcrs.patch + +------------------------------------------------------------------- Old: ---- 0001-tpm2-Implement-NV-index.patch 0001-tpm2-Support-authorized-policy.patch 0002-tpm2-Add-TPM-Software-Stack-TSS.patch 0003-key_protector-Add-TPM2-Key-Protector.patch 0005-util-grub-protect-Add-new-tool.patch New: ---- 0001-key_protector-Add-TPM2-Key-Protector.patch 0001-tpm2_key_protector-Implement-NV-index.patch 0001-tpm2_key_protector-Support-authorized-policy.patch 0001-util-grub-protect-Add-new-tool.patch grub2-add-tss2-support.patch BETA DEBUG BEGIN: Old: 0001-util-grub-protect-Add-new-tool.patch * Replace 0001-tpm2-Implement-NV-index.patch with 0001-tpm2_key_protector-Implement-NV-index.patch Old: 0001-tpm2_key_protector-Implement-NV-index.patch * Replace 0001-tpm2-Support-authorized-policy.patch with 0001-tpm2_key_protector-Support-authorized-policy.patch Old: * Update 0001-key_protector-Add-key-protectors-framework.patch * Replace 0002-tpm2-Add-TPM-Software-Stack-TSS.patch with grub2-add-tss2-support.patch Old: grub2-add-tss2-support.patch * Replace 0003-key_protector-Add-TPM2-Key-Protector.patch with 0001-key_protector-Add-TPM2-Key-Protector.patch Old: 0001-key_protector-Add-TPM2-Key-Protector.patch * Replace 0005-util-grub-protect-Add-new-tool.patch with 0001-util-grub-protect-Add-new-tool.patch BETA DEBUG END: BETA DEBUG BEGIN: New: * Replace 0003-key_protector-Add-TPM2-Key-Protector.patch with 0001-key_protector-Add-TPM2-Key-Protector.patch * Replace 0005-util-grub-protect-Add-new-tool.patch with New: * Replace 0001-tpm2-Implement-NV-index.patch with 0001-tpm2_key_protector-Implement-NV-index.patch * Replace 0001-tpm2-Support-authorized-policy.patch with New: * Replace 0001-tpm2-Support-authorized-policy.patch with 0001-tpm2_key_protector-Support-authorized-policy.patch - Refresh the TPM2 related patches New: * Replace 0005-util-grub-protect-Add-new-tool.patch with 0001-util-grub-protect-Add-new-tool.patch * Replace 0001-tpm2-Implement-NV-index.patch with New: * Replace 0002-tpm2-Add-TPM-Software-Stack-TSS.patch with grub2-add-tss2-support.patch * Replace 0003-key_protector-Add-TPM2-Key-Protector.patch with BETA DEBUG END: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ grub2.spec ++++++ --- /var/tmp/diff_new_pack.QBoIHh/_old 2024-12-05 17:05:20.009283373 +0100 +++ /var/tmp/diff_new_pack.QBoIHh/_new 2024-12-05 17:05:20.013283540 +0100 @@ -339,10 +339,10 @@ Patch148: 0001-Fix-infinite-boot-loop-on-headless-system-in-qemu.patch Patch149: 0001-ofdisk-improve-boot-time-by-lookup-boot-disk-first.patch Patch150: 0001-key_protector-Add-key-protectors-framework.patch -Patch151: 0002-tpm2-Add-TPM-Software-Stack-TSS.patch -Patch152: 0003-key_protector-Add-TPM2-Key-Protector.patch +Patch151: grub2-add-tss2-support.patch +Patch152: 0001-key_protector-Add-TPM2-Key-Protector.patch Patch153: 0004-cryptodisk-Support-key-protectors.patch -Patch154: 0005-util-grub-protect-Add-new-tool.patch +Patch154: 0001-util-grub-protect-Add-new-tool.patch Patch155: 0008-linuxefi-Use-common-grub_initrd_load.patch Patch156: 0009-Add-crypttab_entry-to-obviate-the-need-to-input-pass.patch Patch157: 0010-templates-import-etc-crypttab-to-grub.cfg.patch @@ -356,7 +356,7 @@ Patch165: 0004-ofpath-controller-name-update.patch Patch166: 0002-Mark-environmet-blocks-as-used-for-image-embedding.patch Patch167: grub2-increase-crypttab-path-buffer.patch -Patch170: 0001-tpm2-Support-authorized-policy.patch +Patch170: 0001-tpm2_key_protector-Support-authorized-policy.patch Patch171: 0001-tpm2-Add-extra-RSA-SRK-types.patch Patch174: 0001-clean-up-crypttab-and-linux-modules-dependency.patch Patch175: 0002-discard-cached-key-before-entering-grub-shell-and-ed.patch @@ -368,7 +368,7 @@ Patch181: 0001-font-Try-memdisk-fonts-with-the-same-name.patch Patch182: 0001-Make-grub.cfg-compatible-to-old-binaries.patch Patch183: grub2-change-bash-completion-dir.patch -Patch184: 0001-tpm2-Implement-NV-index.patch +Patch184: 0001-tpm2_key_protector-Implement-NV-index.patch Patch185: 0002-cryptodisk-Fallback-to-passphrase.patch Patch186: 0003-cryptodisk-wipe-out-the-cached-keys-from-protectors.patch Patch187: 0004-diskfilter-look-up-cryptodisk-devices-first.patch @@ -779,7 +779,7 @@ PXE_MODULES="tftp http" CRYPTO_MODULES="luks luks2 gcry_rijndael gcry_sha1 gcry_sha256 gcry_sha512 crypttab" %ifarch %{efi} -CD_MODULES="${CD_MODULES} chain efifwsetup efinet read tpm tpm2 memdisk tar squash4 xzio blscfg" +CD_MODULES="${CD_MODULES} chain efifwsetup efinet read tpm tss2 tpm2_key_protector memdisk tar squash4 xzio blscfg" PXE_MODULES="${PXE_MODULES} efinet" %else CD_MODULES="${CD_MODULES} net ofnet" @@ -877,7 +877,7 @@ %{?sbat_generation:--sbat sbat.csv} \ -d grub-core \ all_video boot font gfxmenu gfxterm gzio halt jpeg minicmd normal part_gpt png reboot video \ - fat tpm tpm2 memdisk tar squash4 xzio blscfg linux bli regexp loadenv test echo true sleep + fat tpm tss2 tpm2_key_protector memdisk tar squash4 xzio blscfg linux bli regexp loadenv test echo true sleep %endif %ifarch x86_64 aarch64 ++++++ 0003-key_protector-Add-TPM2-Key-Protector.patch -> 0001-key_protector-Add-TPM2-Key-Protector.patch ++++++ ++++ 2171 lines (skipped) ++++ between /work/SRC/openSUSE:Factory/grub2/0003-key_protector-Add-TPM2-Key-Protector.patch ++++ and /work/SRC/openSUSE:Factory/.grub2.new.28523/0001-key_protector-Add-TPM2-Key-Protector.patch ++++++ 0001-key_protector-Add-key-protectors-framework.patch ++++++ --- /var/tmp/diff_new_pack.QBoIHh/_old 2024-12-05 17:05:20.217292084 +0100 +++ /var/tmp/diff_new_pack.QBoIHh/_new 2024-12-05 17:05:20.225292418 +0100 @@ -1,7 +1,7 @@ -From bf09618c47c6632b763960e265436294ab98dd43 Mon Sep 17 00:00:00 2001 +From 1bc53f8fc980914132040670b85a010e094559ec Mon Sep 17 00:00:00 2001 From: Hernan Gatta <hega...@linux.microsoft.com> Date: Tue, 1 Feb 2022 05:02:53 -0800 -Subject: [PATCH 1/5] key_protector: Add key protectors framework +Subject: [PATCH] key_protector: Add key protectors framework A key protector encapsulates functionality to retrieve an unlocking key for a fully-encrypted disk from a specific source. A key protector @@ -19,17 +19,18 @@ Signed-off-by: Hernan Gatta <hega...@linux.microsoft.com> Signed-off-by: Gary Lin <g...@suse.com> Reviewed-by: Stefan Berger <stef...@linux.ibm.com> +Reviewed-by: Daniel Kiper <daniel.ki...@oracle.com> --- grub-core/Makefile.am | 1 + grub-core/Makefile.core.def | 5 +++ - grub-core/disk/key_protector.c | 78 ++++++++++++++++++++++++++++++++++ - include/grub/key_protector.h | 46 ++++++++++++++++++++ - 4 files changed, 130 insertions(+) + grub-core/disk/key_protector.c | 73 ++++++++++++++++++++++++++++++++++ + include/grub/key_protector.h | 47 ++++++++++++++++++++++ + 4 files changed, 126 insertions(+) create mode 100644 grub-core/disk/key_protector.c create mode 100644 include/grub/key_protector.h diff --git a/grub-core/Makefile.am b/grub-core/Makefile.am -index f18550c1c..9d3d5f519 100644 +index 1eda467e0..e50db8106 100644 --- a/grub-core/Makefile.am +++ b/grub-core/Makefile.am @@ -90,6 +90,7 @@ endif @@ -41,10 +42,10 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/term.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/time.h diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def -index bc893e547..4307b8e2d 100644 +index a38955e18..37f131ae2 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def -@@ -1302,6 +1302,11 @@ module = { +@@ -1282,6 +1282,11 @@ module = { common = disk/raid6_recover.c; }; @@ -58,13 +59,14 @@ common = disk/scsi.c; diff --git a/grub-core/disk/key_protector.c b/grub-core/disk/key_protector.c new file mode 100644 -index 000000000..b84afe1c7 +index 000000000..0d146c1c0 --- /dev/null +++ b/grub-core/disk/key_protector.c -@@ -0,0 +1,78 @@ +@@ -0,0 +1,73 @@ +/* + * 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 @@ -93,16 +95,14 @@ +grub_err_t +grub_key_protector_register (struct grub_key_protector *protector) +{ -+ if (protector == NULL || protector->name == NULL || grub_strlen (protector->name) == 0) -+ return GRUB_ERR_BAD_ARGUMENT; ++ if (protector == NULL || protector->name == NULL || protector->name[0] == '\0') ++ return grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid key protector for registration"); + -+ if (grub_key_protectors && -+ grub_named_list_find (GRUB_AS_NAMED_LIST (grub_key_protectors), -+ protector->name)) -+ return GRUB_ERR_BAD_ARGUMENT; ++ if (grub_key_protectors != NULL && ++ grub_named_list_find (GRUB_AS_NAMED_LIST (grub_key_protectors), protector->name) != NULL) ++ return grub_error (GRUB_ERR_BAD_ARGUMENT, "Key protector '%s' already registered", protector->name); + -+ grub_list_push (GRUB_AS_LIST_P (&grub_key_protectors), -+ GRUB_AS_LIST (protector)); ++ grub_list_push (GRUB_AS_LIST_P (&grub_key_protectors), GRUB_AS_LIST (protector)); + + return GRUB_ERR_NONE; +} @@ -111,7 +111,7 @@ +grub_key_protector_unregister (struct grub_key_protector *protector) +{ + if (protector == NULL) -+ return GRUB_ERR_BAD_ARGUMENT; ++ return grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid key protector for unregistration"); + + grub_list_remove (GRUB_AS_LIST (protector)); + @@ -125,30 +125,27 @@ + struct grub_key_protector *kp = NULL; + + if (grub_key_protectors == NULL) -+ return GRUB_ERR_OUT_OF_RANGE; ++ return grub_error (GRUB_ERR_OUT_OF_RANGE, "No key protector registered"); + -+ if (protector == NULL || grub_strlen (protector) == 0) -+ return GRUB_ERR_BAD_ARGUMENT; ++ if (protector == NULL || protector[0] == '\0') ++ return grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid key protector"); + -+ kp = grub_named_list_find (GRUB_AS_NAMED_LIST (grub_key_protectors), -+ protector); ++ kp = grub_named_list_find (GRUB_AS_NAMED_LIST (grub_key_protectors), protector); + if (kp == NULL) -+ return grub_error (GRUB_ERR_OUT_OF_RANGE, -+ N_("A key protector with name '%s' could not be found. " -+ "Is the name spelled correctly and is the " -+ "corresponding module loaded?"), protector); ++ return grub_error (GRUB_ERR_OUT_OF_RANGE, "Key protector '%s' not found", protector); + + return kp->recover_key (key, key_size); +} diff --git a/include/grub/key_protector.h b/include/grub/key_protector.h new file mode 100644 -index 000000000..6e6a6fb24 +index 000000000..00b15c13d --- /dev/null +++ b/include/grub/key_protector.h -@@ -0,0 +1,46 @@ +@@ -0,0 +1,47 @@ +/* + * 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 @@ -193,6 +190,6 @@ + +#endif /* ! GRUB_PROTECTOR_HEADER */ -- -2.35.3 +2.43.0 ++++++ 0001-tpm2-Add-extra-RSA-SRK-types.patch ++++++ --- /var/tmp/diff_new_pack.QBoIHh/_old 2024-12-05 17:05:20.285294931 +0100 +++ /var/tmp/diff_new_pack.QBoIHh/_new 2024-12-05 17:05:20.289295099 +0100 @@ -1,4 +1,4 @@ -From f41a45b080cb9c6f59879a3e23f9ec2380015a16 Mon Sep 17 00:00:00 2001 +From 5b4ecd408417249dec8bfc71a3c0b7ef1070d3fa Mon Sep 17 00:00:00 2001 From: Gary Lin <g...@suse.com> Date: Thu, 25 Apr 2024 16:21:45 +0800 Subject: [PATCH] tpm2: Add extra RSA SRK types @@ -8,16 +8,16 @@ Signed-off-by: Gary Lin <g...@suse.com> --- - grub-core/tpm2/args.c | 12 ++++++++++++ - grub-core/tpm2/module.c | 16 ++++++++++++++-- - util/grub-protect.c | 4 ++-- + grub-core/commands/tpm2_key_protector/args.c | 12 ++++++++++++ + grub-core/commands/tpm2_key_protector/module.c | 16 ++++++++++++++-- + util/grub-protect.c | 4 ++-- 3 files changed, 28 insertions(+), 4 deletions(-) -diff --git a/grub-core/tpm2/args.c b/grub-core/tpm2/args.c -index c11280ab9..d140364d2 100644 ---- a/grub-core/tpm2/args.c -+++ b/grub-core/tpm2/args.c -@@ -92,6 +92,18 @@ grub_tpm2_protector_parse_asymmetric (const char *value, +diff --git a/grub-core/commands/tpm2_key_protector/args.c b/grub-core/commands/tpm2_key_protector/args.c +index 48c39de01..b291793a7 100644 +--- a/grub-core/commands/tpm2_key_protector/args.c ++++ b/grub-core/commands/tpm2_key_protector/args.c +@@ -85,6 +85,18 @@ grub_tpm2_protector_parse_asymmetric (const char *value, srk_type->type = TPM_ALG_RSA; srk_type->detail.rsa_bits = 2048; } @@ -34,13 +34,13 @@ + srk_type->detail.rsa_bits = 4096; + } else - return grub_error (GRUB_ERR_OUT_OF_RANGE, - N_("Value '%s' is not a valid asymmetric key type"), -diff --git a/grub-core/tpm2/module.c b/grub-core/tpm2/module.c -index b754b38df..8b72ed6fa 100644 ---- a/grub-core/tpm2/module.c -+++ b/grub-core/tpm2/module.c -@@ -136,8 +136,8 @@ static const struct grub_arg_option grub_tpm2_protector_init_cmd_options[] = + return grub_error (GRUB_ERR_OUT_OF_RANGE, N_("value '%s' is not a valid asymmetric key type"), value); + +diff --git a/grub-core/commands/tpm2_key_protector/module.c b/grub-core/commands/tpm2_key_protector/module.c +index 74e79a545..ee16d7f15 100644 +--- a/grub-core/commands/tpm2_key_protector/module.c ++++ b/grub-core/commands/tpm2_key_protector/module.c +@@ -138,8 +138,8 @@ static const struct grub_arg_option tpm2_protector_init_cmd_options[] = .arg = NULL, .type = ARG_TYPE_STRING, .doc = @@ -51,18 +51,18 @@ }, /* NV Index-mode options */ { -@@ -541,6 +541,10 @@ srk_type_to_name (grub_srk_type_t srk_type) - { - case 2048: - return "RSA2048"; -+ case 3072: -+ return "RSA3072"; -+ case 4096: -+ return "RSA4096"; - } - } +@@ -517,6 +517,10 @@ srk_type_to_name (grub_srk_type_t srk_type) + return "ECC_NIST_P256"; + else if (srk_type.type == TPM_ALG_RSA && srk_type.detail.rsa_bits == 2048) + return "RSA2048"; ++ else if (srk_type.type == TPM_ALG_RSA && srk_type.detail.rsa_bits == 3072) ++ return "RSA3072"; ++ else if (srk_type.type == TPM_ALG_RSA && srk_type.detail.rsa_bits == 4096) ++ return "RSA4096"; -@@ -561,6 +565,14 @@ grub_tpm2_protector_load_key (const struct grub_tpm2_protector_context *ctx, + return "Unknown"; + } +@@ -535,6 +539,14 @@ tpm2_protector_load_key (const tpm2_protector_context_t *ctx, .type = TPM_ALG_ECC, .detail.ecc_curve = TPM_ECC_NIST_P256, }, @@ -78,21 +78,21 @@ .type = TPM_ALG_RSA, .detail.rsa_bits = 2048, diff --git a/util/grub-protect.c b/util/grub-protect.c -index 869f45861..00be03ca0 100644 +index 5b7e952f4..f1108f2c5 100644 --- a/util/grub-protect.c +++ b/util/grub-protect.c -@@ -199,8 +199,8 @@ static struct argp_option grub_protect_options[] = +@@ -202,8 +202,8 @@ static struct argp_option protect_options[] = .arg = "TYPE", .flags = 0, .doc = -- N_("The type of SRK: RSA (RSA2048) and ECC (ECC_NIST_P256)." +- N_("Set the type of SRK: RSA (RSA2048) and ECC (ECC_NIST_P256)." - "(default: ECC)"), -+ N_("The type of SRK: RSA (RSA2048), RSA3072, RSA4096, " ++ N_("Set the type of SRK: RSA (RSA2048), RSA3072, RSA4096, " + "and ECC (ECC_NIST_P256). (default: ECC)"), .group = 0 }, { -- -2.35.3 +2.43.0 ++++++ 0001-tpm2_key_protector-Implement-NV-index.patch ++++++ >From 53e24662523d033ae3506b73787b972ef332db36 Mon Sep 17 00:00:00 2001 From: Patrick Colp <patrick.c...@oracle.com> Date: Mon, 31 Jul 2023 07:01:45 -0700 Subject: [PATCH] tpm2_key_protector: Implement NV index Currently with the TPM2 protector, only SRK mode is supported and NV index support is just a stub. Implement the NV index option. Note: This only extends support on the unseal path. grub-protect has not been updated. tpm2-tools can be used to insert a key into the NV index. An example of inserting a key using tpm2-tools: # Get random key. tpm2_getrandom 32 > key.dat # Create primary object. tpm2_createprimary -C o -g sha256 -G ecc -c primary.ctx # Create policy object. `pcrs.dat` contains the PCR values to seal against. tpm2_startauthsession -S session.dat tpm2_policypcr -S session.dat -l sha256:7,11 -f pcrs.dat -L policy.dat tpm2_flushcontext session.dat # Seal key into TPM. cat key.dat | tpm2_create -C primary.ctx -u key.pub -r key.priv -L policy.dat -i- tpm2_load -C primary.ctx -u key.pub -r key.priv -n sealing.name -c sealing.ctx tpm2_evictcontrol -C o -c sealing.ctx 0x81000000 Then to unseal the key in grub, add this to grub.cfg: tpm2_key_protector_init --mode=nv --nvindex=0x81000000 --pcrs=7,11 cryptomount -u <UUID> --protector tpm2 Signed-off-by: Patrick Colp <patrick.c...@oracle.com> Signed-off-by: Gary Lin <g...@suse.com> Reviewed-by: Stefan Berger <stef...@linux.ibm.com> Reviewed-by: Daniel Kiper <daniel.ki...@oracle.com> --- .../commands/tpm2_key_protector/module.c | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/grub-core/commands/tpm2_key_protector/module.c b/grub-core/commands/tpm2_key_protector/module.c index 6b4b5d460..74e79a545 100644 --- a/grub-core/commands/tpm2_key_protector/module.c +++ b/grub-core/commands/tpm2_key_protector/module.c @@ -973,11 +973,26 @@ tpm2_protector_srk_recover (const tpm2_protector_context_t *ctx, } static grub_err_t -tpm2_protector_nv_recover (const tpm2_protector_context_t *ctx __attribute__ ((unused)), - grub_uint8_t **key __attribute__ ((unused)), - grub_size_t *key_size __attribute__ ((unused))) +tpm2_protector_nv_recover (const tpm2_protector_context_t *ctx, + grub_uint8_t **key, grub_size_t *key_size) { - return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, "NV Index mode is not implemented yet"); + TPM_HANDLE_t sealed_handle = ctx->nv; + tpm2key_policy_t policy_seq = NULL; + grub_err_t err; + + /* Create a basic policy sequence based on the given PCR selection */ + err = tpm2_protector_simple_policy_seq (ctx, &policy_seq); + if (err != GRUB_ERR_NONE) + goto exit; + + err = tpm2_protector_unseal (policy_seq, sealed_handle, key, key_size); + + exit: + grub_tpm2_flushcontext (sealed_handle); + + grub_tpm2key_free_policy_seq (policy_seq); + + return err; } static grub_err_t -- 2.43.0 ++++++ 0001-tpm2_key_protector-Support-authorized-policy.patch ++++++ >From 7ef1b9b357c803cb8e30bbbebd44494b2b5c9d09 Mon Sep 17 00:00:00 2001 From: Gary Lin <g...@suse.com> Date: Thu, 6 Apr 2023 16:00:25 +0800 Subject: [PATCH] tpm2_key_protector: Support authorized policy This commit handles the TPM2_PolicyAuthorize command from the key file in TPM 2.0 Key File format. TPM2_PolicyAuthorize is the essential command to support authorized policy which allows the users to sign TPM policies with their own keys. Per TPM 2.0 Key File(*1), CommandPolicy for TPM2_PolicyAuthorize comprises 'TPM2B_PUBLIC pubkey', 'TPM2B_DIGEST policy_ref', and 'TPMT_SIGNATURE signature'. To verify the signature, the current policy digest is hashed with the hash algorithm written in 'signature', and then 'signature' is verified with the hashed policy digest and 'pubkey'. Once TPM accepts 'signature', TPM2_PolicyAuthorize is invoked to authorize the signed policy. To create the key file with authorized policy, here are the pcr-oracle(*2) commands: # Generate the RSA key and create the authorized policy file $ pcr-oracle \ --rsa-generate-key \ --private-key policy-key.pem \ --auth authorized.policy \ create-authorized-policy 0,2,4,7,9 # Seal the secret with the authorized policy $ pcr-oracle \ --key-format tpm2.0 \ --auth authorized.policy \ --input disk-secret.txt \ --output sealed.key \ seal-secret # Sign the predicted PCR policy $ pcr-oracle \ --key-format tpm2.0 \ --private-key policy-key.pem \ --from eventlog \ --stop-event "grub-file=grub.cfg" \ --after \ --input sealed.key \ --output /boot/efi/efi/grub/sealed.tpm \ sign 0,2,4,7,9 Then specify the key file and the key protector to grub.cfg in the EFI system partition: tpm2_key_protector_init -a RSA --tpm2key=(hd0,gpt1)/efi/grub/sealed.tpm cryptomount -u <PART_UUID> -P tpm2 For any change in the boot components, just run the 'sign' command again to update the signature in sealed.tpm, and TPM can unseal the key file with the updated PCR policy. (*1) https://www.hansenpartnership.com/draft-bottomley-tpm2-keys.html (*2) https://github.com/okirch/pcr-oracle Signed-off-by: Gary Lin <g...@suse.com> Reviewed-by: Stefan Berger <stef...@linux.ibm.com> Reviewed-by: Daniel Kiper <daniel.ki...@oracle.com> --- .../commands/tpm2_key_protector/module.c | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/grub-core/commands/tpm2_key_protector/module.c b/grub-core/commands/tpm2_key_protector/module.c index 70d4d0df7..6b4b5d460 100644 --- a/grub-core/commands/tpm2_key_protector/module.c +++ b/grub-core/commands/tpm2_key_protector/module.c @@ -618,6 +618,73 @@ tpm2_protector_policypcr (TPMI_SH_AUTH_SESSION_t session, struct grub_tpm2_buffe return GRUB_ERR_NONE; } +static grub_err_t +tpm2_protector_policyauthorize (TPMI_SH_AUTH_SESSION_t session, struct grub_tpm2_buffer *cmd_buf) +{ + TPM2B_PUBLIC_t pubkey; + TPM2B_DIGEST_t policy_ref; + TPMT_SIGNATURE_t signature; + TPM2B_DIGEST_t pcr_policy; + TPM2B_DIGEST_t pcr_policy_hash; + TPMI_ALG_HASH_t sig_hash; + TPMT_TK_VERIFIED_t verification_ticket; + TPM_HANDLE_t pubkey_handle = 0; + TPM2B_NAME_t pubname; + TPM_RC_t rc; + grub_err_t err; + + grub_Tss2_MU_TPM2B_PUBLIC_Unmarshal (cmd_buf, &pubkey); + grub_Tss2_MU_TPM2B_DIGEST_Unmarshal (cmd_buf, &policy_ref); + grub_Tss2_MU_TPMT_SIGNATURE_Unmarshal (cmd_buf, &signature); + if (cmd_buf->error != 0) + return grub_error (GRUB_ERR_BAD_ARGUMENT, "failed to unmarshal the buffer for TPM2_PolicyAuthorize"); + + /* Retrieve Policy Digest */ + rc = grub_tpm2_policygetdigest (session, NULL, &pcr_policy, NULL); + if (rc != TPM_RC_SUCCESS) + return grub_error (GRUB_ERR_BAD_DEVICE, "failed to get policy digest (TPM2_PolicyGetDigest: 0x%x).", rc); + + /* Calculate the digest of the polcy for VerifySignature */ + sig_hash = TPMT_SIGNATURE_get_hash_alg (&signature); + if (sig_hash == TPM_ALG_NULL) + return grub_error (GRUB_ERR_BAD_ARGUMENT, "failed to get the hash algorithm of the signature"); + + rc = grub_tpm2_hash (NULL, (TPM2B_MAX_BUFFER_t *) &pcr_policy, sig_hash, + TPM_RH_NULL, &pcr_policy_hash, NULL, NULL); + if (rc != TPM_RC_SUCCESS) + return grub_error (GRUB_ERR_BAD_DEVICE, "failed to create PCR policy hash (TPM2_Hash: 0x%x)", rc); + + /* Load the public key */ + rc = grub_tpm2_loadexternal (NULL, NULL, &pubkey, TPM_RH_OWNER, &pubkey_handle, &pubname, NULL); + if (rc != TPM_RC_SUCCESS) + return grub_error (GRUB_ERR_BAD_DEVICE, "failed to load public key (TPM2_LoadExternal: 0x%x)", rc); + + /* Verify the signature against the public key and the policy digest */ + rc = grub_tpm2_verifysignature (pubkey_handle, NULL, &pcr_policy_hash, &signature, + &verification_ticket, NULL); + if (rc != TPM_RC_SUCCESS) + { + err = grub_error (GRUB_ERR_BAD_DEVICE, "failed to verify signature (TPM2_VerifySignature: 0x%x)", rc); + goto error; + } + + /* Authorize the signed policy with the public key and the verification ticket */ + rc = grub_tpm2_policyauthorize (session, NULL, &pcr_policy, &policy_ref, &pubname, + &verification_ticket, NULL); + if (rc != TPM_RC_SUCCESS) + { + err = grub_error (GRUB_ERR_BAD_DEVICE, "failed to authorize PCR policy (TPM2_PolicyAuthorize: 0x%x)", rc); + goto error; + } + + err = GRUB_ERR_NONE; + + error: + grub_tpm2_flushcontext (pubkey_handle); + + return err; +} + static grub_err_t tpm2_protector_enforce_policy (tpm2key_policy_t policy, TPMI_SH_AUTH_SESSION_t session) { @@ -636,6 +703,9 @@ tpm2_protector_enforce_policy (tpm2key_policy_t policy, TPMI_SH_AUTH_SESSION_t s case TPM_CC_PolicyPCR: err = tpm2_protector_policypcr (session, &buf); break; + case TPM_CC_PolicyAuthorize: + err = tpm2_protector_policyauthorize (session, &buf); + break; default: return grub_error (GRUB_ERR_BAD_ARGUMENT, "unknown TPM Command: 0x%x", policy->cmd_code); } -- 2.43.0 ++++++ 0005-util-grub-protect-Add-new-tool.patch -> 0001-util-grub-protect-Add-new-tool.patch ++++++ ++++ 1685 lines (skipped) ++++ between /work/SRC/openSUSE:Factory/grub2/0005-util-grub-protect-Add-new-tool.patch ++++ and /work/SRC/openSUSE:Factory/.grub2.new.28523/0001-util-grub-protect-Add-new-tool.patch ++++++ grub-read-pcr.patch ++++++ --- /var/tmp/diff_new_pack.QBoIHh/_old 2024-12-05 17:05:20.861319053 +0100 +++ /var/tmp/diff_new_pack.QBoIHh/_new 2024-12-05 17:05:20.889320226 +0100 @@ -1,5 +1,7 @@ ---- a/include/grub/tpm.h -+++ b/include/grub/tpm.h +Index: grub-2.12/include/grub/tpm.h +=================================================================== +--- grub-2.12.orig/include/grub/tpm.h ++++ grub-2.12/include/grub/tpm.h @@ -36,6 +36,12 @@ #define EV_IPL 0x0d @@ -13,7 +15,7 @@ grub_err_t grub_tpm_measure (unsigned char *buf, grub_size_t size, grub_uint8_t pcr, const char *description); int grub_tpm_present (void); -@@ -45,5 +51,7 @@ +@@ -45,5 +51,7 @@ grub_is_tpm_fail_fatal (void) { return grub_env_get_bool ("tpm_fail_fatal", false); } @@ -21,29 +23,32 @@ +void grub_tpm_digest_free (struct grub_tpm_digest *d); #endif ---- a/grub-core/commands/efi/tpm.c -+++ b/grub-core/commands/efi/tpm.c -@@ -24,6 +24,7 @@ - #include <grub/efi/efi.h> - #include <grub/efi/cc.h> - #include <grub/efi/tpm.h> -+#include <grub/tpm2/tpm2.h> - #include <grub/mm.h> +Index: grub-2.12/grub-core/commands/efi/tpm.c +=================================================================== +--- grub-2.12.orig/grub-core/commands/efi/tpm.c ++++ grub-2.12/grub-core/commands/efi/tpm.c +@@ -28,6 +28,8 @@ #include <grub/tpm.h> #include <grub/term.h> -@@ -186,6 +187,91 @@ + ++#include <tpm2_cmd.h> ++ + typedef TCG_PCR_EVENT grub_tpm_event_t; + + static grub_guid_t tpm_guid = EFI_TPM_GUID; +@@ -186,6 +188,91 @@ grub_tpm1_log_event (grub_efi_handle_t t return grub_efi_log_event_status (status); } +static void -+grub_tpm2_select_pcr(TPML_PCR_SELECTION *o, unsigned int pcrIndex, unsigned int algo) ++grub_tpm2_select_pcr (TPML_PCR_SELECTION_t *o, unsigned int pcrIndex, unsigned int algo) +{ -+ TPMS_PCR_SELECTION *pcr; ++ TPMS_PCR_SELECTION_t *pcr; + + pcr = &o->pcrSelections[o->count++]; + pcr->hash = algo; + pcr->sizeOfSelect = 3; -+ pcr->pcrSelect[TPM2_PCR_TO_SELECT(pcrIndex)] |= TPM2_PCR_TO_BIT(pcrIndex); ++ TPMS_PCR_SELECTION_SelectPCR (pcr, pcrIndex); +} + +struct grub_tpm_hash_info { @@ -77,10 +82,10 @@ +grub_tpm2_read_pcr (grub_int8_t pcrIndex, const char *algo, struct grub_tpm_digest **ret) +{ + const struct grub_tpm_hash_info *info; -+ TPML_PCR_SELECTION inSelection, outSelection; ++ TPML_PCR_SELECTION_t inSelection, outSelection; + grub_uint32_t pcrUpdateCounter; -+ TPML_DIGEST digests = { 0 }; -+ TPM2B_DIGEST *d; ++ TPML_DIGEST_t digests = { 0 }; ++ TPM2B_DIGEST_t *d; + struct grub_tpm_digest *result; + int rc; + @@ -92,7 +97,7 @@ + grub_memset(&outSelection, 0, sizeof(outSelection)); + grub_tpm2_select_pcr(&inSelection, pcrIndex, info->id); + -+ rc = TPM2_PCR_Read( ++ rc = grub_tpm2_pcr_read( + NULL, + &inSelection, + &pcrUpdateCounter, @@ -123,7 +128,7 @@ static grub_err_t grub_tpm2_log_event (grub_efi_handle_t tpm_handle, unsigned char *buf, grub_size_t size, grub_uint8_t pcr, -@@ -323,3 +409,26 @@ +@@ -323,3 +410,26 @@ grub_tpm_present (void) return grub_tpm2_present (tpm); } } @@ -150,17 +155,16 @@ + + return result; +} ---- a/include/grub/tpm2/tpm2.h -+++ b/include/grub/tpm2/tpm2.h -@@ -23,6 +23,10 @@ - #include <grub/tpm2/internal/structs.h> - #include <grub/tpm2/internal/functions.h> - -+/* Defined in: TCG TPM Specification, v1.59, Part 2, Section 10.6.1. */ -+#define TPM2_PCR_TO_SELECT(x) ((x) / 8) -+#define TPM2_PCR_TO_BIT(x) (1 << ((x) % 8)) -+ - /* Well-Known Windows SRK handle */ - #define TPM2_SRK_HANDLE 0x81000001 +Index: grub-2.12/grub-core/Makefile.core.def +=================================================================== +--- grub-2.12.orig/grub-core/Makefile.core.def ++++ grub-2.12/grub-core/Makefile.core.def +@@ -2606,6 +2606,7 @@ module = { + common = commands/tpm.c; + efi = commands/efi/tpm.c; + enable = efi; ++ cppflags = '-I$(srcdir)/lib/tss2'; + }; + module = { ++++++ grub2-add-tss2-support.patch ++++++ ++++ 4587 lines (skipped) ++++++ grub2-bsc1220338-key_protector-implement-the-blocklist.patch ++++++ --- /var/tmp/diff_new_pack.QBoIHh/_old 2024-12-05 17:05:21.225334297 +0100 +++ /var/tmp/diff_new_pack.QBoIHh/_new 2024-12-05 17:05:21.257335637 +0100 @@ -1,4 +1,4 @@ -From beb26b1be325ea55f3f9a230152d170a3faa85d5 Mon Sep 17 00:00:00 2001 +From 32e07f7b99a1dbae933f4d916b0342a82e7ccf35 Mon Sep 17 00:00:00 2001 From: Gary Lin <g...@suse.com> Date: Mon, 18 Mar 2024 14:53:11 +0800 Subject: [PATCH] key_protector: implement the blocklist @@ -15,11 +15,11 @@ include/grub/efi/api.h | 5 +++++ 2 files changed, 36 insertions(+) -diff --git a/grub-core/disk/key_protector.c b/grub-core/disk/key_protector.c -index b84afe1c7..3d630ca4f 100644 ---- a/grub-core/disk/key_protector.c -+++ b/grub-core/disk/key_protector.c -@@ -24,6 +24,10 @@ +Index: grub-2.12/grub-core/disk/key_protector.c +=================================================================== +--- grub-2.12.orig/grub-core/disk/key_protector.c ++++ grub-2.12/grub-core/disk/key_protector.c +@@ -25,6 +25,10 @@ GRUB_MOD_LICENSE ("GPLv3+"); @@ -30,7 +30,7 @@ struct grub_key_protector *grub_key_protectors = NULL; grub_err_t -@@ -54,11 +58,34 @@ grub_key_protector_unregister (struct grub_key_protector *protector) +@@ -53,11 +57,34 @@ grub_key_protector_unregister (struct gr return GRUB_ERR_NONE; } @@ -64,10 +64,10 @@ + grub_err_t err; if (grub_key_protectors == NULL) - return GRUB_ERR_OUT_OF_RANGE; -@@ -74,5 +101,9 @@ grub_key_protector_recover_key (const char *protector, grub_uint8_t **key, - "Is the name spelled correctly and is the " - "corresponding module loaded?"), protector); + return grub_error (GRUB_ERR_OUT_OF_RANGE, "No key protector registered"); +@@ -69,5 +96,9 @@ grub_key_protector_recover_key (const ch + if (kp == NULL) + return grub_error (GRUB_ERR_OUT_OF_RANGE, "Key protector '%s' not found", protector); + err = grub_key_protector_check_blocklist (); + if (err != GRUB_ERR_NONE) @@ -75,10 +75,10 @@ + return kp->recover_key (key, key_size); } -diff --git a/include/grub/efi/api.h b/include/grub/efi/api.h -index 7947cf592..975b90b09 100644 ---- a/include/grub/efi/api.h -+++ b/include/grub/efi/api.h +Index: grub-2.12/include/grub/efi/api.h +=================================================================== +--- grub-2.12.orig/include/grub/efi/api.h ++++ grub-2.12/include/grub/efi/api.h @@ -389,6 +389,11 @@ { 0x89, 0x29, 0x48, 0xbc, 0xd9, 0x0a, 0xd3, 0x1a } \ } @@ -91,7 +91,4 @@ struct grub_efi_sal_system_table { grub_uint32_t signature; --- -2.35.3 - ++++++ safe_tpm_pcr_snapshot.patch ++++++ --- /var/tmp/diff_new_pack.QBoIHh/_old 2024-12-05 17:05:23.965449044 +0100 +++ /var/tmp/diff_new_pack.QBoIHh/_new 2024-12-05 17:05:23.997450384 +0100 @@ -3,20 +3,21 @@ util/grub-install.c | 6 ++++-- 2 files changed, 40 insertions(+), 12 deletions(-) ---- a/grub-core/commands/tpm.c -+++ b/grub-core/commands/tpm.c -@@ -27,8 +27,10 @@ +Index: grub-2.12/grub-core/commands/tpm.c +=================================================================== +--- grub-2.12.orig/grub-core/commands/tpm.c ++++ grub-2.12/grub-core/commands/tpm.c +@@ -27,7 +27,9 @@ #include <grub/verify.h> #include <grub/dl.h> #include <grub/extcmd.h> +#ifdef GRUB_MACHINE_EFI - #include <grub/tpm2/tpm2.h> #include <grub/efi/efi.h> +#endif GRUB_MOD_LICENSE ("GPLv3+"); -@@ -97,12 +99,6 @@ +@@ -96,12 +98,6 @@ struct grub_file_verifier grub_tpm_verif .verify_string = grub_tpm_verify_string, }; @@ -29,7 +30,7 @@ static const struct grub_arg_option grub_tpm_record_pcrs_options[] = { { -@@ -118,6 +114,14 @@ +@@ -117,6 +113,14 @@ static const struct grub_arg_option grub {0, 0, 0, 0, 0, 0} }; @@ -44,7 +45,7 @@ static grub_err_t grub_tpm_parse_pcr_index (const char *word, const char **end_ret, unsigned int *index) { -@@ -269,6 +273,10 @@ +@@ -268,6 +272,10 @@ grub_tpm_record_pcrs (grub_extcmd_contex grub_size_t size = 0; int n, rv = 1; @@ -55,7 +56,7 @@ if (argc == 0) pcr_bitmask = GRUB2_PCR_BITMASK_DEFAULT; else -@@ -297,6 +305,18 @@ +@@ -296,6 +304,18 @@ out: return rv; } @@ -74,9 +75,11 @@ static grub_extcmd_t cmd; GRUB_MOD_INIT (tpm) ---- a/util/grub-install.c -+++ b/util/grub-install.c -@@ -1560,8 +1560,9 @@ +Index: grub-2.12/util/grub-install.c +=================================================================== +--- grub-2.12.orig/util/grub-install.c ++++ grub-2.12/util/grub-install.c +@@ -1574,8 +1574,9 @@ main (int argc, char *argv[]) grub_util_unlink (load_cfg); @@ -87,7 +90,7 @@ load_cfg_f = grub_util_fopen (load_cfg, "wb"); have_load_cfg = 1; fprintf (load_cfg_f, "tpm_record_pcrs 0-9\n"); -@@ -1569,7 +1570,8 @@ +@@ -1583,7 +1584,8 @@ main (int argc, char *argv[]) if (debug_image && debug_image[0]) { ++++++ tpm-record-pcrs.patch ++++++ --- /var/tmp/diff_new_pack.QBoIHh/_old 2024-12-05 17:05:24.145456582 +0100 +++ /var/tmp/diff_new_pack.QBoIHh/_new 2024-12-05 17:05:24.173457755 +0100 @@ -1,16 +1,17 @@ ---- a/grub-core/commands/tpm.c -+++ b/grub-core/commands/tpm.c -@@ -26,6 +26,9 @@ +Index: grub-2.12/grub-core/commands/tpm.c +=================================================================== +--- grub-2.12.orig/grub-core/commands/tpm.c ++++ grub-2.12/grub-core/commands/tpm.c +@@ -26,6 +26,8 @@ #include <grub/term.h> #include <grub/verify.h> #include <grub/dl.h> +#include <grub/extcmd.h> -+#include <grub/tpm2/tpm2.h> +#include <grub/efi/efi.h> GRUB_MOD_LICENSE ("GPLv3+"); -@@ -94,8 +97,214 @@ +@@ -94,8 +96,214 @@ struct grub_file_verifier grub_tpm_verif .verify_string = grub_tpm_verify_string, }; @@ -225,7 +226,7 @@ /* * Even though this now calls ibmvtpm's grub_tpm_present() from GRUB_MOD_INIT(), * it does seem to call it late enough in the initialization sequence so -@@ -109,6 +318,7 @@ +@@ -109,6 +317,7 @@ GRUB_MOD_INIT (tpm) GRUB_MOD_FINI (tpm) {