@@ -1417,13 +1417,16 @@ int ima_ng_show(struct template_entry *entry)
static int ima_measurement(const char *file)
{
- uint8_t pcr[SHA_DIGEST_LENGTH] = {0,};
- uint8_t pcr10[SHA_DIGEST_LENGTH];
+ uint8_t pcr[NUM_PCRS][SHA_DIGEST_LENGTH] = {{0}};
+ uint8_t hwpcr[SHA_DIGEST_LENGTH];
struct template_entry entry = { .template = 0 };
FILE *fp;
int err = -1;
- int verify_sig_failed = 0;
+ bool verify_sig_failed[NUM_PCRS] = {0,};
+ bool verify_failed = false;
+ int i;
+ memset(zero, 0, SHA_DIGEST_LENGTH);
memset(fox, 0xff, SHA_DIGEST_LENGTH);
log_debug("Initial PCR value: ");
@@ -1440,7 +1443,8 @@ static int ima_measurement(const char *file)
init_public_keys(params.keyfile);
while (fread(&entry.header, sizeof(entry.header), 1, fp)) {
- ima_extend_pcr(pcr, entry.header.digest, SHA_DIGEST_LENGTH);
+ ima_extend_pcr(pcr[entry.header.pcr], entry.header.digest,
+ SHA_DIGEST_LENGTH);
if (!fread(entry.name, entry.header.name_len, 1, fp)) {
log_err("Unable to read template name\n");
@@ -1472,29 +1476,35 @@ static int ima_measurement(const char *file)
ima_show(&entry);
} else {
if (ima_ng_show(&entry) != 0)
- verify_sig_failed = 1;
+ verify_sig_failed[entry.header.pcr] = true;
}
}
- tpm_pcr_read(10, pcr10, sizeof(pcr10));
- log_info("PCRAgg: ");
- log_dump(pcr, sizeof(pcr));
+ for (i = 0; i < NUM_PCRS; i++) {
+ if (memcmp(pcr[i], zero, SHA_DIGEST_LENGTH) == 0)
+ continue;
+
+ log_info("PCRAgg %.2d: ", i);
+ log_dump(pcr[i], SHA_DIGEST_LENGTH);
- log_info("PCR-10: ");
- log_dump(pcr10, sizeof(pcr10));
+ tpm_pcr_read(i, hwpcr, sizeof(hwpcr));
+ log_info("HW PCR-%d: ", i);
+ log_dump(hwpcr, sizeof(hwpcr));
- if (memcmp(pcr, pcr10, sizeof(pcr))) {
- log_err("PCRAgg does not match PCR-10\n");
- goto out;
- } else if (verify_sig_failed == 1) {
- log_err("PCRAgg matches PCR-10, but list contains unknown keys or invalid signatures\n");
+ if (memcmp(pcr[i], hwpcr, sizeof(SHA_DIGEST_LENGTH)) != 0) {
+ log_err("PCRAgg %d does not match HW PCR-%d\n", i, i);
+
+ verify_failed = true;
+ } else if (verify_sig_failed[i] == true) {
+ log_err("PCRAgg %d matches PCR-%d, but list contains unknown keys or invalid signatures\n", i, i);
+ }
}
- err = 0;
+ if (!verify_failed)
+ err = 0;
out:
fclose(fp);
-
return err;
}
@@ -188,6 +188,9 @@ struct RSA_ASN1_template {
size_t size;
};
+#define NUM_PCRS 20
+#define DEFAULT_PCR 10
+
extern const struct RSA_ASN1_template RSA_ASN1_templates[PKEY_HASH__LAST];
extern struct libevm_params params;
The IMA measurement list may contain records for different PCRs. This patch walks the measurement list, calculating a PCR aggregate value for each PCR. Signed-off-by: Mimi Zohar <zohar@linux.vnet.ibm.com> --- src/evmctl.c | 44 +++++++++++++++++++++++++++----------------- src/imaevm.h | 3 +++ 2 files changed, 30 insertions(+), 17 deletions(-)