From 8ae3d744bc0cf9dc8a0078fe052f5bd70e41c818 Mon Sep 17 00:00:00 2001 From: Stefan Berger Date: Thu, 9 Sep 2021 08:44:48 -0400 Subject: [PATCH] tpm2: Marshal event sequence objects' hash state Event sequence objects were never properly marshalled and when their state was saved and later restored their state may have been corrupted. Fix this now by also marshalling the state of event sequence objects. Bump up the version of the HASH_OBJECT's header to '3' so that previously written state can be resumed if an event sequence object is encountered and we only unmarshal an event sequence object when the version is at least '3'. Fixes issue #259. Signed-off-by: Stefan Berger --- src/tpm2/NVMarshal.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/tpm2/NVMarshal.c b/src/tpm2/NVMarshal.c index 935a76cd..4a5be3fe 100644 --- a/src/tpm2/NVMarshal.c +++ b/src/tpm2/NVMarshal.c @@ -2220,7 +2220,7 @@ HMAC_STATE_Unmarshal(HMAC_STATE *data, BYTE **buffer, INT32 *size) } #define HASH_OBJECT_MAGIC 0xb874fe38 -#define HASH_OBJECT_VERSION 2 +#define HASH_OBJECT_VERSION 3 static UINT16 HASH_OBJECT_Marshal(HASH_OBJECT *data, BYTE **buffer, INT32 *size) @@ -2236,7 +2236,8 @@ HASH_OBJECT_Marshal(HASH_OBJECT *data, BYTE **buffer, INT32 *size) written += TPMI_ALG_HASH_Marshal(&data->nameAlg, buffer, size); written += TPMA_OBJECT_Marshal(&data->objectAttributes, buffer, size); written += TPM2B_AUTH_Marshal(&data->auth, buffer, size); - if (data->attributes.hashSeq == SET) { + if (data->attributes.hashSeq == SET || + data->attributes.eventSeq == SET /* since v3 */) { array_size = ARRAY_SIZE(data->state.hashState); written += UINT16_Marshal(&array_size, buffer, size); for (i = 0; i < array_size; i++) { @@ -2284,7 +2285,9 @@ HASH_OBJECT_Unmarshal(HASH_OBJECT *data, BYTE **buffer, INT32 *size) rc = TPM2B_AUTH_Unmarshal(&data->auth, buffer, size); } if (rc == TPM_RC_SUCCESS) { - if (data->attributes.hashSeq == SET) { + /* hashSeq was always written correctly; eventSeq only appeared in v3 */ + if (data->attributes.hashSeq == SET || + (data->attributes.eventSeq == SET && hdr.version >= 3)) { if (rc == TPM_RC_SUCCESS) { rc = UINT16_Unmarshal(&array_size, buffer, size); }