// This file was extracted from the TCG Published // Trusted Platform Module Library // Part 3: Commands // Family "2.0" // Level 00 Revision 01.16 // October 30, 2014 #include "InternalRoutines.h" #include "PolicyTicket_fp.h" #include "Policy_spt_fp.h" // // // Error Returns Meaning // // TPM_RC_CPHASH policy's cpHash was previously set to a different value // TPM_RC_EXPIRED timeout value in the ticket is in the past and the ticket has expired // TPM_RC_SIZE timeout or cpHash has invalid size for the // TPM_RC_TICKET ticket is not valid // TPM_RC TPM2_PolicyTicket( PolicyTicket_In *in // IN: input parameter list ) { TPM_RC result; SESSION *session; UINT64 timeout; TPMT_TK_AUTH ticketToCompare; TPM_CC commandCode = TPM_CC_PolicySecret; // Input Validation // Get pointer to the session structure session = SessionGet(in->policySession); // NOTE: A trial policy session is not allowed to use this command. // A ticket is used in place of a previously given authorization. Since // a trial policy doesn't actually authenticate, the validated // ticket is not necessary and, in place of using a ticket, one // should use the intended authorization for which the ticket // would be a substitute. if(session->attributes.isTrialPolicy) return TPM_RC_ATTRIBUTES + RC_PolicyTicket_policySession; // Restore timeout data. The format of timeout buffer is TPM-specific. // In this implementation, we simply copy the value of timeout to the // buffer. if(in->timeout.t.size != sizeof(UINT64)) return TPM_RC_SIZE + RC_PolicyTicket_timeout; timeout = BYTE_ARRAY_TO_UINT64(in->timeout.t.buffer); // Do the normal checks on the cpHashA and timeout values result = PolicyParameterChecks(session, timeout, &in->cpHashA, NULL, 0, // no bad nonce return RC_PolicyTicket_cpHashA, RC_PolicyTicket_timeout); if(result != TPM_RC_SUCCESS) return result; // Validate Ticket // Re-generate policy ticket by input parameters TicketComputeAuth(in->ticket.tag, in->ticket.hierarchy, timeout, &in->cpHashA, &in->policyRef, &in->authName, &ticketToCompare); // Compare generated digest with input ticket digest if(!Memory2BEqual(&in->ticket.digest.b, &ticketToCompare.digest.b)) return TPM_RC_TICKET + RC_PolicyTicket_ticket; // Internal Data Update // Is this ticket to take the place of a TPM2_PolicySigned() or // a TPM2_PolicySecret()? if(in->ticket.tag == TPM_ST_AUTH_SIGNED) commandCode = TPM_CC_PolicySigned; else if(in->ticket.tag == TPM_ST_AUTH_SECRET) commandCode = TPM_CC_PolicySecret; else // There could only be two possible tag values. Any other value should // be caught by the ticket validation process. pAssert(FALSE); // Update policy context PolicyContextUpdate(commandCode, &in->authName, &in->policyRef, &in->cpHashA, timeout, session); return TPM_RC_SUCCESS; }