/* * Calculate the boot aggregate hash */ int __init ima_calc_boot_aggregate(char *digest) { u8 pcr_i[IMA_DIGEST_SIZE]; int rc, i; struct { struct shash_desc shash; char ctx[crypto_shash_descsize(ima_shash_tfm)]; } desc; desc.shash.tfm = ima_shash_tfm; desc.shash.flags = 0; rc = crypto_shash_init(&desc.shash); if (rc != 0) return rc; /* cumulative sha1 over tpm registers 0-7 */ for (i = TPM_PCR0; i < TPM_PCR8; i++) { ima_pcrread(i, pcr_i); /* now accumulate with current aggregate */ rc = crypto_shash_update(&desc.shash, pcr_i, IMA_DIGEST_SIZE); } if (!rc) crypto_shash_final(&desc.shash, digest); return rc; }
/* * Calculate the boot aggregate hash */ static int __init ima_calc_boot_aggregate_tfm(char *digest, struct crypto_shash *tfm) { u8 pcr_i[TPM_DIGEST_SIZE]; int rc, i; SHASH_DESC_ON_STACK(shash, tfm); shash->tfm = tfm; shash->flags = 0; rc = crypto_shash_init(shash); if (rc != 0) return rc; /* cumulative sha1 over tpm registers 0-7 */ for (i = TPM_PCR0; i < TPM_PCR8; i++) { ima_pcrread(i, pcr_i); /* now accumulate with current aggregate */ rc = crypto_shash_update(shash, pcr_i, TPM_DIGEST_SIZE); } if (!rc) crypto_shash_final(shash, digest); return rc; }