123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- // 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 <vector>
- #include <string>
- #include "des.h"
- #ifndef _WIN32
- #include <winpr/collections.h>
- #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 <functional>
- 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<bool(BYTE*, int, BYTE*, int*)> EncryptData, DecryptData;
- std::function<bool(BYTE*, int, BYTE*)> GenerateMac;
- private:
- std::vector<CStructDef*> 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_)
|