Browse Source

!10628 更新基线
Merge pull request !10628 from 80274480/ST2

陈礼鹏80274480 8 months ago
parent
commit
477d236baf

+ 6 - 6
DevAdapter/CMakeLists.txt

@@ -260,8 +260,8 @@ if(DEVADAPTER_USING_CONAN)
             #长城读卡接口优化
             set(GWI_CONAN_ALL_LIB_NAME gwi/2024.0722.6@LR04.02_VendorLib/msvc)
             set(KEBA_CONAN_ALL_LIB_NAME keba/2024.0326.23@LR04.02_VendorLib/msvc)
-            #恒银智能卡库非接上线
-            set(CW_CONAN_ALL_LIB_NAME cw/2024.0822.53@LR04.02_VendorLib/msvc)
+            #【阅知】关于适配器解耦完成测试事宜
+            set(CW_CONAN_ALL_LIB_NAME cw/2024.1125.57@LR04.02_VendorLib/msvc)
             #rvc_aggerate_vendor_libs(cmb)
             rvc_aggerate_vendor_libs(gwi)
             rvc_aggerate_vendor_libs(keba)
@@ -271,10 +271,10 @@ if(DEVADAPTER_USING_CONAN)
         if(RVC_INTEGRATE_BUILDV2)
             #邮件 试运行设备的密码键盘与读卡器的提示灯物理地址与测试样机的物理地址不一致
             set(KEBA_CONAN_ALL_LIB_NAME keba/2024.0814.32@LR04.02_VendorLib/stable)
-            #2024年8月14日 招乎群(深圳机具沟通)单屏试点前收集
-            set(CW_CONAN_ALL_LIB_NAME cw/2024.0801.44@LR04.02_VendorLib/stable)
-            #2024年8月14日 招乎群(深圳机具沟通)单屏试点前收集
-            set(SZZT_CONAN_ALL_LIB_NAME szzt/2024.0814.37@LR04.02_VendorLib/stable)
+            #【阅知】关于适配器解耦完成测试事宜
+            set(CW_CONAN_ALL_LIB_NAME cw/2024.1220.47@LR04.02_VendorLib/stable)
+            #【阅知】关于适配器解耦完成测试事宜
+            set(SZZT_CONAN_ALL_LIB_NAME szzt/2024.1209.40@LR04.02_VendorLib/stable)
             #长城信创单屏设备root.ini配置需要更新为(根据行方规范,将信创单屏设备版本号修改为2.x)
             set(GWI_CONAN_ALL_LIB_NAME gwi/2024.0723.20@LR04.02_VendorLib/stable)
             #Fw: 回复:回复: Fw: 回复:回复: Fw: 南天-缺陷案例解决方案及适配器整合

+ 3 - 0
DevAdapter/Note.md

@@ -3,6 +3,9 @@
 `conan export-pkg . LR04.02_VendorLib/testing -s arch=armv8 -s os=Linux -s compiler=gcc -s compiler.libcxx=libstdc++11 -s compiler.version=8 -s build_type=Debug`
 `conan upload self/2024.1025.01@LR04.02_VendorLib/testing --all -r=conan-cmb`
 
+`conan export-pkg . LR04.02_VendorLib/stable -s arch=armv8 -s os=Linux -s compiler=gcc -s compiler.libcxx=libstdc++11 -s compiler.version=8 -s build_type=Debug`
+`conan upload self/2024.1025.01@LR04.02_VendorLib/stable --all -r=conan-cmb`
+
 `conan export-pkg . LR04.02_MediaRes/testing -s arch=armv8 -s os=Linux -s compiler=gcc -s compiler.libcxx=libstdc++11 -s compiler.version=8 -s build_type=Debug`
 `conan upload Audio/2023.0509.01@LR04.02_MediaRes/testing --all -r=conan-cmb`
 `conan upload  sogouime/2.6.4.593@LR04.02_MediaRes/testing --all -r=conan-cmb`

+ 1 - 1
Module/mod_IDCertificate/IDCertFSM.cpp

