/*
 * Copyright (c) 2015 Qualcomm Technologies, Inc.
 * All Rights Reserved.
 * Confidential and Proprietary - Qualcomm Technologies, Inc.
*/

#ifndef AUTHHAT_PROTOCOL_H
#define AUTHHAT_PROTOCOL_H

#include <stdint.h>

#define HW_AUTH_FINGERPRINT  2
#define AUTHHAT_MAX_KEY_LEN 1000
#define AUTHHAT_MAX_ADDITIONAL_ENCAP_OUT_LEN   144

#define AUTHHAT_RESULT_SUCCESS                                0
#define AUTHHAT_RESULT_FINAL_BASE                             0x10
#define AUTHHAT_RESULT_FAIL_GENERAL                          (AUTHHAT_RESULT_FINAL_BASE + 13)
#define AUTHHAT_RESULT_FAIL_PRE_ENROLL_COMMAND               (AUTHHAT_RESULT_FINAL_BASE + 14)
#define AUTHHAT_RESULT_FAIL_GET_UNIQUE_KEY                   (AUTHHAT_RESULT_FINAL_BASE + 15)
#define AUTHHAT_RESULT_FAIL_GENERATE_RANDOM_KEY              (AUTHHAT_RESULT_FINAL_BASE + 16)
#define AUTHHAT_RESULT_FAIL_HMAC                             (AUTHHAT_RESULT_FINAL_BASE + 17)
#define AUTHHAT_RESULT_FAIL_KEY_NULL                         (AUTHHAT_RESULT_FINAL_BASE + 18)
#define AUTHHAT_RESULT_FAIL_ON_ENCRYPT                       (AUTHHAT_RESULT_FINAL_BASE + 19)
#define AUTHHAT_RESULT_INVALID_PARAMETER                     (AUTHHAT_RESULT_FINAL_BASE + 20)
#define AUTHHAT_RESULT_FAIL_MEMORY_ALLOC                     (AUTHHAT_RESULT_FINAL_BASE + 26)

#define TZ_LOG_LEVEL_ERROR    0
#define TZ_LOG_LEVEL_FATAL    1
#define TZ_LOG_LEVEL_DEBUG    2

/* for challenge and meta data */
#define AUTHHAT_SUBMODULE_MAX_META_DATA_LEN                   1024
#define AUTHHAT_SUBMODULE_CHALLENGE_LEN                       64
#define AUTHHAT_SUBMODULE_META_DATA_CHALLENGE_LEN             8   // Challenge Length is 8 Byte(i.e. sizeof(uint64_t))
#define AUTHHAT_SUBMODULE_META_DATA_SIZE_OF_TOTAL_LEN         4
#define AUTHHAT_SUBMODULE_META_DATA_HEADER_LEN                4
#define AUTHHAT_SUBMODULE_META_DATA_SIZE_OF_DATA_LEN          4
#define AUTHHAT_SUBMODULE_META_DATA_SIZE_OF_PADDING_LEN       1
#define AUTHHAT_SUBMODULE_METADATA_ID_LEN                     256
/* key related */
#define AUTHHAT_SUBMODULE_MAX_KEY_LEN             64
#define AUTHHAT_SUBMODULE_AES_KEY_LEN             32
#define AUTHHAT_SUBMODULE_HMAC_KEY_LEN            32
#define AUTHHAT_SUBMODULE_UUID_KEY_LEN			  16  
#define AUTHHAT_SUBMODULE_KDFINPUT_KEY_LEN		  48
/* crypto related */
#define AUTHHAT_SUBMODULE_HMAC_LEN                32
#define AUTHHAT_SUBMODULE_IV_LEN                  16


typedef unsigned char     UINT8;
typedef unsigned short    UINT16;
typedef unsigned int      UINT32;
typedef unsigned long long   UINT64;


typedef struct cmd_req_s {
  UINT32 cmd_id;
  UINT32 data;
 } cmd_req_t;

typedef struct cmd_rsp_s {
  UINT32 cmd_id;
  UINT32 ret;
} cmd_rsp_t;

typedef enum {
    AUTHHAT_CMD_START = 0,
    AUTHHAT_CMD_DECAP_KEY,
    AUTHHAT_CMD_ENCAP_KEY,
	AUTHHAT_CMD_PRE_ENROLL,
	AUTHHAT_CMD_ENCAP_KEY_WITH_PREFIX,
    AUTHHAT_CMD_END = 0x7FFFFFFF
} authhat_tz_cmd_type;

typedef enum {
    TZ_NAME_DEFAULT = 0,
    TZ_NAME_SECUREFP,
    TZ_NAME_DUALFP,
    TZ_NAME_FIDO,
    TZ_NAME_SEC_IRIS,
    TZ_NAME_TIGERFP,
    TZ_NAME_SEC_FR,
} authhat_tz_name;

typedef enum {
    BIO_SUBMODULE_NONE = 0,
    BIO_SUBMODULE_SEC_IRIS,
    BIO_SUBMODULE_SEC_FR
} authhat_subModule_tz_type;

typedef struct get_decapped_key_req_s {
    UINT32 cmd_id;
    UINT8 in_param[AUTHHAT_MAX_KEY_LEN];
    UINT32 in_param_len;
}__attribute__ ((packed)) get_decapped_key_req_t;

typedef struct get_decapped_key_rsp_s {
    UINT32 ret;
}__attribute__ ((packed)) get_decapped_key_rsp_t;

typedef struct encap_key_req_s {
    UINT32 cmd_id;
    UINT32 tz_type;
}__attribute__ ((packed)) encap_key_req_t;

typedef struct encap_key_rsp_s {
    UINT8 out_param[AUTHHAT_MAX_KEY_LEN];
    UINT32 out_param_len;
    UINT32 ret;
}__attribute__ ((packed)) encap_key_rsp_t;

typedef union authhat_req_s
{
    get_decapped_key_req_t      decap_req;
    encap_key_req_t        encap_key_req;
} __attribute__ ((packed)) authhat_req_t;

typedef union authhat_rsp_s
{
    get_decapped_key_rsp_t       decap_rsp;
    encap_key_rsp_t        encap_key_rsp;
} __attribute__ ((packed)) authhat_rsp_t;

/* ===== pre_enroll command ===== */
typedef struct pre_enroll_req_s {
	authhat_tz_cmd_type cmd_id; /* command id */
	UINT32 tz_type;             /* tz_type */
} __attribute__ ((packed)) pre_enroll_req_t;

typedef struct pre_enroll_rsp_s {
	authhat_tz_cmd_type cmd_id;										 /* command id */
	UINT32 ret; 														 /* return value */
	uint64_t challenge; 												 /* challenge */
	UINT8 encryptedChallenge[AUTHHAT_SUBMODULE_MAX_META_DATA_LEN];		 /* encrypted challenge */
	UINT32 encryptedChallengeLen;										 /* encrypted challenge length */
} __attribute__ ((packed)) pre_enroll_rsp_t;

typedef void (*fpTZ_LOG) (UINT8 pri, const char * format, ...);
extern fpTZ_LOG LOG_MSG;
extern void tl_cmd_handler(void* cmd, UINT32 cmdlen, void* rsp, UINT32 rsplen);

#endif // AUTHHAT_PROTOCOL_H
