[SeaBIOS] [PATCH 4/8] tpm: Use pcpes->event[] to pass data to tpm_extend_acpi_log()
Kevin O'Connor
kevin at koconnor.net
Mon Nov 23 02:02:34 CET 2015
Instead of passing in the event data to tpm_extend_acpi_log() via
parameters, use the event[] field in the pcpes. Update those callers
that don't populate the pcpes->event to do so prior to calling
tpm_extend_acpi_log().
Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
src/std/tcg.h | 2 +-
src/tcgbios.c | 76 +++++++++++++++++++++++++++++------------------------------
2 files changed, 39 insertions(+), 39 deletions(-)
diff --git a/src/std/tcg.h b/src/std/tcg.h
index 88b2688..5f9cad9 100644
--- a/src/std/tcg.h
+++ b/src/std/tcg.h
@@ -207,7 +207,7 @@ struct pcpes
u32 eventtype;
u8 digest[SHA1_BUFSIZE];
u32 eventdatasize;
- u32 event;
+ u8 event[0];
} PACKED;
struct pcctes
diff --git a/src/tcgbios.c b/src/tcgbios.c
index 0c28935..e7adf3f 100644
--- a/src/tcgbios.c
+++ b/src/tcgbios.c
@@ -290,18 +290,15 @@ reset_acpi_log(void)
* Returns an error code in case of faiure, 0 in case of success
*/
static u32
-tpm_extend_acpi_log(struct pcpes *pcpes,
- const char *event, u32 event_length)
+tpm_extend_acpi_log(struct pcpes *pcpes)
{
- u32 size;
-
dprintf(DEBUG_tcg, "TCGBIOS: LASA = %p, next entry = %p\n",
tpm_state.log_area_start_address, tpm_state.log_area_next_entry);
if (tpm_state.log_area_next_entry == NULL)
return TCG_PC_LOGOVERFLOW;
- size = offsetof(struct pcpes, event) + event_length;
+ u32 size = sizeof(*pcpes) + pcpes->eventdatasize;
if ((tpm_state.log_area_next_entry + size - tpm_state.log_area_start_address) >
tpm_state.log_area_minimum_length) {
@@ -309,11 +306,7 @@ tpm_extend_acpi_log(struct pcpes *pcpes,
return TCG_PC_LOGOVERFLOW;
}
- pcpes->eventdatasize = event_length;
-
- memcpy(tpm_state.log_area_next_entry, pcpes, offsetof(struct pcpes, event));
- memcpy(tpm_state.log_area_next_entry + offsetof(struct pcpes, event),
- event, event_length);
+ memcpy(tpm_state.log_area_next_entry, pcpes, size);
tpm_state.log_area_last_entry = tpm_state.log_area_next_entry;
tpm_state.log_area_next_entry += size;
@@ -513,7 +506,7 @@ tpm_extend(u8 *hash, u32 pcrindex)
}
static u32
-tpm_log_event(struct pcpes *pcpes, const char *event, u32 event_length)
+tpm_log_event(struct pcpes *pcpes)
{
if (pcpes->pcrindex >= 24)
return TCG_INVALID_INPUT_PARA;
@@ -521,16 +514,16 @@ tpm_log_event(struct pcpes *pcpes, const char *event, u32 event_length)
if (!has_working_tpm())
return TCG_GENERAL_ERROR;
- u32 rc = tpm_extend_acpi_log(pcpes, event, event_length);
+ u32 rc = tpm_extend_acpi_log(pcpes);
if (rc)
tpm_set_failure();
return rc;
}
static u32
-tpm_log_extend_event(struct pcpes *pcpes, const char *event, u32 event_length)
+tpm_log_extend_event(struct pcpes *pcpes)
{
- u32 rc = tpm_log_event(pcpes, event, event_length);
+ u32 rc = tpm_log_event(pcpes);
if (rc)
return rc;
return tpm_extend(pcpes->digest, pcpes->pcrindex);
@@ -560,12 +553,21 @@ tpm_add_measurement_to_log(u32 pcrindex, u32 event_type,
const char *event, u32 event_length,
const u8 *hashdata, u32 hashdata_length)
{
- struct pcpes pcpes = {
- .pcrindex = pcrindex,
- .eventtype = event_type,
+ struct {
+ struct pcpes pcpes;
+ u8 event[128];
+ } PACKED ev = {
+ .pcpes.pcrindex = pcrindex,
+ .pcpes.eventtype = event_type,
+ .pcpes.eventdatasize = event_length,
};
- tpm_fill_hash(&pcpes, hashdata, hashdata_length);
- return tpm_log_extend_event(&pcpes, event, event_length);
+ if (event_length > sizeof(ev.event)) {
+ warn_internalerror();
+ return TCG_FIRMWARE_ERROR;
+ }
+ memcpy(ev.event, event, event_length);
+ tpm_fill_hash(&ev.pcpes, hashdata, hashdata_length);
+ return tpm_log_extend_event(&ev.pcpes);
}
@@ -975,16 +977,14 @@ hash_log_extend_event_int(const struct hleei_short *hleei_s,
pcpes = (struct pcpes *)logdataptr;
- if (pcpes->pcrindex >= 24 ||
- pcpes->pcrindex != pcrindex ||
- logdatalen != offsetof(struct pcpes, event) + pcpes->eventdatasize) {
+ if (pcpes->pcrindex >= 24 || pcpes->pcrindex != pcrindex
+ || logdatalen != sizeof(*pcpes) + pcpes->eventdatasize) {
rc = TCG_INVALID_INPUT_PARA;
goto err_exit;
}
tpm_fill_hash(pcpes, hleei_s->hashdataptr, hleei_s->hashdatalen);
- rc = tpm_log_extend_event(pcpes
- , (char *)&pcpes->event, pcpes->eventdatasize);
+ rc = tpm_log_extend_event(pcpes);
if (rc)
goto err_exit;
@@ -1077,17 +1077,15 @@ hash_log_event_int(const struct hlei *hlei, struct hleo *hleo)
pcpes = (struct pcpes *)hlei->logdataptr;
- if (pcpes->pcrindex >= 24 ||
- pcpes->pcrindex != hlei->pcrindex ||
- pcpes->eventtype != hlei->logeventtype ||
- hlei->logdatalen !=
- offsetof(struct pcpes, event) + pcpes->eventdatasize) {
+ if (pcpes->pcrindex >= 24 || pcpes->pcrindex != hlei->pcrindex
+ || pcpes->eventtype != hlei->logeventtype
+ || hlei->logdatalen != sizeof(*pcpes) + pcpes->eventdatasize) {
rc = TCG_INVALID_INPUT_PARA;
goto err_exit;
}
tpm_fill_hash(pcpes, hlei->hashdataptr, hlei->hashdatalen);
- rc = tpm_log_event(pcpes, (char *)&pcpes->event, pcpes->eventdatasize);
+ rc = tpm_log_event(pcpes);
if (rc)
goto err_exit;
@@ -1144,19 +1142,21 @@ compact_hash_log_extend_event_int(u8 *buffer,
u32 pcrindex,
u32 *edx_ptr)
{
- struct pcpes pcpes = {
- .pcrindex = pcrindex,
- .eventtype = EV_COMPACT_HASH,
- .eventdatasize = sizeof(info),
- .event = info,
+ struct {
+ struct pcpes pcpes;
+ u32 event;
+ } PACKED ev = {
+ .pcpes.pcrindex = pcrindex,
+ .pcpes.eventtype = EV_COMPACT_HASH,
+ .pcpes.eventdatasize = sizeof(info),
+ .event = info,
};
if (is_preboot_if_shutdown() != 0)
return TCG_INTERFACE_SHUTDOWN;
- tpm_fill_hash(&pcpes, buffer, length);
- u32 rc = tpm_log_extend_event(&pcpes,
- (char *)&pcpes.event, pcpes.eventdatasize);
+ tpm_fill_hash(&ev.pcpes, buffer, length);
+ u32 rc = tpm_log_extend_event(&ev.pcpes);
if (rc == 0)
*edx_ptr = tpm_state.entry_count;
--
2.5.0
More information about the SeaBIOS
mailing list