@@ -1669,7 +1669,7 @@ ErrorCodeEnum CIDCertFSM::GetPngBlobEx(CBlob &data, CSimpleStringA fileNamePrefi
 	CSimpleStringA strPath, errMsg, strOldPath;
 	ErrorCodeEnum eErr;
 	eErr = m_pEntity->GetFunction()->GetPath("Dep", strPath);
-	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("[Dep]%s,%s", SpStrError(eErr), strPath.GetData());
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("[Dep]%s,%s", SpStrError(eErr), strPath.GetData());
 	if (eErr != Error_Succeed)
 	{
 		if (bClear)

+ 0 - 5
Module/mod_ResourceWatcher/ResourceWatcherFSM.cpp

@@ -703,7 +703,6 @@ int ResourceWatcherFSM::ProcessFileDelete(LPCTSTR lpszPath, int& nDelSucCnt, int
             
             if (delDays < saveBackDay) // 未达到需要清理的天数阈值,无需清理
             {
-                DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Files 存留天数[%d], 删除阈值[%u],无需清理.", (int)delDays, saveBackDay);
                 return fileCnt;
             }
         }
@@ -761,7 +760,6 @@ int ResourceWatcherFSM::ProcessFileDelete(LPCTSTR lpszPath, int& nDelSucCnt, int
 
             if (delDays < saveBackDay) // 未达到需要清理的天数阈值,无需清理
             {
-                DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Dir[%s], 存留天数[%d], 删除阈值[%u],无需清理.", tempFilePath, (int)delDays, saveBackDay);
                 continue;
             }
         }
@@ -800,7 +798,6 @@ int ResourceWatcherFSM::ProcessFileDelete(LPCTSTR lpszPath, int& nDelSucCnt, int
             
             if (delDays < saveBackDay) // 未达到需要清理的天数阈值,无需清理
             {
-                DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("存留天数[%d], 删除阈值[%u],无需清理.", (int)delDays, saveBackDay);
                 FindClose(hFind);
                 return fileCnt;
             }
@@ -857,7 +854,6 @@ int ResourceWatcherFSM::ProcessFileDelete(LPCTSTR lpszPath, int& nDelSucCnt, int
                     int delDays = (lSystemTime - fileTime) / SECONDS_OF_DAY;
                     if (delDays < saveBackDay) // 未达到需要清理的天数阈值,无需清理
                     {
-                        DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Dir[%s], 存留天数[%d], 删除阈值[%u],无需清理.", tempFilePath, (int)delDays, saveBackDay);
                         continue;
                     }
                 }
@@ -3220,7 +3216,6 @@ void ResourceWatcherFSM::CheckDiskFileSpace()
         {
             if (lastDiskUsed != 0 && ((int)(GetDiskUsedByte() / (1024 * 1024 * 1024)) - lastDiskUsed) < spaceIncrease) //增长值判定
             {
-                //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("硬盘空间增长未超过阈值,无需扫描。");
                 if (spaceLock)
                 {
                     spaceLock = false; //释放锁

+ 4 - 0
Module/mod_ResourceWatcher/ResourceWatcher_UserCode.h

@@ -106,4 +106,8 @@
 #define LOG_WARN_SUEPROCCHECK_LIANRUAN 0x50A35902 //联软进程检测
 #define LOG_WARN_SUEPROCCHECK_RUIYAN 0x50A35903 //锐眼进程检测
 
+
+#define LOG_WARN_FILECHECK_NOTSUPPORT_TYPE 0x50A35A01	//文件检查类型不支持
+#define LOG_WARN_FILECHECK_ERRORPARAM 0x50A35A02		//文件检查参数错误
+
 #endif //MOD_RESOUCEWATCHER_USERCODE_HEADER

+ 10 - 1
Module/mod_ResourceWatcher/mod_ResourceWatcher.cpp

@@ -2690,6 +2690,7 @@ void ResourceWatcherEntity::CheckIsFileExists(SpReqAnsContext<ResourceWatcherSer
 {
     int iResult = -1;
     ErrorCodeEnum Error = Error_Succeed;
+    DWORD warnCode = 0; 
     if (ctx->Req.filename.GetLength() > 0) {
         CSimpleStringA strFileName = CSimpleStringW2A(ctx->Req.filename);
         switch (ctx->Req.filetype) {
@@ -2702,17 +2703,25 @@ void ResourceWatcherEntity::CheckIsFileExists(SpReqAnsContext<ResourceWatcherSer
             break;
         default:
             Error = Error_NotSupport;
+            warnCode = LOG_WARN_FILECHECK_NOTSUPPORT_TYPE;
+            DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("filetype = %d.", ctx->Req.filetype);
             DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A10").setAPI(__FUNCTION__)("目前不支持该类型文件检查");
             break;
         }
     }
     else {
         Error = Error_Param;
+        warnCode = LOG_WARN_FILECHECK_ERRORPARAM;
         DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A11").setAPI(__FUNCTION__)("要检查的文件名为空");
     }
 
     ctx->Ans.result = iResult;
-    ctx->Answer(Error);
+    if (Error_Succeed == Error) {
+        ctx->Answer(Error);
+    }
+    else {
+        ctx->Answer(Error, warnCode);
+    }
 }
 
 #if defined(RVC_OS_WIN)

+ 0 - 22
Module/mod_ResourceWatcher/mod_ResourceWatcher.h

@@ -335,28 +335,6 @@ private:
 					GetFunction()->KillTimer(ENT_TIMERID_CHECK_SOGOU_INPUT_INSTALLED_STATE);
 					GetFunction()->SetTimer(ENT_TIMERID_CHECK_SOGOU_INPUT_PROCESS_STATUS_CHANGE,
 						this, ENT_TIMERINTERVAL_CHECK_SOGOU_INPUT_PROCESS_STATUS_CHANGE);
-
-					///**TODO(Gifur@10/9/2023): 等普通调用版本的输入法全行推广后,这块很多功能逻辑可以下线了 */
-#if defined(_MSC_VER)
-					//进入主页面后,检测安装状态,安装成功则执行一次启动脚本
-					///**TODO(Gifur@10/9/2023): 这段逻辑有点奇怪,上面的接口并不是安装输入法的功能,只是检测输入法的状态,这里每次都运行一次启动逻辑??*/
-					//答:这段定时器在检测到安装了输入法之后就只会执行一次,定时器被KILL掉了,之后只会检测搜狗进程的变化
-					CSimpleStringA csBinPath;
-					ErrorCodeEnum eErrPath = GetFunction()->GetPath("Bin", csBinPath);
-					if (eErrPath != Error_Succeed) {
-						DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("GetBasePath failed.");
-					}
-					else {
-						CSimpleStringA startPath = csBinPath + SPLIT_SLASH_STR + "spScript" + SPLIT_SLASH_STR + "SogouServStarter.bat";
-						int startFlag = WinExec(startPath.GetData(), SW_HIDE);
-						if (startFlag > 31) {
-							DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("检测到已安装搜狗输入法,执行搜狗启动脚本!路径:%s。", startPath.GetData());
-						}
-						else {
-							DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("执行启动脚本异常!路径:%s。", startPath.GetData());
-						}
-					}
-#endif //_MSC_VER
 				}
 			}
 			else {

+ 234 - 406
Module/mod_accessauth/AccessAuthFSM.cpp

@@ -6,8 +6,8 @@
 #include  <stdio.h>
 #include  <stdlib.h>
 #include "fileutil.h"
-#include "iniutil.h"
 #include "CommEntityUtil.hpp"
+#include "CommEntityRestful.hpp"
 #include "SpUtility.h"
 #include "comm.h"
 #include "PinPad_client_g.h"
@@ -23,10 +23,6 @@ using namespace PinPad;
 #include <ws2tcpip.h>
 #include <Winsock2.h>
 #include <algorithm>
-#include "WMIDeviceQuery.h"
-#include <WinCrypt.h>
-#include <Strsafe.h>
-#include "DeviceBaseClass.h"
 #pragma comment(lib, "IPHLPAPI.lib")
 #define ALLOW_MULTI_NETWORKD_CARDS
 #endif // RVC_OS_WIN
@@ -132,8 +128,20 @@ struct TimeSynTask : ITaskSp
 		CSystemStaticInfo si;
 		m_fsm->GetEntityBase()->GetFunction()->GetSystemStaticInfo(si);
 
-		CSessionkeySynReq timeSyncReq;
-		CSessionkeySynAns timeSyncAns;
+		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;
 
 		timeSyncReq.terminalNo = si.strTerminalID.GetData();
 		timeSyncReq.curTime = CSmallDateTime::GetNow().GetTime64();
@@ -256,8 +264,26 @@ struct UpdateWKTask : ITaskSp
 			return;
 		}
 		
-		CAccessAuthUpdateWKReq updateWKReq;
-		CAccessAuthUpdateWKAns updateWKAns;
+		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;
 
 		updateWKReq.terminalNo = si.strTerminalID.GetData();
 		auto tmkpair = m_entity->GenerateTmkToKMC();//first是加密的,seconde是没加密的
@@ -283,7 +309,6 @@ struct UpdateWKTask : ITaskSp
 			else
 			{
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Get keyChek && keyIndex failed.");
-				return;
 			}
 
 			pPinPad->GetFunction()->CloseSession();
@@ -291,7 +316,6 @@ struct UpdateWKTask : ITaskSp
 		else
 		{
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("connect to pinpad failed.error code:%d", errRc);
-			return;
 		}
 
 		HttpClientResponseResult result;
@@ -368,16 +392,46 @@ struct GetTokenTask : ITaskSp
 			return;
 		}
 
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("encTerminalInfo: %s", getTokenReq.encTerminalInfo.c_str());
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("sessionTempPubKey:%s", getTokenReq.sessionTempPubKey.c_str());
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("terminalNo: %s", getTokenReq.terminalNo.c_str());
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("terminalVersion: %s", getTokenReq.terminalVersion.c_str());
+		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)
+		};
 
-		CAccessAuthGetTokenAns getTokenAns;
+		struct GetTokenAns
+		{
+			AccessTokenJson accessToken;
+			SharedKeyJson sharedKey;
+			bool flag;
+			string warnMessage;
+			JSONCONVERT2OBJECT_MEMEBER_REGISTER(accessToken, sharedKey, flag, warnMessage)
+		} getTokenAns;
 
 		HttpClientResponseResult result;
 		HttpClientRequestConfig config(HttpRequestMethod::POST, m_fsm->GetmAccessAuthHost().GetData(), &SpGetToken);
-		config.SetChildUri("/api/v4/access");
+		config.SetChildUri("/api/v3/access");
 
 		if (m_fsm->containsChinese(m_fsm->GetmAccessAuthHost().GetData()))
 		{
@@ -391,10 +445,23 @@ struct GetTokenTask : ITaskSp
 			return;
 		}
 
-		SP::Module::Restful::FulfillRequestJsonBody(&config, getTokenReq);
+		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);
+
+		std::string test;
+		test = config.GetRequestUri();
+
 		RestfulClient client = RestfulClient::getInstance();
 		config.PreDo();
-
 		client.Do(&config, &result);
 		if (result.ResponseOK()) {
 			SP::Module::Restful::CommResponseJson responseStatus;
@@ -409,12 +476,10 @@ struct GetTokenTask : ITaskSp
 			{
 				CSimpleStringA tmsg = CSimpleStringA::Format("{\"errcode\": \"%s\", \"message\": %s}",
 					responseStatus.errorCode.c_str(), getTokenAns.warnMessage.c_str());
-				m_entity->SetAuthErrMsg(tmsg.GetData());
 				m_fsm->GetEntityBase()->GetFunction()->SetSysVar("AuthErrMsg", tmsg.GetData(), true);
 			}
 			else
 			{
-				m_entity->SetAuthErrMsg("");
 				m_fsm->GetEntityBase()->GetFunction()->SetSysVar("AuthErrMsg", "", true);
 			}
 
@@ -454,13 +519,25 @@ struct GetTokenTask : ITaskSp
 			}
 
 			m_fsm->AuthLogWarn(result, config.GetRequestUri(), "获取准入token");
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetTokenTask Connect Failed. [%s]", result.WhatError().c_str());
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetTokenTask Connect Failed.");
 		}
 		FSMEvent* pEvent = new FSMEvent(CAccessAuthFSM::Event_ReqTokenFail);
 		m_fsm->PostEventFIFO(pEvent);
 	}
 };
 
