[Skiboot] [PATCH 13/19] libstb/trustedboot.c: import stb_final() from stb.c
Claudio Carvalho
cclaudio at linux.vnet.ibm.com
Sun Nov 12 04:28:36 AEDT 2017
The stb_final() primary goal is to measure the event EV_SEPARATOR
into PCR[0-7] when trusted boot is about to exit the boot services.
This imports the stb_final() from stb.c into trustedboot.c, but making
the following changes:
- Rename it to trustedboot_exit_boot_services().
- As specified in the TCG PC Client spec, EV_SEPARATOR events must be
logged with the name 0xFFFFFF.
- Remove the rom driver clean-up call.
- Don't allow code to be measured in skiboot after
trustedboot_exit_boot_services() is called.
Signed-off-by: Claudio Carvalho <cclaudio at linux.vnet.ibm.com>
---
libstb/trustedboot.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++
libstb/trustedboot.h | 11 +++++++++
2 files changed, 79 insertions(+)
diff --git a/libstb/trustedboot.c b/libstb/trustedboot.c
index 39310e4..0684840 100644
--- a/libstb/trustedboot.c
+++ b/libstb/trustedboot.c
@@ -31,6 +31,7 @@
//#define STB_DEBUG
static bool trusted_mode = false;
+static bool boot_services_exited = false;
/*
* This maps a PCR for each resource we can measure. The PCR number is
@@ -47,6 +48,26 @@ static struct {
{ RESOURCE_ID_CAPP, PCR_2 },
};
+/*
+ * Event Separator - digest of 0xFFFFFFFF
+ */
+static struct {
+ const unsigned char *event;
+ const unsigned char *sha1;
+ const unsigned char *sha256;
+} ev_separator = {
+
+ .event = "\xff\xff\xff\xff",
+
+ .sha1 = "\xd9\xbe\x65\x24\xa5\xf5\x04\x7d\xb5\x86"
+ "\x68\x13\xac\xf3\x27\x78\x92\xa7\xa3\x0a",
+
+ .sha256 = "\xad\x95\x13\x1b\xc0\xb7\x99\xc0\xb1\xaf"
+ "\x47\x7f\xb1\x4f\xcf\x26\xa6\xa9\xf7\x60"
+ "\x79\xe4\x8b\xf0\x90\xac\xb7\xe8\x36\x7b"
+ "\xfd\x0e"
+};
+
static TPM_Pcr map_pcr(enum resource_id id)
{
int i;
@@ -105,6 +126,48 @@ void trustedboot_init(void)
prlog(PR_ERR, "tpm init FAILED\n");
}
+int trustedboot_exit_boot_services(void)
+{
+ uint32_t pcr;
+ int rc = 0;
+ bool failed = false;
+
+ boot_services_exited = true;
+
+ if (!trusted_mode)
+ goto out_free;
+
+#ifdef STB_DEBUG
+ prlog(PR_NOTICE, "ev_separator.event: %s\n", ev_separator.event);
+ prlog(PR_NOTICE, "ev_separator.sha1:\n");
+ stb_print_data((uint8_t*) ev_separator.sha1, TPM_ALG_SHA1_SIZE);
+ prlog(PR_NOTICE, "ev_separator.sha256:\n");
+ stb_print_data((uint8_t*) ev_separator.sha256, TPM_ALG_SHA256_SIZE);
+#endif
+ /*
+ * As defined in the TCG Platform Firmware PWe are done. Extending the digest of 0xFFFFFFFF
+ * in PCR[0-7], and recording an EV_SEPARATOR event in
+ * event log as defined in the TCG Platform Firmware Profile
+ * specification, Revision 00.21
+ */
+ for (pcr = 0; pcr < 8; pcr++) {
+ rc = tpm_extendl(pcr, TPM_ALG_SHA256,
+ (uint8_t*) ev_separator.sha256,
+ TPM_ALG_SHA256_SIZE, TPM_ALG_SHA1,
+ (uint8_t*) ev_separator.sha1,
+ TPM_ALG_SHA1_SIZE, EV_SEPARATOR,
+ ev_separator.event);
+ if (rc)
+ failed = true;
+ }
+ tpm_add_status_property();
+
+out_free:
+ tpm_cleanup();
+
+ return (failed) ? -1 : 0;
+}
+
int trustedboot_measure(enum resource_id id, void *buf, size_t len)
{
uint8_t digest[SHA512_DIGEST_LENGTH];
@@ -127,6 +190,11 @@ int trustedboot_measure(enum resource_id id, void *buf, size_t len)
prlog(PR_ERR, "resource NOT MEASURED, resource_id=%d unknown\n", id);
return -1;
}
+ if (boot_services_exited) {
+ prlog(PR_ERR, "%s NOT MEASURED. Already exited from boot "
+ "services\n", name);
+ return -1;
+ }
pcr = map_pcr(id);
if (pcr == -1) {
/**
diff --git a/libstb/trustedboot.h b/libstb/trustedboot.h
index bd5ac91..3003c80 100644
--- a/libstb/trustedboot.h
+++ b/libstb/trustedboot.h
@@ -22,6 +22,17 @@
void trustedboot_init(void);
/**
+ * As defined in the TCG Platform Firmware Profile specification, the
+ * digest of 0xFFFFFFFF or 0x00000000 must be extended in PCR[0-7] and
+ * an EV_SEPARATOR event must be recorded in the event log for PCR[0-7]
+ * prior to the first invocation of the first Ready to Boot call.
+ *
+ * This function must be called just before BOOTKERNEL is executed. Every call
+ * to trustedboot_measure() will fail afterwards.
+ */
+int trustedboot_exit_boot_services(void);
+
+/**
* trustedboot_measure - measure a resource
* @id : resource id
* @buf : data to be measured
--
2.7.4
More information about the Skiboot
mailing list