// 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 "CryptoEngine.h"
#include "OsslCryptoEngine.h"
static void Trap(const char *function, int line, int code);
FAIL_FUNCTION       TpmFailFunction = (FAIL_FUNCTION)&Trap;
//
//
//          Functions
//
//          TpmFail()
//
//     This is a shim function that is called when a failure occurs. It simply relays the call to the callback pointed
//     to by TpmFailFunction(). It is only defined for the sake of NO_RETURN specifier that cannot be added to
//     a function pointer with some compilers.
//
void
TpmFail(
     const char               *function,
     int                       line,
     int                       code)
{
     TpmFailFunction(function, line, code);
}
//
//
//          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());
}
