// This file was extracted from the TCG Published
// Trusted Platform Module Library
// Part 4: Supporting Routines
// Family "2.0"
// Level 00 Revision 01.16
// October 30, 2014

#include <stdlib.h>

#include "CryptoEngine.h"
#include "OsslCryptoEngine.h"
static void Trap(const char *function, int line, int code);
FAIL_FUNCTION       TpmFailFunction = (FAIL_FUNCTION)&Trap;
//
//
//          Functions
//
//          FAILURE_TRAP()
//
//     This function is called if the caller to _cpri__InitCryptoUnits() doesn't provide a call back address.
//
static void
Trap(
     const char          *function,
     int                  line,
     int                  code
     )
{
     UNREFERENCED(function);
     UNREFERENCED(line);
     UNREFERENCED(code);
     abort();
}
//
//
//          _cpri__InitCryptoUnits()
//
//     This function calls the initialization functions of the other crypto modules that are part of the crypto engine
//     for this implementation. This function should be called as a result of _TPM_Init(). The parameter to this
//     function is a call back function it TPM.lib that is called when the crypto engine has a failure.
//
LIB_EXPORT CRYPT_RESULT
_cpri__InitCryptoUnits(
     FAIL_FUNCTION        failFunction
     )
{
   TpmFailFunction = failFunction;
   _cpri__RngStartup();
   _cpri__HashStartup();
   _cpri__SymStartup();
#ifdef TPM_ALG_RSA
   _cpri__RsaStartup();
#endif
#ifdef TPM_ALG_ECC
   _cpri__EccStartup();
#endif
   return CRYPT_SUCCESS;
}
//
//
//          _cpri__StopCryptoUnits()
//
//     This function calls the shutdown functions of the other crypto modules that are part of the crypto engine
//     for this implementation.
//
LIB_EXPORT void
_cpri__StopCryptoUnits(
   void
   )
{
   return;
}
//
//
//          _cpri__Startup()
//
//     This function calls the startup functions of the other crypto modules that are part of the crypto engine for
//     this implementation. This function should be called during processing of TPM2_Startup().
//
LIB_EXPORT BOOL
_cpri__Startup(
   void
   )
{
   return(       _cpri__HashStartup()
              && _cpri__RngStartup()
#ifdef     TPM_ALG_RSA
              && _cpri__RsaStartup()
#endif     // TPM_ALG_RSA
#ifdef     TPM_ALG_ECC
              && _cpri__EccStartup()
#endif     // TPM_ALG_ECC
              && _cpri__SymStartup());
}