Skip to content

Commit ebf7a6c

Browse files
committed
Add parsing of remaining capabilities.
1 parent 53feb3f commit ebf7a6c

3 files changed

Lines changed: 127 additions & 13 deletions

File tree

src/tpm2.c

Lines changed: 102 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -879,6 +879,59 @@ TPM_RC TPM2_GetCapability(GetCapability_In* in, GetCapability_Out* out)
879879
TPM2_Packet_ParseU32(&packet, &out->capabilityData.capability);
880880

881881
switch (out->capabilityData.capability) {
882+
case TPM_CAP_ALGS:
883+
{
884+
TPML_ALG_PROPERTY* algorithms =
885+
&out->capabilityData.data.algorithms;
886+
TPM2_Packet_ParseU32(&packet, &algorithms->count);
887+
for (i=0; i<(int)algorithms->count; i++) {
888+
TPM2_Packet_ParseU16(&packet,
889+
&algorithms->algProperties[i].alg);
890+
TPM2_Packet_ParseU32(&packet,
891+
&algorithms->algProperties[i].algProperties);
892+
}
893+
break;
894+
}
895+
case TPM_CAP_HANDLES:
896+
{
897+
TPML_HANDLE* handles =
898+
&out->capabilityData.data.handles;
899+
TPM2_Packet_ParseU32(&packet, &handles->count);
900+
for (i=0; i<(int)handles->count; i++) {
901+
TPM2_Packet_ParseU32(&packet, &handles->handle[i]);
902+
}
903+
break;
904+
}
905+
case TPM_CAP_COMMANDS:
906+
{
907+
TPML_CCA* cmdAttribs =
908+
&out->capabilityData.data.command;
909+
TPM2_Packet_ParseU32(&packet, &cmdAttribs->count);
910+
for (i=0; i<(int)cmdAttribs->count; i++) {
911+
TPM2_Packet_ParseU32(&packet,
912+
&cmdAttribs->commandAttributes[i]);
913+
}
914+
break;
915+
}
916+
case TPM_CAP_PP_COMMANDS:
917+
case TPM_CAP_AUDIT_COMMANDS:
918+
{
919+
TPML_CC* cmdCodes =
920+
&out->capabilityData.data.ppCommands;
921+
TPM2_Packet_ParseU32(&packet, &cmdCodes->count);
922+
for (i=0; i<(int)cmdCodes->count; i++) {
923+
TPM2_Packet_ParseU32(&packet,
924+
&cmdCodes->commandCodes[i]);
925+
}
926+
break;
927+
}
928+
case TPM_CAP_PCRS:
929+
{
930+
TPML_PCR_SELECTION* assignedPCR =
931+
&out->capabilityData.data.assignedPCR;
932+
TPM2_Packet_ParsePCR(&packet, assignedPCR);
933+
break;
934+
}
882935
case TPM_CAP_TPM_PROPERTIES:
883936
{
884937
TPML_TAGGED_TPM_PROPERTY* prop =
@@ -892,13 +945,56 @@ TPM_RC TPM2_GetCapability(GetCapability_In* in, GetCapability_Out* out)
892945
}
893946
break;
894947
}
895-
case TPM_CAP_HANDLES:
948+
case TPM_CAP_PCR_PROPERTIES:
896949
{
897-
TPML_HANDLE* handles =
898-
&out->capabilityData.data.handles;
899-
TPM2_Packet_ParseU32(&packet, &handles->count);
900-
for (i=0; i<(int)handles->count; i++) {
901-
TPM2_Packet_ParseU32(&packet, &handles->handle[i]);
950+
TPML_TAGGED_PCR_PROPERTY* pcrProp =
951+
&out->capabilityData.data.pcrProperties;
952+
TPM2_Packet_ParseU32(&packet, &pcrProp->count);
953+
break;
954+
}
955+
case TPM_CAP_ECC_CURVES:
956+
{
957+
TPML_ECC_CURVE* eccCurves =
958+
&out->capabilityData.data.eccCurves;
959+
TPM2_Packet_ParseU32(&packet, &eccCurves->count);
960+
for (i=0; i<(int)eccCurves->count; i++) {
961+
TPM2_Packet_ParseU16(&packet,
962+
&eccCurves->eccCurves[i]);
963+
}
964+
break;
965+
}
966+
case TPM_CAP_AUTH_POLICIES:
967+
{
968+
TPML_TAGGED_POLICY* authPol =
969+
&out->capabilityData.data.authPolicies;
970+
TPM2_Packet_ParseU32(&packet, &authPol->count);
971+
for (i=0; i<(int)authPol->count; i++) {
972+
int digSz;
973+
TPMS_TAGGED_POLICY* pol = &authPol->policies[i];
974+
TPM2_Packet_ParseU32(&packet, &pol->handle);
975+
TPM2_Packet_ParseU16(&packet, &pol->policyHash.hashAlg);
976+
digSz = (int)TPM2_GetHashDigestSize(
977+
pol->policyHash.hashAlg);
978+
if (digSz > (int)sizeof(pol->policyHash.digest)) {
979+
digSz = (int)sizeof(pol->policyHash.digest);
980+
}
981+
TPM2_Packet_ParseBytes(&packet,
982+
pol->policyHash.digest.H, digSz);
983+
}
984+
break;
985+
}
986+
case TPM_CAP_ACT:
987+
{
988+
TPML_ACT_DATA* actData =
989+
&out->capabilityData.data.actData;
990+
TPM2_Packet_ParseU32(&packet, &actData->count);
991+
for (i=0; i<(int)actData->count; i++) {
992+
TPM2_Packet_ParseU32(&packet,
993+
&actData->actData[i].handle);
994+
TPM2_Packet_ParseU32(&packet,
995+
&actData->actData[i].timeout);
996+
TPM2_Packet_ParseU32(&packet,
997+
&actData->actData[i].attributes);
902998
}
903999
break;
9041000
}
@@ -916,12 +1012,6 @@ TPM_RC TPM2_GetCapability(GetCapability_In* in, GetCapability_Out* out)
9161012
out->capabilityData.data.vendor.size);
9171013
break;
9181014
}
919-
case TPM_CAP_PCRS:
920-
{
921-
TPM2_Packet_ParsePCR(&packet,
922-
&out->capabilityData.data.assignedPCR);
923-
break;
924-
}
9251015
default:
9261016
#ifdef DEBUG_WOLFTPM
9271017
printf("Unknown capability type 0x%x\n",

wolftpm/tpm2.h

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,9 @@ typedef enum {
485485
TPM_CAP_TPM_PROPERTIES = 0x00000006,
486486
TPM_CAP_PCR_PROPERTIES = 0x00000007,
487487
TPM_CAP_ECC_CURVES = 0x00000008,
488-
TPM_CAP_LAST = TPM_CAP_ECC_CURVES,
488+
TPM_CAP_AUTH_POLICIES = 0x00000009,
489+
TPM_CAP_ACT = 0x0000000A,
490+
TPM_CAP_LAST = TPM_CAP_ACT,
489491

490492
TPM_CAP_VENDOR_PROPERTY = 0x00000100,
491493
} TPM_CAP_T;
@@ -1010,6 +1012,24 @@ typedef struct TPML_TAGGED_POLICY {
10101012
TPMS_TAGGED_POLICY policies[MAX_TAGGED_POLICIES];
10111013
} TPML_TAGGED_POLICY;
10121014

1015+
/* Authenticated Countdown Timers (ACT): Added v1.59 */
1016+
typedef enum {
1017+
TPMA_ACT_signaled = 0x00000001,
1018+
TPMA_ACT_preserveSignaled = 0x00000002,
1019+
} TPMA_ACT_T;
1020+
typedef UINT32 TPMA_ACT;
1021+
1022+
typedef struct TPMS_ACT_DATA {
1023+
TPM_HANDLE handle;
1024+
UINT32 timeout;
1025+
TPMA_ACT attributes;
1026+
} TPMS_ACT_DATA;
1027+
1028+
typedef struct TPML_ACT_DATA {
1029+
UINT32 count;
1030+
TPMS_ACT_DATA actData[MAX_ACT_DATA];
1031+
} TPML_ACT_DATA;
1032+
10131033

10141034
/* Capabilities Structures */
10151035

@@ -1024,6 +1044,7 @@ typedef union TPMU_CAPABILITIES {
10241044
TPML_TAGGED_PCR_PROPERTY pcrProperties; /* TPM_CAP_PCR_PROPERTIES */
10251045
TPML_ECC_CURVE eccCurves; /* TPM_CAP_ECC_CURVES */
10261046
TPML_TAGGED_POLICY authPolicies; /* TPM_CAP_AUTH_POLICIES */
1047+
TPML_ACT_DATA actData; /* TPM_CAP_ACT - added v1.57 */
10271048
TPM2B_MAX_BUFFER vendor;
10281049
} TPMU_CAPABILITIES;
10291050

wolftpm/tpm2_types.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -635,6 +635,9 @@ typedef int64_t INT64;
635635
#ifndef MAX_TAGGED_POLICIES
636636
#define MAX_TAGGED_POLICIES (MAX_CAP_DATA / sizeof(TPMS_TAGGED_POLICY))
637637
#endif
638+
#ifndef MAX_ACT_DATA
639+
#define MAX_ACT_DATA (MAX_CAP_DATA / sizeof(TPMS_ACT_DATA))
640+
#endif
638641

639642

640643
/* ---------------------------------------------------------------------------*/

0 commit comments

Comments
 (0)