Browse Source

Z991239-958 #comment 合并KMC改造的代码

雷志明80280620 5 years ago
parent
commit
e201d2722e

+ 317 - 221
Module/mod_Initializer/InitializerConn.cpp

@@ -10,7 +10,7 @@
 
 #define PUKFILENAME_RSA "RVCPubKey.ini"
 #define PUKFILENAME_SM2 "RVCSM2PubKey.ini"
-
+#include "MyBase64.h"
 CInitializerConn::CInitializerConn(CEntityBase *pEntity)
 :SpSecureClient(pEntity)
 {
@@ -20,8 +20,9 @@ CInitializerConn::~CInitializerConn()
 {
 }
 
-ErrorCodeEnum CInitializerConn::SendLoginPackage(const char *pUserID, const char *pPwd)
+DWORD CInitializerConn::SendLoginPackage(const char *pUserID, const char *pPwd)
 {
+	LOG_FUNCTION();
 	assert(IsConnectionOK());
 
 	UserLoginReq req;
@@ -29,12 +30,11 @@ ErrorCodeEnum CInitializerConn::SendLoginPackage(const char *pUserID, const char
 
 	CSystemStaticInfo si;
 	m_pEntity->GetFunction()->GetSystemStaticInfo(si);
-
 	Dbg("UserID[%s],PWD[%s], TerminalID[%s]",pUserID, pPwd, si.strTerminalID);
 
 	// 设备号
 	strncpy(&req.szTerminalNo[0], (const char*)si.strTerminalID, sizeof(req.szTerminalNo)-1);
-	
+
 	int nLen = strlen(pUserID);
 	strncpy(req.szUser, pUserID, nLen > 16 ? 16 : nLen);
 
@@ -44,11 +44,10 @@ ErrorCodeEnum CInitializerConn::SendLoginPackage(const char *pUserID, const char
 	CSmartPointer<IPackage> package = CreateNewPackage("Login");
 	package->AddStruct("LOGINREQ", false, false, (BYTE*)&req, sizeof(req));
 
-	//Dbg("send user login request now");
 	return SendPackage(package) != "" ? Error_Succeed : Error_Unexpect;
 }
 
-ErrorCodeEnum CInitializerConn::SendInitMKPackage()
+DWORD CInitializerConn::SendInitMKPackage()
 {
 	assert(IsConnectionOK());
 
@@ -61,12 +60,12 @@ ErrorCodeEnum CInitializerConn::SendInitMKPackage()
 	if (pEntity->HasPinPad())
 	{
 		CSmartPointer<IConfigInfo> pConfig;
-		ErrorCodeEnum rc = pFunc->OpenConfig(Config_CenterSetting, pConfig);
+		DWORD rc = pFunc->OpenConfig(Config_CenterSetting, pConfig);
 		if (rc != Error_Succeed)
 		{
-			LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_READ_WRITE_FILE,
+			LogWarn(Severity_Middle,(ErrorCodeEnum) rc, ERR_INITIALIZER_READ_WRITE_FILE,
 				GetOutPutStr("%s%08X%s%s", "OpenConfig", rc,"File","Config_CenterSetting").c_str());
-			//LogError(Severity_Low, Error_Unexpect, ERROR_INITIALIZER_OPENCENTERSETTING,  (const char*)CSimpleStringA::Format("open centersetting fail"));
+			rc = ERR_INITIALIZER_READ_WRITE_FILE;
 			pEntity->m_strLastErrMsg = CSimpleStringA::Format("打开集中配置失败,请先下载集中配置!");
 			return rc;
 		}
@@ -78,77 +77,74 @@ ErrorCodeEnum CInitializerConn::SendInitMKPackage()
 
 		if (rc != Error_Succeed)
 		{
-			LogWarn(Severity_Low, Error_Unexpect, ERR_INITIALIZER_READ_WRITE_FILE,
+			LogWarn(Severity_Low,(ErrorCodeEnum) rc, ERR_INITIALIZER_READ_WRITE_FILE,
 				GetOutPutStr("%s%08X%s%s", "ReadConfigValue", rc, "File", "SubBankNo & BranchNo").c_str());
-			//LogError(Severity_Low, Error_Unexpect, ERROR_INITIALIZER_READCENTERSETTING,  
-			//	(const char*)CSimpleStringA::Format("read entity config [SubBankNo] & [BranchNo] fail"));
 
 			pEntity->m_strLastErrMsg = CSimpleStringA::Format("集中配置Initializer节点下没有找到SubBankNo和BranchNo配置项,请联系分行技术部!");
+			rc = ERR_INITIALIZER_READ_WRITE_FILE;
 			return rc;
 		}
-
-		// 1:3des only; 2: sm4 only; 3: both 3des and sm4
-		int nCapability = pEntity->GetPinPadCapability();
-		Dbg("pinpad capability: %d", nCapability);
-		if (nCapability == 1 || nCapability == 3)
+		//国产化之后不再使用原方法获取KMC密钥
+		/*
 		{
-			// support des key
-			char buf[632];
-			memset(buf, 0, 632);
-			MKDownloadReq2 *pReq2 = (MKDownloadReq2*)buf;
-			strncpy(pReq2->szSubBankNo, (const char*)strSubBankNo, sizeof(pReq2->szSubBankNo) - 1);
-			strncpy(pReq2->szBranchNo, (const char*)strBranchNo, sizeof(pReq2->szBranchNo) - 1);
-
-			CBlob blob;
-			blob.Refer(pReq2->kmcData, 600);
-
-			rc = pEntity->CreateInitMKData(blob, false);
-			if (rc != Error_Succeed)
+			// 1:3des only; 2: sm4 only; 3: both 3des and sm4
+			int nCapability = pEntity->GetPinPadCapability();
+			Dbg("pinpad capability: %d", nCapability);
+			if (nCapability == 1 || nCapability == 3)
 			{
-				LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_CREATE_INIT_MK,
-					GetOutPutStr("%s%d", "CreateInitTMK", rc).c_str());
-				//LogError(Severity_Low, Error_Unexpect, ERROR_INITIALIZER_CREATEINITMKDATA, 
-				//	(const char*)CSimpleStringA::Format("CreateInitTMKReq(0) fail, GetKMCLastErrMsg[%s], return[%d]", 
-				//	(const char*)pEntity->GetKMCLastErrMsg(), rc));
-
-				pEntity->m_strLastErrMsg = CSimpleStringA::Format("调用KMC接口CreateInitTMKReq(0)失败,错误信息[%s],返回值[%d],请联系维护人员!", 
-					(const char*)pEntity->GetKMCLastErrMsg(), rc);
-				return rc;
-			}
+				// support des key
+				char buf[632];
+				memset(buf, 0, 632);
+				MKDownloadReq2* pReq2 = (MKDownloadReq2*)buf;
+				strncpy(pReq2->szSubBankNo, (const char*)strSubBankNo, sizeof(pReq2->szSubBankNo) - 1);
+				strncpy(pReq2->szBranchNo, (const char*)strBranchNo, sizeof(pReq2->szBranchNo) - 1);
 
-			// 添加KMC信息
-			package->AddStruct("MKD_REQ2", false, false, (BYTE*)buf, sizeof(MKDownloadReq2)+blob.m_iLength);
-		}
+				CBlob blob;
+				blob.Refer(pReq2->kmcData, 600);
 
-		if (nCapability == 2 || nCapability == 3)
-		{
-			// support sm key
-			char buf[632];
-			memset(buf, 0, 632);
-			SMMKDownloadReq2 *pReq2 = (SMMKDownloadReq2*)buf;
-			strncpy(pReq2->szSubBankNo, (const char*)strSubBankNo, sizeof(pReq2->szSubBankNo) - 1);
-			strncpy(pReq2->szBranchNo, (const char*)strBranchNo, sizeof(pReq2->szBranchNo) - 1);
-
-			CBlob blob;
-			blob.Refer(pReq2->kmcData, 600);
-
-			rc = pEntity->CreateInitMKData(blob, true);
-			if (rc != Error_Succeed)
-			{
-				LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_CREATE_INIT_MK,
-					GetOutPutStr("%s%d", "CreateInitTMK", rc).c_str());
-				//LogError(Severity_Low, Error_Unexpect, ERROR_INITIALIZER_CREATEINITMKDATA,  
-				//	(const char*)CSimpleStringA::Format("CreateInitTMKReq(1) fail, GetKMCLastErrMsg[%s], return[%d]", 
-				//	(const char*)((CInitializerEntity*)m_pEntity)->GetKMCLastErrMsg(), rc));
-
-				pEntity->m_strLastErrMsg = CSimpleStringA::Format("调用KMC接口CreateInitTMKReq(0)失败,错误信息[%s],返回值[%d],请联系维护人员", 
-					(const char*)pEntity->GetKMCLastErrMsg(), rc);
-				return rc;
+				rc = pEntity->CreateInitMKData(blob, false);
+				if (rc != Error_Succeed)
+				{
+					LogWarn(Severity_Middle, (ErrorCodeEnum)rc, ERR_INITIALIZER_CREATE_INIT_MK,
+						GetOutPutStr("%s%d", "CreateInitTMK", rc).c_str());
+					rc = ERR_INITIALIZER_CREATE_INIT_MK;
+					pEntity->m_strLastErrMsg = CSimpleStringA::Format("调用KMC接口CreateInitTMKReq(0)失败,错误信息[%s],返回值[%d],请联系维护人员!",
+						(const char*)pEntity->GetKMCLastErrMsg(), rc);
+					return rc;
+				}
+
+				// 添加KMC信息
+				package->AddStruct("MKD_REQ2", false, false, (BYTE*)buf, sizeof(MKDownloadReq2) + blob.m_iLength);
 			}
 
-			// 添加KMC信息
-			package->AddStruct("MKD_SMR2", false, false, (BYTE*)buf, sizeof(SMMKDownloadReq2)+blob.m_iLength);
+			if (nCapability == 2 || nCapability == 3)
+			{
+				// support sm key
+				char buf[632];
+				memset(buf, 0, 632);
+				SMMKDownloadReq2* pReq2 = (SMMKDownloadReq2*)buf;
+				strncpy(pReq2->szSubBankNo, (const char*)strSubBankNo, sizeof(pReq2->szSubBankNo) - 1);
+				strncpy(pReq2->szBranchNo, (const char*)strBranchNo, sizeof(pReq2->szBranchNo) - 1);
+
+				CBlob blob;
+				blob.Refer(pReq2->kmcData, 600);
+
+				rc = pEntity->CreateInitMKData(blob, true);
+				if (rc != Error_Succeed)
+				{
+					LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_CREATE_INIT_MK,
+						GetOutPutStr("%s%d", "CreateInitTMK", rc).c_str());
+					rc = ERR_INITIALIZER_CREATE_INIT_MK;
+					pEntity->m_strLastErrMsg = CSimpleStringA::Format("调用KMC接口CreateInitTMKReq(0)失败,错误信息[%s],返回值[%d],请联系维护人员",
+						(const char*)pEntity->GetKMCLastErrMsg(), rc);
+					return rc;
+				}
+
+				// 添加KMC信息
+				package->AddStruct("MKD_SMR2", false, false, (BYTE*)buf, sizeof(SMMKDownloadReq2) + blob.m_iLength);
+			}
 		}
+		*/
 	}
 	else
 	{
@@ -204,7 +200,7 @@ ErrorCodeEnum CInitializerConn::SendInitMKPackage()
 	
 	si.EnrolGPS.GetBinaryLongitude(&pReq1->enrolGPS[0]);
 	si.EnrolGPS.GetBinaryLatitude(&pReq1->enrolGPS[4]);
-
+	Dbg("GPS=%s",(char*)&pReq1->enrolGPS);
 	strcpy(pReq1->szEnrolAddr, (const char*)si.strEnrolAddr);
 
 	int nStructLen = sizeof(MKDownloadNew1)+strlen(pReq1->szEnrolAddr);		// 变长结构长度计算
@@ -212,12 +208,12 @@ ErrorCodeEnum CInitializerConn::SendInitMKPackage()
 
 	// 获取硬件信息
 	CAutoArray<CSimpleStringA> devNames;
-	auto rc = SpGetAllDevices(m_pEntity, devNames);
+	DWORD rc = SpGetAllDevices(m_pEntity, devNames);
 	if (rc != Error_Succeed)
 	{
 		LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_READ_WRITE_FILE,
-			GetOutPutStr("%s%08X", "SpGetAllDevices", rc).c_str());
-		//LogError(Severity_Low, Error_Unexpect, ERROR_INITIALIZER_GETDEVICES,  (const char*)CSimpleStringA::Format("get all device info fail, %d", rc));
+				GetOutPutStr("%s%08X", "SpGetAllDevices", rc).c_str());
+		rc = ERR_INITIALIZER_READ_WRITE_FILE;
 		pEntity->m_strLastErrMsg = CSimpleStringA::Format("从root.ini读取硬件信息失败,错误码[0x%08X],请联系分行技术部", rc);
 		return rc;
 	}
@@ -237,7 +233,6 @@ ErrorCodeEnum CInitializerConn::SendInitMKPackage()
 			rc = SpGetDeviceInfo(m_pEntity, devNames[i], strModel, strVendor, strVersion);
 			if (rc == Error_Succeed)
 			{
-				//Dbg("device: type=%s, model=%s, factory=%s", (const char*)devNames[i], (const char*)strModel, (const char*)strVendor);
 
 				strncpy(pDevInfo->szType, (const char*)devNames[i], sizeof(pDevInfo->szType)-1);
 				strncpy(pDevInfo->szModal, (const char*)strModel, sizeof(pDevInfo->szModal)-1);
@@ -264,22 +259,26 @@ ErrorCodeEnum CInitializerConn::SendInitMKPackage()
 
 	// 获取硬件指纹和公钥信息
 	MKDownloadReq4  req4 = {};
-	int nBufLen = sizeof(req4.FingerPrint);
-	if (!pEntity->GetTerminalFingerPrint(req4.FingerPrint, nBufLen))
+	BYTE fingerPrint[32] = { 0 };
+	int nBufLen = sizeof(fingerPrint);
+	if (!pEntity->GetTerminalFingerPrint(fingerPrint, nBufLen))
 	{
 		LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_GET_TERMINAL_FINGERPRINT,
 			GetOutPutStr("%s%s", "GetTerminalFingerPrint", "False").c_str());
-		//LogError(Severity_Low, Error_Unexpect, ERROR_INITIALIZER_FINGERPINT,  (const char*)CSimpleStringA::Format("get fingerpint fail"));
-		return Error_Unexpect;
+		return ERR_INITIALIZER_GET_TERMINAL_FINGERPRINT;
 	}
+	memcpy(req4.FingerPrint,fingerPrint,16);
+	memcpy(req4.FingerPrintSM, fingerPrint + 16, 16);
 
 	nBufLen = sizeof(req4.PublicKey);
+	Dbg("开始获取公钥。。。");
+	memset(req4.PublicKey,0, nBufLen);
+	Dbg("nBufLen=%d",nBufLen);
 	if (!pEntity->GetTerminalPublicKey(req4.PublicKey, nBufLen))
 	{
 		LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_GET_TERMINAL_PUBKEY,
 			GetOutPutStr("%s%s", "GetTerminalPublicKey", "False").c_str());
-		//LogError(Severity_Low, Error_Unexpect, ERROR_INITIALIZER_GETPUBKEY,  (const char*)CSimpleStringA::Format("get public key fail"));
-		return Error_Unexpect;
+		return ERR_INITIALIZER_GET_TERMINAL_PUBKEY;
 	}
 
 	if (nRet == 1 || nRet == 3)
@@ -287,22 +286,44 @@ ErrorCodeEnum CInitializerConn::SendInitMKPackage()
 
 	package->AddStruct("MKD_REQ4", false, false, (BYTE*)&req4, sizeof(req4));
 
-	//Dbg("send MK init request now");
-	return SendPackage(package) != "" ? Error_Succeed : Error_Unexpect;
+	//国密改造
+	MKDownloadReq5 req5 = {};
+	req5.isFirst = pEntity->GetOrSetIsFirstSM(0);
+	req5.isSM = 1;
+	package->AddStruct("MKD_REQ5", false, false, (BYTE*)& req5, sizeof(req5));
+	Dbg("req5.isFirst=%d,req5.isSM=%d",req5.isFirst,req5.isSM);
+	Dbg("send MK init request now");
+	return SendPackage(package) != "" ? Error_Succeed : ERR_INITIALIZER_INIT_MK_SEND_PKG;
 }
 
-ErrorCodeEnum CInitializerConn::SendSyncPubKeyPackage()
+DWORD CInitializerConn::SendSyncPubKeyPackage()
 {
 	assert(IsConnectionOK());
-
+	PubKeySyncReq0 req;
+	req.isSM = 1;
 	CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
 	CSmartPointer<IPackage> package = CreateNewPackage("SyncPK");
+	package->AddStruct("PKSY_R0", false, false, (BYTE*)& req, sizeof(req));
+	return SendPackage(package) != "" ? Error_Succeed : Error_Unexpect;
+}
 
+DWORD CInitializerConn::SendGetKMCKey(string TerminalNo)
+{
+	LOG_FUNCTION();
+	assert(IsConnectionOK());
+	KMCKeyReq req;
+	memset(req.TerminalNo,0,sizeof(req.TerminalNo));
+	strcpy(req.TerminalNo,TerminalNo.c_str());
+	//req.TerminalNo = TerminalNo;
+	CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
+	CSmartPointer<IPackage> package = CreateNewPackage("KMCKey");
+	package->AddStruct("KMCKeyReq", false, false, (BYTE*)& req, sizeof(req));
 	return SendPackage(package) != "" ? Error_Succeed : Error_Unexpect;
 }
 
-ErrorCodeEnum CInitializerConn::SendCloseTaskPackage(const char *pUserID)
+DWORD CInitializerConn::SendCloseTaskPackage(const char *pUserID)
 {
+	LOG_FUNCTION();
 	assert(IsConnectionOK());
 	CloseTaskReq req;
 	memset(&req, 0, sizeof(req));
@@ -459,7 +480,9 @@ void CInitializerConn::OnDisconnect()
 
 void CInitializerConn::OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg)
 {
+	LOG_FUNCTION();
 	string serviceCode = pRecvPkg->GetServiceCode();
+	Dbg("serviceCode=%s",serviceCode.c_str());
 	if (serviceCode == "Login")
 	{
 		HandleLoginRet(pRecvPkg);
@@ -480,44 +503,47 @@ void CInitializerConn::OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg)
 	{
 		HandleCloseTaskRet(pRecvPkg);
 	}
+	else if (serviceCode == "KMCKey") {
+		HandleGetKMCKey(pRecvPkg);
+	}
 	else
 	{
-		//LogError(Severity_Middle, Error_Unexpect, 0, CSimpleStringA::Format("unknown service code: %s", serviceCode.c_str()));
 		LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_UNKOWN,
-			GetOutPutStr("%s%s", "UnKown", serviceCode.c_str()).c_str());
+			    GetOutPutStr("%s%s", "UnKown", serviceCode.c_str()).c_str());
 	}
 }
 
