Commit 3dcd1566 authored by Stefan Berger's avatar Stefan Berger Committed by Jarkko Sakkinen

tpm: acpi: Check eventlog signature before using it

Check the eventlog signature before using it. This avoids using an
empty log, as may be the case when QEMU created the ACPI tables,
rather than probing the EFI log next. This resolves an issue where
the EFI log was empty since an empty ACPI log was used.

Cc: stable@vger.kernel.org
Fixes: 85467f63 ("tpm: Add support for event log pointer found in TPM2 ACPI table")
Signed-off-by: default avatarStefan Berger <stefanb@linux.ibm.com>
Reviewed-by: default avatarJarkko Sakkinen <jarkko@kernel.org>
Signed-off-by: default avatarJarkko Sakkinen <jarkko@kernel.org>
parent 48cff270
......@@ -41,6 +41,27 @@ struct acpi_tcpa {
};
};
/* Check that the given log is indeed a TPM2 log. */
static bool tpm_is_tpm2_log(void *bios_event_log, u64 len)
{
struct tcg_efi_specid_event_head *efispecid;
struct tcg_pcr_event *event_header;
int n;
if (len < sizeof(*event_header))
return false;
len -= sizeof(*event_header);
event_header = bios_event_log;
if (len < sizeof(*efispecid))
return false;
efispecid = (struct tcg_efi_specid_event_head *)event_header->event;
n = memcmp(efispecid->signature, TCG_SPECID_SIG,
sizeof(TCG_SPECID_SIG));
return n == 0;
}
/* read binary bios log */
int tpm_read_log_acpi(struct tpm_chip *chip)
{
......@@ -52,6 +73,7 @@ int tpm_read_log_acpi(struct tpm_chip *chip)
struct acpi_table_tpm2 *tbl;
struct acpi_tpm2_phy *tpm2_phy;
int format;
int ret;
log = &chip->log;
......@@ -112,6 +134,7 @@ int tpm_read_log_acpi(struct tpm_chip *chip)
log->bios_event_log_end = log->bios_event_log + len;
ret = -EIO;
virt = acpi_os_map_iomem(start, len);
if (!virt)
goto err;
......@@ -119,11 +142,19 @@ int tpm_read_log_acpi(struct tpm_chip *chip)
memcpy_fromio(log->bios_event_log, virt, len);
acpi_os_unmap_iomem(virt, len);
if (chip->flags & TPM_CHIP_FLAG_TPM2 &&
!tpm_is_tpm2_log(log->bios_event_log, len)) {
/* try EFI log next */
ret = -ENODEV;
goto err;
}
return format;
err:
kfree(log->bios_event_log);
log->bios_event_log = NULL;
return -EIO;
return ret;
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment