From a116d366871e2657243209930cc3bda68f9dd938 Mon Sep 17 00:00:00 2001 From: Stefan Berger Date: Wed, 23 Jun 2021 20:54:44 -0400 Subject: [PATCH 3/3] tpm2: Restore original value if unmarshalled value was illegal Restore the original value of the memory location where data from a stream was unmarshalled and the unmarshalled value was found to be illegal. The goal is to not keep illegal values in memory. Signed-off-by: Stefan Berger --- src/tpm2/Unmarshal.c | 122 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) diff --git a/src/tpm2/Unmarshal.c b/src/tpm2/Unmarshal.c index bac7d76..c839a68 100644 --- a/src/tpm2/Unmarshal.c +++ b/src/tpm2/Unmarshal.c @@ -165,6 +165,7 @@ TPM_RC TPM_GENERATED_Unmarshal(TPM_GENERATED *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPM_GENERATED orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = UINT32_Unmarshal(target, buffer, size); @@ -172,6 +173,7 @@ TPM_GENERATED_Unmarshal(TPM_GENERATED *target, BYTE **buffer, INT32 *size) if (rc == TPM_RC_SUCCESS) { if (*target != TPM_GENERATED_VALUE) { rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -197,6 +199,7 @@ TPM_RC TPM_ECC_CURVE_Unmarshal(TPM_ECC_CURVE *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPM_ECC_CURVE orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = UINT16_Unmarshal(target, buffer, size); @@ -215,6 +218,7 @@ TPM_ECC_CURVE_Unmarshal(TPM_ECC_CURVE *target, BYTE **buffer, INT32 *size) break; default: rc = TPM_RC_CURVE; + *target = orig_target; // libtpms added } } return rc; @@ -240,6 +244,7 @@ TPM_RC TPM_CLOCK_ADJUST_Unmarshal(TPM_CLOCK_ADJUST *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPM_CLOCK_ADJUST orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = INT8_Unmarshal(target, buffer, size); @@ -256,6 +261,7 @@ TPM_CLOCK_ADJUST_Unmarshal(TPM_CLOCK_ADJUST *target, BYTE **buffer, INT32 *size) break; default: rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -267,6 +273,7 @@ TPM_RC TPM_EO_Unmarshal(TPM_EO *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPM_EO orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = UINT16_Unmarshal(target, buffer, size); @@ -288,6 +295,7 @@ TPM_EO_Unmarshal(TPM_EO *target, BYTE **buffer, INT32 *size) break; default: rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -299,6 +307,7 @@ TPM_RC TPM_ST_Unmarshal(TPM_ST *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPM_ST orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = UINT16_Unmarshal(target, buffer, size); @@ -324,6 +333,7 @@ TPM_ST_Unmarshal(TPM_ST *target, BYTE **buffer, INT32 *size) break; default: rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -335,6 +345,7 @@ TPM_RC TPM_SU_Unmarshal(TPM_SU *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPM_SU orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = UINT16_Unmarshal(target, buffer, size); @@ -346,6 +357,7 @@ TPM_SU_Unmarshal(TPM_SU *target, BYTE **buffer, INT32 *size) break; default: rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -357,6 +369,7 @@ TPM_RC TPM_SE_Unmarshal(TPM_SE *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPM_SE orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = UINT8_Unmarshal(target, buffer, size); @@ -369,6 +382,7 @@ TPM_SE_Unmarshal(TPM_SE *target, BYTE **buffer, INT32 *size) break; default: rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -380,6 +394,7 @@ TPM_RC TPM_CAP_Unmarshal(TPM_CAP *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPM_CAP orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = UINT32_Unmarshal(target, buffer, size); @@ -400,6 +415,7 @@ TPM_CAP_Unmarshal(TPM_CAP *target, BYTE **buffer, INT32 *size) break; default: rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -450,6 +466,7 @@ TPM_RC TPMA_ALGORITHM_Unmarshal(TPMA_ALGORITHM *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPMA_ALGORITHM orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = UINT32_Unmarshal((UINT32 *)target, buffer, size); /* libtpms changed */ @@ -457,6 +474,7 @@ TPMA_ALGORITHM_Unmarshal(TPMA_ALGORITHM *target, BYTE **buffer, INT32 *size) if (rc == TPM_RC_SUCCESS) { if (*target & TPMA_ALGORITHM_reserved) { rc = TPM_RC_RESERVED_BITS; + *target = orig_target; // libtpms added } } return rc; @@ -468,6 +486,7 @@ TPM_RC TPMA_OBJECT_Unmarshal(TPMA_OBJECT *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPMA_OBJECT orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = UINT32_Unmarshal((UINT32 *)target, buffer, size); /* libtpms changed */ @@ -475,6 +494,7 @@ TPMA_OBJECT_Unmarshal(TPMA_OBJECT *target, BYTE **buffer, INT32 *size) if (rc == TPM_RC_SUCCESS) { if (*target & TPMA_OBJECT_reserved) { rc = TPM_RC_RESERVED_BITS; + *target = orig_target; // libtpms added } } return rc; @@ -486,6 +506,7 @@ TPM_RC TPMA_SESSION_Unmarshal(TPMA_SESSION *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPMA_SESSION orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = UINT8_Unmarshal((UINT8 *)target, buffer, size); /* libtpms changed */ @@ -493,6 +514,7 @@ TPMA_SESSION_Unmarshal(TPMA_SESSION *target, BYTE **buffer, INT32 *size) if (rc == TPM_RC_SUCCESS) { if (*target & TPMA_SESSION_reserved) { rc = TPM_RC_RESERVED_BITS; + *target = orig_target; // libtpms added } } return rc; @@ -517,6 +539,7 @@ TPM_RC TPMA_CC_Unmarshal(TPMA_CC *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPMA_CC orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = UINT32_Unmarshal((UINT32 *)target, buffer, size); /* libtpms changed */ @@ -524,6 +547,7 @@ TPMA_CC_Unmarshal(TPMA_CC *target, BYTE **buffer, INT32 *size) if (rc == TPM_RC_SUCCESS) { if (*target & TPMA_CC_reserved) { rc = TPM_RC_RESERVED_BITS; + *target = orig_target; // libtpms added } } return rc; @@ -535,6 +559,7 @@ TPM_RC TPMI_YES_NO_Unmarshal(TPMI_YES_NO *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_YES_NO orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = UINT8_Unmarshal(target, buffer, size); @@ -546,6 +571,7 @@ TPMI_YES_NO_Unmarshal(TPMI_YES_NO *target, BYTE **buffer, INT32 *size) break; default: rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -557,6 +583,7 @@ TPM_RC TPMI_DH_OBJECT_Unmarshal(TPMI_DH_OBJECT *target, BYTE **buffer, INT32 *size, BOOL allowNull) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_DH_OBJECT orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_HANDLE_Unmarshal(target, buffer, size); @@ -569,6 +596,7 @@ TPMI_DH_OBJECT_Unmarshal(TPMI_DH_OBJECT *target, BYTE **buffer, INT32 *size, BOO isNotPersistent && isNotLegalNull) { rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -580,6 +608,7 @@ TPM_RC TPMI_DH_PARENT_Unmarshal(TPMI_DH_PARENT *target, BYTE **buffer, INT32 *size, BOOL allowNull) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_DH_PARENT orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_HANDLE_Unmarshal(target, buffer, size); @@ -598,6 +627,7 @@ TPMI_DH_PARENT_Unmarshal(TPMI_DH_PARENT *target, BYTE **buffer, INT32 *size, BOO isNotEndorsement && isNotLegalNull) { rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -609,6 +639,7 @@ TPM_RC TPMI_DH_PERSISTENT_Unmarshal(TPMI_DH_PERSISTENT *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_DH_PERSISTENT orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_HANDLE_Unmarshal(target, buffer, size); @@ -617,6 +648,7 @@ TPMI_DH_PERSISTENT_Unmarshal(TPMI_DH_PERSISTENT *target, BYTE **buffer, INT32 *s BOOL isNotPersistent = (*target < PERSISTENT_FIRST) || (*target > PERSISTENT_LAST); if (isNotPersistent) { rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -628,6 +660,7 @@ TPM_RC TPMI_DH_ENTITY_Unmarshal(TPMI_DH_ENTITY *target, BYTE **buffer, INT32 *size, BOOL allowNull) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_DH_ENTITY orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_HANDLE_Unmarshal(target, buffer, size); @@ -654,6 +687,7 @@ TPMI_DH_ENTITY_Unmarshal(TPMI_DH_ENTITY *target, BYTE **buffer, INT32 *size, BOO isNotAuth && isNotLegalNull) { rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -665,6 +699,7 @@ TPM_RC TPMI_DH_PCR_Unmarshal(TPMI_DH_PCR *target, BYTE **buffer, INT32 *size, BOOL allowNull) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_DH_PCR orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_HANDLE_Unmarshal(target, buffer, size); @@ -675,6 +710,7 @@ TPMI_DH_PCR_Unmarshal(TPMI_DH_PCR *target, BYTE **buffer, INT32 *size, BOOL allo if (isNotPcr && isNotLegalNull) { rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -686,6 +722,7 @@ TPM_RC TPMI_SH_AUTH_SESSION_Unmarshal(TPMI_SH_AUTH_SESSION *target, BYTE **buffer, INT32 *size, BOOL allowPwd) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_SH_AUTH_SESSION orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_HANDLE_Unmarshal(target, buffer, size); @@ -698,6 +735,7 @@ TPMI_SH_AUTH_SESSION_Unmarshal(TPMI_SH_AUTH_SESSION *target, BYTE **buffer, INT3 isNotPolicySession && isNotLegalPwd) { rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -709,6 +747,7 @@ TPM_RC TPMI_SH_HMAC_Unmarshal(TPMI_SH_HMAC *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_SH_HMAC orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_HANDLE_Unmarshal(target, buffer, size); @@ -717,6 +756,7 @@ TPMI_SH_HMAC_Unmarshal(TPMI_SH_HMAC *target, BYTE **buffer, INT32 *size) BOOL isNotHmacSession = (*target < HMAC_SESSION_FIRST ) || (*target > HMAC_SESSION_LAST); if (isNotHmacSession) { rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -728,6 +768,7 @@ TPM_RC TPMI_SH_POLICY_Unmarshal(TPMI_SH_POLICY *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_SH_POLICY orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_HANDLE_Unmarshal(target, buffer, size); @@ -736,6 +777,7 @@ TPMI_SH_POLICY_Unmarshal(TPMI_SH_POLICY *target, BYTE **buffer, INT32 *size) BOOL isNotPolicySession = (*target < POLICY_SESSION_FIRST) || (*target > POLICY_SESSION_LAST); if (isNotPolicySession) { rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -747,6 +789,7 @@ TPM_RC TPMI_DH_CONTEXT_Unmarshal(TPMI_DH_CONTEXT *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_DH_CONTEXT orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_HANDLE_Unmarshal(target, buffer, size); @@ -759,6 +802,7 @@ TPMI_DH_CONTEXT_Unmarshal(TPMI_DH_CONTEXT *target, BYTE **buffer, INT32 *size) isNotPolicySession && isNotTransient) { rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -770,6 +814,7 @@ TPM_RC TPMI_DH_SAVED_Unmarshal(TPMI_DH_SAVED *target, BYTE **buffer, INT32 *size, BOOL allowNull) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_DH_SAVED orig_target = *target; // libtpms added allowNull = allowNull; if (rc == TPM_RC_SUCCESS) { @@ -787,6 +832,7 @@ TPMI_DH_SAVED_Unmarshal(TPMI_DH_SAVED *target, BYTE **buffer, INT32 *size, BOOL isNotSequenceObject && isNotTransientStClear) { rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -798,6 +844,7 @@ TPM_RC TPMI_RH_HIERARCHY_Unmarshal(TPMI_RH_HIERARCHY *target, BYTE **buffer, INT32 *size, BOOL allowNull) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_RH_HIERARCHY orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_HANDLE_Unmarshal(target, buffer, size); @@ -814,6 +861,7 @@ TPMI_RH_HIERARCHY_Unmarshal(TPMI_RH_HIERARCHY *target, BYTE **buffer, INT32 *siz } default: rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -825,6 +873,7 @@ TPM_RC TPMI_RH_ENABLES_Unmarshal(TPMI_RH_ENABLES *target, BYTE **buffer, INT32 *size, BOOL allowNull) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_RH_ENABLES orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_HANDLE_Unmarshal(target, buffer, size); @@ -842,6 +891,7 @@ TPMI_RH_ENABLES_Unmarshal(TPMI_RH_ENABLES *target, BYTE **buffer, INT32 *size, B } default: rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -853,6 +903,7 @@ TPM_RC TPMI_RH_HIERARCHY_AUTH_Unmarshal(TPMI_RH_HIERARCHY_AUTH *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_RH_HIERARCHY_AUTH orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_HANDLE_Unmarshal(target, buffer, size); @@ -866,6 +917,7 @@ TPMI_RH_HIERARCHY_AUTH_Unmarshal(TPMI_RH_HIERARCHY_AUTH *target, BYTE **buffer, break; default: rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -877,6 +929,7 @@ TPM_RC TPMI_RH_PLATFORM_Unmarshal(TPMI_RH_PLATFORM *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_RH_PLATFORM orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_HANDLE_Unmarshal(target, buffer, size); @@ -887,6 +940,7 @@ TPMI_RH_PLATFORM_Unmarshal(TPMI_RH_PLATFORM *target, BYTE **buffer, INT32 *size) break; default: rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -898,6 +952,7 @@ TPM_RC TPMI_RH_ENDORSEMENT_Unmarshal(TPMI_RH_ENDORSEMENT *target, BYTE **buffer, INT32 *size, BOOL allowNull) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_RH_ENDORSEMENT orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_HANDLE_Unmarshal(target, buffer, size); @@ -912,6 +967,7 @@ TPMI_RH_ENDORSEMENT_Unmarshal(TPMI_RH_ENDORSEMENT *target, BYTE **buffer, INT32 } default: rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -923,6 +979,7 @@ TPM_RC TPMI_RH_PROVISION_Unmarshal(TPMI_RH_PROVISION *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_RH_PROVISION orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_HANDLE_Unmarshal(target, buffer, size); @@ -934,6 +991,7 @@ TPMI_RH_PROVISION_Unmarshal(TPMI_RH_PROVISION *target, BYTE **buffer, INT32 *siz break; default: rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -945,6 +1003,7 @@ TPM_RC TPMI_RH_CLEAR_Unmarshal(TPMI_RH_CLEAR *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_RH_CLEAR orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_HANDLE_Unmarshal(target, buffer, size); @@ -956,6 +1015,7 @@ TPMI_RH_CLEAR_Unmarshal(TPMI_RH_CLEAR *target, BYTE **buffer, INT32 *size) break; default: rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -967,6 +1027,7 @@ TPM_RC TPMI_RH_NV_AUTH_Unmarshal(TPMI_RH_NV_AUTH *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_RH_NV_AUTH orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_HANDLE_Unmarshal(target, buffer, size); @@ -981,6 +1042,7 @@ TPMI_RH_NV_AUTH_Unmarshal(TPMI_RH_NV_AUTH *target, BYTE **buffer, INT32 *size) BOOL isNotNv = (*target < NV_INDEX_FIRST) || (*target > NV_INDEX_LAST); if (isNotNv) { rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } } @@ -994,6 +1056,7 @@ TPM_RC TPMI_RH_LOCKOUT_Unmarshal(TPMI_RH_LOCKOUT *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_RH_LOCKOUT orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_HANDLE_Unmarshal(target, buffer, size); @@ -1004,6 +1067,7 @@ TPMI_RH_LOCKOUT_Unmarshal(TPMI_RH_LOCKOUT *target, BYTE **buffer, INT32 *size) break; default: rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -1015,6 +1079,7 @@ TPM_RC TPMI_RH_NV_INDEX_Unmarshal(TPMI_RH_NV_INDEX *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_RH_NV_INDEX orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_HANDLE_Unmarshal(target, buffer, size); @@ -1023,6 +1088,7 @@ TPMI_RH_NV_INDEX_Unmarshal(TPMI_RH_NV_INDEX *target, BYTE **buffer, INT32 *size) BOOL isNotNv = (*target < NV_INDEX_FIRST) || (*target > NV_INDEX_LAST); if (isNotNv) { rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -1034,6 +1100,7 @@ TPM_RC TPMI_ALG_HASH_Unmarshal(TPMI_ALG_HASH *target, BYTE **buffer, INT32 *size, BOOL allowNull) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_ALG_HASH orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_ALG_ID_Unmarshal(target, buffer, size); @@ -1062,6 +1129,7 @@ TPMI_ALG_HASH_Unmarshal(TPMI_ALG_HASH *target, BYTE **buffer, INT32 *size, BOOL } default: rc = TPM_RC_HASH; + *target = orig_target; // libtpms added } } return rc; @@ -1073,6 +1141,7 @@ TPM_RC TPMI_ALG_SYM_Unmarshal(TPMI_ALG_SYM *target, BYTE **buffer, INT32 *size, BOOL allowNull) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_ALG_SYM orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_ALG_ID_Unmarshal(target, buffer, size); @@ -1101,6 +1170,7 @@ TPMI_ALG_SYM_Unmarshal(TPMI_ALG_SYM *target, BYTE **buffer, INT32 *size, BOOL al } default: rc = TPM_RC_SYMMETRIC; + *target = orig_target; // libtpms added } } return rc; @@ -1112,6 +1182,7 @@ TPM_RC TPMI_ALG_SYM_OBJECT_Unmarshal(TPMI_ALG_SYM_OBJECT *target, BYTE **buffer, INT32 *size, BOOL allowNull) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_ALG_SYM_OBJECT orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_ALG_ID_Unmarshal(target, buffer, size); @@ -1137,6 +1208,7 @@ TPMI_ALG_SYM_OBJECT_Unmarshal(TPMI_ALG_SYM_OBJECT *target, BYTE **buffer, INT32 } default: rc = TPM_RC_SYMMETRIC; + *target = orig_target; // libtpms added } } return rc; @@ -1148,6 +1220,7 @@ TPM_RC TPMI_ALG_SYM_MODE_Unmarshal(TPMI_ALG_SYM_MODE *target, BYTE **buffer, INT32 *size, BOOL allowNull) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_ALG_SYM_MODE orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_ALG_ID_Unmarshal(target, buffer, size); @@ -1179,6 +1252,7 @@ TPMI_ALG_SYM_MODE_Unmarshal(TPMI_ALG_SYM_MODE *target, BYTE **buffer, INT32 *siz } default: rc = TPM_RC_MODE; + *target = orig_target; // libtpms added } } return rc; @@ -1190,6 +1264,7 @@ TPM_RC TPMI_ALG_KDF_Unmarshal(TPMI_ALG_KDF *target, BYTE **buffer, INT32 *size, BOOL allowNull) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_ALG_KDF orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_ALG_ID_Unmarshal(target, buffer, size); @@ -1215,6 +1290,7 @@ TPMI_ALG_KDF_Unmarshal(TPMI_ALG_KDF *target, BYTE **buffer, INT32 *size, BOOL al } default: rc = TPM_RC_KDF; + *target = orig_target; // libtpms added } } return rc; @@ -1226,6 +1302,7 @@ TPM_RC TPMI_ALG_SIG_SCHEME_Unmarshal(TPMI_ALG_SIG_SCHEME *target, BYTE **buffer, INT32 *size, BOOL allowNull) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_ALG_SIG_SCHEME orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_ALG_ID_Unmarshal(target, buffer, size); @@ -1260,6 +1337,7 @@ TPMI_ALG_SIG_SCHEME_Unmarshal(TPMI_ALG_SIG_SCHEME *target, BYTE **buffer, INT32 } default: rc = TPM_RC_SCHEME; + *target = orig_target; // libtpms added } } return rc; @@ -1271,6 +1349,7 @@ TPM_RC TPMI_ECC_KEY_EXCHANGE_Unmarshal(TPMI_ECC_KEY_EXCHANGE *target, BYTE **buffer, INT32 *size, BOOL allowNull) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_ECC_KEY_EXCHANGE orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_ALG_ID_Unmarshal(target, buffer, size); @@ -1293,6 +1372,7 @@ TPMI_ECC_KEY_EXCHANGE_Unmarshal(TPMI_ECC_KEY_EXCHANGE *target, BYTE **buffer, IN } default: rc = TPM_RC_SCHEME; + *target = orig_target; // libtpms added } } return rc; @@ -1305,6 +1385,7 @@ TPM_RC TPMI_ST_COMMAND_TAG_Unmarshal(TPMI_ST_COMMAND_TAG *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_ST_COMMAND_TAG orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_ST_Unmarshal(target, buffer, size); @@ -1316,6 +1397,7 @@ TPMI_ST_COMMAND_TAG_Unmarshal(TPMI_ST_COMMAND_TAG *target, BYTE **buffer, INT32 break; default: rc = TPM_RC_BAD_TAG; + *target = orig_target; // libtpms added } } return rc; @@ -1327,6 +1409,7 @@ TPM_RC TPMI_ALG_MAC_SCHEME_Unmarshal(TPMI_ALG_MAC_SCHEME *target, BYTE **buffer, INT32 *size, BOOL allowNull) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_ALG_MAC_SCHEME orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_ALG_ID_Unmarshal(target, buffer, size); @@ -1358,6 +1441,7 @@ TPMI_ALG_MAC_SCHEME_Unmarshal(TPMI_ALG_MAC_SCHEME *target, BYTE **buffer, INT32 } default: rc = TPM_RC_SYMMETRIC; + *target = orig_target; // libtpms added } } return rc; @@ -1369,6 +1453,7 @@ TPM_RC TPMI_ALG_CIPHER_MODE_Unmarshal(TPMI_ALG_CIPHER_MODE*target, BYTE **buffer, INT32 *size, BOOL allowNull) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_ALG_CIPHER_MODE orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_ALG_ID_Unmarshal(target, buffer, size); @@ -1397,6 +1482,7 @@ TPMI_ALG_CIPHER_MODE_Unmarshal(TPMI_ALG_CIPHER_MODE*target, BYTE **buffer, INT32 } default: rc = TPM_RC_MODE; + *target = orig_target; // libtpms added } } return rc; @@ -1633,6 +1719,7 @@ TPM_RC TPMT_TK_CREATION_Unmarshal(TPMT_TK_CREATION *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPM_ST orig_tag = target->tag; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_ST_Unmarshal(&target->tag, buffer, size); @@ -1640,6 +1727,7 @@ TPMT_TK_CREATION_Unmarshal(TPMT_TK_CREATION *target, BYTE **buffer, INT32 *size) if (rc == TPM_RC_SUCCESS) { if (target->tag != TPM_ST_CREATION) { rc = TPM_RC_TAG; + target->tag = orig_tag; // libtpms added } } if (rc == TPM_RC_SUCCESS) { @@ -1657,6 +1745,7 @@ TPM_RC TPMT_TK_VERIFIED_Unmarshal(TPMT_TK_VERIFIED *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPM_ST orig_tag = target->tag; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_ST_Unmarshal(&target->tag, buffer, size); @@ -1664,6 +1753,7 @@ TPMT_TK_VERIFIED_Unmarshal(TPMT_TK_VERIFIED *target, BYTE **buffer, INT32 *size) if (rc == TPM_RC_SUCCESS) { if (target->tag != TPM_ST_VERIFIED) { rc = TPM_RC_TAG; + target->tag = orig_tag; // libtpms added } } if (rc == TPM_RC_SUCCESS) { @@ -1681,6 +1771,7 @@ TPM_RC TPMT_TK_AUTH_Unmarshal(TPMT_TK_AUTH *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPM_ST orig_tag = target->tag; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_ST_Unmarshal(&target->tag, buffer, size); @@ -1689,6 +1780,7 @@ TPMT_TK_AUTH_Unmarshal(TPMT_TK_AUTH *target, BYTE **buffer, INT32 *size) if ((target->tag != TPM_ST_AUTH_SIGNED) && (target->tag != TPM_ST_AUTH_SECRET)) { rc = TPM_RC_TAG; + target->tag = orig_tag; // libtpms added } } if (rc == TPM_RC_SUCCESS) { @@ -1706,6 +1798,7 @@ TPM_RC TPMT_TK_HASHCHECK_Unmarshal(TPMT_TK_HASHCHECK *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPM_ST orig_tag = target->tag; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_ST_Unmarshal(&target->tag, buffer, size); @@ -1713,6 +1806,7 @@ TPMT_TK_HASHCHECK_Unmarshal(TPMT_TK_HASHCHECK *target, BYTE **buffer, INT32 *siz if (rc == TPM_RC_SUCCESS) { if (target->tag != TPM_ST_HASHCHECK) { rc = TPM_RC_TAG; + target->tag = orig_tag; // libtpms added } } if (rc == TPM_RC_SUCCESS) { @@ -2303,6 +2397,7 @@ TPM_RC TPMI_ST_ATTEST_Unmarshal(TPMI_ST_ATTEST *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_ST_ATTEST orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_ST_Unmarshal(target, buffer, size); @@ -2319,6 +2414,7 @@ TPMI_ST_ATTEST_Unmarshal(TPMI_ST_ATTEST *target, BYTE **buffer, INT32 *size) break; default: rc = TPM_RC_SELECTOR; + *target = orig_target; // libtpms added } } return rc; @@ -2413,6 +2509,7 @@ TPM_RC TPMI_AES_KEY_BITS_Unmarshal(TPMI_AES_KEY_BITS *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_AES_KEY_BITS orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_KEY_BITS_Unmarshal(target, buffer, size); @@ -2424,6 +2521,7 @@ TPMI_AES_KEY_BITS_Unmarshal(TPMI_AES_KEY_BITS *target, BYTE **buffer, INT32 *siz break; default: rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -2435,6 +2533,7 @@ TPM_RC TPMI_CAMELLIA_KEY_BITS_Unmarshal(TPMI_CAMELLIA_KEY_BITS *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_CAMELLIA_KEY_BITS orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_KEY_BITS_Unmarshal(target, buffer, size); @@ -2445,6 +2544,7 @@ TPMI_CAMELLIA_KEY_BITS_Unmarshal(TPMI_CAMELLIA_KEY_BITS *target, BYTE **buffer, break; default: rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -2456,6 +2556,7 @@ TPM_RC TPMI_SM4_KEY_BITS_Unmarshal(TPMI_SM4_KEY_BITS *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_SM4_KEY_BITS orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_KEY_BITS_Unmarshal(target, buffer, size); @@ -2466,6 +2567,7 @@ TPMI_SM4_KEY_BITS_Unmarshal(TPMI_SM4_KEY_BITS *target, BYTE **buffer, INT32 *siz break; default: rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -2477,6 +2579,7 @@ TPM_RC TPMI_TDES_KEY_BITS_Unmarshal(TPMI_SM4_KEY_BITS *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_SM4_KEY_BITS orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_KEY_BITS_Unmarshal(target, buffer, size); @@ -2488,6 +2591,7 @@ TPMI_TDES_KEY_BITS_Unmarshal(TPMI_SM4_KEY_BITS *target, BYTE **buffer, INT32 *si break; default: rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -2760,6 +2864,7 @@ TPM_RC TPMI_ALG_KEYEDHASH_SCHEME_Unmarshal(TPMI_ALG_KEYEDHASH_SCHEME *target, BYTE **buffer, INT32 *size, BOOL allowNull) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_ALG_KEYEDHASH_SCHEME orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_ALG_ID_Unmarshal(target, buffer, size); @@ -2779,6 +2884,7 @@ TPMI_ALG_KEYEDHASH_SCHEME_Unmarshal(TPMI_ALG_KEYEDHASH_SCHEME *target, BYTE **bu } default: rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -3163,6 +3269,7 @@ TPM_RC TPMI_ALG_ASYM_SCHEME_Unmarshal(TPMI_ALG_ASYM_SCHEME *target, BYTE **buffer, INT32 *size, BOOL allowNull) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_ALG_ASYM_SCHEME orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_ALG_ID_Unmarshal(target, buffer, size); @@ -3206,6 +3313,7 @@ TPMI_ALG_ASYM_SCHEME_Unmarshal(TPMI_ALG_ASYM_SCHEME *target, BYTE **buffer, INT3 } default: rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -3284,6 +3392,7 @@ TPM_RC TPMI_ALG_RSA_SCHEME_Unmarshal(TPMI_ALG_RSA_SCHEME *target, BYTE **buffer, INT32 *size, BOOL allowNull) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_ALG_RSA_SCHEME orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_ALG_ID_Unmarshal(target, buffer, size); @@ -3309,6 +3418,7 @@ TPMI_ALG_RSA_SCHEME_Unmarshal(TPMI_ALG_RSA_SCHEME *target, BYTE **buffer, INT32 } default: rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -3336,6 +3446,7 @@ TPM_RC TPMI_ALG_RSA_DECRYPT_Unmarshal(TPMI_ALG_RSA_DECRYPT *target, BYTE **buffer, INT32 *size, BOOL allowNull) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_ALG_RSA_DECRYPT orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_ALG_ID_Unmarshal(target, buffer, size); @@ -3355,6 +3466,7 @@ TPMI_ALG_RSA_DECRYPT_Unmarshal(TPMI_ALG_RSA_DECRYPT *target, BYTE **buffer, INT3 } default: rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -3395,6 +3507,7 @@ TPM_RC TPMI_RSA_KEY_BITS_Unmarshal(TPMI_RSA_KEY_BITS *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_RSA_KEY_BITS orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_KEY_BITS_Unmarshal(target, buffer, size); @@ -3406,6 +3519,7 @@ TPMI_RSA_KEY_BITS_Unmarshal(TPMI_RSA_KEY_BITS *target, BYTE **buffer, INT32 *siz break; default: rc = TPM_RC_VALUE; + *target = orig_target; // libtpms added } } return rc; @@ -3490,6 +3604,7 @@ TPM_RC TPMI_ALG_ECC_SCHEME_Unmarshal(TPMI_ALG_ECC_SCHEME *target, BYTE **buffer, INT32 *size, BOOL allowNull) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_ALG_ECC_SCHEME orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_ALG_ID_Unmarshal(target, buffer, size); @@ -3521,6 +3636,7 @@ TPMI_ALG_ECC_SCHEME_Unmarshal(TPMI_ALG_ECC_SCHEME *target, BYTE **buffer, INT32 } default: rc = TPM_RC_SCHEME; + *target = orig_target; // libtpms added } } return rc; @@ -3532,6 +3648,7 @@ TPM_RC TPMI_ECC_CURVE_Unmarshal(TPMI_ECC_CURVE *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_ECC_CURVE orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_ECC_CURVE_Unmarshal(target, buffer, size); @@ -3568,6 +3685,7 @@ TPMI_ECC_CURVE_Unmarshal(TPMI_ECC_CURVE *target, BYTE **buffer, INT32 *size) break; default: rc = TPM_RC_CURVE; + *target = orig_target; // libtpms added } } return rc; @@ -3782,6 +3900,7 @@ TPM_RC TPMI_ALG_PUBLIC_Unmarshal(TPMI_ALG_PUBLIC *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPMI_ALG_PUBLIC orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = TPM_ALG_ID_Unmarshal(target, buffer, size); @@ -3803,6 +3922,7 @@ TPMI_ALG_PUBLIC_Unmarshal(TPMI_ALG_PUBLIC *target, BYTE **buffer, INT32 *size) break; default: rc = TPM_RC_TYPE; + *target = orig_target; // libtpms added } } return rc; @@ -4137,6 +4257,7 @@ TPM_RC TPMA_NV_Unmarshal(TPMA_NV *target, BYTE **buffer, INT32 *size) { TPM_RC rc = TPM_RC_SUCCESS; + TPMA_NV orig_target = *target; // libtpms added if (rc == TPM_RC_SUCCESS) { rc = UINT32_Unmarshal((UINT32 *)target, buffer, size); /* libtpms changed */ @@ -4144,6 +4265,7 @@ TPMA_NV_Unmarshal(TPMA_NV *target, BYTE **buffer, INT32 *size) if (rc == TPM_RC_SUCCESS) { if (*target & TPMA_NV_RESERVED) { rc = TPM_RC_RESERVED_BITS; + *target = orig_target; // libtpms added } } return rc; -- 2.29.0