From: Gary Lin via Grub-devel <grub-devel@gnu.org>
To: The development of GNU GRUB <grub-devel@gnu.org>
Cc: Gary Lin <glin@suse.com>, Daniel Kiper <daniel.kiper@oracle.com>,
mchang@suse.com, patrick.colp@oracle.com,
Stefan Berger <stefanb@linux.ibm.com>,
jejb@linux.ibm.com, Glenn Washburn <development@efficientek.com>
Subject: [PATCH v4 00/12] TPM2 key protector follow-up patches
Date: Fri, 21 Mar 2025 15:58:56 +0800 [thread overview]
Message-ID: <20250321075908.10523-1-glin@suse.com> (raw)
git: https://github.com/lcp/grub2/tree/tpm2-follow-up-v4
This patchset is the collection of several enhancements for TPM2 key
protector.
* Patch 1 introduces the PCR dump to help debugging policy fail.
* Patch 2 adds the new command to dump PCRs in GRUB shell and the
* documentation of the command.
* Patch 3 fixes a minor issue in tss2.
* Patch 4~7 extend the NV index mode to support 'NV index' handles
and TPM 2.0 Key File format.
- Thanks to James Bottomley for how to detect TPM 2.0 Key File format.
https://lists.gnu.org/archive/html/grub-devel/2024-11/msg00078.html
* Patch 8~11 update the test cases and the documentation for NV index
mode.
* Patch 12 documents the external packages needed for TPM2 key protector
tests.
v4:
- Updating the commit messages and the documentation
- Merging the tpm2_dump_pcr documentation patch
- Splitting the testcase patch into 3 smaller patches
- Documenting the extern packages needed for TPM2 key protector tests
v3:
- Amending the function names to make them more comprehensive
- Fixing a few more typos and the indentations
- Improving the document
v2:
- Amending the commit messages and the error messages
- Fixing the return values and the checks for 'bool'
- Removing 'policywrite' when defining the NV index handle
- Fixing the typo and the stray whitespace
- Removing grub_tpm2_flushcontext() from the functions to remove
the persistent handle and the NV index handle
- Avoiding one failure test case to stop the whole test
- Improving the document
Gary Lin (12):
tpm2_key_protector: dump PCRs on policy fail
tpm2_key_protector: Add 'tpm2_dump_pcr' command
tss2: Fix the missing authCommand
tss2: Add TPM 2.0 NV index commands
tpm2_key_protector: Unseal key from a buffer
tpm2_key_protector: Support NV index handles
util/grub-protect: Support NV index mode
tests/tpm2_key_protector_test: Simplify the NV index mode test
tests/tpm2_key_protector_test: Reset 'ret' on fail
tests/tpm2_key_protector_test: Add more NV index mode tests
docs: Update NV index mode of TPM2 key protector
INSTALL: Document the packages needed for TPM2 key protector tests
INSTALL | 1 +
docs/grub.texi | 214 +++++++++--
.../commands/tpm2_key_protector/module.c | 345 +++++++++++++++---
grub-core/lib/tss2/tpm2_cmd.c | 211 ++++++++++-
grub-core/lib/tss2/tpm2_cmd.h | 32 ++
grub-core/lib/tss2/tss2_mu.c | 39 ++
grub-core/lib/tss2/tss2_mu.h | 12 +
grub-core/lib/tss2/tss2_types.h | 6 +
tests/tpm2_key_protector_test.in | 155 +++-----
util/grub-protect.c | 343 ++++++++++++++---
10 files changed, 1120 insertions(+), 238 deletions(-)
Range-diff against v3:
1: cf2be1c66 ! 1: bbd534f6b tpm2_key_protector: dump PCRs on policy fail
@@ Commit message
The sample output:
- PCR Mismatching! Check firmware and bootloader before typing passphrase!
+ PCR Mismatch! Check firmware and bootloader before typing passphrase!
TPM PCR [sha256]:
- 00: 115c89bfa0e59e050cda5d2664031d225305f3582cf0c2afcb7c1f1ac2a7cf8d
- 01: 079b3eadca25e10248daea4b1d508e5cfb703db28386be809a0b375c0a0a80a5
- 02: 2cd8ec3de6a07e1fd39676100db57ba62372e820c19812fee55899f65746e192
- 03: 9423b585d4eac05c97a0c06bca8898ad0ca519a6b810dcb91129bcdc10f4b112
- 04: fa36bf5c9110d3891f040e2146d157484cd41123fa8faf4bc6b91db3d12b70ca
- 05: 13e9ea9e38e5258e6ee2b6ae94a3cece0137490ef95c65caaac10cdf5e1bc40d
- 06: 3ac10d749054a818806788f4e4eaa2fb4dd7d13ce0e99dc175145b63c34bb71c
- 07: a6657a60f77928cad614a7ad153ab9ae0bed48e33b70348ae11a26762002b3bc
- 08: 42e04f5bac1965535cb6bdb30c62bb199b1ba21d1ec6b22d0da159dfc925b8bb
- 09: 5c83e8be79d4a432e6d409610de389ee6f1ac0c193f38d84a9ff94f360bd458b
+ 00: 17401f37710984c1d8a03a81fff3ab567ae9291bac61e21715b890ee28879738
+ 01: 7a114329ba388445a96e8db2a072785937c1b7a8803ed7cc682b87f3ff3dd7a8
+ 02: 11c2776849e8e24b7d80c926cbc4257871bffa744dadfefd3ed049ce25143e05
+ 03: 6c33b362073e28e30b47302bbdd3e6f9cee4debca3a304e646f8c68245724350
+ 04: 62d38838483ecfd2484ee3a2e5450d8ca3b35fc72cda6a8c620f9f43521c37d1
+ 05: d8a85cb37221ab7d1f2cc5f554dbe0463acb6784b5b8dc3164ccaa66d8fff0e1
+ 06: 9262e37cbe71ed4daf815b4a4881fb7251c9d371092dde827557d5368121e10e
+ 07: 219d542233be492d62b079ffe46cf13396a8c27e520e88b08eaf2e6d3b7e70f5
+ 08: de1f61c973b673e505adebe0d7e8fb65fde6c24dd4ab4fbaff9e28b18df6ecd3
+ 09: c1de7274fa3e879a16d7e6e7629e3463d95f68adcfd17c477183846dccc41c89
10: 0000000000000000000000000000000000000000000000000000000000000000
11: 0000000000000000000000000000000000000000000000000000000000000000
12: 0000000000000000000000000000000000000000000000000000000000000000
13: 0000000000000000000000000000000000000000000000000000000000000000
- 14: 894dd8e4ca1bb62e055f674f9390a39c4643ebdd1014702feef000c47e36a003
+ 14: 9ab9ebe4879a7f4dd00c04f37e79cfd69d0dd7a8bcc6b01135525b67676a3e40
15: 0000000000000000000000000000000000000000000000000000000000000000
16: 0000000000000000000000000000000000000000000000000000000000000000
17: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
@@ Commit message
Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
+ Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
## grub-core/commands/tpm2_key_protector/module.c ##
@@ grub-core/commands/tpm2_key_protector/module.c: tpm2_protector_simple_policy_seq (const tpm2_protector_context_t *ctx,
2: 052089a84 ! 2: a0c949ba8 tpm2_key_protector: Add 'tpm2_dump_pcr' command
@@ Commit message
so the new 'tpm2_dump_pcr' command is added to print all PCRs of the
specified bank.
+ Also update the document for the new command.
+
Signed-off-by: Gary Lin <glin@suse.com>
Tested-by: Stefan Berger <stefanb@linux.ibm.com>
+ Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
+
+ ## docs/grub.texi ##
+@@ docs/grub.texi: you forget a command, you can run the command @command{help}
+ * test:: Check file types and compare values
+ * tpm2_key_protector_init:: Initialize the TPM2 key protector
+ * tpm2_key_protector_clear:: Clear the TPM2 key protector
++* tpm2_dump_pcr:: Dump TPM2 PCRs
+ * true:: Do nothing, successfully
+ * trust:: Add public key to list of trusted keys
+ * unset:: Unset an environment variable
+@@ docs/grub.texi: key and unseal it with the given PCR list and bank.
+ Clear the TPM2 key protector if previously initialized.
+ @end deffn
+
++@node tpm2_dump_pcr
++@subsection tpm2_dump_pcr
++
++@deffn Command tpm2_dump_pcr [@var{bank}]
++Print all PCRs of the specified TPM 2.0 @var{bank}. The supported banks are
++@samp{sha1}, @samp{sha256}, @samp{sha384}, and @samp{sha512}. If @var{bank}
++is not specified, @samp{sha256} is chosen by default.
++
++Since GRUB measures every command into PCR 8, invoking @command{tpm2_dump_pcr}
++also extends PCR 8, so PCR 8 will not be a stable value in GRUB shell.
++@end deffn
++
+ @node true
+ @subsection true
+
## grub-core/commands/tpm2_key_protector/module.c ##
@@ grub-core/commands/tpm2_key_protector/module.c: static grub_extcmd_t tpm2_protector_init_cmd;
3: 01f27df8a < -: --------- docs: Document tpm2_dump_pcr
4: 242483c87 ! 3: bbd4ad377 tss2: Fix the missing authCommand
@@ Commit message
Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
+ Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
## grub-core/lib/tss2/tpm2_cmd.c ##
@@ grub-core/lib/tss2/tpm2_cmd.c: grub_tpm2_readpublic (const TPMI_DH_OBJECT_t objectHandle,
5: 3f0aca8af = 4: d2fba3963 tss2: Add TPM 2.0 NV index commands
6: 733b8c507 ! 5: 9b7ebc818 tpm2_key_protector: Unseal key from a buffer
@@ Commit message
tpm2_key_protector: Unseal key from a buffer
Extract the logic to handle the file buffer from the SRK recover
- function to prepare to load the sealed key from the NV index handle.
+ function to prepare to load the sealed key from the NV index handle,
+ so the NV index mode can share the same code path in the later patch.
The SRK recover function now only reads the file and sends the file
- buffer to the new function. Besides this, the file format is detected
- automatically before unmarshalling the data, so there is no need to use
- the command option to specify the file format anymore. In other words,
- '--tpm2key' and '--keyfile' are the same now.
+ buffer to the new function.
+
+ Besides this, to avoid introducing more options for the NV index mode,
+ the file format is detected automatically before unmarshalling the data,
+ so there is no need to use the command option to specify the file format
+ anymore. In other words, '--tpm2key' and '--keyfile' are the same now.
+
+ Also update grub.text to address the change.
Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
+ ## docs/grub.texi ##
+@@ docs/grub.texi: options are @option{-T}, @option{-k}, @option{-a}, and @option{-s}. On the
+ other hand, the NV index-specific option is @option{-n}.
+
+ The key file for SRK mode can be supplied with either @option{-T} or
+-@option{-k}. The @option{-T} option is for the path to the key file in
+-TPM 2.0 Key File format. Since the parameters for the TPM commands are written
+-in the file, there is no need to set the PCR list(@option{-p}) and
+-bank(@option{-b}) when using the @option{-T} option. The @option{-k} option
+-is for the key file in the raw format, and the @option{-p} and @option{-b}
+-options are necessary for the non-default PCR list or bank. In general,
++@option{-k}. Those two options were used to distinguish the file formats but
++are same now. There are two supported file formats: raw format and TPM 2.0
++Key File format. When using the key file in the raw format, the @option{-p}
++and @option{-b} options are necessary for the non-default PCR list or bank.
++On the other hand, when using the key file in TPM 2.0 Key File format, the
++the parameters for the TPM commands are written in the file, and there is no
++need to set the PCR list(@option{-p}) and bank(@option{-b}). In general,
+ TPM 2.0 Key File format is preferred due to the simplified GRUB command
+ options and the authorized policy support
+
+
## grub-core/commands/tpm2_key_protector/module.c ##
@@ grub-core/commands/tpm2_key_protector/module.c: tpm2_protector_srk_read_file (const char *filepath, void **buffer, grub_size_t *
return err;
7: b92cfb4b0 ! 6: c78c78763 tpm2_key_protector: Support NV index handles
@@ Commit message
# tpm2_nvundefine -C o 0x1000000
Signed-off-by: Gary Lin <glin@suse.com>
+ Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
## grub-core/commands/tpm2_key_protector/module.c ##
@@ grub-core/commands/tpm2_key_protector/module.c: tpm2_protector_srk_recover (const tpm2_protector_context_t *ctx,
8: be4d93cb2 ! 7: 10eb6a6b0 util/grub-protect: Support NV index mode
@@ Commit message
types of TPM handles.
1. Persistent handle (0x81000000~0x81FFFFFF)
- TPM 2.0 Key File format (--tpm2key) is not supported due to the
- limitation of persistent handles. This 'grub-protect' command
- seals the key into the persistent handle 0x81000000.
+ Only the raw format is supported due to the limitation of persistent
+ handles. This 'grub-protect' command seals the key into the
+ persistent handle 0x81000000.
# grub-protect \
--protector=tpm2 \
@@ Commit message
--tpm2-evict \
--tpm2-nvindex=0x1000000
+ Also set and check the boolean variables with true/false instead of 1/0.
+
Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
9: 15bce58ed ! 8: 3d5836268 tests/tpm2_key_protector_test: Amend the NV index mode test
@@ Metadata
Author: Gary Lin <glin@suse.com>
## Commit message ##
- tests/tpm2_key_protector_test: Amend the NV index mode test
+ tests/tpm2_key_protector_test: Simplify the NV index mode test
Since 'grub-protect' already supports NV index mode, tpm2_seal_nv() is
replaced with one 'grub-protect' command to simplify the test script.
- Two more NV index test cases are also added to test key sealing and
- unsealing with the NV index handle 0x1000000.
-
- Also, there is a minor fix to reset 'ret' to 0 when a test case fails so
- that the other test cases could continue.
+ 'tpm2_evictcontrol' is also replaced with 'grub-protect --tpm2-evict'.
Signed-off-by: Gary Lin <glin@suse.com>
- Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
## tests/tpm2_key_protector_test.in ##
@@ tests/tpm2_key_protector_test.in: EOF
@@ tests/tpm2_key_protector_test.in: EOF
- echo "Failed to flush the transient handles: ${ret}" >&2
- return 1
- fi
-+tpm2_seal_unseal_nv() {
-+ handle_type="$1"
-+ key_type="$2"
-
+-
- # Seal the key into TPM
- tpm2_create -Q \
- -C "${primary_file}" \
@@ tests/tpm2_key_protector_test.in: EOF
- echo "Failed to flush the transient handles: ${ret}" >&2
- return 1
- fi
-+ extra_opt=""
-+ extra_grub_opt=""
-
+-
- tpm2_load -Q \
- -C "${primary_file}" \
- -u "${keypub_file}" \
@@ tests/tpm2_key_protector_test.in: EOF
- if [ "${ret}" -ne 0 ]; then
- echo "Failed to flush the transient handles: ${ret}" >&2
- return 1
-+ if [ "$handle_type" == "nvindex" ]; then
-+ nv_index="0x1000000"
-+ else
-+ nv_index="0x81000000"
- fi
-
+- fi
+-
- tpm2_evictcontrol -Q -C o -c "${sealing_ctx_file}" ${nv_index} || ret=$?
- if [ "${ret}" -ne 0 ]; then
- echo "Failed to store the sealed key into ${nv_index}: ${ret}" >&2
- return 1
-+ if [ "$key_type" == "tpm2key" ]; then
-+ extra_opt="--tpm2key"
-+ else
-+ extra_grub_opt="--pcrs=0,1"
- fi
-
+- fi
+-
- return 0
-}
-
--tpm2_seal_unseal_nv() {
-- nv_index="0x81000000"
+ tpm2_seal_unseal_nv() {
+ nv_index="0x81000000"
- pcr_list="sha256:0,1"
--
+
grub_cfg=${tpm2testdir}/testcase.cfg
# Seal the key into a NV index guarded by PCR 0 and 1
@@ tests/tpm2_key_protector_test.in: EOF
return 99
fi
- # Write the TPM unsealing script
- cat > ${grub_cfg} <<EOF
- loopback luks (host)${luksfile}
--tpm2_key_protector_init --mode=nv --nvindex=${nv_index} --pcrs=0,1
-+tpm2_key_protector_init --mode=nv --nvindex=${nv_index} ${extra_grub_opt}
- if cryptomount -a --protector tpm2; then
- cat (crypto0)+1
- fi
@@ tests/tpm2_key_protector_test.in: EOF
${grubshell} --timeout=${timeout} --emu-opts="-t ${tpm2dev}" < "${grub_cfg}" > "${testoutput}" || ret=$?
@@ tests/tpm2_key_protector_test.in: EOF
if [ "${ret}" -eq 0 ]; then
if ! grep -q "^${vtext}$" "${testoutput}"; then
-@@ tests/tpm2_key_protector_test.in: srktests+=("ECC transient fallback_srk")
- for i in "${!srktests[@]}"; do
- tpm2_seal_unseal ${srktests[$i]} || ret=$?
- if [ "${ret}" -eq 0 ]; then
-- echo "TPM2 [${srktests[$i]}]: PASS"
-+ echo "TPM2 [SRK][${srktests[$i]}]: PASS"
- elif [ "${ret}" -eq 1 ]; then
-- echo "TPM2 [${srktests[$i]}]: FAIL"
-+ echo "TPM2 [SRK][${srktests[$i]}]: FAIL"
-+ ret=0
- else
-- echo "Unexpected failure [${srktests[$i]}]" >&2
-+ echo "Unexpected failure [SRK][${srktests[$i]}]" >&2
- exit ${ret}
- fi
- done
-
--# Testcase for NV index mode
--tpm2_seal_unseal_nv || ret=$?
--if [ "${ret}" -eq 0 ]; then
-- echo "TPM2 [NV Index]: PASS"
--elif [ "${ret}" -eq 1 ]; then
-- echo "TPM2 [NV Index]: FAIL"
--else
-- echo "Unexpected failure [NV index]" >&2
-- exit ${ret}
--fi
-+# Testcases for NV index mode
-+declare -a nvtests=()
-+nvtests+=("persistent raw")
-+nvtests+=("nvindex raw")
-+nvtests+=("nvindex tpm2key")
-+
-+for i in "${!nvtests[@]}"; do
-+ tpm2_seal_unseal_nv ${nvtests[$i]} || ret=$?
-+ if [ "${ret}" -eq 0 ]; then
-+ echo "TPM2 [NV Index][${nvtests[$i]}]: PASS"
-+ elif [ "${ret}" -eq 1 ]; then
-+ echo "TPM2 [NV Index][${nvtests[$i]}]: FAIL"
-+ ret=0
-+ else
-+ echo "Unexpected failure [NV index][${nvtests[$i]}]" >&2
-+ exit ${ret}
-+ fi
-+done
-
- exit 0
-: --------- > 9: b835df89e tests/tpm2_key_protector_test: Reset 'ret' on fail
-: --------- > 10: 4c0cc50a5 tests/tpm2_key_protector_test: Add more NV index mode tests
10: b782d0bdb ! 11: 156c81422 docs: Update NV index mode of TPM2 key protector
@@ docs/grub.texi: When/After the shim or GRUB are updated, it only requires to run
+The range of persistent handles is from @kbd{0x81000000} to @kbd{0x81FFFFFF}.
+The persistent handle is designed to make TPM objects persistent through
+power cycles, and only TPM objects, such as RSA or EC keys, are accepted.
-+Thus, TPM 2.0 Key File format is not supported by persistent handles. The
-+following shows the @command{grub-protect} command to seal the disk key
-+@file{luks.key} into the persistent handle @kbd{0x81000000} with the PCRs
-+@kbd{0,2,4,7}.
++Thus, only the raw format is supported by persistent handles. The following
++shows the @command{grub-protect} command to seal the disk key @file{luks.key}
++into the persistent handle @kbd{0x81000000} with the PCRs @kbd{0,2,4,7}.
@example
-# @kbd{tpm2_createprimary -C o -g sha256 -G ecc -c primary.ctx}
-: --------- > 12: f47758510 INSTALL: Document the packages needed for TPM2 key protector tests
--
2.43.0
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
next reply other threads:[~2025-03-21 7:59 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-21 7:58 Gary Lin via Grub-devel [this message]
2025-03-21 7:58 ` [PATCH v4 01/12] tpm2_key_protector: dump PCRs on policy fail Gary Lin via Grub-devel
2025-03-21 7:58 ` [PATCH v4 02/12] tpm2_key_protector: Add 'tpm2_dump_pcr' command Gary Lin via Grub-devel
2025-03-21 7:58 ` [PATCH v4 03/12] tss2: Fix the missing authCommand Gary Lin via Grub-devel
2025-03-21 7:59 ` [PATCH v4 04/12] tss2: Add TPM 2.0 NV index commands Gary Lin via Grub-devel
2025-03-21 7:59 ` [PATCH v4 05/12] tpm2_key_protector: Unseal key from a buffer Gary Lin via Grub-devel
2025-03-25 16:01 ` Daniel Kiper via Grub-devel
2025-03-26 7:54 ` Gary Lin via Grub-devel
2025-03-21 7:59 ` [PATCH v4 06/12] tpm2_key_protector: Support NV index handles Gary Lin via Grub-devel
2025-03-21 7:59 ` [PATCH v4 07/12] util/grub-protect: Support NV index mode Gary Lin via Grub-devel
2025-03-26 16:14 ` Daniel Kiper via Grub-devel
2025-03-21 7:59 ` [PATCH v4 08/12] tests/tpm2_key_protector_test: Simplify the NV index mode test Gary Lin via Grub-devel
2025-03-24 14:21 ` Stefan Berger
2025-03-26 16:16 ` Daniel Kiper via Grub-devel
2025-03-21 7:59 ` [PATCH v4 09/12] tests/tpm2_key_protector_test: Reset 'ret' on fail Gary Lin via Grub-devel
2025-03-24 13:48 ` Stefan Berger
2025-03-24 14:29 ` Vladimir 'phcoder' Serbinenko
2025-03-24 14:35 ` Stefan Berger
2025-03-25 7:18 ` Gary Lin via Grub-devel
2025-03-21 7:59 ` [PATCH v4 10/12] tests/tpm2_key_protector_test: Add more NV index mode tests Gary Lin via Grub-devel
2025-03-24 14:19 ` Stefan Berger
2025-03-21 7:59 ` [PATCH v4 11/12] docs: Update NV index mode of TPM2 key protector Gary Lin via Grub-devel
2025-03-21 7:59 ` [PATCH v4 12/12] INSTALL: Document the packages needed for TPM2 key protector tests Gary Lin via Grub-devel
2025-03-26 16:19 ` Daniel Kiper via Grub-devel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250321075908.10523-1-glin@suse.com \
--to=grub-devel@gnu.org \
--cc=daniel.kiper@oracle.com \
--cc=development@efficientek.com \
--cc=glin@suse.com \
--cc=jejb@linux.ibm.com \
--cc=mchang@suse.com \
--cc=patrick.colp@oracle.com \
--cc=stefanb@linux.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.