Преглед изворни кода

#IQRV #comment: 准入、初始化接口新字段,编译通过,未测试

陈纪林80310970 пре 9 месеци
родитељ
комит
4127ec0525

+ 99 - 243
Module/mod_accessauth/AccessAuthFSM.cpp

@@ -8,7 +8,6 @@
 #include "fileutil.h"
 #include "iniutil.h"
 #include "CommEntityUtil.hpp"
-#include "CommEntityRestful.hpp"
 #include "SpUtility.h"
 #include "comm.h"
 #include "PinPad_client_g.h"
@@ -133,20 +132,8 @@ struct TimeSynTask : ITaskSp
 		CSystemStaticInfo si;
 		m_fsm->GetEntityBase()->GetFunction()->GetSystemStaticInfo(si);
 
-		struct TimeSynReqStructJson
-		{
-			std::string terminalNo;
-			int curTime;
-			JSONCONVERT2OBJECT_MEMEBER_REGISTER(terminalNo, curTime)
-		} timeSyncReq;
-		struct TimeSyncAnsStructJson
-		{
-			int timeDiff;
-			int authVersion;
-			std::string sessionKey;
-			std::string reserved;
-			JSONCONVERT2OBJECT_MEMEBER_REGISTER(timeDiff, authVersion, sessionKey, reserved)
-		}timeSyncAns;
+		CSessionkeySynReq timeSyncReq;
+		CSessionkeySynAns timeSyncAns;
 
 		timeSyncReq.terminalNo = si.strTerminalID.GetData();
 		timeSyncReq.curTime = CSmallDateTime::GetNow().GetTime64();
@@ -269,26 +256,8 @@ struct UpdateWKTask : ITaskSp
 			return;
 		}
 		
-		struct UpdateWKReq
-		{
-			std::string terminalNo;
-			std::string encRandom;
-			string tpkKeyCheck; //tpk密钥校验值
-			string edkKeyCheck; //edk密钥校验值
-			string keyIndex; //密钥序号
-			JSONCONVERT2OBJECT_MEMEBER_REGISTER(terminalNo, encRandom, tpkKeyCheck, edkKeyCheck, keyIndex)
-		} updateWKReq;
-
-		struct UpdateWKAns
-		{
-			string tmk;
-			string tpk;
-			string edk;
-			string tpkKeyCheck; //密钥校验值
-			string edkKeyCheck; //edk密钥校验值
-			string keyIndex; //密钥序号
-			JSONCONVERT2OBJECT_MEMEBER_REGISTER(tmk, tpk, edk, tpkKeyCheck, edkKeyCheck, keyIndex)
-		} updateWKAns;
+		CAccessAuthUpdateWKReq updateWKReq;
+		CAccessAuthUpdateWKAns updateWKAns;
 
 		updateWKReq.terminalNo = si.strTerminalID.GetData();
 		auto tmkpair = m_entity->GenerateTmkToKMC();//first是加密的,seconde是没加密的
@@ -397,42 +366,7 @@ struct GetTokenTask : ITaskSp
 			return;
 		}
 
-		struct GetTokenReq
-		{
-			string installVersion;//终端版本(新加字段)
-			string terminalCharacter;
-			string terminalNo;
-			string sessionTempPubKey;
-			string encTerminalInfo;
-			string publicKeySM;
-			string pinPadID;
-			string existPinPad;
-			JSONCONVERT2OBJECT_MEMEBER_REGISTER(installVersion, terminalCharacter, terminalNo,
-				sessionTempPubKey, encTerminalInfo, publicKeySM, pinPadID, existPinPad)
-		} getTokenReqJson;
-
-		struct AccessTokenJson
-		{
-			string enToken;
-			string retHash;
-			JSONCONVERT2OBJECT_MEMEBER_REGISTER(enToken, retHash)
-		};
-		struct SharedKeyJson
-		{
-			string enToken;
-			string sharedSK;
-			string retHash;
-			JSONCONVERT2OBJECT_MEMEBER_REGISTER(enToken, sharedSK, retHash)
-		};
-
-		struct GetTokenAns
-		{
-			AccessTokenJson accessToken;
-			SharedKeyJson sharedKey;
-			bool flag;
-			string warnMessage;
-			JSONCONVERT2OBJECT_MEMEBER_REGISTER(accessToken, sharedKey, flag, warnMessage)
-		} getTokenAns;
+		CAccessAuthGetTokenAns getTokenAns;
 
 		HttpClientResponseResult result;
 		HttpClientRequestConfig config(HttpRequestMethod::POST, m_fsm->GetmAccessAuthHost().GetData(), &SpGetToken);
@@ -450,17 +384,7 @@ struct GetTokenTask : ITaskSp
 			return;
 		}
 
-		getTokenReqJson.installVersion = getTokenReq.installVersion;
-		getTokenReqJson.terminalCharacter = getTokenReq.terminalCharacter;
-		getTokenReqJson.terminalNo = getTokenReq.terminalNo;
-		getTokenReqJson.sessionTempPubKey = getTokenReq.sessionTempPubKey;
-		getTokenReqJson.encTerminalInfo = getTokenReq.encTerminalInfo;
-		getTokenReqJson.publicKeySM = getTokenReq.publicKeySM;
-		getTokenReqJson.pinPadID = getTokenReq.pinPadID;
-		getTokenReqJson.existPinPad = getTokenReq.existPinPad;
-
-
-		SP::Module::Restful::FulfillRequestJsonBody(&config, getTokenReqJson);
+		SP::Module::Restful::FulfillRequestJsonBody(&config, getTokenReq);
 
 		std::string test;
 		test = config.GetRequestUri();
@@ -531,18 +455,6 @@ struct GetTokenTask : ITaskSp
 	}
 };
 
