#ifndef __TZ_PLATFORM_H__
#define __TZ_PLATFORM_H__

#include <stdio.h>
#include <stdint.h>
#include <string.h>

#define MAX_QSEE_ID_SIZE                        20
#define TID_SIZE                                16

#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE  1
#endif
#if defined(USE_BLOWFISH) || defined(USE_TRUSTY_UNISOC)
static const uint8_t SEM_TID[TID_SIZE] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x45, 0x4d, 0x65, 0x53, 0x45 };
#endif
#if defined(USE_TRUSTY_UNISOC)
#define bool_t uint8_t
#endif
#ifdef USE_QSEE
#include "qsee_heap.h"
#include "qsee_message.h"
#ifndef QSEE_MESSAGE_APP_NAME_MAX_LEN
#define QSEE_MESSAGE_APP_NAME_MAX_LEN           128
#endif
static const uint8_t SEM_TID[QSEE_MESSAGE_APP_NAME_MAX_LEN] = "sem";
#endif
#ifdef USE_MOBICORE
static const uint8_t SEM_TID[TID_SIZE] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B };
#endif

#define ERR_DEAD 0xdd

typedef enum {
    CMD_CHECK_SSP = 0,                      // 0
    CMD_PROVISION_OTP,                      // 1
    CMD_REQUEST_RESET,                      // 2
    CMD_RESET_SSP,                          // 3
    CMD_RESET_SSP_FOR_FACTORY,              // 4
    CMD_DELETE_ALL_SS_ENTRY,                // 5
    CMD_CHECK_SSE,                          // 6
    CMD_PROVISION_OTP_M,                    // 7
    CMD_IS_SSP_VALID,                       // 8

    CMD_SPI_INIT = 10,                      // 10
    CMD_SPI_DEINIT,                         // 11

    CMD_SEM_SERVICEKEY_UNWRAP = 20,         // 20 : Unwrap wrapped ecc service key and parse
    CMD_UPDATE_DSI_ENTRY = 21,              // 21 : Update Device Security Information to SSE entry '760EC7DC'
    CMD_UPDATE_DEFAULT_ENTRY_AUTH = 22,     // 22 : SSEM 2.0 Commercial command
    CMD_DELETE_FIDO_DEFAULT_ENTRY,          // 23 : SSEM 2.0 Commvercial command
    CMD_GET_CPLC,                           // 24
    CMD_SEM_SERVICEKEY_REWRAP,              // 25 : Rewrap ecc service key and parse
    CMD_SEM_REWAPPED_SERVICEKEY_UNWRAP,     // 26 : Unwrap rewrapped ecc service key and parse
    CMD_HANDLE_CCM_DATA_P1,                 // 27
#ifdef LCCM_SPI
    CMD_HANDLE_CCM_DATA_P2,                 // 28
#endif
    CMD_FIDO_GET_ENTRY = 31,                // 31

    CMD_CHECK_ESE_RESTRICTED = 32,          // 32 : For HW PARAM, check each vendor's restricted mode
    CMD_GET_ACDUMP = 33,                    // 33 : for SPI NFCMTEST=0,5
    CMD_GET_ATTACKED = 34,                  // 34 : for SPI NFCMTEST=0,5 (for Gemalto,NXP only. For OT, not needed.)
    CMD_GET_OK_ATTACKED = 41,               // 41 : for SPI NFCMTEST=0,5 (for NXP only.)

    CMD_GET_DEFAULT_WALLET_LIST = 35,         // 35 : For Delete Default Card, get wallet package name list
    CMD_GET_DEFAULT_CARD_AID  = 36,         // 36 : For Delete Default Card, get default card AID
    CMD_DELETE_DEFAULT_CARD   = 37,         // 37 : For Delete Default Card, delete default card
    CMD_GET_RF_ACTIVATION_LIST = 38,        // 38 : For Delete Default card using for AID, get RF Activation List
    CMD_DEACTIVATION_AID = 39,

    CMD_IS_FACTORY_RESET = 40,    // 40

    CMD_DEACTIVATION_AID_DEBUG = 49,

#ifdef DEBUG_LOW
    CMD_GEN_ENTRYID_TEST = 50,              // 50
    CMD_PUT_ENTRY_DATA_TEST,                // 51
    CMD_GET_ENTRY_DATA_TEST,                // 52
    CMD_UPDATE_AUTH_TEST,                   // 53
    CMD_DELETE_ENTRY_TEST,                  // 54
    CMD_DELETE_ALL_TEST,                    // 55
    CMD_GET_DEFAULT_ENTRY_TEST,             // 56
    CMD_PUT_DEFAULT_ENTRY_TEST,             // 57

    CMD_ISO7816_TEST = 70,                  // 70
    CMD_CRYPTO_TEST,                        // 71
    CMD_GET_INFO_TEST,                      // 72
    CMD_ATTACK_TEST ,                       // 73
    CMD_RESTRICTED_CHECK_TEST,              // 74
    CMD_TA_TEST,                            // 75
    CMD_GET_CASD_CERT,                      // 76

    CMD_PUT_ENTRY_DATA_TEST_STRESS = 80,
    CMD_GET_ENTRY_DATA_TEST_STRESS,
    CMD_DELETE_ENTRY_TEST_STRESS,
    CMD_SCP_11_A_TEST,
    CMD_SCP_11_B_TEST,

    CMD_SCPKM_TEST = 90, 

    // SPay Test
    CMD_START_USE_CARD = 101,
    CMD_END_USE_CARD,
    CMD_SET_DEFAULT_CARD,
    CMD_GET_DEFAULT_CARD,
    CMD_SET_DEFAULT_WALLET,
    CMD_GET_DEFAULT_WALLET,
    CMD_GET_WALLET_LIST,
    CMD_SET_STATUS_ACTIVATED,
    CMD_SET_STATUS_DEACTIVATED,

    // Stress Test
    CMD_STRESS_TEST_1 = 120,
    CMD_STRESS_TEST_2,
#endif //DEBUG_LOW

    // SKMS DEVICE ATTESTATION COMMANDS
    CMD_SKMS_SERVICEKEY_REWRAP = 150,             // 150 : Rewrap rsa service key and parse
    CMD_SKMS_REWRAPPED_SERVICEKEY_UNWRAP,         // 151 : Unwrap rewrapped rsa service key and parse
    CMD_SKMS_REWRAPPED_SERVICEKEY_UNWRAP_DRK,     // 152 : Unwrap rewrapped rsa DRK key and parse
    CMD_SKMS_REWRAPPED_SERVICEKEY_UNWRAP_SVC,     // 153 : Unwrap rewrapped rsa skms svc key and parse
    CMD_SKMS_REQ_SIGN,                            // 154 : Req sign msg for SKMS server
    // SKMS DEVICE ATTESTATION COMMANDS

    CMD_GET_HQM_MEMORY = 200,                       // 200 : For HW PARAM, ESEM
    CMD_UPDATE_WARRANTYBIT_ENTRY_NORMAL = 201,      // 201 : Update WarrantyBit SSE entry('A2BA4964') to normal (0x00)
    CMD_UPDATE_WARRANTYBIT_ENTRY_ABNORMAL = 202,    // 202 : Update WarrantyBit SSE entry('A2BA4964') to abnormal(0x01)
    CMD_UPDATE_SSE_DEFAULT_ENTRY_TA_ID  = 203,      // 203 : Update SSE TA-ID if SSE Default Entry can read without SSP
    
    CMD_CHECK_SE_STATE      = 300,                  // 300 : Check SE state
    CMD_REQUEST_CREDENTIALS = 301,                  // 301 : Request credentials
/***************************************************** GRDM *****************************************************/
#ifdef USE_GRDM
    CMD_GRDM_OPEN		= 400,				
    CMD_GRDM_CLOSE		= 401,	
    CMD_GRDM_GET_IMEI   = 402,
    CMD_GRDM_INJECT_IMEI = 403,
    CMD_GRDM_GET_BLCREDENTIAL = 404,
    CMD_GRDM_GET_ATTESCERT = 405,
    CMD_GRDM_ECDSA_ATTESKEY = 406,
    CMD_GRDM_GET_INFO = 407,
    CMD_GRDM_PROVISION_ADMIN = 408,
    CMD_GRDM_PUT_KEY = 409,
    CMD_GRDM_RESET_ADMIN = 410,
    CMD_GRDM_GET_CREDENTIAL = 411,
    CMD_GRDM_STORE_CREDENTIAL = 412,
    CMD_GRDM_DELETE_CREDENTIAL = 413,
    CMD_GRDM_BL_PUTKEY = 414,
    CMD_GRDM_GET_ATTES_PUBKEY = 415,
    CMD_GRDM_FW_CHECK_IMAGE = 416,
    CMD_GRDM_FW_START_UPGRADE = 417,
    CMD_GRDM_FW_CHECK_HEADER = 418,
    CMD_GRDM_FW_UPDATE_UPGRADE = 419,
    CMD_GRDM_FW_FINISH_UPGRADE = 420,
    CMD_GRDM_GED_DEVICE_ATTESTATION = 421,
    CMD_GRDM_ECDSAWITHHASH_ATTESKEY = 422,
    CMD_GRDM_FACTORY_RESET = 423,
    CMD_GRDM_ADMINKEY_RESET = 424,
    CMD_GRDM_ECDSA_SAK = 425,
    CMD_GRDM_KM_PUTKEY = 426,
    CMD_GRDM_ICCC_PUTKEY = 427,
    CMD_GRDM_GET_BL_CREDENTIAL = 428,
    CMD_GRDM_FW_READ_VERSION = 429,
    CMD_GRDM_FDC_CHECK_STATUS = 430,
    CMD_GRDM_FDC_CHECK_RESTRICTION = 431,
    CMD_GRDM_FDC_CHECK_LOG = 432,
    CMD_GRDM_FDC_ATTCK = 433,
    CMD_GRDM_CHECK_STATUS = 434,
    CMD_GRDM_RESET_STATUS = 435,
#endif
/***************************************************** GRDM *****************************************************/

#if defined LOW_SPI_TEST && defined DEBUG_LOW
    CMD_SEND_DATA = 1000,
#endif

#if defined(SCP03_TEST) && defined(DEBUG_LOW)
    CMD_SCP_03_TEST = 1100,
#endif

#if defined(EXTENDED_APDU)
    CMD_EXTENDED_APDU_ECHO = 1200,
#endif
} CMD_TYPE;

