123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- #ifndef __MOD_INITIALIZER_H
- #define __MOD_INITIALIZER_H
- #include <string>
- #include "stdafx2.h"
- #include "SpTest.h"
- #include "InitializerConn.h"
- #include "InitializerFSM.h"
- #include "Initializer_server_g.h"
- #include "modVer.h"
- using namespace std;
- using namespace Initializer;
- enum CardSwiperConnectType
- {
- Normal,
- Bluetooth
- };
- // 初始设定控制台 Initializer 0x509
- class CInitializerEntity;
- class CInitializerSession : public InitializerService_ServerSessionBase
- {
- public:
- CInitializerSession(CInitializerEntity *pEntity) : m_pEntity(pEntity) {}
- virtual ~CInitializerSession() {}
-
- virtual void Handle_Initialize(SpOnewayCallContext<InitializerService_Initialize_Info>::Pointer ctx);
- virtual void Handle_InitializeNew(SpReqAnsContext<InitializerService_InitializeNew_Req, InitializerService_InitializeNew_Ans>::Pointer ctx);
- virtual void Handle_GetAuthServerInfo(SpReqAnsContext<InitializerService_GetAuthServerInfo_Req, InitializerService_GetAuthServerInfo_Ans>::Pointer ctx);
- virtual void Handle_InitializeForBlueTooth(SpReqAnsContext<InitializerService_InitializeForBlueTooth_Req, InitializerService_InitializeForBlueTooth_Ans>::Pointer ctx);
- private:
- CInitializerEntity *m_pEntity;
- };
- class CInitializerEntity : public CEntityBase, public ITimerListener
- {
- public:
- ON_ENTITYT_TEST()
- CInitializerEntity():m_pConnection(NULL), m_type(Normal), m_bACS(false)
- {
- memset(m_cTDESPukey, 0, 2048);
- memset(m_cSM2Pukey, 0, 2048);
- m_iTDESPukeyLen = 0;
- m_iSM2Pukeylen = 0;
- memset(m_cTDESTMK, 0, 64);
- memset(m_cSM2TMK, 0, 64);
- m_eErrNum = Error_Succeed;
- m_afterSMIsFirst = false;
- m_autoTryInit = 0;
- m_strInitUrl = "";
- m_eLoginType = Login_By_Guiconsole;
- m_bGetKMCKey = false; //false代表获取kmc密钥失败
- }
- virtual ~CInitializerEntity() {}
- virtual const char *GetEntityName() const { return "Initializer"; }
- virtual const char* GetEntityVersion() const { return MODULE_VERSION_FULL; }
- virtual bool IsService()const{return true;}
- virtual void OnStarted();
- virtual void OnPaused();
- virtual void OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext);
- virtual CServerSessionBase *OnNewSession(const char* /*pszRemoteEntityName*/, const char * /*pszClass*/){
- return new CInitializerSession(this);
- }
- virtual void OnTimeout(DWORD dwTimerID);
- // 初始化
- ErrorCodeEnum StartInitialize(const char *pszUserID, const char *pszPassword);
- ErrorCodeEnum StartInitializeNew(const char *pszAuthServer, int nAuthPort, const char *pszUserID, const char *pszPassword);
- // KMC初始化
- ErrorCodeEnum InitKMC(int nPinPadCapability);
- // 获取KMC错误
- CSimpleStringA GetKMCLastErrMsg();
- // 释放KMC
- ErrorCodeEnum ReleaseKMC();
- // 生成MK请求包
- ErrorCodeEnum CreateInitMKData(CBlob &blob, bool bSM);
- // 解析返回主密钥
- ErrorCodeEnum ParseInitMKResult(CBlob &blob, bool bSM);
- // 更新密码键盘主密钥
- DWORD LoadKeysToPinPad(bool bSM);
-
- bool HexStrToByteArray(const char* pHex, BYTE *pBuf, int *pBufLen);
- string ByteArrayToHexStr(BYTE *pBuf, int nBufLen);
- bool GetAuthAccessAddr(CSimpleStringA &strAddr, int &nPort);
- bool SetAuthAccessAddr(const char *pszAddr, int nPort);
- bool GetCenterSettingAddr(CSimpleStringA &strAddr, int &nPort);
- bool SetCenterSettingAddr(const char *pszAddr, int nPort);
- bool GetInitUkeyFlg(int &nUkeyFlg);
- bool GetInitializedFlg(int &nInitializedFlg);
- bool SetInitializedFlg(CSimpleStringA strInitState);
- bool IsIL();//是否是简化版
-
- ErrorCodeEnum SecureClientConnect();
- ErrorCodeEnum SecureClientRelease();
- void OnSecureClientDisconnect();
-
- void BeginInitMK();
- void EndInitMK(DWORD rc, const char *pszErrMsg);
- void BeginLogin(const char *pszAuthServer, int nAuthPort, const char *pszUserID, const char *pszPassword,const LoginType eByType);
- void AutoBeginLogin(const char *pszAuthServer, int nAuthPort);
- void EndLogin(DWORD rc, const char *pErrMsg);
- void BeginSyncPK();
- void BeginGetKMCKey();
- void EndGetKMCKey(DWORD rc, const char* pszErrMsg);
- void EndSyncPK(DWORD rc, const char *pszErrMsg);
- DWORD InitCardSwiper();
- DWORD ReportInitMKState(const char *pszUserID, DWORD dwErrCode, const char *pszErrMsg);
- ErrorCodeEnum DownloadCfg(const char *pszSettingServer, int nSettingPort);
- ErrorCodeEnum StartGUI();
- ErrorCodeEnum StartGUINew();
- ErrorCodeEnum CloseGUI();
- void CloseTask();
- bool HasPinPad();
- // 机型是否配置密码键盘
- bool IsMachineTypeConfigurePinPad(CSimpleStringA strMachineType);
- int GetPinPadCapability();
- bool GetTerminalFingerPrint(BYTE *pBuf, int &nBufLen);
- bool GetTerminalPublicKey(BYTE *pBuf, int &nBufLen,string &acsPubkey);
- bool GetMD5Hash(const char *pStr, BYTE md5[16]);
- const char* GetLastErrMsg();
- // 获取密码键盘ID和外设ID
- // 返回1:只有PinPadID;2:只有DeviceID;3:两者都有;0:失败
- int GetPinPadIDAndDeviceID(CSimpleStringA &strPinPadID, CSimpleStringA &strDeviceID);
- bool HasCkCodeFlg();
- int ConvertStr2Byte(string input, BYTE* output, int outputLen);
- //判断是否是国密改造之后的第一次初始化
- int GetOrSetIsFirstSM(int type);
- CSimpleStringA GetInitUrl() {
- return m_strInitUrl;
- }
- void BeginLoginACS(const char* pszAuthServer);
- void EndLoginACS(DWORD rc, const char* pErrMsg);
- void BeginInitMKACS();
- bool SendInitLoginReqACS(CInitlizerLoginReq& initLoginReq);
- bool SendInitMKReqACS(CInitlizerMKReq& initMKReq);
- ErrorCodeEnum LoadKeysToPinPadACS(string TMK, string TPK, string EDK, string index);
- LoginType GetLoginType() { return m_eLoginType; }
- BYTE m_cTDESPukey[2048];
- BYTE m_cSM2Pukey[2048];
- char m_cTDESTMK[64];
- char m_cSM2TMK[64];
- int m_iTDESPukeyLen;
- int m_iSM2Pukeylen;
- CSimpleStringA m_strAuthorizer;
- CSimpleStringA m_strAuthTime;
- CSimpleStringA m_strLastErrMsg;
- DWORD m_eErrNum;
- SpReqAnsContext<InitializerService_InitializeNew_Req, InitializerService_InitializeNew_Ans>::Pointer m_ctx;
- SpReqAnsContext<InitializerService_InitializeForBlueTooth_Req, InitializerService_InitializeForBlueTooth_Ans>::Pointer m_ctx_blue;
- //type=0 :normal,type=1 :bluetooth
- CardSwiperConnectType m_type;
- bool m_bHasCkCode;
- CSimpleStringA m_strUserID, m_strPassword, m_strInitUrl;
- //判断是否为国密改造之后的第一次准入
- bool GetAccessauthIsFirst();
- //国密改造之后第一次准入的标志位
- bool m_afterSMIsFirst;
- //自动初始化的重试次数
- int m_autoTryInit;
- string m_TMK;
- string m_TPK;
- string m_EDK;
- string m_index;
- bool m_bGetKMCKey, m_bACS;
- private:
- bool IsServiceAvailable(const char *pszServiceAddr, int nServerPort);
- ErrorCodeEnum ParseIPAddress(const char *str, CSimpleStringA &ip, int &port);
- private:
- CSimpleStringA m_strAuthServer;
- int m_nAuthPort;
-
- CInitializerFSM m_FSM;
-
- CInitializerConn *m_pConnection;
-
- CSimpleStringA m_strInitUserID;
- LoginType m_eLoginType;
- };
- #endif
|