PinPadFSM.cpp 51 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927
  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 "PinPad_UserErrorCode.h"
  8. #include "CommDevEntityErrorCode.h"
  9. #include <map>
  10. #include <thread>
  11. #include <chrono>
  12. using namespace std;
  13. const int PINPAD_INIT_TRIES = 3;
  14. const int PINPAD_ANY_INPUT_TIMER = 1;
  15. const int PINPAD_ANY_INPUT_TIMEOUT = 100;
  16. const int MAX_PINPAD_INPUT_TIMEOUT = 60000;
  17. const int MAX_INPUT_TIMER_TIMEOUT = 600000;
  18. ErrorCodeEnum CPinPadFSM::OnInit()
  19. {
  20. LOG_FUNCTION();
  21. {
  22. auto devEntity = dynamic_cast<CDevAdptEntityBase*>(GetEntityBase());
  23. devEntity->InitializeVendorLogSwitch();
  24. }
  25. CSystemStaticInfo sysInfo;
  26. m_csMachineType = m_csSite = m_terminalNo = "";
  27. GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo);
  28. m_csMachineType = sysInfo.strMachineType;
  29. m_csSite = sysInfo.strSite;
  30. m_terminalNo = sysInfo.strTerminalID;
  31. Dbg("machineType:%s,site:%s,terminalNo:%s",
  32. (const char*)m_csMachineType, (const char*)m_csSite, (const char*)m_terminalNo);
  33. if (_strnicmp((const char*)m_csMachineType, "RPM.Stand1S", strlen("RPM.Stand1S")) == 0)
  34. m_bPinPadNeedless = TRUE;
  35. if (_strnicmp((const char*)m_csMachineType, "RVC.IL", strlen("RVC.IL")) == 0)
  36. m_bRVCIL = true;
  37. std::thread tmp_thread(&CPinPadFSM::DoWork, this);
  38. tmp_thread.detach();
  39. return Error_Succeed;
  40. }
  41. ErrorCodeEnum CPinPadFSM::OnExit()
  42. {
  43. LOG_FUNCTION();
  44. m_bEntityExit = true;
  45. //SetEvent(m_hInputEvt);
  46. m_hInputConVar.Broadcast();
  47. ErrorCodeEnum eErr = Error_Succeed;
  48. if (m_hDevHelper)
  49. {
  50. m_hDevHelper->StopInput();
  51. m_hDevHelper.TearDown();
  52. }
  53. return eErr;
  54. }
  55. void CPinPadFSM::s0_on_entry()
  56. {
  57. LOG_FUNCTION();
  58. FSMEvent *e = new FSMEvent(USER_EVT_INIT);
  59. PostEventFIFO(e);
  60. }
  61. void CPinPadFSM::s0_on_exit()
  62. {
  63. }
  64. unsigned int CPinPadFSM::s0_on_event(FSMEvent* evt)
  65. {
  66. LOG_FUNCTION();
  67. if (evt->iEvt == USER_EVT_INIT) {
  68. //SetEvent(m_hInputEvt);
  69. m_hInputConVar.Broadcast();
  70. evt->SetHandled();
  71. return 0;
  72. }else if (evt->iEvt == USER_EVT_QUIT) {
  73. evt->SetHandled();
  74. return 0;
  75. }
  76. return 0;
  77. }
  78. void CPinPadFSM::s1_on_entry()
  79. {
  80. LOG_FUNCTION();
  81. }
  82. void CPinPadFSM::s1_on_exit()
  83. {
  84. LOG_FUNCTION();
  85. }
  86. unsigned int CPinPadFSM::s1_on_event(FSMEvent* evt)
  87. {
  88. LOG_FUNCTION();
  89. Dbg("s1 event %d",evt->iEvt);
  90. int ret = 0;
  91. if (evt->iEvt == USER_EVT_INITFINISHED) {
  92. evt->SetHandled();
  93. int err = evt->param1;
  94. if (err == 0)
  95. ret = 0;
  96. else
  97. ret = 1;
  98. //SetEvent(m_hInitEvt);
  99. return ret;
  100. }else if (evt->iEvt == USER_EVT_QUIT) {
  101. evt->SetHandled();
  102. return 0;
  103. }
  104. return 0;
  105. }
  106. //Idle(anyinput)
  107. void CPinPadFSM::s2_on_entry()
  108. {
  109. LOG_FUNCTION();
  110. m_eDevState = DEVICE_STATUS_NORMAL;
  111. GetEntityBase()->GetFunction()->SetUserDefineState(USER_PINPAD_IDLE);
  112. m_testResult = Error_Succeed;
  113. //oilyang@20200119 去掉任意情况下可输入
  114. //if (!m_bInMainPage && !m_bRVCIL)
  115. //{
  116. // ErrorCodeEnum eErrCode = CancelTimer(PINPAD_ANY_INPUT_TIMER);
  117. // //Dbg("s2 entry cacel timer %d",eErrCode);
  118. // eErrCode = ScheduleTimer(PINPAD_ANY_INPUT_TIMER, PINPAD_ANY_INPUT_TIMEOUT);
  119. //}
  120. }
  121. void CPinPadFSM::s2_on_exit()
  122. {
  123. LOG_FUNCTION();
  124. ErrorCodeEnum eErrCode = CancelTimer(PINPAD_ANY_INPUT_TIMER);
  125. Dbg("s2 cancel timer %d.",eErrCode);
  126. }
  127. unsigned int CPinPadFSM::s2_on_event(FSMEvent* pEvt)
  128. {
  129. //LOG_FUNCTION();
  130. if (pEvt->iEvt != 1)
  131. Dbg("s2 %d,%d",pEvt->iEvt,pEvt->param1);
  132. switch(pEvt->iEvt)
  133. {
  134. case USER_EVT_GETINPUT:
  135. {
  136. //SetEvent(m_hInputEvt);
  137. m_hInputConVar.Broadcast();
  138. pEvt->SetHandled();
  139. return 0;
  140. }
  141. case EVT_TIMER:
  142. if (pEvt->param1 == PINPAD_ANY_INPUT_TIMER)
  143. {
  144. if (m_bLoadKey || m_bEncrypt)
  145. {
  146. Dbg("Load,Encrypt:%d,%d",m_bLoadKey,m_bEncrypt);
  147. break;
  148. }
  149. void *pTmp = NULL;
  150. OpenInputText(pTmp);
  151. pEvt->SetHandled();
  152. return 0;
  153. }
  154. break;
  155. case USER_EVT_LOADKEY:
  156. {
  157. Dbg("USER_EVT_LOADKEY");
  158. pEvt->SetHandled();
  159. m_bLoadKey = true;
  160. LoadKeyTask* task = new LoadKeyTask(this);
  161. LoadKeyEvent* lke = dynamic_cast<LoadKeyEvent*>(pEvt);
  162. task->ctx = lke->ctx;
  163. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  164. return 2;
  165. }
  166. case USER_EVT_ENCRYPT:
  167. {
  168. Dbg("USER_EVT_ENCRYPT");
  169. pEvt->SetHandled();
  170. m_bEncrypt = true;
  171. EncryptTask* task = new EncryptTask(this);
  172. EncryptEvent* ee = dynamic_cast<EncryptEvent*>(pEvt);
  173. task->ctx = ee->ctx;
  174. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  175. return 2;
  176. }
  177. case USER_EVT_GETINPUT_SM:
  178. {
  179. //SetEvent(m_hInputEvt);
  180. m_hInputConVar.Broadcast();
  181. pEvt->SetHandled();
  182. return 0;
  183. }
  184. case USER_EVT_LOADKEY_SM:
  185. {
  186. Dbg("USER_EVT_LOADKEY(SM)");
  187. pEvt->SetHandled();
  188. m_bLoadKey = true;
  189. LoadKeySMTask* task = new LoadKeySMTask(this);
  190. LoadKeySMEvent* lke = dynamic_cast<LoadKeySMEvent*>(pEvt);
  191. task->ctx = lke->ctx;
  192. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  193. return 2;
  194. }
  195. case USER_EVT_ENCRYPT_SM:
  196. {
  197. Dbg("USER_EVT_ENCRYPT(SM)");
  198. pEvt->SetHandled();
  199. m_bEncrypt = true;
  200. EncryptSMTask* task = new EncryptSMTask(this);
  201. EncryptSMEvent* ee = dynamic_cast<EncryptSMEvent*>(pEvt);
  202. task->ctx = ee->ctx;
  203. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  204. return 2;
  205. }
  206. case USER_EVT_GET_CHECKCODE:
  207. {
  208. pEvt->SetHandled();
  209. GetCheckCodeTask* task = new GetCheckCodeTask(this);
  210. GetCheckCodeEvent* gcce = dynamic_cast<GetCheckCodeEvent*>(pEvt);
  211. task->ctx = gcce->ctx;
  212. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  213. return 0;
  214. }
  215. case USER_EVT_QUIT:
  216. pEvt->SetHandled();
  217. break;
  218. default:
  219. break;
  220. }
  221. return 1;
  222. }
  223. //Input
  224. void CPinPadFSM::s3_on_entry()
  225. {
  226. LOG_FUNCTION();
  227. GetEntityBase()->GetFunction()->SetUserDefineState(USER_PINPAD_PININPUT);
  228. ErrorCodeEnum eErrCode = CancelTimer(PINPAD_ANY_INPUT_TIMER);
  229. Dbg("s3 cancel timer %d.",eErrCode);
  230. }
  231. void CPinPadFSM::s3_on_exit()
  232. {
  233. LOG_FUNCTION();
  234. }
  235. unsigned int CPinPadFSM::s3_on_event(FSMEvent* evt)
  236. {
  237. LOG_FUNCTION();
  238. Dbg("s3 event %d",evt->iEvt);
  239. switch(evt->iEvt)
  240. {
  241. case USER_EVT_GETINPUTFINISHED:
  242. evt->SetHandled();
  243. break;
  244. case USER_EVT_INPUTCANCEL:
  245. evt->SetHandled();
  246. m_bFrontCancel = true;
  247. break;
  248. case USER_EVT_INPUTWAITINGMORE:
  249. evt->SetHandled();
  250. m_bWaitingMore = true;
  251. break;
  252. case USER_EVT_EXIT:
  253. SetExitFlag();
  254. break;
  255. case USER_EVT_QUIT:
  256. evt->SetHandled();
  257. break;
  258. default:
  259. break;
  260. }
  261. return 0;
  262. }
  263. //AccessAuth
  264. void CPinPadFSM::s4_on_entry()
  265. {
  266. LOG_FUNCTION();
  267. GetEntityBase()->GetFunction()->SetUserDefineState(USER_PINPAD_PARAM_ENCRYPTE);
  268. ErrorCodeEnum eErrCode = CancelTimer(PINPAD_ANY_INPUT_TIMER);
  269. Dbg("s4 cancel timer %d.",eErrCode);
  270. }
  271. void CPinPadFSM::s4_on_exit()
  272. {
  273. LOG_FUNCTION();
  274. }
  275. unsigned int CPinPadFSM::s4_on_event(FSMEvent* pEvt)
  276. {
  277. switch(pEvt->iEvt)
  278. {
  279. case USER_EVT_LOADKEYFINISHED:
  280. pEvt->SetHandled();
  281. break;
  282. case USER_EVT_ENCRYPTFINISHED:
  283. pEvt->SetHandled();
  284. break;
  285. case USER_EVT_LOADKEY_SM_FINISHED:
  286. pEvt->SetHandled();
  287. break;
  288. case USER_EVT_ENCRYPT_SM_FINISHED:
  289. pEvt->SetHandled();
  290. break;
  291. case USER_EVT_GET_CHECKCODE:
  292. {
  293. pEvt->SetHandled();
  294. GetCheckCodeTask* task = new GetCheckCodeTask(this);
  295. GetCheckCodeEvent* gcce = dynamic_cast<GetCheckCodeEvent*>(pEvt);
  296. task->ctx = gcce->ctx;
  297. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  298. return 0;
  299. }
  300. default:
  301. break;
  302. }
  303. return 0;
  304. }
  305. void CPinPadFSM::s5_on_entry()
  306. {
  307. LOG_FUNCTION();
  308. if (m_bDevInit)
  309. m_eDevState = DEVICE_STATUS_FAULT;
  310. GetEntityBase()->GetFunction()->SetUserDefineState(USER_PINPAD_FAILED);
  311. m_testResult = Error_InvalidState;
  312. ErrorCodeEnum eErrCode = CancelTimer(PINPAD_ANY_INPUT_TIMER);
  313. Dbg("s5 cancel timer %d.",eErrCode);
  314. }
  315. void CPinPadFSM::s5_on_exit()
  316. {
  317. LOG_FUNCTION();
  318. }
  319. unsigned int CPinPadFSM::s5_on_event(FSMEvent* pEvt)
  320. {
  321. Dbg("s5 evt %d",pEvt->iEvt);
  322. switch (pEvt->iEvt)
  323. {
  324. case USER_EVT_GETINPUT:
  325. {
  326. pEvt->SetHandled();
  327. GetInputEvent *pGie = new GetInputEvent();
  328. pGie = dynamic_cast<GetInputEvent*>(pEvt);
  329. pGie->ctx->Answer(Error_InvalidState);
  330. }
  331. break;
  332. case USER_EVT_LOADKEY:
  333. {
  334. pEvt->SetHandled();
  335. LoadKeyEvent *pLke = new LoadKeyEvent();
  336. pLke = dynamic_cast<LoadKeyEvent*>(pEvt);
  337. pLke->ctx->Answer(Error_InvalidState);
  338. }
  339. break;
  340. default:
  341. break;
  342. }
  343. return 0;
  344. }
  345. int CPinPadFSM::Initial()
  346. {
  347. LOG_FUNCTION();
  348. if (m_bRVCIL)
  349. {
  350. Dbg("is RVC.IL.");
  351. return 0;
  352. }
  353. #ifdef _WIN32
  354. DWORD dwCurrThId = GetCurrentThreadId();
  355. Dbg("Initial thread id:%d", dwCurrThId);
  356. #endif //_WIN32
  357. ErrorCodeEnum eErrDev;
  358. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  359. CSmartPointer<IConfigInfo> spConfig;
  360. eErrDev = spEntityFunction->OpenConfig(Config_Root, spConfig);
  361. if (eErrDev != Error_Succeed) {
  362. Dbg("open cfg file failed!");
  363. LogWarn(Severity_Middle, eErrDev, AlarmDECToBusiness(MEC_CFG_ROOT_POINTER_FAILED), "Initial:OpenConfig");
  364. return eErrDev;
  365. }
  366. CSimpleStringA dllName,tmpVendor(""), tmpDevSN(""), tmpDLLVersion(""), csDepPath(""), csBackslash(SPLIT_SLASH_STR);
  367. GetEntityBase()->GetFunction()->GetSysVar("FWBVendor", tmpVendor);
  368. GetEntityBase()->GetFunction()->GetSysVar("FWBDevSN", tmpDevSN);
  369. GetEntityBase()->GetFunction()->GetSysVar("FWBVersion", tmpDLLVersion);
  370. if (tmpDLLVersion.GetLength() < 2)//如果忘记配置,则直接使用默认值8.1
  371. tmpDLLVersion = "8.1";
  372. if (tmpDevSN.GetLength() > 12 && tmpDevSN.IndexOf("FWB") > 2)
  373. {
  374. Dbg("This is fwb device.");
  375. GetEntityBase()->GetFunction()->GetPath("Dep", csDepPath);
  376. #ifdef _WIN32
  377. dllName = csDepPath + csBackslash + "PinPad." + tmpVendor + "." + tmpDLLVersion + ".dll";//oiltmp
  378. #else
  379. dllName = csDepPath + csBackslash + "libPinPad." + tmpVendor + "." + tmpDLLVersion + ".so";
  380. #endif //_WIN32
  381. Dbg("%s", (const char*)dllName);
  382. HARDWARE_ENTITY_SET_VENDOR_NAME(m_entCode, tmpVendor);
  383. }
  384. else
  385. {
  386. Dbg("This is normal AllInOne device.");
  387. auto pEntity = GET_DEV_ENTITY_BASE_POINTER();
  388. pEntity->ExtractVendorLibFullPath(dllName);
  389. //eErrDev = SpGetDevAdaptorPath(m_pEntity, GetEntityBase()->GetEntityName(), dllName);
  390. //if (eErrDev != Error_Succeed)
  391. //{
  392. // Dbg("SpGetDevAdaptorPath(%d) failed.", eErrDev);
  393. // LogWarn(Severity_Middle, eErrDev, AlarmDECToBusiness(MEC_DLL_GET_PATH_FAILED), "Initial:SpGetDevAdaptorPath");
  394. // return Error_DevLoadFileFailed;
  395. //}
  396. //Dbg("%s", (LPCTSTR)dllName);
  397. CSimpleStringA strSection = CSimpleStringA("Device.") + GetEntityBase()->GetEntityName();
  398. CSimpleStringA str;
  399. spConfig->ReadConfigValue(strSection, "Vendor", str);
  400. HARDWARE_ENTITY_SET_VENDOR_NAME(m_entCode, str);
  401. }
  402. int baudRate, port;
  403. spConfig->ReadConfigValueInt("Device.PinPad", "Baudrate", baudRate);
  404. spConfig->ReadConfigValueInt("Device.PinPad", "Port", port);
  405. spConfig->ReadConfigValue("Terminal", "TerminalNo", m_deviceNo);
  406. spConfig->ReadConfigValue("Device.PinPad", "Checkdata", m_devCheckData);
  407. spConfig->ReadConfigValue("Device.PinPad", "Keysn", m_keySN);
  408. spConfig->ReadConfigValue("Device.PinPad", "KeysnSM", m_keySNSM);
  409. Dbg("to load vendor dll.");
  410. if (Error_Succeed != m_hDevHelper.LoadLibAddress(dllName)) {
  411. Dbg("load %s failed.", (const char*)dllName);
  412. if (!m_bPinPadNeedless) {
  413. if (tmpDevSN.GetLength() < 10 || tmpDevSN.IndexOf("FWB") < 1)
  414. GetEntityBase()->GetFunction()->ShowFatalError("密码键盘加载厂商适配器失败!请检查root.ini配置是否正确。");
  415. //LogWarn(Severity_Middle,Error_NotInit,LOG_ERR_PINPAD_FAILED,"PinPad init failed.");
  416. LogWarn(Severity_Middle, Error_NotInit, AlarmDECToBusiness(MEC_DLL_LOAD_FAILED), "PinPad init failed.");
  417. }
  418. return Error_DevLoadFileFailed;
  419. }
  420. Dbg("load vendor dll suc.");
  421. //MAKEINTRESOURCE
  422. int initTries = 0;
  423. ErrorCodeEnum hr;
  424. ErrorCodeEnum eErrCode;
  425. do
  426. {
  427. Dbg("dodo");
  428. if (!m_hDevHelper)
  429. {
  430. eErrCode = m_hDevHelper.CreateDevAdptObject();
  431. if(eErrCode != Error_Succeed)
  432. {
  433. Dbg("create pinpad module failed %s", SpStrError(eErrCode));
  434. LogWarn(Severity_Middle, eErrDev, AlarmDECToBusiness(MEC_DEV_OBJECT_CREATE_FAILED), "Initial:CreateDevComponent");
  435. initTries++;
  436. continue;
  437. }
  438. }
  439. //PinPadInitParam initParam;
  440. Dbg("%d,%d",port,baudRate);
  441. hr = m_hDevHelper->DevOpen(port,baudRate);
  442. if (hr == Error_Succeed)
  443. {
  444. initTries = 0;
  445. ErrorCodeEnum errCode1,errCode2,errCode3,errCode4;
  446. errCode1 = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD,EPP_ALGO_METHOD_3DES);
  447. errCode2 = m_hDevHelper->SetParam(EPP_PT_SET_MAC_ALGORITH,EPP_MAC_ALGO_ASNIX99);
  448. errCode3 = m_hDevHelper->SetParam(EPP_PT_SET_PIN_ALGORITH,EPP_PIN_ALGO_ISO9564_1_ANSI);
  449. errCode4 = m_hDevHelper->SetParam(EPP_PT_SET_ECB_CBC_MODE,EPP_ALGO_MODE_3DEC_CBC);
  450. if(errCode1 != Error_Succeed || errCode2 != Error_Succeed
  451. || errCode3 != Error_Succeed || errCode4 != Error_Succeed)
  452. {
  453. Dbg("设置参数失败 3des(%d)(%d)(%d)c/ecb(%d).",errCode1,errCode2,errCode3,errCode4);
  454. LOG_PINPAD_ERROR_MSG_MACRO(Error_Unexpect, SetParam);
  455. return 1;
  456. }
  457. Dbg("SetParam suc.");
  458. break;
  459. }
  460. else
  461. {
  462. initTries++;
  463. LogErrMsg("Initial:DevOpen", hr, MEC_DEVAPI_EPP_DevOpen, TRUE);
  464. Sleep(1200);
  465. continue;
  466. }
  467. }while(initTries<PINPAD_INIT_TRIES);
  468. if (initTries != 0)
  469. {
  470. //LOG_PINPAD_ERROR_MSG_MACRO(hr, DevOpen);
  471. Dbg("Open pinpad failed.%s",(const char*)tmpDevSN);
  472. if (tmpDevSN.GetLength() < 10 || tmpDevSN.IndexOf("FWB") < 1)
  473. GetEntityBase()->GetFunction()->ShowFatalError("密码键盘打开失败!请检查键盘是否连接,配置是否正确。");
  474. return 1;
  475. }
  476. m_bDevInit = true;
  477. LOG_TRACE("Open pinpad suc.");
  478. //oiltmp comment the following 20160406
  479. //update with the version 1.7.1
  480. m_encryptkey = m_hDevHelper->GetEncryptFunc();
  481. //m_encryptkey = 1;
  482. eErrDev = spEntityFunction->OpenConfig(Config_Run, spConfig);
  483. if (eErrDev != Error_Succeed)
  484. {
  485. Dbg("read run cfg failed(sm).");
  486. m_b3DESLoaded = false;
  487. m_bSMLoaded = false;
  488. LogWarn(Severity_Middle, eErrDev, AlarmDECToBusiness(MEC_CFG_RUN_POINTER_FAILED), "Initial:OpenConfig");
  489. }
  490. else
  491. {
  492. int tmpLoad = 0;
  493. eErrDev = spConfig->ReadConfigValueInt("Load", "3DES", tmpLoad);
  494. if (eErrDev == Error_Succeed)
  495. m_b3DESLoaded = tmpLoad;
  496. eErrDev = spConfig->ReadConfigValueInt("Load", "SM", tmpLoad);
  497. if (eErrDev == Error_Succeed)
  498. m_bSMLoaded = tmpLoad;
  499. }
  500. Dbg("encrypt key :%d,load key :%d,%d", m_encryptkey,m_b3DESLoaded,m_bSMLoaded);
  501. DevCategoryInfo devInfo;
  502. ZeroMemory(devInfo.szModel, MAX_DEV_MODEL_LEN);
  503. ZeroMemory(devInfo.szType, MAX_DEV_TYPE_LEN);
  504. ZeroMemory(devInfo.szVendor, MAX_DEV_VENDOR_LEN);
  505. eErrDev = m_hDevHelper->GetDevCategory(devInfo);
  506. if (eErrDev == Error_Succeed)
  507. {
  508. m_szModel = devInfo.szModel;
  509. m_szType = devInfo.szType;
  510. m_szVendor = devInfo.szVendor;
  511. Dbg("%d,%d,%d", strlen(devInfo.szModel), strlen(devInfo.szType), strlen(devInfo.szVendor));
  512. }
  513. else
  514. {
  515. LOG_PINPAD_ERROR_MSG_MACRO(eErrDev, GetDevCategory);
  516. }
  517. Dbg("model:%s,type:%s,vendor:%s", (const char*)m_szModel, (const char*)m_szType, (const char*)m_szVendor);
  518. return 0;
  519. }
  520. void CPinPadFSM::DoWork()
  521. {
  522. LOG_FUNCTION();
  523. while(1)
  524. {
  525. //std::this_thread::sleep_for(std::chrono::milliseconds(60 * 1000));
  526. this->m_hInputConVar.Wait();
  527. //WaitForSingleObject(this->GetInputEvtHandle(),INFINITE);
  528. if (this->GetEntityExit())
  529. break;
  530. FSMEvent *evt;
  531. int ret;
  532. if (!this->GetDevInitFlag())
  533. {
  534. ret = this->Initial();
  535. evt = new FSMEvent(USER_EVT_INITFINISHED);
  536. }
  537. else
  538. {
  539. Dbg("getinput in thread start");
  540. SpReqAnsContext<PinPadService_GetInput_Req, PinPadService_GetInput_Ans>::Pointer ctx;
  541. SpReqAnsContext<PinPadService_GetInputSM_Req, PinPadService_GetInputSM_Ans>::Pointer ctxSM;
  542. bool smFlag = false;
  543. bool bRet = this->GetCtx(ctx,ctxSM,smFlag);
  544. Dbg("sm ctx or not[%d]",smFlag);
  545. if (!bRet)
  546. {
  547. Dbg("get ctx failed.doing nothing");
  548. continue;
  549. }
  550. ret = this->GetInput(ctx,ctxSM,smFlag);
  551. evt = new FSMEvent(USER_EVT_GETINPUTFINISHED);
  552. Dbg("getinput in thread end");
  553. }
  554. if (ret == 0)
  555. evt->param1 = 0;
  556. else
  557. evt->param1 = 1;
  558. this->PostEventFIFO(evt);
  559. }
  560. return;
  561. }
  562. static char hexCh2decCh(char c)
  563. {
  564. if((c>='0')&&(c<='9'))
  565. return c-'0';
  566. else if((c>='A')&&(c<='F'))
  567. return c-'A'+10;
  568. else if((c>='a')&&(c<='f'))
  569. return c-'a'+10;
  570. else
  571. return 0x10;
  572. }
  573. static int h2i(char *s)
  574. {
  575. int ret = 0;
  576. while (*s) {
  577. int t = hexCh2decCh(*s);
  578. ret = ret * 16 + t;
  579. ++s;
  580. }
  581. return ret;
  582. }
  583. void CPinPadFSM::push_char(char *buf, int *len, int c)
  584. {
  585. Dbg("len:%d",*len);
  586. buf[*len] = c;
  587. *len = *len + 1;
  588. buf[*len] = 0;
  589. InputContent evt;
  590. evt.data = buf;
  591. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(InputContent), SP_MSG_SIG_OF(InputContent), evt);
  592. }
  593. void CPinPadFSM::PushInputChar(char *buf,int c)
  594. {
  595. //Dbg("len:%d",*len);
  596. buf[0] = c;
  597. Dbg("anyinput[%d][%s]",c,buf);
  598. //*len = *len + 1;
  599. //buf[*len] = 0;
  600. InputContent evt;
  601. evt.data = buf;
  602. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(InputContent), SP_MSG_SIG_OF(InputContent), evt);
  603. }
  604. void CPinPadFSM::pop_char(char *buf, int *len, bool bClear)
  605. {
  606. if (*len > 0) {
  607. if (bClear){
  608. memset(buf,0,*len);
  609. *len = 0;
  610. }else {
  611. *len -= 1;
  612. buf[*len] = 0;
  613. }
  614. InputContent evt;
  615. evt.data = buf;
  616. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(InputContent), SP_MSG_SIG_OF(InputContent), evt);
  617. }
  618. }
  619. void CPinPadFSM::clear_char(char *buf, int *len)
  620. {
  621. if (*len > 0) {
  622. *len = 0;
  623. buf[*len] = 0;
  624. InputContent evt;
  625. evt.data = buf;
  626. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(InputContent), SP_MSG_SIG_OF(InputContent), evt);
  627. }
  628. }
  629. bool CPinPadFSM::Get12Account(char *szAcc)
  630. {
  631. memset(m_szAccount,0,sizeof(m_szAccount));
  632. int accLen = strlen(szAcc);
  633. if (accLen > 12)
  634. memcpy(m_szAccount + 4, szAcc + (accLen - 12 -1), 12);
  635. else if (accLen == 12)
  636. {
  637. if (strncmp(szAcc, "0755", 4) == 0)
  638. memcpy(m_szAccount + 4, szAcc, 12);
  639. else
  640. {
  641. m_szAccount[4] = '5';
  642. memcpy(m_szAccount + 5, szAcc + 1, 11);
  643. }
  644. }
  645. else if (accLen == 9)
  646. {
  647. memcpy(m_szAccount + 4, szAcc, 3);
  648. memcpy(m_szAccount + 7, szAcc, 9);
  649. }
  650. else
  651. memcpy(m_szAccount + 4, szAcc, accLen);
  652. return true;
  653. }
  654. int StrBuf2HexBuf(char* strBuf,PBYTE* hexBuf)
  655. {
  656. int len = strlen(strBuf);
  657. if (len == 0 || len%2 != 0)
  658. return 0;
  659. BYTE* buf = new BYTE[len/2];
  660. if (buf == NULL)
  661. return 0;
  662. int j = 0;
  663. for (int i = 0; i < len;)
  664. {
  665. int tmpVal;
  666. sscanf(strBuf+i,"%2x",&tmpVal);
  667. buf[j] = tmpVal;
  668. //buf[j] = char2int(strBuf[i])*16 + char2int(strBuf[i+1]);
  669. i += 2;
  670. j++;
  671. }
  672. //memcpy(buf,strBuf,len);
  673. *hexBuf = buf;
  674. return j;
  675. }
  676. int HexBuf2StrBuf(PBYTE hexBuf,char** strBuf,DWORD len)
  677. {
  678. char* tmpStr = *strBuf;
  679. int count = 0;
  680. for (int i = 0; i < len; ++i)
  681. {
  682. sprintf(tmpStr+count,"%0.2x",hexBuf[i]);
  683. count += 2;
  684. }
  685. return 0;
  686. }
  687. ErrorCodeEnum CPinPadFSM::GetEncryptText(SpReqAnsContext<PinPadService_GetInput_Req, PinPadService_GetInput_Ans>::Pointer ctx,SpReqAnsContext<PinPadService_GetInputSM_Req, PinPadService_GetInputSM_Ans>::Pointer ctxSM,bool bSM)
  688. {
  689. LOG_FUNCTION();
  690. ErrorCodeEnum errCode;
  691. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  692. CSmartPointer<IConfigInfo> spConfig;
  693. errCode = spEntityFunction->OpenConfig(Config_Software, spConfig);
  694. if (errCode != Error_Succeed)
  695. {
  696. LOG_TRACE("open device cfg file failed.");
  697. LogWarn(Severity_Middle, errCode, AlarmDECToBusiness(MEC_CFG_SOFTWARE_POINTER_FAILED), "GetEncryptText:OpenConfig");
  698. return Error_DevLoadFileFailed;
  699. }
  700. //bSM:ctx or sm ctx;
  701. //bSMFlag:to use 3des or use sm
  702. int len,timeout;
  703. bool confirm, bSMFlag = false;
  704. if (!bSM)
  705. {
  706. len = ctx->Req.length;
  707. timeout = ctx->Req.timeout;
  708. confirm = ctx->Req.confirm;
  709. }
  710. else
  711. {
  712. len = ctxSM->Req.length;
  713. timeout = ctxSM->Req.timeout;
  714. confirm = ctxSM->Req.confirm;
  715. if (ctxSM->Req.smflag == 1)
  716. {
  717. Dbg("has smflag true,to use sm.");
  718. bSMFlag = true;
  719. }
  720. }
  721. if (!bSMFlag)
  722. {
  723. LogWarn(Severity_High, Error_Unexpect, LOG_ERR_PINPAD_NOT_SM, "Encryption is not SM");
  724. }
  725. //PinInputParam pinInParam;
  726. //pinInParam.dwPinLen = len;
  727. AccountInfo accInfo;
  728. memset(accInfo.account,0,MAX_ACCOUNT_LEN);
  729. if (!bSM)
  730. {
  731. if (Get12Account(const_cast<char*>(ctx->Req.account.GetData())))
  732. memcpy(accInfo.account,m_szAccount+4,12);
  733. else
  734. {
  735. Dbg("Get12Account err(%s).",(const char*)ctx->Req.account);
  736. return Error_DevCommFailed;
  737. }
  738. }
  739. else
  740. {
  741. if (Get12Account(const_cast<char*>(ctxSM->Req.account.GetData())))
  742. memcpy(accInfo.account,m_szAccount+4,12);
  743. else
  744. {
  745. Dbg("Get12Account err(%s).",(const char*)ctxSM->Req.account);
  746. return Error_DevCommFailed;
  747. }
  748. }
  749. //memcpy(accInfo.account,"588571006555",12);
  750. accInfo.dwAccLen = 12;
  751. Dbg("acc(%s)",accInfo.account);
  752. errCode = m_hDevHelper->SetAccNo(accInfo);
  753. if (errCode != Error_Succeed)
  754. {
  755. if (!bSM)
  756. Dbg("set accout(%s)(%s) failed(%d).",(const char*)ctx->Req.account,accInfo.account,errCode);
  757. else
  758. Dbg("[sm]set accout(%s)(%s) failed(%d).",(const char*)ctxSM->Req.account,accInfo.account,errCode);
  759. LOG_PINPAD_ERROR_MSG_MACRO(errCode, SetAccNo);
  760. return Error_DevCommFailed;
  761. }
  762. if (!bSMFlag)
  763. errCode = m_hDevHelper->ActiveWorkingKey(0,0);
  764. else
  765. errCode = m_hDevHelper->ActiveWorkingKey(1,0);
  766. if (errCode != Error_Succeed)
  767. {
  768. LOG_PINPAD_ERROR_MSG_MACRO(errCode, ActiveWorkingKey);
  769. Dbg("ActiveWorkingKey failed.");
  770. return Error_DevCommFailed;
  771. }
  772. if (!bSMFlag)
  773. {
  774. //errCode = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_3DES);
  775. errCode = m_hDevHelper->SetParam(EPP_PT_SET_PIN_ALGORITH, EPP_PIN_ALGO_ISO9564_1_ANSI);
  776. }
  777. else
  778. {
  779. //errCode = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_SM4);
  780. errCode = m_hDevHelper->SetParam(EPP_PT_SET_PIN_ALGORITH, EPP_PIN_ALGO_SM4);
  781. }
  782. if (errCode != Error_Succeed)
  783. {
  784. //Dbg("set param failed.");
  785. LOG_PINPAD_ERROR_MSG_MACRO(errCode, SetParam);
  786. return Error_DevCommFailed;
  787. }
  788. Dbg("to start");
  789. errCode = m_hDevHelper->StartPinInput(len);
  790. if (errCode != Error_Succeed)
  791. {
  792. LOG_PINPAD_ERROR_MSG_MACRO(errCode, StartPinInput);
  793. return Error_DevCommFailed;
  794. }
  795. Dbg("start end");
  796. char *buf = new char[len+1];
  797. memset(buf,0,len+1);
  798. int readed = 0;
  799. DWORD elapsed = 0;
  800. DWORD dwStart = get_tick_count();
  801. DWORD dwEnd = get_tick_count();
  802. bool bCancelInput = false;
  803. Dbg("reqqqq(pin)[%d][%d][%d]",len,timeout,confirm);
  804. Dbg("bExit(%d)",m_bExit);
  805. while (elapsed < MAX_PINPAD_INPUT_TIMEOUT) {
  806. if (m_bExit)
  807. break;
  808. if (!confirm && readed >= len)
  809. break;
  810. if (m_bWaitingMore)
  811. {
  812. dwStart = get_tick_count();
  813. elapsed = 0;
  814. m_bWaitingMore = false;
  815. continue;
  816. }
  817. if (m_bFrontCancel)
  818. {
  819. bCancelInput = true;
  820. goto Err;
  821. }
  822. //char ch[4] = {0};
  823. BYTE btCh;
  824. Sleep(100);
  825. errCode = m_hDevHelper->KeyRead(btCh);
  826. if (errCode == Error_Succeed) {
  827. LogEvent(Severity_Middle,LOG_EVT_PINPAD_OP,"PinPad op.");
  828. if (btCh == 0x0d) {
  829. if (confirm)
  830. {
  831. if (!bSM)
  832. ctx->Ans.enter = true;
  833. else
  834. ctxSM->Ans.enter = true;
  835. break;
  836. }
  837. else
  838. {
  839. dwEnd = get_tick_count();
  840. elapsed = dwEnd - dwStart;
  841. continue;
  842. }
  843. } else if (btCh == 0x08) { // back
  844. if (confirm)
  845. {
  846. dwEnd = get_tick_count();
  847. elapsed = dwEnd - dwStart;
  848. continue;
  849. }
  850. Dbg("clear input");
  851. pop_char(buf, &readed,true);
  852. } else if (btCh == 0x1b) { // quit
  853. if (confirm)
  854. {
  855. if (!bSM)
  856. ctx->Ans.enter = true;
  857. else
  858. ctxSM->Ans.enter = true;
  859. goto Err;
  860. }
  861. else
  862. {
  863. bCancelInput = true;
  864. goto Err;
  865. }
  866. } else if (btCh == 0x3f){
  867. if (confirm)
  868. {
  869. dwEnd = get_tick_count();
  870. elapsed = dwEnd - dwStart;
  871. continue;
  872. }
  873. push_char(buf, &readed, '*');
  874. }else{
  875. Dbg("else[%d]",btCh);
  876. //continue;
  877. }
  878. } else {
  879. }
  880. dwEnd = get_tick_count();
  881. elapsed = dwEnd - dwStart;
  882. }
  883. buf[readed] = 0;
  884. //strOutput = buf;
  885. Err:
  886. //oilyang 20131017 commented
  887. //errCode = m_hDevHelper->StopInput();
  888. //if (errCode != Error_Succeed)
  889. // Dbg("StopInput failed(%d).",errCode);
  890. //else
  891. //{
  892. // Dbg("after pin input close pinpad suc.");
  893. // m_bPlainOpen = false;
  894. //}
  895. if (m_bExit)
  896. {
  897. Dbg("exit");
  898. return Error_Unexpect;
  899. }
  900. m_bExit = false;
  901. if (buf != NULL)
  902. delete []buf;
  903. if (bCancelInput)
  904. {
  905. Dbg("input cancel(pin)");
  906. return Error_Cancel;
  907. }
  908. if (readed < len) {
  909. if (elapsed >= MAX_PINPAD_INPUT_TIMEOUT) {
  910. return Error_TimeOut;
  911. }
  912. }
  913. PinBlock pinBlk;
  914. Dbg("to getpinblk");
  915. Sleep(500);//nantian
  916. errCode = m_hDevHelper->GetPinBlock(pinBlk);
  917. Dbg("getpinblock(%d),size:%d",errCode,pinBlk.dwSize);
  918. if (errCode == Error_Succeed)
  919. {
  920. char *tmpPinData = new char[MAX_PIN_BLOCK_SIZE];
  921. if (tmpPinData == NULL)
  922. return Error_Resource;
  923. memset(tmpPinData,0,MAX_PIN_BLOCK_SIZE);
  924. memcpy(tmpPinData,pinBlk.data,pinBlk.dwSize);
  925. if (!bSM)
  926. ctx->Ans.data = tmpPinData;
  927. else
  928. ctxSM->Ans.data = tmpPinData;
  929. //Dbg("pinblk(%s)",tmpPinData);
  930. if (tmpPinData != NULL)
  931. {
  932. delete []tmpPinData;
  933. tmpPinData = NULL;
  934. }
  935. EnDecryptInfo srcInfo,dstInfo;
  936. memset(srcInfo.data,0,MAX_EN_DECRYPT_DATA_SIZE);
  937. //memcpy(srcInfo.data,"0000000000000000",16);
  938. //PBYTE tmpCheckData = new BYTE[MAX_EN_DECRYPT_DATA_SIZE];
  939. //if (tmpCheckData == NULL)
  940. // return Error_Resource;
  941. //memset(tmpCheckData,0,MAX_EN_DECRYPT_DATA_SIZE);
  942. //int len = StrBuf2HexBuf(const_cast<char*>(m_devCheckData.GetData()),&tmpCheckData);
  943. //memcpy(srcInfo.data,tmpCheckData,len);
  944. //srcInfo.dwSize = len;
  945. Dbg("encryptdata[%s]",(LPCTSTR)m_devCheckData);
  946. memcpy(srcInfo.data,m_devCheckData,m_devCheckData.GetLength());
  947. srcInfo.dwSize = m_devCheckData.GetLength();
  948. memset(dstInfo.data,0,MAX_EN_DECRYPT_DATA_SIZE);
  949. //set param
  950. if (!bSMFlag)
  951. errCode = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_3DES);
  952. else
  953. errCode = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_SM4);
  954. if (errCode == Error_Succeed)
  955. errCode = m_hDevHelper->SetParam(EPP_PT_SET_ECB_CBC_MODE, EPP_ALGO_MODE_CBC);
  956. if (errCode != Error_Succeed)
  957. {
  958. Dbg("encrypt data set param failed.");
  959. LOG_PINPAD_ERROR_MSG_MACRO(errCode, SetParam);
  960. return Error_Param;
  961. }
  962. errCode = m_hDevHelper->EncryptData(srcInfo,dstInfo);
  963. //if (tmpCheckData != NULL)
  964. //{
  965. // delete []tmpCheckData;
  966. // tmpCheckData = NULL;
  967. //}
  968. if (errCode != Error_Succeed)
  969. {
  970. LOG_PINPAD_ERROR_MSG_MACRO(errCode, EncryptData);
  971. return Error_DevCommFailed;
  972. }
  973. char *tmpCheckCode = new char[MAX_PIN_BLOCK_SIZE];
  974. if (tmpCheckCode == NULL)
  975. return Error_Resource;
  976. memset(tmpCheckCode,0,MAX_PIN_BLOCK_SIZE);
  977. //HexBuf2StrBuf(dstInfo.data,&tmpCheckCode,dstInfo.dwSize);
  978. memcpy(tmpCheckCode,dstInfo.data,dstInfo.dwSize);
  979. Dbg("ckckck[%s]",tmpCheckCode);
  980. if (!bSM)
  981. {
  982. if (strnicmp(tmpCheckCode, "8CA64DE9C1B123A7", strlen("8CA64DE9C1B123A7")) == 0)
  983. {
  984. LogErrMsg("GetEncryptText:", Error_Unexpect, LOG_ERR_PINPAD_KEY_LOST, TRUE);
  985. //LogWarn(Severity_High, Error_Param, LOG_ERR_PINPAD_KEY_LOST, "keys have been cleared.");
  986. }
  987. ctx->Ans.checkcode = tmpCheckCode;
  988. ctx->Ans.deviceno = m_deviceNo;
  989. ctx->Ans.keyseq = m_keySN;
  990. }
  991. else
  992. {
  993. if (strnicmp(tmpCheckCode, "9F1F7BFF6F5511384D9430531E538FD3",
  994. strlen("9F1F7BFF6F5511384D9430531E538FD3")) == 0)
  995. {
  996. //UpdateDEC(LOG_ERR_PINPAD_KEY_LOST_SM);
  997. LogErrMsg("GetEncryptText:", Error_Unexpect, LOG_ERR_PINPAD_KEY_LOST_SM, TRUE);
  998. //LogWarn(Severity_High, Error_Param, LOG_ERR_PINPAD_KEY_LOST_SM, "keys(sm) have been cleared.");
  999. }
  1000. ctxSM->Ans.checkcode = tmpCheckCode;
  1001. ctxSM->Ans.deviceno = m_deviceNo;
  1002. if (!bSMFlag)
  1003. ctxSM->Ans.keyseq = m_keySN;
  1004. else
  1005. {
  1006. if (m_keySNSM.GetLength() < 2)//如果忘记配置
  1007. ctxSM->Ans.keyseq = "001";
  1008. else
  1009. ctxSM->Ans.keyseq = m_keySNSM;
  1010. }
  1011. }
  1012. }
  1013. else
  1014. {
  1015. LOG_PINPAD_ERROR_MSG_MACRO(errCode, GetPinBlock);
  1016. return Error_DevCommFailed;
  1017. }
  1018. //if (!bSM)
  1019. // Dbg("oiltest 20160224 %s,%s,%s,%s", (LPCTSTR)ctx->Ans.checkcode, (LPCTSTR)ctx->Ans.deviceno, (LPCTSTR)ctx->Ans.keyseq, (LPCTSTR)ctx->Ans.data);
  1020. //else
  1021. // Dbg("oiltest 20160224 %s,%s,%s,%s", (LPCTSTR)ctxSM->Ans.checkcode, (LPCTSTR)ctxSM->Ans.deviceno, (LPCTSTR)ctxSM->Ans.keyseq, (LPCTSTR)ctxSM->Ans.data);
  1022. Dbg("pin input succeed");
  1023. return Error_Succeed;
  1024. }
  1025. void CPinPadFSM::OpenInputText(void *pUserdata)
  1026. {
  1027. //Dbg("any input in");
  1028. //char *m_buf = new char[4];
  1029. memset(m_buf, 0, 4);
  1030. //m_bPinInput = false;//???
  1031. ErrorCodeEnum err;
  1032. //while (elapsed < MAX_PINPAD_INPUT_TIMEOUT) {
  1033. //while(1){
  1034. if (m_bPinInput)
  1035. return;
  1036. if (!m_bPlainOpen)
  1037. {
  1038. err = m_hDevHelper->StartPlainInput();
  1039. if (err == Error_Succeed)
  1040. {
  1041. Dbg("start any input");
  1042. GetEntityBase()->GetFunction()->SetUserDefineState(USER_PINPAD_IDLE);
  1043. m_testResult = Error_Succeed;
  1044. m_dwDevCommFailCount = 0;
  1045. m_bPlainOpen = true;
  1046. }
  1047. else
  1048. {
  1049. GetEntityBase()->GetFunction()->SetUserDefineState(USER_PINPAD_FAILED_RECOVERING);
  1050. m_dwDevCommFailCount++;
  1051. //Dbg("start any input err:%d",err);
  1052. if (m_dwDevCommFailCount > 10 * 3)
  1053. {
  1054. LOG_PINPAD_ERROR_MSG_MACRO(err, StartPlainInput);
  1055. Dbg("failed 3 seconds ago...");
  1056. m_testResult = Error_DevCommFailed;
  1057. }
  1058. }
  1059. }
  1060. //commented by oilyang 20160628
  1061. //don't open/stop pinpad any input periodly any more
  1062. //m_dwPinPadRunCount++;
  1063. ////30 minutes.about every 1.5s call this function once...so...
  1064. //if (m_dwPinPadRunCount > 40*30)
  1065. //{
  1066. // m_dwPinPadRunCount = 0;
  1067. // Dbg("stop input in period");
  1068. // m_hDevHelper->StopInput();
  1069. // m_bPlainOpen = false;
  1070. //}
  1071. BYTE btCh;
  1072. INT64 i64Start = get_tick_count();
  1073. err = m_hDevHelper->KeyRead(btCh);
  1074. INT64 i64End = get_tick_count();
  1075. if ((i64End - i64Start) > 3000)//more than 3 seconds
  1076. Dbg("KeyRead cost more than %d seconds.", (i64End - i64Start)/1000);
  1077. if (err == Error_Succeed) {
  1078. LogEvent(Severity_Middle, LOG_EVT_PINPAD_OP, "PinPad op(Any).");
  1079. PushInputChar(m_buf, btCh);
  1080. }
  1081. else {
  1082. //Dbg("else[%s]", buf);
  1083. }
  1084. //}
  1085. //delete [] buf;
  1086. //Dbg("input succeed");
  1087. //GetEntityBase()->GetFunction()->ResetTimer(PINPAD_ANY_INPUT_TIMER,PINPAD_ANY_INPUT_TIMEOUT);
  1088. ScheduleTimer(PINPAD_ANY_INPUT_TIMER, PINPAD_ANY_INPUT_TIMEOUT);
  1089. return;
  1090. }
  1091. ErrorCodeEnum CPinPadFSM::GetText(SpReqAnsContext<PinPadService_GetInput_Req, PinPadService_GetInput_Ans>::Pointer ctx,SpReqAnsContext<PinPadService_GetInputSM_Req, PinPadService_GetInputSM_Ans>::Pointer ctxSM,bool bSM)
  1092. {
  1093. LOG_FUNCTION();
  1094. int len,timeout;
  1095. bool confirm;
  1096. if (!bSM)
  1097. {
  1098. len = ctx->Req.length;
  1099. timeout = ctx->Req.timeout;
  1100. confirm = ctx->Req.confirm;
  1101. }
  1102. else
  1103. {
  1104. len = ctxSM->Req.length;
  1105. timeout = ctxSM->Req.timeout;
  1106. confirm = ctxSM->Req.confirm;
  1107. }
  1108. char *buf = new char[len+1];
  1109. memset(buf,0,len+1);
  1110. int readed = 0;
  1111. DWORD elapsed = 0;
  1112. DWORD dwStart = get_tick_count();
  1113. DWORD dwEnd = get_tick_count();
  1114. bool bCancelInput = false;
  1115. //Dbg("reqqqq[%d][%d][%d]",len,timeout,confirm);
  1116. //bool bPlainOpen = false;
  1117. ErrorCodeEnum err;
  1118. //the following several lines just for Nantian as they close pinpad while mag encrypted improve. oilyang 20150513
  1119. err = m_hDevHelper->StopInput();
  1120. m_bPlainOpen = false;
  1121. Dbg("plain input for nt.%d",err);
  1122. Sleep(100);
  1123. while (elapsed < MAX_PINPAD_INPUT_TIMEOUT) {
  1124. //while(1){
  1125. if (m_bExit)
  1126. {
  1127. Dbg("Exit");
  1128. bCancelInput = true;
  1129. goto Err;
  1130. }
  1131. if (!confirm && readed >= len)
  1132. break;
  1133. if (m_bWaitingMore)
  1134. {
  1135. Dbg("WaitMore");
  1136. dwStart = get_tick_count();
  1137. elapsed = 0;
  1138. m_bWaitingMore = false;
  1139. continue;
  1140. }
  1141. if (m_bFrontCancel)
  1142. {
  1143. Dbg("Front Cancel");
  1144. bCancelInput = true;
  1145. goto Err;
  1146. }
  1147. if (!m_bPlainOpen)
  1148. {
  1149. Dbg("start plain input");
  1150. err = m_hDevHelper->StartPlainInput();
  1151. if (err == Error_Succeed)
  1152. m_bPlainOpen = true;
  1153. else
  1154. {
  1155. Dbg("start plain input err:%d",err);
  1156. LOG_PINPAD_ERROR_MSG_MACRO(err, StartPlainInput);
  1157. }
  1158. }
  1159. BYTE btCh;
  1160. Sleep(100);//oiltest
  1161. //Dbg("start plain KeyRead");
  1162. err = m_hDevHelper->KeyRead(btCh);
  1163. //Dbg("end plain KeyRead");
  1164. if (err == Error_Succeed) {
  1165. //DevErrorInfo devErrInfo;
  1166. //m_hDevHelper->GetLastErr(devErrInfo);
  1167. //Dbg("[%s]",devErrInfo.szErrMsg);
  1168. LogEvent(Severity_Middle,LOG_EVT_PINPAD_OP,"PinPad op(T).");
  1169. if (btCh == 0x0d) {
  1170. if (confirm)
  1171. {
  1172. if (!bSM)
  1173. ctx->Ans.enter = true;
  1174. else
  1175. ctxSM->Ans.enter = true;
  1176. break;
  1177. }
  1178. else
  1179. {
  1180. dwEnd = get_tick_count();
  1181. elapsed = dwEnd - dwStart;
  1182. continue;
  1183. }
  1184. } else if (btCh == 0x08) { // back
  1185. if (confirm)
  1186. {
  1187. dwEnd = get_tick_count();
  1188. elapsed = dwEnd - dwStart;
  1189. continue;
  1190. }
  1191. pop_char(buf, &readed,true);
  1192. } else if (btCh == 0x1b) { // quit
  1193. bCancelInput = true;
  1194. if (confirm)
  1195. {
  1196. if (!bSM)
  1197. ctx->Ans.enter = false;
  1198. else
  1199. ctxSM->Ans.enter = false;
  1200. break;
  1201. }
  1202. //else
  1203. {
  1204. //bCancelInput = true;
  1205. break;
  1206. }
  1207. } else {
  1208. if (confirm)
  1209. {
  1210. dwEnd = get_tick_count();
  1211. elapsed = dwEnd - dwStart;
  1212. continue;
  1213. }
  1214. switch (btCh) {
  1215. case 0x30:
  1216. case 0x31:
  1217. case 0x32:
  1218. case 0x33:
  1219. case 0x34:
  1220. case 0x35:
  1221. case 0x36:
  1222. case 0x37:
  1223. case 0x38:
  1224. case 0x39:
  1225. //case 0x2e:
  1226. //case 0x20:
  1227. push_char(buf, &readed, btCh);
  1228. break;
  1229. default:
  1230. break;
  1231. }
  1232. }
  1233. } else {
  1234. //Dbg("else[%s]", buf);
  1235. }
  1236. dwEnd = get_tick_count();
  1237. elapsed = dwEnd - dwStart;
  1238. }
  1239. Err:
  1240. buf[readed] = 0;
  1241. if (!bSM)
  1242. {
  1243. ctx->Ans.data = buf;
  1244. ctx->Ans.deviceno = "";
  1245. ctx->Ans.checkcode = "";
  1246. ctx->Ans.keyseq = "";
  1247. }
  1248. else
  1249. {
  1250. ctxSM->Ans.data = buf;
  1251. ctxSM->Ans.deviceno = "";
  1252. ctxSM->Ans.checkcode = "";
  1253. ctxSM->Ans.keyseq = "";
  1254. }
  1255. delete [] buf;
  1256. if (bCancelInput)
  1257. {
  1258. Dbg("input cancel");
  1259. return Error_Cancel;
  1260. }
  1261. if (readed < len) {
  1262. if (elapsed >= MAX_PINPAD_INPUT_TIMEOUT) {
  1263. return Error_TimeOut;
  1264. }
  1265. }
  1266. Dbg("input succeed");
  1267. return Error_Succeed;
  1268. }
  1269. int CPinPadFSM::GetInput(SpReqAnsContext<PinPadService_GetInput_Req, PinPadService_GetInput_Ans>::Pointer ctx,SpReqAnsContext<PinPadService_GetInputSM_Req, PinPadService_GetInputSM_Ans>::Pointer ctxSM,bool bSM)
  1270. {
  1271. //GetEntityBase()->GetFunction()->ResetTimer(PINPAD_ANY_INPUT_TIMER,MAX_INPUT_TIMER_TIMEOUT);
  1272. DWORD dwCurrThId = GetCurrentThreadId();
  1273. Dbg("GetInput thread id:%d",dwCurrThId);
  1274. //ctx = m_ctx;
  1275. m_bWaitingMore = false;
  1276. m_bFrontCancel = false;
  1277. m_bExit = false;
  1278. LogEvent(Severity_Middle,LOG_EVT_PINPAD_GREEN_ON,"PinPad light on.");
  1279. //LogEvent(Severity_Middle,LOG_EVT_PINPAD_GREEN_ON,"PinPad green light on.");
  1280. if (!m_hDevHelper)
  1281. {
  1282. LOG_TRACE("PinPad is not available!");
  1283. if (!bSM)
  1284. m_ctx->Answer(Error_Unexpect, AlarmDECToBusiness(PinPad_UserErrorCode_PinPad_Instance_Is_Null));
  1285. else
  1286. m_inputSMCtx->Answer(Error_Unexpect, AlarmDECToBusiness(PinPad_UserErrorCode_PinPad_Instance_Is_Null));
  1287. LogEvent(Severity_Middle,LOG_EVT_PINPAD_GREEN_OFF,"PinPad light off.");
  1288. //LogEvent(Severity_Middle,LOG_EVT_PINPAD_GREEN_OFF,"PinPad green light off.");
  1289. m_bPinInput = false;
  1290. return 1;
  1291. }
  1292. bool encrypt;
  1293. if (!bSM)
  1294. {
  1295. encrypt = m_ctx->Req.encrypt;
  1296. }
  1297. else
  1298. {
  1299. encrypt = m_inputSMCtx->Req.encrypt;
  1300. }
  1301. ErrorCodeEnum err;
  1302. //Dbg("get input...bSM[%d][%d]",bSM,encrypt);
  1303. UpdateDEC();
  1304. if (!encrypt) {
  1305. err = GetText(m_ctx,m_inputSMCtx,bSM);
  1306. } else {
  1307. err = GetEncryptText(m_ctx,m_inputSMCtx,bSM);
  1308. }
  1309. //if (ctx->Req.encrypt)
  1310. {
  1311. //oilyang@20200428 call StopInput
  1312. //if (m_bPlainOpen)
  1313. {
  1314. ErrorCodeEnum errClosePinPad = m_hDevHelper->StopInput();
  1315. Dbg("close pinpad(%d).",errClosePinPad);
  1316. Sleep(100);
  1317. m_bPlainOpen = false;
  1318. }
  1319. if(err == Error_Succeed)
  1320. {
  1321. if (!bSM)
  1322. m_ctx->Answer();
  1323. else
  1324. m_inputSMCtx->Answer();
  1325. }
  1326. else
  1327. {
  1328. if (!bSM)
  1329. m_ctx->Answer(err, AlarmDECToBusiness());
  1330. else
  1331. m_inputSMCtx->Answer(err, AlarmDECToBusiness());
  1332. }
  1333. ClearRelatedDEC();
  1334. }
  1335. m_bPinInput = false;
  1336. LogEvent(Severity_Middle,LOG_EVT_PINPAD_GREEN_OFF,"PinPad light off.");
  1337. //GetEntityBase()->GetFunction()->ResetTimer(PINPAD_ANY_INPUT_TIMER,1);
  1338. //LogEvent(Severity_Middle,LOG_EVT_PINPAD_GREEN_OFF,"PinPad green light off.");
  1339. return 0;
  1340. }
  1341. int CPinPadFSM::LoadKey(SpReqAnsContext<PinPadService_LoadKeys_Req, PinPadService_LoadKeys_Ans>::Pointer ctx)
  1342. {
  1343. //Dbg("bOpen(%d),initflag(%d),mk(%s),wk1(%s),wk2(%s)",m_bPlainOpen,ctx->Req.initializeflag,(LPCTSTR)ctx->Req.masterkey,(LPCTSTR)ctx->Req.workingkey1,(LPCTSTR)ctx->Req.workingkey2);
  1344. UpdateDEC();
  1345. ErrorCodeEnum eErr;
  1346. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  1347. CSmartPointer<IConfigInfo> spConfig;
  1348. eErr = spEntityFunction->OpenConfig(Config_Run, spConfig);
  1349. if (eErr != Error_Succeed)
  1350. {
  1351. Dbg("read run cfg failed.");
  1352. spConfig = NULL;
  1353. }
  1354. if (m_bPlainOpen)
  1355. m_hDevHelper->StopInput();
  1356. //initialization need load master key
  1357. if (ctx->Req.initializeflag)
  1358. {
  1359. MasterKeyParam mkParam;
  1360. mkParam.dwSN = 0;
  1361. mkParam.smFlag = 0;
  1362. memset(mkParam.key,0,MAX_MASTER_KEY_SIZE);
  1363. memcpy(mkParam.key,ctx->Req.masterkey,strlen(ctx->Req.masterkey));
  1364. //Dbg("%s,%d",mkParam.key,mkParam.dwSN);
  1365. eErr = m_hDevHelper->LoadMasterKey(mkParam);
  1366. if (eErr != Error_Succeed)
  1367. {
  1368. Dbg("Load master key failed(%d).",eErr);
  1369. LOG_PINPAD_ERROR_MSG_MACRO(eErr, LoadMasterKey);
  1370. ctx->Ans.result = 0;
  1371. ctx->Answer(Error_Unexpect, AlarmDECToBusiness());
  1372. ClearRelatedDEC();
  1373. m_bLoadKey = false;
  1374. return 0;
  1375. }
  1376. Dbg("Load master key suc.");
  1377. //oilyang@20170424 if load 3des master key succeed,clear load key status both of 3des and sm
  1378. spConfig->WriteConfigValueInt("Load", "3DES", 0);
  1379. spConfig->WriteConfigValueInt("Load", "SM", 0);
  1380. }
  1381. WorkKeyParam wkParam1,wkParam2;
  1382. memset(wkParam1.key,0,MAX_WORKING_KEY_SIZE);
  1383. memset(wkParam2.key,0,MAX_WORKING_KEY_SIZE);
  1384. wkParam1.dwMasterSN = wkParam2.dwMasterSN = 0;
  1385. wkParam1.dwWorkingSN = 0;
  1386. wkParam2.dwWorkingSN = 1;
  1387. memcpy(wkParam1.key,ctx->Req.workingkey1,strlen(ctx->Req.workingkey1));
  1388. memcpy(wkParam2.key,ctx->Req.workingkey2,strlen(ctx->Req.workingkey2));
  1389. wkParam1.smFlag = 0;
  1390. eErr = m_hDevHelper->LoadWorkingKey(wkParam1);
  1391. if (eErr != Error_Succeed)
  1392. {
  1393. Dbg("load working key 1 failed(%d).",eErr);
  1394. LOG_PINPAD_ERROR_MSG_MACRO(eErr, LoadWorkingKey);
  1395. ctx->Ans.result = 1;
  1396. ctx->Answer(Error_Unexpect, AlarmDECToBusiness());
  1397. ClearRelatedDEC();
  1398. m_bLoadKey = false;
  1399. return 0;
  1400. }
  1401. Dbg("Load working key1 suc.");
  1402. wkParam2.smFlag = 0;
  1403. eErr = m_hDevHelper->LoadWorkingKey(wkParam2);
  1404. if (eErr != Error_Succeed)
  1405. {
  1406. Dbg("load working key 2 failed(%d).",eErr);
  1407. LOG_PINPAD_ERROR_MSG_MACRO(eErr, LoadWorkingKey);
  1408. ctx->Ans.result = 2;
  1409. ctx->Answer(Error_Unexpect, AlarmDECToBusiness());
  1410. ClearRelatedDEC();
  1411. m_bLoadKey = false;
  1412. return 0;
  1413. }
  1414. Dbg("Load working key2 suc.");
  1415. if (spConfig != NULL)
  1416. {
  1417. eErr = spConfig->WriteConfigValueInt("Load", "3DES", 1);
  1418. if (eErr != Error_Succeed)
  1419. {
  1420. Dbg("after load key suc,write run cfg failed.");
  1421. LogErrMsg("GetEncryptText:", Error_Unexpect, MEC_CFG_WRITE_RUN_INFOR_FAILED, TRUE);
  1422. }
  1423. }
  1424. m_bLoadKey = false;
  1425. m_b3DESLoaded = true;
  1426. ctx->Answer(Error_Succeed);
  1427. ClearRelatedDEC();
  1428. return 0;
  1429. }
  1430. int CPinPadFSM::Encrypt(SpReqAnsContext<PinPadService_EncryptData_Req, PinPadService_EncryptData_Ans>::Pointer ctx)
  1431. {
  1432. LOG_FUNCTION();
  1433. ErrorCodeEnum eErr;
  1434. //set param
  1435. eErr = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD,EPP_ALGO_METHOD_3DES);
  1436. if (eErr == Error_Succeed)
  1437. eErr = m_hDevHelper->SetParam(EPP_PT_SET_ECB_CBC_MODE,EPP_ALGO_MODE_3DEC_CBC);
  1438. if (eErr != Error_Succeed)
  1439. {
  1440. //Dbg("Encrypt data set param failed(%d).",eErr);
  1441. LOG_PINPAD_ERROR_MSG_MACRO(eErr, SetParam);
  1442. ctx->Answer(Error_Unexpect, AlarmDECToBusiness());
  1443. ClearRelatedDEC();
  1444. m_bEncrypt = false;
  1445. return 0;
  1446. }
  1447. Dbg("SetParam ok.");
  1448. eErr = m_hDevHelper->ActiveWorkingKey(0, 1);
  1449. if (eErr != Error_Succeed)
  1450. {
  1451. //Dbg("pinpad activate WK error,(%d)",eErr);
  1452. LOG_PINPAD_ERROR_MSG_MACRO(eErr, ActiveWorkingKey);
  1453. ctx->Answer(Error_Unexpect, AlarmDECToBusiness());
  1454. ClearRelatedDEC();
  1455. m_bEncrypt = false;
  1456. return 0;
  1457. }
  1458. Dbg("Active ok.");
  1459. EnDecryptInfo srcData,dstData;
  1460. ZeroMemory(srcData.data,MAX_EN_DECRYPT_DATA_SIZE);
  1461. ZeroMemory(dstData.data,MAX_EN_DECRYPT_DATA_SIZE);
  1462. srcData.dwSize = strlen(ctx->Req.data);
  1463. memcpy(srcData.data,ctx->Req.data,srcData.dwSize);
  1464. eErr = m_hDevHelper->EncryptData(srcData,dstData);
  1465. if (eErr != Error_Succeed)
  1466. {
  1467. //Dbg("Encrypt data failed(%d).",eErr);
  1468. LOG_PINPAD_ERROR_MSG_MACRO(eErr, EncryptData);
  1469. ctx->Answer(Error_Unexpect, AlarmDECToBusiness());
  1470. ClearRelatedDEC();
  1471. m_bEncrypt = false;
  1472. return 0;
  1473. }
  1474. //Dbg("%d,%s",dstData.dwSize,dstData.data);
  1475. ctx->Ans.ciphertext = (char*)dstData.data;
  1476. Dbg("Encrypt ok.");
  1477. m_bEncrypt = false;
  1478. ctx->Answer(Error_Succeed);
  1479. return 0;
  1480. }
  1481. int CPinPadFSM::LoadKeySM(SpReqAnsContext<PinPadService_LoadKeysSM_Req, PinPadService_LoadKeysSM_Ans>::Pointer ctx)
  1482. {
  1483. LOG_FUNCTION();
  1484. //Dbg("bOpen(%d),initflag(%d),mk(%s),wk1(%s),wk2(%s)",m_bPlainOpen,ctx->Req.initializeflag,(LPCTSTR)ctx->Req.masterkey,(LPCTSTR)ctx->Req.workingkey1,(LPCTSTR)ctx->Req.workingkey2);
  1485. ErrorCodeEnum eErr;
  1486. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  1487. CSmartPointer<IConfigInfo> spConfig;
  1488. eErr = spEntityFunction->OpenConfig(Config_Run, spConfig);
  1489. if (eErr != Error_Succeed)
  1490. {
  1491. Dbg("read run cfg failed(sm).");
  1492. LogErrMsg("GetEncryptText:", Error_Unexpect, MEC_CFG_RUN_POINTER_FAILED, TRUE);
  1493. spConfig = NULL;
  1494. }
  1495. if (m_bPlainOpen)
  1496. m_hDevHelper->StopInput();
  1497. bool bSM = false;
  1498. if (ctx->Req.smflag == 1)
  1499. bSM = true;
  1500. //initialization need load master key
  1501. if (ctx->Req.initializeflag)
  1502. {
  1503. MasterKeyParam mkParam;
  1504. if (!bSM)
  1505. mkParam.dwSN = 0;
  1506. else
  1507. mkParam.dwSN = 1;
  1508. mkParam.smFlag = ctx->Req.smflag;
  1509. memset(mkParam.key,0,MAX_MASTER_KEY_SIZE);
  1510. Dbg("mkey len:%d", strlen(ctx->Req.masterkey));
  1511. memcpy(mkParam.key,ctx->Req.masterkey,strlen(ctx->Req.masterkey));
  1512. //Dbg("%s,%d",mkParam.key,mkParam.dwSN);
  1513. eErr = m_hDevHelper->LoadMasterKey(mkParam);
  1514. if (eErr != Error_Succeed)
  1515. {
  1516. Dbg("Load master key(%d),mkeysn:%d failed(%d).",bSM,mkParam.dwSN,eErr);
  1517. LOG_PINPAD_ERROR_MSG_MACRO(eErr, LoadMasterKey);
  1518. ctx->Ans.result = 0;
  1519. ctx->Answer(Error_Unexpect, AlarmDECToBusiness());
  1520. ClearRelatedDEC();
  1521. m_bLoadKey = false;
  1522. return 0;
  1523. }
  1524. Dbg("Load master key(%d) suc.",bSM);
  1525. //after load Master key,clear the load key status.add by oilyang 20160922
  1526. //oilyang@20170424 if load 3des master key succeed,clear load key status both of 3des and sm
  1527. if (!bSM)
  1528. {
  1529. spConfig->WriteConfigValueInt("Load", "3DES", 0);
  1530. spConfig->WriteConfigValueInt("Load", "SM", 0);
  1531. }
  1532. }
  1533. WorkKeyParam wkParam1,wkParam2;
  1534. memset(wkParam1.key,0,MAX_WORKING_KEY_SIZE);
  1535. memset(wkParam2.key,0,MAX_WORKING_KEY_SIZE);
  1536. if (!bSM)
  1537. wkParam1.dwMasterSN = wkParam2.dwMasterSN = 0;
  1538. else
  1539. wkParam1.dwMasterSN = wkParam2.dwMasterSN = 1;
  1540. wkParam1.dwWorkingSN = 0;
  1541. wkParam2.dwWorkingSN = 1;
  1542. wkParam1.smFlag = ctx->Req.smflag;
  1543. wkParam2.smFlag = ctx->Req.smflag;
  1544. memcpy(wkParam1.key,ctx->Req.workingkey1,strlen(ctx->Req.workingkey1));
  1545. memcpy(wkParam2.key,ctx->Req.workingkey2,strlen(ctx->Req.workingkey2));
  1546. eErr = m_hDevHelper->LoadWorkingKey(wkParam1);
  1547. if (eErr != Error_Succeed)
  1548. {
  1549. Dbg("load working key 1(%d) failed(%d).",bSM,eErr);
  1550. LOG_PINPAD_ERROR_MSG_MACRO(eErr, LoadWorkingKey);
  1551. ctx->Ans.result = 1;
  1552. ctx->Answer(Error_Unexpect, AlarmDECToBusiness());
  1553. ClearRelatedDEC();
  1554. m_bLoadKey = false;
  1555. return 0;
  1556. }
  1557. Dbg("Load working key1(%d) suc.",bSM);
  1558. eErr = m_hDevHelper->LoadWorkingKey(wkParam2);
  1559. if (eErr != Error_Succeed)
  1560. {
  1561. Dbg("load working key 2(%d) failed(%d).",bSM,eErr);
  1562. LOG_PINPAD_ERROR_MSG_MACRO(eErr, LoadWorkingKey);
  1563. ctx->Ans.result = 2;
  1564. ctx->Answer(Error_Unexpect, AlarmDECToBusiness());
  1565. ClearRelatedDEC();
  1566. m_bLoadKey = false;
  1567. return 0;
  1568. }
  1569. Dbg("Load working key2(%d) suc.",bSM);
  1570. if (spConfig != NULL)
  1571. {
  1572. if (!bSM)
  1573. eErr = spConfig->WriteConfigValueInt("Load", "3DES", 1);
  1574. else
  1575. eErr = spConfig->WriteConfigValueInt("Load", "SM", 1);
  1576. if (eErr != Error_Succeed)
  1577. {
  1578. Dbg("after load key suc,write run cfg failed.");
  1579. LogErrMsg("LoadKeySM:", Error_Unexpect, MEC_CFG_WRITE_RUN_INFOR_FAILED, TRUE);
  1580. }
  1581. }
  1582. m_bLoadKey = false;
  1583. if (bSM)
  1584. m_bSMLoaded = true;
  1585. else
  1586. m_b3DESLoaded = true;
  1587. ctx->Answer(Error_Succeed);
  1588. return 0;
  1589. }
  1590. int CPinPadFSM::EncryptSM(SpReqAnsContext<PinPadService_EncryptDataSM_Req, PinPadService_EncryptDataSM_Ans>::Pointer ctx)
  1591. {
  1592. LOG_FUNCTION();
  1593. Dbg("smflag [%d]",ctx->Req.smflag);
  1594. ErrorCodeEnum eErr;
  1595. bool bSM = false;
  1596. if (ctx->Req.smflag == 1)
  1597. bSM = true;
  1598. //set param
  1599. if (!bSM)
  1600. eErr = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD,EPP_ALGO_METHOD_3DES);
  1601. else
  1602. eErr = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD,EPP_ALGO_METHOD_SM4);
  1603. if (eErr == Error_Succeed)
  1604. eErr = m_hDevHelper->SetParam(EPP_PT_SET_ECB_CBC_MODE,EPP_ALGO_MODE_CBC);
  1605. if (eErr != Error_Succeed)
  1606. {
  1607. Dbg("Encrypt data set param failed(%d).",eErr);
  1608. LOG_PINPAD_ERROR_MSG_MACRO(eErr, SetParam);
  1609. ctx->Answer(Error_Unexpect, AlarmDECToBusiness());
  1610. ClearRelatedDEC();
  1611. m_bEncrypt = false;
  1612. return 0;
  1613. }
  1614. Dbg("SetParam ok.");
  1615. if (!bSM)
  1616. eErr = m_hDevHelper->ActiveWorkingKey(0, 1);
  1617. else
  1618. eErr = m_hDevHelper->ActiveWorkingKey(1, 1);
  1619. if (eErr != Error_Succeed)
  1620. {
  1621. Dbg("pinpad activate WK error,(%d)",eErr);
  1622. LOG_PINPAD_ERROR_MSG_MACRO(eErr, ActiveWorkingKey);
  1623. ctx->Answer(Error_Unexpect, AlarmDECToBusiness());
  1624. ClearRelatedDEC();
  1625. m_bEncrypt = false;
  1626. return 0;
  1627. }
  1628. Dbg("Active ok.");
  1629. EnDecryptInfo srcData,dstData;
  1630. ZeroMemory(srcData.data,MAX_EN_DECRYPT_DATA_SIZE);
  1631. ZeroMemory(dstData.data,MAX_EN_DECRYPT_DATA_SIZE);
  1632. srcData.dwSize = strlen(ctx->Req.data);
  1633. memcpy(srcData.data,ctx->Req.data,srcData.dwSize);
  1634. eErr = m_hDevHelper->EncryptData(srcData,dstData);
  1635. if (eErr != Error_Succeed)
  1636. {
  1637. Dbg("Encrypt data failed(%d).",eErr);
  1638. LOG_PINPAD_ERROR_MSG_MACRO(eErr, EncryptData);
  1639. ctx->Answer(Error_Unexpect, AlarmDECToBusiness());
  1640. ClearRelatedDEC();
  1641. m_bEncrypt = false;
  1642. return 0;
  1643. }
  1644. //Dbg("%d,%s",dstData.dwSize,dstData.data);
  1645. ctx->Ans.ciphertext = (char*)dstData.data;
  1646. Dbg("Encrypt ok.");
  1647. m_bEncrypt = false;
  1648. ctx->Answer(Error_Succeed);
  1649. ClearRelatedDEC();
  1650. return 0;
  1651. }
  1652. int CPinPadFSM::GetCheckCode(SpReqAnsContext<PinPadService_GetCheckCode_Req, PinPadService_GetCheckCode_Ans>::Pointer ctx)
  1653. {
  1654. LOG_FUNCTION();
  1655. ErrorCodeEnum eErr = Error_Unexpect;
  1656. bool bGetOK = true;
  1657. ctx->Ans.checkcode.Init(ctx->Req.mSN.GetCount());
  1658. for (int i = 0; i < ctx->Req.mSN.GetCount(); i++)
  1659. {
  1660. Dbg("mSN:%d,wSN:%d", ctx->Req.mSN[i], ctx->Req.wSN[i]);
  1661. //set param
  1662. if (ctx->Req.mSN[i] == 1)
  1663. eErr = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_SM4);
  1664. else
  1665. eErr = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_3DES);
  1666. if (eErr == Error_Succeed)
  1667. eErr = m_hDevHelper->SetParam(EPP_PT_SET_ECB_CBC_MODE, EPP_ALGO_MODE_CBC);
  1668. else
  1669. {
  1670. LOG_PINPAD_ERROR_MSG_MACRO(eErr, SetParam);
  1671. }
  1672. eErr = m_hDevHelper->ActiveWorkingKey(ctx->Req.mSN[i], ctx->Req.wSN[i]);
  1673. if (eErr != Error_Succeed)
  1674. {
  1675. LOG_PINPAD_ERROR_MSG_MACRO(eErr, ActiveWorkingKey);
  1676. ctx->Ans.checkcode[i] = "";
  1677. }
  1678. else
  1679. {
  1680. EnDecryptInfo srcInfo, dstInfo;
  1681. memset(srcInfo.data, 0, MAX_EN_DECRYPT_DATA_SIZE);
  1682. Dbg("encryptdata[%s]", (LPCTSTR)m_devCheckData);
  1683. memcpy(srcInfo.data, m_devCheckData, m_devCheckData.GetLength());
  1684. srcInfo.dwSize = m_devCheckData.GetLength();
  1685. memset(dstInfo.data, 0, MAX_EN_DECRYPT_DATA_SIZE);
  1686. eErr = m_hDevHelper->EncryptData(srcInfo, dstInfo);
  1687. if (eErr != Error_Succeed)
  1688. {
  1689. LOG_PINPAD_ERROR_MSG_MACRO(eErr, EncryptData);
  1690. return Error_DevCommFailed;
  1691. }
  1692. ctx->Ans.checkcode[i] = (const char*)dstInfo.data;
  1693. }
  1694. }
  1695. ctx->Answer(Error_Succeed);
  1696. ClearRelatedDEC();
  1697. return 0;
  1698. }
  1699. bool CPinPadFSM::GetDevInfo(DevCategoryInfo &devInfo)
  1700. {
  1701. DevCategoryInfo info;
  1702. ZeroMemory(info.szModel, MAX_DEV_MODEL_LEN);
  1703. ZeroMemory(info.szType, MAX_DEV_TYPE_LEN);
  1704. ZeroMemory(info.szVendor, MAX_DEV_VENDOR_LEN);
  1705. ErrorCodeEnum eErrDev = m_hDevHelper->GetDevCategory(info);
  1706. if (eErrDev == Error_Succeed)
  1707. {
  1708. m_szModel = info.szModel;
  1709. m_szType = info.szType;
  1710. m_szVendor = info.szVendor;
  1711. Dbg("%d,%d,%d", strlen(info.szModel), strlen(info.szType), strlen(info.szVendor));
  1712. }
  1713. else
  1714. {
  1715. LOG_PINPAD_ERROR_MSG_MACRO(eErrDev, GetDevCategory);
  1716. }
  1717. ZeroMemory(devInfo.szModel,MAX_DEV_MODEL_LEN);//CM=V2.0#PM=V1.0#MID=75500001#PID=12345678#FWID=V1234567#Vendor=nantian
  1718. ZeroMemory(devInfo.szType,MAX_DEV_TYPE_LEN);
  1719. ZeroMemory(devInfo.szVendor,MAX_DEV_VENDOR_LEN);
  1720. CSimpleStringA tmpModel("");
  1721. if (m_szModel.GetLength() > 1)
  1722. {
  1723. if (m_szModel[m_szModel.GetLength() - 1] == '#')
  1724. tmpModel = m_szModel + "Vendor=" + m_szVendor;
  1725. else
  1726. tmpModel = m_szModel + "#Vendor=" + m_szVendor;
  1727. strncpy(devInfo.szModel, (const char*)tmpModel, tmpModel.GetLength());
  1728. }
  1729. if (m_szType.GetLength() > 1)
  1730. strncpy(devInfo.szType, (const char*)m_szType, m_szType.GetLength());
  1731. if (m_szVendor.GetLength() > 1)
  1732. strncpy(devInfo.szVendor, (const char*)m_szVendor, m_szVendor.GetLength());
  1733. devInfo.eState = m_eDevState;
  1734. return true;
  1735. }
  1736. void CPinPadFSM::SetEnterMainPage(bool bValue)
  1737. {
  1738. m_bInMainPage = bValue;
  1739. return;//oilyang@20200319 去掉任意情况下可输入
  1740. ErrorCodeEnum eErr = Error_Unexpect;
  1741. if (!m_bRVCIL)//非简版无需定时任务
  1742. {
  1743. if (m_bInMainPage)
  1744. {
  1745. eErr = CancelTimer(PINPAD_ANY_INPUT_TIMER);
  1746. Dbg("Cancel any input timer%d.", eErr);
  1747. }
  1748. else
  1749. {
  1750. eErr = ScheduleTimer(PINPAD_ANY_INPUT_TIMER, PINPAD_ANY_INPUT_TIMEOUT);
  1751. Dbg("Start any input timer%d.", eErr);
  1752. }
  1753. }
  1754. }
  1755. void CPinPadFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
  1756. {
  1757. //for simple
  1758. if(m_bPinPadNeedless)
  1759. pTransactionContext->SendAnswer(Error_Succeed);
  1760. else
  1761. pTransactionContext->SendAnswer(m_testResult);
  1762. //DevCategoryInfo devCatInfo;
  1763. //ErrorCodeEnum eErr = m_hDevHelper->GetDevCategory(devCatInfo);
  1764. }
  1765. void CPinPadFSM::CrossTermCall(SpReqAnsContext<PinPadService_CrossTermCall_Req, PinPadService_CrossTermCall_Ans>::Pointer cctx)
  1766. {
  1767. ErrorCodeEnum eErr = Error_Unexpect;
  1768. Dbg("CrossTermCall,type:%x", cctx->Req.type);
  1769. switch (cctx->Req.type)
  1770. {
  1771. case PinPadService_Method_GetInputSM:
  1772. {
  1773. DEFINE_PUPPET_CONTEXT_WITH_TYPE(PinPadService_GetInputSM_Req, PinPadService_GetInputSM_Ans);
  1774. if ((eErr = SpBlob2Object(cctx->Req.paramX, ctx->Req)) == Error_Succeed) {
  1775. SetCtx(NULL, ctx, true);
  1776. if (this->GetInput(NULL,ctx,true) != 0) {
  1777. Dbg("GetInput failed.");
  1778. eErr = Error_Unexpect;
  1779. }
  1780. else {
  1781. eErr = SpObject2Blob(ctx->Ans, cctx->Ans.retParamX);
  1782. Dbg("after GetInput,eErr:%d,paramX.len:%d", eErr, cctx->Ans.retParamX.m_iLength);
  1783. }
  1784. }
  1785. cctx->Answer(eErr);
  1786. }
  1787. break;
  1788. case PinPadService_Method_InputCancel:
  1789. m_bFrontCancel = true;
  1790. break;
  1791. case PinPadService_Method_InputWaitMore:
  1792. m_bWaitingMore = true;
  1793. break;
  1794. case PinPadService_Method_Exit:
  1795. SetExitFlag();
  1796. break;
  1797. default:
  1798. break;
  1799. }
  1800. }
  1801. void CPinPadFSM::CrossTermInvokeInfo(SpOnewayCallContext<PinPadService_CrossTermInvokeInfo_Info>::Pointer ctx)
  1802. {
  1803. LOG_FUNCTION();
  1804. Dbg("entity sn:%x,type:%d,errcode:%x", ctx->Info.nEntityID, ctx->Info.type, ctx->Info.result);
  1805. if (ctx->Info.paramX.m_iLength <= 1)
  1806. {
  1807. }
  1808. ErrorCodeEnum eErr = Error_Unexpect;
  1809. CSmartPointer<ITransactionContext> pTransactionContext;
  1810. switch (ctx->Info.type)
  1811. {
  1812. case PinPadService_Method_GetInputSM:
  1813. {
  1814. //auto pt = reinterpret_cast<SpReqAnsContext<PinPadService_GetInputSM_Req,
  1815. // PinPadService_GetInputSM_Ans>*>(GetCtx(ctx->Info.type));
  1816. //SpReqAnsContext<PinPadService_GetInputSM_Req,
  1817. // PinPadService_GetInputSM_Ans>::Pointer xctx;
  1818. //xctx.Attach(pt);
  1819. eErr = SpBlob2Object(ctx->Info.paramX, m_inputSMCtx->Ans);
  1820. Dbg("eErr:%d,Y len:%d", eErr, ctx->Info.paramX.m_iLength);
  1821. m_inputSMCtx->Answer((ErrorCodeEnum)ctx->Info.result);
  1822. }
  1823. break;
  1824. default:
  1825. break;
  1826. }
  1827. }
  1828. int CPinPadFSM::LocalCallHeartBeat(int method, CBlob &bbSend, bool bTwoWay)
  1829. {
  1830. //LogEvent()
  1831. //use LogEvent or Client Call? oiltmp
  1832. //LogEvent(Severity_Middle, CROSS_CALL_PINPAD_GET_PIN_INPUT, csCmd);
  1833. HeartBeatService_ClientBase* pClient = new HeartBeatService_ClientBase(GetEntityBase());
  1834. if (pClient == NULL)
  1835. {
  1836. Dbg("create HeartBeat client failed.GetLastError:%d", GetLastError());
  1837. return -1;
  1838. }
  1839. ErrorCodeEnum eErr = Error_Unexpect;
  1840. eErr = pClient->Connect();
  1841. if (eErr != Error_Succeed)
  1842. {
  1843. Dbg("client connect to HeartBeat failed:%x", eErr);
  1844. return -1;
  1845. }
  1846. HeartBeatService_CrossTermCall_Req req;
  1847. HeartBeatService_CrossTermCall_Ans ans;
  1848. req.nEntityID = 0x206;
  1849. req.isTwoWay = bTwoWay;
  1850. req.fromTerminalNo = m_terminalNo;
  1851. GetAttachedTerminal(req.toTerminalNo);
  1852. //req.toTerminalNo = "7717715004";
  1853. req.param1 = "";
  1854. req.param2 = "";
  1855. req.paramX = bbSend;
  1856. req.type = method;
  1857. eErr = pClient->CrossTermCall(req, ans, 20000);
  1858. Dbg("CrossTermCall to HeartBeat from %s to %s, result:%x", (const char*)req.fromTerminalNo, (const char*)req.toTerminalNo, eErr);
  1859. return 0;
  1860. }
  1861. bool CPinPadFSM::GetAttachedTerminal(CSimpleStringA &csTerm)
  1862. {
  1863. return GetEntityBase()->GetFunction()->GetSysVar("AttachedTerminal", csTerm);
  1864. }