RVCComm.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  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 OnAuthRequestSM(CConnAuthSMReq* pReq) { return true; }
  134. // 临时会话密钥返回,需使用临时私钥解锁,*pBufLen返回0表示解密失败
  135. virtual bool OnSessionKeyRet(CConnAuthRet *pRet, BYTE *pBuf, int *pBufLen){return true;}
  136. virtual bool OnSessionKeySMRet(CConnAuthSMRet* pRet, BYTE* pBuf, int* pBufLen) { return true; }
  137. // 鉴权通过,可以发送请求包
  138. virtual void OnAuthPass()=0;
  139. // 通过回调获取共享会话密钥(从令牌实体取出共享会话密钥)
  140. virtual bool OnGetSharedSK(char *pTerminalNo, int *pTerminalNoLen, BYTE *pSKBuf, int *pSKBufLen){return true;}
  141. // 异步接收
  142. virtual void OnReceivePackage(CSmartPointer<IPackage> &pRecvPkg)=0;
  143. // 连接中断通知
  144. virtual void OnClose()=0;
  145. // 错误回调,UserCode是后台服务自定义事件码, 如非后台服务产生的错误,则为0
  146. virtual void OnError(DWORD dwSysCode, DWORD dwUserCode, const char *pErrMsg) =0;
  147. #ifndef RVCCOMM_LINKED_AS_STATIC_LIBRARY
  148. #ifndef RVCCOMM_EXPORTS
  149. private:
  150. #endif
  151. #endif
  152. IClientCommFunc *m_pClientComm;
  153. LONG m_nRefCount;
  154. };
  155. /*
  156. // 服务端通讯接口类,提供TCP通信、鉴权、压缩、拆解包服务
  157. struct RVCCOMM_API CServerCommBase
  158. {
  159. virtual ~CServerCommBase(){}
  160. virtual bool BeginService(int nListenPort) =0;
  161. virtual void EndService() =0;
  162. virtual const string Send(int nConnectionID, const IPackage *pSendPkg) =0;
  163. // 应用使用完IPackage指针,需要手动delete
  164. virtual IPackage* CreateSendPackage(int nConnectionID, const char *pServiceCode) =0;
  165. virtual IPackage* CreateReplyPackage(IPackage *pRecvPkg) =0;
  166. };
  167. // 服务端回调接口,实现连接事件处理及错误处理
  168. struct RVCCOMM_API CServerCallback
  169. {
  170. virtual ~CServerCallback(){}
  171. virtual void OnError(int nConnectionID, const char *pErrCode, const char *pErrMsg) =0;
  172. virtual void OnAccept(int nConnectionID, const char *pClientAddr, int nClintPort) =0;
  173. // 要在方法返回前调用delete释放pRecvPkg
  174. virtual void OnReceive(int nConnectionID, IPackage *pRecvPkg) =0;
  175. virtual void OnClose(int nConnectionID) =0;
  176. CServerCommBase *m_pServerComm;
  177. };*/
  178. // 客户端通过此函数获得通讯类实例
  179. //IClientCommFunc* GetClientComm(CSecureClientBase *pClientBase);
  180. // 服务端通过此函数获得通讯类实例
  181. //RVCCOMM_API CServerCommBase* GetServerComm(CServerCallback *pCallback);
  182. // 生成临时RSA公私钥对, pPubKeyBufLen和pPriKeyBufLen输入时表示缓冲区长度,输出值表示实际密钥长度 (替换为SM2加密)
  183. RVCCOMM_API bool CreateRsaKeyPair(BYTE *pPubKeyBuf, int *pPubKeyBufLen, BYTE *pPriKeyBuf, int *pPriKeyBufLen);
  184. // 使用服务器公钥解密
  185. RVCCOMM_API bool DecWithServerPubKey(BYTE *pSource, int nSourceLen, BYTE *pDest, int *pDestLen);
  186. // 使用RSA公钥加密
  187. RVCCOMM_API bool EncWithRsaPubKey(BYTE *pSource, int nSourceLen, BYTE *pDest, int *pDestLen, BYTE *pRsaPubKey, int nKeyLen);
  188. // 使用RSA私钥加密
  189. RVCCOMM_API bool EncWithRsaPriKey(BYTE *pSource, int nSourceLen, BYTE *pDest, int *pDestLen, BYTE *pRsaPriKey, int nKeyLen);
  190. // 使用RSA公钥解密
  191. RVCCOMM_API bool DecWithRsaPubKey(BYTE *pSource, int nSourceLen, BYTE *pDest, int *pDestLen, BYTE *pRsaPubKey, int nKeyLen);
  192. // 使用RSA私钥解密
  193. RVCCOMM_API bool DecWithRsaPriKey(BYTE *pSource, int nSourceLen, BYTE *pDest, int *pDestLen, BYTE *pRsaPriKey, int nKeyLen);
  194. // 计算MD5值 (替换为SM3Hash)
  195. RVCCOMM_API bool MD5Hash(BYTE *pData, int nLen, BYTE md5[16]);
  196. // 取系统错误信息
  197. RVCCOMM_API string GetSysErrorMsg(int nErrorCode);
  198. // 获取SM234的version, 调用打印厂商和版本号
  199. /*
  200. * 功能:获取厂商信息和版本信息
  201. * 输入:无
  202. * 返回值:
  203. * TianDiRong-1.0-x86 天地融32位版本1.0
  204. * TianDiRong-1.0-x64 天地融64位版本1.0
  205. * KeYou-1.0-x86 科友32位版本1.0
  206. * KeYou-1.0-x64 科友64位版本1.0
  207. */
  208. RVCCOMM_API char* GetSMVersion();
  209. RVCCOMM_API bool subByteArr(BYTE* src, BYTE* dst, int offset, int size);
  210. // 计算SM3的值
  211. RVCCOMM_API bool SM3Hash(BYTE* pData, int nLen, BYTE hash[32]); //替换MD5
  212. //计算文件的SM3的值
  213. RVCCOMM_API bool SM3File(char* file, BYTE hash[32]);
  214. /*
  215. 功能:生成SM2公私钥对
  216. 输入:
  217. pPubKeyBuf : pubkey缓冲区的长度,至少为65字节
  218. pPriKeyBuf: privkey缓冲区的长度,至少为32字节
  219. 输出:
  220. pPubKeyBuf: 公钥
  221. pPubKeyBufLen : 公钥的字节数
  222. pPriKeyBuf: 私钥
  223. pPriKeyBufLen: 私钥的字节数
  224. 返回值:
  225. */
  226. RVCCOMM_API bool CreateSM2KeyPair(BYTE* pPubKeyBuf, int* pPubKeyBufLen, BYTE* pPriKeyBuf, int* pPriKeyBufLen);
  227. /*
  228. 功能:用SM2公钥加密数据。
  229. 输入:
  230. pPubKey: 公钥
  231. nKeyLen: 公钥的字节数
  232. pSource: 要加密的数据
  233. nSourceLen: pSource的字节数
  234. pDestLen : pDest缓冲区的长度,必须至少比pSource的长度多97字节
  235. 输出:
  236. pDest : 加密结果
  237. pDestLen : 加密结果的字节数
  238. 返回值:
  239. */
  240. RVCCOMM_API bool EncWithSM2PubKey(BYTE* pSource, int nSourceLen, BYTE* pDest, int* pDestLen, BYTE* pPubKey, int nKeyLen);
  241. /*
  242. 功能:用SM2私钥解密数据。
  243. 输入:
  244. pPriKey: 私钥
  245. nKeyLen: 私钥的字节数
  246. pSource : 要解密的数据,不少于97字节。
  247. nSourceLen: pSource的字节数
  248. pDestLen : pDest缓冲区的长度,至少为nSourceLen ~ 97字节
  249. 输出:
  250. pDest : 解密结果
  251. pDestLen : 解密结果的字节数
  252. 返回值:
  253. */
  254. RVCCOMM_API bool DecWithSM2PriKey(BYTE* pSource, int nSourceLen, BYTE* pDest, int* pDestLen, BYTE* pPriKey, int nKeyLen);
  255. /*
  256. 功能:SM2签名,userid默认为“1234567812345678”
  257. 输入:
  258. privkey: 私钥
  259. privkey_len: 私钥的字节数
  260. msg : 待签名的数据
  261. msg_len : 待签名的数据长度
  262. sig_len: signature缓冲区的长度
  263. 输出:
  264. signature: 签名
  265. sig_len: signature的长度
  266. 返回值:
  267. true: 成功
  268. len: signature为空时,返回所需的长度
  269. 其他: 待定义
  270. */
  271. RVCCOMM_API bool SM2SignWithSM3(unsigned char* privkey, int privkey_len, unsigned char* msg, int msg_len, unsigned char* signature, int* sig_len);
  272. /*
  273. 功能:验证SM2签名,userid默认为“1234567812345678”
  274. 输入:
  275. pubkey: 公钥
  276. pubkey _len: 公钥的字节数
  277. msg: 签名数据
  278. msg_len: 签名数据的字节数
  279. signature: 签名
  280. sig_len: 签名的字节数
  281. 返回值:
  282. true: 成功
  283. 其他: 待定义
  284. */
  285. RVCCOMM_API bool SM2VerifyWithSM3(unsigned char* pubkey, int pubkey_len, unsigned char* msg, int msg_len, unsigned char* signature, int sig_len);
  286. /*
  287. * 功能:SM4的ECB加密
  288. * 输入:
  289. key: 输入keyStr,为字符串
  290. input:需要加密的数据
  291. length:加密数据的长度
  292. output:加密后数据
  293. output_len:输入output的最大长度,返回加密后output的长度
  294. * 返回值:
  295. 是否成功
  296. */
  297. RVCCOMM_API bool EncWithSM4_ECB(std::string keyStr, BYTE* input, int length, BYTE* output, int* output_len);
  298. /*
  299. * 功能:SM4的ECB解密
  300. * 输入:
  301. key: 输入keyStr,为字符串
  302. input:需要解密的数据
  303. length:解密数据的长度
  304. output:解密后数据
  305. output_len:输入output的最大长度,返回解密后output的长度
  306. * 返回值:
  307. 是否成功
  308. */
  309. RVCCOMM_API bool DecWithSM4_ECB(std::string keyStr, BYTE* input, int length, BYTE* output, int* output_len);
  310. /*
  311. * 功能:SM4的ECB加密
  312. * 输入:
  313. key: 输入16位的密钥,可通过SM3Hash生成
  314. * 返回值:
  315. 是否成功
  316. */
  317. RVCCOMM_API bool EncWithSM4_ECB(BYTE key[16], BYTE* input, int length, BYTE* output, int* output_len);
  318. /*
  319. * 功能:SM4的ECB解密
  320. * 输入:
  321. key: 输入16位的密钥,可通过SM3Hash生成
  322. * 返回值:
  323. 是否成功
  324. */
  325. RVCCOMM_API bool DecWithSM4_ECB(BYTE key[16], BYTE* input, int length, BYTE* output, int* output_len);
  326. #endif