mirror of
https://github.com/stefanberger/libtpms
synced 2026-01-09 14:11:36 +00:00
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 <stefanb@linux.ibm.com>
This commit is contained in:
parent
7cdd87813c
commit
8ae3d744bc
@ -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);
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user