#ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include "tss2_sys.h" #include "tss2_mu.h" #define LOGMODULE test #include "util/log.h" #include "test-options.h" #include "context-util.h" #define TAB_SIZE(x) (sizeof(x)/sizeof(x[0])) /* NOTE: CAP_PCRS and CAP_HANDLES->HR_PCR do not change until a reboot is triggered. This should be improved if an approach is found. */ struct { TPM2_CAP cap; UINT32 prop; UINT32 count; } capabilities[] = { { TPM2_CAP_PCRS, 0, 10 }, { TPM2_CAP_HANDLES, TPM2_HR_PCR, TPM2_MAX_CAP_HANDLES }, { TPM2_CAP_HANDLES, TPM2_HR_HMAC_SESSION, TPM2_MAX_CAP_HANDLES }, { TPM2_CAP_HANDLES, TPM2_HR_POLICY_SESSION, TPM2_MAX_CAP_HANDLES }, { TPM2_CAP_HANDLES, TPM2_HR_TRANSIENT, TPM2_MAX_CAP_HANDLES }, { TPM2_CAP_HANDLES, TPM2_HR_PERSISTENT, TPM2_MAX_CAP_HANDLES }, { TPM2_CAP_HANDLES, TPM2_HR_NV_INDEX, TPM2_MAX_CAP_HANDLES }, }; int main (int argc, char *argv[]) { TSS2_RC rc; TSS2_SYS_CONTEXT *sapi_context; test_opts_t opts = { .tcti_type = TCTI_DEFAULT, .device_file = DEVICE_PATH_DEFAULT, .socket_address = HOSTNAME_DEFAULT, .socket_port = PORT_DEFAULT, }; get_test_opts_from_env (&opts); if (sanity_check_test_opts (&opts) != 0) exit (1); sapi_context = sapi_init_from_opts (&opts); if (sapi_context == NULL) exit (1); for (size_t i = 0; i < TAB_SIZE(capabilities); i++) { TPMS_CAPABILITY_DATA caps; uint8_t buffer[sizeof(caps)]; size_t off = 0; rc = Tss2_Sys_GetCapability(sapi_context, NULL, capabilities[i].cap, capabilities[i].prop, capabilities[i].count, NULL, &caps, NULL); if (rc != TSS2_RC_SUCCESS) { LOG_ERROR("TPM GetCapabilities FAILED: 0x%"PRIx32, rc); exit(1); } rc = Tss2_MU_TPMS_CAPABILITY_DATA_Marshal(&caps, &buffer[off], sizeof(buffer) - off - 1, &off); if (rc != TSS2_RC_SUCCESS) { LOG_ERROR("Marshaling FAILED: 0x%"PRIx32, rc); exit(1); } buffer[off++] = '\0'; printf("cap%zi: ", i); for (size_t j = 0; j < off; j++) printf("%02"PRIx8, buffer[j]); printf("\n"); } sapi_teardown_full (sapi_context); return 0; }