xref: /aosp_15_r20/external/tpm2-tss/test/integration/sapi-util.h (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 #ifndef TEST_INTEGRATION_SAPI_UTIL_H
8*758e9fbaSOystein Eftevaag #define TEST_INTEGRATION_SAPI_UTIL_H
9*758e9fbaSOystein Eftevaag 
10*758e9fbaSOystein Eftevaag #include "tss2_tpm2_types.h"
11*758e9fbaSOystein Eftevaag #include "tss2_sys.h"
12*758e9fbaSOystein Eftevaag #include "util/tpm2b.h"
13*758e9fbaSOystein Eftevaag 
14*758e9fbaSOystein Eftevaag /*
15*758e9fbaSOystein Eftevaag  * This macro is like the GNU TEMP_FAILURE_RETRY macro for the
16*758e9fbaSOystein Eftevaag  * TPM2_RC_RETRY response code.
17*758e9fbaSOystein Eftevaag  */
18*758e9fbaSOystein Eftevaag #define TSS2_RETRY_EXP(expression)                         \
19*758e9fbaSOystein Eftevaag     ({                                                     \
20*758e9fbaSOystein Eftevaag         TSS2_RC __result = 0;                              \
21*758e9fbaSOystein Eftevaag         do {                                               \
22*758e9fbaSOystein Eftevaag             __result = (expression);                       \
23*758e9fbaSOystein Eftevaag         } while ((__result & 0x0000ffff) == TPM2_RC_RETRY); \
24*758e9fbaSOystein Eftevaag         __result;                                          \
25*758e9fbaSOystein Eftevaag     })
26*758e9fbaSOystein Eftevaag /*
27*758e9fbaSOystein Eftevaag  * tpm2b default initializers, these set the size to the max for the default
28*758e9fbaSOystein Eftevaag  * structure and zero's the data area.
29*758e9fbaSOystein Eftevaag  */
30*758e9fbaSOystein Eftevaag #define TPM2B_SIZE(type) (sizeof (type) - 2)
31*758e9fbaSOystein Eftevaag #define TPM2B_NAMED_INIT(type, field) \
32*758e9fbaSOystein Eftevaag     { \
33*758e9fbaSOystein Eftevaag         .size = TPM2B_SIZE (type), \
34*758e9fbaSOystein Eftevaag         .field = { 0 } \
35*758e9fbaSOystein Eftevaag     }
36*758e9fbaSOystein Eftevaag #define TPM2B_DIGEST_INIT TPM2B_NAMED_INIT (TPM2B_DIGEST, buffer)
37*758e9fbaSOystein Eftevaag #define TPM2B_NAME_INIT TPM2B_NAMED_INIT (TPM2B_NAME, name)
38*758e9fbaSOystein Eftevaag #define TPM2B_PRIVATE_INIT TPM2B_NAMED_INIT (TPM2B_PRIVATE, buffer)
39*758e9fbaSOystein Eftevaag 
40*758e9fbaSOystein Eftevaag #define TPM2B_MAX_BUFFER_INIT { .size = TPM2_MAX_DIGEST_BUFFER }
41*758e9fbaSOystein Eftevaag #define TPM2B_IV_INIT { .size = TPM2_MAX_SYM_BLOCK_SIZE }
42*758e9fbaSOystein Eftevaag 
43*758e9fbaSOystein Eftevaag #define BUFFER_SIZE(type, field) (sizeof((((type *)NULL)->t.field)))
44*758e9fbaSOystein Eftevaag #define TPM2B_TYPE_INIT(type, field) { .size = BUFFER_SIZE(type, field), }
45*758e9fbaSOystein Eftevaag /*
46*758e9fbaSOystein Eftevaag  * Use te provide SAPI context to create & load a primary key. The key will
47*758e9fbaSOystein Eftevaag  * be a 2048 bit (restricted decryption) RSA key. The associated symmetric
48*758e9fbaSOystein Eftevaag  * key is a 128 bit AES (CFB mode) key.
49*758e9fbaSOystein Eftevaag  */
50*758e9fbaSOystein Eftevaag TSS2_RC
51*758e9fbaSOystein Eftevaag create_primary_rsa_2048_aes_128_cfb (
52*758e9fbaSOystein Eftevaag     TSS2_SYS_CONTEXT *sapi_context,
53*758e9fbaSOystein Eftevaag     TPM2_HANDLE       *handle);
54*758e9fbaSOystein Eftevaag /*
55*758e9fbaSOystein Eftevaag  * This function creates a 128 bit symmetric AES key in cbc mode. This key will
56*758e9fbaSOystein Eftevaag  * be created as the child of the parameter 'handle_parent'. The handle for the
57*758e9fbaSOystein Eftevaag  * newly created AND loaded key is returned in the parameter 'handle'.
58*758e9fbaSOystein Eftevaag  */
59*758e9fbaSOystein Eftevaag TSS2_RC
60*758e9fbaSOystein Eftevaag create_aes_128_cfb (
61*758e9fbaSOystein Eftevaag     TSS2_SYS_CONTEXT *sapi_context,
62*758e9fbaSOystein Eftevaag     TPM2_HANDLE        handle_parent,
63*758e9fbaSOystein Eftevaag     TPM2_HANDLE       *handle);
64*758e9fbaSOystein Eftevaag 
65*758e9fbaSOystein Eftevaag /*
66*758e9fbaSOystein Eftevaag  * This function creates a RSA key of KEYEDHASH type.
67*758e9fbaSOystein Eftevaag  */
68*758e9fbaSOystein Eftevaag TSS2_RC
69*758e9fbaSOystein Eftevaag create_keyedhash_key (
70*758e9fbaSOystein Eftevaag     TSS2_SYS_CONTEXT *sapi_context,
71*758e9fbaSOystein Eftevaag     TPM2_HANDLE       handle_parent,
72*758e9fbaSOystein Eftevaag     TPM2_HANDLE      *handle);
73*758e9fbaSOystein Eftevaag 
74*758e9fbaSOystein Eftevaag /*
75*758e9fbaSOystein Eftevaag  * This function will decrypt or encrypt the 'data_in' buffer and return the
76*758e9fbaSOystein Eftevaag  * results in the 'data_out' parameter. Decrypt or encrypt is selected using
77*758e9fbaSOystein Eftevaag  * the 'decrypt' TPMI_YES_NO parameter. The key used for the operation is
78*758e9fbaSOystein Eftevaag  * provided in the 'handle' parameter.
79*758e9fbaSOystein Eftevaag  * Under the covers this function uses an IV of all zeros and so it can not
80*758e9fbaSOystein Eftevaag  * be used for streaming. It can only be used to encrypt or decrypt a single
81*758e9fbaSOystein Eftevaag  * buffer. This function uses tpm to perform encryption.
82*758e9fbaSOystein Eftevaag  */
83*758e9fbaSOystein Eftevaag TSS2_RC
84*758e9fbaSOystein Eftevaag tpm_encrypt_decrypt_cfb (
85*758e9fbaSOystein Eftevaag     TSS2_SYS_CONTEXT *sapi_context,
86*758e9fbaSOystein Eftevaag     TPMI_DH_OBJECT    handle,
87*758e9fbaSOystein Eftevaag     TPMI_YES_NO       decrypt,
88*758e9fbaSOystein Eftevaag     TPM2B_MAX_BUFFER *data_in,
89*758e9fbaSOystein Eftevaag     TPM2B_MAX_BUFFER *data_out);
90*758e9fbaSOystein Eftevaag /*
91*758e9fbaSOystein Eftevaag  * This is a convenience wrapper around the encrypt_decrypt_cfb function.
92*758e9fbaSOystein Eftevaag  * This function uses tpm to perform encryption.
93*758e9fbaSOystein Eftevaag  */
94*758e9fbaSOystein Eftevaag TSS2_RC
95*758e9fbaSOystein Eftevaag tpm_encrypt_cfb (
96*758e9fbaSOystein Eftevaag     TSS2_SYS_CONTEXT *sapi_context,
97*758e9fbaSOystein Eftevaag     TPMI_DH_OBJECT    handle,
98*758e9fbaSOystein Eftevaag     TPM2B_MAX_BUFFER *data_in,
99*758e9fbaSOystein Eftevaag     TPM2B_MAX_BUFFER *data_out);
100*758e9fbaSOystein Eftevaag /*
101*758e9fbaSOystein Eftevaag  * This is a convenience wrapper around the encrypt_decrypt_cfb function.
102*758e9fbaSOystein Eftevaag  * This function uses tpm to perform encryption.
103*758e9fbaSOystein Eftevaag  */
104*758e9fbaSOystein Eftevaag TSS2_RC
105*758e9fbaSOystein Eftevaag tpm_decrypt_cfb (
106*758e9fbaSOystein Eftevaag     TSS2_SYS_CONTEXT *sapi_context,
107*758e9fbaSOystein Eftevaag     TPMI_DH_OBJECT    handle,
108*758e9fbaSOystein Eftevaag     TPM2B_MAX_BUFFER *data_in,
109*758e9fbaSOystein Eftevaag     TPM2B_MAX_BUFFER *data_out);
110*758e9fbaSOystein Eftevaag /*
111*758e9fbaSOystein Eftevaag  * This function is identical to the encrypt_decrypt_cfb function but under
112*758e9fbaSOystein Eftevaag  * the covers it uses the EncryptDecrypt2 function instead of EncryptDecrypt.
113*758e9fbaSOystein Eftevaag  * This function uses tpm to perform encryption.
114*758e9fbaSOystein Eftevaag  */
115*758e9fbaSOystein Eftevaag TSS2_RC
116*758e9fbaSOystein Eftevaag tpm_encrypt_decrypt_2_cfb (
117*758e9fbaSOystein Eftevaag     TSS2_SYS_CONTEXT *sapi_context,
118*758e9fbaSOystein Eftevaag     TPMI_DH_OBJECT    handle,
119*758e9fbaSOystein Eftevaag     TPMI_YES_NO       decrypt,
120*758e9fbaSOystein Eftevaag     TPM2B_MAX_BUFFER *data_in,
121*758e9fbaSOystein Eftevaag     TPM2B_MAX_BUFFER *data_out);
122*758e9fbaSOystein Eftevaag /*
123*758e9fbaSOystein Eftevaag  * This is a convenience wrapper around the encrypt_decrypt_2_cfb function.
124*758e9fbaSOystein Eftevaag  * This function uses tpm to perform encryption.
125*758e9fbaSOystein Eftevaag  */
126*758e9fbaSOystein Eftevaag TSS2_RC
127*758e9fbaSOystein Eftevaag tpm_encrypt_2_cfb (
128*758e9fbaSOystein Eftevaag     TSS2_SYS_CONTEXT *sapi_context,
129*758e9fbaSOystein Eftevaag     TPMI_DH_OBJECT    handle,
130*758e9fbaSOystein Eftevaag     TPM2B_MAX_BUFFER *data_in,
131*758e9fbaSOystein Eftevaag     TPM2B_MAX_BUFFER *data_out);
132*758e9fbaSOystein Eftevaag /*
133*758e9fbaSOystein Eftevaag  * This is a convenience wrapper around the encrypt_decrypt_2_cfb function.
134*758e9fbaSOystein Eftevaag  * This function uses tpm to perform encryption.
135*758e9fbaSOystein Eftevaag  */
136*758e9fbaSOystein Eftevaag TSS2_RC
137*758e9fbaSOystein Eftevaag tpm_decrypt_2_cfb (
138*758e9fbaSOystein Eftevaag     TSS2_SYS_CONTEXT *sapi_context,
139*758e9fbaSOystein Eftevaag     TPMI_DH_OBJECT    handle,
140*758e9fbaSOystein Eftevaag     TPM2B_MAX_BUFFER *data_in,
141*758e9fbaSOystein Eftevaag     TPM2B_MAX_BUFFER *data_out);
142*758e9fbaSOystein Eftevaag /*
143*758e9fbaSOystein Eftevaag  * This helper function uses software to perform decryption.
144*758e9fbaSOystein Eftevaag  */
145*758e9fbaSOystein Eftevaag TSS2_RC
146*758e9fbaSOystein Eftevaag decrypt_cfb (
147*758e9fbaSOystein Eftevaag     TPM2B_MAX_BUFFER *data_out,
148*758e9fbaSOystein Eftevaag     TPM2B_MAX_BUFFER *data_in,
149*758e9fbaSOystein Eftevaag     TPM2B_MAX_BUFFER *key,
150*758e9fbaSOystein Eftevaag     TPM2B_IV *iv);
151*758e9fbaSOystein Eftevaag /*
152*758e9fbaSOystein Eftevaag  * This helper function uses software to perform encryption.
153*758e9fbaSOystein Eftevaag  */
154*758e9fbaSOystein Eftevaag TSS2_RC
155*758e9fbaSOystein Eftevaag encrypt_cfb (
156*758e9fbaSOystein Eftevaag     TPM2B_MAX_BUFFER *data_out,
157*758e9fbaSOystein Eftevaag     TPM2B_MAX_BUFFER *data_in,
158*758e9fbaSOystein Eftevaag     TPM2B_MAX_BUFFER *key,
159*758e9fbaSOystein Eftevaag     TPM2B_IV *iv);
160*758e9fbaSOystein Eftevaag 
161*758e9fbaSOystein Eftevaag /*
162*758e9fbaSOystein Eftevaag  * This is a helper function for digest calculation.
163*758e9fbaSOystein Eftevaag  * alg can be TPM2_ALG_SHA1, TPM2_ALG_SHA256, TPM2_ALG_SHA384,
164*758e9fbaSOystein Eftevaag  * and TPM2_ALG_SHA512
165*758e9fbaSOystein Eftevaag  */
166*758e9fbaSOystein Eftevaag TSS2_RC
167*758e9fbaSOystein Eftevaag hash (
168*758e9fbaSOystein Eftevaag     TPM2_ALG_ID alg,
169*758e9fbaSOystein Eftevaag     const void *data,
170*758e9fbaSOystein Eftevaag     int size,
171*758e9fbaSOystein Eftevaag     TPM2B_DIGEST *out);
172*758e9fbaSOystein Eftevaag 
173*758e9fbaSOystein Eftevaag /*
174*758e9fbaSOystein Eftevaag  * This is a helper function for calculating HMAC.
175*758e9fbaSOystein Eftevaag  * alg can be TPM2_ALG_SHA1, TPM2_ALG_SHA256, TPM2_ALG_SHA384,
176*758e9fbaSOystein Eftevaag  * and TPM2_ALG_SHA512
177*758e9fbaSOystein Eftevaag  */
178*758e9fbaSOystein Eftevaag TSS2_RC
179*758e9fbaSOystein Eftevaag hmac(
180*758e9fbaSOystein Eftevaag     TPM2_ALG_ID alg,
181*758e9fbaSOystein Eftevaag     const void *key,
182*758e9fbaSOystein Eftevaag     int key_len,
183*758e9fbaSOystein Eftevaag     TPM2B_DIGEST **buffer_list,
184*758e9fbaSOystein Eftevaag     TPM2B_DIGEST *out);
185*758e9fbaSOystein Eftevaag 
186*758e9fbaSOystein Eftevaag /*
187*758e9fbaSOystein Eftevaag  * Returns digest size for a give hash alg
188*758e9fbaSOystein Eftevaag  */
189*758e9fbaSOystein Eftevaag UINT16
190*758e9fbaSOystein Eftevaag GetDigestSize(TPM2_ALG_ID hash);
191*758e9fbaSOystein Eftevaag 
192*758e9fbaSOystein Eftevaag TSS2_RC
193*758e9fbaSOystein Eftevaag CompareSizedByteBuffer(
194*758e9fbaSOystein Eftevaag         TPM2B *buffer1,
195*758e9fbaSOystein Eftevaag         TPM2B *buffer2);
196*758e9fbaSOystein Eftevaag 
197*758e9fbaSOystein Eftevaag TSS2_RC
198*758e9fbaSOystein Eftevaag ConcatSizedByteBuffer(
199*758e9fbaSOystein Eftevaag         TPM2B_MAX_BUFFER *result,
200*758e9fbaSOystein Eftevaag         TPM2B *buf);
201*758e9fbaSOystein Eftevaag 
202*758e9fbaSOystein Eftevaag void
203*758e9fbaSOystein Eftevaag CatSizedByteBuffer(
204*758e9fbaSOystein Eftevaag         TPM2B *dest,
205*758e9fbaSOystein Eftevaag         TPM2B *src);
206*758e9fbaSOystein Eftevaag 
207*758e9fbaSOystein Eftevaag UINT16
208*758e9fbaSOystein Eftevaag CopySizedByteBuffer(
209*758e9fbaSOystein Eftevaag         TPM2B *dest,
210*758e9fbaSOystein Eftevaag         const TPM2B *src);
211*758e9fbaSOystein Eftevaag 
212*758e9fbaSOystein Eftevaag TSS2_RC
213*758e9fbaSOystein Eftevaag DefineNvIndex (
214*758e9fbaSOystein Eftevaag     TSS2_SYS_CONTEXT *sys_ctx,
215*758e9fbaSOystein Eftevaag     TPMI_RH_PROVISION authHandle,
216*758e9fbaSOystein Eftevaag     TPM2B_AUTH *auth,
217*758e9fbaSOystein Eftevaag     const TPM2B_DIGEST *authPolicy,
218*758e9fbaSOystein Eftevaag     TPMI_RH_NV_INDEX nvIndex,
219*758e9fbaSOystein Eftevaag     TPMI_ALG_HASH nameAlg,
220*758e9fbaSOystein Eftevaag     TPMA_NV attributes,
221*758e9fbaSOystein Eftevaag     UINT16 size);
222*758e9fbaSOystein Eftevaag 
223*758e9fbaSOystein Eftevaag #endif /* TEST_INTEGRATION_SAPI_UTIL_H */
224