PinPadFSM.cpp 57 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618
  1. #include "stdafx.h"
  2. #include "PinPadFSM.h"
  3. #include "PinPad_msg_g.h"
  4. #include "GetDevInfoHelper.h"
  5. #include "EventCode.h"
  6. #include "ModuleMix.h"
  7. #include <map>
  8. #include "RVCComm.h"
  9. #include "sm4.h"
  10. #include "publicFunExport.h"
  11. #include <fstream>
  12. #if defined(RVC_OS_LINUX)
  13. #include <thread>
  14. #include <chrono>
  15. #include <winpr/sysinfo.h>
  16. #endif
  17. using namespace std;
  18. const int PINPAD_INIT_TRIES = 3;
  19. const int PINPAD_ANY_INPUT_TIMEOUT = 100;
  20. const int MAX_PINPAD_INPUT_TIMEOUT = 60000;
  21. const int MAX_INPUT_TIMER_TIMEOUT = 600000;
  22. const int CurrentPasswordLen = 6;//according to guodan, we only use 6
  23. void CPinPadFSM::ToLogWarnInfoAboutTermCustom()
  24. {
  25. LOG_FUNCTION();
  26. std::map<std::string, std::string> termInfo;
  27. char* strFileHash = new char[128];
  28. memset(strFileHash, 0, 128);
  29. termInfo["keyType"] = _itoa(m_encryptkey, strFileHash,10);
  30. if (strFileHash != nullptr) {
  31. delete[] strFileHash;
  32. strFileHash = nullptr;
  33. }
  34. if (m_bSMLoaded)
  35. termInfo["SMKeyLoad"] = "true";
  36. else
  37. termInfo["SMKeyLoad"] = "false";
  38. ToLogWarnInfoAboutTermExtend(termInfo);
  39. }
  40. ErrorCodeEnum CPinPadFSM::OnInit()
  41. {
  42. LOG_FUNCTION();
  43. CSystemStaticInfo sysInfo;
  44. m_csMachineType = m_csSite = m_terminalNo = "";
  45. GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo);
  46. m_csMachineType = sysInfo.strMachineType;
  47. m_csSite = sysInfo.strSite;
  48. m_terminalNo = sysInfo.strTerminalID;
  49. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("machineType:%s,site:%s,terminalNo:%s",
  50. (const char*)m_csMachineType, (const char*)m_csSite, (const char*)m_terminalNo);
  51. _beginthreadex(NULL,0,DoWork,(void*)this,0,NULL);
  52. return Error_Succeed;
  53. }
  54. ErrorCodeEnum CPinPadFSM::OnExit()
  55. {
  56. LOG_FUNCTION();
  57. m_bEntityExit = true;
  58. m_hInputConVar.Broadcast();
  59. ErrorCodeEnum eErr = Error_Succeed;
  60. if (m_hDevHelper != nullptr)
  61. {
  62. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  63. ErrorCodeEnum errClosePinPad = m_hDevHelper->StopInput();
  64. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  65. if (errClosePinPad != Error_Succeed)
  66. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::StopInput").setResultCode("RTA2614").setCostTime(m_ullEndTime - m_ullBeginTime)("OnExit:close pinpad(%d).", SpStrError(errClosePinPad));
  67. m_hDevHelper.TearDown();
  68. }
  69. return eErr;
  70. }
  71. void CPinPadFSM::s0_on_entry()
  72. {
  73. LOG_FUNCTION();
  74. FSMEvent *e = new FSMEvent(USER_EVT_INIT);
  75. PostEventFIFO(e);
  76. m_ullConnectCost = SP::Module::Comm::RVCGetTickCount();
  77. }
  78. void CPinPadFSM::s0_on_exit()
  79. {
  80. }
  81. unsigned int CPinPadFSM::s0_on_event(FSMEvent* evt)
  82. {
  83. LOG_FUNCTION();
  84. if (evt->iEvt == USER_EVT_INIT) {
  85. m_hInputConVar.Broadcast();
  86. evt->SetHandled();
  87. return 0;
  88. }else if (evt->iEvt == USER_EVT_QUIT) {
  89. evt->SetHandled();
  90. return 0;
  91. }
  92. return 0;
  93. }
  94. void CPinPadFSM::s1_on_entry()
  95. {
  96. LOG_FUNCTION();
  97. }
  98. void CPinPadFSM::s1_on_exit()
  99. {
  100. }
  101. unsigned int CPinPadFSM::s1_on_event(FSMEvent* evt)
  102. {
  103. LOG_FUNCTION();
  104. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s1 event %d",evt->iEvt);
  105. int ret = 0;
  106. if (evt->iEvt == USER_EVT_INITFINISHED) {
  107. evt->SetHandled();
  108. int err = evt->param1;
  109. if (err == 0)
  110. ret = 0;
  111. else
  112. ret = 1;
  113. //SetEvent(m_hInitEvt);
  114. return ret;
  115. }else if (evt->iEvt == USER_EVT_QUIT) {
  116. evt->SetHandled();
  117. return 0;
  118. }
  119. return 0;
  120. }
  121. //Idle
  122. void CPinPadFSM::s2_on_entry()
  123. {
  124. LOG_FUNCTION();
  125. m_eDevState = DEVICE_STATUS_NORMAL;
  126. m_testResult = Error_Succeed;
  127. }
  128. void CPinPadFSM::s2_on_exit()
  129. {
  130. }
  131. unsigned int CPinPadFSM::s2_on_event(FSMEvent* pEvt)
  132. {
  133. if (pEvt->iEvt != 1)
  134. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s2 %d,%d",pEvt->iEvt,pEvt->param1);
  135. switch(pEvt->iEvt)
  136. {
  137. case USER_EVT_GETINPUT_SM:
  138. {
  139. m_hInputConVar.Broadcast();
  140. pEvt->SetHandled();
  141. return 0;
  142. }
  143. case USER_EVT_GETINPUT_JS:
  144. {
  145. m_hInputConVar.Broadcast();
  146. pEvt->SetHandled();
  147. return 0;
  148. }
  149. case USER_EVT_LOADKEY_SM:
  150. {
  151. pEvt->SetHandled();
  152. m_bLoadKey = true;
  153. LoadKeySMTask* task = new LoadKeySMTask(this);
  154. LoadKeySMEvent* lke = dynamic_cast<LoadKeySMEvent*>(pEvt);
  155. task->ctx = lke->ctx;
  156. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  157. return 2;
  158. }
  159. case USER_EVT_ENCRYPT_SM:
  160. {
  161. pEvt->SetHandled();
  162. m_bEncrypt = true;
  163. EncryptSMTask* task = new EncryptSMTask(this);
  164. EncryptSMEvent* ee = dynamic_cast<EncryptSMEvent*>(pEvt);
  165. task->ctx = ee->ctx;
  166. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  167. return 2;
  168. }
  169. case USER_EVT_GET_CHECKCODE:
  170. {
  171. pEvt->SetHandled();
  172. GetCheckCodeTask* task = new GetCheckCodeTask(this);
  173. GetCheckCodeEvent* gcce = dynamic_cast<GetCheckCodeEvent*>(pEvt);
  174. task->ctx = gcce->ctx;
  175. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  176. return 0;
  177. }
  178. case USER_EVT_QUIT:
  179. pEvt->SetHandled();
  180. break;
  181. default:
  182. break;
  183. }
  184. return 1;
  185. }
  186. //Input
  187. void CPinPadFSM::s3_on_entry()
  188. {
  189. LOG_FUNCTION();
  190. }
  191. void CPinPadFSM::s3_on_exit()
  192. {
  193. LOG_FUNCTION();
  194. }
  195. unsigned int CPinPadFSM::s3_on_event(FSMEvent* evt)
  196. {
  197. LOG_FUNCTION();
  198. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s3 event %d",evt->iEvt);
  199. switch(evt->iEvt)
  200. {
  201. case USER_EVT_GETINPUT_SM_FINISHED:
  202. evt->SetHandled();
  203. break;
  204. case USER_EVT_GETINPUT_JS_FINISHED:
  205. evt->SetHandled();
  206. break;
  207. case USER_EVT_INPUTCANCEL:
  208. evt->SetHandled();
  209. m_bFrontCancel = true;
  210. break;
  211. case USER_EVT_INPUTWAITINGMORE:
  212. evt->SetHandled();
  213. m_bWaitingMore = true;
  214. break;
  215. case USER_EVT_EXIT:
  216. SetExitFlag();
  217. break;
  218. case USER_EVT_QUIT:
  219. evt->SetHandled();
  220. break;
  221. default:
  222. break;
  223. }
  224. return 0;
  225. }
  226. //AccessAuth
  227. void CPinPadFSM::s4_on_entry()
  228. {
  229. LOG_FUNCTION();
  230. }
  231. void CPinPadFSM::s4_on_exit()
  232. {
  233. LOG_FUNCTION();
  234. }
  235. unsigned int CPinPadFSM::s4_on_event(FSMEvent* pEvt)
  236. {
  237. switch(pEvt->iEvt)
  238. {
  239. case USER_EVT_LOADKEY_SM_FINISHED:
  240. pEvt->SetHandled();
  241. break;
  242. case USER_EVT_ENCRYPT_SM_FINISHED:
  243. pEvt->SetHandled();
  244. break;
  245. case USER_EVT_GET_CHECKCODE:
  246. {
  247. pEvt->SetHandled();
  248. GetCheckCodeTask* task = new GetCheckCodeTask(this);
  249. GetCheckCodeEvent* gcce = dynamic_cast<GetCheckCodeEvent*>(pEvt);
  250. task->ctx = gcce->ctx;
  251. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  252. return 0;
  253. }
  254. default:
  255. break;
  256. }
  257. return 0;
  258. }
  259. void CPinPadFSM::s5_on_entry()
  260. {
  261. LOG_FUNCTION();
  262. if (m_bOpened)
  263. m_eDevState = DEVICE_STATUS_FAULT;
  264. m_testResult = Error_InvalidState;
  265. }
  266. void CPinPadFSM::s5_on_exit()
  267. {
  268. LOG_FUNCTION();
  269. }
  270. unsigned int CPinPadFSM::s5_on_event(FSMEvent* pEvt)
  271. {
  272. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s5 evt %d",pEvt->iEvt);
  273. switch (pEvt->iEvt)
  274. {
  275. default:
  276. break;
  277. }
  278. return 0;
  279. }
  280. void CPinPadFSM::s6_on_entry()
  281. {
  282. LOG_FUNCTION();
  283. m_eDevState = DEVICE_STATUS_NOT_READY;
  284. }
  285. void CPinPadFSM::s6_on_exit()
  286. {
  287. }
  288. unsigned int CPinPadFSM::s6_on_event(FSMEvent* pEvt)
  289. {
  290. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s6 evt %d", pEvt->iEvt);
  291. switch (pEvt->iEvt)
  292. {
  293. default:
  294. break;
  295. }
  296. return 0;
  297. }
  298. int CPinPadFSM::Initial()
  299. {
  300. LOG_FUNCTION();
  301. #if defined(RVC_OS_WIN)
  302. DWORD dwCurrThId = GetCurrentThreadId();
  303. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Initial thread id:%d", dwCurrThId);
  304. #endif
  305. ErrorCodeEnum eErrDev;
  306. auto pEntity = GET_DEV_ENTITY_BASE_POINTER();
  307. GetEntityBase()->GetFunction()->GetSystemStaticInfo(m_sysStaticInfo);
  308. m_deviceNo = m_sysStaticInfo.strTerminalID;
  309. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("m_deviceNo:%s", m_deviceNo.GetData());
  310. m_devCheckData = "0000000000000000";
  311. CSimpleStringA csDepPath(""), csBackslash(SPLIT_SLASH_STR);
  312. m_devSN = "";
  313. eErrDev = pEntity->LoadVendorLibName();
  314. if (eErrDev != Error_Succeed)
  315. {
  316. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("SpGetDevAdaptorPath(%d) failed.", eErrDev);
  317. LogWarn(Severity_Middle, eErrDev, PinPad_UserErrorCode_Get_DevAdapter_Path_Failed, "Initial:SpGetDevAdaptorPath");
  318. return Error_DevLoadFileFailed;
  319. }
  320. FulfillAdapterInfoFrom(pEntity->vendorLibInfo);
  321. HARDWARE_ENTITY_SET_VENDOR_NAME(m_entCode, m_adapterInfo.strVendor);
  322. pEntity->InitializeVendorLogSwitch();
  323. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to load vendor dll[%s]", m_adapterInfo.adapterFilePath.IsNullOrEmpty() ? "null or empty" : m_adapterInfo.adapterFilePath.GetData());
  324. eErrDev = m_hDevHelper.LoadUp(m_adapterInfo.adapterFilePath);
  325. if (!IS_SUCCEED(eErrDev))
  326. {
  327. LogWarn(Severity_Middle, Error_NotInit, PinPad_UserErrorCode_Load_Dll_File_Failed, "密码键盘加载厂商适配器失败!请检查root.ini配置是否正确。");
  328. return Error_DevLoadFileFailed;
  329. }
  330. else {
  331. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("load vendor dll suc.");
  332. }
  333. int initTries = 0;
  334. ErrorCodeEnum eErr = Error_Unexpect;
  335. do
  336. {
  337. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("port:%d,baudRate:%d", m_adapterInfo.GetPortInt(), m_adapterInfo.GetBaudrateInt());
  338. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  339. eErr = m_hDevHelper->DevOpen(m_adapterInfo.GetPortInt(), m_adapterInfo.GetBaudrateInt());
  340. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  341. if (eErr == Error_Succeed)
  342. {
  343. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DevOpen").setCostTime(m_ullEndTime - m_ullBeginTime)();
  344. ToLogRootINIInfo();
  345. initTries = 0;
  346. ErrorCodeEnum errCode3, errCode4;
  347. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  348. //errCode1 = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD,EPP_ALGO_METHOD_3DES);
  349. //errCode2 = m_hDevHelper->SetParam(EPP_PT_SET_MAC_ALGORITH,EPP_MAC_ALGO_ASNIX99);
  350. errCode3 = m_hDevHelper->SetParam(EPP_PT_SET_PIN_ALGORITH, EPP_PIN_ALGO_SM4);
  351. errCode4 = m_hDevHelper->SetParam(EPP_PT_SET_ECB_CBC_MODE, EPP_ALGO_MODE_3DEC_CBC);
  352. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  353. if (errCode3 != Error_Succeed || errCode4 != Error_Succeed)
  354. {
  355. if (errCode3 != Error_Succeed)
  356. SetErrorAndLog(errCode3, MEC_DEVAPI_EPP_SetParam, "DevAdapter::SetParam", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime);
  357. if (errCode4 != Error_Succeed)
  358. SetErrorAndLog(errCode4, MEC_DEVAPI_EPP_SetParam, "DevAdapter::SetParam", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime);
  359. return 1;
  360. }
  361. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetParam").setCostTime(m_ullEndTime - m_ullBeginTime)();
  362. break;
  363. }
  364. else
  365. {
  366. SetErrorAndLog(eErr, MEC_DEVAPI_EPP_DevOpen, "DevAdapter::DevOpen", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime);
  367. initTries++;
  368. Sleep(1200);
  369. continue;
  370. }
  371. } while (initTries < PINPAD_INIT_TRIES);
  372. if (initTries != 0)
  373. {
  374. LogEvent(Severity_Middle, LOG_EVT_PINPAD_OPEN_FAIL, "Open pinpad failed.");
  375. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("Open pinpad failed.");
  376. return 1;
  377. }
  378. m_bOpened = true;
  379. //oiltmp comment the following 20160406
  380. //update with the version 1.7.1
  381. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  382. m_encryptkey = m_hDevHelper->GetEncryptFunc();
  383. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  384. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetEncryptFunc").setCostTime(m_ullEndTime - m_ullBeginTime)("Error_Succeed");
  385. CSmartPointer<IConfigInfo> spConfig;
  386. eErrDev = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfig);
  387. if (eErrDev != Error_Succeed)
  388. {
  389. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("read run cfg failed(sm).");
  390. m_bSMLoaded = false;
  391. LogWarn(Severity_Middle, eErrDev, PinPad_UserErrorCode_Open_RunCfgFile_Failed, "Initial:OpenConfig");
  392. }
  393. else
  394. {
  395. int tmpLoad = 0;
  396. eErrDev = spConfig->ReadConfigValueInt("Load", "SM", tmpLoad);
  397. if (eErrDev == Error_Succeed)
  398. m_bSMLoaded = tmpLoad;
  399. //oilyang@20201026 from kmc micro service
  400. spConfig->ReadConfigValue("Load", "SN_SM", m_keySNSM);
  401. spConfig->ReadConfigValue("Load", "ckckck", m_lastCheckCode);
  402. }
  403. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("encrypt key :%d,load key :%d", m_encryptkey, m_bSMLoaded);
  404. DevCategoryInfo devInfo;
  405. ZeroMemory(devInfo.szModel, MAX_DEV_MODEL_LEN);
  406. ZeroMemory(devInfo.szType, MAX_DEV_TYPE_LEN);
  407. ZeroMemory(devInfo.szVendor, MAX_DEV_VENDOR_LEN);
  408. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  409. eErrDev = m_hDevHelper->GetDevCategory(devInfo);
  410. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  411. if (eErrDev == Error_Succeed)
  412. {
  413. m_szModel = devInfo.szModel;
  414. m_szType = devInfo.szType;
  415. m_szVendor = devInfo.szVendor;
  416. m_adapterInfo.FulfillCategoryInfo(devInfo);
  417. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevCategory").setCostTime(m_ullEndTime - m_ullBeginTime)
  418. ("model,%d,%s;type,%d,%s;vendor,%d,%s", strlen(devInfo.szModel), m_szModel.GetData(), strlen(devInfo.szType), m_szType.GetData(), strlen(devInfo.szVendor), m_szVendor.GetData());
  419. }
  420. else
  421. SetErrorAndLog(eErrDev, MEC_DEVAPI_EPP_GetDevCategory, "DevAdapter::GetDevCategory", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime);
  422. CSimpleStringA xTmpStr = CSimpleStringA::Format("(hw support):%d,load key :%d,SMSN:%s", m_encryptkey, m_bSMLoaded, m_keySNSM.GetData());
  423. LogWarn(Severity_Low, Error_Unexpect, PinPad_UserErrorCode_DevConnect_CostTime, CSimpleStringA::Format("%d", (SP::Module::Comm::RVCGetTickCount() - m_ullConnectCost) / 1000));
  424. LogWarn(Severity_Low, Error_Unexpect, PinPad_UserErrorCode_PinPad_InfoAboutKey_Onboot, xTmpStr.GetData());
  425. LogEvent(Severity_Middle, LOG_EVT_PINPAD_OPEN_SUC, "Open pinpad suc.");
  426. //oiltmp@20240521 add for redundancy to check
  427. CSmartPointer<IConfigInfo> spConfigCen;
  428. int iTmp = 0;
  429. GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spConfigCen);
  430. if (spConfigCen->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "UseBackupSN", iTmp) == Error_Succeed)
  431. {
  432. if (iTmp == 1)
  433. m_bUseBackupSN = true;
  434. else if (iTmp > 1)//to except default value 0
  435. m_bUseBackupSN = false;
  436. }
  437. CSimpleStringA csRunInfo, csSNBakFile;
  438. if ((eErr = GetEntityBase()->GetFunction()->GetPath("RunInfo", csRunInfo)) == Error_Succeed)
  439. {
  440. csSNBakFile = csRunInfo + SPLIT_SLASH_STR + "snbak.dat";
  441. ifstream infile(csSNBakFile, std::ofstream::binary);
  442. char* buffer = new char[16];
  443. ZeroMemory(buffer, 16);
  444. if (infile.is_open())
  445. infile.read(buffer, 16);
  446. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("bak.sn:%s", buffer);
  447. if (strlen(buffer) > 0 && m_keySNSM.Compare(buffer) != 0)
  448. {
  449. LogWarn(Severity_High, Error_Unexpect, PinPad_UserErrorCode_PinPad_SN_NOTMATCH, CSimpleStringA::Format("m_keySN:%s,snbak:%s", m_keySNSM.GetData(), buffer));
  450. if (m_bUseBackupSN)
  451. {
  452. m_keySNSM = buffer;
  453. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("because save failed, use backup sn:%s", m_keySNSM);
  454. }
  455. }
  456. delete[] buffer;
  457. infile.close();
  458. }
  459. return 0;
  460. }
  461. unsigned int __stdcall DoWork(void *pData)
  462. {
  463. while(1)
  464. {
  465. CPinPadFSM *pFsm = (CPinPadFSM*)pData;
  466. pFsm->m_hInputConVar.Wait();
  467. if (pFsm->GetEntityExit())
  468. break;
  469. FSMEvent *evt;
  470. int ret;
  471. if (!pFsm->GetDevInitFlag())
  472. {
  473. ret = pFsm->Initial();
  474. evt = new FSMEvent(USER_EVT_INITFINISHED);
  475. }
  476. else if (pFsm->IsInGetInputJS())
  477. {
  478. SpReqAnsContext<PinPadService_GetInputJS_Req, PinPadService_GetInputJS_Ans>::Pointer ctxJS;
  479. bool bRet = pFsm->GetJSCtx(ctxJS);
  480. if (!bRet)
  481. {
  482. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("get ctx(JS) failed.doing nothing");
  483. continue;
  484. }
  485. ret = pFsm->GetInputJS(ctxJS);
  486. evt = new FSMEvent(USER_EVT_GETINPUT_JS_FINISHED);
  487. }
  488. else
  489. {
  490. SpReqAnsContext<PinPadService_GetInputSM_Req, PinPadService_GetInputSM_Ans>::Pointer ctxSM;
  491. bool bRet = pFsm->GetCtx(ctxSM);
  492. if (!bRet)
  493. {
  494. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("get ctx failed.doing nothing");
  495. continue;
  496. }
  497. ret = pFsm->GetInput(ctxSM);
  498. evt = new FSMEvent(USER_EVT_GETINPUT_SM_FINISHED);
  499. }
  500. if (ret == 0)
  501. evt->param1 = 0;
  502. else
  503. evt->param1 = 1;
  504. pFsm->PostEventFIFO(evt);
  505. }
  506. #if defined(RVC_OS_WIN)
  507. _endthreadex(0);
  508. #else
  509. pthread_exit(0);
  510. #endif //RVC_OS_WIN
  511. return 0;
  512. }
  513. void CPinPadFSM::push_char(char *buf, int *len, int c)
  514. {
  515. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("len:%d",*len);
  516. buf[*len] = c;
  517. *len = *len + 1;
  518. buf[*len] = 0;
  519. InputContent evt;
  520. evt.data = buf;
  521. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(InputContent), SP_MSG_SIG_OF(InputContent), evt);
  522. }
  523. void CPinPadFSM::PushInputChar(char *buf,int c)
  524. {
  525. buf[0] = c;
  526. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("anyinput[%d][%s]",c,buf);
  527. InputContent evt;
  528. evt.data = buf;
  529. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(InputContent), SP_MSG_SIG_OF(InputContent), evt);
  530. }
  531. void CPinPadFSM::pop_char(char *buf, int *len, bool bClear)
  532. {
  533. if (*len > 0) {
  534. if (bClear){
  535. memset(buf,0,*len);
  536. *len = 0;
  537. }else {
  538. *len -= 1;
  539. buf[*len] = 0;
  540. }
  541. InputContent evt;
  542. evt.data = buf;
  543. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(InputContent), SP_MSG_SIG_OF(InputContent), evt);
  544. }
  545. }
  546. void CPinPadFSM::clear_char(char *buf, int *len)
  547. {
  548. if (*len > 0) {
  549. *len = 0;
  550. buf[*len] = 0;
  551. InputContent evt;
  552. evt.data = buf;
  553. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(InputContent), SP_MSG_SIG_OF(InputContent), evt);
  554. }
  555. }
  556. bool CPinPadFSM::Get12Account(char *szAcc)
  557. {
  558. memset(m_szAccount,0,sizeof(m_szAccount));
  559. const int accLen = strlen(szAcc);
  560. if (accLen == 0) {
  561. return false;
  562. }
  563. if (accLen > 12)
  564. memcpy(m_szAccount + 4, szAcc + (accLen - 12 -1), 12);
  565. else if (accLen == 12)
  566. {
  567. if (strncmp(szAcc, "0755", 4) == 0)
  568. memcpy(m_szAccount + 4, szAcc, 12);
  569. else
  570. {
  571. m_szAccount[4] = '5';
  572. memcpy(m_szAccount + 5, szAcc + 1, 11);
  573. }
  574. }
  575. else if (accLen == 9)
  576. {
  577. memcpy(m_szAccount + 4, szAcc, 3);
  578. memcpy(m_szAccount + 7, szAcc, 9);
  579. }
  580. else
  581. memcpy(m_szAccount + 4, szAcc, accLen);
  582. return true;
  583. }
  584. ErrorCodeEnum CPinPadFSM::GetEncryptText(SpReqAnsContext<PinPadService_GetInputSM_Req, PinPadService_GetInputSM_Ans>::Pointer ctxSM)
  585. {
  586. LOG_FUNCTION();
  587. ErrorCodeEnum errCode;
  588. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  589. int len, timeout;
  590. bool confirm, bSMFlag = false;
  591. len = ctxSM->Req.length;
  592. timeout = ctxSM->Req.timeout;
  593. confirm = ctxSM->Req.confirm;
  594. if (ctxSM->Req.smflag == 1 || ctxSM->Req.smflag == 11)
  595. {
  596. bSMFlag = true;
  597. }
  598. if (!bSMFlag)
  599. {
  600. LogWarn(Severity_Low, Error_Unexpect, PinPad_UserErrorCode_PinPad_Not_SM, "Encryption is not SM");
  601. ctxSM->Answer(Error_Unexpect, PinPad_UserErrorCode_UnknownSMFlag);
  602. return Error_Unexpect;
  603. }
  604. AccountInfo accInfo;
  605. memset(accInfo.account, 0, MAX_ACCOUNT_LEN);
  606. CSimpleStringA errMsg(true);
  607. if (Get12Account(const_cast<char*>(ctxSM->Req.account.GetData())))
  608. memcpy(accInfo.account, m_szAccount + 4, 12);
  609. else
  610. {
  611. errMsg = CSimpleStringA::Format("Get12Account err(%s).", (const char*)ctxSM->Req.account);
  612. if (IsInBusiness())
  613. {
  614. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setResultCode("RTA2607")(errMsg.GetData());
  615. LogError(Severity_High, Error_Unexpect, PinPad_UserErrorCode_PinPad_GetEncryptText_Get12Account_Error, errMsg.GetData());
  616. }
  617. else
  618. LogWarn(Severity_High, Error_Unexpect, PinPad_UserErrorCode_PinPad_GetEncryptText_Get12Account_Error, errMsg.GetData());
  619. ctxSM->Answer(Error_DevCommFailed, PinPad_UserErrorCode_PinPad_GetEncryptText_Get12Account_Error);
  620. return Error_DevCommFailed;
  621. }
  622. //memcpy(accInfo.account,"588571006555",12);
  623. accInfo.dwAccLen = 12;
  624. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("acc(%s)", accInfo.account);
  625. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  626. errCode = m_hDevHelper->SetAccNo(accInfo);
  627. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  628. if (errCode != Error_Succeed)
  629. {
  630. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("[sm]set accout(%s)(%s) failed(%d).", (const char*)ctxSM->Req.account, accInfo.account, errCode);
  631. SetErrorAndLog(errCode, MEC_DEVAPI_EPP_SetAccNo, "DevAdapter::SetAccNo", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime, PinPadService_LogCode_GetInputSM);
  632. ctxSM->Answer(Error_DevCommFailed, GetAlarmDEC());
  633. return Error_DevCommFailed;
  634. }
  635. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetAccNo").setCostTime(m_ullEndTime - m_ullBeginTime)();
  636. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  637. errCode = m_hDevHelper->ActiveWorkingKey(1, 0);
  638. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  639. if (errCode != Error_Succeed)
  640. {
  641. SetErrorAndLog(errCode, MEC_DEVAPI_EPP_ActiveWorkingKey, "DevAdapter::ActiveWorkingKey", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime, PinPadService_LogCode_GetInputSM);
  642. ctxSM->Answer(Error_DevCommFailed, GetAlarmDEC());
  643. return Error_DevCommFailed;
  644. }
  645. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::ActiveWorkingKey").setCostTime(m_ullEndTime - m_ullBeginTime)();
  646. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  647. errCode = m_hDevHelper->SetParam(EPP_PT_SET_PIN_ALGORITH, EPP_PIN_ALGO_SM4);
  648. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  649. if (errCode != Error_Succeed)
  650. {
  651. SetErrorAndLog(errCode, MEC_DEVAPI_EPP_SetParam, "DevAdapter::SetParam", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime, PinPadService_LogCode_GetInputSM);
  652. ctxSM->Answer(Error_DevCommFailed, GetAlarmDEC());
  653. return Error_DevCommFailed;
  654. }
  655. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetParam").setCostTime(m_ullEndTime - m_ullBeginTime)();
  656. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  657. errCode = m_hDevHelper->StartPinInput(len);
  658. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  659. if (errCode != Error_Succeed)
  660. {
  661. SetErrorAndLog(errCode, MEC_DEVAPI_EPP_StartPinInput, "DevAdapter::StartPinInput", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime, PinPadService_LogCode_GetInputSM);
  662. ctxSM->Answer(Error_DevCommFailed, GetAlarmDEC());
  663. return Error_DevCommFailed;
  664. }
  665. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::StartPinInput").setCostTime(m_ullEndTime - m_ullBeginTime)();
  666. char* buf = new char[len + 1];
  667. memset(buf, 0, len + 1);
  668. int readed = 0;
  669. DWORD elapsed = 0;
  670. DWORD dwStart = GetTickCount();
  671. DWORD dwEnd = GetTickCount();
  672. bool bCancelInput = false;
  673. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("req(pin)len:[%d],timeout:[%d],confirm:[%d],bExit(%d)", len, timeout, confirm, m_bExit);
  674. while (elapsed < MAX_PINPAD_INPUT_TIMEOUT) {
  675. if (m_bExit)
  676. break;
  677. if (!confirm && readed >= len)
  678. break;
  679. if (m_bWaitingMore)
  680. {
  681. dwStart = GetTickCount();
  682. elapsed = 0;
  683. m_bWaitingMore = false;
  684. continue;
  685. }
  686. if (m_bFrontCancel)
  687. {
  688. bCancelInput = true;
  689. goto Err;
  690. }
  691. BYTE btCh;
  692. Sleep(100);
  693. errCode = m_hDevHelper->KeyRead(btCh);//循环调用,无需计算耗时
  694. if (errCode == Error_Succeed) {
  695. LogEvent(Severity_Middle, LOG_EVT_PINPAD_OP, "PinPad op.", ctxSM->link);
  696. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("PinPad op: %d", readed);
  697. if (btCh == 0x0d) {
  698. if (confirm)
  699. {
  700. ctxSM->Ans.enter = true;
  701. if (buf != NULL)
  702. delete[]buf;
  703. ctxSM->Answer(Error_Succeed);
  704. return Error_Succeed;
  705. }
  706. else
  707. {
  708. dwEnd = GetTickCount();
  709. elapsed = dwEnd - dwStart;
  710. continue;
  711. }
  712. }
  713. else if (btCh == 0x08) { // back
  714. if (confirm)
  715. {
  716. dwEnd = GetTickCount();
  717. elapsed = dwEnd - dwStart;
  718. continue;
  719. }
  720. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("clear input");
  721. pop_char(buf, &readed,true);
  722. } else if (btCh == 0x1b) { // quit
  723. if (confirm)
  724. {
  725. ctxSM->Ans.enter = true;
  726. if (buf != NULL)
  727. delete[]buf;
  728. ctxSM->Answer(Error_Succeed);
  729. return Error_Succeed;
  730. }
  731. else
  732. {
  733. bCancelInput = true;
  734. goto Err;
  735. }
  736. }
  737. else if (btCh == 0x3f) {
  738. if (confirm)
  739. {
  740. dwEnd = GetTickCount();
  741. elapsed = dwEnd - dwStart;
  742. continue;
  743. }
  744. push_char(buf, &readed, '*');
  745. }else{
  746. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("else[%d]",btCh);
  747. }
  748. }
  749. else {
  750. }
  751. dwEnd = GetTickCount();
  752. elapsed = dwEnd - dwStart;
  753. }
  754. buf[readed] = 0;
  755. Err:
  756. if (m_bExit)
  757. {
  758. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("exit");
  759. ctxSM->Answer(Error_Unexpect, PinPad_UserErrorCode_Unexpected_Exit);
  760. return Error_Unexpect;
  761. }
  762. m_bExit = false;
  763. if (buf != NULL)
  764. delete[]buf;
  765. if (bCancelInput)
  766. {
  767. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220602")("input cancel(pin)");
  768. ctxSM->Answer(Error_Cancel);
  769. return Error_Cancel;
  770. }
  771. if (readed < len) {
  772. if (elapsed >= MAX_PINPAD_INPUT_TIMEOUT) {
  773. ctxSM->Answer(Error_TimeOut);
  774. return Error_TimeOut;
  775. }
  776. }
  777. PinBlock pinBlk;
  778. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("to getpinblk");
  779. Sleep(500);//nantian
  780. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  781. errCode = m_hDevHelper->GetPinBlock(pinBlk);
  782. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  783. LogWarn(Severity_Low, Error_Succeed, PinPad_UserErrorCode_PinPad_GetPinBlock_Call
  784. , CSimpleStringA::Format("{\"cost\":%d}", m_ullEndTime - m_ullBeginTime));
  785. if (errCode == Error_Succeed)
  786. {
  787. char* tmpPinData = new char[MAX_PIN_BLOCK_SIZE];
  788. if (tmpPinData == NULL)
  789. return Error_Resource;
  790. memset(tmpPinData, 0, MAX_PIN_BLOCK_SIZE);
  791. memcpy(tmpPinData, pinBlk.data, pinBlk.dwSize);
  792. ctxSM->Ans.data = tmpPinData;
  793. //Dbg("pinblk(%s)",tmpPinData);
  794. if (tmpPinData != NULL)
  795. {
  796. delete[]tmpPinData;
  797. tmpPinData = NULL;
  798. }
  799. EnDecryptInfo srcInfo, dstInfo;
  800. memset(srcInfo.data, 0, MAX_EN_DECRYPT_DATA_SIZE);
  801. memcpy(srcInfo.data, m_devCheckData, m_devCheckData.GetLength());
  802. srcInfo.dwSize = m_devCheckData.GetLength();
  803. memset(dstInfo.data, 0, MAX_EN_DECRYPT_DATA_SIZE);
  804. //set param
  805. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  806. errCode = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_SM4);
  807. if (errCode == Error_Succeed)
  808. errCode = m_hDevHelper->SetParam(EPP_PT_SET_ECB_CBC_MODE, EPP_ALGO_MODE_CBC);
  809. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  810. if (errCode != Error_Succeed)
  811. {
  812. SetErrorAndLog(errCode, MEC_DEVAPI_EPP_SetParam, "DevAdapter::SetParam", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime, PinPadService_LogCode_GetInputSM);
  813. ctxSM->Answer(Error_Param, GetAlarmDEC());
  814. return Error_Param;
  815. }
  816. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetParam").setCostTime(m_ullEndTime - m_ullBeginTime)();
  817. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  818. errCode = m_hDevHelper->EncryptData(srcInfo, dstInfo);
  819. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  820. if (errCode != Error_Succeed)
  821. {
  822. SetErrorAndLog(errCode, MEC_DEVAPI_EPP_EncryptData, "DevAdapter::EncryptData", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime, PinPadService_LogCode_GetInputSM);
  823. ctxSM->Answer(Error_DevCommFailed, GetAlarmDEC());
  824. return Error_DevCommFailed;
  825. }
  826. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::EncryptData").setCostTime(m_ullEndTime - m_ullBeginTime)();
  827. char* tmpCheckCode = new char[MAX_PIN_BLOCK_SIZE];
  828. if (tmpCheckCode == NULL)
  829. return Error_Resource;
  830. memset(tmpCheckCode, 0, MAX_PIN_BLOCK_SIZE);
  831. //HexBuf2StrBuf(dstInfo.data,&tmpCheckCode,dstInfo.dwSize);
  832. memcpy(tmpCheckCode, dstInfo.data, dstInfo.dwSize);
  833. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ckckck[%s], m_keySNSM:%s", tmpCheckCode, m_keySNSM.GetData());
  834. if (strnicmp(tmpCheckCode, "9F1F7BFF6F5511384D9430531E538FD3", strlen("9F1F7BFF6F5511384D9430531E538FD3")) == 0)
  835. SetErrorAndLog(Error_Unexpect, PinPad_UserErrorCode_KEY_LOST_SM, "", __FUNCTION__);
  836. ctxSM->Ans.checkcode = tmpCheckCode;
  837. ctxSM->Ans.deviceno = m_deviceNo;
  838. ctxSM->Ans.keyseq = m_keySNSM;
  839. CSimpleStringA tmpLastCkCode = m_lastCheckCode;
  840. if (m_lastCheckCode.IsNullOrEmpty() || strnicmp(tmpCheckCode, m_lastCheckCode, m_lastCheckCode.GetLength()) != 0)
  841. {
  842. ErrorCodeEnum eErr;
  843. CSmartPointer<IConfigInfo> spConfigRun;
  844. eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
  845. if (eErr == Error_Succeed)
  846. {
  847. spConfigRun->WriteConfigValue("Load", "ckckck", tmpCheckCode);
  848. m_lastCheckCode = tmpCheckCode;
  849. }
  850. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("write ckckck:%s", tmpCheckCode);
  851. }
  852. if (!tmpLastCkCode.IsNullOrEmpty() && strnicmp(tmpCheckCode, tmpLastCkCode, tmpLastCkCode.GetLength()) != 0)
  853. {
  854. CSimpleStringA xCkChangeMsg = CSimpleStringA::Format("last ck:%s,current ck:%s,m_keySNSM:%s", tmpLastCkCode.GetData()
  855. , tmpCheckCode, m_keySNSM.GetData());
  856. LogWarn(Severity_Low, Error_Unexpect, PinPad_UserErrorCode_PinPad_CheckCode_Changed, xCkChangeMsg.GetData());
  857. }
  858. }
  859. else
  860. {
  861. SetErrorAndLog(errCode, MEC_DEVAPI_EPP_GetPinBlock, "DevAdapter::GetPinBlock", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime, PinPadService_LogCode_GetInputSM);
  862. ctxSM->Answer(Error_DevCommFailed, GetAlarmDEC());
  863. return Error_DevCommFailed;
  864. }
  865. DbgWithLink(LOG_LEVEL_INFO, ctxSM->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM)
  866. .setAPI("DevAdapter::GetPinBlock").setCostTime(m_ullEndTime - m_ullBeginTime)("获取密文成功");
  867. //oilyang@20240410 move to out space,after stopinput & turn off the light
  868. //Sleep(100);
  869. //ctxSM->Answer(Error_Succeed);
  870. return Error_Succeed;
  871. }
  872. int CPinPadFSM::GetInput(SpReqAnsContext<PinPadService_GetInputSM_Req, PinPadService_GetInputSM_Ans>::Pointer ctxSM)
  873. {
  874. DWORD dwCurrThId = GetCurrentThreadId();
  875. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("GetInput thread id:%d",dwCurrThId);
  876. m_bWaitingMore = false;
  877. m_bFrontCancel = false;
  878. m_bExit = false;
  879. LogEvent(Severity_Middle, LOG_EVT_PINPAD_GREEN_ON, "PinPad light on.");
  880. if (!m_hDevHelper)
  881. {
  882. SetErrorAndLog(Error_Unexpect, PinPad_UserErrorCode_PinPad_Instance_Is_Null, "", __FUNCTION__, false, 0, PinPadService_LogCode_GetInputSM);
  883. m_inputSMCtx->Answer(Error_Unexpect, GetAlarmDEC());
  884. LogEvent(Severity_Middle, LOG_EVT_PINPAD_GREEN_OFF, "PinPad light off.");
  885. m_bPinInput = false;
  886. return 1;
  887. }
  888. if (!m_inputSMCtx->Req.encrypt)
  889. {
  890. SetErrorAndLog(Error_Unexpect, PinPad_UserErrorCode_NoPlainInput, "", __FUNCTION__, false, 0, PinPadService_LogCode_GetInputSM);
  891. m_inputSMCtx->Answer(Error_Unexpect, GetAlarmDEC());
  892. return 1;
  893. }
  894. ULLINT ullGetInputBegin = SP::Module::Comm::RVCGetTickCount();
  895. ErrorCodeEnum eErrCode = GetEncryptText(m_inputSMCtx);
  896. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  897. ErrorCodeEnum errClosePinPad = m_hDevHelper->StopInput();
  898. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  899. if (errClosePinPad != Error_Succeed)
  900. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("DevAdapter::StopInput").setResultCode("RTA2614").setCostTime(m_ullEndTime - m_ullBeginTime)("close pinpad(%s).", SpStrError(errClosePinPad));
  901. else
  902. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::StopInput").setCostTime(m_ullEndTime - m_ullBeginTime)("StopInput cost(%d)ms", m_ullEndTime - m_ullBeginTime);
  903. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)
  904. ("req acc.len:%d,confirm:%d,len:%d. ans:ck.len:%d", m_inputSMCtx->Req.account.GetLength(), m_inputSMCtx->Req.confirm
  905. , m_inputSMCtx->Req.length, m_inputSMCtx->Ans.checkcode.IsNullOrEmpty() ? 0 : m_inputSMCtx->Ans.checkcode.GetLength());
  906. DbgToBeidou(m_inputSMCtx->link, "GetInput")();
  907. m_bPinInput = false;
  908. LogEvent(Severity_Middle, LOG_EVT_PINPAD_GREEN_OFF, "PinPad light off.");
  909. if (eErrCode == Error_Succeed && !m_inputSMCtx->Req.confirm)
  910. {
  911. ULLINT ullGetInputEnd = SP::Module::Comm::RVCGetTickCount();
  912. LogWarn(Severity_Low, Error_Unexpect, PinPad_UserErrorCode_GetInput_TimeCost, CSimpleStringA::Format("%d", (ullGetInputEnd - ullGetInputBegin) / 1000));
  913. m_inputSMCtx->Answer(Error_Succeed);
  914. }
  915. return 0;
  916. }
  917. int CPinPadFSM::LoadKeySM(SpReqAnsContext<PinPadService_LoadKeysSM_Req, PinPadService_LoadKeysSM_Ans>::Pointer ctx)
  918. {
  919. ErrorCodeEnum eErr;
  920. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  921. CSmartPointer<IConfigInfo> spConfig;
  922. eErr = spEntityFunction->OpenConfig(Config_Run, spConfig);
  923. if (eErr != Error_Succeed)
  924. {
  925. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("LoadKeySM::OpenConfig failed,eErr:%d", eErr);
  926. spConfig = NULL;
  927. ctx->Answer(eErr, PinPad_UserErrorCode_Open_RunCfgFile_Failed);
  928. return 0;
  929. }
  930. if (!(ctx->Req.smflag == 1 || ctx->Req.smflag == 11))
  931. {
  932. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("密钥标识不支持,ctx->Req.smflag:%d", ctx->Req.smflag);
  933. ctx->Answer(Error_Unexpect, PinPad_UserErrorCode_UnknownSMFlag);
  934. return 0;
  935. }
  936. //initialization need load master key
  937. if (ctx->Req.initializeflag)
  938. {
  939. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("mkey len:%d,ctx->Req.smflag:%d", strlen(ctx->Req.masterkey), ctx->Req.smflag);
  940. if (ctx->Req.smflag == 11)
  941. {
  942. #if defined(RVC_OS_WIN)
  943. MasterKeyParamEx mkParamEx;
  944. mkParamEx.dwSN = 1;
  945. mkParamEx.smFlag = ctx->Req.smflag;
  946. memset(mkParamEx.key, 0, MAX_EN_DECRYPT_DATA_SIZE);
  947. memcpy(mkParamEx.key, ctx->Req.masterkey, strlen(ctx->Req.masterkey));
  948. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  949. eErr = m_hDevHelper->LoadMasterKeyEx(mkParamEx);
  950. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  951. if (eErr != Error_Succeed)
  952. {
  953. SetErrorAndLog(eErr, MEC_DEVAPI_EPP_LoadMasterKey, "DevAdapter::LoadMasterKey", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime);
  954. ctx->Ans.result = 0;
  955. ctx->Answer(Error_Unexpect, GetAlarmDEC());
  956. m_bLoadKey = false;
  957. return 0;
  958. }
  959. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::LoadMasterKeyEx").setCostTime(m_ullEndTime - m_ullBeginTime)();
  960. #endif
  961. }
  962. else
  963. {
  964. MasterKeyParam mkParam;
  965. mkParam.dwSN = 1;
  966. mkParam.smFlag = ctx->Req.smflag;
  967. memset(mkParam.key, 0, MAX_MASTER_KEY_SIZE);
  968. memcpy(mkParam.key, ctx->Req.masterkey, strlen(ctx->Req.masterkey));
  969. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  970. eErr = m_hDevHelper->LoadMasterKey(mkParam);
  971. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  972. if (eErr != Error_Succeed)
  973. {
  974. SetErrorAndLog(eErr, MEC_DEVAPI_EPP_LoadMasterKey, "DevAdapter::LoadMasterKey", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime);
  975. ctx->Ans.result = 0;
  976. ctx->Answer(Error_Unexpect, GetAlarmDEC());
  977. m_bLoadKey = false;
  978. return 0;
  979. }
  980. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::LoadMasterKey").setCostTime(m_ullEndTime - m_ullBeginTime)();
  981. }
  982. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_LoadKeysSM)("Load master key suc.");
  983. //after load Master key,clear the load key status
  984. spConfig->WriteConfigValueInt("Load", "SM", 0);
  985. }
  986. WorkKeyParam wkParam1, wkParam2;
  987. memset(wkParam1.key, 0, MAX_WORKING_KEY_SIZE);
  988. memset(wkParam2.key, 0, MAX_WORKING_KEY_SIZE);
  989. wkParam1.dwMasterSN = wkParam2.dwMasterSN = 1;
  990. wkParam1.dwWorkingSN = 0;
  991. wkParam2.dwWorkingSN = 1;
  992. wkParam1.smFlag = ctx->Req.smflag;
  993. wkParam2.smFlag = ctx->Req.smflag;
  994. memcpy(wkParam1.key, ctx->Req.workingkey1, strlen(ctx->Req.workingkey1));
  995. memcpy(wkParam2.key, ctx->Req.workingkey2, strlen(ctx->Req.workingkey2));
  996. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  997. eErr = m_hDevHelper->LoadWorkingKey(wkParam1);
  998. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  999. if (eErr != Error_Succeed)
  1000. {
  1001. SetErrorAndLog(eErr, MEC_DEVAPI_EPP_LoadWorkingKey, "DevAdapter::LoadWorkingKey", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime);
  1002. ctx->Ans.result = 1;
  1003. ctx->Answer(Error_Unexpect, GetAlarmDEC());
  1004. m_bLoadKey = false;
  1005. return 0;
  1006. }
  1007. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::LoadWorkingKey").setCostTime(m_ullEndTime - m_ullBeginTime)("Load working key1 suc.");
  1008. //oilyang@20220308 to calc checkcode if called Initializer
  1009. if (ctx->Req.initializeflag)
  1010. {
  1011. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("the new check code:%s", ctx->Req.reserved4.GetData());
  1012. LogWarn(Severity_Low, Error_Unexpect, PinPad_UserErrorCode_PinPad_CkCode_While_Load_SM, ctx->Req.reserved4);
  1013. }
  1014. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1015. eErr = m_hDevHelper->LoadWorkingKey(wkParam2);
  1016. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1017. if (eErr != Error_Succeed)
  1018. {
  1019. SetErrorAndLog(eErr, MEC_DEVAPI_EPP_LoadWorkingKey, "DevAdapter::LoadWorkingKey", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime);
  1020. ctx->Ans.result = 2;
  1021. ctx->Answer(Error_Unexpect, GetAlarmDEC());
  1022. m_bLoadKey = false;
  1023. return 0;
  1024. }
  1025. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::LoadWorkingKey").setCostTime(m_ullEndTime - m_ullBeginTime)("Load working key2 suc.");
  1026. if (spConfig != NULL)
  1027. {
  1028. eErr = spConfig->WriteConfigValueInt("Load", "SM", 1);
  1029. if (eErr != Error_Succeed)
  1030. {
  1031. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setResultCode("RTA2613")("写密钥加载标识失败:%s", SpStrError(eErr));
  1032. LogWarn(Severity_Middle, Error_Unexpect, PinPad_UserErrorCode_Write_RunCfgFile_Failed, CSimpleStringA::Format("写密钥加载标识失败:%s", SpStrError(eErr)));
  1033. }
  1034. if (!ctx->Req.reserved3.IsNullOrEmpty())
  1035. {
  1036. if ((eErr = spConfig->WriteConfigValue("Load", "SN_SM", ctx->Req.reserved3)) != Error_Succeed)
  1037. {
  1038. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setResultCode("RTA2613")("写密钥序号失败:%s", SpStrError(eErr));
  1039. LogWarn(Severity_Middle, Error_Unexpect, PinPad_UserErrorCode_Write_RunCfgFile_Failed, CSimpleStringA::Format("写密钥序号失败:%s", SpStrError(eErr)));
  1040. }
  1041. m_keySNSM = ctx->Req.reserved3;
  1042. LogWarn(Severity_Low, Error_Unexpect, PinPad_UserErrorCode_PinPad_LoadKey_SMSN
  1043. , CSimpleStringA::Format("{\"subject\":\"key_sn\",\"value\":\"%s\"}", m_keySNSM.GetData()));
  1044. //oiltmp@20240521 add for redundancy to check
  1045. CSimpleStringA csRunInfo,csSNBakFile;
  1046. if ((eErr = GetEntityBase()->GetFunction()->GetPath("RunInfo", csRunInfo)) == Error_Succeed)
  1047. {
  1048. csSNBakFile = csRunInfo + SPLIT_SLASH_STR + "snbak.dat";
  1049. ofstream outfile(csSNBakFile, std::ofstream::binary|ios::trunc);
  1050. int size = m_keySNSM.GetLength();
  1051. char* buffer = new char[size + 1];
  1052. ZeroMemory(buffer, size + 1);
  1053. memcpy(buffer, m_keySNSM.GetData(), size);
  1054. outfile.write(buffer, size);
  1055. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("write sn bak:%s", buffer);
  1056. delete[] buffer;
  1057. outfile.close();
  1058. }
  1059. }
  1060. else
  1061. {
  1062. spConfig->WriteConfigValue("Load", "SN_SM", "");
  1063. m_keySNSM = "";
  1064. LogWarn(Severity_Low, Error_Unexpect, PinPad_UserErrorCode_PinPad_LoadKey_Clear_SMSN, "clear sm key sn");
  1065. }
  1066. }
  1067. m_bLoadKey = false;
  1068. m_bSMLoaded = true;
  1069. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_LoadKeysSM)("加载密钥成功");
  1070. ctx->Answer(Error_Succeed);
  1071. return 0;
  1072. }
  1073. int CPinPadFSM::EncryptSM(SpReqAnsContext<PinPadService_EncryptDataSM_Req, PinPadService_EncryptDataSM_Ans>::Pointer ctx)
  1074. {
  1075. if (!(ctx->Req.smflag == 1 || ctx->Req.smflag == 11))
  1076. {
  1077. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("密钥标识不支持,ctx->Req.smflag:%d", ctx->Req.smflag);
  1078. ctx->Answer(Error_Unexpect, PinPad_UserErrorCode_UnknownSMFlag);
  1079. return 0;
  1080. }
  1081. //set param
  1082. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1083. if (m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_SM4) != Error_Succeed
  1084. || m_hDevHelper->SetParam(EPP_PT_SET_ECB_CBC_MODE, EPP_ALGO_MODE_CBC) != Error_Succeed)
  1085. {
  1086. SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_EPP_SetParam, "DevAdapter::SetParam", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime);
  1087. ctx->Answer(Error_Unexpect, GetAlarmDEC());
  1088. m_bEncrypt = false;
  1089. return 0;
  1090. }
  1091. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1092. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1093. ErrorCodeEnum eErr = m_hDevHelper->ActiveWorkingKey(1, 1);
  1094. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1095. DbgToBeidou(ctx->link, "ActiveWorkingKey")();
  1096. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_EncryptDataSM).setCostTime(m_ullEndTime - m_ullBeginTime)("%s", SpStrError(eErr));
  1097. if (eErr != Error_Succeed)
  1098. {
  1099. SetErrorAndLog(eErr, MEC_DEVAPI_EPP_ActiveWorkingKey, "DevAdapter::ActiveWorkingKey", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime);
  1100. ctx->Answer(Error_Unexpect, GetAlarmDEC());
  1101. m_bEncrypt = false;
  1102. return 0;
  1103. }
  1104. EnDecryptInfo srcData, dstData;
  1105. ZeroMemory(srcData.data, MAX_EN_DECRYPT_DATA_SIZE);
  1106. ZeroMemory(dstData.data, MAX_EN_DECRYPT_DATA_SIZE);
  1107. srcData.dwSize = strlen(ctx->Req.data);
  1108. memcpy(srcData.data, ctx->Req.data, srcData.dwSize);
  1109. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1110. eErr = m_hDevHelper->EncryptData(srcData, dstData);
  1111. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1112. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::EncryptData").setCostTime(m_ullEndTime - m_ullBeginTime)("%s", SpStrError(eErr));
  1113. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_EncryptDataSM)("srcData.dwSize:%d,dstData.dwSize", srcData.dwSize, dstData.dwSize);
  1114. DbgToBeidou(ctx->link, "EncryptData")();
  1115. if (eErr != Error_Succeed)
  1116. {
  1117. SetErrorAndLog(eErr, MEC_DEVAPI_EPP_EncryptData, "DevAdapter::EncryptData", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime);
  1118. ctx->Answer(Error_Unexpect, GetAlarmDEC());
  1119. m_bEncrypt = false;
  1120. return 0;
  1121. }
  1122. ctx->Ans.ciphertext = (char*)dstData.data;
  1123. m_bEncrypt = false;
  1124. ctx->Answer(Error_Succeed);
  1125. return 0;
  1126. }
  1127. ErrorCodeEnum CPinPadFSM::GetCheckCode(SpReqAnsContext<PinPadService_GetCheckCode_Req, PinPadService_GetCheckCode_Ans>::Pointer ctx)
  1128. {
  1129. ErrorCodeEnum eErr = Error_Unexpect;
  1130. bool bGetOK = true;
  1131. ctx->Ans.checkcode.Init(ctx->Req.mSN.GetCount());
  1132. ctx->Ans.index.Init(ctx->Req.mSN.GetCount());
  1133. for (int i = 0; i < ctx->Req.mSN.GetCount(); i++)
  1134. {
  1135. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("mSN:%d,wSN:%d,origData[%s]", ctx->Req.mSN[i], ctx->Req.wSN[i], m_devCheckData.GetData());
  1136. //set param
  1137. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1138. if (ctx->Req.mSN[i] == 1)
  1139. eErr = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_SM4);
  1140. else
  1141. {
  1142. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetCheckCode).setResultCode("RTA260B")("mSN:%d", ctx->Req.mSN[i]);
  1143. ctx->Ans.checkcode[i] = "";
  1144. ctx->Ans.index[i] = "";
  1145. continue;
  1146. }
  1147. if (eErr == Error_Succeed)
  1148. eErr = m_hDevHelper->SetParam(EPP_PT_SET_ECB_CBC_MODE, EPP_ALGO_MODE_CBC);
  1149. else
  1150. {
  1151. SetErrorAndLog(eErr, MEC_DEVAPI_EPP_SetParam, "DevAdapter::SetParam", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, PinPadService_LogCode_GetCheckCode);
  1152. return Error_DevCommFailed;
  1153. }
  1154. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1155. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1156. eErr = m_hDevHelper->ActiveWorkingKey(ctx->Req.mSN[i], ctx->Req.wSN[i]);
  1157. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1158. if (eErr != Error_Succeed)
  1159. {
  1160. SetErrorAndLog(eErr, MEC_DEVAPI_EPP_ActiveWorkingKey, "DevAdapter::ActiveWorkingKey", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, PinPadService_LogCode_GetCheckCode);
  1161. ctx->Ans.checkcode[i] = "";
  1162. return Error_DevCommFailed;
  1163. }
  1164. else
  1165. {
  1166. EnDecryptInfo srcInfo, dstInfo;
  1167. memset(srcInfo.data, 0, MAX_EN_DECRYPT_DATA_SIZE);
  1168. memcpy(srcInfo.data, m_devCheckData, m_devCheckData.GetLength());
  1169. srcInfo.dwSize = m_devCheckData.GetLength();
  1170. memset(dstInfo.data, 0, MAX_EN_DECRYPT_DATA_SIZE);
  1171. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1172. eErr = m_hDevHelper->EncryptData(srcInfo, dstInfo);
  1173. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1174. if (eErr != Error_Succeed)
  1175. {
  1176. SetErrorAndLog(eErr, MEC_DEVAPI_EPP_EncryptData, "DevAdapter::EncryptData", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, PinPadService_LogCode_GetCheckCode);
  1177. return Error_DevCommFailed;
  1178. }
  1179. ctx->Ans.checkcode[i] = (const char*)dstInfo.data;
  1180. if (ctx->Req.wSN[i] == 0)
  1181. ctx->Ans.index[i] = m_keySNSM;
  1182. }
  1183. DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setLogCode("QLR040220610")("计算校验码成功");
  1184. }
  1185. ctx->Answer(Error_Succeed);
  1186. return Error_Succeed;
  1187. }
  1188. bool CPinPadFSM::GetDevInfo(DevCategoryInfo &devInfo)
  1189. {
  1190. if (!m_bOpened)
  1191. {
  1192. devInfo.eState = m_eDevState;
  1193. return false;
  1194. }
  1195. DevCategoryInfo info;
  1196. ZeroMemory(info.szModel, MAX_DEV_MODEL_LEN);
  1197. ZeroMemory(info.szType, MAX_DEV_TYPE_LEN);
  1198. ZeroMemory(info.szVendor, MAX_DEV_VENDOR_LEN);
  1199. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1200. ErrorCodeEnum eErrDev = m_hDevHelper->GetDevCategory(info);
  1201. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1202. if (eErrDev == Error_Succeed)
  1203. {
  1204. m_szModel = info.szModel;
  1205. m_szType = info.szType;
  1206. m_szVendor = info.szVendor;
  1207. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevCategory").setCostTime(m_ullEndTime - m_ullBeginTime)
  1208. ("model,%d,%s;type,%d,%s;vendor,%d,%s", strlen(devInfo.szModel), m_szModel.GetData(), strlen(devInfo.szType), m_szType.GetData(), strlen(devInfo.szVendor), m_szVendor.GetData());
  1209. }
  1210. else
  1211. {
  1212. SetErrorAndLog(eErrDev, MEC_DEVAPI_EPP_GetDevCategory, "DevAdapter::GetDevCategory", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime);
  1213. m_szModel = "";
  1214. m_szType = "";
  1215. m_szVendor = "";
  1216. m_eDevState = DEVICE_STATUS_NOT_READY;
  1217. }
  1218. ZeroMemory(devInfo.szModel,MAX_DEV_MODEL_LEN);//CM=V2.0#PM=V1.0#MID=75500001#PID=12345678#FWID=V1234567#Vendor=nantian
  1219. ZeroMemory(devInfo.szType,MAX_DEV_TYPE_LEN);
  1220. ZeroMemory(devInfo.szVendor,MAX_DEV_VENDOR_LEN);
  1221. CSimpleStringA tmpModel("");
  1222. if (m_szModel.GetLength() > 1)
  1223. {
  1224. CSimpleStringA tmpAddStr("");
  1225. tmpAddStr = tmpAddStr + "Vendor=" + m_szVendor;
  1226. if (m_szModel[m_szModel.GetLength() - 1] == '#')
  1227. tmpModel = m_szModel + tmpAddStr;
  1228. else
  1229. tmpModel = m_szModel + "#" + tmpAddStr;
  1230. strncpy(devInfo.szModel, (const char*)tmpModel, tmpModel.GetLength());
  1231. }
  1232. if (m_szType.GetLength() > 1)
  1233. strncpy(devInfo.szType, (const char*)m_szType, m_szType.GetLength());
  1234. if (m_szVendor.GetLength() > 1)
  1235. strncpy(devInfo.szVendor, (const char*)m_szVendor, m_szVendor.GetLength());
  1236. devInfo.eState = m_eDevState;
  1237. return true;
  1238. }
  1239. void CPinPadFSM::SetInWhatPage(int iPageType)
  1240. {
  1241. m_iInWhatPage = iPageType;
  1242. return;//oilyang@20200319 去掉任意情况下可输入
  1243. }
  1244. void CPinPadFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
  1245. {
  1246. if (m_eDevState == DEVICE_STATUS_NORMAL)
  1247. pTransactionContext->SendAnswer(Error_Succeed);
  1248. else if (m_eDevState == DEVICE_STATUS_NOT_READY)
  1249. pTransactionContext->SendAnswer(Error_DevNotAvailable);
  1250. else
  1251. pTransactionContext->SendAnswer(Error_InvalidState);
  1252. }
  1253. ErrorCodeEnum CPinPadFSM::GetEncryptTextJS(SpReqAnsContext<PinPadService_GetInputJS_Req, PinPadService_GetInputJS_Ans>::Pointer ctxJS)
  1254. {
  1255. LOG_FUNCTION();
  1256. ErrorCodeEnum errCode;
  1257. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  1258. int timeout = ctxJS->Req.timeout;
  1259. AccountInfo accInfo;
  1260. memset(accInfo.account, 0, MAX_ACCOUNT_LEN);
  1261. CSimpleStringA errMsg(true);
  1262. if (Get12Account(const_cast<char*>(ctxJS->Req.account.GetData())))
  1263. memcpy(accInfo.account, m_szAccount + 4, 12);
  1264. else
  1265. {
  1266. errMsg = CSimpleStringA::Format("Get12Account err(%s).", (const char*)ctxJS->Req.account);
  1267. if (IsInBusiness())
  1268. {
  1269. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setResultCode("RTA2607")(errMsg.GetData());
  1270. LogError(Severity_High, Error_Unexpect, PinPad_UserErrorCode_PinPad_GetEncryptText_Get12Account_Error, errMsg.GetData());
  1271. }
  1272. else
  1273. LogWarn(Severity_High, Error_Unexpect, PinPad_UserErrorCode_PinPad_GetEncryptText_Get12Account_Error, errMsg.GetData());
  1274. ctxJS->Answer(Error_DevCommFailed, PinPad_UserErrorCode_PinPad_GetEncryptText_Get12Account_Error);
  1275. return Error_DevCommFailed;
  1276. }
  1277. //memcpy(accInfo.account,"588571006555",12);
  1278. accInfo.dwAccLen = 12;
  1279. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("acc(%s)", accInfo.account);
  1280. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1281. errCode = m_hDevHelper->SetAccNo(accInfo);
  1282. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1283. if (errCode != Error_Succeed)
  1284. {
  1285. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("[sm]set accout(%s)(%s) failed(%d).", (const char*)ctxJS->Req.account, accInfo.account, errCode);
  1286. SetErrorAndLog(errCode, MEC_DEVAPI_EPP_SetAccNo, "DevAdapter::SetAccNo", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime, PinPadService_LogCode_GetInputSM);
  1287. ctxJS->Answer(Error_DevCommFailed, GetAlarmDEC());
  1288. return Error_DevCommFailed;
  1289. }
  1290. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetAccNo").setCostTime(m_ullEndTime - m_ullBeginTime)();
  1291. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1292. errCode = m_hDevHelper->ActiveWorkingKey(1, 0);
  1293. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1294. if (errCode != Error_Succeed)
  1295. {
  1296. SetErrorAndLog(errCode, MEC_DEVAPI_EPP_ActiveWorkingKey, "DevAdapter::ActiveWorkingKey", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime, PinPadService_LogCode_GetInputSM);
  1297. ctxJS->Answer(Error_DevCommFailed, GetAlarmDEC());
  1298. return Error_DevCommFailed;
  1299. }
  1300. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::ActiveWorkingKey").setCostTime(m_ullEndTime - m_ullBeginTime)();
  1301. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1302. errCode = m_hDevHelper->SetParam(EPP_PT_SET_PIN_ALGORITH, EPP_PIN_ALGO_SM4);
  1303. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1304. if (errCode != Error_Succeed)
  1305. {
  1306. SetErrorAndLog(errCode, MEC_DEVAPI_EPP_SetParam, "DevAdapter::SetParam", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime, PinPadService_LogCode_GetInputSM);
  1307. ctxJS->Answer(Error_DevCommFailed, GetAlarmDEC());
  1308. return Error_DevCommFailed;
  1309. }
  1310. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetParam").setCostTime(m_ullEndTime - m_ullBeginTime)();
  1311. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1312. errCode = m_hDevHelper->StartPinInput(CurrentPasswordLen);
  1313. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1314. if (errCode != Error_Succeed)
  1315. {
  1316. SetErrorAndLog(errCode, MEC_DEVAPI_EPP_StartPinInput, "DevAdapter::StartPinInput", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime, PinPadService_LogCode_GetInputSM);
  1317. ctxJS->Answer(Error_DevCommFailed, GetAlarmDEC());
  1318. return Error_DevCommFailed;
  1319. }
  1320. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::StartPinInput").setCostTime(m_ullEndTime - m_ullBeginTime)();
  1321. char* buf = new char[CurrentPasswordLen + 1];
  1322. memset(buf, 0, CurrentPasswordLen + 1);
  1323. int readed = 0;
  1324. DWORD elapsed = 0;
  1325. DWORD dwStart = SP::Module::Comm::RVCGetTickCount();
  1326. DWORD dwEnd = SP::Module::Comm::RVCGetTickCount();
  1327. bool bCancelInput = false;
  1328. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("req(pin),timeout:[%d]", timeout);
  1329. while (elapsed < MAX_PINPAD_INPUT_TIMEOUT) {
  1330. if (readed >= CurrentPasswordLen)
  1331. break;
  1332. if (m_bFrontCancel)
  1333. {
  1334. bCancelInput = true;
  1335. goto Err;
  1336. }
  1337. BYTE btCh;
  1338. Sleep(100);
  1339. errCode = m_hDevHelper->KeyRead(btCh);//循环调用,无需计算耗时
  1340. if (errCode == Error_Succeed) {
  1341. LogEvent(Severity_Middle, LOG_EVT_PINPAD_OP, "PinPad op.", ctxJS->link);
  1342. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("PinPad op: %d", readed);
  1343. if (btCh == 0x0d) {
  1344. dwEnd = SP::Module::Comm::RVCGetTickCount();
  1345. elapsed = dwEnd - dwStart;
  1346. continue;
  1347. }
  1348. else if (btCh == 0x08) { // back
  1349. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("clear input");
  1350. pop_char(buf, &readed, true);
  1351. }
  1352. else if (btCh == 0x1b) { // quit
  1353. bCancelInput = true;
  1354. goto Err;
  1355. }
  1356. else if (btCh == 0x3f) {
  1357. push_char(buf, &readed, '*');
  1358. }
  1359. else {
  1360. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("else[%d]", btCh);
  1361. }
  1362. }
  1363. else {
  1364. }
  1365. dwEnd = SP::Module::Comm::RVCGetTickCount();
  1366. elapsed = dwEnd - dwStart;
  1367. }
  1368. buf[readed] = 0;
  1369. Err:
  1370. if (buf != NULL)
  1371. delete[]buf;
  1372. if (bCancelInput)
  1373. {
  1374. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220602")("input cancel(pin)");
  1375. ctxJS->Answer(Error_Cancel);
  1376. return Error_Cancel;
  1377. }
  1378. if (readed < CurrentPasswordLen) {
  1379. if (elapsed >= MAX_PINPAD_INPUT_TIMEOUT) {
  1380. ctxJS->Answer(Error_TimeOut);
  1381. return Error_TimeOut;
  1382. }
  1383. }
  1384. PinBlock pinBlk;
  1385. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("to getpinblk");
  1386. Sleep(500);//nantian
  1387. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1388. errCode = m_hDevHelper->GetPinBlock(pinBlk);
  1389. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1390. LogWarn(Severity_Low, Error_Succeed, PinPad_UserErrorCode_PinPad_GetPinBlock_Call
  1391. , CSimpleStringA::Format("{\"cost\":%d}", m_ullEndTime - m_ullBeginTime));
  1392. if (errCode == Error_Succeed)
  1393. {
  1394. char* tmpPinData = new char[MAX_PIN_BLOCK_SIZE];
  1395. if (tmpPinData == NULL)
  1396. return Error_Resource;
  1397. memset(tmpPinData, 0, MAX_PIN_BLOCK_SIZE);
  1398. memcpy(tmpPinData, pinBlk.data, pinBlk.dwSize);
  1399. ctxJS->Ans.data = tmpPinData;
  1400. //Dbg("pinblk(%s)",tmpPinData);
  1401. if (tmpPinData != NULL)
  1402. {
  1403. delete[]tmpPinData;
  1404. tmpPinData = NULL;
  1405. }
  1406. EnDecryptInfo srcInfo, dstInfo;
  1407. memset(srcInfo.data, 0, MAX_EN_DECRYPT_DATA_SIZE);
  1408. memcpy(srcInfo.data, m_devCheckData, m_devCheckData.GetLength());
  1409. srcInfo.dwSize = m_devCheckData.GetLength();
  1410. memset(dstInfo.data, 0, MAX_EN_DECRYPT_DATA_SIZE);
  1411. //set param
  1412. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1413. errCode = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_SM4);
  1414. if (errCode == Error_Succeed)
  1415. errCode = m_hDevHelper->SetParam(EPP_PT_SET_ECB_CBC_MODE, EPP_ALGO_MODE_CBC);
  1416. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1417. if (errCode != Error_Succeed)
  1418. {
  1419. SetErrorAndLog(errCode, MEC_DEVAPI_EPP_SetParam, "DevAdapter::SetParam", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime, PinPadService_LogCode_GetInputSM);
  1420. ctxJS->Answer(Error_Param, GetAlarmDEC());
  1421. return Error_Param;
  1422. }
  1423. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetParam").setCostTime(m_ullEndTime - m_ullBeginTime)();
  1424. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1425. errCode = m_hDevHelper->EncryptData(srcInfo, dstInfo);
  1426. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1427. if (errCode != Error_Succeed)
  1428. {
  1429. SetErrorAndLog(errCode, MEC_DEVAPI_EPP_EncryptData, "DevAdapter::EncryptData", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime, PinPadService_LogCode_GetInputSM);
  1430. ctxJS->Answer(Error_DevCommFailed, GetAlarmDEC());
  1431. return Error_DevCommFailed;
  1432. }
  1433. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::EncryptData").setCostTime(m_ullEndTime - m_ullBeginTime)();
  1434. char* tmpCheckCode = new char[MAX_PIN_BLOCK_SIZE];
  1435. if (tmpCheckCode == NULL)
  1436. return Error_Resource;
  1437. memset(tmpCheckCode, 0, MAX_PIN_BLOCK_SIZE);
  1438. //HexBuf2StrBuf(dstInfo.data,&tmpCheckCode,dstInfo.dwSize);
  1439. memcpy(tmpCheckCode, dstInfo.data, dstInfo.dwSize);
  1440. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ckckck[%s], m_keySNSM:%s", tmpCheckCode, m_keySNSM.GetData());
  1441. if (strnicmp(tmpCheckCode, "9F1F7BFF6F5511384D9430531E538FD3", strlen("9F1F7BFF6F5511384D9430531E538FD3")) == 0)
  1442. SetErrorAndLog(Error_Unexpect, PinPad_UserErrorCode_KEY_LOST_SM, "", __FUNCTION__);
  1443. ctxJS->Ans.checkcode = tmpCheckCode;
  1444. ctxJS->Ans.deviceno = m_deviceNo;
  1445. ctxJS->Ans.keyseq = m_keySNSM;
  1446. CSimpleStringA tmpLastCkCode = m_lastCheckCode;
  1447. if (m_lastCheckCode.IsNullOrEmpty() || strnicmp(tmpCheckCode, m_lastCheckCode, m_lastCheckCode.GetLength()) != 0)
  1448. {
  1449. ErrorCodeEnum eErr;
  1450. CSmartPointer<IConfigInfo> spConfigRun;
  1451. eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
  1452. if (eErr == Error_Succeed)
  1453. {
  1454. spConfigRun->WriteConfigValue("Load", "ckckck", tmpCheckCode);
  1455. m_lastCheckCode = tmpCheckCode;
  1456. }
  1457. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("write ckckck:%s", tmpCheckCode);
  1458. }
  1459. if (!tmpLastCkCode.IsNullOrEmpty() && strnicmp(tmpCheckCode, tmpLastCkCode, tmpLastCkCode.GetLength()) != 0)
  1460. {
  1461. CSimpleStringA xCkChangeMsg = CSimpleStringA::Format("last ck:%s,current ck:%s,m_keySNSM:%s", tmpLastCkCode.GetData()
  1462. , tmpCheckCode, m_keySNSM.GetData());
  1463. LogWarn(Severity_Low, Error_Unexpect, PinPad_UserErrorCode_PinPad_CheckCode_Changed, xCkChangeMsg.GetData());
  1464. }
  1465. }
  1466. else
  1467. {
  1468. SetErrorAndLog(errCode, MEC_DEVAPI_EPP_GetPinBlock, "DevAdapter::GetPinBlock", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime, PinPadService_LogCode_GetInputSM);
  1469. ctxJS->Answer(Error_DevCommFailed, GetAlarmDEC());
  1470. return Error_DevCommFailed;
  1471. }
  1472. DbgWithLink(LOG_LEVEL_INFO, ctxJS->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM)
  1473. .setAPI("DevAdapter::GetPinBlock").setCostTime(m_ullEndTime - m_ullBeginTime)("获取密文成功");
  1474. //oilyang@20240410 move to out space,after stopinput & turn off the light
  1475. //Sleep(100);
  1476. //ctxSM->Answer(Error_Succeed);
  1477. return Error_Succeed;
  1478. }
  1479. int CPinPadFSM::GetInputJS(SpReqAnsContext<PinPadService_GetInputJS_Req, PinPadService_GetInputJS_Ans>::Pointer ctxJS)
  1480. {
  1481. DWORD dwCurrThId = GetCurrentThreadId();
  1482. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("GetInput thread id:%d", dwCurrThId);
  1483. m_bFrontCancel = false;
  1484. LogEvent(Severity_Middle, LOG_EVT_PINPAD_GREEN_ON, "PinPad light on.");
  1485. if (!m_hDevHelper)
  1486. {
  1487. SetErrorAndLog(Error_Unexpect, PinPad_UserErrorCode_PinPad_Instance_Is_Null, "", __FUNCTION__, false, 0, PinPadService_LogCode_GetInputSM);
  1488. m_inputJSCtx->Answer(Error_Unexpect, GetAlarmDEC());
  1489. LogEvent(Severity_Middle, LOG_EVT_PINPAD_GREEN_OFF, "PinPad light off.");
  1490. m_bPinInputJS = false;
  1491. return 1;
  1492. }
  1493. ULLINT ullGetInputBegin = SP::Module::Comm::RVCGetTickCount();
  1494. ErrorCodeEnum eErrCode = GetEncryptTextJS(m_inputJSCtx);
  1495. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1496. ErrorCodeEnum errClosePinPad = m_hDevHelper->StopInput();
  1497. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1498. if (errClosePinPad != Error_Succeed)
  1499. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("DevAdapter::StopInput").setResultCode("RTA2614").setCostTime(m_ullEndTime - m_ullBeginTime)("close pinpad(%s).", SpStrError(errClosePinPad));
  1500. else
  1501. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::StopInput").setCostTime(m_ullEndTime - m_ullBeginTime)("StopInput cost(%d)ms", m_ullEndTime - m_ullBeginTime);
  1502. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)
  1503. ("req acc.len:%d,ans.ck.len:%d", m_inputJSCtx->Req.account.GetLength(), m_inputJSCtx->Ans.checkcode.IsNullOrEmpty() ? 0 : m_inputJSCtx->Ans.checkcode.GetLength());
  1504. DbgToBeidou(m_inputJSCtx->link, "GetInput")();
  1505. m_bPinInput = false;
  1506. LogEvent(Severity_Middle, LOG_EVT_PINPAD_GREEN_OFF, "PinPad light off.");
  1507. if (eErrCode == Error_Succeed)
  1508. {
  1509. ULLINT ullGetInputEnd = SP::Module::Comm::RVCGetTickCount();
  1510. LogWarn(Severity_Low, Error_Unexpect, PinPad_UserErrorCode_GetInput_TimeCost, CSimpleStringA::Format("%d", (ullGetInputEnd - ullGetInputBegin) / 1000));
  1511. m_inputJSCtx->Answer(Error_Succeed);
  1512. }
  1513. return 0;
  1514. }