mod_AccessAuth.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  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. #define KEY_SIZE 16
  10. #define BUF_SIZE 256
  11. #define DEFALT_WAIT_PINPAD_MS 0
  12. #define INTERVAL_WAIT_PINPAD_MS 200
  13. //TODO: rm [Gifur@2025725]
  14. int HexBuf2StrBuf(PBYTE hexBuf, char** strBuf, DWORD len);
  15. //TODO: rm [Gifur@2025725]
  16. int StrBuf2HexBuf(LPCTSTR strBuf, PBYTE* hexBuf);
  17. class CAccessAuthEntity;
  18. class CAccessAuthSession : public AccessAuthService_ServerSessionBase
  19. {
  20. public:
  21. CAccessAuthSession(CAccessAuthEntity* pEntity) : m_pEntity(pEntity) {}
  22. virtual ~CAccessAuthSession() {}
  23. virtual void Handle_Regist(SpOnewayCallContext<AccessAuthService_Regist_Info>::Pointer ctx);
  24. virtual void Handle_UpdateWK(SpOnewayCallContext<AccessAuthService_UpdateWK_Info>::Pointer ctx);
  25. virtual void Handle_InitializeNew(SpReqAnsContext<AccessAuthService_InitializeNew_Req, AccessAuthService_InitializeNew_Ans>::Pointer ctx);
  26. virtual void Handle_InitDev(SpReqAnsContext<AccessAuthService_InitDev_Req, AccessAuthService_InitDev_Ans>::Pointer ctx);
  27. virtual void Handle_GetNetMsg(SpReqAnsContext<AccessAuthService_GetNetMsg_Req, AccessAuthService_GetNetMsg_Ans>::Pointer ctx);
  28. private:
  29. CAccessAuthEntity* m_pEntity;
  30. };
  31. class CAccessAuthEntity : public CEntityBase, public ISysVarListener
  32. {
  33. public:
  34. CAccessAuthEntity()
  35. {
  36. m_eErrNum = Error_Succeed;
  37. m_iGetTermSysInfo = 0;
  38. waitPinPadMS = 0;
  39. }
  40. virtual ~CAccessAuthEntity()
  41. {
  42. }
  43. virtual const char* GetEntityName() const { return "AccessAuthorization"; }
  44. virtual bool IsService()const { return true; }
  45. virtual void OnStarted();
  46. virtual void OnPreStart(CAutoArray<CSimpleStringA> strArgs, CSmartPointer<ITransactionContext> pTransactionContext);
  47. virtual void OnPreClose(EntityCloseCauseEnum eCloseCause, CSmartPointer<ITransactionContext> pTransactionContext);
  48. virtual void OnSysVarEvent(const char* pszKey, const char* pszValue, const char* pszOldValue, const char* pszEntityName);
  49. virtual CServerSessionBase* OnNewSession(const char* /*pszRemoteEntityName*/, const char* /*pszClass*/)
  50. {
  51. return new CAccessAuthSession(this);
  52. }
  53. virtual void OnPrePause(CSmartPointer<ITransactionContext> pTransactionContext)
  54. {
  55. ErrorCodeEnum result(Error_Succeed);
  56. pTransactionContext->SendAnswer(result);
  57. }
  58. virtual void OnPreContinue(CSmartPointer<ITransactionContext> pTransactionContext)
  59. {
  60. pTransactionContext->SendAnswer(Error_Succeed);
  61. }
  62. // 开始准入
  63. ErrorCodeEnum Regist();
  64. void UpdateWK();
  65. string ByteArrayToHexStr(BYTE* pBuf, int nBufLen);
  66. // 生成SM2密钥对
  67. DWORD CreateSM2KeyPair(CBlob& pubKey, CBlob& priKey);
  68. // 保存密钥对到令牌实体
  69. DWORD SaveSM2KeyPair(const CBlob& pubKey, const CBlob& priKey);
  70. // 保存Token和共享会话密钥到令牌实体
  71. ErrorCodeEnum SaveTokenAndSharedSK(const CBlob& token, const CBlob& sharedSK);
  72. // 是否使用PinPad
  73. bool HasPinPad();
  74. // 机型是否配置密码键盘
  75. bool IsMachineTypeConfigurePinPad(CSimpleStringA strMachineType);
  76. int GetPinPadCapability();
  77. // 保存会话密钥
  78. bool SaveAuthKey(BYTE* pKey);
  79. // 调用指定密钥加密
  80. ErrorCodeEnum EncryptDataWithKey(const CBlob& raw, CBlob& enc, BYTE* key);
  81. bool GetTerminalFingerPrint(BYTE* pBuf, int& nBufLen);
  82. bool GetTerminalPublicKey(BYTE* pBuf, int& nBufLen, string& pubkey);
  83. void SetAuthErrMsg(const char* pszErrMsg) { m_strAuthErrMsg = pszErrMsg; }
  84. const char* GetAuthErrMsg() { return m_strAuthErrMsg; }
  85. // 获取密码键盘szModel
  86. ErrorCodeEnum GetPinPadModel(CSimpleStringA& pinpadModel, bool& bPinPadOnline);
  87. // 设置时区
  88. wstring ANSIToUnicode(const string& str);
  89. BOOL SetLocalTimeZoneByKeyName(const TCHAR* szTimeZoneKeyName, BOOL isDaylightSavingTime);
  90. void printPasswdError(const string& strErrMsg);
  91. BYTE m_AuthSessionKey[140];
  92. virtual void OnSelfTest(EntityTestEnum eTestType, CSmartPointer<ITransactionContext> pTransactionContext)
  93. {
  94. pTransactionContext->SendAnswer(Error_Succeed);
  95. }
  96. void BeginInitMKACS();
  97. bool SendInitMKReqACS(CInitlizerMKReq& initMKReq);
  98. CSimpleStringA GetInitUrl()
  99. {
  100. return m_strInitUrl;
  101. }
  102. void EndInitMK(DWORD rc, const char* pszErrMsg);
  103. ErrorCodeEnum LoadKeysToPinPadACS(string TMK, string TPK, string EDK, string index, string tpkCheck, string edkCheck);
  104. DWORD InitDevice(SpReqAnsContext<AccessAuthService_InitDev_Req, AccessAuthService_InitDev_Ans>::Pointer& ctx);
  105. void GetNetMsg(SpReqAnsContext<AccessAuthService_GetNetMsg_Req, AccessAuthService_GetNetMsg_Ans>::Pointer& ctx);
  106. DWORD m_eErrNum;
  107. CSimpleStringA m_strLastErrMsg;
  108. CSimpleStringA m_strUserID, m_strPassword, m_strInitUrl;
  109. SpReqAnsContext<AccessAuthService_InitializeNew_Req, AccessAuthService_InitializeNew_Ans>::Pointer m_ctx;
  110. pair<string, string> GenerateTmkToKMC();
  111. pair<string, string> EncryptedByPubKey(CSimpleStringA pubKey, bool bNeed04Head = false);
  112. void GetHardWareInfo();
  113. CSimpleStringA m_cpuId, m_mainBoardId, m_hardDiskId;
  114. int GetTermSysInfo() { return m_iGetTermSysInfo; }
  115. CSimpleStringA m_publicKey;
  116. CSimpleStringA m_privateKey;
  117. protected:
  118. CAccessAuthFSM m_FSM;
  119. CSystemStaticInfo m_info;
  120. CSimpleStringA m_strAuthErrMsg;
  121. private:
  122. bool GenerateRandomNum();
  123. BYTE m_btRam[16], m_btTermSysInfoSM3[32];
  124. int m_iGetTermSysInfo;//0:初始值,尚未完成获取过程 1:成功 -1:失败
  125. int waitPinPadMS;
  126. };