mod_Initializer.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. #ifndef __MOD_INITIALIZER_H
  2. #define __MOD_INITIALIZER_H
  3. #include <string>
  4. #include "stdafx2.h"
  5. #include "SpTest.h"
  6. #include "InitializerConn.h"
  7. #include "InitializerFSM.h"
  8. #include "Initializer_server_g.h"
  9. #include "modVer.h"
  10. using namespace std;
  11. using namespace Initializer;
  12. // 初始设定控制台 Initializer 0x509
  13. class CInitializerEntity;
  14. class CInitializerSession : public InitializerService_ServerSessionBase
  15. {
  16. public:
  17. CInitializerSession(CInitializerEntity *pEntity) : m_pEntity(pEntity) {}
  18. virtual ~CInitializerSession() {}
  19. virtual void Handle_Initialize(SpOnewayCallContext<InitializerService_Initialize_Info>::Pointer ctx);
  20. virtual void Handle_InitializeNew(SpReqAnsContext<InitializerService_InitializeNew_Req, InitializerService_InitializeNew_Ans>::Pointer ctx);
  21. virtual void Handle_GetAuthServerInfo(SpReqAnsContext<InitializerService_GetAuthServerInfo_Req, InitializerService_GetAuthServerInfo_Ans>::Pointer ctx);
  22. virtual void Handle_InitializeForBlueTooth(SpReqAnsContext<InitializerService_InitializeForBlueTooth_Req, InitializerService_InitializeForBlueTooth_Ans>::Pointer ctx);
  23. private:
  24. CInitializerEntity *m_pEntity;
  25. };
  26. class CInitializerEntity : public CEntityBase, public ITimerListener
  27. {
  28. public:
  29. ON_ENTITYT_TEST()
  30. CInitializerEntity():m_pConnection(NULL)
  31. {
  32. memset(m_cTDESPukey, 0, 2048);
  33. memset(m_cSM2Pukey, 0, 2048);
  34. m_iTDESPukeyLen = 0;
  35. m_iSM2Pukeylen = 0;
  36. memset(m_cTDESTMK, 0, 64);
  37. memset(m_cSM2TMK, 0, 64);
  38. m_eErrNum = Error_Succeed;
  39. m_afterSMIsFirst = false;
  40. m_autoTryInit = 0;
  41. m_bGetKMCKey = false; //false代表获取kmc密钥失败
  42. }
  43. virtual ~CInitializerEntity() {}
  44. virtual const char *GetEntityName() const { return "Initializer"; }
  45. virtual const char* GetEntityVersion() const { return MODULE_VERSION_FULL; }
  46. virtual bool IsService()const{return true;}
  47. virtual void OnStarted();
  48. virtual void OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext);
  49. virtual CServerSessionBase *OnNewSession(const char* /*pszRemoteEntityName*/, const char * /*pszClass*/){
  50. return new CInitializerSession(this);
  51. }
  52. virtual void OnTimeout(DWORD dwTimerID);
  53. // 初始化
  54. ErrorCodeEnum StartInitialize(const char *pszUserID, const char *pszPassword);
  55. ErrorCodeEnum StartInitializeNew(const char *pszAuthServer, int nAuthPort, const char *pszUserID, const char *pszPassword);
  56. // KMC初始化
  57. ErrorCodeEnum InitKMC(int nPinPadCapability);
  58. // 获取KMC错误
  59. CSimpleStringA GetKMCLastErrMsg();
  60. // 释放KMC
  61. ErrorCodeEnum ReleaseKMC();
  62. // 生成MK请求包
  63. ErrorCodeEnum CreateInitMKData(CBlob &blob, bool bSM);
  64. // 解析返回主密钥
  65. ErrorCodeEnum ParseInitMKResult(CBlob &blob, bool bSM);
  66. // 更新密码键盘主密钥
  67. DWORD LoadKeysToPinPad(bool bSM);
  68. bool HexStrToByteArray(const char* pHex, BYTE *pBuf, int *pBufLen);
  69. string ByteArrayToHexStr(BYTE *pBuf, int nBufLen);
  70. bool GetAuthAccessAddr(CSimpleStringA &strAddr, int &nPort);
  71. bool SetAuthAccessAddr(const char *pszAddr, int nPort);
  72. bool GetCenterSettingAddr(CSimpleStringA &strAddr, int &nPort);
  73. bool SetCenterSettingAddr(const char *pszAddr, int nPort);
  74. bool GetInitUkeyFlg(int &nUkeyFlg);
  75. bool GetInitializedFlg(int &nInitializedFlg);
  76. bool SetInitializedFlg(CSimpleStringA strInitState);
  77. bool IsIL();//是否是简化版
  78. ErrorCodeEnum SecureClientConnect();
  79. ErrorCodeEnum SecureClientRelease();
  80. void OnSecureClientDisconnect();
  81. void BeginInitMK();
  82. void EndInitMK(DWORD rc, const char *pszErrMsg);
  83. void BeginLogin(const char *pszAuthServer, int nAuthPort, const char *pszUserID, const char *pszPassword);
  84. void AutoBeginLogin(const char *pszAuthServer, int nAuthPort);
  85. void EndLogin(DWORD rc, const char *pErrMsg);
  86. void BeginSyncPK();
  87. void BeginGetKMCKey();
  88. void EndGetKMCKey(DWORD rc, const char* pszErrMsg);
  89. void EndSyncPK(DWORD rc, const char *pszErrMsg);
  90. DWORD InitCardSwiper();
  91. DWORD ReportInitMKState(const char *pszUserID, DWORD dwErrCode, const char *pszErrMsg);
  92. ErrorCodeEnum DownloadCfg(const char *pszSettingServer, int nSettingPort);
  93. ErrorCodeEnum StartGUI();
  94. ErrorCodeEnum StartGUINew();
  95. ErrorCodeEnum CloseGUI();
  96. void CloseTask();
  97. bool HasPinPad();
  98. int GetPinPadCapability();
  99. bool GetTerminalFingerPrint(BYTE *pBuf, int &nBufLen);
  100. bool GetTerminalPublicKey(BYTE *pBuf, int &nBufLen);
  101. bool GetMD5Hash(const char *pStr, BYTE md5[16]);
  102. const char* GetLastErrMsg();
  103. // 获取密码键盘ID和外设ID
  104. // 返回1:只有PinPadID;2:只有DeviceID;3:两者都有;0:失败
  105. int GetPinPadIDAndDeviceID(CSimpleStringA &strPinPadID, CSimpleStringA &strDeviceID);
  106. bool HasCkCodeFlg();
  107. int ConvertStr2Byte(string input, BYTE* output, int outputLen);
  108. //判断是否是国密改造之后的第一次初始化
  109. int GetOrSetIsFirstSM(int type);
  110. //判断是否为国密改造之后的第一次准入
  111. bool GetAccessauthIsFirst();
  112. BYTE m_cTDESPukey[2048];
  113. BYTE m_cSM2Pukey[2048];
  114. char m_cTDESTMK[64];
  115. char m_cSM2TMK[64];
  116. int m_iTDESPukeyLen;
  117. int m_iSM2Pukeylen;
  118. CSimpleStringA m_strAuthorizer;
  119. CSimpleStringA m_strAuthTime;
  120. CSimpleStringA m_strLastErrMsg;
  121. DWORD m_eErrNum;
  122. SpReqAnsContext<InitializerService_InitializeNew_Req, InitializerService_InitializeNew_Ans>::Pointer m_ctx;
  123. SpReqAnsContext<InitializerService_InitializeForBlueTooth_Req, InitializerService_InitializeForBlueTooth_Ans>::Pointer m_ctx_blue;
  124. //type=0 :normal,type=1 :bluetooth
  125. int m_type;
  126. bool m_bHasCkCode;
  127. CSimpleStringA m_strUserID;
  128. CSimpleStringA m_strPassword;
  129. //国密改造之后第一次准入的标志位
  130. bool m_afterSMIsFirst;
  131. //自动初始化的重试次数
  132. int m_autoTryInit;
  133. string m_TMK;
  134. string m_TPK;
  135. string m_EDK;
  136. string m_index;
  137. bool m_bGetKMCKey;
  138. private:
  139. bool IsServiceAvailable(const char *pszServiceAddr, int nServerPort);
  140. ErrorCodeEnum ParseIPAddress(const char *str, CSimpleStringA &ip, int &port);
  141. private:
  142. CSimpleStringA m_strAuthServer;
  143. int m_nAuthPort;
  144. CInitializerFSM m_FSM;
  145. CInitializerConn *m_pConnection;
  146. CSimpleStringA m_strInitUserID;
  147. };
  148. #endif