PinPadFSM.cpp 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925
  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. eErrCode = m_hDevHelper.CreateDevAdptObject();
  430. if(eErrCode != Error_Succeed) {
  431. Dbg("create pinpad module failed %s", SpStrError(eErrCode));
  432. LogWarn(Severity_Middle, eErrDev, AlarmDECToBusiness(MEC_DEV_OBJECT_CREATE_FAILED), "Initial:CreateDevComponent");
  433. initTries++;
  434. continue;
  435. }
  436. }
  437. //PinPadInitParam initParam;
  438. Dbg("%d,%d",port,baudRate);
  439. hr = m_hDevHelper->DevOpen(port,baudRate);
  440. if (hr == Error_Succeed)
  441. {
  442. initTries = 0;
  443. ErrorCodeEnum errCode1,errCode2,errCode3,errCode4;
  444. errCode1 = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD,EPP_ALGO_METHOD_3DES);
  445. errCode2 = m_hDevHelper->SetParam(EPP_PT_SET_MAC_ALGORITH,EPP_MAC_ALGO_ASNIX99);
  446. errCode3 = m_hDevHelper->SetParam(EPP_PT_SET_PIN_ALGORITH,EPP_PIN_ALGO_ISO9564_1_ANSI);
  447. errCode4 = m_hDevHelper->SetParam(EPP_PT_SET_ECB_CBC_MODE,EPP_ALGO_MODE_3DEC_CBC);
  448. if(errCode1 != Error_Succeed || errCode2 != Error_Succeed
  449. || errCode3 != Error_Succeed || errCode4 != Error_Succeed)
  450. {
  451. Dbg("设置参数失败 3des(%d)(%d)(%d)c/ecb(%d).",errCode1,errCode2,errCode3,errCode4);
  452. LOG_PINPAD_ERROR_MSG_MACRO(Error_Unexpect, SetParam);
  453. return 1;
  454. }
  455. Dbg("SetParam suc.");
  456. break;
  457. }
  458. else
  459. {
  460. initTries++;
  461. LogErrMsg("Initial:DevOpen", hr, MEC_DEVAPI_EPP_DevOpen, TRUE);
  462. Sleep(1200);
  463. continue;
  464. }
  465. }while(initTries<PINPAD_INIT_TRIES);
  466. if (initTries != 0)
  467. {
  468. //LOG_PINPAD_ERROR_MSG_MACRO(hr, DevOpen);
  469. Dbg("Open pinpad failed.%s",(const char*)tmpDevSN);
  470. if (tmpDevSN.GetLength() < 10 || tmpDevSN.IndexOf("FWB") < 1)
  471. GetEntityBase()->GetFunction()->ShowFatalError("密码键盘打开失败!请检查键盘是否连接,配置是否正确。");
  472. return 1;
  473. }
  474. m_bDevInit = true;
  475. LOG_TRACE("Open pinpad suc.");
  476. //oiltmp comment the following 20160406
  477. //update with the version 1.7.1
  478. m_encryptkey = m_hDevHelper->GetEncryptFunc();
  479. //m_encryptkey = 1;
  480. eErrDev = spEntityFunction->OpenConfig(Config_Run, spConfig);
  481. if (eErrDev != Error_Succeed)
  482. {
  483. Dbg("read run cfg failed(sm).");
  484. m_b3DESLoaded = false;
  485. m_bSMLoaded = false;
  486. LogWarn(Severity_Middle, eErrDev, AlarmDECToBusiness(MEC_CFG_RUN_POINTER_FAILED), "Initial:OpenConfig");
  487. }
  488. else
  489. {
  490. int tmpLoad = 0;
  491. eErrDev = spConfig->ReadConfigValueInt("Load", "3DES", tmpLoad);
  492. if (eErrDev == Error_Succeed)
  493. m_b3DESLoaded = tmpLoad;
  494. eErrDev = spConfig->ReadConfigValueInt("Load", "SM", tmpLoad);
  495. if (eErrDev == Error_Succeed)
  496. m_bSMLoaded = tmpLoad;
  497. }
  498. Dbg("encrypt key :%d,load key :%d,%d", m_encryptkey,m_b3DESLoaded,m_bSMLoaded);
  499. DevCategoryInfo devInfo;
  500. ZeroMemory(devInfo.szModel, MAX_DEV_MODEL_LEN);
  501. ZeroMemory(devInfo.szType, MAX_DEV_TYPE_LEN);
  502. ZeroMemory(devInfo.szVendor, MAX_DEV_VENDOR_LEN);
  503. eErrDev = m_hDevHelper->GetDevCategory(devInfo);
  504. if (eErrDev == Error_Succeed)
  505. {
  506. m_szModel = devInfo.szModel;
  507. m_szType = devInfo.szType;
  508. m_szVendor = devInfo.szVendor;
  509. Dbg("%d,%d,%d", strlen(devInfo.szModel), strlen(devInfo.szType), strlen(devInfo.szVendor));
  510. }
  511. else
  512. {
  513. LOG_PINPAD_ERROR_MSG_MACRO(eErrDev, GetDevCategory);
  514. }
  515. Dbg("model:%s,type:%s,vendor:%s", (const char*)m_szModel, (const char*)m_szType, (const char*)m_szVendor);
  516. return 0;
  517. }
  518. void CPinPadFSM::DoWork()
  519. {
  520. LOG_FUNCTION();
  521. while(1)
  522. {
  523. //std::this_thread::sleep_for(std::chrono::milliseconds(60 * 1000));
  524. this->m_hInputConVar.Wait();
  525. //WaitForSingleObject(this->GetInputEvtHandle(),INFINITE);
  526. if (this->GetEntityExit())
  527. break;
  528. FSMEvent *evt;
  529. int ret;
  530. if (!this->GetDevInitFlag())
  531. {
  532. ret = this->Initial();
  533. evt = new FSMEvent(USER_EVT_INITFINISHED);
  534. }
  535. else
  536. {
  537. Dbg("getinput in thread start");
  538. SpReqAnsContext<PinPadService_GetInput_Req, PinPadService_GetInput_Ans>::Pointer ctx;
  539. SpReqAnsContext<PinPadService_GetInputSM_Req, PinPadService_GetInputSM_Ans>::Pointer ctxSM;
  540. bool smFlag = false;
  541. bool bRet = this->GetCtx(ctx,ctxSM,smFlag);
  542. Dbg("sm ctx or not[%d]",smFlag);
  543. if (!bRet)
  544. {
  545. Dbg("get ctx failed.doing nothing");
  546. continue;
  547. }
  548. ret = this->GetInput(ctx,ctxSM,smFlag);
  549. evt = new FSMEvent(USER_EVT_GETINPUTFINISHED);
  550. Dbg("getinput in thread end");
  551. }
  552. if (ret == 0)
  553. evt->param1 = 0;
  554. else
  555. evt->param1 = 1;
  556. this->PostEventFIFO(evt);
  557. }
  558. return;
  559. }
  560. static char hexCh2decCh(char c)
  561. {
  562. if((c>='0')&&(c<='9'))
  563. return c-'0';
  564. else if((c>='A')&&(c<='F'))
  565. return c-'A'+10;
  566. else if((c>='a')&&(c<='f'))
  567. return c-'a'+10;
  568. else
  569. return 0x10;
  570. }
  571. static int h2i(char *s)
  572. {
  573. int ret = 0;
  574. while (*s) {
  575. int t = hexCh2decCh(*s);
  576. ret = ret * 16 + t;
  577. ++s;
  578. }
  579. return ret;
  580. }
  581. void CPinPadFSM::push_char(char *buf, int *len, int c)
  582. {
  583. Dbg("len:%d",*len);
  584. buf[*len] = c;
  585. *len = *len + 1;
  586. buf[*len] = 0;
  587. InputContent evt;
  588. evt.data = buf;
  589. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(InputContent), SP_MSG_SIG_OF(InputContent), evt);
  590. }
  591. void CPinPadFSM::PushInputChar(char *buf,int c)
  592. {
  593. //Dbg("len:%d",*len);
  594. buf[0] = c;
  595. Dbg("anyinput[%d][%s]",c,buf);
  596. //*len = *len + 1;
  597. //buf[*len] = 0;
  598. InputContent evt;
  599. evt.data = buf;
  600. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(InputContent), SP_MSG_SIG_OF(InputContent), evt);
  601. }
  602. void CPinPadFSM::pop_char(char *buf, int *len, bool bClear)
  603. {
  604. if (*len > 0) {
  605. if (bClear){
  606. memset(buf,0,*len);
  607. *len = 0;
  608. }else {
  609. *len -= 1;
  610. buf[*len] = 0;
  611. }
  612. InputContent evt;
  613. evt.data = buf;
  614. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(InputContent), SP_MSG_SIG_OF(InputContent), evt);
  615. }
  616. }
  617. void CPinPadFSM::clear_char(char *buf, int *len)
  618. {
  619. if (*len > 0) {
  620. *len = 0;
  621. buf[*len] = 0;
  622. InputContent evt;
  623. evt.data = buf;
  624. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(InputContent), SP_MSG_SIG_OF(InputContent), evt);
  625. }
  626. }
  627. bool CPinPadFSM::Get12Account(char *szAcc)
  628. {
  629. memset(m_szAccount,0,sizeof(m_szAccount));
  630. int accLen = strlen(szAcc);
  631. if (accLen > 12)
  632. memcpy(m_szAccount + 4, szAcc + (accLen - 12 -1), 12);
  633. else if (accLen == 12)
  634. {
  635. if (strncmp(szAcc, "0755", 4) == 0)
  636. memcpy(m_szAccount + 4, szAcc, 12);
  637. else
  638. {
  639. m_szAccount[4] = '5';
  640. memcpy(m_szAccount + 5, szAcc + 1, 11);
  641. }
  642. }
  643. else if (accLen == 9)
  644. {
  645. memcpy(m_szAccount + 4, szAcc, 3);
  646. memcpy(m_szAccount + 7, szAcc, 9);
  647. }
  648. else
  649. memcpy(m_szAccount + 4, szAcc, accLen);
  650. return true;
  651. }
  652. int StrBuf2HexBuf(char* strBuf,PBYTE* hexBuf)
  653. {
  654. int len = strlen(strBuf);
  655. if (len == 0 || len%2 != 0)
  656. return 0;
  657. BYTE* buf = new BYTE[len/2];
  658. if (buf == NULL)
  659. return 0;
  660. int j = 0;
  661. for (int i = 0; i < len;)
  662. {
  663. int tmpVal;
  664. sscanf(strBuf+i,"%2x",&tmpVal);
  665. buf[j] = tmpVal;
  666. //buf[j] = char2int(strBuf[i])*16 + char2int(strBuf[i+1]);
  667. i += 2;
  668. j++;
  669. }
  670. //memcpy(buf,strBuf,len);
  671. *hexBuf = buf;
  672. return j;
  673. }
  674. int HexBuf2StrBuf(PBYTE hexBuf,char** strBuf,DWORD len)
  675. {
  676. char* tmpStr = *strBuf;
  677. int count = 0;
  678. for (int i = 0; i < len; ++i)
  679. {
  680. sprintf(tmpStr+count,"%0.2x",hexBuf[i]);
  681. count += 2;
  682. }
  683. return 0;
  684. }
  685. ErrorCodeEnum CPinPadFSM::GetEncryptText(SpReqAnsContext<PinPadService_GetInput_Req, PinPadService_GetInput_Ans>::Pointer ctx,SpReqAnsContext<PinPadService_GetInputSM_Req, PinPadService_GetInputSM_Ans>::Pointer ctxSM,bool bSM)
  686. {
  687. LOG_FUNCTION();
  688. ErrorCodeEnum errCode;
  689. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  690. CSmartPointer<IConfigInfo> spConfig;
  691. errCode = spEntityFunction->OpenConfig(Config_Software, spConfig);
  692. if (errCode != Error_Succeed)
  693. {
  694. LOG_TRACE("open device cfg file failed.");
  695. LogWarn(Severity_Middle, errCode, AlarmDECToBusiness(MEC_CFG_SOFTWARE_POINTER_FAILED), "GetEncryptText:OpenConfig");
  696. return Error_DevLoadFileFailed;
  697. }
  698. //bSM:ctx or sm ctx;
  699. //bSMFlag:to use 3des or use sm
  700. int len,timeout;
  701. bool confirm, bSMFlag = false;
  702. if (!bSM)
  703. {
  704. len = ctx->Req.length;
  705. timeout = ctx->Req.timeout;
  706. confirm = ctx->Req.confirm;
  707. }
  708. else
  709. {
  710. len = ctxSM->Req.length;
  711. timeout = ctxSM->Req.timeout;
  712. confirm = ctxSM->Req.confirm;
  713. if (ctxSM->Req.smflag == 1)
  714. {
  715. Dbg("has smflag true,to use sm.");
  716. bSMFlag = true;
  717. }
  718. }
  719. if (!bSMFlag)
  720. {
  721. LogWarn(Severity_High, Error_Unexpect, LOG_ERR_PINPAD_NOT_SM, "Encryption is not SM");
  722. }
  723. //PinInputParam pinInParam;
  724. //pinInParam.dwPinLen = len;
  725. AccountInfo accInfo;
  726. memset(accInfo.account,0,MAX_ACCOUNT_LEN);
  727. if (!bSM)
  728. {
  729. if (Get12Account(const_cast<char*>(ctx->Req.account.GetData())))
  730. memcpy(accInfo.account,m_szAccount+4,12);
  731. else
  732. {
  733. Dbg("Get12Account err(%s).",(const char*)ctx->Req.account);
  734. return Error_DevCommFailed;
  735. }
  736. }
  737. else
  738. {
  739. if (Get12Account(const_cast<char*>(ctxSM->Req.account.GetData())))
  740. memcpy(accInfo.account,m_szAccount+4,12);
  741. else
  742. {
  743. Dbg("Get12Account err(%s).",(const char*)ctxSM->Req.account);
  744. return Error_DevCommFailed;
  745. }
  746. }
  747. //memcpy(accInfo.account,"588571006555",12);
  748. accInfo.dwAccLen = 12;
  749. Dbg("acc(%s)",accInfo.account);
  750. errCode = m_hDevHelper->SetAccNo(accInfo);
  751. if (errCode != Error_Succeed)
  752. {
  753. if (!bSM)
  754. Dbg("set accout(%s)(%s) failed(%d).",(const char*)ctx->Req.account,accInfo.account,errCode);
  755. else
  756. Dbg("[sm]set accout(%s)(%s) failed(%d).",(const char*)ctxSM->Req.account,accInfo.account,errCode);
  757. LOG_PINPAD_ERROR_MSG_MACRO(errCode, SetAccNo);
  758. return Error_DevCommFailed;
  759. }
  760. if (!bSMFlag)
  761. errCode = m_hDevHelper->ActiveWorkingKey(0,0);
  762. else
  763. errCode = m_hDevHelper->ActiveWorkingKey(1,0);
  764. if (errCode != Error_Succeed)
  765. {
  766. LOG_PINPAD_ERROR_MSG_MACRO(errCode, ActiveWorkingKey);
  767. Dbg("ActiveWorkingKey failed.");
  768. return Error_DevCommFailed;
  769. }
  770. if (!bSMFlag)
  771. {
  772. //errCode = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_3DES);
  773. errCode = m_hDevHelper->SetParam(EPP_PT_SET_PIN_ALGORITH, EPP_PIN_ALGO_ISO9564_1_ANSI);
  774. }
  775. else
  776. {
  777. //errCode = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_SM4);
  778. errCode = m_hDevHelper->SetParam(EPP_PT_SET_PIN_ALGORITH, EPP_PIN_ALGO_SM4);
  779. }
  780. if (errCode != Error_Succeed)
  781. {
  782. //Dbg("set param failed.");
  783. LOG_PINPAD_ERROR_MSG_MACRO(errCode, SetParam);
  784. return Error_DevCommFailed;
  785. }
  786. Dbg("to start");
  787. errCode = m_hDevHelper->StartPinInput(len);
  788. if (errCode != Error_Succeed)
  789. {
  790. LOG_PINPAD_ERROR_MSG_MACRO(errCode, StartPinInput);
  791. return Error_DevCommFailed;
  792. }
  793. Dbg("start end");
  794. char *buf = new char[len+1];
  795. memset(buf,0,len+1);
  796. int readed = 0;
  797. DWORD elapsed = 0;
  798. DWORD dwStart = get_tick_count();
  799. DWORD dwEnd = get_tick_count();
  800. bool bCancelInput = false;
  801. Dbg("reqqqq(pin)[%d][%d][%d]",len,timeout,confirm);
  802. Dbg("bExit(%d)",m_bExit);
  803. while (elapsed < MAX_PINPAD_INPUT_TIMEOUT) {
  804. if (m_bExit)
  805. break;
  806. if (!confirm && readed >= len)
  807. break;
  808. if (m_bWaitingMore)
  809. {
  810. dwStart = get_tick_count();
  811. elapsed = 0;
  812. m_bWaitingMore = false;
  813. continue;
  814. }
  815. if (m_bFrontCancel)
  816. {
  817. bCancelInput = true;
  818. goto Err;
  819. }
  820. //char ch[4] = {0};
  821. BYTE btCh;
  822. Sleep(100);
  823. errCode = m_hDevHelper->KeyRead(btCh);
  824. if (errCode == Error_Succeed) {
  825. LogEvent(Severity_Middle,LOG_EVT_PINPAD_OP,"PinPad op.");
  826. if (btCh == 0x0d) {
  827. if (confirm)
  828. {
  829. if (!bSM)
  830. ctx->Ans.enter = true;
  831. else
  832. ctxSM->Ans.enter = true;
  833. break;
  834. }
  835. else
  836. {
  837. dwEnd = get_tick_count();
  838. elapsed = dwEnd - dwStart;
  839. continue;
  840. }
  841. } else if (btCh == 0x08) { // back
  842. if (confirm)
  843. {
  844. dwEnd = get_tick_count();
  845. elapsed = dwEnd - dwStart;
  846. continue;
  847. }
  848. Dbg("clear input");
  849. pop_char(buf, &readed,true);
  850. } else if (btCh == 0x1b) { // quit
  851. if (confirm)
  852. {
  853. if (!bSM)
  854. ctx->Ans.enter = true;
  855. else
  856. ctxSM->Ans.enter = true;
  857. goto Err;
  858. }
  859. else
  860. {
  861. bCancelInput = true;
  862. goto Err;
  863. }
  864. } else if (btCh == 0x3f){
  865. if (confirm)
  866. {
  867. dwEnd = get_tick_count();
  868. elapsed = dwEnd - dwStart;
  869. continue;
  870. }
  871. push_char(buf, &readed, '*');
  872. }else{
  873. Dbg("else[%d]",btCh);
  874. //continue;
  875. }
  876. } else {
  877. }
  878. dwEnd = get_tick_count();
  879. elapsed = dwEnd - dwStart;
  880. }
  881. buf[readed] = 0;
  882. //strOutput = buf;
  883. Err:
  884. //oilyang 20131017 commented
  885. //errCode = m_hDevHelper->StopInput();
  886. //if (errCode != Error_Succeed)
  887. // Dbg("StopInput failed(%d).",errCode);
  888. //else
  889. //{
  890. // Dbg("after pin input close pinpad suc.");
  891. // m_bPlainOpen = false;
  892. //}
  893. if (m_bExit)
  894. {
  895. Dbg("exit");
  896. return Error_Unexpect;
  897. }
  898. m_bExit = false;
  899. if (buf != NULL)
  900. delete []buf;
  901. if (bCancelInput)
  902. {
  903. Dbg("input cancel(pin)");
  904. return Error_Cancel;
  905. }
  906. if (readed < len) {
  907. if (elapsed >= MAX_PINPAD_INPUT_TIMEOUT) {
  908. return Error_TimeOut;
  909. }
  910. }
  911. PinBlock pinBlk;
  912. Dbg("to getpinblk");
  913. Sleep(500);//nantian
  914. errCode = m_hDevHelper->GetPinBlock(pinBlk);
  915. Dbg("getpinblock(%d),size:%d",errCode,pinBlk.dwSize);
  916. if (errCode == Error_Succeed)
  917. {
  918. char *tmpPinData = new char[MAX_PIN_BLOCK_SIZE];
  919. if (tmpPinData == NULL)
  920. return Error_Resource;
  921. memset(tmpPinData,0,MAX_PIN_BLOCK_SIZE);
  922. memcpy(tmpPinData,pinBlk.data,pinBlk.dwSize);
  923. if (!bSM)
  924. ctx->Ans.data = tmpPinData;
  925. else
  926. ctxSM->Ans.data = tmpPinData;
  927. //Dbg("pinblk(%s)",tmpPinData);
  928. if (tmpPinData != NULL)
  929. {
  930. delete []tmpPinData;
  931. tmpPinData = NULL;
  932. }
  933. EnDecryptInfo srcInfo,dstInfo;
  934. memset(srcInfo.data,0,MAX_EN_DECRYPT_DATA_SIZE);
  935. //memcpy(srcInfo.data,"0000000000000000",16);
  936. //PBYTE tmpCheckData = new BYTE[MAX_EN_DECRYPT_DATA_SIZE];
  937. //if (tmpCheckData == NULL)
  938. // return Error_Resource;
  939. //memset(tmpCheckData,0,MAX_EN_DECRYPT_DATA_SIZE);
  940. //int len = StrBuf2HexBuf(const_cast<char*>(m_devCheckData.GetData()),&tmpCheckData);
  941. //memcpy(srcInfo.data,tmpCheckData,len);
  942. //srcInfo.dwSize = len;
  943. Dbg("encryptdata[%s]",(LPCTSTR)m_devCheckData);
  944. memcpy(srcInfo.data,m_devCheckData,m_devCheckData.GetLength());
  945. srcInfo.dwSize = m_devCheckData.GetLength();
  946. memset(dstInfo.data,0,MAX_EN_DECRYPT_DATA_SIZE);
  947. //set param
  948. if (!bSMFlag)
  949. errCode = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_3DES);
  950. else
  951. errCode = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_SM4);
  952. if (errCode == Error_Succeed)
  953. errCode = m_hDevHelper->SetParam(EPP_PT_SET_ECB_CBC_MODE, EPP_ALGO_MODE_CBC);
  954. if (errCode != Error_Succeed)
  955. {
  956. Dbg("encrypt data set param failed.");
  957. LOG_PINPAD_ERROR_MSG_MACRO(errCode, SetParam);
  958. return Error_Param;
  959. }
  960. errCode = m_hDevHelper->EncryptData(srcInfo,dstInfo);
  961. //if (tmpCheckData != NULL)
  962. //{
  963. // delete []tmpCheckData;
  964. // tmpCheckData = NULL;
  965. //}
  966. if (errCode != Error_Succeed)
  967. {
  968. LOG_PINPAD_ERROR_MSG_MACRO(errCode, EncryptData);
  969. return Error_DevCommFailed;
  970. }
  971. char *tmpCheckCode = new char[MAX_PIN_BLOCK_SIZE];
  972. if (tmpCheckCode == NULL)
  973. return Error_Resource;
  974. memset(tmpCheckCode,0,MAX_PIN_BLOCK_SIZE);
  975. //HexBuf2StrBuf(dstInfo.data,&tmpCheckCode,dstInfo.dwSize);
  976. memcpy(tmpCheckCode,dstInfo.data,dstInfo.dwSize);
  977. Dbg("ckckck[%s]",tmpCheckCode);
  978. if (!bSM)
  979. {
  980. if (strnicmp(tmpCheckCode, "8CA64DE9C1B123A7", strlen("8CA64DE9C1B123A7")) == 0)
  981. {
  982. LogErrMsg("GetEncryptText:", Error_Unexpect, LOG_ERR_PINPAD_KEY_LOST, TRUE);
  983. //LogWarn(Severity_High, Error_Param, LOG_ERR_PINPAD_KEY_LOST, "keys have been cleared.");
  984. }
  985. ctx->Ans.checkcode = tmpCheckCode;
  986. ctx->Ans.deviceno = m_deviceNo;
  987. ctx->Ans.keyseq = m_keySN;
  988. }
  989. else
  990. {
  991. if (strnicmp(tmpCheckCode, "9F1F7BFF6F5511384D9430531E538FD3",
  992. strlen("9F1F7BFF6F5511384D9430531E538FD3")) == 0)
  993. {
  994. //UpdateDEC(LOG_ERR_PINPAD_KEY_LOST_SM);
  995. LogErrMsg("GetEncryptText:", Error_Unexpect, LOG_ERR_PINPAD_KEY_LOST_SM, TRUE);
  996. //LogWarn(Severity_High, Error_Param, LOG_ERR_PINPAD_KEY_LOST_SM, "keys(sm) have been cleared.");
  997. }
  998. ctxSM->Ans.checkcode = tmpCheckCode;
  999. ctxSM->Ans.deviceno = m_deviceNo;
  1000. if (!bSMFlag)
  1001. ctxSM->Ans.keyseq = m_keySN;
  1002. else
  1003. {
  1004. if (m_keySNSM.GetLength() < 2)//如果忘记配置
  1005. ctxSM->Ans.keyseq = "001";
  1006. else
  1007. ctxSM->Ans.keyseq = m_keySNSM;
  1008. }
  1009. }
  1010. }
  1011. else
  1012. {
  1013. LOG_PINPAD_ERROR_MSG_MACRO(errCode, GetPinBlock);
  1014. return Error_DevCommFailed;
  1015. }
  1016. //if (!bSM)
  1017. // Dbg("oiltest 20160224 %s,%s,%s,%s", (LPCTSTR)ctx->Ans.checkcode, (LPCTSTR)ctx->Ans.deviceno, (LPCTSTR)ctx->Ans.keyseq, (LPCTSTR)ctx->Ans.data);
  1018. //else
  1019. // Dbg("oiltest 20160224 %s,%s,%s,%s", (LPCTSTR)ctxSM->Ans.checkcode, (LPCTSTR)ctxSM->Ans.deviceno, (LPCTSTR)ctxSM->Ans.keyseq, (LPCTSTR)ctxSM->Ans.data);
  1020. Dbg("pin input succeed");
  1021. return Error_Succeed;
  1022. }
  1023. void CPinPadFSM::OpenInputText(void *pUserdata)
  1024. {
  1025. //Dbg("any input in");
  1026. //char *m_buf = new char[4];
  1027. memset(m_buf, 0, 4);
  1028. //m_bPinInput = false;//???
  1029. ErrorCodeEnum err;
  1030. //while (elapsed < MAX_PINPAD_INPUT_TIMEOUT) {
  1031. //while(1){
  1032. if (m_bPinInput)
  1033. return;
  1034. if (!m_bPlainOpen)
  1035. {
  1036. err = m_hDevHelper->StartPlainInput();
  1037. if (err == Error_Succeed)
  1038. {
  1039. Dbg("start any input");
  1040. GetEntityBase()->GetFunction()->SetUserDefineState(USER_PINPAD_IDLE);
  1041. m_testResult = Error_Succeed;
  1042. m_dwDevCommFailCount = 0;
  1043. m_bPlainOpen = true;
  1044. }
  1045. else
  1046. {
  1047. GetEntityBase()->GetFunction()->SetUserDefineState(USER_PINPAD_FAILED_RECOVERING);
  1048. m_dwDevCommFailCount++;
  1049. //Dbg("start any input err:%d",err);
  1050. if (m_dwDevCommFailCount > 10 * 3)
  1051. {
  1052. LOG_PINPAD_ERROR_MSG_MACRO(err, StartPlainInput);
  1053. Dbg("failed 3 seconds ago...");
  1054. m_testResult = Error_DevCommFailed;
  1055. }
  1056. }
  1057. }
  1058. //commented by oilyang 20160628
  1059. //don't open/stop pinpad any input periodly any more
  1060. //m_dwPinPadRunCount++;
  1061. ////30 minutes.about every 1.5s call this function once...so...
  1062. //if (m_dwPinPadRunCount > 40*30)
  1063. //{
  1064. // m_dwPinPadRunCount = 0;
  1065. // Dbg("stop input in period");
  1066. // m_hDevHelper->StopInput();
  1067. // m_bPlainOpen = false;
  1068. //}
  1069. BYTE btCh;
  1070. INT64 i64Start = get_tick_count();
  1071. err = m_hDevHelper->KeyRead(btCh);
  1072. INT64 i64End = get_tick_count();
  1073. if ((i64End - i64Start) > 3000)//more than 3 seconds
  1074. Dbg("KeyRead cost more than %d seconds.", (i64End - i64Start)/1000);
  1075. if (err == Error_Succeed) {
  1076. LogEvent(Severity_Middle, LOG_EVT_PINPAD_OP, "PinPad op(Any).");
  1077. PushInputChar(m_buf, btCh);
  1078. }
  1079. else {
  1080. //Dbg("else[%s]", buf);
  1081. }
  1082. //}
  1083. //delete [] buf;
  1084. //Dbg("input succeed");
  1085. //GetEntityBase()->GetFunction()->ResetTimer(PINPAD_ANY_INPUT_TIMER,PINPAD_ANY_INPUT_TIMEOUT);
  1086. ScheduleTimer(PINPAD_ANY_INPUT_TIMER, PINPAD_ANY_INPUT_TIMEOUT);
  1087. return;
  1088. }
  1089. ErrorCodeEnum CPinPadFSM::GetText(SpReqAnsContext<PinPadService_GetInput_Req, PinPadService_GetInput_Ans>::Pointer ctx,SpReqAnsContext<PinPadService_GetInputSM_Req, PinPadService_GetInputSM_Ans>::Pointer ctxSM,bool bSM)
  1090. {
  1091. LOG_FUNCTION();
  1092. int len,timeout;
  1093. bool confirm;
  1094. if (!bSM)
  1095. {
  1096. len = ctx->Req.length;
  1097. timeout = ctx->Req.timeout;
  1098. confirm = ctx->Req.confirm;
  1099. }
  1100. else
  1101. {
  1102. len = ctxSM->Req.length;
  1103. timeout = ctxSM->Req.timeout;
  1104. confirm = ctxSM->Req.confirm;
  1105. }
  1106. char *buf = new char[len+1];
  1107. memset(buf,0,len+1);
  1108. int readed = 0;
  1109. DWORD elapsed = 0;
  1110. DWORD dwStart = get_tick_count();
  1111. DWORD dwEnd = get_tick_count();
  1112. bool bCancelInput = false;
  1113. //Dbg("reqqqq[%d][%d][%d]",len,timeout,confirm);
  1114. //bool bPlainOpen = false;
  1115. ErrorCodeEnum err;
  1116. //the following several lines just for Nantian as they close pinpad while mag encrypted improve. oilyang 20150513
  1117. err = m_hDevHelper->StopInput();
  1118. m_bPlainOpen = false;
  1119. Dbg("plain input for nt.%d",err);
  1120. Sleep(100);
  1121. while (elapsed < MAX_PINPAD_INPUT_TIMEOUT) {
  1122. //while(1){
  1123. if (m_bExit)
  1124. {
  1125. Dbg("Exit");
  1126. bCancelInput = true;
  1127. goto Err;
  1128. }
  1129. if (!confirm && readed >= len)
  1130. break;
  1131. if (m_bWaitingMore)
  1132. {
  1133. Dbg("WaitMore");
  1134. dwStart = get_tick_count();
  1135. elapsed = 0;
  1136. m_bWaitingMore = false;
  1137. continue;
  1138. }
  1139. if (m_bFrontCancel)
  1140. {
  1141. Dbg("Front Cancel");
  1142. bCancelInput = true;
  1143. goto Err;
  1144. }
  1145. if (!m_bPlainOpen)
  1146. {
  1147. Dbg("start plain input");
  1148. err = m_hDevHelper->StartPlainInput();
  1149. if (err == Error_Succeed)
  1150. m_bPlainOpen = true;
  1151. else
  1152. {
  1153. Dbg("start plain input err:%d",err);
  1154. LOG_PINPAD_ERROR_MSG_MACRO(err, StartPlainInput);
  1155. }
  1156. }
  1157. BYTE btCh;
  1158. Sleep(100);//oiltest
  1159. //Dbg("start plain KeyRead");
  1160. err = m_hDevHelper->KeyRead(btCh);
  1161. //Dbg("end plain KeyRead");
  1162. if (err == Error_Succeed) {
  1163. //DevErrorInfo devErrInfo;
  1164. //m_hDevHelper->GetLastErr(devErrInfo);
  1165. //Dbg("[%s]",devErrInfo.szErrMsg);
  1166. LogEvent(Severity_Middle,LOG_EVT_PINPAD_OP,"PinPad op(T).");
  1167. if (btCh == 0x0d) {
  1168. if (confirm)
  1169. {
  1170. if (!bSM)
  1171. ctx->Ans.enter = true;
  1172. else
  1173. ctxSM->Ans.enter = true;
  1174. break;
  1175. }
  1176. else
  1177. {
  1178. dwEnd = get_tick_count();
  1179. elapsed = dwEnd - dwStart;
  1180. continue;
  1181. }
  1182. } else if (btCh == 0x08) { // back
  1183. if (confirm)
  1184. {
  1185. dwEnd = get_tick_count();
  1186. elapsed = dwEnd - dwStart;
  1187. continue;
  1188. }
  1189. pop_char(buf, &readed,true);
  1190. } else if (btCh == 0x1b) { // quit
  1191. bCancelInput = true;
  1192. if (confirm)
  1193. {
  1194. if (!bSM)
  1195. ctx->Ans.enter = false;
  1196. else
  1197. ctxSM->Ans.enter = false;
  1198. break;
  1199. }
  1200. //else
  1201. {
  1202. //bCancelInput = true;
  1203. break;
  1204. }
  1205. } else {
  1206. if (confirm)
  1207. {
  1208. dwEnd = get_tick_count();
  1209. elapsed = dwEnd - dwStart;
  1210. continue;
  1211. }
  1212. switch (btCh) {
  1213. case 0x30:
  1214. case 0x31:
  1215. case 0x32:
  1216. case 0x33:
  1217. case 0x34:
  1218. case 0x35:
  1219. case 0x36:
  1220. case 0x37:
  1221. case 0x38:
  1222. case 0x39:
  1223. //case 0x2e:
  1224. //case 0x20:
  1225. push_char(buf, &readed, btCh);
  1226. break;
  1227. default:
  1228. break;
  1229. }
  1230. }
  1231. } else {
  1232. //Dbg("else[%s]", buf);
  1233. }
  1234. dwEnd = get_tick_count();
  1235. elapsed = dwEnd - dwStart;
  1236. }
  1237. Err:
  1238. buf[readed] = 0;
  1239. if (!bSM)
  1240. {
  1241. ctx->Ans.data = buf;
  1242. ctx->Ans.deviceno = "";
  1243. ctx->Ans.checkcode = "";
  1244. ctx->Ans.keyseq = "";
  1245. }
  1246. else
  1247. {
  1248. ctxSM->Ans.data = buf;
  1249. ctxSM->Ans.deviceno = "";
  1250. ctxSM->Ans.checkcode = "";
  1251. ctxSM->Ans.keyseq = "";
  1252. }
  1253. delete [] buf;
  1254. if (bCancelInput)
  1255. {
  1256. Dbg("input cancel");
  1257. return Error_Cancel;
  1258. }
  1259. if (readed < len) {
  1260. if (elapsed >= MAX_PINPAD_INPUT_TIMEOUT) {
  1261. return Error_TimeOut;
  1262. }
  1263. }
  1264. Dbg("input succeed");
  1265. return Error_Succeed;
  1266. }
  1267. int CPinPadFSM::GetInput(SpReqAnsContext<PinPadService_GetInput_Req, PinPadService_GetInput_Ans>::Pointer ctx,SpReqAnsContext<PinPadService_GetInputSM_Req, PinPadService_GetInputSM_Ans>::Pointer ctxSM,bool bSM)
  1268. {
  1269. //GetEntityBase()->GetFunction()->ResetTimer(PINPAD_ANY_INPUT_TIMER,MAX_INPUT_TIMER_TIMEOUT);
  1270. DWORD dwCurrThId = GetCurrentThreadId();
  1271. Dbg("GetInput thread id:%d",dwCurrThId);
  1272. //ctx = m_ctx;
  1273. m_bWaitingMore = false;
  1274. m_bFrontCancel = false;
  1275. m_bExit = false;
  1276. LogEvent(Severity_Middle,LOG_EVT_PINPAD_GREEN_ON,"PinPad light on.");
  1277. //LogEvent(Severity_Middle,LOG_EVT_PINPAD_GREEN_ON,"PinPad green light on.");
  1278. if (!m_hDevHelper)
  1279. {
  1280. LOG_TRACE("PinPad is not available!");
  1281. if (!bSM)
  1282. m_ctx->Answer(Error_Unexpect, AlarmDECToBusiness(PinPad_UserErrorCode_PinPad_Instance_Is_Null));
  1283. else
  1284. m_inputSMCtx->Answer(Error_Unexpect, AlarmDECToBusiness(PinPad_UserErrorCode_PinPad_Instance_Is_Null));
  1285. LogEvent(Severity_Middle,LOG_EVT_PINPAD_GREEN_OFF,"PinPad light off.");
  1286. //LogEvent(Severity_Middle,LOG_EVT_PINPAD_GREEN_OFF,"PinPad green light off.");
  1287. m_bPinInput = false;
  1288. return 1;
  1289. }
  1290. bool encrypt;
  1291. if (!bSM)
  1292. {
  1293. encrypt = m_ctx->Req.encrypt;
  1294. }
  1295. else
  1296. {
  1297. encrypt = m_inputSMCtx->Req.encrypt;
  1298. }
  1299. ErrorCodeEnum err;
  1300. //Dbg("get input...bSM[%d][%d]",bSM,encrypt);
  1301. UpdateDEC();
  1302. if (!encrypt) {
  1303. err = GetText(m_ctx,m_inputSMCtx,bSM);
  1304. } else {
  1305. err = GetEncryptText(m_ctx,m_inputSMCtx,bSM);
  1306. }
  1307. //if (ctx->Req.encrypt)
  1308. {
  1309. //oilyang@20200428 call StopInput
  1310. //if (m_bPlainOpen)
  1311. {
  1312. ErrorCodeEnum errClosePinPad = m_hDevHelper->StopInput();
  1313. Dbg("close pinpad(%d).",errClosePinPad);
  1314. Sleep(100);
  1315. m_bPlainOpen = false;
  1316. }
  1317. if(err == Error_Succeed)
  1318. {
  1319. if (!bSM)
  1320. m_ctx->Answer();
  1321. else
  1322. m_inputSMCtx->Answer();
  1323. }
  1324. else
  1325. {
  1326. if (!bSM)
  1327. m_ctx->Answer(err, AlarmDECToBusiness());
  1328. else
  1329. m_inputSMCtx->Answer(err, AlarmDECToBusiness());
  1330. }
  1331. ClearRelatedDEC();
  1332. }
  1333. m_bPinInput = false;
  1334. LogEvent(Severity_Middle,LOG_EVT_PINPAD_GREEN_OFF,"PinPad light off.");
  1335. //GetEntityBase()->GetFunction()->ResetTimer(PINPAD_ANY_INPUT_TIMER,1);
  1336. //LogEvent(Severity_Middle,LOG_EVT_PINPAD_GREEN_OFF,"PinPad green light off.");
  1337. return 0;
  1338. }
  1339. int CPinPadFSM::LoadKey(SpReqAnsContext<PinPadService_LoadKeys_Req, PinPadService_LoadKeys_Ans>::Pointer ctx)
  1340. {
  1341. //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);
  1342. UpdateDEC();
  1343. ErrorCodeEnum eErr;
  1344. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  1345. CSmartPointer<IConfigInfo> spConfig;
  1346. eErr = spEntityFunction->OpenConfig(Config_Run, spConfig);
  1347. if (eErr != Error_Succeed)
  1348. {
  1349. Dbg("read run cfg failed.");
  1350. spConfig = NULL;
  1351. }
  1352. if (m_bPlainOpen)
  1353. m_hDevHelper->StopInput();
  1354. //initialization need load master key
  1355. if (ctx->Req.initializeflag)
  1356. {
  1357. MasterKeyParam mkParam;
  1358. mkParam.dwSN = 0;
  1359. mkParam.smFlag = 0;
  1360. memset(mkParam.key,0,MAX_MASTER_KEY_SIZE);
  1361. memcpy(mkParam.key,ctx->Req.masterkey,strlen(ctx->Req.masterkey));
  1362. //Dbg("%s,%d",mkParam.key,mkParam.dwSN);
  1363. eErr = m_hDevHelper->LoadMasterKey(mkParam);
  1364. if (eErr != Error_Succeed)
  1365. {
  1366. Dbg("Load master key failed(%d).",eErr);
  1367. LOG_PINPAD_ERROR_MSG_MACRO(eErr, LoadMasterKey);
  1368. ctx->Ans.result = 0;
  1369. ctx->Answer(Error_Unexpect, AlarmDECToBusiness());
  1370. ClearRelatedDEC();
  1371. m_bLoadKey = false;
  1372. return 0;
  1373. }
  1374. Dbg("Load master key suc.");
  1375. //oilyang@20170424 if load 3des master key succeed,clear load key status both of 3des and sm
  1376. spConfig->WriteConfigValueInt("Load", "3DES", 0);
  1377. spConfig->WriteConfigValueInt("Load", "SM", 0);
  1378. }
  1379. WorkKeyParam wkParam1,wkParam2;
  1380. memset(wkParam1.key,0,MAX_WORKING_KEY_SIZE);
  1381. memset(wkParam2.key,0,MAX_WORKING_KEY_SIZE);
  1382. wkParam1.dwMasterSN = wkParam2.dwMasterSN = 0;
  1383. wkParam1.dwWorkingSN = 0;
  1384. wkParam2.dwWorkingSN = 1;
  1385. memcpy(wkParam1.key,ctx->Req.workingkey1,strlen(ctx->Req.workingkey1));
  1386. memcpy(wkParam2.key,ctx->Req.workingkey2,strlen(ctx->Req.workingkey2));
  1387. wkParam1.smFlag = 0;
  1388. eErr = m_hDevHelper->LoadWorkingKey(wkParam1);
  1389. if (eErr != Error_Succeed)
  1390. {
  1391. Dbg("load working key 1 failed(%d).",eErr);
  1392. LOG_PINPAD_ERROR_MSG_MACRO(eErr, LoadWorkingKey);
  1393. ctx->Ans.result = 1;
  1394. ctx->Answer(Error_Unexpect, AlarmDECToBusiness());
  1395. ClearRelatedDEC();
  1396. m_bLoadKey = false;
  1397. return 0;
  1398. }
  1399. Dbg("Load working key1 suc.");
  1400. wkParam2.smFlag = 0;
  1401. eErr = m_hDevHelper->LoadWorkingKey(wkParam2);
  1402. if (eErr != Error_Succeed)
  1403. {
  1404. Dbg("load working key 2 failed(%d).",eErr);
  1405. LOG_PINPAD_ERROR_MSG_MACRO(eErr, LoadWorkingKey);
  1406. ctx->Ans.result = 2;
  1407. ctx->Answer(Error_Unexpect, AlarmDECToBusiness());
  1408. ClearRelatedDEC();
  1409. m_bLoadKey = false;
  1410. return 0;
  1411. }
  1412. Dbg("Load working key2 suc.");
  1413. if (spConfig != NULL)
  1414. {
  1415. eErr = spConfig->WriteConfigValueInt("Load", "3DES", 1);
  1416. if (eErr != Error_Succeed)
  1417. {
  1418. Dbg("after load key suc,write run cfg failed.");
  1419. LogErrMsg("GetEncryptText:", Error_Unexpect, MEC_CFG_WRITE_RUN_INFOR_FAILED, TRUE);
  1420. }
  1421. }
  1422. m_bLoadKey = false;
  1423. m_b3DESLoaded = true;
  1424. ctx->Answer(Error_Succeed);
  1425. ClearRelatedDEC();
  1426. return 0;
  1427. }
  1428. int CPinPadFSM::Encrypt(SpReqAnsContext<PinPadService_EncryptData_Req, PinPadService_EncryptData_Ans>::Pointer ctx)
  1429. {
  1430. LOG_FUNCTION();
  1431. ErrorCodeEnum eErr;
  1432. //set param
  1433. eErr = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD,EPP_ALGO_METHOD_3DES);
  1434. if (eErr == Error_Succeed)
  1435. eErr = m_hDevHelper->SetParam(EPP_PT_SET_ECB_CBC_MODE,EPP_ALGO_MODE_3DEC_CBC);
  1436. if (eErr != Error_Succeed)
  1437. {
  1438. //Dbg("Encrypt data set param failed(%d).",eErr);
  1439. LOG_PINPAD_ERROR_MSG_MACRO(eErr, SetParam);
  1440. ctx->Answer(Error_Unexpect, AlarmDECToBusiness());
  1441. ClearRelatedDEC();
  1442. m_bEncrypt = false;
  1443. return 0;
  1444. }
  1445. Dbg("SetParam ok.");
  1446. eErr = m_hDevHelper->ActiveWorkingKey(0, 1);
  1447. if (eErr != Error_Succeed)
  1448. {
  1449. //Dbg("pinpad activate WK error,(%d)",eErr);
  1450. LOG_PINPAD_ERROR_MSG_MACRO(eErr, ActiveWorkingKey);
  1451. ctx->Answer(Error_Unexpect, AlarmDECToBusiness());
  1452. ClearRelatedDEC();
  1453. m_bEncrypt = false;
  1454. return 0;
  1455. }
  1456. Dbg("Active ok.");
  1457. EnDecryptInfo srcData,dstData;
  1458. ZeroMemory(srcData.data,MAX_EN_DECRYPT_DATA_SIZE);
  1459. ZeroMemory(dstData.data,MAX_EN_DECRYPT_DATA_SIZE);
  1460. srcData.dwSize = strlen(ctx->Req.data);
  1461. memcpy(srcData.data,ctx->Req.data,srcData.dwSize);
  1462. eErr = m_hDevHelper->EncryptData(srcData,dstData);
  1463. if (eErr != Error_Succeed)
  1464. {
  1465. //Dbg("Encrypt data failed(%d).",eErr);
  1466. LOG_PINPAD_ERROR_MSG_MACRO(eErr, EncryptData);
  1467. ctx->Answer(Error_Unexpect, AlarmDECToBusiness());
  1468. ClearRelatedDEC();
  1469. m_bEncrypt = false;
  1470. return 0;
  1471. }
  1472. //Dbg("%d,%s",dstData.dwSize,dstData.data);
  1473. ctx->Ans.ciphertext = (char*)dstData.data;
  1474. Dbg("Encrypt ok.");
  1475. m_bEncrypt = false;
  1476. ctx->Answer(Error_Succeed);
  1477. return 0;
  1478. }
  1479. int CPinPadFSM::LoadKeySM(SpReqAnsContext<PinPadService_LoadKeysSM_Req, PinPadService_LoadKeysSM_Ans>::Pointer ctx)
  1480. {
  1481. LOG_FUNCTION();
  1482. //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);
  1483. ErrorCodeEnum eErr;
  1484. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  1485. CSmartPointer<IConfigInfo> spConfig;
  1486. eErr = spEntityFunction->OpenConfig(Config_Run, spConfig);
  1487. if (eErr != Error_Succeed)
  1488. {
  1489. Dbg("read run cfg failed(sm).");
  1490. LogErrMsg("GetEncryptText:", Error_Unexpect, MEC_CFG_RUN_POINTER_FAILED, TRUE);
  1491. spConfig = NULL;
  1492. }
  1493. if (m_bPlainOpen)
  1494. m_hDevHelper->StopInput();
  1495. bool bSM = false;
  1496. if (ctx->Req.smflag == 1)
  1497. bSM = true;
  1498. //initialization need load master key
  1499. if (ctx->Req.initializeflag)
  1500. {
  1501. MasterKeyParam mkParam;
  1502. if (!bSM)
  1503. mkParam.dwSN = 0;
  1504. else
  1505. mkParam.dwSN = 1;
  1506. mkParam.smFlag = ctx->Req.smflag;
  1507. memset(mkParam.key,0,MAX_MASTER_KEY_SIZE);
  1508. Dbg("mkey len:%d", strlen(ctx->Req.masterkey));
  1509. memcpy(mkParam.key,ctx->Req.masterkey,strlen(ctx->Req.masterkey));
  1510. //Dbg("%s,%d",mkParam.key,mkParam.dwSN);
  1511. eErr = m_hDevHelper->LoadMasterKey(mkParam);
  1512. if (eErr != Error_Succeed)
  1513. {
  1514. Dbg("Load master key(%d),mkeysn:%d failed(%d).",bSM,mkParam.dwSN,eErr);
  1515. LOG_PINPAD_ERROR_MSG_MACRO(eErr, LoadMasterKey);
  1516. ctx->Ans.result = 0;
  1517. ctx->Answer(Error_Unexpect, AlarmDECToBusiness());
  1518. ClearRelatedDEC();
  1519. m_bLoadKey = false;
  1520. return 0;
  1521. }
  1522. Dbg("Load master key(%d) suc.",bSM);
  1523. //after load Master key,clear the load key status.add by oilyang 20160922
  1524. //oilyang@20170424 if load 3des master key succeed,clear load key status both of 3des and sm
  1525. if (!bSM)
  1526. {
  1527. spConfig->WriteConfigValueInt("Load", "3DES", 0);
  1528. spConfig->WriteConfigValueInt("Load", "SM", 0);
  1529. }
  1530. }
  1531. WorkKeyParam wkParam1,wkParam2;
  1532. memset(wkParam1.key,0,MAX_WORKING_KEY_SIZE);
  1533. memset(wkParam2.key,0,MAX_WORKING_KEY_SIZE);
  1534. if (!bSM)
  1535. wkParam1.dwMasterSN = wkParam2.dwMasterSN = 0;
  1536. else
  1537. wkParam1.dwMasterSN = wkParam2.dwMasterSN = 1;
  1538. wkParam1.dwWorkingSN = 0;
  1539. wkParam2.dwWorkingSN = 1;
  1540. wkParam1.smFlag = ctx->Req.smflag;
  1541. wkParam2.smFlag = ctx->Req.smflag;
  1542. memcpy(wkParam1.key,ctx->Req.workingkey1,strlen(ctx->Req.workingkey1));
  1543. memcpy(wkParam2.key,ctx->Req.workingkey2,strlen(ctx->Req.workingkey2));
  1544. eErr = m_hDevHelper->LoadWorkingKey(wkParam1);
  1545. if (eErr != Error_Succeed)
  1546. {
  1547. Dbg("load working key 1(%d) failed(%d).",bSM,eErr);
  1548. LOG_PINPAD_ERROR_MSG_MACRO(eErr, LoadWorkingKey);
  1549. ctx->Ans.result = 1;
  1550. ctx->Answer(Error_Unexpect, AlarmDECToBusiness());
  1551. ClearRelatedDEC();
  1552. m_bLoadKey = false;
  1553. return 0;
  1554. }
  1555. Dbg("Load working key1(%d) suc.",bSM);
  1556. eErr = m_hDevHelper->LoadWorkingKey(wkParam2);
  1557. if (eErr != Error_Succeed)
  1558. {
  1559. Dbg("load working key 2(%d) failed(%d).",bSM,eErr);
  1560. LOG_PINPAD_ERROR_MSG_MACRO(eErr, LoadWorkingKey);
  1561. ctx->Ans.result = 2;
  1562. ctx->Answer(Error_Unexpect, AlarmDECToBusiness());
  1563. ClearRelatedDEC();
  1564. m_bLoadKey = false;
  1565. return 0;
  1566. }
  1567. Dbg("Load working key2(%d) suc.",bSM);
  1568. if (spConfig != NULL)
  1569. {
  1570. if (!bSM)
  1571. eErr = spConfig->WriteConfigValueInt("Load", "3DES", 1);
  1572. else
  1573. eErr = spConfig->WriteConfigValueInt("Load", "SM", 1);
  1574. if (eErr != Error_Succeed)
  1575. {
  1576. Dbg("after load key suc,write run cfg failed.");
  1577. LogErrMsg("LoadKeySM:", Error_Unexpect, MEC_CFG_WRITE_RUN_INFOR_FAILED, TRUE);
  1578. }
  1579. }
  1580. m_bLoadKey = false;
  1581. if (bSM)
  1582. m_bSMLoaded = true;
  1583. else
  1584. m_b3DESLoaded = true;
  1585. ctx->Answer(Error_Succeed);
  1586. return 0;
  1587. }
  1588. int CPinPadFSM::EncryptSM(SpReqAnsContext<PinPadService_EncryptDataSM_Req, PinPadService_EncryptDataSM_Ans>::Pointer ctx)
  1589. {
  1590. LOG_FUNCTION();
  1591. Dbg("smflag [%d]",ctx->Req.smflag);
  1592. ErrorCodeEnum eErr;
  1593. bool bSM = false;
  1594. if (ctx->Req.smflag == 1)
  1595. bSM = true;
  1596. //set param
  1597. if (!bSM)
  1598. eErr = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD,EPP_ALGO_METHOD_3DES);
  1599. else
  1600. eErr = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD,EPP_ALGO_METHOD_SM4);
  1601. if (eErr == Error_Succeed)
  1602. eErr = m_hDevHelper->SetParam(EPP_PT_SET_ECB_CBC_MODE,EPP_ALGO_MODE_CBC);
  1603. if (eErr != Error_Succeed)
  1604. {
  1605. Dbg("Encrypt data set param failed(%d).",eErr);
  1606. LOG_PINPAD_ERROR_MSG_MACRO(eErr, SetParam);
  1607. ctx->Answer(Error_Unexpect, AlarmDECToBusiness());
  1608. ClearRelatedDEC();
  1609. m_bEncrypt = false;
  1610. return 0;
  1611. }
  1612. Dbg("SetParam ok.");
  1613. if (!bSM)
  1614. eErr = m_hDevHelper->ActiveWorkingKey(0, 1);
  1615. else
  1616. eErr = m_hDevHelper->ActiveWorkingKey(1, 1);
  1617. if (eErr != Error_Succeed)
  1618. {
  1619. Dbg("pinpad activate WK error,(%d)",eErr);
  1620. LOG_PINPAD_ERROR_MSG_MACRO(eErr, ActiveWorkingKey);
  1621. ctx->Answer(Error_Unexpect, AlarmDECToBusiness());
  1622. ClearRelatedDEC();
  1623. m_bEncrypt = false;
  1624. return 0;
  1625. }
  1626. Dbg("Active ok.");
  1627. EnDecryptInfo srcData,dstData;
  1628. ZeroMemory(srcData.data,MAX_EN_DECRYPT_DATA_SIZE);
  1629. ZeroMemory(dstData.data,MAX_EN_DECRYPT_DATA_SIZE);
  1630. srcData.dwSize = strlen(ctx->Req.data);
  1631. memcpy(srcData.data,ctx->Req.data,srcData.dwSize);
  1632. eErr = m_hDevHelper->EncryptData(srcData,dstData);
  1633. if (eErr != Error_Succeed)
  1634. {
  1635. Dbg("Encrypt data failed(%d).",eErr);
  1636. LOG_PINPAD_ERROR_MSG_MACRO(eErr, EncryptData);
  1637. ctx->Answer(Error_Unexpect, AlarmDECToBusiness());
  1638. ClearRelatedDEC();
  1639. m_bEncrypt = false;
  1640. return 0;
  1641. }
  1642. //Dbg("%d,%s",dstData.dwSize,dstData.data);
  1643. ctx->Ans.ciphertext = (char*)dstData.data;
  1644. Dbg("Encrypt ok.");
  1645. m_bEncrypt = false;
  1646. ctx->Answer(Error_Succeed);
  1647. ClearRelatedDEC();
  1648. return 0;
  1649. }
  1650. int CPinPadFSM::GetCheckCode(SpReqAnsContext<PinPadService_GetCheckCode_Req, PinPadService_GetCheckCode_Ans>::Pointer ctx)
  1651. {
  1652. LOG_FUNCTION();
  1653. ErrorCodeEnum eErr = Error_Unexpect;
  1654. bool bGetOK = true;
  1655. ctx->Ans.checkcode.Init(ctx->Req.mSN.GetCount());
  1656. for (int i = 0; i < ctx->Req.mSN.GetCount(); i++)
  1657. {
  1658. Dbg("mSN:%d,wSN:%d", ctx->Req.mSN[i], ctx->Req.wSN[i]);
  1659. //set param
  1660. if (ctx->Req.mSN[i] == 1)
  1661. eErr = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_SM4);
  1662. else
  1663. eErr = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_3DES);
  1664. if (eErr == Error_Succeed)
  1665. eErr = m_hDevHelper->SetParam(EPP_PT_SET_ECB_CBC_MODE, EPP_ALGO_MODE_CBC);
  1666. else
  1667. {
  1668. LOG_PINPAD_ERROR_MSG_MACRO(eErr, SetParam);
  1669. }
  1670. eErr = m_hDevHelper->ActiveWorkingKey(ctx->Req.mSN[i], ctx->Req.wSN[i]);
  1671. if (eErr != Error_Succeed)
  1672. {
  1673. LOG_PINPAD_ERROR_MSG_MACRO(eErr, ActiveWorkingKey);
  1674. ctx->Ans.checkcode[i] = "";
  1675. }
  1676. else
  1677. {
  1678. EnDecryptInfo srcInfo, dstInfo;
  1679. memset(srcInfo.data, 0, MAX_EN_DECRYPT_DATA_SIZE);
  1680. Dbg("encryptdata[%s]", (LPCTSTR)m_devCheckData);
  1681. memcpy(srcInfo.data, m_devCheckData, m_devCheckData.GetLength());
  1682. srcInfo.dwSize = m_devCheckData.GetLength();
  1683. memset(dstInfo.data, 0, MAX_EN_DECRYPT_DATA_SIZE);
  1684. eErr = m_hDevHelper->EncryptData(srcInfo, dstInfo);
  1685. if (eErr != Error_Succeed)
  1686. {
  1687. LOG_PINPAD_ERROR_MSG_MACRO(eErr, EncryptData);
  1688. return Error_DevCommFailed;
  1689. }
  1690. ctx->Ans.checkcode[i] = (const char*)dstInfo.data;
  1691. }
  1692. }
  1693. ctx->Answer(Error_Succeed);
  1694. ClearRelatedDEC();
  1695. return 0;
  1696. }
  1697. bool CPinPadFSM::GetDevInfo(DevCategoryInfo &devInfo)
  1698. {
  1699. DevCategoryInfo info;
  1700. ZeroMemory(info.szModel, MAX_DEV_MODEL_LEN);
  1701. ZeroMemory(info.szType, MAX_DEV_TYPE_LEN);
  1702. ZeroMemory(info.szVendor, MAX_DEV_VENDOR_LEN);
  1703. ErrorCodeEnum eErrDev = m_hDevHelper->GetDevCategory(info);
  1704. if (eErrDev == Error_Succeed)
  1705. {
  1706. m_szModel = info.szModel;
  1707. m_szType = info.szType;
  1708. m_szVendor = info.szVendor;
  1709. Dbg("%d,%d,%d", strlen(info.szModel), strlen(info.szType), strlen(info.szVendor));
  1710. }
  1711. else
  1712. {
  1713. LOG_PINPAD_ERROR_MSG_MACRO(eErrDev, GetDevCategory);
  1714. }
  1715. ZeroMemory(devInfo.szModel,MAX_DEV_MODEL_LEN);//CM=V2.0#PM=V1.0#MID=75500001#PID=12345678#FWID=V1234567#Vendor=nantian
  1716. ZeroMemory(devInfo.szType,MAX_DEV_TYPE_LEN);
  1717. ZeroMemory(devInfo.szVendor,MAX_DEV_VENDOR_LEN);
  1718. CSimpleStringA tmpModel("");
  1719. if (m_szModel.GetLength() > 1)
  1720. {
  1721. if (m_szModel[m_szModel.GetLength() - 1] == '#')
  1722. tmpModel = m_szModel + "Vendor=" + m_szVendor;
  1723. else
  1724. tmpModel = m_szModel + "#Vendor=" + m_szVendor;
  1725. strncpy(devInfo.szModel, (const char*)tmpModel, tmpModel.GetLength());
  1726. }
  1727. if (m_szType.GetLength() > 1)
  1728. strncpy(devInfo.szType, (const char*)m_szType, m_szType.GetLength());
  1729. if (m_szVendor.GetLength() > 1)
  1730. strncpy(devInfo.szVendor, (const char*)m_szVendor, m_szVendor.GetLength());
  1731. devInfo.eState = m_eDevState;
  1732. return true;
  1733. }
  1734. void CPinPadFSM::SetEnterMainPage(bool bValue)
  1735. {
  1736. m_bInMainPage = bValue;
  1737. return;//oilyang@20200319 去掉任意情况下可输入
  1738. ErrorCodeEnum eErr = Error_Unexpect;
  1739. if (!m_bRVCIL)//非简版无需定时任务
  1740. {
  1741. if (m_bInMainPage)
  1742. {
  1743. eErr = CancelTimer(PINPAD_ANY_INPUT_TIMER);
  1744. Dbg("Cancel any input timer%d.", eErr);
  1745. }
  1746. else
  1747. {
  1748. eErr = ScheduleTimer(PINPAD_ANY_INPUT_TIMER, PINPAD_ANY_INPUT_TIMEOUT);
  1749. Dbg("Start any input timer%d.", eErr);
  1750. }
  1751. }
  1752. }
  1753. void CPinPadFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
  1754. {
  1755. //for simple
  1756. if(m_bPinPadNeedless)
  1757. pTransactionContext->SendAnswer(Error_Succeed);
  1758. else
  1759. pTransactionContext->SendAnswer(m_testResult);
  1760. //DevCategoryInfo devCatInfo;
  1761. //ErrorCodeEnum eErr = m_hDevHelper->GetDevCategory(devCatInfo);
  1762. }
  1763. void CPinPadFSM::CrossTermCall(SpReqAnsContext<PinPadService_CrossTermCall_Req, PinPadService_CrossTermCall_Ans>::Pointer cctx)
  1764. {
  1765. ErrorCodeEnum eErr = Error_Unexpect;
  1766. Dbg("CrossTermCall,type:%x", cctx->Req.type);
  1767. switch (cctx->Req.type)
  1768. {
  1769. case PinPadService_Method_GetInputSM:
  1770. {
  1771. DEFINE_PUPPET_CONTEXT_WITH_TYPE(PinPadService_GetInputSM_Req, PinPadService_GetInputSM_Ans);
  1772. if ((eErr = SpBlob2Object(cctx->Req.paramX, ctx->Req)) == Error_Succeed) {
  1773. SetCtx(NULL, ctx, true);
  1774. if (this->GetInput(NULL,ctx,true) != 0) {
  1775. Dbg("GetInput failed.");
  1776. eErr = Error_Unexpect;
  1777. }
  1778. else {
  1779. eErr = SpObject2Blob(ctx->Ans, cctx->Ans.retParamX);
  1780. Dbg("after GetInput,eErr:%d,paramX.len:%d", eErr, cctx->Ans.retParamX.m_iLength);
  1781. }
  1782. }
  1783. cctx->Answer(eErr);
  1784. }
  1785. break;
  1786. case PinPadService_Method_InputCancel:
  1787. m_bFrontCancel = true;
  1788. break;
  1789. case PinPadService_Method_InputWaitMore:
  1790. m_bWaitingMore = true;
  1791. break;
  1792. case PinPadService_Method_Exit:
  1793. SetExitFlag();
  1794. break;
  1795. default:
  1796. break;
  1797. }
  1798. }
  1799. void CPinPadFSM::CrossTermInvokeInfo(SpOnewayCallContext<PinPadService_CrossTermInvokeInfo_Info>::Pointer ctx)
  1800. {
  1801. LOG_FUNCTION();
  1802. Dbg("entity sn:%x,type:%d,errcode:%x", ctx->Info.nEntityID, ctx->Info.type, ctx->Info.result);
  1803. if (ctx->Info.paramX.m_iLength <= 1)
  1804. {
  1805. }
  1806. ErrorCodeEnum eErr = Error_Unexpect;
  1807. CSmartPointer<ITransactionContext> pTransactionContext;
  1808. switch (ctx->Info.type)
  1809. {
  1810. case PinPadService_Method_GetInputSM:
  1811. {
  1812. //auto pt = reinterpret_cast<SpReqAnsContext<PinPadService_GetInputSM_Req,
  1813. // PinPadService_GetInputSM_Ans>*>(GetCtx(ctx->Info.type));
  1814. //SpReqAnsContext<PinPadService_GetInputSM_Req,
  1815. // PinPadService_GetInputSM_Ans>::Pointer xctx;
  1816. //xctx.Attach(pt);
  1817. eErr = SpBlob2Object(ctx->Info.paramX, m_inputSMCtx->Ans);
  1818. Dbg("eErr:%d,Y len:%d", eErr, ctx->Info.paramX.m_iLength);
  1819. m_inputSMCtx->Answer((ErrorCodeEnum)ctx->Info.result);
  1820. }
  1821. break;
  1822. default:
  1823. break;
  1824. }
  1825. }
  1826. int CPinPadFSM::LocalCallHeartBeat(int method, CBlob &bbSend, bool bTwoWay)
  1827. {
  1828. //LogEvent()
  1829. //use LogEvent or Client Call? oiltmp
  1830. //LogEvent(Severity_Middle, CROSS_CALL_PINPAD_GET_PIN_INPUT, csCmd);
  1831. HeartBeatService_ClientBase* pClient = new HeartBeatService_ClientBase(GetEntityBase());
  1832. if (pClient == NULL)
  1833. {
  1834. Dbg("create HeartBeat client failed.GetLastError:%d", GetLastError());
  1835. return -1;
  1836. }
  1837. ErrorCodeEnum eErr = Error_Unexpect;
  1838. eErr = pClient->Connect();
  1839. if (eErr != Error_Succeed)
  1840. {
  1841. Dbg("client connect to HeartBeat failed:%x", eErr);
  1842. return -1;
  1843. }
  1844. HeartBeatService_CrossTermCall_Req req;
  1845. HeartBeatService_CrossTermCall_Ans ans;
  1846. req.nEntityID = 0x206;
  1847. req.isTwoWay = bTwoWay;
  1848. req.fromTerminalNo = m_terminalNo;
  1849. GetAttachedTerminal(req.toTerminalNo);
  1850. //req.toTerminalNo = "7717715004";
  1851. req.param1 = "";
  1852. req.param2 = "";
  1853. req.paramX = bbSend;
  1854. req.type = method;
  1855. eErr = pClient->CrossTermCall(req, ans, 20000);
  1856. Dbg("CrossTermCall to HeartBeat from %s to %s, result:%x", (const char*)req.fromTerminalNo, (const char*)req.toTerminalNo, eErr);
  1857. return 0;
  1858. }
  1859. bool CPinPadFSM::GetAttachedTerminal(CSimpleStringA &csTerm)
  1860. {
  1861. return GetEntityBase()->GetFunction()->GetSysVar("AttachedTerminal", csTerm);
  1862. }