// 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;
}