PinPadFSM.cpp 56 KB

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