1*758e9fbaSOystein Eftevaag /*
2*758e9fbaSOystein Eftevaag * SPDX-License-Identifier: BSD-2-Clause
3*758e9fbaSOystein Eftevaag * Copyright (c) 2019, Intel Corporation
4*758e9fbaSOystein Eftevaag */
5*758e9fbaSOystein Eftevaag
6*758e9fbaSOystein Eftevaag #ifdef HAVE_CONFIG_H
7*758e9fbaSOystein Eftevaag #include <config.h>
8*758e9fbaSOystein Eftevaag #endif
9*758e9fbaSOystein Eftevaag
10*758e9fbaSOystein Eftevaag #include <inttypes.h>
11*758e9fbaSOystein Eftevaag #include <stdio.h>
12*758e9fbaSOystein Eftevaag #include <stdlib.h>
13*758e9fbaSOystein Eftevaag #include <string.h>
14*758e9fbaSOystein Eftevaag
15*758e9fbaSOystein Eftevaag #include "tss2_sys.h"
16*758e9fbaSOystein Eftevaag
17*758e9fbaSOystein Eftevaag #include "context-util.h"
18*758e9fbaSOystein Eftevaag #include "sapi-util.h"
19*758e9fbaSOystein Eftevaag #include "session-util.h"
20*758e9fbaSOystein Eftevaag #include "util/aux_util.h"
21*758e9fbaSOystein Eftevaag #define LOGMODULE test
22*758e9fbaSOystein Eftevaag #include "util/log.h"
23*758e9fbaSOystein Eftevaag
24*758e9fbaSOystein Eftevaag #define NV_PS_INDEX_SIZE 34
25*758e9fbaSOystein Eftevaag #define INDEX_LCP_OWN 0x01400001
26*758e9fbaSOystein Eftevaag #define INDEX_LCP_SUP 0x01800001
27*758e9fbaSOystein Eftevaag
28*758e9fbaSOystein Eftevaag #define TPM2B_SIZE_MAX(type) (sizeof (type) - 2)
29*758e9fbaSOystein Eftevaag
30*758e9fbaSOystein Eftevaag const TSS2L_SYS_AUTH_COMMAND auth_cmd_null_pwd = {
31*758e9fbaSOystein Eftevaag .count = 1,
32*758e9fbaSOystein Eftevaag .auths = {
33*758e9fbaSOystein Eftevaag {
34*758e9fbaSOystein Eftevaag .sessionHandle = TPM2_RS_PW,
35*758e9fbaSOystein Eftevaag },
36*758e9fbaSOystein Eftevaag },
37*758e9fbaSOystein Eftevaag };
38*758e9fbaSOystein Eftevaag
39*758e9fbaSOystein Eftevaag static TSS2_RC
create_policy_session(TSS2_SYS_CONTEXT * sys_ctx,TPMI_SH_AUTH_SESSION * handle)40*758e9fbaSOystein Eftevaag create_policy_session (
41*758e9fbaSOystein Eftevaag TSS2_SYS_CONTEXT *sys_ctx,
42*758e9fbaSOystein Eftevaag TPMI_SH_AUTH_SESSION *handle)
43*758e9fbaSOystein Eftevaag {
44*758e9fbaSOystein Eftevaag TSS2_RC rc;
45*758e9fbaSOystein Eftevaag TPM2B_ENCRYPTED_SECRET salt = { 0 };
46*758e9fbaSOystein Eftevaag TPM2B_NONCE nonce = {
47*758e9fbaSOystein Eftevaag .size = GetDigestSize (TPM2_ALG_SHA1),
48*758e9fbaSOystein Eftevaag };
49*758e9fbaSOystein Eftevaag TPM2B_NONCE nonce_tpm = { 0, };
50*758e9fbaSOystein Eftevaag TPMT_SYM_DEF symmetric = {
51*758e9fbaSOystein Eftevaag .algorithm = TPM2_ALG_NULL,
52*758e9fbaSOystein Eftevaag };
53*758e9fbaSOystein Eftevaag
54*758e9fbaSOystein Eftevaag rc = Tss2_Sys_StartAuthSession (sys_ctx,
55*758e9fbaSOystein Eftevaag TPM2_RH_NULL,
56*758e9fbaSOystein Eftevaag TPM2_RH_NULL,
57*758e9fbaSOystein Eftevaag 0,
58*758e9fbaSOystein Eftevaag &nonce,
59*758e9fbaSOystein Eftevaag &salt,
60*758e9fbaSOystein Eftevaag TPM2_SE_POLICY,
61*758e9fbaSOystein Eftevaag &symmetric,
62*758e9fbaSOystein Eftevaag TPM2_ALG_SHA1,
63*758e9fbaSOystein Eftevaag handle,
64*758e9fbaSOystein Eftevaag &nonce_tpm,
65*758e9fbaSOystein Eftevaag 0);
66*758e9fbaSOystein Eftevaag return_if_error (rc, "Tss2_Sys_StartAuthSession");
67*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
68*758e9fbaSOystein Eftevaag }
69*758e9fbaSOystein Eftevaag
70*758e9fbaSOystein Eftevaag static TSS2_RC
setup_nv(TSS2_SYS_CONTEXT * sys_ctx,TPMI_RH_NV_INDEX index)71*758e9fbaSOystein Eftevaag setup_nv (TSS2_SYS_CONTEXT *sys_ctx,
72*758e9fbaSOystein Eftevaag TPMI_RH_NV_INDEX index)
73*758e9fbaSOystein Eftevaag {
74*758e9fbaSOystein Eftevaag TSS2_RC rc;
75*758e9fbaSOystein Eftevaag TPMI_SH_AUTH_SESSION auth_handle;
76*758e9fbaSOystein Eftevaag TPM2B_DIGEST policy_hash = {
77*758e9fbaSOystein Eftevaag .size = TPM2B_SIZE_MAX (policy_hash),
78*758e9fbaSOystein Eftevaag };
79*758e9fbaSOystein Eftevaag TPM2B_AUTH nv_auth = { 0, };
80*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_RESPONSE auth_rsp;
81*758e9fbaSOystein Eftevaag TPM2B_NV_PUBLIC public_info = {
82*758e9fbaSOystein Eftevaag .nvPublic = {
83*758e9fbaSOystein Eftevaag .nameAlg = TPM2_ALG_SHA1,
84*758e9fbaSOystein Eftevaag .attributes = TPMA_NV_AUTHREAD | TPMA_NV_AUTHWRITE |
85*758e9fbaSOystein Eftevaag TPMA_NV_PLATFORMCREATE | TPMA_NV_WRITEDEFINE | TPMA_NV_ORDERLY,
86*758e9fbaSOystein Eftevaag .dataSize = NV_PS_INDEX_SIZE,
87*758e9fbaSOystein Eftevaag .nvIndex = index,
88*758e9fbaSOystein Eftevaag },
89*758e9fbaSOystein Eftevaag };
90*758e9fbaSOystein Eftevaag
91*758e9fbaSOystein Eftevaag rc = create_policy_session (sys_ctx, &auth_handle);
92*758e9fbaSOystein Eftevaag return_if_error (rc, "create_policy_session");
93*758e9fbaSOystein Eftevaag
94*758e9fbaSOystein Eftevaag rc = Tss2_Sys_PolicyGetDigest (sys_ctx, auth_handle, 0, &policy_hash, 0);
95*758e9fbaSOystein Eftevaag return_if_error (rc, "Tss2_Sys_PolicyGetDigest");
96*758e9fbaSOystein Eftevaag LOGBLOB_INFO (policy_hash.buffer, policy_hash.size, "policy_hash");
97*758e9fbaSOystein Eftevaag
98*758e9fbaSOystein Eftevaag rc = Tss2_Sys_NV_DefineSpace (sys_ctx,
99*758e9fbaSOystein Eftevaag TPM2_RH_PLATFORM,
100*758e9fbaSOystein Eftevaag &auth_cmd_null_pwd,
101*758e9fbaSOystein Eftevaag &nv_auth,
102*758e9fbaSOystein Eftevaag &public_info,
103*758e9fbaSOystein Eftevaag &auth_rsp);
104*758e9fbaSOystein Eftevaag return_if_error (rc, "Tss2_Sys_NV_DefineSpace");
105*758e9fbaSOystein Eftevaag
106*758e9fbaSOystein Eftevaag rc = Tss2_Sys_FlushContext (sys_ctx, auth_handle);
107*758e9fbaSOystein Eftevaag return_if_error (rc, "Tss2_Sys_FlushContext");
108*758e9fbaSOystein Eftevaag
109*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
110*758e9fbaSOystein Eftevaag }
111*758e9fbaSOystein Eftevaag
112*758e9fbaSOystein Eftevaag static TSS2_RC
nv_write_read_test(TSS2_SYS_CONTEXT * sys_ctx,TPMI_RH_NV_INDEX index)113*758e9fbaSOystein Eftevaag nv_write_read_test (TSS2_SYS_CONTEXT *sys_ctx,
114*758e9fbaSOystein Eftevaag TPMI_RH_NV_INDEX index)
115*758e9fbaSOystein Eftevaag {
116*758e9fbaSOystein Eftevaag TSS2_RC rc;
117*758e9fbaSOystein Eftevaag TPM2B_MAX_NV_BUFFER write_data = {
118*758e9fbaSOystein Eftevaag .size = 4,
119*758e9fbaSOystein Eftevaag .buffer = { 0xde, 0xad, 0xbe, 0xef },
120*758e9fbaSOystein Eftevaag };
121*758e9fbaSOystein Eftevaag TPM2B_MAX_NV_BUFFER nv_buf = { 0, };
122*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_RESPONSE auth_resp = { 0, };
123*758e9fbaSOystein Eftevaag
124*758e9fbaSOystein Eftevaag rc = TSS2_RETRY_EXP (Tss2_Sys_NV_Write (sys_ctx,
125*758e9fbaSOystein Eftevaag index,
126*758e9fbaSOystein Eftevaag index,
127*758e9fbaSOystein Eftevaag &auth_cmd_null_pwd,
128*758e9fbaSOystein Eftevaag &write_data,
129*758e9fbaSOystein Eftevaag 0,
130*758e9fbaSOystein Eftevaag &auth_resp));
131*758e9fbaSOystein Eftevaag return_if_error (rc, "Tss2_Sys_NV_Write");
132*758e9fbaSOystein Eftevaag
133*758e9fbaSOystein Eftevaag rc = Tss2_Sys_NV_Read (sys_ctx,
134*758e9fbaSOystein Eftevaag index,
135*758e9fbaSOystein Eftevaag index,
136*758e9fbaSOystein Eftevaag &auth_cmd_null_pwd,
137*758e9fbaSOystein Eftevaag 4,
138*758e9fbaSOystein Eftevaag 0,
139*758e9fbaSOystein Eftevaag &nv_buf,
140*758e9fbaSOystein Eftevaag &auth_resp);
141*758e9fbaSOystein Eftevaag return_if_error (rc, "Tss2_Sys_NV_Read");
142*758e9fbaSOystein Eftevaag
143*758e9fbaSOystein Eftevaag if (memcmp (nv_buf.buffer, write_data.buffer, write_data.size) != 0) {
144*758e9fbaSOystein Eftevaag LOG_ERROR ("%s: data read from NV is different from data written",
145*758e9fbaSOystein Eftevaag __func__);
146*758e9fbaSOystein Eftevaag LOGBLOB_DEBUG (write_data.buffer, write_data.size, "write_data");
147*758e9fbaSOystein Eftevaag LOGBLOB_DEBUG (nv_buf.buffer, nv_buf.size, "nv_buf");
148*758e9fbaSOystein Eftevaag return 1;
149*758e9fbaSOystein Eftevaag }
150*758e9fbaSOystein Eftevaag
151*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
152*758e9fbaSOystein Eftevaag }
153*758e9fbaSOystein Eftevaag
154*758e9fbaSOystein Eftevaag static TSS2_RC
teardown_nv(TSS2_SYS_CONTEXT * sys_ctx,TPMI_RH_NV_INDEX index)155*758e9fbaSOystein Eftevaag teardown_nv (TSS2_SYS_CONTEXT *sys_ctx,
156*758e9fbaSOystein Eftevaag TPMI_RH_NV_INDEX index)
157*758e9fbaSOystein Eftevaag {
158*758e9fbaSOystein Eftevaag TSS2_RC rc;
159*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_RESPONSE auth_resp = { 0, };
160*758e9fbaSOystein Eftevaag
161*758e9fbaSOystein Eftevaag rc = Tss2_Sys_NV_UndefineSpace (sys_ctx,
162*758e9fbaSOystein Eftevaag TPM2_RH_PLATFORM,
163*758e9fbaSOystein Eftevaag index,
164*758e9fbaSOystein Eftevaag &auth_cmd_null_pwd,
165*758e9fbaSOystein Eftevaag &auth_resp);
166*758e9fbaSOystein Eftevaag return_if_error (rc, "Tss2_Sys_NV_UndefineSpace");
167*758e9fbaSOystein Eftevaag
168*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
169*758e9fbaSOystein Eftevaag }
170*758e9fbaSOystein Eftevaag
171*758e9fbaSOystein Eftevaag int
test_invoke(TSS2_SYS_CONTEXT * sys_ctx)172*758e9fbaSOystein Eftevaag test_invoke (TSS2_SYS_CONTEXT *sys_ctx)
173*758e9fbaSOystein Eftevaag {
174*758e9fbaSOystein Eftevaag TSS2_RC rc, rc_teardown;
175*758e9fbaSOystein Eftevaag
176*758e9fbaSOystein Eftevaag rc = setup_nv (sys_ctx, INDEX_LCP_OWN);
177*758e9fbaSOystein Eftevaag return_if_error (rc, "setup_nv for INDEX_LCP_OWN");
178*758e9fbaSOystein Eftevaag rc = nv_write_read_test (sys_ctx, INDEX_LCP_OWN);
179*758e9fbaSOystein Eftevaag LOG_ERROR ("nv_write_read_test for INDEX_LCP_OWN");
180*758e9fbaSOystein Eftevaag rc_teardown = teardown_nv (sys_ctx, INDEX_LCP_OWN);
181*758e9fbaSOystein Eftevaag return_if_error (rc, "INDEX_LCP_OWN test");
182*758e9fbaSOystein Eftevaag return_if_error (rc_teardown, "teardown_nv for INDEX_LCP_OWN");
183*758e9fbaSOystein Eftevaag
184*758e9fbaSOystein Eftevaag rc = setup_nv (sys_ctx, INDEX_LCP_SUP);
185*758e9fbaSOystein Eftevaag return_if_error (rc, "setup_nv for INDEX_LCP_SUP");
186*758e9fbaSOystein Eftevaag rc = nv_write_read_test (sys_ctx, INDEX_LCP_SUP);
187*758e9fbaSOystein Eftevaag LOG_ERROR ("nv_write_read_test for INDEX_LCP_SUP");
188*758e9fbaSOystein Eftevaag rc_teardown = teardown_nv (sys_ctx, INDEX_LCP_SUP);
189*758e9fbaSOystein Eftevaag return_if_error (rc, "INDEX_LCP_SUP test");
190*758e9fbaSOystein Eftevaag return_if_error (rc_teardown, "teardown_nv for INDEX_LCP_SUP");
191*758e9fbaSOystein Eftevaag
192*758e9fbaSOystein Eftevaag return 0;
193*758e9fbaSOystein Eftevaag }
194