PinPadFSM.cpp 55 KB

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