Home | History | Annotate | Download | only in tpm2
      1 // This file was extracted from the TCG Published
      2 // Trusted Platform Module Library
      3 // Part 4: Supporting Routines
      4 // Family "2.0"
      5 // Level 00 Revision 01.16
      6 // October 30, 2014
      7 
      8 #include "InternalRoutines.h"
      9 //
     10 //
     11 //       10.3.3       Functions
     12 //
     13 //       10.3.3.1       TicketIsSafe()
     14 //
     15 //       This function indicates if producing a ticket is safe. It checks if the leading bytes of an input buffer is
     16 //       TPM_GENERATED_VALUE or its substring of canonical form. If so, it is not safe to produce ticket for an
     17 //       input buffer claiming to be TPM generated buffer
     18 //
     19 //       Return Value                      Meaning
     20 //
     21 //       TRUE                              It is safe to produce ticket
     22 //       FALSE                             It is not safe to produce ticket
     23 //
     24 BOOL
     25 TicketIsSafe(
     26       TPM2B                *buffer
     27       )
     28 {
     29       TPM_GENERATED        valueToCompare = TPM_GENERATED_VALUE;
     30       BYTE                 bufferToCompare[sizeof(valueToCompare)];
     31       BYTE                 *marshalBuffer;
     32       INT32                bufferSize;
     33       // If the buffer size is less than the size of TPM_GENERATED_VALUE, assume
     34       // it is not safe to generate a ticket
     35       if(buffer->size < sizeof(valueToCompare))
     36           return FALSE;
     37       marshalBuffer = bufferToCompare;
     38       bufferSize = sizeof(TPM_GENERATED);
     39    TPM_GENERATED_Marshal(&valueToCompare, &marshalBuffer, &bufferSize);
     40    if(MemoryEqual(buffer->buffer, bufferToCompare, sizeof(valueToCompare)))
     41        return FALSE;
     42    else
     43        return TRUE;
     44 }
     45 //
     46 //
     47 //     10.3.3.2   TicketComputeVerified()
     48 //
     49 //     This function creates a TPMT_TK_VERIFIED ticket.
     50 //
     51 void
     52 TicketComputeVerified(
     53    TPMI_RH_HIERARCHY          hierarchy,       //   IN: hierarchy constant for ticket
     54    TPM2B_DIGEST              *digest,          //   IN: digest
     55    TPM2B_NAME                *keyName,         //   IN: name of key that signed the value
     56    TPMT_TK_VERIFIED          *ticket           //   OUT: verified ticket
     57    )
     58 {
     59    TPM2B_AUTH                *proof;
     60    HMAC_STATE                 hmacState;
     61    // Fill in ticket fields
     62    ticket->tag = TPM_ST_VERIFIED;
     63    ticket->hierarchy = hierarchy;
     64    // Use the proof value of the hierarchy
     65    proof = HierarchyGetProof(hierarchy);
     66    // Start HMAC
     67    ticket->digest.t.size = CryptStartHMAC2B(CONTEXT_INTEGRITY_HASH_ALG,
     68                                             &proof->b, &hmacState);
     69    // add TPM_ST_VERIFIED
     70    CryptUpdateDigestInt(&hmacState, sizeof(TPM_ST), &ticket->tag);
     71    // add digest
     72    CryptUpdateDigest2B(&hmacState, &digest->b);
     73    // add key name
     74    CryptUpdateDigest2B(&hmacState, &keyName->b);
     75    // complete HMAC
     76    CryptCompleteHMAC2B(&hmacState, &ticket->digest.b);
     77    return;
     78 }
     79 //
     80 //
     81 //     10.3.3.3   TicketComputeAuth()
     82 //
     83 //     This function creates a TPMT_TK_AUTH ticket.
     84 //
     85 void
     86 TicketComputeAuth(
     87    TPM_ST                     type,            //   IN: the type of ticket.
     88    TPMI_RH_HIERARCHY          hierarchy,       //   IN: hierarchy constant for ticket
     89    UINT64                     timeout,         //   IN: timeout
     90    TPM2B_DIGEST              *cpHashA,         //   IN: input cpHashA
     91    TPM2B_NONCE               *policyRef,       //   IN: input policyRef
     92    TPM2B_NAME                *entityName,      //   IN: name of entity
     93    TPMT_TK_AUTH              *ticket           //   OUT: Created ticket
     94    )
     95 {
     96    TPM2B_AUTH              *proof;
     97    HMAC_STATE               hmacState;
     98    // Get proper proof
     99    proof = HierarchyGetProof(hierarchy);
    100    // Fill in ticket fields
    101    ticket->tag = type;
    102    ticket->hierarchy = hierarchy;
    103    // Start HMAC
    104    ticket->digest.t.size = CryptStartHMAC2B(CONTEXT_INTEGRITY_HASH_ALG,
    105                                             &proof->b, &hmacState);
    106    // Adding TPM_ST_AUTH
    107    CryptUpdateDigestInt(&hmacState, sizeof(UINT16), &ticket->tag);
    108    // Adding timeout
    109    CryptUpdateDigestInt(&hmacState, sizeof(UINT64), &timeout);
    110    // Adding cpHash
    111    CryptUpdateDigest2B(&hmacState, &cpHashA->b);
    112    // Adding policyRef
    113    CryptUpdateDigest2B(&hmacState, &policyRef->b);
    114    // Adding keyName
    115    CryptUpdateDigest2B(&hmacState, &entityName->b);
    116    // Compute HMAC
    117    CryptCompleteHMAC2B(&hmacState, &ticket->digest.b);
    118    return;
    119 }
    120 //
    121 //
    122 //      10.3.3.4   TicketComputeHashCheck()
    123 //
    124 //      This function creates a TPMT_TK_HASHCHECK ticket.
    125 //
    126 void
    127 TicketComputeHashCheck(
    128    TPMI_RH_HIERARCHY        hierarchy,      //   IN: hierarchy constant for ticket
    129    TPM_ALG_ID               hashAlg,        //   IN: the hash algorithm used to create
    130                                             //       'digest'
    131    TPM2B_DIGEST            *digest,         //   IN: input digest
    132    TPMT_TK_HASHCHECK       *ticket          //   OUT: Created ticket
    133    )
    134 {
    135    TPM2B_AUTH              *proof;
    136    HMAC_STATE               hmacState;
    137    // Get proper proof
    138    proof = HierarchyGetProof(hierarchy);
    139    // Fill in ticket fields
    140    ticket->tag = TPM_ST_HASHCHECK;
    141    ticket->hierarchy = hierarchy;
    142    ticket->digest.t.size = CryptStartHMAC2B(CONTEXT_INTEGRITY_HASH_ALG,
    143                                             &proof->b, &hmacState);
    144    // Add TPM_ST_HASHCHECK
    145    CryptUpdateDigestInt(&hmacState, sizeof(TPM_ST), &ticket->tag);
    146 //
    147       // Add hash algorithm
    148       CryptUpdateDigestInt(&hmacState, sizeof(hashAlg), &hashAlg);
    149       // Add digest
    150       CryptUpdateDigest2B(&hmacState, &digest->b);
    151       // Compute HMAC
    152       CryptCompleteHMAC2B(&hmacState, &ticket->digest.b);
    153       return;
    154 }
    155 //
    156 //
    157 //      10.3.3.5     TicketComputeCreation()
    158 //
    159 //      This function creates a TPMT_TK_CREATION ticket.
    160 //
    161 void
    162 TicketComputeCreation(
    163       TPMI_RH_HIERARCHY       hierarchy,        //   IN: hierarchy for ticket
    164       TPM2B_NAME             *name,             //   IN: object name
    165       TPM2B_DIGEST           *creation,         //   IN: creation hash
    166       TPMT_TK_CREATION       *ticket            //   OUT: created ticket
    167       )
    168 {
    169       TPM2B_AUTH             *proof;
    170       HMAC_STATE              hmacState;
    171       // Get proper proof
    172       proof = HierarchyGetProof(hierarchy);
    173       // Fill in ticket fields
    174       ticket->tag = TPM_ST_CREATION;
    175       ticket->hierarchy = hierarchy;
    176       ticket->digest.t.size = CryptStartHMAC2B(CONTEXT_INTEGRITY_HASH_ALG,
    177                                                &proof->b, &hmacState);
    178       // Add TPM_ST_CREATION
    179       CryptUpdateDigestInt(&hmacState, sizeof(TPM_ST), &ticket->tag);
    180       // Add name
    181       CryptUpdateDigest2B(&hmacState, &name->b);
    182       // Add creation hash
    183       CryptUpdateDigest2B(&hmacState, &creation->b);
    184       // Compute HMAC
    185       CryptCompleteHMAC2B(&hmacState, &ticket->digest.b);
    186       return;
    187 }
    188