+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) {
@@ -517,8 +594,6 @@ void CAccessAuthFSM::doWarnMsg(int errReason, std::string errMsg, bool bNeedEven
 #endif // RVC_OS_WIN
 	if (bNeedEvent) 
 	{
-		auto pEntity = (CAccessAuthEntity*)m_pEntity;
-		pEntity->SetAuthErrMsg(fullErrMsg.c_str());
 		const ErrorCodeEnum ec = m_pEntity->GetFunction()->SetSysVar("AuthErrMsg", fullErrMsg.c_str(), true);
 		if (ec != Error_Succeed) {
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Update SysVar failed: 0x%X", ec);
@@ -526,7 +601,6 @@ void CAccessAuthFSM::doWarnMsg(int errReason, std::string errMsg, bool bNeedEven
 		
 		if (errReason == ERR_ACCESSAUTH_SERVICE_FAILED)
 		{
-			pEntity->SetAuthErrMsg(errMsg.c_str());
 			m_pEntity->GetFunction()->SetSysVar("AuthErrMsg", errMsg.c_str(), true);
 			LogEvent(Severity_Middle, ERR_ACCESSAUTH_SERVICE_FAILED, errMsg.c_str());
 		}
@@ -815,6 +889,7 @@ DWORD CAccessAuthFSM::HandleGetToken(BYTE* enToken1, BYTE* sharedKey, BYTE* enTo
 		{
 			pEntity->SetAuthErrMsg("保存令牌失败");
 			pEntity->GetFunction()->SetSysVar("AuthErrMsg", "保存令牌失败", true);
+			pEntity->SetAuthErrMsg("保存令牌失败");
 			doWarnMsg(ERR_ACCESSAUTH_SAVE_TOKEN, "保存令牌失败", true);
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5208")(GetOutPutStr("%s%08X", "SaveTokenAndSharedSK", rc).c_str());
 		}
@@ -822,55 +897,112 @@ DWORD CAccessAuthFSM::HandleGetToken(BYTE* enToken1, BYTE* sharedKey, BYTE* enTo
 	return rc;
 }
 
-DWORD CAccessAuthFSM::GetEncTerminalInfoWithKey(CBlob& encInfo, BYTE* key)
+DWORD CAccessAuthFSM::GetEncTerminalInfo(CBlob& encInfo)
 {
 	LOG_FUNCTION();
-	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);
-	bool bPinPadOnline = false;
-	pEntity->GetPinPadModel(pinpadModel, bPinPadOnline);
-	
-	GetIPandMac(ip, mac);
-	GetHardWareInfo(cpuId, mainBoardId, hardDiskId);
-	osVersion = GetOsVersion();
+	RequestTokenReq1 req1;
+	memset(&req1, 0, sizeof(req1));
+	BYTE* pBuf = (BYTE*)&req1.encTerminalInfo;
 
-#ifdef RVC_OS_WIN
-	termInfo["osType"] = "Windows";
-#else
-	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();
-	termInfo["pinpadModel"] = pinpadModel.GetData();
-
-	std::pair<bool, std::string> strResult;
-	strResult = generateJsonStr(termInfo);
-
-	char* pBuf = new char[2048];
-	int len = 0;
-#ifdef RVC_OS_WIN
-	string tmpStr = strResult.second;
-	SP::Module::Util::ConvertGBKToUtf8(tmpStr);
-	strcpy(pBuf, tmpStr.c_str()); //GBK转UTF8
-	len = tmpStr.size();
+	// 设置长度
+	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];
+
+		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]);
+	}
 #else
-	strcpy(pBuf, strResult.second.c_str());
-	len = strResult.second.size();
-#endif // RVC_OS_WIN
+	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];
+
+	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];
 
-	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("HardWareInfo: %s", pBuf);
-	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("HardWareInfo size: %d", len);
 
 	CBlob raw;
-	raw.Refer(pBuf, len);
-	rc = pEntity->EncryptDataWithKey(raw, encInfo, key);
+	auto pEntity = ((CAccessAuthEntity*)m_pEntity);
+	// 使用会话密钥加密
+	raw.Refer(pBuf, sizeof(RequestTokenInfo) + 4);
+	rc = pEntity->EncryptDataWithSessionKey(raw, encInfo);
 
 	if (rc != Error_Succeed) 
 	{
@@ -920,14 +1052,26 @@ DWORD CAccessAuthFSM::GetTokenReq(CAccessAuthGetTokenReq* getTokenReq)
 	CSystemStaticInfo si;
 	pEntity->GetFunction()->GetSystemStaticInfo(si);
 
-	getTokenReq->terminalVersion = si.InstallVersion.ToString();
-	getTokenReq->terminalNo = si.strTerminalID.GetData();
+	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;
 
 	CBlob encInfo;
-	// 使用会话密钥加密
-	char sessionKey[KEY_SIZE] = { 0 };
-	memcpy(sessionKey, pEntity->m_AuthSessionKey, KEY_SIZE);
-	if ((rc = GetEncTerminalInfoWithKey(encInfo, (BYTE*)sessionKey)) != Error_Succeed)
+	if ((rc = GetEncTerminalInfo(encInfo)) != Error_Succeed) 
 	{
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetEncTerminalInfo failed:%d", rc);
 		return rc;
@@ -935,14 +1079,23 @@ 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) 
+	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()) 
 	{
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetTmk failed:%d", rc);
-		return rc;
+		getTokenReq->existPinPad = "1";
+	} 
+	else 
+	{
+		getTokenReq->existPinPad = "0";
 	}
-	getTokenReq->sessionTempPubKey = tmpStr;
 	return rc;
 }
 