-ErrorCodeEnum CInitializerConn::HandleLoginRet(const CSmartPointer<IPackage> &pRecvPkg)
+DWORD CInitializerConn::HandleLoginRet(const CSmartPointer<IPackage> &pRecvPkg)
 {
-	ErrorCodeEnum rc = Error_Succeed;
+	LOG_FUNCTION();
+	DWORD rc = Error_Succeed;
 	DWORD dwSysCode, dwUserCode;
 	string strErrMsg;
 	
 	if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
 	{
-		rc = (ErrorCodeEnum)dwSysCode;
-		//LogError(Severity_Middle, rc, dwUserCode, CSimpleStringA::Format("登陆失败,服务端返回错误:%s", strErrMsg.c_str()));
-		LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_LOGIN,
-			GetOutPutStr("%s%08X%s%s", "GetErrMsg", rc,"strErrMsg", strErrMsg.c_str()).c_str());
+		//在分行服务定义的错误码,值与EventCode.h中的对应
+		LogWarn(Severity_Middle,(ErrorCodeEnum) dwSysCode, dwUserCode,
+			GetOutPutStr("%s%08X%s%s", "GetErrMsg", dwSysCode,"strErrMsg", strErrMsg.c_str()).c_str());
+		rc = dwUserCode;
 	}
 	
 	((CInitializerEntity*)m_pEntity)->EndLogin(rc, strErrMsg.c_str());
 	return rc;
 }
 
