AccessAuthConn.h 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. #pragma once
  2. #include "SpSecureClient.h"
  3. #include "AccessAuthorization_def_g.h"
  4. using namespace AccessAuthorization;
  5. #pragma pack(1)
  6. // 工作密钥更新请求
  7. // [StructName("WKU_REQ")]
  8. struct WKUpdateReq
  9. {
  10. char szTerminalNo[16]; // 终端号
  11. BYTE kmcData[0]; // 变长1到300
  12. };
  13. // 工作密钥更新返回
  14. // [StructName("WKU_RET")]
  15. struct WKUpdateRet
  16. {
  17. BYTE kmcData[0]; // 变长1到300
  18. };
  19. // 国密密钥更新请求
  20. // [StructName("SMWKU_RQ")]
  21. struct SMWKUpdateReq
  22. {
  23. char szTerminalNo[16]; // 终端号
  24. BYTE kmcData[0]; // 变长1到300
  25. };
  26. // 国密密钥更新返回
  27. // [StructName("SMWKU_RT")]
  28. struct SMWKUpdateRet
  29. {
  30. BYTE kmcData[0]; // 变长1到300
  31. };
  32. // 请求TOKEN时附带设备信息(未加密) 102 byte
  33. struct RequestTokenInfo
  34. {
  35. char szTerminalNo[16]; // 终端号 字符数字 16
  36. char szPadDeviceID[32]; // 外设ID 字符数字 32
  37. char szMachineType[16]; // 设备型号 字符 16
  38. BYTE machineVersion[4]; // 设备版本,低两位为小版本号,高两位为大版本号 Binary 4
  39. BYTE installVersion[8]; // 安装版本,其中包含软件框架版本 binary 8
  40. BYTE ip[4]; // 终端IP地址 binary 4
  41. char szSites[16]; // 设备部署场所代码 字符 16
  42. BYTE currentGPS[8]; // 当前终端的GPS坐标点 binary 8
  43. char chTerminalState; // 终端生命阶段状态 char 1
  44. char chRunState; // 系统状态 char 1
  45. };
  46. // 请求Token设备信息加密后结构(使用密码键盘加密)
  47. // [StructName("TOKEN_R1")]
  48. struct RequestTokenReq1
  49. {
  50. char szTerminalNo[16]; // 终端号
  51. BYTE tpk[140]; // 临时公钥 binary 140
  52. BYTE encTerminalInfo[112]; // 加密设备信息,包括头部4字节ASCII长度及右补0
  53. };
  54. // 请求Token附带实体信息
  55. // [StructName("TOKEN_R2")]
  56. struct RequestTokenReq2
  57. {
  58. char szType[32]; // 设备类型
  59. char szModal[32]; // 设备型号
  60. char szFactory[32]; // 厂家名称
  61. BYTE version[8]; // 硬件版本号
  62. };
  63. // 请求Token时,附带需要验证信息
  64. // [StructName("TOKEN_R3")]
  65. struct RequestTokenReq3
  66. {
  67. char szSignCertHash[40]; // 签名证书SHA1 Hash
  68. char szUKeyRootHash[40]; // UKEY证书SHA1 Hash
  69. BYTE nAuthVersion; // 准入请求版本: 1 借助KMC密钥验证;2 借助终端密钥动态生成会话密钥验证
  70. BYTE FingerPrint[16]; // 硬件指纹, @AuthVersion为1时有效, 上报指纹信息,解决生产中已初始化终端指纹收集问题
  71. BYTE PublicKey[148]; // 终端公钥, @AuthVersion为1时有效, 上报公钥信息,解决生产中已初始化终端公钥收集问题
  72. BYTE Reserved[11]; // 保留字段
  73. };
  74. // 请求TOKEN附加信息: PinPadID
  75. // [StructName("TOKEN_R4")]
  76. struct RequestTokenReq4
  77. {
  78. char szPinPadID[32]; // PinPadID
  79. BYTE Reserved[256];
  80. };
  81. // 请求TOKEN附加信息: 密码键盘是否存在
  82. // [StructName("TOKEN_R5")]
  83. struct RequestTokenReq5
  84. {
  85. char chExistPinPad; // 是否有链接密码键盘,0:没有;1:有 char 1
  86. };
  87. // 令牌定义见RvcCommEntityBase中 TokenInfo
  88. // [StructName("TOKEN_RT")]
  89. struct RequestTokenRet
  90. {
  91. BYTE enToken[256]; // 使用准入服务签名后的TOKEN
  92. BYTE sharedSK[16]; // 共享会话密钥
  93. BYTE retHash[4]; // 返回结构Hash
  94. };
  95. // 退出准入上报
  96. // [StructName("EXIT_REQ")]
  97. struct TerminalExitReq
  98. {
  99. char szTerminalNo[16]; // 终端号 字符数字 16
  100. BYTE nTriggerReason; // 触发原因 Byte 1: 1) 准入到期; 2) IP改变; 3) 远程指令重新准入; 4) 本地控制退出准入; 5) 本地控制重新准入
  101. BYTE nRebootWay; // 将要重启方式,框架/操作系统/电源 byte 1
  102. char chTerminalStage; // 终端生命阶段状态 char 1
  103. };
  104. // 生命阶段改变上报
  105. // [StructName("STAGEREP")]
  106. struct TerminalStageReport
  107. {
  108. char szTerminalNo[16]; // 终端号
  109. BYTE IP[4]; // 终端IP地址
  110. char szSites[16]; // 设备部署场所代码
  111. BYTE LifeID[4]; // 生命标识
  112. BYTE CurrentGPS[8]; // 当前终端的GPS坐标点
  113. char cRunState; // 系统状态
  114. char cNewStage; // 当前终端生命阶段
  115. DWORD dwNewStageTime; //当前生命阶段设置时间
  116. char cLastStage; // 上一个终端生命阶段
  117. DWORD dwLastStageTime; //上一个终端生命阶段设置时间
  118. };
  119. // 时间同步请求
  120. // [StructName("SYNC_R1")]
  121. struct SyncTimeReq
  122. {
  123. char szTerminalNo[16]; // 终端号
  124. DWORD dwCurTime; // 终端当前时间
  125. BYTE byReserved[64]; // 保留字段
  126. };
  127. // [StructName("SYNC_A1")]
  128. struct SyncTimeAns
  129. {
  130. int nTimeDiff; // 服务器与终端时间差
  131. BYTE nAuthVersion; // 准入请求版本: 1 借助KMC密钥验证;2 借助终端密钥动态生成会话密钥验证
  132. BYTE SessionKey[140]; // @nAuthVersion为1时有效,交换会话密钥,用于加密准入信息
  133. BYTE byReserved[64]; // 保留字段
  134. };
  135. // 外设加密握手包
  136. //[StructName("InitDevR")]
  137. struct InitDeviceReq
  138. {
  139. char CR1[256];
  140. char CR3[256];
  141. char R2[64];
  142. char CDevPubKey[360];
  143. char Verdor[64]; // @20170124: 厂商名称:nantian(南天); yotap(skyui)
  144. };
  145. //[StructName("InitDevA")]
  146. struct InitDeviceAns
  147. {
  148. char R1[64];
  149. char R3[64];
  150. char CR2[256];
  151. };
  152. // 状态上报
  153. // [REPSTA_R]
  154. struct ReportStateReq
  155. {
  156. char EventType[16]; // InitMK:初始化;UpdateWK:工作密钥更新;AccessAuth:准入
  157. char TerminalNo[32];
  158. char UserID[16]; // 初始化用户
  159. DWORD ErrorCode;
  160. char ErrorMsg[512]; // 错误描述
  161. };
  162. // 获取锁定状态
  163. // [StructName("LockStateReq")]
  164. struct LockStateReq
  165. {
  166. char TerminalNo[32]; // 终端号
  167. };
  168. //[StructName("LockStateAns")]
  169. struct LockStateAns
  170. {
  171. BYTE LockState;
  172. };
  173. // 获取MD5校验请求
  174. // [StructName("MD5REQ")]
  175. struct CheckMD5Req
  176. {
  177. char TerminalNo[32]; // 终端号
  178. char MD5Value[16]; // MD5值
  179. };
  180. #pragma pack()
  181. class CAccessAuthFSM;
  182. class CAccessAuthConn : public SpSecureClient
  183. {
  184. public:
  185. CAccessAuthConn(CEntityBase *pEntity, CAccessAuthFSM *pFSM);
  186. ErrorCodeEnum SendWKUpdatePackage();
  187. ErrorCodeEnum SendGetTokenPackage();
  188. ErrorCodeEnum SendExitNoticePackage(int nReason, int nWay);
  189. ErrorCodeEnum SendTerminalStagePackage(char cNewStage, CSmallDateTime dtNewStageTime, char cOldStage, CSmallDateTime dtOldStageTime);
  190. ErrorCodeEnum SendSyncTimePackage();
  191. ErrorCodeEnum SendSyncTimePackageNew();
  192. ErrorCodeEnum SendInitDevicePackage(SpReqAnsContext<AccessAuthService_InitDev_Req, AccessAuthService_InitDev_Ans>::Pointer &ctx);
  193. ErrorCodeEnum SendReportStatePackage(const char*pszEventType, DWORD dwErrCode, const char *pszErrMsg);
  194. ErrorCodeEnum SendLockStatePackage();
  195. ErrorCodeEnum SendCheckMD5Package(const char* pMD5Value);
  196. ErrorCodeEnum SendUpdateMD5Package(const char* pMD5Value);
  197. private:
  198. ~CAccessAuthConn();
  199. void OnDisconnect();
  200. void OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg);
  201. ErrorCodeEnum HandleUpdateWKRet(const CSmartPointer<IPackage> &pRecvPkg);
  202. ErrorCodeEnum HandleReqTokenRet(const CSmartPointer<IPackage> &pRecvPkg);
  203. ErrorCodeEnum HandleTermExitRet(const CSmartPointer<IPackage> &pRecvPkg);
  204. ErrorCodeEnum HandleReportStageRet(const CSmartPointer<IPackage> &pRecvPkg);
  205. ErrorCodeEnum HandleSyncTimeRet(const CSmartPointer<IPackage> &pRecvPkg);
  206. ErrorCodeEnum HandleInitDeviceRet(const CSmartPointer<IPackage> &pRecvPkg);
  207. ErrorCodeEnum HandleReportStateRet(const CSmartPointer<IPackage> &pRecvPkg);
  208. ErrorCodeEnum HandleLockStateRet(const CSmartPointer<IPackage> &pRecvPkg);
  209. ErrorCodeEnum HandleCheckMD5Ret(const CSmartPointer<IPackage> &pRecvPkg);
  210. ErrorCodeEnum HandleUpdateMD5Ret(const CSmartPointer<IPackage> &pRecvPkg);
  211. bool GetSpBaseSignCertHash(CSimpleStringA &strHash);
  212. bool GetUKeyRootCertHash(CSimpleStringA &strHash);
  213. bool Sha1Hash(BYTE *pData, int nDataLen, BYTE hash[20]);
  214. private:
  215. CAccessAuthFSM *m_pFSM;
  216. SpReqAnsContext<AccessAuthService_InitDev_Req, AccessAuthService_InitDev_Ans>::Pointer m_ctxInitDev;
  217. };