-struct InitDeviceTask :public ITaskSp
-{
-	CAccessAuthFSM* m_fsm;
-	InitDeviceReq m_req;
-	InitDeviceTask(CAccessAuthFSM* fsm, InitDeviceReq req) :m_fsm(fsm), m_req(req) {}
-
-	void Process()
-	{
-		return;
-	}
-};
-
 
 #ifdef RVC_OS_LINUX
 bool isChineseChar(const char* p) {
@@ -902,112 +814,45 @@ DWORD CAccessAuthFSM::HandleGetToken(BYTE* enToken1, BYTE* sharedKey, BYTE* enTo
 	return rc;
 }
 
-DWORD CAccessAuthFSM::GetEncTerminalInfo(CBlob& encInfo)
+DWORD CAccessAuthFSM::GetEncTerminalInfoWithKey(CBlob& encInfo, BYTE* key)
 {
 	LOG_FUNCTION();
-	RequestTokenReq1 req1;
-	memset(&req1, 0, sizeof(req1));
-	BYTE* pBuf = (BYTE*)&req1.encTerminalInfo;
-
-	// 设置长度
-	sprintf((char*)pBuf, "%.4d", sizeof(RequestTokenInfo));
-
-	RequestTokenInfo* pInfo = (RequestTokenInfo*)(pBuf + 4);
-
-	CSystemStaticInfo si;
-	m_pEntity->GetFunction()->GetSystemStaticInfo(si);
-	strncpy(pInfo->szTerminalNo, (const char*)si.strTerminalID, sizeof(pInfo->szTerminalNo) - 1);
-
-	CSimpleStringA strPinPadID = "", strDeviceID = "";
-	bool isPinPadMac = false, bPinPadOnline = false;
-	int nRet = ((CAccessAuthEntity*)m_pEntity)->GetPinPadIDAndDeviceID(strPinPadID, strDeviceID, isPinPadMac, bPinPadOnline);
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetPinPadIDAndDeviceID ret: %d, PinPadID: %s, DeviceID: %s", nRet, strPinPadID.GetData(), strDeviceID.GetData());
-	if (nRet == 2 || nRet == 3) {
-		strncpy(pInfo->szPadDeviceID, (const char*)strDeviceID, sizeof(pInfo->szPadDeviceID) - 1);
-	}
-
-	strncpy(pInfo->szMachineType, (const char*)si.strMachineType, sizeof(pInfo->szMachineType) - 1);
-
-	// 设备版本,低两位为小版本号,高两位为大版本号 Binary	4
-	DWORD ver32 = si.MachineVersion.GetVersion32();
-	for (int i = 0; i < 4; i++) {
-		pInfo->machineVersion[3 - i] = ((BYTE*)&ver32)[i];
-	}
-
-	//	安装版本,其中包含软件框架版本	binary	8
-	__int64 ver64 = si.InstallVersion.GetVersion64();
-	for (int i = 0; i < 8; i++) {
-		pInfo->installVersion[7 - i] = ((BYTE*)&ver64)[i];
-	}
-#ifdef RVC_OS_WIN	
-	hostent* ent = gethostbyname(NULL);
-	if (ent && ent->h_addr_list[0] != NULL) {
-		int i = 0;
-		for (; ent->h_addr_list[i] != NULL; ++i) {
-			struct in_addr* in = (struct in_addr*)ent->h_addr_list[i];
-			//99开头行内办公网,10开头行内业务网。规范出自《招商银行总行网络规范汇编(2017年版).pdf》
-			if (in->S_un.S_un_b.s_b1 == 99 || in->S_un.S_un_b.s_b1 == 10)
-				break;
-		}
-
-		if (ent->h_addr_list[i] == NULL)
-			i = 0;
-
-		auto in = (struct in_addr*)ent->h_addr_list[i];
+	ErrorCodeEnum rc = Error_Succeed;
+	CSimpleStringA ip, mac, pinpadModel, cpuId, mainBoardId, hardDiskId, osType, osVersion;
+	std::map<std::string, std::string> termInfo;
+	
+	auto pEntity = ((CAccessAuthEntity*)m_pEntity);
+	CSimpleStringA strPinPadModel = "";
+	bool bPinPadOnline = false;
+	pEntity->GetPinPadModel(strPinPadModel, bPinPadOnline);
+	
+	GetIPandMac(ip, mac);
+	GetHardWareInfo(cpuId, mainBoardId, hardDiskId);
+	
+	osVersion = GetOsVersion();
 
-		pInfo->ip[0] = in->S_un.S_un_b.s_b1;
-		pInfo->ip[1] = in->S_un.S_un_b.s_b2;
-		pInfo->ip[2] = in->S_un.S_un_b.s_b3;
-		pInfo->ip[3] = in->S_un.S_un_b.s_b4;
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ip:%d.%d.%d.%d", pInfo->ip[0], pInfo->ip[1], pInfo->ip[2], pInfo->ip[3]);
-	}
+#ifdef RVC_OS_WIN
+	termInfo["OSType"] = "Windows";
 #else
-	char ip[32] = { 0 };
-	if (getIPFromLinux(ip)) DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Get IP From Linux Error ex.");
-	else {
-		if (ip2byte(ip, pInfo->ip)) DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Ip 2 Byte Error");
-		else {
-			for (int i = 0; i < 4; i++) {
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("ip[%d]=%d", i, (int)pInfo->ip[i]);
-			}
-		}
-	}
-#endif //#ifdef RVC_OS_WIN
-	strncpy(pInfo->szSites, si.strSite, sizeof(pInfo->szSites) - 1);
-
-	si.EnrolGPS.GetBinaryLongitude(&pInfo->currentGPS[0]);
-	si.EnrolGPS.GetBinaryLatitude(&pInfo->currentGPS[4]);
-
-	CSimpleStringA ts;
-	DWORD rc = m_pEntity->GetFunction()->GetSysVar("TerminalStage", ts);
-	if (rc != Error_Succeed) 
-	{
-		string outStr = GetOutPutStr("%s%08X%s%s", "GetSysVar", rc, "TerminalStage", ts.GetData());
-		doWarnMsg(ERR_ACCESSAUTH_GET_SYS_VAR, outStr.c_str());
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(outStr.c_str());
-		return ERR_ACCESSAUTH_GET_SYS_VAR;
-	}
-	assert(ts.GetLength() >= 1);
-	pInfo->chTerminalState = ts[0];
+	termInfo["OSType"] = "UOS";
+#endif // RVC_OS_WIN
+	termInfo["osVersion"] = osVersion.GetData();
+	termInfo["ip"] = ip.GetData();
+	termInfo["mac"] = mac.GetData();
+	termInfo["cpuId"] = cpuId.GetData();
+	termInfo["mainBoardId"] = mainBoardId.GetData();
+	termInfo["hardDiskId"] = hardDiskId.GetData();
 
-	CSimpleStringA rs;
-	rc = m_pEntity->GetFunction()->GetSysVar("RunState", rs);
-	if (rc != Error_Succeed) 
-	{
-		string outStr = GetOutPutStr("%s%08X%s%s", "GetSysVar", rc, "RunState", rs.GetData());
-		doWarnMsg(ERR_ACCESSAUTH_GET_SYS_VAR, outStr.c_str());
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(outStr.c_str());
-		return ERR_ACCESSAUTH_GET_SYS_VAR;
-	}
-	assert(rs.GetLength() >= 1);
-	pInfo->chRunState = rs[0];
+	std::pair<bool, std::string> strResult;
+	strResult = generateJsonStr(termInfo);
 
+	char* pBuf = new char[2048];
+	strcpy(pBuf, strResult.second.c_str());
+	int len = strResult.second.size();
 
 	CBlob raw;
-	auto pEntity = ((CAccessAuthEntity*)m_pEntity);
-	// 使用会话密钥加密
-	raw.Refer(pBuf, sizeof(RequestTokenInfo) + 4);
-	rc = pEntity->EncryptDataWithSessionKey(raw, encInfo);
+	raw.Refer(pBuf, len);
+	rc = pEntity->EncryptDataWithKey(raw, encInfo, key);
 
 	if (rc != Error_Succeed) 
 	{
@@ -1057,26 +902,14 @@ DWORD CAccessAuthFSM::GetTokenReq(CAccessAuthGetTokenReq* getTokenReq)
 	CSystemStaticInfo si;
 	pEntity->GetFunction()->GetSystemStaticInfo(si);
 
-	getTokenReq->installVersion = si.InstallVersion.ToString();
-
-	BYTE fingerPrint[32] = { 0 };
-	int nBufLen = sizeof(fingerPrint);
-	if (!pEntity->GetTerminalFingerPrint(fingerPrint, nBufLen)) 
-	{
-		doWarnMsg(ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
-			GetOutPutStr("%s%s", "GetTerminalFingerPrint", "False").c_str());
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5203")
-			(GetOutPutStr("%s%s", "GetTerminalFingerPrint", "False").c_str());
-		return ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT;
-	}
-	char tmp[256] = { 0 };
-	char* fingerPrintHex = Str2Hex((char*)fingerPrint, 64);
-	memcpy(tmp, fingerPrintHex, 64);
-	getTokenReq->terminalCharacter = tmp;
-	delete fingerPrintHex;
+	getTokenReq->terminalVersion = si.InstallVersion.ToString();
+	getTokenReq->terminalNo = si.strTerminalID.GetData();
 
 	CBlob encInfo;
-	if ((rc = GetEncTerminalInfo(encInfo)) != Error_Succeed) 
+	// 使用会话密钥加密
+	char sessionKey[KEY_SIZE] = { 0 };
+	memcpy(sessionKey, pEntity->m_AuthSessionKey, KEY_SIZE);
+	if ((rc = GetEncTerminalInfoWithKey(encInfo, (BYTE*)sessionKey)) != Error_Succeed)
 	{
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetEncTerminalInfo failed:%d", rc);
 		return rc;
@@ -1084,23 +917,14 @@ DWORD CAccessAuthFSM::GetTokenReq(CAccessAuthGetTokenReq* getTokenReq)
 	char* pTmp = Str2Hex((char*)encInfo.m_pData, encInfo.m_iLength);
 	getTokenReq->encTerminalInfo = pTmp;
 	delete pTmp;
-	getTokenReq->terminalNo = si.strTerminalID.GetData();
-	string tmpStr = "";
-	if ((rc = GetTmk(tmpStr)) != Error_Succeed) return rc;
-	getTokenReq->sessionTempPubKey = tmpStr;
 
-	CSimpleStringA strPinPadID = "", strDeviceID = "";
-	bool isPinPadMac = false, bPinPadOnline = false;
-	int nRet = ((CAccessAuthEntity*)m_pEntity)->GetPinPadIDAndDeviceID(strPinPadID, strDeviceID, isPinPadMac, bPinPadOnline);
-	getTokenReq->pinPadID = strPinPadID.GetData();
-	if (pEntity->HasPinPad()) 
-	{
-		getTokenReq->existPinPad = "1";
-	} 
-	else 
+	string tmpStr = "";
+	if ((rc = GetTmk(tmpStr)) != Error_Succeed) 
 	{
-		getTokenReq->existPinPad = "0";
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetTmk failed:%d", rc);
+		return rc;
 	}
+	getTokenReq->sessionTempPubKey = tmpStr;
 	return rc;
 }
 
@@ -1108,9 +932,9 @@ void CAccessAuthFSM::UpdateWK()
 {
 	LOG_FUNCTION();
 	auto pEntity = ((CAccessAuthEntity*)m_pEntity);
-	CSimpleStringA strPinPadID = "", strDeviceID = "";
-	bool isPinPadMac = false, bPinPadOnline = false;
-	pEntity->GetPinPadIDAndDeviceID(strPinPadID, strDeviceID, isPinPadMac, bPinPadOnline);
+	CSimpleStringA strPinPadModel = "";
+	bool bPinPadOnline = false;
+	pEntity->GetPinPadModel(strPinPadModel, bPinPadOnline);
 	if (bPinPadOnline) {
 		CSmartPointer<UpdateWKTask> updateWKTask = new UpdateWKTask(this, pEntity);
 		GetEntityBase()->GetFunction()->PostThreadPoolTask(updateWKTask.GetRawPointer());
@@ -1258,7 +1082,7 @@ void CAccessAuthFSM::GetIPandMac(CSimpleStringA& ip, CSimpleStringA& mac)
 void CAccessAuthFSM::GetHardWareInfo(CSimpleStringA & cpu, CSimpleStringA & mainBoard, CSimpleStringA & disk)
 {
 	auto pEntity = (CAccessAuthEntity*)m_pEntity;
-
+	std::map<std::string, std::string> errInfo;
 #ifdef RVC_OS_LINUX
 	char szTmp[1024] = {};
 	string strTmp;
@@ -1274,8 +1098,15 @@ void CAccessAuthFSM::GetHardWareInfo(CSimpleStringA & cpu, CSimpleStringA & main
 		return;
 	}
 	runInfoPath += SPLIT_SLASH_STR "runcfg";
+
+	//CPU
 	if (!get_cpu_id_by_system(strTmp, runInfoPath.GetData()))
 	{
+		errInfo["errcode"] = "RTA5213";
+		errInfo["msg"] = "调用系统api获取CPU序号失败";
+		errInfo["getLastErr"] = GetLastError();
+		cpu = generateJsonStr(errInfo).second.c_str();
+
 		strErrMsg = CSimpleStringA::Format("查询CPU ID失败,请重启机器并重新初始化");
 		pEntity->SetAuthErrMsg((const char*)strErrMsg);
 
@@ -1285,12 +1116,18 @@ void CAccessAuthFSM::GetHardWareInfo(CSimpleStringA & cpu, CSimpleStringA & main
 			(GetOutPutStr("%s%s", "Processor", "False").c_str());
 		return;
 	}
-
 	cpu = strTmp.c_str();
 	strRet = strTmp.c_str();
 	strTmp.clear();
+	
+	//主板
 	if (!get_board_serial_by_system(strTmp, runInfoPath.GetData()))
 	{
+		errInfo["errcode"] = "RTA5214";
+		errInfo["msg"] = "调用系统api获取主板ID号失败";
+		errInfo["getLastErr"] = GetLastError();
+		mainBoard = generateJsonStr(errInfo).second.c_str();
+
 		strErrMsg = CSimpleStringA::Format("查询主板序列号失败,  请重启机器并重新初始化");
 		pEntity->SetAuthErrMsg((const char*)strErrMsg);
 
@@ -1300,14 +1137,20 @@ void CAccessAuthFSM::GetHardWareInfo(CSimpleStringA & cpu, CSimpleStringA & main
 			(GetOutPutStr("%s%s", "BaseBoard", "False").c_str());
 		return;
 	}
-	strRet += "|";
-
 	mainBoard = strTmp.c_str();
+	strRet += "|";
 	strRet += strTmp.c_str();
+	
+	//硬盘
 	vector<string> diskArr;
 	int errCode = 0;
 	if (!get_disk_serial_by_system(diskArr, errCode, runInfoPath.GetData()))
 	{
+		errInfo["errcode"] = "RTA5215";
+		errInfo["msg"] = "调用系统api获取硬盘ID号失败";
+		errInfo["getLastErr"] = GetLastError();
+		disk = generateJsonStr(errInfo).second.c_str();
+
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get_disk_serial_by_system errCode:%d", errCode);
 		strErrMsg = CSimpleStringA::Format("查询磁盘序列号失败, 请重启机器并重新初始化");
 		pEntity->SetAuthErrMsg((const char*)strErrMsg);
@@ -1319,7 +1162,6 @@ void CAccessAuthFSM::GetHardWareInfo(CSimpleStringA & cpu, CSimpleStringA & main
 		return;
 	}
 	strRet += "|";
-
 	strTmp = "";
 	vector<string>::iterator it = diskArr.begin();
 	while (it != diskArr.end()) {
@@ -1329,19 +1171,11 @@ void CAccessAuthFSM::GetHardWareInfo(CSimpleStringA & cpu, CSimpleStringA & main
 	strRet += strTmp.c_str();
 	disk = strTmp.c_str();
 
-	BYTE m_btTermSysInfoSM3[32] = { 0 };
-	if (!SM3Hash(reinterpret_cast<BYTE*>(const_cast<char*>(strRet.GetData())), strRet.GetLength(), m_btTermSysInfoSM3))
-	{
-		strErrMsg = "get sm3 hash as fingerprint fail";
-		pEntity->SetAuthErrMsg((const char*)strErrMsg);
-		spFunction->SetSysVar("AuthErrMsg", (const char*)strErrMsg, true);
-		doWarnMsg(ERROR_ACCESSAUTH_GETSM3HASH, (const char*)strErrMsg);
-		return;
-	}
+	return;
 #else
 	//oilyang@20231008 to get system info from runcfg first
 	//no matter calculating from runcfg succeed or not,we also get system info from system api for update runcfg
-	bool bCalcFromRunCfg = false;
+	bool bGetFromRunCfg = false;
 	CSimpleString csInfo, strErrMsg, strRet;
 	CSmartPointer<IConfigInfo> pConfigRun;
 	ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, pConfigRun);
@@ -1353,6 +1187,7 @@ void CAccessAuthFSM::GetHardWareInfo(CSimpleStringA & cpu, CSimpleStringA & main
 			cpu = sysInfo[0];
 			mainBoard = sysInfo[1];
 			disk = sysInfo[2];
+			bGetFromRunCfg = true;
 		}
 	}
 	else
@@ -1364,6 +1199,13 @@ void CAccessAuthFSM::GetHardWareInfo(CSimpleStringA & cpu, CSimpleStringA & main
 	CSmartPointer<IEntityFunction> spFunction = GetEntityBase()->GetFunction();
 	if (!QueryWMIDevice(Processor, "ProcessorId", szTmp, &nTmpBufLen))
 	{
+		if (!bGetFromRunCfg)
+		{
+			errInfo["errcode"] = "RTA5213";
+			errInfo["msg"] = "调用系统api获取CPU序号失败";
+			errInfo["getLastErr"] = GetLastError();
+			cpu = generateJsonStr(errInfo).second.c_str();
+		}
 		strErrMsg = CSimpleStringA::Format("查询 cpu id 失败: %d, 请尝试重启应用", GetLastError());
 		pEntity->SetAuthErrMsg((const char*)strErrMsg);
 
@@ -1381,6 +1223,13 @@ void CAccessAuthFSM::GetHardWareInfo(CSimpleStringA & cpu, CSimpleStringA & main
 	memset(szTmp, 0, sizeof(szTmp));
 	if (!QueryWMIDevice(BaseBoard, "SerialNumber", szTmp, &nTmpBufLen))
 	{
+		if (!bGetFromRunCfg)
+		{
+			errInfo["errcode"] = "RTA5214";
+			errInfo["msg"] = "调用系统api获取主板ID号失败";
+			errInfo["getLastErr"] = GetLastError();
+			mainBoard = generateJsonStr(errInfo).second.c_str();
+		}
 		strErrMsg = CSimpleStringA::Format("查询 baseboard sn 失败: %d, 请尝试重启应用", GetLastError());
 		pEntity->SetAuthErrMsg((const char*)strErrMsg);
 
@@ -1400,6 +1249,13 @@ void CAccessAuthFSM::GetHardWareInfo(CSimpleStringA & cpu, CSimpleStringA & main
 	memset(szTmp, 0, sizeof(szTmp));
 	if (!QueryWMIDevice(DiskDrive, "SerialNumber", szTmp, &nTmpBufLen))
 	{
+		if (!bGetFromRunCfg)
+		{
+			errInfo["errcode"] = "RTA5215";
+			errInfo["msg"] = "调用系统api获取硬盘ID号失败";
+			errInfo["getLastErr"] = GetLastError();
+			disk = generateJsonStr(errInfo).second.c_str();
+		}
 		strErrMsg = CSimpleStringA::Format("查询 harddisk sn 失败: %d, 请尝试重启应用", GetLastError());
 		pEntity->SetAuthErrMsg((const char*)strErrMsg);
 
@@ -1414,7 +1270,7 @@ void CAccessAuthFSM::GetHardWareInfo(CSimpleStringA & cpu, CSimpleStringA & main
 	strRet += szTmp;
 	disk = szTmp;
 
-	if (!bCalcFromRunCfg || csInfo.Compare(strRet) != 0)
+	if (!bGetFromRunCfg || csInfo.Compare(strRet) != 0)
 	{
 		eErr = pConfigRun->WriteConfigValue("system", "info", strRet.GetData());
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("device info changed,before[%s],current[%s],write to runcfg:%d"

+ 71 - 358
Module/mod_accessauth/AccessAuthFSM.h

@@ -7,6 +7,7 @@
 #include "AccessAuthConn.h"
 #include "IHttpFunc.h"
 #include "json/json.h"
+#include "CommEntityRestful.hpp"
 
 #ifdef RVC_OS_WIN
 ///*TODO:  (80374374@11/27/2023)*/
@@ -26,394 +27,106 @@ static void GetLocalTimeRVC(SYSTEMTIME& stTime)
 #define REFLECTION(var) #var
 #define JUAGEHTTPS(ret) (ret.m_sysCode == 200 || ret.m_sysCode == 201)
 
-#ifdef RVC_OS_WIN
-typedef struct CSessionkeySynReq : CHTTPReq {
-	string terminalNo;
-	long curTime;
-
-	string ToJson() {
-		Json::Value value;
-		value[REFLECTION(terminalNo)] = terminalNo;
-		value[REFLECTION(curTime)] = curTime;
-		Json::FastWriter writer;
-		string strData = writer.write(value);
-
-		/*DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("CSessionkeySynReq")
-			("req=%s at CSessionkeySynReq", strData.c_str());*/
-
-		return strData;
-	}
+typedef struct CSessionkeySynReq
+{
+	std::string terminalNo;
+	int curTime;
+	JSONCONVERT2OBJECT_MEMEBER_REGISTER(terminalNo, curTime)
 } CSessionkeySynReq;
 
-typedef struct CSessionkeySynRet : CHTTPRet {
-	struct data {
-		long timeDiff;
-		string sessionKey;
-	} data;
-	bool Parse(string strData) {
-		/*DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("CSessionkeySynRet")
-			("ret=%s at CSessionkeySynRet", strData.c_str());*/
-
-		Json::Value root;
-		Json::Reader reader;
-		reader.parse(strData, root, false);
-
-		data.timeDiff = root["data"][REFLECTION(timeDiff)].asInt();
-		data.sessionKey = root["data"][REFLECTION(sessionKey)].asString();
-		return true;
-	}
-} CSessionkeySynRet;
-
-typedef struct CAccessAuthUpdateWKReq : CHTTPReq {
-	string terminalNo;
-	string encRandom;
+typedef struct CSessionkeySynAns
+{
+	int timeDiff;
+	int authVersion;
+	std::string sessionKey;
+	std::string reserved;
+	JSONCONVERT2OBJECT_MEMEBER_REGISTER(timeDiff, authVersion, sessionKey, reserved)
+}CSessionkeySynAns;
+
+typedef struct CAccessAuthUpdateWKReq
+{
+	std::string terminalNo;
+	std::string encRandom;
 	string tpkKeyCheck; //tpk密钥校验值
 	string edkKeyCheck; //edk密钥校验值
 	string keyIndex; //密钥序号
-	string ToJson() {
-		Json::Value value;
-		value[REFLECTION(terminalNo)] = terminalNo;
-		value[REFLECTION(encRandom)] = encRandom;
-		value[REFLECTION(tpkKeyCheck)] = tpkKeyCheck;
-		value[REFLECTION(edkKeyCheck)] = edkKeyCheck;
-		value[REFLECTION(keyIndex)] = keyIndex;
-		Json::FastWriter writer;
-		string strData = writer.write(value);
-		/*DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("CAccessAuthUpdateWKReq")
-			("req=%s at CAccessAuthUpdateWKReq", strData.c_str());*/
-
-		return strData;
-	}
+	JSONCONVERT2OBJECT_MEMEBER_REGISTER(terminalNo, encRandom, tpkKeyCheck, edkKeyCheck, keyIndex)
 } CAccessAuthUpdateWKReq;
 
-typedef struct CAccessAuthUpdateWKRet : CHTTPRet {
+typedef struct CAccessAuthUpdateWKAns
+{
+	string tmk;
 	string tpk;
 	string edk;
 	string tpkKeyCheck; //密钥校验值
 	string edkKeyCheck; //edk密钥校验值
 	string keyIndex; //密钥序号
+	JSONCONVERT2OBJECT_MEMEBER_REGISTER(tmk, tpk, edk, tpkKeyCheck, edkKeyCheck, keyIndex)
+} CAccessAuthUpdateWKAns;
 
-	bool Parse(string strData) {
-		Json::Value root;
-		Json::Reader reader;
-		reader.parse(strData, root, false);
-
-		tpk = root["data"][REFLECTION(tpk)].asString();
-		edk = root["data"][REFLECTION(edk)].asString();
-		tpkKeyCheck = root["data"][REFLECTION(tpkKeyCheck)].asString();
-		edkKeyCheck = root["data"][REFLECTION(edkKeyCheck)].asString();
-		keyIndex = root["data"][REFLECTION(keyIndex)].asString();
-
-		return true;
-	}
-} CAccessAuthUpdateWKRet;
-#endif // RVC_OS_WIN
-
-typedef struct CAccessAuthGetTokenReq :public CHTTPReq {
-public:
-	string installVersion;//终端版本(新加字段)
-	string terminalCharacter;
+typedef struct CAccessAuthGetTokenReq
+{
+	string terminalVersion;//终端版本(新加字段)
 	string terminalNo;
 	string sessionTempPubKey;
 	string encTerminalInfo;
-	string publicKeySM;
-	string pinPadID;
-	string existPinPad;
-
-	string ToJson() {
-#ifdef RVC_OS_WIN
-		Json::Value value;
-		value[REFLECTION(installVersion)] = installVersion;
-		value[REFLECTION(terminalCharacter)] = terminalCharacter;
-		value[REFLECTION(terminalNo)] = terminalNo;
-		value[REFLECTION(sessionTempPubKey)] = sessionTempPubKey;
-		value[REFLECTION(encTerminalInfo)] = encTerminalInfo;
-		value[REFLECTION(publicKeySM)] = publicKeySM;
-		value[REFLECTION(pinPadID)] = pinPadID;
-		value[REFLECTION(existPinPad)] = existPinPad;
-
-		Json::FastWriter writer;
-		string strData = writer.write(value);
-		/*DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("CAccessAuthGetTokenReq")
-			("req=%s at CAccessAuthGetTokenReq", strData.c_str());*/
-
-		return strData;
-#else
-		RVCJson rvcJson(true);
-		rvcJson.AddStringToObject(REFLECTION(installVersion), (char*)installVersion.c_str());
-		rvcJson.AddStringToObject(REFLECTION(terminalCharacter), (char*)terminalCharacter.c_str());
-		rvcJson.AddStringToObject(REFLECTION(terminalNo), (char*)terminalNo.c_str());
-		rvcJson.AddStringToObject(REFLECTION(sessionTempPubKey), (char*)sessionTempPubKey.c_str());
-		rvcJson.AddStringToObject(REFLECTION(encTerminalInfo), (char*)encTerminalInfo.c_str());
-		rvcJson.AddStringToObject(REFLECTION(publicKeySM), (char*)publicKeySM.c_str());
-		rvcJson.AddStringToObject(REFLECTION(pinPadID), (char*)pinPadID.c_str());
-		rvcJson.AddStringToObject(REFLECTION(existPinPad), (char*)existPinPad.c_str());
-		string ret;
-		char* tmp = rvcJson.GetJsonStr();
-		ret.assign(tmp);
-		delete tmp;
-		/*DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("CAccessAuthGetTokenReq")
-			("req=%s at CAccessAuthGetTokenReq", ret.c_str());*/
-		return ret;
-#endif // RVC_OS_WIN
-	}
-}CAccessAuthGetTokenReq;
-
-typedef struct CAccessAuthGetTokenRet : CHTTPRet {
-	typedef struct AccessToken {
-		string enToken;
-		string retHash;
-	} AccessToken;
-	typedef struct SharedKey {
-		string enToken;
-		string sharedSK;
-		string retHash;
-	} ShareKey;
-	struct data {
-		AccessToken accessToken;
-		SharedKey sharedKey;
-#ifdef RVC_OS_WIN
-		int flag; //0:非高故障设备,1:高故障设备
-		string warnMessage; //告警提示信息
-#endif // RVC_OS_WIN
-	} data;
-	bool Parse(string strData) {
-#ifdef RVC_OS_WIN
-		Json::Value root;
-		Json::Reader reader;
-		reader.parse(strData, root, false);
-
-		data.accessToken.enToken = root["data"][REFLECTION(accessToken)][REFLECTION(enToken)].asString();
-		data.accessToken.retHash = root["data"][REFLECTION(accessToken)][REFLECTION(retHash)].asString();
-		data.sharedKey.enToken = root["data"][REFLECTION(sharedKey)][REFLECTION(enToken)].asString();
-		data.sharedKey.sharedSK = root["data"][REFLECTION(sharedKey)][REFLECTION(sharedSK)].asString();
-		data.sharedKey.retHash = root["data"][REFLECTION(sharedKey)][REFLECTION(retHash)].asString();
-		data.flag = root["data"][REFLECTION(flag)].asInt();
-		data.warnMessage = root["data"][REFLECTION(warnMessage)].asString();
-
-		return true;
-#else
-		//Dbg("ret=%s at CAccessAuthGetTokenRet", strData.c_str());
-		if (m_userCode.compare(ACS_SUCCESS)) return true;
-		RVCJson rvcJson;
-		rvcJson.SetJson(strData.c_str());
+	JSONCONVERT2OBJECT_MEMEBER_REGISTER(terminalVersion, terminalNo, sessionTempPubKey, encTerminalInfo)
+} CAccessAuthGetTokenReq;
 
-		auto dataJson = rvcJson.GetJsonValue(REFLECTION(data));
-		auto tokenJson = dataJson->GetJsonValue(REFLECTION(accessToken));
-
-		data.accessToken.enToken = tokenJson->GetStringValue(REFLECTION(enToken));
-		data.accessToken.retHash = tokenJson->GetStringValue(REFLECTION(retHash));
-		tokenJson->Destory();
-		delete tokenJson;
-
-		auto sharedJson = dataJson->GetJsonValue(REFLECTION(sharedKey));
-
-		data.sharedKey.enToken = sharedJson->GetStringValue(REFLECTION(enToken));
-		data.sharedKey.sharedSK = sharedJson->GetStringValue(REFLECTION(sharedSK));
-		char* tmp = sharedJson->GetStringValue(REFLECTION(retHash));
-		data.sharedKey.retHash = tmp == NULL ? "" : tmp;
-
-		sharedJson->Destory();
-		delete sharedJson;
-		dataJson->Destory();
-		delete dataJson;
-
-		rvcJson.Destory();
-		return true;
-#endif // RVC_OS_WIN
-	}
-} CAccessAuthGetTokenRet;
+struct AccessTokenJson
+{
+	string enToken;
+	string retHash;
+	JSONCONVERT2OBJECT_MEMEBER_REGISTER(enToken, retHash)
+};
+struct SharedKeyJson
+{
+	string enToken;
+	string sharedSK;
+	string retHash;
+	JSONCONVERT2OBJECT_MEMEBER_REGISTER(enToken, sharedSK, retHash)
+};
 
-typedef struct CInitlizerMKReq : CHTTPReq {
-	string enrolAddr;
-	string enrolGPS;
-	string installVersion;
-	string ip;
-	string machineModel;
-	string machineType;
-	string padDeviceID;
-	string site;
+typedef struct CAccessAuthGetTokenAns
+{
+	AccessTokenJson accessToken;
+	SharedKeyJson sharedKey;
+	bool flag;
+	string warnMessage;
+	JSONCONVERT2OBJECT_MEMEBER_REGISTER(accessToken, sharedKey, flag, warnMessage)
+} CAccessAuthGetTokenAns;
+
+typedef struct CInitlizerMKReq
+{
+	string iniTerminalInfo;
+	string terminalVersion;
 	string terminalNo;
-	string factory;
-	string modal;
-	string type;
-	string version;
-	string terminalCharacter; //终端特征值(fingerPrint + fingerPrintSM)
-	string pinPadID;
 	string publicKey;
 	string user; //操作人
-	string password; //密码
 	string auth;//预留鉴权
 	int loginWay;//1表示错误页发起,需要传入登录密码;0表示用户桌面发起,不需要传入登录密码
 	string encRandom; //tmk pk加密的随机密钥
-	string tpkKeyCheck; //密钥校验值
-	string edkKeyCheck; //密钥校验值
-	string keyIndex; //密钥序号
-
-	string ToJson() {
-#ifdef RVC_OS_WIN
-		Json::Value value;
-		value[REFLECTION(enrolAddr)] = enrolAddr;
-		value[REFLECTION(enrolGPS)] = enrolGPS;
-		value[REFLECTION(installVersion)] = installVersion;
-		value[REFLECTION(ip)] = ip;
-		value[REFLECTION(machineModel)] = machineModel;
-		value[REFLECTION(machineType)] = machineType;
-		value[REFLECTION(padDeviceID)] = padDeviceID;
-		value[REFLECTION(site)] = site;
-		value[REFLECTION(terminalNo)] = terminalNo;
-		value[REFLECTION(factory)] = factory;
-		value[REFLECTION(modal)] = modal;
-		value[REFLECTION(type)] = type;
-		value[REFLECTION(version)] = version;
-		value[REFLECTION(terminalCharacter)] = terminalCharacter;
-		value[REFLECTION(pinPadID)] = pinPadID;
-		value[REFLECTION(publicKey)] = publicKey;
-		value[REFLECTION(user)] = user;
-		value[REFLECTION(password)] = password;
-		value[REFLECTION(auth)] = auth;
-		value[REFLECTION(loginWay)] = loginWay;
-		value[REFLECTION(encRandom)] = encRandom;
-		value[REFLECTION(tpkKeyCheck)] = tpkKeyCheck;
-		value[REFLECTION(edkKeyCheck)] = edkKeyCheck;
-		value[REFLECTION(keyIndex)] = keyIndex;
-		Json::FastWriter writer;
-		string strData = writer.write(value);
+	string curTpkKeyCheck; //密钥校验值
+	string curEdkKeyCheck; //密钥校验值
+	string curKeyIndex; //密钥序号
 
-		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("CInitlizerMKReq")("CInitlizerMKReq:%s", strData.c_str());
+	JSONCONVERT2OBJECT_MEMEBER_REGISTER(iniTerminalInfo, terminalVersion, terminalNo, publicKey, user, auth,
+		loginWay, encRandom, curTpkKeyCheck, curEdkKeyCheck, curKeyIndex)
 
-		return strData;
-#else
-		RVCJson rvcJson(true);
-		rvcJson.AddStringToObject(REFLECTION(enrolAddr), (char*)enrolAddr.c_str());
-		rvcJson.AddStringToObject(REFLECTION(enrolGPS), (char*)enrolGPS.c_str());
-		rvcJson.AddStringToObject(REFLECTION(installVersion), (char*)installVersion.c_str());
-		rvcJson.AddStringToObject(REFLECTION(ip), (char*)ip.c_str());
-		rvcJson.AddStringToObject(REFLECTION(machineModel), (char*)machineModel.c_str());
-		rvcJson.AddStringToObject(REFLECTION(machineType), (char*)machineType.c_str());
-		rvcJson.AddStringToObject(REFLECTION(padDeviceID), (char*)padDeviceID.c_str());
-		rvcJson.AddStringToObject(REFLECTION(site), (char*)site.c_str());
-		rvcJson.AddStringToObject(REFLECTION(terminalNo), (char*)terminalNo.c_str());
-		rvcJson.AddStringToObject(REFLECTION(factory), (char*)factory.c_str());
-		rvcJson.AddStringToObject(REFLECTION(modal), (char*)modal.c_str());
-		rvcJson.AddStringToObject(REFLECTION(type), (char*)type.c_str());
-		rvcJson.AddStringToObject(REFLECTION(version), (char*)version.c_str());
-		rvcJson.AddStringToObject(REFLECTION(terminalCharacter), (char*)terminalCharacter.c_str());
-		rvcJson.AddStringToObject(REFLECTION(pinPadID), (char*)pinPadID.c_str());
-		rvcJson.AddStringToObject(REFLECTION(publicKey), (char*)publicKey.c_str());
-		rvcJson.AddStringToObject(REFLECTION(user), (char*)user.c_str());
-		rvcJson.AddStringToObject(REFLECTION(password), (char*)password.c_str());
-		rvcJson.AddStringToObject(REFLECTION(auth), (char*)auth.c_str());
-		rvcJson.AddNumberToObject(REFLECTION(loginWay), loginWay);
-		rvcJson.AddStringToObject(REFLECTION(encRandom), (char*)encRandom.c_str());
-		rvcJson.AddStringToObject(REFLECTION(tpkKeyCheck), (char*)tpkKeyCheck.c_str());
-		rvcJson.AddStringToObject(REFLECTION(edkKeyCheck), (char*)edkKeyCheck.c_str());
-		rvcJson.AddStringToObject(REFLECTION(keyIndex), (char*)keyIndex.c_str());
-		string ret;
-		char* tmp = rvcJson.GetJsonStr();
-		ret.assign(tmp);
-		delete tmp;
-		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("CInitlizerMKReq")("req=%s at CInitlizerMKReq", ret.c_str());
-		rvcJson.Destory();
-		return ret;
-#endif // RVC_OS_WIN
-	}
 } CInitlizerMKReq;
 
-typedef struct CInitlizerMKRet : CHTTPRet {
-#ifdef RVC_OS_WIN
-	string tpk;
-	string edk;
+typedef struct CInitlizerMKAns
+{
+	string TMK;
+	string TPK;
+	string EDK;
 	string tpkKeyCheck;
 	string edkKeyCheck;
 	string keyIndex;
-
-	bool Parse(string strData) {
-		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("CInitlizerMKRet")("ret=%s at CInitlizerMKRet", strData.c_str());
-
-		Json::Value root;
-		Json::Reader reader;
-		reader.parse(strData, root, false);
-		tpk = root["data"][REFLECTION(tpk)].asString();
-		edk = root["data"][REFLECTION(edk)].asString();
-		tpkKeyCheck = root["data"][REFLECTION(tpkKeyCheck)].asString();
-		edkKeyCheck = root["data"][REFLECTION(edkKeyCheck)].asString();
-		keyIndex = root["data"][REFLECTION(keyIndex)].asString();
-		return true;
-	}
-#else
-	struct data {
-		string TMK;
-		string TPK;
-		string EDK;
-		string tpkKeyCheck;
-		string edkKeyCheck;
-		string keyIndex;
-		string reserved;
-	} data;
-	bool Parse(string strData) {
-		//Dbg("ret=%s at CInitlizerMKRet", strData.c_str());
-		if (m_userCode.compare(ACS_SUCCESS)) return true;
-		RVCJson rvcJson;
-		rvcJson.SetJson((char*)strData.c_str());
-		auto retJson = rvcJson.GetJsonValue(REFLECTION(data));
-		data.TMK = retJson->GetStringValue(REFLECTION(tmk));
-		data.TPK = retJson->GetStringValue(REFLECTION(tpk));
-		data.EDK = retJson->GetStringValue(REFLECTION(edk));
-		data.tpkKeyCheck = retJson->GetStringValue(REFLECTION(tpkKeyCheck));
-		data.edkKeyCheck = retJson->GetStringValue(REFLECTION(edkKeyCheck));
-		data.keyIndex = retJson->GetStringValue(REFLECTION(keyIndex));
-		rvcJson.Destory();
-		retJson->Destory();
-		delete retJson;
-		return true;
-	}
-#endif // RVC_OS_WIN
-} CInitlizerMKRet;
-
-#ifdef RVC_OS_WIN
-typedef struct CAccessAuthInitDeviceReq : CHTTPReq {
-	string cr1;
-	string cr3;
-	string r2;
-	string cDevPubKey;
-	string vendor;
-	string terminalNo;
-	string ToJson() {
-		Json::Value value;
-		value[REFLECTION(cr1)] = cr1;
-		value[REFLECTION(cr3)] = cr3;
-		value[REFLECTION(r2)] = r2;
-		value[REFLECTION(cDevPubKey)] = cDevPubKey;
-		value[REFLECTION(vendor)] = vendor;
-		value[REFLECTION(terminalNo)] = terminalNo;
-
-		Json::FastWriter writer;
-		string strData = writer.write(value);
-		//Dbg("CAccessAuthInitDeviceReq:%s", strData.c_str());
-		return strData;
-}
-} CAccessAuthInitDeviceReq;
-
-typedef struct CAccessAuthInitDeviceRet : CHTTPRet {
-	string r3;
-	string cr2;
-	string r1;
-	string devPubKey;
-
-	bool Parse(string strData) {
-		Json::Value root;
-		Json::Reader reader;
-		reader.parse(strData, root, false);
-		r3 = root["data"][REFLECTION(r3)].asString();
-		cr2 = root["data"][REFLECTION(cr2)].asString();
-		r1 = root["data"][REFLECTION(r1)].asString();
-		devPubKey = root["data"][REFLECTION(devPubKey)].asString();
-
-		return true;
-	}
-} CAccessAuthInitDeviceRet;
-#endif // RVC_OS_WIN
+	string reserved;
+	JSONCONVERT2OBJECT_MEMEBER_REGISTER(TMK, TPK, EDK, tpkKeyCheck, edkKeyCheck, keyIndex)
+		JSONCONVERT2OBJECT_MEMEBER_RENAME_REGISTER("tmk", "tpk", "edk", "tpkKeyCheck", "edkKeyCheck", "keyIndex")
+} CInitlizerMKAns;
 
 class MyMutex;
 class CAccessAuthFSM : public FSMImpl<CAccessAuthFSM>, public IFSMStateHooker
@@ -476,7 +189,7 @@ public:
 	void doWarnMsg(int errReason, std::string errMsg, bool bNeedEvent = false, string varMsg = "");
 	DWORD HandleTimeSyn(long nTimeDiff, BYTE* nSessionKey);
 	DWORD HandleGetToken(BYTE* token, BYTE* sharedKey, BYTE* token2, BYTE* retHash);
-	DWORD GetEncTerminalInfo(CBlob& encInfo);
+	DWORD GetEncTerminalInfoWithKey(CBlob& encInfo, BYTE* key);
 	DWORD GetTmk(string& tmk);
 	DWORD GetTokenReq(CAccessAuthGetTokenReq* getTokenReq);
 	void UpdateWK();

+ 32 - 239
Module/mod_accessauth/mod_AccessAuth.cpp

@@ -24,9 +24,6 @@ using namespace PinPad;
 #include "DeviceBaseClass.h"
 #endif
 
-#define KEY_SIZE 16
-#define BUF_SIZE 256
-
 extern int HexBuf2StrBuf(PBYTE hexBuf, char** strBuf, DWORD len);
 extern int StrBuf2HexBuf(LPCTSTR strBuf, PBYTE* hexBuf);
 
@@ -40,8 +37,8 @@ struct InitializerInitMKTask : ITaskSp
 	{
 		CSystemStaticInfo si;
 		m_fsm->GetEntityBase()->GetFunction()->GetSystemStaticInfo(si);
-		CInitlizerMKReq initMKReq;//oiltest dev module count
-		bool initFlag = m_entity->SendInitMKReqACS(initMKReq);
+		CInitlizerMKReq instanceReq;//oiltest dev module count
+		bool initFlag = m_entity->SendInitMKReqACS(instanceReq);
 		if (!initFlag)
 		{
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5204")("连接密码键盘异常");
@@ -56,76 +53,9 @@ struct InitializerInitMKTask : ITaskSp
 		}
 
 		auto tmkpair = m_entity->GenerateTmkToKMC();
-		struct InstanceReqJson
-		{
-			string enrolAddr;
-			string enrolGPS;
-			string installVersion;
-			string ip;
-			string machineModel;
-			string machineType;
-			string padDeviceID;
-			string site;
-			string terminalNo;
-			string factory;
-			string modal;
-			string type;
-			string version;
-			string terminalCharacter; //终端特征值(fingerPrint + fingerPrintSM)
-			string pinPadID;
-			string publicKey;
-			string user; //操作人
-			string password; //密码
-			string auth;//预留鉴权
-			int loginWay;//1表示错误页发起,需要传入登录密码;0表示用户桌面发起,不需要传入登录密码
-			string encRandom; //tmk pk加密的随机密钥
-			string tpkKeyCheck; //密钥校验值
-			string edkKeyCheck; //密钥校验值
-			string keyIndex; //密钥序号
-
-			JSONCONVERT2OBJECT_MEMEBER_REGISTER(enrolAddr, enrolGPS, installVersion, ip, machineModel, machineType,
-				padDeviceID, site, terminalNo, factory, modal, type, version, terminalCharacter, pinPadID, publicKey,
-				user, password, auth, loginWay, encRandom, tpkKeyCheck, edkKeyCheck, keyIndex)
-
-		} instanceReq;
-
-		instanceReq.enrolAddr = initMKReq.enrolAddr;
-		instanceReq.enrolGPS = initMKReq.enrolGPS;
-		instanceReq.installVersion = initMKReq.installVersion;
-		instanceReq.ip = initMKReq.ip;
-		instanceReq.machineModel = initMKReq.machineModel;
-		instanceReq.machineType = initMKReq.machineType;
-		instanceReq.padDeviceID = initMKReq.padDeviceID;
-		instanceReq.site = initMKReq.site;
-		instanceReq.terminalNo = initMKReq.terminalNo;
-		instanceReq.factory = initMKReq.factory;
-		instanceReq.modal = initMKReq.modal;
-		instanceReq.type = initMKReq.type;
-		instanceReq.version = initMKReq.version;
-		instanceReq.terminalCharacter = initMKReq.terminalCharacter;
-		instanceReq.pinPadID = initMKReq.pinPadID;
-		instanceReq.publicKey = initMKReq.publicKey;
-		instanceReq.user = initMKReq.user;
-		instanceReq.password = initMKReq.password;
-		instanceReq.auth = initMKReq.auth;
-		instanceReq.loginWay = initMKReq.loginWay;
 		instanceReq.encRandom = tmkpair.first;
-		instanceReq.tpkKeyCheck = initMKReq.tpkKeyCheck;
-		instanceReq.edkKeyCheck = initMKReq.edkKeyCheck;
-		instanceReq.keyIndex = initMKReq.keyIndex;
 
-		struct InstanceAnsJson
-		{
-			string TMK;
-			string TPK;
-			string EDK;
-			string tpkKeyCheck;
-			string edkKeyCheck;
-			string keyIndex;
-			string reserved;
-			JSONCONVERT2OBJECT_MEMEBER_REGISTER(TMK, TPK, EDK, tpkKeyCheck, edkKeyCheck, keyIndex)
-				JSONCONVERT2OBJECT_MEMEBER_RENAME_REGISTER("tmk", "tpk", "edk", "tpkKeyCheck", "edkKeyCheck", "keyIndex")
-		} instanceAns;
+		CInitlizerMKAns instanceAns;
 
 		HttpClientResponseResult result;
 		HttpClientRequestConfig config(HttpRequestMethod::POST, m_entity->GetInitUrl().GetData(), &SpGetToken);
@@ -619,8 +549,8 @@ static BYTE* ConvertHexStrToBytes(const char *pszStr)
 	return pRet;
 }
 
-// 使用准入会话密钥加密
-ErrorCodeEnum CAccessAuthEntity::EncryptDataWithSessionKey(const CBlob &raw, CBlob &enc)
+// 使用密钥加密
+ErrorCodeEnum CAccessAuthEntity::EncryptDataWithKey(const CBlob &raw, CBlob &enc, BYTE* key)
 {
 	LOG_FUNCTION();
 	//这里不需要delete,由CBlob析构函数去执行
@@ -630,13 +560,8 @@ ErrorCodeEnum CAccessAuthEntity::EncryptDataWithSessionKey(const CBlob &raw, CBl
 	char* pPlainInfo = Str2Hex((char*)raw.m_pData, raw.m_iLength);
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("raw Length=%d", raw.m_iLength);
 	delete[] pPlainInfo;
-	
-	char sessionKey[KEY_SIZE] = { 0 };
-	memcpy(sessionKey,m_AuthSessionKey,KEY_SIZE);
-	char* tmpKey = Str2Hex((char*)m_AuthSessionKey, KEY_SIZE);
-	delete[] tmpKey;
 
-	if (!EncWithSM4_ECB((BYTE*)sessionKey, (BYTE*)(raw.m_pData), raw.m_iLength, pEncData, &pEncDataSize)) {
+	if (!EncWithSM4_ECB(key, (BYTE*)(raw.m_pData), raw.m_iLength, pEncData, &pEncDataSize)) {
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("会话密钥加密准入信息失败!");
 		return Error_Unexpect;
 	}
@@ -887,18 +812,17 @@ bool CAccessAuthEntity::GetTerminalPublicKey(BYTE* pBuf, int& nBufLen, string& p
 
 //oilyang@20210510 嵌入"bool CAccessAuthEntity::HasPinPad()"的逻辑
 // 返回1:只有PinPadID;2:只有DeviceID;3:两者都有;0:没有;-1表示失败
-int CAccessAuthEntity::GetPinPadIDAndDeviceID(CSimpleStringA &strPinPadID, CSimpleStringA &strDeviceID, bool& isPinPadMac, bool& bPinPadOnline)
+ErrorCodeEnum CAccessAuthEntity::GetPinPadModel(CSimpleStringA& pinpadModel, bool& bPinPadOnline)
 {
-	isPinPadMac = false;
 	bPinPadOnline = false;
 	CSimpleStringA strErrMsg;
 	CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
 
 	//oilyang@20210514 
 	if (!IsMachineTypeConfigurePinPad(m_info.strMachineType))
-		return 0;
+		return Error_Succeed;
 
-	int nRet = -1;
+	ErrorCodeEnum nRet = Error_Unexpect;
 	auto pPinPadClient = new PinPadService_ClientBase(this);
 	bool bPinPadID = false;
 	bool bDeviceID = false;
@@ -908,7 +832,6 @@ int CAccessAuthEntity::GetPinPadIDAndDeviceID(CSimpleStringA &strPinPadID, CSimp
 	CSimpleStringA strBluetoothID;
 	CSimpleStringA strPID;
 	CSimpleStringA strMID;
-	isPinPadMac = true;
 	auto rc = 0;
 	if ((rc = pPinPadClient->Connect()) == Error_Succeed)
 	{
@@ -919,7 +842,7 @@ int CAccessAuthEntity::GetPinPadIDAndDeviceID(CSimpleStringA &strPinPadID, CSimp
 		if (rc == Error_Succeed)
 		{
 			bPinPadOnline = true;
-			nRet = 0;
+			nRet = Error_Succeed;
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("pinpad model: %s", ans.model.GetData());
 
 			// CM = V2.0#PM = V1.0#MID = 75500001#PID = 12345678#FWID = V1234567#Vendor = nantian
@@ -927,61 +850,16 @@ int CAccessAuthEntity::GetPinPadIDAndDeviceID(CSimpleStringA &strPinPadID, CSimp
 			CSimpleStringA str = ans.model;
 			if (!str.IsNullOrEmpty())
 			{
-				auto arr = str.Split('#');
-				if (arr.GetCount() > 0)
-				{
-					for (int i = 0; i < arr.GetCount(); i++)
-					{
-						auto arr2 = arr[i].Split('=');
-						if (arr2.GetCount() != 2)
-							continue;
-
-						//if (arr2[0] == "PID")
-						if (!strnicmp((LPCTSTR)arr2[0], "PID", strlen("PID")))
-						{
-							strPID = arr2[1];
-
-							if (!strPID.IsNullOrEmpty())
-								bPinPadID = true;
-						}
-						//else if (arr2[0] == "MID")
-						else if (!strnicmp((LPCTSTR)arr2[0], "MID", strlen("MID")))
-						{
-							strMID = arr2[1];
-
-							if (!strMID.IsNullOrEmpty())
-								bDeviceID = true;
-						}
-						//else if (arr2[0] == "Vendor")
-						else if (!strnicmp((LPCTSTR)arr2[0], "Vendor", strlen("Vendor")))
-						{
-							strVendor = arr2[1];
-
-							if (!strVendor.IsNullOrEmpty())
-								bVendor = true;
-						}
-						else if (!strnicmp((LPCTSTR)arr2[0], "FWBID", strlen("FWBID")))
-						{
-							strBluetoothID = arr2[1];
-							DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("strBluetoothID=%s", strBluetoothID.GetData());
-							if (!strBluetoothID.IsNullOrEmpty())
-								bBluetooth = true;
-						}
-					}
-				}
+				pinpadModel = ans.model;
 			}
 		}
 		else if(rc == Error_NotInit)
 		{
-			if (!HasPinPad())
-				isPinPadMac = false;
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("pinpad NOT INIT!, state: %d", ans.state);
 			return nRet; //此时nRet = -1, pinpad调用失败
 		}
 		else
 		{
-			if (!HasPinPad())
-				isPinPadMac = false;
 			strErrMsg = "调用PinPad实体的GetDevInfo方法失败";
 			SetAuthErrMsg(strErrMsg.GetData());
 
@@ -996,8 +874,6 @@ int CAccessAuthEntity::GetPinPadIDAndDeviceID(CSimpleStringA &strPinPadID, CSimp
 	}
 	else
 	{
-		if (!HasPinPad())
-			isPinPadMac = false;
 		strErrMsg = "连接PinPad实体失败";
 		SetAuthErrMsg((const char*)strErrMsg);
 
@@ -1011,34 +887,6 @@ int CAccessAuthEntity::GetPinPadIDAndDeviceID(CSimpleStringA &strPinPadID, CSimp
 
 	pPinPadClient = NULL;
 
-	if (bPinPadID)
-	{
-		if (bVendor)
-			strPinPadID = strVendor + "_" + strPID;
-		else
-			strPinPadID = strPID;
-
-		nRet += 1;
-	}
-
-	if (bDeviceID)
-	{
-		if (bVendor)
-			strDeviceID = strVendor + "_" + strMID;
-		else
-			strDeviceID = strMID;
-
-		if (bBluetooth)
-			strDeviceID = strDeviceID + "_" + strBluetoothID;
-
-		nRet += 2;
-	}
-	else if (bBluetooth)
-	{
-		strDeviceID = strDeviceID + "_" + strBluetoothID;
-		nRet += 2;
-	}
-
 	return nRet;
 }
 
@@ -1248,89 +1096,34 @@ bool CAccessAuthEntity::SendInitMKReqACS(CInitlizerMKReq& initMKReq)
 {
 	LOG_FUNCTION();
 	CSmartPointer<IEntityFunction> pFunc = GetFunction();
-	CSimpleStringA strPinPadID = "", strDeviceID = "";
-	bool isPinPadMac, bPinPadOnline;
-	int nRet = GetPinPadIDAndDeviceID(strPinPadID, strDeviceID, isPinPadMac, bPinPadOnline);
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetPinPadIDAndDeviceID ret: %d, PinPadID: %s, DeviceID: %s", nRet, strPinPadID.GetData(), strDeviceID.GetData());
+	CSimpleStringA strPinPadModel = "";
+	bool bPinPadOnline;
+	ErrorCodeEnum nRet = GetPinPadModel(strPinPadModel, bPinPadOnline);
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetPinPadszModel %s", strPinPadModel.GetData());
 
-	if (nRet < 0)
+	if (nRet != Error_Succeed)
 	{
 		return false; //具有pinpad的设备调用pinpad失败
 	}
 
-	// 从系统获取设备信息和硬件信息	
-	// 变长结构初始化
-	char buf2[512];
-	memset(buf2, 0, 512);
-
-	CSystemStaticInfo si;
-	pFunc->GetSystemStaticInfo(si);
-
-	initMKReq.enrolGPS = "00000A4500000A4E";//oiltmp
-	initMKReq.enrolAddr = si.strEnrolAddr;
-	initMKReq.installVersion = si.InstallVersion.ToString();
-
-#ifdef RVC_OS_WIN
-	hostent* ent = gethostbyname(NULL);
-	if (ent && ent->h_addr_list[0] != NULL)
-	{
-		int i = 0;
-		for (; ent->h_addr_list[i] != NULL; ++i)
-		{
-			struct in_addr* in = (struct in_addr*)ent->h_addr_list[i];
-			if (in->S_un.S_un_b.s_b1 == 99 || in->S_un.S_un_b.s_b1 == 10)
-				break;
-		}
-
-		if (ent->h_addr_list[i] == NULL)
-			i = 0;
-
-		auto in = (struct in_addr*)ent->h_addr_list[i];
-		char xIP[64] = {};
-		sprintf(xIP, "%d.%d.%d.%d", in->S_un.S_un_b.s_b1, in->S_un.S_un_b.s_b2, in->S_un.S_un_b.s_b3, in->S_un.S_un_b.s_b4);
-		initMKReq.ip = xIP;
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ip:%s", xIP);
-	}
-#else
-	BYTE xIP[64] = {};
-	char ip[32] = { 0 };
-	if (getIPFromLinux(ip)) DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Get IP From Linux Error ex.");
-	else {
-		if (ip2byte(ip, xIP)) DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Ip 2 Byte Error");
-		else {
-			for (int i = 0; i < 4; i++) {
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("ip[%d]=%d", i, xIP[i]);
-			}
-			char strIP[64];
-			memset(strIP, 0, 64);
-			sprintf(strIP, "%d.%d.%d.%d", xIP[0], xIP[1], xIP[2], xIP[3]);
-			initMKReq.ip = strIP;
-		}
-	}
-#endif // RVC_OS_WIN
-
-	initMKReq.machineType = si.strMachineType;
-
-	if (nRet == 2 || nRet == 3)
-		initMKReq.padDeviceID = strDeviceID;
-	initMKReq.site = si.strSite;
-	initMKReq.terminalNo = si.strTerminalID;
-
-	BYTE fingerPrint[32] = { 0 };
-	int nBufLen = sizeof(fingerPrint);
-	if (!GetTerminalFingerPrint(fingerPrint, nBufLen))
+	CBlob encInfo;
+	char* key = "s5da69gnh4!963@6s5da69gnh4!963@6";
+	nRet = (ErrorCodeEnum)m_FSM.GetEncTerminalInfoWithKey(encInfo, (BYTE*)key);
+	if (( m_FSM.GetEncTerminalInfoWithKey(encInfo, (BYTE*)key)) != Error_Succeed)
 	{
-		LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
-			GetOutPutStr("%s%s", "GetTerminalFingerPrint", "False").c_str());
-		return ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT;
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetEncTerminalInfo failed:%d", nRet);
+		return nRet;
 	}
-	initMKReq.terminalCharacter = ConvertBytesToHexStr(fingerPrint, nBufLen);
+	char* pTmp = Str2Hex((char*)encInfo.m_pData, encInfo.m_iLength);
+	initMKReq.iniTerminalInfo = pTmp;
 
-	if (nRet == 1 || nRet == 3)
-		initMKReq.pinPadID = strPinPadID;
+	CSystemStaticInfo si;
+	pFunc->GetSystemStaticInfo(si);
+	initMKReq.terminalVersion = si.InstallVersion.ToString();
+	initMKReq.terminalNo = si.strTerminalID.GetData();
 
 	BYTE xPublicKey[148];
-	nBufLen = sizeof(xPublicKey);
+	int nBufLen = sizeof(xPublicKey);
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("SendInitMKReqACS")("开始获取公钥。。。");
 	memset(xPublicKey, 0, nBufLen);
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("SendInitMKReqACS")("nBufLen=%d", nBufLen);
@@ -1340,8 +1133,8 @@ bool CAccessAuthEntity::SendInitMKReqACS(CInitlizerMKReq& initMKReq)
 			GetOutPutStr("%s%s", "GetTerminalPublicKey", "False").c_str());
 		return ERR_ACCESSAUTH_GET_TERMINAL_PUBKEY;
 	}
+
 	initMKReq.user = m_strUserID.GetData();
-	initMKReq.password = m_strPassword.GetData();
 	if (!m_strUserID.IsNullOrEmpty() && !m_strPassword.IsNullOrEmpty())
 	{
 		LogWarn(Severity_Low, Error_Succeed, AccessAuthorization_UserErrorCode_Init_From_ClosePage, "Init by ClosePage.");
@@ -1367,8 +1160,8 @@ bool CAccessAuthEntity::SendInitMKReqACS(CInitlizerMKReq& initMKReq)
 		errRc = (*pPinPad)(EntityResource::getLink().upgradeLink())->GetCheckCode(req, ans, 10000);
 		if (errRc == Error_Succeed)
 		{
-			initMKReq.tpkKeyCheck = ans.checkcode[0].GetData();
-			initMKReq.keyIndex = ans.index[0].GetData();
+			initMKReq.curTpkKeyCheck = ans.checkcode[0].GetData();
+			initMKReq.curKeyIndex = ans.index[0].GetData();
 		}
 		else
 		{

+ 7 - 6
Module/mod_accessauth/mod_AccessAuth.h

@@ -8,6 +8,9 @@ using namespace AccessAuthorization;
 
 #include "AccessAuthFSM.h"
 
+#define KEY_SIZE 16
+#define BUF_SIZE 256
+
 int HexBuf2StrBuf(PBYTE hexBuf, char** strBuf, DWORD len);
 int StrBuf2HexBuf(LPCTSTR strBuf, PBYTE* hexBuf);
 
@@ -89,8 +92,8 @@ public:
 	// 保存会话密钥
 	bool SaveAuthKey(BYTE* pKey);
 
-	// 调用准入会话密钥加密
-	ErrorCodeEnum EncryptDataWithSessionKey(const CBlob& raw, CBlob& enc);
+	// 调用指定密钥加密
+	ErrorCodeEnum EncryptDataWithKey(const CBlob& raw, CBlob& enc, BYTE* key);
 
 	bool GetTerminalFingerPrint(BYTE* pBuf, int& nBufLen);
 	bool GetTerminalPublicKey(BYTE* pBuf, int& nBufLen, string& pubkey);
@@ -98,10 +101,8 @@ public:
 	void SetAuthErrMsg(const char* pszErrMsg) { m_strAuthErrMsg = pszErrMsg; }
 	const char* GetAuthErrMsg() { return m_strAuthErrMsg; }
 
-	// 获取密码键盘ID和外设ID
-	//oilyang@20210510 add:in order to avoid getting info out of async, check if has pinpad while getting info
-	// 返回1:只有PinPadID;2:只有DeviceID;3:两者都有;0:失败
-	int GetPinPadIDAndDeviceID(CSimpleStringA& strPinPadID, CSimpleStringA& strDeviceID, bool& isPinPadMac, bool& bPinPadOnline);
+	// 获取密码键盘szModel
+	ErrorCodeEnum GetPinPadModel(CSimpleStringA& pinpadModel, bool& bPinPadOnline);
 
 	// 设置时区
 	wstring ANSIToUnicode(const string& str);

+ 1 - 7
Module/mod_pinpad/mod_PinPad.h

@@ -181,13 +181,7 @@ public:
 			ErrorCodeEnum eGetDevInfo = m_fsm.GetDevInfo(devInfo);
 			if (eGetDevInfo == Error_Succeed)
 			{
-				//oiltmp@20240823 纪林的与业务组的初始化优化完成之后,是不是不要再拼接了?
-				CSimpleStringA tmpAddStr("");
-				tmpAddStr = tmpAddStr + "Vendor=" + devInfo.szVendor;
-				if (devInfo.szModel[strlen(devInfo.szModel) - 1] == '#')
-					ctx->Ans.model = CSimpleStringA(devInfo.szModel) + tmpAddStr;
-				else
-					ctx->Ans.model = CSimpleStringA(devInfo.szModel) + "#" + tmpAddStr;
+				ctx->Ans.model = devInfo.szModel;
 				ctx->Ans.type = devInfo.szType;
 			}
 			ctx->Ans.state = eGetDevInfo;