mod_AccessAuth.h 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. #pragma once
  2. #include "SpBase.h"
  3. #ifdef RVC_OS_WIN
  4. //#include "RVCCrypt.h"
  5. #endif // RVC_OS_WIN
  6. #include "AccessAuthorization_server_g.h"
  7. using namespace AccessAuthorization;
  8. #include "AccessAuthFSM.h"
  9. int HexBuf2StrBuf(PBYTE hexBuf, char** strBuf, DWORD len);
  10. int StrBuf2HexBuf(LPCTSTR strBuf, PBYTE* hexBuf);
  11. class CAccessAuthEntity;
  12. class CAccessAuthSession : public AccessAuthService_ServerSessionBase
  13. {
  14. public:
  15. CAccessAuthSession(CAccessAuthEntity* pEntity) : m_pEntity(pEntity) {}
  16. virtual ~CAccessAuthSession() {}
  17. virtual void Handle_Regist(SpOnewayCallContext<AccessAuthService_Regist_Info>::Pointer ctx);
  18. virtual void Handle_UpdateWK(SpOnewayCallContext<AccessAuthService_UpdateWK_Info>::Pointer ctx);
  19. virtual void Handle_InitializeNew(SpReqAnsContext<AccessAuthService_InitializeNew_Req, AccessAuthService_InitializeNew_Ans>::Pointer ctx);
  20. virtual void Handle_InitDev(SpReqAnsContext<AccessAuthService_InitDev_Req, AccessAuthService_InitDev_Ans>::Pointer ctx);
  21. virtual void Handle_GetNetMsg(SpReqAnsContext<AccessAuthService_GetNetMsg_Req, AccessAuthService_GetNetMsg_Ans>::Pointer ctx);
  22. private:
  23. CAccessAuthEntity* m_pEntity;
  24. };
  25. class CAccessAuthEntity : public CEntityBase, public ISysVarListener
  26. {
  27. public:
  28. CAccessAuthEntity()
  29. {
  30. m_eErrNum = Error_Succeed;
  31. m_bNewSMFWB = false;
  32. m_iGetTermSysInfo = 0;
  33. }
  34. virtual ~CAccessAuthEntity()
  35. {
  36. }
  37. virtual const char* GetEntityName() const { return "AccessAuthorization"; }
  38. virtual bool IsService()const { return true; }
  39. virtual void OnStarted();
  40. virtual void OnPreStart(CAutoArray<CSimpleStringA> strArgs, CSmartPointer<ITransactionContext> pTransactionContext);
  41. virtual void OnPreClose(EntityCloseCauseEnum eCloseCause, CSmartPointer<ITransactionContext> pTransactionContext);
  42. virtual void OnSysVarEvent(const char* pszKey, const char* pszValue, const char* pszOldValue, const char* pszEntityName);
  43. virtual CServerSessionBase* OnNewSession(const char* /*pszRemoteEntityName*/, const char* /*pszClass*/)
  44. {
  45. return new CAccessAuthSession(this);
  46. }
  47. virtual void OnPrePause(CSmartPointer<ITransactionContext> pTransactionContext)
  48. {
  49. LOG_FUNCTION();
  50. ErrorCodeEnum result(Error_DataCheck);
  51. do
  52. {
  53. if (m_FSM.RtsMapToUserCode("RTS1705", 0) != m_FSM.RtsMapToUserCodeBakup("RTS1705", 0)) {
  54. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("%d", __LINE__);
  55. break;
  56. }
  57. if (m_FSM.RtsMapToUserCode("RTS1707", 0) != m_FSM.RtsMapToUserCodeBakup("RTS1707", 0)) {
  58. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("%d", __LINE__);
  59. break;
  60. }
  61. if (m_FSM.RtsMapToUserCode("RTS1711", 0) != m_FSM.RtsMapToUserCodeBakup("RTS1711", 0)) {
  62. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("%d", __LINE__);
  63. break;
  64. }
  65. if (m_FSM.RtsMapToUserCode("RTS1712", 0) != m_FSM.RtsMapToUserCodeBakup("RTS1712", 0)) {
  66. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("%d", __LINE__);
  67. break;
  68. }
  69. if (m_FSM.RtsMapToUserCode("RTS1713", 0) != m_FSM.RtsMapToUserCodeBakup("RTS1713", 0)) {
  70. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("%d", __LINE__);
  71. break;
  72. }
  73. if (m_FSM.RtsMapToUserCode("RTS1714", 0) != m_FSM.RtsMapToUserCodeBakup("RTS1714", 0)) {
  74. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("%d", __LINE__);
  75. break;
  76. }
  77. if (m_FSM.RtsMapToUserCode("RTS1715", 0) != m_FSM.RtsMapToUserCodeBakup("RTS1715", 0)) {
  78. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("%d", __LINE__);
  79. break;
  80. }
  81. if (m_FSM.RtsMapToUserCode("RTS1716", 0) != m_FSM.RtsMapToUserCodeBakup("RTS1716", 0)) {
  82. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("%d", __LINE__);
  83. break;
  84. }
  85. if (m_FSM.RtsMapToUserCode("RTS1717", 1) == m_FSM.RtsMapToUserCodeBakup("RTS1717", 0)) {
  86. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("%d", __LINE__);
  87. break;
  88. }
  89. if (m_FSM.RtsMapToUserCode("RTS1715", 0) == m_FSM.RtsMapToUserCodeBakup("RTS1707", 0)) {
  90. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("%d", __LINE__);
  91. break;
  92. }
  93. result = Error_Succeed;
  94. } while (false);
  95. pTransactionContext->SendAnswer(result);
  96. }
  97. virtual void OnPreContinue(CSmartPointer<ITransactionContext> pTransactionContext)
  98. {
  99. pTransactionContext->SendAnswer(Error_Succeed);
  100. }
  101. // 开始准入
  102. ErrorCodeEnum Regist();
  103. void UpdateWK();
  104. string ByteArrayToHexStr(BYTE* pBuf, int nBufLen);
  105. // 生成SM2密钥对
  106. DWORD CreateSM2KeyPair(CBlob& pubKey, CBlob& priKey);
  107. // 保存密钥对到令牌实体
  108. DWORD SaveSM2KeyPair(const CBlob& pubKey, const CBlob& priKey);
  109. // 保存Token和共享会话密钥到令牌实体
  110. ErrorCodeEnum SaveTokenAndSharedSK(const CBlob& token, const CBlob& sharedSK);
  111. // 是否使用PinPad
  112. bool HasPinPad();
  113. // 机型是否配置密码键盘
  114. bool IsMachineTypeConfigurePinPad(CSimpleStringA strMachineType);
  115. int GetPinPadCapability();
  116. // 保存会话密钥
  117. bool SaveAuthKey(BYTE* pKey);
  118. // 调用准入会话密钥加密
  119. ErrorCodeEnum EncryptDataWithSessionKey(const CBlob& raw, CBlob& enc);
  120. bool GetTerminalFingerPrint(BYTE* pBuf, int& nBufLen);
  121. bool GetTerminalPublicKey(BYTE* pBuf, int& nBufLen);
  122. bool GetTerminalPublicKey(BYTE* pBuf, int& nBufLen, string& pubkey);
  123. void SetAuthErrMsg(const char* pszErrMsg) { m_strAuthErrMsg = pszErrMsg; }
  124. const char* GetAuthErrMsg() { return m_strAuthErrMsg; }
  125. // 获取密码键盘ID和外设ID
  126. //oilyang@20210510 add:in order to avoid getting info out of async, check if has pinpad while getting info
  127. // 返回1:只有PinPadID;2:只有DeviceID;3:两者都有;0:失败
  128. int GetPinPadIDAndDeviceID(CSimpleStringA& strPinPadID, CSimpleStringA& strDeviceID, bool& bHasPinPad);
  129. // 设置时区
  130. wstring ANSIToUnicode(const string& str);
  131. BOOL SetLocalTimeZoneByKeyName(const TCHAR* szTimeZoneKeyName, BOOL isDaylightSavingTime);
  132. void printPasswdError(const string& strErrMsg);
  133. BYTE m_AuthSessionKey[140];
  134. virtual void OnSelfTest(EntityTestEnum eTestType, CSmartPointer<ITransactionContext> pTransactionContext)
  135. {
  136. pTransactionContext->SendAnswer(Error_Succeed);
  137. }
  138. void BeginInitMKACS();
  139. bool SendInitMKReqACS(CInitlizerMKReq& initMKReq);
  140. CSimpleStringA GetInitUrl()
  141. {
  142. return m_strInitUrl;
  143. }
  144. void EndInitMK(DWORD rc, const char* pszErrMsg);
  145. ErrorCodeEnum LoadKeysToPinPadACS(string TMK, string TPK, string EDK, string index);
  146. DWORD InitDevice(SpReqAnsContext<AccessAuthService_InitDev_Req, AccessAuthService_InitDev_Ans>::Pointer& ctx);
  147. void GetNetMsg(SpReqAnsContext<AccessAuthService_GetNetMsg_Req, AccessAuthService_GetNetMsg_Ans>::Pointer& ctx);
  148. DWORD m_eErrNum;
  149. CSimpleStringA m_strLastErrMsg;
  150. CSimpleStringA m_strUserID, m_strPassword, m_strInitUrl;
  151. SpReqAnsContext<AccessAuthService_InitializeNew_Req, AccessAuthService_InitializeNew_Ans>::Pointer m_ctx;
  152. pair<string, string> GenerateTmkToKMC();
  153. pair<string, string> GenerateTmkToDevice();
  154. pair<string, string> EncryptedByPubKey(CSimpleStringA pubKey, bool bNeed04Head = false);
  155. void GetTermSysInfo();
  156. CSimpleStringA m_publicKey;
  157. CSimpleStringA m_privateKey;
  158. protected:
  159. CAccessAuthFSM m_FSM;
  160. CSystemStaticInfo m_info;
  161. CSimpleStringA m_strAuthErrMsg;
  162. private:
  163. bool GenerateRandomNum();
  164. bool m_bNewSMFWB;
  165. BYTE m_btRam[16], m_btTermSysInfoSM3[32];
  166. int m_iGetTermSysInfo;//0:初始值,尚未完成获取过程 1:成功 -1:失败
  167. };