// This file was extracted from the TCG Published // Trusted Platform Module Library // Part 3: Commands // Family "2.0" // Level 00 Revision 01.16 // October 30, 2014 #include "InternalRoutines.h" #include "GetCapability_fp.h" // // // Error Returns Meaning // // TPM_RC_HANDLE value of property is in an unsupported handle range for the // TPM_CAP_HANDLES capability value // TPM_RC_VALUE invalid capability; or property is not 0 for the TPM_CAP_PCRS // capability value // TPM_RC TPM2_GetCapability( GetCapability_In *in, // IN: input parameter list GetCapability_Out *out // OUT: output parameter list ) { // Command Output // Set output capability type the same as input type out->capabilityData.capability = in->capability; switch(in->capability) { case TPM_CAP_ALGS: out->moreData = AlgorithmCapGetImplemented((TPM_ALG_ID) in->property, in->propertyCount, &out->capabilityData.data.algorithms); break; case TPM_CAP_HANDLES: switch(HandleGetType((TPM_HANDLE) in->property)) { case TPM_HT_TRANSIENT: // Get list of handles of loaded transient objects out->moreData = ObjectCapGetLoaded((TPM_HANDLE) in->property, in->propertyCount, &out->capabilityData.data.handles); break; case TPM_HT_PERSISTENT: // Get list of handles of persistent objects out->moreData = NvCapGetPersistent((TPM_HANDLE) in->property, in->propertyCount, &out->capabilityData.data.handles); break; case TPM_HT_NV_INDEX: // Get list of defined NV index out->moreData = NvCapGetIndex((TPM_HANDLE) in->property, in->propertyCount, &out->capabilityData.data.handles); break; case TPM_HT_LOADED_SESSION: // Get list of handles of loaded sessions out->moreData = SessionCapGetLoaded((TPM_HANDLE) in->property, in->propertyCount, &out->capabilityData.data.handles); break; case TPM_HT_ACTIVE_SESSION: // Get list of handles of out->moreData = SessionCapGetSaved((TPM_HANDLE) in->property, in->propertyCount, &out->capabilityData.data.handles); break; case TPM_HT_PCR: // Get list of handles of PCR out->moreData = PCRCapGetHandles((TPM_HANDLE) in->property, in->propertyCount, &out->capabilityData.data.handles); break; case TPM_HT_PERMANENT: // Get list of permanent handles out->moreData = PermanentCapGetHandles( (TPM_HANDLE) in->property, in->propertyCount, &out->capabilityData.data.handles); break; default: // Unsupported input handle type return TPM_RC_HANDLE + RC_GetCapability_property; break; } break; case TPM_CAP_COMMANDS: out->moreData = CommandCapGetCCList((TPM_CC) in->property, in->propertyCount, &out->capabilityData.data.command); break; case TPM_CAP_PP_COMMANDS: out->moreData = PhysicalPresenceCapGetCCList((TPM_CC) in->property, in->propertyCount, &out->capabilityData.data.ppCommands); break; case TPM_CAP_AUDIT_COMMANDS: out->moreData = CommandAuditCapGetCCList((TPM_CC) in->property, in->propertyCount, &out->capabilityData.data.auditCommands); break; case TPM_CAP_PCRS: // Input property must be 0 if(in->property != 0) return TPM_RC_VALUE + RC_GetCapability_property; out->moreData = PCRCapGetAllocation(in->propertyCount, &out->capabilityData.data.assignedPCR); break; case TPM_CAP_PCR_PROPERTIES: out->moreData = PCRCapGetProperties((TPM_PT_PCR) in->property, in->propertyCount, &out->capabilityData.data.pcrProperties); break; case TPM_CAP_TPM_PROPERTIES: out->moreData = TPMCapGetProperties((TPM_PT) in->property, in->propertyCount, &out->capabilityData.data.tpmProperties); break; #ifdef TPM_ALG_ECC case TPM_CAP_ECC_CURVES: out->moreData = CryptCapGetECCCurve((TPM_ECC_CURVE ) in->property, in->propertyCount, &out->capabilityData.data.eccCurves); break; #endif // TPM_ALG_ECC case TPM_CAP_VENDOR_PROPERTY: // vendor property is not implemented default: // Unexpected TPM_CAP value return TPM_RC_VALUE; break; } return TPM_RC_SUCCESS; }