AccessAuthConn.h 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. #ifndef __ACCESSAUTHCONN_H
  2. #define __ACCESSAUTHCONN_H
  3. #include "SpSecureClient.h"
  4. #include "AccessAuthorization_def_g.h"
  5. #include "IHttpFunc.h"
  6. #include "publicFunExport.h"
  7. using namespace AccessAuthorization;
  8. #pragma pack(1)
  9. // 工作密钥更新请求
  10. // [StructName("WKU_REQ")]
  11. struct WKUpdateReq
  12. {
  13. char szTerminalNo[16]; // 终端号
  14. BYTE kmcData[0]; // 变长1到300
  15. };
  16. // 工作密钥更新返回
  17. // [StructName("WKU_RET")]
  18. struct WKUpdateRet
  19. {
  20. BYTE kmcData[0]; // 变长1到300
  21. };
  22. // 国密密钥更新请求
  23. // [StructName("SMWKU_RQ")]
  24. struct SMWKUpdateReq
  25. {
  26. char szTerminalNo[16]; // 终端号
  27. BYTE kmcData[0]; // 变长1到300
  28. };
  29. // 国密密钥更新返回
  30. // [StructName("SMWKU_RT")]
  31. struct SMWKUpdateRet
  32. {
  33. BYTE kmcData[0]; // 变长1到300
  34. };
  35. //获取KMC密钥
  36. struct KMCKeyReq {
  37. char TerminalNo[16];
  38. };
  39. struct KMCKeyRet {
  40. char TMK[64];
  41. char TPK[64];
  42. char EDK[64];
  43. char Index[8];
  44. char Reserved[256];
  45. };
  46. // 请求TOKEN时附带设备信息(未加密) 102 byte
  47. struct RequestTokenInfo
  48. {
  49. char szTerminalNo[16]; // 终端号 字符数字 16
  50. char szPadDeviceID[32]; // 外设ID 字符数字 32
  51. char szMachineType[16]; // 设备型号 字符 16
  52. BYTE machineVersion[4]; // 设备版本,低两位为小版本号,高两位为大版本号 Binary 4
  53. BYTE installVersion[8]; // 安装版本,其中包含软件框架版本 binary 8
  54. BYTE ip[4]; // 终端IP地址 binary 4
  55. char szSites[16]; // 设备部署场所代码 字符 16
  56. BYTE currentGPS[8]; // 当前终端的GPS坐标点 binary 8
  57. char chTerminalState; // 终端生命阶段状态 char 1
  58. char chRunState; // 系统状态 char 1
  59. };
  60. //判断是否进行了国密改造
  61. struct RequestTokenReq0
  62. {
  63. int isSM;
  64. int isFirst;//是否国密改造之后的第一次准入
  65. BYTE FingerPrintSM[16];
  66. };
  67. // 请求Token设备信息加密后结构(使用密码键盘加密)
  68. // [StructName("TOKEN_R1")]
  69. struct RequestTokenReq1
  70. {
  71. char szTerminalNo[16]; // 终端号
  72. BYTE tpk[140]; // 临时公钥 binary 140
  73. BYTE encTerminalInfo[112]; // 加密设备信息,包括头部4字节ASCII长度及右补0
  74. };
  75. // 请求Token附带实体信息
  76. // [StructName("TOKEN_R2")]
  77. struct RequestTokenReq2
  78. {
  79. char szType[32]; // 设备类型
  80. char szModal[32]; // 设备型号
  81. char szFactory[32]; // 厂家名称
  82. BYTE version[8]; // 硬件版本号
  83. };
  84. // 请求Token时,附带需要验证信息
  85. // [StructName("TOKEN_R3")]
  86. struct RequestTokenReq3
  87. {
  88. char szSignCertHash[40]; // 签名证书SHA1 Hash
  89. char szUKeyRootHash[40]; // UKEY证书SHA1 Hash
  90. BYTE nAuthVersion; // 准入请求版本: 1 借助KMC密钥验证;2 借助终端密钥动态生成会话密钥验证
  91. BYTE FingerPrint[16]; // 硬件指纹, @AuthVersion为1时有效, 上报指纹信息,解决生产中已初始化终端指纹收集问题
  92. BYTE PublicKey[148]; // 终端公钥, @AuthVersion为1时有效, 上报公钥信息,解决生产中已初始化终端公钥收集问题
  93. BYTE Reserved[11]; // 保留字段
  94. };
  95. // 请求TOKEN附加信息: PinPadID
  96. // [StructName("TOKEN_R4")]
  97. struct RequestTokenReq4
  98. {
  99. char szPinPadID[32]; // PinPadID
  100. char terminalNo[16];
  101. BYTE Reserved[240];
  102. };
  103. // 请求TOKEN附加信息: 密码键盘是否存在
  104. // [StructName("TOKEN_R5")]
  105. struct RequestTokenReq5
  106. {
  107. char chExistPinPad; // 是否有链接密码键盘,0:没有;1:有 char 1
  108. };
  109. // 令牌定义见RvcCommEntityBase中 TokenInfo
  110. // [StructName("TOKEN_RT")]
  111. struct RequestTokenRet
  112. {
  113. BYTE enToken[256]; // 使用准入服务签名后的TOKEN
  114. BYTE sharedSK[16]; // 共享会话密钥
  115. BYTE retHash[4]; // 返回结构Hash
  116. };
  117. //国密
  118. struct RequestTokenRet2
  119. {
  120. BYTE enToken[256]; // 使用准入服务签名后的TOKEN
  121. BYTE retHash[32]; // 返回结构Hash
  122. };
  123. // 退出准入上报
  124. // [StructName("EXIT_REQ")]
  125. struct TerminalExitReq
  126. {
  127. char szTerminalNo[16]; // 终端号 字符数字 16
  128. BYTE nTriggerReason; // 触发原因 Byte 1: 1) 准入到期; 2) IP改变; 3) 远程指令重新准入; 4) 本地控制退出准入; 5) 本地控制重新准入
  129. BYTE nRebootWay; // 将要重启方式,框架/操作系统/电源 byte 1
  130. char chTerminalStage; // 终端生命阶段状态 char 1
  131. };
  132. // 生命阶段改变上报
  133. // [StructName("STAGEREP")]
  134. struct TerminalStageReport
  135. {
  136. char szTerminalNo[16]; // 终端号
  137. BYTE IP[4]; // 终端IP地址
  138. char szSites[16]; // 设备部署场所代码
  139. BYTE LifeID[4]; // 生命标识
  140. BYTE CurrentGPS[8]; // 当前终端的GPS坐标点
  141. char cRunState; // 系统状态
  142. char cNewStage; // 当前终端生命阶段
  143. DWORD dwNewStageTime; //当前生命阶段设置时间
  144. char cLastStage; // 上一个终端生命阶段
  145. DWORD dwLastStageTime; //上一个终端生命阶段设置时间
  146. };
  147. // 时间同步请求
  148. // [StructName("SYNC_R1")]
  149. struct SyncTimeReq
  150. {
  151. char szTerminalNo[16]; // 终端号
  152. DWORD dwCurTime; // 终端当前时间
  153. BYTE byReserved[64]; // 保留字段
  154. };
  155. //是否进行国密改造
  156. struct SyncTimeReq2
  157. {
  158. int isSm;
  159. };
  160. // [StructName("SYNC_A1")]
  161. struct SyncTimeAns
  162. {
  163. int nTimeDiff; // 服务器与终端时间差
  164. BYTE nAuthVersion; // 准入请求版本: 1 借助KMC密钥验证;2 借助终端密钥动态生成会话密钥验证
  165. BYTE SessionKey[140]; // @nAuthVersion为1时有效,交换会话密钥,用于加密准入信息
  166. BYTE byReserved[64]; // 保留字段
  167. };
  168. struct InitDeviceReq0
  169. {
  170. int isSM;
  171. };
  172. // 外设加密握手包
  173. //[StructName("InitDevR")]
  174. struct InitDeviceReq
  175. {
  176. char vtmCR1[256];
  177. char vtmCR3[256];
  178. char R2[64];
  179. char CDevPubKey[360];
  180. char Verdor[64]; // @20170124: 厂商名称:nantian(南天); yotap(skyui)
  181. };
  182. //[StructName("InitDevA")]
  183. struct InitDeviceAns
  184. {
  185. char R1[64];
  186. char R3[64];
  187. char CR2[256];
  188. };
  189. // 状态上报
  190. // [REPSTA_R]
  191. struct ReportStateReq
  192. {
  193. char EventType[16]; // InitMK:初始化;UpdateWK:工作密钥更新;AccessAuth:准入
  194. char TerminalNo[32];
  195. char UserID[16]; // 初始化用户
  196. DWORD ErrorCode;
  197. char ErrorMsg[512]; // 错误描述
  198. };
  199. // 获取锁定状态
  200. // [StructName("LockStateReq")]
  201. struct LockStateReq
  202. {
  203. char TerminalNo[32]; // 终端号
  204. };
  205. //[StructName("LockStateAns")]
  206. struct LockStateAns
  207. {
  208. BYTE LockState;
  209. };
  210. // 获取MD5校验请求
  211. // [StructName("MD5REQ")]
  212. struct CheckMD5Req
  213. {
  214. char TerminalNo[32]; // 终端号
  215. char MD5Value[16]; // MD5值
  216. };
  217. #pragma pack()
  218. class CAccessAuthFSM;
  219. class CAccessAuthGetTokenReq;
  220. class CAccessAuthConn : public SpSecureClient
  221. {
  222. public:
  223. CAccessAuthConn(CEntityBase *pEntity, CAccessAuthFSM *pFSM);
  224. int HexBuf2StrBuf(PBYTE hexBuf, char** strBuf, DWORD len)
  225. {
  226. char* tmpStr = *strBuf;
  227. int count = 0;
  228. for (int i = 0; i < len; ++i)
  229. {
  230. sprintf(tmpStr + count, "%0.2X", hexBuf[i]);
  231. count += 2;
  232. }
  233. return 0;
  234. }
  235. DWORD SendSyncTimePackage();
  236. DWORD SendSyncTimePackageNew();
  237. DWORD SendLockStatePackage();
  238. DWORD SendWKUpdatePackage();
  239. DWORD SendGetTokenPackage();
  240. DWORD SendExitNoticePackage(int nReason, int nWay);
  241. DWORD SendTerminalStagePackage(char cNewStage, CSmallDateTime dtNewStageTime, char cOldStage, CSmallDateTime dtOldStageTime);
  242. DWORD SendInitDevicePackage(SpReqAnsContext<AccessAuthService_InitDev_Req, AccessAuthService_InitDev_Ans>::Pointer &ctx);
  243. DWORD SendReportStatePackage(const char*pszEventType, DWORD dwErrCode, const char *pszErrMsg);
  244. DWORD SendCheckMD5Package(const char* pMD5Value);
  245. DWORD SendUpdateMD5Package(const char* pMD5Value);
  246. private:
  247. ~CAccessAuthConn();
  248. void OnDisconnect();
  249. void OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg);
  250. DWORD HandleSyncTimeRet(const CSmartPointer<IPackage>& pRecvPkg);
  251. DWORD HandleLockStateRet(const CSmartPointer<IPackage>& pRecvPkg);
  252. DWORD HandleUpdateWKRet(const CSmartPointer<IPackage> &pRecvPkg);
  253. DWORD HandleReqTokenRet(const CSmartPointer<IPackage> &pRecvPkg);
  254. DWORD HandleTermExitRet(const CSmartPointer<IPackage> &pRecvPkg);
  255. DWORD HandleReportStageRet(const CSmartPointer<IPackage> &pRecvPkg);
  256. DWORD HandleInitDeviceRet(const CSmartPointer<IPackage> &pRecvPkg);
  257. DWORD HandleReportStateRet(const CSmartPointer<IPackage>& pRecvPkg);
  258. DWORD HandleCheckMD5Ret(const CSmartPointer<IPackage> &pRecvPkg);
  259. DWORD HandleUpdateMD5Ret(const CSmartPointer<IPackage> &pRecvPkg);
  260. bool GetSpBaseSignCertHash(CSimpleStringA &strHash);
  261. bool GetUKeyRootCertHash(CSimpleStringA &strHash);
  262. bool Sha1Hash(BYTE *pData, int nDataLen, BYTE hash[20]);
  263. public:
  264. DWORD HandleTimeSyn(int nTimeDiff, BYTE nAuthVersion, BYTE* nSessionKey);
  265. DWORD HandleLockState(int nState);
  266. DWORD HandleGetToken(BYTE* token, BYTE* sharedKey, BYTE* token2, BYTE* retHash);
  267. DWORD GetEncTerminalInfo(CBlob& encInfo);
  268. DWORD GetTmk(string &tmk);
  269. DWORD GetModalInfo(BYTE ** pDevInfo, int &nDevEntityCount);
  270. DWORD GetTokenReq(CAccessAuthGetTokenReq* getTokenReq);
  271. DWORD GetDeviceInfo(CEntityBase* pCallerEntity, const CSimpleStringA& devDeviceName,
  272. CSimpleStringA& strModel, CSimpleStringA& strVendor, CSimpleStringA& strVersion);
  273. DWORD GetAllDevices(CEntityBase* pEntity, CAutoArray<CSimpleStringA>& devs);
  274. SpReqAnsContext<AccessAuthService_InitDev_Req, AccessAuthService_InitDev_Ans>::Pointer m_ctxInitDev;
  275. public:
  276. /** 两边差异太大了,后续再合并吧 Gifur@2023424]*/
  277. int m_torelateDiffSyncTimeSecs;
  278. private:
  279. CAccessAuthFSM *m_pFSM;
  280. };
  281. #endif // !__ACCESSAUTHCONN_H