#ifndef __IFAA_TLV_COMMON_H__
#define __IFAA_TLV_COMMON_H__

#include "ifaa_tee_common.h"
typedef uint16_t tag_t;

#define TAG_PARENT_NODE_BASE    0x00

#define TAG_REG_REQUESTT    TAG_PARENT_NODE_BASE + 1
#define TAG_REG_DATA        TAG_PARENT_NODE_BASE + 2

#define TAG_REG_RESPONSE    TAG_PARENT_NODE_BASE + 3
#define TAG_KRD             TAG_PARENT_NODE_BASE + 4

#define TAG_AUTH_REQUEST    TAG_PARENT_NODE_BASE + 5
#define TAG_AUTH_DATA       TAG_PARENT_NODE_BASE + 6

#define TAG_AUTH_RESPONSE   TAG_PARENT_NODE_BASE + 7
#define TAG_SIGNED_DATA     TAG_PARENT_NODE_BASE + 8

#define TAG_DEREG_REQUEST   TAG_PARENT_NODE_BASE + 9
#define TAG_DEREG_DATA      TAG_PARENT_NODE_BASE + 10


#define TAG_LEAF_NODE_BASE  0x8000

#define TAG_CHALLENGE       TAG_LEAF_NODE_BASE + 1
#define TAG_TOKEN           TAG_LEAF_NODE_BASE + 2
#define TAG_REG_TYPE        TAG_LEAF_NODE_BASE + 3
#define TAG_EXTINFO         TAG_LEAF_NODE_BASE + 4
#define TAG_CERT_ALG_ENCODE TAG_LEAF_NODE_BASE + 5
#define TAG_CERT_CHAIN      TAG_LEAF_NODE_BASE + 6
#define TAG_SIGNATURE       TAG_LEAF_NODE_BASE + 7
#define TAG_SIGN_ALGORITHM  TAG_LEAF_NODE_BASE + 8

#define TAG_AUTH_VERSION    TAG_LEAF_NODE_BASE + 9
#define TAG_PUB_ALG_ENCODE  TAG_LEAF_NODE_BASE + 10
#define TAG_PUBKEY          TAG_LEAF_NODE_BASE + 11
#define TAG_KEY_TYPE        TAG_LEAF_NODE_BASE + 12
#define TAG_DEVICE_ID       TAG_LEAF_NODE_BASE + 13
#define TAG_REGINFO         TAG_LEAF_NODE_BASE + 14

#define TAG_AUTH_TYPE       TAG_LEAF_NODE_BASE + 15

#define TAG_AUTHINFO        TAG_LEAF_NODE_BASE + 16
#define TAG_LEVEL           TAG_LEAF_NODE_BASE + 17
#define TAG_VERSION         TAG_LEAF_NODE_BASE + 18

#define TAG_TMPIDLIST       TAG_LEAF_NODE_BASE + 0x100


/**
 *                      REG_REQUEST
 *                        /      \
 *                       /   +-----------------------------------------------------------+
 *                  REG_DATA | CERT_ALG_ENCODE | CERT_CHAIN | SIGNATURE | SIGN_ALGORITHM |
 *                     /     +-----------------------------------------------------------+
 *     +-------------------------------------------------------+
 *     | CHALLENGE | USER_TOKEN | REG_TYPE | LEVELS | EXT_INFO |
 *     +-------------------------------------------------------+
 *
 */

/**
 *                      REG_RESPONSE
 *                        /      \
 *                       /   +-----------------------------------------------------------+
 *                     RRD   | CERT_ALG_ENCODE | CERT_CHAIN | SIGNATURE | SIGN_ALGORITHM |
 *                     /     +-----------------------------------------------------------+
 *     +------------------------------------------------------------------+
 *     | USER_TOKEN | PUB_ALG_ENCODE | PUB_KEY | KEY_TYPE | CHALLENGE     |
 *     | DEVICE_ID | REG_TYPE | REG_INFO | LEVEL | EXT_INFO               |
 *     +------------------------------------------------------------------+
 *
 */


/**
 *                      AUTH_REQUEST
 *                        /      \
 *                       /    +-----------------------------------------------------------+
 *                  AUTH_DATA | CERT_ALG_ENCODE | CERT_CHAIN | SIGNATURE | SIGN_ALGORITHM |
 *                     /      +-----------------------------------------------------------+
 *     +--------------------------------------------------------+
 *     | CHALLENGE | USER_TOKEN | AUTH_TYPE | LEVELS | EXT_INFO |
 *     +--------------------------------------------- ----------+
 *
 */


/**
 *                      AUTH_RESPONSE
 *                        /      \
 *                       /     +----------------------------+
 *                 SIGNED_DATA | SIGN_ALGORITHM | SIGNATURE |
 *                     /       +----------------------------+
 *     +----------------------------------------------------+
 *     | USER_TOKEN | CHALLENGE | DEVICE_ID | AUTH_TYPE     |
 *     | AUTH_INFO | LEVEL | EXT_INFO                       |
 *     +----------------------------------------------------+
 *
 */


/**
 *                      DEREG_REQUEST
 *                        /      \
 *                       /     +-----------------------------------------------------------+
 *                  DEREG_DATA | CERT_ENCODE_ALG | CERT_CHAIN | SIGNATURE | SIGN_ALGORITHM |
 *                     /       +-----------------------------------------------------------+
 *     +--------------------------------------------+
 *     | USER_TOKEN | AUTH_TYPE | LEVELS | EXT_INFO |
 *     +--------------------------------------------+
 *
 */


typedef enum {
    ASYM_KEY_RSA2048    = 1 << 0,
    ASYM_KEY_ECDSA256   = 1 << 1,
    ASYM_KEY_SM2        = 1 << 2,    //Density algorithm
    //more here
} IFAA_AsymmetricKeyType;



typedef enum {
    CERT_ENCODE_ALG_X509 = 1 << 0,
    CERT_ENCODE_ALG_IFAA = 1 << 1,    //Custom format
    //more here...
} IFAA_CertEncodeAlgorithm;


typedef enum {
    KEY_ENCODE_ALG_ECC_NISTP256R1_X962_RAW  = 1 << 0,
    KEY_ENCODE_ALG_ECC_NISTP256R1_X962_DER  = 1 << 1,
    KEY_ENCODE_ALG_RSA_2048_PSS_RAW         = 1 << 2,
    KEY_ENCODE_ALG_RSA_2048_PSS_DER         = 1 << 3,
    KEY_ENCODE_ALG_RSA_2048_PSS_IFAA        = 1 << 4,   //N and E big integer mode

    //more here...
} IFAA_PubKeyEncodeAlgorithm;

typedef enum {
    SIGN_ALG_ECDSA_SHA256_RAW = 0x01,
    SIGN_ALG_ECDSA_SHA256_DER,
    SIGN_ALG_RSA_SHA256_RAW,
    SIGN_ALG_RSA_SHA256_DER,
    SIGN_ALG_SHA256_PKCS7,
    //more here ...
} IFAA_SignAlgorithm;

typedef enum {
    //obligate
    SECURITY_LEVEL_TA_PER_MODULE    = 1 << 4,
    SECURITY_LEVEL_RPMB_PER_MODULE  = 1 << 5,
    SECURITY_LEVEL_RPMB_PER_DEVICE  = 1 << 6,
    SECURITY_LEVEL_SE_PER_DEVICE    = 1 << 7,
    //more in considering...
} IFAA_SecureLevel;


#endif //IFAACLIENTTESTAPP_IFAA_TLV_COMMON_H_H
