1*758e9fbaSOystein Eftevaag #ifdef HAVE_CONFIG_H
2*758e9fbaSOystein Eftevaag #include <config.h>
3*758e9fbaSOystein Eftevaag #endif
4*758e9fbaSOystein Eftevaag
5*758e9fbaSOystein Eftevaag #include <stdbool.h>
6*758e9fbaSOystein Eftevaag #include <stdlib.h>
7*758e9fbaSOystein Eftevaag #include <stdio.h>
8*758e9fbaSOystein Eftevaag #include <inttypes.h>
9*758e9fbaSOystein Eftevaag
10*758e9fbaSOystein Eftevaag #include "tss2_sys.h"
11*758e9fbaSOystein Eftevaag #include "tss2_mu.h"
12*758e9fbaSOystein Eftevaag
13*758e9fbaSOystein Eftevaag #define LOGMODULE test
14*758e9fbaSOystein Eftevaag #include "util/log.h"
15*758e9fbaSOystein Eftevaag #include "test-options.h"
16*758e9fbaSOystein Eftevaag #include "context-util.h"
17*758e9fbaSOystein Eftevaag
18*758e9fbaSOystein Eftevaag #define TAB_SIZE(x) (sizeof(x)/sizeof(x[0]))
19*758e9fbaSOystein Eftevaag
20*758e9fbaSOystein Eftevaag /* NOTE: CAP_PCRS and CAP_HANDLES->HR_PCR do not change until a reboot is
21*758e9fbaSOystein Eftevaag triggered. This should be improved if an approach is found. */
22*758e9fbaSOystein Eftevaag struct {
23*758e9fbaSOystein Eftevaag TPM2_CAP cap;
24*758e9fbaSOystein Eftevaag UINT32 prop;
25*758e9fbaSOystein Eftevaag UINT32 count;
26*758e9fbaSOystein Eftevaag } capabilities[] = {
27*758e9fbaSOystein Eftevaag { TPM2_CAP_PCRS, 0, 10 },
28*758e9fbaSOystein Eftevaag { TPM2_CAP_HANDLES, TPM2_HR_PCR, TPM2_MAX_CAP_HANDLES },
29*758e9fbaSOystein Eftevaag { TPM2_CAP_HANDLES, TPM2_HR_HMAC_SESSION, TPM2_MAX_CAP_HANDLES },
30*758e9fbaSOystein Eftevaag { TPM2_CAP_HANDLES, TPM2_HR_POLICY_SESSION, TPM2_MAX_CAP_HANDLES },
31*758e9fbaSOystein Eftevaag { TPM2_CAP_HANDLES, TPM2_HR_TRANSIENT, TPM2_MAX_CAP_HANDLES },
32*758e9fbaSOystein Eftevaag { TPM2_CAP_HANDLES, TPM2_HR_PERSISTENT, TPM2_MAX_CAP_HANDLES },
33*758e9fbaSOystein Eftevaag { TPM2_CAP_HANDLES, TPM2_HR_NV_INDEX, TPM2_MAX_CAP_HANDLES },
34*758e9fbaSOystein Eftevaag };
35*758e9fbaSOystein Eftevaag
36*758e9fbaSOystein Eftevaag int
main(int argc,char * argv[])37*758e9fbaSOystein Eftevaag main (int argc, char *argv[])
38*758e9fbaSOystein Eftevaag {
39*758e9fbaSOystein Eftevaag TSS2_RC rc;
40*758e9fbaSOystein Eftevaag TSS2_SYS_CONTEXT *sapi_context;
41*758e9fbaSOystein Eftevaag
42*758e9fbaSOystein Eftevaag test_opts_t opts = {
43*758e9fbaSOystein Eftevaag .tcti_type = TCTI_DEFAULT,
44*758e9fbaSOystein Eftevaag .device_file = DEVICE_PATH_DEFAULT,
45*758e9fbaSOystein Eftevaag .socket_address = HOSTNAME_DEFAULT,
46*758e9fbaSOystein Eftevaag .socket_port = PORT_DEFAULT,
47*758e9fbaSOystein Eftevaag };
48*758e9fbaSOystein Eftevaag
49*758e9fbaSOystein Eftevaag get_test_opts_from_env (&opts);
50*758e9fbaSOystein Eftevaag if (sanity_check_test_opts (&opts) != 0)
51*758e9fbaSOystein Eftevaag exit (1);
52*758e9fbaSOystein Eftevaag
53*758e9fbaSOystein Eftevaag sapi_context = sapi_init_from_opts (&opts);
54*758e9fbaSOystein Eftevaag if (sapi_context == NULL)
55*758e9fbaSOystein Eftevaag exit (1);
56*758e9fbaSOystein Eftevaag
57*758e9fbaSOystein Eftevaag for (size_t i = 0; i < TAB_SIZE(capabilities); i++) {
58*758e9fbaSOystein Eftevaag TPMS_CAPABILITY_DATA caps;
59*758e9fbaSOystein Eftevaag uint8_t buffer[sizeof(caps)];
60*758e9fbaSOystein Eftevaag size_t off = 0;
61*758e9fbaSOystein Eftevaag
62*758e9fbaSOystein Eftevaag rc = Tss2_Sys_GetCapability(sapi_context, NULL, capabilities[i].cap,
63*758e9fbaSOystein Eftevaag capabilities[i].prop,
64*758e9fbaSOystein Eftevaag capabilities[i].count, NULL,
65*758e9fbaSOystein Eftevaag &caps, NULL);
66*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
67*758e9fbaSOystein Eftevaag LOG_ERROR("TPM GetCapabilities FAILED: 0x%"PRIx32, rc);
68*758e9fbaSOystein Eftevaag exit(1);
69*758e9fbaSOystein Eftevaag }
70*758e9fbaSOystein Eftevaag
71*758e9fbaSOystein Eftevaag rc = Tss2_MU_TPMS_CAPABILITY_DATA_Marshal(&caps, &buffer[off],
72*758e9fbaSOystein Eftevaag sizeof(buffer) - off - 1,
73*758e9fbaSOystein Eftevaag &off);
74*758e9fbaSOystein Eftevaag if (rc != TSS2_RC_SUCCESS) {
75*758e9fbaSOystein Eftevaag LOG_ERROR("Marshaling FAILED: 0x%"PRIx32, rc);
76*758e9fbaSOystein Eftevaag exit(1);
77*758e9fbaSOystein Eftevaag }
78*758e9fbaSOystein Eftevaag
79*758e9fbaSOystein Eftevaag buffer[off++] = '\0';
80*758e9fbaSOystein Eftevaag
81*758e9fbaSOystein Eftevaag printf("cap%zi: ", i);
82*758e9fbaSOystein Eftevaag for (size_t j = 0; j < off; j++)
83*758e9fbaSOystein Eftevaag printf("%02"PRIx8, buffer[j]);
84*758e9fbaSOystein Eftevaag printf("\n");
85*758e9fbaSOystein Eftevaag }
86*758e9fbaSOystein Eftevaag
87*758e9fbaSOystein Eftevaag sapi_teardown_full (sapi_context);
88*758e9fbaSOystein Eftevaag
89*758e9fbaSOystein Eftevaag return 0;
90*758e9fbaSOystein Eftevaag }
91