-ErrorCodeEnum CInitializerConn::HandleCloseTaskRet(const CSmartPointer<IPackage> &pRecvPkg)
+DWORD CInitializerConn::HandleCloseTaskRet(const CSmartPointer<IPackage> &pRecvPkg)
 {
-	ErrorCodeEnum rc = Error_Succeed;
+	DWORD rc = Error_Succeed;
 	DWORD dwSysCode, dwUserCode;
 	string strErrMsg;
 
 	if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
 	{
-		rc = (ErrorCodeEnum)dwSysCode;
-		//LogError(Severity_Middle, rc, dwUserCode, CSimpleStringA::Format("关闭初始化任务失败,服务端返回错误:%s", strErrMsg.c_str()));
-		LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_EXIT,
-			GetOutPutStr("%s%08X%s%s", "GetErrMsg", dwSysCode, "strErrMsg", strErrMsg.c_str()).c_str());
+		rc = dwUserCode;
+		
+		LogWarn(Severity_Middle, Error_Unexpect, rc,
+			GetOutPutStr("%s%08X%s%s", "GetErrMsg", rc, "strErrMsg", strErrMsg.c_str()).c_str());
 	}
 
 	((CInitializerEntity*)m_pEntity)->SecureClientRelease();
@@ -525,9 +551,9 @@ ErrorCodeEnum CInitializerConn::HandleCloseTaskRet(const CSmartPointer<IPackage>
 	return rc;
 }
 
