Linux-Integrity Archive on lore.kernel.org
 help / color / Atom feed
* [PATCH v3 1/2] ima: support calculating the boot aggregate based on non-SHA1 algorithms
@ 2020-01-30 16:22 Mimi Zohar
  2020-01-30 16:22 ` [PATCH v3 2/2] ima: support calculating the boot_aggregate based on different TPM banks Mimi Zohar
  0 siblings, 1 reply; 7+ messages in thread
From: Mimi Zohar @ 2020-01-30 16:22 UTC (permalink / raw)
  To: linux-integrity
  Cc: Jerry Snitselaar, James Bottomley, linux-kernel, Mimi Zohar

The boot aggregate is a cumulative SHA1 hash over TPM registers 0 - 7.
NIST has depreciated the usage of SHA1 in most instances.  Instead of
continuing to use SHA1 to calculate the boot_aggregate, use the same
hash algorithm for reading the TPM PCRs as for calculating the boot
aggregate digest.  Preference is given to the configured IMA default
hash algorithm.

Although the IMA measurement list boot_aggregate template data contains
the hash algorithm followed by the digest, allowing verifiers (e.g.
attesttaion servers) to calculate and verify the boot_aggregate, the
verifiers might not have the knowledge of what constitutes a good value
based on a different hash algorithm.

Suggested-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Suggested-by: Roberto Sassu <roberto.sassu@huawei.com>  # using common alg
Signed-off-by: Mimi Zohar <zohar@linux.ibm.com>
---
 security/integrity/ima/ima_init.c | 41 ++++++++++++++++++++++++++++++++++-----
 1 file changed, 36 insertions(+), 5 deletions(-)

diff --git a/security/integrity/ima/ima_init.c b/security/integrity/ima/ima_init.c
index 195cb4079b2b..e79fdd8cc860 100644
--- a/security/integrity/ima/ima_init.c
+++ b/security/integrity/ima/ima_init.c
@@ -27,7 +27,7 @@ struct tpm_chip *ima_tpm_chip;
 /* Add the boot aggregate to the IMA measurement list and extend
  * the PCR register.
  *
- * Calculate the boot aggregate, a SHA1 over tpm registers 0-7,
+ * Calculate the boot aggregate, a hash over tpm registers 0-7,
  * assuming a TPM chip exists, and zeroes if the TPM chip does not
  * exist.  Add the boot aggregate measurement to the measurement
  * list and extend the PCR register.
@@ -49,18 +49,49 @@ static int __init ima_add_boot_aggregate(void)
 					     .filename = boot_aggregate_name };
 	int result = -ENOMEM;
 	int violation = 0;
+	int i;
 	struct {
 		struct ima_digest_data hdr;
-		char digest[TPM_DIGEST_SIZE];
+		char digest[TPM_MAX_DIGEST_SIZE];
 	} hash;
 
 	memset(iint, 0, sizeof(*iint));
 	memset(&hash, 0, sizeof(hash));
 	iint->ima_hash = &hash.hdr;
-	iint->ima_hash->algo = HASH_ALGO_SHA1;
-	iint->ima_hash->length = SHA1_DIGEST_SIZE;
-
+	iint->ima_hash->algo = ima_hash_algo;	/* preferred algorithm */
+	iint->ima_hash->length = hash_digest_size[ima_hash_algo];
+
+	/*
+	 * With TPM 2.0 hash agility, TPM chips could support multiple TPM
+	 * PCR banks, allowing firmware to configure and enable different
+	 * banks.  The SHA1 bank is not necessarily enabled.
+	 *
+	 * Use the same hash algorithm for reading the TPM PCRs as for
+	 * calculating the boot aggregate digest.  Preference is given to
+	 * the configured IMA default hash algorithm.  Otherwise, use the
+	 * TPM required banks - SHA256 for TPM 2.0, SHA1 for TPM 1.2.
+	 */
 	if (ima_tpm_chip) {
+		for (i = 0; i < ima_tpm_chip->nr_allocated_banks; i++) {
+			if (ima_hash_algo ==
+			    ima_tpm_chip->allocated_banks[i].crypto_id)
+				break;
+		}
+
+		/*
+		 * The IMA default hash algo is not an enabled TPM PCR
+		 * bank, use the TPM required bank.
+		 */
+		if (i == ima_tpm_chip->nr_allocated_banks) {
+			if (ima_tpm_chip->flags & TPM_CHIP_FLAG_TPM2) {
+				iint->ima_hash->algo = HASH_ALGO_SHA256;
+				iint->ima_hash->length = SHA256_DIGEST_SIZE;
+			} else {
+				iint->ima_hash->algo = HASH_ALGO_SHA1;
+				iint->ima_hash->length = SHA1_DIGEST_SIZE;
+			}
+		}
+
 		result = ima_calc_boot_aggregate(&hash.hdr);
 		if (result < 0) {
 			audit_cause = "hashing_error";
-- 
2.7.5


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, back to index

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-01-30 16:22 [PATCH v3 1/2] ima: support calculating the boot aggregate based on non-SHA1 algorithms Mimi Zohar
2020-01-30 16:22 ` [PATCH v3 2/2] ima: support calculating the boot_aggregate based on different TPM banks Mimi Zohar
2020-01-30 16:53   ` Lakshmi Ramasubramanian
2020-01-30 16:54   ` Roberto Sassu
2020-01-30 17:32     ` Mimi Zohar
2020-02-04 13:37   ` Roberto Sassu
2020-02-04 17:27     ` Mimi Zohar

Linux-Integrity Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-integrity/0 linux-integrity/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-integrity linux-integrity/ https://lore.kernel.org/linux-integrity \
		linux-integrity@vger.kernel.org
	public-inbox-index linux-integrity

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-integrity


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git