#ifndef __PLATFORM_H__
#define __PLATFORM_H__

#include <stdio.h>
#include <stdint.h>

#ifndef NULL
#define NULL ((void*)0)
#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
#endif

typedef uint16_t STATUS;

#define STATUS_SUCCESS                      0x0000
#define STATUS_FAILED                       0x0001

#define ERR_DEAD                            0xdd

#define MAX_DATA_SIZE                       (20 * 1024)
#define MAX_RETRY_COUNT                     2


typedef enum {
    CMD_SKPM_SERVICEKEY_REWRAP = 1,                                         // 1 : Rewrap ocp service key and parse
    CMD_SKPM_UNWRAP_REWAPPED_SERVICEKEY,                                    // 2 : Unwrap rewrapped ocp service key and parse

    CMD_SKPM_CHECK_KEY_LIST = 5,                                            // 5 : Check key list
    CMD_SKPM_CHECK_CALLER_LIST,                                             // 6 : Check caller list

    CMD_SKPM_FACTORY_KEY_INJECTION = 10,                                    // 10 : Key injection via factory
    CMD_SKPM_OTA_KEY_INJECTION,                                             // 11 : Key injection via OTA
    CMD_SKPM_INJECTED_KEY_VERIFICATION,                                     // 12 : Injected key verification
    CMD_SKPM_INJECTED_KEY_SHARING,                                          // 13 : Share injected or ota key
    CMD_SKPM_READ_INJECTED_KEY_UID,                                         // 14 : Read injected key UID

    CMD_SKPM_TLS_SESSION_OTA_PROVISON_SET_SERVER_PUBKEY = 20,               // 20 : Set OTA Server public key
    CMD_SKPM_TLS_SESSION_OTA_PROVISON_GET_CLIENT_PUBKEY,                    // 21 : Get OTA Client public key
    CMD_SKPM_TLS_SESSION_OTA_PROVISON_SIGN_WITH_CLIENT_KEY,                 // 22 : Sign with client key

    CMD_SKPM_TLS_SESSION_OTA_PROVISON_GENERATE_PREMASTER_KEY = 30,          // 30 : Generate premaster key
    CMD_SKPM_TLS_SESSION_OTA_PROVISON_GENERATE_MASTER_SECRET_KEY,           // 31 : Generate master secret key
    CMD_SKPM_TLS_SESSION_OTA_PROVISON_GENERATE_KEY_BLOBS,                   // 32 : Generate key blobs
    CMD_SKPM_TLS_SESSION_OTA_PROVISON_SET_KEY_INFOS,                        // 33 : Set key information
    CMD_SKPM_TLS_SESSION_OTA_PROVISON_GENERATE_FINISH_HASH,                 // 34 : Generate server/client finish has
    CMD_SKPM_TLS_SESSION_OTA_PROVISON_GENERATE_CIHPER_MAC_KEY,              // 35 : Generate TLS cipher and mac keys

    CMD_SKPM_TLS_SESSION_OTA_PROVISON_ENCRYPT_BUF = 40,                     // 40 : Encrypt buffer
    CMD_SKPM_TLS_SESSION_OTA_PROVISON_DECRYPT_BUF,                          // 41 : Decrypt buffer

    CMD_SKPM_TLS_SESSION_OTA_PROVISON_GENERATE_LEAF_ECC_KEYPAIR = 50,       // 50 : Generate ECC keypair
    CMD_SKPM_TLS_SESSION_OTA_PROVISON_GET_LEAF_ECC_PUBKEY,                  // 51 : Get ECC Pubkey
    CMD_SKPM_TLS_SESSION_OTA_PROVISON_SIGN_WITH_LEAF_ECC_KEY,               // 52 : Sign with ECC privkey

    CMD_SKPM_TLS_SESSION_OTA_PROVISON_GENERATE_LEAF_RSA_KEYPAIR = 60,       // 60 : Generate RSA keypair
    CMD_SKPM_TLS_SESSION_OTA_PROVISON_GET_LEAF_RSA_PUBKEY,                  // 61 : Get RSA Pubkey
    CMD_SKPM_TLS_SESSION_OTA_PROVISON_SIGN_WITH_LEAF_RSA_KEY,               // 62 : Sign with RSA privkey

    CMD_SKPM_READ_BOARD_NAME = 70,                                          // 70 : Read board name
    CMD_SKPM_GENERATE_CSR,                                                  // 71 : Generate CSR

#ifdef SUPPORT_GUARDIAN_M
    CMD_SKPM_GUARDIAN_M_GET_TLS_SESSION_INFO = 80,                          // 80 : Get OTA session info
    CMD_SKPM_GUARDIAN_M_GET_CERTS,                                          // 81 : Get Guardian M certificates
#endif

#ifdef DEBUG_LOW
    CMD_SKPM_CRYPTO_TEST = 1000,
    CMD_SKPM_UNWRAP_TEST = 2000,
#endif //DEBUG_LOW
} CMD_TYPE;

typedef enum {
    DONT_USE_THIS_MAX_VALUE_ERR_DEAD = ERR_DEAD,

    RET_SUCCESS = 0,

    // SKPM ERROR RETURN VALUES
    RET_ERR_BUFFER_NOT_ENOUGH =             -6,
    RET_ERR_SRC_BUFFER_OVERFLOW =           -7,

    RET_ERR_WRONG_PARAMETER =               -10,
    RET_ERR_WRONG_INPUT_FORMAT =            -11,
    RET_ERR_NOT_SUPPORT =                   -12,
    RET_ERR_NO_CERTIFICATES =               -13,
    RET_ERR_GET_MK_FACTORY =                -14,
    RET_ERR_MAC_NOT_CORRECT =               -15,
    RET_ERR_CALLER_NOT_PERMITTED =          -16,

    RET_ERR_TZ =                            -100,
    RET_ERR_DRK_NOT_EXIST =                 -101,
    RET_ERR_SERVICE_KEY_PARSING_FAIL =      -102,
    RET_ERR_LEAF_KEY_NOT_EXIST =            -103,

    RET_ERR_GEN_ECC_KEY_FAIL =              -200,
    RET_ERR_REGEN_ECC_KEY_FAIL =            -201,
    RET_ERR_GEN_RSA_KEY_FAIL =              -202,
    RET_ERR_REGEN_RSA_KEY_FAIL =            -203,
    RET_ERR_SIGN_FAIL =                     -204,
    RET_ERR_VERIFY_FAIL =                   -205,

    RET_ERR_ENCRYPT_FAIL =                  -300,
    RET_ERR_DECRYPT_FAIL =                  -301,

    RET_ERR_DATA_WRAPPING_FAIL =            -400,
    RET_ERR_DATA_UNWRAPPING_FAIL =          -401,

    RET_ERR_GRDM_OPERATION =                -500,
} RET_TYPE;

typedef struct cmd {
    int32_t cmd_id;
    int32_t ret;
    uint8_t data[MAX_DATA_SIZE];
    uint32_t dataLen;
} __attribute__((packed)) cmd_t, *p_cmd_t;

typedef struct rsp {
    int32_t status;
    int32_t ret;
    uint8_t data[MAX_DATA_SIZE];
    uint32_t dataLen;
} __attribute__((packed)) rsp_t, *p_rsp_t;

#endif
