From 1b3e0eea3c54d2182b12eacfa1ee196b9ad69054 Mon Sep 17 00:00:00 2001 From: Aidan Garske Date: Wed, 12 Aug 2026 15:07:32 -0700 Subject: [PATCH 1/2] F-9195 - Reject LoadExternal private area of an unsupported type --- src/fwtpm/fwtpm_command.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/fwtpm/fwtpm_command.c b/src/fwtpm/fwtpm_command.c index 3457948a..7d318e83 100644 --- a/src/fwtpm/fwtpm_command.c +++ b/src/fwtpm/fwtpm_command.c @@ -5429,6 +5429,13 @@ static TPM_RC FwCmd_LoadExternal(FWTPM_CTX* ctx, TPM2_Packet* cmd, } #endif /* !NO_RSA */ + /* A supplied private area whose sensitiveType matched no branch above (for + * example PQC types not yet supported by LoadExternal) must be rejected, + * not silently discarded, mirroring FwImportReconstructKey. */ + if (rc == 0 && inPrivSize > 0 && privKeyDerSz == 0) { + rc = TPM_RC_TYPE; + } + /* Allocate transient object */ if (rc == 0) { obj = FwAllocObject(ctx, &objHandle); From 6694dff15d3e5d21ff487783a7aaaa0a494cf41f Mon Sep 17 00:00:00 2001 From: Aidan Garske Date: Wed, 12 Aug 2026 16:42:52 -0700 Subject: [PATCH 2/2] F-9204 - Order creation ticket HMAC as name then creationHash --- src/fwtpm/fwtpm_command.c | 12 ++++++------ src/fwtpm/fwtpm_crypto.c | 16 +++++++++++----- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/fwtpm/fwtpm_command.c b/src/fwtpm/fwtpm_command.c index 7d318e83..e75637d1 100644 --- a/src/fwtpm/fwtpm_command.c +++ b/src/fwtpm/fwtpm_command.c @@ -13129,12 +13129,12 @@ static TPM_RC FwCmd_CertifyCreation(FWTPM_CTX* ctx, TPM2_Packet* cmd, FwComputeObjectName(objToSign); } - /* ticketData = creationHash || objectName */ - XMEMCPY(ticketData, creationHash.buffer, creationHash.size); - ticketDataSz = creationHash.size; - XMEMCPY(ticketData + ticketDataSz, objToSign->name.name, - objToSign->name.size); - ticketDataSz += objToSign->name.size; + /* ticketData = objectName || creationHash per Part 2 Sec.10.6.3 */ + XMEMCPY(ticketData, objToSign->name.name, objToSign->name.size); + ticketDataSz = objToSign->name.size; + XMEMCPY(ticketData + ticketDataSz, creationHash.buffer, + creationHash.size); + ticketDataSz += creationHash.size; int hmacRc; UINT16 sizeMismatch; diff --git a/src/fwtpm/fwtpm_crypto.c b/src/fwtpm/fwtpm_crypto.c index 6df367fb..68f331f5 100644 --- a/src/fwtpm/fwtpm_crypto.c +++ b/src/fwtpm/fwtpm_crypto.c @@ -387,15 +387,21 @@ int FwAppendCreationHashAndTicket(FWTPM_CTX* ctx, TPM2_Packet* rsp, TPM2_Packet_AppendU16(rsp, (UINT16)chSz); if (chSz > 0) { TPM2_Packet_AppendBytes(rsp, creationHash, chSz); - XMEMCPY(ticketData, creationHash, chSz); - ticketDataSz = chSz; } + /* ticketData = objectName || creationHash per TPM 2.0 Part 2 Sec.10.6.3 */ if (objNameSz > 0) { - if (ticketDataSz + objNameSz > (int)sizeof(ticketData)) { + if (objNameSz > (int)sizeof(ticketData)) { return TPM_RC_SIZE; } - XMEMCPY(ticketData + ticketDataSz, objName, objNameSz); - ticketDataSz += objNameSz; + XMEMCPY(ticketData, objName, objNameSz); + ticketDataSz = objNameSz; + } + if (chSz > 0) { + if (ticketDataSz + chSz > (int)sizeof(ticketData)) { + return TPM_RC_SIZE; + } + XMEMCPY(ticketData + ticketDataSz, creationHash, chSz); + ticketDataSz += chSz; } return FwAppendTicket(ctx, rsp, TPM_ST_CREATION, hierarchy, nameAlg, ticketData, ticketDataSz, NULL, 0);