-ErrorCodeEnum CInitializerConn::HandleInitMKRet(const CSmartPointer<IPackage> &pRecvPkg)
+DWORD CInitializerConn::HandleInitMKRet(const CSmartPointer<IPackage> &pRecvPkg)
 {
-	ErrorCodeEnum rc = Error_Succeed;
+	DWORD rc = Error_Succeed;
 	DWORD dwSysCode, dwUserCode;
 	string strErrMsg;
 	
@@ -536,92 +562,114 @@ ErrorCodeEnum CInitializerConn::HandleInitMKRet(const CSmartPointer<IPackage> &p
 
 	if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
 	{
-		rc = (ErrorCodeEnum)dwSysCode;
-		LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_INIT_MK,
+		rc = dwUserCode;
+		LogWarn(Severity_Middle, (ErrorCodeEnum) rc, dwUserCode,
 			GetOutPutStr("%s%08X%s%s", "dwSysCode", rc, "strErrMsg", strErrMsg).c_str());
-		//LogError(Severity_Middle, rc, dwUserCode, CSimpleStringA::Format("初始化主密钥失败,服务端返回错误:%s", strErrMsg.c_str()));
+
 		strRetErrMsg = strErrMsg.c_str();
 	}
 	else if (pEntity->HasPinPad())	// 有PinPad
 	{
-		// 主密钥初始返回
-		int nRetLen = pRecvPkg->GetStructLen("MKD_RET");
-		if (nRetLen > 0)
+		//国产化不再使用原方法生成KMC密钥
+		/*
 		{
-			// support des key
-			BYTE *pBuf = new BYTE[nRetLen];
-			memset(pBuf, 0, nRetLen);
+			// 主密钥初始返回
+			int nRetLen = pRecvPkg->GetStructLen("MKD_RET");
+			if (nRetLen > 0)
+			{
+				// support des key
+				BYTE* pBuf = new BYTE[nRetLen];
+				memset(pBuf, 0, nRetLen);
 
-			int nArrayNum(0);
-			pRecvPkg->GetStructData("MKD_RET", pBuf, &nRetLen, &nArrayNum);
+				int nArrayNum(0);
+				pRecvPkg->GetStructData("MKD_RET", pBuf, &nRetLen, &nArrayNum);
 
-			// 调用KMC解析返回
-			CBlob blob;
-			blob.Refer(pBuf, nRetLen);
-			rc = pEntity->ParseInitMKResult(blob, false);
-			delete pBuf;
+				// 调用KMC解析返回
+				CBlob blob;
+				blob.Refer(pBuf, nRetLen);
+				rc = pEntity->ParseInitMKResult(blob, false);
+				delete pBuf;
 
-			if (rc == Error_Succeed)
-			{
-				Dbg("parse des tmk succ");
-				rc = pEntity->LoadKeysToPinPad(false);
-				if (rc != Error_Succeed)
+				if (rc == Error_Succeed)
 				{
-					strRetErrMsg = "加载DES主密钥到密码键盘失败";
-					LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_LOAD_KEYS_TO_PINPAD, 
-						GetOutPutStr("%s%08X%s%s", "LoadKeysToPinPad", rc,"strRetErrMsg", strRetErrMsg).c_str());
+					Dbg("parse des tmk succ");
+					rc = pEntity->LoadKeysToPinPad(false);
+					if (rc != Error_Succeed)
+					{
+						strRetErrMsg = "加载DES主密钥到密码键盘失败";
+						LogWarn(Severity_Middle, (ErrorCodeEnum)rc, ERR_INITIALIZER_LOAD_KEYS_TO_PINPAD,
+							GetOutPutStr("%s%08X%s%s", "LoadKeysToPinPad", rc, "strRetErrMsg", strRetErrMsg).c_str());
+						//rc = ERR_INITIALIZER_LOAD_KEYS_TO_PINPAD;
+					}
+
+					else
+						strRetErrMsg = "加载DES主密钥成功。";
 				}
-					
 				else
-					strRetErrMsg = "加载DES主密钥成功。";
-			}
-			else
-			{
-				strRetErrMsg = "解析DES主密钥返回数据失败";
-				LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_PARSE_INIT_MK,
-					GetOutPutStr("%s%08X%s%s", "ParseInitMKResult", rc,"strRetErrMsg", strRetErrMsg).c_str());
+				{
+					strRetErrMsg = "解析DES主密钥返回数据失败";
+					LogWarn(Severity_Middle, (ErrorCodeEnum)rc, ERR_INITIALIZER_PARSE_INIT_MK,
+						GetOutPutStr("%s%08X%s%s", "ParseInitMKResult", rc, "strRetErrMsg", strRetErrMsg).c_str());
+					rc = ERR_INITIALIZER_PARSE_INIT_MK;
+				}
 			}
-		}
-
-		nRetLen = pRecvPkg->GetStructLen("MKD_SMT");
-		if (nRetLen > 0)
-		{
-			// support sm key
-			BYTE *pBuf = new BYTE[nRetLen];
-			memset(pBuf, 0, nRetLen);
 
-			int nArrayNum(0);
-			pRecvPkg->GetStructData("MKD_SMT", pBuf, &nRetLen, &nArrayNum);
+			nRetLen = pRecvPkg->GetStructLen("MKD_SMT");
+			if (nRetLen > 0)
+			{
+				Dbg("正在加载国密密钥至pinpad");
+				// support sm key
+				BYTE* pBuf = new BYTE[nRetLen];
+				memset(pBuf, 0, nRetLen);
 
-			// 调用KMC解析返回
-			CBlob blob;
-			blob.Refer(pBuf, nRetLen);
-			rc = pEntity->ParseInitMKResult(blob, true);
-			delete pBuf;
+				int nArrayNum(0);
+				pRecvPkg->GetStructData("MKD_SMT", pBuf, &nRetLen, &nArrayNum);
 
-			if (rc == Error_Succeed)
-			{
-				Dbg("parse sm4 tmk succ");
+				// 调用KMC解析返回
+				CBlob blob;
+				blob.Refer(pBuf, nRetLen);
+				rc = pEntity->ParseInitMKResult(blob, true);
+				delete pBuf;
 
-				rc = pEntity->LoadKeysToPinPad(true);
-				if (rc != Error_Succeed)
+				if (rc == Error_Succeed)
 				{
-					strRetErrMsg = "加载SM主密钥到密码键盘失败";
-					LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_LOAD_KEYS_TO_PINPAD,
-						GetOutPutStr("%s%08X%s%s", "LoadKeysToPinPad", rc, "strRetErrMsg", strRetErrMsg).c_str());
+					Dbg("parse sm4 tmk succ");
+
+					rc = pEntity->LoadKeysToPinPad(true);
+					if (rc != Error_Succeed)
+					{
+						strRetErrMsg = "加载SM主密钥到密码键盘失败";
+						LogWarn(Severity_Middle, (ErrorCodeEnum)rc, ERR_INITIALIZER_LOAD_KEYS_TO_PINPAD,
+							GetOutPutStr("%s%08X%s%s", "LoadKeysToPinPad", rc, "strRetErrMsg", strRetErrMsg).c_str());
+						rc = ERR_INITIALIZER_LOAD_KEYS_TO_PINPAD;
+					}
+					else
+						strRetErrMsg += "加载SM主密钥成功。";
 				}
 				else
-					strRetErrMsg += "加载SM主密钥成功。";
-			}
-			else
-			{
-				strRetErrMsg = "解析SM主密钥返回数据失败";
-				LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_PARSE_INIT_MK,
-					GetOutPutStr("%s%08X%s%s", "ParseInitMKResult", rc, "strRetErrMsg", strRetErrMsg).c_str());
+				{
+					strRetErrMsg = "解析SM主密钥返回数据失败";
+					LogWarn(Severity_Middle, (ErrorCodeEnum)rc, ERR_INITIALIZER_PARSE_INIT_MK,
+						GetOutPutStr("%s%08X%s%s", "ParseInitMKResult", rc, "strRetErrMsg", strRetErrMsg).c_str());
+					rc = ERR_INITIALIZER_PARSE_INIT_MK;
+				}
 			}
 		}
+		*/
+		//只支持国密
+		rc = pEntity->LoadKeysToPinPad(true);
+		if (rc != Error_Succeed)
+		{
+			strRetErrMsg = "加载SM密钥到密码键盘失败";
+			LogWarn(Severity_Middle, (ErrorCodeEnum)rc, ERR_INITIALIZER_LOAD_KEYS_TO_PINPAD,
+				GetOutPutStr("%s%08X%s%s", "LoadKeysToPinPad", rc, "strRetErrMsg", strRetErrMsg).c_str());
+		}
 	}
 
+	if (!pEntity->GetOrSetIsFirstSM(1)) {
+		rc = Error_Unexpect;
+		strRetErrMsg = "设置IsFirstSM失败。。。";
+	}
 	pEntity->EndInitMK(rc, strRetErrMsg);
 
 	return rc;	
@@ -665,9 +713,56 @@ ErrorCodeEnum GetPukeyValue(BYTE* pPukeyContent, int nPuKeyContentLen, int nKeyT
 	return rc;
 }
 
-ErrorCodeEnum CInitializerConn::HandleSyncPubKeyRet(const CSmartPointer<IPackage> &pRecvPkg)
+DWORD CInitializerConn::HandleGetKMCKey(const CSmartPointer<IPackage>& pRecvPkg) {
+	LOG_FUNCTION();
+	DWORD rc = Error_Succeed;
+	DWORD dwSysCode, dwUserCode;
+	string strErrMsg;
+	auto pEntity = (CInitializerEntity*)m_pEntity;
+	if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
+	{
+		rc = dwUserCode;
+		rc = dwUserCode;
+		LogWarn(Severity_Middle, (ErrorCodeEnum)dwSysCode, dwUserCode,
+			GetOutPutStr("%s%08X%s%s", "GetErrMsg", rc, "strErrMsg", strErrMsg).c_str());
+		pEntity->m_bGetKMCKey = false;
+	}
+	else
+	{
+		int nLen = pRecvPkg->GetStructLen("KMCKeyRet");
+		if (nLen <= 0)
+		{
+			strErrMsg = "KMCKeyRet返回数据为空。";
+			Dbg("KMCKeyRet返回数据为空。");
+			pEntity->m_bGetKMCKey = false;
+			rc = ERR_INITIALIZER_GET_KMC_KEY_NULL;
+		}
+		else
+		{
+			pEntity->m_bGetKMCKey = true;
+			BYTE* pBuf = new BYTE[nLen];
+			memset(pBuf, 0, nLen);
+			int nArrayNum = 0;
+			bool bSuc = pRecvPkg->GetStructData("KMCKeyRet", (BYTE*)pBuf, &nLen, &nArrayNum);
+			assert(bSuc);
+			assert(nLen % sizeof(KMCKeyRet) == 0);
+			KMCKeyRet* ret = (KMCKeyRet*)pBuf;
+			pEntity->m_TMK = ret->TMK;
+			pEntity->m_TPK = ret->TPK;
+			pEntity->m_EDK = ret->EDK;
+			Dbg("TMK=%s", pEntity->m_TMK.c_str());
+			Dbg("TPK=%s", pEntity->m_TPK.c_str());
+			Dbg("EDK=%s", pEntity->m_EDK.c_str());
+		}
+	}
+	
+	pEntity->EndGetKMCKey(rc, strErrMsg.c_str());
+	return rc;
+}
+
+DWORD CInitializerConn::HandleSyncPubKeyRet(const CSmartPointer<IPackage> &pRecvPkg)
 {
-	ErrorCodeEnum rc = Error_Succeed;
+	DWORD rc = Error_Succeed;
 	DWORD dwSysCode, dwUserCode;
 	string strErrMsg;
 	BOOL bSyncPK = FALSE;
@@ -678,10 +773,9 @@ ErrorCodeEnum CInitializerConn::HandleSyncPubKeyRet(const CSmartPointer<IPackage
 
 	if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
 	{
-		rc = (ErrorCodeEnum)dwSysCode;
-		LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_SYNC_PUBKEY,
-			GetOutPutStr("%s%08X", "GetErrMsg", rc).c_str());
-		//LogError(Severity_Low, rc, ERROR_INITIALIZER_SYNCPUBKEY, CSimpleStringA::Format("同步公钥文件失败,服务端返回错误:%s", strErrMsg.c_str()));
+		rc = dwUserCode;
+		LogWarn(Severity_Middle,(ErrorCodeEnum) dwSysCode, dwUserCode,
+			    GetOutPutStr("%s%08X", "GetErrMsg", rc).c_str());
 	}
 	else
 	{
@@ -691,7 +785,8 @@ ErrorCodeEnum CInitializerConn::HandleSyncPubKeyRet(const CSmartPointer<IPackage
 			Dbg("key file all same");			
 		}
 		else
-		{
+		{   
+			Dbg("写入缓存。。。");
 			assert(nLen % sizeof(PubKeySyncRet) == 0);
 
 			BYTE *pBuf = new BYTE[nLen];
@@ -702,36 +797,36 @@ ErrorCodeEnum CInitializerConn::HandleSyncPubKeyRet(const CSmartPointer<IPackage
 			assert(nLen % sizeof(PubKeySyncRet) == 0);
 
 			PubKeySyncRet *pRet = (PubKeySyncRet*)pBuf;
-
+			//计算密钥校验码
 			if (pEntity->HasCkCodeFlg())
 			{
-				BYTE hash[16] = {};
+				Dbg("缓存公钥。。。");
+				BYTE hash[32] = { 0 };
 
 				//缓存存储公钥
 				for (int i = 0; i < nArrayNum; i++)
-				{				
+				{
 					Dbg("file %s not same, sync...", pRet[i].FileName);
 					if (0 == strcmp(pRet[i].FileName, PUKFILENAME_RSA))
-					{									
-						if (GetFileHash(pRet[i].Content, pRet[i].FileLen, hash) != Error_Succeed)
+					{
+						//if (GetFileHash(pRet[i].Content, pRet[i].FileLen, hash) != Error_Succeed)
+						if(!SM3Hash(pRet[i].Content,pRet[i].FileLen,hash))
 						{
 							LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_GET_FILE_HASH,
 								GetOutPutStr("%s%08X%s%s", "GetFileHash", Error_Unexpect,"File", pRet[i].FileName).c_str());
-							//LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_GETFILEHASH, CSimpleStringA::Format("compute file %s hash fail", pRet[i].FileName));
-							strErrMsg = "公钥文件摘要失败";
-							rc = Error_Unexpect;
+							strErrMsg = "RSA公钥文件摘要失败";
+							rc = ERR_INITIALIZER_GET_FILE_HASH;
 							break;
 						}
 
 						memset(pEntity->m_cTDESPukey, 0, 2048);
 						GetPukeyValue(pRet[i].Content, pRet[i].FileLen, DES, pEntity->m_cTDESPukey, &(pEntity->m_iTDESPukeyLen));
 
-						if (memcmp(hash, pRet[i].FileHash, 16) != 0)
+						if (memcmp(hash, pRet[i].FileHash, 16) != 0 || memcmp(hash+16,pRet->FileHashSM,16) != 0)
 						{
 							LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_CHECK_HASH,GetOutPutStr("%s%s", "File", pRet[i].FileName).c_str());
-							//LogError(Severity_Low, Error_Unexpect, ERROR_INITIALIZER_SYNCPUBKEY, CSimpleStringA::Format("file %s hash not equal", pRet[i].FileName));
-							strErrMsg = "公钥文件校验不通过";
-							rc = Error_Unexpect;
+							strErrMsg = "RSA公钥文件校验不通过";
+							rc = ERR_INITIALIZER_CHECK_HASH;
 							break;
 						}
 
@@ -739,25 +834,24 @@ ErrorCodeEnum CInitializerConn::HandleSyncPubKeyRet(const CSmartPointer<IPackage
 					}
 					else if (0 == strcmp(pRet[i].FileName, PUKFILENAME_SM2))
 					{
-						if (GetFileHash(pRet[i].Content, pRet[i].FileLen, hash) != Error_Succeed)
+						//if (GetFileHash(pRet[i].Content, pRet[i].FileLen, hash) != Error_Succeed)
+						if(!SM3Hash(pRet[i].Content,pRet[i].FileLen,hash))
 						{
 							LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_GET_FILE_HASH,
 								GetOutPutStr("%s%08X%s%s", "GetFileHash", Error_Unexpect, "File", pRet[i].FileName).c_str());
-							//LogError(Severity_Low, Error_Unexpect, ERROR_ACCESSAUTH_GETFILEHASH, CSimpleStringA::Format("compute file %s hash fail", pRet[i].FileName));
-							strErrMsg = "公钥文件摘要失败";
-							rc = Error_Unexpect;
+							strErrMsg = "SM2公钥文件摘要失败";
+							rc = ERR_INITIALIZER_GET_FILE_HASH;
 							break;
 						}
 
 						memset(pEntity->m_cSM2Pukey, 0, 2048);
 						GetPukeyValue(pRet[i].Content, pRet[i].FileLen, SM4, pEntity->m_cSM2Pukey, &(pEntity->m_iSM2Pukeylen));
 
-						if (memcmp(hash, pRet[i].FileHash, 16) != 0)
+						if (memcmp(hash, pRet[i].FileHash, 16) != 0 || memcmp(hash + 16, pRet[i].FileHashSM, 16) != 0)
 						{
 							LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_CHECK_HASH, GetOutPutStr("%s%s", "File", pRet[i].FileName).c_str());
-							//LogError(Severity_Low, Error_Unexpect, ERROR_INITIALIZER_SYNCPUBKEY, CSimpleStringA::Format("file %s hash not equal", pRet[i].FileName));
-							strErrMsg = "公钥文件校验不通过";
-							rc = Error_Unexpect;
+							strErrMsg = "SM2公钥文件校验不通过";
+							rc = ERR_INITIALIZER_CHECK_HASH;
 							break;
 						}
 
@@ -766,26 +860,24 @@ ErrorCodeEnum CInitializerConn::HandleSyncPubKeyRet(const CSmartPointer<IPackage
 					else
 					{
 						//从分行服务下载下来的其它密钥文件,直接忽略,不报错
-						Dbg("downlaod pukey file same is err...", pRet[i].FileName);
-						//strErrMsg = "从准入服务下载的公钥名称不正确";
-						//rc = Error_Unexpect;
-						//break;
-					}		
+						Dbg("其它密钥文件:%s", pRet[i].FileName);
+					}
 
-					Dbg("file %s sync succ", pRet[i].FileName);
+					Dbg("file %s sm2 check succ,save as buf", pRet[i].FileName);
 				}
 
 				if (!bSyncPK)
 				{
 					LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_PUBKEY_FILE,
-						GetOutPutStr("%s%s", "bSyncPK", "False").c_str());
+							GetOutPutStr("%s%s", "bSyncPK", "False").c_str());
 					Dbg("分行服务KMC目录不存在正确的公钥文件");
 					strErrMsg = "分行服务不存在正确的公钥文件";
-					rc = Error_Unexpect;
+					rc = ERR_INITIALIZER_PUBKEY_FILE;
 				}
-			} 
+			}
 			else
-			{										
+			{		
+				Dbg("保存公钥。。。");
 				CSimpleStringA strPath;
 				m_pEntity->GetFunction()->GetPath("RunInfo", strPath);
 				strPath += "\\kmc\\";
@@ -798,56 +890,58 @@ ErrorCodeEnum CInitializerConn::HandleSyncPubKeyRet(const CSmartPointer<IPackage
 					Dbg("file %s not same, sync...", pRet[i].FileName);
 
 					CSimpleStringA strFilePath = strPath + pRet[i].FileName;
-					FILE *pFile = fopen(strFilePath, "w");
+					FILE* pFile = fopen(strFilePath, "wb");
 					if (pFile == NULL)
 					{
 						LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_READ_WRITE_FILE,
 							GetOutPutStr("%s%s%s%s", "fopen", "w","strFilePath", strFilePath.GetData()).c_str());
-						//LogError(Severity_Low, Error_Unexpect, ERROR_INITIALIZER_SYNCPUBKEY, CSimpleStringA::Format("open file %s fail", pRet[i].FileName));
 						strErrMsg = "打开公钥文件失败";
-						rc = Error_Unexpect;
+						rc = ERR_INITIALIZER_READ_WRITE_FILE;
 						break;
 					}
-
+					Dbg("pRet[i].Content=%s,%d",(char*) pRet[i].Content,pRet[i].FileLen);
 					auto nWriteLen = fwrite(pRet[i].Content, 1, pRet[i].FileLen, pFile);
-					if (nWriteLen < pRet[i].FileLen)
+					if (nWriteLen != pRet[i].FileLen)
 					{
 						LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_READ_WRITE_FILE,
 							GetOutPutStr("%s%d%s%s", "fwrite", nWriteLen, "FileName", pRet[i].FileName).c_str());
 						//LogError(Severity_Low, Error_Unexpect, ERROR_INITIALIZER_SYNCPUBKEY, CSimpleStringA::Format("write file %s fail", pRet[i].FileName));
 						fclose(pFile);
 						strErrMsg = "写入公钥文件失败";
-						rc = Error_Unexpect;
+						rc = ERR_INITIALIZER_READ_WRITE_FILE;
 						break;
 					}
 
 					fclose(pFile);
 
 
-					BYTE hash[16] = {};
-					if (GetFileHashOld(strFilePath, hash) != Error_Succeed)
+					BYTE hash[32] = { 0 };
+					//if (GetFileHashOld(strFilePath, hash) != Error_Succeed)
+					if(!SM3File((char*)strFilePath.GetData(), hash))
 					{
 						LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_GET_FILE_HASH,
 							GetOutPutStr("%s%08X%s%s", "GetFileHashOld", Error_Unexpect, "File", strFilePath).c_str());
-						//LogError(Severity_Low, Error_Unexpect, ERROR_INITIALIZER_SYNCPUBKEY, CSimpleStringA::Format("compute file %s hash fail", pRet[i].FileName));
+
 						strErrMsg = "公钥文件摘要失败";
-						rc = Error_Unexpect;
+						rc = ERR_INITIALIZER_GET_FILE_HASH;
 						break;
 					}
-
-					if (memcmp(hash, pRet[i].FileHash, 16) != 0)
+					Dbg("strFilePath=%s", strFilePath.GetData());
+					Dbg("file hash=%s", MyBase64::Str2Hex((char*)hash, 32));
+					Dbg("hash=%s", MyBase64::Str2Hex((char*)pRet[i].FileHash, 16));
+					Dbg("hashsm=%s", MyBase64::Str2Hex((char*)pRet[i].FileHashSM, 16));
+					if (memcmp(hash, pRet[i].FileHash, 16) != 0 || memcmp(hash + 16, pRet[i].FileHashSM, 16) != 0)
 					{
 						LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_CHECK_HASH, GetOutPutStr("%s%s", "File", pRet[i].FileName).c_str());
-						//LogError(Severity_Low, Error_Unexpect, ERROR_INITIALIZER_SYNCPUBKEY, CSimpleStringA::Format("file %s hash not equal", pRet[i].FileName));
 						strErrMsg = "公钥文件校验不通过";
-						rc = Error_Unexpect;
+						rc = ERR_INITIALIZER_CHECK_HASH;
 						break;
 					}
 
 					Dbg("file %s sync succ", pRet[i].FileName);
 				}
-			}		
-
+			}
+			
 			delete[] pBuf;
 		}
 	}
