diff options
Diffstat (limited to 'src/tss2-esys/api/Esys_StartAuthSession.c')
-rw-r--r-- | src/tss2-esys/api/Esys_StartAuthSession.c | 37 |
1 files changed, 12 insertions, 25 deletions
diff --git a/src/tss2-esys/api/Esys_StartAuthSession.c b/src/tss2-esys/api/Esys_StartAuthSession.c index ece92fb6..f7022e5f 100644 --- a/src/tss2-esys/api/Esys_StartAuthSession.c +++ b/src/tss2-esys/api/Esys_StartAuthSession.c @@ -204,7 +204,7 @@ Esys_StartAuthSession_Async( return r; esysContext->state = _ESYS_STATE_INTERNALERROR; - /* Check and store input parameters */ + /* Check input parameters */ r = check_session_feasibility(shandle1, shandle2, shandle3, 0); return_state_if_error(r, _ESYS_STATE_INIT, "Check session usage"); store_input_parameters(esysContext, tpmKey, bind, nonceCaller, sessionType, @@ -319,7 +319,8 @@ Esys_StartAuthSession_Finish( } /* Check for correct sequence and set sequence to irregular for now */ - if (esysContext->state != _ESYS_STATE_SENT) { + if (esysContext->state != _ESYS_STATE_SENT && + esysContext->state != _ESYS_STATE_RESUBMISSION) { LOG_ERROR("Esys called in bad sequence."); return TSS2_ESYS_RC_BAD_SEQUENCE; } @@ -338,18 +339,13 @@ Esys_StartAuthSession_Finish( IESYS_RESOURCE *rsrc = &sessionHandleNode->rsrc; rsrc->handle = ESYS_TR_NONE; - rsrc->misc.rsrc_session.sessionAttributes = - TPMA_SESSION_CONTINUESESSION; - rsrc->misc.rsrc_session.sessionType = - esysContext->in.StartAuthSession.sessionType; - rsrc->misc.rsrc_session.authHash = - esysContext->in.StartAuthSession.authHash; - rsrc->misc.rsrc_session.symmetric = - *esysContext->in.StartAuthSession.symmetric; - rsrc->misc.rsrc_session.nonceCaller = - esysContext->in.StartAuthSession.nonceCallerData; - - /*Receive the TPM response and handle resubmissions if necessary. */ + rsrc->misc.rsrc_session.sessionAttributes = TPMA_SESSION_CONTINUESESSION; + rsrc->misc.rsrc_session.sessionType = esysContext->in.StartAuthSession.sessionType; + rsrc->misc.rsrc_session.authHash = esysContext->in.StartAuthSession.authHash; + rsrc->misc.rsrc_session.symmetric = *esysContext->in.StartAuthSession.symmetric; + rsrc->misc.rsrc_session.nonceCaller = esysContext->in.StartAuthSession.nonceCallerData; + + /* Receive the TPM response and handle resubmissions if necessary. */ r = Tss2_Sys_ExecuteFinish(esysContext->sys, esysContext->timeout); if ((r & ~TSS2_RC_LAYER_MASK) == TSS2_BASE_RC_TRY_AGAIN) { LOG_DEBUG("A layer below returned TRY_AGAIN: %" PRIx32, r); @@ -361,22 +357,13 @@ Esys_StartAuthSession_Finish( if (r == TPM2_RC_RETRY || r == TPM2_RC_TESTING || r == TPM2_RC_YIELDED) { LOG_DEBUG("TPM returned RETRY, TESTING or YIELDED, which triggers a " "resubmission: %" PRIx32, r); - if (esysContext->submissionCount >= _ESYS_MAX_SUBMISSIONS) { + if (esysContext->submissionCount++ >= _ESYS_MAX_SUBMISSIONS) { LOG_WARNING("Maximum number of (re)submissions has been reached."); esysContext->state = _ESYS_STATE_INIT; goto error_cleanup; } esysContext->state = _ESYS_STATE_RESUBMISSION; - r = Esys_StartAuthSession_Async(esysContext, - esysContext->in.StartAuthSession.tpmKey, - esysContext->in.StartAuthSession.bind, - esysContext->session_type[0], - esysContext->session_type[1], - esysContext->session_type[2], - esysContext->in.StartAuthSession.nonceCaller, - esysContext->in.StartAuthSession.sessionType, - esysContext->in.StartAuthSession.symmetric, - esysContext->in.StartAuthSession.authHash); + r = Tss2_Sys_ExecuteAsync(esysContext->sys); if (r != TSS2_RC_SUCCESS) { LOG_WARNING("Error attempting to resubmit"); /* We do not set esysContext->state here but inherit the most recent |