| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- #if !defined(AFX_RVCCOMM_H__12A1FE2E_023E_4CB8_99C5_E3AF870A5007__INCLUDED_)
- #define AFX_RVCCOMM_H__12A1FE2E_023E_4CB8_99C5_E3AF870A5007__INCLUDED_
- #ifdef RVCCOMM_LINKED_AS_STATIC_LIBRARY
- #define RVCCOMM_API
- #else
- #ifdef RVCCOMM_EXPORTS
- #define RVCCOMM_API __declspec(dllexport)
- #else
- #define RVCCOMM_API __declspec(dllimport)
- #endif
- #endif
- #include <windows.h>
- #include <string>
- #include <vector>
- using namespace std;
- #include "SmartPointer.h"
- #pragma pack(1)
- //// 设备信息
- struct CVerifyInfo
- {
- char m_arrTerminalNo[16]; // 终端号
- BYTE m_arrIP[4]; // IP地址
- char m_arrServiceType[8]; // 通道类型
- };
- // 令牌信息(未签名)
- struct CTokenInfo
- {
- char m_arrTerminalNo[16]; // 终端号
- BYTE m_arrIP[4]; // 终端IP
- DWORD m_dwCreateTime; // 创建时间,从2000年开始秒数
- BYTE m_arrTempPubKey[140]; // 终端临时公钥
- BYTE m_arrHash[16]; // 结构体MD5值
- };
- // 会话密钥
- struct CSessionKey
- {
- BYTE m_arrSessionKey[16]; // 临时会话密钥
- char m_arrServiceName[16]; // 服务名称
- };
- // 连接鉴权请求结构
- struct CConnAuthReq
- {
- BYTE m_arrVerifyInfo[128]; // 客户端私钥加密后设备信息CVerifyInfo
- BYTE m_arrVerifyToken[256]; // 准入服务签名后令牌信息CTokenInfo
- };
- // 连接鉴权返回结构
- struct CConnAuthRet
- {
- BYTE m_arrEncSessionKey[128]; // 客户端公钥加密后的CSessionKey
- };
- #pragma pack()
- // 通讯包接口
- struct RVCCOMM_API IPackage
- {
- virtual ~IPackage(){}
- // 增加接口数据,nBufLen包括所有数组元素的总长度,nArrayNum指定数组个数
- virtual void AddStruct(const char *pStructName, bool bZip, bool bEncrpyt,
- BYTE *pDataBuf, int nBufLen, int nArrayNum = 1) =0;
- // 取接口数据长度(包括所有数组元素)
- virtual int GetStructLen(const char *pStructName) =0;
- // 取接口数据
- virtual bool GetStructData(const char *pStructName, BYTE *pDataBuf,
- int *pBufLen, int *pArrayNum) =0;
- // 取服务代码
- virtual string GetServiceCode() =0;
- // 设置返回错误结构信息
- virtual void SetErrMsg(DWORD dwSysCode, DWORD dwUserCode, const char *pErrMsg) =0;
- // 检查并返回错误结构信息
- virtual bool GetErrMsg(DWORD& dwSysCode, DWORD& dwUserCode, string& rErrMsg) =0;
- };
- // 客户端通讯接口类,由类库提供,封装TCP通信、鉴权、压缩、拆解包服务供业务使用
- struct RVCCOMM_API IClientCommFunc
- {
- virtual ~IClientCommFunc(){}
- virtual bool IsConnectionOK() =0;
- virtual bool IsSecureConnection() =0;
- // 创建连接,@option:1、重新鉴权新建会话密钥;2、通过握手使用缓存会话密钥;3、不使用会话密钥,即非安全通道
- // 4、不协商,直接使用共享会话密钥
- virtual bool Connect(const char *pServerAddr, int nPort, int nOption) =0;
- // 关闭连接
- virtual void Close() =0;
- // 发送通讯包
- virtual string SendPackage(const CSmartPointer<IPackage>& pSendPkg) =0;
- // 同步接收
- virtual CSmartPointer<IPackage> ReceivePackage(int nWaitSecond) =0;
- // 返回的IPackage指针
- virtual CSmartPointer<IPackage> CreateNewPackage(const char *pServiceCode) =0;
- virtual CSmartPointer<IPackage> CreateReplyPackage(const CSmartPointer<IPackage>& pRecvPkg) =0;
- };
- // 客户端业务基类,提供加解密及异步接收等回调处理
- struct RVCCOMM_API CSecureClientBase
- {
- protected:
- virtual ~CSecureClientBase(){delete m_pClientComm;}
- public:
- CSecureClientBase();
- void IncRefCount() { InterlockedIncrement(&m_nRefCount); }
- void DecRefCount() { if (0 == InterlockedDecrement(&m_nRefCount)) {delete this;} }
- CSmartPointer<IClientCommFunc> GetFunction(){return m_pClientComm;}
- // 鉴权开始,需提供Token信息和客户端私钥加密的设备信息
- virtual bool OnAuthRequest(CConnAuthReq *pReq){return true;}
- // 临时会话密钥返回,需使用临时私钥解锁,*pBufLen返回0表示解密失败
- virtual bool OnSessionKeyRet(CConnAuthRet *pRet, BYTE *pBuf, int *pBufLen){return true;}
- // 鉴权通过,可以发送请求包
- virtual void OnAuthPass()=0;
- // 通过回调获取共享会话密钥(从令牌实体取出共享会话密钥)
- virtual bool OnGetSharedSK(char *pTerminalNo, int *pTerminalNoLen, BYTE *pSKBuf, int *pSKBufLen){return true;}
- // 异步接收
- virtual void OnReceivePackage(CSmartPointer<IPackage> &pRecvPkg)=0;
- // 连接中断通知
- virtual void OnClose()=0;
- // 错误回调,UserCode是后台服务自定义事件码, 如非后台服务产生的错误,则为0
- virtual void OnError(DWORD dwSysCode, DWORD dwUserCode, const char *pErrMsg) =0;
- #ifndef RVCCOMM_LINKED_AS_STATIC_LIBRARY
- #ifndef RVCCOMM_EXPORTS
- private:
- #endif
- #endif
- IClientCommFunc *m_pClientComm;
- LONG m_nRefCount;
- };
- /*
- // 服务端通讯接口类,提供TCP通信、鉴权、压缩、拆解包服务
- struct RVCCOMM_API CServerCommBase
- {
- virtual ~CServerCommBase(){}
- virtual bool BeginService(int nListenPort) =0;
- virtual void EndService() =0;
- virtual const string Send(int nConnectionID, const IPackage *pSendPkg) =0;
- // 应用使用完IPackage指针,需要手动delete
- virtual IPackage* CreateSendPackage(int nConnectionID, const char *pServiceCode) =0;
- virtual IPackage* CreateReplyPackage(IPackage *pRecvPkg) =0;
- };
- // 服务端回调接口,实现连接事件处理及错误处理
- struct RVCCOMM_API CServerCallback
- {
- virtual ~CServerCallback(){}
- virtual void OnError(int nConnectionID, const char *pErrCode, const char *pErrMsg) =0;
- virtual void OnAccept(int nConnectionID, const char *pClientAddr, int nClintPort) =0;
- // 要在方法返回前调用delete释放pRecvPkg
- virtual void OnReceive(int nConnectionID, IPackage *pRecvPkg) =0;
-
- virtual void OnClose(int nConnectionID) =0;
- CServerCommBase *m_pServerComm;
- };*/
- // 客户端通过此函数获得通讯类实例
- //IClientCommFunc* GetClientComm(CSecureClientBase *pClientBase);
- // 服务端通过此函数获得通讯类实例
- //RVCCOMM_API CServerCommBase* GetServerComm(CServerCallback *pCallback);
- // 生成临时RSA公私钥对, pPubKeyBufLen和pPriKeyBufLen输入时表示缓冲区长度,输出值表示实际密钥长度
- RVCCOMM_API bool CreateRsaKeyPair(BYTE *pPubKeyBuf, int *pPubKeyBufLen, BYTE *pPriKeyBuf, int *pPriKeyBufLen);
- // 使用服务器公钥解密
- RVCCOMM_API bool DecWithServerPubKey(BYTE *pSource, int nSourceLen, BYTE *pDest, int *pDestLen);
- // 使用RSA公钥加密
- RVCCOMM_API bool EncWithRsaPubKey(BYTE *pSource, int nSourceLen, BYTE *pDest, int *pDestLen, BYTE *pRsaPubKey, int nKeyLen);
- // 使用RSA私钥加密
- RVCCOMM_API bool EncWithRsaPriKey(BYTE *pSource, int nSourceLen, BYTE *pDest, int *pDestLen, BYTE *pRsaPriKey, int nKeyLen);
- // 使用RSA公钥解密
- RVCCOMM_API bool DecWithRsaPubKey(BYTE *pSource, int nSourceLen, BYTE *pDest, int *pDestLen, BYTE *pRsaPubKey, int nKeyLen);
- // 使用RSA私钥解密
- RVCCOMM_API bool DecWithRsaPriKey(BYTE *pSource, int nSourceLen, BYTE *pDest, int *pDestLen, BYTE *pRsaPriKey, int nKeyLen);
- // 计算MD5值
- RVCCOMM_API bool MD5Hash(BYTE *pData, int nLen, BYTE md5[16]);
- // 取系统错误信息
- RVCCOMM_API string GetSysErrorMsg(int nErrorCode);
- #endif
|