xref: /aosp_15_r20/external/tpm2-tss/src/tss2-fapi/fapi_int.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 #ifndef FAPI_INT_H
7*758e9fbaSOystein Eftevaag #define FAPI_INT_H
8*758e9fbaSOystein Eftevaag 
9*758e9fbaSOystein Eftevaag #include "fapi_types.h"
10*758e9fbaSOystein Eftevaag #include "ifapi_policy_types.h"
11*758e9fbaSOystein Eftevaag #include "ifapi_policy_instantiate.h"
12*758e9fbaSOystein Eftevaag #include "ifapi_eventlog.h"
13*758e9fbaSOystein Eftevaag #include "ifapi_io.h"
14*758e9fbaSOystein Eftevaag #include "ifapi_profiles.h"
15*758e9fbaSOystein Eftevaag #include "ifapi_macros.h"
16*758e9fbaSOystein Eftevaag #include "ifapi_keystore.h"
17*758e9fbaSOystein Eftevaag #include "ifapi_policy_store.h"
18*758e9fbaSOystein Eftevaag #include "ifapi_config.h"
19*758e9fbaSOystein Eftevaag 
20*758e9fbaSOystein Eftevaag #include <stdlib.h>
21*758e9fbaSOystein Eftevaag #include <stdint.h>
22*758e9fbaSOystein Eftevaag #include <unistd.h>
23*758e9fbaSOystein Eftevaag #include <string.h>
24*758e9fbaSOystein Eftevaag #include <inttypes.h>
25*758e9fbaSOystein Eftevaag #include <stdarg.h>
26*758e9fbaSOystein Eftevaag #include <stdbool.h>
27*758e9fbaSOystein Eftevaag #include <sys/stat.h>
28*758e9fbaSOystein Eftevaag #include <stdio.h>
29*758e9fbaSOystein Eftevaag #include <errno.h>
30*758e9fbaSOystein Eftevaag #include <fcntl.h>
31*758e9fbaSOystein Eftevaag #include <json-c/json.h>
32*758e9fbaSOystein Eftevaag #include <poll.h>
33*758e9fbaSOystein Eftevaag 
34*758e9fbaSOystein Eftevaag #include "tss2_esys.h"
35*758e9fbaSOystein Eftevaag #include "tss2_fapi.h"
36*758e9fbaSOystein Eftevaag 
37*758e9fbaSOystein Eftevaag #define DEFAULT_LOG_DIR "/run/tpm2_tss"
38*758e9fbaSOystein Eftevaag #define IFAPI_PCR_LOG_FILE "pcr.log"
39*758e9fbaSOystein Eftevaag #define IFAPI_OBJECT_TYPE ".json"
40*758e9fbaSOystein Eftevaag #define IFAPI_OBJECT_FILE "object.json"
41*758e9fbaSOystein Eftevaag #define IFAPI_SRK_KEY_PATH "HS/SRK"
42*758e9fbaSOystein Eftevaag 
43*758e9fbaSOystein Eftevaag typedef UINT32 TSS2_KEY_TYPE;
44*758e9fbaSOystein Eftevaag #define TSS2_SRK 2
45*758e9fbaSOystein Eftevaag #define TSS2_EK 3
46*758e9fbaSOystein Eftevaag #define MIN_EK_CERT_HANDLE 0x1c00000
47*758e9fbaSOystein Eftevaag #define MIN_PLATFORM_CERT_HANDLE 0x01C08000
48*758e9fbaSOystein Eftevaag #define MAX_PLATFORM_CERT_HANDLE 0x01C0FFFF
49*758e9fbaSOystein Eftevaag 
50*758e9fbaSOystein Eftevaag typedef UINT8 IFAPI_SESSION_TYPE;
51*758e9fbaSOystein Eftevaag #define IFAPI_SESSION_GENEK 0x01
52*758e9fbaSOystein Eftevaag #define IFAPI_SESSION1      0x02
53*758e9fbaSOystein Eftevaag #define IFAPI_SESSION2      0x04
54*758e9fbaSOystein Eftevaag 
55*758e9fbaSOystein Eftevaag #define IFAPI_POLICY_PATH "policy"
56*758e9fbaSOystein Eftevaag #define IFAPI_NV_PATH "nv"
57*758e9fbaSOystein Eftevaag #define IFAPI_EXT_PATH "ext"
58*758e9fbaSOystein Eftevaag #define IFAPI_FILE_DELIM "/"
59*758e9fbaSOystein Eftevaag #define IFAPI_LIST_DELIM ":"
60*758e9fbaSOystein Eftevaag #define IFAPI_FILE_DELIM_CHAR '/'
61*758e9fbaSOystein Eftevaag #define IFAPI_PUB_KEY_DIR "ext"
62*758e9fbaSOystein Eftevaag #define IFAPI_POLICY_DIR "policy"
63*758e9fbaSOystein Eftevaag #define IFAPI_PEM_PUBLIC_STRING "-----BEGIN PUBLIC KEY-----"
64*758e9fbaSOystein Eftevaag #define IFAPI_PEM_PRIVATE_KEY "-----PRIVATE KEY-----"
65*758e9fbaSOystein Eftevaag #define IFAPI_JSON_TAG_POLICY "policy"
66*758e9fbaSOystein Eftevaag #define IFAPI_JSON_TAG_DUPLICATE "public_parent"
67*758e9fbaSOystein Eftevaag 
68*758e9fbaSOystein Eftevaag 
69*758e9fbaSOystein Eftevaag #if TPM2_MAX_NV_BUFFER_SIZE > TPM2_MAX_DIGEST_BUFFER
70*758e9fbaSOystein Eftevaag #define IFAPI_MAX_BUFFER_SIZE TPM2_MAX_NV_BUFFER_SIZE
71*758e9fbaSOystein Eftevaag #else
72*758e9fbaSOystein Eftevaag #define IFAPI_MAX_BUFFER_SIZE TPM2_MAX_DIGEST_BUFFER
73*758e9fbaSOystein Eftevaag #endif
74*758e9fbaSOystein Eftevaag 
75*758e9fbaSOystein Eftevaag #define IFAPI_FLUSH_PARENT true
76*758e9fbaSOystein Eftevaag #define IFAPI_NOT_FLUSH_PARENT false
77*758e9fbaSOystein Eftevaag 
78*758e9fbaSOystein Eftevaag /* Definition of FAPI buffer for TPM2B transmission */
79*758e9fbaSOystein Eftevaag typedef struct {
80*758e9fbaSOystein Eftevaag     UINT16 size;
81*758e9fbaSOystein Eftevaag     BYTE buffer[IFAPI_MAX_BUFFER_SIZE];
82*758e9fbaSOystein Eftevaag } IFAPI_MAX_BUFFER;
83*758e9fbaSOystein Eftevaag 
84*758e9fbaSOystein Eftevaag #define OSSL_FREE(S,TYPE) if((S) != NULL) {TYPE##_free((void*) (S)); (S)=NULL;}
85*758e9fbaSOystein Eftevaag 
86*758e9fbaSOystein Eftevaag 
87*758e9fbaSOystein Eftevaag #define FAPI_COPY_DIGEST(dest_buffer, dest_size, src, src_size) \
88*758e9fbaSOystein Eftevaag     if (src_size > sizeof(TPMU_HA)) { \
89*758e9fbaSOystein Eftevaag         return_error(TSS2_FAPI_RC_BAD_VALUE, "Digest size too large."); \
90*758e9fbaSOystein Eftevaag     } \
91*758e9fbaSOystein Eftevaag     memcpy(dest_buffer, (src), (src_size));  \
92*758e9fbaSOystein Eftevaag     dest_size = src_size
93*758e9fbaSOystein Eftevaag 
94*758e9fbaSOystein Eftevaag #define HASH_UPDATE(CONTEXT, TYPE, OBJECT, R, LABEL)    \
95*758e9fbaSOystein Eftevaag     { \
96*758e9fbaSOystein Eftevaag         uint8_t buffer[sizeof(TYPE)]; \
97*758e9fbaSOystein Eftevaag         size_t offset = 0; \
98*758e9fbaSOystein Eftevaag         R = Tss2_MU_ ## TYPE ## _Marshal(OBJECT, \
99*758e9fbaSOystein Eftevaag                                          &buffer[0], sizeof(TYPE), &offset); \
100*758e9fbaSOystein Eftevaag         goto_if_error(R, "Marshal for hash update", LABEL); \
101*758e9fbaSOystein Eftevaag         R = ifapi_crypto_hash_update(CONTEXT, \
102*758e9fbaSOystein Eftevaag                                      (const uint8_t *) &buffer[0], \
103*758e9fbaSOystein Eftevaag                                      offset);                     \
104*758e9fbaSOystein Eftevaag         goto_if_error(R, "crypto hash update", LABEL); }
105*758e9fbaSOystein Eftevaag 
106*758e9fbaSOystein Eftevaag #define HASH_UPDATE_BUFFER(CONTEXT, BUFFER, SIZE, R, LABEL) \
107*758e9fbaSOystein Eftevaag     R = ifapi_crypto_hash_update(CONTEXT, \
108*758e9fbaSOystein Eftevaag                                  (const uint8_t *) BUFFER, SIZE) ; \
109*758e9fbaSOystein Eftevaag     goto_if_error(R, "crypto hash update", LABEL);
110*758e9fbaSOystein Eftevaag 
111*758e9fbaSOystein Eftevaag #define FAPI_SYNC(r,msg,label, ...)             \
112*758e9fbaSOystein Eftevaag     if ((r & ~TSS2_RC_LAYER_MASK) == TSS2_BASE_RC_TRY_AGAIN) \
113*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_TRY_AGAIN; \
114*758e9fbaSOystein Eftevaag     if (r != TSS2_RC_SUCCESS) { \
115*758e9fbaSOystein Eftevaag         LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ## __VA_ARGS__); \
116*758e9fbaSOystein Eftevaag         goto label;  \
117*758e9fbaSOystein Eftevaag     }
118*758e9fbaSOystein Eftevaag 
119*758e9fbaSOystein Eftevaag /** The states for the FAPI's object authorization state*/
120*758e9fbaSOystein Eftevaag enum IFAPI_GET_CERT_STATE {
121*758e9fbaSOystein Eftevaag     GET_CERT_INIT = 0,
122*758e9fbaSOystein Eftevaag     GET_CERT_WAIT_FOR_GET_CAP,
123*758e9fbaSOystein Eftevaag     GET_CERT_GET_CERT_NV,
124*758e9fbaSOystein Eftevaag     GET_CERT_GET_CERT_NV_FINISH,
125*758e9fbaSOystein Eftevaag     GET_CERT_GET_CERT_READ_PUBLIC,
126*758e9fbaSOystein Eftevaag     GET_CERT_READ_CERT
127*758e9fbaSOystein Eftevaag };
128*758e9fbaSOystein Eftevaag 
129*758e9fbaSOystein Eftevaag /** The states for the FAPI's cleanup after successful command execution*/
130*758e9fbaSOystein Eftevaag enum IFAPI_CLEANUP_STATE {
131*758e9fbaSOystein Eftevaag     CLEANUP_INIT = 0,
132*758e9fbaSOystein Eftevaag     CLEANUP_SESSION1,
133*758e9fbaSOystein Eftevaag     CLEANUP_SESSION2,
134*758e9fbaSOystein Eftevaag     CLEANUP_SRK
135*758e9fbaSOystein Eftevaag };
136*758e9fbaSOystein Eftevaag 
137*758e9fbaSOystein Eftevaag #define IFAPI_MAX_CAP_INFO 17
138*758e9fbaSOystein Eftevaag 
139*758e9fbaSOystein Eftevaag typedef struct {
140*758e9fbaSOystein Eftevaag     char                                  *description;
141*758e9fbaSOystein Eftevaag     TPMS_CAPABILITY_DATA                   *capability;
142*758e9fbaSOystein Eftevaag } IFAPI_CAP_INFO;
143*758e9fbaSOystein Eftevaag 
144*758e9fbaSOystein Eftevaag typedef struct {
145*758e9fbaSOystein Eftevaag     char                                 *fapi_version;    /**< The version string of FAPI */
146*758e9fbaSOystein Eftevaag     char                                  *fapi_config;    /**< The configuration information */
147*758e9fbaSOystein Eftevaag     IFAPI_CAP_INFO             cap[IFAPI_MAX_CAP_INFO];
148*758e9fbaSOystein Eftevaag } IFAPI_INFO;
149*758e9fbaSOystein Eftevaag 
150*758e9fbaSOystein Eftevaag /** Type for representing FAPI template for keys
151*758e9fbaSOystein Eftevaag  */
152*758e9fbaSOystein Eftevaag typedef struct {
153*758e9fbaSOystein Eftevaag     TPMI_YES_NO                                  system;    /**< Store the object in the system wide
154*758e9fbaSOystein Eftevaag                                                                  directory */
155*758e9fbaSOystein Eftevaag     TPMI_YES_NO                              persistent;    /**< Store key persistent in NV ram. */
156*758e9fbaSOystein Eftevaag     UINT32                            persistent_handle;    /**< < Persistent handle which should be used */
157*758e9fbaSOystein Eftevaag     TPM2B_PUBLIC                                 public;    /**< Template for public data */
158*758e9fbaSOystein Eftevaag } IFAPI_KEY_TEMPLATE;
159*758e9fbaSOystein Eftevaag 
160*758e9fbaSOystein Eftevaag /** Type for representing template for NV objects
161*758e9fbaSOystein Eftevaag  */
162*758e9fbaSOystein Eftevaag typedef struct {
163*758e9fbaSOystein Eftevaag     TPMI_YES_NO                                  system;    /**< Store the object in the system wide
164*758e9fbaSOystein Eftevaag                                                                  directory */
165*758e9fbaSOystein Eftevaag     TPMI_RH_HIERARCHY                         hierarchy;    /**< Hierarchy for NV object. */
166*758e9fbaSOystein Eftevaag     char                                   *description;    /**< Description of template. */
167*758e9fbaSOystein Eftevaag     TPMS_NV_PUBLIC                               public;    /**< Template for public data */
168*758e9fbaSOystein Eftevaag } IFAPI_NV_TEMPLATE;
169*758e9fbaSOystein Eftevaag 
170*758e9fbaSOystein Eftevaag /** Type for representing a external public key
171*758e9fbaSOystein Eftevaag  */
172*758e9fbaSOystein Eftevaag typedef struct {
173*758e9fbaSOystein Eftevaag     TPMT_SIG_SCHEME                          sig_scheme;    /**< Signature scheme used for quote. */
174*758e9fbaSOystein Eftevaag     TPMS_ATTEST                                  attest;    /**< Attestation data from Quote */
175*758e9fbaSOystein Eftevaag } FAPI_QUOTE_INFO;
176*758e9fbaSOystein Eftevaag 
177*758e9fbaSOystein Eftevaag 
178*758e9fbaSOystein Eftevaag /** The states for the FAPI's NV read state */
179*758e9fbaSOystein Eftevaag enum _FAPI_STATE_NV_READ {
180*758e9fbaSOystein Eftevaag     NV_READ_INIT = 0,
181*758e9fbaSOystein Eftevaag     NV_READ_AUTHORIZE,
182*758e9fbaSOystein Eftevaag     NV_READ_AUTHORIZE2,
183*758e9fbaSOystein Eftevaag     NV_READ_AUTH_SENT
184*758e9fbaSOystein Eftevaag };
185*758e9fbaSOystein Eftevaag 
186*758e9fbaSOystein Eftevaag /** The states for the FAPI's NV write state */
187*758e9fbaSOystein Eftevaag enum _FAPI_STATE_NV_WRITE {
188*758e9fbaSOystein Eftevaag     NV2_WRITE_INIT = 0,
189*758e9fbaSOystein Eftevaag     NV2_WRITE_READ,
190*758e9fbaSOystein Eftevaag     NV2_WRITE_WAIT_FOR_SESSSION,
191*758e9fbaSOystein Eftevaag     NV2_WRITE_NULL_AUTH_SENT,
192*758e9fbaSOystein Eftevaag     NV2_WRITE_AUTH_SENT,
193*758e9fbaSOystein Eftevaag     NV2_WRITE_WRITE_PREPARE,
194*758e9fbaSOystein Eftevaag     NV2_WRITE_WRITE,
195*758e9fbaSOystein Eftevaag     NV2_WRITE_AUTHORIZE,
196*758e9fbaSOystein Eftevaag     NV2_WRITE_AUTHORIZE2
197*758e9fbaSOystein Eftevaag };
198*758e9fbaSOystein Eftevaag 
199*758e9fbaSOystein Eftevaag /** The data structure holding internal state of Fapi NV commands.
200*758e9fbaSOystein Eftevaag  */
201*758e9fbaSOystein Eftevaag typedef struct {
202*758e9fbaSOystein Eftevaag     char *nvPath ;              /**< The name of the file for object serialization */
203*758e9fbaSOystein Eftevaag     char *policyPath;           /**< The name of the policy file */
204*758e9fbaSOystein Eftevaag     TPM2B_NV_PUBLIC public;     /**< The public info of the NV object. */
205*758e9fbaSOystein Eftevaag     ESYS_TR esys_auth_handle;   /**< The ESAPI handle for the NV auth object */
206*758e9fbaSOystein Eftevaag     ESYS_TR esys_handle;        /**< The ESAPI handle for the NV object */
207*758e9fbaSOystein Eftevaag     size_t numBytes;            /**< The number of bytes of a ESYS request */
208*758e9fbaSOystein Eftevaag     UINT16 bytesRequested;      /**< Bytes currently requested from TPM */
209*758e9fbaSOystein Eftevaag     UINT16 offset;              /**< Offset in TPM memory TPM */
210*758e9fbaSOystein Eftevaag     size_t data_idx;            /**< Offset in the read buffer */
211*758e9fbaSOystein Eftevaag     const uint8_t *data;        /**< Buffer for data to be written */
212*758e9fbaSOystein Eftevaag     uint8_t *rdata;             /**< Buffer for data to be read */
213*758e9fbaSOystein Eftevaag     IFAPI_OBJECT auth_object;   /**< Object used for authentication */
214*758e9fbaSOystein Eftevaag     IFAPI_OBJECT nv_object;     /**< Deserialized NV object */
215*758e9fbaSOystein Eftevaag     TPM2B_AUTH auth;            /**< The Password */
216*758e9fbaSOystein Eftevaag     IFAPI_NV nv_obj;            /**< The NV Object */
217*758e9fbaSOystein Eftevaag     ESYS_TR auth_index;         /**< The ESAPI handle of the authorization object */
218*758e9fbaSOystein Eftevaag     uint64_t bitmap;            /**< The bitmask for the SetBits command */
219*758e9fbaSOystein Eftevaag     IFAPI_NV_TEMPLATE public_templ; /**< The template for nv creation, adjusted
220*758e9fbaSOystein Eftevaag                                          appropriate by the passed flags */
221*758e9fbaSOystein Eftevaag     enum _FAPI_STATE_NV_READ nv_read_state; /**< The current state of NV read */
222*758e9fbaSOystein Eftevaag     enum _FAPI_STATE_NV_WRITE nv_write_state; /**< The current state of NV write*/
223*758e9fbaSOystein Eftevaag     uint8_t *write_data;
224*758e9fbaSOystein Eftevaag     char const *logData;         /**< The event log for NV objects of type pcr */
225*758e9fbaSOystein Eftevaag     json_object *jso_event_log;  /**< logData in JSON format */
226*758e9fbaSOystein Eftevaag     TPMI_RH_NV_INDEX maxNvIndex; /**< Max index for search for free index  */
227*758e9fbaSOystein Eftevaag     IFAPI_EVENT pcr_event;       /**< Event to be added to log */
228*758e9fbaSOystein Eftevaag     TPML_DIGEST_VALUES digests;  /**< Digest for the event data of an extend */
229*758e9fbaSOystein Eftevaag     bool skip_policy_computation; /**< switch whether policy needs to be computed */
230*758e9fbaSOystein Eftevaag } IFAPI_NV_Cmds;
231*758e9fbaSOystein Eftevaag 
232*758e9fbaSOystein Eftevaag /** The data structure holding internal state of Fapi_Initialize command.
233*758e9fbaSOystein Eftevaag  */
234*758e9fbaSOystein Eftevaag typedef struct {
235*758e9fbaSOystein Eftevaag     TPMS_CAPABILITY_DATA *capability; /* TPM capability data to check available algs */
236*758e9fbaSOystein Eftevaag } IFAPI_INITIALIZE;
237*758e9fbaSOystein Eftevaag 
238*758e9fbaSOystein Eftevaag /** The data structure holding internal state of Fapi_PCR commands.
239*758e9fbaSOystein Eftevaag  */
240*758e9fbaSOystein Eftevaag typedef struct {
241*758e9fbaSOystein Eftevaag     TPML_DIGEST_VALUES digest_list;    /**< The digest list computed for the event  */
242*758e9fbaSOystein Eftevaag     TPML_DIGEST_VALUES *event_digests; /**< The digest list computed by TPM2_Event  */
243*758e9fbaSOystein Eftevaag     ESYS_TR PCR;                       /**< The handle of the PCR register to be extended */
244*758e9fbaSOystein Eftevaag     TPML_PCR_SELECTION pcr_selection;  /**< Selection used for Read and Quote */
245*758e9fbaSOystein Eftevaag     TPML_PCR_SELECTION *pcr_selection_out; /**< Selection returned by PCR_Read  */
246*758e9fbaSOystein Eftevaag     UINT32 update_count;
247*758e9fbaSOystein Eftevaag     TPML_DIGEST *pcrValues;            /* The values returned by PCR_Read */
248*758e9fbaSOystein Eftevaag     TPM2_HANDLE pcrIndex;
249*758e9fbaSOystein Eftevaag     TPMI_ALG_HASH hashAlg;
250*758e9fbaSOystein Eftevaag     const char *keyPath;              /**< The implicit key path for PCR_Quote */
251*758e9fbaSOystein Eftevaag     ESYS_TR handle;                   /**< The ESYS handle of the signing key */
252*758e9fbaSOystein Eftevaag     IFAPI_OBJECT *key_object;         /**< The IPAPI object of the signing key */
253*758e9fbaSOystein Eftevaag     TPMS_CAPABILITY_DATA *capabilityData; /* TPM capability data to check available algs */
254*758e9fbaSOystein Eftevaag     uint32_t *pcrList;                 /**< Array of PCR numbers */
255*758e9fbaSOystein Eftevaag     size_t pcrListSize;                /**< Size of PCR array */
256*758e9fbaSOystein Eftevaag     TPM2B_DATA qualifyingData;         /**< Nonce for quote command */
257*758e9fbaSOystein Eftevaag     uint8_t  const *eventData;
258*758e9fbaSOystein Eftevaag     TPM2B_EVENT event;
259*758e9fbaSOystein Eftevaag     size_t eventDataSize;
260*758e9fbaSOystein Eftevaag     uint32_t const *hashAlgs;
261*758e9fbaSOystein Eftevaag     uint32_t *hashAlgs2;
262*758e9fbaSOystein Eftevaag     size_t numHashAlgs;
263*758e9fbaSOystein Eftevaag     char    const *quoteInfo;
264*758e9fbaSOystein Eftevaag     TPM2B_ATTEST *tpm_quoted;
265*758e9fbaSOystein Eftevaag     TPMT_SIGNATURE *tpm_signature;
266*758e9fbaSOystein Eftevaag     uint8_t const *signature;
267*758e9fbaSOystein Eftevaag     size_t signatureSize;
268*758e9fbaSOystein Eftevaag     char const *logData;
269*758e9fbaSOystein Eftevaag     char *pcrLog;
270*758e9fbaSOystein Eftevaag     IFAPI_EVENT pcr_event;
271*758e9fbaSOystein Eftevaag     json_object *event_list;
272*758e9fbaSOystein Eftevaag     FAPI_QUOTE_INFO fapi_quote_info;
273*758e9fbaSOystein Eftevaag } IFAPI_PCR;
274*758e9fbaSOystein Eftevaag 
275*758e9fbaSOystein Eftevaag /** The data structure holding internal state of Fapi_SetDescription.
276*758e9fbaSOystein Eftevaag  */
277*758e9fbaSOystein Eftevaag typedef struct {
278*758e9fbaSOystein Eftevaag     char *description;             /**< The description of the object */
279*758e9fbaSOystein Eftevaag     UINT8_ARY appData;             /**< Application data to be stored in object store. */
280*758e9fbaSOystein Eftevaag     IFAPI_OBJECT object;           /**< The IPAPI object to store the info*/
281*758e9fbaSOystein Eftevaag     char *object_path;             /**< The realative path to the object */
282*758e9fbaSOystein Eftevaag     json_object *jso;              /**< JSON object for storing the AppData */
283*758e9fbaSOystein Eftevaag     char *jso_string;              /**< JSON deserialized buffer */
284*758e9fbaSOystein Eftevaag } IFAPI_Path_SetDescription;
285*758e9fbaSOystein Eftevaag 
286*758e9fbaSOystein Eftevaag /** The data structure holding internal state of Fapi_GetRandom.
287*758e9fbaSOystein Eftevaag  */
288*758e9fbaSOystein Eftevaag typedef struct {
289*758e9fbaSOystein Eftevaag     size_t numBytes;              /**< The number of random bytes to be generated */
290*758e9fbaSOystein Eftevaag     size_t idx;                   /**< Current position in output buffer.  */
291*758e9fbaSOystein Eftevaag     UINT16 bytesRequested;        /**< Byted currently requested from TPM */
292*758e9fbaSOystein Eftevaag     uint8_t *data;                /**< The buffer for the random data */
293*758e9fbaSOystein Eftevaag } IFAPI_GetRandom;
294*758e9fbaSOystein Eftevaag 
295*758e9fbaSOystein Eftevaag /** The data structure holding internal state of Fapi_Key_Setcertificate.
296*758e9fbaSOystein Eftevaag  */
297*758e9fbaSOystein Eftevaag typedef struct {
298*758e9fbaSOystein Eftevaag     const char *pem_cert;        /**< The certifificate in pem or format */
299*758e9fbaSOystein Eftevaag     char *pem_cert_dup;          /**< The allocate certifificate */
300*758e9fbaSOystein Eftevaag     const char *key_path;        /**< The absolute key path */
301*758e9fbaSOystein Eftevaag     NODE_STR_T *path_list;       /**< The computed explicit path */
302*758e9fbaSOystein Eftevaag     IFAPI_OBJECT key_object;     /**< The IPAPI object for the certified key */
303*758e9fbaSOystein Eftevaag } IFAPI_Key_SetCertificate;
304*758e9fbaSOystein Eftevaag 
305*758e9fbaSOystein Eftevaag /** The states for the FAPI's key creation */
306*758e9fbaSOystein Eftevaag enum IFAPI_KEY_CREATE_STATE {
307*758e9fbaSOystein Eftevaag     KEY_CREATE_INIT = 0,
308*758e9fbaSOystein Eftevaag     KEY_CREATE_WAIT_FOR_SESSION,
309*758e9fbaSOystein Eftevaag     KEY_CREATE_WAIT_FOR_PARENT,
310*758e9fbaSOystein Eftevaag     KEY_CREATE_AUTH_SENT,
311*758e9fbaSOystein Eftevaag     KEY_CREATE_WRITE_PREPARE,
312*758e9fbaSOystein Eftevaag     KEY_CREATE_WRITE,
313*758e9fbaSOystein Eftevaag     KEY_CREATE_FLUSH,
314*758e9fbaSOystein Eftevaag     KEY_CREATE_CALCULATE_POLICY,
315*758e9fbaSOystein Eftevaag     KEY_CREATE_WAIT_FOR_AUTHORIZATION,
316*758e9fbaSOystein Eftevaag     KEY_CREATE_CLEANUP
317*758e9fbaSOystein Eftevaag };
318*758e9fbaSOystein Eftevaag 
319*758e9fbaSOystein Eftevaag /** The data structure holding internal state of Fapi_CreateKey.
320*758e9fbaSOystein Eftevaag  */
321*758e9fbaSOystein Eftevaag typedef struct {
322*758e9fbaSOystein Eftevaag     enum IFAPI_KEY_CREATE_STATE state;
323*758e9fbaSOystein Eftevaag     const char *keyPath;         /**< The pathname from the application */
324*758e9fbaSOystein Eftevaag     NODE_STR_T *path_list;       /**< The computed explicit path */
325*758e9fbaSOystein Eftevaag     IFAPI_OBJECT parent;         /**< The parent of the key for used for creation. */
326*758e9fbaSOystein Eftevaag     IFAPI_OBJECT object;          /**< The current object. */
327*758e9fbaSOystein Eftevaag     IFAPI_KEY_TEMPLATE public_templ;  /**< The template for the keys public data */
328*758e9fbaSOystein Eftevaag     TPM2B_PUBLIC public;         /**< The public data of the key */
329*758e9fbaSOystein Eftevaag     TPM2B_SENSITIVE_CREATE inSensitive;
330*758e9fbaSOystein Eftevaag     TPM2B_DATA outsideInfo;
331*758e9fbaSOystein Eftevaag     TPML_PCR_SELECTION creationPCR;
332*758e9fbaSOystein Eftevaag     ESYS_TR handle;
333*758e9fbaSOystein Eftevaag     const char *authValue;
334*758e9fbaSOystein Eftevaag     const char *policyPath;
335*758e9fbaSOystein Eftevaag     const IFAPI_PROFILE *profile;
336*758e9fbaSOystein Eftevaag } IFAPI_Key_Create;
337*758e9fbaSOystein Eftevaag 
338*758e9fbaSOystein Eftevaag /** The data structure holding internal state of Fapi_EncryptDecrypt.
339*758e9fbaSOystein Eftevaag  */
340*758e9fbaSOystein Eftevaag typedef struct {
341*758e9fbaSOystein Eftevaag     char const *keyPath;            /**< The implicit key path */
342*758e9fbaSOystein Eftevaag     uint8_t const *in_data;
343*758e9fbaSOystein Eftevaag     size_t in_dataSize;
344*758e9fbaSOystein Eftevaag     IFAPI_OBJECT *key_object;       /**< The IPAPI object for the encryption key */
345*758e9fbaSOystein Eftevaag     uint8_t *out_data;               /**< The output of symmetric encrypt/decryption */
346*758e9fbaSOystein Eftevaag     ESYS_TR key_handle;                 /**< The ESYS handle of the encryption key */
347*758e9fbaSOystein Eftevaag     size_t numBytes;                /**< The number of bytes of a ESYS request */
348*758e9fbaSOystein Eftevaag     size_t decrypt;                 /**< Switch whether to encrypt or decrypt */
349*758e9fbaSOystein Eftevaag     UINT16 bytesRequested;          /**< Bytes currently requested from TPM */
350*758e9fbaSOystein Eftevaag     TPMT_RSA_DECRYPT rsa_scheme;
351*758e9fbaSOystein Eftevaag     ESYS_TR object_handle;
352*758e9fbaSOystein Eftevaag     char *policy_path;
353*758e9fbaSOystein Eftevaag     ESYS_TR auth_session;
354*758e9fbaSOystein Eftevaag     const IFAPI_PROFILE *profile;
355*758e9fbaSOystein Eftevaag } IFAPI_Data_EncryptDecrypt;
356*758e9fbaSOystein Eftevaag 
357*758e9fbaSOystein Eftevaag /** The states for signing  */
358*758e9fbaSOystein Eftevaag enum FAPI_SIGN_STATE {
359*758e9fbaSOystein Eftevaag     SIGN_INIT = 0,
360*758e9fbaSOystein Eftevaag     SIGN_WAIT_FOR_SESSION,
361*758e9fbaSOystein Eftevaag     SIGN_WAIT_FOR_KEY,
362*758e9fbaSOystein Eftevaag     SIGN_AUTH_SENT,
363*758e9fbaSOystein Eftevaag     SIGN_WAIT_FOR_FLUSH
364*758e9fbaSOystein Eftevaag };
365*758e9fbaSOystein Eftevaag 
366*758e9fbaSOystein Eftevaag /** The data structure holding internal state of Fapi_Sign.
367*758e9fbaSOystein Eftevaag  */
368*758e9fbaSOystein Eftevaag typedef struct {
369*758e9fbaSOystein Eftevaag     enum FAPI_SIGN_STATE state;          /**< The state of the signing operation */
370*758e9fbaSOystein Eftevaag     const char *keyPath;            /**< The implicit key path */
371*758e9fbaSOystein Eftevaag     ESYS_TR handle;                 /**< The ESYS handle of the signing key */
372*758e9fbaSOystein Eftevaag     TPM2B_DIGEST digest;            /**< The digest to be signed */
373*758e9fbaSOystein Eftevaag     TPMT_SIG_SCHEME scheme;         /**< The signature scheme from profile */
374*758e9fbaSOystein Eftevaag     IFAPI_OBJECT *key_object;       /**< The IPAPI object of the signing key */
375*758e9fbaSOystein Eftevaag     TPMT_SIGNATURE *tpm_signature;  /**< The signature in TPM format */
376*758e9fbaSOystein Eftevaag     TPMI_YES_NO decrypt;            /**< Switch for symmetric algs */
377*758e9fbaSOystein Eftevaag     TPMT_SIGNATURE *signature;      /**< Produced TPM singature */
378*758e9fbaSOystein Eftevaag     char const *padding;            /**< Optional padding parameter for key sign. */
379*758e9fbaSOystein Eftevaag } IFAPI_Key_Sign;
380*758e9fbaSOystein Eftevaag 
381*758e9fbaSOystein Eftevaag /** The data structure holding internal state of Fapi_Unseal.
382*758e9fbaSOystein Eftevaag  */
383*758e9fbaSOystein Eftevaag typedef struct {
384*758e9fbaSOystein Eftevaag     const char *keyPath;            /**< The implicit key path */
385*758e9fbaSOystein Eftevaag     IFAPI_OBJECT *object;           /**< The IPAPI object storing the data to be unsealed */
386*758e9fbaSOystein Eftevaag     TPM2B_SENSITIVE_DATA *unseal_data; /** The result of the esys unseal operation */
387*758e9fbaSOystein Eftevaag } IFAPI_Unseal;
388*758e9fbaSOystein Eftevaag 
389*758e9fbaSOystein Eftevaag 
390*758e9fbaSOystein Eftevaag /** The data structure holding internal state of Fapi_GetInfo.
391*758e9fbaSOystein Eftevaag  */
392*758e9fbaSOystein Eftevaag typedef struct {
393*758e9fbaSOystein Eftevaag     TPMS_CAPABILITY_DATA *capability_data;   /**< The TPM capability for one property */
394*758e9fbaSOystein Eftevaag     TPMS_CAPABILITY_DATA *fetched_data;       /**< The data fetched in one TPM command */
395*758e9fbaSOystein Eftevaag     size_t idx_info_cap;
396*758e9fbaSOystein Eftevaag     IFAPI_INFO  info_obj;
397*758e9fbaSOystein Eftevaag     UINT32 property_count;
398*758e9fbaSOystein Eftevaag     UINT32 property;
399*758e9fbaSOystein Eftevaag } IFAPI_GetInfo;
400*758e9fbaSOystein Eftevaag 
401*758e9fbaSOystein Eftevaag /** The states for the FAPI's hierarchy authorization state*/
402*758e9fbaSOystein Eftevaag enum IFAPI_HIERACHY_AUTHORIZATION_STATE {
403*758e9fbaSOystein Eftevaag     HIERARCHY_CHANGE_AUTH_INIT = 0,
404*758e9fbaSOystein Eftevaag     HIERARCHY_CHANGE_AUTH_NULL_AUTH_SENT,
405*758e9fbaSOystein Eftevaag     HIERARCHY_CHANGE_AUTH_AUTH_SENT
406*758e9fbaSOystein Eftevaag };
407*758e9fbaSOystein Eftevaag 
408*758e9fbaSOystein Eftevaag /** The states for the FAPI's change policy authorization state*/
409*758e9fbaSOystein Eftevaag enum IFAPI_HIERACHY_POLICY_AUTHORIZATION_STATE {
410*758e9fbaSOystein Eftevaag     HIERARCHY_CHANGE_POLICY_INIT = 0,
411*758e9fbaSOystein Eftevaag     HIERARCHY_CHANGE_POLICY_NULL_AUTH_SENT,
412*758e9fbaSOystein Eftevaag     HIERARCHY_CHANGE_POLICY_AUTH_SENT
413*758e9fbaSOystein Eftevaag };
414*758e9fbaSOystein Eftevaag 
415*758e9fbaSOystein Eftevaag /** The data structure holding internal state of Fapi_ChangeAuth.
416*758e9fbaSOystein Eftevaag  */
417*758e9fbaSOystein Eftevaag typedef struct {
418*758e9fbaSOystein Eftevaag     const char *entityPath;         /**< The implicit key path */
419*758e9fbaSOystein Eftevaag     ESYS_TR handle;                 /**< The ESYS handle of the key */
420*758e9fbaSOystein Eftevaag     IFAPI_OBJECT *key_object;       /**< The IPAPI object of the key */
421*758e9fbaSOystein Eftevaag     const char  *authValue;         /**< The new auth value */
422*758e9fbaSOystein Eftevaag     TPM2B_AUTH newAuthValue;        /**< The new auth value */
423*758e9fbaSOystein Eftevaag     TPM2B_PRIVATE *newPrivate;      /**< New private data created by parend */
424*758e9fbaSOystein Eftevaag     IFAPI_OBJECT object;            /**< Deserialized NV object or hierarchy */
425*758e9fbaSOystein Eftevaag     ESYS_TR nv_index;               /**< NV handle of the object to be changed */
426*758e9fbaSOystein Eftevaag     ESYS_TR hierarchy_handle;       /**< NV handle of the hierarchy to be changed */
427*758e9fbaSOystein Eftevaag } IFAPI_Entity_ChangeAuth;
428*758e9fbaSOystein Eftevaag 
429*758e9fbaSOystein Eftevaag /** The data structure holding internal state of Fapi_AuthorizePolicy.
430*758e9fbaSOystein Eftevaag  */
431*758e9fbaSOystein Eftevaag typedef struct {
432*758e9fbaSOystein Eftevaag     const char *policyPath;           /**< Policy with Policy to be authorized */
433*758e9fbaSOystein Eftevaag     const char *signingKeyPath;       /**< Key for policy signing */
434*758e9fbaSOystein Eftevaag     TPM2B_DIGEST policyRef;
435*758e9fbaSOystein Eftevaag     TPMS_POLICYAUTHORIZATION  authorization;
436*758e9fbaSOystein Eftevaag } IFAPI_Fapi_AuthorizePolicy;
437*758e9fbaSOystein Eftevaag 
438*758e9fbaSOystein Eftevaag /** The data structure holding internal state of Fapi_WriteAuthorizeNv.
439*758e9fbaSOystein Eftevaag  */
440*758e9fbaSOystein Eftevaag typedef struct {
441*758e9fbaSOystein Eftevaag     const char *policyPath;            /**< Policy with Policy to be authorized */
442*758e9fbaSOystein Eftevaag     TPMI_ALG_HASH *hash_alg;           /**< The hash alg used for digest computation */
443*758e9fbaSOystein Eftevaag     size_t hash_size;                  /**< The digest size */
444*758e9fbaSOystein Eftevaag     size_t digest_idx;                 /**< The index of the digest in the policy */
445*758e9fbaSOystein Eftevaag } IFAPI_api_WriteAuthorizeNv;
446*758e9fbaSOystein Eftevaag 
447*758e9fbaSOystein Eftevaag /** The data structure holding internal state of Provisioning.
448*758e9fbaSOystein Eftevaag  */
449*758e9fbaSOystein Eftevaag typedef struct {
450*758e9fbaSOystein Eftevaag     IFAPI_OBJECT hierarchy;     /**< The current used hierarchy for CreatePrimary */
451*758e9fbaSOystein Eftevaag     IFAPI_KEY_TEMPLATE public_templ;  /**< The basic template for the keys public data */
452*758e9fbaSOystein Eftevaag     TPM2B_PUBLIC public;       /**< The public info of the created primary */
453*758e9fbaSOystein Eftevaag     TPM2B_SENSITIVE_CREATE inSensitive;
454*758e9fbaSOystein Eftevaag     TPM2B_DATA outsideInfo;
455*758e9fbaSOystein Eftevaag     TPML_PCR_SELECTION creationPCR;
456*758e9fbaSOystein Eftevaag     ESYS_TR handle;
457*758e9fbaSOystein Eftevaag     const char *authValueLockout;
458*758e9fbaSOystein Eftevaag     const char *authValueEh;
459*758e9fbaSOystein Eftevaag     const char *policyPathEh;
460*758e9fbaSOystein Eftevaag     const char *authValueSh;
461*758e9fbaSOystein Eftevaag     const char *policyPathSh;
462*758e9fbaSOystein Eftevaag     size_t digest_idx;
463*758e9fbaSOystein Eftevaag     size_t hash_size;
464*758e9fbaSOystein Eftevaag     TPM2_HANDLE cert_nv_idx;
465*758e9fbaSOystein Eftevaag     ESYS_TR esys_nv_cert_handle;
466*758e9fbaSOystein Eftevaag     char *pem_cert;
467*758e9fbaSOystein Eftevaag     TPM2_ALG_ID cert_key_type;
468*758e9fbaSOystein Eftevaag     size_t cert_count;
469*758e9fbaSOystein Eftevaag     size_t cert_idx;
470*758e9fbaSOystein Eftevaag     TPMS_CAPABILITY_DATA *capabilityData;
471*758e9fbaSOystein Eftevaag     IFAPI_OBJECT hierarchy_object;
472*758e9fbaSOystein Eftevaag     TPM2B_AUTH hierarchy_auth;
473*758e9fbaSOystein Eftevaag     TPM2B_DIGEST policy_digest;
474*758e9fbaSOystein Eftevaag     char *intermed_crt;
475*758e9fbaSOystein Eftevaag     char *root_crt;
476*758e9fbaSOystein Eftevaag } IFAPI_Provision;
477*758e9fbaSOystein Eftevaag 
478*758e9fbaSOystein Eftevaag /** The data structure holding internal state of regenerate primary key.
479*758e9fbaSOystein Eftevaag  */
480*758e9fbaSOystein Eftevaag typedef struct {
481*758e9fbaSOystein Eftevaag     char *path;                   /**< Path of the primary (starting with hierarchy)  */
482*758e9fbaSOystein Eftevaag     IFAPI_OBJECT hierarchy;     /**< The current used hierarchy for CreatePrimary */
483*758e9fbaSOystein Eftevaag     IFAPI_OBJECT pkey_object;
484*758e9fbaSOystein Eftevaag     TPM2B_SENSITIVE_CREATE inSensitive;
485*758e9fbaSOystein Eftevaag     TPM2B_DATA outsideInfo;
486*758e9fbaSOystein Eftevaag     TPML_PCR_SELECTION creationPCR;
487*758e9fbaSOystein Eftevaag     ESYS_TR handle;
488*758e9fbaSOystein Eftevaag     TPMI_DH_PERSISTENT persistent_handle;
489*758e9fbaSOystein Eftevaag } IFAPI_CreatePrimary;
490*758e9fbaSOystein Eftevaag 
491*758e9fbaSOystein Eftevaag /** The data structure holding internal state of key verify signature.
492*758e9fbaSOystein Eftevaag  */
493*758e9fbaSOystein Eftevaag typedef struct {
494*758e9fbaSOystein Eftevaag     const char    *keyPath;
495*758e9fbaSOystein Eftevaag     uint8_t const *signature;
496*758e9fbaSOystein Eftevaag     size_t         signatureSize;
497*758e9fbaSOystein Eftevaag     uint8_t const *digest;
498*758e9fbaSOystein Eftevaag     size_t         digestSize;
499*758e9fbaSOystein Eftevaag     IFAPI_OBJECT   key_object;
500*758e9fbaSOystein Eftevaag } IFAPI_Key_VerifySignature;
501*758e9fbaSOystein Eftevaag 
502*758e9fbaSOystein Eftevaag /** The states for the FAPI's policy loading */
503*758e9fbaSOystein Eftevaag enum IFAPI_STATE_POLICY {
504*758e9fbaSOystein Eftevaag     POLICY_INIT = 0,
505*758e9fbaSOystein Eftevaag     POLICY_READ,
506*758e9fbaSOystein Eftevaag     POLICY_READ_FINISH,
507*758e9fbaSOystein Eftevaag     POLICY_INSTANTIATE_PREPARE,
508*758e9fbaSOystein Eftevaag     POLICY_INSTANTIATE,
509*758e9fbaSOystein Eftevaag     POLICY_EXECUTE,
510*758e9fbaSOystein Eftevaag     POLICY_FLUSH
511*758e9fbaSOystein Eftevaag };
512*758e9fbaSOystein Eftevaag 
513*758e9fbaSOystein Eftevaag typedef struct IFAPI_POLICY_EXEC_CTX IFAPI_POLICY_EXEC_CTX;
514*758e9fbaSOystein Eftevaag typedef struct IFAPI_POLICYUTIL_STACK IFAPI_POLICYUTIL_STACK;
515*758e9fbaSOystein Eftevaag 
516*758e9fbaSOystein Eftevaag /** The states for session creation */
517*758e9fbaSOystein Eftevaag enum FAPI_CREATE_SESSION_STATE {
518*758e9fbaSOystein Eftevaag     CREATE_SESSION_INIT = 0,
519*758e9fbaSOystein Eftevaag     CREATE_SESSION,
520*758e9fbaSOystein Eftevaag     WAIT_FOR_CREATE_SESSION
521*758e9fbaSOystein Eftevaag };
522*758e9fbaSOystein Eftevaag 
523*758e9fbaSOystein Eftevaag /** The data structure holding internal policy state.
524*758e9fbaSOystein Eftevaag  */
525*758e9fbaSOystein Eftevaag typedef struct {
526*758e9fbaSOystein Eftevaag     enum IFAPI_STATE_POLICY state;
527*758e9fbaSOystein Eftevaag     struct TPMS_POLICY policy;
528*758e9fbaSOystein Eftevaag     size_t digest_idx;
529*758e9fbaSOystein Eftevaag     size_t hash_size;
530*758e9fbaSOystein Eftevaag     char **pathlist;                  /**< The array of all objects  in the search path */
531*758e9fbaSOystein Eftevaag     TPMI_ALG_HASH hash_alg;
532*758e9fbaSOystein Eftevaag     IFAPI_POLICY_EXEC_CTX *policy_stack; /**< The stack used for storing current policy information.
533*758e9fbaSOystein Eftevaag                                            e.g. for retry the current index of policy elements hash
534*758e9fbaSOystein Eftevaag                                            to be stored. */
535*758e9fbaSOystein Eftevaag     IFAPI_POLICYUTIL_STACK *util_current_policy;
536*758e9fbaSOystein Eftevaag     IFAPI_POLICYUTIL_STACK *policyutil_stack;
537*758e9fbaSOystein Eftevaag                                       /**< The stack used for storing current policy information.
538*758e9fbaSOystein Eftevaag                                             e.g. for retry the current index of policy elements hash
539*758e9fbaSOystein Eftevaag                                            to be stored. */
540*758e9fbaSOystein Eftevaag     ESYS_TR session;                  /**< Auxiliary variable to store created policy session.
541*758e9fbaSOystein Eftevaag                                            The value will also be stored in the policy stack */
542*758e9fbaSOystein Eftevaag     enum FAPI_CREATE_SESSION_STATE create_session_state;
543*758e9fbaSOystein Eftevaag     char *path;
544*758e9fbaSOystein Eftevaag     IFAPI_POLICY_EVAL_INST_CTX eval_ctx;
545*758e9fbaSOystein Eftevaag } IFAPI_POLICY_CTX;
546*758e9fbaSOystein Eftevaag 
547*758e9fbaSOystein Eftevaag /** The states for the IFAPI's policy loading */
548*758e9fbaSOystein Eftevaag enum IFAPI_STATE_FILE_SEARCH {
549*758e9fbaSOystein Eftevaag     FSEARCH_INIT = 0,
550*758e9fbaSOystein Eftevaag     FSEARCH_READ,
551*758e9fbaSOystein Eftevaag     FSEARCH_OBJECT
552*758e9fbaSOystein Eftevaag };
553*758e9fbaSOystein Eftevaag 
554*758e9fbaSOystein Eftevaag /** The data structure holding internal policy state.
555*758e9fbaSOystein Eftevaag  */
556*758e9fbaSOystein Eftevaag typedef struct {
557*758e9fbaSOystein Eftevaag     enum IFAPI_STATE_FILE_SEARCH state;
558*758e9fbaSOystein Eftevaag     char **pathlist;                /**< The array of all objects  in the search path */
559*758e9fbaSOystein Eftevaag     size_t path_idx;                /**< Index of array of objects to be searched */
560*758e9fbaSOystein Eftevaag     size_t numPaths;                /**< Number of all objects in data store */
561*758e9fbaSOystein Eftevaag     char *current_path;
562*758e9fbaSOystein Eftevaag } IFAPI_FILE_SEARCH_CTX;
563*758e9fbaSOystein Eftevaag 
564*758e9fbaSOystein Eftevaag /** The states for the FAPI's key loading */
565*758e9fbaSOystein Eftevaag enum _FAPI_STATE_LOAD_KEY {
566*758e9fbaSOystein Eftevaag     LOAD_KEY_GET_PATH = 0,
567*758e9fbaSOystein Eftevaag     LOAD_KEY_READ_KEY,
568*758e9fbaSOystein Eftevaag     LOAD_KEY_WAIT_FOR_PRIMARY,
569*758e9fbaSOystein Eftevaag     LOAD_KEY_LOAD_KEY,
570*758e9fbaSOystein Eftevaag     LOAD_KEY_AUTH,
571*758e9fbaSOystein Eftevaag     LOAD_KEY_AUTHORIZE
572*758e9fbaSOystein Eftevaag };
573*758e9fbaSOystein Eftevaag 
574*758e9fbaSOystein Eftevaag /** The data structure holding internal state of export key.
575*758e9fbaSOystein Eftevaag  */
576*758e9fbaSOystein Eftevaag typedef struct {
577*758e9fbaSOystein Eftevaag     char   const *pathOfKeyToDuplicate;          /**< The relative path of the key to be exported */
578*758e9fbaSOystein Eftevaag     char   const *pathToPublicKeyOfNewParent;    /**<  The relative path of the new parent */
579*758e9fbaSOystein Eftevaag     TPM2B_PUBLIC public_parent;                  /**< The public key of the new parent */
580*758e9fbaSOystein Eftevaag     IFAPI_OBJECT *key_object;                    /**< The IPAPI object of the key to be duplicated */
581*758e9fbaSOystein Eftevaag     IFAPI_OBJECT export_tree;                    /**< The complete tree to be exported */
582*758e9fbaSOystein Eftevaag     IFAPI_OBJECT pub_key;                        /**< The public part of the new parent */
583*758e9fbaSOystein Eftevaag     IFAPI_OBJECT dup_key;                        /**< The key to be duplicated or exported  */
584*758e9fbaSOystein Eftevaag     struct TPMS_POLICY policy;
585*758e9fbaSOystein Eftevaag     ESYS_TR handle_ext_key;
586*758e9fbaSOystein Eftevaag } IFAPI_ExportKey;
587*758e9fbaSOystein Eftevaag 
588*758e9fbaSOystein Eftevaag /** The data structure holding internal state of export policy.
589*758e9fbaSOystein Eftevaag  */
590*758e9fbaSOystein Eftevaag typedef struct {
591*758e9fbaSOystein Eftevaag     char   const *path;                          /**<  Path of the object with the policy to be
592*758e9fbaSOystein Eftevaag                                                        exported */
593*758e9fbaSOystein Eftevaag     IFAPI_OBJECT object;                         /**<  Object corresponding to path */
594*758e9fbaSOystein Eftevaag } IFAPI_ExportPolicy;
595*758e9fbaSOystein Eftevaag 
596*758e9fbaSOystein Eftevaag /** The data structure holding internal state of import key.
597*758e9fbaSOystein Eftevaag  */
598*758e9fbaSOystein Eftevaag typedef struct {
599*758e9fbaSOystein Eftevaag     IFAPI_OBJECT object;
600*758e9fbaSOystein Eftevaag     TPM2B_NAME parent_name;
601*758e9fbaSOystein Eftevaag     IFAPI_OBJECT *parent_object;
602*758e9fbaSOystein Eftevaag     IFAPI_OBJECT new_object;
603*758e9fbaSOystein Eftevaag     char *parent_path;
604*758e9fbaSOystein Eftevaag     char *out_path;
605*758e9fbaSOystein Eftevaag     TPM2B_PRIVATE *private;
606*758e9fbaSOystein Eftevaag     char *jso_string;
607*758e9fbaSOystein Eftevaag } IFAPI_ImportKey;
608*758e9fbaSOystein Eftevaag 
609*758e9fbaSOystein Eftevaag 
610*758e9fbaSOystein Eftevaag /** The data structure holding internal state of loading keys.
611*758e9fbaSOystein Eftevaag  */
612*758e9fbaSOystein Eftevaag typedef struct {
613*758e9fbaSOystein Eftevaag     enum _FAPI_STATE_LOAD_KEY state;   /**< The current state of key  loading */
614*758e9fbaSOystein Eftevaag     NODE_STR_T *path_list;        /**< The current used hierarchy for CreatePrimary */
615*758e9fbaSOystein Eftevaag     NODE_OBJECT_T *key_list;
616*758e9fbaSOystein Eftevaag     IFAPI_OBJECT auth_object;
617*758e9fbaSOystein Eftevaag     size_t position;
618*758e9fbaSOystein Eftevaag     ESYS_TR handle;
619*758e9fbaSOystein Eftevaag     ESYS_TR parent_handle;
620*758e9fbaSOystein Eftevaag     bool parent_handle_persistent;
621*758e9fbaSOystein Eftevaag     IFAPI_OBJECT *key_object;
622*758e9fbaSOystein Eftevaag     char *key_path;
623*758e9fbaSOystein Eftevaag } IFAPI_LoadKey;
624*758e9fbaSOystein Eftevaag 
625*758e9fbaSOystein Eftevaag /** The data structure holding internal state of entity delete.
626*758e9fbaSOystein Eftevaag  */
627*758e9fbaSOystein Eftevaag typedef struct {
628*758e9fbaSOystein Eftevaag     bool is_key;                    /**< Entity to be deleted is a key */
629*758e9fbaSOystein Eftevaag     bool is_persistent_key;         /**< Entity to be deleted is a key */
630*758e9fbaSOystein Eftevaag     ESYS_TR new_object_handle;
631*758e9fbaSOystein Eftevaag     TPM2_HANDLE permanentHandle;    /**< The TPM permanent handle */
632*758e9fbaSOystein Eftevaag     IFAPI_OBJECT auth_object;       /**< Object used for authentication */
633*758e9fbaSOystein Eftevaag     ESYS_TR auth_index;             /**< The ESAPI handle of the nv authorization object */
634*758e9fbaSOystein Eftevaag     char *path;                     /**< The name of the file to be deleted */
635*758e9fbaSOystein Eftevaag     IFAPI_OBJECT object;            /**< Deserialized object */
636*758e9fbaSOystein Eftevaag     char **pathlist;                /**< The array with the object files to be deleted */
637*758e9fbaSOystein Eftevaag     size_t numPaths;                /**< Size of array with the object files to be deleted */
638*758e9fbaSOystein Eftevaag     size_t path_idx;                /**< Index of array with the object files to be deleted */
639*758e9fbaSOystein Eftevaag } IFAPI_Entity_Delete;
640*758e9fbaSOystein Eftevaag 
641*758e9fbaSOystein Eftevaag /** The data structure holding internal state of list entities.
642*758e9fbaSOystein Eftevaag  */
643*758e9fbaSOystein Eftevaag typedef struct {
644*758e9fbaSOystein Eftevaag     const char *searchPath;               /**< The path to searched for objectws */
645*758e9fbaSOystein Eftevaag } IFAPI_Entities_List;
646*758e9fbaSOystein Eftevaag 
647*758e9fbaSOystein Eftevaag /** Union for all input parameters.
648*758e9fbaSOystein Eftevaag  *
649*758e9fbaSOystein Eftevaag  * The input parameters of a command need to be stored in order to enable
650*758e9fbaSOystein Eftevaag  * resubmission. This type provides the corresponding facilities.
651*758e9fbaSOystein Eftevaag  */
652*758e9fbaSOystein Eftevaag typedef union {
653*758e9fbaSOystein Eftevaag     IFAPI_Provision Provision;
654*758e9fbaSOystein Eftevaag     IFAPI_Key_Create Key_Create;
655*758e9fbaSOystein Eftevaag     IFAPI_Key_SetCertificate Key_SetCertificate;
656*758e9fbaSOystein Eftevaag     IFAPI_Entity_ChangeAuth Entity_ChangeAuth;
657*758e9fbaSOystein Eftevaag     IFAPI_Entity_Delete Entity_Delete;
658*758e9fbaSOystein Eftevaag     IFAPI_Entities_List Entities_List;
659*758e9fbaSOystein Eftevaag     IFAPI_Key_VerifySignature Key_VerifySignature;
660*758e9fbaSOystein Eftevaag     IFAPI_Data_EncryptDecrypt Data_EncryptDecrypt;
661*758e9fbaSOystein Eftevaag     IFAPI_PCR pcr;
662*758e9fbaSOystein Eftevaag     IFAPI_INITIALIZE Initialize;
663*758e9fbaSOystein Eftevaag     IFAPI_Path_SetDescription path_set_info;
664*758e9fbaSOystein Eftevaag     IFAPI_Fapi_AuthorizePolicy Policy_AuthorizeNewPolicy;
665*758e9fbaSOystein Eftevaag     IFAPI_api_WriteAuthorizeNv WriteAuthorizeNV;
666*758e9fbaSOystein Eftevaag     IFAPI_ExportKey ExportKey;
667*758e9fbaSOystein Eftevaag     IFAPI_ImportKey ImportKey;
668*758e9fbaSOystein Eftevaag     IFAPI_Unseal Unseal;
669*758e9fbaSOystein Eftevaag     IFAPI_GetInfo GetInfo;
670*758e9fbaSOystein Eftevaag     IFAPI_ExportPolicy ExportPolicy;
671*758e9fbaSOystein Eftevaag } IFAPI_CMD_STATE;
672*758e9fbaSOystein Eftevaag 
673*758e9fbaSOystein Eftevaag /** The states for the FAPI's primary key regeneration */
674*758e9fbaSOystein Eftevaag enum _FAPI_STATE_PRIMARY {
675*758e9fbaSOystein Eftevaag     PRIMARY_INIT = 0,
676*758e9fbaSOystein Eftevaag     PRIMARY_READ_KEY,
677*758e9fbaSOystein Eftevaag     PRIMARY_READ_HIERARCHY,
678*758e9fbaSOystein Eftevaag     PRIMARY_READ_HIERARCHY_FINISH,
679*758e9fbaSOystein Eftevaag     PRIMARY_AUTHORIZE_HIERARCHY,
680*758e9fbaSOystein Eftevaag     PRIMARY_HAUTH_SENT,
681*758e9fbaSOystein Eftevaag     PRIMARY_CREATED
682*758e9fbaSOystein Eftevaag };
683*758e9fbaSOystein Eftevaag 
684*758e9fbaSOystein Eftevaag /** The states for the FAPI's primary key regeneration */
685*758e9fbaSOystein Eftevaag enum _FAPI_STATE_SESSION {
686*758e9fbaSOystein Eftevaag     SESSION_INIT = 0,
687*758e9fbaSOystein Eftevaag     SESSION_WAIT_FOR_PRIMARY,
688*758e9fbaSOystein Eftevaag     SESSION_CREATE_SESSION,
689*758e9fbaSOystein Eftevaag     SESSION_WAIT_FOR_SESSION1,
690*758e9fbaSOystein Eftevaag     SESSION_WAIT_FOR_SESSION2
691*758e9fbaSOystein Eftevaag };
692*758e9fbaSOystein Eftevaag 
693*758e9fbaSOystein Eftevaag /** The states for the FAPI's get random  state */
694*758e9fbaSOystein Eftevaag enum _FAPI_STATE_GET_RANDOM {
695*758e9fbaSOystein Eftevaag     GET_RANDOM_INIT = 0,
696*758e9fbaSOystein Eftevaag     GET_RANDOM_SENT
697*758e9fbaSOystein Eftevaag };
698*758e9fbaSOystein Eftevaag 
699*758e9fbaSOystein Eftevaag /** The states for flushing objects */
700*758e9fbaSOystein Eftevaag enum _FAPI_FLUSH_STATE {
701*758e9fbaSOystein Eftevaag     FLUSH_INIT = 0,
702*758e9fbaSOystein Eftevaag     WAIT_FOR_FLUSH
703*758e9fbaSOystein Eftevaag };
704*758e9fbaSOystein Eftevaag 
705*758e9fbaSOystein Eftevaag /** The states for the FAPI's internal state machine */
706*758e9fbaSOystein Eftevaag enum _FAPI_STATE {
707*758e9fbaSOystein Eftevaag     _FAPI_STATE_INIT = 0,         /**< The initial state after creation or after
708*758e9fbaSOystein Eftevaag                                      finishing a command. A new command can only
709*758e9fbaSOystein Eftevaag                                      be issued in this state. */
710*758e9fbaSOystein Eftevaag     _FAPI_STATE_INTERNALERROR,     /**< A non-recoverable error occurred within the
711*758e9fbaSOystein Eftevaag                                       ESAPI code. */
712*758e9fbaSOystein Eftevaag     INITIALIZE_READ,
713*758e9fbaSOystein Eftevaag     INITIALIZE_INIT_TCTI,
714*758e9fbaSOystein Eftevaag     INITIALIZE_GET_CAP,
715*758e9fbaSOystein Eftevaag     INITIALIZE_WAIT_FOR_CAP,
716*758e9fbaSOystein Eftevaag     INITIALIZE_READ_PROFILE,
717*758e9fbaSOystein Eftevaag     INITIALIZE_READ_PROFILE_INIT,
718*758e9fbaSOystein Eftevaag 
719*758e9fbaSOystein Eftevaag     PROVISION_WAIT_FOR_GET_CAP1,
720*758e9fbaSOystein Eftevaag     PROVISION_INIT_GET_CAP2,
721*758e9fbaSOystein Eftevaag     PROVISION_WAIT_FOR_GET_CAP2,
722*758e9fbaSOystein Eftevaag     PROVISION_GET_CERT_NV,
723*758e9fbaSOystein Eftevaag     PROVISION_GET_CERT_NV_FINISH,
724*758e9fbaSOystein Eftevaag     PROVISION_GET_CERT_READ_PUBLIC,
725*758e9fbaSOystein Eftevaag     PROVISION_READ_CERT,
726*758e9fbaSOystein Eftevaag     PROVISION_PREPARE_READ_ROOT_CERT,
727*758e9fbaSOystein Eftevaag     PROVISION_READ_ROOT_CERT,
728*758e9fbaSOystein Eftevaag     PROVISION_READ_PROFILE,
729*758e9fbaSOystein Eftevaag     PROVISION_INIT_SRK,
730*758e9fbaSOystein Eftevaag     PROVISION_AUTH_EK_NO_AUTH_SENT,
731*758e9fbaSOystein Eftevaag     PROVISION_AUTH_EK_AUTH_SENT,
732*758e9fbaSOystein Eftevaag     PROVISION_AUTH_SRK_NO_AUTH_SENT,
733*758e9fbaSOystein Eftevaag     PROVISION_AUTH_SRK_AUTH_SENT,
734*758e9fbaSOystein Eftevaag     PROVISION_EK_WRITE_PREPARE,
735*758e9fbaSOystein Eftevaag     PROVISION_EK_WRITE,
736*758e9fbaSOystein Eftevaag     PROVISION_EK_CHECK_CERT,
737*758e9fbaSOystein Eftevaag     PROVISION_SRK_WRITE_PREPARE,
738*758e9fbaSOystein Eftevaag     PROVISION_SRK_WRITE,
739*758e9fbaSOystein Eftevaag     PROVISION_WAIT_FOR_EK_PERSISTENT,
740*758e9fbaSOystein Eftevaag     PROVISION_WAIT_FOR_SRK_PERSISTENT,
741*758e9fbaSOystein Eftevaag     PROVISION_CHANGE_LOCKOUT_AUTH,
742*758e9fbaSOystein Eftevaag     PROVISION_CHANGE_EH_CHECK,
743*758e9fbaSOystein Eftevaag     PROVISION_CHANGE_EH_AUTH,
744*758e9fbaSOystein Eftevaag     PROVISION_CHANGE_SH_CHECK,
745*758e9fbaSOystein Eftevaag     PROVISION_CHANGE_SH_AUTH,
746*758e9fbaSOystein Eftevaag     PROVISION_EH_CHANGE_POLICY,
747*758e9fbaSOystein Eftevaag     PROVISION_SH_CHANGE_POLICY,
748*758e9fbaSOystein Eftevaag     PROVISION_LOCKOUT_CHANGE_POLICY,
749*758e9fbaSOystein Eftevaag     PROVISION_FINISHED,
750*758e9fbaSOystein Eftevaag     PROVISION_WRITE_SH,
751*758e9fbaSOystein Eftevaag     PROVISION_WRITE_EH,
752*758e9fbaSOystein Eftevaag     PROVISION_WRITE_LOCKOUT,
753*758e9fbaSOystein Eftevaag     PROVISION_WRITE_LOCKOUT_PARAM,
754*758e9fbaSOystein Eftevaag     PROVISION_FLUSH_SRK,
755*758e9fbaSOystein Eftevaag     PROVISION_FLUSH_EK,
756*758e9fbaSOystein Eftevaag     PROVISION_CHECK_FOR_VENDOR_CERT,
757*758e9fbaSOystein Eftevaag     PROVISION_GET_VENDOR,
758*758e9fbaSOystein Eftevaag 
759*758e9fbaSOystein Eftevaag     KEY_CREATE,
760*758e9fbaSOystein Eftevaag 
761*758e9fbaSOystein Eftevaag     CREATE_SEAL,
762*758e9fbaSOystein Eftevaag 
763*758e9fbaSOystein Eftevaag     KEY_SET_CERTIFICATE_READ,
764*758e9fbaSOystein Eftevaag     KEY_SET_CERTIFICATE_WRITE,
765*758e9fbaSOystein Eftevaag 
766*758e9fbaSOystein Eftevaag     KEY_GET_CERTIFICATE_READ,
767*758e9fbaSOystein Eftevaag 
768*758e9fbaSOystein Eftevaag     GET_RANDOM_WAIT_FOR_SESSION,
769*758e9fbaSOystein Eftevaag     GET_RANDOM_WAIT_FOR_RANDOM,
770*758e9fbaSOystein Eftevaag     GET_RANDOM_CLEANUP,
771*758e9fbaSOystein Eftevaag 
772*758e9fbaSOystein Eftevaag     NV_CREATE_READ_PROFILE,
773*758e9fbaSOystein Eftevaag     NV_CREATE_READ_HIERARCHY,
774*758e9fbaSOystein Eftevaag     NV_CREATE_AUTHORIZE_HIERARCHY,
775*758e9fbaSOystein Eftevaag     NV_CREATE_GET_INDEX,
776*758e9fbaSOystein Eftevaag     NV_CREATE_FIND_INDEX,
777*758e9fbaSOystein Eftevaag     NV_CREATE_WAIT_FOR_SESSION,
778*758e9fbaSOystein Eftevaag 
779*758e9fbaSOystein Eftevaag     NV_CREATE_AUTH_SENT,
780*758e9fbaSOystein Eftevaag     NV_CREATE_WRITE,
781*758e9fbaSOystein Eftevaag     NV_CREATE_CALCULATE_POLICY,
782*758e9fbaSOystein Eftevaag 
783*758e9fbaSOystein Eftevaag     NV_WRITE_READ,
784*758e9fbaSOystein Eftevaag     NV_WRITE_WRITE,
785*758e9fbaSOystein Eftevaag     NV_WRITE_CLEANUP,
786*758e9fbaSOystein Eftevaag 
787*758e9fbaSOystein Eftevaag     NV_EXTEND_READ,
788*758e9fbaSOystein Eftevaag     NV_EXTEND_WAIT_FOR_SESSION,
789*758e9fbaSOystein Eftevaag     NV_EXTEND_AUTHORIZE,
790*758e9fbaSOystein Eftevaag     NV_EXTEND_AUTH_SENT,
791*758e9fbaSOystein Eftevaag     NV_EXTEND_WRITE,
792*758e9fbaSOystein Eftevaag     NV_EXTEND_CLEANUP,
793*758e9fbaSOystein Eftevaag 
794*758e9fbaSOystein Eftevaag     NV_INCREMENT_READ,
795*758e9fbaSOystein Eftevaag     NV_INCREMENT_WAIT_FOR_SESSION,
796*758e9fbaSOystein Eftevaag     NV_INCREMENT_AUTHORIZE,
797*758e9fbaSOystein Eftevaag     NV_INCREMENT_AUTH_SENT,
798*758e9fbaSOystein Eftevaag     NV_INCREMENT_WRITE,
799*758e9fbaSOystein Eftevaag     NV_INCREMENT_CLEANUP,
800*758e9fbaSOystein Eftevaag 
801*758e9fbaSOystein Eftevaag     NV_SET_BITS_READ,
802*758e9fbaSOystein Eftevaag     NV_SET_BITS_WAIT_FOR_SESSION,
803*758e9fbaSOystein Eftevaag     NV_SET_BITS_AUTHORIZE,
804*758e9fbaSOystein Eftevaag     NV_SET_BITS_AUTH_SENT,
805*758e9fbaSOystein Eftevaag     NV_SET_BITS_WRITE,
806*758e9fbaSOystein Eftevaag     NV_SET_BITS_CLEANUP,
807*758e9fbaSOystein Eftevaag 
808*758e9fbaSOystein Eftevaag     NV_READ_READ,
809*758e9fbaSOystein Eftevaag     NV_READ_WAIT,
810*758e9fbaSOystein Eftevaag     NV_READ_WAIT_FOR_SESSION,
811*758e9fbaSOystein Eftevaag     NV_READ_CLEANUP,
812*758e9fbaSOystein Eftevaag 
813*758e9fbaSOystein Eftevaag     ENTITY_DELETE_GET_FILE,
814*758e9fbaSOystein Eftevaag     ENTITY_DELETE_READ,
815*758e9fbaSOystein Eftevaag     ENTITY_DELETE_WAIT_FOR_SESSION,
816*758e9fbaSOystein Eftevaag     ENTITY_DELETE_NULL_AUTH_SENT_FOR_KEY,
817*758e9fbaSOystein Eftevaag     ENTITY_DELETE_AUTH_SENT_FOR_KEY,
818*758e9fbaSOystein Eftevaag     ENTITY_DELETE_NULL_AUTH_SENT_FOR_NV,
819*758e9fbaSOystein Eftevaag     ENTITY_DELETE_AUTH_SENT_FOR_NV,
820*758e9fbaSOystein Eftevaag     ENTITY_DELETE_KEY,
821*758e9fbaSOystein Eftevaag     ENTITY_DELETE_AUTHORIZE_NV,
822*758e9fbaSOystein Eftevaag     ENTITY_DELETE_FILE,
823*758e9fbaSOystein Eftevaag     ENTITY_DELETE_POLICY,
824*758e9fbaSOystein Eftevaag     ENTITY_DELETE_REMOVE_DIRS,
825*758e9fbaSOystein Eftevaag 
826*758e9fbaSOystein Eftevaag     ENTITY_GET_TPM_BLOBS_READ,
827*758e9fbaSOystein Eftevaag 
828*758e9fbaSOystein Eftevaag     KEY_SIGN_WAIT_FOR_KEY,
829*758e9fbaSOystein Eftevaag     KEY_SIGN_WAIT_FOR_SIGN,
830*758e9fbaSOystein Eftevaag     KEY_SIGN_CLEANUP,
831*758e9fbaSOystein Eftevaag 
832*758e9fbaSOystein Eftevaag     ENTITY_CHANGE_AUTH_WAIT_FOR_SESSION,
833*758e9fbaSOystein Eftevaag     ENTITY_CHANGE_AUTH_WAIT_FOR_KEY,
834*758e9fbaSOystein Eftevaag     ENTITY_CHANGE_AUTH_AUTH_SENT,
835*758e9fbaSOystein Eftevaag     ENTITY_CHANGE_AUTH_WAIT_FOR_FLUSH,
836*758e9fbaSOystein Eftevaag     ENTITY_CHANGE_AUTH_WRITE_PREPARE,
837*758e9fbaSOystein Eftevaag     ENTITY_CHANGE_AUTH_WRITE,
838*758e9fbaSOystein Eftevaag     ENTITY_CHANGE_AUTH_WAIT_FOR_KEY_AUTH,
839*758e9fbaSOystein Eftevaag     ENTITY_CHANGE_AUTH_WAIT_FOR_NV_READ,
840*758e9fbaSOystein Eftevaag     ENTITY_CHANGE_AUTH_WAIT_FOR_NV_AUTH,
841*758e9fbaSOystein Eftevaag     ENTITY_CHANGE_AUTH_WAIT_FOR_NV_CHANGE_AUTH,
842*758e9fbaSOystein Eftevaag     ENTITY_CHANGE_AUTH_HIERARCHY_CHANGE_AUTH,
843*758e9fbaSOystein Eftevaag     ENTITY_CHANGE_AUTH_HIERARCHY_READ,
844*758e9fbaSOystein Eftevaag     ENTITY_CHANGE_AUTH_HIERARCHY_AUTHORIZE,
845*758e9fbaSOystein Eftevaag     ENTITY_CHANGE_AUTH_CLEANUP,
846*758e9fbaSOystein Eftevaag 
847*758e9fbaSOystein Eftevaag     DATA_ENCRYPT_WAIT_FOR_PROFILE,
848*758e9fbaSOystein Eftevaag     DATA_ENCRYPT_WAIT_FOR_SESSION,
849*758e9fbaSOystein Eftevaag     DATA_ENCRYPT_WAIT_FOR_KEY,
850*758e9fbaSOystein Eftevaag     DATA_ENCRYPT_WAIT_FOR_FLUSH,
851*758e9fbaSOystein Eftevaag     DATA_ENCRYPT_WAIT_FOR_RSA_ENCRYPTION,
852*758e9fbaSOystein Eftevaag     DATA_ENCRYPT_CLEAN,
853*758e9fbaSOystein Eftevaag 
854*758e9fbaSOystein Eftevaag     DATA_DECRYPT_WAIT_FOR_PROFILE,
855*758e9fbaSOystein Eftevaag     DATA_DECRYPT_WAIT_FOR_SESSION,
856*758e9fbaSOystein Eftevaag     DATA_DECRYPT_WAIT_FOR_KEY,
857*758e9fbaSOystein Eftevaag     DATA_DECRYPT_WAIT_FOR_FLUSH,
858*758e9fbaSOystein Eftevaag     DATA_DECRYPT_WAIT_FOR_RSA_DECRYPTION,
859*758e9fbaSOystein Eftevaag     DATA_DECRYPT_AUTHORIZE_KEY,
860*758e9fbaSOystein Eftevaag     DATA_DECRYPT_CLEANUP,
861*758e9fbaSOystein Eftevaag 
862*758e9fbaSOystein Eftevaag     PCR_EXTEND_WAIT_FOR_SESSION,
863*758e9fbaSOystein Eftevaag     PCR_EXTEND_WAIT_FOR_GET_CAP,
864*758e9fbaSOystein Eftevaag     PCR_EXTEND_APPEND_EVENT_LOG,
865*758e9fbaSOystein Eftevaag     PCR_EXTEND_FINISH,
866*758e9fbaSOystein Eftevaag     PCR_EXTEND_CLEANUP,
867*758e9fbaSOystein Eftevaag 
868*758e9fbaSOystein Eftevaag     PCR_READ_READ_PCR,
869*758e9fbaSOystein Eftevaag     PCR_READ_READ_EVENT_LIST,
870*758e9fbaSOystein Eftevaag 
871*758e9fbaSOystein Eftevaag     PCR_QUOTE_WAIT_FOR_GET_CAP,
872*758e9fbaSOystein Eftevaag     PCR_QUOTE_WAIT_FOR_SESSION,
873*758e9fbaSOystein Eftevaag     PCR_QUOTE_WAIT_FOR_KEY,
874*758e9fbaSOystein Eftevaag     PCR_QUOTE_AUTH_SENT,
875*758e9fbaSOystein Eftevaag     PCR_QUOTE_AUTHORIZE,
876*758e9fbaSOystein Eftevaag     PCR_QUOTE_WAIT_FOR_FLUSH,
877*758e9fbaSOystein Eftevaag     PCR_QUOTE_READ_EVENT_LIST,
878*758e9fbaSOystein Eftevaag     PCR_QUOTE_CLEANUP,
879*758e9fbaSOystein Eftevaag 
880*758e9fbaSOystein Eftevaag     PATH_SET_DESCRIPTION_READ,
881*758e9fbaSOystein Eftevaag     PATH_SET_DESCRIPTION_WRITE,
882*758e9fbaSOystein Eftevaag 
883*758e9fbaSOystein Eftevaag     PATH_GET_DESCRIPTION_READ,
884*758e9fbaSOystein Eftevaag 
885*758e9fbaSOystein Eftevaag     APP_DATA_SET_READ,
886*758e9fbaSOystein Eftevaag     APP_DATA_SET_WRITE,
887*758e9fbaSOystein Eftevaag 
888*758e9fbaSOystein Eftevaag     AUTHORIZE_NEW_CALCULATE_POLICY,
889*758e9fbaSOystein Eftevaag     AUTHORIZE_NEW_LOAD_KEY,
890*758e9fbaSOystein Eftevaag     AUTHORIZE_NEW_KEY_SIGN_POLICY,
891*758e9fbaSOystein Eftevaag     AUTHORIZE_NEW_WRITE_POLICY_PREPARE,
892*758e9fbaSOystein Eftevaag     AUTHORIZE_NEW_WRITE_POLICY,
893*758e9fbaSOystein Eftevaag     AUTHORIZE_NEW_CLEANUP,
894*758e9fbaSOystein Eftevaag 
895*758e9fbaSOystein Eftevaag     WRITE_AUTHORIZE_NV_READ_NV,
896*758e9fbaSOystein Eftevaag     WRITE_AUTHORIZE_NV_CALCULATE_POLICY,
897*758e9fbaSOystein Eftevaag     WRITE_AUTHORIZE_NV_WRITE_NV_RAM_PREPARE,
898*758e9fbaSOystein Eftevaag     WRITE_AUTHORIZE_NV_WRITE_NV_RAM,
899*758e9fbaSOystein Eftevaag     WRITE_AUTHORIZE_NV_WRITE_OBJCECT,
900*758e9fbaSOystein Eftevaag     WRITE_AUTHORIZE_NV_WRITE_POLICY_PREPARE,
901*758e9fbaSOystein Eftevaag     WRITE_AUTHORIZE_NV_WRITE_POLICY,
902*758e9fbaSOystein Eftevaag     WRITE_AUTHORIZE_NV_CLEANUP,
903*758e9fbaSOystein Eftevaag 
904*758e9fbaSOystein Eftevaag     EXPORT_KEY_READ_PUB_KEY,
905*758e9fbaSOystein Eftevaag     EXPORT_KEY_READ_PUB_KEY_PARENT,
906*758e9fbaSOystein Eftevaag     EXPORT_KEY_WAIT_FOR_KEY,
907*758e9fbaSOystein Eftevaag     EXPORT_KEY_WAIT_FOR_DUPLICATE,
908*758e9fbaSOystein Eftevaag     EXPORT_KEY_WAIT_FOR_EXT_KEY,
909*758e9fbaSOystein Eftevaag     EXPORT_KEY_WAIT_FOR_AUTHORIZATON,
910*758e9fbaSOystein Eftevaag     EXPORT_KEY_WAIT_FOR_FLUSH1,
911*758e9fbaSOystein Eftevaag     EXPORT_KEY_WAIT_FOR_FLUSH2,
912*758e9fbaSOystein Eftevaag     EXPORT_KEY_CLEANUP,
913*758e9fbaSOystein Eftevaag 
914*758e9fbaSOystein Eftevaag     IMPORT_KEY_WRITE_POLICY,
915*758e9fbaSOystein Eftevaag     IMPORT_KEY_WRITE,
916*758e9fbaSOystein Eftevaag     IMPORT_KEY_SEARCH,
917*758e9fbaSOystein Eftevaag     IMPORT_KEY_LOAD_PARENT,
918*758e9fbaSOystein Eftevaag     IMPORT_KEY_AUTHORIZE_PARENT,
919*758e9fbaSOystein Eftevaag     IMPORT_KEY_IMPORT,
920*758e9fbaSOystein Eftevaag     IMPORT_KEY_WAIT_FOR_FLUSH,
921*758e9fbaSOystein Eftevaag     IMPORT_KEY_WRITE_OBJECT_PREPARE,
922*758e9fbaSOystein Eftevaag     IMPORT_KEY_WRITE_OBJECT,
923*758e9fbaSOystein Eftevaag     IMPORT_KEY_CLEANUP,
924*758e9fbaSOystein Eftevaag 
925*758e9fbaSOystein Eftevaag     UNSEAL_WAIT_FOR_KEY,
926*758e9fbaSOystein Eftevaag     UNSEAL_AUTHORIZE_OBJECT,
927*758e9fbaSOystein Eftevaag     UNSEAL_WAIT_FOR_UNSEAL,
928*758e9fbaSOystein Eftevaag     UNSEAL_WAIT_FOR_FLUSH,
929*758e9fbaSOystein Eftevaag     UNSEAL_CLEANUP,
930*758e9fbaSOystein Eftevaag 
931*758e9fbaSOystein Eftevaag     GET_PLATFORM_CERTIFICATE,
932*758e9fbaSOystein Eftevaag 
933*758e9fbaSOystein Eftevaag     POLICY_EXPORT_READ_OBJECT,
934*758e9fbaSOystein Eftevaag     POLICY_EXPORT_READ_OBJECT_FINISH,
935*758e9fbaSOystein Eftevaag     POLICY_EXPORT_READ_POLICY,
936*758e9fbaSOystein Eftevaag     POLICY_EXPORT_READ_POLICY_FINISH,
937*758e9fbaSOystein Eftevaag 
938*758e9fbaSOystein Eftevaag     VERIFY_QUOTE_READ,
939*758e9fbaSOystein Eftevaag 
940*758e9fbaSOystein Eftevaag     GET_INFO_GET_CAP,
941*758e9fbaSOystein Eftevaag     GET_INFO_GET_CAP_MORE,
942*758e9fbaSOystein Eftevaag     GET_INFO_WAIT_FOR_CAP
943*758e9fbaSOystein Eftevaag };
944*758e9fbaSOystein Eftevaag 
945*758e9fbaSOystein Eftevaag /** Structure holding FAPI callbacks and userData
946*758e9fbaSOystein Eftevaag  *
947*758e9fbaSOystein Eftevaag  * This structure holds the callback pointers and corresponding userData pointers for each of the
948*758e9fbaSOystein Eftevaag  * three callback types of FAPI. They are set using Fapi_SetAuthCB, Fapi_SetBranchCB and
949*758e9fbaSOystein Eftevaag  * Fapi_SetSignCB.
950*758e9fbaSOystein Eftevaag  */
951*758e9fbaSOystein Eftevaag struct IFAPI_CALLBACKS {
952*758e9fbaSOystein Eftevaag     Fapi_CB_Auth auth;
953*758e9fbaSOystein Eftevaag     void *authData;
954*758e9fbaSOystein Eftevaag     Fapi_CB_Branch branch;
955*758e9fbaSOystein Eftevaag     void *branchData;
956*758e9fbaSOystein Eftevaag     Fapi_CB_Sign sign;
957*758e9fbaSOystein Eftevaag     void *signData;
958*758e9fbaSOystein Eftevaag     Fapi_CB_PolicyAction action;
959*758e9fbaSOystein Eftevaag     void *actionData;
960*758e9fbaSOystein Eftevaag };
961*758e9fbaSOystein Eftevaag 
962*758e9fbaSOystein Eftevaag /** The data structure holding internal state information.
963*758e9fbaSOystein Eftevaag  *
964*758e9fbaSOystein Eftevaag  * Each FAPI_CONTEXT respresents a logically independent connection to the TPM.
965*758e9fbaSOystein Eftevaag  * It stores meta data information about object in order to calculate session
966*758e9fbaSOystein Eftevaag  * auths and similar things.
967*758e9fbaSOystein Eftevaag  */
968*758e9fbaSOystein Eftevaag struct FAPI_CONTEXT {
969*758e9fbaSOystein Eftevaag     ESYS_CONTEXT *esys;              /**< The ESYS context used internally to talk to
970*758e9fbaSOystein Eftevaag                                           the TPM. */
971*758e9fbaSOystein Eftevaag     struct IFAPI_CALLBACKS callbacks;       /**< Callbacks for user interaction from FAPI */
972*758e9fbaSOystein Eftevaag     struct IFAPI_IO io;
973*758e9fbaSOystein Eftevaag     struct IFAPI_EVENTLOG eventlog;
974*758e9fbaSOystein Eftevaag     struct IFAPI_KEYSTORE keystore;
975*758e9fbaSOystein Eftevaag     struct IFAPI_POLICY_STORE pstore;
976*758e9fbaSOystein Eftevaag     struct IFAPI_PROFILES profiles;
977*758e9fbaSOystein Eftevaag 
978*758e9fbaSOystein Eftevaag     enum _FAPI_STATE state;          /**< The current state of the command execution */
979*758e9fbaSOystein Eftevaag     enum _FAPI_STATE_PRIMARY primary_state; /**< The current state of the primary regeneration */
980*758e9fbaSOystein Eftevaag     enum _FAPI_STATE_SESSION session_state; /**< The current state of the session creation */
981*758e9fbaSOystein Eftevaag     enum _FAPI_STATE_GET_RANDOM get_random_state; /**< The current state of get random */
982*758e9fbaSOystein Eftevaag     enum IFAPI_HIERACHY_AUTHORIZATION_STATE hierarchy_state;
983*758e9fbaSOystein Eftevaag     enum IFAPI_HIERACHY_POLICY_AUTHORIZATION_STATE hierarchy_policy_state;
984*758e9fbaSOystein Eftevaag     enum IFAPI_GET_CERT_STATE get_cert_state;
985*758e9fbaSOystein Eftevaag     enum _FAPI_FLUSH_STATE flush_object_state;  /**< The current state of a flush operation */
986*758e9fbaSOystein Eftevaag     enum IFAPI_CLEANUP_STATE cleanup_state;     /**< The state of cleanup after command execution */
987*758e9fbaSOystein Eftevaag     IFAPI_CONFIG config;             /**< The profile independet configuration data */
988*758e9fbaSOystein Eftevaag     UINT32 nv_buffer_max;            /**< The maximal size for transfer of nv buffer content */
989*758e9fbaSOystein Eftevaag     IFAPI_CMD_STATE cmd;             /**< The state information of the currently executed
990*758e9fbaSOystein Eftevaag                                           command */
991*758e9fbaSOystein Eftevaag     IFAPI_NV_Cmds nv_cmd;
992*758e9fbaSOystein Eftevaag     IFAPI_GetRandom get_random;
993*758e9fbaSOystein Eftevaag     IFAPI_CreatePrimary createPrimary;
994*758e9fbaSOystein Eftevaag     IFAPI_LoadKey loadKey;
995*758e9fbaSOystein Eftevaag     ESYS_TR session1;                /**< The first session used by FAPI  */
996*758e9fbaSOystein Eftevaag     ESYS_TR session2;                /**< The second session used by FAPI  */
997*758e9fbaSOystein Eftevaag     ESYS_TR policy_session;          /**< The policy session used by FAPI  */
998*758e9fbaSOystein Eftevaag     ESYS_TR ek_handle;
999*758e9fbaSOystein Eftevaag     ESYS_TR srk_handle;
1000*758e9fbaSOystein Eftevaag     bool ek_persistent;
1001*758e9fbaSOystein Eftevaag     bool srk_persistent;
1002*758e9fbaSOystein Eftevaag     IFAPI_SESSION_TYPE session_flags;
1003*758e9fbaSOystein Eftevaag     TPMA_SESSION session1_attribute_flags;
1004*758e9fbaSOystein Eftevaag     TPMA_SESSION session2_attribute_flags;
1005*758e9fbaSOystein Eftevaag     IFAPI_MAX_BUFFER aux_data; /**< tpm2b data to be transferred */
1006*758e9fbaSOystein Eftevaag     IFAPI_POLICY_CTX policy;  /**< The context of current policy. */
1007*758e9fbaSOystein Eftevaag     IFAPI_FILE_SEARCH_CTX fsearch;  /**< The context for object search in key/policy store */
1008*758e9fbaSOystein Eftevaag     IFAPI_Key_Sign Key_Sign; /**< State information for key signing */
1009*758e9fbaSOystein Eftevaag     enum IFAPI_IO_STATE io_state;
1010*758e9fbaSOystein Eftevaag     NODE_OBJECT_T *object_list;
1011*758e9fbaSOystein Eftevaag     IFAPI_OBJECT *duplicate_key; /**< Will be needed for policy execution */
1012*758e9fbaSOystein Eftevaag };
1013*758e9fbaSOystein Eftevaag 
1014*758e9fbaSOystein Eftevaag #define VENDOR_IFX  0x49465800
1015*758e9fbaSOystein Eftevaag #define VENDOR_INTC 0x494E5443
1016*758e9fbaSOystein Eftevaag #define VEDNOR_IBM  0x49424D20
1017*758e9fbaSOystein Eftevaag 
1018*758e9fbaSOystein Eftevaag #endif /* FAPI_INT_H */
1019