PinPadFSM.cpp 54 KB

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