@@ -950,9 +1103,9 @@ void CAccessAuthFSM::UpdateWK()
 {
 	LOG_FUNCTION();
 	auto pEntity = ((CAccessAuthEntity*)m_pEntity);
-	CSimpleStringA strPinPadModel = "";
-	bool bPinPadOnline = false;
-	pEntity->GetPinPadModel(strPinPadModel, bPinPadOnline);
+	CSimpleStringA strPinPadID = "", strDeviceID = "";
+	bool isPinPadMac = false, bPinPadOnline = false;
+	pEntity->GetPinPadIDAndDeviceID(strPinPadID, strDeviceID, isPinPadMac, bPinPadOnline);
 	if (bPinPadOnline) {
 		CSmartPointer<UpdateWKTask> updateWKTask = new UpdateWKTask(this, pEntity);
 		GetEntityBase()->GetFunction()->PostThreadPoolTask(updateWKTask.GetRawPointer());
@@ -1014,328 +1167,3 @@ void CAccessAuthFSM::GetNetMsg(SpReqAnsContext<AccessAuthService_GetNetMsg_Req,
 
 	ctx->Answer(Error_Succeed);
 }
-
-CSimpleStringA CAccessAuthFSM::GetOsVersion()
-{
-	std::map<std::string, std::string> errInfo;
-	CSimpleStringA errMsg;
-	errInfo["errcode"] = "RTA5219";
-	errInfo["msg"] = "调用系统api获取操作系统版本失败";
-
-#if defined(RVC_OS_WIN)
-	CSimpleStringA runInfoPath;
-	ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetPath("runinfo", runInfoPath);
-	if (eErr != Error_Succeed) {
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("GetPath runinfo error=%s.", SpStrError(eErr));
-		errInfo["getLastErr"] = GetLastError();
-		errMsg = generateJsonStr(errInfo).second.c_str();
-		return errMsg;
-	}
-	runInfoPath += "\\runcfg\\osverion";
-	ifstream is;
-	is.open(runInfoPath.GetData(), ios::binary);
-	if (!is.is_open())
-	{
-		DWORD dwErr = GetLastError();
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open runcfg\\osverion file failed. [%d]", dwErr);
-		errInfo["getLastErr"] = dwErr;
-		errMsg = generateJsonStr(errInfo).second.c_str();
-		return errMsg;
-	}
-	string line;
-	while (!is.eof()) {
-		getline(is, line);
-		int start = line.find("版本");
-		if (start != string::npos)
-			//return CSimpleStringA(line.substr(start + 5, line.length() - start - 7).c_str());
-			return CSimpleStringA(line.c_str());
-		else
-			continue;
-	}
-
-	errInfo["getLastErr"] = GetLastError();
-	errMsg = generateJsonStr(errInfo).second.c_str();
-	return errMsg;
-#else
-	std::map<std::string, std::string> osInfo;
-	const char filePath[] = "/etc/os-version";
-	char tmp[33];
-	memset(tmp, 0, 33);
-	inifile_read_str_s("Version", "SystemName", "unknown", tmp, 32, filePath);
-	osInfo["SystemName"] = tmp;
-	memset(tmp, 0, 33);
-	inifile_read_str_s("Version", "ProductType", "unknown", tmp, 32, filePath);
-	osInfo["ProductType"] = tmp;
-	memset(tmp, 0, 33);
-	inifile_read_str_s("Version", "MajorVersion", "unknown", tmp, 32, filePath);
-	osInfo["MajorVersion"] = tmp;
-	memset(tmp, 0, 33);
-	inifile_read_str_s("Version", "MinorVersion", "unknown", tmp, 32, filePath);
-	osInfo["MinorVersion"] = tmp;
-	memset(tmp, 0, 33);
-	inifile_read_str_s("Version", "OsBuild", "unknown", tmp, 32, filePath);
-	osInfo["OsBuild"] = tmp;
-	return generateJsonStr(osInfo).second.c_str();
-#endif
-}
-
-void CAccessAuthFSM::GetIPandMac(CSimpleStringA& ip, CSimpleStringA& mac)
-{
-	CAutoArray<SP::Module::Net::NetworkAdapterItem> netList;
-	ErrorCodeEnum rc = SP::Module::Net::GetINETMacAddresses(netList);
-	std::map<std::string, std::string> errInfo;
-	if (rc != Error_Succeed)
-	{
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Get sys netinfo failed!. rc=%d.", rc);
-		errInfo["errcode"] = "RTA5216";
-		errInfo["msg"] = "调用系统api获取ip失败";
-		errInfo["getLastErr"] = GetLastError();
-		ip = generateJsonStr(errInfo).second.c_str();
-
-		errInfo["errcode"] = "RTA5217";
-		errInfo["msg"] = "调用系统api获取mac地址失败";
-		errInfo["getLastErr"] = GetLastError();
-		mac = generateJsonStr(errInfo).second.c_str();
-
-		auto pEntity = (CAccessAuthEntity*)m_pEntity;
-		pEntity->SetAuthErrMsg("获取本地ip和mac失败");
-		return;
-	}
-
-	CSimpleStringA csMac(""), csIP(""), csDNS("");
-	for (int i = 0; i < netList.GetCount(); i++) {
-		if (!csMac.IsNullOrEmpty()) {
-			csMac += ";";
-		}
-		csMac += netList[i].mac.c_str();
-	}
-	mac = csMac;
-	
-	for (int i = 0; i < netList.GetCount(); i++) {
-		if (!csIP.IsNullOrEmpty()) {
-			csIP += ";";
-		}
-		csIP += netList[i].ip.c_str();
-	}
-	ip = csIP;
-
-	return;
-}
-
-void CAccessAuthFSM::GetHardWareInfo(CSimpleStringA & cpu, CSimpleStringA & mainBoard, CSimpleStringA & disk)
-{
-	auto pEntity = (CAccessAuthEntity*)m_pEntity;
-	std::map<std::string, std::string> errInfo;
-
-	//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 bGetFromRunCfg = false;
-	CSimpleString csInfo, strErrMsg, strRet;
-	CSmartPointer<IConfigInfo> pConfigRun;
-	ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, pConfigRun);
-	if (eErr == Error_Succeed && pConfigRun->ReadConfigValue("system", "info", csInfo) == Error_Succeed && !csInfo.IsNullOrEmpty()) {
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("read device info from runcfg: [%s]", csInfo.GetData());
-		CAutoArray<CSimpleStringA> sysInfo = csInfo.Split('|');
-		if (sysInfo.GetCount() == 3)
-		{
-			cpu = sysInfo[0];
-			mainBoard = sysInfo[1];
-			disk = sysInfo[2];
-			bGetFromRunCfg = true;
-		}
-	}
-	else
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetTermSysInfo, OpenConfig Config_Run error=%d.", eErr);
-
-#ifdef RVC_OS_LINUX
-	char szTmp[1024] = {};
-	string strTmp;
-	int nTmpBufLen = 1024;
-	CSmartPointer<IEntityFunction> spFunction = GetEntityBase()->GetFunction();
-
-	CSimpleStringA runInfoPath;
-	auto rc = GetEntityBase()->GetFunction()->GetPath("runinfo", runInfoPath);
-	if (rc != Error_Succeed) {
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetPath runinfo error=%d.", rc);
-		return;
-	}
-	runInfoPath += SPLIT_SLASH_STR "runcfg";
-
-	//CPU
-	if (!get_cpu_id_by_system(strTmp, runInfoPath.GetData()))
-	{
-		if (!bGetFromRunCfg)
-		{
-			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);
-
-		doWarnMsg(ERROR_ACCESSAUTH_GETCPUID,
-			GetOutPutStr("%s%s", "Processor", "False").c_str());
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5213")
-			(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()))
-	{
-		if (!bGetFromRunCfg)
-		{
-			errInfo["errcode"] = "RTA5214";
-			errInfo["msg"] = "调用系统api获取主板ID号失败";
-			errInfo["getLastErr"] = GetLastError();
-			mainBoard = generateJsonStr(errInfo).second.c_str();
-		}
-		strErrMsg = CSimpleStringA::Format("查询主板序列号失败,  请重启机器并重新初始化");
-		pEntity->SetAuthErrMsg((const char*)strErrMsg);
-
-		doWarnMsg(ERROR_ACCESSAUTH_GETBASEBOARDSN,
-			GetOutPutStr("%s%s", "BaseBoard", "False").c_str());
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5214")
-			(GetOutPutStr("%s%s", "BaseBoard", "False").c_str());
-		return;
-	}
-	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()))
-	{
-		if (!bGetFromRunCfg)
-		{
-			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);
-
-		doWarnMsg(ERROR_ACCESSAUTH_DISKDRIVESN,
-			GetOutPutStr("%s%s", "DiskDrive", "False").c_str());
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5215")
-			(GetOutPutStr("%s%s", "DiskDrive", "False").c_str());
-		return;
-	}
-	strRet += "|";
-	strTmp = "";
-	vector<string>::iterator it = diskArr.begin();
-	while (it != diskArr.end()) {
-		strTmp += *it;
-		it++;
-	}
-	strRet += strTmp.c_str();
-	disk = strTmp.c_str();
-#else
-	ULONGLONG ullStart = GetTickCount64();
-	char szTmp[1024] = {};
-	int nTmpBufLen = 1024;
-	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);
-
-		LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
-			GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "Processor", GetLastError()).c_str());
-
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5203")
-			(GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "Processor", GetLastError()).c_str());
-		return;
-	}
-	strRet = szTmp;
-	cpu = szTmp;
-
-	nTmpBufLen = 1024;
-	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);
-
-		LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
-			GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "BaseBoard", GetLastError()).c_str());
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5203")
-			(GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "BaseBoard", GetLastError()).c_str());
-		
-		return;
-	}
-
-	strRet += "|";
-	strRet += szTmp;
-	mainBoard = szTmp;
-
-	nTmpBufLen = 1024;
-	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);
-
-		LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
-			GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "DiskDrive", GetLastError()).c_str());
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "DiskDrive", GetLastError()).c_str());
-		
-		return;
-	}
-
-	strRet += "|";
-	strRet += szTmp;
-	disk = szTmp;
-
-	ULONGLONG ullEnd = GetTickCount64();
-	if (ullEnd - ullStart > 5000)
-	{
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5201")
-			("获取系统信息耗时过长:%d秒", (ullEnd - ullStart) / 1000);
-		LogWarn(Severity_Middle, Error_Unexpect, AccessAuthorization_UserErrorCode_GetTermCostTooLong,
-			CSimpleStringA::Format("获取系统信息耗时过长:%d秒", (ullEnd - ullStart) / 1000));
-	}
-#endif // RVC_OS_LINUX
-
-	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"
-			, csInfo.GetData(), strRet.GetData(), eErr);
-	}
-	else
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("device info: [%s]", strRet.GetData());
-
-	return;
-	
-}

+ 358 - 75
Module/mod_accessauth/AccessAuthFSM.h

@@ -7,7 +7,6 @@
 #include "AccessAuthConn.h"
 #include "IHttpFunc.h"
 #include "json/json.h"
-#include "CommEntityRestful.hpp"
 
 #ifdef RVC_OS_WIN
 ///*TODO:  (80374374@11/27/2023)*/
