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 #include "PCR_Extend_fp.h"
     10 //
     11 //
     12 //     Error Returns                     Meaning
     13 //
     14 //     TPM_RC_LOCALITY                   current command locality is not allowed to extend the PCR
     15 //                                       referenced by pcrHandle
     16 //
     17 TPM_RC
     18 TPM2_PCR_Extend(
     19    PCR_Extend_In     *in                 // IN: input parameter list
     20    )
     21 {
     22    TPM_RC                  result;
     23    UINT32                  i;
     24 
     25 // Input Validation
     26 
     27    //   NOTE: This function assumes that the unmarshaling function for 'digests' will
     28    //   have validated that all of the indicated hash algorithms are valid. If the
     29    //   hash algorithms are correct, the unmarshaling code will unmarshal a digest
     30    //   of the size indicated by the hash algorithm. If the overall size is not
     31    //   consistent, the unmarshaling code will run out of input data or have input
     32    //   data left over. In either case, it will cause an unmarshaling error and this
     33    //   function will not be called.
     34 
     35    // For NULL handle, do nothing and return success
     36    if(in->pcrHandle == TPM_RH_NULL)
     37        return TPM_RC_SUCCESS;
     38 
     39    // Check if the extend operation is allowed by the current command locality
     40    if(!PCRIsExtendAllowed(in->pcrHandle))
     41        return TPM_RC_LOCALITY;
     42 
     43    // If PCR is state saved and we need to update orderlyState, check NV
     44    // availability
     45    if(PCRIsStateSaved(in->pcrHandle) && gp.orderlyState != SHUTDOWN_NONE)
     46    {
     47        result = NvIsAvailable();
     48        if(result != TPM_RC_SUCCESS) return result;
     49        g_clearOrderly = TRUE;
     50    }
     51 
     52 // Internal Data Update
     53 
     54    // Iterate input digest list to extend
     55    for(i = 0; i < in->digests.count; i++)
     56    {
     57        PCRExtend(in->pcrHandle, in->digests.digests[i].hashAlg,
     58                  CryptGetHashDigestSize(in->digests.digests[i].hashAlg),
     59                  (BYTE *) &in->digests.digests[i].digest);
     60    }
     61 
     62    return TPM_RC_SUCCESS;
     63 }
     64