AccessAuthConn.h 7.4 KB

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