@@ -204,23 +204,23 @@ Esys_CreatePrimary_Async(ESYS_CONTEXT *esysContext,
204204 r = iesys_adapt_auth_value (& esysContext -> crypto_backend ,
205205 & esysContext -> in .CreatePrimary .inSensitive -> sensitive .userAuth ,
206206 inPublic -> publicArea .nameAlg );
207- return_state_if_error (r , ESYS_STATE_INIT , "Adapt auth value." );
207+ goto_state_if_error (r , ESYS_STATE_INIT , "Adapt auth value." , error_cleanup );
208208 }
209209
210210 /* Retrieve the metadata objects for provided handles */
211211 r = esys_GetResourceObject (esysContext , primaryHandle , & primaryHandleNode );
212- return_state_if_error (r , ESYS_STATE_INIT , "primaryHandle unknown." );
212+ goto_state_if_error (r , ESYS_STATE_INIT , "primaryHandle unknown." , error_cleanup );
213213
214214 /* Initial invocation of SAPI to prepare the command buffer with parameters */
215215 r = Tss2_Sys_CreatePrimary_Prepare (
216216 esysContext -> sys ,
217217 (primaryHandleNode == NULL ) ? TPM2_RH_NULL : primaryHandleNode -> rsrc .handle ,
218218 esysContext -> in .CreatePrimary .inSensitive , inPublic , outsideInfo , creationPCR );
219- return_state_if_error (r , ESYS_STATE_INIT , "SAPI Prepare returned error." );
219+ goto_state_if_error (r , ESYS_STATE_INIT , "SAPI Prepare returned error." , error_cleanup );
220220
221221 /* Calculate the cpHash Values */
222222 r = init_session_tab (esysContext , shandle1 , shandle2 , shandle3 );
223- return_state_if_error (r , ESYS_STATE_INIT , "Initialize session resources" );
223+ goto_state_if_error (r , ESYS_STATE_INIT , "Initialize session resources" , error_cleanup );
224224 if (primaryHandleNode != NULL )
225225 iesys_compute_session_value (esysContext -> session_tab [0 ], & primaryHandleNode -> rsrc .name ,
226226 & primaryHandleNode -> auth );
@@ -232,12 +232,12 @@ Esys_CreatePrimary_Async(ESYS_CONTEXT *esysContext,
232232
233233 /* Generate the auth values and set them in the SAPI command buffer */
234234 r = iesys_gen_auths (esysContext , primaryHandleNode , NULL , NULL , & auths );
235- return_state_if_error (r , ESYS_STATE_INIT , "Error in computation of auth values" );
235+ goto_state_if_error (r , ESYS_STATE_INIT , "Error in computation of auth values" , error_cleanup );
236236
237237 esysContext -> authsCount = auths .count ;
238238 if (auths .count > 0 ) {
239239 r = Tss2_Sys_SetCmdAuths (esysContext -> sys , & auths );
240- return_state_if_error (r , ESYS_STATE_INIT , "SAPI error on SetCmdAuths" );
240+ goto_state_if_error (r , ESYS_STATE_INIT , "SAPI error on SetCmdAuths" , error_cleanup );
241241 }
242242
243243 /* Trigger execution and finish the async invocation */
@@ -247,6 +247,12 @@ Esys_CreatePrimary_Async(ESYS_CONTEXT *esysContext,
247247 esysContext -> state = ESYS_STATE_SENT ;
248248
249249 return r ;
250+
251+ error_cleanup :
252+ secure_mem_zero ((void * )& esysContext -> in .CreatePrimary .inSensitiveData ,
253+ sizeof (TPM2B_SENSITIVE_CREATE ));
254+
255+ return r ;
250256}
251257
252258/** Asynchronous finish function for TPM2_CreatePrimary
@@ -368,19 +374,19 @@ Esys_CreatePrimary_Finish(ESYS_CONTEXT *esysContext,
368374 if (esysContext -> submissionCount ++ >= ESYS_MAX_SUBMISSIONS ) {
369375 LOG_WARNING ("Maximum number of (re)submissions has been reached." );
370376 esysContext -> state = ESYS_STATE_INIT ;
371- goto error_cleanup ;
377+ goto cleanup ;
372378 }
373379 esysContext -> state = ESYS_STATE_RESUBMISSION ;
374380 r = Tss2_Sys_ExecuteAsync (esysContext -> sys );
375381 if (r != TSS2_RC_SUCCESS ) {
376382 LOG_WARNING ("Error attempting to resubmit" );
377383 /* We do not set esysContext->state here but inherit the most recent
378384 * state of the _async function. */
379- goto error_cleanup ;
385+ goto cleanup ;
380386 }
381387 r = TSS2_ESYS_RC_TRY_AGAIN ;
382388 LOG_DEBUG ("Resubmission initiated and returning RC_TRY_AGAIN." );
383- goto error_cleanup ;
389+ goto cleanup ;
384390 }
385391 /* The following is the "regular error" handling. */
386392 if (iesys_tpm_error (r )) {
@@ -426,11 +432,16 @@ Esys_CreatePrimary_Finish(ESYS_CONTEXT *esysContext,
426432 else
427433 SAFE_FREE (loutPublic );
428434
435+ secure_mem_zero ((void * )& esysContext -> in .CreatePrimary .inSensitiveData ,
436+ sizeof (TPM2B_SENSITIVE_CREATE ));
429437 esysContext -> state = ESYS_STATE_INIT ;
430438
431439 return TSS2_RC_SUCCESS ;
432440
433441error_cleanup :
442+ secure_mem_zero ((void * )& esysContext -> in .CreatePrimary .inSensitiveData ,
443+ sizeof (TPM2B_SENSITIVE_CREATE ));
444+ cleanup :
434445 Esys_TR_Close (esysContext , objectHandle );
435446 SAFE_FREE (loutPublic );
436447 if (creationData != NULL )
0 commit comments