|
@@ -3,7 +3,7 @@
|
|
|
#include "mod_AccessAuth.h"
|
|
|
#include "GetDevInfoHelper.h"
|
|
|
#include "comm.h"
|
|
|
-
|
|
|
+#include "access_basefun.h"
|
|
|
#ifdef RVC_OS_WIN
|
|
|
#pragma comment(lib, "crypt32.lib")
|
|
|
#include <windows.h>
|
|
@@ -14,7 +14,18 @@
|
|
|
using namespace std;
|
|
|
|
|
|
#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
|
|
|
-
|
|
|
+//oiltest need to public function
|
|
|
+int HexBuf2StrBuf(PBYTE hexBuf, char** strBuf, DWORD len)
|
|
|
+{
|
|
|
+ char* tmpStr = *strBuf;
|
|
|
+ int count = 0;
|
|
|
+ for (int i = 0; i < len; ++i)
|
|
|
+ {
|
|
|
+ sprintf(tmpStr + count, "%0.2X", hexBuf[i]);
|
|
|
+ count += 2;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
CAccessAuthConn::CAccessAuthConn(CEntityBase *pEntity, CAccessAuthFSM *pFSM)
|
|
|
:SpSecureClient(pEntity), m_pFSM(pFSM)
|
|
|
{
|
|
@@ -34,7 +45,7 @@ void CAccessAuthConn::OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg)
|
|
|
LOG_FUNCTION();
|
|
|
string serviceCode = pRecvPkg->GetServiceCode();
|
|
|
Dbg("serviceCode=%s",serviceCode.c_str());
|
|
|
- if (serviceCode == "KMCKey")
|
|
|
+ if (serviceCode == "UpdateWK")
|
|
|
{
|
|
|
HandleUpdateWKRet(pRecvPkg);
|
|
|
}
|
|
@@ -79,8 +90,7 @@ void CAccessAuthConn::OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg)
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- LogWarn(Severity_Middle,Error_Unexpect, ERR_ACCESSAUTH_UNKOWN,
|
|
|
- GetOutPutStr("%s%s","UnKown", serviceCode.c_str()).c_str());
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_UNKOWN, GetOutPutStr("%s%s", "UnKown", serviceCode.c_str()));
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -88,14 +98,14 @@ DWORD CAccessAuthConn::HandleUpdateWKRet(const CSmartPointer<IPackage> &pRecvPkg
|
|
|
{
|
|
|
|
|
|
LOG_FUNCTION();
|
|
|
- DWORD rc = Error_Succeed;
|
|
|
+ DWORD rc = Error_Unexpect;
|
|
|
DWORD dwSysCode, dwUserCode;
|
|
|
string strErrMsg;
|
|
|
auto pEntity = (CAccessAuthEntity*)m_pEntity;
|
|
|
if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
|
|
|
{
|
|
|
rc = dwUserCode;
|
|
|
- ((CAccessAuthEntity*)m_pEntity)->WarnAuthErrMsg(rc, rc, strErrMsg);
|
|
|
+ m_pFSM->doWarnMsg(rc, GetOutPutStr("%s%08x%s%s", "GetErrMsg", rc, "strErrMsg", strErrMsg));
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -144,7 +154,8 @@ DWORD CAccessAuthConn::HandleReqTokenRet(const CSmartPointer<IPackage> &pRecvPkg
|
|
|
{
|
|
|
rc = dwUserCode;
|
|
|
((CAccessAuthEntity*)m_pEntity)->SetAuthErrMsg(strErrMsg.c_str());
|
|
|
- ((CAccessAuthEntity*)m_pEntity)->WarnAuthErrMsg(rc, rc, strErrMsg, true);
|
|
|
+ m_pFSM->doWarnMsg(rc, strErrMsg);
|
|
|
+ if (rc == 0) rc = ERR_ACCESSAUTH_TOKEN_HASH;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -179,10 +190,7 @@ DWORD CAccessAuthConn::HandleReqTokenRet(const CSmartPointer<IPackage> &pRecvPkg
|
|
|
rc = Error_Bug;
|
|
|
|
|
|
((CAccessAuthEntity*)m_pEntity)->SetAuthErrMsg("返回令牌校验不通过");
|
|
|
- spFunction->SetSysVar("AuthErrMsg", "返回令牌校验不通过", false);
|
|
|
-
|
|
|
- LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_TOKEN_HASH,
|
|
|
- GetOutPutStr("%s%s", "Hash", "返回令牌校验不通过").c_str());
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_TOKEN_HASH, GetOutPutStr("%s%s", "Hash", "返回令牌校验不通过"));
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -195,27 +203,19 @@ DWORD CAccessAuthConn::HandleReqTokenRet(const CSmartPointer<IPackage> &pRecvPkg
|
|
|
CBlob sharedSK;
|
|
|
sharedSK.Alloc(16);
|
|
|
memcpy(sharedSK.m_pData, ret.sharedSK, 16);
|
|
|
- //@test
|
|
|
-
|
|
|
rc = ((CAccessAuthEntity*)m_pEntity)->SaveTokenAndSharedSK(token, sharedSK);
|
|
|
if (rc != Error_Succeed)
|
|
|
{
|
|
|
((CAccessAuthEntity*)m_pEntity)->SetAuthErrMsg("保存令牌失败");
|
|
|
- spFunction->SetSysVar("AuthErrMsg", "保存令牌失败", false);
|
|
|
-
|
|
|
- LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_SAVE_TOKEN,
|
|
|
- GetOutPutStr("%s%08X", "SaveTokenAndSharedSK", rc).c_str());
|
|
|
- }
|
|
|
-
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_SAVE_TOKEN, GetOutPutStr("%s%08X", "SaveTokenAndSharedSK", rc), "保存令牌失败");
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
rc = Error_Bug;
|
|
|
- ((CAccessAuthEntity*)m_pEntity)->SetAuthErrMsg("返回令牌数据非法");
|
|
|
- spFunction->SetSysVar("AuthErrMsg", "返回令牌数据非法", false);
|
|
|
- LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_TOKEN,
|
|
|
- GetOutPutStr("%s%d", "nRetLen", nRetLen).c_str());
|
|
|
+ ((CAccessAuthEntity*)m_pEntity)->SetAuthErrMsg("返回令牌数据非法");
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_TOKEN, GetOutPutStr("%s%d", "nRetLen", nRetLen), "返回令牌数据非法");
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -231,7 +231,7 @@ DWORD CAccessAuthConn::HandleTermExitRet(const CSmartPointer<IPackage> &pRecvPkg
|
|
|
if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
|
|
|
{
|
|
|
rc = (ErrorCodeEnum)dwSysCode;
|
|
|
- ((CAccessAuthEntity*)m_pEntity)->WarnAuthErrMsg(rc, ERR_ACCESSAUTH_TERM_EXIT, strErrMsg);
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_TERM_EXIT, GetOutPutStr("%s%08X%s%s", "GetErrMsg", dwSysCode, "strErrMsg", strErrMsg.c_str()));
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
@@ -246,7 +246,7 @@ DWORD CAccessAuthConn::HandleReportStageRet(const CSmartPointer<IPackage> &pRecv
|
|
|
if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
|
|
|
{
|
|
|
rc = (ErrorCodeEnum)dwSysCode;
|
|
|
- ((CAccessAuthEntity*)m_pEntity)->WarnAuthErrMsg(rc, ERR_ACCESSAUTH_REPORT_STATE, strErrMsg);
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_REPORT_STATE, GetOutPutStr("%s%08X%s%s", "GetErrMsg", dwSysCode, "strErrMsg", strErrMsg.c_str()));
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
@@ -279,7 +279,8 @@ DWORD CAccessAuthConn::SendGetTokenPackage()
|
|
|
CSmartPointer<IPackage> package = CreateNewPackage("ReqToken");
|
|
|
// 获取外设及PinPadID
|
|
|
CSimpleStringA strPinPadID = "", strDeviceID = "";
|
|
|
- int nRet = ((CAccessAuthEntity*)m_pEntity)->GetPinPadIDAndDeviceID(strPinPadID, strDeviceID);
|
|
|
+ bool bHasPinPad = false;
|
|
|
+ int nRet = ((CAccessAuthEntity*)m_pEntity)->GetPinPadIDAndDeviceID(strPinPadID, strDeviceID, bHasPinPad);
|
|
|
Dbg("GetPinPadIDAndDeviceID ret: %d, PinPadID: %s, DeviceID: %s", nRet, (const char*)strPinPadID, (const char*)strDeviceID);
|
|
|
std::regex pattern(".+-[Ff][Ww][Bb]-.+");
|
|
|
if (std::regex_match(strDeviceID.GetData(), pattern))
|
|
@@ -401,8 +402,7 @@ DWORD CAccessAuthConn::SendGetTokenPackage()
|
|
|
//ts = "A";
|
|
|
if (rc != Error_Succeed)
|
|
|
{
|
|
|
- LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_SYS_VAR,
|
|
|
- GetOutPutStr("%s%08X%s%s", "GetSysVar", rc,"TerminalStage",ts).c_str());
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_GET_SYS_VAR, GetOutPutStr("%s%08X%s%s", "GetSysVar", rc, "TerminalStage", ts));
|
|
|
return ERR_ACCESSAUTH_GET_SYS_VAR;
|
|
|
}
|
|
|
assert(ts.GetLength() >=1);
|
|
@@ -414,8 +414,7 @@ DWORD CAccessAuthConn::SendGetTokenPackage()
|
|
|
//rs = "O";
|
|
|
if (rc != Error_Succeed)
|
|
|
{
|
|
|
- LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_SYS_VAR,
|
|
|
- GetOutPutStr("%s%08X%s%s", "GetSysVar", rc,"RunState", rs).c_str());
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_GET_SYS_VAR, GetOutPutStr("%s%08X%s%s", "GetSysVar", rc, "RunState", rs));
|
|
|
return ERR_ACCESSAUTH_GET_SYS_VAR;
|
|
|
}
|
|
|
assert(rs.GetLength() >=1);
|
|
@@ -453,8 +452,7 @@ DWORD CAccessAuthConn::SendGetTokenPackage()
|
|
|
|
|
|
if (rc != Error_Succeed)
|
|
|
{
|
|
|
- LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_ENCRYPT_KEY,
|
|
|
- GetOutPutStr("%s%08X", "CryptEncrypt", rc).c_str());
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_ENCRYPT_KEY, GetOutPutStr("%s%08X", "CryptEncrypt", rc));
|
|
|
return ERR_ACCESSAUTH_ENCRYPT_KEY;
|
|
|
}
|
|
|
|
|
@@ -468,12 +466,8 @@ DWORD CAccessAuthConn::SendGetTokenPackage()
|
|
|
rc = SpGetAllDevices(m_pEntity, devNames);
|
|
|
if (rc != Error_Succeed)
|
|
|
{
|
|
|
- ((CAccessAuthEntity*)m_pEntity)->SetAuthErrMsg("从root.ini获取终端设备信息失败");
|
|
|
- spFunction->SetSysVar("AuthErrMsg", "从root.ini获取终端设备信息失败", false);
|
|
|
-
|
|
|
- LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_READ_WRITE_CONFIG_FILE,
|
|
|
- GetOutPutStr("%s%08X", "SpGetAllDevices", rc).c_str());
|
|
|
-
|
|
|
+ ((CAccessAuthEntity*)m_pEntity)->SetAuthErrMsg("从root.ini获取终端设备信息失败");
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_READ_WRITE_CONFIG_FILE, GetOutPutStr("%s%08X", "SpGetAllDevices", rc));
|
|
|
return ERR_ACCESSAUTH_READ_WRITE_CONFIG_FILE;
|
|
|
}
|
|
|
|
|
@@ -543,12 +537,8 @@ DWORD CAccessAuthConn::SendGetTokenPackage()
|
|
|
strncpy(req3.szSignCertHash, strHash1, 40);
|
|
|
Dbg("spshell hash value=%s",req3.szSignCertHash);
|
|
|
}
|
|
|
-
|
|
|
else
|
|
|
- {
|
|
|
- LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_SPSHELL_HASH,
|
|
|
- GetOutPutStr("%s%s", "GetSpBaseSignCertHash", "False").c_str());
|
|
|
- }
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_GET_SPSHELL_HASH, GetOutPutStr("%s%s", "GetSpBaseSignCertHash", "False"));
|
|
|
}
|
|
|
|
|
|
CSimpleStringA strHash2;
|
|
@@ -563,8 +553,7 @@ DWORD CAccessAuthConn::SendGetTokenPackage()
|
|
|
int nBufLen = sizeof(fingerPrint);
|
|
|
if (!pEntity->GetTerminalFingerPrint(fingerPrint, nBufLen))
|
|
|
{
|
|
|
- LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
|
|
|
- GetOutPutStr("%s%s", "GetTerminalFingerPrint", "False").c_str());
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT, GetOutPutStr("%s%s", "GetTerminalFingerPrint", "False"));
|
|
|
return ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT;
|
|
|
}
|
|
|
memcpy(req3.FingerPrint, fingerPrint, 16);
|
|
@@ -582,8 +571,7 @@ DWORD CAccessAuthConn::SendGetTokenPackage()
|
|
|
memset(req3.PublicKey,0,nBufLen);
|
|
|
if (!pEntity->GetTerminalPublicKey(req3.PublicKey, nBufLen))
|
|
|
{
|
|
|
- LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_PUBKEY,
|
|
|
- GetOutPutStr("%s%s", "GetTerminalPublicKey", "False").c_str());
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_GET_TERMINAL_PUBKEY, GetOutPutStr("%s%s", "GetTerminalPublicKey", "False"));
|
|
|
return ERR_ACCESSAUTH_GET_TERMINAL_PUBKEY;
|
|
|
}
|
|
|
}
|
|
@@ -594,12 +582,14 @@ DWORD CAccessAuthConn::SendGetTokenPackage()
|
|
|
{
|
|
|
RequestTokenReq4 req4 = {};
|
|
|
strncpy(req4.szPinPadID, (const char*)strPinPadID, sizeof(req4.szPinPadID) - 1);
|
|
|
+ strncpy(req4.terminalNo, si.strTerminalID.GetData(), sizeof(req4.terminalNo) - 1);
|
|
|
package->AddStruct("TOKEN_R4", false, false, (BYTE*)&req4, sizeof(req4));
|
|
|
}
|
|
|
|
|
|
RequestTokenReq5 req5 = {};
|
|
|
// 获取密码键盘链接状态
|
|
|
- if (((CAccessAuthEntity*)m_pEntity)->HasPinPad())
|
|
|
+ //if (((CAccessAuthEntity*)m_pEntity)->HasPinPad())
|
|
|
+ if (bHasPinPad)
|
|
|
{
|
|
|
req5.chExistPinPad = '1';
|
|
|
Dbg("has pinpad");
|
|
@@ -814,8 +804,7 @@ bool CAccessAuthConn::GetUKeyRootCertHash(CSimpleStringA &strHash)
|
|
|
if(!hFile.is_open())
|
|
|
#endif
|
|
|
{
|
|
|
- LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_READ_WRITE_CONFIG_FILE,
|
|
|
- GetOutPutStr("%s%s%s%s", "open", "false","strPath", strPath.GetData()).c_str());
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_READ_WRITE_CONFIG_FILE, GetOutPutStr("%s%s%s", "读写config配置文件错误", "strPath", strPath).c_str());
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -828,8 +817,7 @@ bool CAccessAuthConn::GetUKeyRootCertHash(CSimpleStringA &strHash)
|
|
|
if(hFile >> data)
|
|
|
{
|
|
|
#endif
|
|
|
- LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_READ_WRITE_CONFIG_FILE,
|
|
|
- GetOutPutStr("%s%s", "ReadFile", "False").c_str());
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_READ_WRITE_CONFIG_FILE,GetOutPutStr("%s%s", "读写config配置文件错误", "False").c_str());
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -859,11 +847,7 @@ bool CAccessAuthConn::GetUKeyRootCertHash(CSimpleStringA &strHash)
|
|
|
|
|
|
}
|
|
|
else
|
|
|
- {
|
|
|
-
|
|
|
- LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_HASH,
|
|
|
- GetOutPutStr("%s%s", "Sha1Hash", "False").c_str());
|
|
|
- }
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_GET_HASH, GetOutPutStr("%s%s", "Sha1Hash", "False").c_str());
|
|
|
}
|
|
|
#ifdef RVC_OS_WIN
|
|
|
CloseHandle(hFile);
|
|
@@ -950,8 +934,8 @@ DWORD CAccessAuthConn::SendSyncTimePackageNew()
|
|
|
if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
|
|
|
{
|
|
|
rc = dwUserCode;
|
|
|
- ((CAccessAuthEntity*)m_pEntity)->WarnAuthErrMsg(rc, rc, strErrMsg);
|
|
|
- }
|
|
|
+ m_pFSM->doWarnMsg(dwUserCode, GetOutPutStr("%s%08X%s%s", "GetErrMsg", dwUserCode, "strErrMsg", strErrMsg.c_str()).c_str());
|
|
|
+ }
|
|
|
else
|
|
|
{
|
|
|
int nRetLen = pRecvPkg->GetStructLen("SYNC_A1");
|
|
@@ -982,8 +966,7 @@ DWORD CAccessAuthConn::SendSyncTimePackageNew()
|
|
|
Dbg("sync time with server succeed, server time: [%s]", (const char*)dtServerTime.ToTimeString());
|
|
|
else
|
|
|
{
|
|
|
- LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_SET_LOCALE_TIME,
|
|
|
- GetOutPutStr("%s%s", "stServerTime", dtServerTime.ToTimeString()).c_str());
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_SET_LOCALE_TIME, GetOutPutStr("%s%s", "stServerTime", dtServerTime.ToTimeString()).c_str());
|
|
|
rc = ERR_ACCESSAUTH_SET_LOCALE_TIME;
|
|
|
}
|
|
|
}
|
|
@@ -995,8 +978,7 @@ DWORD CAccessAuthConn::SendSyncTimePackageNew()
|
|
|
else
|
|
|
{
|
|
|
|
|
|
- LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_SYNC_TIME,
|
|
|
- GetOutPutStr("%s%d", "GetStructLen", nRetLen).c_str());
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_SYNC_TIME, GetOutPutStr("%s%d", "GetStructLen", nRetLen).c_str());
|
|
|
rc = ERR_ACCESSAUTH_SYNC_TIME;
|
|
|
}
|
|
|
}
|
|
@@ -1016,8 +998,8 @@ DWORD CAccessAuthConn::HandleSyncTimeRet(const CSmartPointer<IPackage> &pRecvPkg
|
|
|
if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
|
|
|
{
|
|
|
rc = dwUserCode;
|
|
|
- ((CAccessAuthEntity*)m_pEntity)->SetAuthErrMsg(strErrMsg.c_str());
|
|
|
- ((CAccessAuthEntity*)m_pEntity)->WarnAuthErrMsg(rc, rc, strErrMsg);
|
|
|
+ m_pFSM->doWarnMsg(rc, GetOutPutStr("%s%08X%s%s", "GetErrMsg", rc,"strErrMsg", strErrMsg.c_str()).c_str());
|
|
|
+
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -1049,9 +1031,7 @@ DWORD CAccessAuthConn::HandleSyncTimeRet(const CSmartPointer<IPackage> &pRecvPkg
|
|
|
Dbg("sync time with server succeed, server time: [%s]", (const char*)dtServerTime.ToTimeString());
|
|
|
else
|
|
|
{
|
|
|
- LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_SET_LOCALE_TIME,
|
|
|
- GetOutPutStr("%s%s", "stServerTime", dtServerTime.ToTimeString()).c_str());
|
|
|
- ((CAccessAuthEntity*)m_pEntity)->SetAuthErrMsg("设置本地时间失败");
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_SET_LOCALE_TIME, GetOutPutStr("%s%s", "设置本地时间错误", dtServerTime.ToTimeString()).c_str());
|
|
|
rc = ERR_ACCESSAUTH_SET_LOCALE_TIME;
|
|
|
}
|
|
|
}
|
|
@@ -1069,20 +1049,21 @@ DWORD CAccessAuthConn::HandleSyncTimeRet(const CSmartPointer<IPackage> &pRecvPkg
|
|
|
pEntity->SetAuthErrMsg("时间同步时,获取准入加密版本错误,请先进行密钥初始化");
|
|
|
}
|
|
|
else {
|
|
|
- ((CAccessAuthEntity*)m_pEntity)->SaveAuthVerAndKey(ret.nAuthVersion, ret.SessionKey);
|
|
|
+ bool saveRet = ((CAccessAuthEntity*)m_pEntity)->SaveAuthVerAndKey(ret.nAuthVersion, ret.SessionKey);
|
|
|
+ if (!saveRet) {
|
|
|
+ Dbg("SaveAuthVerAndKey faild.");
|
|
|
+ rc = ERR_ACCESSAUTH_SYNC_TIME;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_SYNC_TIME,
|
|
|
- GetOutPutStr("%s%d", "GetStructLen", nRetLen).c_str());
|
|
|
- ((CAccessAuthEntity*)m_pEntity)->SetAuthErrMsg("未返回数据,同步时间失败");
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_SYNC_TIME, GetOutPutStr("%s%d", "时间同步错误", nRetLen).c_str());
|
|
|
rc = ERR_ACCESSAUTH_SYNC_TIME;
|
|
|
}
|
|
|
}
|
|
|
+ m_pFSM->PostEventFIFO(new FSMEvent(rc == Error_Succeed ? CAccessAuthFSM::Event_EndSyncTime : CAccessAuthFSM::Event_CheckMD5Fail));
|
|
|
|
|
|
- auto pEvent = new FSMEvent(rc == Error_Succeed?CAccessAuthFSM::Event_EndSyncTime: CAccessAuthFSM::Event_SyncTimeFailed);
|
|
|
- m_pFSM->PostEventFIFO(pEvent);
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
@@ -1093,18 +1074,22 @@ DWORD CAccessAuthConn::SendInitDevicePackage(SpReqAnsContext<AccessAuthService_I
|
|
|
InitDeviceReq req;
|
|
|
memset(&req, 0, sizeof(req));
|
|
|
|
|
|
- strncpy(req.CR1, (const char*)ctx->Req.EncR1, sizeof(req.CR1));
|
|
|
+ strncpy(req.vtmCR1, (const char*)ctx->Req.EncR1, sizeof(req.vtmCR1));
|
|
|
strncpy(req.R2, (const char*)ctx->Req.R2, sizeof(req.R2));
|
|
|
- strncpy(req.CR3, (const char*)ctx->Req.EncR3, sizeof(req.CR3));
|
|
|
+ strncpy(req.vtmCR3, (const char*)ctx->Req.EncR3, sizeof(req.vtmCR3));
|
|
|
strncpy(req.CDevPubKey, (const char*)ctx->Req.EncDevPubKey, sizeof(req.CDevPubKey));
|
|
|
strncpy(req.Verdor, (const char*)ctx->Req.Vendor, sizeof(req.Verdor));
|
|
|
|
|
|
CSmartPointer<IPackage> package = CreateNewPackage("InitDev");
|
|
|
package->AddStruct("InitDevR", false, false, (BYTE*)&req, sizeof(req));
|
|
|
+
|
|
|
+ InitDeviceReq0 req0;
|
|
|
+ req0.isSM = 1;
|
|
|
+ package->AddStruct("SMSyn", false, false, (BYTE*)& req0, sizeof(req0));
|
|
|
+
|
|
|
if (SendPackage(package) == "")
|
|
|
{
|
|
|
- LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_INIT_DEV_SEND_PKG,
|
|
|
- GetOutPutStr("%s%s", "SendInitDevicePackage", "").c_str());
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_INIT_DEV_SEND_PKG, GetOutPutStr("%s%s", "发送初始化设备数据包失败", "").c_str());
|
|
|
return ERR_ACCESSAUTH_INIT_DEV_SEND_PKG;
|
|
|
}
|
|
|
else
|
|
@@ -1125,7 +1110,8 @@ DWORD CAccessAuthConn::HandleInitDeviceRet(const CSmartPointer<IPackage> &pRecvP
|
|
|
if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
|
|
|
{
|
|
|
rc = (ErrorCodeEnum)dwSysCode;
|
|
|
- ((CAccessAuthEntity*)m_pEntity)->WarnAuthErrMsg(rc, ERR_ACCESSAUTH_INIT_DEV, strErrMsg);
|
|
|
+
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_INIT_DEV, GetOutPutStr("%s%08X%s%s", "初始化设备错误", rc,"strErrMsg", strErrMsg.c_str()).c_str());
|
|
|
}
|
|
|
else if (m_ctxInitDev == NULL)
|
|
|
{
|
|
@@ -1154,8 +1140,7 @@ DWORD CAccessAuthConn::HandleInitDeviceRet(const CSmartPointer<IPackage> &pRecvP
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_INIT_DEV,
|
|
|
- GetOutPutStr("%s%d", "GetStructLen", nRetLen).c_str());
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_INIT_DEV, GetOutPutStr("%s%d", "GetStructLen", nRetLen).c_str());
|
|
|
rc = Error_Bug;
|
|
|
}
|
|
|
}
|
|
@@ -1199,9 +1184,9 @@ DWORD CAccessAuthConn::HandleReportStateRet(const CSmartPointer<IPackage> &pRecv
|
|
|
if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
|
|
|
{
|
|
|
rc = dwUserCode;
|
|
|
- ((CAccessAuthEntity*)m_pEntity)->WarnAuthErrMsg(rc, rc, strErrMsg);
|
|
|
+ m_pFSM->doWarnMsg(rc, strErrMsg);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
@@ -1215,8 +1200,7 @@ DWORD CAccessAuthConn::SendLockStatePackage()
|
|
|
DWORD rc = pFunc->GetSystemStaticInfo(info);
|
|
|
if (rc != Error_Succeed)
|
|
|
{
|
|
|
- LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_SYSTEM_STATIC_INFO,
|
|
|
- GetOutPutStr("%s%08X", "GetSystemStaticInfo", rc).c_str());
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_GET_SYSTEM_STATIC_INFO, GetOutPutStr("%s%08X", "GetSystemStaticInfo", rc).c_str());
|
|
|
return ERR_ACCESSAUTH_GET_SYSTEM_STATIC_INFO;
|
|
|
}
|
|
|
strncpy(req.TerminalNo, (const char*)info.strTerminalID, sizeof(req.TerminalNo)-1);
|
|
@@ -1225,8 +1209,7 @@ DWORD CAccessAuthConn::SendLockStatePackage()
|
|
|
pkt->AddStruct("LockStateReq", false, false, (LPBYTE)&req, sizeof(LockStateReq));
|
|
|
if (SendPackage(pkt) == "")
|
|
|
{
|
|
|
- LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_LOCK_SEND_PKG,
|
|
|
- GetOutPutStr("%s%08X", "SendLockStatePackage", Error_Unexpect).c_str());
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_LOCK_SEND_PKG, GetOutPutStr("%s%08X", "SendLockStatePackage", Error_Unexpect).c_str());
|
|
|
return ERR_ACCESSAUTH_LOCK_SEND_PKG;
|
|
|
}
|
|
|
else
|
|
@@ -1247,7 +1230,11 @@ DWORD CAccessAuthConn::HandleLockStateRet(const CSmartPointer<IPackage> &pRecvPk
|
|
|
{
|
|
|
rc = dwUserCode;
|
|
|
((CAccessAuthEntity*)m_pEntity)->SetAuthErrMsg(strErrMsg.c_str());
|
|
|
- ((CAccessAuthEntity*)m_pEntity)->WarnAuthErrMsg(rc, rc, strErrMsg, true);
|
|
|
+ CSmartPointer<IEntityFunction> spFunction = m_pEntity->GetFunction();
|
|
|
+ spFunction->SetSysVar("AuthErrMsg", strErrMsg.c_str(), true);
|
|
|
+
|
|
|
+ m_pFSM->doWarnMsg(rc, GetOutPutStr("%s%08X%s%s", "GetErrMsg", rc,"AuthErrMsg", strErrMsg.c_str()).c_str());
|
|
|
+
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
@@ -1279,16 +1266,14 @@ DWORD CAccessAuthConn::HandleLockStateRet(const CSmartPointer<IPackage> &pRecvPk
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_LOCK_STATE,
|
|
|
- GetOutPutStr("%s%s", "GetStructLen", "False").c_str());
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_LOCK_STATE, GetOutPutStr("%s%s", "GetStructLen", "False").c_str());
|
|
|
return ERR_ACCESSAUTH_LOCK_STATE;
|
|
|
}
|
|
|
delete pBuf;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_LOCK_STATE,
|
|
|
- GetOutPutStr("%s%s%s%d", "GetStructData", "False","nLen", nLen).c_str());
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_LOCK_STATE, GetOutPutStr("%s%s%s%d", "GetStructData", "False","nLen", nLen).c_str());
|
|
|
return ERR_ACCESSAUTH_LOCK_STATE;
|
|
|
}
|
|
|
|
|
@@ -1348,8 +1333,8 @@ DWORD CAccessAuthConn::HandleCheckMD5Ret(const CSmartPointer<IPackage> &pRecvPkg
|
|
|
if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
|
|
|
{
|
|
|
rc = (ErrorCodeEnum)dwSysCode;
|
|
|
- ((CAccessAuthEntity*)m_pEntity)->SetAuthErrMsg(strErrMsg.c_str());
|
|
|
- ((CAccessAuthEntity*)m_pEntity)->WarnAuthErrMsg(rc, rc, strErrMsg, true);
|
|
|
+ m_pFSM->doWarnMsg(dwUserCode, strErrMsg);
|
|
|
+ CSmartPointer<IEntityFunction> spFunction = m_pEntity->GetFunction();
|
|
|
}
|
|
|
|
|
|
m_pFSM->PostEventFIFO(new FSMEvent(rc==Error_Succeed ? CAccessAuthFSM::Event_CheckMD5Succ:CAccessAuthFSM::Event_CheckMD5Fail));
|
|
@@ -1366,11 +1351,509 @@ DWORD CAccessAuthConn::HandleUpdateMD5Ret(const CSmartPointer<IPackage> &pRecvPk
|
|
|
if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
|
|
|
{
|
|
|
rc = (ErrorCodeEnum)dwSysCode;
|
|
|
- ((CAccessAuthEntity*)m_pEntity)->SetAuthErrMsg(strErrMsg.c_str());
|
|
|
- ((CAccessAuthEntity*)m_pEntity)->WarnAuthErrMsg(rc, rc, strErrMsg, true);
|
|
|
+ m_pFSM->doWarnMsg(dwUserCode, strErrMsg);
|
|
|
+ CSmartPointer<IEntityFunction> spFunction = m_pEntity->GetFunction();
|
|
|
}
|
|
|
|
|
|
m_pFSM->PostEventFIFO(new FSMEvent(rc==Error_Succeed ? CAccessAuthFSM::Event_CheckMD5Succ:CAccessAuthFSM::Event_CheckMD5Fail));
|
|
|
|
|
|
+ return rc;
|
|
|
+}
|
|
|
+DWORD CAccessAuthConn::HandleTimeSyn(int nTimeDiff,BYTE nAuthVersion,BYTE* nSessionKey) {
|
|
|
+ // 比较终端和服务器时间, 时差小于3分钟不纠正
|
|
|
+ DWORD dwTimeDiff = nTimeDiff;
|
|
|
+ if (dwTimeDiff > 180)
|
|
|
+ {
|
|
|
+ Dbg("time diff is too large (%ds), sync time now", dwTimeDiff);
|
|
|
+
|
|
|
+ CSmallDateTime dtServerTime(CSmallDateTime::GetNow() + dwTimeDiff);
|
|
|
+ SYSTEMTIME stServerTime = dtServerTime.ToSystemTime();
|
|
|
+#ifdef RVC_OS_WIN
|
|
|
+ if (SetLocalTime(&stServerTime))
|
|
|
+#else
|
|
|
+ if (set_system_time_by_sec(dwTimeDiff))
|
|
|
+#endif // RVC_OS_WIN
|
|
|
+ Dbg("sync time with server succeed, server time: [%s]", (const char*)dtServerTime.ToTimeString());
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_SET_LOCALE_TIME,
|
|
|
+ // GetOutPutStr("%s%s", "stServerTime", dtServerTime.ToTimeString()).c_str());
|
|
|
+ return ERR_ACCESSAUTH_SET_LOCALE_TIME;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Dbg("time diff is acceptable (%ds)", dwTimeDiff);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查准入请求版本 //会话密钥缓存
|
|
|
+ Dbg("auth version: %d", nAuthVersion);
|
|
|
+ if (((CAccessAuthEntity*)m_pEntity)->SaveAuthVerAndKey(nAuthVersion, nSessionKey)) return Error_Succeed;
|
|
|
+ return Error_Unexpect;
|
|
|
+}
|
|
|
+DWORD CAccessAuthConn::HandleLockState(int nState) {
|
|
|
+
|
|
|
+ //设置系统变量LockState, 0,正常;1,锁定;2,罚出;(准入服务返回,6:罚出 7:锁定)
|
|
|
+ CSmartPointer<IEntityFunction> spFunction = m_pEntity->GetFunction();
|
|
|
+ DWORD rc = Error_Succeed;
|
|
|
+ if (6 == nState)
|
|
|
+ {
|
|
|
+ rc = spFunction->SetSysVar("LockState", "2", true);
|
|
|
+ ((CAccessAuthEntity*)m_pEntity)->SetAuthErrMsg("终端已罚出");
|
|
|
+ }
|
|
|
+ else if (7 == nState)
|
|
|
+ {
|
|
|
+ rc = spFunction->SetSysVar("LockState", "1", true);
|
|
|
+ ((CAccessAuthEntity*)m_pEntity)->SetAuthErrMsg("终端已锁定");
|
|
|
+ }
|
|
|
+ return rc;
|
|
|
+}
|
|
|
+DWORD CAccessAuthConn::HandleGetToken(BYTE* enToken1, BYTE* sharedKey, BYTE* enToken2, BYTE* retHash) {
|
|
|
+ DWORD rc = Error_Succeed;
|
|
|
+ auto pEntity = (CAccessAuthEntity*)m_pEntity;
|
|
|
+ pEntity->GetOrSetIsFirstSM(1);
|
|
|
+
|
|
|
+
|
|
|
+ if (m_pFSM->m_bAccessACS) {
|
|
|
+ Dbg("retHash=%s", (char*)retHash);
|
|
|
+
|
|
|
+ char* enToken1_acs, * sharedKey_acs, * enToken2_acs, * hash_acs;
|
|
|
+ int enToken1_acs_len = 0, sharedKey_acs_len = 0, enToken2_acs_len = 0, hash_acs_len = 0;
|
|
|
+ enToken1_acs = Hex2Str((char*)enToken1, enToken1_acs_len);
|
|
|
+ sharedKey_acs = Hex2Str((char*)sharedKey, sharedKey_acs_len);
|
|
|
+ enToken2_acs = Hex2Str((char*)enToken2, enToken2_acs_len);
|
|
|
+ hash_acs = Hex2Str((char*)retHash, hash_acs_len);
|
|
|
+
|
|
|
+ Dbg("enToken1_acs_len=%d", enToken1_acs_len);
|
|
|
+ Dbg("sharedKey_acs_len=%d", sharedKey_acs_len);
|
|
|
+ Dbg("enToken2_acs_len=%d", enToken2_acs_len);
|
|
|
+ Dbg("hash_acs_len=%d", hash_acs_len);
|
|
|
+
|
|
|
+ memset(enToken1, 0, strlen((char*)enToken1));
|
|
|
+ memset(sharedKey, 0, strlen((char*)sharedKey));
|
|
|
+ memset(enToken2, 0, strlen((char*)enToken2));
|
|
|
+ memset(retHash, 0, strlen((char*)retHash));
|
|
|
+
|
|
|
+ memcpy(enToken1, enToken1_acs, enToken1_acs_len);
|
|
|
+ memcpy(sharedKey, sharedKey_acs, sharedKey_acs_len);
|
|
|
+ memcpy(enToken2, enToken2_acs, enToken2_acs_len);
|
|
|
+ memcpy(retHash, hash_acs, hash_acs_len);
|
|
|
+
|
|
|
+ delete enToken1_acs;
|
|
|
+ delete sharedKey_acs;
|
|
|
+ delete enToken2_acs;
|
|
|
+ delete hash_acs;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ BYTE enToken[512 + 16] = { 0 };
|
|
|
+ memcpy(enToken, enToken1, 256);
|
|
|
+ memcpy(enToken + 256, enToken2, 256);
|
|
|
+ memcpy(enToken + 512, sharedKey, 16);
|
|
|
+
|
|
|
+
|
|
|
+ BYTE sm3[32] = { 0 };
|
|
|
+ if (!SM3Hash(enToken, 512 + 16, sm3)) {
|
|
|
+ Dbg("SM3 Hash error at Token Ret.");
|
|
|
+ }
|
|
|
+ if (memcmp(sm3, retHash, 32) != 0)
|
|
|
+ {
|
|
|
+ rc = Error_Bug;
|
|
|
+ pEntity->SetAuthErrMsg("返回令牌校验不通过");
|
|
|
+ pEntity->GetFunction()->SetSysVar("AuthErrMsg", "返回令牌校验不通过", true);
|
|
|
+ char* sm3Ret = Str2Hex((char *)sm3, 32);
|
|
|
+ Dbg("sm3Ret=%s", (char*)sm3Ret);
|
|
|
+ delete sm3Ret;
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_TOKEN_HASH,
|
|
|
+ GetOutPutStr("%s%s", "Hash", "返回令牌校验不通过").c_str(),true);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ CBlob token;
|
|
|
+ token.Alloc(512);
|
|
|
+ memcpy(token.m_pData, enToken, 512);
|
|
|
+
|
|
|
+ CBlob sharedSK;
|
|
|
+ sharedSK.Alloc(16);
|
|
|
+ memcpy(sharedSK.m_pData, sharedKey, 16);
|
|
|
+ rc = pEntity->SaveTokenAndSharedSK(token, sharedSK);
|
|
|
+ if (rc != Error_Succeed)
|
|
|
+ {
|
|
|
+ pEntity->SetAuthErrMsg("保存令牌失败");
|
|
|
+ pEntity->GetFunction()->SetSysVar("AuthErrMsg", "保存令牌失败", true);
|
|
|
+ pEntity->SetAuthErrMsg("保存令牌失败");
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_SAVE_TOKEN,
|
|
|
+ GetOutPutStr("%s%08X", "SaveTokenAndSharedSK", rc).c_str(),true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return rc;
|
|
|
+}
|
|
|
+DWORD CAccessAuthConn::GetEncTerminalInfo(CBlob& encInfo) {
|
|
|
+ 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 bHasPinPad = false;
|
|
|
+ int nRet = ((CAccessAuthEntity*)m_pEntity)->GetPinPadIDAndDeviceID(strPinPadID, strDeviceID, bHasPinPad);
|
|
|
+ Dbg("GetPinPadIDAndDeviceID ret: %d, PinPadID: %s, DeviceID: %s", nRet, (const char*)strPinPadID, (const char*)strDeviceID);
|
|
|
+ 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];
|
|
|
+ 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;
|
|
|
+ Dbg("ip:%d.%d.%d.%d", pInfo->ip[0], pInfo->ip[1], pInfo->ip[2], pInfo->ip[3]);
|
|
|
+ }
|
|
|
+#else
|
|
|
+ char ip[32] = { 0 };
|
|
|
+ if (getIPFromLinux(ip)) Dbg("Get IP From Linux Error ex.");
|
|
|
+ else {
|
|
|
+ if (ip2byte(ip, pInfo->ip)) Dbg("Ip 2 Byte Error");
|
|
|
+ else {
|
|
|
+ for (int i = 0; i < 4; i++) {
|
|
|
+ Dbg("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)
|
|
|
+ {
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_GET_SYS_VAR,
|
|
|
+ GetOutPutStr("%s%08X%s%s", "GetSysVar", rc, "TerminalStage", ts).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)
|
|
|
+ {
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_GET_SYS_VAR,
|
|
|
+ GetOutPutStr("%s%08X%s%s", "GetSysVar", rc, "RunState", rs).c_str());
|
|
|
+ return ERR_ACCESSAUTH_GET_SYS_VAR;
|
|
|
+ }
|
|
|
+ assert(rs.GetLength() >= 1);
|
|
|
+ pInfo->chRunState = rs[0];
|
|
|
+
|
|
|
+
|
|
|
+ CBlob raw;
|
|
|
+ auto pEntity = ((CAccessAuthEntity*)m_pEntity);
|
|
|
+ if (pEntity->GetAuthVersion() == 2)
|
|
|
+ {
|
|
|
+ // 使用会话密钥加密
|
|
|
+ Dbg("使用会话密钥加密。。。");
|
|
|
+ raw.Refer(pBuf, sizeof(RequestTokenInfo) + 4);
|
|
|
+ rc = pEntity->EncryptDataWithSessionKey(raw, encInfo);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //后续基本废弃
|
|
|
+ Dbg("使用密码键盘加密。。。");
|
|
|
+ raw.Refer(pBuf, sizeof(req1.encTerminalInfo));
|
|
|
+ rc = pEntity->EncryptDataWithPinPad(raw, encInfo);
|
|
|
+ }
|
|
|
+ if (rc != Error_Succeed)
|
|
|
+ {
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_ENCRYPT_KEY,
|
|
|
+ GetOutPutStr("%s%08X", "CryptEncrypt", rc).c_str());
|
|
|
+ return ERR_ACCESSAUTH_ENCRYPT_KEY;
|
|
|
+ }
|
|
|
+ return Error_Succeed;
|
|
|
+}
|
|
|
+//密钥加密并转成可见字符
|
|
|
+DWORD CAccessAuthConn::GetTmk(string &tmk) {
|
|
|
+ BYTE tmp[140];
|
|
|
+ CBlob pubKey;
|
|
|
+ CBlob priKey;
|
|
|
+ DWORD rc = ((CAccessAuthEntity*)m_pEntity)->CreateSM2KeyPair(pubKey, priKey);
|
|
|
+ if (rc != Error_Succeed) return rc;
|
|
|
+ rc = ((CAccessAuthEntity*)m_pEntity)->SaveSM2KeyPair(pubKey, priKey);
|
|
|
+ if (rc != Error_Succeed) return rc;
|
|
|
+ memset(tmp, 0, sizeof(tmp));
|
|
|
+ if (pubKey.m_iLength > 70) {
|
|
|
+ Dbg("临时公钥长度(%d)大于70。。。", pubKey.m_iLength);
|
|
|
+ return Error_TooSmallBuffer;
|
|
|
+ }
|
|
|
+ memcpy_s(tmp, sizeof(tmp) - 70, pubKey.m_pData, pubKey.m_iLength);
|
|
|
+ if (priKey.m_iLength > 70) {
|
|
|
+ Dbg("临时私钥长度(%d)大于70。。。", priKey.m_iLength);
|
|
|
+ return Error_TooSmallBuffer;
|
|
|
+ }
|
|
|
+ memcpy_s(&tmp[70], sizeof(tmp) - 70, priKey.m_pData, priKey.m_iLength);
|
|
|
+ //CBlob raw, enc;
|
|
|
+ //auto pEntity = ((CAccessAuthEntity*)m_pEntity);
|
|
|
+ // 使用会话密钥加密
|
|
|
+ //Dbg("使用会话密钥加密。。。");
|
|
|
+ //raw.Refer(tmp, 140);
|
|
|
+ //rc = pEntity->EncryptDataWithSessionKey(raw, enc);
|
|
|
+ //if (rc != Error_Succeed) return rc;
|
|
|
+ //char *ret = MyBase64::Str2Hex((char*)enc.m_pData, enc.m_iLength);
|
|
|
+ //Dbg("data=%s,%d", ret, enc.m_iLength);
|
|
|
+ char *pRet = new char[512];
|
|
|
+ HexBuf2StrBuf(tmp, &pRet, 140);
|
|
|
+ Dbg("data=%s,%d", pRet, strlen(pRet));
|
|
|
+ tmk.assign(pRet);
|
|
|
+ delete[] pRet;
|
|
|
+
|
|
|
+ return Error_Succeed;
|
|
|
+}
|
|
|
+DWORD CAccessAuthConn::GetModalInfo(BYTE** pDevInfo, int & nDevEntityCount) {
|
|
|
+
|
|
|
+ // 获取硬件信息
|
|
|
+ CAutoArray<CSimpleStringA> devNames;
|
|
|
+ DWORD rc = GetAllDevices(m_pEntity, devNames);
|
|
|
+ if (rc != Error_Succeed)
|
|
|
+ {
|
|
|
+ ((CAccessAuthEntity*)m_pEntity)->SetAuthErrMsg("从root.ini获取终端设备信息失败");
|
|
|
+ CSmartPointer<IEntityFunction> spFunction = m_pEntity->GetFunction();
|
|
|
+ spFunction->SetSysVar("AuthErrMsg", "从root.ini获取终端设备信息失败", true);
|
|
|
+
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_READ_WRITE_CONFIG_FILE,
|
|
|
+ GetOutPutStr("%s%08X", "SpGetAllDevices", rc).c_str());
|
|
|
+
|
|
|
+ return ERR_ACCESSAUTH_READ_WRITE_CONFIG_FILE;
|
|
|
+ }
|
|
|
+
|
|
|
+ nDevEntityCount = devNames.GetCount();
|
|
|
+ if (nDevEntityCount > 0)
|
|
|
+ {
|
|
|
+
|
|
|
+ int nBufLen = nDevEntityCount * sizeof(RequestTokenReq2);
|
|
|
+ *pDevInfo = new BYTE[nBufLen];
|
|
|
+ memset(*pDevInfo, 0, nBufLen);
|
|
|
+
|
|
|
+ RequestTokenReq2* pTmp = (RequestTokenReq2*)*pDevInfo;
|
|
|
+
|
|
|
+ for (int i = 0; i < nDevEntityCount; i++)
|
|
|
+ {
|
|
|
+ CSimpleStringA strVersion, strModel, strVendor;
|
|
|
+ rc = GetDeviceInfo(m_pEntity, devNames[i], strModel, strVendor, strVersion);
|
|
|
+ if (rc == Error_Succeed)
|
|
|
+ {
|
|
|
+ strncpy(pTmp->szType, (const char*)devNames[i], sizeof(pTmp->szType) - 1);
|
|
|
+ strncpy(pTmp->szModal, (const char*)strModel, sizeof(pTmp->szModal) - 1);
|
|
|
+ strncpy(pTmp->szFactory, (const char*)strVendor, sizeof(pTmp->szFactory) - 1);
|
|
|
+
|
|
|
+ if (strVersion.GetLength() > 0)
|
|
|
+ {
|
|
|
+ CAutoArray<CSimpleStringA> arr = strVersion.Split('.');
|
|
|
+ for (int i = 0; i < 4 && i < arr.GetCount(); i++)
|
|
|
+ {
|
|
|
+ WORD w = (WORD)atoi(arr[i]);
|
|
|
+ ((BYTE*)pTmp->version)[i * 2] = (w >> 8) & 0xFF;
|
|
|
+ ((BYTE*)pTmp->version)[i * 2 + 1] = w & 0xFF;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ pTmp++;
|
|
|
+ }
|
|
|
+ //delete pDevInfo
|
|
|
+ }
|
|
|
+ return Error_Succeed;
|
|
|
+}
|
|
|
+DWORD CAccessAuthConn::GetTokenReq(CAccessAuthGetTokenReq* getTokenReq)
|
|
|
+{
|
|
|
+ DWORD rc;
|
|
|
+ auto pEntity = (CAccessAuthEntity*)m_pEntity;
|
|
|
+
|
|
|
+ CSystemStaticInfo si;
|
|
|
+ pEntity->GetFunction()->GetSystemStaticInfo(si);
|
|
|
+
|
|
|
+ BYTE fingerPrint[32] = { 0 };
|
|
|
+ int nBufLen = sizeof(fingerPrint);
|
|
|
+ if (!pEntity->GetTerminalFingerPrint(fingerPrint, nBufLen))
|
|
|
+ {
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
|
|
|
+ GetOutPutStr("%s%s", "GetTerminalFingerPrint", "False").c_str());
|
|
|
+ return ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT;
|
|
|
+ }
|
|
|
+ char tmp[256] = { 0 };
|
|
|
+ char* fingerPrintHex = Str2Hex((char*)(fingerPrint + 16), 16);
|
|
|
+ memcpy(tmp, fingerPrintHex, 32);
|
|
|
+ delete fingerPrintHex;
|
|
|
+
|
|
|
+ getTokenReq->TOKEN_R0.fingerPrintSM = tmp;
|
|
|
+ getTokenReq->TOKEN_R0.isFirst = pEntity->GetOrSetIsFirstSM(0);
|
|
|
+ getTokenReq->TOKEN_R0.isSM = 1;
|
|
|
+
|
|
|
+ CBlob encInfo;
|
|
|
+ if ((rc = GetEncTerminalInfo(encInfo)) != Error_Succeed)
|
|
|
+ {
|
|
|
+ Dbg("GetEncTerminalInfo failed:%d",rc);
|
|
|
+ return rc;
|
|
|
+ }
|
|
|
+ char *pTmp =Str2Hex((char*)encInfo.m_pData , encInfo.m_iLength);
|
|
|
+ getTokenReq->TOKEN_R1.encTerminalInfo = pTmp;
|
|
|
+ delete pTmp;
|
|
|
+ getTokenReq->TOKEN_R1.terminalNo = si.strTerminalID.GetData();
|
|
|
+ string tmpStr = "";
|
|
|
+ if ((rc = GetTmk(tmpStr)) != Error_Succeed) return rc;
|
|
|
+ getTokenReq->TOKEN_R1.TPK = tmpStr;
|
|
|
+
|
|
|
+ int nDevEntityCount = 0;
|
|
|
+ BYTE* pDevInfo = NULL;
|
|
|
+ if ((rc = GetModalInfo(&pDevInfo, nDevEntityCount)) != Error_Succeed) return rc;
|
|
|
+ else if (pDevInfo == NULL) {
|
|
|
+ Dbg("pDexInfo is NULL.");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ Dbg("GetModalInfo succ.");
|
|
|
+ }
|
|
|
+ if (nDevEntityCount > 0 && pDevInfo != NULL) {
|
|
|
+ RequestTokenReq2* R2Array = (RequestTokenReq2*)pDevInfo;
|
|
|
+ for (int i = 0; i < nDevEntityCount; i++) {
|
|
|
+ Dbg("szFactory=%s", R2Array->szFactory);
|
|
|
+ getTokenReq->TOKEN_R2[i]->factory = R2Array->szFactory;
|
|
|
+ getTokenReq->TOKEN_R2[i]->modal = R2Array->szModal;
|
|
|
+ getTokenReq->TOKEN_R2[i]->type = R2Array->szType;
|
|
|
+ getTokenReq->TOKEN_R2[i]->versoin =(char*) R2Array->version;
|
|
|
+ R2Array++;
|
|
|
+ }
|
|
|
+ delete pDevInfo;
|
|
|
+ }
|
|
|
+ memset(tmp, 0, sizeof(tmp));
|
|
|
+
|
|
|
+ fingerPrintHex = Str2Hex((char*)(fingerPrint), 16);
|
|
|
+ memcpy(tmp, fingerPrintHex, 32);
|
|
|
+ delete fingerPrintHex;
|
|
|
+
|
|
|
+ getTokenReq->TOKEN_R3.authVersion = pEntity->GetAuthVersion();
|
|
|
+ getTokenReq->TOKEN_R3.fingerPrint = tmp;
|
|
|
+ getTokenReq->TOKEN_R3.kmcSyncFlag = "";
|
|
|
+ memset(tmp, 0, sizeof(tmp));
|
|
|
+ int publicKeyLen = sizeof(tmp);
|
|
|
+ if (!pEntity->GetTerminalPublicKey((BYTE*) tmp, publicKeyLen))
|
|
|
+ {
|
|
|
+ m_pFSM->doWarnMsg(ERR_ACCESSAUTH_GET_TERMINAL_PUBKEY,
|
|
|
+ GetOutPutStr("%s%s", "GetTerminalPublicKey", "False").c_str());
|
|
|
+ return ERR_ACCESSAUTH_GET_TERMINAL_PUBKEY;
|
|
|
+ }
|
|
|
+ Dbg("publicKeyLen=%d",publicKeyLen);
|
|
|
+ char* retKey = Str2Hex(tmp, publicKeyLen);
|
|
|
+ getTokenReq->TOKEN_R3.publicKey.assign(retKey);
|
|
|
+ delete retKey;
|
|
|
+ getTokenReq->TOKEN_R3.reserved = "";
|
|
|
+ getTokenReq->TOKEN_R3.signCertHash = "";
|
|
|
+ getTokenReq->TOKEN_R3.uKeyRootHash ="";
|
|
|
+
|
|
|
+ CSimpleStringA strPinPadID = "", strDeviceID = "";
|
|
|
+ bool bHasPinPad = false;
|
|
|
+ int nRet = ((CAccessAuthEntity*)m_pEntity)->GetPinPadIDAndDeviceID(strPinPadID, strDeviceID,bHasPinPad);
|
|
|
+ getTokenReq->TOKEN_R4.pinPadID = strPinPadID.GetData();
|
|
|
+ getTokenReq->TOKEN_R4.reserved = "";
|
|
|
+ if (pEntity->HasPinPad())
|
|
|
+ {
|
|
|
+ getTokenReq->TOKEN_R5.existPinPad = 1;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ getTokenReq->TOKEN_R5.existPinPad = 0;
|
|
|
+ }
|
|
|
+ return rc;
|
|
|
+}
|
|
|
+DWORD CAccessAuthConn::GetDeviceInfo(CEntityBase* pCallerEntity, const CSimpleStringA& devDeviceName,
|
|
|
+ CSimpleStringA& strModel, CSimpleStringA& strVendor, CSimpleStringA& strVersion)
|
|
|
+{
|
|
|
+ CSmartPointer<IConfigInfo> pConfig;
|
|
|
+ DWORD rc = pCallerEntity->GetFunction()->OpenConfig(Config_Root, pConfig);
|
|
|
+ if (rc == Error_Succeed)
|
|
|
+ {
|
|
|
+ CSimpleStringA strSection = CSimpleStringA("Device.") + devDeviceName;
|
|
|
+
|
|
|
+ pConfig->ReadConfigValue(strSection, "Vendor", strVendor);
|
|
|
+ pConfig->ReadConfigValue(strSection, "Version", strVersion);
|
|
|
+
|
|
|
+ strModel = devDeviceName;
|
|
|
+ if (!strVendor.IsNullOrEmpty())
|
|
|
+ {
|
|
|
+ strModel += ".";
|
|
|
+ strModel += strVendor;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!strVersion.IsNullOrEmpty())
|
|
|
+ {
|
|
|
+ strModel += ".";
|
|
|
+ strModel += strVersion;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return rc;
|
|
|
+}
|
|
|
+DWORD CAccessAuthConn::GetAllDevices(CEntityBase* pEntity, CAutoArray<CSimpleStringA>& devs)
|
|
|
+{
|
|
|
+ CSmartPointer<IConfigInfo> pConfig;
|
|
|
+ DWORD rc = pEntity->GetFunction()->OpenConfig(Config_Root, pConfig);
|
|
|
+ if (rc == Error_Succeed)
|
|
|
+ {
|
|
|
+ int nCount(0);
|
|
|
+ rc = pConfig->ReadConfigValueInt("Device", "Number", nCount);
|
|
|
+ Dbg("nCount=%d", nCount);
|
|
|
+ if (rc == Error_Succeed && nCount > 0)
|
|
|
+ {
|
|
|
+ devs.Init(nCount);
|
|
|
+
|
|
|
+ for (int i = 0; i < nCount; i++)
|
|
|
+ {
|
|
|
+ CSimpleStringA str = CSimpleStringA::Format("%d", i + 1);
|
|
|
+ rc = pConfig->ReadConfigValue("Device", (const char*)str, devs[i]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ Dbg("GetAllDevices OpenConfig error");
|
|
|
+ }
|
|
|
return rc;
|
|
|
}
|