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 "Load_fp.h"
     10 #include "Object_spt_fp.h"
     11 //
     12 //
     13 //     Error Returns               Meaning
     14 //
     15 //     TPM_RC_ASYMMETRIC           storage key with different asymmetric type than parent
     16 //     TPM_RC_ATTRIBUTES           inPulblic attributes are not allowed with selected parent
     17 //     TPM_RC_BINDING              inPrivate and inPublic are not cryptographically bound
     18 //     TPM_RC_HASH                 incorrect hash selection for signing key
     19 //     TPM_RC_INTEGRITY            HMAC on inPrivate was not valid
     20 //     TPM_RC_KDF                  KDF selection not allowed
     21 //     TPM_RC_KEY                  the size of the object's unique field is not consistent with the indicated
     22 //                                 size in the object's parameters
     23 //     TPM_RC_OBJECT_MEMORY        no available object slot
     24 //     TPM_RC_SCHEME               the signing scheme is not valid for the key
     25 //     TPM_RC_SENSITIVE            the inPrivate did not unmarshal correctly
     26 //     TPM_RC_SIZE                 inPrivate missing, or authPolicy size for inPublic or is not valid
     27 //     TPM_RC_SYMMETRIC            symmetric algorithm not provided when required
     28 //     TPM_RC_TYPE                 parentHandle is not a storage key, or the object to load is a storage
     29 //                                 key but its parameters do not match the parameters of the parent.
     30 //     TPM_RC_VALUE                decryption failure
     31 //
     32 TPM_RC
     33 TPM2_Load(
     34    Load_In         *in,             // IN: input parameter list
     35    Load_Out        *out             // OUT: output parameter list
     36    )
     37 {
     38    TPM_RC                  result = TPM_RC_SUCCESS;
     39    TPMT_SENSITIVE          sensitive;
     40    TPMI_RH_HIERARCHY       hierarchy;
     41    OBJECT                 *parentObject = NULL;
     42    BOOL                    skipChecks = FALSE;
     43 
     44 // Input Validation
     45    if(in->inPrivate.t.size == 0)
     46        return TPM_RC_SIZE + RC_Load_inPrivate;
     47 
     48    parentObject = ObjectGet(in->parentHandle);
     49    // Is the object that is being used as the parent actually a parent.
     50    if(!AreAttributesForParent(parentObject))
     51        return TPM_RC_TYPE + RC_Load_parentHandle;
     52 
     53    // If the parent is fixedTPM, then the attributes of the object
     54    // are either "correct by construction" or were validated
     55    // when the object was imported. If they pass the integrity
     56    // check, then the values are valid
     57    if(parentObject->publicArea.objectAttributes.fixedTPM)
     58        skipChecks = TRUE;
     59    else
     60    {
     61        // If parent doesn't have fixedTPM SET, then this can't have
     62        // fixedTPM SET.
     63        if(in->inPublic.t.publicArea.objectAttributes.fixedTPM == SET)
     64            return TPM_RC_ATTRIBUTES + RC_Load_inPublic;
     65 
     66        // Perform self check on input public area. A TPM_RC_SIZE, TPM_RC_SCHEME,
     67        // TPM_RC_VALUE, TPM_RC_SYMMETRIC, TPM_RC_TYPE, TPM_RC_HASH,
     68        // TPM_RC_ASYMMETRIC, TPM_RC_ATTRIBUTES or TPM_RC_KDF error may be returned
     69        // at this point
     70        result = PublicAttributesValidation(TRUE, in->parentHandle,
     71                                            &in->inPublic.t.publicArea);
     72        if(result != TPM_RC_SUCCESS)
     73            return RcSafeAddToResult(result, RC_Load_inPublic);
     74    }
     75 
     76    // Compute the name of object
     77    ObjectComputeName(&in->inPublic.t.publicArea, &out->name);
     78 
     79    // Retrieve sensitive data. PrivateToSensitive() may return TPM_RC_INTEGRITY or
     80    // TPM_RC_SENSITIVE
     81    // errors may be returned at this point
     82    result = PrivateToSensitive(&in->inPrivate, &out->name, in->parentHandle,
     83                                in->inPublic.t.publicArea.nameAlg,
     84                                &sensitive);
     85    if(result != TPM_RC_SUCCESS)
     86        return RcSafeAddToResult(result, RC_Load_inPrivate);
     87 
     88 // Internal Data Update
     89 
     90    // Get hierarchy of parent
     91    hierarchy = ObjectGetHierarchy(in->parentHandle);
     92 
     93    // Create internal object. A lot of different errors may be returned by this
     94    // loading operation as it will do several validations, including the public
     95    // binding check
     96    result = ObjectLoad(hierarchy, &in->inPublic.t.publicArea, &sensitive,
     97                        &out->name, in->parentHandle, skipChecks,
     98                        &out->objectHandle);
     99 
    100    if(result != TPM_RC_SUCCESS)
    101        return result;
    102 
    103    return TPM_RC_SUCCESS;
    104 }
    105