#ifndef __VK_INTERFACE_H__
#define __VK_INTERFACE_H__

#include "vk_constants.h"

#ifdef VK_SWD_QSEE
#include "vkqsee_rpmb.h"
#include "vkqsee_crypto.h"
#include "vkqsee_fuse.h"

#define VK_READ_VAULT                    vkqsee_read_vault
#define VK_WRITE_VAULT                   vkqsee_write_vault
#define VK_READ_NONCE                    vkqsee_read_nonce
#define VK_WRITE_NONCE                   vkqsee_write_nonce
#define VK_GET_SECURE_ITEM               vkqsee_get_secure_item
#define VK_MEMORY_ALLOC                  vkqsee_memory_alloc
#define VK_MEMORY_FREE                   vkqsee_memory_free
#define VK_CHECK_RPMB_KEY_PROVISIONING   vkqsee_check_rpmb_key_provisioning
#define VK_BLOW_OTP_FUSE                 vkqsee_blow_otp_fuse
#define VK_READ_OTP_FUSE                 vkqsee_read_otp_fuse
#define VK_CHECK_CUSTOM_KERNEL           vkqsee_check_custom_kernel
#define VK_WRAP_SECURE_OBJECT            vkqsee_wrap_secure_object

#elif VK_SWD_KINIBI
#include "vkkinibi_rpmb.h"
#include "vkkinibi_crypto.h"
#include "vkkinibi_fuse.h"

#define VK_READ_VAULT                    vkkinibi_read_vault
#define VK_WRITE_VAULT                   vkkinibi_write_vault
#define VK_READ_NONCE                    vkkinibi_read_nonce
#define VK_WRITE_NONCE                   vkkinibi_write_nonce
#define VK_GET_SECURE_ITEM               vkkinibi_get_secure_item
#define VK_MEMORY_ALLOC                  vkkinibi_memory_alloc
#define VK_MEMORY_FREE                   vkkinibi_memory_free
#define VK_CHECK_RPMB_KEY_PROVISIONING   vkkinibi_check_rpmb_key_provisioning
#define VK_BLOW_OTP_FUSE                 vkkinibi_blow_otp_fuse
#define VK_READ_OTP_FUSE                 vkkinibi_read_otp_fuse
#define VK_CHECK_CUSTOM_KERNEL           vkkinibi_check_custom_kernel
#define VK_WRAP_SECURE_OBJECT            vkkinibi_wrap_secure_object

#elif VK_SWD_TEEGRIS
#include "vkteegris_rpmb.h"
#include "vkteegris_crypto.h"
#include "vkteegris_fuse.h"

#define VK_READ_VAULT                    vkteegris_read_vault
#define VK_WRITE_VAULT                   vkteegris_write_vault
#define VK_READ_NONCE                    vkteegris_read_nonce
#define VK_WRITE_NONCE                   vkteegris_write_nonce
#define VK_GET_SECURE_ITEM               vkteegris_get_secure_item
#define VK_MEMORY_ALLOC                  vkteegris_memory_alloc
#define VK_MEMORY_FREE                   vkteegris_memory_free
#define VK_CHECK_RPMB_KEY_PROVISIONING   vkteegris_check_rpmb_key_provisioning
#define VK_BLOW_OTP_FUSE                 vkteegris_blow_otp_fuse
#define VK_READ_OTP_FUSE                 vkteegris_read_otp_fuse
#define VK_CHECK_CUSTOM_KERNEL           vkteegris_check_custom_kernel
#define VK_WRAP_SECURE_OBJECT            vkteegris_wrap_secure_object

#else

// Not support Normal World Solution

#endif

typedef int (*client_op)();
typedef int (*vault_op)();
typedef int (*platform_op)();

typedef struct {
	client_op registered;
	client_op initialize;
	client_op check_initialized;
	client_op destroy;
	client_op read_sheltered;
	client_op read_unsheltered;
	client_op write_sheltered;
	client_op write_unsheltered;
	client_op check_cert_chain;
	client_op get_nonce;
	client_op get_wb;
	client_op get_emtoken;
	client_op encrypt_msg;
	client_op migration;
	client_op check_migration;
	client_op read_sbox;
	client_op check_data_writable;
	client_op generate_hotp_code;
	const unsigned char* ca_pubkey;
	uint32_t ca_pubkey_size;
	const unsigned char* rawServiceRootCA_cert;
	uint32_t rawServiceRootCA_cert_size;
	char crypto_context[MAX_CRYPTO_CONTEXT_LEN];
} client_op_t;

typedef struct {
	uint32_t vtab_index;
	vault_op read_entire_vault;
	vault_op write_entire_vault;
	vault_op read_unsheltered_vault;
	vault_op write_unsheltered_vault;
	vault_op write_unsheltered_data;
	vault_op make_hmac;
	vault_op read_meta;
} vault_op_t;

typedef struct {
	platform_op write;
	platform_op read;
	platform_op read_nonce;
	platform_op write_nonce;
	platform_op bring_up;
	platform_op memory_alloc;
	platform_op memory_free;
	platform_op check_rpmb_key_provisioning;
	platform_op blow_otp_fuse;
	platform_op read_otp_fuse;
	platform_op get_secure_item;
	platform_op check_custom_kernel;
	platform_op wrap_secure_object;
} platform_op_t;

typedef struct {
	client_op_t client;
	vault_op_t vault;
	platform_op_t platform;
} target_t;

#endif // __VK_INTERFACE_H__
