diff --git a/src/cryptsetup/cryptsetup-tokens/luks2-tpm2.c b/src/cryptsetup/cryptsetup-tokens/luks2-tpm2.c index 85fc12f09a..956487de77 100644 --- a/src/cryptsetup/cryptsetup-tokens/luks2-tpm2.c +++ b/src/cryptsetup/cryptsetup-tokens/luks2-tpm2.c @@ -109,6 +109,8 @@ int acquire_luks2_key( n_policy_hash, srk, ret_decrypted_key); + if (r == -EREMOTE) + return log_error_errno(r, "TPM key integrity check failed. Key enrolled in superblock most likely does not belong to this TPM."); if (r < 0) return log_error_errno(r, "Failed to unseal secret using TPM2: %m"); diff --git a/src/shared/creds-util.c b/src/shared/creds-util.c index 0f840ff61a..ca8e15d4c9 100644 --- a/src/shared/creds-util.c +++ b/src/shared/creds-util.c @@ -1355,6 +1355,8 @@ int decrypt_credential_and_warn( /* n_policy_hash= */ 1, /* srk= */ NULL, &tpm2_key); + if (r == -EREMOTE) + return log_error_errno(r, "TPM key integrity check failed. Key enrolled in superblock most likely does not belong to this TPM."); if (r < 0) return log_error_errno(r, "Failed to unseal secret using TPM2: %m"); #else diff --git a/src/shared/cryptsetup-tpm2.c b/src/shared/cryptsetup-tpm2.c index c1cd67bacd..d7f2e545fd 100644 --- a/src/shared/cryptsetup-tpm2.c +++ b/src/shared/cryptsetup-tpm2.c @@ -167,6 +167,8 @@ int acquire_tpm2_key( n_policy_hash, srk, ret_decrypted_key); + if (r == -EREMOTE) + return log_error_errno(r, "TPM key integrity check failed. Key enrolled in superblock most likely does not belong to this TPM."); if (r < 0) return log_error_errno(r, "Failed to unseal secret using TPM2: %m"); @@ -215,6 +217,8 @@ int acquire_tpm2_key( n_policy_hash, srk, ret_decrypted_key); + if (r == -EREMOTE) + return log_error_errno(r, "TPM key integrity check failed. Key enrolled in superblock most likely does not belong to this TPM."); if (r < 0) { log_error_errno(r, "Failed to unseal secret using TPM2: %m"); diff --git a/src/shared/tpm2-util.c b/src/shared/tpm2-util.c index 18194da3e7..6c2ec26a69 100644 --- a/src/shared/tpm2-util.c +++ b/src/shared/tpm2-util.c @@ -2283,6 +2283,9 @@ int tpm2_load( if (rc == TPM2_RC_LOCKOUT) return log_debug_errno(SYNTHETIC_ERRNO(ENOLCK), "TPM2 device is in dictionary attack lockout mode."); + if ((rc & ~(TPM2_RC_N_MASK|TPM2_RC_P)) == TPM2_RC_INTEGRITY) /* Return a recognizable error if this key does not belong to the local TPM */ + return log_debug_errno(SYNTHETIC_ERRNO(EREMOTE), + "Key invalid or does not belong to current TPM."); if (rc != TSS2_RC_SUCCESS) return log_debug_errno(SYNTHETIC_ERRNO(ENOTRECOVERABLE), "Failed to load key into TPM: %s", sym_Tss2_RC_Decode(rc));