des.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821
  1. /*---------------------------------------------------------------------------------------------*/
  2. /* (c) Copyright Tokheim, unpublished work, created 2008. */
  3. /* This computer program includes Confidential, Proprietary Information and is a Trade */
  4. /* Secret of Tokheim. */
  5. /* All use, disclosure, and / or reproduction is prohibited unless authorized in writing. */
  6. /* All Rights Reserved. */
  7. /*---------------------------------------------------------------------------------------------*/
  8. /*
  9. * $Header$
  10. *
  11. * File : tax_comm.c
  12. * Purpose : source file containing the Main Loop for communication with TAX CPU
  13. * Status :
  14. * $Revision$
  15. * $Change$
  16. * $Date$
  17. * $Author$
  18. *
  19. *
  20. * Record of changes :
  21. *
  22. * Version Date Author Comment
  23. * 00.01 2011.05.18 wu - initial file.
  24. * 00.02 2014.05.13 LaiXihong - modified to avoid warning for ubuntu environment
  25. *---------------------------------------------------------------------------------------------*/
  26. /*----------------------------------------------------------------------------------------*/
  27. /* SYSTEM INCLUDES */
  28. /*----------------------------------------------------------------------------------------*/
  29. #include <stdio.h>
  30. #include <stdlib.h>
  31. #include <string.h>
  32. #include <malloc.h>
  33. //#include <errno.h>
  34. //#include <time.h>
  35. //#include <sys/types.h>
  36. #include <sys/time.h>
  37. /*----------------------------------------------------------------------------------------*/
  38. /* PLATFORM INCLUDES */
  39. /*----------------------------------------------------------------------------------------*/
  40. #include <Pfm.h>
  41. /*----------------------------------------------------------------------------------------*/
  42. /* TQC INCLUDES */
  43. /*----------------------------------------------------------------------------------------*/
  44. #include <Tokheim.h>
  45. #include <TqcNames.h>
  46. #include <TqcMsgs.h>
  47. #include <Tgt.h>
  48. #include <TqcPrc.h>
  49. #include <Xml.h>
  50. /*-------------------------------------------------------------------------------------*/
  51. /* LOCAL INCLUDES */
  52. /*----------------------------------------------------------------------------------------*/
  53. #include <protocol.h> /* generic header */
  54. #include <prot_IFSF.h> /* public header */
  55. //#include <prot_sin_protocol.h>
  56. #include <prot_Sinopec_comm.h> /* local header */
  57. #include <prot_Sinopec_DB.h>
  58. //#include <prot_sin_DB.h>
  59. extern SAFETY_VALIDATE_DSCR g_UiValidate[MAX_DISPENSER_FIPS];
  60. #define Key16_LEN 16
  61. unsigned char Key16_Code[Key16_LEN] = {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F};
  62. ///////////////////////////////////////////////////////////////////////////////////////////
  63. //Initialize the tables
  64. //Table-s1
  65. unsigned char s1[4][16] =
  66. {
  67. {14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7},
  68. {0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8},
  69. {4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0},
  70. {15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13}
  71. } ;
  72. //Table-s2
  73. unsigned char s2[4][16] =
  74. {
  75. {15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10},
  76. {3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5},
  77. {0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15},
  78. {13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9}
  79. } ;
  80. //Table-s3
  81. unsigned char s3[4][16] =
  82. {
  83. {10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8},
  84. {13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1},
  85. {13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7},
  86. {1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12}
  87. } ;
  88. //Table-s4
  89. unsigned char s4[4][16] =
  90. {
  91. {7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15},
  92. {13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9},
  93. {10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4},
  94. {3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14}
  95. } ;
  96. //Table-s5
  97. unsigned char s5[4][16] =
  98. {
  99. {2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9},
  100. {14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6},
  101. {4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14},
  102. {11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3}
  103. } ;
  104. //Table-s6
  105. unsigned char s6[4][16] =
  106. {
  107. {12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11},
  108. {10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8},
  109. {9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6},
  110. {4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13}
  111. } ;
  112. //Table-s7
  113. unsigned char s7[4][16] =
  114. {
  115. {4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1},
  116. {13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6},
  117. {1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2},
  118. {6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12}
  119. } ;
  120. //Table-s8
  121. unsigned char s8[4][16] =
  122. {
  123. {13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7},
  124. {1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2},
  125. {7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8},
  126. {2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11}
  127. } ;
  128. //Table - Shift
  129. unsigned char ucShift[16] =
  130. {
  131. 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1
  132. } ;
  133. //Table - Binary
  134. unsigned char ucBinary[64] =
  135. {
  136. 0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,
  137. 0,1,0,0,0,1,0,1,0,1,1,0,0,1,1,1,
  138. 1,0,0,0,1,0,0,1,1,0,1,0,1,0,1,1,
  139. 1,1,0,0,1,1,0,1,1,1,1,0,1,1,1,1
  140. } ;
  141. void TripleDES(unsigned char *pszData,unsigned char *pszDesKey,unsigned char nFlag);
  142. void DES(unsigned char *pszData,unsigned char *pszDesKey,unsigned char nFlag);
  143. ///////////////////////////////////////////////////////////////////////////////////
  144. // Function :TripleDES
  145. //
  146. // Purpose : send the answer for realtime information
  147. //
  148. // Inputs : FipID: fip id
  149. //
  150. // Outputs : NONE
  151. // Returns : true: send command success.
  152. // false: send command failed.
  153. // Version Date Author Comment
  154. // 00.01 2011.05.12 wujianhong initial version
  155. //
  156. //////////////////////////////////////////////////////////////////////////////////////
  157. void TripleDES(unsigned char *pszData,unsigned char *pszDesKey,unsigned char nFlag)
  158. {
  159. unsigned char cnFlag;
  160. cnFlag= 1- nFlag;
  161. DES(pszData,pszDesKey,nFlag);
  162. DES(pszData,pszDesKey+8,cnFlag);
  163. DES(pszData,pszDesKey,nFlag);
  164. return;
  165. }
  166. ///////////////////////////////////////////////////////////////////////////////////
  167. // Function : DES
  168. //
  169. // Purpose : send the answer for realtime information
  170. //
  171. // Inputs : FipID: fip id
  172. //
  173. // Outputs : NONE
  174. // Returns : true: send command success.
  175. // false: send command failed.
  176. // Version Date Author Comment
  177. // 00.01 2011.05.12 wujianhong initial version
  178. //
  179. //////////////////////////////////////////////////////////////////////////////////////
  180. void DES(unsigned char *pszData,unsigned char *pszDesKey,unsigned char nFlag)
  181. {
  182. unsigned char pszBufOut[64],pszKeyWork[56],pszWork[48],pszKeyNo[48] ;
  183. unsigned char pszBuffer[64],pszKey[64];
  184. unsigned char nIndex,nItem,ucBrofunShift,nTemp1,nTemp2 ;
  185. unsigned char i,j,k ;
  186. //Main Process
  187. //convert from 64-bit key into 64-byte key
  188. for ( i=0;i<8;i++ )
  189. {
  190. pszKey[8*i] = ( ( j=*( pszDesKey+i ) ) / 128 ) % 2 ;
  191. pszKey[8*i+1] = ( j/64 ) % 2 ;
  192. pszKey[8*i+2] = ( j/32 ) % 2 ;
  193. pszKey[8*i+3] = ( j/16 ) % 2 ;
  194. pszKey[8*i+4] = ( j/8 ) % 2 ;
  195. pszKey[8*i+5] = ( j/4 ) % 2 ;
  196. pszKey[8*i+6] = ( j/2 ) % 2 ;
  197. pszKey[8*i+7] = j % 2 ;
  198. }
  199. //Convert from 64-bit data into 64-byte data
  200. for ( i=0;i<8;i++ )
  201. {
  202. pszBuffer[8*i] = ( ( j=*( pszData+i) ) / 128 ) % 2 ;
  203. pszBuffer[8*i+1] = ( j/64 ) % 2 ;
  204. pszBuffer[8*i+2] = ( j/32 ) % 2 ;
  205. pszBuffer[8*i+3] = ( j/16 ) % 2 ;
  206. pszBuffer[8*i+4] = ( j/8 ) % 2 ;
  207. pszBuffer[8*i+5] = ( j/4 ) % 2 ;
  208. pszBuffer[8*i+6] = ( j/2 ) % 2 ;
  209. pszBuffer[8*i+7] = j % 2 ;
  210. }
  211. //Initial Permutation of Data
  212. pszBufOut[0] = pszBuffer[57] ;
  213. pszBufOut[1] = pszBuffer[49] ;
  214. pszBufOut[2] = pszBuffer[41] ;
  215. pszBufOut[3] = pszBuffer[33] ;
  216. pszBufOut[4] = pszBuffer[25] ;
  217. pszBufOut[5] = pszBuffer[17] ;
  218. pszBufOut[6] = pszBuffer[9] ;
  219. pszBufOut[7] = pszBuffer[1] ;
  220. pszBufOut[8] = pszBuffer[59] ;
  221. pszBufOut[9] = pszBuffer[51] ;
  222. pszBufOut[10] = pszBuffer[43] ;
  223. pszBufOut[11] = pszBuffer[35] ;
  224. pszBufOut[12] = pszBuffer[27] ;
  225. pszBufOut[13] = pszBuffer[19] ;
  226. pszBufOut[14] = pszBuffer[11] ;
  227. pszBufOut[15] = pszBuffer[3] ;
  228. pszBufOut[16] = pszBuffer[61] ;
  229. pszBufOut[17] = pszBuffer[53] ;
  230. pszBufOut[18] = pszBuffer[45] ;
  231. pszBufOut[19] = pszBuffer[37] ;
  232. pszBufOut[20] = pszBuffer[29] ;
  233. pszBufOut[21] = pszBuffer[21] ;
  234. pszBufOut[22] = pszBuffer[13] ;
  235. pszBufOut[23] = pszBuffer[5] ;
  236. pszBufOut[24] = pszBuffer[63] ;
  237. pszBufOut[25] = pszBuffer[55] ;
  238. pszBufOut[26] = pszBuffer[47] ;
  239. pszBufOut[27] = pszBuffer[39] ;
  240. pszBufOut[28] = pszBuffer[31] ;
  241. pszBufOut[29] = pszBuffer[23] ;
  242. pszBufOut[30] = pszBuffer[15] ;
  243. pszBufOut[31] = pszBuffer[7] ;
  244. pszBufOut[32] = pszBuffer[56] ;
  245. pszBufOut[33] = pszBuffer[48] ;
  246. pszBufOut[34] = pszBuffer[40] ;
  247. pszBufOut[35] = pszBuffer[32] ;
  248. pszBufOut[36] = pszBuffer[24] ;
  249. pszBufOut[37] = pszBuffer[16] ;
  250. pszBufOut[38] = pszBuffer[8] ;
  251. pszBufOut[39] = pszBuffer[0] ;
  252. pszBufOut[40] = pszBuffer[58] ;
  253. pszBufOut[41] = pszBuffer[50] ;
  254. pszBufOut[42] = pszBuffer[42] ;
  255. pszBufOut[43] = pszBuffer[34] ;
  256. pszBufOut[44] = pszBuffer[26] ;
  257. pszBufOut[45] = pszBuffer[18] ;
  258. pszBufOut[46] = pszBuffer[10] ;
  259. pszBufOut[47] = pszBuffer[2] ;
  260. pszBufOut[48] = pszBuffer[60] ;
  261. pszBufOut[49] = pszBuffer[52] ;
  262. pszBufOut[50] = pszBuffer[44] ;
  263. pszBufOut[51] = pszBuffer[36] ;
  264. pszBufOut[52] = pszBuffer[28] ;
  265. pszBufOut[53] = pszBuffer[20] ;
  266. pszBufOut[54] = pszBuffer[12] ;
  267. pszBufOut[55] = pszBuffer[4] ;
  268. pszBufOut[56] = pszBuffer[62] ;
  269. pszBufOut[57] = pszBuffer[54] ;
  270. pszBufOut[58] = pszBuffer[46] ;
  271. pszBufOut[59] = pszBuffer[38] ;
  272. pszBufOut[60] = pszBuffer[30] ;
  273. pszBufOut[61] = pszBuffer[22] ;
  274. pszBufOut[62] = pszBuffer[14] ;
  275. pszBufOut[63] = pszBuffer[6] ;
  276. //Initial Permutation of key
  277. pszKeyWork[0] = pszKey[56] ;
  278. pszKeyWork[1] = pszKey[48] ;
  279. pszKeyWork[2] = pszKey[40] ;
  280. pszKeyWork[3] = pszKey[32] ;
  281. pszKeyWork[4] = pszKey[24] ;
  282. pszKeyWork[5] = pszKey[16] ;
  283. pszKeyWork[6] = pszKey[8] ;
  284. pszKeyWork[7] = pszKey[0] ;
  285. pszKeyWork[8] = pszKey[57] ;
  286. pszKeyWork[9] = pszKey[49] ;
  287. pszKeyWork[10] = pszKey[41] ;
  288. pszKeyWork[11] = pszKey[33] ;
  289. pszKeyWork[12] = pszKey[25] ;
  290. pszKeyWork[13] = pszKey[17] ;
  291. pszKeyWork[14] = pszKey[9] ;
  292. pszKeyWork[15] = pszKey[1] ;
  293. pszKeyWork[16] = pszKey[58] ;
  294. pszKeyWork[17] = pszKey[50] ;
  295. pszKeyWork[18] = pszKey[42] ;
  296. pszKeyWork[19] = pszKey[34] ;
  297. pszKeyWork[20] = pszKey[26] ;
  298. pszKeyWork[21] = pszKey[18] ;
  299. pszKeyWork[22] = pszKey[10] ;
  300. pszKeyWork[23] = pszKey[2] ;
  301. pszKeyWork[24] = pszKey[59] ;
  302. pszKeyWork[25] = pszKey[51] ;
  303. pszKeyWork[26] = pszKey[43] ;
  304. pszKeyWork[27] = pszKey[35] ;
  305. pszKeyWork[28] = pszKey[62] ;
  306. pszKeyWork[29] = pszKey[54] ;
  307. pszKeyWork[30] = pszKey[46] ;
  308. pszKeyWork[31] = pszKey[38] ;
  309. pszKeyWork[32] = pszKey[30] ;
  310. pszKeyWork[33] = pszKey[22] ;
  311. pszKeyWork[34] = pszKey[14] ;
  312. pszKeyWork[35] = pszKey[6] ;
  313. pszKeyWork[36] = pszKey[61] ;
  314. pszKeyWork[37] = pszKey[53] ;
  315. pszKeyWork[38] = pszKey[45] ;
  316. pszKeyWork[39] = pszKey[37] ;
  317. pszKeyWork[40] = pszKey[29] ;
  318. pszKeyWork[41] = pszKey[21] ;
  319. pszKeyWork[42] = pszKey[13] ;
  320. pszKeyWork[43] = pszKey[5] ;
  321. pszKeyWork[44] = pszKey[60] ;
  322. pszKeyWork[45] = pszKey[52] ;
  323. pszKeyWork[46] = pszKey[44] ;
  324. pszKeyWork[47] = pszKey[36] ;
  325. pszKeyWork[48] = pszKey[28] ;
  326. pszKeyWork[49] = pszKey[20] ;
  327. pszKeyWork[50] = pszKey[12] ;
  328. pszKeyWork[51] = pszKey[4] ;
  329. pszKeyWork[52] = pszKey[27] ;
  330. pszKeyWork[53] = pszKey[19] ;
  331. pszKeyWork[54] = pszKey[11] ;
  332. pszKeyWork[55] = pszKey[3] ;
  333. //16 nItemations
  334. for ( nItem=1;nItem<17;nItem++ )
  335. {
  336. for ( i=0;i<32;i++ )
  337. {
  338. pszBuffer[i] = pszBufOut[32+i] ;
  339. }
  340. //Calculation of F(R,K)
  341. //Permute - E
  342. pszWork[0] = pszBuffer[31] ;
  343. pszWork[1] = pszBuffer[0] ;
  344. pszWork[2] = pszBuffer[1] ;
  345. pszWork[3] = pszBuffer[2] ;
  346. pszWork[4] = pszBuffer[3] ;
  347. pszWork[5] = pszBuffer[4] ;
  348. pszWork[6] = pszBuffer[3] ;
  349. pszWork[7] = pszBuffer[4] ;
  350. pszWork[8] = pszBuffer[5] ;
  351. pszWork[9] = pszBuffer[6] ;
  352. pszWork[10] = pszBuffer[7] ;
  353. pszWork[11] = pszBuffer[8] ;
  354. pszWork[12] = pszBuffer[7] ;
  355. pszWork[13] = pszBuffer[8] ;
  356. pszWork[14] = pszBuffer[9] ;
  357. pszWork[15] = pszBuffer[10] ;
  358. pszWork[16] = pszBuffer[11] ;
  359. pszWork[17] = pszBuffer[12] ;
  360. pszWork[18] = pszBuffer[11] ;
  361. pszWork[19] = pszBuffer[12] ;
  362. pszWork[20] = pszBuffer[13] ;
  363. pszWork[21] = pszBuffer[14] ;
  364. pszWork[22] = pszBuffer[15] ;
  365. pszWork[23] = pszBuffer[16] ;
  366. pszWork[24] = pszBuffer[15] ;
  367. pszWork[25] = pszBuffer[16] ;
  368. pszWork[26] = pszBuffer[17] ;
  369. pszWork[27] = pszBuffer[18] ;
  370. pszWork[28] = pszBuffer[19] ;
  371. pszWork[29] = pszBuffer[20] ;
  372. pszWork[30] = pszBuffer[19] ;
  373. pszWork[31] = pszBuffer[20] ;
  374. pszWork[32] = pszBuffer[21] ;
  375. pszWork[33] = pszBuffer[22] ;
  376. pszWork[34] = pszBuffer[23] ;
  377. pszWork[35] = pszBuffer[24] ;
  378. pszWork[36] = pszBuffer[23] ;
  379. pszWork[37] = pszBuffer[24] ;
  380. pszWork[38] = pszBuffer[25] ;
  381. pszWork[39] = pszBuffer[26] ;
  382. pszWork[40] = pszBuffer[27] ;
  383. pszWork[41] = pszBuffer[28] ;
  384. pszWork[42] = pszBuffer[27] ;
  385. pszWork[43] = pszBuffer[28] ;
  386. pszWork[44] = pszBuffer[29] ;
  387. pszWork[45] = pszBuffer[30] ;
  388. pszWork[46] = pszBuffer[31] ;
  389. pszWork[47] = pszBuffer[0] ;
  390. //K S Function Begin
  391. if (nFlag)
  392. {//Encrypt The Data
  393. ucBrofunShift = ucShift[nItem-1] ;
  394. for (i=0;i<(int)ucBrofunShift;i++ )
  395. {
  396. nTemp1 = pszKeyWork[0] ;
  397. nTemp2 = pszKeyWork[28] ;
  398. for (j=0;j<27;j++)
  399. {
  400. pszKeyWork[j] = pszKeyWork[j+1] ;
  401. pszKeyWork[j+28] = pszKeyWork[j+29] ;
  402. }
  403. pszKeyWork[27] = nTemp1 ;
  404. pszKeyWork[55] = nTemp2 ;
  405. }
  406. }
  407. else
  408. {//Decrypt The Data
  409. if (nItem>1)
  410. {
  411. ucBrofunShift = ucShift[17-nItem] ;
  412. for (i=0;i<(int)ucBrofunShift;i++)
  413. {
  414. nTemp1 = pszKeyWork[27] ;
  415. nTemp2 = pszKeyWork[55] ;
  416. for (j=27;j>0;j--)
  417. {
  418. pszKeyWork[j] = pszKeyWork[j-1] ;
  419. pszKeyWork[j+28] = pszKeyWork[j+27] ;
  420. }
  421. pszKeyWork[0] = nTemp1 ;
  422. pszKeyWork[28] = nTemp2 ;
  423. }
  424. }
  425. }
  426. //Permute kwork - PC2
  427. pszKeyNo[0] = pszKeyWork[13] ;
  428. pszKeyNo[1] = pszKeyWork[16] ;
  429. pszKeyNo[2] = pszKeyWork[10] ;
  430. pszKeyNo[3] = pszKeyWork[23] ;
  431. pszKeyNo[4] = pszKeyWork[0] ;
  432. pszKeyNo[5] = pszKeyWork[4] ;
  433. pszKeyNo[6] = pszKeyWork[2] ;
  434. pszKeyNo[7] = pszKeyWork[27] ;
  435. pszKeyNo[8] = pszKeyWork[14] ;
  436. pszKeyNo[9] = pszKeyWork[5] ;
  437. pszKeyNo[10] = pszKeyWork[20] ;
  438. pszKeyNo[11] = pszKeyWork[9] ;
  439. pszKeyNo[12] = pszKeyWork[22] ;
  440. pszKeyNo[13] = pszKeyWork[18] ;
  441. pszKeyNo[14] = pszKeyWork[11] ;
  442. pszKeyNo[15] = pszKeyWork[3] ;
  443. pszKeyNo[16] = pszKeyWork[25] ;
  444. pszKeyNo[17] = pszKeyWork[7] ;
  445. pszKeyNo[18] = pszKeyWork[15] ;
  446. pszKeyNo[19] = pszKeyWork[6] ;
  447. pszKeyNo[20] = pszKeyWork[26] ;
  448. pszKeyNo[21] = pszKeyWork[19] ;
  449. pszKeyNo[22] = pszKeyWork[12] ;
  450. pszKeyNo[23] = pszKeyWork[1] ;
  451. pszKeyNo[24] = pszKeyWork[40] ;
  452. pszKeyNo[25] = pszKeyWork[51] ;
  453. pszKeyNo[26] = pszKeyWork[30] ;
  454. pszKeyNo[27] = pszKeyWork[36] ;
  455. pszKeyNo[28] = pszKeyWork[46] ;
  456. pszKeyNo[29] = pszKeyWork[54] ;
  457. pszKeyNo[30] = pszKeyWork[29] ;
  458. pszKeyNo[31] = pszKeyWork[39] ;
  459. pszKeyNo[32] = pszKeyWork[50] ;
  460. pszKeyNo[33] = pszKeyWork[44] ;
  461. pszKeyNo[34] = pszKeyWork[32] ;
  462. pszKeyNo[35] = pszKeyWork[47] ;
  463. pszKeyNo[36] = pszKeyWork[43] ;
  464. pszKeyNo[37] = pszKeyWork[48] ;
  465. pszKeyNo[38] = pszKeyWork[38] ;
  466. pszKeyNo[39] = pszKeyWork[55] ;
  467. pszKeyNo[40] = pszKeyWork[33] ;
  468. pszKeyNo[41] = pszKeyWork[52] ;
  469. pszKeyNo[42] = pszKeyWork[45] ;
  470. pszKeyNo[43] = pszKeyWork[41] ;
  471. pszKeyNo[44] = pszKeyWork[49] ;
  472. pszKeyNo[45] = pszKeyWork[35] ;
  473. pszKeyNo[46] = pszKeyWork[28] ;
  474. pszKeyNo[47] = pszKeyWork[31] ;
  475. //K S Functin End
  476. //pszWork XOR pszKeyNo
  477. for (i=0;i<48;i++)
  478. pszWork[i] = pszWork[i]^pszKeyNo[i] ;
  479. //8 s-functions
  480. nIndex = s1[2*pszWork[0]+pszWork[5]][2*(2*(2*pszWork[1]+pszWork[2])+pszWork[3])+pszWork[4]] ;
  481. nIndex = nIndex*4 ;
  482. pszKeyNo[0] = ucBinary[0+nIndex] ;
  483. pszKeyNo[1] = ucBinary[1+nIndex] ;
  484. pszKeyNo[2] = ucBinary[2+nIndex] ;
  485. pszKeyNo[3] = ucBinary[3+nIndex] ;
  486. nIndex = s2[2*pszWork[6]+pszWork[11]][2*(2*(2*pszWork[7]+pszWork[8])+pszWork[9])+pszWork[10]] ;
  487. nIndex = nIndex*4 ;
  488. pszKeyNo[4] = ucBinary[0+nIndex] ;
  489. pszKeyNo[5] = ucBinary[1+nIndex] ;
  490. pszKeyNo[6] = ucBinary[2+nIndex] ;
  491. pszKeyNo[7] = ucBinary[3+nIndex] ;
  492. nIndex = s3[2*pszWork[12]+pszWork[17]][2*(2*(2*pszWork[13]+pszWork[14])+pszWork[15])+pszWork[16]] ;
  493. nIndex = nIndex*4 ;
  494. pszKeyNo[8] = ucBinary[0+nIndex] ;
  495. pszKeyNo[9] = ucBinary[1+nIndex] ;
  496. pszKeyNo[10] = ucBinary[2+nIndex] ;
  497. pszKeyNo[11] = ucBinary[3+nIndex] ;
  498. nIndex = s4[2*pszWork[18]+pszWork[23]][2*(2*(2*pszWork[19]+pszWork[20])+pszWork[21])+pszWork[22]] ;
  499. nIndex = nIndex*4 ;
  500. pszKeyNo[12] = ucBinary[0+nIndex] ;
  501. pszKeyNo[13] = ucBinary[1+nIndex] ;
  502. pszKeyNo[14] = ucBinary[2+nIndex] ;
  503. pszKeyNo[15] = ucBinary[3+nIndex] ;
  504. nIndex = s5[2*pszWork[24]+pszWork[29]][2*(2*(2*pszWork[25]+pszWork[26])+pszWork[27])+pszWork[28]] ;
  505. nIndex = nIndex*4 ;
  506. pszKeyNo[16] = ucBinary[0+nIndex] ;
  507. pszKeyNo[17] = ucBinary[1+nIndex] ;
  508. pszKeyNo[18] = ucBinary[2+nIndex] ;
  509. pszKeyNo[19] = ucBinary[3+nIndex] ;
  510. nIndex = s6[2*pszWork[30]+pszWork[35]][2*(2*(2*pszWork[31]+pszWork[32])+pszWork[33])+pszWork[34]] ;
  511. nIndex = nIndex*4 ;
  512. pszKeyNo[20] = ucBinary[0+nIndex] ;
  513. pszKeyNo[21] = ucBinary[1+nIndex] ;
  514. pszKeyNo[22] = ucBinary[2+nIndex] ;
  515. pszKeyNo[23] = ucBinary[3+nIndex] ;
  516. nIndex = s7[2*pszWork[36]+pszWork[41]][2*(2*(2*pszWork[37]+pszWork[38])+pszWork[39])+pszWork[40]] ;
  517. nIndex = nIndex*4 ;
  518. pszKeyNo[24] = ucBinary[0+nIndex] ;
  519. pszKeyNo[25] = ucBinary[1+nIndex] ;
  520. pszKeyNo[26] = ucBinary[2+nIndex] ;
  521. pszKeyNo[27] = ucBinary[3+nIndex] ;
  522. nIndex = s8[2*pszWork[42]+pszWork[47]][2*(2*(2*pszWork[43]+pszWork[44])+pszWork[45])+pszWork[46]] ;
  523. nIndex = nIndex*4 ;
  524. pszKeyNo[28] = ucBinary[0+nIndex] ;
  525. pszKeyNo[29] = ucBinary[1+nIndex] ;
  526. pszKeyNo[30] = ucBinary[2+nIndex] ;
  527. pszKeyNo[31] = ucBinary[3+nIndex] ;
  528. //Permute - P
  529. pszWork[0] = pszKeyNo[15] ;
  530. pszWork[1] = pszKeyNo[6] ;
  531. pszWork[2] = pszKeyNo[19] ;
  532. pszWork[3] = pszKeyNo[20] ;
  533. pszWork[4] = pszKeyNo[28] ;
  534. pszWork[5] = pszKeyNo[11] ;
  535. pszWork[6] = pszKeyNo[27] ;
  536. pszWork[7] = pszKeyNo[16] ;
  537. pszWork[8] = pszKeyNo[0] ;
  538. pszWork[9] = pszKeyNo[14] ;
  539. pszWork[10] = pszKeyNo[22] ;
  540. pszWork[11] = pszKeyNo[25] ;
  541. pszWork[12] = pszKeyNo[4] ;
  542. pszWork[13] = pszKeyNo[17] ;
  543. pszWork[14] = pszKeyNo[30] ;
  544. pszWork[15] = pszKeyNo[9] ;
  545. pszWork[16] = pszKeyNo[1] ;
  546. pszWork[17] = pszKeyNo[7] ;
  547. pszWork[18] = pszKeyNo[23] ;
  548. pszWork[19] = pszKeyNo[13] ;
  549. pszWork[20] = pszKeyNo[31] ;
  550. pszWork[21] = pszKeyNo[26] ;
  551. pszWork[22] = pszKeyNo[2] ;
  552. pszWork[23] = pszKeyNo[8] ;
  553. pszWork[24] = pszKeyNo[18] ;
  554. pszWork[25] = pszKeyNo[12] ;
  555. pszWork[26] = pszKeyNo[29] ;
  556. pszWork[27] = pszKeyNo[5] ;
  557. pszWork[28] = pszKeyNo[21] ;
  558. pszWork[29] = pszKeyNo[10] ;
  559. pszWork[30] = pszKeyNo[3] ;
  560. pszWork[31] = pszKeyNo[24] ;
  561. //Buffer XOR pszWork
  562. for (i=0;i<32;i++)
  563. {
  564. pszBufOut[i+32] = pszBufOut[i]^pszWork[i] ;
  565. pszBufOut[i] = pszBuffer[i] ;
  566. }
  567. }//End of nItem
  568. //Prepare Output
  569. for (i=0;i<32;i++)
  570. {
  571. j = pszBufOut[i] ;
  572. pszBufOut[i] = pszBufOut[32+i] ;
  573. pszBufOut[32+i] = j ;
  574. }
  575. //Inverse Initial Permutation
  576. pszBuffer[0] = pszBufOut[39] ;
  577. pszBuffer[1] = pszBufOut[7] ;
  578. pszBuffer[2] = pszBufOut[47] ;
  579. pszBuffer[3] = pszBufOut[15] ;
  580. pszBuffer[4] = pszBufOut[55] ;
  581. pszBuffer[5] = pszBufOut[23] ;
  582. pszBuffer[6] = pszBufOut[63] ;
  583. pszBuffer[7] = pszBufOut[31] ;
  584. pszBuffer[8] = pszBufOut[38] ;
  585. pszBuffer[9] = pszBufOut[6] ;
  586. pszBuffer[10] = pszBufOut[46] ;
  587. pszBuffer[11] = pszBufOut[14] ;
  588. pszBuffer[12] = pszBufOut[54] ;
  589. pszBuffer[13] = pszBufOut[22] ;
  590. pszBuffer[14] = pszBufOut[62] ;
  591. pszBuffer[15] = pszBufOut[30] ;
  592. pszBuffer[16] = pszBufOut[37] ;
  593. pszBuffer[17] = pszBufOut[5] ;
  594. pszBuffer[18] = pszBufOut[45] ;
  595. pszBuffer[19] = pszBufOut[13] ;
  596. pszBuffer[20] = pszBufOut[53] ;
  597. pszBuffer[21] = pszBufOut[21] ;
  598. pszBuffer[22] = pszBufOut[61] ;
  599. pszBuffer[23] = pszBufOut[29] ;
  600. pszBuffer[24] = pszBufOut[36] ;
  601. pszBuffer[25] = pszBufOut[4] ;
  602. pszBuffer[26] = pszBufOut[44] ;
  603. pszBuffer[27] = pszBufOut[12] ;
  604. pszBuffer[28] = pszBufOut[52] ;
  605. pszBuffer[29] = pszBufOut[20] ;
  606. pszBuffer[30] = pszBufOut[60] ;
  607. pszBuffer[31] = pszBufOut[28] ;
  608. pszBuffer[32] = pszBufOut[35] ;
  609. pszBuffer[33] = pszBufOut[3] ;
  610. pszBuffer[34] = pszBufOut[43] ;
  611. pszBuffer[35] = pszBufOut[11] ;
  612. pszBuffer[36] = pszBufOut[51] ;
  613. pszBuffer[37] = pszBufOut[19] ;
  614. pszBuffer[38] = pszBufOut[59] ;
  615. pszBuffer[39] = pszBufOut[27] ;
  616. pszBuffer[40] = pszBufOut[34] ;
  617. pszBuffer[41] = pszBufOut[2] ;
  618. pszBuffer[42] = pszBufOut[42] ;
  619. pszBuffer[43] = pszBufOut[10] ;
  620. pszBuffer[44] = pszBufOut[50] ;
  621. pszBuffer[45] = pszBufOut[18] ;
  622. pszBuffer[46] = pszBufOut[58] ;
  623. pszBuffer[47] = pszBufOut[26] ;
  624. pszBuffer[48] = pszBufOut[33] ;
  625. pszBuffer[49] = pszBufOut[1] ;
  626. pszBuffer[50] = pszBufOut[41] ;
  627. pszBuffer[51] = pszBufOut[9] ;
  628. pszBuffer[52] = pszBufOut[49] ;
  629. pszBuffer[53] = pszBufOut[17] ;
  630. pszBuffer[54] = pszBufOut[57] ;
  631. pszBuffer[55] = pszBufOut[25] ;
  632. pszBuffer[56] = pszBufOut[32] ;
  633. pszBuffer[57] = pszBufOut[0] ;
  634. pszBuffer[58] = pszBufOut[40] ;
  635. pszBuffer[59] = pszBufOut[8] ;
  636. pszBuffer[60] = pszBufOut[48] ;
  637. pszBuffer[61] = pszBufOut[16] ;
  638. pszBuffer[62] = pszBufOut[56] ;
  639. pszBuffer[63] = pszBufOut[24] ;
  640. j=0 ;
  641. for (i=0;i<8;i++)
  642. {
  643. *(pszData+i) = 0x00 ;
  644. for (k=0;k<7;k++)
  645. *(pszData+i) = ((*(pszData+i))+pszBuffer[j+k])*2 ;
  646. *(pszData+i) = *(pszData+i)+pszBuffer[j+7] ;
  647. j+=8 ;
  648. }
  649. }
  650. ///////////////////////////////////////////////////////////////////////////////////
  651. // Function : DecryptDesData
  652. //
  653. // Purpose : send the answer for realtime information
  654. //
  655. // Inputs : FipID: fip id
  656. //
  657. // Outputs : NONE
  658. // Returns : true: send command success.
  659. // false: send command failed.
  660. // Version Date Author Comment
  661. // 00.01 2011.05.12 wujianhong initial version
  662. //
  663. //////////////////////////////////////////////////////////////////////////////////////
  664. void DecryptDesData(unsigned char flag, unsigned char *pdata, unsigned char *presult)
  665. {
  666. unsigned char src8[8];
  667. unsigned char key48[48];
  668. memcpy(src8,pdata,8);
  669. memcpy(key48,Key16_Code,Key16_LEN);
  670. TripleDES(src8,key48,flag);
  671. memcpy(presult,src8,8);
  672. }
  673. ///////////////////////////////////////////////////////////////////////////////////
  674. // Function : InitAntiFraud
  675. //
  676. // Purpose : send the answer for realtime information
  677. //
  678. // Inputs : FipID: fip id
  679. //
  680. // Outputs : NONE
  681. // Returns : true: send command success.
  682. // false: send command failed.
  683. // Version Date Author Comment
  684. // 00.01 2011.05.12 wujianhong initial version
  685. //
  686. //////////////////////////////////////////////////////////////////////////////////////
  687. int InitAntiFraud(BYTE fips)
  688. {
  689. char filename[256];
  690. unsigned char buffer[100];
  691. FILE *binfile = NULL;
  692. int imagesize = 0; // without module header
  693. int offset;
  694. memset(filename,0,sizeof(filename));
  695. sprintf(filename,"%s/%s",SELFSERVICE_DB_PATH,IDKEYBIN);
  696. if (tgt_access(filename, TGT_FILEACCESS_EXISTS) != TGT_CC_NO_ERROR)
  697. {
  698. printf("error:can not find the file[Idkey]!!!!!!!!!!!!!!!!");
  699. }
  700. else
  701. {
  702. // If there is a name specified, open the bin file
  703. binfile = fopen(filename, "rb");
  704. // Get file size
  705. fseek(binfile, 0, SEEK_END);
  706. imagesize = ftell(binfile);
  707. fseek(binfile, 0, SEEK_SET);
  708. //printf("binfile imagesize[%d] \n",imagesize);
  709. fread(buffer, imagesize, 1, binfile);
  710. for (int i=0;i< imagesize/8;i++)
  711. {
  712. DecryptDesData(0,&buffer[8*i],&buffer[8*i]);
  713. }
  714. offset=0;
  715. for (int i=0;i<fips;i++)
  716. {
  717. g_UiValidate[i].ui=0x64+i;
  718. memcpy(g_UiValidate[i].CalculateId,&buffer[offset],8);
  719. offset+=8;
  720. memcpy(g_UiValidate[i].Key,&buffer[offset],16);
  721. offset+=16;
  722. }
  723. // Do not forget to close the binfile
  724. fclose(binfile);
  725. }
  726. return 0;
  727. }
  728. ///////////////////////////////////////////////////////////////////////////////////
  729. // Function : DesData
  730. //
  731. // Purpose : send the answer for realtime information
  732. //
  733. // Inputs : FipID: fip id
  734. //
  735. // Outputs : NONE
  736. // Returns : true: send command success.
  737. // false: send command failed.
  738. // Version Date Author Comment
  739. // 00.01 2011.05.12 wujianhong initial version
  740. //
  741. //////////////////////////////////////////////////////////////////////////////////////
  742. void DesData(int fip, BYTE *pdata, BYTE *ptr_key,BYTE *presult)
  743. {
  744. unsigned char src8[8];
  745. unsigned char key48[48];
  746. unsigned char flag=1;
  747. memcpy(src8,pdata,8);
  748. memcpy(key48,ptr_key,16);
  749. TripleDES(src8,key48,flag);
  750. memcpy(presult,src8,8);
  751. }