RVCComm.h 6.4 KB

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