Home | History | Annotate | Download | only in tpm2
      1 // This file was extracted from the TCG Published
      2 // Trusted Platform Module Library
      3 // Part 3: Commands
      4 // Family "2.0"
      5 // Level 00 Revision 01.16
      6 // October 30, 2014
      7 
      8 #include "InternalRoutines.h"
      9 //
     10 //     This function is called to process a _TPM_Hash_Start() indication.
     11 //
     12 void
     13 _TPM_Hash_Start(
     14    void
     15    )
     16 {
     17    TPM_RC                 result;
     18    TPMI_DH_OBJECT         handle;
     19 
     20    // If a DRTM sequence object exists, free it up
     21    if(g_DRTMHandle != TPM_RH_UNASSIGNED)
     22    {
     23        ObjectFlush(g_DRTMHandle);
     24        g_DRTMHandle = TPM_RH_UNASSIGNED;
     25    }
     26 
     27    // Create an event sequence object and store the handle in global
     28    // g_DRTMHandle. A TPM_RC_OBJECT_MEMORY error may be returned at this point
     29    // The null value for the 'auth' parameter will cause the sequence structure to
     30    // be allocated without being set as present. This keeps the sequence from
     31    // being left behind if the sequence is terminated early.
     32    result = ObjectCreateEventSequence(NULL, &g_DRTMHandle);
     33 
     34    // If a free slot was not available, then free up a slot.
     35    if(result != TPM_RC_SUCCESS)
     36    {
     37        // An implementation does not need to have a fixed relationship between
     38        // slot numbers and handle numbers. To handle the general case, scan for
     39        // a handle that is assigned and free it for the DRTM sequence.
     40        // In the reference implementation, the relationship between handles and
     41        // slots is fixed. So, if the call to ObjectCreateEvenSequence()
     42        // failed indicating that all slots are occupied, then the first handle we
     43        // are going to check (TRANSIENT_FIRST) will be occupied. It will be freed
     44        // so that it can be assigned for use as the DRTM sequence object.
     45        for(handle = TRANSIENT_FIRST; handle < TRANSIENT_LAST; handle++)
     46        {
     47            // try to flush the first object
     48            if(ObjectIsPresent(handle))
     49                break;
     50        }
     51        // If the first call to find a slot fails but none of the slots is occupied
     52        // then there's a big problem
     53        pAssert(handle < TRANSIENT_LAST);
     54 
     55         // Free the slot
     56         ObjectFlush(handle);
     57 
     58         // Try to create an event sequence object again. This time, we must
     59         // succeed.
     60         result = ObjectCreateEventSequence(NULL, &g_DRTMHandle);
     61         pAssert(result == TPM_RC_SUCCESS);
     62    }
     63 
     64    return;
     65 }
     66