ZT598MGFD_DevImpl.cpp 81 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939
  1. #include "ZT598MGFD_DevImpl.h"
  2. LOG_EXTERN()
  3. CZT598M1FD_DevImpl::CZT598M1FD_DevImpl(BOOL bIsFather)
  4. {
  5. memset(m_bySndBuff, 0x00, sizeof(m_bySndBuff));
  6. memset(m_byRcvBuff, 0x00, sizeof(m_byRcvBuff));
  7. memset(&m_stCommInfo, 0x00, sizeof(m_stCommInfo));
  8. m_stCommInfo.cdSndData.lpvData = m_bySndBuff;
  9. m_stCommInfo.cdSndData.dwDataLen = 0;
  10. m_stCommInfo.cdRcvData.lpvData = m_byRcvBuff;
  11. m_stCommInfo.cdRcvData.dwDataLen = sizeof(m_byRcvBuff);
  12. m_stCommInfo.dwTimeout = 2000;
  13. m_lpIDevComm = NULL;
  14. m_lpbyUAK = NULL;
  15. m_lpbyKBPK = NULL;
  16. m_wUAKSize = 0;
  17. m_wKBPKSize = 0;
  18. m_byLastCmd = 0x00;
  19. if (bIsFather == FALSE)
  20. {
  21. //m_traceManager.Register("ZT598M1FDDevImpl");
  22. }
  23. }
  24. CZT598M1FD_DevImpl::~CZT598M1FD_DevImpl()
  25. {
  26. if(m_lpIDevComm != NULL)
  27. {
  28. delete m_lpIDevComm;
  29. m_lpIDevComm = NULL;
  30. }
  31. }
  32. BOOL CZT598M1FD_DevImpl::OpenDevice(LPCommParam lpParam)
  33. {
  34. CloseDevice();
  35. m_lpIDevComm = new CHIDComm();
  36. if ((m_lpIDevComm == NULL) || (lpParam == NULL))
  37. {
  38. return FALSE;
  39. }
  40. m_stCommInfo.cdSndData.dwDataLen = 0;
  41. CUSBParam m_CUSBParam;
  42. memset(&m_CUSBParam,0x00,sizeof(m_CUSBParam));
  43. memcpy((&m_CUSBParam.usVID),&(lpParam->usbInfo).usVID,sizeof(USHORT));
  44. memcpy(&m_CUSBParam.usPID,&lpParam->usbInfo.usPID,sizeof(USHORT));
  45. if (m_lpIDevComm->OpenDevice(m_CUSBParam) != FALSE)
  46. {
  47. //m_traceManager.TraceIn(TRM_INT, TRM_LV_COMMN, "Open device OK.");
  48. return TRUE;
  49. }
  50. return FALSE;
  51. }
  52. BOOL CZT598M1FD_DevImpl::CloseDevice()
  53. {
  54. if (m_lpIDevComm != NULL)
  55. {
  56. if (m_lpIDevComm->CloseDevice() != FALSE)
  57. {
  58. delete m_lpIDevComm;
  59. m_lpIDevComm = NULL;
  60. }
  61. }
  62. memset(m_bySndBuff, 0x00, sizeof(m_bySndBuff));
  63. memset(m_byRcvBuff, 0x00, sizeof(m_byRcvBuff));
  64. memset(&m_stCommInfo, 0x00, sizeof(m_stCommInfo));
  65. m_stCommInfo.cdSndData.lpvData = m_bySndBuff;
  66. m_stCommInfo.cdSndData.dwDataLen = 0;
  67. m_stCommInfo.cdRcvData.lpvData = m_byRcvBuff;
  68. m_stCommInfo.cdRcvData.dwDataLen = sizeof(m_byRcvBuff);
  69. return TRUE;
  70. }
  71. BOOL CZT598M1FD_DevImpl::ExchangeData(const LPEPPExchangeDataField lpstSendInfo, LPEPPExchangeDataField lpstReceiveInfo)
  72. {
  73. WORD wIdx = 0;
  74. WORD wLoop = 0;
  75. WORD wValue = 0;
  76. WORD wSndBufflen = 0;
  77. WORD wRcvBufflen = 0;
  78. WORD wFixedLen = 0;
  79. DWORD dwReceiveLen = 0;
  80. DWORD dwLen = 0;
  81. BYTE bySndBuffer[EXCHANGE_DATA_MAX_LEN] = {0};
  82. BYTE bySndBuffer_temp[EXCHANGE_DATA_MAX_LEN*2] = {0};
  83. BYTE byRcvBuffer[EXCHANGE_DATA_MAX_LEN] = {0};
  84. LPEPPExchangeDataHeadSection lpstEPPExchangeDataHeadSection;
  85. LPReadEntryTextResponse lpReadEntryTextRes = (LPReadEntryTextResponse)(m_byRcvBuff + sizeof(EPPExchangeDataHeadSection) + sizeof(lpstReceiveInfo->unHead));
  86. BOOL bRet = FALSE;
  87. UINT uMaskCnt = 0;
  88. UINT uMaskOffset[10] = {0}, uMaskLen[10] = {0};
  89. if ((lpstSendInfo == NULL) || (lpstReceiveInfo == NULL))
  90. {
  91. return FALSE;
  92. }
  93. if (EditCmd(lpstSendInfo, &uMaskCnt, uMaskOffset, uMaskLen) == FALSE)
  94. {
  95. return FALSE;
  96. }
  97. lpstEPPExchangeDataHeadSection = (LPEPPExchangeDataHeadSection)m_bySndBuff;
  98. wFixedLen = sizeof(EPPExchangeDataHeadSection) + sizeof(EPPExchangeDataTailSection);
  99. wSndBufflen += lpstEPPExchangeDataHeadSection->wLen + wFixedLen;
  100. m_stCommInfo.cdSndData.lpvData = bySndBuffer;
  101. m_stCommInfo.cdRcvData.lpvData = byRcvBuffer;
  102. m_stCommInfo.dwTimeout = 2000;
  103. wLoop = wSndBufflen / (EXCHANGE_DATA_MAX_LEN - 1);
  104. wValue = wSndBufflen % (EXCHANGE_DATA_MAX_LEN - 1);
  105. if (wValue > 0)
  106. {
  107. wLoop++;
  108. }
  109. dwLen = m_lpIDevComm->SendData(m_bySndBuff, wSndBufflen);
  110. if (dwLen == 0)
  111. {
  112. LogXE( m_bySndBuff, wSndBufflen , "Send");
  113. return FALSE;
  114. }
  115. LogXM(m_bySndBuff, wSndBufflen, "Send");
  116. if (lpstEPPExchangeDataHeadSection->byCmd == READ_ENTRY_TEXT)
  117. {
  118. if (m_byLastCmd != READ_ENTRY_TEXT)
  119. {
  120. }
  121. }
  122. else
  123. {
  124. //m_traceManager.TraceInBuffer(TRM_SND, TRM_LV_COMMN, m_bySndBuff, wSndBufflen,
  125. //NULL, uMaskOffset, uMaskLen, uMaskCnt);
  126. }
  127. //LogM( "Receive 1st start.....");
  128. INT nNeedRcvLen = 5;
  129. for (INT i = 0; i < 3 && dwReceiveLen ==0; i++)
  130. {
  131. usleep(10000);
  132. dwReceiveLen=m_lpIDevComm->ReceiveData(m_byRcvBuff,m_stCommInfo.dwTimeout, TRUE);
  133. if ((m_lpIDevComm->GetError() != ERROR_SUCCESS))
  134. {
  135. LogXE( m_bySndBuff, wSndBufflen , "received data:%d FAILED!", i);
  136. return FALSE;
  137. }
  138. if(dwReceiveLen == 0)
  139. {
  140. LogXE( m_bySndBuff, wSndBufflen , "received data:%d is empty", i);
  141. if(i > 2)
  142. {
  143. return FALSE;
  144. }
  145. }
  146. }
  147. lpstEPPExchangeDataHeadSection = (LPEPPExchangeDataHeadSection)m_byRcvBuff;
  148. nNeedRcvLen = lpstEPPExchangeDataHeadSection->wLen + 8;
  149. INT nRcvOffset = dwReceiveLen;
  150. nNeedRcvLen -= dwReceiveLen;
  151. while(nNeedRcvLen > 0)
  152. {
  153. dwReceiveLen=m_lpIDevComm->ReceiveData(m_byRcvBuff + nRcvOffset,m_stCommInfo.dwTimeout, TRUE);
  154. if ((m_lpIDevComm->GetError() != ERROR_SUCCESS))
  155. {
  156. LogXE( m_bySndBuff, wSndBufflen , "Continue received data is empty!");
  157. return FALSE;
  158. }
  159. nRcvOffset += dwReceiveLen;
  160. nNeedRcvLen -= dwReceiveLen;
  161. }
  162. LogXM( m_byRcvBuff, dwReceiveLen, "Rcv");
  163. bRet = ParseResponse(lpstReceiveInfo, &uMaskCnt, uMaskOffset, uMaskLen);
  164. if (lpstEPPExchangeDataHeadSection->byCmd == READ_ENTRY_TEXT)
  165. {
  166. if (m_byLastCmd != READ_ENTRY_TEXT || lpReadEntryTextRes->byBytesCount > 0)
  167. {
  168. //m_traceManager.TraceInBuffer(TRM_RCV, TRM_LV_COMMN, m_byRcvBuff, wRcvBufflen,
  169. //NULL, uMaskOffset, uMaskLen, uMaskCnt);
  170. }
  171. }
  172. else
  173. {
  174. //m_traceManager.TraceInBuffer(TRM_RCV, TRM_LV_COMMN, m_byRcvBuff, wRcvBufflen,
  175. //NULL, uMaskOffset, uMaskLen, uMaskCnt);
  176. }
  177. m_byLastCmd = lpstEPPExchangeDataHeadSection->byCmd;
  178. return bRet;
  179. }
  180. //--------------------------------- DevImpl ---------------------------------
  181. // (Edit command data & Execute command)
  182. BOOL CZT598M1FD_DevImpl::EditCmd(const LPEPPExchangeDataField lpstExchangeDataField,
  183. LPUINT lpuTraceMaskCount/* = NULL*/, LPUINT lpuMaskOffsetArray/* = NULL*/, LPUINT lpuMaskLenArray/* = NULL*/)
  184. {
  185. BYTE byHighCode = 0;
  186. LPEPPExchangeDataHeadSection lpstEPPExchangeDataHeadSection = (LPEPPExchangeDataHeadSection)m_bySndBuff;
  187. LPEPPExchangeDataTailSection lpstEPPExchangeDataTailSection = NULL;
  188. LPBYTE lpbySndDate = m_bySndBuff + sizeof(EPPExchangeDataHeadSection);
  189. int a=sizeof(EPPExchangeDataHeadSection);
  190. BYTE byEnumHead = 0;
  191. WORD wParamLen = 0;
  192. WORD wParamHead = 0;
  193. memset(m_bySndBuff, 0x00, sizeof(m_bySndBuff));
  194. if (lpuTraceMaskCount != NULL)
  195. {
  196. *lpuTraceMaskCount = 0;
  197. }
  198. if (lpstExchangeDataField == NULL)
  199. {
  200. return FALSE;
  201. }
  202. lpstEPPExchangeDataHeadSection->bySignatureHead = EXCHANGE_SIGNATURE_HEAD;
  203. lpstEPPExchangeDataHeadSection->byTRNB = EXCHANGE_TRNB;
  204. lpstEPPExchangeDataHeadSection->byCmd = lpstExchangeDataField->unHead.byCmd;
  205. memcpy(lpbySndDate, &lpstEPPExchangeDataHeadSection->byCmd, sizeof(lpstEPPExchangeDataHeadSection->byCmd));
  206. wParamLen += sizeof(lpstEPPExchangeDataHeadSection->byCmd);
  207. switch (lpstEPPExchangeDataHeadSection->byCmd)
  208. {
  209. case SET_ENTRY_MODE:
  210. {
  211. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  212. {
  213. return FALSE;
  214. }
  215. LPSetEntryModeParam lpstSetEntryModeParam = (LPSetEntryModeParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  216. byEnumHead = (BYTE)lpstSetEntryModeParam->enSwitchMode;
  217. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  218. wParamLen += sizeof(byEnumHead);
  219. byHighCode = lpstSetEntryModeParam->wKeybordDisCode >> 8;
  220. memcpy(lpbySndDate + wParamLen, &byHighCode, sizeof(byHighCode));
  221. memcpy(lpbySndDate + wParamLen + 1, &lpstSetEntryModeParam->wKeybordDisCode, sizeof(BYTE));
  222. wParamLen += sizeof(lpstSetEntryModeParam->wKeybordDisCode);
  223. //memcpy(lpbySndDate + wParamLen, &lpstSetEntryModeParam->wFuncKeybordDisCode, sizeof(lpstSetEntryModeParam->wFuncKeybordDisCode));
  224. byHighCode = lpstSetEntryModeParam->wFuncKeybordDisCode >> 8;
  225. memcpy(lpbySndDate + wParamLen, &byHighCode, sizeof(byHighCode));
  226. memcpy(lpbySndDate + wParamLen + 1, &lpstSetEntryModeParam->wFuncKeybordDisCode, sizeof(BYTE));
  227. wParamLen += sizeof(lpstSetEntryModeParam->wFuncKeybordDisCode);
  228. }
  229. break;
  230. case READ_ENTRY_TEXT:
  231. break;
  232. case VIRTUAL_KEY_PRESS:
  233. {
  234. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  235. {
  236. return FALSE;
  237. }
  238. LPVirtualKeyPressParam lpstVirtualKeyPressParam = (LPVirtualKeyPressParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  239. memcpy(lpbySndDate + wParamLen, lpstVirtualKeyPressParam->byKeyTable, lpstVirtualKeyPressParam->wKeyTableLen);
  240. wParamLen += lpstVirtualKeyPressParam->wKeyTableLen;
  241. }
  242. break;
  243. case DEL_ENTRY_BUFFER:
  244. {
  245. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  246. {
  247. return FALSE;
  248. }
  249. LPDelEntryBufferParam lpstDelEntryBufferParam = (LPDelEntryBufferParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  250. if (lpstDelEntryBufferParam->wContrlParemeterlen == 0)
  251. {
  252. break;
  253. }
  254. memcpy(lpbySndDate + wParamLen, &lpstDelEntryBufferParam->enControlParameter, lpstDelEntryBufferParam->wContrlParemeterlen);
  255. wParamLen += lpstDelEntryBufferParam->wContrlParemeterlen;
  256. }
  257. break;
  258. case SET_KEYBOARD_CODE:
  259. {
  260. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  261. {
  262. return FALSE;
  263. }
  264. LPSetKeyboardCodeParam lpstSetKeyBoardCodeParam = (LPSetKeyboardCodeParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  265. byEnumHead = (BYTE)lpstSetKeyBoardCodeParam->enSetKeyboardCodeMode;
  266. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  267. wParamLen += sizeof(byEnumHead);
  268. memcpy(lpbySndDate + wParamLen, lpstSetKeyBoardCodeParam->byEPPTableNaturalMode, sizeof(lpstSetKeyBoardCodeParam->byEPPTableNaturalMode));
  269. wParamLen += sizeof(lpstSetKeyBoardCodeParam->byEPPTableNaturalMode);
  270. memcpy(lpbySndDate + wParamLen, lpstSetKeyBoardCodeParam->byEPPTableShiftMode, sizeof(lpstSetKeyBoardCodeParam->byEPPTableShiftMode));
  271. wParamLen += sizeof(lpstSetKeyBoardCodeParam->byEPPTableShiftMode);
  272. memcpy(lpbySndDate + wParamLen, lpstSetKeyBoardCodeParam->byExFunKeyNaturalMode, sizeof(lpstSetKeyBoardCodeParam->byExFunKeyNaturalMode));
  273. wParamLen += sizeof(lpstSetKeyBoardCodeParam->byExFunKeyNaturalMode);
  274. memcpy(lpbySndDate + wParamLen, lpstSetKeyBoardCodeParam->byExFunKeyShiftMode, sizeof(lpstSetKeyBoardCodeParam->byExFunKeyShiftMode));
  275. wParamLen += sizeof(lpstSetKeyBoardCodeParam->byExFunKeyShiftMode);
  276. }
  277. break;
  278. case SET_CONTROL_MODE:
  279. {
  280. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  281. {
  282. return FALSE;
  283. }
  284. LPSetControlModeParam lpstSetControlModeParam = (LPSetControlModeParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  285. byEnumHead = (BYTE)lpstSetControlModeParam->enControlMode;
  286. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  287. wParamLen += sizeof(byEnumHead);
  288. memcpy(lpbySndDate + wParamLen, &lpstSetControlModeParam->byControlCode, sizeof(lpstSetControlModeParam->byControlCode));
  289. wParamLen += sizeof(lpstSetControlModeParam->byControlCode);
  290. }
  291. break;
  292. case READ_EPP_INFO:
  293. break;
  294. case WRITE_USER_DATA:
  295. {
  296. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  297. {
  298. return FALSE;
  299. }
  300. LPWriteUserDataParam lpstWriteUserDataParam = (LPWriteUserDataParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  301. memcpy(lpbySndDate + wParamLen, &lpstWriteUserDataParam->byUserBlockAdress, sizeof(lpstWriteUserDataParam->byUserBlockAdress));
  302. wParamLen += sizeof(lpstWriteUserDataParam->byUserBlockAdress);
  303. memcpy(lpbySndDate + wParamLen, lpstWriteUserDataParam->byUserData, sizeof(lpstWriteUserDataParam->byUserData));
  304. wParamLen += sizeof(lpstWriteUserDataParam->byUserData);
  305. }
  306. break;
  307. case READ_USER_DATA:
  308. {
  309. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  310. {
  311. return FALSE;
  312. }
  313. LPReadUserDataParam lpstReadUserDataParam = (LPReadUserDataParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  314. memcpy(lpbySndDate + wParamLen, lpstReadUserDataParam, sizeof(*lpstReadUserDataParam));
  315. wParamLen += sizeof(*lpstReadUserDataParam);
  316. }
  317. break;
  318. case REMOVE_INSTALL_AUTH:
  319. {
  320. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  321. {
  322. return FALSE;
  323. }
  324. LPRemoveInstallAuthParam lpstRemoveInstallAuthParam = (LPRemoveInstallAuthParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  325. byEnumHead = (BYTE)*lpstRemoveInstallAuthParam;
  326. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  327. wParamLen += sizeof(byEnumHead);
  328. }
  329. break;
  330. case UPDATE_PASSWORD:
  331. {
  332. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  333. {
  334. return FALSE;
  335. }
  336. LPUpdatePasswordParam lpstUpdatePasswordParam = (LPUpdatePasswordParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  337. wParamHead = (WORD)lpstUpdatePasswordParam->enPWDKey;
  338. memcpy(lpbySndDate + wParamLen, &wParamHead, sizeof(wParamHead));
  339. wParamLen += sizeof(wParamHead);
  340. memcpy(lpbySndDate + wParamLen, &lpstUpdatePasswordParam->byUpdataMode, sizeof(lpstUpdatePasswordParam->byUpdataMode));
  341. wParamLen += sizeof(lpstUpdatePasswordParam->byUpdataMode);
  342. }
  343. break;
  344. case LOAD_KEY:
  345. {
  346. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  347. {
  348. return FALSE;
  349. }
  350. LPLoadKeyParam lpstLoadKeyParam = (LPLoadKeyParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  351. memcpy(lpbySndDate + wParamLen, &lpstLoadKeyParam->wKeyID, sizeof(lpstLoadKeyParam->wKeyID));
  352. wParamLen += sizeof(lpstLoadKeyParam->wKeyID);
  353. byEnumHead = (BYTE)lpstLoadKeyParam->enLoadKeyWriteMode;
  354. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  355. wParamLen += sizeof(byEnumHead);
  356. memcpy(lpbySndDate + wParamLen, &lpstLoadKeyParam->Attributes, sizeof(lpstLoadKeyParam->Attributes));
  357. wParamLen += sizeof(lpstLoadKeyParam->Attributes);
  358. byEnumHead = (BYTE)lpstLoadKeyParam->enLoadKeyVerifyMode;
  359. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  360. wParamLen += sizeof(byEnumHead);
  361. byEnumHead = (BYTE)lpstLoadKeyParam->enLoadKeyCheckMode;
  362. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  363. wParamLen += sizeof(byEnumHead);
  364. if (lpuTraceMaskCount != NULL && lpuMaskOffsetArray != NULL && lpuMaskLenArray != NULL)
  365. {
  366. lpuMaskOffsetArray[*lpuTraceMaskCount] = lpbySndDate + wParamLen - m_bySndBuff;
  367. lpuMaskLenArray[*lpuTraceMaskCount] = lpstLoadKeyParam->wKeyCheckValueLen + sizeof(lpstLoadKeyParam->byPlainTextKey);
  368. (*lpuTraceMaskCount)++;
  369. }
  370. memcpy(lpbySndDate + wParamLen, &lpstLoadKeyParam->byKeyCheckValue, lpstLoadKeyParam->wKeyCheckValueLen);
  371. wParamLen += lpstLoadKeyParam->wKeyCheckValueLen;
  372. memcpy(lpbySndDate + wParamLen, lpstLoadKeyParam->byPlainTextKey, sizeof(lpstLoadKeyParam->byPlainTextKey));
  373. wParamLen += sizeof(lpstLoadKeyParam->byPlainTextKey);
  374. if ((m_lpbyKBPK != NULL) &&
  375. ((CAlgorithm::CalcMAC(MAC_ALG_X919, lpbySndDate, wParamLen, (LPBYTE)(m_lpbyKBPK), m_wKBPKSize,
  376. lpstLoadKeyParam->byKeyBlockMACValue, sizeof(lpstLoadKeyParam->byKeyBlockMACValue))) != FALSE))
  377. {
  378. memcpy(lpbySndDate + wParamLen, lpstLoadKeyParam->byKeyBlockMACValue,sizeof(lpstLoadKeyParam->byKeyBlockMACValue));
  379. wParamLen += sizeof(lpstLoadKeyParam->byKeyBlockMACValue);
  380. }
  381. else
  382. {
  383. return FALSE;
  384. }
  385. }
  386. break;
  387. case EXCHANGE_KEY:
  388. {
  389. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  390. {
  391. return FALSE;
  392. }
  393. LPExChangeKeyParam lpstExChangeKeyParam = (LPExChangeKeyParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  394. memcpy(lpbySndDate + wParamLen, &lpstExChangeKeyParam->wKeyID1, sizeof(lpstExChangeKeyParam->wKeyID1));
  395. wParamLen += sizeof(lpstExChangeKeyParam->wKeyID1);
  396. memcpy(lpbySndDate + wParamLen, &lpstExChangeKeyParam->wVariationIndex1, sizeof(lpstExChangeKeyParam->wVariationIndex1));
  397. wParamLen += sizeof(lpstExChangeKeyParam->wVariationIndex1);
  398. memcpy(lpbySndDate + wParamLen, &lpstExChangeKeyParam->wKeyID2, sizeof(lpstExChangeKeyParam->wKeyID2));
  399. wParamLen += sizeof(lpstExChangeKeyParam->wKeyID2);
  400. byEnumHead = (BYTE)lpstExChangeKeyParam->enKeyWriteMode;
  401. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  402. wParamLen += sizeof(byEnumHead);
  403. memcpy(lpbySndDate + wParamLen, &lpstExChangeKeyParam->Attributes2, sizeof(lpstExChangeKeyParam->Attributes2));
  404. wParamLen += sizeof(lpstExChangeKeyParam->Attributes2);
  405. byEnumHead = (BYTE)lpstExChangeKeyParam->enKeyVerifyMode;
  406. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  407. wParamLen += sizeof(byEnumHead);
  408. byEnumHead = (BYTE)lpstExChangeKeyParam->enKCVCheckMode;
  409. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  410. wParamLen += sizeof(byEnumHead);
  411. if (lpuTraceMaskCount != NULL && lpuMaskOffsetArray != NULL && lpuMaskLenArray != NULL)
  412. {
  413. lpuMaskOffsetArray[*lpuTraceMaskCount] = lpbySndDate + wParamLen - m_bySndBuff;
  414. lpuMaskLenArray[*lpuTraceMaskCount] = lpstExChangeKeyParam->wKeyCheckValueLen;
  415. (*lpuTraceMaskCount)++;
  416. }
  417. memcpy(lpbySndDate + wParamLen, lpstExChangeKeyParam->byKeyCheckValue, lpstExChangeKeyParam->wKeyCheckValueLen);
  418. wParamLen += lpstExChangeKeyParam->wKeyCheckValueLen;
  419. memcpy(lpbySndDate + wParamLen, lpstExChangeKeyParam->byKeyCipherText, lpstExChangeKeyParam->wKeyCipherTextLen);
  420. wParamLen += lpstExChangeKeyParam->wKeyCipherTextLen;
  421. if ((m_lpbyKBPK != NULL) &&
  422. ((CAlgorithm::CalcMAC(MAC_ALG_X919, lpbySndDate, wParamLen, (LPBYTE)(m_lpbyKBPK), m_wKBPKSize,
  423. lpstExChangeKeyParam->byKeyBlockMACValue, sizeof(lpstExChangeKeyParam->byKeyBlockMACValue))) != FALSE))
  424. {
  425. memcpy(lpbySndDate + wParamLen, &lpstExChangeKeyParam->byKeyBlockMACValue, sizeof(lpstExChangeKeyParam->byKeyBlockMACValue));
  426. wParamLen += sizeof(lpstExChangeKeyParam->byKeyBlockMACValue);
  427. }
  428. else
  429. {
  430. return FALSE;
  431. }
  432. }
  433. break;
  434. case GENERATE_RANDOM_DATA:
  435. {
  436. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  437. {
  438. return FALSE;
  439. }
  440. LPGenerateRandomDataParam lpstGenerateRandomDataParam = (LPGenerateRandomDataParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  441. memcpy(lpbySndDate + wParamLen, lpstGenerateRandomDataParam, sizeof(*lpstGenerateRandomDataParam));
  442. wParamLen += sizeof(*lpstGenerateRandomDataParam);
  443. }
  444. break;
  445. case AUTHENTICATION:
  446. {
  447. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  448. {
  449. return FALSE;
  450. }
  451. LPAuthenticationParam lpstAuthenticationParam = (LPAuthenticationParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  452. memcpy(lpbySndDate + wParamLen, &lpstAuthenticationParam->wKeyID, sizeof(lpstAuthenticationParam->wKeyID));
  453. wParamLen += sizeof(lpstAuthenticationParam->wKeyID);
  454. byEnumHead = (BYTE)lpstAuthenticationParam->enAuthenticationMode;
  455. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  456. wParamLen += sizeof(byEnumHead);
  457. memcpy(lpbySndDate + wParamLen, lpstAuthenticationParam->byEPPRandomData, sizeof(lpstAuthenticationParam->byEPPRandomData));
  458. wParamLen += sizeof(lpstAuthenticationParam->byEPPRandomData);
  459. memcpy(lpbySndDate + wParamLen, lpstAuthenticationParam->byHOSTRandomData, sizeof(lpstAuthenticationParam->byHOSTRandomData));
  460. wParamLen += sizeof(lpstAuthenticationParam->byHOSTRandomData);
  461. if ((m_lpbyUAK != NULL) &&
  462. ((CAlgorithm::CalcMAC(MAC_ALG_X919, lpbySndDate, wParamLen, (LPBYTE)m_lpbyUAK, m_wUAKSize,
  463. lpstAuthenticationParam->byMACData, sizeof(lpstAuthenticationParam->byMACData))) != FALSE))
  464. {
  465. memcpy(lpbySndDate + wParamLen, lpstAuthenticationParam->byMACData, sizeof(lpstAuthenticationParam->byMACData));
  466. wParamLen += sizeof(lpstAuthenticationParam->byMACData);
  467. }
  468. else
  469. {
  470. return FALSE;
  471. }
  472. }
  473. break;
  474. case DELETE_KEY:
  475. {
  476. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  477. {
  478. return FALSE;
  479. }
  480. LPDeleteKeyParam lpstDeleteKeyParam = (LPDeleteKeyParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  481. memcpy(lpbySndDate + wParamLen, lpstDeleteKeyParam, sizeof(*lpstDeleteKeyParam));
  482. wParamLen += sizeof(*lpstDeleteKeyParam);
  483. }
  484. break;
  485. case READ_KEY_ATTRIBUTES:
  486. {
  487. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  488. {
  489. return FALSE;
  490. }
  491. LPReadKeyAttributesParam lpstReadKeyAttributesParam = (LPReadKeyAttributesParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  492. memcpy(lpbySndDate + wParamLen, &lpstReadKeyAttributesParam->wKeyID, sizeof(lpstReadKeyAttributesParam->wKeyID));
  493. wParamLen += sizeof(lpstReadKeyAttributesParam->wKeyID);
  494. byEnumHead = (BYTE)lpstReadKeyAttributesParam->enKeyCheckMode;
  495. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  496. wParamLen += sizeof(byEnumHead);
  497. memcpy(lpbySndDate + wParamLen, &lpstReadKeyAttributesParam->wVariationIndex, sizeof(lpstReadKeyAttributesParam->wVariationIndex));
  498. wParamLen += sizeof(lpstReadKeyAttributesParam->wVariationIndex);
  499. }
  500. break;
  501. case ENCTYPT_PIN_BLOCK:
  502. {
  503. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  504. {
  505. return FALSE;
  506. }
  507. LPEncryptPinBlockParam lpstEncryptPinBlockParam = (LPEncryptPinBlockParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  508. memcpy(lpbySndDate + wParamLen, &lpstEncryptPinBlockParam->wKeyID, sizeof(lpstEncryptPinBlockParam->wKeyID));
  509. wParamLen += sizeof(lpstEncryptPinBlockParam->wKeyID);
  510. memcpy(lpbySndDate + wParamLen, &lpstEncryptPinBlockParam->wVariationIndex, sizeof(lpstEncryptPinBlockParam->wVariationIndex));
  511. wParamLen += sizeof(lpstEncryptPinBlockParam->wVariationIndex);
  512. byEnumHead = (BYTE)lpstEncryptPinBlockParam->enPinBlockEnctryptionMode;
  513. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  514. wParamLen += sizeof(byEnumHead);
  515. byEnumHead = (BYTE)lpstEncryptPinBlockParam->enPinFormat;
  516. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  517. wParamLen += sizeof(byEnumHead);
  518. memcpy(lpbySndDate + wParamLen, &lpstEncryptPinBlockParam->wKeyID2, sizeof(lpstEncryptPinBlockParam->wKeyID2));
  519. wParamLen += sizeof(lpstEncryptPinBlockParam->wKeyID2);
  520. memcpy(lpbySndDate + wParamLen, &lpstEncryptPinBlockParam->wVariationIdex2, sizeof(lpstEncryptPinBlockParam->wVariationIdex2));
  521. wParamLen += sizeof(lpstEncryptPinBlockParam->wVariationIdex2);
  522. memcpy(lpbySndDate + wParamLen, lpstEncryptPinBlockParam->byInitialPINPattern, sizeof(lpstEncryptPinBlockParam->byInitialPINPattern));
  523. wParamLen += sizeof(lpstEncryptPinBlockParam->byInitialPINPattern);
  524. memcpy(lpbySndDate + wParamLen, &lpstEncryptPinBlockParam->byPINOffset, sizeof(lpstEncryptPinBlockParam->byPINOffset));
  525. wParamLen += sizeof(lpstEncryptPinBlockParam->byPINOffset);
  526. memcpy(lpbySndDate + wParamLen, &lpstEncryptPinBlockParam->byPINLength, sizeof(lpstEncryptPinBlockParam->byPINLength));
  527. wParamLen += sizeof(lpstEncryptPinBlockParam->byPINLength);
  528. if (lpuTraceMaskCount != NULL && lpuMaskOffsetArray != NULL && lpuMaskLenArray != NULL)
  529. {
  530. lpuMaskOffsetArray[*lpuTraceMaskCount] = lpbySndDate + wParamLen - m_bySndBuff;
  531. lpuMaskLenArray[*lpuTraceMaskCount] = sizeof(lpstEncryptPinBlockParam->byXORPINBlockPattern);
  532. (*lpuTraceMaskCount)++;
  533. }
  534. memcpy(lpbySndDate + wParamLen, lpstEncryptPinBlockParam->byXORPINBlockPattern, sizeof(lpstEncryptPinBlockParam->byXORPINBlockPattern));
  535. wParamLen += sizeof(lpstEncryptPinBlockParam->byXORPINBlockPattern);
  536. memcpy(lpbySndDate + wParamLen, lpstEncryptPinBlockParam->byXORPINBlockPattern2, sizeof(lpstEncryptPinBlockParam->byXORPINBlockPattern2));
  537. wParamLen += sizeof(lpstEncryptPinBlockParam->byXORPINBlockPattern2);
  538. }
  539. break;
  540. case DES_CRYPT_DATA:
  541. {
  542. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  543. {
  544. return FALSE;
  545. }
  546. LPDesCryptDataParam lpstDesCryptDataParam = (LPDesCryptDataParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  547. memcpy(lpbySndDate + wParamLen, &lpstDesCryptDataParam->wKeyID, sizeof(lpstDesCryptDataParam->wKeyID));
  548. wParamLen += sizeof(lpstDesCryptDataParam->wKeyID);
  549. memcpy(lpbySndDate + wParamLen, &lpstDesCryptDataParam->wVariationIndex, sizeof(lpstDesCryptDataParam->wVariationIndex));
  550. wParamLen += sizeof(lpstDesCryptDataParam->wVariationIndex);
  551. memcpy(lpbySndDate + wParamLen, &lpstDesCryptDataParam->wKeyID2, sizeof(lpstDesCryptDataParam->wKeyID2));
  552. wParamLen += sizeof(lpstDesCryptDataParam->wKeyID2);
  553. memcpy(lpbySndDate + wParamLen, lpstDesCryptDataParam->byIV, sizeof(lpstDesCryptDataParam->byIV));
  554. wParamLen += sizeof(lpstDesCryptDataParam->byIV);
  555. byEnumHead = (BYTE)lpstDesCryptDataParam->enIVMode;
  556. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  557. wParamLen += sizeof(byEnumHead);
  558. memcpy(lpbySndDate + wParamLen, &lpstDesCryptDataParam->byDesMode, sizeof(lpstDesCryptDataParam->byDesMode));
  559. wParamLen += sizeof(lpstDesCryptDataParam->byDesMode);
  560. byEnumHead = (BYTE)lpstDesCryptDataParam->enCryptionMode;
  561. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  562. wParamLen += sizeof(byEnumHead);
  563. memcpy(lpbySndDate + wParamLen, lpstDesCryptDataParam->lpInputData, lpstDesCryptDataParam->wInputDataLen);
  564. wParamLen += lpstDesCryptDataParam->wInputDataLen;
  565. }
  566. break;
  567. case MAC_ENCRYPT_DATA:
  568. {
  569. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  570. {
  571. return FALSE;
  572. }
  573. LPMACEnCryptDataParam lpstMACEnCryptDataParam = (LPMACEnCryptDataParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  574. memcpy(lpbySndDate + wParamLen, &lpstMACEnCryptDataParam->wKeyID, sizeof(lpstMACEnCryptDataParam->wKeyID));
  575. wParamLen += sizeof(lpstMACEnCryptDataParam->wKeyID);
  576. memcpy(lpbySndDate + wParamLen, &lpstMACEnCryptDataParam->wVariationIndex, sizeof(lpstMACEnCryptDataParam->wVariationIndex));
  577. wParamLen += sizeof(lpstMACEnCryptDataParam->wVariationIndex);
  578. memcpy(lpbySndDate + wParamLen, &lpstMACEnCryptDataParam->wKeyID2, sizeof(lpstMACEnCryptDataParam->wKeyID2));
  579. wParamLen += sizeof(lpstMACEnCryptDataParam->wKeyID2);
  580. memcpy(lpbySndDate + wParamLen, lpstMACEnCryptDataParam->byIV, sizeof(lpstMACEnCryptDataParam->byIV));
  581. wParamLen += sizeof(lpstMACEnCryptDataParam->byIV);
  582. byEnumHead = (BYTE)lpstMACEnCryptDataParam->enIVMode;
  583. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  584. wParamLen += sizeof(byEnumHead);
  585. byEnumHead = (BYTE)lpstMACEnCryptDataParam->enMACMode;
  586. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  587. wParamLen += sizeof(byEnumHead);
  588. byEnumHead = (BYTE)lpstMACEnCryptDataParam->enCryptionMode;
  589. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  590. wParamLen += sizeof(byEnumHead);
  591. memcpy(lpbySndDate + wParamLen, lpstMACEnCryptDataParam->lpInputData, lpstMACEnCryptDataParam->wInputDataLen);
  592. wParamLen += lpstMACEnCryptDataParam->wInputDataLen;
  593. }
  594. break;
  595. case GET_EPP_SENSOR_DATA:
  596. break;
  597. case GET_KEYBOARD_CODE:
  598. {
  599. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  600. {
  601. return FALSE;
  602. }
  603. LPGetKeyBoardCodeParam lpstGetKeyBoardCodeParam = (LPGetKeyBoardCodeParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  604. byEnumHead = (BYTE)*lpstGetKeyBoardCodeParam;
  605. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  606. wParamLen += sizeof(byEnumHead);
  607. }
  608. break;
  609. case SET_SYSTEM_TIME:
  610. {
  611. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  612. {
  613. return FALSE;
  614. }
  615. memcpy(lpbySndDate + wParamLen, lpstExchangeDataField->unBody.lpbyParamInfo, sizeof(SetSystemTimeParam));
  616. wParamLen += sizeof(SetSystemTimeParam);
  617. }
  618. break;
  619. case GET_SYSTEM_TIME:
  620. break;
  621. case SM4_LOAD_TEXT_KEY:
  622. {
  623. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  624. {
  625. return FALSE;
  626. }
  627. LPSM4LoadTextKeyParam lpstLoadSM4KeyParam = (LPSM4LoadTextKeyParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  628. memcpy(lpbySndDate + wParamLen, &lpstLoadSM4KeyParam->wKeyIndex, sizeof(lpstLoadSM4KeyParam->wKeyIndex));
  629. wParamLen += sizeof(lpstLoadSM4KeyParam->wKeyIndex);
  630. byEnumHead = (BYTE)lpstLoadSM4KeyParam->enWritrMode;
  631. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  632. wParamLen += sizeof(byEnumHead);
  633. if (lpuTraceMaskCount != NULL && lpuMaskOffsetArray != NULL && lpuMaskLenArray != NULL)
  634. {
  635. lpuMaskOffsetArray[*lpuTraceMaskCount] = lpbySndDate + wParamLen - m_bySndBuff;
  636. lpuMaskLenArray[*lpuTraceMaskCount] = sizeof(lpstLoadSM4KeyParam->byKeyData);
  637. (*lpuTraceMaskCount)++;
  638. }
  639. memcpy(lpbySndDate + wParamLen, lpstLoadSM4KeyParam->byKeyData, sizeof(lpstLoadSM4KeyParam->byKeyData));
  640. wParamLen += sizeof(lpstLoadSM4KeyParam->byKeyData);
  641. memcpy(lpbySndDate + wParamLen, &lpstLoadSM4KeyParam->Attributes2, sizeof(lpstLoadSM4KeyParam->Attributes2));
  642. wParamLen += sizeof(lpstLoadSM4KeyParam->Attributes2);
  643. }
  644. break;
  645. case SM4_EXCHANGE_KEY:
  646. {
  647. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  648. {
  649. return FALSE;
  650. }
  651. LPSM4ExchangeKeyParam lpstSM4ExchangeKeyParam = (LPSM4ExchangeKeyParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  652. memcpy(lpbySndDate + wParamLen, &lpstSM4ExchangeKeyParam->wKeyID1, sizeof(lpstSM4ExchangeKeyParam->wKeyID1));
  653. wParamLen += sizeof(lpstSM4ExchangeKeyParam->wKeyID1);
  654. memcpy(lpbySndDate + wParamLen, &lpstSM4ExchangeKeyParam->wKeyID2, sizeof(lpstSM4ExchangeKeyParam->wKeyID2));
  655. wParamLen += sizeof(lpstSM4ExchangeKeyParam->wKeyID2);
  656. memcpy(lpbySndDate + wParamLen, lpstSM4ExchangeKeyParam->byCiphertextKey, sizeof(lpstSM4ExchangeKeyParam->byCiphertextKey));
  657. wParamLen += sizeof(lpstSM4ExchangeKeyParam->byCiphertextKey);
  658. memcpy(lpbySndDate + wParamLen, &lpstSM4ExchangeKeyParam->Attributes2, sizeof(lpstSM4ExchangeKeyParam->Attributes2));
  659. wParamLen += sizeof(lpstSM4ExchangeKeyParam->Attributes2);
  660. }
  661. break;
  662. case SM4_CRYPT:
  663. {
  664. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  665. {
  666. return FALSE;
  667. }
  668. LPSM4CryptParam lpstSM4CryptParam = (LPSM4CryptParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  669. memcpy(lpbySndDate + wParamLen, &lpstSM4CryptParam->wKeyIndex, sizeof(lpstSM4CryptParam->wKeyIndex));
  670. wParamLen += sizeof(lpstSM4CryptParam->wKeyIndex);
  671. byEnumHead = (BYTE)lpstSM4CryptParam->enCryptMode;
  672. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  673. wParamLen += sizeof(byEnumHead);
  674. byEnumHead = (BYTE)lpstSM4CryptParam->enCryptSM4Mode;
  675. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  676. wParamLen += sizeof(byEnumHead);
  677. memcpy(lpbySndDate + wParamLen, lpstSM4CryptParam->byIVData, sizeof(lpstSM4CryptParam->byIVData));
  678. wParamLen += sizeof(lpstSM4CryptParam->byIVData);
  679. memcpy(lpbySndDate + wParamLen, lpstSM4CryptParam->lpInputData, lpstSM4CryptParam->wInputDataLen);
  680. wParamLen += lpstSM4CryptParam->wInputDataLen;
  681. }
  682. break;
  683. case SM4_MAC:
  684. {
  685. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  686. {
  687. return FALSE;
  688. }
  689. LPSM4MACParam lpstSM4MACParam = (LPSM4MACParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  690. memcpy(lpbySndDate + wParamLen, &lpstSM4MACParam->wKeyIndex, sizeof(lpstSM4MACParam->wKeyIndex));
  691. wParamLen += sizeof(lpstSM4MACParam->wKeyIndex);
  692. memcpy(lpbySndDate + wParamLen, lpstSM4MACParam->byIVData, sizeof(lpstSM4MACParam->byIVData));
  693. wParamLen += sizeof(lpstSM4MACParam->byIVData);
  694. byEnumHead = (BYTE)lpstSM4MACParam->enMACMode;
  695. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  696. wParamLen += sizeof(byEnumHead);
  697. memcpy(lpbySndDate + wParamLen, lpstSM4MACParam->lpInputData, lpstSM4MACParam->wInputDataLen);
  698. wParamLen += lpstSM4MACParam->wInputDataLen;
  699. }
  700. break;
  701. case SM4_GET_PIN_BLOCK:
  702. {
  703. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  704. {
  705. return FALSE;
  706. }
  707. LPSM4GetPinBlockParam lpstSM4GetPinBlockParam = (LPSM4GetPinBlockParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  708. memcpy(lpbySndDate + wParamLen, &lpstSM4GetPinBlockParam->wKeyID, sizeof(lpstSM4GetPinBlockParam->wKeyID));
  709. wParamLen += sizeof(lpstSM4GetPinBlockParam->wKeyID);
  710. byEnumHead = (BYTE)lpstSM4GetPinBlockParam->enEncryptionMode;
  711. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  712. wParamLen += sizeof(byEnumHead);
  713. memcpy(lpbySndDate + wParamLen, &lpstSM4GetPinBlockParam->wKeyID2, sizeof(lpstSM4GetPinBlockParam->wKeyID2));
  714. wParamLen += sizeof(lpstSM4GetPinBlockParam->wKeyID2);
  715. memcpy(lpbySndDate + wParamLen, &lpstSM4GetPinBlockParam->byPinFormat, sizeof(lpstSM4GetPinBlockParam->byPinFormat));
  716. wParamLen += sizeof(lpstSM4GetPinBlockParam->byPinFormat);
  717. memcpy(lpbySndDate + wParamLen, lpstSM4GetPinBlockParam->byInitialPinPattern, sizeof(lpstSM4GetPinBlockParam->byInitialPinPattern));
  718. wParamLen += sizeof(lpstSM4GetPinBlockParam->byInitialPinPattern);
  719. memcpy(lpbySndDate + wParamLen, &lpstSM4GetPinBlockParam->byPinOffset, sizeof(lpstSM4GetPinBlockParam->byPinOffset));
  720. wParamLen += sizeof(lpstSM4GetPinBlockParam->byPinOffset);
  721. memcpy(lpbySndDate + wParamLen, &lpstSM4GetPinBlockParam->byPinLength, sizeof(lpstSM4GetPinBlockParam->byPinLength));
  722. wParamLen += sizeof(lpstSM4GetPinBlockParam->byPinLength);
  723. if (lpuTraceMaskCount != NULL && lpuMaskOffsetArray != NULL && lpuMaskLenArray != NULL)
  724. {
  725. lpuMaskOffsetArray[*lpuTraceMaskCount] = lpbySndDate + wParamLen - m_bySndBuff;
  726. lpuMaskLenArray[*lpuTraceMaskCount] = sizeof(lpstSM4GetPinBlockParam->byXORPinBlockPattern);
  727. (*lpuTraceMaskCount)++;
  728. }
  729. memcpy(lpbySndDate + wParamLen, lpstSM4GetPinBlockParam->byXORPinBlockPattern, sizeof(lpstSM4GetPinBlockParam->byXORPinBlockPattern));
  730. wParamLen += sizeof(lpstSM4GetPinBlockParam->byXORPinBlockPattern);
  731. memcpy(lpbySndDate + wParamLen, lpstSM4GetPinBlockParam->byXORPinBlockPattern2, sizeof(lpstSM4GetPinBlockParam->byXORPinBlockPattern2));
  732. wParamLen += sizeof(lpstSM4GetPinBlockParam->byXORPinBlockPattern2);
  733. }
  734. break;
  735. case SM_DELETE_KEY:
  736. {
  737. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  738. {
  739. return FALSE;
  740. }
  741. LPSMDeleteKeyParam lpstSMDeleteKeyParam = (LPSMDeleteKeyParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  742. memcpy(lpbySndDate + wParamLen, lpstSMDeleteKeyParam, sizeof(SMDeleteKeyParam));
  743. wParamLen += sizeof(SMDeleteKeyParam);
  744. }
  745. break;
  746. case READ_A980_FW_VERSION:
  747. case SM_GET_VERSION:
  748. break;
  749. case SM_READ_KEY_ATTRIBUTES:
  750. {
  751. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  752. {
  753. return FALSE;
  754. }
  755. LPSMReadKeyAttributeParam lpstSMReadKeyAttributeParam = (LPSMReadKeyAttributeParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  756. memcpy(lpbySndDate + wParamLen, &lpstSMReadKeyAttributeParam->wKeyID, sizeof(lpstSMReadKeyAttributeParam->wKeyID));
  757. wParamLen += sizeof(lpstSMReadKeyAttributeParam->wKeyID);
  758. byEnumHead = (BYTE)lpstSMReadKeyAttributeParam->enKeyCheckMode;
  759. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  760. wParamLen += sizeof(byEnumHead);
  761. }
  762. break;
  763. case GENERATE_RSA_KEYPAIR:
  764. {
  765. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  766. {
  767. return FALSE;
  768. }
  769. LPGenerateRsaKeyPairParam lpstGenerateRsaKeyPairParam = (LPGenerateRsaKeyPairParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  770. memcpy(lpbySndDate + wParamLen, &lpstGenerateRsaKeyPairParam->wPrivateKeyId, sizeof(lpstGenerateRsaKeyPairParam->wPrivateKeyId));
  771. wParamLen += sizeof(lpstGenerateRsaKeyPairParam->wPrivateKeyId);
  772. memcpy(lpbySndDate + wParamLen, &lpstGenerateRsaKeyPairParam->wPublicKeyId, sizeof(lpstGenerateRsaKeyPairParam->wPublicKeyId));
  773. wParamLen += sizeof(lpstGenerateRsaKeyPairParam->wPublicKeyId);
  774. memcpy(lpbySndDate + wParamLen, &lpstGenerateRsaKeyPairParam->wModulusLength, sizeof(lpstGenerateRsaKeyPairParam->wModulusLength));
  775. wParamLen += sizeof(lpstGenerateRsaKeyPairParam->wModulusLength);
  776. memcpy(lpbySndDate + wParamLen, &lpstGenerateRsaKeyPairParam->dwExponentData, sizeof(lpstGenerateRsaKeyPairParam->dwExponentData));
  777. wParamLen += sizeof(lpstGenerateRsaKeyPairParam->dwExponentData);
  778. }
  779. break;
  780. case EXP_EPP_PUBLIC_KEY:
  781. {
  782. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  783. {
  784. return FALSE;
  785. }
  786. LPExpEppPKParam lpstExpEppPublicKeyParam = (LPExpEppPKParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  787. memcpy(lpbySndDate + wParamLen, &lpstExpEppPublicKeyParam->wKeyId, sizeof(lpstExpEppPublicKeyParam->wKeyId));
  788. wParamLen += sizeof(lpstExpEppPublicKeyParam->wKeyId);
  789. memcpy(lpbySndDate + wParamLen, &lpstExpEppPublicKeyParam->wSignatureId, sizeof(lpstExpEppPublicKeyParam->wSignatureId));
  790. wParamLen += sizeof(lpstExpEppPublicKeyParam->wSignatureId);
  791. }
  792. break;
  793. case IMPORT_DES_KEY:
  794. {
  795. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  796. {
  797. return FALSE;
  798. }
  799. LPImportDesKeyParam lpstImportDesKeyParam = (LPImportDesKeyParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  800. USHORT usOffset = 0;
  801. memcpy(lpbySndDate + wParamLen, &lpstImportDesKeyParam->wDesKeyId, sizeof(lpstImportDesKeyParam->wDesKeyId));
  802. wParamLen += sizeof(lpstImportDesKeyParam->wDesKeyId);
  803. memcpy(lpbySndDate + wParamLen, &lpstImportDesKeyParam->stKeyAttributes, sizeof(lpstImportDesKeyParam->stKeyAttributes));
  804. wParamLen += sizeof(lpstImportDesKeyParam->stKeyAttributes);
  805. memcpy(lpbySndDate + wParamLen, &lpstImportDesKeyParam->wEppSkDecKeyId, sizeof(lpstImportDesKeyParam->wEppSkDecKeyId));
  806. wParamLen += sizeof(lpstImportDesKeyParam->wEppSkDecKeyId);
  807. byEnumHead = (BYTE)lpstImportDesKeyParam->enSigAlgorithm;
  808. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  809. wParamLen += sizeof(byEnumHead);
  810. byEnumHead = (BYTE)lpstImportDesKeyParam->enVerifyMode;
  811. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  812. wParamLen += sizeof(byEnumHead);
  813. byEnumHead = (BYTE)lpstImportDesKeyParam->enDesKCM;
  814. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  815. wParamLen += sizeof(byEnumHead);
  816. memcpy(lpbySndDate + wParamLen, lpstImportDesKeyParam->byKCV, lpstImportDesKeyParam->wKCVLen);
  817. wParamLen += lpstImportDesKeyParam->wKCVLen;
  818. memcpy(lpbySndDate + wParamLen, &lpstImportDesKeyParam->wVerifySigPkId, sizeof(lpstImportDesKeyParam->wVerifySigPkId));
  819. wParamLen += sizeof(lpstImportDesKeyParam->wVerifySigPkId);
  820. byEnumHead = (BYTE)lpstImportDesKeyParam->enEncipherAlgorithm;
  821. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  822. wParamLen += sizeof(byEnumHead);
  823. byEnumHead = (BYTE)lpstImportDesKeyParam->enRandomMode;
  824. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  825. wParamLen += sizeof(byEnumHead);
  826. if (EditDerTag(lpbySndDate + wParamLen, (LPBYTE)&lpstImportDesKeyParam->stDerEncDesKeytag, DER_TAG_ENCRYPTED_DES_KEY, usOffset) == FALSE)
  827. {
  828. return FALSE;
  829. }
  830. wParamLen += usOffset;
  831. }
  832. break;
  833. case IMPORT_RSA_KEY:
  834. {
  835. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  836. {
  837. return FALSE;
  838. }
  839. LPImportRsaKeyParam lpstImportRsaKeyParam = (LPImportRsaKeyParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  840. USHORT usOffset = 0;
  841. memcpy(lpbySndDate + wParamLen, &lpstImportRsaKeyParam->wKeyId, sizeof(lpstImportRsaKeyParam->wKeyId));
  842. wParamLen += sizeof(lpstImportRsaKeyParam->wKeyId);
  843. memcpy(lpbySndDate + wParamLen, &lpstImportRsaKeyParam->stKeyAttributes, sizeof(lpstImportRsaKeyParam->stKeyAttributes));
  844. wParamLen += sizeof(lpstImportRsaKeyParam->stKeyAttributes);
  845. memcpy(lpbySndDate + wParamLen, &lpstImportRsaKeyParam->wSigKeyId, sizeof(lpstImportRsaKeyParam->wSigKeyId));
  846. wParamLen += sizeof(lpstImportRsaKeyParam->wSigKeyId);
  847. byEnumHead = (BYTE)lpstImportRsaKeyParam->enSigAlgorithm;
  848. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  849. wParamLen += sizeof(byEnumHead);
  850. if (EditDerTag(lpbySndDate + wParamLen, (LPBYTE)&lpstImportRsaKeyParam->stDerRsaKeyWithSigTag, DER_TAG_RSA_KEY_WITH_SIG, usOffset) == FALSE)
  851. {
  852. return FALSE;
  853. }
  854. if (lpuTraceMaskCount != NULL && lpuMaskOffsetArray != NULL && lpuMaskLenArray != NULL)
  855. {
  856. lpuMaskOffsetArray[*lpuTraceMaskCount] = lpbySndDate + wParamLen - m_bySndBuff;
  857. lpuMaskLenArray[*lpuTraceMaskCount] = usOffset;
  858. (*lpuTraceMaskCount)++;
  859. }
  860. wParamLen += usOffset;
  861. }
  862. break;
  863. case IMPORT_EPP_SERIAL_NUMBER:
  864. {
  865. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  866. {
  867. return FALSE;
  868. }
  869. LPImportEppSNParam lpstImportEppSNParam = (LPImportEppSNParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  870. USHORT usOffset = 0;
  871. memcpy(lpbySndDate + wParamLen, &lpstImportEppSNParam->wKeyId, sizeof(lpstImportEppSNParam->wKeyId));
  872. wParamLen += sizeof(lpstImportEppSNParam->wKeyId);
  873. memcpy(lpbySndDate + wParamLen, &lpstImportEppSNParam->stKeyAttributes, sizeof(lpstImportEppSNParam->stKeyAttributes));
  874. wParamLen += sizeof(lpstImportEppSNParam->stKeyAttributes);
  875. memcpy(lpbySndDate + wParamLen, &lpstImportEppSNParam->wSigKeyId, sizeof(lpstImportEppSNParam->wSigKeyId));
  876. wParamLen += sizeof(lpstImportEppSNParam->wSigKeyId);
  877. byEnumHead = (BYTE)lpstImportEppSNParam->enSigAlgorithm;
  878. memcpy(lpbySndDate + wParamLen, &byEnumHead, sizeof(byEnumHead));
  879. wParamLen += sizeof(byEnumHead);
  880. if (EditDerTag(lpbySndDate + wParamLen, (LPBYTE)&lpstImportEppSNParam->stDerEppSNTag, DER_TAG_EPP_SERIAL_NUMBER, usOffset) == FALSE)
  881. {
  882. return FALSE;
  883. }
  884. wParamLen += usOffset;
  885. }
  886. break;
  887. case EXP_EPP_SERIAL_NUMBER:
  888. {
  889. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  890. {
  891. return FALSE;
  892. }
  893. LPExpEppSNParam lpstExpEppSNParam = (LPExpEppSNParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  894. memcpy(lpbySndDate + wParamLen, &lpstExpEppSNParam->wKeyId, sizeof(lpstExpEppSNParam->wKeyId));
  895. wParamLen += sizeof(lpstExpEppSNParam->wKeyId);
  896. memcpy(lpbySndDate + wParamLen, &lpstExpEppSNParam->wSignatureId, sizeof(lpstExpEppSNParam->wSignatureId));
  897. wParamLen += sizeof(lpstExpEppSNParam->wSignatureId);
  898. }
  899. break;
  900. case RSA_CRYPT_DATA:
  901. {
  902. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  903. {
  904. return FALSE;
  905. }
  906. LPRSACryptDataParam lpstRSACryptDataParam = (LPRSACryptDataParam)lpstExchangeDataField->unBody.lpbyParamInfo;
  907. memcpy(lpbySndDate + wParamLen, &lpstRSACryptDataParam->wKeyId, sizeof(lpstRSACryptDataParam->wKeyId));
  908. wParamLen += sizeof(lpstRSACryptDataParam->wKeyId);
  909. memcpy(lpbySndDate + wParamLen, &lpstRSACryptDataParam->usDataLen, sizeof(lpstRSACryptDataParam->usDataLen));
  910. wParamLen += sizeof(lpstRSACryptDataParam->usDataLen);
  911. memcpy(lpbySndDate + wParamLen, lpstRSACryptDataParam->byData, lpstRSACryptDataParam->usDataLen);
  912. wParamLen += lpstRSACryptDataParam->usDataLen;
  913. }
  914. break;
  915. case START_GM_FW_LOAD:
  916. {
  917. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  918. {
  919. return FALSE;
  920. }
  921. LPBYTE lpbyFWType = lpstExchangeDataField->unBody.lpbyParamInfo;
  922. memcpy(lpbySndDate + wParamLen, lpbyFWType, sizeof(BYTE));
  923. wParamLen += sizeof(BYTE);
  924. }
  925. break;
  926. case LOADING_GM_FW_CODE:
  927. {
  928. if (lpstExchangeDataField->unBody.lpbyParamInfo == NULL)
  929. {
  930. return FALSE;
  931. }
  932. LPBYTE lpbyFWCode = lpstExchangeDataField->unBody.lpbyParamInfo;
  933. memcpy(lpbySndDate + wParamLen, lpbyFWCode, 1024);
  934. wParamLen += 1024;
  935. }
  936. break;
  937. case END_GM_FW_LOAD:
  938. break;
  939. default:
  940. return FALSE;
  941. }
  942. if ((lpuTraceMaskCount != NULL) /*&&
  943. (CTraceManager::m_bTraceMask == FALSE)*/)
  944. {
  945. *lpuTraceMaskCount = 0;
  946. }
  947. lpstEPPExchangeDataHeadSection->wLen = wParamLen;
  948. int temp_a=sizeof (EPPExchangeDataHeadSection);
  949. lpstEPPExchangeDataTailSection = (LPEPPExchangeDataTailSection)(m_bySndBuff + sizeof(EPPExchangeDataHeadSection) + wParamLen);
  950. lpstEPPExchangeDataTailSection->bySignatureEnd = EXCHANGE_SIGNATURE_END;
  951. WORD wCRC;
  952. if ((CAlgorithm::CalcCRC(16, (LPBYTE)m_bySndBuff, sizeof(EPPExchangeDataHeadSection) + wParamLen +
  953. sizeof(lpstEPPExchangeDataTailSection->bySignatureEnd), &wCRC)) == FALSE)
  954. {
  955. return FALSE;
  956. }
  957. lpstEPPExchangeDataTailSection->wCRC = wCRC;
  958. return TRUE;
  959. }
  960. BOOL CZT598M1FD_DevImpl::ParseResponse(LPEPPExchangeDataField lpstReceiveInfo, LPUINT lpuTraceMaskCount/* = NULL*/, LPUINT lpuMaskOffsetArray/* = NULL*/, LPUINT lpuMaskLenArray/* = NULL*/)
  961. {
  962. DWORD dwInfoSizeoff = 0;
  963. WORD wNeedCheckLen = 0;
  964. WORD wCRC = 0;
  965. LPEPPExchangeDataTailSection lpstEPPExchangeDataTailSection = NULL;
  966. LPEPPExchangeDataHeadSection lpstEPPExchangeDataHeadSection = NULL;
  967. LPBYTE lpstRcvDate = m_byRcvBuff + sizeof(EPPExchangeDataHeadSection);
  968. BYTE byExpectCmd = 0x00;
  969. if (lpuTraceMaskCount != NULL)
  970. {
  971. *lpuTraceMaskCount = 0;
  972. }
  973. if (lpstReceiveInfo == NULL)
  974. {
  975. return FALSE;
  976. }
  977. lpstEPPExchangeDataHeadSection = (LPEPPExchangeDataHeadSection)m_bySndBuff;
  978. byExpectCmd = lpstEPPExchangeDataHeadSection->byCmd;
  979. lpstEPPExchangeDataHeadSection = (LPEPPExchangeDataHeadSection)m_byRcvBuff;
  980. if (lpstEPPExchangeDataHeadSection->byCmd != byExpectCmd)
  981. {
  982. return FALSE;
  983. }
  984. wNeedCheckLen = lpstEPPExchangeDataHeadSection->wLen;
  985. wNeedCheckLen += sizeof(EPPExchangeDataHeadSection);
  986. lpstEPPExchangeDataTailSection = (LPEPPExchangeDataTailSection)(m_byRcvBuff + wNeedCheckLen);
  987. wNeedCheckLen += sizeof(lpstEPPExchangeDataTailSection->bySignatureEnd);
  988. CAlgorithm::CalcCRC(16, m_byRcvBuff, wNeedCheckLen, &wCRC);
  989. if (memcmp(&wCRC, &lpstEPPExchangeDataTailSection->wCRC, sizeof(wCRC)) != 0)
  990. {
  991. return FALSE;
  992. }
  993. memcpy (&lpstReceiveInfo->unHead.byStatus, lpstRcvDate, sizeof(lpstReceiveInfo->unHead.byStatus));
  994. dwInfoSizeoff += sizeof(lpstReceiveInfo->unHead.byStatus);
  995. switch(lpstEPPExchangeDataHeadSection->byCmd)
  996. {
  997. case SET_ENTRY_MODE:
  998. break;
  999. case READ_ENTRY_TEXT:
  1000. {
  1001. if (lpstReceiveInfo->unBody.lpbyResInfo == NULL)
  1002. {
  1003. return FALSE;
  1004. }
  1005. LPReadEntryTextResponse lpstReadEntryTextResponse = (LPReadEntryTextResponse)lpstReceiveInfo->unBody.lpbyResInfo;
  1006. memcpy(&lpstReadEntryTextResponse->byBytesCount, lpstRcvDate + dwInfoSizeoff, sizeof(lpstReadEntryTextResponse->byBytesCount));
  1007. dwInfoSizeoff += sizeof(lpstReadEntryTextResponse->byBytesCount);
  1008. if (lpuTraceMaskCount != NULL && lpuMaskOffsetArray != NULL && lpuMaskLenArray != NULL)
  1009. {
  1010. lpuMaskOffsetArray[*lpuTraceMaskCount] = lpstRcvDate + dwInfoSizeoff - m_byRcvBuff;
  1011. lpuMaskLenArray[*lpuTraceMaskCount] = sizeof(lpstReadEntryTextResponse->byDataOfGTB);
  1012. (*lpuTraceMaskCount)++;
  1013. }
  1014. memcpy(lpstReadEntryTextResponse->byDataOfGTB, lpstRcvDate + dwInfoSizeoff, sizeof(lpstReadEntryTextResponse->byDataOfGTB));
  1015. }
  1016. break;
  1017. case VIRTUAL_KEY_PRESS:
  1018. break;
  1019. case DEL_ENTRY_BUFFER:
  1020. break;
  1021. case SET_KEYBOARD_CODE:
  1022. break;
  1023. case SET_CONTROL_MODE:
  1024. break;
  1025. case READ_EPP_INFO:
  1026. {
  1027. if (lpstReceiveInfo->unBody.lpbyResInfo == NULL)
  1028. {
  1029. return FALSE;
  1030. }
  1031. LPReadEPPInfoResponse lpstReadEPPInfoResponse = (LPReadEPPInfoResponse)lpstReceiveInfo->unBody.lpbyResInfo;
  1032. memcpy(&lpstReadEPPInfoResponse->byEPPType, lpstRcvDate + dwInfoSizeoff, sizeof(lpstReadEPPInfoResponse->byEPPType));
  1033. dwInfoSizeoff += sizeof(lpstReadEPPInfoResponse->byEPPType);
  1034. memcpy(&lpstReadEPPInfoResponse->wDESKeyNumber, lpstRcvDate + dwInfoSizeoff, sizeof(lpstReadEPPInfoResponse->wDESKeyNumber));
  1035. dwInfoSizeoff += sizeof(lpstReadEPPInfoResponse->wDESKeyNumber);
  1036. memcpy(&lpstReadEPPInfoResponse->wRSAKeyNumber, lpstRcvDate + dwInfoSizeoff, sizeof(lpstReadEPPInfoResponse->wRSAKeyNumber));
  1037. dwInfoSizeoff += sizeof(lpstReadEPPInfoResponse->wRSAKeyNumber);
  1038. memcpy(&lpstReadEPPInfoResponse->wCertificateNumber, lpstRcvDate + dwInfoSizeoff, sizeof(lpstReadEPPInfoResponse->wCertificateNumber));
  1039. dwInfoSizeoff += sizeof(lpstReadEPPInfoResponse->wCertificateNumber);
  1040. memcpy(&lpstReadEPPInfoResponse->wCryptAlgorithms, lpstRcvDate + dwInfoSizeoff, sizeof(lpstReadEPPInfoResponse->wCryptAlgorithms));
  1041. dwInfoSizeoff += sizeof(lpstReadEPPInfoResponse->wCryptAlgorithms);
  1042. memcpy(&lpstReadEPPInfoResponse->byDerivationAlgorithms, lpstRcvDate + dwInfoSizeoff, sizeof(lpstReadEPPInfoResponse->byDerivationAlgorithms));
  1043. dwInfoSizeoff += sizeof(lpstReadEPPInfoResponse->byDerivationAlgorithms);
  1044. memcpy(&lpstReadEPPInfoResponse->byPresentationAlgorithms, lpstRcvDate + dwInfoSizeoff, sizeof(lpstReadEPPInfoResponse->byPresentationAlgorithms));
  1045. dwInfoSizeoff += sizeof(lpstReadEPPInfoResponse->byPresentationAlgorithms);
  1046. memcpy(&lpstReadEPPInfoResponse->byValidationAlgorithms, lpstRcvDate + dwInfoSizeoff, sizeof(lpstReadEPPInfoResponse->byValidationAlgorithms));
  1047. dwInfoSizeoff += sizeof(lpstReadEPPInfoResponse->byValidationAlgorithms);
  1048. memcpy(&lpstReadEPPInfoResponse->wPinFormat, lpstRcvDate + dwInfoSizeoff, sizeof(lpstReadEPPInfoResponse->wPinFormat));
  1049. dwInfoSizeoff += sizeof(lpstReadEPPInfoResponse->wPinFormat);
  1050. memcpy(&lpstReadEPPInfoResponse->byKeyCheckModes, lpstRcvDate + dwInfoSizeoff, sizeof(lpstReadEPPInfoResponse->byKeyCheckModes));
  1051. dwInfoSizeoff += sizeof(lpstReadEPPInfoResponse->byKeyCheckModes);
  1052. memcpy(&lpstReadEPPInfoResponse->wUseDESKey, lpstRcvDate + dwInfoSizeoff, sizeof(lpstReadEPPInfoResponse->wUseDESKey));
  1053. dwInfoSizeoff += sizeof(lpstReadEPPInfoResponse->wUseDESKey);
  1054. memcpy(&lpstReadEPPInfoResponse->byICCard, lpstRcvDate + dwInfoSizeoff, sizeof(lpstReadEPPInfoResponse->byICCard));
  1055. dwInfoSizeoff += sizeof(lpstReadEPPInfoResponse->byICCard);
  1056. memcpy(&lpstReadEPPInfoResponse->byDisPlay, lpstRcvDate + dwInfoSizeoff, sizeof(lpstReadEPPInfoResponse->byDisPlay));
  1057. dwInfoSizeoff += sizeof(lpstReadEPPInfoResponse->byDisPlay);
  1058. memcpy(&lpstReadEPPInfoResponse->byPressKeyNumber, lpstRcvDate + dwInfoSizeoff, sizeof(lpstReadEPPInfoResponse->byPressKeyNumber));
  1059. dwInfoSizeoff += sizeof(lpstReadEPPInfoResponse->byPressKeyNumber);
  1060. memcpy(lpstReadEPPInfoResponse->byVersionNumber, lpstRcvDate + dwInfoSizeoff, sizeof(lpstReadEPPInfoResponse->byVersionNumber));
  1061. dwInfoSizeoff += sizeof(lpstReadEPPInfoResponse->byVersionNumber);
  1062. memcpy(lpstReadEPPInfoResponse->byProductModel, lpstRcvDate + dwInfoSizeoff, sizeof(lpstReadEPPInfoResponse->byProductModel));
  1063. dwInfoSizeoff += sizeof(lpstReadEPPInfoResponse->byProductModel);
  1064. memcpy(lpstReadEPPInfoResponse->byMainChipSN, lpstRcvDate + dwInfoSizeoff, sizeof(lpstReadEPPInfoResponse->byMainChipSN));
  1065. }
  1066. break;
  1067. case WRITE_USER_DATA:
  1068. break;
  1069. case READ_USER_DATA:
  1070. {
  1071. if (lpstReceiveInfo->unBody.lpbyResInfo == NULL)
  1072. {
  1073. return FALSE;
  1074. }
  1075. ReadUserDataResponse lpstReadUserDataResponse;
  1076. memcpy(lpstReadUserDataResponse, lpstRcvDate + dwInfoSizeoff, sizeof(lpstReadUserDataResponse));
  1077. dwInfoSizeoff += sizeof(lpstReadUserDataResponse);
  1078. memcpy(lpstReceiveInfo->unBody.lpbyResInfo, lpstReadUserDataResponse, sizeof(lpstReadUserDataResponse));
  1079. }
  1080. break;
  1081. case REMOVE_INSTALL_AUTH:
  1082. {
  1083. if (lpstReceiveInfo->unBody.lpbyResInfo == NULL)
  1084. {
  1085. return FALSE;
  1086. }
  1087. RemoveInstallAuthResponse RemoveInstallAuthRes;
  1088. memcpy(RemoveInstallAuthRes, lpstRcvDate + dwInfoSizeoff, sizeof(RemoveInstallAuthRes));
  1089. dwInfoSizeoff += sizeof(RemoveInstallAuthRes);
  1090. memcpy(lpstReceiveInfo->unBody.lpbyResInfo, RemoveInstallAuthRes, sizeof(RemoveInstallAuthRes));
  1091. }
  1092. break;
  1093. case UPDATE_PASSWORD:
  1094. break;
  1095. case LOAD_KEY:
  1096. {
  1097. if (lpstReceiveInfo->unBody.lpbyResInfo == NULL)
  1098. {
  1099. return FALSE;
  1100. }
  1101. LPLoadKeyResponse lpstLoadKeyResponse = (LPLoadKeyResponse)lpstReceiveInfo->unBody.lpbyResInfo;
  1102. lpstLoadKeyResponse->wKeyCheckValueLen = lpstEPPExchangeDataHeadSection->wLen;
  1103. lpstLoadKeyResponse->wKeyCheckValueLen -= sizeof(lpstReceiveInfo->unHead.byStatus);
  1104. if (lpuTraceMaskCount != NULL && lpuMaskOffsetArray != NULL && lpuMaskLenArray != NULL)
  1105. {
  1106. lpuMaskOffsetArray[*lpuTraceMaskCount] = lpstRcvDate + dwInfoSizeoff - m_byRcvBuff;
  1107. lpuMaskLenArray[*lpuTraceMaskCount] = lpstLoadKeyResponse->wKeyCheckValueLen;
  1108. (*lpuTraceMaskCount)++;
  1109. }
  1110. memcpy(lpstLoadKeyResponse->byKeyCheckValue, lpstRcvDate + dwInfoSizeoff, lpstLoadKeyResponse->wKeyCheckValueLen);
  1111. }
  1112. break;
  1113. case EXCHANGE_KEY:
  1114. {
  1115. if (lpstReceiveInfo->unBody.lpbyResInfo == NULL)
  1116. {
  1117. return FALSE;
  1118. }
  1119. LPExChangeKeyResponse lpstExChangeKeyResponse = (LPExChangeKeyResponse)lpstReceiveInfo->unBody.lpbyResInfo;
  1120. lpstExChangeKeyResponse->wKCVLen = lpstEPPExchangeDataHeadSection->wLen;
  1121. lpstExChangeKeyResponse->wKCVLen -= sizeof(lpstReceiveInfo->unHead.byStatus);
  1122. if (lpuTraceMaskCount != NULL && lpuMaskOffsetArray != NULL && lpuMaskLenArray != NULL)
  1123. {
  1124. lpuMaskOffsetArray[*lpuTraceMaskCount] = lpstRcvDate + dwInfoSizeoff - m_byRcvBuff;
  1125. lpuMaskLenArray[*lpuTraceMaskCount] = lpstExChangeKeyResponse->wKCVLen;
  1126. (*lpuTraceMaskCount)++;
  1127. }
  1128. memcpy(lpstExChangeKeyResponse->byKCV, lpstRcvDate + dwInfoSizeoff, lpstExChangeKeyResponse->wKCVLen);
  1129. }
  1130. break;
  1131. case GENERATE_RANDOM_DATA:
  1132. {
  1133. if (lpstReceiveInfo->unBody.lpbyResInfo == NULL)
  1134. {
  1135. return FALSE;
  1136. }
  1137. LPGenerateRandomDataResponse lpstGenerateRandomDataResponse = (LPGenerateRandomDataResponse)lpstReceiveInfo->unBody.lpbyResInfo;
  1138. lpstGenerateRandomDataResponse->wGeneratedDataLen = lpstEPPExchangeDataHeadSection->wLen;
  1139. lpstGenerateRandomDataResponse->wGeneratedDataLen -= sizeof(lpstReceiveInfo->unHead.byStatus);
  1140. memcpy(lpstGenerateRandomDataResponse->byGeneratedData, lpstRcvDate + dwInfoSizeoff, lpstGenerateRandomDataResponse->wGeneratedDataLen);
  1141. }
  1142. break;
  1143. case AUTHENTICATION:
  1144. {
  1145. if (lpstReceiveInfo->unBody.lpbyResInfo == NULL)
  1146. {
  1147. return FALSE;
  1148. }
  1149. LPAuthenticationResponse lpstAuthenticationResponse = (LPAuthenticationResponse)lpstReceiveInfo->unBody.lpbyResInfo;
  1150. memcpy(lpstAuthenticationResponse->byHOSTRandomData, lpstRcvDate + dwInfoSizeoff, sizeof(lpstAuthenticationResponse->byHOSTRandomData));
  1151. dwInfoSizeoff += sizeof(lpstAuthenticationResponse->byHOSTRandomData);
  1152. memcpy(lpstAuthenticationResponse->byEPPRandomData, lpstRcvDate + dwInfoSizeoff, sizeof(lpstAuthenticationResponse->byEPPRandomData));
  1153. dwInfoSizeoff += sizeof(lpstAuthenticationResponse->byEPPRandomData);
  1154. memcpy(lpstAuthenticationResponse->byMACData, lpstRcvDate + dwInfoSizeoff, sizeof(lpstAuthenticationResponse->byMACData));
  1155. }
  1156. break;
  1157. case DELETE_KEY:
  1158. break;
  1159. case READ_KEY_ATTRIBUTES:
  1160. {
  1161. if (lpstReceiveInfo->unBody.lpbyResInfo == NULL)
  1162. {
  1163. return FALSE;
  1164. }
  1165. LPReadKeyAttributesResponse lpstReadKeyAttributesResponse = (LPReadKeyAttributesResponse)lpstReceiveInfo->unBody.lpbyResInfo;
  1166. memcpy(&lpstReadKeyAttributesResponse->Attributes, lpstRcvDate + dwInfoSizeoff, sizeof(lpstReadKeyAttributesResponse->Attributes));
  1167. dwInfoSizeoff += sizeof(lpstReadKeyAttributesResponse->Attributes);
  1168. lpstReadKeyAttributesResponse->wKCVLen = lpstEPPExchangeDataHeadSection->wLen;
  1169. lpstReadKeyAttributesResponse->wKCVLen -= sizeof(lpstReceiveInfo->unHead.byStatus);
  1170. lpstReadKeyAttributesResponse->wKCVLen -= sizeof(lpstReadKeyAttributesResponse->Attributes);
  1171. if (lpuTraceMaskCount != NULL && lpuMaskOffsetArray != NULL && lpuMaskLenArray != NULL)
  1172. {
  1173. lpuMaskOffsetArray[*lpuTraceMaskCount] = lpstRcvDate + dwInfoSizeoff - m_byRcvBuff;
  1174. lpuMaskLenArray[*lpuTraceMaskCount] = lpstReadKeyAttributesResponse->wKCVLen;
  1175. (*lpuTraceMaskCount)++;
  1176. }
  1177. memcpy(lpstReadKeyAttributesResponse->byKCV, lpstRcvDate + dwInfoSizeoff, lpstReadKeyAttributesResponse->wKCVLen);
  1178. }
  1179. break;
  1180. case ENCTYPT_PIN_BLOCK:
  1181. {
  1182. if (lpstReceiveInfo->unBody.lpbyResInfo == NULL)
  1183. {
  1184. return FALSE;
  1185. }
  1186. EncryptPinBlockResponse EncryptPinBlockRes;
  1187. memcpy(EncryptPinBlockRes, lpstRcvDate + dwInfoSizeoff, sizeof(EncryptPinBlockRes));
  1188. dwInfoSizeoff += sizeof(EncryptPinBlockRes);
  1189. memcpy(lpstReceiveInfo->unBody.lpbyResInfo, EncryptPinBlockRes, sizeof(EncryptPinBlockRes));
  1190. }
  1191. break;
  1192. case DES_CRYPT_DATA:
  1193. {
  1194. if (lpstReceiveInfo->unBody.lpbyResInfo == NULL)
  1195. {
  1196. return FALSE;
  1197. }
  1198. LPDesCryptDataResponse lpstDesCryptDataResponse = (LPDesCryptDataResponse)lpstReceiveInfo->unBody.lpbyResInfo;
  1199. lpstDesCryptDataResponse->wOutputDataLen = lpstEPPExchangeDataHeadSection->wLen;
  1200. lpstDesCryptDataResponse->wOutputDataLen -= sizeof(lpstReceiveInfo->unHead.byStatus);
  1201. memcpy(lpstDesCryptDataResponse->lpOutputData, lpstRcvDate + dwInfoSizeoff, lpstDesCryptDataResponse->wOutputDataLen);
  1202. }
  1203. break;
  1204. case MAC_ENCRYPT_DATA:
  1205. {
  1206. if (lpstReceiveInfo->unBody.lpbyResInfo == NULL)
  1207. {
  1208. return FALSE;
  1209. }
  1210. LPMACEnCryptDataResponse lpstMACEnCryptDataResponse = (LPMACEnCryptDataResponse)lpstReceiveInfo->unBody.lpbyResInfo;
  1211. lpstMACEnCryptDataResponse->wOutputDataLen = lpstEPPExchangeDataHeadSection->wLen;
  1212. lpstMACEnCryptDataResponse->wOutputDataLen -= sizeof(lpstReceiveInfo->unHead.byStatus);
  1213. memcpy(lpstMACEnCryptDataResponse->lpOutputData, lpstRcvDate + dwInfoSizeoff, lpstMACEnCryptDataResponse->wOutputDataLen);
  1214. }
  1215. break;
  1216. case GET_EPP_SENSOR_DATA:
  1217. {
  1218. if (lpstReceiveInfo->unBody.lpbyResInfo == NULL)
  1219. {
  1220. return FALSE;
  1221. }
  1222. LPGetEPPSensorDataResponse lpstGetEPPSensorDataResponse = (LPGetEPPSensorDataResponse)lpstReceiveInfo->unBody.lpbyResInfo;
  1223. memcpy(&lpstGetEPPSensorDataResponse->ExternalSensor, lpstRcvDate + dwInfoSizeoff, sizeof(BYTE));
  1224. dwInfoSizeoff += sizeof(BYTE);
  1225. memcpy(&lpstGetEPPSensorDataResponse->InternalSensorState, lpstRcvDate + dwInfoSizeoff, sizeof(BYTE));
  1226. dwInfoSizeoff += sizeof(BYTE);
  1227. memcpy(&lpstGetEPPSensorDataResponse->BatteryState, lpstRcvDate + dwInfoSizeoff, sizeof(BYTE));
  1228. }
  1229. break;
  1230. case GET_KEYBOARD_CODE:
  1231. {
  1232. if (lpstReceiveInfo->unBody.lpbyResInfo == NULL)
  1233. {
  1234. return FALSE;
  1235. }
  1236. LPGetKeyBoardCodeResponse lpstGetKeyBoardCodeResponse = (LPGetKeyBoardCodeResponse)lpstReceiveInfo->unBody.lpbyResInfo;
  1237. memcpy(lpstGetKeyBoardCodeResponse->byEPPTableNaturalMode, lpstRcvDate + dwInfoSizeoff, sizeof(lpstGetKeyBoardCodeResponse->byEPPTableNaturalMode));
  1238. dwInfoSizeoff += sizeof(lpstGetKeyBoardCodeResponse->byEPPTableNaturalMode);
  1239. memcpy(lpstGetKeyBoardCodeResponse->byEPPTableShiftMode, lpstRcvDate + dwInfoSizeoff, sizeof(lpstGetKeyBoardCodeResponse->byEPPTableShiftMode));
  1240. dwInfoSizeoff += sizeof(lpstGetKeyBoardCodeResponse->byEPPTableShiftMode);
  1241. memcpy(lpstGetKeyBoardCodeResponse->byExFunKeyNaturalMode, lpstRcvDate + dwInfoSizeoff, sizeof(lpstGetKeyBoardCodeResponse->byExFunKeyNaturalMode));
  1242. dwInfoSizeoff += sizeof(lpstGetKeyBoardCodeResponse->byExFunKeyNaturalMode);
  1243. memcpy(lpstGetKeyBoardCodeResponse->byExFunKeyShiftMode, lpstRcvDate + dwInfoSizeoff, sizeof(lpstGetKeyBoardCodeResponse->byExFunKeyShiftMode));
  1244. }
  1245. break;
  1246. case SET_SYSTEM_TIME:
  1247. break;
  1248. case GET_SYSTEM_TIME:
  1249. {
  1250. if (lpstReceiveInfo->unBody.lpbyResInfo == NULL)
  1251. {
  1252. return FALSE;
  1253. }
  1254. GetSystemTimeResponse GetSystemTimeRes;
  1255. memcpy(GetSystemTimeRes, lpstRcvDate + dwInfoSizeoff, sizeof(GetSystemTimeRes));
  1256. dwInfoSizeoff += sizeof(GetSystemTimeRes);
  1257. memcpy(lpstReceiveInfo->unBody.lpbyResInfo, GetSystemTimeRes, sizeof(GetSystemTimeRes));
  1258. }
  1259. break;
  1260. case SM4_LOAD_TEXT_KEY:
  1261. {
  1262. if (lpstReceiveInfo->unBody.lpbyResInfo == NULL)
  1263. {
  1264. return FALSE;
  1265. }
  1266. SM4LoadTextKeyResponse SM4LoadTextKeyRes;
  1267. if (lpuTraceMaskCount != NULL && lpuMaskOffsetArray != NULL && lpuMaskLenArray != NULL)
  1268. {
  1269. lpuMaskOffsetArray[*lpuTraceMaskCount] = lpstRcvDate + dwInfoSizeoff - m_byRcvBuff;
  1270. lpuMaskLenArray[*lpuTraceMaskCount] = sizeof(SM4LoadTextKeyRes);
  1271. (*lpuTraceMaskCount)++;
  1272. }
  1273. memcpy(SM4LoadTextKeyRes, lpstRcvDate + dwInfoSizeoff, sizeof(SM4LoadTextKeyRes));
  1274. dwInfoSizeoff += sizeof(SM4LoadTextKeyRes);
  1275. memcpy(lpstReceiveInfo->unBody.lpbyResInfo, SM4LoadTextKeyRes, sizeof(SM4LoadTextKeyRes));
  1276. }
  1277. break;
  1278. case SM4_EXCHANGE_KEY:
  1279. {
  1280. if (lpstReceiveInfo->unBody.lpbyResInfo == NULL)
  1281. {
  1282. return FALSE;
  1283. }
  1284. SM4ExchangeKeyResponse SM4ExchangeKeyRes;
  1285. if (lpuTraceMaskCount != NULL && lpuMaskOffsetArray != NULL && lpuMaskLenArray != NULL)
  1286. {
  1287. lpuMaskOffsetArray[*lpuTraceMaskCount] = lpstRcvDate + dwInfoSizeoff - m_byRcvBuff;
  1288. lpuMaskLenArray[*lpuTraceMaskCount] = sizeof(SM4ExchangeKeyRes);
  1289. (*lpuTraceMaskCount)++;
  1290. }
  1291. memcpy(SM4ExchangeKeyRes, lpstRcvDate + dwInfoSizeoff, sizeof(SM4ExchangeKeyRes));
  1292. dwInfoSizeoff += sizeof(SM4ExchangeKeyRes);
  1293. memcpy(lpstReceiveInfo->unBody.lpbyResInfo, SM4ExchangeKeyRes, sizeof(SM4ExchangeKeyRes));
  1294. }
  1295. break;
  1296. case SM4_CRYPT:
  1297. {
  1298. if (lpstReceiveInfo->unBody.lpbyResInfo == NULL)
  1299. {
  1300. return FALSE;
  1301. }
  1302. LPSM4CryptResponse lpstSM4CryptResponse = (LPSM4CryptResponse)lpstReceiveInfo->unBody.lpbyResInfo;
  1303. lpstSM4CryptResponse->wEncryptDataLen = lpstEPPExchangeDataHeadSection->wLen;
  1304. lpstSM4CryptResponse->wEncryptDataLen -= sizeof(lpstReceiveInfo->unHead.byStatus);
  1305. memcpy(lpstSM4CryptResponse->lpEncryptData, lpstRcvDate + dwInfoSizeoff, lpstSM4CryptResponse->wEncryptDataLen);
  1306. }
  1307. break;
  1308. case SM4_MAC:
  1309. {
  1310. if (lpstReceiveInfo->unBody.lpbyResInfo == NULL)
  1311. {
  1312. return FALSE;
  1313. }
  1314. SM4MACResponse SM4MACRes;
  1315. memcpy(SM4MACRes, lpstRcvDate + dwInfoSizeoff, sizeof(SM4MACRes));
  1316. dwInfoSizeoff += sizeof(SM4MACRes);
  1317. memcpy(lpstReceiveInfo->unBody.lpbyResInfo, SM4MACRes, sizeof(SM4MACRes));
  1318. }
  1319. break;
  1320. case SM4_GET_PIN_BLOCK:
  1321. {
  1322. if (lpstReceiveInfo->unBody.lpbyResInfo == NULL)
  1323. {
  1324. return FALSE;
  1325. }
  1326. SM4GetPinBlockResponse SM4GetPinBlockRes;
  1327. memcpy(SM4GetPinBlockRes, lpstRcvDate + dwInfoSizeoff, sizeof(SM4GetPinBlockRes));
  1328. dwInfoSizeoff += sizeof(SM4GetPinBlockRes);
  1329. memcpy(lpstReceiveInfo->unBody.lpbyResInfo, SM4GetPinBlockRes, sizeof(SM4GetPinBlockRes));
  1330. }
  1331. break;
  1332. case SM_DELETE_KEY:
  1333. break;
  1334. case READ_A980_FW_VERSION:
  1335. case SM_GET_VERSION:
  1336. {
  1337. if (lpstReceiveInfo->unBody.lpbyResInfo == NULL)
  1338. {
  1339. return FALSE;
  1340. }
  1341. SMGetVersionResponse SMGetVersionRes;
  1342. memcpy(SMGetVersionRes, lpstRcvDate + dwInfoSizeoff, sizeof(SMGetVersionRes));
  1343. dwInfoSizeoff += sizeof(SMGetVersionRes);
  1344. memcpy(lpstReceiveInfo->unBody.lpbyResInfo, SMGetVersionRes, sizeof(SMGetVersionRes));
  1345. }
  1346. break;
  1347. case SM_READ_KEY_ATTRIBUTES:
  1348. {
  1349. if (lpstReceiveInfo->unBody.lpbyResInfo == NULL)
  1350. {
  1351. return FALSE;
  1352. }
  1353. LPSMReadKeyAttributeResponse lpstSMReadKeyAttributeRes = (LPSMReadKeyAttributeResponse)lpstReceiveInfo->unBody.lpbyResInfo;
  1354. memcpy(&lpstSMReadKeyAttributeRes->Attributes, lpstRcvDate + dwInfoSizeoff, sizeof(lpstSMReadKeyAttributeRes->Attributes));
  1355. dwInfoSizeoff += sizeof(lpstSMReadKeyAttributeRes->Attributes);
  1356. if (lpuTraceMaskCount != NULL && lpuMaskOffsetArray != NULL && lpuMaskLenArray != NULL)
  1357. {
  1358. lpuMaskOffsetArray[*lpuTraceMaskCount] = lpstRcvDate + dwInfoSizeoff - m_byRcvBuff;
  1359. lpuMaskLenArray[*lpuTraceMaskCount] = sizeof(lpstSMReadKeyAttributeRes->byKeyCheckValue);
  1360. (*lpuTraceMaskCount)++;
  1361. }
  1362. memcpy(&lpstSMReadKeyAttributeRes->byKeyCheckValue, lpstRcvDate + dwInfoSizeoff, sizeof(lpstSMReadKeyAttributeRes->byKeyCheckValue));
  1363. }
  1364. break;
  1365. case GENERATE_RSA_KEYPAIR:
  1366. break;
  1367. case EXP_EPP_PUBLIC_KEY:
  1368. {
  1369. if (lpstReceiveInfo->unBody.lpbyResInfo == NULL)
  1370. {
  1371. return FALSE;
  1372. }
  1373. LPExpEppPKResponse lpstExpEppPKRes = (LPExpEppPKResponse)lpstReceiveInfo->unBody.lpbyResInfo;
  1374. USHORT usOffset = 0;
  1375. memcpy(&lpstExpEppPKRes->enSigAlgorithm, lpstRcvDate + dwInfoSizeoff, sizeof(BYTE));
  1376. dwInfoSizeoff += sizeof(BYTE);
  1377. if (lpstExpEppPKRes->enSigAlgorithm == SIGN_NA)
  1378. {
  1379. lpstExpEppPKRes->stDerRsaKeyWithSigTag.usLength = 0;
  1380. lpstExpEppPKRes->stDerRsaKeyWithSigTag.lpbyBuffer = NULL;
  1381. lpstExpEppPKRes->stDerRsaKeyWithSigTag.stDerRsaKeyTag.usLength = GetDerTagLength(lpstRcvDate + dwInfoSizeoff);
  1382. memcpy(lpstExpEppPKRes->stDerRsaKeyWithSigTag.stDerRsaKeyTag.lpbyBuffer, lpstRcvDate + dwInfoSizeoff, lpstExpEppPKRes->stDerRsaKeyWithSigTag.stDerRsaKeyTag.usLength);
  1383. ParseDerTag(lpstExpEppPKRes->stDerRsaKeyWithSigTag.stDerRsaKeyTag.lpbyBuffer, (LPBYTE)&lpstExpEppPKRes->stDerRsaKeyWithSigTag.stDerRsaKeyTag, DER_TAG_RSA_KEY, usOffset);
  1384. }
  1385. else
  1386. {
  1387. lpstExpEppPKRes->stDerRsaKeyWithSigTag.usLength = GetDerTagLength(lpstRcvDate + dwInfoSizeoff);
  1388. memcpy(lpstExpEppPKRes->stDerRsaKeyWithSigTag.lpbyBuffer, lpstRcvDate + dwInfoSizeoff, lpstExpEppPKRes->stDerRsaKeyWithSigTag.usLength);
  1389. ParseDerTag(lpstExpEppPKRes->stDerRsaKeyWithSigTag.lpbyBuffer, (LPBYTE)&lpstExpEppPKRes->stDerRsaKeyWithSigTag, DER_TAG_RSA_KEY_WITH_SIG, usOffset);
  1390. }
  1391. }
  1392. break;
  1393. case IMPORT_DES_KEY:
  1394. {
  1395. if (lpstReceiveInfo->unBody.lpbyResInfo == NULL)
  1396. {
  1397. return FALSE;
  1398. }
  1399. LPImportDesKeyResponse lpstImportDesKeyRes = (LPImportDesKeyResponse)lpstReceiveInfo->unBody.lpbyResInfo;
  1400. lpstImportDesKeyRes->wKCVLen = lpstEPPExchangeDataHeadSection->wLen;
  1401. lpstImportDesKeyRes->wKCVLen -= sizeof(lpstReceiveInfo->unHead.byStatus);
  1402. if (lpuTraceMaskCount != NULL && lpuMaskOffsetArray != NULL && lpuMaskLenArray != NULL)
  1403. {
  1404. lpuMaskOffsetArray[*lpuTraceMaskCount] = lpstRcvDate + dwInfoSizeoff - m_byRcvBuff;
  1405. lpuMaskLenArray[*lpuTraceMaskCount] = lpstImportDesKeyRes->wKCVLen;
  1406. (*lpuTraceMaskCount)++;
  1407. }
  1408. memcpy(&lpstImportDesKeyRes->byKCV, lpstRcvDate + dwInfoSizeoff, lpstImportDesKeyRes->wKCVLen);
  1409. }
  1410. break;
  1411. case IMPORT_RSA_KEY:
  1412. {
  1413. if (lpstReceiveInfo->unBody.lpbyResInfo == NULL)
  1414. {
  1415. return FALSE;
  1416. }
  1417. LPImportRsaKeyResponse lpstImportRsaKeyRes = (LPImportRsaKeyResponse)lpstReceiveInfo->unBody.lpbyResInfo;
  1418. memcpy(&lpstImportRsaKeyRes->enRsaKCM, lpstRcvDate + dwInfoSizeoff, sizeof(BYTE));
  1419. dwInfoSizeoff += sizeof(BYTE);
  1420. if (lpuTraceMaskCount != NULL && lpuMaskOffsetArray != NULL && lpuMaskLenArray != NULL)
  1421. {
  1422. lpuMaskOffsetArray[*lpuTraceMaskCount] = lpstRcvDate + dwInfoSizeoff - m_byRcvBuff;
  1423. lpuMaskLenArray[*lpuTraceMaskCount] = sizeof(lpstImportRsaKeyRes->byRsaKCV);
  1424. (*lpuTraceMaskCount)++;
  1425. }
  1426. memcpy(&lpstImportRsaKeyRes->byRsaKCV, lpstRcvDate + dwInfoSizeoff, sizeof(lpstImportRsaKeyRes->byRsaKCV));
  1427. }
  1428. break;
  1429. case IMPORT_EPP_SERIAL_NUMBER:
  1430. {
  1431. if (lpstReceiveInfo->unBody.lpbyResInfo == NULL)
  1432. {
  1433. return FALSE;
  1434. }
  1435. LPImportEppSNResponse lpstImportEppSNRes = (LPImportEppSNResponse)lpstReceiveInfo->unBody.lpbyResInfo;
  1436. memcpy(&lpstImportEppSNRes->enRsaKCM, lpstRcvDate + dwInfoSizeoff, sizeof(BYTE));
  1437. dwInfoSizeoff += sizeof(BYTE);
  1438. if (lpuTraceMaskCount != NULL && lpuMaskOffsetArray != NULL && lpuMaskLenArray != NULL)
  1439. {
  1440. lpuMaskOffsetArray[*lpuTraceMaskCount] = lpstRcvDate + dwInfoSizeoff - m_byRcvBuff;
  1441. lpuMaskLenArray[*lpuTraceMaskCount] = sizeof(lpstImportEppSNRes->byRsaKCV);
  1442. (*lpuTraceMaskCount)++;
  1443. }
  1444. memcpy(&lpstImportEppSNRes->byRsaKCV, lpstRcvDate + dwInfoSizeoff, sizeof(lpstImportEppSNRes->byRsaKCV));
  1445. }
  1446. break;
  1447. case EXP_EPP_SERIAL_NUMBER:
  1448. {
  1449. if (lpstReceiveInfo->unBody.lpbyResInfo == NULL)
  1450. {
  1451. return FALSE;
  1452. }
  1453. LPExpEppSNResponse lpstExpEppSNRes = (LPExpEppSNResponse)lpstReceiveInfo->unBody.lpbyResInfo;
  1454. USHORT usOffset = 0;
  1455. memcpy(&lpstExpEppSNRes->enSigAlgorithm, lpstRcvDate + dwInfoSizeoff, sizeof(BYTE));
  1456. dwInfoSizeoff += sizeof(BYTE);
  1457. lpstExpEppSNRes->stDerEppSNTag.usLength = GetDerTagLength(lpstRcvDate + dwInfoSizeoff);
  1458. memcpy(lpstExpEppSNRes->stDerEppSNTag.lpbyBuffer, lpstRcvDate + dwInfoSizeoff, lpstExpEppSNRes->stDerEppSNTag.usLength);
  1459. ParseDerTag(lpstExpEppSNRes->stDerEppSNTag.lpbyBuffer, (LPBYTE)&lpstExpEppSNRes->stDerEppSNTag, DER_TAG_EPP_SERIAL_NUMBER, usOffset);
  1460. }
  1461. break;
  1462. case RSA_CRYPT_DATA:
  1463. {
  1464. if (lpstReceiveInfo->unBody.lpbyResInfo == NULL)
  1465. {
  1466. return FALSE;
  1467. }
  1468. LPRSACryptDataResponse lpstRSACryptDataRes = (LPRSACryptDataResponse)lpstReceiveInfo->unBody.lpbyResInfo;
  1469. lpstRSACryptDataRes->usDataLen = lpstEPPExchangeDataHeadSection->wLen;
  1470. lpstRSACryptDataRes->usDataLen -= sizeof(lpstReceiveInfo->unHead.byStatus);
  1471. memcpy(lpstRSACryptDataRes->byData, lpstRcvDate + dwInfoSizeoff, lpstRSACryptDataRes->usDataLen);
  1472. }
  1473. break;
  1474. case START_GM_FW_LOAD:
  1475. case LOADING_GM_FW_CODE:
  1476. case END_GM_FW_LOAD:
  1477. break;
  1478. default:
  1479. {
  1480. return FALSE;
  1481. }
  1482. }
  1483. if ((lpuTraceMaskCount != NULL) /*&&
  1484. /*(CTraceManager::m_bTraceMask == FALSE)*/)
  1485. {
  1486. *lpuTraceMaskCount = 0;
  1487. }
  1488. return TRUE;
  1489. }
  1490. VOID CZT598M1FD_DevImpl::SetKeyInfo(const LPBYTE lpbyUAK, WORD wUAKSize, const LPBYTE lpbyKBPK, WORD wKBPKSize)
  1491. {
  1492. m_lpbyUAK = lpbyUAK;
  1493. m_wUAKSize = wUAKSize;
  1494. m_lpbyKBPK = lpbyKBPK;
  1495. m_wKBPKSize = wKBPKSize;
  1496. }
  1497. BOOL CZT598M1FD_DevImpl::EditDerTag(LPBYTE lpbyBuffer, LPBYTE lpbyDerTag, DerTagType enDerTagType, USHORT &usOffset)
  1498. {
  1499. BOOL bRet = TRUE;
  1500. USHORT usInternalOffset = 0;
  1501. LPDerTagHead lpDerTagHead = (LPDerTagHead)lpbyDerTag;
  1502. if (lpbyBuffer == NULL || lpbyDerTag == NULL)
  1503. {
  1504. return FALSE;
  1505. }
  1506. switch (enDerTagType)
  1507. {
  1508. case DER_TAG_INTEGER:
  1509. if (((LPDerIntegerTag)lpbyDerTag)->usLength > 0 && ((LPDerIntegerTag)lpbyDerTag)->lpbyBuffer != NULL)
  1510. {
  1511. memcpy(lpbyBuffer, ((LPDerIntegerTag)lpbyDerTag)->lpbyBuffer, ((LPDerIntegerTag)lpbyDerTag)->usLength);
  1512. usOffset += ((LPDerIntegerTag)lpbyDerTag)->usLength;
  1513. return TRUE;
  1514. }
  1515. break;
  1516. case DER_TAG_RSA_KEY:
  1517. if (((LPDerRsaKeyTag)lpbyDerTag)->usLength > 0 && ((LPDerRsaKeyTag)lpbyDerTag)->lpbyBuffer != NULL)
  1518. {
  1519. memcpy(lpbyBuffer, ((LPDerRsaKeyTag)lpbyDerTag)->lpbyBuffer, ((LPDerRsaKeyTag)lpbyDerTag)->usLength);
  1520. usOffset += ((LPDerRsaKeyTag)lpbyDerTag)->usLength;
  1521. return TRUE;
  1522. }
  1523. break;
  1524. case DER_TAG_RSA_KEY_WITH_SIG:
  1525. if (((LPDerRsaKeyWithSigTag)lpbyDerTag)->usLength > 0 && ((LPDerRsaKeyWithSigTag)lpbyDerTag)->lpbyBuffer != NULL)
  1526. {
  1527. memcpy(lpbyBuffer, ((LPDerRsaKeyWithSigTag)lpbyDerTag)->lpbyBuffer, ((LPDerRsaKeyWithSigTag)lpbyDerTag)->usLength);
  1528. usOffset += ((LPDerRsaKeyWithSigTag)lpbyDerTag)->usLength;
  1529. return TRUE;
  1530. }
  1531. break;
  1532. case DER_TAG_ENCRYPTED_DES_KEY:
  1533. if (((LPDerEncDesKeytag)lpbyDerTag)->usLength > 0 && ((LPDerEncDesKeytag)lpbyDerTag)->lpbyBuffer != NULL)
  1534. {
  1535. memcpy(lpbyBuffer, ((LPDerEncDesKeytag)lpbyDerTag)->lpbyBuffer, ((LPDerEncDesKeytag)lpbyDerTag)->usLength);
  1536. usOffset += ((LPDerEncDesKeytag)lpbyDerTag)->usLength;
  1537. return TRUE;
  1538. }
  1539. break;
  1540. case DER_TAG_EPP_SERIAL_NUMBER:
  1541. if (((LPDerEppSNTag)lpbyDerTag)->usLength > 0 && ((LPDerEppSNTag)lpbyDerTag)->lpbyBuffer != NULL)
  1542. {
  1543. memcpy(lpbyBuffer, ((LPDerEppSNTag)lpbyDerTag)->lpbyBuffer, ((LPDerEppSNTag)lpbyDerTag)->usLength);
  1544. usOffset += ((LPDerEppSNTag)lpbyDerTag)->usLength;
  1545. return TRUE;
  1546. }
  1547. break;
  1548. default:
  1549. break;
  1550. }
  1551. memcpy(lpbyBuffer + usOffset, &lpDerTagHead->byFieldType, sizeof(lpDerTagHead->byFieldType));
  1552. usOffset += sizeof(lpDerTagHead->byFieldType);
  1553. if (lpDerTagHead->byLengthType == RSA_DER_TAG_LENGTH_TYPE_LONG_ONE)
  1554. {
  1555. memcpy(lpbyBuffer + usOffset, &lpDerTagHead->byLengthType, sizeof(lpDerTagHead->byLengthType));
  1556. usOffset += sizeof(lpDerTagHead->byLengthType);
  1557. memcpy(lpbyBuffer + usOffset, &(lpDerTagHead->usLength), 1);
  1558. usOffset += 1;
  1559. }
  1560. else if (lpDerTagHead->byLengthType == RSA_DER_TAG_LENGTH_TYPE_LONG_TWO)
  1561. {
  1562. memcpy(lpbyBuffer + usOffset, &lpDerTagHead->byLengthType, sizeof(lpDerTagHead->byLengthType));
  1563. usOffset += sizeof(lpDerTagHead->byLengthType);
  1564. memcpy(lpbyBuffer + usOffset, (LPBYTE)&(lpDerTagHead->usLength) + 1, 1);
  1565. usOffset += 1;
  1566. memcpy(lpbyBuffer + usOffset, &(lpDerTagHead->usLength), 1);
  1567. usOffset += 1;
  1568. }
  1569. else
  1570. {
  1571. memcpy(lpbyBuffer + usOffset, &(lpDerTagHead->usLength), 1);
  1572. usOffset += 1;
  1573. }
  1574. switch (enDerTagType)
  1575. {
  1576. case DER_TAG_INTEGER:
  1577. if (((LPDerIntegerTag)lpbyDerTag)->lpbyValues != NULL)
  1578. {
  1579. memcpy(lpbyBuffer + usOffset, ((LPDerIntegerTag)lpbyDerTag)->lpbyValues, lpDerTagHead->usLength);
  1580. }
  1581. usOffset += lpDerTagHead->usLength;
  1582. break;
  1583. case DER_TAG_RSA_KEY:
  1584. if (EditDerTag(lpbyBuffer + usOffset, (LPBYTE)&((LPDerRsaKeyTag)lpbyDerTag)->stModulusTag, DER_TAG_INTEGER, usInternalOffset) == FALSE)
  1585. {
  1586. return FALSE;
  1587. }
  1588. usOffset += usInternalOffset;
  1589. usInternalOffset = 0;
  1590. if (EditDerTag(lpbyBuffer + usOffset, (LPBYTE)&((LPDerRsaKeyTag)lpbyDerTag)->stExponentTag, DER_TAG_INTEGER, usInternalOffset) == FALSE)
  1591. {
  1592. return FALSE;
  1593. }
  1594. usOffset += usInternalOffset;
  1595. break;
  1596. case DER_TAG_RSA_KEY_WITH_SIG:
  1597. if (EditDerTag(lpbyBuffer + usOffset, (LPBYTE)&((LPDerRsaKeyWithSigTag)lpbyDerTag)->stDerRsaKeyTag, DER_TAG_RSA_KEY, usInternalOffset) == FALSE)
  1598. {
  1599. return FALSE;
  1600. }
  1601. usOffset += usInternalOffset;
  1602. usInternalOffset = 0;
  1603. if (EditDerTag(lpbyBuffer + usOffset, (LPBYTE)&((LPDerRsaKeyWithSigTag)lpbyDerTag)->stSigTag, DER_TAG_INTEGER, usInternalOffset) == FALSE)
  1604. {
  1605. return FALSE;
  1606. }
  1607. usOffset += usInternalOffset;
  1608. break;
  1609. case DER_TAG_ENCRYPTED_DES_KEY:
  1610. if (EditDerTag(lpbyBuffer + usOffset, (LPBYTE)&((LPDerEncDesKeytag)lpbyDerTag)->stEncDesKeyTag, DER_TAG_INTEGER, usInternalOffset) == FALSE)
  1611. {
  1612. return FALSE;
  1613. }
  1614. usOffset += usInternalOffset;
  1615. usInternalOffset = 0;
  1616. if (EditDerTag(lpbyBuffer + usOffset, (LPBYTE)&((LPDerEncDesKeytag)lpbyDerTag)->stSigTag, DER_TAG_INTEGER, usInternalOffset) == FALSE)
  1617. {
  1618. return FALSE;
  1619. }
  1620. usOffset += usInternalOffset;
  1621. break;
  1622. case DER_TAG_EPP_SERIAL_NUMBER:
  1623. if (EditDerTag(lpbyBuffer + usOffset, (LPBYTE)&((LPDerEppSNTag)lpbyDerTag)->stSNTag, DER_TAG_INTEGER, usInternalOffset) == FALSE)
  1624. {
  1625. return FALSE;
  1626. }
  1627. usOffset += usInternalOffset;
  1628. usInternalOffset = 0;
  1629. if (EditDerTag(lpbyBuffer + usOffset, (LPBYTE)&((LPDerEppSNTag)lpbyDerTag)->stSigTag, DER_TAG_INTEGER, usInternalOffset) == FALSE)
  1630. {
  1631. return FALSE;
  1632. }
  1633. usOffset += usInternalOffset;
  1634. break;
  1635. default:
  1636. bRet = FALSE;
  1637. break;
  1638. }
  1639. return bRet;
  1640. }
  1641. USHORT CZT598M1FD_DevImpl::GetDerTagLength(LPBYTE lpbySource)
  1642. {
  1643. USHORT usLength = 0;
  1644. BYTE byLengthTemp[2] = {0};
  1645. if (lpbySource == NULL)
  1646. {
  1647. return 0;
  1648. }
  1649. if (lpbySource[1] == RSA_DER_TAG_LENGTH_TYPE_LONG_ONE)
  1650. {
  1651. usLength = (USHORT)lpbySource[2];
  1652. usLength += 3;
  1653. }
  1654. else if (lpbySource[1] == RSA_DER_TAG_LENGTH_TYPE_LONG_TWO)
  1655. {
  1656. byLengthTemp[0] = lpbySource[3];
  1657. byLengthTemp[1] = lpbySource[2];
  1658. usLength = *(LPUSHORT)byLengthTemp;
  1659. usLength += 4;
  1660. }
  1661. else
  1662. {
  1663. usLength = (USHORT)lpbySource[1];
  1664. usLength += 2;
  1665. }
  1666. return usLength;
  1667. }
  1668. BOOL CZT598M1FD_DevImpl::ParseDerTag(LPBYTE lpbyBuffer, LPBYTE lpbyDerTag, DerTagType enDerTagType, USHORT &usOffset)
  1669. {
  1670. BOOL bRet = TRUE;
  1671. USHORT usInternalOffset = 0;
  1672. LPDerTagHead lpDerTagHead = (LPDerTagHead)lpbyDerTag;
  1673. BYTE byLengthTemp[2] = {0};
  1674. if (lpbyBuffer == NULL || lpbyDerTag == NULL)
  1675. {
  1676. return FALSE;
  1677. }
  1678. lpDerTagHead->byFieldType = lpbyBuffer[0];
  1679. usOffset += 1;
  1680. if (lpbyBuffer[1] == RSA_DER_TAG_LENGTH_TYPE_LONG_ONE)
  1681. {
  1682. lpDerTagHead->usLength = (USHORT)lpbyBuffer[2];
  1683. usOffset += 2;
  1684. }
  1685. else if (lpbyBuffer[1] == RSA_DER_TAG_LENGTH_TYPE_LONG_TWO)
  1686. {
  1687. byLengthTemp[0] = lpbyBuffer[3];
  1688. byLengthTemp[1] = lpbyBuffer[2];
  1689. lpDerTagHead->usLength = *(LPUSHORT)byLengthTemp;
  1690. usOffset += 3;
  1691. }
  1692. else
  1693. {
  1694. lpDerTagHead->usLength = (USHORT)lpbyBuffer[1];
  1695. usOffset += 1;
  1696. }
  1697. switch (enDerTagType)
  1698. {
  1699. case DER_TAG_INTEGER:
  1700. ((LPDerIntegerTag)lpbyDerTag)->lpbyBuffer = lpbyBuffer;//此内存空间在devctrl模块,事先已被拷贝赋值,此时只记录地址即可
  1701. ((LPDerIntegerTag)lpbyDerTag)->lpbyValues = lpbyBuffer + usOffset;
  1702. usOffset += lpDerTagHead->usLength;
  1703. ((LPDerIntegerTag)lpbyDerTag)->usLength = usOffset;
  1704. break;
  1705. case DER_TAG_RSA_KEY:
  1706. ((LPDerRsaKeyTag)lpbyDerTag)->lpbyBuffer = lpbyBuffer;
  1707. if (ParseDerTag(lpbyBuffer + usOffset, (LPBYTE)&((LPDerRsaKeyTag)lpbyDerTag)->stModulusTag, DER_TAG_INTEGER, usInternalOffset) == FALSE)
  1708. {
  1709. return FALSE;
  1710. }
  1711. usOffset += usInternalOffset;
  1712. usInternalOffset = 0;
  1713. if (ParseDerTag(lpbyBuffer + usOffset, (LPBYTE)&((LPDerRsaKeyTag)lpbyDerTag)->stExponentTag, DER_TAG_INTEGER, usInternalOffset) == FALSE)
  1714. {
  1715. return FALSE;
  1716. }
  1717. usOffset += usInternalOffset;
  1718. ((LPDerRsaKeyTag)lpbyDerTag)->usLength = usOffset;
  1719. break;
  1720. case DER_TAG_RSA_KEY_WITH_SIG:
  1721. ((LPDerRsaKeyWithSigTag)lpbyDerTag)->lpbyBuffer = lpbyBuffer;
  1722. if (ParseDerTag(lpbyBuffer + usOffset, (LPBYTE)&((LPDerRsaKeyWithSigTag)lpbyDerTag)->stDerRsaKeyTag, DER_TAG_RSA_KEY, usInternalOffset) == FALSE)
  1723. {
  1724. return FALSE;
  1725. }
  1726. usOffset += usInternalOffset;
  1727. usInternalOffset = 0;
  1728. if (ParseDerTag(lpbyBuffer + usOffset, (LPBYTE)&((LPDerRsaKeyWithSigTag)lpbyDerTag)->stSigTag, DER_TAG_INTEGER, usInternalOffset) == FALSE)
  1729. {
  1730. return FALSE;
  1731. }
  1732. usOffset += usInternalOffset;
  1733. ((LPDerRsaKeyWithSigTag)lpbyDerTag)->usLength = usOffset;
  1734. break;
  1735. case DER_TAG_ENCRYPTED_DES_KEY:
  1736. ((LPDerEncDesKeytag)lpbyDerTag)->lpbyBuffer = lpbyBuffer;
  1737. if (ParseDerTag(lpbyBuffer + usOffset, (LPBYTE)&((LPDerEncDesKeytag)lpbyDerTag)->stEncDesKeyTag, DER_TAG_INTEGER, usInternalOffset) == FALSE)
  1738. {
  1739. return FALSE;
  1740. }
  1741. usOffset += usInternalOffset;
  1742. usInternalOffset = 0;
  1743. if (ParseDerTag(lpbyBuffer + usOffset, (LPBYTE)&((LPDerEncDesKeytag)lpbyDerTag)->stSigTag, DER_TAG_INTEGER, usInternalOffset) == FALSE)
  1744. {
  1745. return FALSE;
  1746. }
  1747. usOffset += usInternalOffset;
  1748. ((LPDerEncDesKeytag)lpbyDerTag)->usLength = usOffset;
  1749. break;
  1750. case DER_TAG_EPP_SERIAL_NUMBER:
  1751. ((LPDerEppSNTag)lpbyDerTag)->lpbyBuffer = lpbyBuffer;
  1752. if (ParseDerTag(lpbyBuffer + usOffset, (LPBYTE)&((LPDerEppSNTag)lpbyDerTag)->stSNTag, DER_TAG_INTEGER, usInternalOffset) == FALSE)
  1753. {
  1754. return FALSE;
  1755. }
  1756. usOffset += usInternalOffset;
  1757. usInternalOffset = 0;
  1758. if (ParseDerTag(lpbyBuffer + usOffset, (LPBYTE)&((LPDerEppSNTag)lpbyDerTag)->stSigTag, DER_TAG_INTEGER, usInternalOffset) == FALSE)
  1759. {
  1760. return FALSE;
  1761. }
  1762. usOffset += usInternalOffset;
  1763. ((LPDerEppSNTag)lpbyDerTag)->usLength = usOffset;
  1764. break;
  1765. default:
  1766. bRet = FALSE;
  1767. break;
  1768. }
  1769. return bRet;
  1770. }
  1771. BOOL CZT598M1FD_DevImpl::SecureComm(BYTE byCommand, LPBYTE lpbyData, WORD &wStatusCode)
  1772. {
  1773. LPSecureCommProtocolHead lpSecureCommProtocolHead = (LPSecureCommProtocolHead)m_bySndBuff;
  1774. LPSecureCommProtocolTail lpSecureCommProtocolTail = NULL;
  1775. BYTE byBuffer[EXCHANGE_DATA_MAX_LEN] = {0};
  1776. WORD wSndBufflen = 0;
  1777. WORD wLoop = 0;
  1778. WORD wIdx = 0;
  1779. DWORD dwLen = 0;
  1780. WORD wCRC = 0;
  1781. USHORT usBlockNum = 0;
  1782. USHORT usCommandLen = sizeof(lpSecureCommProtocolHead->bySerialNumber) + sizeof(lpSecureCommProtocolHead->byCommandType) + sizeof(lpSecureCommProtocolHead->byCommand);
  1783. BYTE byCRC[2] = {0};
  1784. memset(m_bySndBuff, 0x00, sizeof(m_bySndBuff));
  1785. lpSecureCommProtocolHead->byCommandHead = SECURE_COMM_HEAD;
  1786. lpSecureCommProtocolHead->byDeviceNo = SECURE_COMM_DEVICE_NO;
  1787. lpSecureCommProtocolHead->wCommandFeature = SECURE_COMM_COMMAND_FEATURE;
  1788. lpSecureCommProtocolHead->byCommandType = SECURE_COMM_COMMAND_TYPE;
  1789. lpSecureCommProtocolHead->byCommand = byCommand;
  1790. switch (byCommand)
  1791. {
  1792. case START_MAIN_FW_UPDATE:
  1793. break;
  1794. case UPDATING_MAIN_FW:
  1795. usCommandLen += sizeof(UpdatingMainFWParam);
  1796. memcpy(m_bySndBuff + sizeof(SecureCommProtocolHead), lpbyData, sizeof(UpdatingMainFWParam));
  1797. break;
  1798. case FINISH_MAIN_FW_UPDATE:
  1799. usCommandLen += 64;
  1800. memcpy(m_bySndBuff + sizeof(SecureCommProtocolHead), lpbyData, 64);
  1801. usBlockNum = wStatusCode;
  1802. wStatusCode = STATUS_SUCCESS;
  1803. break;
  1804. default:
  1805. //m_traceManager.TraceIn(TRM_INT, TRM_LV_ERROR, "Param Error!");
  1806. return FALSE;
  1807. break;
  1808. }
  1809. lpSecureCommProtocolHead->byCommandLength[0] = (BYTE)(usCommandLen >> 8);
  1810. lpSecureCommProtocolHead->byCommandLength[1] = (BYTE)usCommandLen;
  1811. lpSecureCommProtocolTail = (LPSecureCommProtocolTail)(m_bySndBuff + sizeof(SecureCommProtocolHead) + (usCommandLen - 3));
  1812. lpSecureCommProtocolTail->bySignatureEnd = SECURE_COMM_END;
  1813. if ((CAlgorithm::CalcCRC(16, (LPBYTE)m_bySndBuff, sizeof(SecureCommProtocolHead) + (usCommandLen - 3) +
  1814. sizeof(lpSecureCommProtocolTail->bySignatureEnd), &wCRC)) == FALSE)
  1815. {
  1816. //m_traceManager.TraceIn(TRM_INT, TRM_LV_ERROR, "CalcCRC Error!");
  1817. return FALSE;
  1818. }
  1819. byCRC[0] = (BYTE)(wCRC >> 8);
  1820. byCRC[1] = (BYTE)wCRC;
  1821. lpSecureCommProtocolTail->wCRC = *(LPWORD)byCRC;
  1822. wSndBufflen = sizeof(SecureCommProtocolHead) + (usCommandLen - 3) + sizeof(SecureCommProtocolTail);
  1823. m_stCommInfo.cdSndData.lpvData = byBuffer;
  1824. m_stCommInfo.cdRcvData.lpvData = m_byRcvBuff;
  1825. m_stCommInfo.dwTimeout = 5000;
  1826. wLoop = wSndBufflen / sizeof(byBuffer);
  1827. if (wSndBufflen % sizeof(byBuffer) > 0)
  1828. {
  1829. wLoop++;
  1830. }
  1831. m_stCommInfo.cdSndData.dwDataLen = sizeof(byBuffer);
  1832. m_stCommInfo.cdRcvData.dwDataLen = sizeof(m_byRcvBuff);
  1833. for (wIdx = 0; wIdx < wLoop; wIdx++)
  1834. {
  1835. memset(byBuffer, 0x00, sizeof(byBuffer));
  1836. memcpy(byBuffer + 1, m_bySndBuff + wIdx * (sizeof(byBuffer) - 1), sizeof(byBuffer) - 1);
  1837. //dwLen = m_lpIDevComm->OnlyWriteToDevice(m_stCommInfo);
  1838. dwLen=m_lpIDevComm->ReceiveData(m_byRcvBuff,m_stCommInfo.dwTimeout);
  1839. if (dwLen == 0)
  1840. {
  1841. //m_traceManager.TraceInBuffer(TRM_SND, TRM_LV_ERROR, byBuffer + 1, sizeof(byBuffer) - 1,
  1842. //NULL/*, uMaskOffset, uMaskLen, uMaskCnt*/);
  1843. return FALSE;
  1844. }
  1845. ////m_traceManager.TraceInBuffer(TRM_SND, TRM_LV_COMMN, byBuffer + 1, sizeof(byBuffer) - 1,
  1846. // NULL/*, uMaskOffset, uMaskLen, uMaskCnt*/);
  1847. }
  1848. //m_traceManager.TraceInBuffer(TRM_SND, TRM_LV_COMMN, m_bySndBuff, wSndBufflen,
  1849. //NULL/*, uMaskOffset, uMaskLen, uMaskCnt*/);
  1850. if (byCommand == FINISH_MAIN_FW_UPDATE)
  1851. {
  1852. m_stCommInfo.cdRcvData.lpvData = byBuffer;
  1853. m_stCommInfo.cdRcvData.dwDataLen = sizeof(byBuffer);
  1854. while (usBlockNum-- > 0)
  1855. {
  1856. memset(byBuffer, 0x00, sizeof(byBuffer));
  1857. //m_traceManager.TraceInFormat(TRM_INT, TRM_LV_DEBUG, "Update %d", usBlockNum + 1);
  1858. //dwLen = m_lpIDevComm->StartReceive(m_stCommInfo);
  1859. dwLen=m_lpIDevComm->ReceiveData(m_bySndBuff,m_stCommInfo.dwTimeout);
  1860. if(dwLen == 0)
  1861. {
  1862. //m_traceManager.TraceIn(TRM_INT, TRM_LV_ERROR, "StartReceive Empty!");
  1863. return FALSE;
  1864. }
  1865. else
  1866. {
  1867. //m_traceManager.TraceInBuffer(TRM_RCV, TRM_LV_COMMN, byBuffer + 1, sizeof(byBuffer) - 1,
  1868. // NULL/*, uMaskOffset, uMaskLen, uMaskCnt*/);
  1869. }
  1870. }
  1871. }
  1872. m_stCommInfo.cdRcvData.lpvData = m_byRcvBuff;
  1873. m_stCommInfo.cdRcvData.dwDataLen = sizeof(m_byRcvBuff);
  1874. //dwLen = m_lpIDevComm->StartReceive(m_stCommInfo);
  1875. dwLen=m_lpIDevComm->ReceiveData(m_bySndBuff,m_stCommInfo.dwTimeout);
  1876. if(dwLen == 0)
  1877. {
  1878. //m_traceManager.TraceIn(TRM_INT, TRM_LV_ERROR, "StartReceive Empty!");
  1879. return FALSE;
  1880. }
  1881. //m_traceManager.TraceInBuffer(TRM_RCV, TRM_LV_COMMN, m_byRcvBuff + 1, 64,
  1882. //NULL/*, uMaskOffset, uMaskLen, uMaskCnt*/);
  1883. memcpy((LPBYTE)&wStatusCode + 1, m_byRcvBuff + 1 + sizeof(SecureCommProtocolHead), 1);
  1884. memcpy((LPBYTE)&wStatusCode, m_byRcvBuff + 1 + sizeof(SecureCommProtocolHead) + 1, 1);
  1885. CAlgorithm::CalcCRC(16, m_byRcvBuff + 1, sizeof(SecureCommProtocolHead) + 2 + 1, &wCRC);
  1886. byCRC[0] = (BYTE)(wCRC >> 8);
  1887. byCRC[1] = (BYTE)wCRC;
  1888. lpSecureCommProtocolTail = (LPSecureCommProtocolTail)(m_byRcvBuff + 1 + sizeof(SecureCommProtocolHead) + 2);
  1889. if (memcmp(byCRC, &lpSecureCommProtocolTail->wCRC, sizeof(wCRC)) != 0)
  1890. {
  1891. //m_traceManager.TraceIn(TRM_INT, TRM_LV_ERROR, "CRC Check Error!");
  1892. //return FALSE;
  1893. }
  1894. return TRUE;
  1895. }