xref: /aosp_15_r20/external/tpm2-tss/test/integration/esys-nv-ram-set-bits.int.c (revision 758e9fba6fc9adbf15340f70c73baee7b168b1c9)
1 /* SPDX-License-Identifier: BSD-2-Clause */
2 /*******************************************************************************
3  * Copyright 2017-2018, Fraunhofer SIT sponsored by Infineon Technologies AG
4  * All rights reserved.
5  *******************************************************************************/
6 
7 #ifdef HAVE_CONFIG_H
8 #include <config.h>
9 #endif
10 
11 #include <stdlib.h>
12 
13 #include "tss2_esys.h"
14 
15 #include "esys_iutil.h"
16 #define LOGMODULE test
17 #include "util/log.h"
18 #include "util/aux_util.h"
19 
20 /** This test is intended to test the definition of a bit field in NV ram and to
21  *  test the ESAPI NV_SetBits function.
22  *
23  * Tested ESAPI commands:
24  *  - Esys_FlushContext() (M)
25  *  - Esys_NV_DefineSpace() (M)
26  *  - Esys_NV_Read() (M)
27  *  - Esys_NV_ReadPublic() (M)
28  *  - Esys_NV_SetBits() (M)
29  *  - Esys_NV_UndefineSpace() (M)
30  *  - Esys_StartAuthSession() (M)
31  *
32  * Used compiler defines: TEST_SESSION
33  *
34  * @param[in,out] esys_context The ESYS_CONTEXT.
35  * @retval EXIT_FAILURE
36  * @retval EXIT_SUCCESS
37  */
38 
39 int
test_esys_nv_ram_set_bits(ESYS_CONTEXT * esys_context)40 test_esys_nv_ram_set_bits(ESYS_CONTEXT * esys_context)
41 {
42     TSS2_RC r;
43     ESYS_TR nvHandle = ESYS_TR_NONE;
44 
45     TPM2B_NV_PUBLIC *nvPublic = NULL;
46     TPM2B_NAME *nvName = NULL;
47     TPM2B_MAX_NV_BUFFER *nv_test_data = NULL;
48 
49 #ifdef TEST_SESSION
50     ESYS_TR session = ESYS_TR_NONE;
51     TPMT_SYM_DEF symmetric = {.algorithm = TPM2_ALG_AES,
52                               .keyBits = {.aes = 128},
53                               .mode = {.aes = TPM2_ALG_CFB}
54     };
55     TPMA_SESSION sessionAttributes;
56     TPM2B_NONCE nonceCaller = {
57         .size = 20,
58         .buffer = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
59                    11, 12, 13, 14, 15, 16, 17, 18, 19, 20}
60     };
61 
62     memset(&sessionAttributes, 0, sizeof sessionAttributes);
63 
64     r = Esys_StartAuthSession(esys_context, ESYS_TR_NONE, ESYS_TR_NONE,
65                               ESYS_TR_NONE, ESYS_TR_NONE, ESYS_TR_NONE,
66                               &nonceCaller,
67                               TPM2_SE_HMAC, &symmetric, TPM2_ALG_SHA1,
68                               &session);
69     goto_if_error(r, "Error: During initialization of session", error);
70 #endif /* TEST_SESSION */
71 
72     TPM2B_AUTH auth = {.size = 20,
73                        .buffer={10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
74                                 20, 21, 22, 23, 24, 25, 26, 27, 28, 29}};
75 
76     TPM2B_NV_PUBLIC publicInfo = {
77         .size = 0,
78         .nvPublic = {
79             .nvIndex =TPM2_NV_INDEX_FIRST,
80             .nameAlg = TPM2_ALG_SHA1,
81             .attributes = (
82                 TPMA_NV_OWNERWRITE |
83                 TPMA_NV_AUTHWRITE |
84                 TPMA_NV_WRITE_STCLEAR |
85                 TPMA_NV_AUTHREAD |
86                 TPMA_NV_OWNERREAD |
87                 TPM2_NT_BITS << TPMA_NV_TPM2_NT_SHIFT
88                 ),
89             .authPolicy = {
90                  .size = 0,
91                  .buffer = {},
92              },
93             .dataSize = 8,
94         }
95     };
96 
97     r = Esys_NV_DefineSpace(esys_context,
98                             ESYS_TR_RH_OWNER,
99 #ifdef TEST_SESSION
100                             session,
101 #else
102                             ESYS_TR_PASSWORD,
103 #endif
104                             ESYS_TR_NONE,
105                             ESYS_TR_NONE,
106                             &auth,
107                             &publicInfo,
108                             &nvHandle);
109 
110     goto_if_error(r, "Error esys define nv space", error);
111 
112     r = Esys_NV_ReadPublic(esys_context,
113                            nvHandle,
114                            ESYS_TR_NONE,
115                            ESYS_TR_NONE,
116                            ESYS_TR_NONE,
117                            &nvPublic,
118                            &nvName);
119     goto_if_error(r, "Error: nv read public", error);
120 
121     RSRC_NODE_T *nvHandleNode;
122 
123     r = esys_GetResourceObject(esys_context, nvHandle, &nvHandleNode);
124     goto_if_error(r, "Error: nv get resource object", error);
125 
126     if (nvName->size != nvHandleNode->rsrc.name.size ||
127         memcmp(&nvName->name, &nvHandleNode->rsrc.name.name, nvName->size) != 0) {
128         LOG_ERROR("Error: define space name not equal");
129         goto error;
130     }
131 
132     UINT64 bits = 0x0102030405060708;
133 
134     r = Esys_NV_SetBits(esys_context,
135                         nvHandle,
136                         nvHandle,
137 #ifdef TEST_SESSION
138                         session,
139 #else
140                         ESYS_TR_PASSWORD,
141 #endif
142                         ESYS_TR_NONE,
143                         ESYS_TR_NONE,
144                         bits);
145 
146     goto_if_error(r, "Error esys nv write", error);
147     Esys_Free(nvPublic);
148     Esys_Free(nvName);
149 
150     r = Esys_NV_ReadPublic(esys_context,
151                            nvHandle,
152                            ESYS_TR_NONE,
153                            ESYS_TR_NONE,
154                            ESYS_TR_NONE,
155                            &nvPublic,
156                            &nvName);
157     goto_if_error(r, "Error: nv read public", error);
158 
159     r = esys_GetResourceObject(esys_context, nvHandle, &nvHandleNode);
160     goto_if_error(r, "Error: nv get resource object", error);
161 
162     if (nvName->size != nvHandleNode->rsrc.name.size ||
163         memcmp(&nvName->name, &nvHandleNode->rsrc.name.name, nvName->size) != 0) {
164         LOG_ERROR("Error: nv write name not equal");
165         goto error;
166     }
167 
168     r = Esys_NV_Read(esys_context,
169                      nvHandle,
170                      nvHandle,
171 #ifdef TEST_SESSION
172                      session,
173 #else
174                      ESYS_TR_PASSWORD,
175 #endif
176                      ESYS_TR_NONE,
177                      ESYS_TR_NONE,
178                      8,
179                      0,
180                      &nv_test_data);
181 
182     goto_if_error(r, "Error esys nv read", error);
183 
184     Esys_Free(nvPublic);
185     Esys_Free(nvName);
186 
187     r = Esys_NV_ReadPublic(esys_context,
188                            nvHandle,
189                            ESYS_TR_NONE,
190                            ESYS_TR_NONE,
191                            ESYS_TR_NONE,
192                            &nvPublic,
193                            &nvName);
194     goto_if_error(r, "Error: nv read public", error);
195 
196     r = esys_GetResourceObject(esys_context, nvHandle, &nvHandleNode);
197     goto_if_error(r, "Error: nv get resource object", error);
198 
199     if (nvName->size != nvHandleNode->rsrc.name.size ||
200         memcmp(&nvName->name, &nvHandleNode->rsrc.name.name, nvName->size) != 0) {
201         LOG_ERROR("Error: nv read name not equal");
202         goto error;
203     }
204 
205     r = Esys_NV_UndefineSpace(esys_context,
206                               ESYS_TR_RH_OWNER,
207                               nvHandle,
208 #ifdef TEST_SESSION
209                               session,
210 #else
211                               ESYS_TR_PASSWORD,
212 #endif
213                               ESYS_TR_NONE,
214                               ESYS_TR_NONE
215                               );
216     goto_if_error(r, "Error: NV_UndefineSpace", error);
217 
218 #ifdef TEST_SESSION
219     r = Esys_FlushContext(esys_context, session);
220     goto_if_error(r, "Error: FlushContext", error);
221 #endif
222 
223     Esys_Free(nvPublic);
224     Esys_Free(nvName);
225     Esys_Free(nv_test_data);
226     return EXIT_SUCCESS;
227 
228  error:
229 
230     if (nvHandle != ESYS_TR_NONE) {
231         if (Esys_NV_UndefineSpace(esys_context,
232                                   ESYS_TR_RH_OWNER,
233                                   nvHandle,
234 #ifdef TEST_SESSION
235                                   session,
236 #else
237                                   ESYS_TR_PASSWORD,
238 #endif
239                                   ESYS_TR_NONE,
240                                   ESYS_TR_NONE) != TSS2_RC_SUCCESS) {
241              LOG_ERROR("Cleanup nvHandle failed.");
242         }
243     }
244 
245 #ifdef TEST_SESSION
246     if (session != ESYS_TR_NONE) {
247         if (Esys_FlushContext(esys_context, session) != TSS2_RC_SUCCESS) {
248             LOG_ERROR("Cleanup session failed.");
249         }
250     }
251 #endif
252 
253     Esys_Free(nvPublic);
254     Esys_Free(nvName);
255     Esys_Free(nv_test_data);
256     return EXIT_FAILURE;
257 }
258 
259 int
test_invoke_esapi(ESYS_CONTEXT * esys_context)260 test_invoke_esapi(ESYS_CONTEXT * esys_context) {
261     return test_esys_nv_ram_set_bits(esys_context);
262 }
263