@@ -27,106 +26,394 @@ static void GetLocalTimeRVC(SYSTEMTIME& stTime)
 #define REFLECTION(var) #var
 #define JUAGEHTTPS(ret) (ret.m_sysCode == 200 || ret.m_sysCode == 201)
 
-typedef struct CSessionkeySynReq
-{
-	std::string terminalNo;
-	int curTime;
-	JSONCONVERT2OBJECT_MEMEBER_REGISTER(terminalNo, curTime)
+#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;
+	}
 } CSessionkeySynReq;
 
-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;
+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;
 	string tpkKeyCheck; //tpk密钥校验值
 	string edkKeyCheck; //edk密钥校验值
 	string keyIndex; //密钥序号
-	JSONCONVERT2OBJECT_MEMEBER_REGISTER(terminalNo, encRandom, tpkKeyCheck, edkKeyCheck, 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;
+	}
 } CAccessAuthUpdateWKReq;
 
-typedef struct CAccessAuthUpdateWKAns
-{
-	string tmk;
+typedef struct CAccessAuthUpdateWKRet : CHTTPRet {
 	string tpk;
 	string edk;
 	string tpkKeyCheck; //密钥校验值
 	string edkKeyCheck; //edk密钥校验值
 	string keyIndex; //密钥序号
-	JSONCONVERT2OBJECT_MEMEBER_REGISTER(tmk, tpk, edk, tpkKeyCheck, edkKeyCheck, keyIndex)
-} CAccessAuthUpdateWKAns;
 
-typedef struct CAccessAuthGetTokenReq
-{
-	string terminalVersion;//终端版本(新加字段)
+	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;
 	string terminalNo;
 	string sessionTempPubKey;
 	string encTerminalInfo;
-	JSONCONVERT2OBJECT_MEMEBER_REGISTER(terminalVersion, terminalNo, sessionTempPubKey, encTerminalInfo)
-} CAccessAuthGetTokenReq;
+	string publicKeySM;
+	string pinPadID;
+	string existPinPad;
 
-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)
-};
+	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;
 
-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;
+		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());
+
+		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;
+
+typedef struct CInitlizerMKReq : CHTTPReq {
+	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 curTpkKeyCheck; //密钥校验值
-	string curEdkKeyCheck; //密钥校验值
-	string curKeyIndex; //密钥序号
+	string tpkKeyCheck; //密钥校验值
+	string edkKeyCheck; //密钥校验值
+	string keyIndex; //密钥序号
 
-	JSONCONVERT2OBJECT_MEMEBER_REGISTER(iniTerminalInfo, terminalVersion, terminalNo, publicKey, user, auth,
-		loginWay, encRandom, curTpkKeyCheck, curEdkKeyCheck, curKeyIndex)
+	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);
 
+		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("CInitlizerMKReq")("CInitlizerMKReq:%s", strData.c_str());
+
+		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 CInitlizerMKAns
-{
-	string TMK;
-	string TPK;
-	string EDK;
+typedef struct CInitlizerMKRet : CHTTPRet {
+#ifdef RVC_OS_WIN
+	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")
-} CInitlizerMKAns;
+
+	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
 
 class MyMutex;
 class CAccessAuthFSM : public FSMImpl<CAccessAuthFSM>, public IFSMStateHooker
@@ -189,7 +476,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 GetEncTerminalInfoWithKey(CBlob& encInfo, BYTE* key);
+	DWORD GetEncTerminalInfo(CBlob& encInfo);
 	DWORD GetTmk(string& tmk);
 	DWORD GetTokenReq(CAccessAuthGetTokenReq* getTokenReq);
 	void UpdateWK();
@@ -204,10 +491,6 @@ public:
 
 	bool containsChinese(const std::string& str);
 
-	CSimpleStringA GetOsVersion();
-	void GetIPandMac(CSimpleStringA& ip, CSimpleStringA& mac);
-	void GetHardWareInfo(CSimpleStringA& cpu, CSimpleStringA& mainBoard, CSimpleStringA& disk);
-
 private:
 	void GetDiffSyncTimeFromCenterSettings();
 private:

+ 510 - 88
Module/mod_accessauth/mod_AccessAuth.cpp

@@ -24,6 +24,9 @@ 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);
 
@@ -37,8 +40,8 @@ struct InitializerInitMKTask : ITaskSp
 	{
 		CSystemStaticInfo si;
 		m_fsm->GetEntityBase()->GetFunction()->GetSystemStaticInfo(si);
-		CInitlizerMKReq instanceReq;//oiltest dev module count
-		bool initFlag = m_entity->SendInitMKReqACS(instanceReq);
+		CInitlizerMKReq initMKReq;//oiltest dev module count
+		bool initFlag = m_entity->SendInitMKReqACS(initMKReq);
 		if (!initFlag)
 		{
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5204")("连接密码键盘异常");
@@ -53,29 +56,87 @@ 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;
 
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("iniTerminalInfo: %s", instanceReq.iniTerminalInfo.c_str());
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("auth:%s", instanceReq.auth.c_str());
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("curEdkKeyCheck: %s", instanceReq.curEdkKeyCheck.c_str());
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("curKeyIndex: %s", instanceReq.curKeyIndex.c_str());
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("curTpkKeyCheck: %s", instanceReq.curTpkKeyCheck.c_str());
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("encRandom: %s", instanceReq.encRandom.c_str());
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("publicKey: %s", instanceReq.publicKey.c_str());
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("terminalNo: %s", instanceReq.terminalNo.c_str());
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("terminalVersion: %s", instanceReq.terminalVersion.c_str());
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("user: %s", instanceReq.user.c_str());
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("loginWay: %d", instanceReq.loginWay);
-
-		CInitlizerMKAns instanceAns;
+		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;
 
 		HttpClientResponseResult result;
 		HttpClientRequestConfig config(HttpRequestMethod::POST, m_entity->GetInitUrl().GetData(), &SpGetToken);
-		config.SetChildUri("/api/v6/initmk");
+		config.SetChildUri("/api/v5/initmk");
 		SP::Module::Restful::FulfillRequestJsonBody(&config, instanceReq);
+
+		std::string test;
+		test = config.GetRequestUri();
+
 		RestfulClient client = RestfulClient::getInstance();
 		config.PreDo();
-
 		client.Do(&config, &result);
 		if (result.ResponseOK()) {
 			SP::Module::Restful::CommResponseJson responseStatus;
@@ -118,6 +179,19 @@ struct InitializerInitMKTask : ITaskSp
 	}
 };
 
+#ifdef RVC_OS_WIN
+struct GetTermSysInfoTask : ITaskSp
+{
+	CAccessAuthEntity* m_entity;
+	GetTermSysInfoTask(CAccessAuthEntity* entity) :m_entity(entity) {}
+
+	void Process()
+	{
+		m_entity->GetTermSysInfo();
+	}
+};
+#endif // RVC_OS_WIN
+
 typedef struct _REG_TZI_FORMAT
 {
 	LONG Bias;
@@ -190,6 +264,11 @@ void CAccessAuthEntity::OnStarted()
 			GetOutPutStr("%s%08X", "获取系统静态信息错误", rc).c_str(), strErrMsg.GetData());
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(GetOutPutStr("%s%08X", "获取系统静态信息错误", rc).c_str());
 	}
+#ifdef RVC_OS_WIN
+	spFunction->RegistSysVarEvent("NetState", this);
+	CSmartPointer<GetTermSysInfoTask> getTermSysInfoTask = new GetTermSysInfoTask(this);
+	GetFunction()->PostThreadPoolTask(getTermSysInfoTask.GetRawPointer());
+#endif // RVC_OS_WIN
 }
 
 void CAccessAuthEntity::OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext) 
@@ -200,6 +279,9 @@ void CAccessAuthEntity::OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPoin
 
 void CAccessAuthEntity::OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext) 
 { 
+#ifdef RVC_OS_WIN
+	GetFunction()->UnregistSysVarEvent("NetState");
+#endif // RVC_OS_WIN
 	m_FSM.PostExitEvent();
 	pTransactionContext->SendAnswer(Error_Succeed); 
 }
@@ -537,8 +619,8 @@ static BYTE* ConvertHexStrToBytes(const char *pszStr)
 	return pRet;
 }
 