@@ -857,7 +951,7 @@ ErrorCodeEnum CInitializerConn::HandleSyncPubKeyRet(const CSmartPointer<IPackage
 	return rc;
 }
 
-ErrorCodeEnum CInitializerConn::SendReportStatePackage(const char*pszEventType, const char *pszUserID, DWORD dwErrCode, const char *pszErrMsg)
+DWORD CInitializerConn::SendReportStatePackage(const char*pszEventType, const char *pszUserID, DWORD dwErrCode, const char *pszErrMsg)
 {
 	auto pFunc = m_pEntity->GetFunction();
 
@@ -867,9 +961,12 @@ ErrorCodeEnum CInitializerConn::SendReportStatePackage(const char*pszEventType,
 	ReportStateReq req = {};
 	strncpy(req.TerminalNo, ssInfo.strTerminalID, sizeof(req.TerminalNo) - 1);
 	strncpy(req.EventType, pszEventType, sizeof(req.EventType) - 1);
+
 	if (pszUserID != NULL)
 		strncpy(req.UserID, pszUserID, sizeof(req.UserID) - 1);
+
 	req.ErrorCode = dwErrCode;
+
 	if (pszErrMsg != NULL)
 		strncpy(req.ErrorMsg, pszErrMsg, sizeof(req.ErrorMsg) - 1);
 
@@ -879,17 +976,16 @@ ErrorCodeEnum CInitializerConn::SendReportStatePackage(const char*pszEventType,
 	return SendPackage(package) != "" ? Error_Succeed : Error_Unexpect;
 }
 
-ErrorCodeEnum CInitializerConn::HandleReportStateRet(const CSmartPointer<IPackage> &pRecvPkg)
+DWORD CInitializerConn::HandleReportStateRet(const CSmartPointer<IPackage> &pRecvPkg)
 {
-	ErrorCodeEnum rc = Error_Succeed;
+	DWORD rc = Error_Succeed;
 	DWORD dwSysCode, dwUserCode;
 	string strErrMsg;
 
 	if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
 	{
-		rc = (ErrorCodeEnum)dwSysCode;
-		//LogError(Severity_Middle, rc, ERROR_ACCESSAUTH_SERVERRETURN, CSimpleStringA::Format("HandleReportStateRet,report state fail, %s", strErrMsg.c_str()));
-		LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_REPORT_STATE,
+		rc = dwUserCode;
+		LogWarn(Severity_Middle, Error_Unexpect, rc,
 				GetOutPutStr("%s%08X", "GetErrMsg", rc).c_str());
 	}
 

+ 46 - 13
Module/mod_Initializer/InitializerConn.h

@@ -64,6 +64,24 @@ struct MKDownloadReq3
     BYTE version[8];	         // 硬件版本号
 };
 
+struct PubKeySyncReq0
+{
+	int isSM;
+};
+
+//获取KMC密钥
+struct KMCKeyReq {
+	char TerminalNo[16];
+};
+
+struct KMCKeyRet {
+	char TMK[64];
+	char TPK[64];
+	char EDK[64];
+	char Reserved[256];
+};
+
+
 // 终端公钥及指纹信息
 // [MKD_REQ4]
 struct MKDownloadReq4
@@ -74,9 +92,17 @@ struct MKDownloadReq4
 	//  20170205: 增加PinPadID
 	//BYTE Reserverd[64];		// 保留字段
 	char PinPadID[32];
-	BYTE Reserverd[32];
+
+	BYTE FingerPrintSM[16];    //兼容SM3 32位
+
+	BYTE Reserverd[16];
 };
 
+//标识是否进行过国密改造
+struct MKDownloadReq5 {
+	int isSM;
+	int isFirst;
+};
 // 主密钥下载返回
 // 无密码键盘硬件终端,则不返回此结构
 // [MKD_RET]
@@ -99,7 +125,9 @@ struct PubKeySyncReq
 {
 	char FileName[32];
 	BYTE FileHash[16];
-	BYTE Reserved[32];
+	
+	BYTE FileHashSM[16];
+	BYTE Reserved[16];
 };
 
 // 多组返回
@@ -107,10 +135,13 @@ struct PubKeySyncReq
 struct PubKeySyncRet
 {
 	char FileName[32];
+
 	BYTE FileHash[16];
 	BYTE Content[2048];
 	DWORD FileLen;
-	BYTE Reserved[64];
+
+	BYTE FileHashSM[16];
+	BYTE Reserved[48];
 };
 
 // 状态上报
@@ -131,22 +162,24 @@ class CInitializerConn : public SpSecureClient
 public:
 	CInitializerConn(CEntityBase *pEntity);
 
-	ErrorCodeEnum SendLoginPackage(const char *pUserID, const char *pPwd);
-	ErrorCodeEnum SendInitMKPackage();
-	ErrorCodeEnum SendSyncPubKeyPackage();
-	ErrorCodeEnum SendReportStatePackage(const char*pszEventType, const char *pszUserID, DWORD dwErrCode, const char *pszErrMsg);
-	ErrorCodeEnum SendCloseTaskPackage(const char *pUserID);
+	DWORD SendLoginPackage(const char *pUserID, const char *pPwd);
+	DWORD SendSyncPubKeyPackage();
+	DWORD SendGetKMCKey(string TerminalNo);
+	DWORD SendInitMKPackage();
+	DWORD SendReportStatePackage(const char*pszEventType, const char *pszUserID, DWORD dwErrCode, const char *pszErrMsg);
+	DWORD SendCloseTaskPackage(const char *pUserID);
 
 private:
 	~CInitializerConn();
 	void OnDisconnect();
 	void OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg);
 
