2020-01-30 16:24:26

by Mimi Zohar

[permalink] [raw]
Subject: [PATCH v3 1/2] ima: support calculating the boot aggregate based on non-SHA1 algorithms

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 <[email protected]>
Suggested-by: Roberto Sassu <[email protected]> # using common alg
Signed-off-by: Mimi Zohar <[email protected]>
---
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


2020-01-30 16:24:26

by Mimi Zohar

[permalink] [raw]
Subject: [PATCH v3 2/2] ima: support calculating the boot_aggregate based on different TPM banks

Calculating the boot_aggregate attempts to read the TPM SHA1 bank,
assuming it is always enabled. With TPM 2.0 hash agility, TPM chips
could support multiple TPM PCR banks, allowing firmware to configure and
enable different banks.

Instead of hard coding the TPM 2.0 bank hash algorithm used for calculating
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.

For TPM 1.2 SHA1 is the only supported hash algorithm.

Reported-by: Jerry Snitselaar <[email protected]>
Suggested-by: Roberto Sassu <[email protected]>
Signed-off-by: Mimi Zohar <[email protected]>
---
security/integrity/ima/ima_crypto.c | 45 ++++++++++++++++++++++++++++++++++++-
1 file changed, 44 insertions(+), 1 deletion(-)

diff --git a/security/integrity/ima/ima_crypto.c b/security/integrity/ima/ima_crypto.c
index 7967a6904851..a020aaefdea8 100644
--- a/security/integrity/ima/ima_crypto.c
+++ b/security/integrity/ima/ima_crypto.c
@@ -656,13 +656,34 @@ static void __init ima_pcrread(u32 idx, struct tpm_digest *d)
pr_err("Error Communicating to TPM chip\n");
}

