PinPadClassImpl_ZT598M.cpp 66 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888
  1. #include "PinPadClassImpl_ZT598M.h"
  2. #include <cstdio>
  3. #define DES_KEY_NAME_PREFIX "DESKey"
  4. #define SM_KEY_NAME_PREFIX "SMKey"
  5. #define MASTER_KEY_NAEM_LABEL "MASTER"
  6. #define WORKING_KEY_NAEM_LABEL "WORKING"
  7. #define INTERNAL_TEST_KEY "InternalTestKey"
  8. #define PINPAD_TYPE_M1FD "ZT598-M1FD-H16"
  9. #define KEYBOARD_CODE_LIST \
  10. '1', '2', '3', 0x1B,\
  11. '4', '5', '6', 0x08,\
  12. '7', '8', '9', 0x20,\
  13. '.', '0', 0x4F, 0x0D,\
  14. 0x47, 0x42, 0x45, 0x44,\
  15. 0x43, 0x46, 0x41, 0x48
  16. #define MAX_AEL_KEY 8
  17. #define BLOCK_SIZE 256
  18. #define LOG_LEVEL_NONE (0x7FFFFFFF)
  19. typedef struct _key_ael
  20. {
  21. WORD wEnlargeId; //密钥的固件ID
  22. WORD wVI;
  23. DWORD dwKeyAttr;
  24. }AELKEY, *LPAELKEY;
  25. typedef struct _key_use_ael
  26. {
  27. WORD wAppId; //花瓶,密钥组ID,也是索引,范围?0 ~ (MAX_MAP_KEY - 1)
  28. WORD wKeyLen;
  29. DWORD dwKeyAttr;
  30. WORD wEnKeyId;
  31. WORD wEnKeyLen;
  32. AELKEY stKey[MAX_AEL_KEY];
  33. // char szKeyName[MAX_KEY_NAME + 1];
  34. char szKeyValue[24];
  35. }ARTKEY, *LPARTKEY;
  36. //乿2号为起始,先写这个文件头
  37. typedef struct _file_ael_head
  38. {
  39. DWORD dwFileLen;
  40. BYTE ucFlag;
  41. BYTE ucReserve;
  42. }AELFILE, *LPAELFILE; //写入EPP的用户数据区时,会多写这个文件头再写Enlargekey.dat的数拿
  43. extern EPPExchangeDataField m_stExchangeSendData;
  44. extern EPPExchangeDataField m_stExchangeReceiveData;
  45. CINIAccess g_iniAccess;
  46. LOG_EXTERN()
  47. int getFileVer(char* sFile, short &ch1, short &ch2)
  48. {
  49. ch1 = 0;
  50. ch2 = 0;
  51. char* pFind = strstr(sFile, ".so");
  52. char* pTemp = pFind;
  53. while(pTemp)
  54. {
  55. pFind = pTemp;
  56. pTemp = strstr(pFind + 3, ".so");
  57. }
  58. if(pFind == nullptr) return 0;
  59. pTemp = pFind - 1;
  60. while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
  61. if(*pTemp == '.')
  62. ch2 = atoi(pTemp + 1);
  63. pTemp--;
  64. while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
  65. if(*pTemp == '.')
  66. ch1 = atoi(pTemp + 1);
  67. return 1;
  68. }
  69. PinPadClassImpl::PinPadClassImpl() :
  70. m_bDevOpen(FALSE),
  71. m_bConfirm(FALSE),
  72. m_bSM(FALSE),
  73. m_wCryptDataAlgorithm(PIN_CRYPT_CBC),
  74. m_wCryptMacAlgorithm(PIN_CRYPTTRIDESMAC),
  75. m_byPattern(PIN_CRYPT_TDES)
  76. {
  77. LOG_FUNCTION();
  78. m_LPPinpadStatus=new PinpadStatus;
  79. memset(m_LPPinpadStatus,0x00,sizeof (PinpadStatus));
  80. memset(&m_cfgSP, 0x00, sizeof(m_cfgSP));
  81. memset(&m_pinpadReadData, 0x00, sizeof(m_pinpadReadData));
  82. memset(m_szMainChipSN, 0x00, sizeof(m_szMainChipSN));
  83. LogM("PinPad PinPadClassImpl creat function()! version:202104130936");
  84. ZT598M1FD_DevCtrl = NULL;
  85. ZT598M1FD_DevCtrl=new CZT598M1FD_DevCtrl();
  86. if(ZT598M1FD_DevCtrl == NULL)
  87. {
  88. LogM("ZT598M1FD_DevCtrl = NULL");
  89. }
  90. }
  91. PinPadClassImpl::~PinPadClassImpl()
  92. {
  93. LOG_FUNCTION();
  94. if (ZT598M1FD_DevCtrl != NULL)
  95. {
  96. delete ZT598M1FD_DevCtrl;
  97. ZT598M1FD_DevCtrl = NULL;
  98. }
  99. return;
  100. }
  101. ErrorCodeEnum PinPadClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
  102. {
  103. LOG_FUNCTION();
  104. LogM("<==Enter PinPadClassImpl::GetDevCategory()");
  105. CHAR szHardwareSN[16] = {0};
  106. CHAR szTemp[128] = {0};
  107. memset(devCategory.szType, 0, MAX_DEV_TYPE_LEN);
  108. memset(devCategory.szModel, 0, MAX_DEV_MODEL_LEN);
  109. memset(devCategory.szVendor, 0, MAX_DEV_VENDOR_LEN);
  110. memset(&devCategory.version, 0, sizeof(devCategory.version));
  111. //PinpadStatus stPinpadStatus;
  112. //if(m_bDevOpen)
  113. //if(ZT598M1FD_DevCtrl->GetDevStatus(&stPinpadStatus) == STATUS_SUCCESS)
  114. if(ZT598M1FD_DevCtrl->GetDevStatus(m_LPPinpadStatus) == STATUS_SUCCESS)
  115. {
  116. sprintf(devCategory.szType, "PVER=SZZT#MID=keba.PinPad.%s-%s", m_sDevModel, m_sSMVer);
  117. sprintf(devCategory.szModel, "PM=V2.0#PID=%s#MID=%s#FWID=%s%s", m_szMainChipSN, m_szMainChipSN, m_sDevModel+(strlen(m_sDevModel) - 4), m_sSMVer+(strlen(m_sSMVer) - 4));
  118. sprintf(devCategory.szVendor,"keba");
  119. }
  120. else
  121. {
  122. sprintf(devCategory.szType, "PVER=SZZT#MID=");
  123. sprintf(devCategory.szModel, "PM=V2.0#PID=#MID=#FWID=");
  124. sprintf(devCategory.szVendor,"keba");
  125. }
  126. switch(m_LPPinpadStatus->wDevState)
  127. {
  128. case DEV_NORMAL:
  129. devCategory.eState = DEVICE_STATUS_NORMAL;
  130. break;
  131. case DEV_HWERR:
  132. devCategory.eState = DEVICE_STATUS_FAULT;
  133. break;
  134. case DEV_OFFLINE:
  135. devCategory.eState = DEVICE_STATUS_NOT_READY;
  136. break;
  137. default:
  138. devCategory.eState = DEVICE_STATUS_NOT_READY;
  139. break;
  140. }
  141. char sPath[256], sFile[128] = {0};
  142. GetCurModulePath(sPath, sFile);
  143. short v1,v2;
  144. getFileVer(sFile, v1, v2);
  145. /*
  146. devCategory.version.wMajor = v1;
  147. devCategory.version.wMinor = v2;
  148. devCategory.version.wRevision = 0xffff;
  149. devCategory.version.wBuild = FILE_VERSION;
  150. */
  151. devCategory.version.wMajor = FILE_MAJOR;
  152. devCategory.version.wMinor = FILE_MINOR;
  153. devCategory.version.wRevision = FILE_REVISION;
  154. devCategory.version.wBuild = FILE_BUILD;
  155. LogM( "devCategory.szType=%s",devCategory.szType);
  156. LogM( "devCategory.szModel=%s [0x%x]", devCategory.szModel, m_szMainChipSN[9]);
  157. LogM( "devCategory.szVendor=%s",devCategory.szVendor);
  158. LogM( "devCategory.eState=%d",devCategory.eState);
  159. LogM( "devCategory.version=%d.%d.%d.%d", devCategory.version.wMajor, devCategory.version.wMinor, devCategory.version.wRevision, devCategory.version.wBuild);
  160. LogM("==>Leave PinPadClassImpl::GetDevCategory()");
  161. return Error_Succeed;
  162. }
  163. ErrorCodeEnum PinPadClassImpl::Reset()
  164. {
  165. LOG_FUNCTION();
  166. LogM("<==Enter PinPadClassImpl::Reset()");
  167. ErrorCodeEnum eRet = Error_Succeed;
  168. LONG lRet = STATUS_SUCCESS;
  169. m_bDevOpen = FALSE;
  170. lRet = ZT598M1FD_DevCtrl->CloseDevice();
  171. if(lRet != STATUS_SUCCESS)
  172. {
  173. SaveErrorInfo(lRet, __FUNCTION__, __LINE__);
  174. }
  175. LogM("==>Leave PinPadClassImpl::Reset() = %d", lRet);
  176. return DevOpen(0, 0);
  177. }
  178. ErrorCodeEnum PinPadClassImpl::DevClose()
  179. {
  180. LOG_FUNCTION();
  181. LogM("<==Enter PinPadClassImpl::DevClose()");
  182. ZT598M1FD_DevCtrl->CloseDevice();
  183. LogM("==>Leave PinPadClassImpl::DevClose()");
  184. return Error_Succeed;
  185. }
  186. ErrorCodeEnum PinPadClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
  187. {
  188. LOG_FUNCTION();
  189. LogM("<==Enter PinPadClassImpl::GetLastErr()");
  190. devErrInfo.dwErrMsgLen = m_devErrInfo.dwErrMsgLen;
  191. memset(devErrInfo.szErrMsg, 0, sizeof(devErrInfo.szErrMsg));
  192. sprintf(devErrInfo.szErrMsg, m_devErrInfo.szErrMsg);
  193. LogM("==>Leave PinPadClassImpl::GetLastErr()");
  194. return Error_Succeed;
  195. }
  196. ErrorCodeEnum PinPadClassImpl::DevOpen(DWORD dwPort, DWORD dwBaudRate)
  197. {
  198. LOG_FUNCTION();
  199. LogM("<==Enter PinPadClassImpl::DevOpen(dwPort=%d, dwBaudRate=%d)", dwPort, dwBaudRate);
  200. BYTE byBuffer[256] = {0};
  201. SYSTEMTIME systemTime;
  202. LONG lRet = STATUS_SUCCESS;
  203. BOOL bRet = FALSE;
  204. //ErrorCodeEnum bRet=Error_Succeed;
  205. ReadEPPInfoResponse stReadEPPInfoRes;
  206. //LOG4VTM_FUNCTION();
  207. if (ReadPinpadConfig(&ZT598M1FD_DevCtrl->m_stPinpadDevConfig, &m_cfgSP) == FALSE)
  208. {
  209. LogE("ReadPinpadConfig() failed");
  210. LogM("==>Leave PinPadClassImpl::DevOpen() return Error_Param");
  211. return Error_Param;
  212. }
  213. lRet = ZT598M1FD_DevCtrl->InitDevice(m_sDevModel, sizeof(m_sDevModel), m_sSMVer, sizeof(m_sSMVer), m_szMainChipSN, sizeof(m_szMainChipSN));
  214. if(lRet != STATUS_SUCCESS)
  215. {
  216. LogM("==>Leave PinPadClassImpl::DevOpen(): InitDevice()=%d", lRet);
  217. return SaveErrorInfo(lRet, __FUNCTION__, __LINE__);
  218. }
  219. //根据能力调整硬件配置
  220. //设置硬件配置参数
  221. lRet = ZT598M1FD_DevCtrl->SetDeviceConfigure(m_cfgDev, m_LPPinpadStatus);
  222. if(lRet != STATUS_SUCCESS)
  223. {
  224. LogM("==>Leave PinPadClassImpl::DevOpen(): SetDeviceConfigure=%d", lRet);
  225. return SaveErrorInfo(lRet, __FUNCTION__, __LINE__);
  226. }
  227. if(PIN_INSTALL== m_cfgSP.byRemoveInstall||PIN_REMOVE==m_cfgSP.byRemoveInstall)
  228. {
  229. lRet=ZT598M1FD_DevCtrl->RemoveInstallAuthen(m_cfgSP.byRemoveInstall,&systemTime,m_LPPinpadStatus);
  230. if(ERR_PIN_PHYSICALLY_UNINSTALLED==lRet||ERR_PIN_LOGICALLY_UNINSTALLED==lRet)
  231. {
  232. LogM("==>Leave PinPadClassImpl::DevOpen():RemoveInstallAuthen=%d", lRet);
  233. return SaveErrorInfo(lRet, __FUNCTION__, __LINE__);
  234. }
  235. if (STATUS_SUCCESS==lRet && PIN_REMOVE == m_cfgSP.byRemoveInstall)
  236. {
  237. LogM("==>Leave PinPadClassImpl::DevOpen():AuthRemove OK");
  238. return Error_Succeed;
  239. }
  240. //软复位?
  241. m_bNeedInitialization = FALSE;
  242. if (ZT598M1FD_DevCtrl->AuthenticateAllKeys(FALSE, m_LPPinpadStatus) == FALSE)
  243. {
  244. m_bNeedInitialization = TRUE;
  245. ZT598M1FD_DevCtrl->DevReset(PIN_HARD_RESET_ALL, m_LPPinpadStatus);
  246. }
  247. }
  248. //ZT598M1FD_DevCtrl->DevReset(PIN_HARD_RESET_ALL, m_LPPinpadStatus);
  249. m_bDevOpen = TRUE;
  250. LogM("==>Leave PinPadClassImpl::DevOpen() return Error_Succeed");
  251. return Error_Succeed;
  252. }
  253. ErrorCodeEnum PinPadClassImpl::KeyRead(BYTE &ch)
  254. {
  255. LOG_FUNCTION();
  256. LONG lRet = STATUS_SUCCESS;
  257. LogM("<==Enter PinPadClassImpl::KeyRead()");
  258. ErrorCodeEnum ret = Error_Succeed;
  259. LogM("KeyRead():");
  260. BYTE byData[9] = {0};
  261. DWORD dwDataLen = sizeof(byData);
  262. BYTE byCurrentChar = 0;
  263. DWORD dwCoveredDataSize = 0;
  264. if(!m_bDevOpen)
  265. {
  266. memset(m_szErrMsg, 0x00, sizeof (m_szErrMsg));
  267. strcpy(m_szErrMsg, "ERR_PIN_DEVNOTOPEN设备未打开");
  268. ret = SaveErrorInfo(ERR_PIN_DEVNOTOPEN, __FUNCTION__, __LINE__);
  269. goto END_LABEL;
  270. }
  271. dwDataLen = ZT598M1FD_DevCtrl->ReadEntryText(byData, sizeof(byData));
  272. //if ReadEntryText= success
  273. {
  274. if (dwDataLen > 0)
  275. {
  276. LogM("PinPad input:%s; len:%d", byData, dwDataLen);
  277. }
  278. dwCoveredDataSize = m_pinpadReadData.dwSize % MAX_PIN_READ_SIZE;
  279. if (dwCoveredDataSize + dwDataLen > MAX_PIN_READ_SIZE)//缓冲区将要溢兿
  280. {
  281. memcpy(m_pinpadReadData.data + dwCoveredDataSize, byData, MAX_PIN_READ_SIZE - dwCoveredDataSize);//填满缓冲区尾避
  282. LogM("m_pinpadReadData.data buffer full!");
  283. memcpy(m_pinpadReadData.data, byData + MAX_PIN_READ_SIZE - dwCoveredDataSize, dwDataLen - (MAX_PIN_READ_SIZE - dwCoveredDataSize)); //剩余数据复写到缓冲区墿
  284. }
  285. else
  286. {
  287. memcpy(m_pinpadReadData.data + dwCoveredDataSize, byData, dwDataLen);
  288. }
  289. m_pinpadReadData.dwSize += dwDataLen;
  290. if (m_pinpadReadData.dwSize - m_pinpadReadData.dwCurrentRead > MAX_PIN_READ_SIZE)
  291. {
  292. LogM("Error! Data is covered!");
  293. }
  294. if (m_nCurrentEntryMode == PIN_ENTRY)
  295. {
  296. LogM("==>Leave PinPadClassImpl::KeyRead()");
  297. return PinRead(ch);
  298. }
  299. if (m_pinpadReadData.dwCurrentRead + 1 <= m_pinpadReadData.dwSize && m_nCurrentEntryMode == TEXT_ENTRY)
  300. {
  301. byCurrentChar = m_pinpadReadData.data[m_pinpadReadData.dwCurrentRead % MAX_PIN_READ_SIZE];
  302. m_pinpadReadData.dwCurrentRead++;
  303. if (0x30 <= byCurrentChar && byCurrentChar <= 0x39 ||
  304. byCurrentChar == 0x2e || //'.'
  305. byCurrentChar == 0x4f || //'00'
  306. byCurrentChar == 0x20 || //空白钿
  307. byCurrentChar == 0x1b || //cancel
  308. byCurrentChar == 0x08 || //clear
  309. byCurrentChar == 0x0d ) //confirm
  310. {
  311. ch = byCurrentChar;
  312. //sensitive info
  313. LogM("KeyRead: return char:(0x%02x)", ch);
  314. LogM("pinpadReadData.data:%s pinpadReadData.dwSize:%d pinpadReadData.dwCurrentRead:%d", m_pinpadReadData.data, m_pinpadReadData.dwSize, m_pinpadReadData.dwCurrentRead);
  315. return Error_Succeed;
  316. }
  317. else
  318. {
  319. //special char
  320. LogM("KeyRead: return special char:(0x%02x) ", byCurrentChar);
  321. switch (byCurrentChar)
  322. {
  323. case 0x80:
  324. memset(m_szErrMsg, 0x00, sizeof (m_szErrMsg));
  325. strcpy(m_szErrMsg, "ERR_PIN_PRESS_KEY_OVERTIME长按键");
  326. ret = SaveErrorInfo(ERR_PIN_PRESS_KEY_OVERTIME, __FUNCTION__, __LINE__);
  327. break;
  328. case 0x82:
  329. default:
  330. memset(m_szErrMsg, 0x00, sizeof (m_szErrMsg));
  331. strcpy(m_szErrMsg, "ERR_PIN_KEY_CODE_NOT_FOUND硬件返回不认识的按键值");
  332. ret = SaveErrorInfo(ERR_PIN_KEY_CODE_NOT_FOUND, __FUNCTION__, __LINE__);
  333. break;
  334. }
  335. return ret;
  336. }
  337. }
  338. else
  339. {
  340. ret = Error_DevCommFailed;
  341. LogM("No Key Input!!!!");
  342. LogM("==>Leave PinPadClassImpl::KeyRead()");
  343. return Error_DevCommFailed;
  344. }
  345. }
  346. /*
  347. else
  348. {
  349. SaveErrorInfo(lRet, __FUNCTION__, __LINE__);
  350. return Error_DevNotAvailable;
  351. }
  352. */
  353. END_LABEL:
  354. LogM("<==Leave PinPadClassImpl::KeyRead()return %d", ret);
  355. return ret;
  356. }
  357. ErrorCodeEnum PinPadClassImpl::PinRead(BYTE &ch)
  358. {
  359. LOG_FUNCTION();
  360. LogM("==>Enter PinPadClassImpl::PinRead()");
  361. ErrorCodeEnum ret = Error_Succeed;
  362. LONG lRet = STATUS_SUCCESS;
  363. BYTE byCurrentChar = 0;
  364. DWORD i = 0;
  365. BYTE byData[9] = {0};
  366. DWORD dwDataLen = sizeof(byData);
  367. if (m_pinpadReadData.dwCurrentRead < m_pinpadReadData.dwSize && m_nCurrentEntryMode == PIN_ENTRY)
  368. {
  369. byCurrentChar = m_pinpadReadData.data[m_pinpadReadData.dwCurrentRead];
  370. m_pinpadReadData.dwCurrentRead++;
  371. if (byCurrentChar == 0x00)//数字钿
  372. {
  373. m_nCurrentPinLen++;
  374. if (m_nCurrentPinLen < m_nMaxPinLen)
  375. {
  376. ch = 0x3f;
  377. }
  378. else if (m_nCurrentPinLen == m_nMaxPinLen)
  379. {
  380. ch = 0x3f;
  381. if (!m_bConfirm)//bconfirm == false,应该结束输入不需要等待按确认钿
  382. {
  383. for (i = m_pinpadReadData.dwCurrentRead; i < m_pinpadReadData.dwSize; i++)
  384. {
  385. byCurrentChar = m_pinpadReadData.data[m_pinpadReadData.dwCurrentRead];
  386. m_pinpadReadData.dwCurrentRead++;
  387. if (byCurrentChar == 0x00)
  388. {
  389. ZT598M1FD_DevCtrl->DelEntryPinKey(DELETE_LAST_ENTERED, m_LPPinpadStatus);
  390. }
  391. }
  392. lRet = ZT598M1FD_DevCtrl->SetEntryMode(CLOSE_ENTRY, 0xFFFF, 0xFFFF);
  393. //lRet = ZT598M1FD_DevCtrl->SetControlMode(CONTROL_MODE_SBS, eBeep); //close sound
  394. m_nCurrentEntryMode = CLOSE_ENTRY;
  395. }
  396. }
  397. else//超过最大输入长帿
  398. {
  399. lRet = ZT598M1FD_DevCtrl->DelEntryPinKey(DELETE_LAST_ENTERED, m_LPPinpadStatus);
  400. m_nCurrentPinLen = m_nMaxPinLen;
  401. LogM("Exceed the maximum length.");
  402. memset(m_szErrMsg, 0x00, sizeof (m_szErrMsg));
  403. strcpy(m_szErrMsg, "STATUS_INVALID_PIN_LENGTH输入的按键数量错误");
  404. ret = SaveErrorInfo(STATUS_INVALID_PIN_LENGTH, __FUNCTION__, __LINE__);
  405. goto END_LABEL;
  406. }
  407. }
  408. else if (byCurrentChar == 0x1B || byCurrentChar == 0x08)//取消Cancel || 清除Clear(BackSpace)
  409. {
  410. ch = byCurrentChar;
  411. for (i = 0; i < (DWORD)m_nCurrentPinLen; i++)
  412. {
  413. ZT598M1FD_DevCtrl->DelEntryPinKey(DELETE_LAST_ENTERED, m_LPPinpadStatus);
  414. }
  415. m_nCurrentPinLen = 0;
  416. }
  417. else if (byCurrentChar == 0x0D || byCurrentChar == 0x2A) //确认Enter
  418. {
  419. ch = byCurrentChar;
  420. if (m_bConfirm)
  421. {
  422. for (i = m_pinpadReadData.dwCurrentRead; i < m_pinpadReadData.dwSize; i++)
  423. {
  424. byCurrentChar = m_pinpadReadData.data[m_pinpadReadData.dwCurrentRead];
  425. m_pinpadReadData.dwCurrentRead++;
  426. if (byCurrentChar == 0x00)
  427. {
  428. ZT598M1FD_DevCtrl->DelEntryPinKey(DELETE_LAST_ENTERED, m_LPPinpadStatus);
  429. }
  430. }
  431. lRet = ZT598M1FD_DevCtrl->SetEntryMode(CLOSE_ENTRY, 0xFFFF, 0xFFFF);
  432. //lRet = ZT598M1FD_DevCtrl->SetControlMode(CONTROL_MODE_SBS, eBeep); //close sound
  433. m_nCurrentEntryMode = CLOSE_ENTRY;
  434. }
  435. }
  436. else if (byCurrentChar == 0x2e || byCurrentChar == 0x4f)//'.' || '00'
  437. {
  438. ch = 0x3d;
  439. }
  440. else
  441. {
  442. //special char
  443. LogM("KeyRead: return special char:(0x%02x) ", byCurrentChar);
  444. switch (byCurrentChar)
  445. {
  446. case 0x80:
  447. memset(m_szErrMsg, 0x00, sizeof (m_szErrMsg));
  448. strcpy(m_szErrMsg, "ERR_PIN_PRESS_KEY_OVERTIME长按键");
  449. ret = SaveErrorInfo(ERR_PIN_PRESS_KEY_OVERTIME, __FUNCTION__, __LINE__);
  450. break;
  451. case 0x81:
  452. if (m_nCurrentPinLen == 0)
  453. {
  454. memset(m_szErrMsg, 0x00, sizeof (m_szErrMsg));
  455. strcpy(m_szErrMsg, "ERR_PIN_TIMEOUT等待按键超时");
  456. ret = SaveErrorInfo(ERR_PIN_TIMEOUT, __FUNCTION__, __LINE__);
  457. }
  458. else
  459. {
  460. memset(m_szErrMsg, 0x00, sizeof (m_szErrMsg));
  461. strcpy(m_szErrMsg, "ERR_PIN_TIMEOUT两次按键间隔时间超时");
  462. ret = SaveErrorInfo(ERR_PIN_TIMEOUT, __FUNCTION__, __LINE__);
  463. }
  464. break;
  465. default:
  466. memset(m_szErrMsg, 0x00, sizeof (m_szErrMsg));
  467. strcpy(m_szErrMsg, "ERR_PIN_KEY_CODE_NOT_FOUND硬件返回不认识的按键值");
  468. ret = SaveErrorInfo(ERR_PIN_KEY_CODE_NOT_FOUND, __FUNCTION__, __LINE__);
  469. break;
  470. }
  471. goto END_LABEL;
  472. }
  473. //sensitive info
  474. LogM("PinRead: return char:(0x%02x)", ch);
  475. LogM("pinpadReadData.dwSize:%d pinpadReadData.dwCurrentRead:%d", m_pinpadReadData.dwSize, m_pinpadReadData.dwCurrentRead);
  476. goto END_LABEL;
  477. }
  478. else
  479. {
  480. //no key pressed
  481. memset(m_szErrMsg, 0x00, sizeof (m_szErrMsg));
  482. strcpy(m_szErrMsg, "STATUS_PIN_NOPIN无按键输入");
  483. ret = SaveErrorInfo(STATUS_PIN_NOPIN, __FUNCTION__, __LINE__);
  484. goto END_LABEL;
  485. }
  486. END_LABEL:
  487. LogM("<==Leave PinPadClassImpl::PinRead() return %d", ret);
  488. return ret;
  489. }
  490. ErrorCodeEnum PinPadClassImpl::StartPinInputCommon(BYTE byLen)
  491. {
  492. LOG_FUNCTION();
  493. LogM("==>Enter PinPadClassImpl::StartPinInputCommon()");
  494. LogM("byLen=%d", byLen);
  495. ErrorCodeEnum ret = Error_Succeed;
  496. LONG lRet = STATUS_SUCCESS;
  497. BYTE byData[9] = {0};
  498. DWORD dwDataLen = 0;
  499. BYTE byTextBufer[256] = {0};
  500. int iConfirm = m_bConfirm ? 1 : 0;
  501. BOOL bBeep = m_nCurrentEntryMode == TEXT_ENTRY? m_cfgSP.bGetDataBeep:m_cfgSP.bGetPinBeep;
  502. ControlCodeBeep eBeep = bBeep?OPEN_BEEP_SOUND:CLOSE_BEEP_SOUND;
  503. if(!m_bDevOpen)
  504. {
  505. lRet = ERR_PIN_DEVNOTOPEN;
  506. LogM("PinPad:Device not open");
  507. goto END_LABEL;
  508. }
  509. LogM("StartInput Mode: %s", m_nCurrentEntryMode == PIN_ENTRY ? "ENTRY_MODE_PIN" : m_nCurrentEntryMode == TEXT_ENTRY? "ENTRY_MODE_TEXT" : "ENTRY_MODE_ELSE");
  510. if (m_nCurrentEntryMode != TEXT_ENTRY && byLen == 0)
  511. {
  512. lRet = ERR_PARAM_ERROR;
  513. goto END_LABEL;
  514. }
  515. m_nCurrentPinLen = 0;
  516. m_nMaxPinLen = byLen;
  517. m_pinpadReadData.dwSize = 0;
  518. m_pinpadReadData.dwCurrentRead = 0;
  519. memset(m_pinpadReadData.data, 0x00, MAX_PIN_READ_SIZE);
  520. //清除缓冲势
  521. lRet = ZT598M1FD_DevCtrl->SetEntryMode(CLOSE_ENTRY, 0xFFFF, 0xFFFF);
  522. if(lRet != STATUS_SUCCESS)
  523. {
  524. ret = SaveErrorInfo(lRet, __FUNCTION__, __LINE__);
  525. goto END_LABEL;
  526. }
  527. lRet = ZT598M1FD_DevCtrl->ReadEntryText(byTextBufer, sizeof(byTextBufer));
  528. if(lRet != STATUS_SUCCESS)
  529. {
  530. goto END_LABEL;
  531. }
  532. lRet = ZT598M1FD_DevCtrl->SetControlMode(CONTROL_MODE_SBS, eBeep);
  533. if(lRet != STATUS_SUCCESS)
  534. {
  535. goto END_LABEL;
  536. }
  537. lRet = ZT598M1FD_DevCtrl->SetEntryMode(m_nCurrentEntryMode, 0x0000, 0x0000);
  538. if(lRet != STATUS_SUCCESS)
  539. {
  540. goto END_LABEL;
  541. }
  542. END_LABEL:
  543. if(lRet != STATUS_SUCCESS)
  544. {
  545. ret = SaveErrorInfo(lRet, __FUNCTION__, __LINE__);
  546. }
  547. LogM("<==Leave PinPadClassImpl::StartPinInputCommon()return %d", ret);
  548. return ret;
  549. }
  550. ErrorCodeEnum PinPadClassImpl::StartPinInput(BYTE byLen)
  551. {
  552. LogM("==>Enter PinPadClassImpl::StartPinInput()");
  553. LogM("byLen=%d", byLen);
  554. ErrorCodeEnum ret = Error_Succeed;
  555. LONG lRet = STATUS_SUCCESS;
  556. m_bConfirm = FALSE;
  557. m_nCurrentEntryMode = PIN_ENTRY;
  558. ret = StartPinInputCommon(byLen);
  559. LogM("<==Leave PinPadClassImpl::StartPinInput()return %d", ret);
  560. return ret;
  561. }
  562. ErrorCodeEnum PinPadClassImpl::StartPinInputConfirm(BYTE byLen)
  563. {
  564. LOG_FUNCTION();
  565. LogM("==>Enter PinPadClassImpl::StartPinInputConfirm()");
  566. LogM("byLen=%d", byLen);
  567. ErrorCodeEnum ret = Error_Succeed;
  568. LONG lRet = STATUS_SUCCESS;
  569. m_bConfirm = TRUE;
  570. m_nCurrentEntryMode = PIN_ENTRY;
  571. lRet = StartPinInputCommon(byLen);
  572. if(lRet != STATUS_SUCCESS)
  573. {
  574. ret = SaveErrorInfo(lRet, __FUNCTION__, __LINE__);
  575. goto END_LABEL;
  576. }
  577. END_LABEL:
  578. LogM("<==Leave PinPadClassImpl::StartPinInputConfirm()return %d", ret);
  579. return ret;
  580. }
  581. ErrorCodeEnum PinPadClassImpl::StartPlainInput()
  582. {
  583. LOG_FUNCTION();
  584. LogM("==>Enter PinPadClassImpl::StartPlainInput()");
  585. ErrorCodeEnum ret = Error_Succeed;
  586. LONG lRet = STATUS_SUCCESS;
  587. if(!m_bDevOpen)
  588. {
  589. memset(m_szErrMsg, 0x00, sizeof (m_szErrMsg));
  590. strcpy(m_szErrMsg, "ERR_PIN_DEVNOTOPEN设备未打开");
  591. ret = SaveErrorInfo(ERR_PIN_DEVNOTOPEN, __FUNCTION__, __LINE__);
  592. LogM("PinPad:Device not open");
  593. goto END_LABEL;
  594. }
  595. m_nCurrentEntryMode = TEXT_ENTRY;
  596. lRet = StartPinInputCommon(0);
  597. if(lRet != STATUS_SUCCESS)
  598. {
  599. ret = SaveErrorInfo(lRet, __FUNCTION__, __LINE__);
  600. goto END_LABEL;
  601. }
  602. END_LABEL:
  603. LogM("<==Leave PinPadClassImpl::StartPlainInput() return %d", ret);
  604. return ret;
  605. }
  606. ErrorCodeEnum PinPadClassImpl::StopInput()
  607. {
  608. LOG_FUNCTION();
  609. LogM("==>Enter PinPadClassImpl::StopInput()");
  610. ErrorCodeEnum ret = Error_Succeed;
  611. LONG lRet = STATUS_SUCCESS;
  612. if(!m_bDevOpen)
  613. {
  614. memset(m_szErrMsg, 0x00, sizeof (m_szErrMsg));
  615. strcpy(m_szErrMsg, "ERR_PIN_DEVNOTOPEN设备未打开");
  616. ret = SaveErrorInfo(ERR_PIN_DEVNOTOPEN, __FUNCTION__, __LINE__);
  617. LogM("PinPad:Device not open");
  618. goto END_LABEL;
  619. }
  620. m_bConfirm = false;
  621. m_pinpadReadData.dwSize = 0;
  622. m_pinpadReadData.dwCurrentRead = 0;
  623. memset(m_pinpadReadData.data, 0x00, MAX_PIN_READ_SIZE);
  624. lRet = ZT598M1FD_DevCtrl->SetEntryMode(CLOSE_ENTRY, 0xFFFF, 0xFFFF);
  625. m_nCurrentEntryMode = CLOSE_ENTRY;
  626. {
  627. ret = SaveErrorInfo(lRet, __FUNCTION__, __LINE__);
  628. goto END_LABEL;
  629. }
  630. END_LABEL:
  631. LogM("<==Leave PinPadClassImpl::StopInput()return %d", ret);
  632. return ret;
  633. }
  634. ErrorCodeEnum PinPadClassImpl::LoadMasterKey(MasterKeyParam masterKey)
  635. {
  636. LOG_FUNCTION();
  637. ErrorCodeEnum ret = Error_Succeed;
  638. LogM("==>Enter PinPadClassImpl::LoadMasterKey()");
  639. LogM( "masterKey.smFlag=%d masterKey.dwSN=%d masterkey.keylength=%d", masterKey.smFlag, masterKey.dwSN, strlen((CHAR*)masterKey.key));
  640. LONG lRet = STATUS_SUCCESS;
  641. CHAR szKeyName[32] = {0};
  642. BOOL bSM = masterKey.smFlag;
  643. BYTE byValue[MAX_MASTER_KEY_SIZE / 2] = {0};
  644. //DevCtrl LoadKey Param
  645. WORD wKeyType = bSM? KEY_TYPE_SM4:KEY_TYPE_DES;
  646. LPSTR lpsKeyName = szKeyName;
  647. LPSTR lpsEncKeyName = NULL;
  648. DWORD dwUse = 0;
  649. LPBYTE lpbKeyData = byValue;
  650. USHORT usKeyLength = 0;
  651. WORD wKeyCheckMode = PIN_KCVNONE;
  652. LPBYTE lpbKCVData = NULL;
  653. USHORT usKCVLength = 0;
  654. BYTE byKCV[SHORT_BUFF_SIZE_3] = {0};
  655. WORD wKCVLen = sizeof(byKCV);
  656. if(!m_bDevOpen)
  657. {
  658. memset(m_szErrMsg, 0x00, sizeof (m_szErrMsg));
  659. strcpy(m_szErrMsg, "ERR_PIN_DEVNOTOPEN设备未打开");
  660. ret = SaveErrorInfo(ERR_PIN_DEVNOTOPEN, __FUNCTION__, __LINE__);
  661. LogM("PinPad:Device not open");
  662. goto END_LABEL;
  663. }
  664. if (masterKey.smFlag > 1 || masterKey.smFlag < 0)
  665. {
  666. memset(m_szErrMsg, 0x00, sizeof (m_szErrMsg));
  667. sprintf(m_szErrMsg, "ERR_PARAM_ERROR参数错误masterKey.smFlag=%d", masterKey.smFlag);
  668. ret = SaveErrorInfo(ERR_PARAM_ERROR, __FUNCTION__, __LINE__);
  669. LogM("PinPad:masterkey.smFlag is invalid param");
  670. return Error_Param;
  671. }
  672. //keyName
  673. sprintf(szKeyName, "%s%s%d", bSM? SM_KEY_NAME_PREFIX : DES_KEY_NAME_PREFIX, MASTER_KEY_NAEM_LABEL, masterKey.dwSN);
  674. //KeyValue
  675. usKeyLength = CDataConvert::StringToHex((CHAR*)masterKey.key, sizeof(masterKey.key), byValue, sizeof(byValue));
  676. //KeyUse
  677. dwUse = ATTR_MK /*| (bSM ? ATTR_SM4 : 0)*/;
  678. lRet = ZT598M1FD_DevCtrl->LoadKey(wKeyType, lpsKeyName, dwUse, lpbKeyData, usKeyLength,
  679. wKeyCheckMode, lpsEncKeyName, lpbKCVData, usKCVLength, byKCV, wKCVLen, m_LPPinpadStatus);
  680. if(lRet != STATUS_SUCCESS)
  681. {
  682. ret = SaveErrorInfo(lRet, __FUNCTION__, __LINE__);
  683. goto END_LABEL;
  684. }
  685. END_LABEL:
  686. LogM("<==Leave PinPadClassImpl::LoadMasterKey()return %d", ret);
  687. return ret;
  688. }
  689. ErrorCodeEnum PinPadClassImpl::LoadWorkingKey(WorkKeyParam wkKey)
  690. {
  691. LOG_FUNCTION();
  692. ErrorCodeEnum ret = Error_Succeed;
  693. LogM("==>Enter PinPadClassImpl::LoadWorkingKey()");
  694. LogM( "wkKey.smFlag=%d wkKey.dwWorkingSN=%d wkKey.dwMasterSN=%d swkKey.keylength=%d", wkKey.smFlag, wkKey.dwWorkingSN, wkKey.dwMasterSN, strlen((CHAR*)wkKey.key));
  695. LONG lRet = STATUS_SUCCESS;
  696. CHAR szKeyName[32] = {0};
  697. CHAR szEncKeyName[32] = {0};
  698. BOOL bSM = wkKey.smFlag;
  699. BYTE byValue[MAX_WORKING_KEY_SIZE/ 2] = {0};
  700. //DevCtrl LoadKey Param
  701. WORD wKeyType = bSM? KEY_TYPE_SM4:KEY_TYPE_DES;
  702. LPSTR lpsKeyName = szKeyName;
  703. LPSTR lpsEncKeyName = szEncKeyName;
  704. DWORD dwUse = 0;
  705. LPBYTE lpbKeyData = byValue;
  706. USHORT usKeyLength = 0;
  707. WORD wKeyCheckMode = PIN_KCVNONE;
  708. LPBYTE lpbKCVData = NULL;
  709. USHORT usKCVLength = 0;
  710. BYTE byKCV[SHORT_BUFF_SIZE_3] = {0};
  711. WORD wKCVLen = sizeof(byKCV);
  712. if(!m_bDevOpen)
  713. {
  714. memset(m_szErrMsg, 0x00, sizeof (m_szErrMsg));
  715. strcpy(m_szErrMsg, "ERR_PIN_DEVNOTOPEN设备未打开");
  716. ret = SaveErrorInfo(ERR_PIN_DEVNOTOPEN, __FUNCTION__, __LINE__);
  717. LogM("PinPad:Device not open");
  718. goto END_LABEL;
  719. }
  720. if (wkKey.smFlag > 1 || wkKey.smFlag < 0)
  721. {
  722. memset(m_szErrMsg, 0x00, sizeof (m_szErrMsg));
  723. sprintf(m_szErrMsg, "ERR_PARAM_ERROR参数错误masterKey.smFlag=%d", wkKey.smFlag);
  724. ret = SaveErrorInfo(ERR_PARAM_ERROR, __FUNCTION__, __LINE__);
  725. LogM("PinPad:wkKey.smFlag is invalid param");
  726. return Error_Param;
  727. }
  728. //keyName
  729. sprintf(szKeyName, "%s%s%d", bSM? SM_KEY_NAME_PREFIX : DES_KEY_NAME_PREFIX, WORKING_KEY_NAEM_LABEL, wkKey.dwWorkingSN);
  730. sprintf(szEncKeyName, "%s%s%d", bSM? SM_KEY_NAME_PREFIX : DES_KEY_NAME_PREFIX, MASTER_KEY_NAEM_LABEL, wkKey.dwMasterSN);
  731. //KeyValue
  732. usKeyLength = CDataConvert::StringToHex((CHAR*)wkKey.key, sizeof(wkKey.key), byValue, sizeof(byValue));
  733. //KeyUse
  734. dwUse = ATTR_DK | ATTR_PK | ATTR_AK /*| (bSM ? ATTR_SM4 : 0)*/;
  735. lRet = ZT598M1FD_DevCtrl->LoadKey(wKeyType, lpsKeyName, dwUse, lpbKeyData, usKeyLength,
  736. wKeyCheckMode, lpsEncKeyName, lpbKCVData, usKCVLength, byKCV, wKCVLen, m_LPPinpadStatus);
  737. if(lRet != STATUS_SUCCESS)
  738. {
  739. ret = SaveErrorInfo(lRet, __FUNCTION__, __LINE__);
  740. goto END_LABEL;
  741. }
  742. END_LABEL:
  743. LogM("<==Leave PinPadClassImpl::LoadWorkingKey()return %d", ret);
  744. return ret;
  745. }
  746. ErrorCodeEnum PinPadClassImpl::ActiveWorkingKey(DWORD dwMkSN, DWORD dwWkSN)
  747. {
  748. LOG_FUNCTION();
  749. LogM("<==Enter PinPadClassImpl::ActiveWorkingKey()");
  750. LogM( "Active: dwMkSN=%d dwWkSN=%d", dwMkSN, dwWkSN);
  751. m_dwMasterKeySN = dwMkSN;
  752. m_dwWorkingKeySN = dwWkSN;
  753. LogM("<==Leave PinPadClassImpl::ActiveWorkingKey()return Error_Succeed");
  754. return Error_Succeed;
  755. }
  756. ErrorCodeEnum PinPadClassImpl::SetParam(SetParamTypeEnum eType, SetParamValueEnum eValue)
  757. {
  758. LOG_FUNCTION();
  759. LogM("<==Enter PinPadClassImpl::SetParam()");
  760. LogM("eType=%d, eValue=%d", eType, eValue);
  761. switch (eType)
  762. {
  763. case EPP_PT_SET_ENCRYPT_METHOD:
  764. m_enumEncryptMethod = eValue;
  765. switch (m_enumEncryptMethod)
  766. {
  767. case EPP_ALGO_METHOD_DES:
  768. m_bSM = FALSE;
  769. if (m_enumEcbCbcMode == EPP_ALGO_MODE_ECB)
  770. //m_wCryptDataAlgorithm = PIN_CRYPTDESECB/*CRYPT_DESECB*/;
  771. m_wCryptDataAlgorithm = PIN_CRYPT_ECB;
  772. else if (m_enumEcbCbcMode == EPP_ALGO_MODE_CBC)
  773. //m_wCryptDataAlgorithm = PIN_CRYPTDESCBC;
  774. m_wCryptDataAlgorithm = PIN_CRYPT_CBC;
  775. break;
  776. case EPP_ALGO_METHOD_3DES:
  777. m_bSM = FALSE;
  778. if (m_enumEcbCbcMode == EPP_ALGO_MODE_ECB)
  779. //m_wCryptDataAlgorithm = PIN_CRYPTTRIDESECB;
  780. m_wCryptDataAlgorithm = PIN_CRYPT_ECB;
  781. else if (m_enumEcbCbcMode == EPP_ALGO_MODE_CBC)
  782. //m_wCryptDataAlgorithm = PIN_CRYPTTRIDESCBC;
  783. m_wCryptDataAlgorithm = PIN_CRYPT_CBC;
  784. break;
  785. case EPP_ALGO_METHOD_DES_TMK:
  786. m_bSM = FALSE;
  787. m_wCryptMacAlgorithm = PIN_CRYPTDESMAC;
  788. break;
  789. case EPP_ALGO_METHOD_3DES_TMK:
  790. m_wCryptMacAlgorithm = PIN_CRYPTTRIDESMAC;
  791. break;
  792. case EPP_ALGO_METHOD_SM4:
  793. m_bSM = TRUE;
  794. if (m_enumEcbCbcMode == EPP_ALGO_MODE_ECB)
  795. m_wCryptDataAlgorithm = PIN_CRYPTSM4ECB;
  796. else if (m_enumEcbCbcMode == EPP_ALGO_MODE_CBC)
  797. m_wCryptDataAlgorithm = PIN_CRYPTSM4CBC;
  798. break;
  799. default:
  800. memset(m_szErrMsg, 0x00, sizeof (m_szErrMsg));
  801. sprintf(m_szErrMsg, "STATUS_INVALID_DATA_SPECIFIED指定了非法参数eType=%d,eValue=%d", eType, eValue);
  802. SaveErrorInfo(STATUS_INVALID_DATA_SPECIFIED, __FUNCTION__, __LINE__);
  803. return Error_Param;
  804. break;
  805. }
  806. break;
  807. case EPP_PT_SET_MAC_ALGORITH:
  808. m_bSM = FALSE;
  809. m_enumMacAlgrithm = eValue;
  810. switch (m_enumMacAlgrithm)
  811. {
  812. case EPP_MAC_ALGO_ASNIX99:
  813. m_wMacMode = MAC_99;
  814. break;
  815. case EPP_MAC_ALGO_PBOC:
  816. if (m_enumEncryptMethod == EPP_ALGO_METHOD_SM4)
  817. {
  818. m_bSM = TRUE;
  819. m_wMacMode = /*SM4_*/MAC_PBOC;
  820. }
  821. else
  822. {
  823. m_wMacMode = MAC_PBOC;
  824. }
  825. break;
  826. case EPP_MAC_ALGO_UNIONPAY:
  827. if (m_enumEncryptMethod == EPP_ALGO_METHOD_SM4)
  828. {
  829. m_bSM = TRUE;
  830. m_wMacMode = /*SM4_*/MAC_UNION_PAY;
  831. }
  832. else
  833. {
  834. m_wMacMode = MAC_UNION_PAY;
  835. }
  836. break;
  837. default:
  838. memset(m_szErrMsg, 0x00, sizeof (m_szErrMsg));
  839. sprintf(m_szErrMsg, "STATUS_INVALID_DATA_SPECIFIED指定了非法参数eType=%d,eValue=%d", eType, eValue);
  840. SaveErrorInfo(STATUS_INVALID_DATA_SPECIFIED, __FUNCTION__, __LINE__);
  841. return Error_Param;
  842. break;
  843. }
  844. break;
  845. case EPP_PT_SET_PIN_ALGORITH:
  846. m_enumPinAlgrithm = eValue;
  847. switch (m_enumPinAlgrithm)
  848. {
  849. case EPP_PIN_ALGO_ISO9564_1_ANSI:
  850. m_bSM = FALSE;
  851. m_wPinFormat = PIN_FORMANSI;
  852. break;
  853. case EPP_PIN_ALGO_IBM3624:
  854. m_bSM = FALSE;
  855. m_wPinFormat = PIN_FORM3624;
  856. break;
  857. case EPP_PIN_ALGO_SM4:
  858. m_bSM = TRUE;
  859. m_wPinFormat = PIN_FORMISO0; //TODO:WFS_PIN_FORMANSI or WFS_PIN_FORMISO0?
  860. break;
  861. default:
  862. memset(m_szErrMsg, 0x00, sizeof (m_szErrMsg));
  863. sprintf(m_szErrMsg, "STATUS_INVALID_DATA_SPECIFIED指定了非法参数eType=%d,eValue=%d", eType, eValue);
  864. SaveErrorInfo(STATUS_INVALID_DATA_SPECIFIED, __FUNCTION__, __LINE__);
  865. return Error_Param;
  866. break;
  867. }
  868. break;
  869. case EPP_PT_SET_ECB_CBC_MODE:
  870. m_enumEcbCbcMode = eValue;
  871. switch (m_enumEcbCbcMode)
  872. {
  873. case EPP_ALGO_MODE_DEC_ECB:
  874. case EPP_ALGO_MODE_3DEC_ECB:
  875. case EPP_ALGO_MODE_ECB:
  876. m_enumEcbCbcMode = EPP_ALGO_MODE_ECB;
  877. m_wCryptDataAlgorithm = PIN_CRYPT_ECB;
  878. break;
  879. case EPP_ALGO_MODE_DEC_CBC:
  880. case EPP_ALGO_MODE_3DEC_CBC:
  881. case EPP_ALGO_MODE_CBC:
  882. m_enumEcbCbcMode = EPP_ALGO_MODE_CBC;
  883. m_wCryptDataAlgorithm = PIN_CRYPT_CBC;
  884. break;
  885. default:
  886. memset(m_szErrMsg, 0x00, sizeof (m_szErrMsg));
  887. sprintf(m_szErrMsg, "STATUS_INVALID_DATA_SPECIFIED指定了非法参数eType=%d,eValue=%d", eType, eValue);
  888. SaveErrorInfo(STATUS_INVALID_DATA_SPECIFIED, __FUNCTION__, __LINE__);
  889. return Error_Param;
  890. break;
  891. }
  892. break;
  893. default:
  894. memset(m_szErrMsg, 0x00, sizeof (m_szErrMsg));
  895. sprintf(m_szErrMsg, "STATUS_INVALID_DATA_SPECIFIED指定了非法参数eType=%d,eValue=%d", eType, eValue);
  896. SaveErrorInfo(STATUS_INVALID_DATA_SPECIFIED, __FUNCTION__, __LINE__);
  897. return Error_Param;
  898. break;
  899. }
  900. switch(m_wCryptMacAlgorithm)
  901. {
  902. case PIN_CRYPTTRIDESMAC:
  903. case PIN_CRYPTTRIDESCBC:
  904. case PIN_CRYPTTRIDESECB:
  905. m_byPattern = PIN_CRYPT_TDES;
  906. break;
  907. case PIN_CRYPTDESCBC:
  908. case PIN_CRYPTDESECB:
  909. case PIN_CRYPTDESMAC:
  910. m_byPattern = PIN_CRYPT_DES;
  911. break;
  912. default:
  913. m_byPattern = PIN_CRYPT_TDES;
  914. break;
  915. }
  916. LogM("==>Leave PinPadClassImpl::SetParam()return Error_Succeed");
  917. return Error_Succeed;
  918. }
  919. ErrorCodeEnum PinPadClassImpl::EncryptData(EnDecryptInfo srcInfo, EnDecryptInfo &destInfo)
  920. {
  921. LOG_FUNCTION();
  922. LogM("<==Enter PinPadClassImpl::EncryptData()");
  923. ErrorCodeEnum ret = EncryptCommon(srcInfo, destInfo);
  924. LogM("==>Leave PinPadClassImpl::EncryptData()return %d", ret);
  925. return ret;
  926. }
  927. ErrorCodeEnum PinPadClassImpl::MacEncrypt(EnDecryptInfo srcInfo, EnDecryptInfo &destInfo)
  928. {
  929. LOG_FUNCTION();
  930. LogM("<==Enter PinPadClassImpl::MacEncrypt()");
  931. ErrorCodeEnum ret = EncryptCommon(srcInfo, destInfo, TRUE);
  932. LogM("==>Leave PinPadClassImpl::MacEncrypt()return %d", ret);
  933. return ret;
  934. }
  935. ErrorCodeEnum PinPadClassImpl::GetPinBlock(PinBlock &block)
  936. {
  937. LOG_FUNCTION();
  938. LogM("==>Enter PinPadClassImpl::GetPinBlock()");
  939. ErrorCodeEnum ret = Error_Succeed;
  940. LONG lRet = STATUS_SUCCESS;
  941. WORD wKeyType = m_bSM? KEY_TYPE_SM4:KEY_TYPE_DES;
  942. CHAR szKeyName[32] = {0};
  943. LPSTR lpsKeyName =szKeyName;
  944. WORD wFormat = PIN_FORM3624;
  945. BYTE byPadding = 0x0F;
  946. LPSTR lpsXORData = NULL;
  947. LPSTR lpsEncKeyName = NULL;
  948. BYTE byResult[SHORT_BUFF_SIZE_3] = {0};
  949. WORD wResultLen = sizeof(byResult);
  950. //GetPinBlock(wKeyType, lpsKeyName, wFormat, byPadding, (LPCTSTR)byCustomerData, lpsXORData,
  951. //lpsEncKeyName, byResult, wResultLen, &m_stEPPCtrl.devStatus);
  952. if(!m_bDevOpen)
  953. {
  954. memset(m_szErrMsg, 0x00, sizeof (m_szErrMsg));
  955. strcpy(m_szErrMsg, "ERR_PIN_DEVNOTOPEN设备未打开");
  956. ret = SaveErrorInfo(ERR_PIN_DEVNOTOPEN, __FUNCTION__, __LINE__);
  957. LogM("PinPad:Device not open");
  958. goto END_LABEL;
  959. }
  960. lRet = ZT598M1FD_DevCtrl->SetEntryMode(CLOSE_ENTRY, 0xFFFF, 0xFFFF);
  961. if (sizeof(block.data) == 0 || block.data == NULL)
  962. {
  963. memset(m_szErrMsg, 0x00, sizeof (m_szErrMsg));
  964. strcpy(m_szErrMsg, "ERR_PIN_INVALIDDATA输入数据地址为空");
  965. ret = SaveErrorInfo(ERR_PIN_INVALIDDATA, __FUNCTION__, __LINE__);
  966. return Error_Param;
  967. }
  968. sprintf(szKeyName, "%s%s%d", m_bSM ? SM_KEY_NAME_PREFIX : DES_KEY_NAME_PREFIX, WORKING_KEY_NAEM_LABEL, m_dwWorkingKeySN);
  969. wFormat = m_wPinFormat;
  970. lRet = ZT598M1FD_DevCtrl->GetPinBlock(wKeyType, lpsKeyName, wFormat, byPadding, m_wPinFormat == PIN_FORM3624 ? NULL : (LPCTSTR)m_accountInfo.account, lpsXORData,
  971. lpsEncKeyName, byResult, wResultLen, m_LPPinpadStatus);
  972. if(lRet != STATUS_SUCCESS)
  973. {
  974. ret = SaveErrorInfo(lRet, __FUNCTION__, __LINE__);
  975. goto END_LABEL;
  976. }
  977. block.dwSize = CDataConvert::HexToString(byResult, wResultLen, (CHAR*)block.data, sizeof(block.data));
  978. END_LABEL:
  979. LogM("<==Leave PinPadClassImpl::GetPinBlock()return %d", ret);
  980. return ret;
  981. }
  982. ErrorCodeEnum PinPadClassImpl::SetAccNo(AccountInfo accInfo)
  983. {
  984. LOG_FUNCTION();
  985. LogM("==>Enter PinPadClassImpl::SetAccNo():%s", accInfo.account);
  986. if (accInfo.dwAccLen == 0 || accInfo.dwAccLen >= MAX_ACCOUNT_LEN)
  987. {
  988. memset(m_szErrMsg, 0x00, sizeof (m_szErrMsg));
  989. sprintf(m_szErrMsg, "ERR_PIN_INVALIDCUSTOMERDATA输入的账号长度错误accInfo.dwAccLen=%d",accInfo.dwAccLen);
  990. SaveErrorInfo(ERR_PIN_INVALIDCUSTOMERDATA, __FUNCTION__, __LINE__);
  991. return Error_Param;
  992. }
  993. //sensitive info
  994. memcpy(m_accountInfo.account, accInfo.account, MAX_ACCOUNT_LEN);
  995. m_accountInfo.dwAccLen = accInfo.dwAccLen;
  996. LogM("<==Leave PinPadClassImpl::SetAccNo()return Error_Succeed");
  997. return Error_Succeed;
  998. }
  999. int PinPadClassImpl::GetEncryptFunc()
  1000. {
  1001. LOG_FUNCTION();
  1002. LogM("==>Enter PinPadClassImpl::GetEncryptFunc()");
  1003. LogM("<==Leave PinPadClassImpl::GetEncryptFunc()return 0x03");
  1004. return 0x03;
  1005. }
  1006. BOOL PinPadClassImpl::ReadPinpadConfig(/*LPCTSTR lpszSPIniPath,*/
  1007. LPPinpadDevConfig lpDevConfig, LPPinpadSPConfig lpSPConfig)
  1008. {
  1009. LOG_FUNCTION();
  1010. CHAR szPath[MAX_PATH] = {0};
  1011. CHAR szTemp[MAX_PATH] = {0};
  1012. CHAR szKeyCode[MID_BUFF_SIZE_3] = {0};
  1013. if (CFileDir::GetFilePathName(
  1014. getpid(), INI_ADAPTER_PATH, INI_ADAPTER_FILENAME,
  1015. m_sIniPath, sizeof(m_sIniPath)) == FALSE)
  1016. {
  1017. return FALSE;
  1018. }
  1019. if ((m_sIniPath == NULL) || (strlen(m_sIniPath) == 0) ||
  1020. ((lpDevConfig == NULL) && (lpSPConfig == NULL)))
  1021. {
  1022. return FALSE;
  1023. }
  1024. /*
  1025. Dl_info path_info;
  1026. dladdr("LoadSDKDll",&path_info);
  1027. char str_FilePath1[256]{0};
  1028. char str_FilePath2[256]{0};
  1029. char *a="/keba/DesKeyMap.dat";
  1030. char *b="/keba/SM4KeyMap.dat";
  1031. memcpy(str_FilePath1,path_info.dli_fname,strlen(path_info.dli_fname));
  1032. memcpy(str_FilePath2,path_info.dli_fname,strlen(path_info.dli_fname));
  1033. char *pLastSlath1=strrchr(str_FilePath1,'/');
  1034. char *pLastSlath2=strrchr(str_FilePath2,'/');
  1035. *pLastSlath1=0;
  1036. *pLastSlath2=0;
  1037. strncat(str_FilePath1,a,strlen(a));
  1038. strncat(str_FilePath2,b,strlen(b));
  1039. //memcpy(lpDevConfig->sDESKeyIndexFilePath, str_FilePath1, strlen(str_FilePath1));
  1040. //memcpy(lpDevConfig->sSM4KeyIndexFilePath, str_FilePath2, strlen(str_FilePath2));
  1041. */
  1042. memcpy(lpDevConfig->sDESKeyIndexFilePath, "/usr/local/share/cbpm.adapter/DesKeyMap.dat", strlen("/usr/local/share/cbpm.adapter/DesKeyMap.dat"));
  1043. memcpy(lpDevConfig->sSM4KeyIndexFilePath, "/usr/local/share/cbpm.adapter/SM4KeyMap.dat", strlen("/usr/local/share/cbpm.adapter/SM4KeyMap.dat"));
  1044. lpDevConfig->bKeyIndexFileSaveToEPP = FALSE;
  1045. lpDevConfig->byRemoveInstall = AUTH_INSTALL;
  1046. memcpy(szKeyCode, "3132331B00000000343536080000000037383920000000002E304F0D00000000", sizeof("3132331B00000000343536080000000037383920000000002E304F0D00000000"));
  1047. CDataConvert::StringToHex(szKeyCode, sizeof(szKeyCode), (LPBYTE)lpDevConfig->byKeyCodeMatrix, sizeof(lpDevConfig->byKeyCodeMatrix));
  1048. lpDevConfig->byHWDESKCVMaxLen = 3;
  1049. lpDevConfig->byKCVLength = 8;
  1050. lpDevConfig->byBeepLength = 0x10;
  1051. //lpSPConfig
  1052. lpSPConfig->byRemoveInstall = PIN_INSTALL;
  1053. lpSPConfig->bGetPinBeep = TRUE;
  1054. lpSPConfig->bGetDataBeep = TRUE;
  1055. return TRUE;
  1056. }
  1057. ErrorCodeEnum PinPadClassImpl::EncryptCommon(EnDecryptInfo srcInfo, EnDecryptInfo &destInfo, bool bMac)
  1058. {
  1059. //todo: deal with byIV
  1060. LOG_FUNCTION();
  1061. LogM("<==Enter PinPadClassImpl::EncryptCommon()");
  1062. ErrorCodeEnum ret = Error_Succeed;
  1063. LONG lRet = STATUS_SUCCESS;
  1064. DWORD dwMaxMacDataSize = 0, dwMaxCryptDataSize = 0;
  1065. LPBYTE lpbyResult = NULL;
  1066. ULONGLONG ullDataUnit1 = 0, ullDataUnit2 = 0;
  1067. int i = 0, j = 0;
  1068. BYTE byIV[SHORT_BUFF_SIZE_3] = {0};
  1069. WORD wKeyType = m_bSM? KEY_TYPE_SM4:KEY_TYPE_DES;
  1070. CHAR szKeyName[32] = {0};
  1071. WORD wMode = PIN_MODEENCRYPT;
  1072. BYTE byAlgorithmECBCBC = m_wCryptDataAlgorithm;
  1073. BYTE byPattern = m_byPattern;
  1074. LPBYTE lpbyTempResult = NULL;
  1075. USHORT usCryptDataLen = srcInfo.dwSize/2;
  1076. WORD wTempResultLen = 0;
  1077. LPBYTE lpbyCryptData = new BYTE[usCryptDataLen];
  1078. BYTE byPadding = 0x00;
  1079. LPBYTE lpbyIV = byIV;
  1080. WORD wIVLen = 0;
  1081. WORD wGroupLength = 0;
  1082. LPSTR lpszStartValueKey = NULL;
  1083. LPBYTE lpbyTempCryptData = NULL;
  1084. WORD wTempCryptDataLen = 0;
  1085. WORD wResultLen = 0;
  1086. if(!m_bDevOpen)
  1087. {
  1088. memset(m_szErrMsg, 0x00, sizeof (m_szErrMsg));
  1089. strcpy(m_szErrMsg, "ERR_PIN_DEVNOTOPEN设备未打开");
  1090. ret = SaveErrorInfo(ERR_PIN_DEVNOTOPEN, __FUNCTION__, __LINE__);
  1091. LogM("PinPad:Device not open");
  1092. goto END_LABEL;
  1093. }
  1094. if (srcInfo.dwSize == 0 || srcInfo.dwSize > MAX_EN_DECRYPT_DATA_SIZE)
  1095. {
  1096. memset(m_szErrMsg, 0x00, sizeof (m_szErrMsg));
  1097. sprintf(m_szErrMsg, "ERR_PIN_INVALIDDATA输入数据非法srcInfo.dwSize=%d",srcInfo.dwSize);
  1098. ret = SaveErrorInfo(ERR_PIN_INVALIDDATA, __FUNCTION__, __LINE__);
  1099. return Error_Param;
  1100. }
  1101. //todo: need initialization\wKeyState\pin access denied
  1102. sprintf(szKeyName, "%s%s%d", m_bSM ? SM_KEY_NAME_PREFIX : DES_KEY_NAME_PREFIX, WORKING_KEY_NAEM_LABEL, m_dwWorkingKeySN);
  1103. if((srcInfo.dwSize == 0) || (srcInfo.dwSize != strlen((CHAR*)srcInfo.data)))
  1104. {
  1105. memset(m_szErrMsg, 0x00, sizeof (m_szErrMsg));
  1106. sprintf(m_szErrMsg, "ERR_PIN_INVALIDDATA输入数据非法srcInfo.dwSize=%d",srcInfo.dwSize);
  1107. ret = SaveErrorInfo(ERR_PIN_INVALIDDATA, __FUNCTION__, __LINE__);
  1108. return Error_Param;
  1109. }
  1110. if (wKeyType == KEY_TYPE_DES)
  1111. {
  1112. dwMaxMacDataSize = ZT598M1FD_DevCtrl->m_stDevCap.dwMaxDESMacDataSize; //todo
  1113. dwMaxCryptDataSize = ZT598M1FD_DevCtrl->m_stDevCap.dwMaxDESCryptDataSize;
  1114. }
  1115. else if (wKeyType == KEY_TYPE_SM4)
  1116. {
  1117. dwMaxMacDataSize = ZT598M1FD_DevCtrl->m_stDevCap.dwMaxSM4MacDataSize;
  1118. dwMaxCryptDataSize = ZT598M1FD_DevCtrl->m_stDevCap.dwMaxSM4CryptDataSize;
  1119. }
  1120. else
  1121. {
  1122. dwMaxMacDataSize = 0;
  1123. dwMaxCryptDataSize = 256;
  1124. }
  1125. CDataConvert::StringToHex((CHAR*)srcInfo.data, srcInfo.dwSize, lpbyCryptData, usCryptDataLen);
  1126. if(bMac)
  1127. {
  1128. lpbyResult = new BYTE[SHORT_BUFF_SIZE_3];
  1129. lpbyTempCryptData = new BYTE[dwMaxMacDataSize];
  1130. lpbyTempResult = new BYTE[SHORT_BUFF_SIZE_3];
  1131. memset(lpbyResult, 0x00, SHORT_BUFF_SIZE_3);
  1132. for (i = 0; i < (int)((usCryptDataLen - 1) / dwMaxMacDataSize + 1); i++)
  1133. {
  1134. memset(lpbyTempCryptData, 0x00, dwMaxMacDataSize);
  1135. if (i == (int)((usCryptDataLen - 1) / dwMaxMacDataSize))
  1136. {
  1137. wTempCryptDataLen = usCryptDataLen % dwMaxMacDataSize;
  1138. if (wTempCryptDataLen == 0)
  1139. {
  1140. wTempCryptDataLen = (WORD)dwMaxMacDataSize;
  1141. }
  1142. }
  1143. else
  1144. {
  1145. wTempCryptDataLen = (WORD)dwMaxMacDataSize;
  1146. }
  1147. memcpy(lpbyTempCryptData, lpbyCryptData + dwMaxMacDataSize * i, wTempCryptDataLen);
  1148. if (i == 0)
  1149. {
  1150. lpszStartValueKey = NULL;
  1151. wIVLen = 0;
  1152. lpbyIV = byIV;
  1153. }
  1154. else
  1155. {
  1156. lpszStartValueKey = NULL;
  1157. wIVLen = (wKeyType == KEY_TYPE_SM4) ? SM4_DATA_GROUP_LENGTH : DES_DATA_GROUP_LENGTH;
  1158. memcpy(byIV, lpbyTempResult, wIVLen);
  1159. memset(lpbyTempResult, 0x00, SHORT_BUFF_SIZE_3);
  1160. if ((wKeyType == KEY_TYPE_DES) && (m_wMacMode == MAC_UNION_PAY))
  1161. //if ((wKeyType == KEY_TYPE_DES) && (m_wMacMode == PIN_MAC_UNIONPAY))
  1162. {
  1163. while (wTempCryptDataLen < DES_DATA_GROUP_LENGTH)
  1164. {
  1165. *(lpbyTempCryptData + wTempCryptDataLen) = byPadding;
  1166. wTempCryptDataLen++;
  1167. }
  1168. memcpy(&ullDataUnit2, lpbyTempCryptData, sizeof(ullDataUnit2));
  1169. ullDataUnit1 ^= ullDataUnit2;
  1170. memcpy(lpbyTempCryptData, &ullDataUnit1, sizeof(ullDataUnit1));
  1171. }
  1172. }
  1173. if (wKeyType == KEY_TYPE_DES)
  1174. {
  1175. if (i == (int)((usCryptDataLen - 1) / dwMaxMacDataSize))
  1176. {
  1177. //byAlgorithmMac = (wKeyType == KEY_TYPE_SM4) ? m_cfgSP.bySM4AlgorithmMac : m_cfgSP.byAlgorithmMac;
  1178. //byAlgorithmMac = m_wMacMode;
  1179. }
  1180. else
  1181. {
  1182. if(m_wMacMode == PIN_MAC_UNIONPAY)
  1183. {
  1184. ullDataUnit1 = 0;
  1185. for (j = 0; j < (int)(dwMaxMacDataSize / 8); j++)
  1186. {
  1187. memcpy(&ullDataUnit2, lpbyTempCryptData + 8 * j, sizeof(ullDataUnit2));
  1188. ullDataUnit1 ^= ullDataUnit2;
  1189. }
  1190. memcpy(lpbyTempResult, &ullDataUnit1, sizeof(ullDataUnit1));
  1191. continue;
  1192. }
  1193. }
  1194. }
  1195. else if (wKeyType == KEY_TYPE_SM4)
  1196. {
  1197. //byAlgorithmMac = (wKeyType == KEY_TYPE_SM4) ? m_cfgSP.bySM4AlgorithmMac : m_cfgSP.byAlgorithmMac;
  1198. }
  1199. wTempResultLen = SHORT_BUFF_SIZE_3;
  1200. wResultLen = SHORT_BUFF_SIZE_3;
  1201. lRet = ZT598M1FD_DevCtrl->CalcMac(wKeyType, szKeyName, m_wMacMode, lpbyTempCryptData, wTempCryptDataLen, byPadding,
  1202. byIV, wIVLen, lpszStartValueKey, NULL, 0, lpbyTempResult, wTempResultLen, m_LPPinpadStatus);
  1203. wResultLen = wTempResultLen;
  1204. memcpy(lpbyResult, lpbyTempResult, wResultLen);
  1205. }
  1206. }
  1207. else
  1208. {
  1209. if (wKeyType != KEY_TYPE_RSA)
  1210. {
  1211. lpbyResult = new BYTE[usCryptDataLen + SHORT_BUFF_SIZE_3];//可能有补码而且考虑兼容SM所乿+SHORT_BUFF_SIZE_3
  1212. memset(lpbyResult, 0x00, usCryptDataLen + SHORT_BUFF_SIZE_3);
  1213. }
  1214. else
  1215. {
  1216. lpbyResult = new BYTE[usCryptDataLen + 256];//可能有补码而且考虑兼容SM所乿+SHORT_BUFF_SIZE_3
  1217. memset(lpbyResult, 0x00, usCryptDataLen + 256);
  1218. }
  1219. lpbyTempCryptData = new BYTE[dwMaxCryptDataSize];
  1220. lpbyTempResult = new BYTE[dwMaxCryptDataSize];
  1221. if (wMode == PIN_MODEENCRYPT)
  1222. {
  1223. for (i = 0; i < (int)((usCryptDataLen - 1) / dwMaxCryptDataSize + 1); i++)
  1224. {
  1225. memset(lpbyTempCryptData, 0x00, dwMaxCryptDataSize);
  1226. if (i == (int)((usCryptDataLen - 1) / dwMaxCryptDataSize))
  1227. {
  1228. wTempCryptDataLen = usCryptDataLen % dwMaxCryptDataSize;
  1229. if (wTempCryptDataLen == 0)
  1230. {
  1231. wTempCryptDataLen = (WORD)dwMaxCryptDataSize;
  1232. }
  1233. }
  1234. else
  1235. {
  1236. wTempCryptDataLen = (WORD)dwMaxCryptDataSize;
  1237. }
  1238. memcpy(lpbyTempCryptData, lpbyCryptData + dwMaxCryptDataSize * i, wTempCryptDataLen);
  1239. if (byAlgorithmECBCBC == PIN_CRYPT_CBC)
  1240. {
  1241. if (i == 0)
  1242. {
  1243. lpszStartValueKey = NULL;
  1244. wIVLen = 0;
  1245. memset(byIV, 0x00, sizeof(byIV));
  1246. }
  1247. else
  1248. {
  1249. lpszStartValueKey = NULL;
  1250. wIVLen = (wKeyType == KEY_TYPE_SM4) ? SM4_DATA_GROUP_LENGTH : DES_DATA_GROUP_LENGTH;
  1251. memcpy(byIV, lpbyTempResult + (dwMaxCryptDataSize - wIVLen), wIVLen);
  1252. memset(lpbyTempResult, 0x00, dwMaxCryptDataSize);
  1253. }
  1254. }
  1255. else
  1256. {
  1257. wIVLen = 0;
  1258. lpszStartValueKey = NULL;
  1259. memset(byIV, 0x00, sizeof(byIV));
  1260. }
  1261. wTempResultLen = (WORD)dwMaxCryptDataSize;
  1262. lRet = ZT598M1FD_DevCtrl->CryptData(wKeyType, szKeyName, wMode, byAlgorithmECBCBC, byPattern, lpbyTempCryptData, wTempCryptDataLen, byPadding,
  1263. byIV, wIVLen, lpszStartValueKey, NULL, 0, lpbyTempResult, wTempResultLen, m_LPPinpadStatus);
  1264. wResultLen += wTempResultLen;
  1265. memcpy(lpbyResult + dwMaxCryptDataSize * i, lpbyTempResult, wTempResultLen);
  1266. }
  1267. }
  1268. else if (wMode == PIN_MODEDECRYPT)
  1269. {
  1270. for (i = (int)((usCryptDataLen - 1) / dwMaxCryptDataSize); i >= 0 ; i--)
  1271. {
  1272. memset(lpbyTempCryptData, 0x00, dwMaxCryptDataSize);
  1273. memset(lpbyTempResult, 0x00, dwMaxCryptDataSize);
  1274. if (i == (int)((usCryptDataLen - 1) / dwMaxCryptDataSize))
  1275. {
  1276. wTempCryptDataLen = usCryptDataLen % dwMaxCryptDataSize;
  1277. if (wTempCryptDataLen == 0)
  1278. {
  1279. wTempCryptDataLen = (WORD)dwMaxCryptDataSize;
  1280. }
  1281. }
  1282. else
  1283. {
  1284. wTempCryptDataLen = (WORD)dwMaxCryptDataSize;
  1285. }
  1286. memcpy(lpbyTempCryptData, lpbyCryptData + dwMaxCryptDataSize * i, wTempCryptDataLen);
  1287. if (wKeyType != KEY_TYPE_RSA)
  1288. {
  1289. if (m_cfgSP.bStartValueUsingPos != FALSE)
  1290. {
  1291. //长度补齐
  1292. while (wTempCryptDataLen % 8 > 0 && wTempCryptDataLen < dwMaxCryptDataSize)
  1293. {
  1294. lpbyTempCryptData[wTempCryptDataLen] = byPadding;
  1295. wTempCryptDataLen++;
  1296. }
  1297. }
  1298. if (byAlgorithmECBCBC == PIN_CRYPT_CBC)
  1299. {
  1300. if (m_cfgSP.bStartValueUsingPos != FALSE)
  1301. {
  1302. wIVLen = 0;
  1303. lpszStartValueKey = NULL;
  1304. memset(byIV, 0x00, sizeof(byIV));
  1305. if (i == 0)
  1306. {
  1307. wIVLen = 0;
  1308. lpszStartValueKey = NULL;
  1309. memset(byIV, 0x00, sizeof(byIV));
  1310. }
  1311. else
  1312. {
  1313. lpszStartValueKey = NULL;
  1314. wIVLen = (wKeyType == KEY_TYPE_SM4) ? SM4_DATA_GROUP_LENGTH : DES_DATA_GROUP_LENGTH;
  1315. memcpy(byIV, lpbyCryptData + dwMaxCryptDataSize * (i - 1) + (dwMaxCryptDataSize - wIVLen), wIVLen);
  1316. }
  1317. if (i == (int)((usCryptDataLen - 1) / dwMaxCryptDataSize))
  1318. {
  1319. if (lpszStartValueKey != NULL)//lpCrypt->lpsStartValueKey不起作用
  1320. {
  1321. wGroupLength = (wKeyType == KEY_TYPE_SM4) ? SM4_DATA_GROUP_LENGTH : DES_DATA_GROUP_LENGTH;
  1322. for (j = 0; j < wGroupLength; j++)
  1323. {
  1324. lpbyTempCryptData[((usCryptDataLen - 1) % dwMaxCryptDataSize) / wGroupLength * wGroupLength + j] ^= lpszStartValueKey[j];
  1325. }
  1326. }
  1327. }
  1328. }
  1329. else
  1330. {
  1331. if (i == 0)
  1332. {
  1333. lpszStartValueKey = NULL;
  1334. if (lpszStartValueKey != NULL )
  1335. {
  1336. wIVLen = 0;
  1337. memcpy(byIV, 0x00, sizeof(byIV));
  1338. }
  1339. }
  1340. else
  1341. {
  1342. lpszStartValueKey = NULL;
  1343. wIVLen = (wKeyType == KEY_TYPE_SM4) ? SM4_DATA_GROUP_LENGTH : DES_DATA_GROUP_LENGTH;
  1344. memcpy(byIV, lpbyCryptData + dwMaxCryptDataSize * (i - 1) + (dwMaxCryptDataSize - wIVLen), wIVLen);
  1345. }
  1346. }
  1347. }
  1348. else
  1349. {
  1350. wIVLen = 0;
  1351. lpszStartValueKey = NULL;
  1352. memset(byIV, 0x00, sizeof(byIV));
  1353. }
  1354. }
  1355. wTempResultLen = (WORD)dwMaxCryptDataSize;
  1356. lRet = ZT598M1FD_DevCtrl->CryptData(wKeyType, szKeyName, wMode, byAlgorithmECBCBC, byPattern, lpbyTempCryptData, wTempCryptDataLen, byPadding,
  1357. byIV, wIVLen, lpszStartValueKey, NULL, 0, lpbyTempResult, wTempResultLen, m_LPPinpadStatus);
  1358. wResultLen += wTempResultLen;
  1359. memcpy(lpbyResult + dwMaxCryptDataSize * i, lpbyTempResult, wTempResultLen);
  1360. }
  1361. }
  1362. else
  1363. {}
  1364. }
  1365. if (lpbyTempCryptData != NULL)
  1366. {
  1367. delete[] lpbyTempCryptData;
  1368. }
  1369. if (lpbyTempResult != NULL)
  1370. {
  1371. delete[] lpbyTempResult;
  1372. }
  1373. if(lRet != STATUS_SUCCESS)
  1374. {
  1375. ret = SaveErrorInfo(lRet, __FUNCTION__, __LINE__);
  1376. goto END_LABEL;
  1377. }
  1378. destInfo.dwSize = CDataConvert::HexToString(lpbyResult, wResultLen, (CHAR*)destInfo.data, sizeof(destInfo.data));
  1379. END_LABEL:
  1380. LogM("==>Leave PinPadClassImpl::EncryptCommon()");
  1381. return ret;
  1382. }
  1383. ErrorCodeEnum PinPadClassImpl::SaveErrorInfo(int iErrCode, const CHAR* strFunc, int nLine)
  1384. {
  1385. LOG_FUNCTION();
  1386. ErrorCodeEnum ret;
  1387. if(strlen(m_szErrMsg) == 0)
  1388. {
  1389. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  1390. strcpy(m_szErrMsg, ZT598M1FD_DevCtrl->m_stPinpadStatus.sDescription);
  1391. }
  1392. switch (iErrCode)
  1393. {
  1394. case STATUS_SUCCESS:
  1395. m_shErrCode = DEP_SUCCESS;
  1396. ret = Error_Succeed;
  1397. break;
  1398. case STATUS_INVALID_COMMAND_LENGTH:
  1399. case ERR_COMMON_ERROR:
  1400. m_shErrCode = DEP_INVALID_PARAMETER;
  1401. ret = Error_Param;
  1402. break;
  1403. case STATUS_INVALID_KEYID:
  1404. m_shErrCode = DEP_INVALID_KEY_ID;
  1405. ret = Error_Param;
  1406. break;
  1407. case STATUS_KEYID_NOT_EXIST:
  1408. m_shErrCode = DEP_KEY_NOT_EXIST;
  1409. ret = Error_Param;
  1410. break;
  1411. case STATUS_KEYID_LOCKED:
  1412. m_shErrCode = DEP_KEY_LOCKED;
  1413. ret = Error_Param;
  1414. break;
  1415. case STATUS_INVALID_WRITE_MODE:
  1416. case STATUS_INVALID_IV_ATTRIBUTES:
  1417. case STATUS_INVALID_KEY_ATTRIBUTES:
  1418. case STATUS_KEY_ATTRIBUTES_NOT_MATCHED:
  1419. case STATUS_KEY_USEVIOLATION:
  1420. case STATUS_KEY_NOTALLOWED:
  1421. m_shErrCode = DEP_E_KEY_LOST;
  1422. ret = Error_Param;
  1423. break;
  1424. case STATUS_KCV_VERIFICATION_FAIL:
  1425. case STATUS_INVALID_CHECK_MODE:
  1426. case STATUS_INVALID_VERIFY_MODE:
  1427. m_shErrCode = DEP_E_KCV_VERIFICATION;
  1428. ret = Error_Param;
  1429. break;
  1430. case STATUS_INVALID_AUTHENTICATION_MODE:
  1431. m_shErrCode = DEP_INVALID_AUTHENTICATION_MODE;
  1432. ret = Error_Param;
  1433. break;
  1434. case STATUS_INVALID_MACING:
  1435. m_shErrCode = DEP_INVALID_MAC;
  1436. ret = Error_Param;
  1437. break;
  1438. case STATUS_INVALID_MODE:
  1439. m_shErrCode = DEP_INVALID_MODE;
  1440. ret = Error_Param;
  1441. break;
  1442. case STATUS_INVALID_DATA_SPECIFIED:
  1443. m_shErrCode = DEP_INVALID_PARAMETER;
  1444. ret = Error_Param;
  1445. break;
  1446. case STATUS_INVALID_KEY_VALUE:
  1447. case STATUS_KEY_INVALID:
  1448. m_shErrCode = DEP_INVALID_KEY_VALUE;
  1449. ret = Error_Param;
  1450. break;
  1451. case STATUS_INVALID_KEY_LENGTH:
  1452. case STATUS_INVALID_LENGTH_OR_SUM:
  1453. m_shErrCode = DEP_INVALID_KEY_LEN;
  1454. ret = Error_Param;
  1455. break;
  1456. case STATUS_INVALID_OFFSET_LENGTH:
  1457. m_shErrCode = DEP_INVALID_LENGTH;
  1458. ret = Error_Param;
  1459. break;
  1460. case STATUS_INVALID_PIN_LENGTH:
  1461. case STATUS_PIN_NOPIN:
  1462. case STATUS_INVALID_PIN2_LENGTH:
  1463. m_shErrCode = DEP_INVALID_PIN_LEN;
  1464. ret = Error_Param;
  1465. break;
  1466. case STATUS_PIN_VERIFICATION_FAIL:
  1467. case STATUS_PIN2_VERIFICATION_FAIL:
  1468. m_shErrCode = DEP_VERIFICATION_FAILED;
  1469. ret = Error_Param;
  1470. break;
  1471. case STATUS_PIN_ENCRYPTION_SUSPENDED:
  1472. m_shErrCode = DEP_ENCRYPT_SUSPENDED;
  1473. ret = Error_Param;
  1474. break;
  1475. case STATUS_INVALID_MODULUS_LENGTH:
  1476. case ERR_PIN_INVALID_MOD_LEN:
  1477. m_shErrCode = DEP_INVALID_MODULE_LEN;
  1478. ret = Error_Param;
  1479. break;
  1480. case STATUS_INVALID_EXPONENT_LENGTH:
  1481. m_shErrCode = DEP_INVALID_EXPONENT_LEN;
  1482. ret = Error_Param;
  1483. break;
  1484. case STATUS_INVALID_PKCS_STRUCTURE:
  1485. case STATUS_INVALID_PKCS_PADDING:
  1486. m_shErrCode = DEP_INVALID_PKCS;
  1487. ret = Error_Param;
  1488. break;
  1489. case STATUS_INVALID_SIGNATURE_LENGTH:
  1490. case ERR_PIN_SIG_NOT_SUPP:
  1491. case ERR_PIN_SIG_KEYNOTFOUND:
  1492. case ERR_PIN_SIG_KEYUSEVIOLATION:
  1493. m_shErrCode = DEP_INVALID_SIGNATURE;
  1494. ret = Error_Param;
  1495. break;
  1496. case STATUS_SIGNATURE_VERIFICATION_FAIL:
  1497. m_shErrCode = DEP_E_SIGNATURE_VERIFICATION;
  1498. ret = Error_Param;
  1499. break;
  1500. case STATUS_KEY_NOT_LOADED:
  1501. m_shErrCode = DEP_KEY_NOT_LOADED;
  1502. ret = Error_Param;
  1503. break;
  1504. case STATUS_INVALID_CERTIFICATE_FROMAT:
  1505. case STATUS_INVALID_CERTIFICATE_VERSION:
  1506. case STATUS_INVALID_CERTIFICATE_VALIDITY:
  1507. case STATUS_INVALID_CERTIFICATE_ISSUER:
  1508. case STATUS_INVALID_CERTIFICATE_SUBJECT:
  1509. case STATUS_INVALID_CERTIFICATE_ALGOR:
  1510. case STATUS_CERTIFICATE_NOT_EXIST:
  1511. m_shErrCode = DEP_INVALID_CERTIFICATE;
  1512. ret = Error_Param;
  1513. break;
  1514. case STATUS_INVALID_DATA_DISABLEED:
  1515. m_shErrCode = DEP_INVALID_DATA;
  1516. ret = Error_Param;
  1517. break;
  1518. case STATUS_INVALID_USERBLOCK_ADDRESS:
  1519. m_shErrCode = DEP_INVALID_USER_BLOCK_ADDR;
  1520. ret = Error_Param;
  1521. break;
  1522. case STATUS_INVALID_SERIALNO_SPECIFIED:
  1523. m_shErrCode = DEP_E_SERIAL_NUMBER;
  1524. ret = Error_Param;
  1525. break;
  1526. case STATUS_NO_CARD:
  1527. case STATUS_CARD_APDU_ERROR:
  1528. m_shErrCode = DEP_E_SERIAL_NUMBER;
  1529. ret = Error_Param;
  1530. break;
  1531. case STATUS_EMV_NOT_INITIALIZED:
  1532. case STATUS_EPP_NOT_INITIALIZED:
  1533. case ERR_PIN_NEED_INITIALIZATION:
  1534. m_shErrCode = DEP_EPP_NOT_INITIALIZED;
  1535. ret = Error_Param;
  1536. break;
  1537. case STATUS_EMV_NOT_READY:
  1538. m_shErrCode = DEP_EMV_NOT_READY;
  1539. ret = Error_Param;
  1540. break;
  1541. case STATUS_EMV_NEED_REINITIALIZE:
  1542. m_shErrCode = DEP_EMV_NEED_REINITIALIZE;
  1543. ret = Error_Param;
  1544. break;
  1545. case STATUS_EMV_TIMEOUT:
  1546. m_shErrCode = DEP_EMV_TIMEOUT;
  1547. ret = Error_Param;
  1548. break;
  1549. case STATUS_EMV_ALREADY_INITIALIZED:
  1550. m_shErrCode = DEP_EMV_INIT_ALREADY;
  1551. ret = Error_Param;
  1552. break;
  1553. case STATUS_ALGORITHMNOTSUPP:
  1554. m_shErrCode = DEP_ALGORITHM_UNSUPPORTED;
  1555. ret = Error_Param;
  1556. break;
  1557. case STATUS_COMMANDUPSUPP:
  1558. case STATUS_SM2_ENCRYPT_FAILURE:
  1559. case STATUS_SM2_DECRYPT_FAILURE:
  1560. case STATUS_SM2_SIGNATURE_FAILURE:
  1561. case STATUS_SM2_VERSIG_FAILURE:
  1562. case STATUS_SM2_KEYEXC_FAILURE:
  1563. case STATUS_SM2_VER_KEYEXC_FAILURE:
  1564. case STATUS_FW_VERIFY_FIAL:
  1565. case STATUS_FW_WRITE_FAIL:
  1566. case STATUS_FW_EARSE_FAIL:
  1567. case ERR_PIN_INVALID_FW_FILE:
  1568. m_shErrCode = DEP_COMMAND_UNSUPPORTED;
  1569. ret = Error_Param;
  1570. break;
  1571. case STATUS_ERROR_INTER_ERROR:
  1572. case STATUS_MRAM_HARDWARE_ERROR:
  1573. case STATUS_OTHER_ABNORMAL_ERROR:
  1574. case ERR_INTERNAL_ERROR:
  1575. m_shErrCode = DEP_HARDWARE;
  1576. ret = Error_Hardware;
  1577. break;
  1578. case STATUS_COMMAND_LOCK:
  1579. m_shErrCode = DEP_COMMAND_LOCKED;
  1580. ret = Error_Hardware;
  1581. break;
  1582. case STATUS_INVALID_COMMAND_MAC:
  1583. m_shErrCode = DEP_INVALID_MAC;
  1584. ret = Error_Param;
  1585. break;
  1586. case STATUS_AUTHENTICATION_FAILED:
  1587. case STATUS_NOT_AUTHENTE:
  1588. m_shErrCode = DEP_EPP_NOT_AUTHORIZED;
  1589. ret = Error_Param;
  1590. break;
  1591. case STATUS_EPP_ALREADY_INITIALIZED:
  1592. m_shErrCode = DEP_EPP_INIT_ALREADY;
  1593. ret = Error_Hardware;
  1594. break;
  1595. case STATUS_CERTIFICATE_ALREADY:
  1596. m_shErrCode = DEP_EPP_CERTIFICATE_ALREADY;
  1597. ret = Error_Hardware;
  1598. break;
  1599. case STATUS_PHYSICALLY_NOT_INSTALLED:
  1600. case ERR_PIN_PHYSICALLY_UNINSTALLED:
  1601. m_shErrCode = DEP_EPP_NOT_PHYSICALLY_INSTALLED;
  1602. ret = Error_Hardware;
  1603. break;
  1604. case STATUS_LOGICALLY_NOT_INSTALLED:
  1605. case ERR_PIN_LOGICALLY_UNINSTALLED:
  1606. m_shErrCode = DEP_EPP_NOT_LOGICALLY_INSTALLED;
  1607. ret = Error_Hardware;
  1608. break;
  1609. case STATUS_INPUT_KEY_TIMEOUT:
  1610. m_shErrCode = DEP_PRESS_KEY_TIMEOUT;
  1611. ret = Error_Param;
  1612. break;
  1613. case STATUS_INVLAID_PASSWORD_LENGTH:
  1614. m_shErrCode = DEP_INVALID_PASSWORD_LEN;
  1615. ret = Error_Hardware;
  1616. break;
  1617. case STATUS_INVALID_PASSWORD:
  1618. m_shErrCode = DEP_INVALID_PASSWORD;
  1619. ret = Error_Hardware;
  1620. break;
  1621. case STATUS_INPUT_PASSWORD_LOCKED:
  1622. m_shErrCode = DEP_PASSWORD_UPDATE_CMD_LOCKED;
  1623. ret = Error_Hardware;
  1624. break;
  1625. case STATUS_SYSTEM_TIME_NOT_SET:
  1626. m_shErrCode = DEP_SYSTEM_TIME_NOT_SET;
  1627. ret = Error_Hardware;
  1628. break;
  1629. case STATUS_SYSTEM_TIME_ALREADY_SET:
  1630. m_shErrCode = DEP_SYSTEM_TIME_SET_ALREADY;
  1631. ret = Error_Hardware;
  1632. break;
  1633. case STATUS_DEVICE_TAMPERED:
  1634. m_shErrCode = DEP_DEVICE_TAMPERED;
  1635. ret = Error_Hardware;
  1636. break;
  1637. case STATUS_A980_NO_RESPONSE:
  1638. m_shErrCode = DEP_COMMUNICATION_FAILED;
  1639. ret = Error_Hardware;
  1640. break;
  1641. case STATUS_INVALID_SM4_KEYVAL:
  1642. m_shErrCode = DEP_INVALID_SM4_KEY;
  1643. ret = Error_Param;
  1644. break;
  1645. case STATUS_EXTERNAL_FALSH_WRITE_ERROR:
  1646. case STATUS_FLASH_CRC_CHECK_ERROR:
  1647. m_shErrCode = DEP_E_EXTERNAL_FLASH_HARDWARE;
  1648. ret = Error_Hardware;
  1649. break;
  1650. case STATUS_ADDRESS_OUTRANG:
  1651. m_shErrCode = DEP_INVALID_USER_BLOCK_ADDR;
  1652. ret = Error_Param;
  1653. break;
  1654. case ERR_EXCHANGE_FAILED:
  1655. m_shErrCode = DEP_DEV_NOT_FOUND;
  1656. ret = Error_DevNotAvailable;
  1657. break;
  1658. case ERR_PIN_AUTHENTICATION_FAILED:
  1659. case ERR_PIN_HOST_AUTHENTICATE_FAILED:
  1660. m_shErrCode = DEP_INVALID_AUTHENTICATION_MODE;
  1661. ret = Error_DevNotAvailable;
  1662. break;
  1663. case ERR_PIN_INVALIDCUSTOMERDATA:
  1664. m_shErrCode =DEP_INVALID_PAN;
  1665. ret = Error_Param;
  1666. break;
  1667. case ERR_PIN_ENC_KEYNOTFOUND:
  1668. case ERR_PIN_KEYNOTFOUND:
  1669. case ERR_PIN_STARTVALUE_KEYNOTFOUND:
  1670. m_shErrCode = DEP_INVALID_KEY_ID;
  1671. ret = Error_Param;
  1672. break;
  1673. case ERR_PIN_BATTERY_LOW:
  1674. m_shErrCode = DEP_EPP_BATTERY_LOWORERROR;
  1675. ret = Error_Succeed;
  1676. break;
  1677. case ERR_PIN_INVALIDDATA:
  1678. m_shErrCode = DEP_INVALID_PARAMETER;
  1679. ret = Error_Param;
  1680. break;
  1681. case ERR_PARAM_ERROR:
  1682. m_shErrCode =DEP_INVALID_PARAMETER;
  1683. ret = Error_Param;
  1684. break;
  1685. case ERR_PIN_DEVNOTOPEN:
  1686. m_shErrCode =DEP_DEV_NOT_OPENED;
  1687. ret = Error_DevNotAvailable;
  1688. break;
  1689. case ERR_PIN_INVALIDKEYLENGTH:
  1690. m_shErrCode = DEP_INVALID_KEY_LEN;
  1691. ret = Error_Param;
  1692. break;
  1693. case ERR_PIN_ENC_KEYUSEVIOLATION:
  1694. case ERR_PIN_USEVIOLATION:
  1695. case ERR_PIN_STARTVALUE_KEYUSEVIOLATION:
  1696. m_shErrCode = DEP_KEY_VIOLATION;
  1697. ret = Error_Param;
  1698. break;
  1699. case ERR_PIN_DUPLICATEKEY:
  1700. m_shErrCode = DEP_KEY_LOADED_ALREADY;
  1701. ret = Error_Param;
  1702. break;
  1703. case ERR_DATA_TOO_LONG:
  1704. m_shErrCode = DEP_INVALID_PARAMETER;
  1705. ret = Error_Param;
  1706. case ERR_PIN_NOKEYRAM:
  1707. m_shErrCode = DEP_KEY_NO_MORE_SPACE;
  1708. ret = Error_Hardware;
  1709. break;
  1710. case ERR_PIN_CHECK_KCV_FAILED:
  1711. m_shErrCode = DEP_VERIFICATION_FAILED;
  1712. ret = Error_Param;
  1713. break;
  1714. case ERR_PIN_PRESS_KEY_OVERTIME:
  1715. m_shErrCode = DEP_PRESS_KEY_TIMEOUT;
  1716. ret = Error_DevCommFailed;
  1717. break;
  1718. case ERR_PIN_TIMEOUT:
  1719. m_shErrCode = DEP_PRESS_KEY_TIMEOUT;
  1720. ret = Error_DevCommFailed;
  1721. break;
  1722. case ERR_PIN_KEY_CODE_NOT_FOUND:
  1723. m_shErrCode = DEP_UNEXPECTED_RET_VALUE;
  1724. ret = Error_DevCommFailed;
  1725. break;
  1726. case ERR_PIN_UNSUPPORT:
  1727. case ERR_PIN_NOT_SUPP:
  1728. m_shErrCode = DEP_PIN_FORMAT_UNSUPPORTED;
  1729. ret = Error_Param;
  1730. break;
  1731. default:
  1732. m_shErrCode = DEP_ERROR_CODE_UNRECOGNIZABLE;
  1733. ret = Error_NoDefine;
  1734. break;
  1735. }
  1736. CHAR chJson[MAX_DEV_ERROR_MSG_LEN] = {0};
  1737. sprintf(chJson, "Func:%s,Line:%d,Msg:%s(V%d.%d.%d.%d)", strFunc, nLine, m_szErrMsg, FILE_MAJOR, FILE_MINOR, FILE_REVISION, FILE_BUILD);
  1738. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  1739. sprintf(m_szErrMsg, "{\"Errcode\":%d,\"Description\":%s}", m_shErrCode,chJson);
  1740. memset(&m_devErrInfo, 0x00, sizeof(m_devErrInfo));
  1741. m_devErrInfo.dwErrMsgLen = strlen(m_szErrMsg);
  1742. sprintf(m_devErrInfo.szErrMsg, m_szErrMsg);
  1743. LogM("ErrorInfo:[0x%x]:%s", ret, m_szErrMsg);
  1744. memset(m_szErrMsg, 0x00, sizeof(m_szErrMsg));
  1745. /*
  1746. CHAR chJson[MAX_DEV_ERROR_MSG_LEN] = {0};
  1747. QJsonObject root_Obj;
  1748. QJsonDocument root_Doc;
  1749. sprintf(chJson, "Func:%s,Line:%d,Msg:%s(V%d.%d.%d.%d)", strFunc, nLine, m_szErrMsg, FILE_MAJOR, FILE_MINOR, FILE_REVISION, FILE_BUILD);
  1750. root_Obj.insert("ErrCode", m_shErrCode);
  1751. root_Obj.insert("Description", chJson);
  1752. root_Doc.setObject(root_Obj);
  1753. //QByteArray root_str = root_Doc.toJson(QJsonDocument::Compact); //紧凑格式
  1754. QByteArray root_str = root_Doc.toJson(QJsonDocument::Indented); //标准JSON格式 QString strJson(root_str);
  1755. QString strJson(root_str);
  1756. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  1757. sprintf(m_szErrMsg, strJson.toUtf8().data());
  1758. memset(&m_devErrInfo, 0x00, sizeof(m_devErrInfo));
  1759. m_devErrInfo.dwErrMsgLen = strlen(m_szErrMsg);
  1760. sprintf(m_devErrInfo.szErrMsg, m_szErrMsg);
  1761. LogM("ErrorInfo:[0x%x]:%s", ret, m_szErrMsg);
  1762. memset(m_szErrMsg, 0x00, sizeof(m_szErrMsg));
  1763. */
  1764. return ret;
  1765. }