@@ -5512,6 +5512,9 @@ static TPM_RC FwCmd_Sign(FWTPM_CTX* ctx, TPM2_Packet* cmd,
55125512 UINT16 ticketTag = 0 ;
55135513 UINT32 ticketHier = 0 ;
55145514 byte ticketDigest [TPM_MAX_DIGEST_SIZE ];
5515+ byte expectedHmac [TPM_MAX_DIGEST_SIZE ];
5516+ int expectedSz = 0 ;
5517+ int ticketSupplied = 0 ;
55155518 FWTPM_Object * obj = NULL ;
55165519 int paramSzPos = 0 ;
55175520 int paramStart = 0 ;
@@ -5603,24 +5606,30 @@ static TPM_RC FwCmd_Sign(FWTPM_CTX* ctx, TPM2_Packet* cmd,
56035606 }
56045607 }
56055608
5606- /* For restricted signing keys: verify the ticket proves the digest
5607- * was produced by this TPM per TPM 2.0 Part 3 Section 12.4 */
5608- if (rc == 0 && (obj -> pub .objectAttributes & TPMA_OBJECT_restricted )) {
5609- if (ticketTag != TPM_ST_HASHCHECK || ticketHier == TPM_RH_NULL ) {
5609+ /* Validate TK_HASHCHECK ticket per TPM 2.0 Part 3 Section 18.7 / 12.4:
5610+ * - Restricted signing keys REQUIRE a valid ticket.
5611+ * - For any key, if a ticket is supplied, it must verify. */
5612+ if (rc == 0 ) {
5613+ ticketSupplied = (ticketHier != TPM_RH_NULL && vdSz > 0 );
5614+ if ((obj -> pub .objectAttributes & TPMA_OBJECT_restricted ) &&
5615+ !ticketSupplied ) {
56105616 rc = TPM_RC_TICKET ;
56115617 }
5612- if (rc == 0 ) {
5613- byte expectedHmac [TPM_MAX_DIGEST_SIZE ];
5614- int expectedSz = 0 ;
5615- int trc = FwComputeTicketHmac (ctx , ticketHier , obj -> pub .nameAlg ,
5616- digest .buffer , digest .size , expectedHmac , & expectedSz );
5617- if (trc != 0 || vdSz != (UINT16 )expectedSz ||
5618+ }
5619+ if (rc == 0 && ticketSupplied ) {
5620+ if (ticketTag != TPM_ST_HASHCHECK ) {
5621+ rc = TPM_RC_TICKET ;
5622+ }
5623+ }
5624+ if (rc == 0 && ticketSupplied ) {
5625+ rc = FwComputeTicketHmac (ctx , ticketHier , obj -> pub .nameAlg ,
5626+ digest .buffer , digest .size , expectedHmac , & expectedSz );
5627+ if (rc != 0 || vdSz != (UINT16 )expectedSz ||
56185628 TPM2_ConstantCompare (ticketDigest , expectedHmac ,
56195629 (word32 )expectedSz ) != 0 ) {
5620- rc = TPM_RC_TICKET ;
5621- }
5622- TPM2_ForceZero (expectedHmac , sizeof (expectedHmac ));
5630+ rc = TPM_RC_TICKET ;
56235631 }
5632+ TPM2_ForceZero (expectedHmac , sizeof (expectedHmac ));
56245633 }
56255634
56265635#ifdef DEBUG_WOLFTPM
0 commit comments