#ifndef EM_CRYPTO_H
#define EM_CRYPTO_H

int em_crypto_sha256(const unsigned char *data, const unsigned int len_data, unsigned char *digest);
int em_crypto_hmac(unsigned char *hmac, const unsigned char *data, const unsigned int len_data,
		   const unsigned char *key, const unsigned int len_key);
int em_crypto_aes_256_gcm_encrypt(unsigned char const *plaintext, const unsigned int len_plaintext,
				  unsigned char *ciphertext, unsigned int *len_ciphertext, const unsigned char *key,
				  const unsigned int len_key, const unsigned char *iv, const unsigned int len_iv,
				  unsigned char *tag, unsigned int tag_len);
int em_crypto_aes_256_gcm_decrypt(const unsigned char *ciphertext, const unsigned int len_ciphertext,
				  unsigned char *plaintext, unsigned int *len_plaintext, const unsigned char *key,
				  const unsigned int len_key, const unsigned char *iv, const unsigned int len_iv,
				  unsigned char *tag, unsigned int len_tag);
int em_crypto_verify_rsa_signature(const unsigned char *cert, const unsigned int len_cert, const unsigned char *sig,
				   const unsigned int len_sig, const unsigned char *data, const unsigned int len_data);
int em_crypto_aes_256_ctr_encrypt(const uint8_t *plaintext, const int len_plaintext, const uint8_t *key,
				  const uint8_t *iv, uint8_t *ciphertext, int *len_ciphertext);
int em_crypto_aes_256_ctr_decrypt(const uint8_t *ciphertext, const int len_ciphertext, const uint8_t *key,
				  const uint8_t *iv, uint8_t *plaintext, int *len_plaintext);
int em_crypto_rsa_encrypt(const uint8_t *cert, const int len_cert, const uint8_t *in, const int len_in, uint8_t *out,
			  int *len_out);
int em_crypto_get_subject_from_cert(const unsigned char *cert, const int len_cert, const char* type, char *out, int len_out);
int em_crypto_verify_recovery_data(const uint8_t *data, uint32_t offset, const uint8_t *source,
				   const uint32_t len_source, uint32_t *server_type);

#ifdef EM_SWD_TEEGRIS
#include <em_crypto_teegris.h>
#elif EM_SWD_QSEE
#include <em_crypto_qsee.h>
#elif EM_SWD_MOBICORE
#include <em_crypto_mobicore.h>
#endif

#endif
