blob: a1cfdb62dc0dac44ec97dbd26a86799bfa7c4c16 [file] [log] [blame]
Juergen Reppff821bd2017-12-11 15:21:42 +01001/*******************************************************************************
2 * Copyright 2017, Fraunhofer SIT sponsored by Infineon Technologies AG
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
25 * THE POSSIBILITY OF SUCH DAMAGE.
26 *******************************************************************************/
27#ifndef ESYS_IUTIL_H
28#define ESYS_IUTIL_H
29
Juergen Reppff821bd2017-12-11 15:21:42 +010030#include <stdbool.h>
Juergen Repp62097182018-03-19 18:04:42 +010031#include <inttypes.h>
Juergen Reppff821bd2017-12-11 15:21:42 +010032#include <string.h>
Juergen Repp62097182018-03-19 18:04:42 +010033
Juergen Reppff821bd2017-12-11 15:21:42 +010034#include "tss2_esys.h"
Juergen Repp62097182018-03-19 18:04:42 +010035
Juergen Reppff821bd2017-12-11 15:21:42 +010036#include "esys_int.h"
37#include "esys_crypto.h"
38
39#ifdef __cplusplus
40extern "C" {
41#endif
42
43#define SAFE_FREE(S) if((S) != NULL) {free((void*) (S)); (S)=NULL;}
44
45#define TPM2_ERROR_FORMAT "%s%s (0x%08x)"
46#define TPM2_ERROR_TEXT(r) "Error", "Code", r
47
48#define return_if_error(r,msg) \
49 if (r != TSS2_RC_SUCCESS) { \
50 LOG_ERROR("%s " TPM2_ERROR_FORMAT, msg, TPM2_ERROR_TEXT(r)); \
51 return r; \
52 }
53
Andreas Fuchs4d9961e2018-03-20 15:51:48 +010054#define return_state_if_error(r,s,msg) \
55 if (r != TSS2_RC_SUCCESS) { \
56 LOG_ERROR("%s " TPM2_ERROR_FORMAT, msg, TPM2_ERROR_TEXT(r)); \
57 esysContext->state = s; \
58 return r; \
59 }
60
Juergen Reppff821bd2017-12-11 15:21:42 +010061#define return_error(r,msg) \
62 { \
63 LOG_ERROR("%s " TPM2_ERROR_FORMAT, msg, TPM2_ERROR_TEXT(r)); \
64 return r; \
65 }
66
Andreas Fuchs4d9961e2018-03-20 15:51:48 +010067#define goto_state_if_error(r,s,msg,label) \
68 if (r != TSS2_RC_SUCCESS) { \
69 LOG_ERROR("%s " TPM2_ERROR_FORMAT, msg, TPM2_ERROR_TEXT(r)); \
70 esysContext->state = s; \
71 goto label; \
72 }
73
Juergen Reppff821bd2017-12-11 15:21:42 +010074#define goto_if_error(r,msg,label) \
75 if (r != TSS2_RC_SUCCESS) { \
76 LOG_ERROR("%s " TPM2_ERROR_FORMAT, msg, TPM2_ERROR_TEXT(r)); \
77 goto label; \
78 }
79
80#define goto_error(r,v,msg,label) \
Andreas Fuchs4d9961e2018-03-20 15:51:48 +010081 { r = v; \
Juergen Reppff821bd2017-12-11 15:21:42 +010082 LOG_ERROR("%s " TPM2_ERROR_FORMAT, msg, TPM2_ERROR_TEXT(r)); \
83 goto label; \
84 }
85
86#define return_if_null(p,msg,ec) \
87 if (p == NULL) { \
88 LOG_ERROR("%s ", msg); \
89 return ec; \
90 }
91
92#define return_if_notnull(p,msg,ec) \
93 if (p != NULL) { \
94 LOG_ERROR("%s ", msg); \
95 return ec; \
96 }
97
98#define exit_if_error(r,msg) \
99 if (r != TSS2_RC_SUCCESS) { \
100 LOG_ERROR("%s " TPM2_ERROR_FORMAT, msg, TPM2_ERROR_TEXT(r)); \
101 exit(1); \
102 }
103
104#define set_return_code(r_max, r, msg) \
105 if (r != TSS2_RC_SUCCESS) { \
106 LOG_ERROR("%s " TPM2_ERROR_FORMAT, msg, TPM2_ERROR_TEXT(r)); \
107 r_max = r; \
108 }
109
Juergen Reppff821bd2017-12-11 15:21:42 +0100110typedef struct {
111 TPM2_ALG_ID alg;
112 size_t size;
113 uint8_t digest[sizeof(TPMU_HA)];
114} HASH_TAB_ITEM;
115
116bool cmp_UINT16 (const UINT16 *in1, const UINT16 *in2);
117bool cmp_BYTE (const BYTE *in1, const BYTE *in2);
118bool cmp_BYTE_array(const BYTE *in1, size_t count1, const BYTE *in2, size_t count2);
119bool cmp_TPM2B_DIGEST (const TPM2B_DIGEST *in1, const TPM2B_DIGEST *in2);
120bool cmp_TPM2B_NAME (const TPM2B_NAME *in1, const TPM2B_NAME *in2);
121bool cmp_TPM2B_AUTH (const TPM2B_AUTH *in1, const TPM2B_AUTH *in2);
122
123TSS2_RC init_session_tab(
124 ESYS_CONTEXT *esysContext,
125 ESYS_TR shandle1, ESYS_TR shandle2, ESYS_TR shandle3);
126
127void iesys_DeleteAllResourceObjects(
128 ESYS_CONTEXT *esys_context);
129
130TSS2_RC iesys_compute_encrypt_nonce(
131 ESYS_CONTEXT *esysContext,
132 int *encryptNonceIdx,
133 TPM2B_NONCE **encryptNonce);
134
135TSS2_RC iesys_compute_cp_hashtab(
136 ESYS_CONTEXT *esysContext,
137 const TPM2B_NAME *name1,
138 const TPM2B_NAME *name2,
139 const TPM2B_NAME *name3,
140 HASH_TAB_ITEM cp_hash_tab[3],
141 uint8_t *cpHashNum);
142
143TSS2_RC iesys_compute_rp_hashtab(
144 ESYS_CONTEXT *esysContext,
Juergen Reppff821bd2017-12-11 15:21:42 +0100145 const uint8_t *rpBuffer,
146 size_t rpBuffer_size,
147 HASH_TAB_ITEM rp_hash_tab[3],
148 uint8_t *rpHashNum);
149
150TSS2_RC esys_CreateResourceObject(
151 ESYS_CONTEXT *esys_context,
152 ESYS_TR esys_handle,
153 RSRC_NODE_T **node);
154
155TSS2_RC iesys_handle_to_tpm_handle(
156 ESYS_TR esys_handle,
157 TPM2_HANDLE *tpm_handle);
158
159TSS2_RC esys_GetResourceObject(
160 ESYS_CONTEXT *esys_context,
161 ESYS_TR rsrc_handle,
162 RSRC_NODE_T **node);
163
Juergen Reppff821bd2017-12-11 15:21:42 +0100164TPM2_HT iesys_get_handle_type(
165 TPM2_HANDLE handle);
166
Juergen Reppff821bd2017-12-11 15:21:42 +0100167TSS2_RC iesys_finalize(ESYS_CONTEXT *context);
168
169bool iesys_compare_name(
170 TPM2B_PUBLIC *publicInfo,
171 TPM2B_NAME *name);
172
173TSS2_RC iesys_compute_encrypted_salt(
174 ESYS_CONTEXT *esysContext,
175 RSRC_NODE_T *tpmKeyNode,
176 TPM2B_ENCRYPTED_SECRET *encryptedSalt);
177
178TSS2_RC iesys_gen_caller_nonces(
179 ESYS_CONTEXT *esysContext);
180
181TSS2_RC iesys_encrypt_param(
182 ESYS_CONTEXT *esysContext,
183 TPM2B_NONCE **decryptNonce,
184 int *decryptNonceIdx);
185
186TSS2_RC iesys_decrypt_param(
187 ESYS_CONTEXT *esysContext,
188 const uint8_t *rpBuffer,
189 size_t rpBuffer_size);
190
191TSS2_RC iesys_check_rp_hmacs(
192 ESYS_CONTEXT *esysContext,
193 TSS2L_SYS_AUTH_RESPONSE *rspAuths,
Juergen Repp5a7c4f42018-04-24 14:50:59 +0200194 HASH_TAB_ITEM rp_hash_tab[3],
195 uint8_t rpHashNum);
Juergen Reppff821bd2017-12-11 15:21:42 +0100196
197void iesys_compute_bound_entity(
198 const TPM2B_NAME *name,
199 const TPM2B_AUTH *auth,
200 TPM2B_NAME *bound_entity);
201
Juergen Repp5a7c4f42018-04-24 14:50:59 +0200202bool iesys_is_object_bound(
203 const TPM2B_NAME * name,
204 const TPM2B_AUTH * auth,
205 RSRC_NODE_T * session);
206
Juergen Reppff821bd2017-12-11 15:21:42 +0100207TSS2_RC iesys_check_sequence_async(
208 ESYS_CONTEXT *esysContext);
209
dantpmf6ef2472018-04-06 15:21:59 -0700210TSS2_RC check_session_feasibility(
Juergen Reppff821bd2017-12-11 15:21:42 +0100211 ESYS_TR shandle1,
212 ESYS_TR shandle2,
213 ESYS_TR shandle3,
214 int mandatory);
215
216void iesys_compute_session_value(
217 RSRC_NODE_T *session,
218 const TPM2B_NAME *name,
219 const TPM2B_AUTH *auth_value);
220
221TSS2_RC iesys_compute_hmacs(
222 RSRC_NODE_T *session,
223 HASH_TAB_ITEM cp_hash_tab[3],
224 uint8_t cpHashNum,
225 TPM2B_NONCE *decryptNonce,
226 TPM2B_NONCE *encryptNonce,
227 TPMS_AUTH_COMMAND *auth);
228
229TSS2_RC iesys_gen_auths(
230 ESYS_CONTEXT *esysContext,
231 RSRC_NODE_T *h1,
232 RSRC_NODE_T *h2,
233 RSRC_NODE_T *h3,
234 TSS2L_SYS_AUTH_COMMAND *auths);
235
Juergen Repp109de7d2018-02-23 13:42:08 +0100236TSS2_RC iesys_check_response(
237 ESYS_CONTEXT * esys_context);
238
Juergen Reppff821bd2017-12-11 15:21:42 +0100239TSS2_RC iesys_nv_get_name(
240 TPM2B_NV_PUBLIC *publicInfo,
241 TPM2B_NAME *name);
242
243TSS2_RC iesys_get_name(
244 TPM2B_PUBLIC *publicInfo,
245 TPM2B_NAME *name);
246
247#ifdef __cplusplus
248} /* extern "C" */
249#endif
250
251#endif /* ESYS_IUTIL_H */