xref: /aosp_15_r20/external/tpm2-tss/test/integration/sapi-param-encrypt-decrypt.int.c (revision 758e9fba6fc9adbf15340f70c73baee7b168b1c9)
1*758e9fbaSOystein Eftevaag /* SPDX-License-Identifier: BSD-2-Clause */
2*758e9fbaSOystein Eftevaag /***********************************************************************
3*758e9fbaSOystein Eftevaag  * Copyright (c) 2017-2018, Intel Corporation
4*758e9fbaSOystein Eftevaag  *
5*758e9fbaSOystein Eftevaag  * All rights reserved.
6*758e9fbaSOystein Eftevaag  ***********************************************************************/
7*758e9fbaSOystein Eftevaag #ifdef HAVE_CONFIG_H
8*758e9fbaSOystein Eftevaag #include <config.h>
9*758e9fbaSOystein Eftevaag #endif
10*758e9fbaSOystein Eftevaag 
11*758e9fbaSOystein Eftevaag #include <stdio.h>
12*758e9fbaSOystein Eftevaag #include <stdlib.h>
13*758e9fbaSOystein Eftevaag #include <string.h>
14*758e9fbaSOystein Eftevaag #include <inttypes.h>
15*758e9fbaSOystein Eftevaag 
16*758e9fbaSOystein Eftevaag #include "tss2_sys.h"
17*758e9fbaSOystein Eftevaag #include "context-util.h"
18*758e9fbaSOystein Eftevaag #include "sapi-util.h"
19*758e9fbaSOystein Eftevaag #include "session-util.h"
20*758e9fbaSOystein Eftevaag #define LOGMODULE test
21*758e9fbaSOystein Eftevaag #include "util/log.h"
22*758e9fbaSOystein Eftevaag #include "test.h"
23*758e9fbaSOystein Eftevaag 
24*758e9fbaSOystein Eftevaag #define TEST_DATA "test data to encrypt"
25*758e9fbaSOystein Eftevaag #define TEST_DATA_LEN 21
26*758e9fbaSOystein Eftevaag 
27*758e9fbaSOystein Eftevaag int
test_invoke(TSS2_SYS_CONTEXT * sapi_context)28*758e9fbaSOystein Eftevaag test_invoke (TSS2_SYS_CONTEXT *sapi_context)
29*758e9fbaSOystein Eftevaag {
30*758e9fbaSOystein Eftevaag     TSS2_RC rc, rc2;
31*758e9fbaSOystein Eftevaag     SESSION *session;
32*758e9fbaSOystein Eftevaag     TSS2_TCTI_CONTEXT *tcti_ctx;
33*758e9fbaSOystein Eftevaag     TPM2B_MAX_NV_BUFFER data_to_write, data_read;
34*758e9fbaSOystein Eftevaag     TPM2B_MAX_BUFFER encrypted_param, decrypted_param;
35*758e9fbaSOystein Eftevaag     TPMI_RH_NV_INDEX nv_index = TPM2_HR_NV_INDEX | 0x01;
36*758e9fbaSOystein Eftevaag     size_t decrypt_param_size, encrypt_param_size;
37*758e9fbaSOystein Eftevaag     const uint8_t *decrypt_param_ptr, *encrypt_param_ptr;
38*758e9fbaSOystein Eftevaag     TPM2B_AUTH nv_auth;
39*758e9fbaSOystein Eftevaag     TPM2B_NV_PUBLIC nv_public;
40*758e9fbaSOystein Eftevaag     TPM2B_DIGEST policy_auth;
41*758e9fbaSOystein Eftevaag     TPMA_NV nv_attribs;
42*758e9fbaSOystein Eftevaag     TPM2B_NONCE nonce_caller;
43*758e9fbaSOystein Eftevaag     TPMT_SYM_DEF symmetric;
44*758e9fbaSOystein Eftevaag     TSS2L_SYS_AUTH_COMMAND req_auth = {
45*758e9fbaSOystein Eftevaag         .auths = {{ .sessionHandle = TPM2_RS_PW }},
46*758e9fbaSOystein Eftevaag         .count = 1
47*758e9fbaSOystein Eftevaag     };
48*758e9fbaSOystein Eftevaag     TSS2L_SYS_AUTH_RESPONSE resp_auth = {
49*758e9fbaSOystein Eftevaag         .count = 0
50*758e9fbaSOystein Eftevaag     };
51*758e9fbaSOystein Eftevaag 
52*758e9fbaSOystein Eftevaag     nv_attribs = TPMA_NV_AUTHREAD |
53*758e9fbaSOystein Eftevaag                  TPMA_NV_AUTHWRITE |
54*758e9fbaSOystein Eftevaag                  TPMA_NV_ORDERLY;
55*758e9fbaSOystein Eftevaag 
56*758e9fbaSOystein Eftevaag     nonce_caller.size = 0;
57*758e9fbaSOystein Eftevaag     policy_auth.size = 0;
58*758e9fbaSOystein Eftevaag     nv_auth.size = 0;
59*758e9fbaSOystein Eftevaag 
60*758e9fbaSOystein Eftevaag     LOG_INFO("param-encrypt-decrypt test");
61*758e9fbaSOystein Eftevaag 
62*758e9fbaSOystein Eftevaag     rc = Tss2_Sys_GetTctiContext(sapi_context, &tcti_ctx);
63*758e9fbaSOystein Eftevaag     if (rc) {
64*758e9fbaSOystein Eftevaag         LOG_ERROR("Tss2_Sys_GetTctiContext failed 0x%" PRIx32, rc);
65*758e9fbaSOystein Eftevaag         return rc;
66*758e9fbaSOystein Eftevaag     }
67*758e9fbaSOystein Eftevaag 
68*758e9fbaSOystein Eftevaag     nv_public.size = 0;
69*758e9fbaSOystein Eftevaag     nv_public.nvPublic.attributes = nv_attribs;
70*758e9fbaSOystein Eftevaag     CopySizedByteBuffer((TPM2B *)&nv_public.nvPublic.authPolicy, (TPM2B *)&policy_auth);
71*758e9fbaSOystein Eftevaag     nv_public.nvPublic.dataSize = TEST_DATA_LEN;
72*758e9fbaSOystein Eftevaag     nv_public.nvPublic.nvIndex = nv_index;
73*758e9fbaSOystein Eftevaag     nv_public.nvPublic.nameAlg = TPM2_ALG_SHA256;
74*758e9fbaSOystein Eftevaag 
75*758e9fbaSOystein Eftevaag     rc = Tss2_Sys_NV_DefineSpace(sapi_context, TPM2_RH_OWNER, &req_auth,
76*758e9fbaSOystein Eftevaag                                  &nv_auth, &nv_public, &resp_auth);
77*758e9fbaSOystein Eftevaag     if (rc) {
78*758e9fbaSOystein Eftevaag         LOG_ERROR("Tss2_Sys_NV_DefineSpace failed 0x%" PRIx32, rc);
79*758e9fbaSOystein Eftevaag         return rc;
80*758e9fbaSOystein Eftevaag     }
81*758e9fbaSOystein Eftevaag 
82*758e9fbaSOystein Eftevaag     symmetric.algorithm = TPM2_ALG_AES;
83*758e9fbaSOystein Eftevaag     symmetric.keyBits.aes = 128;
84*758e9fbaSOystein Eftevaag     symmetric.mode.aes = TPM2_ALG_CFB;
85*758e9fbaSOystein Eftevaag 
86*758e9fbaSOystein Eftevaag retry:
87*758e9fbaSOystein Eftevaag     rc = create_auth_session(&session, TPM2_RH_NULL, 0,
88*758e9fbaSOystein Eftevaag                 TPM2_RH_NULL, 0, &nonce_caller, 0, TPM2_SE_POLICY,
89*758e9fbaSOystein Eftevaag                 &symmetric, TPM2_ALG_SHA256, tcti_ctx);
90*758e9fbaSOystein Eftevaag     if (rc) {
91*758e9fbaSOystein Eftevaag         LOG_ERROR("create_auth_session failed 0x%" PRIx32, rc);
92*758e9fbaSOystein Eftevaag         goto clean;
93*758e9fbaSOystein Eftevaag     }
94*758e9fbaSOystein Eftevaag 
95*758e9fbaSOystein Eftevaag     memcpy(data_to_write.buffer, TEST_DATA, TEST_DATA_LEN);
96*758e9fbaSOystein Eftevaag     data_to_write.size = TEST_DATA_LEN;
97*758e9fbaSOystein Eftevaag 
98*758e9fbaSOystein Eftevaag     rc = Tss2_Sys_NV_Write_Prepare(sapi_context, nv_index, nv_index,
99*758e9fbaSOystein Eftevaag                                    &data_to_write, 0);
100*758e9fbaSOystein Eftevaag     if (rc) {
101*758e9fbaSOystein Eftevaag         LOG_ERROR("Tss2_Sys_NV_Write_Prepare failed 0x%" PRIx32, rc);
102*758e9fbaSOystein Eftevaag         goto clean;
103*758e9fbaSOystein Eftevaag     }
104*758e9fbaSOystein Eftevaag 
105*758e9fbaSOystein Eftevaag     req_auth.count = 2;
106*758e9fbaSOystein Eftevaag     /* Set up auth session structure */
107*758e9fbaSOystein Eftevaag     req_auth.auths[0].sessionHandle = TPM2_RS_PW;
108*758e9fbaSOystein Eftevaag     req_auth.auths[0].nonce.size = 0;
109*758e9fbaSOystein Eftevaag     req_auth.auths[0].sessionAttributes = 0;
110*758e9fbaSOystein Eftevaag     req_auth.auths[0].hmac.size = nv_auth.size;
111*758e9fbaSOystein Eftevaag     memcpy(req_auth.auths[0].hmac.buffer, nv_auth.buffer,
112*758e9fbaSOystein Eftevaag            req_auth.auths[0].hmac.size);
113*758e9fbaSOystein Eftevaag 
114*758e9fbaSOystein Eftevaag     /* Set up encrypt/decrypt session structure */
115*758e9fbaSOystein Eftevaag     req_auth.auths[1].sessionHandle = session->sessionHandle;
116*758e9fbaSOystein Eftevaag     req_auth.auths[1].nonce.size = 0;
117*758e9fbaSOystein Eftevaag     req_auth.auths[1].sessionAttributes = TPMA_SESSION_CONTINUESESSION | TPMA_SESSION_DECRYPT;
118*758e9fbaSOystein Eftevaag     req_auth.auths[1].hmac.size = 0;
119*758e9fbaSOystein Eftevaag 
120*758e9fbaSOystein Eftevaag     rc = Tss2_Sys_SetCmdAuths(sapi_context, &req_auth);
121*758e9fbaSOystein Eftevaag     if (rc) {
122*758e9fbaSOystein Eftevaag         LOG_ERROR("Tss2_Sys_SetCmdAuths failed 0x%" PRIx32, rc);
123*758e9fbaSOystein Eftevaag         goto clean;
124*758e9fbaSOystein Eftevaag     }
125*758e9fbaSOystein Eftevaag 
126*758e9fbaSOystein Eftevaag     rc = Tss2_Sys_GetDecryptParam(sapi_context, &decrypt_param_size, &decrypt_param_ptr);
127*758e9fbaSOystein Eftevaag     if (rc) {
128*758e9fbaSOystein Eftevaag         LOG_ERROR("Tss2_Sys_GetDecryptParam failed 0x%" PRIx32, rc);
129*758e9fbaSOystein Eftevaag         goto clean;
130*758e9fbaSOystein Eftevaag     }
131*758e9fbaSOystein Eftevaag 
132*758e9fbaSOystein Eftevaag     if (decrypt_param_size != TEST_DATA_LEN) {
133*758e9fbaSOystein Eftevaag         rc = 99;
134*758e9fbaSOystein Eftevaag         LOG_ERROR("Invalid decrypt_param_size %d", (int)decrypt_param_size);
135*758e9fbaSOystein Eftevaag         goto clean;
136*758e9fbaSOystein Eftevaag     }
137*758e9fbaSOystein Eftevaag 
138*758e9fbaSOystein Eftevaag     roll_nonces(session, &req_auth.auths[1].nonce);
139*758e9fbaSOystein Eftevaag 
140*758e9fbaSOystein Eftevaag     rc = encrypt_command_param(session, &encrypted_param,
141*758e9fbaSOystein Eftevaag                                (TPM2B_MAX_BUFFER *)&data_to_write, &nv_auth);
142*758e9fbaSOystein Eftevaag     if (rc) {
143*758e9fbaSOystein Eftevaag         LOG_ERROR("encrypt_command_param failed 0x%" PRIx32, rc);
144*758e9fbaSOystein Eftevaag         goto clean;
145*758e9fbaSOystein Eftevaag     }
146*758e9fbaSOystein Eftevaag 
147*758e9fbaSOystein Eftevaag     rc = Tss2_Sys_SetDecryptParam(sapi_context, encrypted_param.size,
148*758e9fbaSOystein Eftevaag                                   encrypted_param.buffer);
149*758e9fbaSOystein Eftevaag     if (rc) {
150*758e9fbaSOystein Eftevaag         LOG_ERROR("Tss2_Sys_SetDecryptParam failed 0x%" PRIx32, rc);
151*758e9fbaSOystein Eftevaag         goto clean;
152*758e9fbaSOystein Eftevaag     }
153*758e9fbaSOystein Eftevaag 
154*758e9fbaSOystein Eftevaag     rc = Tss2_Sys_Execute(sapi_context);
155*758e9fbaSOystein Eftevaag     if (rc) {
156*758e9fbaSOystein Eftevaag         if ((rc & 0x0000ffff) == TPM2_RC_RETRY) {
157*758e9fbaSOystein Eftevaag             LOG_INFO("Tss2_Sys_Execute returned retry 0x%" PRIx32, rc);
158*758e9fbaSOystein Eftevaag             Tss2_Sys_FlushContext(sapi_context, session->sessionHandle);
159*758e9fbaSOystein Eftevaag             end_auth_session(session);
160*758e9fbaSOystein Eftevaag             goto retry;
161*758e9fbaSOystein Eftevaag         }
162*758e9fbaSOystein Eftevaag 
163*758e9fbaSOystein Eftevaag         LOG_ERROR("Tss2_Sys_Execute failed 0x%" PRIx32, rc);
164*758e9fbaSOystein Eftevaag         goto clean;
165*758e9fbaSOystein Eftevaag     }
166*758e9fbaSOystein Eftevaag 
167*758e9fbaSOystein Eftevaag     rc = Tss2_Sys_GetRspAuths(sapi_context, &resp_auth);
168*758e9fbaSOystein Eftevaag     if (rc) {
169*758e9fbaSOystein Eftevaag         LOG_ERROR("Tss2_Sys_GetRspAuths failed 0x%" PRIx32, rc);
170*758e9fbaSOystein Eftevaag         goto clean;
171*758e9fbaSOystein Eftevaag     }
172*758e9fbaSOystein Eftevaag 
173*758e9fbaSOystein Eftevaag     /* Roll the nonces for response */
174*758e9fbaSOystein Eftevaag     roll_nonces(session, &resp_auth.auths[1].nonce);
175*758e9fbaSOystein Eftevaag 
176*758e9fbaSOystein Eftevaag     /* Roll the nonces for next command */
177*758e9fbaSOystein Eftevaag     roll_nonces(session, &req_auth.auths[1].nonce);
178*758e9fbaSOystein Eftevaag 
179*758e9fbaSOystein Eftevaag     req_auth.count = 1;
180*758e9fbaSOystein Eftevaag 
181*758e9fbaSOystein Eftevaag     rc = Tss2_Sys_NV_Read(sapi_context, nv_index, nv_index, &req_auth,
182*758e9fbaSOystein Eftevaag                           TEST_DATA_LEN, 0, &data_read, &resp_auth);
183*758e9fbaSOystein Eftevaag     if (rc) {
184*758e9fbaSOystein Eftevaag         LOG_ERROR("Tss2_Sys_NV_Read failed 0x%" PRIx32, rc);
185*758e9fbaSOystein Eftevaag         goto clean;
186*758e9fbaSOystein Eftevaag     }
187*758e9fbaSOystein Eftevaag 
188*758e9fbaSOystein Eftevaag     roll_nonces(session, &resp_auth.auths[1].nonce);
189*758e9fbaSOystein Eftevaag 
190*758e9fbaSOystein Eftevaag     if (memcmp(data_read.buffer, data_to_write.buffer, data_read.size)) {
191*758e9fbaSOystein Eftevaag         LOG_ERROR("Read data not equal to written data");
192*758e9fbaSOystein Eftevaag         LOGBLOB_ERROR(data_to_write.buffer, data_to_write.size, "written");
193*758e9fbaSOystein Eftevaag         LOGBLOB_ERROR(data_read.buffer, data_read.size, "read");
194*758e9fbaSOystein Eftevaag         rc = 99;
195*758e9fbaSOystein Eftevaag         goto clean;
196*758e9fbaSOystein Eftevaag     }
197*758e9fbaSOystein Eftevaag 
198*758e9fbaSOystein Eftevaag     rc = Tss2_Sys_NV_Read_Prepare(sapi_context, nv_index, nv_index, TEST_DATA_LEN, 0);
199*758e9fbaSOystein Eftevaag     if (rc) {
200*758e9fbaSOystein Eftevaag         LOG_ERROR("Tss2_Sys_NV_Read_Prepare failed 0x%" PRIx32, rc);
201*758e9fbaSOystein Eftevaag         goto clean;
202*758e9fbaSOystein Eftevaag     }
203*758e9fbaSOystein Eftevaag 
204*758e9fbaSOystein Eftevaag     roll_nonces(session, &req_auth.auths[1].nonce);
205*758e9fbaSOystein Eftevaag 
206*758e9fbaSOystein Eftevaag     req_auth.count = 2;
207*758e9fbaSOystein Eftevaag     req_auth.auths[1].sessionAttributes &= ~TPMA_SESSION_DECRYPT;
208*758e9fbaSOystein Eftevaag     req_auth.auths[1].sessionAttributes |= TPMA_SESSION_ENCRYPT;
209*758e9fbaSOystein Eftevaag     req_auth.auths[1].sessionAttributes |= TPMA_SESSION_CONTINUESESSION;
210*758e9fbaSOystein Eftevaag 
211*758e9fbaSOystein Eftevaag     rc = Tss2_Sys_SetCmdAuths(sapi_context, &req_auth);
212*758e9fbaSOystein Eftevaag     if (rc) {
213*758e9fbaSOystein Eftevaag         LOG_ERROR("Tss2_Sys_SetCmdAuths failed 0x%" PRIx32, rc);
214*758e9fbaSOystein Eftevaag         goto clean;
215*758e9fbaSOystein Eftevaag     }
216*758e9fbaSOystein Eftevaag 
217*758e9fbaSOystein Eftevaag     rc = Tss2_Sys_Execute(sapi_context);
218*758e9fbaSOystein Eftevaag     if (rc) {
219*758e9fbaSOystein Eftevaag         LOG_ERROR("Tss2_Sys_Execute failed 0x%" PRIx32, rc);
220*758e9fbaSOystein Eftevaag         goto clean;
221*758e9fbaSOystein Eftevaag     }
222*758e9fbaSOystein Eftevaag 
223*758e9fbaSOystein Eftevaag     rc = Tss2_Sys_GetEncryptParam(sapi_context, &encrypt_param_size, &encrypt_param_ptr);
224*758e9fbaSOystein Eftevaag     if (rc) {
225*758e9fbaSOystein Eftevaag         LOG_ERROR("Tss2_Sys_GetEncryptParam failed 0x%" PRIx32, rc);
226*758e9fbaSOystein Eftevaag         goto clean;
227*758e9fbaSOystein Eftevaag     }
228*758e9fbaSOystein Eftevaag 
229*758e9fbaSOystein Eftevaag     rc = Tss2_Sys_GetRspAuths(sapi_context, &resp_auth);
230*758e9fbaSOystein Eftevaag     if (rc) {
231*758e9fbaSOystein Eftevaag         LOG_ERROR("Tss2_Sys_GetRspAuths failed 0x%" PRIx32, rc);
232*758e9fbaSOystein Eftevaag         goto clean;
233*758e9fbaSOystein Eftevaag     }
234*758e9fbaSOystein Eftevaag 
235*758e9fbaSOystein Eftevaag     roll_nonces(session, &resp_auth.auths[1].nonce);
236*758e9fbaSOystein Eftevaag 
237*758e9fbaSOystein Eftevaag     encrypted_param.size = encrypt_param_size;
238*758e9fbaSOystein Eftevaag     memcpy(encrypted_param.buffer, encrypt_param_ptr, encrypt_param_size);
239*758e9fbaSOystein Eftevaag 
240*758e9fbaSOystein Eftevaag     rc = decrypt_response_param(session, &decrypted_param,
241*758e9fbaSOystein Eftevaag                                 &encrypted_param, &nv_auth);
242*758e9fbaSOystein Eftevaag     if (rc) {
243*758e9fbaSOystein Eftevaag         LOG_ERROR("decrypt_response_param failed 0x%" PRIx32, rc);
244*758e9fbaSOystein Eftevaag         goto clean;
245*758e9fbaSOystein Eftevaag     }
246*758e9fbaSOystein Eftevaag 
247*758e9fbaSOystein Eftevaag     roll_nonces(session, &resp_auth.auths[1].nonce);
248*758e9fbaSOystein Eftevaag 
249*758e9fbaSOystein Eftevaag     rc = Tss2_Sys_SetEncryptParam(sapi_context, decrypted_param.size,
250*758e9fbaSOystein Eftevaag                                   decrypted_param.buffer);
251*758e9fbaSOystein Eftevaag     if (rc) {
252*758e9fbaSOystein Eftevaag         LOG_ERROR("Tss2_Sys_SetEncryptParam failed 0x%" PRIx32, rc);
253*758e9fbaSOystein Eftevaag         goto clean;
254*758e9fbaSOystein Eftevaag     }
255*758e9fbaSOystein Eftevaag 
256*758e9fbaSOystein Eftevaag     rc = Tss2_Sys_NV_Read_Complete(sapi_context, &data_read);
257*758e9fbaSOystein Eftevaag     if (rc) {
258*758e9fbaSOystein Eftevaag         LOG_ERROR("Tss2_Sys_NV_Read_Complete failed 0x%" PRIx32, rc);
259*758e9fbaSOystein Eftevaag         goto clean;
260*758e9fbaSOystein Eftevaag     }
261*758e9fbaSOystein Eftevaag 
262*758e9fbaSOystein Eftevaag     LOGBLOB_DEBUG(data_read.buffer, (UINT32)data_read.size, "Decrypted read data = ");
263*758e9fbaSOystein Eftevaag 
264*758e9fbaSOystein Eftevaag     if (memcmp(data_read.buffer, data_to_write.buffer, data_read.size)) {
265*758e9fbaSOystein Eftevaag         LOG_ERROR("Read data not equal to written data");
266*758e9fbaSOystein Eftevaag         rc = 99;
267*758e9fbaSOystein Eftevaag         goto clean;
268*758e9fbaSOystein Eftevaag     }
269*758e9fbaSOystein Eftevaag 
270*758e9fbaSOystein Eftevaag     rc = Tss2_Sys_FlushContext(sapi_context, session->sessionHandle);
271*758e9fbaSOystein Eftevaag     if (rc)
272*758e9fbaSOystein Eftevaag         LOG_ERROR("Tss2_Sys_FlushContext failed 0x%" PRIx32, rc);
273*758e9fbaSOystein Eftevaag 
274*758e9fbaSOystein Eftevaag     end_auth_session(session);
275*758e9fbaSOystein Eftevaag 
276*758e9fbaSOystein Eftevaag clean:
277*758e9fbaSOystein Eftevaag     req_auth.count = 1;
278*758e9fbaSOystein Eftevaag     req_auth.auths[0].sessionHandle = TPM2_RS_PW;
279*758e9fbaSOystein Eftevaag 
280*758e9fbaSOystein Eftevaag     rc2 = Tss2_Sys_NV_UndefineSpace(sapi_context, TPM2_RH_OWNER,
281*758e9fbaSOystein Eftevaag                                     nv_index, &req_auth, 0);
282*758e9fbaSOystein Eftevaag     if (rc2)
283*758e9fbaSOystein Eftevaag         LOG_ERROR("Tss2_Sys_NV_UndefineSpace failed 0x%" PRIx32, rc);
284*758e9fbaSOystein Eftevaag 
285*758e9fbaSOystein Eftevaag     if (rc == 0)
286*758e9fbaSOystein Eftevaag         LOG_INFO("param-encrypt-decrypt test PASSED");
287*758e9fbaSOystein Eftevaag 
288*758e9fbaSOystein Eftevaag     return rc;
289*758e9fbaSOystein Eftevaag }
290