All of lore.kernel.org
 help / color / mirror / Atom feed
From: Roberto Sassu <roberto.sassu@huawei.com>
To: <jarkko.sakkinen@linux.intel.com>, <zohar@linux.ibm.com>,
	<david.safford@ge.com>, <monty.wiseman@ge.com>
Cc: <linux-integrity@vger.kernel.org>,
	<linux-security-module@vger.kernel.org>,
	<linux-kernel@vger.kernel.org>, <silviu.vlasceanu@huawei.com>,
	Roberto Sassu <roberto.sassu@huawei.com>
Subject: [PATCH v6 6/7] tpm: ensure that the output of PCR read contains the correct digest size
Date: Tue, 4 Dec 2018 09:21:37 +0100	[thread overview]
Message-ID: <20181204082138.24600-7-roberto.sassu@huawei.com> (raw)
In-Reply-To: <20181204082138.24600-1-roberto.sassu@huawei.com>

This patch protects against data corruption that could happen in the bus,
by checking that the digest size returned by the TPM during a PCR read
matches the size of the algorithm passed to tpm2_pcr_read().

This check is performed after information about the PCR banks has been
retrieved.

Signed-off-by: Roberto Sassu <roberto.sassu@huawei.com>
Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
---
 drivers/char/tpm/tpm2-cmd.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c
index a804f0b7126a..d6d29480348c 100644
--- a/drivers/char/tpm/tpm2-cmd.c
+++ b/drivers/char/tpm/tpm2-cmd.c
@@ -179,15 +179,28 @@ struct tpm2_pcr_read_out {
 int tpm2_pcr_read(struct tpm_chip *chip, u32 pcr_idx,
 		  struct tpm_digest *digest, u16 *digest_size_ptr)
 {
+	int i;
 	int rc;
 	struct tpm_buf buf;
 	struct tpm2_pcr_read_out *out;
 	u8 pcr_select[TPM2_PCR_SELECT_MIN] = {0};
 	u16 digest_size;
+	u16 expected_digest_size = 0;
 
 	if (pcr_idx >= TPM2_PLATFORM_PCR)
 		return -EINVAL;
 
+	if (!digest_size_ptr) {
+		for (i = 0; i < chip->nr_allocated_banks &&
+		     chip->allocated_banks[i].alg_id != digest->alg_id; i++)
+			;
+
+		if (i == chip->nr_allocated_banks)
+			return -EINVAL;
+
+		expected_digest_size = chip->allocated_banks[i].digest_size;
+	}
+
 	rc = tpm_buf_init(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_PCR_READ);
 	if (rc)
 		return rc;
@@ -207,7 +220,8 @@ int tpm2_pcr_read(struct tpm_chip *chip, u32 pcr_idx,
 
 	out = (struct tpm2_pcr_read_out *)&buf.data[TPM_HEADER_SIZE];
 	digest_size = be16_to_cpu(out->digest_size);
-	if (digest_size > sizeof(digest->digest)) {
+	if (digest_size > sizeof(digest->digest) ||
+	    (!digest_size_ptr && digest_size != expected_digest_size)) {
 		rc = -EINVAL;
 		goto out;
 	}
-- 
2.17.1


  parent reply	other threads:[~2018-12-04  8:27 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-04  8:21 [PATCH v6 0/7] tpm: retrieve digest size of unknown algorithms from TPM Roberto Sassu
2018-12-04  8:21 ` [PATCH v6 1/7] tpm: dynamically allocate the allocated_banks array Roberto Sassu
2018-12-04 23:18   ` Jarkko Sakkinen
2018-12-06 17:56     ` Roberto Sassu
2018-12-12 18:32       ` Jarkko Sakkinen
2018-12-13  8:14         ` Roberto Sassu
2018-12-11 21:01     ` Ken Goldman
2018-12-04  8:21 ` [PATCH v6 2/7] tpm: add _head suffix to tcg_efi_specid_event and tcg_pcr_event2 Roberto Sassu
2018-12-04 23:26   ` Jarkko Sakkinen
2018-12-09 12:10   ` Nayna Jain
2018-12-04  8:21 ` [PATCH v6 3/7] tpm: rename and export tpm2_digest and tpm2_algorithms Roberto Sassu
2018-12-04  8:21 ` [PATCH v6 4/7] tpm: modify tpm_pcr_read() definition to pass a TPM hash algorithm Roberto Sassu
2018-12-04 23:40   ` Jarkko Sakkinen
2018-12-05 20:31     ` Mimi Zohar
2018-12-06 19:49       ` Mimi Zohar
2018-12-07 14:51         ` Roberto Sassu
2018-12-09 20:32           ` Mimi Zohar
2018-12-10  7:55             ` Roberto Sassu
2018-12-06  8:14     ` Nayna Jain
2018-12-12 18:29       ` Jarkko Sakkinen
2018-12-09 12:04     ` Nayna Jain
2018-12-04  8:21 ` [PATCH v6 5/7] tpm: retrieve digest size of unknown algorithms with PCR read Roberto Sassu
2018-12-04 23:53   ` Jarkko Sakkinen
2018-12-06 18:00     ` Roberto Sassu
2018-12-12 18:16       ` Jarkko Sakkinen
2018-12-04  8:21 ` Roberto Sassu [this message]
2018-12-05  0:09   ` [PATCH v6 6/7] tpm: ensure that the output of PCR read contains the correct digest size Jarkko Sakkinen
2018-12-05  0:46     ` Jarkko Sakkinen
2018-12-06 18:07       ` Roberto Sassu
2018-12-12 18:18         ` Jarkko Sakkinen
2018-12-04  8:21 ` [PATCH v6 7/7] tpm: pass an array of tpm_bank_list structures to tpm_pcr_extend() Roberto Sassu
2018-12-05  0:14   ` Jarkko Sakkinen
2018-12-06 18:09     ` Roberto Sassu
2018-12-12 18:25       ` Jarkko Sakkinen
2018-12-06 18:38     ` Roberto Sassu
2018-12-12 18:27       ` Jarkko Sakkinen
2018-12-13  7:57         ` Roberto Sassu
2018-12-14  7:58           ` Jarkko Sakkinen
2018-12-05  0:21 ` [PATCH v6 0/7] tpm: retrieve digest size of unknown algorithms from TPM Jarkko Sakkinen
2018-12-05  0:23   ` Jarkko Sakkinen

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=20181204082138.24600-7-roberto.sassu@huawei.com \
    --to=roberto.sassu@huawei.com \
    --cc=david.safford@ge.com \
    --cc=jarkko.sakkinen@linux.intel.com \
    --cc=linux-integrity@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-security-module@vger.kernel.org \
    --cc=monty.wiseman@ge.com \
    --cc=silviu.vlasceanu@huawei.com \
    --cc=zohar@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.