RVCComm.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  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. #if defined(_MSC_VER)
  19. #include <WinSock2.h>
  20. #include <windows.h>
  21. #else
  22. #include <winpr/windows.h>
  23. #include <winpr/interlocked.h>
  24. #endif //_MSC_VER
  25. #ifndef RVCCOMM_TAG
  26. #include <winpr/wlog.h>
  27. #ifndef RVC_TAG
  28. #define RVC_TAG(tag) "rvc." tag
  29. #endif
  30. #define RVCCOMM_TAG(tag) RVC_TAG("rvccomm.") tag
  31. #endif //RVCCOMM_TAG
  32. #include <string>
  33. #include <vector>
  34. #include <algorithm>
  35. using namespace std;
  36. #include "SmartPointer.h"
  37. #pragma pack(1)
  38. //// 设备信息
  39. struct CVerifyInfo
  40. {
  41. char m_arrTerminalNo[16]; // 终端号
  42. BYTE m_arrIP[4]; // IP地址
  43. char m_arrServiceType[8]; // 通道类型
  44. };
  45. // 令牌信息(未签名)
  46. struct CTokenInfo
  47. {
  48. char m_arrTerminalNo[16]; // 终端号
  49. BYTE m_arrIP[4]; // 终端IP
  50. DWORD m_dwCreateTime; // 创建时间,从2000年开始秒数
  51. BYTE m_arrTempPubKey[140]; // 终端临时公钥
  52. BYTE m_arrHash[16]; // 结构体MD5值
  53. };
  54. // 会话密钥
  55. struct CSessionKey
  56. {
  57. BYTE m_arrSessionKey[16]; // 临时会话密钥
  58. char m_arrServiceName[16]; // 服务名称
  59. };
  60. // 连接鉴权请求结构
  61. struct CConnAuthReq
  62. {
  63. BYTE m_arrVerifyInfo[128]; // 客户端私钥加密后设备信息CVerifyInfo
  64. BYTE m_arrVerifyToken[256]; // 准入服务签名后令牌信息CTokenInfo
  65. };
  66. struct CConnAuthSMReq
  67. {
  68. BYTE m_arrVerifyInfo[256]; // 客户端公钥加密后设备信息CVerifyInfo
  69. BYTE m_arrVerifyToken[512]; // 准入服务签名后令牌信息CTokenInfo
  70. };
  71. struct CConnAuthSMRet
  72. {
  73. BYTE m_arrEncSessionKey[256]; // 客户端公钥加密后的CSessionKey
  74. };
  75. // 连接鉴权返回结构
  76. struct CConnAuthRet
  77. {
  78. BYTE m_arrEncSessionKey[128]; // 客户端公钥加密后的CSessionKey
  79. };
  80. #pragma pack()
  81. // 通讯包接口
  82. struct RVCCOMM_API IPackage
  83. {
  84. virtual ~IPackage(){}
  85. // 增加接口数据,nBufLen包括所有数组元素的总长度,nArrayNum指定数组个数
  86. virtual void AddStruct(const char *pStructName, bool bZip, bool bEncrpyt,
  87. BYTE *pDataBuf, int nBufLen, int nArrayNum = 1) =0;
  88. // 取接口数据长度(包括所有数组元素)
  89. virtual int GetStructLen(const char *pStructName) =0;
  90. // 取接口数据
  91. virtual bool GetStructData(const char *pStructName, BYTE *pDataBuf,
  92. int *pBufLen, int *pArrayNum) =0;
  93. // 取服务代码
  94. virtual string GetServiceCode() =0;
  95. // 设置返回错误结构信息
  96. virtual void SetErrMsg(DWORD dwSysCode, DWORD dwUserCode, const char *pErrMsg) =0;
  97. // 检查并返回错误结构信息
  98. virtual bool GetErrMsg(DWORD& dwSysCode, DWORD& dwUserCode, string& rErrMsg) =0;
  99. };
  100. // 客户端通讯接口类,由类库提供,封装TCP通信、鉴权、压缩、拆解包服务供业务使用
  101. struct RVCCOMM_API IClientCommFunc
  102. {
  103. virtual ~IClientCommFunc(){}
  104. virtual bool IsConnectionOK() =0;
  105. virtual bool IsSecureConnection() =0;
  106. // 创建连接,@option:1、重新鉴权新建会话密钥;2、通过握手使用缓存会话密钥;3、不使用会话密钥,即非安全通道
  107. // 4、不协商,直接使用共享会话密钥
  108. virtual bool Connect(const char *pServerAddr, int nPort, int nOption) =0;
  109. // 关闭连接
  110. virtual void Close() =0;
  111. // 发送通讯包
  112. virtual string SendPackage(const CSmartPointer<IPackage>& pSendPkg) =0;
  113. /*!
  114. * @brief 同步接收
  115. * @param[in] nWaitSecond 单位:秒
  116. */
  117. virtual CSmartPointer<IPackage> ReceivePackage(int nWaitSecond) =0;
  118. // 返回的IPackage指针
  119. virtual CSmartPointer<IPackage> CreateNewPackage(const char *pServiceCode) =0;
  120. virtual CSmartPointer<IPackage> CreateReplyPackage(const CSmartPointer<IPackage>& pRecvPkg) =0;
  121. };
  122. // 客户端业务基类,提供加解密及异步接收等回调处理
  123. struct RVCCOMM_API CSecureClientBase
  124. {
  125. protected:
  126. virtual ~CSecureClientBase(){delete m_pClientComm;}
  127. public:
  128. CSecureClientBase();
  129. void IncRefCount() { InterlockedIncrement(&m_nRefCount); }
  130. void DecRefCount() { if (0 == InterlockedDecrement(&m_nRefCount)) {delete this;} }
  131. CSmartPointer<IClientCommFunc> GetFunction(){return m_pClientComm;}
  132. // 鉴权开始,需提供Token信息和客户端私钥加密的设备信息
  133. virtual bool OnAuthRequest(CConnAuthReq *pReq){return true;}
  134. virtual bool OnAuthRequestSM(CConnAuthSMReq* pReq) { return true; }
  135. // 临时会话密钥返回,需使用临时私钥解锁,*pBufLen返回0表示解密失败
  136. virtual bool OnSessionKeyRet(CConnAuthRet *pRet, BYTE *pBuf, int *pBufLen){return true;}
  137. virtual bool OnSessionKeySMRet(CConnAuthSMRet* pRet, BYTE* pBuf, int* pBufLen) { return true; }
  138. // 鉴权通过,可以发送请求包
  139. virtual void OnAuthPass()=0;
  140. // 通过回调获取共享会话密钥(从令牌实体取出共享会话密钥)
  141. virtual bool OnGetSharedSK(char *pTerminalNo, int *pTerminalNoLen, BYTE *pSKBuf, int *pSKBufLen){return true;}
  142. // 异步接收
  143. virtual void OnReceivePackage(CSmartPointer<IPackage> &pRecvPkg)=0;
  144. // 连接中断通知
  145. virtual void OnClose()=0;
  146. // 错误回调,UserCode是后台服务自定义事件码, 如非后台服务产生的错误,则为0
  147. virtual void OnError(DWORD dwSysCode, DWORD dwUserCode, const char *pErrMsg) =0;
  148. #ifndef RVCCOMM_LINKED_AS_STATIC_LIBRARY
  149. #ifndef RVCCOMM_EXPORTS
  150. private:
  151. #endif
  152. #endif
  153. IClientCommFunc *m_pClientComm;
  154. LONG m_nRefCount;
  155. };
  156. /*
  157. // 服务端通讯接口类,提供TCP通信、鉴权、压缩、拆解包服务
  158. struct RVCCOMM_API CServerCommBase
  159. {
  160. virtual ~CServerCommBase(){}
  161. virtual bool BeginService(int nListenPort) =0;
  162. virtual void EndService() =0;
  163. virtual const string Send(int nConnectionID, const IPackage *pSendPkg) =0;
  164. // 应用使用完IPackage指针,需要手动delete
  165. virtual IPackage* CreateSendPackage(int nConnectionID, const char *pServiceCode) =0;
  166. virtual IPackage* CreateReplyPackage(IPackage *pRecvPkg) =0;
  167. };
  168. // 服务端回调接口,实现连接事件处理及错误处理
  169. struct RVCCOMM_API CServerCallback
  170. {
  171. virtual ~CServerCallback(){}
  172. virtual void OnError(int nConnectionID, const char *pErrCode, const char *pErrMsg) =0;
  173. virtual void OnAccept(int nConnectionID, const char *pClientAddr, int nClintPort) =0;
  174. // 要在方法返回前调用delete释放pRecvPkg
  175. virtual void OnReceive(int nConnectionID, IPackage *pRecvPkg) =0;
  176. virtual void OnClose(int nConnectionID) =0;
  177. CServerCommBase *m_pServerComm;
  178. };*/
  179. // 客户端通过此函数获得通讯类实例
  180. //IClientCommFunc* GetClientComm(CSecureClientBase *pClientBase);
  181. // 服务端通过此函数获得通讯类实例
  182. //RVCCOMM_API CServerCommBase* GetServerComm(CServerCallback *pCallback);
  183. // 生成临时RSA公私钥对, pPubKeyBufLen和pPriKeyBufLen输入时表示缓冲区长度,输出值表示实际密钥长度 (替换为SM2加密)
  184. RVCCOMM_API bool CreateRsaKeyPair(BYTE *pPubKeyBuf, int *pPubKeyBufLen, BYTE *pPriKeyBuf, int *pPriKeyBufLen);
  185. // 使用服务器公钥解密
  186. RVCCOMM_API bool DecWithServerPubKey(BYTE *pSource, int nSourceLen, BYTE *pDest, int *pDestLen);
  187. // 使用RSA公钥加密
  188. RVCCOMM_API bool EncWithRsaPubKey(BYTE *pSource, int nSourceLen, BYTE *pDest, int *pDestLen, BYTE *pRsaPubKey, int nKeyLen);
  189. // 使用RSA私钥加密
  190. RVCCOMM_API bool EncWithRsaPriKey(BYTE *pSource, int nSourceLen, BYTE *pDest, int *pDestLen, BYTE *pRsaPriKey, int nKeyLen);
  191. // 使用RSA公钥解密
  192. RVCCOMM_API bool DecWithRsaPubKey(BYTE *pSource, int nSourceLen, BYTE *pDest, int *pDestLen, BYTE *pRsaPubKey, int nKeyLen);
  193. // 使用RSA私钥解密
  194. RVCCOMM_API bool DecWithRsaPriKey(BYTE *pSource, int nSourceLen, BYTE *pDest, int *pDestLen, BYTE *pRsaPriKey, int nKeyLen);
  195. // 计算MD5值 (替换为SM3Hash)
  196. RVCCOMM_API bool MD5Hash(BYTE *pData, int nLen, BYTE md5[16]);
  197. // 取系统错误信息
  198. RVCCOMM_API string GetSysErrorMsg(int nErrorCode);
  199. // 获取SM234的version, 调用打印厂商和版本号
  200. /*
  201. * 功能:获取厂商信息和版本信息
  202. * 输入:无
  203. * 返回值:
  204. * TianDiRong-1.0-x86 天地融32位版本1.0
  205. * TianDiRong-1.0-x64 天地融64位版本1.0
  206. * KeYou-1.0-x86 科友32位版本1.0
  207. * KeYou-1.0-x64 科友64位版本1.0
  208. */
  209. RVCCOMM_API char* GetSMVersion();
  210. RVCCOMM_API bool subByteArr(BYTE* src, BYTE* dst, int offset, int size);
  211. // 计算SM3的值
  212. RVCCOMM_API bool SM3Hash(BYTE* pData, int nLen, BYTE hash[32]); //替换MD5
  213. //计算文件的SM3的值
  214. RVCCOMM_API bool SM3File(char* file, BYTE hash[32]);
  215. /*
  216. 功能:生成SM2公私钥对
  217. 输入:
  218. pPubKeyBuf : pubkey缓冲区的长度,至少为65字节
  219. pPriKeyBuf: privkey缓冲区的长度,至少为32字节
  220. 输出:
  221. pPubKeyBuf: 公钥
  222. pPubKeyBufLen : 公钥的字节数
  223. pPriKeyBuf: 私钥
  224. pPriKeyBufLen: 私钥的字节数
  225. 返回值:
  226. */
  227. RVCCOMM_API bool CreateSM2KeyPair(BYTE* pPubKeyBuf, int* pPubKeyBufLen, BYTE* pPriKeyBuf, int* pPriKeyBufLen);
  228. /*
  229. 功能:用SM2公钥加密数据。
  230. 输入:
  231. pPubKey: 公钥
  232. nKeyLen: 公钥的字节数
  233. pSource: 要加密的数据
  234. nSourceLen: pSource的字节数
  235. pDestLen : pDest缓冲区的长度,必须至少比pSource的长度多97字节
  236. 输出:
  237. pDest : 加密结果
  238. pDestLen : 加密结果的字节数
  239. 返回值:
  240. */
  241. RVCCOMM_API bool EncWithSM2PubKey(BYTE* pSource, int nSourceLen, BYTE* pDest, int* pDestLen, BYTE* pPubKey, int nKeyLen);
  242. /*
  243. 功能:用SM2私钥解密数据。
  244. 输入:
  245. pPriKey: 私钥
  246. nKeyLen: 私钥的字节数
  247. pSource : 要解密的数据,不少于97字节。
  248. nSourceLen: pSource的字节数
  249. pDestLen : pDest缓冲区的长度,至少为nSourceLen ~ 97字节
  250. 输出:
  251. pDest : 解密结果
  252. pDestLen : 解密结果的字节数
  253. 返回值:
  254. */
  255. RVCCOMM_API bool DecWithSM2PriKey(BYTE* pSource, int nSourceLen, BYTE* pDest, int* pDestLen, BYTE* pPriKey, int nKeyLen);
  256. /*
  257. 功能:SM2签名,userid默认为“1234567812345678”
  258. 输入:
  259. privkey: 私钥
  260. privkey_len: 私钥的字节数
  261. msg : 待签名的数据
  262. msg_len : 待签名的数据长度
  263. sig_len: signature缓冲区的长度
  264. 输出:
  265. signature: 签名
  266. sig_len: signature的长度
  267. 返回值:
  268. true: 成功
  269. len: signature为空时,返回所需的长度
  270. 其他: 待定义
  271. */
  272. RVCCOMM_API bool SM2SignWithSM3(unsigned char* privkey, int privkey_len, unsigned char* msg, int msg_len, unsigned char* signature, int* sig_len);
  273. /*
  274. 功能:验证SM2签名,userid默认为“1234567812345678”
  275. 输入:
  276. pubkey: 公钥
  277. pubkey _len: 公钥的字节数
  278. msg: 签名数据
  279. msg_len: 签名数据的字节数
  280. signature: 签名
  281. sig_len: 签名的字节数
  282. 返回值:
  283. true: 成功
  284. 其他: 待定义
  285. */
  286. RVCCOMM_API bool SM2VerifyWithSM3(unsigned char* pubkey, int pubkey_len, unsigned char* msg, int msg_len, unsigned char* signature, int sig_len);
  287. /*
  288. * 功能:SM4的ECB加密
  289. * 输入:
  290. key: 输入keyStr,为字符串
  291. input:需要加密的数据
  292. length:加密数据的长度
  293. output:加密后数据
  294. output_len:输入output的最大长度,返回加密后output的长度
  295. * 返回值:
  296. 是否成功
  297. */
  298. RVCCOMM_API bool EncWithSM4_ECB(std::string keyStr, BYTE* input, int length, BYTE* output, int* output_len);
  299. /*
  300. * 功能:SM4的ECB解密
  301. * 输入:
  302. key: 输入keyStr,为字符串
  303. input:需要解密的数据
  304. length:解密数据的长度
  305. output:解密后数据
  306. output_len:输入output的最大长度,返回解密后output的长度
  307. * 返回值:
  308. 是否成功
  309. */
  310. RVCCOMM_API bool DecWithSM4_ECB(std::string keyStr, BYTE* input, int length, BYTE* output, int* output_len);
  311. /*
  312. * 功能:SM4的ECB加密
  313. * 输入:
  314. key: 输入16位的密钥,可通过SM3Hash生成
  315. * 返回值:
  316. 是否成功
  317. */
  318. RVCCOMM_API bool EncWithSM4_ECB(BYTE key[16], BYTE* input, int length, BYTE* output, int* output_len);
  319. /*
  320. * 功能:SM4的ECB解密
  321. * 输入:
  322. key: 输入16位的密钥,可通过SM3Hash生成
  323. * 返回值:
  324. 是否成功
  325. */
  326. RVCCOMM_API bool DecWithSM4_ECB(BYTE key[16], BYTE* input, int length, BYTE* output, int* output_len);
  327. #endif