// CommPackageImp.h: interface for the CCommPackageImp class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_COMMPACKAGEIMP_H__6A4C03CE_9B9C_4AB1_AE7F_C02DA4A5012E__INCLUDED_) #define AFX_COMMPACKAGEIMP_H__6A4C03CE_9B9C_4AB1_AE7F_C02DA4A5012E__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "RVCComm.h" #include #include #include "des.h" #ifndef _WIN32 #include #endif //NOT _WIN32 #pragma warning(disable:4200) #pragma pack(1) // 包头定义 struct CPackageHeader { WORD m_nFlag; // 标志位 WORD m_nPackageLen; // 整包长 BYTE m_nVersion; // 版本号 BYTE m_nStructNum; // 不同接口数量 char m_arrServiceCode[8]; // 服务代码 DWORD m_nReqTime; // 请求时间(2000年开始秒数) WORD m_nSN; // 请求序号 DWORD m_nAnsTime; // 应答时间(2000年开始秒数) BYTE m_arrMac[8]; // 校验码,整包校验值,在计算前把字段位置填为0x0 CPackageHeader() { memset(this, 0, sizeof(CPackageHeader)); m_nFlag = 0xA5C3; m_nVersion = 2; //version为1 ,使用的是旧式加密算法, version为2, 使用的是国密加密算法 } }; // 接口定义类 struct CStructDef { WORD m_nTargetLen; // 目标长度(数组所有成员长度) WORD m_nSourceLen; // 源长度(数组所有成员长度) WORD m_nArrayNum; // 数组长度 char m_cEncCode; // 加密标志 char m_cZipCode; // 压缩标志 char m_arrName[8]; // 接口名称 BYTE *m_pData; CStructDef() { memset(this, 0, sizeof(CStructDef)); } // 取接口定义体长度 static int GetStructDefLen() { //return sizeof(CStructDef) - sizeof(BYTE *) *2 ; return sizeof(CStructDef)-sizeof(BYTE *); } }; // 错误信息 struct CErrorReturn { //char m_arrErrCode[8]; DWORD m_dwSysCode; // 系统错误代码 DWORD m_dwUserCode; // 用户错误代码 char m_arrErrMsg[0]; // 变长,0-256 }; // 会话握手请求 struct CSessionShakeReq { DWORD m_dwTokenHash; // 取TokenID Hash前4个字节 DWORD m_dwSessionID; // 取SessionKey Hash前4个字节 }; // 使用共享会话密钥请求 struct CUseSharedSKReq { char m_arrTerminalNo[16]; DWORD m_dwSharedSKHash; }; #pragma pack() #include struct CCommPackage : IPackage { public: CCommPackage(const BYTE sessionKey[16], const char *pServiceCode); CCommPackage(CCommPackage *pkg); virtual ~CCommPackage(); // 增加接口数据,nBufLen包括所有数组元素的总长度,nArrayNum指定数组个数 void AddStruct(const char *pStructName, bool bZip, bool bEncrypt, BYTE *pDataBuf, int nBufLen, int nArrayNum = 1); // 取接口数据长度 int GetStructLen(const char *pStructName); // 取接口数据 bool GetStructData(const char *pStructName, BYTE *pDataBuf, int *pBufLen, int *pArrayNum); // 解析接收包数据 bool ParseRecvData(BYTE *pData, int *pLen, string& strErrMsg); // 生成发送包数据 bool GenerateSendData(BYTE *pData, int *pLen); // 取发送包总长度 int GetPackageLen(); // 生成请求标识 std::string GetPackageReqID(); // 取服务代码 std::string GetServiceCode(); // 增加错误接口信息 void SetErrMsg(DWORD dwSysCode, DWORD dwUserCode, const char *pErrMsg); // 检查并返回错误信息 bool GetErrMsg(DWORD& dwSysCode, DWORD& dwUserCode, std::string& rErrMsg); static bool ZipData(BYTE* pSourceData, int nSourceLen, BYTE* pDestBuf, int* pDestLen); static bool UnzipData(BYTE* pSourceData, int nSourceLen, BYTE* pDestBuf, int* pDestLen); private: void Clear(); bool GenerateMacMd5(BYTE *pData, int nLen, BYTE mac[8]); bool GenerateMacSM3(BYTE* pData, int nLen, BYTE mac[8]); bool EncryptDataByDES(BYTE* pSourceData, int nSourceLen, BYTE* pDestBuf, int* pDestLen); bool DecryptDataByDES(BYTE* pSourceData, int nSourceLen, BYTE* pDestBuf, int* pDestLen); bool EncryptDataBySM4(BYTE* pSourceData, int nSourceLen, BYTE* pDestBuf, int* pDestLen); bool DecryptDataBySM4(BYTE* pSourceData, int nSourceLen, BYTE* pDestBuf, int* pDestLen); std::function EncryptData, DecryptData; std::function GenerateMac; private: std::vector m_Structs; CPackageHeader m_Header; BYTE m_SessionKey[16]; bool m_bHasSessionKey; DES_key_schedule m_DesKey; unsigned char m_SM4Key[17]; //BYTE m_DesIVec[8]; static DWORD m_nLastReqTime; static WORD m_nLastReqSN; }; #endif // !defined(AFX_COMMPACKAGEIMP_H__6A4C03CE_9B9C_4AB1_AE7F_C02DA4A5012E__INCLUDED_)