PinPadFSM.cpp 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482
  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 <map>
  8. #include "RVCComm.h"
  9. #include "sm4.h"
  10. #include "publicFunExport.h"
  11. #if defined(RVC_OS_LINUX)
  12. #include <thread>
  13. #include <chrono>
  14. #include <winpr/sysinfo.h>
  15. #endif
  16. using namespace std;
  17. const int PINPAD_INIT_TRIES = 3;
  18. const int PINPAD_ANY_INPUT_TIMEOUT = 100;
  19. const int MAX_PINPAD_INPUT_TIMEOUT = 60000;
  20. const int MAX_INPUT_TIMER_TIMEOUT = 600000;
  21. void CPinPadFSM::ToLogWarnInfoAboutTermCustom()
  22. {
  23. LOG_FUNCTION();
  24. std::map<std::string, std::string> termInfo;
  25. char* strFileHash = new char[128];
  26. memset(strFileHash, 0, 128);
  27. termInfo["keyType"] = _itoa(m_encryptkey, strFileHash,10);
  28. if (strFileHash != nullptr) {
  29. delete[] strFileHash;
  30. strFileHash = nullptr;
  31. }
  32. if (m_b3DESLoaded)
  33. termInfo["3desKeyLoad"] = "true";
  34. else
  35. termInfo["3desKeyLoad"] = "false";
  36. if (m_bSMLoaded)
  37. termInfo["SMKeyLoad"] = "true";
  38. else
  39. termInfo["SMKeyLoad"] = "false";
  40. ToLogWarnInfoAboutTermExtend(termInfo);
  41. }
  42. ErrorCodeEnum CPinPadFSM::OnInit()
  43. {
  44. LOG_FUNCTION();
  45. CSystemStaticInfo sysInfo;
  46. m_csMachineType = m_csSite = m_terminalNo = "";
  47. GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo);
  48. m_csMachineType = sysInfo.strMachineType;
  49. m_csSite = sysInfo.strSite;
  50. m_terminalNo = sysInfo.strTerminalID;
  51. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("machineType:%s,site:%s,terminalNo:%s",
  52. (const char*)m_csMachineType, (const char*)m_csSite, (const char*)m_terminalNo);
  53. _beginthreadex(NULL,0,DoWork,(void*)this,0,NULL);
  54. return Error_Succeed;
  55. }
  56. ErrorCodeEnum CPinPadFSM::OnExit()
  57. {
  58. LOG_FUNCTION();
  59. m_bEntityExit = true;
  60. m_hInputConVar.Broadcast();
  61. ErrorCodeEnum eErr = Error_Succeed;
  62. if (m_hDevHelper != nullptr)
  63. {
  64. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  65. eErr = m_hDevHelper->StopInput();
  66. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  67. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::StopInput").setCostTime(m_ullEndTime - m_ullBeginTime)("%s", SpStrError(eErr));
  68. m_hDevHelper.TearDown();
  69. }
  70. return eErr;
  71. }
  72. void CPinPadFSM::s0_on_entry()
  73. {
  74. LOG_FUNCTION();
  75. FSMEvent *e = new FSMEvent(USER_EVT_INIT);
  76. PostEventFIFO(e);
  77. }
  78. void CPinPadFSM::s0_on_exit()
  79. {
  80. }
  81. unsigned int CPinPadFSM::s0_on_event(FSMEvent* evt)
  82. {
  83. LOG_FUNCTION();
  84. if (evt->iEvt == USER_EVT_INIT) {
  85. m_hInputConVar.Broadcast();
  86. evt->SetHandled();
  87. return 0;
  88. }else if (evt->iEvt == USER_EVT_QUIT) {
  89. evt->SetHandled();
  90. return 0;
  91. }
  92. return 0;
  93. }
  94. void CPinPadFSM::s1_on_entry()
  95. {
  96. LOG_FUNCTION();
  97. }
  98. void CPinPadFSM::s1_on_exit()
  99. {
  100. }
  101. unsigned int CPinPadFSM::s1_on_event(FSMEvent* evt)
  102. {
  103. LOG_FUNCTION();
  104. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("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
  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 defined(RVC_OS_WIN)
  129. //oilyang@20220413 except RVC.PAD without FWB
  130. CSimpleStringA tmpFWBDevSN("");
  131. GetEntityBase()->GetFunction()->GetSysVar("FWBDevSN", tmpFWBDevSN);
  132. if (!(m_csMachineType.Compare("RVC.PAD", true) == 0 && tmpFWBDevSN.IsNullOrEmpty()))
  133. ToLogWarnInfoAboutTermCustom(); //@lzm
  134. #endif
  135. }
  136. void CPinPadFSM::s2_on_exit()
  137. {
  138. }
  139. unsigned int CPinPadFSM::s2_on_event(FSMEvent* pEvt)
  140. {
  141. if (pEvt->iEvt != 1)
  142. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s2 %d,%d",pEvt->iEvt,pEvt->param1);
  143. switch(pEvt->iEvt)
  144. {
  145. case USER_EVT_GETINPUT_SM:
  146. {
  147. m_hInputConVar.Broadcast();
  148. pEvt->SetHandled();
  149. return 0;
  150. }
  151. case USER_EVT_LOADKEY_SM:
  152. {
  153. pEvt->SetHandled();
  154. m_bLoadKey = true;
  155. LoadKeySMTask* task = new LoadKeySMTask(this);
  156. LoadKeySMEvent* lke = dynamic_cast<LoadKeySMEvent*>(pEvt);
  157. task->ctx = lke->ctx;
  158. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  159. return 2;
  160. }
  161. case USER_EVT_ENCRYPT_SM:
  162. {
  163. pEvt->SetHandled();
  164. m_bEncrypt = true;
  165. EncryptSMTask* task = new EncryptSMTask(this);
  166. EncryptSMEvent* ee = dynamic_cast<EncryptSMEvent*>(pEvt);
  167. task->ctx = ee->ctx;
  168. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  169. return 2;
  170. }
  171. case USER_EVT_GET_CHECKCODE:
  172. {
  173. pEvt->SetHandled();
  174. GetCheckCodeTask* task = new GetCheckCodeTask(this);
  175. GetCheckCodeEvent* gcce = dynamic_cast<GetCheckCodeEvent*>(pEvt);
  176. task->ctx = gcce->ctx;
  177. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  178. return 0;
  179. }
  180. case USER_EVT_QUIT:
  181. pEvt->SetHandled();
  182. break;
  183. case USER_EVT_TODO_INIT:
  184. {
  185. pEvt->SetHandled();
  186. ProcFWBReConnTask* task = new ProcFWBReConnTask(this);
  187. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  188. }
  189. break;
  190. case USER_EVT_TODO_INIT_FINISHED:
  191. {
  192. pEvt->SetHandled();
  193. return pEvt->param1;
  194. }
  195. default:
  196. break;
  197. }
  198. return 1;
  199. }
  200. //Input
  201. void CPinPadFSM::s3_on_entry()
  202. {
  203. LOG_FUNCTION();
  204. GetEntityBase()->GetFunction()->SetUserDefineState(USER_PINPAD_PININPUT);
  205. }
  206. void CPinPadFSM::s3_on_exit()
  207. {
  208. LOG_FUNCTION();
  209. }
  210. unsigned int CPinPadFSM::s3_on_event(FSMEvent* evt)
  211. {
  212. LOG_FUNCTION();
  213. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s3 event %d",evt->iEvt);
  214. switch(evt->iEvt)
  215. {
  216. case USER_EVT_GETINPUT_SM_FINISHED:
  217. evt->SetHandled();
  218. break;
  219. case USER_EVT_INPUTCANCEL:
  220. evt->SetHandled();
  221. m_bFrontCancel = true;
  222. break;
  223. case USER_EVT_INPUTWAITINGMORE:
  224. evt->SetHandled();
  225. m_bWaitingMore = true;
  226. break;
  227. case USER_EVT_EXIT:
  228. SetExitFlag();
  229. break;
  230. case USER_EVT_QUIT:
  231. evt->SetHandled();
  232. break;
  233. default:
  234. break;
  235. }
  236. return 0;
  237. }
  238. //AccessAuth
  239. void CPinPadFSM::s4_on_entry()
  240. {
  241. LOG_FUNCTION();
  242. GetEntityBase()->GetFunction()->SetUserDefineState(USER_PINPAD_PARAM_ENCRYPTE);
  243. }
  244. void CPinPadFSM::s4_on_exit()
  245. {
  246. LOG_FUNCTION();
  247. }
  248. unsigned int CPinPadFSM::s4_on_event(FSMEvent* pEvt)
  249. {
  250. switch(pEvt->iEvt)
  251. {
  252. case USER_EVT_LOADKEY_SM_FINISHED:
  253. pEvt->SetHandled();
  254. break;
  255. case USER_EVT_ENCRYPT_SM_FINISHED:
  256. pEvt->SetHandled();
  257. break;
  258. case USER_EVT_GET_CHECKCODE:
  259. {
  260. pEvt->SetHandled();
  261. GetCheckCodeTask* task = new GetCheckCodeTask(this);
  262. GetCheckCodeEvent* gcce = dynamic_cast<GetCheckCodeEvent*>(pEvt);
  263. task->ctx = gcce->ctx;
  264. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  265. return 0;
  266. }
  267. default:
  268. break;
  269. }
  270. return 0;
  271. }
  272. void CPinPadFSM::s5_on_entry()
  273. {
  274. LOG_FUNCTION();
  275. if (m_bOpened)
  276. m_eDevState = DEVICE_STATUS_FAULT;
  277. GetEntityBase()->GetFunction()->SetUserDefineState(USER_PINPAD_FAILED);
  278. m_testResult = Error_InvalidState;
  279. }
  280. void CPinPadFSM::s5_on_exit()
  281. {
  282. LOG_FUNCTION();
  283. }
  284. unsigned int CPinPadFSM::s5_on_event(FSMEvent* pEvt)
  285. {
  286. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s5 evt %d",pEvt->iEvt);
  287. switch (pEvt->iEvt)
  288. {
  289. case USER_EVT_TODO_INIT:
  290. {
  291. pEvt->SetHandled();
  292. ProcFWBReConnTask* task = new ProcFWBReConnTask(this);
  293. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  294. }
  295. break;
  296. case USER_EVT_TODO_INIT_FINISHED:
  297. {
  298. pEvt->SetHandled();
  299. return pEvt->param1;
  300. }
  301. default:
  302. break;
  303. }
  304. return 0;
  305. }
  306. void CPinPadFSM::s6_on_entry()
  307. {
  308. LOG_FUNCTION();
  309. m_eDevState = DEVICE_STATUS_NOT_READY;
  310. GetEntityBase()->GetFunction()->SetUserDefineState(USER_PINPAD_FAILED);
  311. }
  312. void CPinPadFSM::s6_on_exit()
  313. {
  314. }
  315. unsigned int CPinPadFSM::s6_on_event(FSMEvent* pEvt)
  316. {
  317. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s6 evt %d", pEvt->iEvt);
  318. switch (pEvt->iEvt)
  319. {
  320. case USER_EVT_TODO_INIT:
  321. {
  322. pEvt->SetHandled();
  323. ProcFWBReConnTask* task = new ProcFWBReConnTask(this);
  324. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  325. }
  326. break;
  327. case USER_EVT_TODO_INIT_FINISHED:
  328. {
  329. pEvt->SetHandled();
  330. return pEvt->param1;
  331. }
  332. default:
  333. break;
  334. }
  335. return 0;
  336. }
  337. int CPinPadFSM::Initial()
  338. {
  339. LOG_FUNCTION();
  340. #if defined(RVC_OS_WIN)
  341. //oilyang@20220413 except RVC.PAD without FWB
  342. CSimpleStringA tmpFWBDevSN("");
  343. GetEntityBase()->GetFunction()->GetSysVar("FWBDevSN", tmpFWBDevSN);
  344. if ((m_csMachineType.Compare("RVC.PAD", true) == 0 && tmpFWBDevSN.IsNullOrEmpty()))
  345. {
  346. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("RVC.PAD without FWB(%s).",tmpFWBDevSN.GetData());
  347. return 0;
  348. }
  349. DWORD dwCurrThId = GetCurrentThreadId();
  350. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Initial thread id:%d",dwCurrThId);
  351. #endif
  352. ErrorCodeEnum eErrDev;
  353. auto pEntity = GET_DEV_ENTITY_BASE_POINTER();
  354. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  355. CSmartPointer<IConfigInfo> spConfig;
  356. eErrDev = spEntityFunction->OpenConfig(Config_Root, spConfig);
  357. if (eErrDev != Error_Succeed) {
  358. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("open cfg file failed! %s", SpStrError(eErrDev));
  359. LogWarn(Severity_Middle, eErrDev, PinPad_UserErrorCode_Open_Root_File_Failed, "Initial:OpenConfig");
  360. return eErrDev;
  361. }
  362. CSimpleStringA tmpVendor(""), tmpDevSN(""), tmpDLLVersion(""), csDepPath(""), csBackslash(SPLIT_SLASH_STR);
  363. GetEntityBase()->GetFunction()->GetSysVar("FWBVendor", tmpVendor);
  364. GetEntityBase()->GetFunction()->GetSysVar("FWBDevSN", tmpDevSN);
  365. GetEntityBase()->GetFunction()->GetSysVar("FWBVersion", tmpDLLVersion);
  366. if (tmpDLLVersion.GetLength() < 2)//如果忘记配置,则直接使用默认值8.1
  367. tmpDLLVersion = "8.1";
  368. if (tmpDevSN.GetLength() > 12 && tmpDevSN.IndexOf("FWB") > 2)
  369. {
  370. #if defined(RVC_OS_WIN)
  371. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("This is fwb device.");
  372. m_devSN = tmpDevSN;
  373. VendorLibInfo tmpVendorLibInfo(GetEntityBase()->GetEntityName());
  374. tmpVendorLibInfo.strVendor = tmpVendor;
  375. CAutoArray<CSimpleStringA> dllVersions = tmpDLLVersion.Split('.');
  376. if (dllVersions.GetCount() >= 2) {
  377. tmpVendorLibInfo.strVersion = dllVersions[0];
  378. tmpVendorLibInfo.strBatch = dllVersions[1];
  379. } else {
  380. tmpVendorLibInfo.strVersion = tmpDLLVersion;
  381. }
  382. pEntity->vendorLibInfo = tmpVendorLibInfo;
  383. #endif
  384. }
  385. else
  386. {
  387. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("This is normal AllInOne device.");
  388. m_devSN = "";
  389. eErrDev = pEntity->LoadVendorLibName();
  390. if (eErrDev != Error_Succeed)
  391. {
  392. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("SpGetDevAdaptorPath(%d) failed.", eErrDev);
  393. LogWarn(Severity_Middle, eErrDev, PinPad_UserErrorCode_Get_DevAdapter_Path_Failed, "Initial:SpGetDevAdaptorPath");
  394. return Error_DevLoadFileFailed;
  395. }
  396. }
  397. FulfillAdapterInfoFrom(pEntity->vendorLibInfo);
  398. LogWarn(Severity_Low, Error_Unexpect, PinPad_UserErrorCode_RootInfo, m_adapterInfo.adapterFilePath.GetData());
  399. HARDWARE_ENTITY_SET_VENDOR_NAME(m_entCode, m_adapterInfo.strVendor);
  400. ToLogRootINIInfo();
  401. pEntity->InitializeVendorLogSwitch();
  402. spConfig->ReadConfigValue("Terminal", "TerminalNo", m_deviceNo);
  403. m_devCheckData = "0000000000000000";
  404. m_keySN = "000";
  405. //写死,不从root.ini中读取
  406. //spConfig->ReadConfigValue("Device.PinPad", "Checkdata", m_devCheckData);
  407. //spConfig->ReadConfigValue("Device.PinPad", "Keysn", m_keySN);
  408. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to load vendor dll.");
  409. eErrDev = m_hDevHelper.LoadUp(m_adapterInfo.adapterFilePath);
  410. if (!IS_SUCCEED(eErrDev))
  411. {
  412. if (tmpDevSN.GetLength() < 10 || tmpDevSN.IndexOf("FWB") < 1)
  413. GetEntityBase()->GetFunction()->ShowFatalError("密码键盘加载厂商适配器失败!请检查root.ini配置是否正确。");
  414. LogWarn(Severity_Middle, Error_NotInit, PinPad_UserErrorCode_Load_Dll_File_Failed, "密码键盘加载厂商适配器失败!请检查root.ini配置是否正确。");
  415. return Error_DevLoadFileFailed;
  416. } else {
  417. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("load vendor dll suc.");
  418. }
  419. int initTries = 0;
  420. ErrorCodeEnum eErr = Error_Unexpect;
  421. do
  422. {
  423. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("port:%d,baudRate:%d", m_adapterInfo.GetPortInt(), m_adapterInfo.GetBaudrateInt());
  424. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  425. eErr = m_hDevHelper->DevOpen(m_adapterInfo.GetPortInt(), m_adapterInfo.GetBaudrateInt());
  426. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  427. if (eErr == Error_Succeed)
  428. {
  429. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DevOpen").setCostTime(m_ullEndTime - m_ullBeginTime)("%s", SpStrError(eErr));
  430. initTries = 0;
  431. ErrorCodeEnum errCode3,errCode4;
  432. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  433. //errCode1 = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD,EPP_ALGO_METHOD_3DES);
  434. //errCode2 = m_hDevHelper->SetParam(EPP_PT_SET_MAC_ALGORITH,EPP_MAC_ALGO_ASNIX99);
  435. errCode3 = m_hDevHelper->SetParam(EPP_PT_SET_PIN_ALGORITH, EPP_PIN_ALGO_SM4);
  436. errCode4 = m_hDevHelper->SetParam(EPP_PT_SET_ECB_CBC_MODE,EPP_ALGO_MODE_3DEC_CBC);
  437. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  438. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetParam").setCostTime(m_ullEndTime - m_ullBeginTime)("%s", SpStrError(errCode3));
  439. if(errCode3 != Error_Succeed || errCode4 != Error_Succeed)
  440. {
  441. if(errCode3 != Error_Succeed)
  442. {
  443. SetErrPackage("Initial::SetParm(3)", m_devSN, errCode3, MEC_DEVAPI_EPP_SetParam);
  444. AlarmDEC();
  445. }
  446. if(errCode4 != Error_Succeed)
  447. {
  448. SetErrPackage("Initial::SetParm(4)", m_devSN, errCode4, MEC_DEVAPI_EPP_SetParam);
  449. AlarmDEC();
  450. }
  451. return 1;
  452. }
  453. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SetParam suc.");
  454. break;
  455. }
  456. else
  457. {
  458. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DevOpen").setResultCode("RTA2602").setCostTime(m_ullEndTime - m_ullBeginTime)("%s", SpStrError(eErr));
  459. initTries++;
  460. SetErrPackage("Initial::DevOpen", m_devSN, eErr, MEC_DEVAPI_EPP_DevOpen);
  461. AlarmDEC();
  462. Sleep(1200);
  463. continue;
  464. }
  465. }while(initTries<PINPAD_INIT_TRIES);
  466. if (initTries != 0)
  467. {
  468. LogEvent(Severity_Middle, LOG_EVT_PINPAD_OPEN_FAIL, "Open pinpad failed.");
  469. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Open pinpad failed.%s",(const char*)tmpDevSN);
  470. if (tmpDevSN.GetLength() < 10 || tmpDevSN.IndexOf("FWB") < 1)
  471. GetEntityBase()->GetFunction()->ShowFatalError("密码键盘打开失败!请检查键盘是否连接,配置是否正确。");
  472. return 1;
  473. }
  474. m_bOpened = true;
  475. //oiltmp comment the following 20160406
  476. //update with the version 1.7.1
  477. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  478. m_encryptkey = m_hDevHelper->GetEncryptFunc();
  479. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  480. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetEncryptFunc").setCostTime(m_ullEndTime - m_ullBeginTime)("Error_Succeed");
  481. eErrDev = spEntityFunction->OpenConfig(Config_Run, spConfig);
  482. if (eErrDev != Error_Succeed)
  483. {
  484. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("read run cfg failed(sm).");
  485. m_b3DESLoaded = false;
  486. m_bSMLoaded = false;
  487. LogWarn(Severity_Middle, eErrDev, PinPad_UserErrorCode_Open_RunCfgFile_Failed, "Initial:OpenConfig");
  488. }
  489. else
  490. {
  491. int tmpLoad = 0;
  492. eErrDev = spConfig->ReadConfigValueInt("Load", "3DES", tmpLoad);
  493. if (eErrDev == Error_Succeed)
  494. m_b3DESLoaded = tmpLoad;
  495. eErrDev = spConfig->ReadConfigValueInt("Load", "SM", tmpLoad);
  496. if (eErrDev == Error_Succeed)
  497. m_bSMLoaded = tmpLoad;
  498. //oilyang@20201026 from kmc micro service
  499. spConfig->ReadConfigValue("Load", "SN_SM", m_keySNSM);
  500. spConfig->ReadConfigValue("Load", "ckckck", m_lastCheckCode);
  501. }
  502. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("encrypt key :%d,load key :%d,%d", m_encryptkey,m_b3DESLoaded,m_bSMLoaded);
  503. DevCategoryInfo devInfo;
  504. ZeroMemory(devInfo.szModel, MAX_DEV_MODEL_LEN);
  505. ZeroMemory(devInfo.szType, MAX_DEV_TYPE_LEN);
  506. ZeroMemory(devInfo.szVendor, MAX_DEV_VENDOR_LEN);
  507. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  508. eErrDev = m_hDevHelper->GetDevCategory(devInfo);
  509. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  510. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevCategory").setCostTime(m_ullEndTime - m_ullBeginTime)("%s", SpStrError(eErrDev));
  511. if (eErrDev == Error_Succeed)
  512. {
  513. m_szModel = devInfo.szModel;
  514. m_szType = devInfo.szType;
  515. m_szVendor = devInfo.szVendor;
  516. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%d,%d,%d", strlen(devInfo.szModel), strlen(devInfo.szType), strlen(devInfo.szVendor));
  517. m_adapterInfo.FulfillCategoryInfo(devInfo);
  518. }
  519. else
  520. {
  521. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevCategory").setResultCode("RTA2606").setCostTime(m_ullEndTime - m_ullBeginTime)("%s", SpStrError(eErrDev));
  522. SetErrPackage("Initial::GetDevCategory", m_devSN, eErrDev, MEC_DEVAPI_EPP_GetDevCategory);
  523. AlarmDEC();
  524. }
  525. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("model:%s,type:%s,vendor:%s", (const char*)m_szModel, (const char*)m_szType, (const char*)m_szVendor);
  526. CSimpleStringA xTmpStr = CSimpleStringA::Format("(hw support):%d,load key :%d,%d,SMSN:%s", m_encryptkey, m_b3DESLoaded, m_bSMLoaded, m_keySNSM.GetData());
  527. LogWarn(Severity_Low, Error_Unexpect, PinPad_UserErrorCode_PinPad_InfoAboutKey_Onboot, xTmpStr.GetData());
  528. LogEvent(Severity_Middle, LOG_EVT_PINPAD_OPEN_SUC, "Open pinpad suc.");
  529. return 0;
  530. }
  531. unsigned int __stdcall DoWork(void *pData)
  532. {
  533. while(1)
  534. {
  535. CPinPadFSM *pFsm = (CPinPadFSM*)pData;
  536. pFsm->m_hInputConVar.Wait();
  537. if (pFsm->GetEntityExit())
  538. break;
  539. FSMEvent *evt;
  540. int ret;
  541. if (!pFsm->GetDevInitFlag())
  542. {
  543. ret = pFsm->Initial();
  544. evt = new FSMEvent(USER_EVT_INITFINISHED);
  545. }
  546. else
  547. {
  548. SpReqAnsContext<PinPadService_GetInputSM_Req, PinPadService_GetInputSM_Ans>::Pointer ctxSM;
  549. bool bRet = pFsm->GetCtx(ctxSM);
  550. if (!bRet)
  551. {
  552. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("get ctx failed.doing nothing");
  553. continue;
  554. }
  555. ret = pFsm->GetInput(ctxSM);
  556. evt = new FSMEvent(USER_EVT_GETINPUT_SM_FINISHED);
  557. }
  558. if (ret == 0)
  559. evt->param1 = 0;
  560. else
  561. evt->param1 = 1;
  562. pFsm->PostEventFIFO(evt);
  563. }
  564. #if defined(RVC_OS_WIN)
  565. _endthreadex(0);
  566. #else
  567. pthread_exit(0);
  568. #endif //RVC_OS_WIN
  569. return 0;
  570. }
  571. void CPinPadFSM::push_char(char *buf, int *len, int c)
  572. {
  573. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("len:%d",*len);
  574. buf[*len] = c;
  575. *len = *len + 1;
  576. buf[*len] = 0;
  577. InputContent evt;
  578. evt.data = buf;
  579. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(InputContent), SP_MSG_SIG_OF(InputContent), evt);
  580. }
  581. void CPinPadFSM::PushInputChar(char *buf,int c)
  582. {
  583. buf[0] = c;
  584. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("anyinput[%d][%s]",c,buf);
  585. InputContent evt;
  586. evt.data = buf;
  587. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(InputContent), SP_MSG_SIG_OF(InputContent), evt);
  588. }
  589. void CPinPadFSM::pop_char(char *buf, int *len, bool bClear)
  590. {
  591. if (*len > 0) {
  592. if (bClear){
  593. memset(buf,0,*len);
  594. *len = 0;
  595. }else {
  596. *len -= 1;
  597. buf[*len] = 0;
  598. }
  599. InputContent evt;
  600. evt.data = buf;
  601. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(InputContent), SP_MSG_SIG_OF(InputContent), evt);
  602. }
  603. }
  604. void CPinPadFSM::clear_char(char *buf, int *len)
  605. {
  606. if (*len > 0) {
  607. *len = 0;
  608. buf[*len] = 0;
  609. InputContent evt;
  610. evt.data = buf;
  611. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(InputContent), SP_MSG_SIG_OF(InputContent), evt);
  612. }
  613. }
  614. bool CPinPadFSM::Get12Account(char *szAcc)
  615. {
  616. memset(m_szAccount,0,sizeof(m_szAccount));
  617. const int accLen = strlen(szAcc);
  618. if (accLen == 0) {
  619. return false;
  620. }
  621. if (accLen > 12)
  622. memcpy(m_szAccount + 4, szAcc + (accLen - 12 -1), 12);
  623. else if (accLen == 12)
  624. {
  625. if (strncmp(szAcc, "0755", 4) == 0)
  626. memcpy(m_szAccount + 4, szAcc, 12);
  627. else
  628. {
  629. m_szAccount[4] = '5';
  630. memcpy(m_szAccount + 5, szAcc + 1, 11);
  631. }
  632. }
  633. else if (accLen == 9)
  634. {
  635. memcpy(m_szAccount + 4, szAcc, 3);
  636. memcpy(m_szAccount + 7, szAcc, 9);
  637. }
  638. else
  639. memcpy(m_szAccount + 4, szAcc, accLen);
  640. return true;
  641. }
  642. ErrorCodeEnum CPinPadFSM::GetEncryptText(SpReqAnsContext<PinPadService_GetInputSM_Req, PinPadService_GetInputSM_Ans>::Pointer ctxSM)
  643. {
  644. LOG_FUNCTION();
  645. ErrorCodeEnum errCode;
  646. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  647. //bSMFlag:to use 3des or use sm
  648. int len, timeout;
  649. bool confirm, bSMFlag = false;
  650. len = ctxSM->Req.length;
  651. timeout = ctxSM->Req.timeout;
  652. confirm = ctxSM->Req.confirm;
  653. if (ctxSM->Req.smflag == 1 || ctxSM->Req.smflag == 11)
  654. {
  655. bSMFlag = true;
  656. }
  657. if (!bSMFlag)
  658. {
  659. LogWarn(Severity_Low, Error_Unexpect, PinPad_UserErrorCode_PinPad_Not_SM, "Encryption is not SM");
  660. }
  661. AccountInfo accInfo;
  662. memset(accInfo.account, 0, MAX_ACCOUNT_LEN);
  663. CSimpleStringA errMsg(true);
  664. if (Get12Account(const_cast<char*>(ctxSM->Req.account.GetData())))
  665. memcpy(accInfo.account, m_szAccount + 4, 12);
  666. else
  667. {
  668. errMsg = CSimpleStringA::Format("Get12Account err(%s).", (const char*)ctxSM->Req.account);
  669. if (m_iInWhatPage == PageType_Other)
  670. {
  671. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setResultCode("RTA2607")(errMsg.GetData());
  672. LogError(Severity_High, Error_Unexpect, PinPad_UserErrorCode_PinPad_GetEncryptText_Get12Account_Error, errMsg.GetData());
  673. }
  674. else
  675. LogWarn(Severity_High, Error_Unexpect, PinPad_UserErrorCode_PinPad_GetEncryptText_Get12Account_Error, errMsg.GetData());
  676. ctxSM->Answer(Error_DevCommFailed, PinPad_UserErrorCode_PinPad_GetEncryptText_Get12Account_Error);
  677. return Error_DevCommFailed;
  678. }
  679. //memcpy(accInfo.account,"588571006555",12);
  680. accInfo.dwAccLen = 12;
  681. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("acc(%s)", accInfo.account);
  682. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  683. errCode = m_hDevHelper->SetAccNo(accInfo);
  684. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  685. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetAccNo").setCostTime(m_ullEndTime - m_ullBeginTime)("%s", SpStrError(errCode));
  686. if (errCode != Error_Succeed)
  687. {
  688. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("[sm]set accout(%s)(%s) failed(%d).", (const char*)ctxSM->Req.account, accInfo.account, errCode);
  689. SetErrPackage("GetEncryptText::SetAccNo", m_devSN, errCode, MEC_DEVAPI_EPP_SetAccNo);
  690. if (IsInBusiness())
  691. {
  692. ctxSM->Answer(Error_DevCommFailed, AlarmDEC(true));
  693. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setResultCode("RTA2608")("设置账号失败");
  694. }
  695. else
  696. {
  697. ctxSM->Answer(Error_DevCommFailed, AlarmDEC());
  698. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setResultCode("RTA2608")("设置账号失败");
  699. }
  700. return Error_DevCommFailed;
  701. }
  702. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  703. if (!bSMFlag)
  704. errCode = m_hDevHelper->ActiveWorkingKey(0, 0);
  705. else
  706. errCode = m_hDevHelper->ActiveWorkingKey(1, 0);
  707. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  708. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ActiveWorkingKey").setCostTime(m_ullEndTime - m_ullBeginTime)("%s", SpStrError(errCode));
  709. if (errCode != Error_Succeed)
  710. {
  711. SetErrPackage("GetEncryptText::ActiveWorkingKey", m_devSN, errCode, MEC_DEVAPI_EPP_ActiveWorkingKey);
  712. if (IsInBusiness())
  713. {
  714. ctxSM->Answer(Error_DevCommFailed, AlarmDEC(true));
  715. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setResultCode("RTA260C")("计算密文时激活工作密钥失败");
  716. }
  717. else
  718. {
  719. ctxSM->Answer(Error_DevCommFailed, AlarmDEC());
  720. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setResultCode("RTA260C")("计算密文时激活工作密钥失败");
  721. }
  722. return Error_DevCommFailed;
  723. }
  724. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  725. if (!bSMFlag)
  726. {
  727. errCode = m_hDevHelper->SetParam(EPP_PT_SET_PIN_ALGORITH, EPP_PIN_ALGO_ISO9564_1_ANSI);
  728. }
  729. else
  730. {
  731. errCode = m_hDevHelper->SetParam(EPP_PT_SET_PIN_ALGORITH, EPP_PIN_ALGO_SM4);
  732. }
  733. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  734. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetParam").setCostTime(m_ullEndTime - m_ullBeginTime)("%s", SpStrError(errCode));
  735. if (errCode != Error_Succeed)
  736. {
  737. SetErrPackage("GetEncryptText::SetParam", m_devSN, errCode, MEC_DEVAPI_EPP_SetParam);
  738. if (IsInBusiness())
  739. {
  740. ctxSM->Answer(Error_DevCommFailed, AlarmDEC(true));
  741. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setResultCode("RTA260B")("计算密文时设置参数失败");
  742. }
  743. else
  744. {
  745. ctxSM->Answer(Error_DevCommFailed, AlarmDEC());
  746. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setResultCode("RTA260B")("计算密文时设置参数失败");
  747. }
  748. return Error_DevCommFailed;
  749. }
  750. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  751. errCode = m_hDevHelper->StartPinInput(len);
  752. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  753. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::StartPinInput").setCostTime(m_ullEndTime - m_ullBeginTime)("%s", SpStrError(errCode));
  754. if (errCode != Error_Succeed)
  755. {
  756. SetErrPackage("GetEncryptText::StartPinInput", m_devSN, errCode, MEC_DEVAPI_EPP_StartPinInput);
  757. if (IsInBusiness())
  758. {
  759. ctxSM->Answer(Error_DevCommFailed, AlarmDEC(true));
  760. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setResultCode("RTA2609")("开启密文输入失败");
  761. }
  762. else
  763. {
  764. ctxSM->Answer(Error_DevCommFailed, AlarmDEC());
  765. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setResultCode("RTA2609")("开启密文输入失败");
  766. }
  767. return Error_DevCommFailed;
  768. }
  769. char* buf = new char[len + 1];
  770. memset(buf, 0, len + 1);
  771. int readed = 0;
  772. DWORD elapsed = 0;
  773. DWORD dwStart = GetTickCount();
  774. DWORD dwEnd = GetTickCount();
  775. bool bCancelInput = false;
  776. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("req(pin)len:[%d],timeout:[%d],confirm:[%d],bExit(%d)", len, timeout, confirm, m_bExit);
  777. while (elapsed < MAX_PINPAD_INPUT_TIMEOUT) {
  778. if (m_bExit)
  779. break;
  780. if (!confirm && readed >= len)
  781. break;
  782. if (m_bWaitingMore)
  783. {
  784. dwStart = GetTickCount();
  785. elapsed = 0;
  786. m_bWaitingMore = false;
  787. continue;
  788. }
  789. if (m_bFrontCancel)
  790. {
  791. bCancelInput = true;
  792. goto Err;
  793. }
  794. BYTE btCh;
  795. Sleep(100);
  796. errCode = m_hDevHelper->KeyRead(btCh);//循环调用,无需计算耗时
  797. if (errCode == Error_Succeed) {
  798. LogEvent(Severity_Middle, LOG_EVT_PINPAD_OP, "PinPad op.", ctxSM->link);
  799. if (btCh == 0x0d) {
  800. if (confirm)
  801. {
  802. ctxSM->Ans.enter = true;
  803. if (buf != NULL)
  804. delete[]buf;
  805. ctxSM->Answer(Error_Succeed);
  806. return Error_Succeed;
  807. }
  808. else
  809. {
  810. dwEnd = GetTickCount();
  811. elapsed = dwEnd - dwStart;
  812. continue;
  813. }
  814. }
  815. else if (btCh == 0x08) { // back
  816. if (confirm)
  817. {
  818. dwEnd = GetTickCount();
  819. elapsed = dwEnd - dwStart;
  820. continue;
  821. }
  822. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("clear input");
  823. pop_char(buf, &readed,true);
  824. } else if (btCh == 0x1b) { // quit
  825. if (confirm)
  826. {
  827. ctxSM->Ans.enter = true;
  828. if (buf != NULL)
  829. delete[]buf;
  830. ctxSM->Answer(Error_Succeed);
  831. return Error_Succeed;
  832. }
  833. else
  834. {
  835. bCancelInput = true;
  836. goto Err;
  837. }
  838. }
  839. else if (btCh == 0x3f) {
  840. if (confirm)
  841. {
  842. dwEnd = GetTickCount();
  843. elapsed = dwEnd - dwStart;
  844. continue;
  845. }
  846. push_char(buf, &readed, '*');
  847. }else{
  848. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("else[%d]",btCh);
  849. }
  850. }
  851. else {
  852. }
  853. dwEnd = GetTickCount();
  854. elapsed = dwEnd - dwStart;
  855. }
  856. buf[readed] = 0;
  857. Err:
  858. if (m_bExit)
  859. {
  860. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("exit");
  861. ctxSM->Answer(Error_Unexpect, PinPad_UserErrorCode_Unexpected_Exit);
  862. return Error_Unexpect;
  863. }
  864. m_bExit = false;
  865. if (buf != NULL)
  866. delete[]buf;
  867. if (bCancelInput)
  868. {
  869. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220602")("input cancel(pin)");
  870. ctxSM->Answer(Error_Cancel);
  871. return Error_Cancel;
  872. }
  873. if (readed < len) {
  874. if (elapsed >= MAX_PINPAD_INPUT_TIMEOUT) {
  875. ctxSM->Answer(Error_TimeOut);
  876. return Error_TimeOut;
  877. }
  878. }
  879. PinBlock pinBlk;
  880. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to getpinblk");
  881. Sleep(500);//nantian
  882. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  883. errCode = m_hDevHelper->GetPinBlock(pinBlk);
  884. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  885. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetPinBlock").setCostTime(m_ullEndTime - m_ullBeginTime)("%s", SpStrError(errCode));
  886. LogWarn(Severity_Low, Error_Succeed, PinPad_UserErrorCode_PinPad_GetPinBlock_Call
  887. , CSimpleStringA::Format("{\"cost\":%d}", m_ullEndTime - m_ullBeginTime));
  888. if (errCode == Error_Succeed)
  889. {
  890. char* tmpPinData = new char[MAX_PIN_BLOCK_SIZE];
  891. if (tmpPinData == NULL)
  892. return Error_Resource;
  893. memset(tmpPinData, 0, MAX_PIN_BLOCK_SIZE);
  894. memcpy(tmpPinData, pinBlk.data, pinBlk.dwSize);
  895. ctxSM->Ans.data = tmpPinData;
  896. //Dbg("pinblk(%s)",tmpPinData);
  897. if (tmpPinData != NULL)
  898. {
  899. delete[]tmpPinData;
  900. tmpPinData = NULL;
  901. }
  902. EnDecryptInfo srcInfo, dstInfo;
  903. memset(srcInfo.data, 0, MAX_EN_DECRYPT_DATA_SIZE);
  904. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("encryptdata[%s]", (LPCTSTR)m_devCheckData);
  905. memcpy(srcInfo.data, m_devCheckData, m_devCheckData.GetLength());
  906. srcInfo.dwSize = m_devCheckData.GetLength();
  907. memset(dstInfo.data, 0, MAX_EN_DECRYPT_DATA_SIZE);
  908. //set param
  909. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  910. if (!bSMFlag)
  911. errCode = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_3DES);
  912. else
  913. errCode = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_SM4);
  914. if (errCode == Error_Succeed)
  915. errCode = m_hDevHelper->SetParam(EPP_PT_SET_ECB_CBC_MODE, EPP_ALGO_MODE_CBC);
  916. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  917. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetParam").setCostTime(m_ullEndTime - m_ullBeginTime)("%s", SpStrError(errCode));
  918. if (errCode != Error_Succeed)
  919. {
  920. SetErrPackage("GetEncryptText::SetParam", m_devSN, errCode, MEC_DEVAPI_EPP_SetParam);
  921. if (IsInBusiness())
  922. {
  923. ctxSM->Answer(Error_Param, AlarmDEC(true));
  924. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setResultCode("RTA260B")("计算密文时设置参数失败");
  925. }
  926. else
  927. {
  928. ctxSM->Answer(Error_Param, AlarmDEC());
  929. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setResultCode("RTA260B")("计算密文时设置参数失败");
  930. }
  931. return Error_Param;
  932. }
  933. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  934. errCode = m_hDevHelper->EncryptData(srcInfo, dstInfo);
  935. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  936. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::EncryptData").setCostTime(m_ullEndTime - m_ullBeginTime)("%s", SpStrError(errCode));
  937. if (errCode != Error_Succeed)
  938. {
  939. SetErrPackage("GetEncryptText::EncryptData", m_devSN, errCode, MEC_DEVAPI_EPP_EncryptData);
  940. if (IsInBusiness())
  941. {
  942. ctxSM->Answer(Error_DevCommFailed, AlarmDEC(true));
  943. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setResultCode("RTA260D")("计算密文时数据加密失败");
  944. }
  945. else
  946. {
  947. ctxSM->Answer(Error_DevCommFailed, AlarmDEC());
  948. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setResultCode("RTA260D")("计算密文时数据加密失败");
  949. }
  950. return Error_DevCommFailed;
  951. }
  952. char* tmpCheckCode = new char[MAX_PIN_BLOCK_SIZE];
  953. if (tmpCheckCode == NULL)
  954. return Error_Resource;
  955. memset(tmpCheckCode, 0, MAX_PIN_BLOCK_SIZE);
  956. //HexBuf2StrBuf(dstInfo.data,&tmpCheckCode,dstInfo.dwSize);
  957. memcpy(tmpCheckCode, dstInfo.data, dstInfo.dwSize);
  958. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ckckck[%s]", tmpCheckCode);
  959. if (strnicmp(tmpCheckCode, "9F1F7BFF6F5511384D9430531E538FD3",
  960. strlen("9F1F7BFF6F5511384D9430531E538FD3")) == 0)
  961. {
  962. SetErrPackage("GetEncryptText::EncryptData(SM)", m_devSN, Error_Unexpect, PinPad_UserErrorCode_KEY_LOST_SM);
  963. AlarmDEC();
  964. }
  965. ctxSM->Ans.checkcode = tmpCheckCode;
  966. ctxSM->Ans.deviceno = m_deviceNo;
  967. if (!bSMFlag)
  968. ctxSM->Ans.keyseq = m_keySN;
  969. else
  970. {
  971. if (m_keySNSM.GetLength() < 2)//如果忘记配置
  972. ctxSM->Ans.keyseq = "001";
  973. else
  974. ctxSM->Ans.keyseq = m_keySNSM;
  975. }
  976. CSimpleStringA tmpLastCkCode = m_lastCheckCode;
  977. if (m_lastCheckCode.IsNullOrEmpty() || strnicmp(tmpCheckCode, m_lastCheckCode, m_lastCheckCode.GetLength()) != 0)
  978. {
  979. ErrorCodeEnum eErr;
  980. CSmartPointer<IConfigInfo> spConfigRun;
  981. eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
  982. if (eErr == Error_Succeed)
  983. {
  984. spConfigRun->WriteConfigValue("Load", "ckckck", tmpCheckCode);
  985. m_lastCheckCode = tmpCheckCode;
  986. }
  987. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("write ckckck:%s", tmpCheckCode);
  988. }
  989. if (!tmpLastCkCode.IsNullOrEmpty() && strnicmp(tmpCheckCode, tmpLastCkCode, tmpLastCkCode.GetLength()) != 0)
  990. {
  991. CSimpleStringA xCkChangeMsg = CSimpleStringA::Format("last ck:%s,current ck:%s,m_keySN:%s,m_keySNSM:%s", tmpLastCkCode.GetData()
  992. , tmpCheckCode, m_keySN.GetData(), m_keySNSM.GetData());
  993. LogWarn(Severity_Low, Error_Unexpect, PinPad_UserErrorCode_PinPad_CheckCode_Changed, xCkChangeMsg.GetData());
  994. }
  995. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_keySN:%s,m_keySNSM:%s", (const char*)m_keySN, (const char*)m_keySNSM);
  996. }
  997. else
  998. {
  999. SetErrPackage("GetEncryptText::GetPinBlock", m_devSN, errCode, MEC_DEVAPI_EPP_GetPinBlock);
  1000. if (IsInBusiness())
  1001. {
  1002. ctxSM->Answer(Error_DevCommFailed, AlarmDEC(true));
  1003. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setResultCode("RTA260A")("计算密文失败");
  1004. }
  1005. else
  1006. {
  1007. ctxSM->Answer(Error_DevCommFailed, AlarmDEC());
  1008. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetInputSM).setResultCode("RTA260A")("计算密文失败");
  1009. }
  1010. return Error_DevCommFailed;
  1011. }
  1012. DbgWithLink(LOG_LEVEL_INFO, ctxSM->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setLogCode("QLR040220606")("获取密文成功");
  1013. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1014. ErrorCodeEnum errClosePinPad = m_hDevHelper->StopInput();
  1015. if (errClosePinPad != Error_Succeed)
  1016. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("close pinpad(%d).", errClosePinPad);
  1017. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1018. Sleep(100);
  1019. ctxSM->Answer(Error_Succeed);
  1020. return Error_Succeed;
  1021. }
  1022. int CPinPadFSM::GetInput(SpReqAnsContext<PinPadService_GetInputSM_Req, PinPadService_GetInputSM_Ans>::Pointer ctxSM)
  1023. {
  1024. DWORD dwCurrThId = GetCurrentThreadId();
  1025. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("GetInput thread id:%d",dwCurrThId);
  1026. m_bWaitingMore = false;
  1027. m_bFrontCancel = false;
  1028. m_bExit = false;
  1029. LogEvent(Severity_Middle, LOG_EVT_PINPAD_GREEN_ON, "PinPad light on.");
  1030. if (!m_hDevHelper)
  1031. {
  1032. SetErrPackage("GetInput(SM)", m_devSN, Error_Unexpect, PinPad_UserErrorCode_PinPad_Instance_Is_Null);
  1033. m_inputSMCtx->Answer(Error_Unexpect, AlarmDEC());
  1034. LogEvent(Severity_Middle, LOG_EVT_PINPAD_GREEN_OFF, "PinPad light off.");
  1035. m_bPinInput = false;
  1036. return 1;
  1037. }
  1038. ErrorCodeEnum err;
  1039. err = GetEncryptText(m_inputSMCtx);
  1040. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)
  1041. ("req acc.len:%d,confirm:%d,len:%d. ans:ck.len:%d", m_inputSMCtx->Req.account.GetLength(), m_inputSMCtx->Req.confirm
  1042. , m_inputSMCtx->Req.length, m_inputSMCtx->Ans.checkcode.IsNullOrEmpty() ? 0 : m_inputSMCtx->Ans.checkcode.GetLength());
  1043. DbgToBeidou(m_inputSMCtx->link, "GetInput")();
  1044. m_bPinInput = false;
  1045. LogEvent(Severity_Middle, LOG_EVT_PINPAD_GREEN_OFF, "PinPad light off.");
  1046. return 0;
  1047. }
  1048. int CPinPadFSM::LoadKeySM(SpReqAnsContext<PinPadService_LoadKeysSM_Req, PinPadService_LoadKeysSM_Ans>::Pointer ctx)
  1049. {
  1050. ErrorCodeEnum eErr;
  1051. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  1052. CSmartPointer<IConfigInfo> spConfig;
  1053. eErr = spEntityFunction->OpenConfig(Config_Run, spConfig);
  1054. if (eErr != Error_Succeed)
  1055. {
  1056. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("LoadKeySM::OpenConfig failed,eErr:%d", eErr);
  1057. spConfig = NULL;
  1058. ctx->Answer(eErr, PinPad_UserErrorCode_Open_RunCfgFile_Failed);
  1059. return 0;
  1060. }
  1061. if (!(ctx->Req.smflag == 1 || ctx->Req.smflag == 11))
  1062. {
  1063. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("密钥标识不支持,ctx->Req.smflag:%d", ctx->Req.smflag);
  1064. ctx->Answer(Error_Unexpect, PinPad_UserErrorCode_UnknownSMFlag);
  1065. return 0;
  1066. }
  1067. //initialization need load master key
  1068. if (ctx->Req.initializeflag)
  1069. {
  1070. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("mkey len:%d,ctx->Req.smflag:%d", strlen(ctx->Req.masterkey), ctx->Req.smflag);
  1071. if (ctx->Req.smflag == 11)
  1072. {
  1073. #if defined(RVC_OS_WIN)
  1074. MasterKeyParamEx mkParamEx;
  1075. mkParamEx.dwSN = 1;
  1076. mkParamEx.smFlag = ctx->Req.smflag;
  1077. memset(mkParamEx.key, 0, MAX_EN_DECRYPT_DATA_SIZE);
  1078. memcpy(mkParamEx.key, ctx->Req.masterkey, strlen(ctx->Req.masterkey));
  1079. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1080. eErr = m_hDevHelper->LoadMasterKeyEx(mkParamEx);
  1081. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1082. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::LoadMasterKeyEx").setCostTime(m_ullEndTime - m_ullBeginTime)("%s", SpStrError(eErr));
  1083. if (eErr != Error_Succeed)
  1084. {
  1085. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_LoadKeysSM).setAPI("LoadMasterKeyEx")
  1086. .setResultCode("RTA2604")("加载主密钥失败,eErr:%d", eErr);
  1087. ctx->Ans.result = 0;
  1088. SetErrPackage("LoadKeySM::LoadMasterKeyEx", m_devSN, eErr, MEC_DEVAPI_EPP_LoadMasterKey);
  1089. ctx->Answer(Error_Unexpect, AlarmDEC());
  1090. m_bLoadKey = false;
  1091. return 0;
  1092. }
  1093. #endif
  1094. return 0;
  1095. }
  1096. else
  1097. {
  1098. MasterKeyParam mkParam;
  1099. mkParam.dwSN = 1;
  1100. mkParam.smFlag = ctx->Req.smflag;
  1101. memset(mkParam.key, 0, MAX_MASTER_KEY_SIZE);
  1102. memcpy(mkParam.key, ctx->Req.masterkey, strlen(ctx->Req.masterkey));
  1103. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1104. eErr = m_hDevHelper->LoadMasterKey(mkParam);
  1105. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1106. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::LoadMasterKey").setCostTime(m_ullEndTime - m_ullBeginTime)("%s", SpStrError(eErr));
  1107. if (eErr != Error_Succeed)
  1108. {
  1109. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("PinPadService_LogCode_LoadKeysSM").setAPI("LoadMasterKey")
  1110. .setResultCode("RTA2604")("加载主密钥失败,eErr:%d", eErr);
  1111. ctx->Ans.result = 0;
  1112. SetErrPackage("LoadKeySM::LoadMasterKey", m_devSN, eErr, MEC_DEVAPI_EPP_LoadMasterKey);
  1113. ctx->Answer(Error_Unexpect, AlarmDEC());
  1114. m_bLoadKey = false;
  1115. return 0;
  1116. }
  1117. }
  1118. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_LoadKeysSM)("Load master key suc.");
  1119. //after load Master key,clear the load key status
  1120. spConfig->WriteConfigValueInt("Load", "SM", 0);
  1121. }
  1122. WorkKeyParam wkParam1, wkParam2;
  1123. memset(wkParam1.key, 0, MAX_WORKING_KEY_SIZE);
  1124. memset(wkParam2.key, 0, MAX_WORKING_KEY_SIZE);
  1125. wkParam1.dwMasterSN = wkParam2.dwMasterSN = 1;
  1126. wkParam1.dwWorkingSN = 0;
  1127. wkParam2.dwWorkingSN = 1;
  1128. wkParam1.smFlag = ctx->Req.smflag;
  1129. wkParam2.smFlag = ctx->Req.smflag;
  1130. memcpy(wkParam1.key, ctx->Req.workingkey1, strlen(ctx->Req.workingkey1));
  1131. memcpy(wkParam2.key, ctx->Req.workingkey2, strlen(ctx->Req.workingkey2));
  1132. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1133. eErr = m_hDevHelper->LoadWorkingKey(wkParam1);
  1134. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1135. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::LoadWorkingKey").setCostTime(m_ullEndTime - m_ullBeginTime)("%s", SpStrError(eErr));
  1136. if (eErr != Error_Succeed)
  1137. {
  1138. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_LoadKeysSM).setAPI("LoadWorkingKey")
  1139. .setResultCode("RTA2605")("加载工作密钥1(TPK)失败,eErr:%d", eErr);
  1140. ctx->Ans.result = 1;
  1141. SetErrPackage("LoadKeySM::LoadMasterKey 1", m_devSN, eErr, MEC_DEVAPI_EPP_LoadWorkingKey);
  1142. ctx->Answer(Error_Unexpect, AlarmDEC());
  1143. m_bLoadKey = false;
  1144. return 0;
  1145. }
  1146. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("Load working key1 suc.");
  1147. //oilyang@20220308 to calc checkcode if called Initializer
  1148. if (ctx->Req.initializeflag)
  1149. {
  1150. PBYTE pCtMasterKey = new BYTE[48];
  1151. PBYTE pCtPinKey = new BYTE[48];
  1152. BYTE pinKey[16] = { 0 };
  1153. int pinKeyLen = 16;
  1154. int ctMLen = SP::Module::Util::StrBuf2HexBuf(ctx->Req.masterkey.GetData(), &pCtMasterKey);
  1155. int ctPinLen = SP::Module::Util::StrBuf2HexBuf(ctx->Req.workingkey1.GetData(), &pCtPinKey);
  1156. //sm4 decrypt
  1157. sm4_context sm4Contxt;
  1158. sm4_setkey_dec(&sm4Contxt, pCtMasterKey);
  1159. sm4_crypt_ecb(&sm4Contxt, SM4_DECRYPT, ctPinLen, pCtPinKey, (BYTE*)pinKey);
  1160. BYTE ck[16] = { 0 };
  1161. BYTE ckCode[128] = { 0 };
  1162. sm4_setkey_enc(&sm4Contxt, pinKey);
  1163. sm4_crypt_ecb(&sm4Contxt, SM4_ENCRYPT, 8, ck, (BYTE*)ckCode);
  1164. char* strCkCode = new char[256];
  1165. memset(strCkCode, 0, 256);
  1166. SP::Module::Util::HexBuf2StrBuf((PBYTE)ckCode, &strCkCode, 16);
  1167. LogWarn(Severity_Low, Error_Unexpect, PinPad_UserErrorCode_PinPad_CkCode_While_Load_SM, strCkCode);
  1168. BYTE ckMaster[16] = { 0 };
  1169. BYTE ckCodeMaster[128] = { 0 };
  1170. sm4_setkey_enc(&sm4Contxt, pCtMasterKey);
  1171. sm4_crypt_ecb(&sm4Contxt, SM4_ENCRYPT, 8, ckMaster, (BYTE*)ckCodeMaster);
  1172. char* strCkCodeMaster = new char[256];
  1173. memset(strCkCodeMaster, 0, 256);
  1174. SP::Module::Util::HexBuf2StrBuf((PBYTE)ckCodeMaster, &strCkCodeMaster, 16);
  1175. GetEntityBase()->GetFunction()->SetSysVar("ckCode", strCkCodeMaster, true);
  1176. delete[] pCtMasterKey;
  1177. delete[] pCtPinKey;
  1178. delete[] strCkCode;
  1179. delete[] strCkCodeMaster;
  1180. }
  1181. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1182. eErr = m_hDevHelper->LoadWorkingKey(wkParam2);
  1183. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1184. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::LoadWorkingKey").setCostTime(m_ullEndTime - m_ullBeginTime)("%s", SpStrError(eErr));
  1185. if (eErr != Error_Succeed)
  1186. {
  1187. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_LoadKeysSM).setAPI("LoadWorkingKey")
  1188. .setResultCode("RTA2605")("加载工作密钥2(EDK)失败,eErr:%d", eErr);
  1189. ctx->Ans.result = 2;
  1190. SetErrPackage("LoadKeySM::LoadMasterKey 2", m_devSN, eErr, MEC_DEVAPI_EPP_LoadWorkingKey);
  1191. ctx->Answer(Error_Unexpect, AlarmDEC());
  1192. m_bLoadKey = false;
  1193. return 0;
  1194. }
  1195. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("Load working key2 suc.");
  1196. if (spConfig != NULL)
  1197. {
  1198. eErr = spConfig->WriteConfigValueInt("Load", "SM", 1);
  1199. if (!ctx->Req.reserved3.IsNullOrEmpty())
  1200. {
  1201. spConfig->WriteConfigValue("Load", "SN_SM", ctx->Req.reserved3);
  1202. m_keySNSM = ctx->Req.reserved3;
  1203. LogWarn(Severity_Low, Error_Unexpect, PinPad_UserErrorCode_PinPad_LoadKey_SMSN, m_keySNSM.GetData());
  1204. }
  1205. else
  1206. {
  1207. spConfig->WriteConfigValue("Load", "SN_SM", "");
  1208. m_keySNSM = "";
  1209. LogWarn(Severity_Low, Error_Unexpect, PinPad_UserErrorCode_PinPad_LoadKey_Clear_SMSN, "clear sm key sn");
  1210. }
  1211. if (eErr != Error_Succeed)
  1212. {
  1213. SetErrPackage("LoadKeySM::WriteConfigValueInt", m_devSN, eErr, PinPad_UserErrorCode_Write_RunCfgFile_Failed);
  1214. AlarmDEC();
  1215. }
  1216. }
  1217. m_bLoadKey = false;
  1218. m_bSMLoaded = true;
  1219. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_LoadKeysSM)("加载密钥成功");
  1220. ctx->Answer(Error_Succeed);
  1221. return 0;
  1222. }
  1223. int CPinPadFSM::EncryptSM(SpReqAnsContext<PinPadService_EncryptDataSM_Req, PinPadService_EncryptDataSM_Ans>::Pointer ctx)
  1224. {
  1225. if (ctx->Req.smflag == 1 || ctx->Req.smflag == 11)
  1226. {
  1227. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("密钥标识不支持,ctx->Req.smflag:%d", ctx->Req.smflag);
  1228. ctx->Answer(Error_Unexpect, PinPad_UserErrorCode_UnknownSMFlag);
  1229. return 0;
  1230. }
  1231. //set param
  1232. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1233. if (m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_SM4) != Error_Succeed
  1234. || m_hDevHelper->SetParam(EPP_PT_SET_ECB_CBC_MODE, EPP_ALGO_MODE_CBC) != Error_Succeed)
  1235. {
  1236. SetErrPackage("EncryptSM::SetParam", m_devSN, Error_Unexpect, MEC_DEVAPI_EPP_SetParam);
  1237. ctx->Answer(Error_Unexpect, AlarmDEC(IsInBusiness()));
  1238. m_bEncrypt = false;
  1239. return 0;
  1240. }
  1241. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1242. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1243. ErrorCodeEnum eErr = m_hDevHelper->ActiveWorkingKey(1, 1);
  1244. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1245. DbgToBeidou(ctx->link, "ActiveWorkingKey")();
  1246. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_EncryptDataSM).setCostTime(m_ullEndTime - m_ullBeginTime)("%s", SpStrError(eErr));
  1247. if (eErr != Error_Succeed)
  1248. {
  1249. SetErrPackage("EncryptSM::ActiveWorkingKey", m_devSN, eErr, MEC_DEVAPI_EPP_ActiveWorkingKey);
  1250. ctx->Answer(Error_Unexpect, AlarmDEC(IsInBusiness()));
  1251. m_bEncrypt = false;
  1252. return 0;
  1253. }
  1254. EnDecryptInfo srcData, dstData;
  1255. ZeroMemory(srcData.data, MAX_EN_DECRYPT_DATA_SIZE);
  1256. ZeroMemory(dstData.data, MAX_EN_DECRYPT_DATA_SIZE);
  1257. srcData.dwSize = strlen(ctx->Req.data);
  1258. memcpy(srcData.data, ctx->Req.data, srcData.dwSize);
  1259. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1260. eErr = m_hDevHelper->EncryptData(srcData, dstData);
  1261. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1262. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::EncryptData").setCostTime(m_ullEndTime - m_ullBeginTime)("%s", SpStrError(eErr));
  1263. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_EncryptDataSM)("srcData.dwSize:%d,dstData.dwSize", srcData.dwSize, dstData.dwSize);
  1264. DbgToBeidou(ctx->link, "EncryptData")();
  1265. if (eErr != Error_Succeed)
  1266. {
  1267. SetErrPackage("EncryptSM::EncryptData", m_devSN, eErr, MEC_DEVAPI_EPP_EncryptData);
  1268. ctx->Answer(Error_Unexpect, AlarmDEC(IsInBusiness()));
  1269. m_bEncrypt = false;
  1270. return 0;
  1271. }
  1272. ctx->Ans.ciphertext = (char*)dstData.data;
  1273. m_bEncrypt = false;
  1274. ctx->Answer(Error_Succeed);
  1275. return 0;
  1276. }
  1277. ErrorCodeEnum CPinPadFSM::GetCheckCode(SpReqAnsContext<PinPadService_GetCheckCode_Req, PinPadService_GetCheckCode_Ans>::Pointer ctx)
  1278. {
  1279. ErrorCodeEnum eErr = Error_Unexpect;
  1280. bool bGetOK = true;
  1281. ctx->Ans.checkcode.Init(ctx->Req.mSN.GetCount());
  1282. for (int i = 0; i < ctx->Req.mSN.GetCount(); i++)
  1283. {
  1284. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("mSN:%d,wSN:%d,origData[%s]", ctx->Req.mSN[i], ctx->Req.wSN[i], m_devCheckData.GetData());
  1285. //set param
  1286. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1287. if (ctx->Req.mSN[i] == 1)
  1288. eErr = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_SM4);
  1289. else
  1290. eErr = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_3DES);
  1291. if (eErr == Error_Succeed)
  1292. eErr = m_hDevHelper->SetParam(EPP_PT_SET_ECB_CBC_MODE, EPP_ALGO_MODE_CBC);
  1293. else
  1294. {
  1295. SetErrPackage("GetCheckCode::SetParam", m_devSN, eErr, MEC_DEVAPI_EPP_SetParam);
  1296. AlarmDEC();
  1297. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(PinPadService_LogCode_GetCheckCode).setResultCode("RTA260B")("计算校验码时设置参数失败");
  1298. return Error_DevCommFailed;
  1299. }
  1300. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1301. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1302. eErr = m_hDevHelper->ActiveWorkingKey(ctx->Req.mSN[i], ctx->Req.wSN[i]);
  1303. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1304. if (eErr != Error_Succeed)
  1305. {
  1306. SetErrPackage("GetCheckCode::ActiveWorkingKey", m_devSN, eErr, MEC_DEVAPI_EPP_ActiveWorkingKey);
  1307. AlarmDEC();
  1308. ctx->Ans.checkcode[i] = "";
  1309. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(PinPadService_LogCode_GetCheckCode).setResultCode("RTA260C")("计算校验码时激活工作密钥失败");
  1310. return Error_DevCommFailed;
  1311. }
  1312. else
  1313. {
  1314. EnDecryptInfo srcInfo, dstInfo;
  1315. memset(srcInfo.data, 0, MAX_EN_DECRYPT_DATA_SIZE);
  1316. memcpy(srcInfo.data, m_devCheckData, m_devCheckData.GetLength());
  1317. srcInfo.dwSize = m_devCheckData.GetLength();
  1318. memset(dstInfo.data, 0, MAX_EN_DECRYPT_DATA_SIZE);
  1319. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1320. eErr = m_hDevHelper->EncryptData(srcInfo, dstInfo);
  1321. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1322. if (eErr != Error_Succeed)
  1323. {
  1324. SetErrPackage("GetCheckCode::EncryptData", m_devSN, eErr, MEC_DEVAPI_EPP_EncryptData);
  1325. AlarmDEC();
  1326. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(PinPadService_LogCode_GetCheckCode).setResultCode("RTA260D")("计算校验码时数据加密失败");
  1327. return Error_DevCommFailed;
  1328. }
  1329. ctx->Ans.checkcode[i] = (const char*)dstInfo.data;
  1330. }
  1331. }
  1332. DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setLogCode("QLR040220610")("计算校验码成功");
  1333. ctx->Answer(Error_Succeed);
  1334. return Error_Succeed;
  1335. }
  1336. bool CPinPadFSM::GetDevInfo(DevCategoryInfo &devInfo)
  1337. {
  1338. if (!m_bOpened)
  1339. {
  1340. devInfo.eState = m_eDevState;
  1341. return false;
  1342. }
  1343. DevCategoryInfo info;
  1344. ZeroMemory(info.szModel, MAX_DEV_MODEL_LEN);
  1345. ZeroMemory(info.szType, MAX_DEV_TYPE_LEN);
  1346. ZeroMemory(info.szVendor, MAX_DEV_VENDOR_LEN);
  1347. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1348. ErrorCodeEnum eErrDev = m_hDevHelper->GetDevCategory(info);
  1349. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1350. if (eErrDev == Error_Succeed)
  1351. {
  1352. m_szModel = info.szModel;
  1353. m_szType = info.szType;
  1354. m_szVendor = info.szVendor;
  1355. }
  1356. else
  1357. {
  1358. SetErrPackage("GetDevInfo::GetDevCategory", m_devSN, eErrDev, MEC_DEVAPI_EPP_GetDevCategory);
  1359. AlarmDEC();
  1360. m_szModel = "";
  1361. m_szType = "";
  1362. m_szVendor = "";
  1363. m_eDevState = DEVICE_STATUS_NOT_READY;
  1364. }
  1365. ZeroMemory(devInfo.szModel,MAX_DEV_MODEL_LEN);//CM=V2.0#PM=V1.0#MID=75500001#PID=12345678#FWID=V1234567#Vendor=nantian
  1366. ZeroMemory(devInfo.szType,MAX_DEV_TYPE_LEN);
  1367. ZeroMemory(devInfo.szVendor,MAX_DEV_VENDOR_LEN);
  1368. CSimpleStringA tmpModel("");
  1369. if (m_szModel.GetLength() > 1)
  1370. {
  1371. //oilyang@20200807 add FWBID for auth&init
  1372. CSimpleStringA tmpDevSN(""),tmpAddStr("");
  1373. GetEntityBase()->GetFunction()->GetSysVar("FWBDevSN", tmpDevSN);
  1374. if (tmpDevSN.GetLength() > 12 && tmpDevSN.IndexOf("FWB") > 2)
  1375. tmpAddStr = tmpAddStr + "Vendor=" + m_szVendor + "#FWBID=" + tmpDevSN;
  1376. else
  1377. tmpAddStr = tmpAddStr + "Vendor=" + m_szVendor;
  1378. if (m_szModel[m_szModel.GetLength() - 1] == '#')
  1379. tmpModel = m_szModel + tmpAddStr;
  1380. else
  1381. tmpModel = m_szModel + "#" + tmpAddStr;
  1382. strncpy(devInfo.szModel, (const char*)tmpModel, tmpModel.GetLength());
  1383. }
  1384. if (m_szType.GetLength() > 1)
  1385. strncpy(devInfo.szType, (const char*)m_szType, m_szType.GetLength());
  1386. if (m_szVendor.GetLength() > 1)
  1387. strncpy(devInfo.szVendor, (const char*)m_szVendor, m_szVendor.GetLength());
  1388. devInfo.eState = m_eDevState;
  1389. return true;
  1390. }
  1391. void CPinPadFSM::SetInWhatPage(int iPageType)
  1392. {
  1393. m_iInWhatPage = iPageType;
  1394. return;//oilyang@20200319 去掉任意情况下可输入
  1395. }
  1396. void CPinPadFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
  1397. {
  1398. if (m_eDevState == DEVICE_STATUS_FAULT || m_eDevState == DEVICE_STATUS_NOT_READY)
  1399. {
  1400. ProcFWBReConnTask* task = new ProcFWBReConnTask(this);
  1401. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  1402. }
  1403. pTransactionContext->SendAnswer(Error_Succeed);
  1404. }
  1405. int CPinPadFSM::ProcFWBReConn()
  1406. {
  1407. if (m_hDevHelper != nullptr)
  1408. {
  1409. if (GetDevInitFlag())
  1410. {
  1411. m_bOpened = false;
  1412. m_hDevHelper->StopInput();
  1413. }
  1414. m_hDevHelper.TearDown();
  1415. }
  1416. return 0;
  1417. }