+static enum hash_algo get_hash_algo(const char *algname)
+{
+ int i;
+
+ for (i = 0; i < HASH_ALGO__LAST; i++) {
+ if (strcmp(algname, hash_algo_name[i]) == 0)
+ break;
+ }
+
+ return i;
+}
+
/*
- * Calculate the boot aggregate hash
+ * The boot_aggregate is a cumulative hash over TPM registers 0 - 7. With
+ * TPM 1.2 the boot_aggregate was based on reading the SHA1 PCRs, but with
+ * TPM 2.0 hash agility, TPM chips could support multiple TPM PCR banks,
+ * allowing firmware to configure and enable different banks.
+ *
+ * Knowing which TPM bank is read to calculate the boot_aggregate digest
+ * needs to be conveyed to a verifier. For this reason, use the same
+ * hash algorithm for reading the TPM PCRs as for calculating the boot
+ * aggregate digest as stored in the measurement list.
*/
static int __init ima_calc_boot_aggregate_tfm(char *digest,
struct crypto_shash *tfm)
{
struct tpm_digest d = { .alg_id = TPM_ALG_SHA1, .digest = {0} };
+ enum hash_algo crypto_id;
int rc;
u32 i;
SHASH_DESC_ON_STACK(shash, tfm);
@@ -673,6 +694,28 @@ static int __init ima_calc_boot_aggregate_tfm(char *digest,
if (rc != 0)
return rc;

+ crypto_id = get_hash_algo(crypto_shash_alg_name(tfm));
+ if (crypto_id == HASH_ALGO__LAST) {
+ pr_devel("unknown hash algorithm (%s), failing to read PCRs.\n",
+ crypto_shash_alg_name(tfm));
+ return 0;
+ }
+
+ for (i = 0; i < ima_tpm_chip->nr_allocated_banks; i++) {
+ if (ima_tpm_chip->allocated_banks[i].crypto_id == crypto_id) {
+ d.alg_id = ima_tpm_chip->allocated_banks[i].alg_id;
+ break;
+ }
+ }
+ if (i == ima_tpm_chip->nr_allocated_banks) {
+ pr_devel("TPM %s bank not allocated, failing to read PCRs.\n",
+ crypto_shash_alg_name(tfm));
+ return 0;
+ }
+
+ pr_devel("calculating the boot-aggregregate based on TPM bank: %04x\n",
+ d.alg_id);
+
/* cumulative sha1 over tpm registers 0-7 */
for (i = TPM_PCR0; i < TPM_PCR8; i++) {
ima_pcrread(i, &d);
--
2.7.5

2020-01-30 16:55:27

by Lakshmi Ramasubramanian

[permalink] [raw]
Subject: Re: [PATCH v3 2/2] ima: support calculating the boot_aggregate based on different TPM banks

On 1/30/2020 8:22 AM, Mimi Zohar wrote:

> +static enum hash_algo get_hash_algo(const char *algname)
> +{
> + int i;
> +
> + for (i = 0; i < HASH_ALGO__LAST; i++) {
> + if (strcmp(algname, hash_algo_name[i]) == 0)
> + break;
> + }
> +
> + return i;
> +}
> +

ima_digest_data is passed to ima_calc_boot_aggregate(). This struct
contains the hash_algo. Can that be passed to
ima_calc_boot_aggregate_tfm() instead of using the above function to get
the hash_algo?

-lakshmi

2020-01-30 16:56:21

by Roberto Sassu

[permalink] [raw]
Subject: RE: [PATCH v3 2/2] ima: support calculating the boot_aggregate based on different TPM banks

> -----Original Message-----
> From: [email protected] [mailto:linux-integrity-
> [email protected]] On Behalf Of Mimi Zohar
> Sent: Thursday, January 30, 2020 5:23 PM
> To: [email protected]
> Cc: Jerry Snitselaar <[email protected]>; James Bottomley
> <[email protected]>; linux-
> [email protected]; Mimi Zohar <[email protected]>
> Subject: [PATCH v3 2/2] ima: support calculating the boot_aggregate based
> on different TPM banks
>
> Calculating the boot_aggregate attempts to read the TPM SHA1 bank,
> assuming it is always enabled. With TPM 2.0 hash agility, TPM chips
> could support multiple TPM PCR banks, allowing firmware to configure and
> enable different banks.
>
> Instead of hard coding the TPM 2.0 bank hash algorithm used for calculating
> 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.
>
> For TPM 1.2 SHA1 is the only supported hash algorithm.
>
> Reported-by: Jerry Snitselaar <[email protected]>
> Suggested-by: Roberto Sassu <[email protected]>
> Signed-off-by: Mimi Zohar <[email protected]>
> ---
> security/integrity/ima/ima_crypto.c | 45
> ++++++++++++++++++++++++++++++++++++-
> 1 file changed, 44 insertions(+), 1 deletion(-)
>
> diff --git a/security/integrity/ima/ima_crypto.c
> b/security/integrity/ima/ima_crypto.c
> index 7967a6904851..a020aaefdea8 100644
> --- a/security/integrity/ima/ima_crypto.c
> +++ b/security/integrity/ima/ima_crypto.c
> @@ -656,13 +656,34 @@ static void __init ima_pcrread(u32 idx, struct
> tpm_digest *d)
> pr_err("Error Communicating to TPM chip\n");
> }
>
> +static enum hash_algo get_hash_algo(const char *algname)
> +{
> + int i;
> +
> + for (i = 0; i < HASH_ALGO__LAST; i++) {
> + if (strcmp(algname, hash_algo_name[i]) == 0)
> + break;
> + }
> +
> + return i;
> +}
> +
> /*
> - * Calculate the boot aggregate hash
> + * The boot_aggregate is a cumulative hash over TPM registers 0 - 7. With
> + * TPM 1.2 the boot_aggregate was based on reading the SHA1 PCRs, but
> with
> + * TPM 2.0 hash agility, TPM chips could support multiple TPM PCR banks,
> + * allowing firmware to configure and enable different banks.
> + *
> + * Knowing which TPM bank is read to calculate the boot_aggregate digest
> + * needs to be conveyed to a verifier. For this reason, use the same
> + * hash algorithm for reading the TPM PCRs as for calculating the boot
> + * aggregate digest as stored in the measurement list.
> */
> static int __init ima_calc_boot_aggregate_tfm(char *digest,
> struct crypto_shash *tfm)
> {
> struct tpm_digest d = { .alg_id = TPM_ALG_SHA1, .digest = {0} };
> + enum hash_algo crypto_id;
> int rc;
> u32 i;
> SHASH_DESC_ON_STACK(shash, tfm);
> @@ -673,6 +694,28 @@ static int __init ima_calc_boot_aggregate_tfm(char
> *digest,
> if (rc != 0)
> return rc;
>
> + crypto_id = get_hash_algo(crypto_shash_alg_name(tfm));

Wouldn't be better to determine the index of ima_tpm_chip->allocated_banks
in patch 1/2 and pass that index here, to avoid another search?

Roberto

HUAWEI TECHNOLOGIES Duesseldorf GmbH, HRB 56063
Managing Director: Li Peng, Li Jian, Shi Yanli

2020-01-30 17:34:55

by Mimi Zohar

[permalink] [raw]
Subject: Re: [PATCH v3 2/2] ima: support calculating the boot_aggregate based on different TPM banks

On Thu, 2020-01-30 at 16:54 +0000, Roberto Sassu wrote:
> > -----Original Message-----
> > From: [email protected] [mailto:linux-integrity-
> > [email protected]] On Behalf Of Mimi Zohar
> > Sent: Thursday, January 30, 2020 5:23 PM
> > To: [email protected]
> > Cc: Jerry Snitselaar <[email protected]>; James Bottomley
> > <[email protected]>; linux-
> > [email protected]; Mimi Zohar <[email protected]>
> > Subject: [PATCH v3 2/2] ima: support calculating the boot_aggregate based
> > on different TPM banks
> >
> > Calculating the boot_aggregate attempts to read the TPM SHA1 bank,
> > assuming it is always enabled. With TPM 2.0 hash agility, TPM chips
> > could support multiple TPM PCR banks, allowing firmware to configure and
> > enable different banks.
> >
> > Instead of hard coding the TPM 2.0 bank hash algorithm used for calculating
> > 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.
> >
> > For TPM 1.2 SHA1 is the only supported hash algorithm.
> >
> > Reported-by: Jerry Snitselaar <[email protected]>
> > Suggested-by: Roberto Sassu <[email protected]>
> > Signed-off-by: Mimi Zohar <[email protected]>
> > ---
> > security/integrity/ima/ima_crypto.c | 45
> > ++++++++++++++++++++++++++++++++++++-
> > 1 file changed, 44 insertions(+), 1 deletion(-)
> >
> > diff --git a/security/integrity/ima/ima_crypto.c
> > b/security/integrity/ima/ima_crypto.c
> > index 7967a6904851..a020aaefdea8 100644
> > --- a/security/integrity/ima/ima_crypto.c
> > +++ b/security/integrity/ima/ima_crypto.c
> > @@ -656,13 +656,34 @@ static void __init ima_pcrread(u32 idx, struct
> > tpm_digest *d)
> > pr_err("Error Communicating to TPM chip\n");
> > }
> >
> > +static enum hash_algo get_hash_algo(const char *algname)
> > +{
> > + int i;
> > +
> > + for (i = 0; i < HASH_ALGO__LAST; i++) {
> > + if (strcmp(algname, hash_algo_name[i]) == 0)
> > + break;
> > + }
> > +
> > + return i;
> > +}
> > +
> > /*
> > - * Calculate the boot aggregate hash
> > + * The boot_aggregate is a cumulative hash over TPM registers 0 - 7. With
> > + * TPM 1.2 the boot_aggregate was based on reading the SHA1 PCRs, but
> > with
> > + * TPM 2.0 hash agility, TPM chips could support multiple TPM PCR banks,
> > + * allowing firmware to configure and enable different banks.
> > + *
> > + * Knowing which TPM bank is read to calculate the boot_aggregate digest
> > + * needs to be conveyed to a verifier. For this reason, use the same
> > + * hash algorithm for reading the TPM PCRs as for calculating the boot
> > + * aggregate digest as stored in the measurement list.
> > */
> > static int __init ima_calc_boot_aggregate_tfm(char *digest,
> > struct crypto_shash *tfm)
> > {
> > struct tpm_digest d = { .alg_id = TPM_ALG_SHA1, .digest = {0} };
> > + enum hash_algo crypto_id;
> > int rc;
> > u32 i;
> > SHASH_DESC_ON_STACK(shash, tfm);
> > @@ -673,6 +694,28 @@ static int __init ima_calc_boot_aggregate_tfm(char
> > *digest,
> > if (rc != 0)
> > return rc;
> >
> > + crypto_id = get_hash_algo(crypto_shash_alg_name(tfm));
>
> Wouldn't be better to determine the index of ima_tpm_chip->allocated_banks
> in patch 1/2 and pass that index here, to avoid another search?

Both your suggestion and Lakshmi's suggestion change the parameters to
ima_calc_boot_aggregate_tfm(), which I was trying to avoid for now.  I
want it to be as easy as possible to backport.

Going forward, you might be correct.

Mimi

2020-02-04 13:38:51

by Roberto Sassu

[permalink] [raw]
Subject: RE: [PATCH v3 2/2] ima: support calculating the boot_aggregate based on different TPM banks

> -----Original Message-----
> From: [email protected] [mailto:linux-integrity-
> [email protected]] On Behalf Of Mimi Zohar
> Sent: Thursday, January 30, 2020 5:23 PM
> To: [email protected]
> Cc: Jerry Snitselaar <[email protected]>; James Bottomley
> <[email protected]>; linux-
> [email protected]; Mimi Zohar <[email protected]>
> Subject: [PATCH v3 2/2] ima: support calculating the boot_aggregate based
> on different TPM banks
>
> Calculating the boot_aggregate attempts to read the TPM SHA1 bank,
> assuming it is always enabled. With TPM 2.0 hash agility, TPM chips
> could support multiple TPM PCR banks, allowing firmware to configure and
> enable different banks.
>
> Instead of hard coding the TPM 2.0 bank hash algorithm used for calculating
> 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.
>
> For TPM 1.2 SHA1 is the only supported hash algorithm.
>
> Reported-by: Jerry Snitselaar <[email protected]>
> Suggested-by: Roberto Sassu <[email protected]>
> Signed-off-by: Mimi Zohar <[email protected]>
> ---
> security/integrity/ima/ima_crypto.c | 45
> ++++++++++++++++++++++++++++++++++++-
> 1 file changed, 44 insertions(+), 1 deletion(-)
>
> diff --git a/security/integrity/ima/ima_crypto.c
> b/security/integrity/ima/ima_crypto.c
> index 7967a6904851..a020aaefdea8 100644
> --- a/security/integrity/ima/ima_crypto.c
> +++ b/security/integrity/ima/ima_crypto.c
> @@ -656,13 +656,34 @@ static void __init ima_pcrread(u32 idx, struct
> tpm_digest *d)
> pr_err("Error Communicating to TPM chip\n");
> }
>
> +static enum hash_algo get_hash_algo(const char *algname)
> +{
> + int i;
> +
> + for (i = 0; i < HASH_ALGO__LAST; i++) {
> + if (strcmp(algname, hash_algo_name[i]) == 0)
> + break;
> + }
> +
> + return i;
> +}
> +
> /*
> - * Calculate the boot aggregate hash
> + * The boot_aggregate is a cumulative hash over TPM registers 0 - 7. With
> + * TPM 1.2 the boot_aggregate was based on reading the SHA1 PCRs, but
> with
> + * TPM 2.0 hash agility, TPM chips could support multiple TPM PCR banks,
> + * allowing firmware to configure and enable different banks.
> + *
> + * Knowing which TPM bank is read to calculate the boot_aggregate digest
> + * needs to be conveyed to a verifier. For this reason, use the same
> + * hash algorithm for reading the TPM PCRs as for calculating the boot
> + * aggregate digest as stored in the measurement list.
> */
> static int __init ima_calc_boot_aggregate_tfm(char *digest,
> struct crypto_shash *tfm)
> {
> struct tpm_digest d = { .alg_id = TPM_ALG_SHA1, .digest = {0} };
> + enum hash_algo crypto_id;
> int rc;
> u32 i;
> SHASH_DESC_ON_STACK(shash, tfm);
> @@ -673,6 +694,28 @@ static int __init ima_calc_boot_aggregate_tfm(char
> *digest,
> if (rc != 0)
> return rc;
>
> + crypto_id = get_hash_algo(crypto_shash_alg_name(tfm));
> + if (crypto_id == HASH_ALGO__LAST) {
> + pr_devel("unknown hash algorithm (%s), failing to read
> PCRs.\n",
> + crypto_shash_alg_name(tfm));
> + return 0;
> + }
> +
> + for (i = 0; i < ima_tpm_chip->nr_allocated_banks; i++) {
> + if (ima_tpm_chip->allocated_banks[i].crypto_id ==
> crypto_id) {
> + d.alg_id = ima_tpm_chip->allocated_banks[i].alg_id;
> + break;
> + }
> + }
> + if (i == ima_tpm_chip->nr_allocated_banks) {
> + pr_devel("TPM %s bank not allocated, failing to read
> PCRs.\n",
> + crypto_shash_alg_name(tfm));
> + return 0;
> + }
> +
> + pr_devel("calculating the boot-aggregregate based on TPM
> bank: %04x\n",
> + d.alg_id);
> +
> /* cumulative sha1 over tpm registers 0-7 */
> for (i = TPM_PCR0; i < TPM_PCR8; i++) {
> ima_pcrread(i, &d);

The third argument of crypto_shash_update() should be
crypto_shash_digestsize(tfm).

Roberto

HUAWEI TECHNOLOGIES Duesseldorf GmbH, HRB 56063
Managing Director: Li Peng, Li Jian, Shi Yanli

2020-02-04 17:29:29

by Mimi Zohar

[permalink] [raw]
Subject: Re: [PATCH v3 2/2] ima: support calculating the boot_aggregate based on different TPM banks

On Tue, 2020-02-04 at 13:37 +0000, Roberto Sassu wrote:
> > -----Original Message-----
> > From: [email protected] [mailto:linux-integrity-
> > [email protected]] On Behalf Of Mimi Zohar
> > Sent: Thursday, January 30, 2020 5:23 PM
> > To: [email protected]
> > Cc: Jerry Snitselaar <[email protected]>; James Bottomley
> > <[email protected]>; linux-
> > [email protected]; Mimi Zohar <[email protected]>
> > Subject: [PATCH v3 2/2] ima: support calculating the boot_aggregate based
> > on different TPM banks
> >
> > Calculating the boot_aggregate attempts to read the TPM SHA1 bank,
> > assuming it is always enabled. With TPM 2.0 hash agility, TPM chips
> > could support multiple TPM PCR banks, allowing firmware to configure and
> > enable different banks.
> >
> > Instead of hard coding the TPM 2.0 bank hash algorithm used for calculating
> > 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.
> >
> > For TPM 1.2 SHA1 is the only supported hash algorithm.
> >
> > Reported-by: Jerry Snitselaar <[email protected]>
> > Suggested-by: Roberto Sassu <[email protected]>
> > Signed-off-by: Mimi Zohar <[email protected]>
> > ---
> > security/integrity/ima/ima_crypto.c | 45
> > ++++++++++++++++++++++++++++++++++++-
> > 1 file changed, 44 insertions(+), 1 deletion(-)
> >
> > diff --git a/security/integrity/ima/ima_crypto.c
> > b/security/integrity/ima/ima_crypto.c
> > index 7967a6904851..a020aaefdea8 100644
> > --- a/security/integrity/ima/ima_crypto.c
> > +++ b/security/integrity/ima/ima_crypto.c
> > @@ -656,13 +656,34 @@ static void __init ima_pcrread(u32 idx, struct
> > tpm_digest *d)
> > pr_err("Error Communicating to TPM chip\n");
> > }
> >
> > +static enum hash_algo get_hash_algo(const char *algname)
> > +{
> > + int i;
> > +
> > + for (i = 0; i < HASH_ALGO__LAST; i++) {
> > + if (strcmp(algname, hash_algo_name[i]) == 0)
> > + break;
> > + }
> > +
> > + return i;
> > +}
> > +
> > /*
> > - * Calculate the boot aggregate hash
> > + * The boot_aggregate is a cumulative hash over TPM registers 0 - 7. With
> > + * TPM 1.2 the boot_aggregate was based on reading the SHA1 PCRs, but
> > with
> > + * TPM 2.0 hash agility, TPM chips could support multiple TPM PCR banks,
> > + * allowing firmware to configure and enable different banks.
> > + *
> > + * Knowing which TPM bank is read to calculate the boot_aggregate digest
> > + * needs to be conveyed to a verifier. For this reason, use the same
> > + * hash algorithm for reading the TPM PCRs as for calculating the boot
> > + * aggregate digest as stored in the measurement list.
> > */
> > static int __init ima_calc_boot_aggregate_tfm(char *digest,
> > struct crypto_shash *tfm)
> > {
> > struct tpm_digest d = { .alg_id = TPM_ALG_SHA1, .digest = {0} };
> > + enum hash_algo crypto_id;
> > int rc;
> > u32 i;
> > SHASH_DESC_ON_STACK(shash, tfm);
> > @@ -673,6 +694,28 @@ static int __init ima_calc_boot_aggregate_tfm(char
> > *digest,
> > if (rc != 0)
> > return rc;
> >
> > + crypto_id = get_hash_algo(crypto_shash_alg_name(tfm));
> > + if (crypto_id == HASH_ALGO__LAST) {
> > + pr_devel("unknown hash algorithm (%s), failing to read
> > PCRs.\n",
> > + crypto_shash_alg_name(tfm));
> > + return 0;
> > + }
> > +
> > + for (i = 0; i < ima_tpm_chip->nr_allocated_banks; i++) {
> > + if (ima_tpm_chip->allocated_banks[i].crypto_id ==
> > crypto_id) {
> > + d.alg_id = ima_tpm_chip->allocated_banks[i].alg_id;
> > + break;
> > + }
> > + }
> > + if (i == ima_tpm_chip->nr_allocated_banks) {
> > + pr_devel("TPM %s bank not allocated, failing to read
> > PCRs.\n",
> > + crypto_shash_alg_name(tfm));
> > + return 0;
> > + }
> > +
> > + pr_devel("calculating the boot-aggregregate based on TPM
> > bank: %04x\n",
> > + d.alg_id);
> > +
> > /* cumulative sha1 over tpm registers 0-7 */
> > for (i = TPM_PCR0; i < TPM_PCR8; i++) {
> > ima_pcrread(i, &d);
>
> The third argument of crypto_shash_update() should be
> crypto_shash_digestsize(tfm).

Thanks!  At this point we know the hash algorithm, so we could use
hash_digest_size[].

Mimi