Coverage Report

Created: 2025-11-24 06:31

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/tpm2/Load.c
Line
Count
Source
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
0
{
38
0
   TPM_RC                  result = TPM_RC_SUCCESS;
39
0
   TPMT_SENSITIVE          sensitive;
40
0
   TPMI_RH_HIERARCHY       hierarchy;
41
0
   OBJECT                 *parentObject = NULL;
42
0
   BOOL                    skipChecks = FALSE;
43
44
// Input Validation
45
0
   if(in->inPrivate.t.size == 0)
46
0
       return TPM_RC_SIZE + RC_Load_inPrivate;
47
48
0
   parentObject = ObjectGet(in->parentHandle);
49
   // Is the object that is being used as the parent actually a parent.
50
0
   if(!AreAttributesForParent(parentObject))
51
0
       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
0
   if(parentObject->publicArea.objectAttributes.fixedTPM)
58
0
       skipChecks = TRUE;
59
0
   else
60
0
   {
61
       // If parent doesn't have fixedTPM SET, then this can't have
62
       // fixedTPM SET.
63
0
       if(in->inPublic.t.publicArea.objectAttributes.fixedTPM == SET)
64
0
           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
0
       result = PublicAttributesValidation(TRUE, in->parentHandle,
71
0
                                           &in->inPublic.t.publicArea);
72
0
       if(result != TPM_RC_SUCCESS)
73
0
           return RcSafeAddToResult(result, RC_Load_inPublic);
74
0
   }
75
76
   // Compute the name of object
77
0
   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
0
   result = PrivateToSensitive(&in->inPrivate, &out->name, in->parentHandle,
83
0
                               in->inPublic.t.publicArea.nameAlg,
84
0
                               &sensitive);
85
0
   if(result != TPM_RC_SUCCESS)
86
0
       return RcSafeAddToResult(result, RC_Load_inPrivate);
87
88
// Internal Data Update
89
90
   // Get hierarchy of parent
91
0
   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
0
   result = ObjectLoad(hierarchy, &in->inPublic.t.publicArea, &sensitive,
97
0
                       &out->name, in->parentHandle, skipChecks,
98
0
                       &out->objectHandle);
99
100
0
   if(result != TPM_RC_SUCCESS)
101
0
       return result;
102
103
0
   return TPM_RC_SUCCESS;
104
0
}