#ifndef __VK_DATA_STRUCT_H__
#define __VK_DATA_STRUCT_H__

#include <stdint.h>
#include "vk_constants.h"

typedef struct item_meta {
	uint16_t type;
	uint16_t len;
} item_meta_t;

typedef struct preload_raw  {
	uint32_t    preload_size;
	uint8_t     preload_data[MAX_VAULT_LEN];
} preload_raw_t;

typedef struct req_to_ta {
	uint32_t        cmd_no;
	uint32_t        cmd_id;
	uint8_t         client_name[MAX_CLIENT_NAME_LEN];
	uint8_t         vault_name[MAX_VAULT_NAME_LEN];
	uint32_t        msg_size;
	uint8_t         msg[MAX_CLIENT_MSG_LEN];
	preload_raw_t   preload_steady;
	uint8_t         device_property[VAULT_SINGLE_BLOCK_LEN];
} req_to_ta_t;

typedef struct req_access_raw  {
	uint32_t    need_to_update;
	uint32_t    req_data_size;
	uint8_t     req_data[MAX_VAULT_LEN];
	uint32_t    need_to_update_2nd;
	uint32_t    req_data_size_2nd;
	uint8_t     req_data_2nd[MAX_VAULT_LEN];
} req_access_raw_t;

typedef struct rsp_from_ta {
	uint32_t            cmd_no;
	int32_t             ret;
	uint32_t            cmd_id;
	uint8_t             client_name[MAX_CLIENT_NAME_LEN];
	uint8_t             vault_name[MAX_VAULT_NAME_LEN];
	uint32_t            msg_size;
	uint8_t             msg[MAX_CLIENT_MSG_LEN];
	uint8_t             err_msg[MAX_ERROR_MSG_LEN];
	req_access_raw_t    req_steady; // Only to access in Steady
} rsp_from_ta_t;

typedef struct cmd_req {
	uint32_t    cmd_id;
	uint32_t    vtab_index;
	uint8_t     unsheltered[MAX_UNSHELTERED_DATA_LEN];
	uint32_t    unsheltered_len;
	uint8_t     key[VAULT_KEY_LEN];
	uint8_t     privated[VAULT_KEY_LEN];
	uint8_t*    auth_msg;
	uint32_t    auth_msg_len;
	uint8_t     hmac[HMAC_SHA256_LEN];
	uint8_t     vault_nonce[VAULT_NONCE_LEN];
	uint8_t*    sheltered;
	uint32_t    sheltered_len;
	uint8_t*    server_cert;
	uint32_t    server_cert_len;
	uint8_t     rsa_signature[RSA2048_SIGNATURE_LEN];
	uint32_t    rsa_signature_len;
	uint8_t*    preload;
	uint32_t    preload_size;
	uint32_t    entire_vault_size;
	uint32_t    client_code;
	uint32_t    vault_level;
	uint8_t     random_iv[AES_IV_LEN];
	uint8_t     device_property[VAULT_SINGLE_BLOCK_LEN];
} cmd_req_t;

typedef struct cmd_rsp {
	uint32_t            ret;
	uint32_t            cmd_id;
	req_access_raw_t    req_steady;
	uint32_t            msg_len;
	uint8_t             msg[MAX_CLIENT_MSG_LEN];
} cmd_rsp_t;

typedef struct unsheltered_vault {
	uint8_t     unsheltered_data[MAX_UNSHELTERED_DATA_LEN];
	uint32_t    sheltered_data_size;
	uint32_t    client_code;
	uint8_t     iv[AES_IV_LEN];
	uint8_t     reserved_iv[AES_IV_RESERVED];
	uint8_t     tag[AES_GCM_TAG_LEN];
	uint8_t     reserved_tag[AES_GCM_TAG_RESERVED];
	uint8_t     reserved[UNSHELTERED_RESERVED];
	uint8_t     meta[VAULT_META_LEN];
	uint8_t     hash[SHA256_DIGEST_LEN];
} unsvault_t;

typedef struct sheltered_vault {
	uint8_t     key[VAULT_KEY_LEN];
	uint8_t     privated[VAULT_KEY_LEN];
	uint8_t     reserved[SHELTERED_RESERVED];
	uint8_t     sheltered_data[MAX_SHELTERED_DATA_LEN];
} svault_t;

typedef struct vault_structure {
	unsvault_t  unsheltered;
	svault_t    sheltered;
} vault_t;

typedef struct encrypt_msg {
	uint32_t    len;
	uint8_t     msg[MAX_VAULT_LEN];
} encrypt_msg_t;

typedef struct cp_prov_msg {
	uint8_t     hmac[SHA256_DIGEST_LEN];
	uint32_t    cmd_id;
	uint8_t     nonceCP[VAULT_NONCE_LEN];
	uint8_t     key[AES256_KEY_LEN];
} cp_prov_msg_t;

typedef struct cp_rw_msg {
	uint32_t    cmd_id;
	uint8_t     nonceCP[VAULT_NONCE_LEN];
	uint8_t     nonceVK[VAULT_NONCE_LEN];
	uint32_t    data_size;
	uint32_t    data_offset;
	uint8_t     data[MAX_VAULT_LEN];
} cp_rw_msg_t;

typedef struct cp_sensitive_msg {
	uint32_t    cmd_id;
	uint8_t     nonceCP[VAULT_NONCE_LEN];
	uint8_t     nonceVK[VAULT_NONCE_LEN];
	uint32_t    sensitive_type;
} cp_sbox_msg_t;

// ref. https://mobilerndhub.sec.samsung.net/wiki/display/DE/Preparing+for+service
typedef struct vk_device_info {
	uint8_t factory_binary;
	uint8_t development_device;
	uint8_t binary_build_type;
	uint8_t first_api_level;
	uint8_t sdk_version;
	uint8_t vek_integrity;
	uint8_t custom_kernel;
	uint8_t ap_serial_integrity;
	uint8_t rpmb_key_provisioning; // !!! index 8
	uint8_t binary_ver_history[MAX_BUILD_VER_FIELD_LEN];
	uint8_t vek_hash[SHA256_DIGEST_LEN];
	uint8_t ap_serial_no[AP_SN_LEN];
	uint8_t vk_id[VK_ID_LEN];
	char client_crypto_context[MAX_CRYPTO_CONTEXT_LEN];
} vk_device_info_t;

#endif // __VK_DATA_STRUCT_H__
