#ifndef VENDOR_SAMSUNG_SECURITY_DRK_HERMESCMD_H
#define VENDOR_SAMSUNG_SECURITY_DRK_HERMESCMD_H

#include "systemConfig.h"

#define ERR_PDP_BASE                 (int32_t)0xFF000000 // -16777216
#define ERR_PDP_NOT_SUPPORTED        ERR_PDP_BASE - (int32_t)1
#define ERR_PDP_INVALID_ARGUMENT     ERR_PDP_BASE - (int32_t)2
#define ERR_PDP_BUFFER_OVERFLOW      ERR_PDP_BASE - (int32_t)3
#define ERR_PDP_SET_PROP             ERR_PDP_BASE - (int32_t)4

#define ERR_PDP_STATUS_BASE          (int32_t)0xFC000000 // -67108864
#define ERR_ARI_DISABLED             ERR_PDP_STATUS_BASE - (int32_t)1
#define ERR_ARC_MAX_OR_OFF           ERR_PDP_STATUS_BASE - (int32_t)2
#define ERR_FIPS_FAILURE             ERR_PDP_STATUS_BASE - (int32_t)3
#define ERR_SENSOR_NOT_CALIBRATED    ERR_PDP_STATUS_BASE - (int32_t)4
#define ERR_POR_COUNTER_NOT_SET      ERR_PDP_STATUS_BASE - (int32_t)5
#define ERR_SP_APP_LOAD_FAILED       ERR_PDP_STATUS_BASE - (int32_t)6
#define ERR_LOW_ARI_FUSE_GAUGE       ERR_PDP_STATUS_BASE - (int32_t)7
#define ERR_SKIP_ARI_MODE            ERR_PDP_STATUS_BASE - (int32_t)8
#define ERR_ARI_TEST_MODE            ERR_PDP_STATUS_BASE - (int32_t)9
#define ERR_ARI_OPERATION_MODE       ERR_PDP_STATUS_BASE - (int32_t)10
#define ERR_ARI_EXHAUSTED_MODE       ERR_PDP_STATUS_BASE - (int32_t)11
#define ERR_ARI_UNKOWN_MODE          ERR_PDP_STATUS_BASE - (int32_t)12
#define ERR_INVALID_SPCOM_CLIENT     ERR_PDP_STATUS_BASE - (int32_t)13
#define ERR_SKIP_CHANGE_SECURED      ERR_PDP_STATUS_BASE - (int32_t)14
#define ERR_MAX_AR_FUSE              ERR_PDP_STATUS_BASE - (int32_t)15

#define SECUREHW_PROPERTY            "security.securehw.available"
#define SECURENVM_PROPERTY           "security.securenvm.available"
#define FACTORY_BINARY_PROP          "ro.vendor.factory_binary"
#define FACTORY_BINARY_VALUE         "factory"

#define MAX_MESSAGE_LEN             16

#define TOTAL_SECNVM_SELFTEST_NUM 7
#define TOTAL_SSP_SELFTEST_NUM  5
#define SELFTEST_RESULT_LEN     4
#define SELFTEST_CHIP_SN_LEN    12
#define GETINFO_HW_VER_LEN      12
#define CRYPTO_FW_VER_LEN       8
#define SECNVM_FW_VER_LEN       8
#define MAX_SELFTEST_BLOB_LEN   256
#define MAX_BIGDATA_FILE_LEN    20480

typedef enum {
    FW_UPDATE_INIT           = 0x0,
    FW_UPDATE_NO,
    FW_UPDATE_OK,
    FW_UPDATE_FAIL,
    FAILCASE,
    SUCCESSCASE
} RESULT_MSG;

struct outmsg_st {
    uint8_t printmsg[MAX_MESSAGE_LEN];
};

#define SECNVM_SELFTEST_ERROR_LIST \
    {"CHIP_SN"}, \
    {"TIMER"}, \
    {"PROVISION_AK"}, \
    {"NVM_CHECKSUM"}, \
    {"NVM_ACCESS"}, \
    {"RAM_ACCESS"}, \
    {"ENC_CHECK"}, \
    {"TEST_ALL"}

#define SSP_SELFTEST_ERROR_LIST \
    {"SP_DATA_TRANS"}, \
    {"SP_CRYPTO"}, \
    {"SP_CRYPTO"}, \
    {"SP_KEY_GEN"}, \
    {"SP_WRAP"}, \
    {"TEST_ALL"}

#define SPU_SELFTEST_ERROR_LIST \
    {"CHIP_SN"}, \
    {"CAL_CHECK"}, \
    {"ENC_CHECK"}, \
    {"NG"}, \
    {"OK"}

#define OUT_MSG_LIST \
    {"INIT"}, \
    {"NG"}, \
    {"OK"}, \
    {"OK1"}, \
    {"NG"}, \
    {"OK"}

namespace vendor   {
namespace samsung  {
namespace hardware {
namespace security {
namespace drk      {

class HermesCommand
{
public:
    HermesCommand()  {};
    ~HermesCommand() {};

    int32_t CheckAppLoaded();
    int32_t KeyProvision();
    int32_t GetInfo(Bytes& out);
    int32_t GetBigdataMsg(Bytes& out);
    int32_t Selftest(Bytes& out);
    int32_t VerifyKeyprovision();
    int32_t Terminate();
    int32_t UpdateCryptoFW(Bytes& out);
    int32_t SaveBigData(Bytes& in);
    int32_t SecnvmPowerOn();
    int32_t SecnvmPowerOff();
};

}  // namespace drk
}  // namespace security
}  // namespace hardware
}  // namespace samsung
}  // namespace vendor

#endif
