#ifndef TLC_SPAY_H_
#define TLC_SPAY_H_

#include <sys/types.h>
#include <unistd.h>

#define SPAY_TA_TYPE_INVALID					0x0000000
#define SPAY_TA_TYPE_VISA						0x0000001
#define SPAY_TA_TYPE_MASTER						0x0000002
#define SPAY_TA_TYPE_AMEX						0x0000003
#define SPAY_TA_TYPE_PLCC						0x0000004
#define SPAY_TA_TYPE_KRCC						0x0000005


#define SPAY_TA_TYPE_TUI						0x0000101

#define SPAY_MAX_ERROR_STR_LEN           		128
#define SPAY_MAX_MAGICNUM_SIZE					4

/* TLC return and error codes */
#define SPAY_SUCCESS                           	0x00000000
#define SPAY_INVALID_CTX                       	0x00000001
#define SPAY_CTX_INIT_FAILED                   	0x00000002
#define SPAY_INPUT_DATA_LENGTH_EXCEEDS_MAXIMUM 	0x00000003
#define SPAY_INSUFFICIENT_OUTPUT_DATA_LENGTH   	0x00000004
#define SPAY_INVALID_PARAMS						0x00000005
#define SPAY_INTERNAL_ERROR						0x00000006
#define SPAY_PROCESSING_ERROR                  	0x00000007
#define SPAY_UNKNOWN_CMD	         			0x00000008

#define SPAY_SUCCESS_ERR_MSG                 		  		"Success"
#define SPAY_INVALID_CTX_ERR_MSG                       		"Invalid Context"
#define SPAY_CTX_INIT_FAILED_ERR_MSG                   		"Context Initialization Failed"
#define SPAY_INPUT_DATA_LENGTH_EXCEEDS_MAXIMUM_ERR_MSG 		"Input Data Length Exceeds Maximum"
#define SPAY_INSUFFICIENT_OUTPUT_DATA_LENGTH_ERR_MSG   		"Insufficient Output Data Length"
#define SPAY_INVALID_PARAMS_ERR_MSG							"Invalid Params"
#define SPAY_INTERNAL_ERROR_ERR_MSG							"Internal Error"
#define SPAY_PROCESSING_ERROR_ERR_MSG                  		"Processing Error"
#define SPAY_UNKNOWN_CMD_ERR_MSG	         				"Unknown Command"
#define SPAY_UNKNOWN_ERROR_ERR_MSG	         				"Unknown Error"

#define SPAY_DEV_CERT_KEY_LEN 				2048
#define SPAY_DEV_CERT_NO_OF_SUBJECTS 		2
#define SPAY_DEV_CERT_MAX_SUBJECT_LEN 		32

#define SPAY_GEN_DEV_CERT_VISA_SVC_NAME		"VISA_PAY"
#define SPAY_GEN_DEV_CERT_AEXP_SVC_NAME		"AEXP_PAY"
#define SPAY_GEN_DEV_CERT_PLCC_SVC_NAME		"PLCC_PAY"
#define SPAY_GEN_DEV_CERT_KRCC_SVC_NAME		"KRCC_PAY"
#define SPAY_GEN_DEV_CERT_CNCC_SVC_NAME		"CNCC_PAY"
#define SPAY_GEN_DEV_CERT_DISC_SVC_NAME		"DISC_PAY"
#define SPAY_GEN_DEV_CERT_JIC_SVC_NAME		"JIC_PAY"

#define SPAY_VISA_PAY_DEV_ENC_CERT_PATH		"/efs/prov_data/pay/visa_pay_enc.dat"
#define SPAY_AEXP_PAY_DEV_ENC_CERT_PATH		"/efs/prov_data/aexp_pay/aexp_pay_enc.dat"
#define SPAY_PLCC_PAY_DEV_ENC_CERT_PATH		"/efs/prov_data/plcc_pay/plcc_pay_enc.dat"
#define SPAY_KRCC_PAY_DEV_ENC_CERT_PATH		"/efs/prov_data/krcc_pay/krcc_pay_enc.dat"
#define SPAY_CNCC_PAY_DEV_ENC_CERT_PATH		"/efs/prov_data/cncc_pay/cncc_pay_enc.dat"
#define SPAY_DISC_PAY_DEV_ENC_CERT_PATH		"/efs/prov_data/disc_pay/disc_pay_enc.dat"
#define SPAY_JIC_PAY_DEV_ENC_CERT_PATH		"/efs/prov_data/jic_pay/jic_pay_enc.dat"

#define SPAY_VISA_PAY_DEV_SIGN_CERT_PATH	"/efs/prov_data/pay/visa_pay_sign.dat"
#define SPAY_AEXP_PAY_DEV_SIGN_CERT_PATH	"/efs/prov_data/aexp_pay/aexp_pay_sign.dat"
#define SPAY_PLCC_PAY_DEV_SIGN_CERT_PATH	"/efs/prov_data/plcc_pay/plcc_pay_sign.dat"
#define SPAY_KRCC_PAY_DEV_SIGN_CERT_PATH	"/efs/prov_data/krcc_pay/krcc_pay_sign.dat"
#define SPAY_CNCC_PAY_DEV_SIGN_CERT_PATH	"/efs/prov_data/cncc_pay/cncc_pay_sign.dat"
#define SPAY_DISC_PAY_DEV_SIGN_CERT_PATH	"/efs/prov_data/disc_pay/disc_pay_sign.dat"
#define SPAY_JIC_PAY_DEV_SIGN_CERT_PATH		"/efs/prov_data/jic_pay/jic_pay_sign.dat"

typedef struct _spay_ctx spay_ctx_t;

spay_ctx_t *get_spay_ctx(uint32_t ta_id, 
		uint32_t maxsendbufsize, 
		uint32_t maxrecvbufsize, 
		int ta_fd, 		
		off_t ta_offset, 	
		size_t ta_size
);

void spay_processcommand_tlc(spay_ctx_t * ctx,
		uint32_t version,
		uint8_t * in_magicnum,
		uint32_t in_magicnum_len,
		uint32_t command_id,
		uint8_t * in_req_data,
		uint32_t in_req_data_len,
		uint32_t * out_resp_code,
		uint8_t * out_error_str,
		uint8_t ** out_resp_data,
		uint32_t * out_resp_data_len);

void delete_spay_ctx(spay_ctx_t * ctx);

bool spay_generate_dev_certs(const char * service_name);

//////////////////

#endif /* TLC_SPAY_H_ */