-	ErrorCodeEnum HandleLoginRet(const CSmartPointer<IPackage> &pRecvPkg);
-	ErrorCodeEnum HandleInitMKRet(const CSmartPointer<IPackage> &pRecvPkg);
-	ErrorCodeEnum HandleSyncPubKeyRet(const CSmartPointer<IPackage> &pRecvPkg);
-	ErrorCodeEnum HandleReportStateRet(const CSmartPointer<IPackage> &pRecvPkg);
-	ErrorCodeEnum HandleCloseTaskRet(const CSmartPointer<IPackage> &pRecvPkg);
+	DWORD HandleLoginRet(const CSmartPointer<IPackage> &pRecvPkg);
+	DWORD HandleSyncPubKeyRet(const CSmartPointer<IPackage>& pRecvPkg);
+	DWORD HandleGetKMCKey(const CSmartPointer<IPackage>& pRecvPkg);
+	DWORD HandleInitMKRet(const CSmartPointer<IPackage> &pRecvPkg);
+	DWORD HandleReportStateRet(const CSmartPointer<IPackage> &pRecvPkg);
+	DWORD HandleCloseTaskRet(const CSmartPointer<IPackage> &pRecvPkg);
 
 	ErrorCodeEnum GetFileHash(const BYTE *pFileContent, int iFileLen, BYTE hash[16]);
 	ErrorCodeEnum GetFileHashOld(const char *pFilePath, BYTE hash[16]);

+ 0 - 1
Module/mod_Initializer/InitializerErrorCode.h

@@ -1,7 +1,6 @@
 #pragma once
 #include <string>
 #include <sstream>
