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 "ObjectChangeAuth_fp.h" 10 #include "Object_spt_fp.h" 11 // 12 // 13 // Error Returns Meaning 14 // 15 // TPM_RC_SIZE newAuth is larger than the size of the digest of the Name algorithm of 16 // objectHandle 17 // TPM_RC_TYPE the key referenced by parentHandle is not the parent of the object 18 // referenced by objectHandle; or objectHandle is a sequence object. 19 // 20 TPM_RC 21 TPM2_ObjectChangeAuth( 22 ObjectChangeAuth_In *in, // IN: input parameter list 23 ObjectChangeAuth_Out *out // OUT: output parameter list 24 ) 25 { 26 TPMT_SENSITIVE sensitive; 27 28 OBJECT *object; 29 TPM2B_NAME objectQN, QNCompare; 30 TPM2B_NAME parentQN; 31 32 // Input Validation 33 34 // Get object pointer 35 object = ObjectGet(in->objectHandle); 36 37 // Can not change auth on sequence object 38 if(ObjectIsSequence(object)) 39 return TPM_RC_TYPE + RC_ObjectChangeAuth_objectHandle; 40 41 // Make sure that the auth value is consistent with the nameAlg 42 if( MemoryRemoveTrailingZeros(&in->newAuth) 43 > CryptGetHashDigestSize(object->publicArea.nameAlg)) 44 return TPM_RC_SIZE + RC_ObjectChangeAuth_newAuth; 45 46 // Check parent for object 47 // parent handle must be the parent of object handle. In this 48 // implementation we verify this by checking the QN of object. Other 49 // implementation may choose different method to verify this attribute. 50 ObjectGetQualifiedName(in->parentHandle, &parentQN); 51 ObjectComputeQualifiedName(&parentQN, object->publicArea.nameAlg, 52 &object->name, &QNCompare); 53 54 ObjectGetQualifiedName(in->objectHandle, &objectQN); 55 if(!Memory2BEqual(&objectQN.b, &QNCompare.b)) 56 return TPM_RC_TYPE + RC_ObjectChangeAuth_parentHandle; 57 58 // Command Output 59 60 // Copy internal sensitive area 61 sensitive = object->sensitive; 62 // Copy authValue 63 sensitive.authValue = in->newAuth; 64 65 // Prepare output private data from sensitive 66 SensitiveToPrivate(&sensitive, &object->name, in->parentHandle, 67 object->publicArea.nameAlg, 68 &out->outPrivate); 69 70 return TPM_RC_SUCCESS; 71 } 72