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