|
@@ -20,6 +20,7 @@ const int PINPAD_INIT_TRIES = 3;
|
|
|
const int PINPAD_ANY_INPUT_TIMEOUT = 100;
|
|
|
const int MAX_PINPAD_INPUT_TIMEOUT = 60000;
|
|
|
const int MAX_INPUT_TIMER_TIMEOUT = 600000;
|
|
|
+const int CurrentPasswordLen = 6;//according to guodan, we only use 6
|
|
|
|
|
|
void CPinPadFSM::ToLogWarnInfoAboutTermCustom()
|
|
|
{
|
|
@@ -147,6 +148,12 @@ unsigned int CPinPadFSM::s2_on_event(FSMEvent* pEvt)
|
|
|
pEvt->SetHandled();
|
|
|
return 0;
|
|
|
}
|
|
|
+ case USER_EVT_GETINPUT_JS:
|
|
|
+ {
|
|
|
+ m_hInputConVar.Broadcast();
|
|
|
+ pEvt->SetHandled();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
case USER_EVT_LOADKEY_SM:
|
|
|
{
|
|
|
pEvt->SetHandled();
|
|
@@ -204,6 +211,9 @@ unsigned int CPinPadFSM::s3_on_event(FSMEvent* evt)
|
|
|
case USER_EVT_GETINPUT_SM_FINISHED:
|
|
|
evt->SetHandled();
|
|
|
break;
|
|
|
+ case USER_EVT_GETINPUT_JS_FINISHED:
|
|
|
+ evt->SetHandled();
|
|
|
+ break;
|
|
|
case USER_EVT_INPUTCANCEL:
|
|
|
evt->SetHandled();
|
|
|
m_bFrontCancel = true;
|
|
@@ -471,6 +481,18 @@ unsigned int __stdcall DoWork(void *pData)
|
|
|
ret = pFsm->Initial();
|
|
|
evt = new FSMEvent(USER_EVT_INITFINISHED);
|
|
|
}
|
|
|
+ else if (pFsm->IsInGetInputJS())
|
|
|
+ {
|
|
|
+ SpReqAnsContext<PinPadService_GetInputJS_Req, PinPadService_GetInputJS_Ans>::Pointer ctxJS;
|
|
|
+ bool bRet = pFsm->GetJSCtx(ctxJS);
|
|
|
+ if (!bRet)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("get ctx(JS) failed.doing nothing");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ ret = pFsm->GetInputJS(ctxJS);
|
|
|
+ evt = new FSMEvent(USER_EVT_GETINPUT_JS_FINISHED);
|
|
|
+ }
|
|
|
else
|
|
|
{
|
|
|
SpReqAnsContext<PinPadService_GetInputSM_Req, PinPadService_GetInputSM_Ans>::Pointer ctxSM;
|
|
@@ -1400,3 +1422,368 @@ void CPinPadFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionCon
|
|
|
else
|
|
|
pTransactionContext->SendAnswer(Error_InvalidState);
|
|
|
}
|
|
|
+ErrorCodeEnum CPinPadFSM::GetEncryptTextJS(SpReqAnsContext<PinPadService_GetInputJS_Req, PinPadService_GetInputJS_Ans>::Pointer ctxJS)
|
|
|
+{
|
|
|
+ LOG_FUNCTION();
|
|
|
+ ErrorCodeEnum errCode;
|
|
|
+ CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
|
|
|
+ int timeout = ctxJS->Req.timeout;
|
|
|
+
|
|
|
+ AccountInfo accInfo;
|
|
|
+ memset(accInfo.account, 0, MAX_ACCOUNT_LEN);
|
|
|
+ CSimpleStringA errMsg(true);
|
|
|
+
|
|
|
+ if (Get12Account(const_cast<char*>(ctxJS->Req.account.GetData())))
|
|
|
+ memcpy(accInfo.account, m_szAccount + 4, 12);
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errMsg = CSimpleStringA::Format("Get12Account err(%s).", (const char*)ctxJS->Req.account);
|
|
|
+ if (m_iInWhatPage == PageType_Other)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setResultCode("RTA2607")(errMsg.GetData());
|
|
|
+ LogError(Severity_High, Error_Unexpect, PinPad_UserErrorCode_PinPad_GetEncryptText_Get12Account_Error, errMsg.GetData());
|
|
|
+ }
|
|
|
+ else
|
|
|
+ LogWarn(Severity_High, Error_Unexpect, PinPad_UserErrorCode_PinPad_GetEncryptText_Get12Account_Error, errMsg.GetData());
|
|
|
+ ctxJS->Answer(Error_DevCommFailed, PinPad_UserErrorCode_PinPad_GetEncryptText_Get12Account_Error);
|
|
|
+ return Error_DevCommFailed;
|
|
|
+ }
|
|
|
+
|
|
|
+ //memcpy(accInfo.account,"588571006555",12);
|
|
|
+ accInfo.dwAccLen = 12;
|
|
|
+ DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("acc(%s)", accInfo.account);
|
|
|
+ m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
|
|
|
+ errCode = m_hDevHelper->SetAccNo(accInfo);
|
|
|
+ m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
|
|
|
+ if (errCode != Error_Succeed)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("[sm]set accout(%s)(%s) failed(%d).", (const char*)ctxJS->Req.account, accInfo.account, errCode);
|
|
|
+
|
|
|
+ SetErrPackage("GetEncryptText::SetAccNo", m_devSN, errCode, MEC_DEVAPI_EPP_SetAccNo);
|
|
|
+ if (IsInBusiness())
|
|
|
+ {
|
|
|
+ ctxJS->Answer(Error_DevCommFailed, AlarmDEC(true));
|
|
|
+ DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setAPI("DevAdapter::SetAccNo")
|
|
|
+ .setCostTime(m_ullEndTime - m_ullBeginTime).setResultCode("RTA2608")("设置账号失败:%s", SpStrError(errCode));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ctxJS->Answer(Error_DevCommFailed, AlarmDEC());
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setAPI("DevAdapter::SetAccNo")
|
|
|
+ .setCostTime(m_ullEndTime - m_ullBeginTime).setResultCode("RTA2608")("设置账号失败:%s", SpStrError(errCode));
|
|
|
+ }
|
|
|
+
|
|
|
+ return Error_DevCommFailed;
|
|
|
+ }
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetAccNo").setCostTime(m_ullEndTime - m_ullBeginTime)();
|
|
|
+
|
|
|
+ m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
|
|
|
+ errCode = m_hDevHelper->ActiveWorkingKey(1, 0);
|
|
|
+ m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
|
|
|
+
|
|
|
+ if (errCode != Error_Succeed)
|
|
|
+ {
|
|
|
+ SetErrPackage("GetEncryptText::ActiveWorkingKey", m_devSN, errCode, MEC_DEVAPI_EPP_ActiveWorkingKey);
|
|
|
+ if (IsInBusiness())
|
|
|
+ {
|
|
|
+ ctxJS->Answer(Error_DevCommFailed, AlarmDEC(true));
|
|
|
+ DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setAPI("DevAdapter::ActiveWorkingKey")
|
|
|
+ .setResultCode("RTA260C").setCostTime(m_ullEndTime - m_ullBeginTime)("计算密文时激活工作密钥失败");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ctxJS->Answer(Error_DevCommFailed, AlarmDEC());
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setAPI("DevAdapter::ActiveWorkingKey")
|
|
|
+ .setResultCode("RTA260C").setCostTime(m_ullEndTime - m_ullBeginTime)("计算密文时激活工作密钥失败");
|
|
|
+ }
|
|
|
+ return Error_DevCommFailed;
|
|
|
+ }
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::ActiveWorkingKey").setCostTime(m_ullEndTime - m_ullBeginTime)();
|
|
|
+ m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
|
|
|
+ errCode = m_hDevHelper->SetParam(EPP_PT_SET_PIN_ALGORITH, EPP_PIN_ALGO_SM4);
|
|
|
+ m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
|
|
|
+
|
|
|
+ if (errCode != Error_Succeed)
|
|
|
+ {
|
|
|
+ SetErrPackage("GetEncryptText::SetParam", m_devSN, errCode, MEC_DEVAPI_EPP_SetParam);
|
|
|
+ if (IsInBusiness())
|
|
|
+ {
|
|
|
+ ctxJS->Answer(Error_DevCommFailed, AlarmDEC(true));
|
|
|
+ DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setAPI("DevAdapter::SetParam")
|
|
|
+ .setResultCode("RTA260B")("计算密文时设置参数失败:%s", SpStrError(errCode));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ctxJS->Answer(Error_DevCommFailed, AlarmDEC());
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setAPI("DevAdapter::SetParam")
|
|
|
+ .setResultCode("RTA260B")("计算密文时设置参数失败:%s", SpStrError(errCode));
|
|
|
+ }
|
|
|
+ return Error_DevCommFailed;
|
|
|
+ }
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetParam").setCostTime(m_ullEndTime - m_ullBeginTime)();
|
|
|
+ m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
|
|
|
+ errCode = m_hDevHelper->StartPinInput(CurrentPasswordLen);
|
|
|
+ m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
|
|
|
+
|
|
|
+ if (errCode != Error_Succeed)
|
|
|
+ {
|
|
|
+ SetErrPackage("GetEncryptText::StartPinInput", m_devSN, errCode, MEC_DEVAPI_EPP_StartPinInput);
|
|
|
+ if (IsInBusiness())
|
|
|
+ {
|
|
|
+ ctxJS->Answer(Error_DevCommFailed, AlarmDEC(true));
|
|
|
+ DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setAPI("DevAdapter::StartPinInput")
|
|
|
+ .setResultCode("RTA2609").setCostTime(m_ullEndTime - m_ullBeginTime)("%s", SpStrError(errCode));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ctxJS->Answer(Error_DevCommFailed, AlarmDEC());
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setAPI("DevAdapter::StartPinInput")
|
|
|
+ .setResultCode("RTA2609").setCostTime(m_ullEndTime - m_ullBeginTime)("%s", SpStrError(errCode));
|
|
|
+ }
|
|
|
+ return Error_DevCommFailed;
|
|
|
+ }
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::StartPinInput").setCostTime(m_ullEndTime - m_ullBeginTime)();
|
|
|
+ char* buf = new char[CurrentPasswordLen + 1];
|
|
|
+ memset(buf, 0, CurrentPasswordLen + 1);
|
|
|
+ int readed = 0;
|
|
|
+ DWORD elapsed = 0;
|
|
|
+ DWORD dwStart = SP::Module::Comm::RVCGetTickCount();
|
|
|
+ DWORD dwEnd = SP::Module::Comm::RVCGetTickCount();
|
|
|
+ bool bCancelInput = false;
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("req(pin),timeout:[%d]", timeout);
|
|
|
+ while (elapsed < MAX_PINPAD_INPUT_TIMEOUT) {
|
|
|
+ if (readed >= CurrentPasswordLen)
|
|
|
+ break;
|
|
|
+ if (m_bFrontCancel)
|
|
|
+ {
|
|
|
+ bCancelInput = true;
|
|
|
+ goto Err;
|
|
|
+ }
|
|
|
+ BYTE btCh;
|
|
|
+ Sleep(100);
|
|
|
+ errCode = m_hDevHelper->KeyRead(btCh);//循环调用,无需计算耗时
|
|
|
+ if (errCode == Error_Succeed) {
|
|
|
+ LogEvent(Severity_Middle, LOG_EVT_PINPAD_OP, "PinPad op.", ctxJS->link);
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("PinPad op: %d", readed);
|
|
|
+ if (btCh == 0x0d) {
|
|
|
+ dwEnd = SP::Module::Comm::RVCGetTickCount();
|
|
|
+ elapsed = dwEnd - dwStart;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ else if (btCh == 0x08) { // back
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("clear input");
|
|
|
+ pop_char(buf, &readed, true);
|
|
|
+ }
|
|
|
+ else if (btCh == 0x1b) { // quit
|
|
|
+ bCancelInput = true;
|
|
|
+ goto Err;
|
|
|
+ }
|
|
|
+ else if (btCh == 0x3f) {
|
|
|
+ push_char(buf, &readed, '*');
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("else[%d]", btCh);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ }
|
|
|
+ dwEnd = SP::Module::Comm::RVCGetTickCount();
|
|
|
+ elapsed = dwEnd - dwStart;
|
|
|
+ }
|
|
|
+ buf[readed] = 0;
|
|
|
+
|
|
|
+Err:
|
|
|
+
|
|
|
+ if (buf != NULL)
|
|
|
+ delete[]buf;
|
|
|
+ if (bCancelInput)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220602")("input cancel(pin)");
|
|
|
+ ctxJS->Answer(Error_Cancel);
|
|
|
+ return Error_Cancel;
|
|
|
+ }
|
|
|
+ if (readed < CurrentPasswordLen) {
|
|
|
+ if (elapsed >= MAX_PINPAD_INPUT_TIMEOUT) {
|
|
|
+ ctxJS->Answer(Error_TimeOut);
|
|
|
+ return Error_TimeOut;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ PinBlock pinBlk;
|
|
|
+ DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("to getpinblk");
|
|
|
+ Sleep(500);//nantian
|
|
|
+ m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
|
|
|
+ errCode = m_hDevHelper->GetPinBlock(pinBlk);
|
|
|
+ m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
|
|
|
+
|
|
|
+
|
|
|
+ LogWarn(Severity_Low, Error_Succeed, PinPad_UserErrorCode_PinPad_GetPinBlock_Call
|
|
|
+ , CSimpleStringA::Format("{\"cost\":%d}", m_ullEndTime - m_ullBeginTime));
|
|
|
+ if (errCode == Error_Succeed)
|
|
|
+ {
|
|
|
+ char* tmpPinData = new char[MAX_PIN_BLOCK_SIZE];
|
|
|
+ if (tmpPinData == NULL)
|
|
|
+ return Error_Resource;
|
|
|
+ memset(tmpPinData, 0, MAX_PIN_BLOCK_SIZE);
|
|
|
+ memcpy(tmpPinData, pinBlk.data, pinBlk.dwSize);
|
|
|
+
|
|
|
+ ctxJS->Ans.data = tmpPinData;
|
|
|
+ //Dbg("pinblk(%s)",tmpPinData);
|
|
|
+ if (tmpPinData != NULL)
|
|
|
+ {
|
|
|
+ delete[]tmpPinData;
|
|
|
+ tmpPinData = NULL;
|
|
|
+ }
|
|
|
+ EnDecryptInfo srcInfo, dstInfo;
|
|
|
+ memset(srcInfo.data, 0, MAX_EN_DECRYPT_DATA_SIZE);
|
|
|
+ memcpy(srcInfo.data, m_devCheckData, m_devCheckData.GetLength());
|
|
|
+ srcInfo.dwSize = m_devCheckData.GetLength();
|
|
|
+ memset(dstInfo.data, 0, MAX_EN_DECRYPT_DATA_SIZE);
|
|
|
+ //set param
|
|
|
+ m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
|
|
|
+ errCode = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_SM4);
|
|
|
+ if (errCode == Error_Succeed)
|
|
|
+ errCode = m_hDevHelper->SetParam(EPP_PT_SET_ECB_CBC_MODE, EPP_ALGO_MODE_CBC);
|
|
|
+ m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
|
|
|
+
|
|
|
+ if (errCode != Error_Succeed)
|
|
|
+ {
|
|
|
+ SetErrPackage("GetEncryptText::SetParam", m_devSN, errCode, MEC_DEVAPI_EPP_SetParam);
|
|
|
+ if (IsInBusiness())
|
|
|
+ {
|
|
|
+ ctxJS->Answer(Error_Param, AlarmDEC(true));
|
|
|
+ DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setAPI("DevAdapter::SetParam")
|
|
|
+ .setResultCode("RTA260B").setCostTime(m_ullEndTime - m_ullBeginTime)("计算密文时设置参数失败:%s", SpStrError(errCode));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ctxJS->Answer(Error_Param, AlarmDEC());
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setAPI("DevAdapter::SetParam")
|
|
|
+ .setResultCode("RTA260B").setCostTime(m_ullEndTime - m_ullBeginTime)("计算密文时设置参数失败:%s", SpStrError(errCode));
|
|
|
+ }
|
|
|
+ return Error_Param;
|
|
|
+ }
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetParam").setCostTime(m_ullEndTime - m_ullBeginTime)();
|
|
|
+ m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
|
|
|
+ errCode = m_hDevHelper->EncryptData(srcInfo, dstInfo);
|
|
|
+ m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
|
|
|
+
|
|
|
+ if (errCode != Error_Succeed)
|
|
|
+ {
|
|
|
+ SetErrPackage("GetEncryptText::EncryptData", m_devSN, errCode, MEC_DEVAPI_EPP_EncryptData);
|
|
|
+ if (IsInBusiness())
|
|
|
+ {
|
|
|
+ ctxJS->Answer(Error_DevCommFailed, AlarmDEC(true));
|
|
|
+ DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setAPI("DevAdapter::EncryptData")
|
|
|
+ .setResultCode("RTA260D").setCostTime(m_ullEndTime - m_ullBeginTime)("计算密文时数据加密失败", SpStrError(errCode));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ctxJS->Answer(Error_DevCommFailed, AlarmDEC());
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setAPI("DevAdapter::EncryptData")
|
|
|
+ .setResultCode("RTA260D").setCostTime(m_ullEndTime - m_ullBeginTime)("计算密文时数据加密失败", SpStrError(errCode));
|
|
|
+ }
|
|
|
+ return Error_DevCommFailed;
|
|
|
+ }
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::EncryptData").setCostTime(m_ullEndTime - m_ullBeginTime)();
|
|
|
+
|
|
|
+ char* tmpCheckCode = new char[MAX_PIN_BLOCK_SIZE];
|
|
|
+ if (tmpCheckCode == NULL)
|
|
|
+ return Error_Resource;
|
|
|
+ memset(tmpCheckCode, 0, MAX_PIN_BLOCK_SIZE);
|
|
|
+ //HexBuf2StrBuf(dstInfo.data,&tmpCheckCode,dstInfo.dwSize);
|
|
|
+ memcpy(tmpCheckCode, dstInfo.data, dstInfo.dwSize);
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ckckck[%s], m_keySNSM:%s", tmpCheckCode, m_keySNSM.GetData());
|
|
|
+
|
|
|
+
|
|
|
+ if (strnicmp(tmpCheckCode, "9F1F7BFF6F5511384D9430531E538FD3",
|
|
|
+ strlen("9F1F7BFF6F5511384D9430531E538FD3")) == 0)
|
|
|
+ {
|
|
|
+ SetErrPackage("GetEncryptText::EncryptData(SM)", m_devSN, Error_Unexpect, PinPad_UserErrorCode_KEY_LOST_SM);
|
|
|
+ AlarmDEC();
|
|
|
+ }
|
|
|
+ ctxJS->Ans.checkcode = tmpCheckCode;
|
|
|
+ ctxJS->Ans.deviceno = m_deviceNo;
|
|
|
+ ctxJS->Ans.keyseq = m_keySNSM;
|
|
|
+
|
|
|
+ CSimpleStringA tmpLastCkCode = m_lastCheckCode;
|
|
|
+ if (m_lastCheckCode.IsNullOrEmpty() || strnicmp(tmpCheckCode, m_lastCheckCode, m_lastCheckCode.GetLength()) != 0)
|
|
|
+ {
|
|
|
+ ErrorCodeEnum eErr;
|
|
|
+ CSmartPointer<IConfigInfo> spConfigRun;
|
|
|
+ eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
|
|
|
+ if (eErr == Error_Succeed)
|
|
|
+ {
|
|
|
+ spConfigRun->WriteConfigValue("Load", "ckckck", tmpCheckCode);
|
|
|
+ m_lastCheckCode = tmpCheckCode;
|
|
|
+ }
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("write ckckck:%s", tmpCheckCode);
|
|
|
+ }
|
|
|
+ if (!tmpLastCkCode.IsNullOrEmpty() && strnicmp(tmpCheckCode, tmpLastCkCode, tmpLastCkCode.GetLength()) != 0)
|
|
|
+ {
|
|
|
+ CSimpleStringA xCkChangeMsg = CSimpleStringA::Format("last ck:%s,current ck:%s,m_keySNSM:%s", tmpLastCkCode.GetData()
|
|
|
+ , tmpCheckCode, m_keySNSM.GetData());
|
|
|
+ LogWarn(Severity_Low, Error_Unexpect, PinPad_UserErrorCode_PinPad_CheckCode_Changed, xCkChangeMsg.GetData());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ SetErrPackage("GetEncryptText::GetPinBlock", m_devSN, errCode, MEC_DEVAPI_EPP_GetPinBlock);
|
|
|
+ if (IsInBusiness())
|
|
|
+ {
|
|
|
+ ctxJS->Answer(Error_DevCommFailed, AlarmDEC(true));
|
|
|
+ DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setAPI("DevAdapter::GetPinBlock")
|
|
|
+ .setResultCode("RTA260A").setCostTime(m_ullEndTime - m_ullBeginTime)("计算密文失败:%s", SpStrError(errCode));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ctxJS->Answer(Error_DevCommFailed, AlarmDEC());
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setAPI("DevAdapter::GetPinBlock")
|
|
|
+ .setResultCode("RTA260A").setCostTime(m_ullEndTime - m_ullBeginTime)("计算密文失败:%s", SpStrError(errCode));
|
|
|
+ }
|
|
|
+
|
|
|
+ return Error_DevCommFailed;
|
|
|
+ }
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, ctxJS->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM)
|
|
|
+ .setAPI("DevAdapter::GetPinBlock").setCostTime(m_ullEndTime - m_ullBeginTime)("获取密文成功");
|
|
|
+ //oilyang@20240410 move to out space,after stopinput & turn off the light
|
|
|
+ //Sleep(100);
|
|
|
+ //ctxSM->Answer(Error_Succeed);
|
|
|
+ return Error_Succeed;
|
|
|
+}
|
|
|
+int CPinPadFSM::GetInputJS(SpReqAnsContext<PinPadService_GetInputJS_Req, PinPadService_GetInputJS_Ans>::Pointer ctxJS)
|
|
|
+{
|
|
|
+ DWORD dwCurrThId = GetCurrentThreadId();
|
|
|
+ DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("GetInput thread id:%d", dwCurrThId);
|
|
|
+ m_bFrontCancel = false;
|
|
|
+ LogEvent(Severity_Middle, LOG_EVT_PINPAD_GREEN_ON, "PinPad light on.");
|
|
|
+ if (!m_hDevHelper)
|
|
|
+ {
|
|
|
+ SetErrPackage("GetInput(JS)", m_devSN, Error_Unexpect, PinPad_UserErrorCode_PinPad_Instance_Is_Null);
|
|
|
+ m_inputJSCtx->Answer(Error_Unexpect, AlarmDEC());//TODO oiltmp ,to define RTAxxxx
|
|
|
+ LogEvent(Severity_Middle, LOG_EVT_PINPAD_GREEN_OFF, "PinPad light off.");
|
|
|
+ m_bPinInputJS = false;
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ ErrorCodeEnum eErrCode = GetEncryptTextJS(m_inputJSCtx);
|
|
|
+
|
|
|
+ m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
|
|
|
+ ErrorCodeEnum errClosePinPad = m_hDevHelper->StopInput();
|
|
|
+ m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
|
|
|
+ if (errClosePinPad != Error_Succeed)
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("DevAdapter::StopInput").setResultCode("RTA2614").setCostTime(m_ullEndTime - m_ullBeginTime)("close pinpad(%s).", SpStrError(errClosePinPad));
|
|
|
+ else
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::StopInput").setCostTime(m_ullEndTime - m_ullBeginTime)("StopInput cost(%d)ms", m_ullEndTime - m_ullBeginTime);
|
|
|
+
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)
|
|
|
+ ("req acc.len:%d,ans.ck.len:%d", m_inputJSCtx->Req.account.GetLength(), m_inputJSCtx->Ans.checkcode.IsNullOrEmpty() ? 0 : m_inputJSCtx->Ans.checkcode.GetLength());
|
|
|
+ DbgToBeidou(m_inputJSCtx->link, "GetInput")();
|
|
|
+ m_bPinInput = false;
|
|
|
+ LogEvent(Severity_Middle, LOG_EVT_PINPAD_GREEN_OFF, "PinPad light off.");
|
|
|
+
|
|
|
+ if (eErrCode == Error_Succeed)
|
|
|
+ m_inputJSCtx->Answer(Error_Succeed);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|