/************************************************************
* Details: 通信加密
* Encode: UTF-8
* Platform: Android & Linux
* Author: R&D 2
* Date: 2018-4-2
************************************************************/
#ifndef __GT_CORE_COMM_ENCRYPT_H__
#define __GT_CORE_COMM_ENCRYPT_H__

class GtCommEncrypt
{
    private:
        GtCommEncrypt();
        static GtCommEncrypt *_instance;
        char _localPubCrypto[1024];
        char _localPriCrypto[1024];
        char _serverCrypto[1024];
        int _localPubCryptoSize;
        int _localPriCryptoSize;
        int _serverCryptoSize;
        int _encryptType;
        const int _encryptOffset;

    public:
        virtual ~GtCommEncrypt();
        static GtCommEncrypt *instance();

        /************************************************************
        *功能：获取通信报文加密类型
        *输入：无
        *输出：无
        *返回：加密类型
        */
        int getCommEncryptType();

        /************************************************************
        *功能：生成密钥对
        *输入：无
        *输出：pubKey公钥
        *返回：!=0错误
        */
        int generateCommEncryptKey(char *pubKey);

        /************************************************************
        *功能：服务器通信密匙解密
        *输入：type加密类型，key加密密匙，keySize密匙长度
        *输出：无
        *返回：!=0错误
        */
        int commKeyDecrypt(int type, char *key, int keySize);

        /************************************************************
        *功能：通信报文数据加密
        *输入：data加密前数据，inBufLen缓存长度，inLen数据长度
        *输出：data加密后的通信报文，outLen加密后的数据长度
        *返回：!=0错误
        */
        int commDataEncrypt(unsigned char *data, int inBufLen, int inLen, int *outLen);

        /************************************************************
        *功能：通信报文数据解密
        *输入：bufLen=缓存长度
        *输出：dataBuf=解密后的通信报文
        *输出：dataLen=解密后的数据长度
        *返回：!=0错误
        */
        int commDataDecrypt(unsigned char *dataBuf, int bufLen, int *dataLen);
};

#endif
