Package.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. // CommPackageImp.h: interface for the CCommPackageImp class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #if !defined(AFX_COMMPACKAGEIMP_H__6A4C03CE_9B9C_4AB1_AE7F_C02DA4A5012E__INCLUDED_)
  5. #define AFX_COMMPACKAGEIMP_H__6A4C03CE_9B9C_4AB1_AE7F_C02DA4A5012E__INCLUDED_
  6. #if _MSC_VER > 1000
  7. #pragma once
  8. #endif // _MSC_VER > 1000
  9. #include "RVCComm.h"
  10. #include <vector>
  11. #include <string>
  12. #include "des.h"
  13. #ifndef _WIN32
  14. #include <winpr/collections.h>
  15. #endif //NOT _WIN32
  16. #pragma warning(disable:4200)
  17. #pragma pack(1)
  18. // 包头定义
  19. struct CPackageHeader
  20. {
  21. WORD m_nFlag; // 标志位
  22. WORD m_nPackageLen; // 整包长
  23. BYTE m_nVersion; // 版本号
  24. BYTE m_nStructNum; // 不同接口数量
  25. char m_arrServiceCode[8]; // 服务代码
  26. DWORD m_nReqTime; // 请求时间(2000年开始秒数)
  27. WORD m_nSN; // 请求序号
  28. DWORD m_nAnsTime; // 应答时间(2000年开始秒数)
  29. BYTE m_arrMac[8]; // 校验码,整包校验值,在计算前把字段位置填为0x0
  30. CPackageHeader()
  31. {
  32. memset(this, 0, sizeof(CPackageHeader));
  33. m_nFlag = 0xA5C3;
  34. m_nVersion = 2; //version为1 ,使用的是旧式加密算法, version为2, 使用的是国密加密算法
  35. }
  36. };
  37. // 接口定义类
  38. struct CStructDef
  39. {
  40. WORD m_nTargetLen; // 目标长度(数组所有成员长度)
  41. WORD m_nSourceLen; // 源长度(数组所有成员长度)
  42. WORD m_nArrayNum; // 数组长度
  43. char m_cEncCode; // 加密标志
  44. char m_cZipCode; // 压缩标志
  45. char m_arrName[8]; // 接口名称
  46. BYTE *m_pData;
  47. CStructDef()
  48. {
  49. memset(this, 0, sizeof(CStructDef));
  50. }
  51. // 取接口定义体长度
  52. static int GetStructDefLen()
  53. {
  54. //return sizeof(CStructDef) - sizeof(BYTE *) *2 ;
  55. return sizeof(CStructDef)-sizeof(BYTE *);
  56. }
  57. };
  58. // 错误信息
  59. struct CErrorReturn
  60. {
  61. //char m_arrErrCode[8];
  62. DWORD m_dwSysCode; // 系统错误代码
  63. DWORD m_dwUserCode; // 用户错误代码
  64. char m_arrErrMsg[0]; // 变长,0-256
  65. };
  66. // 会话握手请求
  67. struct CSessionShakeReq
  68. {
  69. DWORD m_dwTokenHash; // 取TokenID Hash前4个字节
  70. DWORD m_dwSessionID; // 取SessionKey Hash前4个字节
  71. };
  72. // 使用共享会话密钥请求
  73. struct CUseSharedSKReq
  74. {
  75. char m_arrTerminalNo[16];
  76. DWORD m_dwSharedSKHash;
  77. };
  78. #pragma pack()
  79. #include <functional>
  80. struct CCommPackage : IPackage
  81. {
  82. public:
  83. CCommPackage(const BYTE sessionKey[16], const char *pServiceCode);
  84. CCommPackage(CCommPackage *pkg);
  85. virtual ~CCommPackage();
  86. // 增加接口数据,nBufLen包括所有数组元素的总长度,nArrayNum指定数组个数
  87. void AddStruct(const char *pStructName, bool bZip, bool bEncrypt,
  88. BYTE *pDataBuf, int nBufLen, int nArrayNum = 1);
  89. // 取接口数据长度
  90. int GetStructLen(const char *pStructName);
  91. // 取接口数据
  92. bool GetStructData(const char *pStructName, BYTE *pDataBuf,
  93. int *pBufLen, int *pArrayNum);
  94. // 解析接收包数据
  95. bool ParseRecvData(BYTE *pData, int *pLen, string& strErrMsg);
  96. // 生成发送包数据
  97. bool GenerateSendData(BYTE *pData, int *pLen);
  98. // 取发送包总长度
  99. int GetPackageLen();
  100. // 生成请求标识
  101. std::string GetPackageReqID();
  102. // 取服务代码
  103. std::string GetServiceCode();
  104. // 增加错误接口信息
  105. void SetErrMsg(DWORD dwSysCode, DWORD dwUserCode, const char *pErrMsg);
  106. // 检查并返回错误信息
  107. bool GetErrMsg(DWORD& dwSysCode, DWORD& dwUserCode, std::string& rErrMsg);
  108. static bool ZipData(BYTE* pSourceData, int nSourceLen, BYTE* pDestBuf, int* pDestLen);
  109. static bool UnzipData(BYTE* pSourceData, int nSourceLen, BYTE* pDestBuf, int* pDestLen);
  110. private:
  111. void Clear();
  112. bool GenerateMacMd5(BYTE *pData, int nLen, BYTE mac[8]);
  113. bool GenerateMacSM3(BYTE* pData, int nLen, BYTE mac[8]);
  114. bool EncryptDataByDES(BYTE* pSourceData, int nSourceLen, BYTE* pDestBuf, int* pDestLen);
  115. bool DecryptDataByDES(BYTE* pSourceData, int nSourceLen, BYTE* pDestBuf, int* pDestLen);
  116. bool EncryptDataBySM4(BYTE* pSourceData, int nSourceLen, BYTE* pDestBuf, int* pDestLen);
  117. bool DecryptDataBySM4(BYTE* pSourceData, int nSourceLen, BYTE* pDestBuf, int* pDestLen);
  118. std::function<bool(BYTE*, int, BYTE*, int*)> EncryptData, DecryptData;
  119. std::function<bool(BYTE*, int, BYTE*)> GenerateMac;
  120. private:
  121. std::vector<CStructDef*> m_Structs;
  122. CPackageHeader m_Header;
  123. BYTE m_SessionKey[16];
  124. bool m_bHasSessionKey;
  125. DES_key_schedule m_DesKey;
  126. unsigned char m_SM4Key[17];
  127. //BYTE m_DesIVec[8];
  128. static DWORD m_nLastReqTime;
  129. static WORD m_nLastReqSN;
  130. };
  131. #endif // !defined(AFX_COMMPACKAGEIMP_H__6A4C03CE_9B9C_4AB1_AE7F_C02DA4A5012E__INCLUDED_)