xref: /aosp_15_r20/external/tpm2-tss/test/helper/tpm_writeekcert.c (revision 758e9fba6fc9adbf15340f70c73baee7b168b1c9)
1*758e9fbaSOystein Eftevaag #ifdef HAVE_CONFIG_H
2*758e9fbaSOystein Eftevaag #include <config.h>
3*758e9fbaSOystein Eftevaag #endif
4*758e9fbaSOystein Eftevaag 
5*758e9fbaSOystein Eftevaag #include <string.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     TSS2L_SYS_AUTH_COMMAND auth_cmd = {
42*758e9fbaSOystein Eftevaag         .auths = {{ .sessionHandle = TPM2_RS_PW }},
43*758e9fbaSOystein Eftevaag         .count = 1
44*758e9fbaSOystein Eftevaag     };
45*758e9fbaSOystein Eftevaag     TPMI_RH_NV_INDEX nvIndex;
46*758e9fbaSOystein Eftevaag 
47*758e9fbaSOystein Eftevaag     if (argv[1])
48*758e9fbaSOystein Eftevaag         nvIndex = strtol(argv[1], NULL, 16);
49*758e9fbaSOystein Eftevaag     else
50*758e9fbaSOystein Eftevaag         nvIndex = 0x01c00002;
51*758e9fbaSOystein Eftevaag 
52*758e9fbaSOystein Eftevaag     TPM2B_AUTH nv_auth = { 0 };
53*758e9fbaSOystein Eftevaag     TPM2B_NV_PUBLIC public_info = {
54*758e9fbaSOystein Eftevaag         .nvPublic = {
55*758e9fbaSOystein Eftevaag             .nameAlg = TPM2_ALG_SHA1,
56*758e9fbaSOystein Eftevaag             .attributes = TPMA_NV_PPWRITE | TPMA_NV_AUTHREAD | TPMA_NV_OWNERREAD |
57*758e9fbaSOystein Eftevaag                 TPMA_NV_PLATFORMCREATE | TPMA_NV_NO_DA,
58*758e9fbaSOystein Eftevaag             .dataSize = 0,
59*758e9fbaSOystein Eftevaag             .nvIndex = nvIndex,
60*758e9fbaSOystein Eftevaag         },
61*758e9fbaSOystein Eftevaag     };
62*758e9fbaSOystein Eftevaag 
63*758e9fbaSOystein Eftevaag     TSS2L_SYS_AUTH_RESPONSE auth_rsp = {
64*758e9fbaSOystein Eftevaag         .count = 0
65*758e9fbaSOystein Eftevaag     };
66*758e9fbaSOystein Eftevaag     TPM2B_MAX_NV_BUFFER buf1 = { 0 };
67*758e9fbaSOystein Eftevaag     TPM2B_MAX_NV_BUFFER buf2 = { 0 };
68*758e9fbaSOystein Eftevaag 
69*758e9fbaSOystein Eftevaag     buf1.size += fread(&buf1.buffer[buf1.size], sizeof(buf1.buffer[0]),
70*758e9fbaSOystein Eftevaag                        sizeof(buf1.buffer) - buf1.size, stdin);
71*758e9fbaSOystein Eftevaag     if (buf1.size >= sizeof(buf1.buffer)) {
72*758e9fbaSOystein Eftevaag         LOG_ERROR("input to large");
73*758e9fbaSOystein Eftevaag         exit(1);
74*758e9fbaSOystein Eftevaag     }
75*758e9fbaSOystein Eftevaag 
76*758e9fbaSOystein Eftevaag     test_opts_t opts = {
77*758e9fbaSOystein Eftevaag         .tcti_type      = TCTI_DEFAULT,
78*758e9fbaSOystein Eftevaag         .device_file    = DEVICE_PATH_DEFAULT,
79*758e9fbaSOystein Eftevaag         .socket_address = HOSTNAME_DEFAULT,
80*758e9fbaSOystein Eftevaag         .socket_port    = PORT_DEFAULT,
81*758e9fbaSOystein Eftevaag     };
82*758e9fbaSOystein Eftevaag 
83*758e9fbaSOystein Eftevaag     get_test_opts_from_env (&opts);
84*758e9fbaSOystein Eftevaag     if (sanity_check_test_opts (&opts) != 0)
85*758e9fbaSOystein Eftevaag         exit (1);
86*758e9fbaSOystein Eftevaag 
87*758e9fbaSOystein Eftevaag     sapi_context = sapi_init_from_opts (&opts);
88*758e9fbaSOystein Eftevaag     if (sapi_context == NULL)
89*758e9fbaSOystein Eftevaag         exit (1);
90*758e9fbaSOystein Eftevaag 
91*758e9fbaSOystein Eftevaag     /* First make sure that not EK certificate is currently loaded */
92*758e9fbaSOystein Eftevaag     LOG_WARNING("Cert input size is %"PRIu16, buf1.size);
93*758e9fbaSOystein Eftevaag     public_info.nvPublic.dataSize = buf1.size;
94*758e9fbaSOystein Eftevaag 
95*758e9fbaSOystein Eftevaag     LOG_WARNING("Define NV cert with nv index: %x", public_info.nvPublic.nvIndex);
96*758e9fbaSOystein Eftevaag 
97*758e9fbaSOystein Eftevaag     rc = Tss2_Sys_NV_DefineSpace(sapi_context, TPM2_RH_PLATFORM, &auth_cmd,
98*758e9fbaSOystein Eftevaag                                  &nv_auth, &public_info, &auth_rsp);
99*758e9fbaSOystein Eftevaag     if (rc != TSS2_RC_SUCCESS) {
100*758e9fbaSOystein Eftevaag         LOG_ERROR("TPM NV DefineSpace FAILED: 0x%"PRIx32, rc);
101*758e9fbaSOystein Eftevaag         exit(1);
102*758e9fbaSOystein Eftevaag     }
103*758e9fbaSOystein Eftevaag 
104*758e9fbaSOystein Eftevaag     /* Split the input buffer into 2 chunks */
105*758e9fbaSOystein Eftevaag     buf2.size = buf1.size;
106*758e9fbaSOystein Eftevaag     buf1.size /= 2;
107*758e9fbaSOystein Eftevaag     buf2.size -= buf1.size;
108*758e9fbaSOystein Eftevaag     memcpy(&buf2.buffer[0], &buf1.buffer[buf1.size], buf2.size);
109*758e9fbaSOystein Eftevaag 
110*758e9fbaSOystein Eftevaag     rc = Tss2_Sys_NV_Write(sapi_context, TPM2_RH_PLATFORM, nvIndex, &auth_cmd,
111*758e9fbaSOystein Eftevaag                            &buf1, 0, &auth_rsp);
112*758e9fbaSOystein Eftevaag     if (rc != TSS2_RC_SUCCESS) {
113*758e9fbaSOystein Eftevaag         LOG_ERROR("TPM NV Write FAILED: 0x%"PRIx32, rc);
114*758e9fbaSOystein Eftevaag         exit(1);
115*758e9fbaSOystein Eftevaag     }
116*758e9fbaSOystein Eftevaag 
117*758e9fbaSOystein Eftevaag     rc = Tss2_Sys_NV_Write(sapi_context, TPM2_RH_PLATFORM, nvIndex, &auth_cmd,
118*758e9fbaSOystein Eftevaag                            &buf2, buf1.size, &auth_rsp);
119*758e9fbaSOystein Eftevaag     if (rc != TSS2_RC_SUCCESS) {
120*758e9fbaSOystein Eftevaag         LOG_ERROR("TPM NV Write FAILED: 0x%"PRIx32, rc);
121*758e9fbaSOystein Eftevaag         exit(1);
122*758e9fbaSOystein Eftevaag     }
123*758e9fbaSOystein Eftevaag 
124*758e9fbaSOystein Eftevaag     sapi_teardown_full (sapi_context);
125*758e9fbaSOystein Eftevaag 
126*758e9fbaSOystein Eftevaag     return 0;
127*758e9fbaSOystein Eftevaag }
128