RVCComm.h 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. #if !defined(AFX_RVCCOMM_H__12A1FE2E_023E_4CB8_99C5_E3AF870A5007__INCLUDED_)
  2. #define AFX_RVCCOMM_H__12A1FE2E_023E_4CB8_99C5_E3AF870A5007__INCLUDED_
  3. #ifdef RVCCOMM_LINKED_AS_STATIC_LIBRARY
  4. #define RVCCOMM_API
  5. #else
  6. #ifdef _WIN32
  7. #ifdef RVCCOMM_EXPORTS
  8. #define RVCCOMM_API __declspec(dllexport)
  9. #else
  10. #define RVCCOMM_API __declspec(dllimport)
  11. #endif
  12. # elif ( defined(__GNUC__) && __GNUC__ >= 4 )
  13. #define RVCCOMM_API __attribute__((visibility("default")))
  14. #else // _WIN32
  15. #define RVCCOMM_API
  16. #endif // _WIN32
  17. #endif
  18. #include <winpr/windows.h>
  19. #include <winpr/interlocked.h>
  20. #include <string>
  21. #include <vector>
  22. using namespace std;
  23. #include "SmartPointer.h"
  24. #pragma pack(1)
  25. //// 设备信息
  26. struct CVerifyInfo
  27. {
  28. char m_arrTerminalNo[16]; // 终端号
  29. BYTE m_arrIP[4]; // IP地址
  30. char m_arrServiceType[8]; // 通道类型
  31. };
  32. // 令牌信息(未签名)
  33. struct CTokenInfo
  34. {
  35. char m_arrTerminalNo[16]; // 终端号
  36. BYTE m_arrIP[4]; // 终端IP
  37. DWORD m_dwCreateTime; // 创建时间,从2000年开始秒数
  38. BYTE m_arrTempPubKey[140]; // 终端临时公钥
  39. BYTE m_arrHash[16]; // 结构体MD5值
  40. };
  41. // 会话密钥
  42. struct CSessionKey
  43. {
  44. BYTE m_arrSessionKey[16]; // 临时会话密钥
  45. char m_arrServiceName[16]; // 服务名称
  46. };
  47. // 连接鉴权请求结构
  48. struct CConnAuthReq
  49. {
  50. BYTE m_arrVerifyInfo[128]; // 客户端私钥加密后设备信息CVerifyInfo
  51. BYTE m_arrVerifyToken[256]; // 准入服务签名后令牌信息CTokenInfo
  52. };
  53. // 连接鉴权返回结构
  54. struct CConnAuthRet
  55. {
  56. BYTE m_arrEncSessionKey[128]; // 客户端公钥加密后的CSessionKey
  57. };
  58. #pragma pack()
  59. // 通讯包接口
  60. struct RVCCOMM_API IPackage
  61. {
  62. virtual ~IPackage(){}
  63. // 增加接口数据,nBufLen包括所有数组元素的总长度,nArrayNum指定数组个数
  64. virtual void AddStruct(const char *pStructName, bool bZip, bool bEncrpyt,
  65. BYTE *pDataBuf, int nBufLen, int nArrayNum = 1) =0;
  66. // 取接口数据长度(包括所有数组元素)
  67. virtual int GetStructLen(const char *pStructName) =0;
  68. // 取接口数据
  69. virtual bool GetStructData(const char *pStructName, BYTE *pDataBuf,
  70. int *pBufLen, int *pArrayNum) =0;
  71. // 取服务代码
  72. virtual string GetServiceCode() =0;
  73. // 设置返回错误结构信息
  74. virtual void SetErrMsg(DWORD dwSysCode, DWORD dwUserCode, const char *pErrMsg) =0;
  75. // 检查并返回错误结构信息
  76. virtual bool GetErrMsg(DWORD& dwSysCode, DWORD& dwUserCode, string& rErrMsg) =0;
  77. };
  78. // 客户端通讯接口类,由类库提供,封装TCP通信、鉴权、压缩、拆解包服务供业务使用
  79. struct RVCCOMM_API IClientCommFunc
  80. {
  81. virtual ~IClientCommFunc(){}
  82. virtual bool IsConnectionOK() =0;
  83. virtual bool IsSecureConnection() =0;
  84. // 创建连接,@option:1、重新鉴权新建会话密钥;2、通过握手使用缓存会话密钥;3、不使用会话密钥,即非安全通道
  85. // 4、不协商,直接使用共享会话密钥
  86. virtual bool Connect(const char *pServerAddr, int nPort, int nOption) =0;
  87. // 关闭连接
  88. virtual void Close() =0;
  89. // 发送通讯包
  90. virtual string SendPackage(const CSmartPointer<IPackage>& pSendPkg) =0;
  91. // 同步接收
  92. virtual CSmartPointer<IPackage> ReceivePackage(int nWaitSecond) =0;
  93. // 返回的IPackage指针
  94. virtual CSmartPointer<IPackage> CreateNewPackage(const char *pServiceCode) =0;
  95. virtual CSmartPointer<IPackage> CreateReplyPackage(const CSmartPointer<IPackage>& pRecvPkg) =0;
  96. };
  97. // 客户端业务基类,提供加解密及异步接收等回调处理
  98. struct RVCCOMM_API CSecureClientBase
  99. {
  100. protected:
  101. virtual ~CSecureClientBase(){delete m_pClientComm;}
  102. public:
  103. CSecureClientBase();
  104. void IncRefCount() { InterlockedIncrement(&m_nRefCount); }
  105. void DecRefCount() { if (0 == InterlockedDecrement(&m_nRefCount)) {delete this;} }
  106. CSmartPointer<IClientCommFunc> GetFunction(){return m_pClientComm;}
  107. // 鉴权开始,需提供Token信息和客户端私钥加密的设备信息
  108. virtual bool OnAuthRequest(CConnAuthReq *pReq){return true;}
  109. // 临时会话密钥返回,需使用临时私钥解锁,*pBufLen返回0表示解密失败
  110. virtual bool OnSessionKeyRet(CConnAuthRet *pRet, BYTE *pBuf, int *pBufLen){return true;}
  111. // 鉴权通过,可以发送请求包
  112. virtual void OnAuthPass()=0;
  113. // 通过回调获取共享会话密钥(从令牌实体取出共享会话密钥)
  114. virtual bool OnGetSharedSK(char *pTerminalNo, int *pTerminalNoLen, BYTE *pSKBuf, int *pSKBufLen){return true;}
  115. // 异步接收
  116. virtual void OnReceivePackage(CSmartPointer<IPackage> &pRecvPkg)=0;
  117. // 连接中断通知
  118. virtual void OnClose()=0;
  119. // 错误回调,UserCode是后台服务自定义事件码, 如非后台服务产生的错误,则为0
  120. virtual void OnError(DWORD dwSysCode, DWORD dwUserCode, const char *pErrMsg) =0;
  121. #ifndef RVCCOMM_LINKED_AS_STATIC_LIBRARY
  122. #ifndef RVCCOMM_EXPORTS
  123. private:
  124. #endif
  125. #endif
  126. IClientCommFunc *m_pClientComm;
  127. LONG m_nRefCount;
  128. };
  129. /*
  130. // 服务端通讯接口类,提供TCP通信、鉴权、压缩、拆解包服务
  131. struct RVCCOMM_API CServerCommBase
  132. {
  133. virtual ~CServerCommBase(){}
  134. virtual bool BeginService(int nListenPort) =0;
  135. virtual void EndService() =0;
  136. virtual const string Send(int nConnectionID, const IPackage *pSendPkg) =0;
  137. // 应用使用完IPackage指针,需要手动delete
  138. virtual IPackage* CreateSendPackage(int nConnectionID, const char *pServiceCode) =0;
  139. virtual IPackage* CreateReplyPackage(IPackage *pRecvPkg) =0;
  140. };
  141. // 服务端回调接口,实现连接事件处理及错误处理
  142. struct RVCCOMM_API CServerCallback
  143. {
  144. virtual ~CServerCallback(){}
  145. virtual void OnError(int nConnectionID, const char *pErrCode, const char *pErrMsg) =0;
  146. virtual void OnAccept(int nConnectionID, const char *pClientAddr, int nClintPort) =0;
  147. // 要在方法返回前调用delete释放pRecvPkg
  148. virtual void OnReceive(int nConnectionID, IPackage *pRecvPkg) =0;
  149. virtual void OnClose(int nConnectionID) =0;
  150. CServerCommBase *m_pServerComm;
  151. };*/
  152. // 客户端通过此函数获得通讯类实例
  153. //IClientCommFunc* GetClientComm(CSecureClientBase *pClientBase);
  154. // 服务端通过此函数获得通讯类实例
  155. //RVCCOMM_API CServerCommBase* GetServerComm(CServerCallback *pCallback);
  156. // 生成临时RSA公私钥对, pPubKeyBufLen和pPriKeyBufLen输入时表示缓冲区长度,输出值表示实际密钥长度
  157. RVCCOMM_API bool CreateRsaKeyPair(BYTE *pPubKeyBuf, int *pPubKeyBufLen, BYTE *pPriKeyBuf, int *pPriKeyBufLen);
  158. // 使用服务器公钥解密
  159. RVCCOMM_API bool DecWithServerPubKey(BYTE *pSource, int nSourceLen, BYTE *pDest, int *pDestLen);
  160. // 使用RSA公钥加密
  161. RVCCOMM_API bool EncWithRsaPubKey(BYTE *pSource, int nSourceLen, BYTE *pDest, int *pDestLen, BYTE *pRsaPubKey, int nKeyLen);
  162. // 使用RSA私钥加密
  163. RVCCOMM_API bool EncWithRsaPriKey(BYTE *pSource, int nSourceLen, BYTE *pDest, int *pDestLen, BYTE *pRsaPriKey, int nKeyLen);
  164. // 使用RSA公钥解密
  165. RVCCOMM_API bool DecWithRsaPubKey(BYTE *pSource, int nSourceLen, BYTE *pDest, int *pDestLen, BYTE *pRsaPubKey, int nKeyLen);
  166. // 使用RSA私钥解密
  167. RVCCOMM_API bool DecWithRsaPriKey(BYTE *pSource, int nSourceLen, BYTE *pDest, int *pDestLen, BYTE *pRsaPriKey, int nKeyLen);
  168. // 计算MD5值
  169. RVCCOMM_API bool MD5Hash(BYTE *pData, int nLen, BYTE md5[16]);
  170. // 取系统错误信息
  171. RVCCOMM_API string GetSysErrorMsg(int nErrorCode);
  172. #endif