-// 使用密钥加密
-ErrorCodeEnum CAccessAuthEntity::EncryptDataWithKey(const CBlob &raw, CBlob &enc, BYTE* key)
+// 使用准入会话密钥加密
+ErrorCodeEnum CAccessAuthEntity::EncryptDataWithSessionKey(const CBlob &raw, CBlob &enc)
 {
 	LOG_FUNCTION();
 	//这里不需要delete,由CBlob析构函数去执行
@@ -548,10 +630,14 @@ ErrorCodeEnum CAccessAuthEntity::EncryptDataWithKey(const CBlob &raw, CBlob &enc
 	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(key, (BYTE*)(raw.m_pData), raw.m_iLength, pEncData, &pEncDataSize)) {
+	if (!EncWithSM4_ECB((BYTE*)sessionKey, (BYTE*)(raw.m_pData), raw.m_iLength, pEncData, &pEncDataSize)) {
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("会话密钥加密准入信息失败!");
-		SetAuthErrMsg("会话密钥加密准入信息失败");
 		return Error_Unexpect;
 	}
 	
@@ -594,6 +680,112 @@ static char* ConvertBytesToHexStr(BYTE *pBuf, int nLen)
 	return pRet;
 }
 
+bool CAccessAuthEntity::GetTerminalFingerPrint(BYTE *pBuf, int &nBufLen)
+{
+#ifdef RVC_OS_LINUX
+	char szTmp[1024] = {};
+	string strTmp;
+	int nTmpBufLen = 1024;
+	CSimpleStringA strErrMsg;
+	CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
+
+	CSimpleStringA strRet;
+	CSimpleStringA runInfoPath;
+	auto rc = GetFunction()->GetPath("runinfo", runInfoPath);
+	if (rc != Error_Succeed) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetPath runinfo error=%d.", rc);
+		return false;
+	}
+	runInfoPath += SPLIT_SLASH_STR "runcfg";
+	if (!get_cpu_id_by_system(strTmp, runInfoPath.GetData()))
+	{
+		strErrMsg = CSimpleStringA::Format("查询CPU ID失败,请重启机器并重新初始化");
+		SetAuthErrMsg((const char*)strErrMsg);
+
+		m_FSM.doWarnMsg(ERROR_ACCESSAUTH_GETCPUID,
+			GetOutPutStr("%s%s", "Processor", "False").c_str());
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5213")
+			(GetOutPutStr("%s%s", "Processor", "False").c_str());
+		return false;
+	}
+
+	strRet = strTmp.c_str();
+	strTmp.clear();
+	if (!get_board_serial_by_system(strTmp, runInfoPath.GetData()))
+	{
+		strErrMsg = CSimpleStringA::Format("查询主板序列号失败,  请重启机器并重新初始化");
+		SetAuthErrMsg((const char*)strErrMsg);
+
+		m_FSM.doWarnMsg(ERROR_ACCESSAUTH_GETBASEBOARDSN,
+			GetOutPutStr("%s%s", "BaseBoard", "False").c_str());
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5214")
+			(GetOutPutStr("%s%s", "BaseBoard", "False").c_str());
+		return false;
+	}
+	strRet += "|";
+
+	strRet += strTmp.c_str();
+	vector<string> disk;
+	int errCode = 0;
+	if (!get_disk_serial_by_system(disk, errCode, runInfoPath.GetData()))
+	{
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get_disk_serial_by_system errCode:%d", errCode);
+		strErrMsg = CSimpleStringA::Format("查询磁盘序列号失败, 请重启机器并重新初始化");
+		SetAuthErrMsg((const char*)strErrMsg);
+
+		m_FSM.doWarnMsg(ERROR_ACCESSAUTH_DISKDRIVESN,
+			GetOutPutStr("%s%s", "DiskDrive", "False").c_str());
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5215")
+			(GetOutPutStr("%s%s", "DiskDrive", "False").c_str());
+		return false;
+	}
+	strRet += "|";
+
+	strTmp = "";
+	vector<string>::iterator it = disk.begin();
+	while (it != disk.end()) {
+		strTmp += *it;
+		it++;
+	}
+	strRet += 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";
+		SetAuthErrMsg((const char*)strErrMsg);
+		spFunction->SetSysVar("AuthErrMsg", (const char*)strErrMsg, true);
+		m_FSM.doWarnMsg(ERROR_ACCESSAUTH_GETSM3HASH, (const char*)strErrMsg);
+		return false;
+	}
+#endif // RVC_OS_LINUX
+	if (nBufLen < 32)
+	{
+		m_FSM.doWarnMsg(ERROR_ACCESSAUTH_GETSM3HASH, "buf len is too small fail");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("buf len is too small fail");
+
+		return false;
+	}
+#ifdef RVC_OS_WIN
+	while (1)
+	{
+		if (m_iGetTermSysInfo == -1)
+			return false;
+		else if (m_iGetTermSysInfo == 1)
+			break;
+		else if (m_iGetTermSysInfo == 0)
+			Sleep(1000);//oiltmp@20220917 之前的逻辑是不跳出去,现在要加么?暂时不加,连调用系统接口都有问题,让其他逻辑处理
+	}
+#endif // RVC_OS_WIN
+	nBufLen = 32;
+	memcpy(pBuf, m_btTermSysInfoSM3, nBufLen);
+
+	char *pszSM3 = ConvertBytesToHexStr(m_btTermSysInfoSM3, nBufLen);
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("fringerprint: [%s]", pszSM3);
+	free(pszSM3);
+	return true;
+}
+
 // 生成RSA密钥对,并导出公钥
 bool CAccessAuthEntity::GetTerminalPublicKey(BYTE* pBuf, int& nBufLen, string& pubkey)
 {
@@ -695,20 +887,18 @@ bool CAccessAuthEntity::GetTerminalPublicKey(BYTE* pBuf, int& nBufLen, string& p
 
 //oilyang@20210510 嵌入"bool CAccessAuthEntity::HasPinPad()"的逻辑
 // 返回1:只有PinPadID;2:只有DeviceID;3:两者都有;0:没有;-1表示失败
-ErrorCodeEnum CAccessAuthEntity::GetPinPadModel(CSimpleStringA& pinpadModel, bool& bPinPadOnline)
+int CAccessAuthEntity::GetPinPadIDAndDeviceID(CSimpleStringA &strPinPadID, CSimpleStringA &strDeviceID, bool& isPinPadMac, bool& bPinPadOnline)
 {
+	isPinPadMac = false;
 	bPinPadOnline = false;
 	CSimpleStringA strErrMsg;
 	CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
-	std::map<std::string, std::string> errInfo;
+
 	//oilyang@20210514 
 	if (!IsMachineTypeConfigurePinPad(m_info.strMachineType))
-	{
-		pinpadModel = "";
-		return Error_Succeed;
-	}
+		return 0;
 
-	ErrorCodeEnum nRet = Error_Unexpect;
+	int nRet = -1;
 	auto pPinPadClient = new PinPadService_ClientBase(this);
 	bool bPinPadID = false;
 	bool bDeviceID = false;
@@ -718,15 +908,10 @@ ErrorCodeEnum CAccessAuthEntity::GetPinPadModel(CSimpleStringA& pinpadModel, boo
 	CSimpleStringA strBluetoothID;
 	CSimpleStringA strPID;
 	CSimpleStringA strMID;
+	isPinPadMac = true;
 	auto rc = 0;
 	if ((rc = pPinPadClient->Connect()) == Error_Succeed)
 	{
-		//初始错误信息
-		errInfo["errcode"] = "RTA5205";
-		errInfo["msg"] = "调用PinPad发生错误";
-		errInfo["getLastErr"] = GetLastError();
-		pinpadModel = generateJsonStr(errInfo).second.c_str();
-
 		PinPadService_GetDevInfo_Req req = {};
 		PinPadService_GetDevInfo_Ans ans = {};
 
@@ -734,26 +919,69 @@ ErrorCodeEnum CAccessAuthEntity::GetPinPadModel(CSimpleStringA& pinpadModel, boo
 		if (rc == Error_Succeed)
 		{
 			bPinPadOnline = true;
-			nRet = Error_Succeed;
+			nRet = 0;
 			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
 			// 密码键盘ID,PID,8到16字节;  设备ID,MID,8到16字节;  固件版本号,FWID,8字节
-			pinpadModel = ans.model;
+			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;
+						}
+					}
+				}
+			}
 		}
 		else if(rc == Error_NotInit)
 		{
+			if (!HasPinPad())
+				isPinPadMac = false;
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("pinpad NOT INIT!, state: %d", ans.state);
-			strErrMsg = "PinPad打开失败";
-			SetAuthErrMsg(strErrMsg.GetData());
-
-			string outStr = GetOutPutStr("%s%08X%s%s", "GetDevInfo", rc, "strErrMsg", strErrMsg.GetData());
-			m_FSM.doWarnMsg(ERR_ACCESSAUTH_FROM_PINPAD, outStr.c_str());
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5205")(outStr.c_str());
-			return nRet; 
+			return nRet; //此时nRet = -1, pinpad调用失败
 		}
 		else
 		{
+			if (!HasPinPad())
+				isPinPadMac = false;
 			strErrMsg = "调用PinPad实体的GetDevInfo方法失败";
 			SetAuthErrMsg(strErrMsg.GetData());
 
@@ -761,29 +989,15 @@ ErrorCodeEnum CAccessAuthEntity::GetPinPadModel(CSimpleStringA& pinpadModel, boo
 			m_FSM.doWarnMsg(ERR_ACCESSAUTH_FROM_PINPAD, outStr.c_str());
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5205")(outStr.c_str());
 			
-			return nRet;
+			return nRet; //此时nRet = -1, pinpad调用失败
 		}
 
 		pPinPadClient->GetFunction()->CloseSession();
 	}
-	else if (rc == Error_NetBroken)
-	{
-		strErrMsg = "PinPad实体未启动, 连接密码键盘失败";
-		SetAuthErrMsg((const char*)strErrMsg);
-
-		m_FSM.doWarnMsg(ERR_ACCESSAUTH_CONNECT_PINPAD_UNLOAD,
-			GetOutPutStr("%s%08X%s%s", "Connect", rc, "strErrMsg", "PinPad实体未启动, 连接密码键盘失败").c_str());
-		pPinPadClient->SafeDelete();
-
-		errInfo["errcode"] = "RTA5218";
-		errInfo["msg"] = "PinPad实体未启动";
-		errInfo["getLastErr"] = GetLastError();
-		pinpadModel = generateJsonStr(errInfo).second.c_str();
-
-		return nRet; 
-	}
 	else
 	{
+		if (!HasPinPad())
+			isPinPadMac = false;
 		strErrMsg = "连接PinPad实体失败";
 		SetAuthErrMsg((const char*)strErrMsg);
 
@@ -792,16 +1006,39 @@ ErrorCodeEnum CAccessAuthEntity::GetPinPadModel(CSimpleStringA& pinpadModel, boo
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5204")("连接密码键盘异常");
 		pPinPadClient->SafeDelete();
 
-		errInfo["errcode"] = "RTA5204";
-		errInfo["msg"] = "PinPad实体启动成功,但连接PinPad实体失败";
-		errInfo["getLastErr"] = GetLastError();
-		pinpadModel = generateJsonStr(errInfo).second.c_str();
-
 		return nRet; //此时nRet = -1, pinpad调用失败
 	}
 
 	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;
 }
 
@@ -1011,30 +1248,89 @@ bool CAccessAuthEntity::SendInitMKReqACS(CInitlizerMKReq& initMKReq)
 {
 	LOG_FUNCTION();
 	CSmartPointer<IEntityFunction> pFunc = GetFunction();
-	ErrorCodeEnum nRet = Error_Unexpect;
-
-	CBlob encInfo;
-	char* hexStr = "21009872C31CBC00D0C8F421D09CF707";
-	BYTE key[KEY_SIZE] = { 0 };
-	memcpy(key, ConvertHexStrToBytes(hexStr), KEY_SIZE);
-	//char key[KEY_SIZE] = { 0 };
-	//memcpy(key, "1234567890123456234", KEY_SIZE);
-	nRet = (ErrorCodeEnum)m_FSM.GetEncTerminalInfoWithKey(encInfo, key);
-	if (nRet != Error_Succeed)
-	{
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetEncTerminalInfo failed:%d", nRet);
-		return false;
+	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());
+
+	if (nRet < 0)
+	{
+		return false; //具有pinpad的设备调用pinpad失败
 	}
-	char* pTmp = Str2Hex((char*)encInfo.m_pData, encInfo.m_iLength);
-	initMKReq.iniTerminalInfo = pTmp;
+
+	// 从系统获取设备信息和硬件信息	
+	// 变长结构初始化
+	char buf2[512];
+	memset(buf2, 0, 512);
 
 	CSystemStaticInfo si;
 	pFunc->GetSystemStaticInfo(si);
-	initMKReq.terminalVersion = si.InstallVersion.ToString();
-	initMKReq.terminalNo = si.strTerminalID.GetData();
+
+	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))
+	{
+		LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
+			GetOutPutStr("%s%s", "GetTerminalFingerPrint", "False").c_str());
+		return ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT;
+	}
+	initMKReq.terminalCharacter = ConvertBytesToHexStr(fingerPrint, nBufLen);
+
+	if (nRet == 1 || nRet == 3)
+		initMKReq.pinPadID = strPinPadID;
 
 	BYTE xPublicKey[148];
