text: /* SPDX-License-Identifier: BSD-2-Clause */
  /***********************************************************************;
   * Copyright (c) 2015 - 2017, Intel Corporation
   * All rights reserved.
   ***********************************************************************/
  
  #ifdef HAVE_CONFIG_H
  #include <config.h>
  #endif
  
  #include "tss2_tpm2_types.h"
  #include "tss2_mu.h"
  #include "sysapi_util.h"
  
  TSS2_RC Tss2_Sys_SequenceComplete_Prepare(
      TSS2_SYS_CONTEXT *sysContext,
      TPMI_DH_OBJECT sequenceHandle,
      const TPM2B_MAX_BUFFER *buffer,
      TPMI_RH_HIERARCHY hierarchy)
  {
      _TSS2_SYS_CONTEXT_BLOB *ctx = syscontext_cast(sysContext);
      TSS2_RC rval;
  
      if (!ctx)
          return TSS2_SYS_RC_BAD_REFERENCE;
  
      rval = CommonPreparePrologue(ctx, TPM2_CC_SequenceComplete);
      if (rval)
          return rval;
  
      rval = Tss2_MU_UINT32_Marshal(sequenceHandle, ctx->cmdBuffer,
                                    ctx->maxCmdSize,
                                    &ctx->nextData);
      if (rval)
          return rval;
  
      if (!buffer) {
          ctx->decryptNull = 1;
  
          rval = Tss2_MU_UINT16_Marshal(0, ctx->cmdBuffer,
                                        ctx->maxCmdSize,
                                        &ctx->nextData);
      } else {
  
          rval = Tss2_MU_TPM2B_MAX_BUFFER_Marshal(buffer, ctx->cmdBuffer,
                                                  ctx->maxCmdSize,
                                                  &ctx->nextData);
      }
  
      if (rval)
          return rval;
  
      rval = Tss2_MU_UINT32_Marshal(hierarchy, ctx->cmdBuffer,
                                    ctx->maxCmdSize,
                                    &ctx->nextData);
      if (rval)
          return rval;
  
      ctx->decryptAllowed = 1;
      ctx->encryptAllowed = 1;
      ctx->authAllowed = 1;
  
      return CommonPrepareEpilogue(ctx);
  }
  
  TSS2_RC Tss2_Sys_SequenceComplete_Complete(
      TSS2_SYS_CONTEXT *sysContext,
      TPM2B_DIGEST *result,
      TPMT_TK_HASHCHECK *validation)
  {
      _TSS2_SYS_CONTEXT_BLOB *ctx = syscontext_cast(sysContext);
      TSS2_RC rval;
  
      if (!ctx)
          return TSS2_SYS_RC_BAD_REFERENCE;
  
      rval = CommonComplete(ctx);
      if (rval)
          return rval;
  
      rval = Tss2_MU_TPM2B_DIGEST_Unmarshal(ctx->cmdBuffer,
                                            ctx->maxCmdSize,
                                            &ctx->nextData, result);
      if (rval)
          return rval;
  
      return Tss2_MU_TPMT_TK_HASHCHECK_Unmarshal(ctx->cmdBuffer,
                                                 ctx->maxCmdSize,
                                                 &ctx->nextData, validation);
  }
  
  TSS2_RC Tss2_Sys_SequenceComplete(
      TSS2_SYS_CONTEXT *sysContext,
      TPMI_DH_OBJECT sequenceHandle,
      TSS2L_SYS_AUTH_COMMAND const *cmdAuthsArray,
      const TPM2B_MAX_BUFFER *buffer,
      TPMI_RH_HIERARCHY hierarchy,
      TPM2B_DIGEST *result,
      TPMT_TK_HASHCHECK *validation,
      TSS2L_SYS_AUTH_RESPONSE *rspAuthsArray)
  {
      _TSS2_SYS_CONTEXT_BLOB *ctx = syscontext_cast(sysContext);
      TSS2_RC rval;
  
      rval = Tss2_Sys_SequenceComplete_Prepare(sysContext, sequenceHandle,
                                               buffer, hierarchy);
      if (rval)
          return rval;
  
      rval = CommonOneCall(ctx, cmdAuthsArray, rspAuthsArray);
      if (rval)
          return rval;
  
      return Tss2_Sys_SequenceComplete_Complete(sysContext, result, validation);
  }
  