xref: /aosp_15_r20/external/tpm2-tss/test/integration/sapi-nv-readwrite.int.c (revision 758e9fba6fc9adbf15340f70c73baee7b168b1c9)
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