chunk_clear(&pcr_composite);
chunk_clear(&hash_pcr_composite);
- chunk_clear(&pcr_composite);
+ /* Hash the PCR Composite Structure */
+ hasher->allocate_hash(hasher, pcr_composite, out_pcr_composite);
+ DBG4(DBG_PTS, "Hash of calculated PCR Composite: %B", out_pcr_composite);
+ hasher->destroy(hasher);
+ }
+ else
+ {
+ *out_pcr_composite = chunk_clone(pcr_composite);
+ DBG4(DBG_PTS, "calculated PCR Composite: %B", out_pcr_composite);
+ }
+
+ /* SHA1 hash of PCR Composite to construct TPM_QUOTE_INFO */
+ hasher = lib->crypto->create_hasher(lib->crypto, HASH_SHA1);
+ hasher->allocate_hash(hasher, pcr_composite, &hash_pcr_composite);
hasher->destroy(hasher);
- writer->write_data(writer, *out_pcr_composite);
+
+ writer->write_data(writer, hash_pcr_composite);
+ chunk_clear(&pcr_composite);
+ chunk_clear(&hash_pcr_composite);
if (!this->secret.ptr)
{
writer->write_uint8 (writer, flags);
writer->write_uint8 (writer, PTS_SIMPLE_EVID_FINAL_RESERVED);
+ /** Optional Composite Hash Algorithm field is always present
+ * Field has value of all zeroes if not used.
+ * Implemented adhering the suggestion of Paul Sangster 28.Oct.2011
+ */
+ writer->write_uint16(writer, this->comp_hash_algorithm);
+
/* Optional fields */
- if (this->comp_hash_algorithm)
- {
- writer->write_uint16(writer, this->comp_hash_algorithm);
- }
if (this->pcr_comp.ptr && this->pcr_comp.len > 0)
{
writer->write_uint32 (writer, this->pcr_comp.len);
bio_reader_t *reader;
u_int8_t flags;
u_int8_t reserved;
- /** u_int16_t algorithm;*/
+ u_int16_t algorithm;
if (this->value.len < PTS_SIMPLE_EVID_FINAL_SIZE)
{
}
reader->read_uint8(reader, &reserved);
+
+ /** Optional Composite Hash Algorithm field is always present
+ * Field has value of all zeroes if not used.
+ * Implemented adhering the suggestion of Paul Sangster 28.Oct.2011
+ */
+
+ reader->read_uint16(reader, &algorithm);
+ this->comp_hash_algorithm = algorithm;
/* Optional Composite Hash Algorithm and TPM PCR Composite field is included */
if (this->flags != PTS_SIMPLE_EVID_FINAL_FLAG_NO)