// 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

#ifndef _OSSL_CRYPTO_ENGINE_H
#define _OSSL_CRYPTO_ENGINE_H
#include <openssl/aes.h>
#include <openssl/evp.h>
#include <openssl/sha.h>
#include <openssl/ec.h>
#include <openssl/rand.h>
#include <openssl/bn.h>
#define     CRYPTO_ENGINE
#include "CryptoEngine.h"
#include "CpriMisc_fp.h"
#define MAX_ECC_PARAMETER_BYTES 32
#define MAX_2B_BYTES MAX((MAX_RSA_KEY_BYTES * ALG_RSA),                              \
                         MAX((MAX_ECC_PARAMETER_BYTES * ALG_ECC),                   \
                             MAX_DIGEST_SIZE))
#define assert2Bsize(a) pAssert((a).size <= sizeof((a).buffer))
#ifdef TPM_ALG_RSA
#   ifdef   RSA_KEY_SIEVE
#       include     "RsaKeySieve.h"
#       include     "RsaKeySieve_fp.h"
#   endif
#   include    "CpriRSA_fp.h"
#endif

#ifdef OPENSSL_IS_BORINGSSL
// libtpm2 reads internal EVP_MD state (e.g. ctx_size). The boringssl headers
// don't expose this type so define it here.
struct env_md_st {
  /* type contains a NID identifing the digest function. (For example,
   * NID_md5.) */
  int type;

  /* md_size contains the size, in bytes, of the resulting digest. */
  unsigned md_size;

  /* flags contains the OR of |EVP_MD_FLAG_*| values. */
  uint32_t flags;

  /* init initialises the state in |ctx->md_data|. */
  void (*init)(EVP_MD_CTX *ctx);

  /* update hashes |len| bytes of |data| into the state in |ctx->md_data|. */
  void (*update)(EVP_MD_CTX *ctx, const void *data, size_t count);

  /* final completes the hash and writes |md_size| bytes of digest to |out|. */
  void (*final)(EVP_MD_CTX *ctx, uint8_t *out);

  /* block_size contains the hash's native block size. */
  unsigned block_size;

  /* ctx_size contains the size, in bytes, of the state of the hash function. */
  unsigned ctx_size;
};
#endif

//
//     This is a structure to hold the parameters for the version of KDFa() used by the CryptoEngine(). This
//     structure allows the state to be passed between multiple functions that use the same pseudo-random
//     sequence.
//
typedef struct {
   CPRI_HASH_STATE          iPadCtx;
   CPRI_HASH_STATE          oPadCtx;
   TPM2B                   *extra;
   UINT32                  *outer;
   TPM_ALG_ID               hashAlg;
   UINT16                   keySizeInBits;
} KDFa_CONTEXT;
#endif // _OSSL_CRYPTO_ENGINE_H