static int
tpm_extend(u32 pcrindex, const u8 *digest)
{
- if (pcrindex >= 24)
- return -1;
-
switch (TPM_version) {
case TPM_VERSION_1_2:
return tpm12_extend(pcrindex, digest);
return -1;
}
-static int
-tpm_log_extend_event(struct pcpes *pcpes, const void *event)
-{
- int ret = tpm_extend(pcpes->pcrindex, pcpes->digest);
- if (ret)
- return -1;
-
- return tpm_log_event(pcpes, event);
-}
-
-static void
-tpm_fill_hash(struct pcpes *pcpes, const void *hashdata, u32 hashdata_length)
-{
- if (hashdata)
- sha1(hashdata, hashdata_length, pcpes->digest);
-}
-
/*
* Add a measurement to the log; the data at data_seg:data/length are
* appended to the TCG_PCClientPCREventStruct
.eventtype = event_type,
.eventdatasize = event_length,
};
- tpm_fill_hash(&pcpes, hashdata, hashdata_length);
- int ret = tpm_log_extend_event(&pcpes, event);
- if (ret)
+ sha1(hashdata, hashdata_length, pcpes.digest);
+ int ret = tpm_extend(pcpes.pcrindex, pcpes.digest);
+ if (ret) {
tpm_set_failure();
+ return;
+ }
+ tpm_log_event(&pcpes, event);
}
return MAKE_FLATPTR(regs->ds, regs->si);
}
+static u32
+hash_log_extend(struct pcpes *pcpes, const void *hashdata, u32 hashdata_length
+ , void *event, int extend)
+{
+ if (pcpes->pcrindex >= 24)
+ return TCG_INVALID_INPUT_PARA;
+ if (hashdata)
+ sha1(hashdata, hashdata_length, pcpes->digest);
+ if (extend) {
+ int ret = tpm_extend(pcpes->pcrindex, pcpes->digest);
+ if (ret)
+ return TCG_TCG_COMMAND_ERROR;
+ }
+ int ret = tpm_log_event(pcpes, pcpes->event);
+ if (ret)
+ return TCG_PC_LOGOVERFLOW;
+ return 0;
+}
+
static u32
hash_log_extend_event_int(const struct hleei_short *hleei_s,
struct hleeo *hleeo)
pcpes = (struct pcpes *)logdataptr;
- if (pcpes->pcrindex >= 24 || pcpes->pcrindex != pcrindex
+ if (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);
- int ret = tpm_log_extend_event(pcpes, pcpes->event);
- if (ret) {
- rc = TCG_TCG_COMMAND_ERROR;
+ rc = hash_log_extend(pcpes, hleei_s->hashdataptr, hleei_s->hashdatalen
+ , pcpes->event, 1);
+ if (rc)
goto err_exit;
- }
hleeo->opblength = sizeof(struct hleeo);
hleeo->reserved = 0;
pcpes = (struct pcpes *)hlei->logdataptr;
- if (pcpes->pcrindex >= 24 || pcpes->pcrindex != hlei->pcrindex
+ if (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);
- int ret = tpm_log_event(pcpes, pcpes->event);
- if (ret) {
- rc = TCG_PC_LOGOVERFLOW;
+ rc = hash_log_extend(pcpes, hlei->hashdataptr, hlei->hashdatalen
+ , pcpes->event, 0);
+ if (rc)
goto err_exit;
- }
/* updating the log was fine */
hleo->opblength = sizeof(struct hleo);
.eventtype = EV_COMPACT_HASH,
.eventdatasize = sizeof(info),
};
+ u32 rc = hash_log_extend(&pcpes, buffer, length, &info, 1);
+ if (rc)
+ return rc;
- tpm_fill_hash(&pcpes, buffer, length);
- int ret = tpm_log_extend_event(&pcpes, &info);
- if (ret)
- return TCG_TCG_COMMAND_ERROR;
*edx_ptr = tpm_state.entry_count;
return 0;
}