]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
tpm2-util: Also retry unsealing after policy_pcr returns PCR_CHANGED
authorFabian Vogt <fvogt@suse.de>
Mon, 16 Dec 2024 18:08:13 +0000 (19:08 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 18 Dec 2024 12:34:55 +0000 (13:34 +0100)
It's not just Esys_Unseal that may fail due to PCR changes during the
session, but also Esys_PolicyPCR. Perform a retry in that case as well.

Fixes #35490

src/shared/tpm2-util.c

index 252136af3e13ec0e70a44e2c6684705f100450ad..4bd9fc65dd2394d29257ae9050441209a1a619ef 100644 (file)
@@ -4015,6 +4015,9 @@ int tpm2_policy_pcr(
                         ESYS_TR_NONE,
                         NULL,
                         pcr_selection);
+        if (rc == TPM2_RC_PCR_CHANGED)
+                return log_debug_errno(SYNTHETIC_ERRNO(EUCLEAN),
+                                       "Failed to add PCR policy to TPM: %s", sym_Tss2_RC_Decode(rc));
         if (rc != TSS2_RC_SUCCESS)
                 return log_debug_errno(SYNTHETIC_ERRNO(ENOTRECOVERABLE),
                                        "Failed to add PCR policy to TPM: %s", sym_Tss2_RC_Decode(rc));
@@ -5810,6 +5813,11 @@ int tpm2_unseal(Tpm2Context *c,
                                         !!pin,
                                         (shard == 1 || !iovec_is_set(pubkey)) ? pcrlock_policy : NULL,
                                         &policy_digest);
+                        if (r == -EUCLEAN && i > 0) {
+                                log_debug("A PCR value changed during the TPM2 policy session, restarting HMAC key unsealing (%u tries left).", i);
+                                retry = true;
+                                break;
+                        }
                         if (r < 0)
                                 return r;