typedef enum {
    DONT_USE_THIS_MAX_VALUE_ERR_DEAD = ERR_DEAD,

    RET_SUCCESS = 0,
    // SEM ERROR RETURN VALUES
    RET_ERR_TZ = -1,
    RET_ERR_IS_SSP_VALID = -2,
    RET_ERR_PROVISION_OTP = -3,
    RET_ERR_REQUEST_RESET = -4,
    RET_ERR_RESET_SSP = -5,
    RET_ERR_DELETE_ALL_SS_ENTRY = -6,
    RET_ERR_SSP_NOT_EXIST = -7,
    RET_ERR_CERT_CHAIN_VERIFICATION = -8,
    RET_ERR_GET_CERT_VERIFICATION = -9,
    RET_ERR_DELETE_FIDO_DEFAULT_ENTRY = -10,
    RET_ERR_GET_CAPA_FAIL = -11,
    RET_ERR_GET_CPLC_FAIL = -12,
    RET_ERR_TA_NOT_PERMITTED = -13,
    RET_ERR_DRK_NOT_EXIST = -14,
    RET_ERR_GET_RESTRICTED_MODE = -15,
    RET_ERR_CHECK_FACTORY_RESET_FAIL = -16,
    RET_ERR_GET_ACDUMP = -17,
    RET_ERR_GET_ATTACKED = -18,
    RET_ERR_GET_WALLET_PACKAGE = -19,
    RET_ERR_GET_WALLET_AID = -20,
    RET_ERR_DELETE_WALLET = -21,
    RET_ERR_DO_NOT_NEED_DEACTIVATE = -22,
    RET_ERR_DO_NOT_HAVE_DEFAULT_CARD = -23,
    RET_ERR_GET_ENHANCED_ACDUMP = -24,
    RET_ERR_BUFFER_OVERFLOW = -25,

    RET_ERR_GET_RF_ACTIVATION_LIST = -26,
    RET_ERR_RF_DEACTIVATION = -27,
    RET_ERR_GET_HQM_MEMORY = -28,
    RET_ERR_UPDATE_DSI_ENTRY = -29,
    RET_ERR_UPDATE_WARRANTYBIT_ENTRY_NORMAL = -30,
    RET_ERR_UPDATE_WARRANTYBIT_ENTRY_ABNORMAL = -31,

    RET_ERR_ESE_OPEN_FAILED = -32,
    RET_ERR_ESE_SELECT_FAILED = -33,
    RET_ERR_ESE_TRANSMIT_FAILED = -34,
    RET_ERR_ESE_CLOSE_FAILED = -35,
    
    RET_ERR_SSP_OPEN_FAILED = -36,
    RET_ERR_SSP_TRANSACTION_FAILED = -37,
    RET_ERR_SSP_CLOSE_FAILED = -38,

#if defined(EXTENDED_APDU)
    RET_ERR_EXTENDED_APDU_FAILED = -39,
#endif

    // APDU
    RET_ERR_INVALID_APDU = -50,
    // CCM ERROR RETURN VALUES
    RET_ERR_CCM_METADATA_SIG_VERIFICATION = -100,
    RET_ERR_CCM_INVALID_METADATA = -101,
    RET_ERR_CCM_MANAGE_CHANNEL = -102,
    RET_ERR_CCM_SELECT_DMSD = -103,
    RET_ERR_CCM_GENERATE_KVN31_KEYSET = -104,
    RET_ERR_CCM_GET_KVN30 = -105,
    RET_ERR_CCM_OPENSESSION_KVN30 = -106,
    RET_ERR_CCM_PUT_KEY = -107,
    RET_ERR_CCM_OPENSESSION_KVN31 = -108,
    RET_ERR_CCM_STORE_DATA = -109,
    RET_ERR_CCM_RECEIPT_VERIFICATION = -110,
    RET_ERR_CCM_SCRIPT_SEND = -111,
    RET_ERR_CCM_CRYPTO_FAIL = -112,
    RET_ERR_CCM_META_INTEGRITY_CHECK_FAIL = -113,
    RET_ERR_CCM_SELECT_ARAC = -114,
    RET_ERR_CCM_SSP_NOT_PROVISIONED = -115,
    RET_ERR_CCM_INVALID_INPUT_PARAMS = -116,
    RET_ERR_CCM_OUT_OF_MEMORY = -117,
    RET_ERR_CCM_NOT_IMPLEMENTED = -118,
    RET_ERR_CCM_ACCESS_DENIED = -119,
    RET_ERR_CCM_FAIL_PART1 = -123,
#ifdef LCCM_SPI
    RET_ERR_CCM_FAIL_PART2 = -124,
#endif
    // CCM IGNORE RETURN VALUES
    RET_IGNORED_CCM_ALREADY_COMPLETED = -120,
    RET_IGNORED_CCM_APPLET_VERSION_LOW = -121,
    RET_IGNORED_CCM_APPLET_VERSION_IDENTICAL = -122,

    // FactoryReset RETURN STATUS VALUES
    RET_STATUS_FRA_APPLET_NOT_EXISTS = -130,
    RET_STATUS_DID_NOT_HAVE_CLEAR_LIST = -131,
    RET_STATUS_NEED_TO_FACTORY_RESET = -132,
    RET_STATUS_FACTORY_RESET_UNKNOWN_ERROR = -133,

    // SSE RETURN VALUES
    RET_ERR_SSE_UPDATE_ENTRY_TA_ID_UNKNOWN_ESE_SW_BEFORE_UPDATE = -135,
    RET_ERR_SSE_UPDATE_ENTRY_TA_ID_UNKNOWN_ESE_SW_AFTER_UPDATE = -136,
    RET_ERR_SSE_UPDATE_ENTRY_TA_ID_UNKNOWN_SSP_SW = -137,
    RET_ERR_SSE_UPDATE_ENTRY_TA_ID_NOT_UPDATED = -138,

    RET_ERR_CEHCK_SE_STATE = -140,
    RET_ERR_NOT_CORRECT_SE_STATE = -141,
    RET_ERR_REQUEST_CREDENTIALS = -142,
    RET_ERR_ALREADY_PERSONALIZED = -143,
    RET_ERR_NOT_CORRECT_KEY = -144,
    RET_ERR_NOT_PERMITTED = -145,
    RET_ERR_INVALID_INPUT_PARAMS = -146,
    RET_ERR_NOT_CORRECT_INPUT_FORMAT = -147,
    RET_ERR_NOT_SUPPORTED = -148,
    RET_ERR_SCP_FAIL = -149,

    // SKMS DEVICE ATTESTATION ERROR RETURN VALUES
    RET_ERR_BUFFER_NOT_ENOUGH =             -200,
    //RET_ERR_TZ =                            -200,
    //RET_ERR_DRK_NOT_EXIST =                 -201,
    RET_ERR_SERVICE_KEY_PARSING_FAIL =      -202,
    RET_ERR_LEAF_KEY_NOT_EXIST =            -203,

    RET_ERR_GEN_ECC_KEY_FAIL =              -204,
    RET_ERR_REGEN_ECC_KEY_FAIL =            -205,
    RET_ERR_GEN_RSA_KEY_FAIL =              -206,
    RET_ERR_REGEN_RSA_KEY_FAIL =            -207,
    RET_ERR_SIGN_FAIL =                     -208,
    RET_ERR_VERIFY_FAIL =                   -209,

    RET_ERR_WRONG_PARAMETER =               -210,
    RET_ERR_WRONG_INPUT_FORMAT =            -211,
    RET_ERR_NOT_SUPPORT =                   -212,
    RET_ERR_NO_CERTIFICATES =               -213,
    RET_ERR_GET_MK_FACTORY =                -214,
    RET_ERR_MAC_NOT_CORRECT =               -215,
    RET_ERR_CALLER_NOT_PERMITTED =          -216,
    RET_ERR_GET_TZ_CPLC_FAIL =              -217,
    RET_ERR_NO_NWD_CPLC_BUFFER =            -218,
    RET_ERR_NOT_MATCH_CPLCS =               -219,
    RET_ERR_READ_SKMS_SVC_KEY_OBJ =         -220,
    RET_ERR_REQ_SKMS_PRIV_KEY =             -221,
    RET_ERR_REQ_RSA_SIGN_SKMS =             -222,
    RET_ERR_UNWRAP_REWRAPPED_SKMS_SVC =     -223,
    RET_ERR_UNWRAP_REWRAPPED_SKMS_DRK =     -224,
    RET_ERR_PROVISION_SKMS =                -225,
    RET_ERR_GET_NWD_CPLC_FAIL =             -226,
    RET_ERR_RSA_KEY_EMPTY =                 -227,

    RET_ERR_ENCRYPT_FAIL =                  -300,
    RET_ERR_DECRYPT_FAIL =                  -301,

    RET_ERR_DATA_WRAPPING_FAIL =            -400,
    RET_ERR_DATA_UNWRAPPING_FAIL =          -401,
    // SKMS DEVICE ATTESTATION ERROR RETURN VALUES
} RET_TYPE;

#define MAX_DATA_SIZE   (90*1024)  // size raised for CCM
#define MAX_DATA_APDUS   (512)
#define SIZE_CPLC   (42)
#define SIZE_ECC256_SIGNATURE   (64)
typedef struct cmd {
    int32_t cmd_id;
    int32_t ret;
    uint8_t data[MAX_DATA_SIZE];
    uint32_t dataLen;
} cmd_t, *p_cmd_t;

typedef struct rsp {
    int32_t status;
    int32_t ret;
    uint8_t data[MAX_DATA_SIZE];
    uint32_t dataLen;
} rsp_t, *p_rsp_t;
#endif