-#include "publicFunExport.h"
 using namespace std;
 static void GetNewForm(const char* form, char* newForm) {
 	int indexNum = 0;

+ 36 - 7
Module/mod_Initializer/InitializerFSM.cpp

@@ -38,10 +38,29 @@ bool CInitializerFSM::IsInitializeSucc()
 	
 void CInitializerFSM::s1_on_entry()
 {
-	Dbg("Enter s1_on_entry.");
+	LOG_FUNCTION();
 	//简化版自动做第一次初始化
 	CInitializerEntity* pEntity = (CInitializerEntity*)m_pEntity;
 
+	if (pEntity->GetAccessauthIsFirst() && pEntity->m_autoTryInit < 3) {
+		int nInitFlg = 0;//默认未初始化
+		pEntity->GetInitializedFlg(nInitFlg);
+		//没有初始化成功过才自动初始化
+		if (nInitFlg == 0)
+		{
+			CSimpleStringA strAddr;
+			int nPort = 0;
+			Dbg("第一次准入,开始自动初始化。。。");
+			if (pEntity->GetAuthAccessAddr(strAddr, nPort))
+			{
+				pEntity->m_autoTryInit += 1;
+				Dbg("ip=%s,port=%d", strAddr.GetData(), nPort);
+				pEntity->m_afterSMIsFirst = true;
+				pEntity->AutoBeginLogin(strAddr.GetData(), nPort);
+			}
+		}
+	}
+
 	if (pEntity->IsIL())
 	{
 		int nInitFlg = 0;//默认未初始化
@@ -69,7 +88,8 @@ void CInitializerFSM::s1_on_exit()
 
 unsigned int CInitializerFSM::s1_on_event(FSMEvent* event)
 {
-	Dbg("Enter s1_on_event");
+	//Dbg("Enter s1_on_event");
+	LOG_FUNCTION();
 	if (event->iEvt == Event_ShowGUI)
 	{
 		// 启动GUI
@@ -87,6 +107,7 @@ unsigned int CInitializerFSM::s1_on_event(FSMEvent* event)
 
 void CInitializerFSM::s2_on_entry()
 {
+	LOG_FUNCTION();
 //
 }
 
@@ -97,6 +118,7 @@ void CInitializerFSM::s2_on_exit()
 
 unsigned int CInitializerFSM::s2_on_event(FSMEvent* event)
 {
+	LOG_FUNCTION();
 	if (event->iEvt == Event_LoginResult)
 	{
 		return event->param1;
@@ -108,6 +130,7 @@ unsigned int CInitializerFSM::s2_on_event(FSMEvent* event)
 
 void CInitializerFSM::s3_on_entry()
 {	
+	LOG_FUNCTION();
 //
 }
 
@@ -118,6 +141,7 @@ void CInitializerFSM::s3_on_exit()
 
 unsigned int CInitializerFSM::s3_on_event(FSMEvent* event)
 {
+	LOG_FUNCTION();
 	if (event->iEvt == Event_InitMKResult)
 		return event->param1;
 		
@@ -126,22 +150,22 @@ unsigned int CInitializerFSM::s3_on_event(FSMEvent* event)
 
 void CInitializerFSM::s4_on_entry()
 {
+	LOG_FUNCTION();
 	// 写日志 通知健康模块初始化成功
 	LogEvent(Severity_Middle, EVENT_MOD_INITIALIZER_MK_LOADED, "主密钥初始化成功");
 	CInitializerEntity* pEntity = (CInitializerEntity*)m_pEntity;
-	if (pEntity->m_type == 0) {
+	if (pEntity->m_type == 0 && pEntity->m_ctx != NULL) {
 		pEntity->m_ctx->Ans.Errcode = Error_Succeed;
 		pEntity->m_ctx->Ans.ErrMsg = "";
 		pEntity->m_ctx->Answer(Error_Succeed);
 	}
-	else if(pEntity->m_type == 1){
+	else if(pEntity->m_type == 1 && pEntity->m_ctx_blue != NULL){
 		pEntity->m_ctx_blue->Ans.Errcode = Error_Succeed;
 		pEntity->m_ctx_blue->Ans.ErrMsg = "";
 		pEntity->m_ctx_blue->Answer(Error_Succeed);
 	}
 	FSMEvent* fsmEvent = new FSMEvent(Event_ReStart);
 	PostEventFIFO(fsmEvent);
-	Dbg("Leave s4_on_entry.");
 }
 
 void CInitializerFSM::s4_on_exit()
@@ -151,15 +175,19 @@ void CInitializerFSM::s4_on_exit()
 
 unsigned int CInitializerFSM::s4_on_event(FSMEvent* event)
 {
+	LOG_FUNCTION();
 	return 0;
 }
 
 void CInitializerFSM::s5_on_entry()
 {	
-	Dbg("Entry s5_on_entry().");
-	//LogError(Severity_Middle, Error_Unexpect, EVENT_MOD_INITIALIZER_MK_FAILED, "主密钥初始化失败");
+	LOG_FUNCTION();
 	LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_FAILED,
 		GetOutPutStr("%s%s","Initializer","主密钥初始化失败").c_str());
+
+	auto pEntity = (CInitializerEntity*) m_pEntity;
+	pEntity->GetFunction()->ShowFatalError("主密钥初始化失败");
+
 	FSMEvent* fsmEvent = new FSMEvent(Event_ReStart);
 	PostEventFIFO(fsmEvent);
 }
@@ -171,6 +199,7 @@ void CInitializerFSM::s5_on_exit()
 
 unsigned int CInitializerFSM::s5_on_event(FSMEvent* event)
 {
+	LOG_FUNCTION();
 	if (event->iEvt == Event_ShowGUI)
 	{
 		// 启动GUI

+ 1 - 1
Module/mod_Initializer/Initializer_def_g.h

@@ -5,7 +5,7 @@
 
 // This code is generated by spgen tool!
 
-#include "SpHelper.h"
+#include "spHelper.h"
 
 namespace Initializer {
 //

+ 23 - 1
Module/mod_Initializer/MKInitDlg.cpp

@@ -135,6 +135,26 @@ void CMKInitDlg::OnStartLogin(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/
 		{
 			MaintainCertificate_GetEKeyStatus_Req req = {};
 			MaintainCertificate_GetEKeyStatus_Ans ans = {};
+			MaintainCertificate_GetEKeyType_Req getUkeyTypeReq = {};
+			MaintainCertificate_GetEKeyType_Ans getUkeyTypeAns = {};
+			MaintainCertificate_GetVerifyType_Req getVerifyTypeReq = {};
+			MaintainCertificate_GetVerifyType_Ans getVerifyTypeAns = {};
+			rc = pClient->GetEKeyType(getUkeyTypeReq, getUkeyTypeAns, 10000);
+			if (rc != Error_Succeed) {
+				MessageBoxA(CSimpleStringA::Format("登录失败,获取电子钥匙类型失败!"));
+				return;
+			}
+			else {
+				rc = pClient->GetVerifyType(getVerifyTypeReq, getVerifyTypeAns,10000);
+				if (rc != Error_Succeed) {
+					MessageBoxA(CSimpleStringA::Format("登录失败,获取电子钥匙验证类型失败!"));
+					return;
+				}
+				if (getUkeyTypeAns.type == 0 && getVerifyTypeAns.type == 0) {
+					MessageBoxA(CSimpleStringA::Format("登录失败:已经废除日常维护类电子钥匙!"));
+					return;
+				}
+			}
 			rc = pClient->GetEKeyStatus(req, ans, 10000);
 			if (rc != Error_Succeed)
 			{
@@ -185,6 +205,7 @@ void CMKInitDlg::OnStartLogin(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/
 
 LRESULT CMKInitDlg::OnLoginResult(UINT uMsg, WPARAM wParam, LPARAM lParam)
 {	
+	LOG_FUNCTION();
 	auto rc = (ErrorCodeEnum)wParam;
 	if (rc != Error_Succeed)
 	{
@@ -195,7 +216,8 @@ LRESULT CMKInitDlg::OnLoginResult(UINT uMsg, WPARAM wParam, LPARAM lParam)
 	}
 	else
 	{
-		m_pEntity->BeginSyncPK();
+		Dbg("开始执行BeginGetKMCKey");
+		m_pEntity->BeginGetKMCKey();
 	}
 
 	return 0;

+ 164 - 0
Module/mod_Initializer/MyBase64.cpp

@@ -0,0 +1,164 @@
+#include "stdafx2.h"
+#include "MyBase64.h"
+namespace MyBase64{
+	void Encode(const string plain,string& encoded)
+	{
+		unsigned int bytes = plain.size();
+		unsigned int outSz = (bytes + 3 - 1) / 3 * 4;
+
+		outSz += (outSz + pemLineSz - 1) / pemLineSz;  // new lines
+
+		unsigned int index = 0;
+		
+		while (bytes > 2) {
+			unsigned char b1 = plain[index++];
+			unsigned char b2 = plain[index++];
+			unsigned char b3 = plain[index++];
+
+			// encoded idx
+			unsigned char e1 = b1 >> 2;
+			unsigned char e2 = ((b1 & 0x3) << 4) | (b2 >> 4);
+			unsigned char e3 = ((b2 & 0xF) << 2) | (b3 >> 6);
+			unsigned char e4 = b3 & 0x3F;
+
+			// store
+			encoded.append(1,base64Encode[e1]);
+			encoded.append(1,base64Encode[e2]);
+			encoded.append(1,base64Encode[e3]);
+			encoded.append(1,base64Encode[e4]);
+			bytes -= 3;
+			//enter anther row
+		   /* if ((++j % 16) == 0 && bytes)
+				encoded.append(1,'\n');*/
+		}
+
+		// last integral
+		if (bytes) {
+			bool twoBytes = (bytes == 2);
+
+			unsigned char b1 = plain[index++];
+			unsigned char b2 = (twoBytes) ? plain[index++]: 0;
+
+			unsigned char e1 = b1 >> 2;
+			unsigned char e2 = ((b1 & 0x3) << 4) | (b2 >> 4);
+			unsigned char e3 =  (b2 & 0xF) << 2;
+
+			encoded.append(1,base64Encode[e1]);
+			encoded.append(1,base64Encode[e2]);
+			encoded.append(1,(twoBytes) ? base64Encode[e3] : pad);
+			encoded.append(1,pad);
+		} 
+
+		encoded.append(1,'\0');
+	}
+	void Decode(const string coded,string& decoded)
+	{
+		unsigned int bytes = coded.size();
+		unsigned int plainSz = bytes - ((bytes + (pemLineSz - 1)) / pemLineSz); 
+		plainSz = (plainSz * 3 + 3) / 4;
+		//decoded_.New(plainSz);
+
+		unsigned int i = 0;
+		unsigned int j = 0;
+		unsigned int index = 0;
+		while (bytes > 3) {
+			unsigned char e1 =  coded[index++];
+			unsigned char e2 =  coded[index++];
+			unsigned char e3 =  coded[index++];
+			unsigned char e4 =  coded[index++];
+
+			// do asserts first
+			if (e1 == 0)            // end file 0's
+				break;
+
+			bool pad3 = false;
+			bool pad4 = false;
+			if (e3 == pad)
+				pad3 = true;
+			if (e4 == pad)
+				pad4 = true;
+
+			e1 = base64Decode[e1 - 0x2B];
+			e2 = base64Decode[e2 - 0x2B];
+			e3 = (e3 == pad) ? 0 : base64Decode[e3 - 0x2B];
+			e4 = (e4 == pad) ? 0 : base64Decode[e4 - 0x2B];
+
+			unsigned char b1 = (e1 << 2) | (e2 >> 4);
+			unsigned char b2 = ((e2 & 0xF) << 4) | (e3 >> 2);
+			unsigned char b3 = ((e3 & 0x3) << 6) | e4;
+
+			decoded.append(1,b1);
+			if (!pad3)
+				decoded.append(1,b2);
+			if (!pad4)
+				decoded.append(1,b3);
+			else
+				break;
+			
+			bytes -= 4;
+			//if ((++j % 16) == 0) {
+			//    unsigned char endLine = coded[index++];//coded_.next();
+			//    bytes--;
+			//    while (endLine == ' ') {        // remove possible whitespace
+			//        endLine = coded[index++];
+			//        bytes--;
+			//    }
+			//    if (endLine == '\r') {
+			//        endLine = coded[index++];
+			//        bytes--;
+			//    }
+			//    if (endLine != '\n') {
+			//        return;
+			//    }
+			//}
+		}
+	}
+	unsigned char Ch2Hex(char ch)
+	{
+		static const char* hex = "0123456789ABCDEF";
+		for (unsigned char i = 0;i != 16;++i)
+			if (ch == hex[i])
+				return i;
+		return 0;
+	}
+	char* Hex2Str(const char* src, int& dstLen)
+	{
+		int i = 0;
+		int cnt = 0;
+		int len = strlen(src);
+		unsigned char* d = new unsigned char[len];
+		memset(d, 0, len);
+		while (*src)
+		{
+			if (i & 1)
+			{
+				d[cnt++] |= Ch2Hex(*src);
+			}
+			else
+			{
+				d[cnt] = Ch2Hex(*src) << 4;
+			}
+			src++;
+			i++;
+		}
+		dstLen = cnt;
+		return (char*)d;
+	}
+	char* Str2Hex(const char* src, int srcLen)
+	{
+		string ret;
+		static const char* hex = "0123456789ABCDEF";
+
+		for (int i = 0;i != srcLen;++i)
+		{
+			ret.push_back(hex[(src[i] >> 4) & 0xf]);
+			ret.push_back(hex[src[i] & 0xf]);
+		}
+		char* tmp = new char[ret.length() + 1];
+		memset(tmp, 0, ret.length() + 1);
+		memcpy(tmp, ret.c_str(), ret.length());
+		return tmp;
+	}
+
+
+}

+ 32 - 0
Module/mod_Initializer/MyBase64.h

@@ -0,0 +1,32 @@
+#include <string>
+using namespace std;
+namespace MyBase64{
+	const unsigned char bad = 0xFF;
+	const unsigned char base64Encode[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
+								  'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
+								  'U', 'V', 'W', 'X', 'Y', 'Z',
+								  'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
+								  'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
+								  'u', 'v', 'w', 'x', 'y', 'z',
+								  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+								  '+', '/'
+								};
+	const unsigned char base64Decode[] = { 62, bad, bad, bad, 63,   // + starts at 0x2B
+								  52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
+								  bad, bad, bad, bad, bad, bad, bad,
+								  0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
+								  10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+								  20, 21, 22, 23, 24, 25,
+								  bad, bad, bad, bad, bad, bad,
+								  26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
+								  36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
+								  46, 47, 48, 49, 50, 51
+								};
+
+	const unsigned char pad = '=';
+	const int pemLineSz = 64;
+	void Encode(const string plain,string& encoded);
+	void Decode(const string coded,string& decoded);
+	char* Hex2Str(const char* src, int& dstLen);
+	char* Str2Hex(const char* str, int strLen);
+}

File diff suppressed because it is too large
+ 378 - 303
Module/mod_Initializer/mod_Initializer.cpp


+ 30 - 7
Module/mod_Initializer/mod_Initializer.h

@@ -41,6 +41,10 @@ public:
 		memset(m_cSM2TMK, 0, 64);
 
 		m_eErrNum = Error_Succeed;
+		m_afterSMIsFirst = false;
+		m_autoTryInit = 0;
+
+		m_bGetKMCKey = false; //false代表获取kmc密钥失败
 	}
 	
 	virtual ~CInitializerEntity() 
@@ -99,7 +103,7 @@ public:
 	ErrorCodeEnum ParseInitMKResult(CBlob &blob, bool bSM);
 
 	// 更新密码键盘主密钥
-	ErrorCodeEnum LoadKeysToPinPad(bool bSM);
+	DWORD LoadKeysToPinPad(bool bSM);
 
 	//ErrorCodeEnum PrintAllKeys(bool bSM);
 		
@@ -121,15 +125,17 @@ public:
 	void OnSecureClientDisconnect();
 	
 	void BeginInitMK();
-	void EndInitMK(ErrorCodeEnum rc, const char *pszErrMsg);
+	void EndInitMK(DWORD rc, const char *pszErrMsg);
 	void BeginLogin(const char *pszAuthServer, int nAuthPort, const char *pszUserID, const char *pszPassword);
 	void AutoBeginLogin(const char *pszAuthServer, int nAuthPort);
-	void EndLogin(ErrorCodeEnum rc, const char *pErrMsg);
+	void EndLogin(DWORD rc, const char *pErrMsg);
 	void BeginSyncPK();
-	void EndSyncPK(ErrorCodeEnum rc, const char *pszErrMsg);
-	ErrorCodeEnum ReportInitMKState(const char *pszUserID, DWORD dwErrCode,  const char *pszErrMsg);
+	void BeginGetKMCKey();
+	void EndGetKMCKey(DWORD rc, const char* pszErrMsg);
+	void EndSyncPK(DWORD rc, const char *pszErrMsg);
+	DWORD ReportInitMKState(const char *pszUserID, DWORD dwErrCode,  const char *pszErrMsg);
 	ErrorCodeEnum DownloadCfg(const char *pszSettingServer, int nSettingPort);
-	ErrorCodeEnum InitCardSwiper();
+	DWORD InitCardSwiper();
 	const char* GetLastErrMsg();
 
 	ErrorCodeEnum StartGUI();
@@ -149,6 +155,11 @@ public:
 	
 	bool HasCkCodeFlg();
 
+	int ConvertStr2Byte(string input, BYTE* output, int outputLen);
+
+	//判断是否是国密改造之后的第一次初始化
+	int GetOrSetIsFirstSM(int type);
+
 	BYTE m_cTDESPukey[2048];
 	BYTE m_cSM2Pukey[2048];
 	char m_cTDESTMK[64];
@@ -158,7 +169,7 @@ public:
 	CSimpleStringA m_strAuthorizer;
 	CSimpleStringA m_strAuthTime;
 	CSimpleStringA m_strLastErrMsg;
-	ErrorCodeEnum m_eErrNum;
+	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
@@ -167,6 +178,17 @@ public:
 
 	CSimpleStringA m_strUserID;
 	CSimpleStringA m_strPassword;
+	//判断是否为国密改造之后的第一次准入
+	bool GetAccessauthIsFirst();
+	//国密改造之后第一次准入的标志位
+	bool m_afterSMIsFirst;
+	//自动初始化的重试次数
+	int m_autoTryInit;
+
+	string m_TMK;
+	string m_TPK;
+	string m_EDK;
+	bool m_bGetKMCKey;
 private:
 	bool IsServiceAvailable(const char *pszServiceAddr, int nServerPort);
 	ErrorCodeEnum ParseIPAddress(const char *str, CSimpleStringA &ip, int &port);
@@ -188,5 +210,6 @@ private:
 	CInitializerConn *m_pConnection;
 	friend class CMKInitDlg;
 	CSimpleStringA m_strInitUserID;
+
 };
 

+ 15 - 2
Module/mod_Initializer/mod_Initializer.rc

@@ -45,8 +45,8 @@ BEGIN
     EDITTEXT        IDC_EditUser,76,183,98,14,ES_AUTOHSCROLL
     RTEXT           "维护用户密码",IDC_STATIC,23,207,50,9
     EDITTEXT        IDC_EditPassword,76,203,98,14,ES_PASSWORD | ES_AUTOHSCROLL
-    PUSHBUTTON      "密钥初始化",IDC_LOGIN,41,230,50,14
-    PUSHBUTTON      "退出",IDC_CANCEL,98,230,50,14
+    PUSHBUTTON      "重置设备密钥",IDC_LOGIN,33,230,58,14
+    PUSHBUTTON      "退   出",IDC_CANCEL,98,230,56,14
     LTEXT           "注:连接密码键盘失败,请确认设备是否正常",IDC_PINPADWARN,16,101,167,8
 END
 
@@ -91,12 +91,25 @@ END
 // remains consistent on all systems.
 IDR_MAINFRAME           ICON                    "mainframe.ico"
 
+
 /////////////////////////////////////////////////////////////////////////////
 //
 // Bitmap
 //
 
 IDB_HEADER              BITMAP                  "header.bmp"
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// AFX_DIALOG_LAYOUT
+//
+
+IDD_LOGIN AFX_DIALOG_LAYOUT
+BEGIN
+    0
+END
+
 #endif    // 中文(简体,中国) resources
 /////////////////////////////////////////////////////////////////////////////
 

Some files were not shown because too many files changed in this diff