@@ -33,6 +33,7 @@
#include "helpers.h"
#include "version.h"
#include "OF.h"
+#include "libelf.h"
#undef TCGBIOS_DEBUG
//#define TCGBIOS_DEBUG
@@ -852,6 +853,49 @@ static uint32_t tpm_add_measurement_to_log(uint32_t pcrindex,
return tpm_log_event_long(&le.hdr, digest_len, info, infolen);
}
+/*
+ * Measure the contents of a buffer into the given PCR and log it with the
+ * given eventtype. If is_elf is true, try to determine the size of the
+ * ELF file in the buffer and use its size rather than the much larger data
+ * buffer it is held in. In case of failure to detect the ELF file size,
+ * log an error.
+ *
+ * Input parameters:
+ * @pcrindex : PCR to extend
+ * @eventtype : type of event
+ * @data: the buffer to measure
+ * @datalen: length of the buffer
+ * @desc: The description to log
+ * @desclen: The length of the description
+ * @is_elf: Whether data buffer holds an ELF file and we should determine
+ * the original file size.
+ *
+ * Returns 0 on success, an error code otherwise.
+ */
+uint32_t tpm_hash_log_extend_event_buffer(uint32_t pcrindex, uint32_t eventtype,
+ const void *data, uint64_t datalen,
+ const char *desc, uint32_t desclen,
+ bool is_elf)
+{
+ long len;
+ char buf[256];
+
+ if (is_elf) {
+ len = elf_get_file_size(data, datalen);
+ if (len > 0) {
+ datalen = len;
+ } else {
+ snprintf(buf, sizeof(buf), "BAD ELF FILE: %s", desc);
+ return tpm_add_measurement_to_log(pcrindex, eventtype,
+ buf, strlen(buf),
+ (uint8_t *)buf, strlen(buf));
+ }
+ }
+ return tpm_add_measurement_to_log(pcrindex, eventtype,
+ desc, desclen,
+ data, datalen);
+}
+
/*
* Add an EV_ACTION measurement to the list of measurements
*/
@@ -32,5 +32,10 @@ void tpm20_menu(void);
void tpm_gpt_set_lba1(const uint8_t *addr, uint32_t length);
void tpm_gpt_add_entry(const uint8_t *addr, uint32_t length);
uint32_t tpm_measure_gpt(void);
+uint32_t tpm_hash_log_extend_event_buffer(uint32_t pcrindex,
+ uint32_t eventtype,
+ const void *data, uint64_t datalen,
+ const char *desc, uint32_t desclen,
+ bool is_elf);
#endif /* TCGBIOS_H */
@@ -169,3 +169,22 @@ PRIM(tpm_X2d_measure_X2d_gpt)
PUSH;
TOS.n = tpm_measure_gpt();
MIRP
+
+/***********************************************************************************************************/
+/* Firmware API */
+/* SLOF: tpm-hash-log-extend-event-buffer ( pcr evt data-ptr data-len desc-ptr desclen is_elf -- errcode ) */
+/* LIBTPM: errcode = tpm-hash-log-extend-event-buffer */
+/***********************************************************************************************************/
+PRIM(tpm_X2d_hash_X2d_log_X2d_extend_X2d_event_X2d_buffer)
+ uint32_t is_elf = TOS.u; POP;
+ uint32_t desclen = TOS.u; POP;
+ const char *desc = TOS.a; POP;
+ uint64_t datalen = TOS.u; POP;
+ const void *data = TOS.a; POP;
+ uint32_t eventtype = TOS.u; POP;
+ uint32_t pcrindex = TOS.u;
+
+ TOS.n = tpm_hash_log_extend_event_buffer(pcrindex, eventtype,
+ data, datalen,
+ desc, desclen, is_elf);
+MIRP
@@ -28,3 +28,4 @@ cod(tpm20-menu)
cod(tpm-gpt-set-lba1)
cod(tpm-gpt-add-entry)
cod(tpm-measure-gpt)
+cod(tpm-hash-log-extend-event-buffer)