pinpad.nantian.1.1.cpp 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339
  1. #include "pinpad.nantian.1.1.h"
  2. #include <cstring>
  3. #include <cstdio>
  4. //日志类
  5. CILIXTrace* m_trace;
  6. PinPadNantian::PinPadNantian()
  7. {
  8. m_trace = new CILIXTrace(NULL, "Nantian", "Pinpad");
  9. m_trace->WriteTrace("PinPadNantian", "pinpad.Nantian.1.1.so - 1.0.0.1");
  10. char SOPath[100] = "";
  11. CILIX_AUX_X::CILIX_GetModuleCurPath(SOPath);
  12. void *handle;
  13. strcat(SOPath, "libXZ_F35_API_LINUX.nantian.so");
  14. m_trace->WriteTrace("PinPadNantian", "SOPath = %s", SOPath);
  15. handle=dlopen(SOPath,RTLD_LAZY);
  16. if(handle == NULL)
  17. {
  18. m_trace->WriteTrace("PinPadNantian", "Load libXZ_F35_API_LINUX.nantian.so Fail");
  19. m_trace->WriteTrace("PinPadNantian", "Exit-");
  20. return ;
  21. }
  22. m_trace->WriteTrace("PinPadNantian", "Load libXZ_F35_API_LINUX.nantian.so Success");
  23. SUNSON_OpenCom=(int(*)(const char *, long))dlsym(handle,"SUNSON_OpenCom");
  24. SUNSON_GetVersionNo=(int(*)(unsigned char *))dlsym(handle,"SUNSON_GetVersionNo");
  25. SUNSON_CloseCom=(int(*)(void))dlsym(handle,"SUNSON_CloseCom");
  26. SUNSON_ScanGetKey=(int(*)(unsigned char *))dlsym(handle,"SUNSON_ScanGetKey");
  27. SUNSON_CloseEppPlainTextMode=(int(*)(unsigned char *))dlsym(handle,
  28. "SUNSON_CloseEppPlainTextMode");
  29. SUNSON_LoadSM4Key=(int(*)(int, int, int, unsigned char, unsigned char *, unsigned char *))dlsym(handle,
  30. "SUNSON_LoadSM4Key");
  31. SUNSON_LoadUserKey=(int(*)(int, int, long, unsigned char, unsigned char *, unsigned char *))dlsym(handle,
  32. "SUNSON_LoadUserKey");
  33. SUNSON_SetKeyMark=(int(*)(long, long, long, long, unsigned char*))dlsym(handle,
  34. "SUNSON_SetKeyMark");
  35. SUNSON_GetPin=(int(*)(unsigned char, unsigned char, unsigned char, unsigned char *))dlsym(handle,
  36. "SUNSON_GetPin");
  37. SUNSON_UseEppPlainTextMode=(int(*)(unsigned char, unsigned char, unsigned char *))dlsym(handle,
  38. "SUNSON_UseEppPlainTextMode");
  39. SUNSON_SwitchArithmetic=(int(*)(unsigned char, unsigned char *))dlsym(handle, "SUNSON_SwitchArithmetic");
  40. SUNSON_GetPinBlock=(int(*)(int, int, unsigned char, unsigned char, unsigned char*, unsigned char*))dlsym(handle,
  41. "SUNSON_GetPinBlock");
  42. SUNSON_DataCompute=(int(*)(int, unsigned char, int, unsigned char, int, unsigned char *, unsigned char *))dlsym(handle,
  43. "SUNSON_DataCompute");
  44. SUNSON_MakeMac=(int(*)(int, int, int, unsigned char *, unsigned char *))dlsym(handle, "SUNSON_MakeMac");
  45. SUNSON_ScanKeyPress=(int(*)(unsigned char *))dlsym(handle, "SUNSON_ScanKeyPress");
  46. }
  47. PinPadNantian::~PinPadNantian()
  48. {
  49. }
  50. DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass*& pOutDevAptObj)
  51. {
  52. pOutDevAptObj = new PinPadNantian();
  53. if(pOutDevAptObj == NULL)
  54. {
  55. return Error_Resource;
  56. }
  57. /*cmb::log_init_config config;
  58. config.dev_name = "pinpad";
  59. config.log_dir = ("/etc/nantian");
  60. std::string str;
  61. cmb::log4vendor::init(config, str);
  62. char msg[100];
  63. LOG4VTM(TRACE, "<CreateDevComponent> - 执行init()返回信息:"<<str.c_str());*/
  64. return Error_Succeed;
  65. }
  66. DEVICEBASE_API ErrorCodeEnum ReleaseDevComponent(DeviceBaseClass*& pInDevAptObj)
  67. {
  68. if(pInDevAptObj == NULL)
  69. {
  70. return Error_Param;
  71. }
  72. if(PinPadNantian* pTmp = dynamic_cast<PinPadNantian*>(pInDevAptObj))
  73. {
  74. delete pTmp;
  75. pTmp = NULL;
  76. return Error_Succeed;
  77. }
  78. return Error_Param;
  79. }
  80. ErrorCodeEnum PinPadNantian::GetDevCategory(DevCategoryInfo &devCategory)
  81. {
  82. m_trace->WriteTrace("GetDevCategory","Enter-");
  83. //赋值
  84. strcpy(devCategory.szType,"PinPad");
  85. strcpy(devCategory.szVendor,"nantian");
  86. devCategory.version.wMajor = 1;
  87. devCategory.version.wMinor = 0;
  88. devCategory.version.wRevision = 0;
  89. devCategory.version.wBuild = 1;
  90. //设备未连接
  91. if(m_Open == false)
  92. {
  93. strcpy(devCategory.szModel,"");
  94. devCategory.eState = DEVICE_STATUS_NOT_READY;
  95. m_trace->WriteTrace("GetDevCategory", "设备未连接");
  96. m_trace->WriteTrace("GetDevCategory", "Exit-");
  97. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  98. strcpy(m_Error.szErrMsg,"设备未连接");
  99. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  100. return Error_Succeed;
  101. }
  102. strcpy(devCategory.szModel,"SE8098BV1.0");
  103. char ver[100] = "";
  104. int sret = SUNSON_GetVersionNo((unsigned char *)ver);
  105. m_trace->WriteTrace("GetDevCategory","执行SUNSON_GetVersionNo返回%d", sret);
  106. if (sret == 0)
  107. {
  108. m_trace->WriteTrace("GetDevCategory", "查设备状态失败");
  109. m_trace->WriteTrace("GetDevCategory", "Exit-");
  110. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  111. strcpy(m_Error.szErrMsg,"查设备状态失败");
  112. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  113. devCategory.eState = DEVICE_STATUS_FAULT;
  114. }
  115. m_trace->WriteTrace("GetDevCategory", "Exit-");
  116. devCategory.eState = DEVICE_STATUS_NORMAL;
  117. return Error_Succeed;
  118. }
  119. ErrorCodeEnum PinPadNantian::Reset()
  120. {
  121. return Error_Succeed;
  122. }
  123. ErrorCodeEnum PinPadNantian::DevClose()
  124. {
  125. SUNSON_CloseCom();
  126. return Error_Succeed;
  127. }
  128. ErrorCodeEnum PinPadNantian::GetLastErr(DevErrorInfo &devErrInfo)
  129. {
  130. memset(devErrInfo.szErrMsg,0,sizeof(devErrInfo.szErrMsg));
  131. devErrInfo.dwErrMsgLen = m_Error.dwErrMsgLen;
  132. memcpy(devErrInfo.szErrMsg,m_Error.szErrMsg,m_Error.dwErrMsgLen);
  133. return Error_Succeed;
  134. }
  135. ErrorCodeEnum PinPadNantian::DevOpen(DWORD dwPort, DWORD dwBaudRate)
  136. {
  137. /*LOG4VTM(TRACE, "<DevOpen> - "<<"Enter-");
  138. LOG4VTM(TRACE, "<DevOpen> - "<<"dwPort = "<<dwPort<<", dwBaudRate = "<<dwBaudRate);*/
  139. m_trace->WriteTrace("DevOpen","Enter-");
  140. m_trace->WriteTrace("DevOpen","dwPort = %d", dwPort);
  141. char sztty[100];
  142. sprintf(sztty, "/dev/ttyXRUSB%d", dwPort-1);
  143. m_trace->WriteTrace("DevOpen","sztty = %s", sztty);
  144. int sret = SUNSON_OpenCom(sztty, 9600);
  145. m_trace->WriteTrace("DevOpen","执行SUNSON_OpenCom返回%d", sret);
  146. if (sret != 1)
  147. {
  148. m_trace->WriteTrace("DevOpen", "设备打开失败");
  149. m_trace->WriteTrace("DevOpen", "Exit-");
  150. m_Open = FALSE;
  151. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  152. strcpy(m_Error.szErrMsg,"设备打开失败");
  153. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  154. return Error_DevConnFailed;
  155. }
  156. m_trace->WriteTrace("DevOpen", "设备打开成功");
  157. m_trace->WriteTrace("DevOpen", "Exit-");
  158. m_Open = TRUE;
  159. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  160. strcpy(m_Error.szErrMsg,"设备打开成功");
  161. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  162. return Error_Succeed;
  163. }
  164. ErrorCodeEnum PinPadNantian::KeyRead(BYTE &ch)
  165. {
  166. if (m_Open != TRUE)
  167. {
  168. m_trace->WriteTrace("KeyRead","设备未打开");
  169. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  170. strcpy(m_Error.szErrMsg,"设备未打开,不能做键值读取操作");
  171. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  172. return Error_NotInit;
  173. }
  174. //按键值
  175. unsigned char fKey = 0;
  176. int iret = SUNSON_ScanKeyPress(&fKey);
  177. //********无按键
  178. if (iret == 0)
  179. {
  180. return Error_DevCommFailed;
  181. }
  182. unsigned char fResult[100] = "";
  183. //********有按键
  184. if (iret == 1)
  185. {
  186. if (g_flag == 1)//密文模式
  187. {
  188. //密码键
  189. if (fKey == 0x2A)
  190. {
  191. m_trace->WriteTrace("KeyRead", "keypress *");
  192. //记录输入位数
  193. m_PinNum++;
  194. if (m_PinNum>=6 && g_Auto == 1)
  195. {
  196. //输入终止
  197. ch = 0x3f;
  198. SUNSON_CloseEppPlainTextMode(fResult);
  199. m_trace->WriteTrace("KeyRead", "键盘关闭");
  200. }
  201. else
  202. {
  203. ch = 0x3f;
  204. }
  205. }
  206. //Enter
  207. if (fKey == 0x0D)
  208. {
  209. if(g_Auto == 0)
  210. {
  211. m_trace->WriteTrace("KeyRead", "keypress Enter");
  212. ch = 0x0D;
  213. SUNSON_CloseEppPlainTextMode(fResult);
  214. m_trace->WriteTrace("KeyRead", "键盘关闭");
  215. }
  216. else
  217. {
  218. return Error_DevCommFailed;
  219. }
  220. }
  221. //Up
  222. if (fKey == 0x54)
  223. {
  224. m_trace->WriteTrace("KeyRead", "keypress Up");
  225. return Error_DevCommFailed;
  226. }
  227. //Down
  228. if (fKey == 0x23)
  229. {
  230. m_trace->WriteTrace("KeyRead", "keypress Down");
  231. return Error_DevCommFailed;
  232. }
  233. //Cancel
  234. if (fKey == 0x1B)
  235. {
  236. ch = 0x1B;
  237. m_trace->WriteTrace("KeyRead", "keypress CANCEL");
  238. //清空输入
  239. m_PinNum = 0;
  240. }
  241. //Backspace
  242. if (fKey == 0x08)
  243. {
  244. m_trace->WriteTrace("KeyRead", "keypress BACKSPACE");
  245. ch = 0x08;
  246. //后退一格
  247. if (m_PinNum > 0)
  248. m_PinNum --;
  249. //清空输入
  250. m_PinNum = 0;
  251. }
  252. }
  253. if (g_flag == 0)//明文模式
  254. {
  255. m_trace->WriteTrace("KeyRead", "fKey = 0x%02X",fKey);
  256. switch(fKey)
  257. {
  258. case 0x30://0
  259. ch = 0x30;
  260. m_trace->WriteTrace("KeyRead", "keypress 0");
  261. break;
  262. case 0x31://1
  263. ch = 0x31;
  264. m_trace->WriteTrace("KeyRead", "keypress 1");
  265. break;
  266. case 0x32://2
  267. ch = 0x32;
  268. m_trace->WriteTrace("KeyRead", "keypress 2");
  269. break;
  270. case 0x33://3
  271. ch = 0x33;
  272. m_trace->WriteTrace("KeyRead", "keypress 3");
  273. break;
  274. case 0x34://4
  275. ch = 0x34;
  276. m_trace->WriteTrace("KeyRead", "keypress 4");
  277. break;
  278. case 0x35://5
  279. ch = 0x35;
  280. m_trace->WriteTrace("KeyRead", "keypress 5");
  281. break;
  282. case 0x36://6
  283. ch = 0x36;
  284. m_trace->WriteTrace("KeyRead", "keypress 6");
  285. break;
  286. case 0x37://7
  287. ch = 0x37;
  288. m_trace->WriteTrace("KeyRead", "keypress 7");
  289. break;
  290. case 0x38://8
  291. ch = 0x38;
  292. m_trace->WriteTrace("KeyRead", "keypress 8");
  293. break;
  294. case 0x39://9
  295. ch = 0x39;
  296. m_trace->WriteTrace("KeyRead", "keypress 9");
  297. break;
  298. case 0x08://BackSpace
  299. ch = 0x08;
  300. m_trace->WriteTrace("KeyRead", "keypress BackSpace");
  301. break;
  302. case 0x2e://.
  303. ch = 0x2e;
  304. m_trace->WriteTrace("KeyRead", "keypress .");
  305. break;
  306. case 0x0d://ENTER
  307. ch = 0x0d;
  308. m_trace->WriteTrace("KeyRead", "keypress ENTER");
  309. break;
  310. case 0x1b:////ESC
  311. ch = 0x1b;
  312. m_trace->WriteTrace("KeyRead", "keypress ESC");
  313. break;
  314. case 0x54:////00
  315. ch = 0x4f;
  316. m_trace->WriteTrace("KeyRead", "keypress 00");
  317. break;
  318. case 0x23:////ESC
  319. ch = 0x23;
  320. m_trace->WriteTrace("KeyRead", "keypress DOWN");
  321. break;
  322. default:
  323. ch = 0x00;
  324. break;
  325. }
  326. }
  327. }
  328. m_trace->WriteTrace("KeyRead", "获取键值成功,获取的键值为0x%02X",ch);
  329. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  330. strcpy(m_Error.szErrMsg,"获取键值成功");
  331. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  332. return Error_Succeed;
  333. }
  334. int m_Encryptmethod;
  335. int m_MacAlgorithm;
  336. int m_PinAlgorithm;
  337. int m_ECB_CBC_Mode;
  338. ErrorCodeEnum PinPadNantian::SetParam(SetParamTypeEnum eType, SetParamValueEnum eValue)
  339. {
  340. m_trace->WriteTrace("SetParam","Enter-");
  341. m_trace->WriteTrace("SetParam","eType = %d, eValue = %d",eType, eValue);
  342. switch (eType)
  343. {
  344. case EPP_PT_SET_ENCRYPT_METHOD:
  345. if (eValue == EPP_ALGO_METHOD_DES)
  346. {
  347. m_Encryptmethod = 0;
  348. }
  349. else if (eValue == EPP_ALGO_METHOD_3DES)
  350. {
  351. m_Encryptmethod = 1;
  352. }
  353. else if (eValue == EPP_ALGO_METHOD_DES_TMK)
  354. {
  355. m_Encryptmethod = 2;
  356. }
  357. else if (eValue == EPP_ALGO_METHOD_3DES_TMK)
  358. {
  359. m_Encryptmethod = 3;
  360. }
  361. else if (eValue == EPP_ALGO_METHOD_SM4)
  362. {
  363. m_Encryptmethod = 4;
  364. }
  365. else
  366. {
  367. m_trace->WriteTrace("SetParam","EPP_PT_SET_ENCRYPT_METHOD中的eValue值不符合");
  368. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  369. strcpy(m_Error.szErrMsg,"参数错误");
  370. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  371. return Error_Param;
  372. }
  373. break;
  374. case EPP_PT_SET_MAC_ALGORITH:
  375. if (eValue == EPP_MAC_ALGO_ASNIX99)
  376. {
  377. if (m_Encryptmethod == 0) //DES
  378. {
  379. m_MacAlgorithm = 1;
  380. }
  381. else if (m_Encryptmethod == 1) //3DES
  382. {
  383. m_MacAlgorithm = 2;
  384. }
  385. else if (m_Encryptmethod == 4) //SM4
  386. {
  387. m_MacAlgorithm = 3;
  388. }
  389. }
  390. else if (eValue == EPP_MAC_ALGO_PBOC)
  391. {
  392. m_trace->WriteTrace("SetParam","不支持除了EPP_MAC_ALGO_ASNIX99以外的其它MAC算法");
  393. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  394. strcpy(m_Error.szErrMsg,"不支持的算法");
  395. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  396. return Error_NoPrivilege;
  397. }
  398. else if (eValue == EPP_MAC_ALGO_UNIONPAY)
  399. {
  400. m_trace->WriteTrace("SetParam","不支持除了EPP_MAC_ALGO_ASNIX99以外的其它MAC算法");
  401. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  402. strcpy(m_Error.szErrMsg,"不支持的算法");
  403. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  404. return Error_NoPrivilege;
  405. }
  406. else
  407. {
  408. m_trace->WriteTrace("SetParam","EPP_PT_SET_MAC_ALGORITH的eValue值不符合");
  409. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  410. strcpy(m_Error.szErrMsg,"参数错误");
  411. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  412. return Error_Param;
  413. }
  414. break;
  415. case EPP_PT_SET_PIN_ALGORITH:
  416. if (eValue == EPP_PIN_ALGO_ISO9564_1_ANSI)
  417. {
  418. //确定为ANSI算法
  419. m_PinAlgorithm = 1; //ANSI算法
  420. }
  421. else if (eValue == EPP_PIN_ALGO_IBM3624)
  422. {
  423. //确定为IBM3624算法
  424. m_PinAlgorithm = 2; //IBM3624算法
  425. }
  426. else if (eValue == EPP_PIN_ALGO_SM4)
  427. {
  428. m_PinAlgorithm = 3;
  429. }
  430. else
  431. {
  432. m_trace->WriteTrace("SetParam","EPP_PT_SET_PIN_ALGORITH的eValue值不符合");
  433. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  434. strcpy(m_Error.szErrMsg,"参数错误");
  435. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  436. return Error_Param;
  437. }
  438. break;
  439. case EPP_PT_SET_ECB_CBC_MODE:
  440. if (eValue == EPP_ALGO_MODE_ECB || eValue == EPP_ALGO_MODE_DEC_ECB || eValue == EPP_ALGO_MODE_3DEC_ECB)
  441. {
  442. m_ECB_CBC_Mode = 1;
  443. }
  444. else if (eValue == EPP_ALGO_MODE_CBC || eValue == EPP_ALGO_MODE_DEC_CBC || eValue == EPP_ALGO_MODE_3DEC_CBC)
  445. {
  446. m_ECB_CBC_Mode = 2;
  447. }
  448. else
  449. {
  450. m_trace->WriteTrace("SetParam","EPP_PT_SET_ECB_CBC_MODE的eValue值不符合");
  451. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  452. strcpy(m_Error.szErrMsg,"参数错误");
  453. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  454. return Error_Param;
  455. }
  456. break;
  457. default:
  458. m_trace->WriteTrace("SetParam","参数错误");
  459. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  460. strcpy(m_Error.szErrMsg,"参数错误");
  461. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  462. return Error_Param;
  463. break;
  464. }
  465. m_trace->WriteTrace("SetParam", "Exit-");
  466. return Error_Succeed;
  467. }
  468. ErrorCodeEnum PinPadNantian::SetAccNo(AccountInfo accInfo)
  469. {
  470. m_trace->WriteTrace("SetAccNo","Enter-");
  471. m_trace->WriteTrace("SetAccNo","accInfo.dwAccLen = %d", accInfo.dwAccLen);
  472. m_trace->WriteTrace(CILIXTRACE_L_DEBUG, "SetAccNo", "accInfo.account = %s", accInfo.account);
  473. if (accInfo.dwAccLen < 0 || accInfo.dwAccLen > 12)
  474. {
  475. m_trace->WriteTrace("SetAccNo","输入的客户账号长度错误,账号长度为 accInfo.dwAccLen = %d",
  476. accInfo.dwAccLen);
  477. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  478. strcpy(m_Error.szErrMsg,"参数错误");
  479. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  480. m_trace->WriteTrace("SetAccNo", "Exit-");
  481. return Error_Param;
  482. }
  483. if (accInfo.account == NULL)
  484. {
  485. m_trace->WriteTrace("SetAccNo","输入的客户账号为空");
  486. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  487. strcpy(m_Error.szErrMsg,"参数为空");
  488. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  489. m_trace->WriteTrace("SetAccNo", "Exit-");
  490. return Error_Null;
  491. }
  492. g_CardNo.dwAccLen = accInfo.dwAccLen;
  493. memset(g_CardNo.account,0,sizeof(g_CardNo.account));
  494. memcpy(g_CardNo.account,accInfo.account,accInfo.dwAccLen);
  495. strcpy(m_Error.szErrMsg,"设置账户信息成功");
  496. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  497. m_trace->WriteTrace("SetAccNo", "Exit-");
  498. return Error_Succeed;
  499. }
  500. ErrorCodeEnum PinPadNantian::LoadMasterKey(MasterKeyParam masterKey)
  501. {
  502. m_trace->WriteTrace("LoadMasterKey","Enter-");
  503. m_trace->WriteTrace("LoadMasterKey", "masterKey.dwMasterSN = %d", masterKey.dwSN);
  504. m_trace->WriteTrace(CILIXTRACE_L_DEBUG, "LoadMasterKey", "masterKey.key = %s", masterKey.key);
  505. if (m_Open != TRUE)
  506. {
  507. m_trace->WriteTrace("LoadMasterKey","设备未打开,不能做加载主密钥操作");
  508. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  509. strcpy(m_Error.szErrMsg,"设备未打开");
  510. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  511. m_trace->WriteTrace("LoadMasterKey", "Exit-");
  512. return Error_NotInit;
  513. }
  514. if ((masterKey.smFlag != 0 && masterKey.smFlag != 1) || (masterKey.key == NULL) ||
  515. (masterKey.dwSN < 0 ))
  516. {
  517. m_trace->WriteTrace("LoadMasterKey","输入参数错误或为空");
  518. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  519. strcpy(m_Error.szErrMsg,"输入参数错误或为空");
  520. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  521. m_trace->WriteTrace("LoadMasterKey", "Exit-");
  522. return Error_Param;
  523. }
  524. //压缩数据
  525. unsigned char fswData[1025] = "";
  526. CILIX_AUX_X::CILIX_uti_pack((unsigned char*)masterKey.key, fswData, 32);
  527. //导入
  528. if (masterKey.smFlag == 1)//国密
  529. {
  530. if (masterKey.dwSN < 0 || masterKey.dwSN > 12 || masterKey.key == NULL)
  531. {
  532. m_trace->WriteTrace("LoadMasterKey","国密:输入秘钥号超出键盘规定的最大值");
  533. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  534. strcpy(m_Error.szErrMsg,"输入参数错误");
  535. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  536. m_trace->WriteTrace("LoadMasterKey", "Exit-");
  537. return Error_Param;
  538. }
  539. unsigned char fResult[1025] = "";
  540. int sret = SUNSON_LoadSM4Key(masterKey.dwSN, 65535, 0x27, 16, (unsigned char*)fswData,
  541. fResult);
  542. m_trace->WriteTrace("LoadMasterKey","国密:加载主密钥操作返回值sret = %d,fResult[0] = 0x%02x",
  543. sret,fResult[0]);
  544. if (sret != 1)
  545. {
  546. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  547. strcpy(m_Error.szErrMsg,"导入SM4主密钥失败");
  548. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  549. m_trace->WriteTrace("LoadMasterKey", "Exit-");
  550. return Error_Hardware;
  551. }
  552. m_trace->WriteTrace("LoadMasterKey","国密:加载主密钥操作成功");
  553. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  554. strcpy(m_Error.szErrMsg,"操作成功");
  555. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  556. return Error_Succeed;
  557. }
  558. else
  559. {
  560. masterKey.dwSN += 10;
  561. if (masterKey.dwSN < 0 || masterKey.dwSN > 63 || masterKey.key == NULL)
  562. {
  563. m_trace->WriteTrace("LoadMasterKey","非国密:输入秘钥号超出键盘规定的最大值");
  564. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  565. strcpy(m_Error.szErrMsg,"输入参数错误");
  566. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  567. m_trace->WriteTrace("LoadMasterKey", "Exit-");
  568. return Error_Param;
  569. }
  570. unsigned char fResult[1025] = "";
  571. int sret = SUNSON_LoadUserKey(masterKey.dwSN, 65535, 0x27, 16, (unsigned char*)fswData, fResult);
  572. m_trace->WriteTrace("LoadMasterKey","非国密:invoke SUNSON_LoadUserKey,sret = %d,fResult[0] = 0x%02x",sret,fResult[0]);
  573. if (sret != 1)
  574. {
  575. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  576. strcpy(m_Error.szErrMsg,"导入3DES主密钥失败");
  577. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  578. m_trace->WriteTrace("LoadMasterKey", "Exit-");
  579. return Error_Hardware;
  580. }
  581. m_trace->WriteTrace("LoadMasterKey","非国密:加载3DES主密钥操作成功");
  582. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  583. strcpy(m_Error.szErrMsg,"操作成功");
  584. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  585. m_trace->WriteTrace("LoadMasterKey", "Exit-");
  586. return Error_Succeed;
  587. }
  588. }
  589. ErrorCodeEnum PinPadNantian::LoadWorkingKey(WorkKeyParam wkKey)
  590. {
  591. m_trace->WriteTrace("LoadWorkingKey","Enter-");
  592. m_trace->WriteTrace("LoadWorkingKey","wkKey.dwMasterSN = %d, wkKey.dwWorkingSN = %d",
  593. wkKey.dwMasterSN, wkKey.dwWorkingSN);
  594. m_trace->WriteTrace(CILIXTRACE_L_DEBUG, "LoadWorkingKey","wkKey.key = %s", wkKey.key);
  595. if (m_Open != TRUE)
  596. {
  597. m_trace->WriteTrace("LoadWorkingKey","设备未打开,不能做加载主密钥操作");
  598. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  599. strcpy(m_Error.szErrMsg,"设备未打开");
  600. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  601. m_trace->WriteTrace("LoadWorkingKey", "Exit-");
  602. return Error_NotInit;
  603. }
  604. if ((wkKey.smFlag != 0 && wkKey.smFlag != 1) || (wkKey.dwMasterSN < 0 || wkKey.dwWorkingSN < 0) || (wkKey.key == NULL))
  605. {
  606. m_trace->WriteTrace("LoadWorkingKey","输入参数错误或为空");
  607. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  608. strcpy(m_Error.szErrMsg,"输入参数错误或为空");
  609. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  610. m_trace->WriteTrace("LoadWorkingKey", "Exit-");
  611. return Error_Param;
  612. }
  613. unsigned char fswData[1025] = "";
  614. CILIX_AUX_X::CILIX_uti_pack((unsigned char*)wkKey.key, fswData, 32);
  615. if (wkKey.smFlag == 1)//国密
  616. {
  617. wkKey.dwWorkingSN += 2;
  618. if (wkKey.dwWorkingSN <0 || wkKey.dwWorkingSN > 12 || wkKey.dwMasterSN < 0 || wkKey.dwMasterSN > 12 || wkKey.key == NULL)
  619. {
  620. m_trace->WriteTrace("LoadWorkingKey","国密:输入秘钥号处理后,超出键盘规定的最大值输入秘钥号");
  621. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  622. strcpy(m_Error.szErrMsg,"输入参数错误");
  623. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  624. return Error_Param;
  625. }
  626. //导入
  627. unsigned char fResult[1025] = "";
  628. int sret = SUNSON_LoadSM4Key(wkKey.dwWorkingSN, wkKey.dwMasterSN, 0x07, 16, fswData, fResult);
  629. m_trace->WriteTrace("LoadWorkingKey","国密:加载工作密钥操作返回值sret = %d,fResult[0] = 0x%02x",sret,fResult[0]);
  630. if (sret != 1)
  631. {
  632. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  633. strcpy(m_Error.szErrMsg,"导入SM4工作密钥失败");
  634. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  635. m_trace->WriteTrace("LoadWorkingKey", "Exit-");
  636. return Error_Hardware;
  637. }
  638. m_trace->WriteTrace("LoadWorkingKey","国密:加载SM4工作密钥操作成功");
  639. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  640. strcpy(m_Error.szErrMsg,"操作成功");
  641. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  642. return Error_Succeed;
  643. }
  644. else
  645. {
  646. wkKey.dwWorkingSN += 11;
  647. wkKey.dwMasterSN += 10;
  648. if (wkKey.dwWorkingSN <0 || wkKey.dwWorkingSN > 64 || wkKey.dwMasterSN < 0 || wkKey.dwMasterSN > 32 || wkKey.key == NULL)
  649. {
  650. m_trace->WriteTrace("LoadWorkingKey","非国密:超出键盘规定的最大值输入秘钥号");
  651. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  652. strcpy(m_Error.szErrMsg,"输入参数错误");
  653. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  654. m_trace->WriteTrace("LoadWorkingKey", "Exit-");
  655. return Error_Param;
  656. }
  657. unsigned char fResult[1025] = "";
  658. int sret = SUNSON_LoadUserKey(wkKey.dwWorkingSN, wkKey.dwMasterSN, 0x07, 16, (unsigned char*)fswData, fResult);
  659. m_trace->WriteTrace("LoadWorkingKey","非国密:invoke SUNSON_LoadUserKey,sret = %d,fResult[0] = 0x%02x",sret,fResult[0]);
  660. if (sret != 1)
  661. {
  662. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  663. strcpy(m_Error.szErrMsg,"导入3DES工作密钥失败");
  664. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  665. m_trace->WriteTrace("LoadWorkingKey", "Exit-");
  666. return Error_Hardware;
  667. }
  668. m_trace->WriteTrace("LoadWorkingKey","非国密:加载3DES工作密钥操作成功");
  669. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  670. strcpy(m_Error.szErrMsg,"操作成功");
  671. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  672. m_trace->WriteTrace("LoadWorkingKey", "Exit-");
  673. return Error_Succeed;
  674. }
  675. }
  676. ErrorCodeEnum PinPadNantian::ActiveWorkingKey(DWORD dwMkSN, DWORD dwWkSN)
  677. {
  678. m_trace->WriteTrace("ActiveWorkingKey","Enter-");
  679. m_trace->WriteTrace("ActiveWorkingKey","dwMkSN = %d,dwWkSN = %d",dwMkSN,dwWkSN);
  680. if (m_Open != TRUE)
  681. {
  682. m_trace->WriteTrace("ActiveWorkingKey", "设备未打开,不能做激活工作秘钥操作");
  683. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  684. strcpy(m_Error.szErrMsg,"设备未打开");
  685. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  686. m_trace->WriteTrace("ActiveWorkingKey", "Exit-");
  687. return Error_NotInit;
  688. }
  689. g_dwMkSN = dwMkSN;
  690. g_dwWkSN = dwWkSN;
  691. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  692. strcpy(m_Error.szErrMsg,"操作成功");
  693. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  694. m_trace->WriteTrace("ActiveWorkingKey", "Exit-");
  695. return Error_Succeed;
  696. }
  697. ErrorCodeEnum PinPadNantian::StartPinInput(BYTE byLen)
  698. {
  699. m_trace->WriteTrace("StartPinInput","Enter-");
  700. if (m_Open != TRUE)
  701. {
  702. m_trace->WriteTrace("StartPinInput","设备未打开,不能做Pin输入操作");
  703. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  704. strcpy(m_Error.szErrMsg,"设备未打开");
  705. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  706. m_trace->WriteTrace("StartPinInput", "Exit-");
  707. return Error_NotInit;
  708. }
  709. char fResult[1025] = "";
  710. SUNSON_SetKeyMark(0x1FFF, 0, 0, 0, (unsigned char*)fResult);
  711. //重置输入位数
  712. m_PinNum = 0;
  713. g_flag = 1;//标记是密文输入
  714. g_Auto = 1;//标记自动结束
  715. memset(fResult,0,sizeof(fResult));
  716. //激活密码输入
  717. int iret = SUNSON_GetPin(1, 6, 0x01, (unsigned char*)fResult);
  718. m_trace->WriteTrace("StartPinInput", "invoke SUNSON_GetPin return %d, fResult[0] = 0x%02x", iret, fResult[0]);
  719. if (iret != 1)
  720. {
  721. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  722. strcpy(m_Error.szErrMsg,"开启密文输入失败");
  723. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  724. m_trace->WriteTrace("StartPinInput", "Exit-");
  725. return Error_Hardware;
  726. }
  727. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  728. strcpy(m_Error.szErrMsg,"操作成功");
  729. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  730. m_trace->WriteTrace("StartPinInput", "Exit-");
  731. return Error_Succeed;
  732. }
  733. ErrorCodeEnum PinPadNantian::StartPinInputConfirm(BYTE byLen)
  734. {
  735. m_trace->WriteTrace("StartPinInputConfirm","Enter-");
  736. if (m_Open != TRUE)
  737. {
  738. m_trace->WriteTrace("StartPinInputConfirm","设备未打开,不能做Pin输入操作");
  739. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  740. strcpy(m_Error.szErrMsg,"设备未打开");
  741. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  742. m_trace->WriteTrace("StartPinInputConfirm", "Exit-");
  743. return Error_NotInit;
  744. }
  745. char fResult[1025] = "";
  746. SUNSON_SetKeyMark(0x1FFF, 0, 0, 0, (unsigned char*)fResult);
  747. //重置输入位数
  748. m_PinNum = 0;
  749. g_flag = 1;//标记是密文输入
  750. g_Auto = 0;//标记自动结束
  751. memset(fResult,0,sizeof(fResult));
  752. //激活密码输入
  753. int iret = SUNSON_GetPin(1, 6, 0x00, (unsigned char*)fResult);
  754. m_trace->WriteTrace("StartPinInputConfirm", "invoke SUNSON_GetPin return %d, fResult[0] = 0x%02x", iret, fResult[0]);
  755. if (iret != 1)
  756. {
  757. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  758. strcpy(m_Error.szErrMsg,"开启密文输入失败");
  759. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  760. m_trace->WriteTrace("StartPinInputConfirm", "Exit-");
  761. return Error_Hardware;
  762. }
  763. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  764. strcpy(m_Error.szErrMsg,"操作成功");
  765. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  766. m_trace->WriteTrace("StartPinInputConfirm", "Exit-");
  767. return Error_Succeed;
  768. }
  769. ErrorCodeEnum PinPadNantian::StartPlainInput()
  770. {
  771. m_trace->WriteTrace("StartPlainInput","Enter-");
  772. if (m_Open != TRUE)
  773. {
  774. m_trace->WriteTrace("StartPlainInput","设备未打开,不能做明文输入操作");
  775. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  776. strcpy(m_Error.szErrMsg,"设备未打开");
  777. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  778. m_trace->WriteTrace("StartPlainInput", "Exit-");
  779. return Error_NotInit;
  780. }
  781. char fResult[1025] = "";
  782. SUNSON_SetKeyMark(0x1AFFF, 0, 0, 0, (unsigned char*)fResult);
  783. g_flag = 0;//标记是明文输入
  784. //激活密码输入
  785. memset(fResult, 0, sizeof(fResult));
  786. int iret = SUNSON_UseEppPlainTextMode(0,0,(unsigned char*)fResult);
  787. m_trace->WriteTrace("StartPlainInput", "invoke SUNSON_UseEppPlainTextMode return %d, fResult[0] = 0x%02x", iret,fResult[0]);
  788. if (iret != 1)
  789. {
  790. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  791. strcpy(m_Error.szErrMsg,"开启明文输入失败");
  792. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  793. m_trace->WriteTrace("StartPlainInput", "Exit-");
  794. return Error_Hardware;
  795. }
  796. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  797. strcpy(m_Error.szErrMsg,"操作成功");
  798. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  799. m_trace->WriteTrace("StartPlainInput", "Exit-");
  800. return Error_Succeed;
  801. }
  802. ErrorCodeEnum PinPadNantian::StopInput()
  803. {
  804. m_trace->WriteTrace("StopInput","Enter-");
  805. if (m_Open != TRUE)
  806. {
  807. m_trace->WriteTrace("StopInput","设备未打开,直接返回");
  808. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  809. strcpy(m_Error.szErrMsg,"设备未打开");
  810. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  811. m_trace->WriteTrace("StopInput", "Exit-");
  812. return Error_NotInit;
  813. }
  814. unsigned char fResult[1025] = "";
  815. int iret = SUNSON_CloseEppPlainTextMode(fResult);
  816. m_trace->WriteTrace("StopInput","执行SUNSON_CloseEppPlainTextMode返回%d,fResult[0] = 0x%02x",iret,fResult[0]);
  817. if (iret == 0)
  818. {
  819. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  820. strcpy(m_Error.szErrMsg,"键盘关闭失败");
  821. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  822. m_trace->WriteTrace("StopInput", "Exit-");
  823. return Error_DevCommFailed;
  824. }
  825. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  826. strcpy(m_Error.szErrMsg,"键盘关闭成功");
  827. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  828. m_trace->WriteTrace("StopInput", "Exit-");
  829. return Error_Succeed;
  830. }
  831. ErrorCodeEnum PinPadNantian::GetPinBlock(PinBlock &block)
  832. {
  833. m_trace->WriteTrace("GetPinBlock","Enter-");
  834. if (m_Open != TRUE)
  835. {
  836. m_trace->WriteTrace("GetPinBlock","设备未打开,不能做GetPinBlock操作");
  837. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  838. strcpy(m_Error.szErrMsg,"设备未打开");
  839. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  840. m_trace->WriteTrace("GetPinBlock", "Exit-");
  841. return Error_NotInit;
  842. }
  843. m_trace->WriteTrace("GetPinBlock","g_dwWkSN = %d",g_dwWkSN);
  844. int WkSN = 0;
  845. if (m_PinAlgorithm == 3)
  846. {
  847. char ReturnInfo[100] = "";
  848. int sret = SUNSON_SwitchArithmetic(2, (unsigned char *)ReturnInfo);
  849. m_trace->WriteTrace("GetPinBlock","国密:invoke SUNSON_SwitchArithmetic,sret = %d, ReturnInfo[0] = 0x%02x",sret, ReturnInfo[0]);
  850. if (sret != 1)
  851. {
  852. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  853. strcpy(m_Error.szErrMsg,"切换国密算法失败");
  854. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  855. m_trace->WriteTrace("GetPinBlock", "Exit-");
  856. return Error_DevMedia;
  857. }
  858. if(g_dwWkSN == 99)
  859. {
  860. WkSN = g_dwMkSN;
  861. }
  862. else
  863. {
  864. WkSN = g_dwWkSN + 2;
  865. }
  866. }
  867. else
  868. {
  869. char ReturnInfo[100] = "";
  870. int sret = SUNSON_SwitchArithmetic(0, (unsigned char *)ReturnInfo);
  871. m_trace->WriteTrace("GetPinBlock","非国密:invoke SUNSON_SwitchArithmetic,sret = %d, ReturnInfo[0] = 0x%02x",sret, ReturnInfo[0]);
  872. if (sret != 1)
  873. {
  874. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  875. strcpy(m_Error.szErrMsg,"切换非国密算法失败");
  876. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  877. m_trace->WriteTrace("GetPinBlock", "Exit-");
  878. return Error_DevMedia;
  879. }
  880. if(g_dwWkSN == 99)
  881. {
  882. WkSN = g_dwMkSN;
  883. }
  884. else
  885. {
  886. WkSN = g_dwWkSN + 11;
  887. }
  888. }
  889. unsigned char fResult[1025] = "";
  890. //计算PINBLOCK
  891. int sret = SUNSON_GetPinBlock(WkSN,0x02,0x0F,g_CardNo.dwAccLen,(unsigned char*)g_CardNo.account,fResult);
  892. m_trace->WriteTrace("GetPinBlock", "invoke SUNSON_GetPinBlock return %d,f_result[0] = 0x%02X", sret,fResult[0]);
  893. memset(block.data,0,sizeof(block.data));
  894. if(sret > 0)
  895. {
  896. //扩展并拷贝计算结果
  897. CILIX_AUX_X::CILIX_uti_unpack(fResult, (unsigned char*)block.data, sret);
  898. block.dwSize = sret*2;
  899. m_trace->WriteTrace("GetPinBlock","GetPinBlock操作成功");
  900. m_trace->WriteTrace(CILIXTRACE_L_DEBUG, "GetPinBlock", "block.data=%s",block.data);
  901. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  902. strcpy(m_Error.szErrMsg,"操作成功");
  903. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  904. m_trace->WriteTrace("GetPinBlock", "Exit-");
  905. return Error_Succeed;
  906. }
  907. else
  908. {
  909. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  910. strcpy(m_Error.szErrMsg,"获取pinblock失败");
  911. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  912. m_trace->WriteTrace("EncryptData", "Exit-");
  913. return Error_Hardware;
  914. }
  915. }
  916. ErrorCodeEnum PinPadNantian::EncryptData(EnDecryptInfo srcInfo, EnDecryptInfo &destInfo)
  917. {
  918. m_trace->WriteTrace("EncryptData","Enter-");
  919. m_trace->WriteTrace("EncryptData","srcInfo.dwSize = %d",srcInfo.dwSize);
  920. m_trace->WriteTrace(CILIXTRACE_L_DEBUG,"EncryptData","srcInfo.data = %s",srcInfo.data);
  921. if (m_Open != TRUE)
  922. {
  923. m_trace->WriteTrace("EncryptData","设备未打开,不能做GetPinBlock操作");
  924. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  925. strcpy(m_Error.szErrMsg,"设备未打开");
  926. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  927. m_trace->WriteTrace("EncryptData", "Exit-");
  928. return Error_NotInit;
  929. }
  930. if (srcInfo.data == NULL)
  931. {
  932. m_trace->WriteTrace("EncryptData","EncryptData输入参数srcInfo.data为空");
  933. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  934. strcpy(m_Error.szErrMsg,"输入参数为空");
  935. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  936. m_trace->WriteTrace("EncryptData", "Exit-");
  937. return Error_Null;
  938. }
  939. if (srcInfo.dwSize % 16 !=0 || srcInfo.dwSize % 8 !=0)
  940. {
  941. m_trace->WriteTrace("EncryptData","EncryptData输入参数srcInfo.dwSize不是8或16的整数倍");
  942. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  943. strcpy(m_Error.szErrMsg,"输入参数错误");
  944. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  945. m_trace->WriteTrace("EncryptData", "Exit-");
  946. return Error_Param;
  947. }
  948. //压缩数据
  949. unsigned char fswData[1025] = "";
  950. CILIX_AUX_X::CILIX_uti_pack((unsigned char*)srcInfo.data, fswData, srcInfo.dwSize);
  951. int WkSN = 0;
  952. if (m_Encryptmethod == 4)
  953. {
  954. char ReturnInfo[100] = "";
  955. int sret = SUNSON_SwitchArithmetic(2, (unsigned char *)ReturnInfo);
  956. m_trace->WriteTrace("EncryptData","国密:invoke SUNSON_SwitchArithmetic,sret = %d, ReturnInfo[0] = 0x%02x",sret, ReturnInfo[0]);
  957. if (sret != 1)
  958. {
  959. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  960. strcpy(m_Error.szErrMsg,"切换国密算法失败");
  961. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  962. m_trace->WriteTrace("EncryptData", "Exit-");
  963. return Error_DevMedia;
  964. }
  965. if(g_dwWkSN == 99)
  966. {
  967. WkSN = g_dwMkSN;
  968. }
  969. else
  970. {
  971. WkSN = g_dwWkSN + 2;
  972. }
  973. }
  974. else
  975. {
  976. char ReturnInfo[100] = "";
  977. int sret = SUNSON_SwitchArithmetic(0, (unsigned char *)ReturnInfo);
  978. m_trace->WriteTrace("EncryptData","非国密:invoke SUNSON_SwitchArithmetic,sret = %d, ReturnInfo[0] = 0x%02x",sret, ReturnInfo[0]);
  979. if (sret != 1)
  980. {
  981. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  982. strcpy(m_Error.szErrMsg,"切换非国密算法失败");
  983. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  984. m_trace->WriteTrace("EncryptData", "Exit-");
  985. return Error_DevMedia;
  986. }
  987. if(g_dwWkSN == 99)
  988. {
  989. WkSN = g_dwMkSN + 10;
  990. }
  991. else
  992. {
  993. WkSN = g_dwWkSN + 11;
  994. }
  995. }
  996. int mode = 0;
  997. if (m_Encryptmethod == 0)
  998. {
  999. if(m_ECB_CBC_Mode == 1)
  1000. {
  1001. mode = 1;
  1002. }
  1003. if(m_ECB_CBC_Mode == 2)
  1004. {
  1005. mode = 2;
  1006. }
  1007. }
  1008. if (m_Encryptmethod == 1)
  1009. {
  1010. if(m_ECB_CBC_Mode == 1)
  1011. {
  1012. mode = 0x40;
  1013. }
  1014. if(m_ECB_CBC_Mode == 2)
  1015. {
  1016. mode = 0x80;
  1017. }
  1018. }
  1019. if (m_Encryptmethod == 4)
  1020. {
  1021. if(m_ECB_CBC_Mode == 1)
  1022. {
  1023. mode = 0x40;
  1024. }
  1025. if(m_ECB_CBC_Mode == 2)
  1026. {
  1027. mode = 0x80;
  1028. }
  1029. }
  1030. //加密结果
  1031. BYTE crypt_out[1024*100] = "";
  1032. char sresult[2050] = "";
  1033. //计算
  1034. int sret = SUNSON_DataCompute(WkSN,0x01,mode,0X00,srcInfo.dwSize/2,fswData,(unsigned char*)sresult);
  1035. m_trace->WriteTrace("EncryptData", "EncryptData操作返回值sret = %d,sresult[0] = 0x%02x",sret,sresult[0]);
  1036. if (sret > 0)
  1037. {
  1038. //拷贝输出结果
  1039. memcpy(crypt_out, sresult,sret);
  1040. memset(destInfo.data, 0, 512);
  1041. CILIX_AUX_X::CILIX_uti_unpack((BYTE*)crypt_out, (BYTE*)destInfo.data, sret);
  1042. destInfo.dwSize = sret*2;
  1043. m_trace->WriteTrace("EncryptData", "EncryptData操作成功, destInfo.dwSize=%d",destInfo.dwSize);
  1044. m_trace->WriteTrace(CILIXTRACE_L_DEBUG, "EncryptData", "destInfo.data = %s",destInfo.data);
  1045. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  1046. strcpy(m_Error.szErrMsg,"操作成功");
  1047. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  1048. m_trace->WriteTrace("EncryptData", "Exit-");
  1049. return Error_Succeed;
  1050. }
  1051. else
  1052. {
  1053. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  1054. strcpy(m_Error.szErrMsg,"加密失败");
  1055. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  1056. m_trace->WriteTrace("EncryptData", "Exit-");
  1057. return Error_Hardware;
  1058. }
  1059. }
  1060. ErrorCodeEnum PinPadNantian::MacEncrypt(EnDecryptInfo srcInfo, EnDecryptInfo &destInfo)
  1061. {
  1062. m_trace->WriteTrace("MacEncrypt","Enter-");
  1063. m_trace->WriteTrace("MacEncrypt","srcInfo.dwSize = %d",srcInfo.dwSize);
  1064. m_trace->WriteTrace(CILIXTRACE_L_DEBUG,"MacEncrypt","srcInfo.data = %s",srcInfo.data);
  1065. if (m_Open != TRUE)
  1066. {
  1067. m_trace->WriteTrace("MacEncrypt","设备未打开,不能做GetMAC操作");
  1068. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  1069. strcpy(m_Error.szErrMsg,"设备未打开");
  1070. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  1071. m_trace->WriteTrace("MacEncrypt", "Exit-");
  1072. return Error_NotInit;
  1073. }
  1074. if (srcInfo.data == NULL)
  1075. {
  1076. m_trace->WriteTrace("MacEncrypt","MacEncrypt输入参数srcInfo.data为空");
  1077. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  1078. strcpy(m_Error.szErrMsg,"输入参数为空");
  1079. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  1080. m_trace->WriteTrace("MacEncrypt", "Exit-");
  1081. return Error_Null;
  1082. }
  1083. if (srcInfo.dwSize % 16 !=0 || srcInfo.dwSize % 8 !=0)
  1084. {
  1085. m_trace->WriteTrace("MacEncrypt","MacEncrypt输入参数srcInfo.dwSize不是8或16的整数倍");
  1086. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  1087. strcpy(m_Error.szErrMsg,"输入参数错误");
  1088. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  1089. m_trace->WriteTrace("MacEncrypt", "Exit-");
  1090. return Error_Param;
  1091. }
  1092. //压缩数据
  1093. unsigned char fswData[1025] = "";
  1094. CILIX_AUX_X::CILIX_uti_pack((unsigned char*)srcInfo.data, fswData, srcInfo.dwSize);
  1095. int WkSN = 0;
  1096. if (m_MacAlgorithm == 3)
  1097. {
  1098. char ReturnInfo[100] = "";
  1099. int sret = SUNSON_SwitchArithmetic(2, (unsigned char *)ReturnInfo);
  1100. m_trace->WriteTrace("MacEncrypt","国密:invoke SUNSON_SwitchArithmetic,sret = %d, ReturnInfo[0] = 0x%02x",sret, ReturnInfo[0]);
  1101. if (sret != 1)
  1102. {
  1103. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  1104. strcpy(m_Error.szErrMsg,"切换国密算法失败");
  1105. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  1106. m_trace->WriteTrace("MacEncrypt", "Exit-");
  1107. return Error_DevMedia;
  1108. }
  1109. WkSN = g_dwWkSN + 2;
  1110. }
  1111. else
  1112. {
  1113. char ReturnInfo[100] = "";
  1114. int sret = SUNSON_SwitchArithmetic(0, (unsigned char *)ReturnInfo);
  1115. m_trace->WriteTrace("MacEncrypt","非国密:invoke SUNSON_SwitchArithmetic,sret = %d, ReturnInfo[0] = 0x%02x",sret, ReturnInfo[0]);
  1116. if (sret != 1)
  1117. {
  1118. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  1119. strcpy(m_Error.szErrMsg,"切换非国密算法失败");
  1120. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  1121. m_trace->WriteTrace("MacEncrypt", "Exit-");
  1122. return Error_DevMedia;
  1123. }
  1124. WkSN = g_dwWkSN + 11;
  1125. }
  1126. int mode = 0;
  1127. if (m_MacAlgorithm == 1)
  1128. {
  1129. mode = 0x20;
  1130. }
  1131. if (m_MacAlgorithm == 2)
  1132. {
  1133. mode = 0x0200;
  1134. }
  1135. if (m_MacAlgorithm == 3)
  1136. {
  1137. mode = 0x0200;
  1138. }
  1139. //加密结果
  1140. BYTE crypt_out[1024*100] = "";
  1141. char sresult[2050] = "";
  1142. //计算
  1143. int sret = SUNSON_MakeMac(WkSN,mode,srcInfo.dwSize/2,fswData,(unsigned char*)sresult);
  1144. m_trace->WriteTrace("MacEncrypt", "MacEncrypt操作返回值sret = %d,sresult[0] = 0x%02x",sret,sresult[0]);
  1145. if (sret > 0)
  1146. {
  1147. //拷贝输出结果
  1148. memcpy(crypt_out, sresult,sret);
  1149. memset(destInfo.data, 0, 512);
  1150. CILIX_AUX_X::CILIX_uti_unpack((BYTE*)crypt_out, (BYTE*)destInfo.data, sret);
  1151. destInfo.dwSize = sret*2;
  1152. m_trace->WriteTrace("EncryptData", "MacEncrypt操作成功,destInfo.dwSize=%d",destInfo.dwSize);
  1153. m_trace->WriteTrace(CILIXTRACE_L_DEBUG, "EncryptData", "destInfo.data = %s",destInfo.data);
  1154. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  1155. strcpy(m_Error.szErrMsg,"操作成功");
  1156. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  1157. m_trace->WriteTrace("MacEncrypt", "Exit-");
  1158. return Error_Succeed;
  1159. }
  1160. else
  1161. {
  1162. memset(m_Error.szErrMsg,0,sizeof(m_Error.szErrMsg));
  1163. strcpy(m_Error.szErrMsg,"加密失败");
  1164. m_Error.dwErrMsgLen = strlen(m_Error.szErrMsg);
  1165. m_trace->WriteTrace("MacEncrypt", "Exit-");
  1166. return Error_Hardware;
  1167. }
  1168. }
  1169. int PinPadNantian::GetEncryptFunc()
  1170. {
  1171. return 3;
  1172. }