xref: /aosp_15_r20/external/tpm2-tss/src/tss2-fapi/ifapi_keystore.h (revision 758e9fba6fc9adbf15340f70c73baee7b168b1c9)
1*758e9fbaSOystein Eftevaag /* SPDX-License-Identifier: BSD-2-Clause */
2*758e9fbaSOystein Eftevaag /*******************************************************************************
3*758e9fbaSOystein Eftevaag  * Copyright 2018-2019, Fraunhofer SIT sponsored by Infineon Technologies AG
4*758e9fbaSOystein Eftevaag  * All rights reserved.
5*758e9fbaSOystein Eftevaag  ******************************************************************************/
6*758e9fbaSOystein Eftevaag 
7*758e9fbaSOystein Eftevaag #ifndef IFAPI_KEYSTORE_H
8*758e9fbaSOystein Eftevaag #define IFAPI_KEYSTORE_H
9*758e9fbaSOystein Eftevaag 
10*758e9fbaSOystein Eftevaag #include <stdlib.h>
11*758e9fbaSOystein Eftevaag 
12*758e9fbaSOystein Eftevaag #include "tss2_common.h"
13*758e9fbaSOystein Eftevaag #include "tss2_tpm2_types.h"
14*758e9fbaSOystein Eftevaag #include "fapi_types.h"
15*758e9fbaSOystein Eftevaag #include "ifapi_policy_types.h"
16*758e9fbaSOystein Eftevaag #include "tss2_esys.h"
17*758e9fbaSOystein Eftevaag 
18*758e9fbaSOystein Eftevaag typedef UINT32 IFAPI_OBJECT_TYPE_CONSTANT;
19*758e9fbaSOystein Eftevaag #define IFAPI_OBJ_NONE                 0    /**< Tag for key resource */
20*758e9fbaSOystein Eftevaag #define IFAPI_KEY_OBJ                  1    /**< Tag for key resource */
21*758e9fbaSOystein Eftevaag #define IFAPI_NV_OBJ                   2    /**< Tag for NV Ram resource */
22*758e9fbaSOystein Eftevaag #define IFAPI_EXT_PUB_KEY_OBJ          3    /**< Tag for key resource */
23*758e9fbaSOystein Eftevaag #define IFAPI_HIERARCHY_OBJ            4    /**< Tag for other resources, e.g. PCR register, hierarchies */
24*758e9fbaSOystein Eftevaag #define IFAPI_DUPLICATE_OBJ            5    /**< Tag for key duplication object */
25*758e9fbaSOystein Eftevaag 
26*758e9fbaSOystein Eftevaag /** Type for representing a FAPI key
27*758e9fbaSOystein Eftevaag  */
28*758e9fbaSOystein Eftevaag typedef struct {
29*758e9fbaSOystein Eftevaag     UINT32                            persistent_handle;    /**< Persistent TPM Handle */
30*758e9fbaSOystein Eftevaag     TPM2B_PUBLIC                                 public;    /**< The wrapped public portion of the object */
31*758e9fbaSOystein Eftevaag     UINT8_ARY                             serialization;    /**< None */
32*758e9fbaSOystein Eftevaag     UINT8_ARY                                   private;    /**< None */
33*758e9fbaSOystein Eftevaag     char                                *policyInstance;    /**<  Keys policy */
34*758e9fbaSOystein Eftevaag     TPM2B_CREATION_DATA                    creationData;    /**< None */
35*758e9fbaSOystein Eftevaag     TPMT_TK_CREATION                     creationTicket;    /**< None */
36*758e9fbaSOystein Eftevaag     char                                   *description;    /**< Human readable description of key */
37*758e9fbaSOystein Eftevaag     UINT8_ARY                                   appData;    /**< Application data */
38*758e9fbaSOystein Eftevaag     char                                   *certificate;    /**< Keys certificate (if any) */
39*758e9fbaSOystein Eftevaag     TPMT_SIG_SCHEME                      signing_scheme;    /**< Signing scheme for the key */
40*758e9fbaSOystein Eftevaag     TPM2B_NAME                                     name;    /**< Name of the key */
41*758e9fbaSOystein Eftevaag     TPMI_YES_NO                               with_auth;    /**< Authorization provided during creation */
42*758e9fbaSOystein Eftevaag } IFAPI_KEY;
43*758e9fbaSOystein Eftevaag 
44*758e9fbaSOystein Eftevaag /** Type for representing a external public key
45*758e9fbaSOystein Eftevaag  */
46*758e9fbaSOystein Eftevaag typedef struct {
47*758e9fbaSOystein Eftevaag     char                                *pem_ext_public;    /**< Public key in PEM format */
48*758e9fbaSOystein Eftevaag     char                                   *certificate;    /**< Keys certificate (if any) */
49*758e9fbaSOystein Eftevaag     TPM2B_PUBLIC                                 public;    /**< The pulic information in TPM format */
50*758e9fbaSOystein Eftevaag } IFAPI_EXT_PUB_KEY;
51*758e9fbaSOystein Eftevaag 
52*758e9fbaSOystein Eftevaag /** Type for representing hierarchy
53*758e9fbaSOystein Eftevaag  */
54*758e9fbaSOystein Eftevaag typedef struct {
55*758e9fbaSOystein Eftevaag     TPMI_YES_NO                               with_auth;    /**< Authorization provided */
56*758e9fbaSOystein Eftevaag     char                                   *description;    /**< Human readable description of hierarchy */
57*758e9fbaSOystein Eftevaag     TPM2B_DIGEST                             authPolicy;
58*758e9fbaSOystein Eftevaag } IFAPI_HIERARCHY;
59*758e9fbaSOystein Eftevaag 
60*758e9fbaSOystein Eftevaag /** Type for representing a FAPI NV object
61*758e9fbaSOystein Eftevaag  */
62*758e9fbaSOystein Eftevaag typedef struct {
63*758e9fbaSOystein Eftevaag     TPM2B_NV_PUBLIC                              public;    /**< The wrapped public portion of the object */
64*758e9fbaSOystein Eftevaag     UINT8_ARY                             serialization;    /**< None */
65*758e9fbaSOystein Eftevaag     UINT32                                    hierarchy;    /**< The hierarchy used for NV object creation */
66*758e9fbaSOystein Eftevaag     char                                *policyInstance;    /**<  Keys policy */
67*758e9fbaSOystein Eftevaag     char                                   *description;    /**< Human readable description of key */
68*758e9fbaSOystein Eftevaag     UINT8_ARY                                   appData;    /**< Application data */
69*758e9fbaSOystein Eftevaag     TPMI_YES_NO                               with_auth;    /**< Authorization provided during creation */
70*758e9fbaSOystein Eftevaag     char*                                     event_log;    /**< The event log if NV type is pcr */
71*758e9fbaSOystein Eftevaag } IFAPI_NV;
72*758e9fbaSOystein Eftevaag 
73*758e9fbaSOystein Eftevaag /** Type for representing a FAPI object for key duplication.
74*758e9fbaSOystein Eftevaag  */
75*758e9fbaSOystein Eftevaag typedef struct {
76*758e9fbaSOystein Eftevaag 
77*758e9fbaSOystein Eftevaag     TPM2B_PRIVATE                             duplicate; /**< The duplicate of the key to export*/
78*758e9fbaSOystein Eftevaag     TPM2B_ENCRYPTED_SECRET               encrypted_seed; /**< Encrypted seed needed for key import */
79*758e9fbaSOystein Eftevaag     TPM2B_PUBLIC                                 public; /**< The public information of the key to be duplicated */
80*758e9fbaSOystein Eftevaag     TPM2B_PUBLIC                          public_parent; /**< The public information of the new parent key */
81*758e9fbaSOystein Eftevaag     char                                   *certificate; /**< The certificate of the key to be duplicated */
82*758e9fbaSOystein Eftevaag     TPMS_POLICY                                 *policy; /**< The policy of the key to be duplicated */
83*758e9fbaSOystein Eftevaag } IFAPI_DUPLICATE;
84*758e9fbaSOystein Eftevaag 
85*758e9fbaSOystein Eftevaag /** type for representing public info of a TPM-Resource
86*758e9fbaSOystein Eftevaag  */
87*758e9fbaSOystein Eftevaag typedef union {
88*758e9fbaSOystein Eftevaag     IFAPI_EXT_PUB_KEY                       ext_pub_key;    /**< Public info for external key. */
89*758e9fbaSOystein Eftevaag     IFAPI_KEY                                       key;    /**< Public info for key objects */
90*758e9fbaSOystein Eftevaag     IFAPI_NV                                         nv;    /**< Public info for NV ram objects */
91*758e9fbaSOystein Eftevaag     IFAPI_DUPLICATE                            key_tree;    /**< Information for key duplication */
92*758e9fbaSOystein Eftevaag     IFAPI_HIERARCHY                           hierarchy;    /**< Information related to hierarchies */
93*758e9fbaSOystein Eftevaag } IFAPI_OBJECT_UNION;
94*758e9fbaSOystein Eftevaag 
95*758e9fbaSOystein Eftevaag /** The states for key searching */
96*758e9fbaSOystein Eftevaag enum FAPI_SEARCH_STATE {
97*758e9fbaSOystein Eftevaag     KSEARCH_INIT = 0,
98*758e9fbaSOystein Eftevaag     KSEARCH_SEARCH_OBJECT,
99*758e9fbaSOystein Eftevaag     KSEARCH_READ
100*758e9fbaSOystein Eftevaag };
101*758e9fbaSOystein Eftevaag 
102*758e9fbaSOystein Eftevaag /** The data structure holding internal state for key searching.
103*758e9fbaSOystein Eftevaag  */
104*758e9fbaSOystein Eftevaag typedef struct {
105*758e9fbaSOystein Eftevaag     size_t path_idx;                /**< Index of array of objects to be searched */
106*758e9fbaSOystein Eftevaag     size_t numPaths;                /**< Number of all objects in data store */
107*758e9fbaSOystein Eftevaag     char **pathlist;                /**< The array of all objects  in the search path */
108*758e9fbaSOystein Eftevaag     enum FAPI_SEARCH_STATE state;
109*758e9fbaSOystein Eftevaag } IFAPI_KEY_SEARCH;
110*758e9fbaSOystein Eftevaag 
111*758e9fbaSOystein Eftevaag typedef struct IFAPI_KEYSTORE {
112*758e9fbaSOystein Eftevaag     char *systemdir;
113*758e9fbaSOystein Eftevaag     char *userdir;
114*758e9fbaSOystein Eftevaag     char *defaultprofile;
115*758e9fbaSOystein Eftevaag     IFAPI_KEY_SEARCH key_search;
116*758e9fbaSOystein Eftevaag } IFAPI_KEYSTORE;
117*758e9fbaSOystein Eftevaag 
118*758e9fbaSOystein Eftevaag 
119*758e9fbaSOystein Eftevaag /** The states for the FAPI's object authorization state*/
120*758e9fbaSOystein Eftevaag enum IFAPI_AUTHORIZATION_STATE {
121*758e9fbaSOystein Eftevaag     AUTH_INIT = 0,
122*758e9fbaSOystein Eftevaag     AUTH_CHECK_POLICY,
123*758e9fbaSOystein Eftevaag     AUTH_CREATE_SESSION,
124*758e9fbaSOystein Eftevaag     AUTH_EXEC_POLICY,
125*758e9fbaSOystein Eftevaag     AUTH_FLUSH_OLD_POLICY,
126*758e9fbaSOystein Eftevaag     AUTH_DONE
127*758e9fbaSOystein Eftevaag };
128*758e9fbaSOystein Eftevaag 
129*758e9fbaSOystein Eftevaag /** The states for the FAPI's object write/read state*/
130*758e9fbaSOystein Eftevaag enum IFAPI_IO_STATE {
131*758e9fbaSOystein Eftevaag     IO_INIT = 0,
132*758e9fbaSOystein Eftevaag     IO_ACTIVE,
133*758e9fbaSOystein Eftevaag };
134*758e9fbaSOystein Eftevaag 
135*758e9fbaSOystein Eftevaag /** Type for representing TPM-Resource
136*758e9fbaSOystein Eftevaag  */
137*758e9fbaSOystein Eftevaag typedef struct _IFAPI_OBJECT {
138*758e9fbaSOystein Eftevaag     TPMS_POLICY                                 *policy;
139*758e9fbaSOystein Eftevaag     IFAPI_OBJECT_TYPE_CONSTANT               objectType;    /**< Selector for object type */
140*758e9fbaSOystein Eftevaag     IFAPI_OBJECT_UNION                             misc;    /**< Resource specific information */
141*758e9fbaSOystein Eftevaag     TPMI_YES_NO                                  system;    /**< Store the object in the system wide
142*758e9fbaSOystein Eftevaag                                                              directory */
143*758e9fbaSOystein Eftevaag     ESYS_TR                                      handle;    /**< Handle used by ESAPI */
144*758e9fbaSOystein Eftevaag     enum IFAPI_AUTHORIZATION_STATE  authorization_state;    /**< State of object authorization state machine */
145*758e9fbaSOystein Eftevaag     enum IFAPI_IO_STATE                           state;
146*758e9fbaSOystein Eftevaag 
147*758e9fbaSOystein Eftevaag } IFAPI_OBJECT;
148*758e9fbaSOystein Eftevaag 
149*758e9fbaSOystein Eftevaag 
150*758e9fbaSOystein Eftevaag TSS2_RC
151*758e9fbaSOystein Eftevaag ifapi_keystore_initialize(
152*758e9fbaSOystein Eftevaag     IFAPI_KEYSTORE *keystore,
153*758e9fbaSOystein Eftevaag     const char *config_systemdir,
154*758e9fbaSOystein Eftevaag     const char *config_userdir,
155*758e9fbaSOystein Eftevaag     const char *config_defaultprofile);
156*758e9fbaSOystein Eftevaag 
157*758e9fbaSOystein Eftevaag TSS2_RC
158*758e9fbaSOystein Eftevaag ifapi_keystore_load_async(
159*758e9fbaSOystein Eftevaag     IFAPI_KEYSTORE *keystore,
160*758e9fbaSOystein Eftevaag     IFAPI_IO *io,
161*758e9fbaSOystein Eftevaag     const char *path);
162*758e9fbaSOystein Eftevaag 
163*758e9fbaSOystein Eftevaag TSS2_RC
164*758e9fbaSOystein Eftevaag ifapi_keystore_load_finish(
165*758e9fbaSOystein Eftevaag     IFAPI_KEYSTORE *keystore,
166*758e9fbaSOystein Eftevaag     IFAPI_IO *io,
167*758e9fbaSOystein Eftevaag     IFAPI_OBJECT *object);
168*758e9fbaSOystein Eftevaag 
169*758e9fbaSOystein Eftevaag TSS2_RC
170*758e9fbaSOystein Eftevaag ifapi_keystore_store_async(
171*758e9fbaSOystein Eftevaag     IFAPI_KEYSTORE *keystore,
172*758e9fbaSOystein Eftevaag     IFAPI_IO *io,
173*758e9fbaSOystein Eftevaag     const char *path,
174*758e9fbaSOystein Eftevaag     const IFAPI_OBJECT *object);
175*758e9fbaSOystein Eftevaag 
176*758e9fbaSOystein Eftevaag TSS2_RC
177*758e9fbaSOystein Eftevaag ifapi_keystore_store_finish(
178*758e9fbaSOystein Eftevaag     IFAPI_KEYSTORE *keystore,
179*758e9fbaSOystein Eftevaag     IFAPI_IO *io);
180*758e9fbaSOystein Eftevaag 
181*758e9fbaSOystein Eftevaag TSS2_RC
182*758e9fbaSOystein Eftevaag ifapi_keystore_list_all(
183*758e9fbaSOystein Eftevaag     IFAPI_KEYSTORE *keystore,
184*758e9fbaSOystein Eftevaag     const char *searchpath,
185*758e9fbaSOystein Eftevaag     char ***results,
186*758e9fbaSOystein Eftevaag     size_t *numresults);
187*758e9fbaSOystein Eftevaag 
188*758e9fbaSOystein Eftevaag TSS2_RC
189*758e9fbaSOystein Eftevaag ifapi_keystore_delete(
190*758e9fbaSOystein Eftevaag      IFAPI_KEYSTORE *keystore,
191*758e9fbaSOystein Eftevaag      char *path);
192*758e9fbaSOystein Eftevaag 
193*758e9fbaSOystein Eftevaag TSS2_RC
194*758e9fbaSOystein Eftevaag ifapi_keystore_remove_directories(
195*758e9fbaSOystein Eftevaag     IFAPI_KEYSTORE *keystore,
196*758e9fbaSOystein Eftevaag     const char *dir_name);
197*758e9fbaSOystein Eftevaag 
198*758e9fbaSOystein Eftevaag TSS2_RC
199*758e9fbaSOystein Eftevaag ifapi_keystore_search_obj(
200*758e9fbaSOystein Eftevaag     IFAPI_KEYSTORE *keystore,
201*758e9fbaSOystein Eftevaag     IFAPI_IO *io,
202*758e9fbaSOystein Eftevaag     TPM2B_NAME *name,
203*758e9fbaSOystein Eftevaag     char **found_path);
204*758e9fbaSOystein Eftevaag 
205*758e9fbaSOystein Eftevaag TSS2_RC
206*758e9fbaSOystein Eftevaag ifapi_keystore_search_nv_obj(
207*758e9fbaSOystein Eftevaag     IFAPI_KEYSTORE *keystore,
208*758e9fbaSOystein Eftevaag     IFAPI_IO *io,
209*758e9fbaSOystein Eftevaag     TPM2B_NV_PUBLIC *nv_public,
210*758e9fbaSOystein Eftevaag     char **found_path);
211*758e9fbaSOystein Eftevaag 
212*758e9fbaSOystein Eftevaag TSS2_RC
213*758e9fbaSOystein Eftevaag ifapi_keystore_check_overwrite(
214*758e9fbaSOystein Eftevaag     IFAPI_KEYSTORE *keystore,
215*758e9fbaSOystein Eftevaag     IFAPI_IO *io,
216*758e9fbaSOystein Eftevaag     const char *path);
217*758e9fbaSOystein Eftevaag 
218*758e9fbaSOystein Eftevaag TSS2_RC
219*758e9fbaSOystein Eftevaag ifapi_keystore_check_writeable(
220*758e9fbaSOystein Eftevaag     IFAPI_KEYSTORE *keystore,
221*758e9fbaSOystein Eftevaag     IFAPI_IO *io,
222*758e9fbaSOystein Eftevaag     const char *path);
223*758e9fbaSOystein Eftevaag 
224*758e9fbaSOystein Eftevaag TSS2_RC
225*758e9fbaSOystein Eftevaag ifapi_copy_ifapi_key(
226*758e9fbaSOystein Eftevaag     IFAPI_KEY * dest,
227*758e9fbaSOystein Eftevaag     const IFAPI_KEY * src);
228*758e9fbaSOystein Eftevaag 
229*758e9fbaSOystein Eftevaag TSS2_RC
230*758e9fbaSOystein Eftevaag ifapi_copy_ifapi_key_object(
231*758e9fbaSOystein Eftevaag     IFAPI_OBJECT * dest,
232*758e9fbaSOystein Eftevaag     const IFAPI_OBJECT * src);
233*758e9fbaSOystein Eftevaag 
234*758e9fbaSOystein Eftevaag void ifapi_cleanup_ifapi_key(
235*758e9fbaSOystein Eftevaag     IFAPI_KEY * key);
236*758e9fbaSOystein Eftevaag 
237*758e9fbaSOystein Eftevaag void ifapi_cleanup_ifapi_ext_pub_key(
238*758e9fbaSOystein Eftevaag     IFAPI_EXT_PUB_KEY * key);
239*758e9fbaSOystein Eftevaag 
240*758e9fbaSOystein Eftevaag void ifapi_cleanup_ifapi_hierarchy(
241*758e9fbaSOystein Eftevaag     IFAPI_HIERARCHY * hierarchy);
242*758e9fbaSOystein Eftevaag 
243*758e9fbaSOystein Eftevaag void ifapi_cleanup_ifapi_nv(
244*758e9fbaSOystein Eftevaag     IFAPI_NV * nv);
245*758e9fbaSOystein Eftevaag 
246*758e9fbaSOystein Eftevaag void ifapi_cleanup_ifapi_duplicate(
247*758e9fbaSOystein Eftevaag     IFAPI_DUPLICATE * duplicate);
248*758e9fbaSOystein Eftevaag 
249*758e9fbaSOystein Eftevaag void ifapi_cleanup_ifapi_key_search(
250*758e9fbaSOystein Eftevaag     IFAPI_KEY_SEARCH * key_search);
251*758e9fbaSOystein Eftevaag 
252*758e9fbaSOystein Eftevaag void ifapi_cleanup_ifapi_keystore(
253*758e9fbaSOystein Eftevaag     IFAPI_KEYSTORE * keystore);
254*758e9fbaSOystein Eftevaag 
255*758e9fbaSOystein Eftevaag void
256*758e9fbaSOystein Eftevaag ifapi_cleanup_ifapi_object(
257*758e9fbaSOystein Eftevaag     IFAPI_OBJECT *object);
258*758e9fbaSOystein Eftevaag 
259*758e9fbaSOystein Eftevaag #endif /* IFAPI_KEYSTORE_H */
260