-	int nBufLen = sizeof(xPublicKey);
+	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);
@@ -1042,10 +1338,10 @@ bool CAccessAuthEntity::SendInitMKReqACS(CInitlizerMKReq& initMKReq)
 	{
 		LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_PUBKEY,
 			GetOutPutStr("%s%s", "GetTerminalPublicKey", "False").c_str());
-		return false;
+		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.");
@@ -1071,8 +1367,8 @@ bool CAccessAuthEntity::SendInitMKReqACS(CInitlizerMKReq& initMKReq)
 		errRc = (*pPinPad)(EntityResource::getLink().upgradeLink())->GetCheckCode(req, ans, 10000);
 		if (errRc == Error_Succeed)
 		{
-			initMKReq.curTpkKeyCheck = ans.checkcode[0].GetData();
-			initMKReq.curKeyIndex = ans.index[0].GetData();
+			initMKReq.tpkKeyCheck = ans.checkcode[0].GetData();
+			initMKReq.keyIndex = ans.index[0].GetData();
 		}
 		else
 		{
@@ -1099,7 +1395,7 @@ void CAccessAuthEntity::EndInitMK(DWORD rc, const char *pszErrMsg)
 
 	if (rc != Error_Succeed)
 	{
-		LogWarn(Severity_Middle, Error_Unexpect, rc,
+		LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_FAILED,
 			GetOutPutStr("%s%08X%s%s", "EndInitMK", rc,"pszErrMsg", pszErrMsg).c_str());
 
 		GetFunction()->ShowFatalError(pszErrMsg);
@@ -1283,6 +1579,132 @@ pair<string, string> CAccessAuthEntity::EncryptedByPubKey(CSimpleStringA pubKey,
 	return make_pair(pBlock, strRam);
 }
 
+#ifdef RVC_OS_WIN
+void CAccessAuthEntity::GetTermSysInfo()
+{
+	//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;
+	CSimpleString csInfo, strErrMsg, strRet;
+	CSmartPointer<IConfigInfo> pConfigRun;
+	ErrorCodeEnum eErr = GetFunction()->OpenConfig(Config_Run, pConfigRun);
+	if (eErr == Error_Succeed && pConfigRun->ReadConfigValue("system", "info", csInfo) == Error_Succeed && !csInfo.IsNullOrEmpty()) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("read device info from runcfg: [%s]", csInfo.GetData());
+
+		ZeroMemory(m_btTermSysInfoSM3, sizeof(m_btTermSysInfoSM3));
+		if (!SM3Hash(reinterpret_cast<BYTE*>(const_cast<char*>(csInfo.GetData())), csInfo.GetLength(), m_btTermSysInfoSM3))
+		{
+			strErrMsg = "get sm3 hash as fingerprint fail";
+			SetAuthErrMsg((const char*)strErrMsg);
+			this->GetFunction()->SetSysVar("AuthErrMsg", (const char*)strErrMsg, true);
+			LogWarn(Severity_Middle, Error_Unexpect, ERROR_ACCESSAUTH_GETSM3HASH, (const char*)strErrMsg);
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("GetTerminalFingerPrint")((const char*)strErrMsg);
+			m_iGetTermSysInfo = -1;
+		}
+		else
+		{
+			m_iGetTermSysInfo = 1;
+			bCalcFromRunCfg = true;
+		}
+	}
+	else
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetTermSysInfo, OpenConfig Config_Run error=%d.", eErr);
+
+	ULONGLONG ullStart = GetTickCount64();
+	char szTmp[1024] = {};
+	int nTmpBufLen = 1024;
+	CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
+
+	if (!QueryWMIDevice(Processor, "ProcessorId", szTmp, &nTmpBufLen))
+	{
+		strErrMsg = CSimpleStringA::Format("查询 cpu id 失败: %d, 请尝试重启应用", GetLastError());
+		SetAuthErrMsg((const char*)strErrMsg);
+
+		LogWarn(Severity_Middle, Error_Unexpect,ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT, 
+			GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "Processor", GetLastError()).c_str());
+		
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5203")
+			(GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "Processor", GetLastError()).c_str());
+		if (!bCalcFromRunCfg)
+			m_iGetTermSysInfo = -1;
+		return;
+	}
+	strRet = szTmp;
+
+	nTmpBufLen = 1024;
+	memset(szTmp, 0, sizeof(szTmp));
+	if (!QueryWMIDevice(BaseBoard, "SerialNumber", szTmp, &nTmpBufLen))
+	{
+		strErrMsg = CSimpleStringA::Format("查询 baseboard sn 失败: %d, 请尝试重启应用", GetLastError());
+		SetAuthErrMsg((const char*)strErrMsg);
+
+		LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
+			GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "BaseBoard", GetLastError()).c_str());
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5203")
+			(GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "BaseBoard", GetLastError()).c_str());
+		if (!bCalcFromRunCfg)
+			m_iGetTermSysInfo = -1;
+		return;
+	}
+
+	strRet += "|";
+	strRet += szTmp;
+
+	nTmpBufLen = 1024;
+	memset(szTmp, 0, sizeof(szTmp));
+	if (!QueryWMIDevice(DiskDrive, "SerialNumber", szTmp, &nTmpBufLen))
+	{
+		strErrMsg = CSimpleStringA::Format("查询 harddisk sn 失败: %d, 请尝试重启应用", GetLastError());
+		SetAuthErrMsg((const char*)strErrMsg);
+
+		LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
+			GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "DiskDrive", GetLastError()).c_str());
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "DiskDrive", GetLastError()).c_str());
+		if (!bCalcFromRunCfg)
+			m_iGetTermSysInfo = -1;
+		return;
+	}
+
+	strRet += "|";
+	strRet += szTmp;
+
+	if (!bCalcFromRunCfg || 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"
+			, csInfo.GetData(), strRet.GetData(), eErr);
+	}
+	else
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("device info: [%s]", strRet.GetData());
+
+	
+	if (!bCalcFromRunCfg)
+	{
+		ZeroMemory(m_btTermSysInfoSM3, sizeof(m_btTermSysInfoSM3));
+		if (!SM3Hash(reinterpret_cast<BYTE*>(const_cast<char*>(strRet.GetData())), strRet.GetLength(), m_btTermSysInfoSM3))
+		{
+			strErrMsg = "get sm3 hash as fingerprint fail";
+			SetAuthErrMsg((const char*)strErrMsg);
+			spFunction->SetSysVar("AuthErrMsg", (const char*)strErrMsg, true);
+			m_FSM.doWarnMsg(ERROR_ACCESSAUTH_GETSM3HASH, (const char*)strErrMsg);
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)((const char*)strErrMsg);
+			m_iGetTermSysInfo = -1;
+		}
+		else
+			m_iGetTermSysInfo = 1;
+	}
+	ULONGLONG ullEnd = GetTickCount64();
+	if (ullEnd - ullStart > 5000)
+	{
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5201")
+			("获取系统信息耗时过长:%d秒", (ullEnd - ullStart) / 1000);
+		LogWarn(Severity_Middle, Error_Unexpect, AccessAuthorization_UserErrorCode_GetTermCostTooLong, 
+			CSimpleStringA::Format("获取系统信息耗时过长:%d秒", (ullEnd - ullStart) / 1000));
+	}
+	return;
+}
+#endif // RVC_OS_WIN
+
 SP_BEGIN_ENTITY_MAP()
 	SP_ENTITY(CAccessAuthEntity)
 SP_END_ENTITY_MAP()

