#ifndef __GRDM_H__
#define __GRDM_H__

#ifdef USE_GRDM
#include "grdm_common.h"

#define ATTESTATION_TYPE_SIZE 1
#define ATTESTATION_TIME_SIZE 12

#define GRDM_TID_SIZE 16
#define GRDM_TA_LIST_SIZE 5

#define GRDM_ADMIN_KEYBLOB_BUFFER_SIZE 200
#define GRDM_ADMIN_KEY_SIZE 32
#define GRDM_DOMAIN_KEYBLOB_BUFFER_SIZE 200
#define GRDM_DOMAIN_KEY_SIZE 32
#define GRDM_IMEI_DATA_SIZE 62
#define GRDM_DOMAIN_KEY_STATUS_EXIST 1
#define GRDM_DOMAIN_KEY_STATUS_NOT_EXIST 0
#define GRDM_ADMIN_DOMAIN_INDEX 0x10

#define GRDM_INVALID_DOMAIN_INDEX_ERROR -103

GRDM_RESULT grdmInjectImei(uint8_t* data, uint32_t dataLen);
GRDM_RESULT grdmGetImei(uint8_t* data, uint32_t* dataLen);
GRDM_RESULT grdmPutKey(uint8_t* data, uint32_t dataLen, uint8_t* domain_key, uint32_t* domain_key_len);
GRDM_RESULT grdmProvisionAdmin(uint8_t* adminKeyBlob, uint32_t* adminKeyBlobLen);
GRDM_RESULT grdmResetAdmin(void);
GRDM_RESULT grdmFWcheckImage(uint8_t* header, uint32_t headerLen, uint8_t* rspData, uint32_t* rspDataLen);
GRDM_RESULT grdmFWstartUpgrade(uint8_t* fw, uint32_t fw_len);
GRDM_RESULT grdmFWcheckHeader(uint8_t* header, uint32_t headerLen, uint8_t* nextLen);
GRDM_RESULT grdmFwReadVersion(uint8_t* version, uint32_t* version_len);
GRDM_RESULT grdmFWupdateUpgrade(uint8_t* fw, uint32_t fw_len);
GRDM_RESULT grdmFWfinishUpgrade(uint8_t* version, uint32_t* version_len);
GRDM_RESULT grdmFDCCheckStatus(uint8_t* data, uint32_t* dataLen);
GRDM_RESULT grdmFDCCheckRestriction(uint8_t* data, uint32_t* dataLen);
GRDM_RESULT grdmFDCCheckLog(uint8_t* data, uint32_t* dataLen, uint8_t p1);

#ifdef DEBUG_LOW
GRDM_RESULT grdmDeleteCredential(uint8_t* domainKey, uint32_t domainKeyLen);
GRDM_RESULT grdmStoreCredential(uint8_t* domainKey, uint32_t domainKeyLen);
GRDM_RESULT grdmGetCredential(uint8_t* domainKey, uint32_t domainKeyLen);
GRDM_RESULT grdmGetDeviceAttestation(uint8_t* inputData, uint32_t inputDataLen, uint8_t* signedData, uint32_t* signedDataLen);
GRDM_RESULT grdmFactoryReset(void);
GRDM_RESULT grdmAdminKeyReset(void);
GRDM_RESULT grdmKMPutkey(void);
GRDM_RESULT grdmICCCPutkey(void);
GRDM_RESULT grdmGetBLCredential(void);
GRDM_RESULT grdmFDCAttack(uint8_t* data, uint32_t* dataLen, uint8_t condition);
#endif

#ifdef GRDM_TEST
GRDM_RESULT grdmResetStatus(void);
GRDM_RESULT grdmBlPutkey();
#endif

#endif
#endif
