PinPadClassImpl_ZT598M.cpp 60 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789
  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. devCategory.version.wMajor = v1;
  146. devCategory.version.wMinor = v2;
  147. devCategory.version.wRevision = 0xffff;
  148. devCategory.version.wBuild = FILE_VERSION;
  149. //devCategory.version.wRevision = 0xFFFF;
  150. //devCategory.version.wBuild = 1;
  151. //devCategory.version.wMajor = 0;
  152. //devCategory.version.wMinor = 0;
  153. LogM( "devCategory.szType=%s",devCategory.szType);
  154. LogM( "devCategory.szModel=%s [0x%x]", devCategory.szModel, m_szMainChipSN[9]);
  155. LogM( "devCategory.szVendor=%s",devCategory.szVendor);
  156. LogM( "devCategory.eState=%d",devCategory.eState);
  157. LogM( "devCategory.version=%d.%d.%d.%d", devCategory.version.wMajor, devCategory.version.wMinor, devCategory.version.wRevision, devCategory.version.wBuild);
  158. LogM("==>Leave PinPadClassImpl::GetDevCategory()");
  159. return Error_Succeed;
  160. }
  161. ErrorCodeEnum PinPadClassImpl::Reset()
  162. {
  163. LOG_FUNCTION();
  164. LogM("<==Enter PinPadClassImpl::Reset()");
  165. ErrorCodeEnum eRet = Error_Succeed;
  166. LONG lRet = STATUS_SUCCESS;
  167. m_bDevOpen = FALSE;
  168. lRet = ZT598M1FD_DevCtrl->CloseDevice();
  169. if(lRet != STATUS_SUCCESS)
  170. {
  171. SaveErrorInfo(lRet);
  172. }
  173. LogM("==>Leave PinPadClassImpl::Reset() = %d", lRet);
  174. return DevOpen(0, 0);
  175. }
  176. ErrorCodeEnum PinPadClassImpl::DevClose()
  177. {
  178. LOG_FUNCTION();
  179. LogM("<==Enter PinPadClassImpl::DevClose()");
  180. ZT598M1FD_DevCtrl->CloseDevice();
  181. LogM("==>Leave PinPadClassImpl::DevClose()");
  182. return Error_Succeed;
  183. }
  184. ErrorCodeEnum PinPadClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
  185. {
  186. LOG_FUNCTION();
  187. LogM("<==Enter PinPadClassImpl::GetLastErr()");
  188. devErrInfo.dwErrMsgLen = 0;
  189. memset(devErrInfo.szErrMsg, 0, sizeof(devErrInfo.szErrMsg));
  190. devErrInfo.dwErrMsgLen = (m_shErrCode << 16);
  191. sprintf(devErrInfo.szErrMsg, m_szErrMsg);
  192. devErrInfo.dwErrMsgLen += (strlen(devErrInfo.szErrMsg) & 0x0000FFFF);
  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);
  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);
  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);
  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. ret = SaveErrorInfo(ERR_PIN_DEVNOTOPEN);
  267. goto END_LABEL;
  268. }
  269. dwDataLen = ZT598M1FD_DevCtrl->ReadEntryText(byData, sizeof(byData));
  270. //if ReadEntryText= success
  271. {
  272. if (dwDataLen > 0)
  273. {
  274. LogM("PinPad input:%s; len:%d", byData, dwDataLen);
  275. }
  276. dwCoveredDataSize = m_pinpadReadData.dwSize % MAX_PIN_READ_SIZE;
  277. if (dwCoveredDataSize + dwDataLen > MAX_PIN_READ_SIZE)//缓冲区将要溢兿
  278. {
  279. memcpy(m_pinpadReadData.data + dwCoveredDataSize, byData, MAX_PIN_READ_SIZE - dwCoveredDataSize);//填满缓冲区尾避
  280. LogM("m_pinpadReadData.data buffer full!");
  281. memcpy(m_pinpadReadData.data, byData + MAX_PIN_READ_SIZE - dwCoveredDataSize, dwDataLen - (MAX_PIN_READ_SIZE - dwCoveredDataSize)); //剩余数据复写到缓冲区墿
  282. }
  283. else
  284. {
  285. memcpy(m_pinpadReadData.data + dwCoveredDataSize, byData, dwDataLen);
  286. }
  287. m_pinpadReadData.dwSize += dwDataLen;
  288. if (m_pinpadReadData.dwSize - m_pinpadReadData.dwCurrentRead > MAX_PIN_READ_SIZE)
  289. {
  290. LogM("Error! Data is covered!");
  291. }
  292. if (m_nCurrentEntryMode == PIN_ENTRY)
  293. {
  294. LogM("==>Leave PinPadClassImpl::KeyRead()");
  295. return PinRead(ch);
  296. }
  297. if (m_pinpadReadData.dwCurrentRead + 1 <= m_pinpadReadData.dwSize && m_nCurrentEntryMode == TEXT_ENTRY)
  298. {
  299. byCurrentChar = m_pinpadReadData.data[m_pinpadReadData.dwCurrentRead % MAX_PIN_READ_SIZE];
  300. m_pinpadReadData.dwCurrentRead++;
  301. if (0x30 <= byCurrentChar && byCurrentChar <= 0x39 ||
  302. byCurrentChar == 0x2e || //'.'
  303. byCurrentChar == 0x4f || //'00'
  304. byCurrentChar == 0x20 || //空白钿
  305. byCurrentChar == 0x1b || //cancel
  306. byCurrentChar == 0x08 || //clear
  307. byCurrentChar == 0x0d ) //confirm
  308. {
  309. ch = byCurrentChar;
  310. //sensitive info
  311. LogM("KeyRead: return char:%c(0x%02X)", ch, ch);
  312. LogM("pinpadReadData.data:%s pinpadReadData.dwSize:%d pinpadReadData.dwCurrentRead:%d", m_pinpadReadData.data, m_pinpadReadData.dwSize, m_pinpadReadData.dwCurrentRead);
  313. return Error_Succeed;
  314. }
  315. else
  316. {
  317. //special char
  318. LogM("KeyRead: return special char:%c(0x%02X) ", byCurrentChar, byCurrentChar);
  319. switch (byCurrentChar)
  320. {
  321. case 0x80:
  322. ret = SaveErrorInfo(ERR_PIN_PRESS_KEY_OVERTIME);
  323. break;
  324. case 0x82:
  325. default:
  326. ret = SaveErrorInfo(ERR_PIN_KEY_CODE_NOT_FOUND);
  327. break;
  328. }
  329. return ret;
  330. }
  331. }
  332. else
  333. {
  334. ret = Error_DevCommFailed;
  335. LogM("No Key Input!!!!");
  336. LogM("==>Leave PinPadClassImpl::KeyRead()");
  337. return Error_DevCommFailed;
  338. }
  339. }
  340. /*
  341. else
  342. {
  343. SaveErrorInfo(lRet);
  344. return Error_DevNotAvailable;
  345. }
  346. */
  347. END_LABEL:
  348. LogM("<==Leave PinPadClassImpl::KeyRead()return %d", ret);
  349. return ret;
  350. }
  351. ErrorCodeEnum PinPadClassImpl::PinRead(BYTE &ch)
  352. {
  353. LOG_FUNCTION();
  354. LogM("==>Enter PinPadClassImpl::PinRead()");
  355. ErrorCodeEnum ret = Error_Succeed;
  356. LONG lRet = STATUS_SUCCESS;
  357. BYTE byCurrentChar = 0;
  358. DWORD i = 0;
  359. BYTE byData[9] = {0};
  360. DWORD dwDataLen = sizeof(byData);
  361. if (m_pinpadReadData.dwCurrentRead < m_pinpadReadData.dwSize && m_nCurrentEntryMode == PIN_ENTRY)
  362. {
  363. byCurrentChar = m_pinpadReadData.data[m_pinpadReadData.dwCurrentRead];
  364. m_pinpadReadData.dwCurrentRead++;
  365. if (byCurrentChar == 0x00)//数字钿
  366. {
  367. m_nCurrentPinLen++;
  368. if (m_nCurrentPinLen < m_nMaxPinLen)
  369. {
  370. ch = 0x3f;
  371. }
  372. else if (m_nCurrentPinLen == m_nMaxPinLen)
  373. {
  374. ch = 0x3f;
  375. if (!m_bConfirm)//bconfirm == false,应该结束输入不需要等待按确认钿
  376. {
  377. for (i = m_pinpadReadData.dwCurrentRead; i < m_pinpadReadData.dwSize; i++)
  378. {
  379. byCurrentChar = m_pinpadReadData.data[m_pinpadReadData.dwCurrentRead];
  380. m_pinpadReadData.dwCurrentRead++;
  381. if (byCurrentChar == 0x00)
  382. {
  383. ZT598M1FD_DevCtrl->DelEntryPinKey(DELETE_LAST_ENTERED, m_LPPinpadStatus);
  384. }
  385. }
  386. lRet = ZT598M1FD_DevCtrl->SetEntryMode(CLOSE_ENTRY, 0xFFFF, 0xFFFF);
  387. //lRet = ZT598M1FD_DevCtrl->SetControlMode(CONTROL_MODE_SBS, eBeep); //close sound
  388. m_nCurrentEntryMode = CLOSE_ENTRY;
  389. }
  390. }
  391. else//超过最大输入长帿
  392. {
  393. lRet = ZT598M1FD_DevCtrl->DelEntryPinKey(DELETE_LAST_ENTERED, m_LPPinpadStatus);
  394. m_nCurrentPinLen = m_nMaxPinLen;
  395. LogM("Exceed the maximum length.");
  396. ret = SaveErrorInfo(STATUS_INVALID_PIN_LENGTH);
  397. goto END_LABEL;
  398. }
  399. }
  400. else if (byCurrentChar == 0x1B || byCurrentChar == 0x08)//取消Cancel || 清除Clear(BackSpace)
  401. {
  402. ch = byCurrentChar;
  403. for (i = 0; i < (DWORD)m_nCurrentPinLen; i++)
  404. {
  405. ZT598M1FD_DevCtrl->DelEntryPinKey(DELETE_LAST_ENTERED, m_LPPinpadStatus);
  406. }
  407. m_nCurrentPinLen = 0;
  408. }
  409. else if (byCurrentChar == 0x0D || byCurrentChar == 0x2A) //确认Enter
  410. {
  411. ch = byCurrentChar;
  412. if (m_bConfirm)
  413. {
  414. for (i = m_pinpadReadData.dwCurrentRead; i < m_pinpadReadData.dwSize; i++)
  415. {
  416. byCurrentChar = m_pinpadReadData.data[m_pinpadReadData.dwCurrentRead];
  417. m_pinpadReadData.dwCurrentRead++;
  418. if (byCurrentChar == 0x00)
  419. {
  420. ZT598M1FD_DevCtrl->DelEntryPinKey(DELETE_LAST_ENTERED, m_LPPinpadStatus);
  421. }
  422. }
  423. lRet = ZT598M1FD_DevCtrl->SetEntryMode(CLOSE_ENTRY, 0xFFFF, 0xFFFF);
  424. //lRet = ZT598M1FD_DevCtrl->SetControlMode(CONTROL_MODE_SBS, eBeep); //close sound
  425. m_nCurrentEntryMode = CLOSE_ENTRY;
  426. }
  427. }
  428. else if (byCurrentChar == 0x2e || byCurrentChar == 0x4f)//'.' || '00'
  429. {
  430. ch = 0x3d;
  431. }
  432. else
  433. {
  434. //special char
  435. LogM("KeyRead: return special char:%c(0x%02X) ", byCurrentChar, byCurrentChar);
  436. switch (byCurrentChar)
  437. {
  438. case 0x80:
  439. ret = SaveErrorInfo(ERR_PIN_PRESS_KEY_OVERTIME);
  440. break;
  441. case 0x81:
  442. if (m_nCurrentPinLen == 0)
  443. {
  444. ret = SaveErrorInfo(ERR_PIN_TIMEOUT);
  445. //SaveErrorInfo("等待按键输入超时", DEC_PRESS_KEY_TIMEOUT);
  446. }
  447. else
  448. {
  449. ret = SaveErrorInfo(ERR_PIN_TIMEOUT);
  450. //SaveErrorInfo("两次按键间隔时间超时", DEC_PRESS_KEY_INTERVAL_TIMEOUT);
  451. }
  452. break;
  453. default:
  454. ret = SaveErrorInfo(ERR_PIN_KEY_CODE_NOT_FOUND);
  455. break;
  456. }
  457. goto END_LABEL;
  458. }
  459. //sensitive info
  460. LogM("PinRead: return char:%c(0x%02X)", ch, ch);
  461. LogM("pinpadReadData.dwSize:%d pinpadReadData.dwCurrentRead:%d", m_pinpadReadData.dwSize, m_pinpadReadData.dwCurrentRead);
  462. goto END_LABEL;
  463. }
  464. else
  465. {
  466. //no key pressed
  467. ret = SaveErrorInfo(STATUS_PIN_NOPIN);
  468. goto END_LABEL;
  469. }
  470. END_LABEL:
  471. LogM("<==Leave PinPadClassImpl::PinRead() return %d", ret);
  472. return ret;
  473. }
  474. ErrorCodeEnum PinPadClassImpl::StartPinInputCommon(BYTE byLen)
  475. {
  476. LOG_FUNCTION();
  477. LogM("==>Enter PinPadClassImpl::StartPinInputCommon()");
  478. LogM("byLen=%d", byLen);
  479. ErrorCodeEnum ret = Error_Succeed;
  480. LONG lRet = STATUS_SUCCESS;
  481. BYTE byData[9] = {0};
  482. DWORD dwDataLen = 0;
  483. BYTE byTextBufer[256] = {0};
  484. int iConfirm = m_bConfirm ? 1 : 0;
  485. BOOL bBeep = m_nCurrentEntryMode == TEXT_ENTRY? m_cfgSP.bGetDataBeep:m_cfgSP.bGetPinBeep;
  486. ControlCodeBeep eBeep = bBeep?OPEN_BEEP_SOUND:CLOSE_BEEP_SOUND;
  487. if(!m_bDevOpen)
  488. {
  489. lRet = ERR_PIN_DEVNOTOPEN;
  490. LogM("PinPad:Device not open");
  491. goto END_LABEL;
  492. }
  493. LogM("StartInput Mode: %s", m_nCurrentEntryMode == PIN_ENTRY ? "ENTRY_MODE_PIN" : m_nCurrentEntryMode == TEXT_ENTRY? "ENTRY_MODE_TEXT" : "ENTRY_MODE_ELSE");
  494. if (m_nCurrentEntryMode != TEXT_ENTRY && byLen == 0)
  495. {
  496. lRet = ERR_PARAM_ERROR;
  497. goto END_LABEL;
  498. }
  499. m_nCurrentPinLen = 0;
  500. m_nMaxPinLen = byLen;
  501. m_pinpadReadData.dwSize = 0;
  502. m_pinpadReadData.dwCurrentRead = 0;
  503. memset(m_pinpadReadData.data, 0x00, MAX_PIN_READ_SIZE);
  504. //清除缓冲势
  505. lRet = ZT598M1FD_DevCtrl->SetEntryMode(CLOSE_ENTRY, 0xFFFF, 0xFFFF);
  506. lRet = ZT598M1FD_DevCtrl->ReadEntryText(byTextBufer, sizeof(byTextBufer));
  507. lRet = ZT598M1FD_DevCtrl->SetControlMode(CONTROL_MODE_SBS, eBeep);
  508. lRet = ZT598M1FD_DevCtrl->SetEntryMode(m_nCurrentEntryMode, 0x0000, 0x0000);
  509. //lRet = ZT598M1FD_DevCtrl->ReadEntryText(byTextBufer, sizeof(byTextBufer));
  510. //lRet = ZT598M1FD_DevCtrl->ReadEntryText(byTextBufer, sizeof(byTextBufer));
  511. END_LABEL:
  512. ret = SaveErrorInfo(lRet);
  513. LogM("<==Leave PinPadClassImpl::StartPinInputCommon()return %d", ret);
  514. return ret;
  515. }
  516. ErrorCodeEnum PinPadClassImpl::StartPinInput(BYTE byLen)
  517. {
  518. LogM("==>Enter PinPadClassImpl::StartPinInput()");
  519. LogM("byLen=%d", byLen);
  520. ErrorCodeEnum ret = Error_Succeed;
  521. LONG lRet = STATUS_SUCCESS;
  522. m_bConfirm = FALSE;
  523. m_nCurrentEntryMode = PIN_ENTRY;
  524. ret = StartPinInputCommon(byLen);
  525. LogM("<==Leave PinPadClassImpl::StartPinInput()return %d", ret);
  526. return ret;
  527. }
  528. ErrorCodeEnum PinPadClassImpl::StartPinInputConfirm(BYTE byLen)
  529. {
  530. LOG_FUNCTION();
  531. LogM("==>Enter PinPadClassImpl::StartPinInputConfirm()");
  532. LogM("byLen=%d", byLen);
  533. ErrorCodeEnum ret = Error_Succeed;
  534. LONG lRet = STATUS_SUCCESS;
  535. m_bConfirm = TRUE;
  536. m_nCurrentEntryMode = PIN_ENTRY;
  537. lRet = StartPinInputCommon(byLen);
  538. if(lRet != STATUS_SUCCESS)
  539. {
  540. ret = SaveErrorInfo(lRet);
  541. goto END_LABEL;
  542. }
  543. END_LABEL:
  544. LogM("<==Leave PinPadClassImpl::StartPinInputConfirm()return %d", ret);
  545. return ret;
  546. }
  547. ErrorCodeEnum PinPadClassImpl::StartPlainInput()
  548. {
  549. LOG_FUNCTION();
  550. LogM("==>Enter PinPadClassImpl::StartPlainInput()");
  551. ErrorCodeEnum ret = Error_Succeed;
  552. LONG lRet = STATUS_SUCCESS;
  553. if(!m_bDevOpen)
  554. {
  555. ret = SaveErrorInfo(ERR_PIN_DEVNOTOPEN);
  556. LogM("PinPad:Device not open");
  557. goto END_LABEL;
  558. }
  559. m_nCurrentEntryMode = TEXT_ENTRY;
  560. lRet = StartPinInputCommon(0);
  561. if(lRet != STATUS_SUCCESS)
  562. {
  563. ret = SaveErrorInfo(lRet);
  564. goto END_LABEL;
  565. }
  566. END_LABEL:
  567. LogM("<==Leave PinPadClassImpl::StartPlainInput() return %d", ret);
  568. return ret;
  569. }
  570. ErrorCodeEnum PinPadClassImpl::StopInput()
  571. {
  572. LOG_FUNCTION();
  573. LogM("==>Enter PinPadClassImpl::StopInput()");
  574. ErrorCodeEnum ret = Error_Succeed;
  575. LONG lRet = STATUS_SUCCESS;
  576. if(!m_bDevOpen)
  577. {
  578. ret = SaveErrorInfo(ERR_PIN_DEVNOTOPEN);
  579. LogM("PinPad:Device not open");
  580. goto END_LABEL;
  581. }
  582. m_bConfirm = false;
  583. m_pinpadReadData.dwSize = 0;
  584. m_pinpadReadData.dwCurrentRead = 0;
  585. memset(m_pinpadReadData.data, 0x00, MAX_PIN_READ_SIZE);
  586. lRet = ZT598M1FD_DevCtrl->SetEntryMode(CLOSE_ENTRY, 0xFFFF, 0xFFFF);
  587. m_nCurrentEntryMode = CLOSE_ENTRY;
  588. {
  589. ret = SaveErrorInfo(lRet);
  590. goto END_LABEL;
  591. }
  592. END_LABEL:
  593. LogM("<==Leave PinPadClassImpl::StopInput()return %d", ret);
  594. return ret;
  595. }
  596. ErrorCodeEnum PinPadClassImpl::LoadMasterKey(MasterKeyParam masterKey)
  597. {
  598. LOG_FUNCTION();
  599. ErrorCodeEnum ret = Error_Succeed;
  600. LogM("==>Enter PinPadClassImpl::LoadMasterKey()");
  601. LogM( "masterKey.smFlag=%d masterKey.dwSN=%d masterkey.keylength=%d", masterKey.smFlag, masterKey.dwSN, strlen((CHAR*)masterKey.key));
  602. LONG lRet = STATUS_SUCCESS;
  603. CHAR szKeyName[32] = {0};
  604. BOOL bSM = masterKey.smFlag;
  605. BYTE byValue[MAX_MASTER_KEY_SIZE / 2] = {0};
  606. //DevCtrl LoadKey Param
  607. WORD wKeyType = bSM? KEY_TYPE_SM4:KEY_TYPE_DES;
  608. LPSTR lpsKeyName = szKeyName;
  609. LPSTR lpsEncKeyName = NULL;
  610. DWORD dwUse = 0;
  611. LPBYTE lpbKeyData = byValue;
  612. USHORT usKeyLength = 0;
  613. WORD wKeyCheckMode = PIN_KCVNONE;
  614. LPBYTE lpbKCVData = NULL;
  615. USHORT usKCVLength = 0;
  616. BYTE byKCV[SHORT_BUFF_SIZE_3] = {0};
  617. WORD wKCVLen = sizeof(byKCV);
  618. if(!m_bDevOpen)
  619. {
  620. ret = SaveErrorInfo(ERR_PIN_DEVNOTOPEN);
  621. LogM("PinPad:Device not open");
  622. goto END_LABEL;
  623. }
  624. if (masterKey.smFlag > 1 || masterKey.smFlag < 0)
  625. {
  626. ret = SaveErrorInfo(ERR_PARAM_ERROR);
  627. LogM("PinPad:masterkey.smFlag is invalid param");
  628. return Error_Param;
  629. }
  630. //keyName
  631. sprintf(szKeyName, "%s%s%d", bSM? SM_KEY_NAME_PREFIX : DES_KEY_NAME_PREFIX, MASTER_KEY_NAEM_LABEL, masterKey.dwSN);
  632. //KeyValue
  633. usKeyLength = CDataConvert::StringToHex((CHAR*)masterKey.key, sizeof(masterKey.key), byValue, sizeof(byValue));
  634. //KeyUse
  635. dwUse = ATTR_MK /*| (bSM ? ATTR_SM4 : 0)*/;
  636. lRet = ZT598M1FD_DevCtrl->LoadKey(wKeyType, lpsKeyName, dwUse, lpbKeyData, usKeyLength,
  637. wKeyCheckMode, lpsEncKeyName, lpbKCVData, usKCVLength, byKCV, wKCVLen, m_LPPinpadStatus);
  638. if(lRet != STATUS_SUCCESS)
  639. {
  640. ret = SaveErrorInfo(lRet);
  641. goto END_LABEL;
  642. }
  643. END_LABEL:
  644. LogM("<==Leave PinPadClassImpl::LoadMasterKey()return %d", ret);
  645. return ret;
  646. }
  647. ErrorCodeEnum PinPadClassImpl::LoadWorkingKey(WorkKeyParam wkKey)
  648. {
  649. LOG_FUNCTION();
  650. ErrorCodeEnum ret = Error_Succeed;
  651. LogM("==>Enter PinPadClassImpl::LoadWorkingKey()");
  652. LogM( "wkKey.smFlag=%d wkKey.dwWorkingSN=%d wkKey.dwMasterSN=%d swkKey.keylength=%d", wkKey.smFlag, wkKey.dwWorkingSN, wkKey.dwMasterSN, strlen((CHAR*)wkKey.key));
  653. LONG lRet = STATUS_SUCCESS;
  654. CHAR szKeyName[32] = {0};
  655. CHAR szEncKeyName[32] = {0};
  656. BOOL bSM = wkKey.smFlag;
  657. BYTE byValue[MAX_WORKING_KEY_SIZE/ 2] = {0};
  658. //DevCtrl LoadKey Param
  659. WORD wKeyType = bSM? KEY_TYPE_SM4:KEY_TYPE_DES;
  660. LPSTR lpsKeyName = szKeyName;
  661. LPSTR lpsEncKeyName = szEncKeyName;
  662. DWORD dwUse = 0;
  663. LPBYTE lpbKeyData = byValue;
  664. USHORT usKeyLength = 0;
  665. WORD wKeyCheckMode = PIN_KCVNONE;
  666. LPBYTE lpbKCVData = NULL;
  667. USHORT usKCVLength = 0;
  668. BYTE byKCV[SHORT_BUFF_SIZE_3] = {0};
  669. WORD wKCVLen = sizeof(byKCV);
  670. if(!m_bDevOpen)
  671. {
  672. ret = SaveErrorInfo(ERR_PIN_DEVNOTOPEN);
  673. LogM("PinPad:Device not open");
  674. goto END_LABEL;
  675. }
  676. if (wkKey.smFlag > 1 || wkKey.smFlag < 0)
  677. {
  678. ret = SaveErrorInfo(ERR_PARAM_ERROR);
  679. LogM("PinPad:wkKey.smFlag is invalid param");
  680. return Error_Param;
  681. }
  682. //keyName
  683. sprintf(szKeyName, "%s%s%d", bSM? SM_KEY_NAME_PREFIX : DES_KEY_NAME_PREFIX, WORKING_KEY_NAEM_LABEL, wkKey.dwWorkingSN);
  684. sprintf(szEncKeyName, "%s%s%d", bSM? SM_KEY_NAME_PREFIX : DES_KEY_NAME_PREFIX, MASTER_KEY_NAEM_LABEL, wkKey.dwMasterSN);
  685. //KeyValue
  686. usKeyLength = CDataConvert::StringToHex((CHAR*)wkKey.key, sizeof(wkKey.key), byValue, sizeof(byValue));
  687. //KeyUse
  688. dwUse = ATTR_DK | ATTR_PK | ATTR_AK /*| (bSM ? ATTR_SM4 : 0)*/;
  689. lRet = ZT598M1FD_DevCtrl->LoadKey(wKeyType, lpsKeyName, dwUse, lpbKeyData, usKeyLength,
  690. wKeyCheckMode, lpsEncKeyName, lpbKCVData, usKCVLength, byKCV, wKCVLen, m_LPPinpadStatus);
  691. if(lRet != STATUS_SUCCESS)
  692. {
  693. ret = SaveErrorInfo(lRet);
  694. goto END_LABEL;
  695. }
  696. END_LABEL:
  697. LogM("<==Leave PinPadClassImpl::LoadWorkingKey()return %d", ret);
  698. return ret;
  699. }
  700. ErrorCodeEnum PinPadClassImpl::ActiveWorkingKey(DWORD dwMkSN, DWORD dwWkSN)
  701. {
  702. LOG_FUNCTION();
  703. LogM("<==Enter PinPadClassImpl::ActiveWorkingKey()");
  704. LogM( "Active: dwMkSN=%d dwWkSN=%d", dwMkSN, dwWkSN);
  705. m_dwMasterKeySN = dwMkSN;
  706. m_dwWorkingKeySN = dwWkSN;
  707. LogM("<==Leave PinPadClassImpl::ActiveWorkingKey()return Error_Succeed");
  708. return Error_Succeed;
  709. }
  710. ErrorCodeEnum PinPadClassImpl::SetParam(SetParamTypeEnum eType, SetParamValueEnum eValue)
  711. {
  712. LOG_FUNCTION();
  713. LogM("<==Enter PinPadClassImpl::SetParam()");
  714. LogM("eType=%d, eValue=%d", eType, eValue);
  715. switch (eType)
  716. {
  717. case EPP_PT_SET_ENCRYPT_METHOD:
  718. m_enumEncryptMethod = eValue;
  719. switch (m_enumEncryptMethod)
  720. {
  721. case EPP_ALGO_METHOD_DES:
  722. m_bSM = FALSE;
  723. if (m_enumEcbCbcMode == EPP_ALGO_MODE_ECB)
  724. //m_wCryptDataAlgorithm = PIN_CRYPTDESECB/*CRYPT_DESECB*/;
  725. m_wCryptDataAlgorithm = PIN_CRYPT_ECB;
  726. else if (m_enumEcbCbcMode == EPP_ALGO_MODE_CBC)
  727. //m_wCryptDataAlgorithm = PIN_CRYPTDESCBC;
  728. m_wCryptDataAlgorithm = PIN_CRYPT_CBC;
  729. break;
  730. case EPP_ALGO_METHOD_3DES:
  731. m_bSM = FALSE;
  732. if (m_enumEcbCbcMode == EPP_ALGO_MODE_ECB)
  733. //m_wCryptDataAlgorithm = PIN_CRYPTTRIDESECB;
  734. m_wCryptDataAlgorithm = PIN_CRYPT_ECB;
  735. else if (m_enumEcbCbcMode == EPP_ALGO_MODE_CBC)
  736. //m_wCryptDataAlgorithm = PIN_CRYPTTRIDESCBC;
  737. m_wCryptDataAlgorithm = PIN_CRYPT_CBC;
  738. break;
  739. case EPP_ALGO_METHOD_DES_TMK:
  740. m_bSM = FALSE;
  741. m_wCryptMacAlgorithm = PIN_CRYPTDESMAC;
  742. break;
  743. case EPP_ALGO_METHOD_3DES_TMK:
  744. m_wCryptMacAlgorithm = PIN_CRYPTTRIDESMAC;
  745. break;
  746. case EPP_ALGO_METHOD_SM4:
  747. m_bSM = TRUE;
  748. if (m_enumEcbCbcMode == EPP_ALGO_MODE_ECB)
  749. m_wCryptDataAlgorithm = PIN_CRYPTSM4ECB;
  750. else if (m_enumEcbCbcMode == EPP_ALGO_MODE_CBC)
  751. m_wCryptDataAlgorithm = PIN_CRYPTSM4CBC;
  752. break;
  753. default:
  754. SaveErrorInfo(STATUS_INVALID_DATA_SPECIFIED);
  755. return Error_Param;
  756. break;
  757. }
  758. break;
  759. case EPP_PT_SET_MAC_ALGORITH:
  760. m_bSM = FALSE;
  761. m_enumMacAlgrithm = eValue;
  762. switch (m_enumMacAlgrithm)
  763. {
  764. case EPP_MAC_ALGO_ASNIX99:
  765. m_wMacMode = MAC_99;
  766. break;
  767. case EPP_MAC_ALGO_PBOC:
  768. if (m_enumEncryptMethod == EPP_ALGO_METHOD_SM4)
  769. {
  770. m_bSM = TRUE;
  771. m_wMacMode = /*SM4_*/MAC_PBOC;
  772. }
  773. else
  774. {
  775. m_wMacMode = MAC_PBOC;
  776. }
  777. break;
  778. case EPP_MAC_ALGO_UNIONPAY:
  779. if (m_enumEncryptMethod == EPP_ALGO_METHOD_SM4)
  780. {
  781. m_bSM = TRUE;
  782. m_wMacMode = /*SM4_*/MAC_UNION_PAY;
  783. }
  784. else
  785. {
  786. m_wMacMode = MAC_UNION_PAY;
  787. }
  788. break;
  789. default:
  790. SaveErrorInfo(STATUS_INVALID_DATA_SPECIFIED);
  791. return Error_Param;
  792. break;
  793. }
  794. break;
  795. case EPP_PT_SET_PIN_ALGORITH:
  796. m_enumPinAlgrithm = eValue;
  797. switch (m_enumPinAlgrithm)
  798. {
  799. case EPP_PIN_ALGO_ISO9564_1_ANSI:
  800. m_bSM = FALSE;
  801. m_wPinFormat = PIN_FORMANSI;
  802. break;
  803. case EPP_PIN_ALGO_IBM3624:
  804. m_bSM = FALSE;
  805. m_wPinFormat = PIN_FORM3624;
  806. break;
  807. case EPP_PIN_ALGO_SM4:
  808. m_bSM = TRUE;
  809. m_wPinFormat = PIN_FORMISO0; //TODO:WFS_PIN_FORMANSI or WFS_PIN_FORMISO0?
  810. break;
  811. default:
  812. SaveErrorInfo(STATUS_INVALID_DATA_SPECIFIED);
  813. return Error_Param;
  814. break;
  815. }
  816. break;
  817. case EPP_PT_SET_ECB_CBC_MODE:
  818. m_enumEcbCbcMode = eValue;
  819. switch (m_enumEcbCbcMode)
  820. {
  821. case EPP_ALGO_MODE_DEC_ECB:
  822. case EPP_ALGO_MODE_3DEC_ECB:
  823. case EPP_ALGO_MODE_ECB:
  824. m_enumEcbCbcMode = EPP_ALGO_MODE_ECB;
  825. m_wCryptDataAlgorithm = PIN_CRYPT_ECB;
  826. break;
  827. case EPP_ALGO_MODE_DEC_CBC:
  828. case EPP_ALGO_MODE_3DEC_CBC:
  829. case EPP_ALGO_MODE_CBC:
  830. m_enumEcbCbcMode = EPP_ALGO_MODE_CBC;
  831. m_wCryptDataAlgorithm = PIN_CRYPT_CBC;
  832. break;
  833. default:
  834. SaveErrorInfo(STATUS_INVALID_DATA_SPECIFIED);
  835. return Error_Param;
  836. break;
  837. }
  838. break;
  839. default:
  840. SaveErrorInfo(STATUS_INVALID_DATA_SPECIFIED);
  841. return Error_Param;
  842. break;
  843. }
  844. switch(m_wCryptMacAlgorithm)
  845. {
  846. case PIN_CRYPTTRIDESMAC:
  847. case PIN_CRYPTTRIDESCBC:
  848. case PIN_CRYPTTRIDESECB:
  849. m_byPattern = PIN_CRYPT_TDES;
  850. break;
  851. case PIN_CRYPTDESCBC:
  852. case PIN_CRYPTDESECB:
  853. case PIN_CRYPTDESMAC:
  854. m_byPattern = PIN_CRYPT_DES;
  855. break;
  856. default:
  857. m_byPattern = PIN_CRYPT_TDES;
  858. break;
  859. }
  860. LogM("==>Leave PinPadClassImpl::SetParam()return Error_Succeed");
  861. return Error_Succeed;
  862. }
  863. ErrorCodeEnum PinPadClassImpl::EncryptData(EnDecryptInfo srcInfo, EnDecryptInfo &destInfo)
  864. {
  865. LOG_FUNCTION();
  866. LogM("<==Enter PinPadClassImpl::EncryptData()");
  867. ErrorCodeEnum ret = EncryptCommon(srcInfo, destInfo);
  868. LogM("==>Leave PinPadClassImpl::EncryptData()return %d", ret);
  869. return ret;
  870. }
  871. ErrorCodeEnum PinPadClassImpl::MacEncrypt(EnDecryptInfo srcInfo, EnDecryptInfo &destInfo)
  872. {
  873. LOG_FUNCTION();
  874. LogM("<==Enter PinPadClassImpl::MacEncrypt()");
  875. ErrorCodeEnum ret = EncryptCommon(srcInfo, destInfo, TRUE);
  876. LogM("==>Leave PinPadClassImpl::MacEncrypt()return %d", ret);
  877. return ret;
  878. }
  879. ErrorCodeEnum PinPadClassImpl::GetPinBlock(PinBlock &block)
  880. {
  881. LOG_FUNCTION();
  882. LogM("==>Enter PinPadClassImpl::GetPinBlock()");
  883. ErrorCodeEnum ret = Error_Succeed;
  884. LONG lRet = STATUS_SUCCESS;
  885. WORD wKeyType = m_bSM? KEY_TYPE_SM4:KEY_TYPE_DES;
  886. CHAR szKeyName[32] = {0};
  887. LPSTR lpsKeyName =szKeyName;
  888. WORD wFormat = PIN_FORM3624;
  889. BYTE byPadding = 0x0F;
  890. LPSTR lpsXORData = NULL;
  891. LPSTR lpsEncKeyName = NULL;
  892. BYTE byResult[SHORT_BUFF_SIZE_3] = {0};
  893. WORD wResultLen = sizeof(byResult);
  894. //GetPinBlock(wKeyType, lpsKeyName, wFormat, byPadding, (LPCTSTR)byCustomerData, lpsXORData,
  895. //lpsEncKeyName, byResult, wResultLen, &m_stEPPCtrl.devStatus);
  896. if(!m_bDevOpen)
  897. {
  898. ret = SaveErrorInfo(ERR_PIN_DEVNOTOPEN);
  899. LogM("PinPad:Device not open");
  900. goto END_LABEL;
  901. }
  902. lRet = ZT598M1FD_DevCtrl->SetEntryMode(CLOSE_ENTRY, 0xFFFF, 0xFFFF);
  903. if (sizeof(block.data) == 0 || block.data == NULL)
  904. {
  905. ret = SaveErrorInfo(ERR_PIN_INVALIDDATA);
  906. return Error_Param;
  907. }
  908. sprintf(szKeyName, "%s%s%d", m_bSM ? SM_KEY_NAME_PREFIX : DES_KEY_NAME_PREFIX, WORKING_KEY_NAEM_LABEL, m_dwWorkingKeySN);
  909. wFormat = m_wPinFormat;
  910. lRet = ZT598M1FD_DevCtrl->GetPinBlock(wKeyType, lpsKeyName, wFormat, byPadding, m_wPinFormat == PIN_FORM3624 ? NULL : (LPCTSTR)m_accountInfo.account, lpsXORData,
  911. lpsEncKeyName, byResult, wResultLen, m_LPPinpadStatus);
  912. if(lRet != STATUS_SUCCESS)
  913. {
  914. ret = SaveErrorInfo(lRet);
  915. goto END_LABEL;
  916. }
  917. block.dwSize = CDataConvert::HexToString(byResult, wResultLen, (CHAR*)block.data, sizeof(block.data));
  918. END_LABEL:
  919. LogM("<==Leave PinPadClassImpl::GetPinBlock()return %d", ret);
  920. return ret;
  921. }
  922. ErrorCodeEnum PinPadClassImpl::SetAccNo(AccountInfo accInfo)
  923. {
  924. LOG_FUNCTION();
  925. LogM("==>Enter PinPadClassImpl::SetAccNo():%s", accInfo.account);
  926. if (accInfo.dwAccLen == 0 || accInfo.dwAccLen >= MAX_ACCOUNT_LEN)
  927. {
  928. SaveErrorInfo(ERR_PIN_INVALIDCUSTOMERDATA);
  929. return Error_Param;
  930. }
  931. //sensitive info
  932. memcpy(m_accountInfo.account, accInfo.account, MAX_ACCOUNT_LEN);
  933. m_accountInfo.dwAccLen = accInfo.dwAccLen;
  934. LogM("<==Leave PinPadClassImpl::SetAccNo()return Error_Succeed");
  935. return Error_Succeed;
  936. }
  937. int PinPadClassImpl::GetEncryptFunc()
  938. {
  939. LOG_FUNCTION();
  940. LogM("==>Enter PinPadClassImpl::GetEncryptFunc()");
  941. LogM("<==Leave PinPadClassImpl::GetEncryptFunc()return 0x03");
  942. return 0x03;
  943. }
  944. BOOL PinPadClassImpl::ReadPinpadConfig(/*LPCTSTR lpszSPIniPath,*/
  945. LPPinpadDevConfig lpDevConfig, LPPinpadSPConfig lpSPConfig)
  946. {
  947. LOG_FUNCTION();
  948. CHAR szPath[MAX_PATH] = {0};
  949. CHAR szTemp[MAX_PATH] = {0};
  950. CHAR szKeyCode[MID_BUFF_SIZE_3] = {0};
  951. if (CFileDir::GetFilePathName(
  952. getpid(), INI_ADAPTER_PATH, INI_ADAPTER_FILENAME,
  953. m_sIniPath, sizeof(m_sIniPath)) == FALSE)
  954. {
  955. return FALSE;
  956. }
  957. if ((m_sIniPath == NULL) || (strlen(m_sIniPath) == 0) ||
  958. ((lpDevConfig == NULL) && (lpSPConfig == NULL)))
  959. {
  960. return FALSE;
  961. }
  962. Dl_info path_info;
  963. dladdr("LoadSDKDll",&path_info);
  964. char str_FilePath1[256]{0};
  965. char str_FilePath2[256]{0};
  966. char *a="/keba/DesKeyMap.dat";
  967. char *b="/keba/SM4KeyMap.dat";
  968. memcpy(str_FilePath1,path_info.dli_fname,strlen(path_info.dli_fname));
  969. memcpy(str_FilePath2,path_info.dli_fname,strlen(path_info.dli_fname));
  970. char *pLastSlath1=strrchr(str_FilePath1,'/');
  971. char *pLastSlath2=strrchr(str_FilePath2,'/');
  972. *pLastSlath1=0;
  973. *pLastSlath2=0;
  974. strncat(str_FilePath1,a,strlen(a));
  975. strncat(str_FilePath2,b,strlen(b));
  976. memcpy(lpDevConfig->sDESKeyIndexFilePath, str_FilePath1, strlen(str_FilePath1));
  977. memcpy(lpDevConfig->sSM4KeyIndexFilePath, str_FilePath2, strlen(str_FilePath2));
  978. //memcpy(lpDevConfig->sDESKeyIndexFilePath, "/home/keba/CBPM.ADAPTER/keba/assets/DesKeyMap.dat", sizeof("/home/keba/CBPM.ADAPTER/keba/assets/DesKeyMap.dat"));
  979. //memcpy(lpDevConfig->sSM4KeyIndexFilePath, "/home/keba/CBPM.ADAPTER/keba/assets/SM4KeyMap.dat", sizeof("/home/keba/CBPM.ADAPTER/keba/assets/SM4KeyMap.dat"));
  980. lpDevConfig->bKeyIndexFileSaveToEPP = FALSE;
  981. lpDevConfig->byRemoveInstall = AUTH_INSTALL;
  982. memcpy(szKeyCode, "3132331B00000000343536080000000037383920000000002E304F0D00000000", sizeof("3132331B00000000343536080000000037383920000000002E304F0D00000000"));
  983. CDataConvert::StringToHex(szKeyCode, sizeof(szKeyCode), (LPBYTE)lpDevConfig->byKeyCodeMatrix, sizeof(lpDevConfig->byKeyCodeMatrix));
  984. lpDevConfig->byHWDESKCVMaxLen = 3;
  985. lpDevConfig->byKCVLength = 8;
  986. lpDevConfig->byBeepLength = 0x10;
  987. //lpSPConfig
  988. lpSPConfig->byRemoveInstall = PIN_INSTALL;
  989. lpSPConfig->bGetPinBeep = TRUE;
  990. lpSPConfig->bGetDataBeep = TRUE;
  991. return TRUE;
  992. }
  993. ErrorCodeEnum PinPadClassImpl::EncryptCommon(EnDecryptInfo srcInfo, EnDecryptInfo &destInfo, bool bMac)
  994. {
  995. //todo: deal with byIV
  996. LOG_FUNCTION();
  997. LogM("<==Enter PinPadClassImpl::EncryptCommon()");
  998. ErrorCodeEnum ret = Error_Succeed;
  999. LONG lRet = STATUS_SUCCESS;
  1000. DWORD dwMaxMacDataSize = 0, dwMaxCryptDataSize = 0;
  1001. LPBYTE lpbyResult = NULL;
  1002. ULONGLONG ullDataUnit1 = 0, ullDataUnit2 = 0;
  1003. int i = 0, j = 0;
  1004. BYTE byIV[SHORT_BUFF_SIZE_3] = {0};
  1005. WORD wKeyType = m_bSM? KEY_TYPE_SM4:KEY_TYPE_DES;
  1006. CHAR szKeyName[32] = {0};
  1007. WORD wMode = PIN_MODEENCRYPT;
  1008. BYTE byAlgorithmECBCBC = m_wCryptDataAlgorithm;
  1009. BYTE byPattern = m_byPattern;
  1010. LPBYTE lpbyTempResult = NULL;
  1011. USHORT usCryptDataLen = srcInfo.dwSize/2;
  1012. WORD wTempResultLen = 0;
  1013. LPBYTE lpbyCryptData = new BYTE[usCryptDataLen];
  1014. BYTE byPadding = 0x00;
  1015. LPBYTE lpbyIV = byIV;
  1016. WORD wIVLen = 0;
  1017. WORD wGroupLength = 0;
  1018. LPSTR lpszStartValueKey = NULL;
  1019. LPBYTE lpbyTempCryptData = NULL;
  1020. WORD wTempCryptDataLen = 0;
  1021. WORD wResultLen = 0;
  1022. if(!m_bDevOpen)
  1023. {
  1024. ret = SaveErrorInfo(ERR_PIN_DEVNOTOPEN);
  1025. LogM("PinPad:Device not open");
  1026. goto END_LABEL;
  1027. }
  1028. if (srcInfo.dwSize == 0 || srcInfo.dwSize > MAX_EN_DECRYPT_DATA_SIZE)
  1029. {
  1030. ret = SaveErrorInfo(ERR_PIN_INVALIDDATA);
  1031. return Error_Param;
  1032. }
  1033. //todo: need initialization\wKeyState\pin access denied
  1034. sprintf(szKeyName, "%s%s%d", m_bSM ? SM_KEY_NAME_PREFIX : DES_KEY_NAME_PREFIX, WORKING_KEY_NAEM_LABEL, m_dwWorkingKeySN);
  1035. if((srcInfo.dwSize == 0) || (srcInfo.dwSize != strlen((CHAR*)srcInfo.data)))
  1036. {
  1037. ret = SaveErrorInfo(ERR_PIN_INVALIDDATA);
  1038. return Error_Param;
  1039. }
  1040. if (wKeyType == KEY_TYPE_DES)
  1041. {
  1042. dwMaxMacDataSize = ZT598M1FD_DevCtrl->m_stDevCap.dwMaxDESMacDataSize; //todo
  1043. dwMaxCryptDataSize = ZT598M1FD_DevCtrl->m_stDevCap.dwMaxDESCryptDataSize;
  1044. }
  1045. else if (wKeyType == KEY_TYPE_SM4)
  1046. {
  1047. dwMaxMacDataSize = ZT598M1FD_DevCtrl->m_stDevCap.dwMaxSM4MacDataSize;
  1048. dwMaxCryptDataSize = ZT598M1FD_DevCtrl->m_stDevCap.dwMaxSM4CryptDataSize;
  1049. }
  1050. else
  1051. {
  1052. dwMaxMacDataSize = 0;
  1053. dwMaxCryptDataSize = 256;
  1054. }
  1055. CDataConvert::StringToHex((CHAR*)srcInfo.data, srcInfo.dwSize, lpbyCryptData, usCryptDataLen);
  1056. if(bMac)
  1057. {
  1058. lpbyResult = new BYTE[SHORT_BUFF_SIZE_3];
  1059. lpbyTempCryptData = new BYTE[dwMaxMacDataSize];
  1060. lpbyTempResult = new BYTE[SHORT_BUFF_SIZE_3];
  1061. memset(lpbyResult, 0x00, SHORT_BUFF_SIZE_3);
  1062. for (i = 0; i < (int)((usCryptDataLen - 1) / dwMaxMacDataSize + 1); i++)
  1063. {
  1064. memset(lpbyTempCryptData, 0x00, dwMaxMacDataSize);
  1065. if (i == (int)((usCryptDataLen - 1) / dwMaxMacDataSize))
  1066. {
  1067. wTempCryptDataLen = usCryptDataLen % dwMaxMacDataSize;
  1068. if (wTempCryptDataLen == 0)
  1069. {
  1070. wTempCryptDataLen = (WORD)dwMaxMacDataSize;
  1071. }
  1072. }
  1073. else
  1074. {
  1075. wTempCryptDataLen = (WORD)dwMaxMacDataSize;
  1076. }
  1077. memcpy(lpbyTempCryptData, lpbyCryptData + dwMaxMacDataSize * i, wTempCryptDataLen);
  1078. if (i == 0)
  1079. {
  1080. lpszStartValueKey = NULL;
  1081. wIVLen = 0;
  1082. lpbyIV = byIV;
  1083. }
  1084. else
  1085. {
  1086. lpszStartValueKey = NULL;
  1087. wIVLen = (wKeyType == KEY_TYPE_SM4) ? SM4_DATA_GROUP_LENGTH : DES_DATA_GROUP_LENGTH;
  1088. memcpy(byIV, lpbyTempResult, wIVLen);
  1089. memset(lpbyTempResult, 0x00, SHORT_BUFF_SIZE_3);
  1090. if ((wKeyType == KEY_TYPE_DES) && (m_wMacMode == MAC_UNION_PAY))
  1091. //if ((wKeyType == KEY_TYPE_DES) && (m_wMacMode == PIN_MAC_UNIONPAY))
  1092. {
  1093. while (wTempCryptDataLen < DES_DATA_GROUP_LENGTH)
  1094. {
  1095. *(lpbyTempCryptData + wTempCryptDataLen) = byPadding;
  1096. wTempCryptDataLen++;
  1097. }
  1098. memcpy(&ullDataUnit2, lpbyTempCryptData, sizeof(ullDataUnit2));
  1099. ullDataUnit1 ^= ullDataUnit2;
  1100. memcpy(lpbyTempCryptData, &ullDataUnit1, sizeof(ullDataUnit1));
  1101. }
  1102. }
  1103. if (wKeyType == KEY_TYPE_DES)
  1104. {
  1105. if (i == (int)((usCryptDataLen - 1) / dwMaxMacDataSize))
  1106. {
  1107. //byAlgorithmMac = (wKeyType == KEY_TYPE_SM4) ? m_cfgSP.bySM4AlgorithmMac : m_cfgSP.byAlgorithmMac;
  1108. //byAlgorithmMac = m_wMacMode;
  1109. }
  1110. else
  1111. {
  1112. if(m_wMacMode == PIN_MAC_UNIONPAY)
  1113. {
  1114. ullDataUnit1 = 0;
  1115. for (j = 0; j < (int)(dwMaxMacDataSize / 8); j++)
  1116. {
  1117. memcpy(&ullDataUnit2, lpbyTempCryptData + 8 * j, sizeof(ullDataUnit2));
  1118. ullDataUnit1 ^= ullDataUnit2;
  1119. }
  1120. memcpy(lpbyTempResult, &ullDataUnit1, sizeof(ullDataUnit1));
  1121. continue;
  1122. }
  1123. }
  1124. }
  1125. else if (wKeyType == KEY_TYPE_SM4)
  1126. {
  1127. //byAlgorithmMac = (wKeyType == KEY_TYPE_SM4) ? m_cfgSP.bySM4AlgorithmMac : m_cfgSP.byAlgorithmMac;
  1128. }
  1129. wTempResultLen = SHORT_BUFF_SIZE_3;
  1130. wResultLen = SHORT_BUFF_SIZE_3;
  1131. lRet = ZT598M1FD_DevCtrl->CalcMac(wKeyType, szKeyName, m_wMacMode, lpbyTempCryptData, wTempCryptDataLen, byPadding,
  1132. byIV, wIVLen, lpszStartValueKey, NULL, 0, lpbyTempResult, wTempResultLen, m_LPPinpadStatus);
  1133. wResultLen = wTempResultLen;
  1134. memcpy(lpbyResult, lpbyTempResult, wResultLen);
  1135. }
  1136. }
  1137. else
  1138. {
  1139. if (wKeyType != KEY_TYPE_RSA)
  1140. {
  1141. lpbyResult = new BYTE[usCryptDataLen + SHORT_BUFF_SIZE_3];//可能有补码而且考虑兼容SM所乿+SHORT_BUFF_SIZE_3
  1142. memset(lpbyResult, 0x00, usCryptDataLen + SHORT_BUFF_SIZE_3);
  1143. }
  1144. else
  1145. {
  1146. lpbyResult = new BYTE[usCryptDataLen + 256];//可能有补码而且考虑兼容SM所乿+SHORT_BUFF_SIZE_3
  1147. memset(lpbyResult, 0x00, usCryptDataLen + 256);
  1148. }
  1149. lpbyTempCryptData = new BYTE[dwMaxCryptDataSize];
  1150. lpbyTempResult = new BYTE[dwMaxCryptDataSize];
  1151. if (wMode == PIN_MODEENCRYPT)
  1152. {
  1153. for (i = 0; i < (int)((usCryptDataLen - 1) / dwMaxCryptDataSize + 1); i++)
  1154. {
  1155. memset(lpbyTempCryptData, 0x00, dwMaxCryptDataSize);
  1156. if (i == (int)((usCryptDataLen - 1) / dwMaxCryptDataSize))
  1157. {
  1158. wTempCryptDataLen = usCryptDataLen % dwMaxCryptDataSize;
  1159. if (wTempCryptDataLen == 0)
  1160. {
  1161. wTempCryptDataLen = (WORD)dwMaxCryptDataSize;
  1162. }
  1163. }
  1164. else
  1165. {
  1166. wTempCryptDataLen = (WORD)dwMaxCryptDataSize;
  1167. }
  1168. memcpy(lpbyTempCryptData, lpbyCryptData + dwMaxCryptDataSize * i, wTempCryptDataLen);
  1169. if (byAlgorithmECBCBC == PIN_CRYPT_CBC)
  1170. {
  1171. if (i == 0)
  1172. {
  1173. lpszStartValueKey = NULL;
  1174. wIVLen = 0;
  1175. memset(byIV, 0x00, sizeof(byIV));
  1176. }
  1177. else
  1178. {
  1179. lpszStartValueKey = NULL;
  1180. wIVLen = (wKeyType == KEY_TYPE_SM4) ? SM4_DATA_GROUP_LENGTH : DES_DATA_GROUP_LENGTH;
  1181. memcpy(byIV, lpbyTempResult + (dwMaxCryptDataSize - wIVLen), wIVLen);
  1182. memset(lpbyTempResult, 0x00, dwMaxCryptDataSize);
  1183. }
  1184. }
  1185. else
  1186. {
  1187. wIVLen = 0;
  1188. lpszStartValueKey = NULL;
  1189. memset(byIV, 0x00, sizeof(byIV));
  1190. }
  1191. wTempResultLen = (WORD)dwMaxCryptDataSize;
  1192. lRet = ZT598M1FD_DevCtrl->CryptData(wKeyType, szKeyName, wMode, byAlgorithmECBCBC, byPattern, lpbyTempCryptData, wTempCryptDataLen, byPadding,
  1193. byIV, wIVLen, lpszStartValueKey, NULL, 0, lpbyTempResult, wTempResultLen, m_LPPinpadStatus);
  1194. wResultLen += wTempResultLen;
  1195. memcpy(lpbyResult + dwMaxCryptDataSize * i, lpbyTempResult, wTempResultLen);
  1196. }
  1197. }
  1198. else if (wMode == PIN_MODEDECRYPT)
  1199. {
  1200. for (i = (int)((usCryptDataLen - 1) / dwMaxCryptDataSize); i >= 0 ; i--)
  1201. {
  1202. memset(lpbyTempCryptData, 0x00, dwMaxCryptDataSize);
  1203. memset(lpbyTempResult, 0x00, dwMaxCryptDataSize);
  1204. if (i == (int)((usCryptDataLen - 1) / dwMaxCryptDataSize))
  1205. {
  1206. wTempCryptDataLen = usCryptDataLen % dwMaxCryptDataSize;
  1207. if (wTempCryptDataLen == 0)
  1208. {
  1209. wTempCryptDataLen = (WORD)dwMaxCryptDataSize;
  1210. }
  1211. }
  1212. else
  1213. {
  1214. wTempCryptDataLen = (WORD)dwMaxCryptDataSize;
  1215. }
  1216. memcpy(lpbyTempCryptData, lpbyCryptData + dwMaxCryptDataSize * i, wTempCryptDataLen);
  1217. if (wKeyType != KEY_TYPE_RSA)
  1218. {
  1219. if (m_cfgSP.bStartValueUsingPos != FALSE)
  1220. {
  1221. //长度补齐
  1222. while (wTempCryptDataLen % 8 > 0 && wTempCryptDataLen < dwMaxCryptDataSize)
  1223. {
  1224. lpbyTempCryptData[wTempCryptDataLen] = byPadding;
  1225. wTempCryptDataLen++;
  1226. }
  1227. }
  1228. if (byAlgorithmECBCBC == PIN_CRYPT_CBC)
  1229. {
  1230. if (m_cfgSP.bStartValueUsingPos != FALSE)
  1231. {
  1232. wIVLen = 0;
  1233. lpszStartValueKey = NULL;
  1234. memset(byIV, 0x00, sizeof(byIV));
  1235. if (i == 0)
  1236. {
  1237. wIVLen = 0;
  1238. lpszStartValueKey = NULL;
  1239. memset(byIV, 0x00, sizeof(byIV));
  1240. }
  1241. else
  1242. {
  1243. lpszStartValueKey = NULL;
  1244. wIVLen = (wKeyType == KEY_TYPE_SM4) ? SM4_DATA_GROUP_LENGTH : DES_DATA_GROUP_LENGTH;
  1245. memcpy(byIV, lpbyCryptData + dwMaxCryptDataSize * (i - 1) + (dwMaxCryptDataSize - wIVLen), wIVLen);
  1246. }
  1247. if (i == (int)((usCryptDataLen - 1) / dwMaxCryptDataSize))
  1248. {
  1249. if (lpszStartValueKey != NULL)//lpCrypt->lpsStartValueKey不起作用
  1250. {
  1251. wGroupLength = (wKeyType == KEY_TYPE_SM4) ? SM4_DATA_GROUP_LENGTH : DES_DATA_GROUP_LENGTH;
  1252. for (j = 0; j < wGroupLength; j++)
  1253. {
  1254. lpbyTempCryptData[((usCryptDataLen - 1) % dwMaxCryptDataSize) / wGroupLength * wGroupLength + j] ^= lpszStartValueKey[j];
  1255. }
  1256. }
  1257. }
  1258. }
  1259. else
  1260. {
  1261. if (i == 0)
  1262. {
  1263. lpszStartValueKey = NULL;
  1264. if (lpszStartValueKey != NULL )
  1265. {
  1266. wIVLen = 0;
  1267. memcpy(byIV, 0x00, sizeof(byIV));
  1268. }
  1269. }
  1270. else
  1271. {
  1272. lpszStartValueKey = NULL;
  1273. wIVLen = (wKeyType == KEY_TYPE_SM4) ? SM4_DATA_GROUP_LENGTH : DES_DATA_GROUP_LENGTH;
  1274. memcpy(byIV, lpbyCryptData + dwMaxCryptDataSize * (i - 1) + (dwMaxCryptDataSize - wIVLen), wIVLen);
  1275. }
  1276. }
  1277. }
  1278. else
  1279. {
  1280. wIVLen = 0;
  1281. lpszStartValueKey = NULL;
  1282. memset(byIV, 0x00, sizeof(byIV));
  1283. }
  1284. }
  1285. wTempResultLen = (WORD)dwMaxCryptDataSize;
  1286. lRet = ZT598M1FD_DevCtrl->CryptData(wKeyType, szKeyName, wMode, byAlgorithmECBCBC, byPattern, lpbyTempCryptData, wTempCryptDataLen, byPadding,
  1287. byIV, wIVLen, lpszStartValueKey, NULL, 0, lpbyTempResult, wTempResultLen, m_LPPinpadStatus);
  1288. wResultLen += wTempResultLen;
  1289. memcpy(lpbyResult + dwMaxCryptDataSize * i, lpbyTempResult, wTempResultLen);
  1290. }
  1291. }
  1292. else
  1293. {}
  1294. }
  1295. if (lpbyTempCryptData != NULL)
  1296. {
  1297. delete[] lpbyTempCryptData;
  1298. }
  1299. if (lpbyTempResult != NULL)
  1300. {
  1301. delete[] lpbyTempResult;
  1302. }
  1303. if(lRet != STATUS_SUCCESS)
  1304. {
  1305. ret = SaveErrorInfo(lRet);
  1306. goto END_LABEL;
  1307. }
  1308. destInfo.dwSize = CDataConvert::HexToString(lpbyResult, wResultLen, (CHAR*)destInfo.data, sizeof(destInfo.data));
  1309. END_LABEL:
  1310. LogM("==>Leave PinPadClassImpl::EncryptCommon()");
  1311. return ret;
  1312. }
  1313. ErrorCodeEnum PinPadClassImpl::SaveErrorInfo(int iErrCode)
  1314. {
  1315. LOG_FUNCTION();
  1316. ErrorCodeEnum ret;
  1317. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  1318. strcpy(m_szErrMsg, ZT598M1FD_DevCtrl->m_stPinpadStatus.sDescription);
  1319. switch (iErrCode)
  1320. {
  1321. case STATUS_SUCCESS:
  1322. m_shErrCode = DEC_SUCCESS;
  1323. ret = Error_Succeed;
  1324. break;
  1325. case STATUS_INVALID_COMMAND_LENGTH:
  1326. case ERR_COMMON_ERROR:
  1327. m_shErrCode = DEC_INVALID_PARAMETER;
  1328. ret = Error_Param;
  1329. break;
  1330. case STATUS_INVALID_KEYID:
  1331. m_shErrCode = DEC_INVALID_KEY_ID;
  1332. ret = Error_Param;
  1333. break;
  1334. case STATUS_KEYID_NOT_EXIST:
  1335. m_shErrCode = DEC_KEY_NOT_EXIST;
  1336. ret = Error_Param;
  1337. break;
  1338. case STATUS_KEYID_LOCKED:
  1339. m_shErrCode = DEC_KEY_LOCKED;
  1340. ret = Error_Param;
  1341. break;
  1342. case STATUS_INVALID_WRITE_MODE:
  1343. case STATUS_INVALID_IV_ATTRIBUTES:
  1344. case STATUS_INVALID_KEY_ATTRIBUTES:
  1345. case STATUS_KEY_ATTRIBUTES_NOT_MATCHED:
  1346. case STATUS_KEY_USEVIOLATION:
  1347. case STATUS_KEY_NOTALLOWED:
  1348. m_shErrCode = DEC_E_KEY_LOST;
  1349. ret = Error_Param;
  1350. break;
  1351. case STATUS_KCV_VERIFICATION_FAIL:
  1352. case STATUS_INVALID_CHECK_MODE:
  1353. case STATUS_INVALID_VERIFY_MODE:
  1354. m_shErrCode = DEC_E_KCV_VERIFICATION;
  1355. ret = Error_Param;
  1356. break;
  1357. case STATUS_INVALID_AUTHENTICATION_MODE:
  1358. m_shErrCode = DEC_INVALID_AUTHENTICATION_MODE;
  1359. ret = Error_Param;
  1360. break;
  1361. case STATUS_INVALID_MACING:
  1362. m_shErrCode = DEC_INVALID_MAC;
  1363. ret = Error_Param;
  1364. break;
  1365. case STATUS_INVALID_MODE:
  1366. m_shErrCode = DEC_INVALID_MODE;
  1367. ret = Error_Param;
  1368. break;
  1369. case STATUS_INVALID_DATA_SPECIFIED:
  1370. m_shErrCode = DEC_INVALID_PARAMETER;
  1371. ret = Error_Param;
  1372. break;
  1373. case STATUS_INVALID_KEY_VALUE:
  1374. case STATUS_KEY_INVALID:
  1375. m_shErrCode = DEC_INVALID_KEY_VALUE;
  1376. ret = Error_Param;
  1377. break;
  1378. case STATUS_INVALID_KEY_LENGTH:
  1379. case STATUS_INVALID_LENGTH_OR_SUM:
  1380. m_shErrCode = DEC_INVALID_KEY_LEN;
  1381. ret = Error_Param;
  1382. break;
  1383. case STATUS_INVALID_OFFSET_LENGTH:
  1384. m_shErrCode = DEC_INVALID_LENGTH;
  1385. ret = Error_Param;
  1386. break;
  1387. case STATUS_INVALID_PIN_LENGTH:
  1388. case STATUS_PIN_NOPIN:
  1389. case STATUS_INVALID_PIN2_LENGTH:
  1390. m_shErrCode = DEC_INVALID_PIN_LEN;
  1391. ret = Error_Param;
  1392. break;
  1393. case STATUS_PIN_VERIFICATION_FAIL:
  1394. case STATUS_PIN2_VERIFICATION_FAIL:
  1395. m_shErrCode = DEC_VERIFICATION_FAILED;
  1396. ret = Error_Param;
  1397. break;
  1398. case STATUS_PIN_ENCRYPTION_SUSPENDED:
  1399. m_shErrCode = DEC_ENCRYPT_SUSPENDED;
  1400. ret = Error_Param;
  1401. break;
  1402. case STATUS_INVALID_MODULUS_LENGTH:
  1403. case ERR_PIN_INVALID_MOD_LEN:
  1404. m_shErrCode = DEC_INVALID_MODULE_LEN;
  1405. ret = Error_Param;
  1406. break;
  1407. case STATUS_INVALID_EXPONENT_LENGTH:
  1408. m_shErrCode = DEC_INVALID_EXPONENT_LEN;
  1409. ret = Error_Param;
  1410. break;
  1411. case STATUS_INVALID_PKCS_STRUCTURE:
  1412. case STATUS_INVALID_PKCS_PADDING:
  1413. m_shErrCode = DEC_INVALID_PKCS;
  1414. ret = Error_Param;
  1415. break;
  1416. case STATUS_INVALID_SIGNATURE_LENGTH:
  1417. case ERR_PIN_SIG_NOT_SUPP:
  1418. case ERR_PIN_SIG_KEYNOTFOUND:
  1419. case ERR_PIN_SIG_KEYUSEVIOLATION:
  1420. m_shErrCode = DEC_INVALID_SIGNATURE;
  1421. ret = Error_Param;
  1422. break;
  1423. case STATUS_SIGNATURE_VERIFICATION_FAIL:
  1424. m_shErrCode = DEC_E_SIGNATURE_VERIFICATION;
  1425. ret = Error_Param;
  1426. break;
  1427. case STATUS_KEY_NOT_LOADED:
  1428. m_shErrCode = DEC_KEY_NOT_LOADED;
  1429. ret = Error_Param;
  1430. break;
  1431. case STATUS_INVALID_CERTIFICATE_FROMAT:
  1432. case STATUS_INVALID_CERTIFICATE_VERSION:
  1433. case STATUS_INVALID_CERTIFICATE_VALIDITY:
  1434. case STATUS_INVALID_CERTIFICATE_ISSUER:
  1435. case STATUS_INVALID_CERTIFICATE_SUBJECT:
  1436. case STATUS_INVALID_CERTIFICATE_ALGOR:
  1437. case STATUS_CERTIFICATE_NOT_EXIST:
  1438. m_shErrCode = DEC_INVALID_CERTIFICATE;
  1439. ret = Error_Param;
  1440. break;
  1441. case STATUS_INVALID_DATA_DISABLEED:
  1442. m_shErrCode = DEC_INVALID_DATA;
  1443. ret = Error_Param;
  1444. break;
  1445. case STATUS_INVALID_USERBLOCK_ADDRESS:
  1446. m_shErrCode = DEC_INVALID_USER_BLOCK_ADDR;
  1447. ret = Error_Param;
  1448. break;
  1449. case STATUS_INVALID_SERIALNO_SPECIFIED:
  1450. m_shErrCode = DEC_E_SERIAL_NUMBER;
  1451. ret = Error_Param;
  1452. break;
  1453. case STATUS_NO_CARD:
  1454. case STATUS_CARD_APDU_ERROR:
  1455. m_shErrCode = DEC_E_SERIAL_NUMBER;
  1456. ret = Error_Param;
  1457. break;
  1458. case STATUS_EMV_NOT_INITIALIZED:
  1459. case STATUS_EPP_NOT_INITIALIZED:
  1460. case ERR_PIN_NEED_INITIALIZATION:
  1461. m_shErrCode = DEC_EPP_NOT_INITIALIZED;
  1462. ret = Error_Param;
  1463. break;
  1464. case STATUS_EMV_NOT_READY:
  1465. m_shErrCode = DEC_EMV_NOT_READY;
  1466. ret = Error_Param;
  1467. break;
  1468. case STATUS_EMV_NEED_REINITIALIZE:
  1469. m_shErrCode = DEC_EMV_NEED_REINITIALIZE;
  1470. ret = Error_Param;
  1471. break;
  1472. case STATUS_EMV_TIMEOUT:
  1473. m_shErrCode = DEC_EMV_TIMEOUT;
  1474. ret = Error_Param;
  1475. break;
  1476. case STATUS_EMV_ALREADY_INITIALIZED:
  1477. m_shErrCode = DEC_EMV_INIT_ALREADY;
  1478. ret = Error_Param;
  1479. break;
  1480. case STATUS_ALGORITHMNOTSUPP:
  1481. m_shErrCode = DEC_ALGORITHM_UNSUPPORTED;
  1482. ret = Error_Param;
  1483. break;
  1484. case STATUS_COMMANDUPSUPP:
  1485. case STATUS_SM2_ENCRYPT_FAILURE:
  1486. case STATUS_SM2_DECRYPT_FAILURE:
  1487. case STATUS_SM2_SIGNATURE_FAILURE:
  1488. case STATUS_SM2_VERSIG_FAILURE:
  1489. case STATUS_SM2_KEYEXC_FAILURE:
  1490. case STATUS_SM2_VER_KEYEXC_FAILURE:
  1491. case STATUS_FW_VERIFY_FIAL:
  1492. case STATUS_FW_WRITE_FAIL:
  1493. case STATUS_FW_EARSE_FAIL:
  1494. case ERR_PIN_INVALID_FW_FILE:
  1495. m_shErrCode = DEC_COMMAND_UNSUPPORTED;
  1496. ret = Error_Param;
  1497. break;
  1498. case STATUS_ERROR_INTER_ERROR:
  1499. case STATUS_MRAM_HARDWARE_ERROR:
  1500. case STATUS_OTHER_ABNORMAL_ERROR:
  1501. case ERR_INTERNAL_ERROR:
  1502. m_shErrCode = DEC_HARDWARE;
  1503. ret = Error_Hardware;
  1504. break;
  1505. case STATUS_COMMAND_LOCK:
  1506. m_shErrCode = DEC_COMMAND_LOCKED;
  1507. ret = Error_Hardware;
  1508. break;
  1509. case STATUS_INVALID_COMMAND_MAC:
  1510. m_shErrCode = DEC_INVALID_MAC;
  1511. ret = Error_Param;
  1512. break;
  1513. case STATUS_AUTHENTICATION_FAILED:
  1514. case STATUS_NOT_AUTHENTE:
  1515. m_shErrCode = DEC_EPP_NOT_AUTHORIZED;
  1516. ret = Error_Param;
  1517. break;
  1518. case STATUS_EPP_ALREADY_INITIALIZED:
  1519. m_shErrCode = DEC_EPP_INIT_ALREADY;
  1520. ret = Error_Hardware;
  1521. break;
  1522. case STATUS_CERTIFICATE_ALREADY:
  1523. m_shErrCode = DEC_EPP_CERTIFICATE_ALREADY;
  1524. ret = Error_Hardware;
  1525. break;
  1526. case STATUS_PHYSICALLY_NOT_INSTALLED:
  1527. case ERR_PIN_PHYSICALLY_UNINSTALLED:
  1528. m_shErrCode = DEC_EPP_NOT_PHYSICALLY_INSTALLED;
  1529. ret = Error_Hardware;
  1530. break;
  1531. case STATUS_LOGICALLY_NOT_INSTALLED:
  1532. case ERR_PIN_LOGICALLY_UNINSTALLED:
  1533. m_shErrCode = DEC_EPP_NOT_LOGICALLY_INSTALLED;
  1534. ret = Error_Hardware;
  1535. break;
  1536. case STATUS_INPUT_KEY_TIMEOUT:
  1537. m_shErrCode = DEC_PRESS_KEY_TIMEOUT;
  1538. ret = Error_Param;
  1539. break;
  1540. case STATUS_INVLAID_PASSWORD_LENGTH:
  1541. m_shErrCode = DEC_INVALID_PASSWORD_LEN;
  1542. ret = Error_Hardware;
  1543. break;
  1544. case STATUS_INVALID_PASSWORD:
  1545. m_shErrCode = DEC_INVALID_PASSWORD;
  1546. ret = Error_Hardware;
  1547. break;
  1548. case STATUS_INPUT_PASSWORD_LOCKED:
  1549. m_shErrCode = DEC_PASSWORD_UPDATE_CMD_LOCKED;
  1550. ret = Error_Hardware;
  1551. break;
  1552. case STATUS_SYSTEM_TIME_NOT_SET:
  1553. m_shErrCode = DEC_SYSTEM_TIME_NOT_SET;
  1554. ret = Error_Hardware;
  1555. break;
  1556. case STATUS_SYSTEM_TIME_ALREADY_SET:
  1557. m_shErrCode = DEC_SYSTEM_TIME_SET_ALREADY;
  1558. ret = Error_Hardware;
  1559. break;
  1560. case STATUS_DEVICE_TAMPERED:
  1561. m_shErrCode = DEC_DEVICE_TAMPERED;
  1562. ret = Error_Hardware;
  1563. break;
  1564. case STATUS_A980_NO_RESPONSE:
  1565. m_shErrCode = DEC_COMMUNICATION_FAILED;
  1566. ret = Error_Hardware;
  1567. break;
  1568. case STATUS_INVALID_SM4_KEYVAL:
  1569. m_shErrCode = DEC_INVALID_SM4_KEY;
  1570. ret = Error_Param;
  1571. break;
  1572. case STATUS_EXTERNAL_FALSH_WRITE_ERROR:
  1573. case STATUS_FLASH_CRC_CHECK_ERROR:
  1574. m_shErrCode = DEC_E_EXTERNAL_FLASH_HARDWARE;
  1575. ret = Error_Hardware;
  1576. break;
  1577. case STATUS_ADDRESS_OUTRANG:
  1578. m_shErrCode = DEC_INVALID_USER_BLOCK_ADDR;
  1579. ret = Error_Param;
  1580. break;
  1581. case ERR_EXCHANGE_FAILED:
  1582. m_shErrCode = DEC_DEV_NOT_FOUND;
  1583. ret = Error_DevNotAvailable;
  1584. break;
  1585. case ERR_PIN_AUTHENTICATION_FAILED:
  1586. case ERR_PIN_HOST_AUTHENTICATE_FAILED:
  1587. m_shErrCode = DEC_INVALID_AUTHENTICATION_MODE;
  1588. ret = Error_DevNotAvailable;
  1589. break;
  1590. case ERR_PIN_INVALIDCUSTOMERDATA:
  1591. m_shErrCode =DEC_INVALID_PAN;
  1592. ret = Error_Param;
  1593. break;
  1594. case ERR_PIN_ENC_KEYNOTFOUND:
  1595. case ERR_PIN_KEYNOTFOUND:
  1596. case ERR_PIN_STARTVALUE_KEYNOTFOUND:
  1597. m_shErrCode = DEC_INVALID_KEY_ID;
  1598. ret = Error_Param;
  1599. break;
  1600. case ERR_PIN_BATTERY_LOW:
  1601. m_shErrCode = DEC_EPP_BATTERY_LOWORERROR;
  1602. ret = Error_Succeed;
  1603. break;
  1604. case ERR_PIN_INVALIDDATA:
  1605. m_shErrCode = DEC_INVALID_PARAMETER;
  1606. ret = Error_Param;
  1607. break;
  1608. case ERR_PARAM_ERROR:
  1609. m_shErrCode =DEC_INVALID_PARAMETER;
  1610. ret = Error_Param;
  1611. break;
  1612. case ERR_PIN_DEVNOTOPEN:
  1613. m_shErrCode =DEC_DEV_NOT_OPENED;
  1614. ret = Error_DevNotAvailable;
  1615. break;
  1616. case ERR_PIN_INVALIDKEYLENGTH:
  1617. m_shErrCode = DEC_INVALID_KEY_LEN;
  1618. ret = Error_Param;
  1619. break;
  1620. case ERR_PIN_ENC_KEYUSEVIOLATION:
  1621. case ERR_PIN_USEVIOLATION:
  1622. case ERR_PIN_STARTVALUE_KEYUSEVIOLATION:
  1623. m_shErrCode = DEC_KEY_VIOLATION;
  1624. ret = Error_Param;
  1625. break;
  1626. case ERR_PIN_DUPLICATEKEY:
  1627. m_shErrCode = DEC_KEY_LOADED_ALREADY;
  1628. ret = Error_Param;
  1629. break;
  1630. case ERR_DATA_TOO_LONG:
  1631. m_shErrCode = DEC_INVALID_PARAMETER;
  1632. ret = Error_Param;
  1633. case ERR_PIN_NOKEYRAM:
  1634. m_shErrCode = DEC_KEY_NO_MORE_SPACE;
  1635. ret = Error_Hardware;
  1636. break;
  1637. case ERR_PIN_CHECK_KCV_FAILED:
  1638. m_shErrCode = DEC_VERIFICATION_FAILED;
  1639. ret = Error_Param;
  1640. break;
  1641. case ERR_PIN_PRESS_KEY_OVERTIME:
  1642. m_shErrCode = DEC_PRESS_KEY_TIMEOUT;
  1643. ret = Error_DevCommFailed;
  1644. break;
  1645. case ERR_PIN_TIMEOUT:
  1646. m_shErrCode = DEC_PRESS_KEY_TIMEOUT;
  1647. ret = Error_DevCommFailed;
  1648. break;
  1649. case ERR_PIN_KEY_CODE_NOT_FOUND:
  1650. m_shErrCode = DEC_UNEXPECTED_RET_VALUE;
  1651. ret = Error_DevCommFailed;
  1652. break;
  1653. case ERR_PIN_UNSUPPORT:
  1654. case ERR_PIN_NOT_SUPP:
  1655. m_shErrCode = DEC_PIN_FORMAT_UNSUPPORTED;
  1656. ret = Error_Param;
  1657. break;
  1658. default:
  1659. m_shErrCode = DEC_ERROR_CODE_UNRECOGNIZABLE;
  1660. ret = Error_NoDefine;
  1661. break;
  1662. }
  1663. LogM("ErrorInfo:[0x%x][0x%x]:%s", ret, iErrCode, m_szErrMsg);
  1664. return ret;
  1665. }