@@ -14,6 +14,7 @@ typedef struct tpm2_cipher_ctx_st TPM2_CIPHER_CTX;
14
14
15
15
struct tpm2_cipher_ctx_st {
16
16
const OSSL_CORE_HANDLE * core ;
17
+ tpm2_semaphore_t esys_lock ;
17
18
ESYS_CONTEXT * esys_ctx ;
18
19
TPM2_CAPABILITY capability ;
19
20
ESYS_TR object ;
@@ -46,6 +47,7 @@ tpm2_cipher_all_newctx(void *provctx,
46
47
return NULL ;
47
48
48
49
cctx -> core = cprov -> core ;
50
+ cctx -> esys_lock = cprov -> esys_lock ;
49
51
cctx -> esys_ctx = cprov -> esys_ctx ;
50
52
cctx -> capability = cprov -> capability ;
51
53
cctx -> algorithm = algdef ;
@@ -82,7 +84,7 @@ tpm2_cipher_freectx(void *ctx)
82
84
if (cctx == NULL )
83
85
return ;
84
86
85
- Esys_FlushContext ( cctx -> esys_ctx , cctx -> object );
87
+ tpm2_esys_flush_context ( cctx -> esys_lock , cctx -> esys_ctx , cctx -> object );
86
88
OPENSSL_clear_free (cctx -> ivector , sizeof (TPM2B_IV ));
87
89
88
90
OPENSSL_clear_free (cctx , sizeof (TPM2_CIPHER_CTX ));
@@ -127,18 +129,21 @@ tpm2_load_external_key(TPM2_CIPHER_CTX *cctx, ESYS_TR parent,
127
129
TPM2B_PUBLIC * keyPublic = NULL ;
128
130
TPM2B_PRIVATE * keyPrivate = NULL ;
129
131
132
+ if (!tpm2_semaphore_lock (cctx -> esys_lock ))
133
+ return 0 ;
130
134
/* older TPM2 chips do not support Esys_CreateLoaded */
131
135
r = Esys_Create (cctx -> esys_ctx , parent ,
132
136
ESYS_TR_PASSWORD , ESYS_TR_NONE , ESYS_TR_NONE ,
133
137
& inSensitive , & inPublic , & outside_info , & creation_pcr ,
134
138
& keyPrivate , & keyPublic , NULL , NULL , NULL );
135
- TPM2_CHECK_RC (cctx -> core , r , TPM2_ERR_CANNOT_CREATE_KEY , return 0 );
136
-
137
- r = Esys_Load (cctx -> esys_ctx , parent ,
138
- ESYS_TR_PASSWORD , ESYS_TR_NONE , ESYS_TR_NONE ,
139
- keyPrivate , keyPublic , & cctx -> object );
140
- free (keyPublic );
141
- free (keyPrivate );
139
+ if (!r ) {
140
+ r = Esys_Load (cctx -> esys_ctx , parent ,
141
+ ESYS_TR_PASSWORD , ESYS_TR_NONE , ESYS_TR_NONE ,
142
+ keyPrivate , keyPublic , & cctx -> object );
143
+ free (keyPublic );
144
+ free (keyPrivate );
145
+ }
146
+ tpm2_semaphore_unlock (cctx -> esys_lock );
142
147
TPM2_CHECK_RC (cctx -> core , r , TPM2_ERR_CANNOT_CREATE_KEY , return 0 );
143
148
144
149
return 1 ;
@@ -158,12 +163,13 @@ tpm2_cipher_init(TPM2_CIPHER_CTX *cctx,
158
163
DBG ("CIPHER %sCRYPT_INIT load key %zu bytes\n" ,
159
164
cctx -> decrypt ? "DE" : "EN" , keylen );
160
165
161
- if (!tpm2_build_primary (cctx -> core , cctx -> esys_ctx , cctx -> capability .algorithms ,
166
+ if (!tpm2_build_primary (cctx -> core , cctx -> esys_lock , cctx -> esys_ctx ,
167
+ cctx -> capability .algorithms ,
162
168
ESYS_TR_RH_NULL , NULL , & parent ))
163
169
return 0 ;
164
170
165
171
res = tpm2_load_external_key (cctx , parent , key , keylen );
166
- Esys_FlushContext ( cctx -> esys_ctx , parent );
172
+ tpm2_esys_flush_context ( cctx -> esys_lock , cctx -> esys_ctx , parent );
167
173
if (!res )
168
174
return 0 ;
169
175
}
@@ -212,6 +218,8 @@ encrypt_decrypt(TPM2_CIPHER_CTX *cctx,
212
218
{
213
219
TSS2_RC r ;
214
220
221
+ if (!tpm2_semaphore_lock (cctx -> esys_lock ))
222
+ return 0 ;
215
223
r = Esys_EncryptDecrypt2 (cctx -> esys_ctx , cctx -> object ,
216
224
ESYS_TR_PASSWORD , ESYS_TR_NONE , ESYS_TR_NONE ,
217
225
& cctx -> buffer , cctx -> decrypt , TPM2_ALG_NULL ,
@@ -222,6 +230,7 @@ encrypt_decrypt(TPM2_CIPHER_CTX *cctx,
222
230
cctx -> decrypt , TPM2_ALG_NULL , cctx -> ivector ,
223
231
& cctx -> buffer , outbuff , ivector );
224
232
}
233
+ tpm2_semaphore_unlock (cctx -> esys_lock );
225
234
226
235
return r ;
227
236
}
0 commit comments