#ifndef _ECC256_H_
#define _ECC256_H_

#include "sgx_tcrypto.h"

typedef void* ecc_state_handle_t;
typedef void* sha_state_handle_t;

#ifdef __cplusplus
extern "C" {
#endif

	int ecc256_open_context(ecc_state_handle_t* p_ecc_handle);
	void ecc256_close_context(ecc_state_handle_t ecc_handle);
	int ecc256_create_key_pair(sgx_ec256_private_t *p_private, sgx_ec256_public_t *p_public, ecc_state_handle_t ecc_handle);
	int ecc256_compute_shared_dhkey(const sgx_ec256_private_t *p_private_b, const sgx_ec256_public_t *p_public_ga, sgx_ec256_dh_shared_t *p_shared_key, ecc_state_handle_t ecc_handle);

	int cmac128(const sgx_cmac_128bit_key_t *p_key, const uint8_t *p_src, uint32_t src_len, sgx_cmac_128bit_tag_t *p_mac);

	int sha256_digest(const uint8_t *p_src, uint32_t src_len, sgx_sha256_hash_t *p_hash);
	int sha256_init(sha_state_handle_t* p_sha_handle);
	int sha256_update(const uint8_t *p_src, uint32_t src_len, sha_state_handle_t sha_handle);
	int sha256_finish(sha_state_handle_t sha_handle, sgx_sha256_hash_t *p_hash);
	void sha256_close(sha_state_handle_t sha_handle);

	int aes_gcm_encrypt(const sgx_aes_gcm_128bit_key_t *p_key, const uint8_t *p_src, uint32_t src_len,
                    uint8_t *p_dst, const uint8_t *p_iv, uint32_t iv_len, const uint8_t *p_aad, uint32_t aad_len,
                    sgx_aes_gcm_128bit_tag_t *p_out_mac);
	int aes_gcm_decrypt(const sgx_aes_gcm_128bit_key_t *p_key, const uint8_t *p_src, uint32_t src_len, 
                    uint8_t *p_dst, const uint8_t *p_iv, uint32_t iv_len, const uint8_t *p_aad, uint32_t aad_len, 
                    const sgx_aes_gcm_128bit_tag_t *p_in_mac);
	int ecdsa_sign(const uint8_t *p_data,
               uint32_t data_size,
               const sgx_ec256_private_t *p_private,
               sgx_ec256_signature_t *p_signature,
               ecc_state_handle_t ecc_handle);

#ifdef __cplusplus
}
#endif

#endif