PinPadFSM.cpp 55 KB

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