+ 7 - 7
Module/mod_accessauth/mod_AccessAuth.h

@@ -8,9 +8,6 @@ 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);
 
@@ -92,8 +89,8 @@ public:
 	// 保存会话密钥
 	bool SaveAuthKey(BYTE* pKey);
 
-	// 调用指定密钥加密
-	ErrorCodeEnum EncryptDataWithKey(const CBlob& raw, CBlob& enc, BYTE* key);
+	// 调用准入会话密钥加密
+	ErrorCodeEnum EncryptDataWithSessionKey(const CBlob& raw, CBlob& enc);
 
 	bool GetTerminalFingerPrint(BYTE* pBuf, int& nBufLen);
 	bool GetTerminalPublicKey(BYTE* pBuf, int& nBufLen, string& pubkey);
@@ -101,8 +98,10 @@ public:
 	void SetAuthErrMsg(const char* pszErrMsg) { m_strAuthErrMsg = pszErrMsg; }
 	const char* GetAuthErrMsg() { return m_strAuthErrMsg; }
 
-	// 获取密码键盘szModel
-	ErrorCodeEnum GetPinPadModel(CSimpleStringA& pinpadModel, bool& bPinPadOnline);
+	// 获取密码键盘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);
 
 	// 设置时区
 	wstring ANSIToUnicode(const string& str);
@@ -131,6 +130,7 @@ public:
 	SpReqAnsContext<AccessAuthService_InitializeNew_Req, AccessAuthService_InitializeNew_Ans>::Pointer m_ctx;
 	pair<string, string> GenerateTmkToKMC();
 	pair<string, string> EncryptedByPubKey(CSimpleStringA pubKey, bool bNeed04Head = false);
+	void GetTermSysInfo();
 
 	CSimpleStringA m_publicKey;
 	CSimpleStringA m_privateKey;

+ 7 - 1
Module/mod_pinpad/mod_PinPad.h

@@ -181,7 +181,13 @@ public:
 			ErrorCodeEnum eGetDevInfo = m_fsm.GetDevInfo(devInfo);
 			if (eGetDevInfo == Error_Succeed)
 			{
-				ctx->Ans.model = devInfo.szModel;
+				//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.type = devInfo.szType;
 			}
 			ctx->Ans.state = eGetDevInfo;

+ 2 - 2
Module/mod_vtmloader/VtmLoaderFSM.cpp

@@ -411,7 +411,7 @@ void CVtmLoaderFSM::s1_on_entry()
 			if (errCode != Error_Succeed) {
 				CSimpleStringA tmpAuthErrMsg("");
 				if (GetEntityBase()->GetFunction()->GetSysVar("AuthErrMsg", tmpAuthErrMsg) == Error_Succeed && tmpAuthErrMsg.IsNullOrEmpty())
-					GetEntityBase()->GetFunction()->SetSysVar("AuthErrMsg", CSimpleStringA::Format("%s 启动失败", it->first.GetData()).GetData());
+					GetEntityBase()->GetFunction()->SetSysVar("AuthErrMsg", CSimpleStringA::Format("%s 启动失败,请尝试重启应用或重启系统恢复", it->first.GetData()).GetData());
 				if (it->first.Compare("SIPPhone") == 0)
 					m_bSIPPhoneStartFail = true;
 
@@ -559,7 +559,7 @@ void CVtmLoaderFSM::s2_on_entry()
 			{
 				CSimpleStringA tmpAuthErrMsg("");
 				if (GetEntityBase()->GetFunction()->GetSysVar("AuthErrMsg", tmpAuthErrMsg) == Error_Succeed && tmpAuthErrMsg.IsNullOrEmpty())
-					GetEntityBase()->GetFunction()->SetSysVar("AuthErrMsg", CSimpleStringA::Format("%s 启动失败", it->first.GetData()).GetData());
+					GetEntityBase()->GetFunction()->SetSysVar("AuthErrMsg", CSimpleStringA::Format("%s 启动失败,请尝试重启应用或重启系统恢复", it->first.GetData()).GetData());
 				if (it->first.Compare("SIPPhone") == 0)
 					m_bSIPPhoneStartFail = true;
 				DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("启动失败:%s", it->first.GetData());