@@ -20,6 +20,7 @@ typedef struct tpm2_tss2_decoder_ctx_st TPM2_TSS2_DECODER_CTX;
20
20
struct tpm2_tss2_decoder_ctx_st {
21
21
const OSSL_CORE_HANDLE * core ;
22
22
OSSL_LIB_CTX * libctx ;
23
+ tpm2_semaphore_t esys_lock ;
23
24
ESYS_CONTEXT * esys_ctx ;
24
25
TPM2_CAPABILITY capability ;
25
26
TPM2B_DIGEST parentAuth ;
@@ -42,6 +43,7 @@ tpm2_tss2_decoder_newctx(void *provctx)
42
43
43
44
dctx -> core = cprov -> core ;
44
45
dctx -> libctx = cprov -> libctx ;
46
+ dctx -> esys_lock = cprov -> esys_lock ;
45
47
dctx -> esys_ctx = cprov -> esys_ctx ;
46
48
dctx -> capability = cprov -> capability ;
47
49
return dctx ;
@@ -70,16 +72,19 @@ decode_privkey(TPM2_TSS2_DECODER_CTX *dctx, TPM2_PKEY *pkey,
70
72
71
73
if (pkey -> data .parent && pkey -> data .parent != TPM2_RH_OWNER ) {
72
74
DBG ("TSS2 DECODER LOAD parent: persistent 0x%x\n" , pkey -> data .parent );
73
- if (!tpm2_load_parent (pkey -> core , pkey -> esys_ctx ,
75
+ if (!tpm2_load_parent (pkey -> core , pkey -> esys_lock , pkey -> esys_ctx ,
74
76
pkey -> data .parent , & dctx -> parentAuth , & parent ))
75
77
goto error1 ;
76
78
} else {
77
79
DBG ("TSS2 DECODER LOAD parent: primary 0x%x\n" , TPM2_RH_OWNER );
78
- if (!tpm2_build_primary (pkey -> core , pkey -> esys_ctx , pkey -> capability .algorithms ,
80
+ if (!tpm2_build_primary (pkey -> core , pkey -> esys_lock , pkey -> esys_ctx ,
81
+ pkey -> capability .algorithms ,
79
82
ESYS_TR_RH_OWNER , & dctx -> parentAuth , & parent ))
80
83
goto error1 ;
81
84
}
82
85
86
+ if (!tpm2_semaphore_lock (pkey -> esys_lock ))
87
+ goto error1 ;
83
88
r = Esys_Load (pkey -> esys_ctx , parent ,
84
89
ESYS_TR_PASSWORD , ESYS_TR_NONE , ESYS_TR_NONE ,
85
90
& pkey -> data .priv , & pkey -> data .pub , & pkey -> object );
@@ -89,11 +94,15 @@ decode_privkey(TPM2_TSS2_DECODER_CTX *dctx, TPM2_PKEY *pkey,
89
94
else
90
95
Esys_FlushContext (pkey -> esys_ctx , parent );
91
96
97
+ tpm2_semaphore_unlock (pkey -> esys_lock );
92
98
TPM2_CHECK_RC (pkey -> core , r , TPM2_ERR_CANNOT_LOAD_KEY , goto error1 );
93
99
} else if (pkey -> data .privatetype == KEY_TYPE_HANDLE ) {
100
+ if (!tpm2_semaphore_lock (pkey -> esys_lock ))
101
+ goto error1 ;
94
102
r = Esys_TR_FromTPMPublic (pkey -> esys_ctx , pkey -> data .handle ,
95
103
ESYS_TR_NONE , ESYS_TR_NONE , ESYS_TR_NONE ,
96
104
& pkey -> object );
105
+ tpm2_semaphore_unlock (pkey -> esys_lock );
97
106
TPM2_CHECK_RC (pkey -> core , r , TPM2_ERR_CANNOT_LOAD_KEY , goto error1 );
98
107
} else {
99
108
TPM2_ERROR_raise (pkey -> core , TPM2_ERR_INPUT_CORRUPTED );
@@ -111,7 +120,10 @@ decode_privkey(TPM2_TSS2_DECODER_CTX *dctx, TPM2_PKEY *pkey,
111
120
}
112
121
userauth .size = plen ;
113
122
123
+ if (!tpm2_semaphore_lock (pkey -> esys_lock ))
124
+ goto error2 ;
114
125
r = Esys_TR_SetAuth (dctx -> esys_ctx , pkey -> object , & userauth );
126
+ tpm2_semaphore_unlock (pkey -> esys_lock );
115
127
TPM2_CHECK_RC (dctx -> core , r , TPM2_ERR_CANNOT_LOAD_KEY , goto error2 );
116
128
}
117
129
@@ -123,9 +135,9 @@ decode_privkey(TPM2_TSS2_DECODER_CTX *dctx, TPM2_PKEY *pkey,
123
135
return keytype ;
124
136
error2 :
125
137
if (pkey -> data .privatetype == KEY_TYPE_HANDLE )
126
- Esys_TR_Close ( pkey -> esys_ctx , & pkey -> object );
138
+ tpm2_esys_tr_close ( pkey -> esys_lock , pkey -> esys_ctx , & pkey -> object );
127
139
else
128
- Esys_FlushContext ( pkey -> esys_ctx , pkey -> object );
140
+ tpm2_esys_flush_context ( pkey -> esys_lock , pkey -> esys_ctx , pkey -> object );
129
141
error1 :
130
142
pkey -> object = ESYS_TR_NONE ;
131
143
return NULL ;
@@ -156,6 +168,7 @@ tpm2_tss2_decoder_decode(void *ctx, OSSL_CORE_BIO *cin, int selection,
156
168
goto error2 ;
157
169
158
170
pkey -> core = dctx -> core ;
171
+ pkey -> esys_lock = dctx -> esys_lock ;
159
172
pkey -> esys_ctx = dctx -> esys_ctx ;
160
173
pkey -> capability = dctx -> capability ;
161
174
pkey -> object = ESYS_TR_NONE ;
@@ -188,9 +201,9 @@ tpm2_tss2_decoder_decode(void *ctx, OSSL_CORE_BIO *cin, int selection,
188
201
error1 :
189
202
if (pkey -> object != ESYS_TR_NONE ) {
190
203
if (pkey -> data .privatetype == KEY_TYPE_HANDLE )
191
- Esys_TR_Close ( pkey -> esys_ctx , & pkey -> object );
204
+ tpm2_esys_tr_close ( pkey -> esys_lock , pkey -> esys_ctx , & pkey -> object );
192
205
else
193
- Esys_FlushContext ( pkey -> esys_ctx , pkey -> object );
206
+ tpm2_esys_flush_context ( pkey -> esys_lock , pkey -> esys_ctx , pkey -> object );
194
207
}
195
208
OPENSSL_clear_free (pkey , sizeof (TPM2_PKEY ));
196
209
return res ;
0 commit comments