sisspi_encrypt.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include "mergeImage.h"
  5. #ifndef DWORD
  6. #define DWORD unsigned int
  7. #endif
  8. #ifndef BYTE
  9. #define BYTE unsigned char
  10. #endif
  11. #ifndef bool
  12. #define bool unsigned int
  13. #endif
  14. #define FLASH_HW_KEY 0x08825252U
  15. #define FLASH_HW_KEY_0 ((FLASH_HW_KEY <<(32-11)) |(FLASH_HW_KEY>>11))
  16. #define FLASH_HW_KEY_1 ((FLASH_HW_KEY <<(32-20)) |(FLASH_HW_KEY>>20))
  17. #define FLASH_HW_KEY_2 ((FLASH_HW_KEY <<(32-26)) |(FLASH_HW_KEY>>26))
  18. #define FLASH_HW_KEY_3 ((FLASH_HW_KEY <<(32-7)) |(FLASH_HW_KEY>>7))
  19. DWORD cmN_BytesToDWORD(char* bytes)
  20. {
  21. int i;
  22. DWORD value;
  23. value = 0;
  24. char* tmpByte;
  25. //printf("cmN_BytesToDWORD %p\n", bytes);
  26. for(i=0;i<4;i++)
  27. {
  28. tmpByte = &bytes[i];
  29. if(tmpByte)
  30. {
  31. value |= (*tmpByte & 0xFF) <<(8*i);
  32. //printf("%x\t ", value);
  33. }
  34. }
  35. return value;
  36. }
  37. void cmN_DWORDToBytes(char* bytes, DWORD value)
  38. {
  39. int i;
  40. char* tmpbyte;
  41. for(i=0;i<4;i++)
  42. {
  43. tmpbyte = &bytes[i];
  44. *tmpbyte = (BYTE)(value >> (8*i)) & 0xFF;
  45. }
  46. }
  47. bool cmN_GetBitFromDword(DWORD data, BYTE i)
  48. {
  49. if( (data>>i)&1 )
  50. return 1;
  51. else
  52. return 0;
  53. }
  54. DWORD Mix_0(DWORD data)
  55. {
  56. return ( (cmN_GetBitFromDword(data, 22)<<31)
  57. | (cmN_GetBitFromDword(data, 8)<<30)
  58. | (cmN_GetBitFromDword(data, 7)<<29)
  59. | (cmN_GetBitFromDword(data, 21)<<28)
  60. | (cmN_GetBitFromDword(data, 0)<<27)
  61. | (cmN_GetBitFromDword(data, 25)<<26)
  62. | (cmN_GetBitFromDword(data, 20)<<25)
  63. | (cmN_GetBitFromDword(data, 6)<<24)
  64. | (cmN_GetBitFromDword(data, 19)<<23)
  65. | (cmN_GetBitFromDword(data, 16)<<22)
  66. | (cmN_GetBitFromDword(data, 24)<<21)
  67. | (cmN_GetBitFromDword(data, 5)<<20)
  68. | (cmN_GetBitFromDword(data, 23)<<19)
  69. | (cmN_GetBitFromDword(data, 1)<<18)
  70. | (cmN_GetBitFromDword(data, 18)<<17)
  71. | (cmN_GetBitFromDword(data, 15)<<16)
  72. | (cmN_GetBitFromDword(data, 26)<<15)
  73. | (cmN_GetBitFromDword(data, 3)<<14)
  74. | (cmN_GetBitFromDword(data, 17)<<13)
  75. | (cmN_GetBitFromDword(data, 14)<<12)
  76. | (cmN_GetBitFromDword(data, 4)<<11)
  77. | (cmN_GetBitFromDword(data, 13)<<10)
  78. | (cmN_GetBitFromDword(data, 2)<<9)
  79. | (cmN_GetBitFromDword(data, 30)<<8)
  80. | (cmN_GetBitFromDword(data, 12)<<7)
  81. | (cmN_GetBitFromDword(data, 29)<<6)
  82. | (cmN_GetBitFromDword(data, 28)<<5)
  83. | (cmN_GetBitFromDword(data, 11)<<4)
  84. | (cmN_GetBitFromDword(data, 9)<<3)
  85. | (cmN_GetBitFromDword(data, 31)<<2)
  86. | (cmN_GetBitFromDword(data, 27)<<1)
  87. | (cmN_GetBitFromDword(data, 10)<<0) );
  88. }
  89. DWORD Mix_1(DWORD data)
  90. {
  91. return ( (cmN_GetBitFromDword(data, 11)<<31)
  92. | (cmN_GetBitFromDword(data, 7)<<30)
  93. | (cmN_GetBitFromDword(data, 21)<<29)
  94. | (cmN_GetBitFromDword(data, 29)<<28)
  95. | (cmN_GetBitFromDword(data, 18)<<27)
  96. | (cmN_GetBitFromDword(data, 31)<<26)
  97. | (cmN_GetBitFromDword(data, 3)<<25)
  98. | (cmN_GetBitFromDword(data, 30)<<24)
  99. | (cmN_GetBitFromDword(data, 8)<<23)
  100. | (cmN_GetBitFromDword(data, 26)<<22)
  101. | (cmN_GetBitFromDword(data, 12)<<21)
  102. | (cmN_GetBitFromDword(data, 28)<<20)
  103. | (cmN_GetBitFromDword(data, 2)<<19)
  104. | (cmN_GetBitFromDword(data, 25)<<18)
  105. | (cmN_GetBitFromDword(data, 17)<<17)
  106. | (cmN_GetBitFromDword(data, 14)<<16)
  107. | (cmN_GetBitFromDword(data, 23)<<15)
  108. | (cmN_GetBitFromDword(data, 1)<<14)
  109. | (cmN_GetBitFromDword(data, 20)<<13)
  110. | (cmN_GetBitFromDword(data, 5)<<12)
  111. | (cmN_GetBitFromDword(data, 19)<<11)
  112. | (cmN_GetBitFromDword(data, 15)<<10)
  113. | (cmN_GetBitFromDword(data, 9)<<9)
  114. | (cmN_GetBitFromDword(data, 4)<<8)
  115. | (cmN_GetBitFromDword(data, 0)<<7)
  116. | (cmN_GetBitFromDword(data, 16)<<6)
  117. | (cmN_GetBitFromDword(data, 24)<<5)
  118. | (cmN_GetBitFromDword(data, 6)<<4)
  119. | (cmN_GetBitFromDword(data, 10)<<3)
  120. | (cmN_GetBitFromDword(data, 22)<<2)
  121. | (cmN_GetBitFromDword(data, 27)<<1)
  122. | (cmN_GetBitFromDword(data, 13)<<0) );
  123. }
  124. DWORD Mix_2(DWORD data)
  125. {
  126. return ( (cmN_GetBitFromDword(data, 13)<<31)
  127. | (cmN_GetBitFromDword(data, 23)<<30)
  128. | (cmN_GetBitFromDword(data, 9)<<29)
  129. | (cmN_GetBitFromDword(data, 20)<<28)
  130. | (cmN_GetBitFromDword(data, 3)<<27)
  131. | (cmN_GetBitFromDword(data, 25)<<26)
  132. | (cmN_GetBitFromDword(data, 14)<<25)
  133. | (cmN_GetBitFromDword(data, 24)<<24)
  134. | (cmN_GetBitFromDword(data, 2)<<23)
  135. | (cmN_GetBitFromDword(data, 11)<<22)
  136. | (cmN_GetBitFromDword(data, 30)<<21)
  137. | (cmN_GetBitFromDword(data, 16)<<20)
  138. | (cmN_GetBitFromDword(data, 6)<<19)
  139. | (cmN_GetBitFromDword(data, 19)<<18)
  140. | (cmN_GetBitFromDword(data, 1)<<17)
  141. | (cmN_GetBitFromDword(data, 5)<<16)
  142. | (cmN_GetBitFromDword(data, 0)<<15)
  143. | (cmN_GetBitFromDword(data, 22)<<14)
  144. | (cmN_GetBitFromDword(data, 12)<<13)
  145. | (cmN_GetBitFromDword(data, 26)<<12)
  146. | (cmN_GetBitFromDword(data, 8)<<11)
  147. | (cmN_GetBitFromDword(data, 21)<<10)
  148. | (cmN_GetBitFromDword(data, 10)<<9)
  149. | (cmN_GetBitFromDword(data, 17)<<8)
  150. | (cmN_GetBitFromDword(data, 28)<<7)
  151. | (cmN_GetBitFromDword(data, 4)<<6)
  152. | (cmN_GetBitFromDword(data, 29)<<5)
  153. | (cmN_GetBitFromDword(data, 15)<<4)
  154. | (cmN_GetBitFromDword(data, 31)<<3)
  155. | (cmN_GetBitFromDword(data, 18)<<2)
  156. | (cmN_GetBitFromDword(data, 7)<<1)
  157. | (cmN_GetBitFromDword(data, 27)<<0) );
  158. }
  159. DWORD Mix_3(DWORD data)
  160. {
  161. return ( (cmN_GetBitFromDword(data, 20)<<31)
  162. | (cmN_GetBitFromDword(data, 11)<<30)
  163. | (cmN_GetBitFromDword(data, 31)<<29)
  164. | (cmN_GetBitFromDword(data, 25)<<28)
  165. | (cmN_GetBitFromDword(data, 10)<<27)
  166. | (cmN_GetBitFromDword(data, 17)<<26)
  167. | (cmN_GetBitFromDword(data, 29)<<25)
  168. | (cmN_GetBitFromDword(data, 7)<<24)
  169. | (cmN_GetBitFromDword(data, 13)<<23)
  170. | (cmN_GetBitFromDword(data, 27)<<22)
  171. | (cmN_GetBitFromDword(data, 2)<<21)
  172. | (cmN_GetBitFromDword(data, 22)<<20)
  173. | (cmN_GetBitFromDword(data, 26)<<19)
  174. | (cmN_GetBitFromDword(data, 16)<<18)
  175. | (cmN_GetBitFromDword(data, 6)<<17)
  176. | (cmN_GetBitFromDword(data, 30)<<16)
  177. | (cmN_GetBitFromDword(data, 14)<<15)
  178. | (cmN_GetBitFromDword(data, 24)<<14)
  179. | (cmN_GetBitFromDword(data, 4)<<13)
  180. | (cmN_GetBitFromDword(data, 19)<<12)
  181. | (cmN_GetBitFromDword(data, 0)<<11)
  182. | (cmN_GetBitFromDword(data, 8)<<10)
  183. | (cmN_GetBitFromDword(data, 18)<<9)
  184. | (cmN_GetBitFromDword(data, 1)<<8)
  185. | (cmN_GetBitFromDword(data, 21)<<7)
  186. | (cmN_GetBitFromDword(data, 15)<<6)
  187. | (cmN_GetBitFromDword(data, 3)<<5)
  188. | (cmN_GetBitFromDword(data, 5)<<4)
  189. | (cmN_GetBitFromDword(data, 23)<<3)
  190. | (cmN_GetBitFromDword(data, 9)<<2)
  191. | (cmN_GetBitFromDword(data, 28)<<1)
  192. | (cmN_GetBitFromDword(data, 12)<<0) );
  193. }
  194. DWORD unMix_0(DWORD data)
  195. {
  196. return ( (cmN_GetBitFromDword(data, 2)<<31)
  197. | (cmN_GetBitFromDword(data, 8)<<30)
  198. | (cmN_GetBitFromDword(data, 6)<<29)
  199. | (cmN_GetBitFromDword(data, 5)<<28)
  200. | (cmN_GetBitFromDword(data, 1)<<27)
  201. | (cmN_GetBitFromDword(data, 15)<<26)
  202. | (cmN_GetBitFromDword(data, 26)<<25)
  203. | (cmN_GetBitFromDword(data, 21)<<24)
  204. | (cmN_GetBitFromDword(data, 19)<<23)
  205. | (cmN_GetBitFromDword(data, 31)<<22)
  206. | (cmN_GetBitFromDword(data, 28)<<21)
  207. | (cmN_GetBitFromDword(data, 25)<<20)
  208. | (cmN_GetBitFromDword(data, 23)<<19)
  209. | (cmN_GetBitFromDword(data, 17)<<18)
  210. | (cmN_GetBitFromDword(data, 13)<<17)
  211. | (cmN_GetBitFromDword(data, 22)<<16)
  212. | (cmN_GetBitFromDword(data, 16)<<15)
  213. | (cmN_GetBitFromDword(data, 12)<<14)
  214. | (cmN_GetBitFromDword(data, 10)<<13)
  215. | (cmN_GetBitFromDword(data, 7)<<12)
  216. | (cmN_GetBitFromDword(data, 4)<<11)
  217. | (cmN_GetBitFromDword(data, 0)<<10)
  218. | (cmN_GetBitFromDword(data, 3)<<9)
  219. | (cmN_GetBitFromDword(data, 30)<<8)
  220. | (cmN_GetBitFromDword(data, 29)<<7)
  221. | (cmN_GetBitFromDword(data, 24)<<6)
  222. | (cmN_GetBitFromDword(data, 20)<<5)
  223. | (cmN_GetBitFromDword(data, 11)<<4)
  224. | (cmN_GetBitFromDword(data, 14)<<3)
  225. | (cmN_GetBitFromDword(data, 9)<<2)
  226. | (cmN_GetBitFromDword(data, 18)<<1)
  227. | (cmN_GetBitFromDword(data, 27)<<0) );
  228. }
  229. DWORD unMix_1(DWORD data)
  230. {
  231. return ( (cmN_GetBitFromDword(data, 26)<<31)
  232. | (cmN_GetBitFromDword(data, 24)<<30)
  233. | (cmN_GetBitFromDword(data, 28)<<29)
  234. | (cmN_GetBitFromDword(data, 20)<<28)
  235. | (cmN_GetBitFromDword(data, 1)<<27)
  236. | (cmN_GetBitFromDword(data, 22)<<26)
  237. | (cmN_GetBitFromDword(data, 18)<<25)
  238. | (cmN_GetBitFromDword(data, 5)<<24)
  239. | (cmN_GetBitFromDword(data, 15)<<23)
  240. | (cmN_GetBitFromDword(data, 2)<<22)
  241. | (cmN_GetBitFromDword(data, 29)<<21)
  242. | (cmN_GetBitFromDword(data, 13)<<20)
  243. | (cmN_GetBitFromDword(data, 11)<<19)
  244. | (cmN_GetBitFromDword(data, 27)<<18)
  245. | (cmN_GetBitFromDword(data, 17)<<17)
  246. | (cmN_GetBitFromDword(data, 6)<<16)
  247. | (cmN_GetBitFromDword(data, 10)<<15)
  248. | (cmN_GetBitFromDword(data, 16)<<14)
  249. | (cmN_GetBitFromDword(data, 0)<<13)
  250. | (cmN_GetBitFromDword(data, 21)<<12)
  251. | (cmN_GetBitFromDword(data, 31)<<11)
  252. | (cmN_GetBitFromDword(data, 3)<<10)
  253. | (cmN_GetBitFromDword(data, 9)<<9)
  254. | (cmN_GetBitFromDword(data, 23)<<8)
  255. | (cmN_GetBitFromDword(data, 30)<<7)
  256. | (cmN_GetBitFromDword(data, 4)<<6)
  257. | (cmN_GetBitFromDword(data, 12)<<5)
  258. | (cmN_GetBitFromDword(data, 8)<<4)
  259. | (cmN_GetBitFromDword(data, 25)<<3)
  260. | (cmN_GetBitFromDword(data, 19)<<2)
  261. | (cmN_GetBitFromDword(data, 14)<<1)
  262. | (cmN_GetBitFromDword(data, 7)<<0) );
  263. }
  264. DWORD unMix_2(DWORD data)
  265. {
  266. return ( (cmN_GetBitFromDword(data, 3)<<31)
  267. | (cmN_GetBitFromDword(data, 21)<<30)
  268. | (cmN_GetBitFromDword(data, 5)<<29)
  269. | (cmN_GetBitFromDword(data, 7)<<28)
  270. | (cmN_GetBitFromDword(data, 0)<<27)
  271. | (cmN_GetBitFromDword(data, 12)<<26)
  272. | (cmN_GetBitFromDword(data, 26)<<25)
  273. | (cmN_GetBitFromDword(data, 24)<<24)
  274. | (cmN_GetBitFromDword(data, 30)<<23)
  275. | (cmN_GetBitFromDword(data, 14)<<22)
  276. | (cmN_GetBitFromDword(data, 10)<<21)
  277. | (cmN_GetBitFromDword(data, 28)<<20)
  278. | (cmN_GetBitFromDword(data, 18)<<19)
  279. | (cmN_GetBitFromDword(data, 2)<<18)
  280. | (cmN_GetBitFromDword(data, 8)<<17)
  281. | (cmN_GetBitFromDword(data, 20)<<16)
  282. | (cmN_GetBitFromDword(data, 4)<<15)
  283. | (cmN_GetBitFromDword(data, 25)<<14)
  284. | (cmN_GetBitFromDword(data, 31)<<13)
  285. | (cmN_GetBitFromDword(data, 13)<<12)
  286. | (cmN_GetBitFromDword(data, 22)<<11)
  287. | (cmN_GetBitFromDword(data, 9)<<10)
  288. | (cmN_GetBitFromDword(data, 29)<<9)
  289. | (cmN_GetBitFromDword(data, 11)<<8)
  290. | (cmN_GetBitFromDword(data, 1)<<7)
  291. | (cmN_GetBitFromDword(data, 19)<<6)
  292. | (cmN_GetBitFromDword(data, 16)<<5)
  293. | (cmN_GetBitFromDword(data, 6)<<4)
  294. | (cmN_GetBitFromDword(data, 27)<<3)
  295. | (cmN_GetBitFromDword(data, 23)<<2)
  296. | (cmN_GetBitFromDword(data, 17)<<1)
  297. | (cmN_GetBitFromDword(data, 15)<<0) );
  298. }
  299. DWORD unMix_3(DWORD data)
  300. {
  301. return ( (cmN_GetBitFromDword(data, 29)<<31)
  302. | (cmN_GetBitFromDword(data, 16)<<30)
  303. | (cmN_GetBitFromDword(data, 25)<<29)
  304. | (cmN_GetBitFromDword(data, 1)<<28)
  305. | (cmN_GetBitFromDword(data, 22)<<27)
  306. | (cmN_GetBitFromDword(data, 19)<<26)
  307. | (cmN_GetBitFromDword(data, 28)<<25)
  308. | (cmN_GetBitFromDword(data, 14)<<24)
  309. | (cmN_GetBitFromDword(data, 3)<<23)
  310. | (cmN_GetBitFromDword(data, 20)<<22)
  311. | (cmN_GetBitFromDword(data, 7)<<21)
  312. | (cmN_GetBitFromDword(data, 31)<<20)
  313. | (cmN_GetBitFromDword(data, 12)<<19)
  314. | (cmN_GetBitFromDword(data, 9)<<18)
  315. | (cmN_GetBitFromDword(data, 26)<<17)
  316. | (cmN_GetBitFromDword(data, 18)<<16)
  317. | (cmN_GetBitFromDword(data, 6)<<15)
  318. | (cmN_GetBitFromDword(data, 15)<<14)
  319. | (cmN_GetBitFromDword(data, 23)<<13)
  320. | (cmN_GetBitFromDword(data, 0)<<12)
  321. | (cmN_GetBitFromDword(data, 30)<<11)
  322. | (cmN_GetBitFromDword(data, 27)<<10)
  323. | (cmN_GetBitFromDword(data, 2)<<9)
  324. | (cmN_GetBitFromDword(data, 10)<<8)
  325. | (cmN_GetBitFromDword(data, 24)<<7)
  326. | (cmN_GetBitFromDword(data, 17)<<6)
  327. | (cmN_GetBitFromDword(data, 4)<<5)
  328. | (cmN_GetBitFromDword(data, 13)<<4)
  329. | (cmN_GetBitFromDword(data, 5)<<3)
  330. | (cmN_GetBitFromDword(data, 21)<<2)
  331. | (cmN_GetBitFromDword(data, 8)<<1)
  332. | (cmN_GetBitFromDword(data, 11)<<0) );
  333. }
  334. //example 1M code flash address
  335. // => cmN_hwEncodeRawDataForFlash(pData, 0x100000, 0xbc000000);
  336. void hwEncodeRawDataForFlash(char * pChar, DWORD length, DWORD ref_address)
  337. {
  338. DWORD tmplength=0;
  339. DWORD in_data, data_add, pre_xor_data, out_data;
  340. BYTE type;
  341. //to handle for each DWORD
  342. while( tmplength < length)
  343. {
  344. //printf("tmplength %d\n", tmplength);
  345. in_data = cmN_BytesToDWORD(pChar);
  346. data_add = in_data + FLASH_HW_KEY;
  347. type = (BYTE)(ref_address>>2) & 0x03;
  348. if(type==0)
  349. {
  350. pre_xor_data = Mix_0(data_add);
  351. out_data = pre_xor_data^FLASH_HW_KEY_0;
  352. cmN_DWORDToBytes(pChar, out_data);
  353. }
  354. else if(type==1)
  355. {
  356. pre_xor_data = Mix_1(data_add);
  357. out_data = pre_xor_data^FLASH_HW_KEY_1;
  358. cmN_DWORDToBytes(pChar, out_data);
  359. }
  360. else if(type==2)
  361. {
  362. pre_xor_data = Mix_2(data_add);
  363. out_data = pre_xor_data^FLASH_HW_KEY_2;
  364. cmN_DWORDToBytes(pChar, out_data);
  365. }
  366. else if(type==3)
  367. {
  368. pre_xor_data = Mix_3(data_add);
  369. out_data = pre_xor_data^FLASH_HW_KEY_3;
  370. cmN_DWORDToBytes(pChar, out_data);
  371. }
  372. ref_address += 4;
  373. pChar += 4;
  374. tmplength += 4;
  375. }
  376. //pChar -= tmplength;
  377. }
  378. void hwDecodeRawDataForFlash(char * pChar, DWORD length, DWORD ref_address)
  379. {
  380. DWORD tmplength=0;
  381. DWORD in_data, pre_xor_data, out_data;
  382. BYTE type;
  383. //to handle for each DWORD
  384. while( tmplength < length)
  385. {
  386. //printf("tmplength %d\n", tmplength);
  387. in_data = cmN_BytesToDWORD(pChar);
  388. type = (BYTE)(ref_address>>2) & 0x03;
  389. if(type==0)
  390. {
  391. in_data = in_data^FLASH_HW_KEY_0;
  392. pre_xor_data = unMix_0(in_data);
  393. out_data = pre_xor_data - FLASH_HW_KEY;
  394. cmN_DWORDToBytes(pChar, out_data);
  395. }
  396. else if(type==1)
  397. {
  398. in_data = in_data^FLASH_HW_KEY_1;
  399. pre_xor_data = unMix_1(in_data);
  400. out_data = pre_xor_data - FLASH_HW_KEY;
  401. cmN_DWORDToBytes(pChar, out_data);
  402. }
  403. else if(type==2)
  404. {
  405. in_data = in_data^FLASH_HW_KEY_2;
  406. pre_xor_data = unMix_2(in_data);
  407. out_data = pre_xor_data - FLASH_HW_KEY;
  408. cmN_DWORDToBytes(pChar, out_data);
  409. }
  410. else if(type==3)
  411. {
  412. in_data = in_data^FLASH_HW_KEY_3;
  413. pre_xor_data = unMix_3(in_data);
  414. out_data = pre_xor_data - FLASH_HW_KEY;
  415. cmN_DWORDToBytes(pChar, out_data);
  416. }
  417. ref_address += 4;
  418. pChar += 4;
  419. tmplength += 4;
  420. }
  421. pChar -= tmplength;
  422. }
  423. #define BUF_SIZE 128
  424. int sisspi_encrypt( const char *inFile, const char *outFile, int encryptMode )
  425. {
  426. char buf[BUF_SIZE];
  427. int mode = encryptMode;
  428. FILE *filein = fopen( inFile, "rb" );
  429. if(filein == NULL) {
  430. printf("open %s fail\n", inFile );
  431. return 1;
  432. }
  433. FILE *fileout=fopen( outFile, "wb" );
  434. if(fileout == NULL) {
  435. printf("open %s fail\n", outFile );
  436. fclose(filein);
  437. return 1;
  438. }
  439. while(1){
  440. int ret = fread(buf, 1, BUF_SIZE, filein);
  441. if(ret <=0){
  442. //printf( "file end, exit ~\n");
  443. break; //let it write whole blk...plz
  444. }
  445. if(mode == 0)
  446. hwDecodeRawDataForFlash( &buf[0], BUF_SIZE, 0);
  447. else
  448. hwEncodeRawDataForFlash( &buf[0], BUF_SIZE, 0);
  449. fwrite(buf, 1, BUF_SIZE, fileout);
  450. }
  451. fclose(filein);
  452. fclose(fileout);
  453. return 0;
  454. }