| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493 |
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include "mergeImage.h"
- #ifndef DWORD
- #define DWORD unsigned int
- #endif
- #ifndef BYTE
- #define BYTE unsigned char
- #endif
- #ifndef bool
- #define bool unsigned int
- #endif
- #define FLASH_HW_KEY 0x08825252U
- #define FLASH_HW_KEY_0 ((FLASH_HW_KEY <<(32-11)) |(FLASH_HW_KEY>>11))
- #define FLASH_HW_KEY_1 ((FLASH_HW_KEY <<(32-20)) |(FLASH_HW_KEY>>20))
- #define FLASH_HW_KEY_2 ((FLASH_HW_KEY <<(32-26)) |(FLASH_HW_KEY>>26))
- #define FLASH_HW_KEY_3 ((FLASH_HW_KEY <<(32-7)) |(FLASH_HW_KEY>>7))
- DWORD cmN_BytesToDWORD(char* bytes)
- {
- int i;
- DWORD value;
- value = 0;
- char* tmpByte;
- //printf("cmN_BytesToDWORD %p\n", bytes);
- for(i=0;i<4;i++)
- {
- tmpByte = &bytes[i];
- if(tmpByte)
- {
- value |= (*tmpByte & 0xFF) <<(8*i);
- //printf("%x\t ", value);
- }
- }
- return value;
- }
- void cmN_DWORDToBytes(char* bytes, DWORD value)
- {
- int i;
- char* tmpbyte;
-
- for(i=0;i<4;i++)
- {
- tmpbyte = &bytes[i];
- *tmpbyte = (BYTE)(value >> (8*i)) & 0xFF;
- }
- }
- bool cmN_GetBitFromDword(DWORD data, BYTE i)
- {
- if( (data>>i)&1 )
- return 1;
- else
- return 0;
- }
- DWORD Mix_0(DWORD data)
- {
- return ( (cmN_GetBitFromDword(data, 22)<<31)
- | (cmN_GetBitFromDword(data, 8)<<30)
- | (cmN_GetBitFromDword(data, 7)<<29)
- | (cmN_GetBitFromDword(data, 21)<<28)
- | (cmN_GetBitFromDword(data, 0)<<27)
- | (cmN_GetBitFromDword(data, 25)<<26)
- | (cmN_GetBitFromDword(data, 20)<<25)
- | (cmN_GetBitFromDword(data, 6)<<24)
- | (cmN_GetBitFromDword(data, 19)<<23)
- | (cmN_GetBitFromDword(data, 16)<<22)
- | (cmN_GetBitFromDword(data, 24)<<21)
- | (cmN_GetBitFromDword(data, 5)<<20)
- | (cmN_GetBitFromDword(data, 23)<<19)
- | (cmN_GetBitFromDword(data, 1)<<18)
- | (cmN_GetBitFromDword(data, 18)<<17)
- | (cmN_GetBitFromDword(data, 15)<<16)
- | (cmN_GetBitFromDword(data, 26)<<15)
- | (cmN_GetBitFromDword(data, 3)<<14)
- | (cmN_GetBitFromDword(data, 17)<<13)
- | (cmN_GetBitFromDword(data, 14)<<12)
- | (cmN_GetBitFromDword(data, 4)<<11)
- | (cmN_GetBitFromDword(data, 13)<<10)
- | (cmN_GetBitFromDword(data, 2)<<9)
- | (cmN_GetBitFromDword(data, 30)<<8)
- | (cmN_GetBitFromDword(data, 12)<<7)
- | (cmN_GetBitFromDword(data, 29)<<6)
- | (cmN_GetBitFromDword(data, 28)<<5)
- | (cmN_GetBitFromDword(data, 11)<<4)
- | (cmN_GetBitFromDword(data, 9)<<3)
- | (cmN_GetBitFromDword(data, 31)<<2)
- | (cmN_GetBitFromDword(data, 27)<<1)
- | (cmN_GetBitFromDword(data, 10)<<0) );
- }
- DWORD Mix_1(DWORD data)
- {
- return ( (cmN_GetBitFromDword(data, 11)<<31)
- | (cmN_GetBitFromDword(data, 7)<<30)
- | (cmN_GetBitFromDword(data, 21)<<29)
- | (cmN_GetBitFromDword(data, 29)<<28)
- | (cmN_GetBitFromDword(data, 18)<<27)
- | (cmN_GetBitFromDword(data, 31)<<26)
- | (cmN_GetBitFromDword(data, 3)<<25)
- | (cmN_GetBitFromDword(data, 30)<<24)
- | (cmN_GetBitFromDword(data, 8)<<23)
- | (cmN_GetBitFromDword(data, 26)<<22)
- | (cmN_GetBitFromDword(data, 12)<<21)
- | (cmN_GetBitFromDword(data, 28)<<20)
- | (cmN_GetBitFromDword(data, 2)<<19)
- | (cmN_GetBitFromDword(data, 25)<<18)
- | (cmN_GetBitFromDword(data, 17)<<17)
- | (cmN_GetBitFromDword(data, 14)<<16)
- | (cmN_GetBitFromDword(data, 23)<<15)
- | (cmN_GetBitFromDword(data, 1)<<14)
- | (cmN_GetBitFromDword(data, 20)<<13)
- | (cmN_GetBitFromDword(data, 5)<<12)
- | (cmN_GetBitFromDword(data, 19)<<11)
- | (cmN_GetBitFromDword(data, 15)<<10)
- | (cmN_GetBitFromDword(data, 9)<<9)
- | (cmN_GetBitFromDword(data, 4)<<8)
- | (cmN_GetBitFromDword(data, 0)<<7)
- | (cmN_GetBitFromDword(data, 16)<<6)
- | (cmN_GetBitFromDword(data, 24)<<5)
- | (cmN_GetBitFromDword(data, 6)<<4)
- | (cmN_GetBitFromDword(data, 10)<<3)
- | (cmN_GetBitFromDword(data, 22)<<2)
- | (cmN_GetBitFromDword(data, 27)<<1)
- | (cmN_GetBitFromDword(data, 13)<<0) );
- }
- DWORD Mix_2(DWORD data)
- {
- return ( (cmN_GetBitFromDword(data, 13)<<31)
- | (cmN_GetBitFromDword(data, 23)<<30)
- | (cmN_GetBitFromDword(data, 9)<<29)
- | (cmN_GetBitFromDword(data, 20)<<28)
- | (cmN_GetBitFromDword(data, 3)<<27)
- | (cmN_GetBitFromDword(data, 25)<<26)
- | (cmN_GetBitFromDword(data, 14)<<25)
- | (cmN_GetBitFromDword(data, 24)<<24)
- | (cmN_GetBitFromDword(data, 2)<<23)
- | (cmN_GetBitFromDword(data, 11)<<22)
- | (cmN_GetBitFromDword(data, 30)<<21)
- | (cmN_GetBitFromDword(data, 16)<<20)
- | (cmN_GetBitFromDword(data, 6)<<19)
- | (cmN_GetBitFromDword(data, 19)<<18)
- | (cmN_GetBitFromDword(data, 1)<<17)
- | (cmN_GetBitFromDword(data, 5)<<16)
- | (cmN_GetBitFromDword(data, 0)<<15)
- | (cmN_GetBitFromDword(data, 22)<<14)
- | (cmN_GetBitFromDword(data, 12)<<13)
- | (cmN_GetBitFromDword(data, 26)<<12)
- | (cmN_GetBitFromDword(data, 8)<<11)
- | (cmN_GetBitFromDword(data, 21)<<10)
- | (cmN_GetBitFromDword(data, 10)<<9)
- | (cmN_GetBitFromDword(data, 17)<<8)
- | (cmN_GetBitFromDword(data, 28)<<7)
- | (cmN_GetBitFromDword(data, 4)<<6)
- | (cmN_GetBitFromDword(data, 29)<<5)
- | (cmN_GetBitFromDword(data, 15)<<4)
- | (cmN_GetBitFromDword(data, 31)<<3)
- | (cmN_GetBitFromDword(data, 18)<<2)
- | (cmN_GetBitFromDword(data, 7)<<1)
- | (cmN_GetBitFromDword(data, 27)<<0) );
- }
- DWORD Mix_3(DWORD data)
- {
- return ( (cmN_GetBitFromDword(data, 20)<<31)
- | (cmN_GetBitFromDword(data, 11)<<30)
- | (cmN_GetBitFromDword(data, 31)<<29)
- | (cmN_GetBitFromDword(data, 25)<<28)
- | (cmN_GetBitFromDword(data, 10)<<27)
- | (cmN_GetBitFromDword(data, 17)<<26)
- | (cmN_GetBitFromDword(data, 29)<<25)
- | (cmN_GetBitFromDword(data, 7)<<24)
- | (cmN_GetBitFromDword(data, 13)<<23)
- | (cmN_GetBitFromDword(data, 27)<<22)
- | (cmN_GetBitFromDword(data, 2)<<21)
- | (cmN_GetBitFromDword(data, 22)<<20)
- | (cmN_GetBitFromDword(data, 26)<<19)
- | (cmN_GetBitFromDword(data, 16)<<18)
- | (cmN_GetBitFromDword(data, 6)<<17)
- | (cmN_GetBitFromDword(data, 30)<<16)
- | (cmN_GetBitFromDword(data, 14)<<15)
- | (cmN_GetBitFromDword(data, 24)<<14)
- | (cmN_GetBitFromDword(data, 4)<<13)
- | (cmN_GetBitFromDword(data, 19)<<12)
- | (cmN_GetBitFromDword(data, 0)<<11)
- | (cmN_GetBitFromDword(data, 8)<<10)
- | (cmN_GetBitFromDword(data, 18)<<9)
- | (cmN_GetBitFromDword(data, 1)<<8)
- | (cmN_GetBitFromDword(data, 21)<<7)
- | (cmN_GetBitFromDword(data, 15)<<6)
- | (cmN_GetBitFromDword(data, 3)<<5)
- | (cmN_GetBitFromDword(data, 5)<<4)
- | (cmN_GetBitFromDword(data, 23)<<3)
- | (cmN_GetBitFromDword(data, 9)<<2)
- | (cmN_GetBitFromDword(data, 28)<<1)
- | (cmN_GetBitFromDword(data, 12)<<0) );
- }
- DWORD unMix_0(DWORD data)
- {
- return ( (cmN_GetBitFromDword(data, 2)<<31)
- | (cmN_GetBitFromDword(data, 8)<<30)
- | (cmN_GetBitFromDword(data, 6)<<29)
- | (cmN_GetBitFromDword(data, 5)<<28)
- | (cmN_GetBitFromDword(data, 1)<<27)
- | (cmN_GetBitFromDword(data, 15)<<26)
- | (cmN_GetBitFromDword(data, 26)<<25)
- | (cmN_GetBitFromDword(data, 21)<<24)
- | (cmN_GetBitFromDword(data, 19)<<23)
- | (cmN_GetBitFromDword(data, 31)<<22)
- | (cmN_GetBitFromDword(data, 28)<<21)
- | (cmN_GetBitFromDword(data, 25)<<20)
- | (cmN_GetBitFromDword(data, 23)<<19)
- | (cmN_GetBitFromDword(data, 17)<<18)
- | (cmN_GetBitFromDword(data, 13)<<17)
- | (cmN_GetBitFromDword(data, 22)<<16)
- | (cmN_GetBitFromDword(data, 16)<<15)
- | (cmN_GetBitFromDword(data, 12)<<14)
- | (cmN_GetBitFromDword(data, 10)<<13)
- | (cmN_GetBitFromDword(data, 7)<<12)
- | (cmN_GetBitFromDword(data, 4)<<11)
- | (cmN_GetBitFromDword(data, 0)<<10)
- | (cmN_GetBitFromDword(data, 3)<<9)
- | (cmN_GetBitFromDword(data, 30)<<8)
- | (cmN_GetBitFromDword(data, 29)<<7)
- | (cmN_GetBitFromDword(data, 24)<<6)
- | (cmN_GetBitFromDword(data, 20)<<5)
- | (cmN_GetBitFromDword(data, 11)<<4)
- | (cmN_GetBitFromDword(data, 14)<<3)
- | (cmN_GetBitFromDword(data, 9)<<2)
- | (cmN_GetBitFromDword(data, 18)<<1)
- | (cmN_GetBitFromDword(data, 27)<<0) );
- }
- DWORD unMix_1(DWORD data)
- {
- return ( (cmN_GetBitFromDword(data, 26)<<31)
- | (cmN_GetBitFromDword(data, 24)<<30)
- | (cmN_GetBitFromDword(data, 28)<<29)
- | (cmN_GetBitFromDword(data, 20)<<28)
- | (cmN_GetBitFromDword(data, 1)<<27)
- | (cmN_GetBitFromDword(data, 22)<<26)
- | (cmN_GetBitFromDword(data, 18)<<25)
- | (cmN_GetBitFromDword(data, 5)<<24)
- | (cmN_GetBitFromDword(data, 15)<<23)
- | (cmN_GetBitFromDword(data, 2)<<22)
- | (cmN_GetBitFromDword(data, 29)<<21)
- | (cmN_GetBitFromDword(data, 13)<<20)
- | (cmN_GetBitFromDword(data, 11)<<19)
- | (cmN_GetBitFromDword(data, 27)<<18)
- | (cmN_GetBitFromDword(data, 17)<<17)
- | (cmN_GetBitFromDword(data, 6)<<16)
- | (cmN_GetBitFromDword(data, 10)<<15)
- | (cmN_GetBitFromDword(data, 16)<<14)
- | (cmN_GetBitFromDword(data, 0)<<13)
- | (cmN_GetBitFromDword(data, 21)<<12)
- | (cmN_GetBitFromDword(data, 31)<<11)
- | (cmN_GetBitFromDword(data, 3)<<10)
- | (cmN_GetBitFromDword(data, 9)<<9)
- | (cmN_GetBitFromDword(data, 23)<<8)
- | (cmN_GetBitFromDword(data, 30)<<7)
- | (cmN_GetBitFromDword(data, 4)<<6)
- | (cmN_GetBitFromDword(data, 12)<<5)
- | (cmN_GetBitFromDword(data, 8)<<4)
- | (cmN_GetBitFromDword(data, 25)<<3)
- | (cmN_GetBitFromDword(data, 19)<<2)
- | (cmN_GetBitFromDword(data, 14)<<1)
- | (cmN_GetBitFromDword(data, 7)<<0) );
- }
- DWORD unMix_2(DWORD data)
- {
- return ( (cmN_GetBitFromDword(data, 3)<<31)
- | (cmN_GetBitFromDword(data, 21)<<30)
- | (cmN_GetBitFromDword(data, 5)<<29)
- | (cmN_GetBitFromDword(data, 7)<<28)
- | (cmN_GetBitFromDword(data, 0)<<27)
- | (cmN_GetBitFromDword(data, 12)<<26)
- | (cmN_GetBitFromDword(data, 26)<<25)
- | (cmN_GetBitFromDword(data, 24)<<24)
- | (cmN_GetBitFromDword(data, 30)<<23)
- | (cmN_GetBitFromDword(data, 14)<<22)
- | (cmN_GetBitFromDword(data, 10)<<21)
- | (cmN_GetBitFromDword(data, 28)<<20)
- | (cmN_GetBitFromDword(data, 18)<<19)
- | (cmN_GetBitFromDword(data, 2)<<18)
- | (cmN_GetBitFromDword(data, 8)<<17)
- | (cmN_GetBitFromDword(data, 20)<<16)
- | (cmN_GetBitFromDword(data, 4)<<15)
- | (cmN_GetBitFromDword(data, 25)<<14)
- | (cmN_GetBitFromDword(data, 31)<<13)
- | (cmN_GetBitFromDword(data, 13)<<12)
- | (cmN_GetBitFromDword(data, 22)<<11)
- | (cmN_GetBitFromDword(data, 9)<<10)
- | (cmN_GetBitFromDword(data, 29)<<9)
- | (cmN_GetBitFromDword(data, 11)<<8)
- | (cmN_GetBitFromDword(data, 1)<<7)
- | (cmN_GetBitFromDword(data, 19)<<6)
- | (cmN_GetBitFromDword(data, 16)<<5)
- | (cmN_GetBitFromDword(data, 6)<<4)
- | (cmN_GetBitFromDword(data, 27)<<3)
- | (cmN_GetBitFromDword(data, 23)<<2)
- | (cmN_GetBitFromDword(data, 17)<<1)
- | (cmN_GetBitFromDword(data, 15)<<0) );
- }
- DWORD unMix_3(DWORD data)
- {
- return ( (cmN_GetBitFromDword(data, 29)<<31)
- | (cmN_GetBitFromDword(data, 16)<<30)
- | (cmN_GetBitFromDword(data, 25)<<29)
- | (cmN_GetBitFromDword(data, 1)<<28)
- | (cmN_GetBitFromDword(data, 22)<<27)
- | (cmN_GetBitFromDword(data, 19)<<26)
- | (cmN_GetBitFromDword(data, 28)<<25)
- | (cmN_GetBitFromDword(data, 14)<<24)
- | (cmN_GetBitFromDword(data, 3)<<23)
- | (cmN_GetBitFromDword(data, 20)<<22)
- | (cmN_GetBitFromDword(data, 7)<<21)
- | (cmN_GetBitFromDword(data, 31)<<20)
- | (cmN_GetBitFromDword(data, 12)<<19)
- | (cmN_GetBitFromDword(data, 9)<<18)
- | (cmN_GetBitFromDword(data, 26)<<17)
- | (cmN_GetBitFromDword(data, 18)<<16)
- | (cmN_GetBitFromDword(data, 6)<<15)
- | (cmN_GetBitFromDword(data, 15)<<14)
- | (cmN_GetBitFromDword(data, 23)<<13)
- | (cmN_GetBitFromDword(data, 0)<<12)
- | (cmN_GetBitFromDword(data, 30)<<11)
- | (cmN_GetBitFromDword(data, 27)<<10)
- | (cmN_GetBitFromDword(data, 2)<<9)
- | (cmN_GetBitFromDword(data, 10)<<8)
- | (cmN_GetBitFromDword(data, 24)<<7)
- | (cmN_GetBitFromDword(data, 17)<<6)
- | (cmN_GetBitFromDword(data, 4)<<5)
- | (cmN_GetBitFromDword(data, 13)<<4)
- | (cmN_GetBitFromDword(data, 5)<<3)
- | (cmN_GetBitFromDword(data, 21)<<2)
- | (cmN_GetBitFromDword(data, 8)<<1)
- | (cmN_GetBitFromDword(data, 11)<<0) );
- }
- //example 1M code flash address
- // => cmN_hwEncodeRawDataForFlash(pData, 0x100000, 0xbc000000);
- void hwEncodeRawDataForFlash(char * pChar, DWORD length, DWORD ref_address)
- {
- DWORD tmplength=0;
- DWORD in_data, data_add, pre_xor_data, out_data;
- BYTE type;
- //to handle for each DWORD
- while( tmplength < length)
- {
- //printf("tmplength %d\n", tmplength);
- in_data = cmN_BytesToDWORD(pChar);
- data_add = in_data + FLASH_HW_KEY;
- type = (BYTE)(ref_address>>2) & 0x03;
- if(type==0)
- {
- pre_xor_data = Mix_0(data_add);
- out_data = pre_xor_data^FLASH_HW_KEY_0;
- cmN_DWORDToBytes(pChar, out_data);
-
- }
- else if(type==1)
- {
- pre_xor_data = Mix_1(data_add);
- out_data = pre_xor_data^FLASH_HW_KEY_1;
- cmN_DWORDToBytes(pChar, out_data);
- }
- else if(type==2)
- {
- pre_xor_data = Mix_2(data_add);
- out_data = pre_xor_data^FLASH_HW_KEY_2;
- cmN_DWORDToBytes(pChar, out_data);
- }
- else if(type==3)
- {
- pre_xor_data = Mix_3(data_add);
- out_data = pre_xor_data^FLASH_HW_KEY_3;
- cmN_DWORDToBytes(pChar, out_data);
- }
- ref_address += 4;
- pChar += 4;
- tmplength += 4;
- }
- //pChar -= tmplength;
- }
- void hwDecodeRawDataForFlash(char * pChar, DWORD length, DWORD ref_address)
- {
- DWORD tmplength=0;
- DWORD in_data, pre_xor_data, out_data;
- BYTE type;
- //to handle for each DWORD
- while( tmplength < length)
- {
- //printf("tmplength %d\n", tmplength);
- in_data = cmN_BytesToDWORD(pChar);
- type = (BYTE)(ref_address>>2) & 0x03;
- if(type==0)
- {
- in_data = in_data^FLASH_HW_KEY_0;
- pre_xor_data = unMix_0(in_data);
- out_data = pre_xor_data - FLASH_HW_KEY;
- cmN_DWORDToBytes(pChar, out_data);
-
- }
- else if(type==1)
- {
- in_data = in_data^FLASH_HW_KEY_1;
- pre_xor_data = unMix_1(in_data);
- out_data = pre_xor_data - FLASH_HW_KEY;
- cmN_DWORDToBytes(pChar, out_data);
- }
- else if(type==2)
- {
- in_data = in_data^FLASH_HW_KEY_2;
- pre_xor_data = unMix_2(in_data);
- out_data = pre_xor_data - FLASH_HW_KEY;
- cmN_DWORDToBytes(pChar, out_data);
- }
- else if(type==3)
- {
- in_data = in_data^FLASH_HW_KEY_3;
- pre_xor_data = unMix_3(in_data);
- out_data = pre_xor_data - FLASH_HW_KEY;
- cmN_DWORDToBytes(pChar, out_data);
- }
-
- ref_address += 4;
- pChar += 4;
- tmplength += 4;
- }
- pChar -= tmplength;
- }
- #define BUF_SIZE 128
- int sisspi_encrypt( const char *inFile, const char *outFile, int encryptMode )
- {
- char buf[BUF_SIZE];
- int mode = encryptMode;
-
- FILE *filein = fopen( inFile, "rb" );
- if(filein == NULL) {
- printf("open %s fail\n", inFile );
- return 1;
- }
- FILE *fileout=fopen( outFile, "wb" );
- if(fileout == NULL) {
- printf("open %s fail\n", outFile );
- fclose(filein);
- return 1;
- }
- while(1){
- int ret = fread(buf, 1, BUF_SIZE, filein);
- if(ret <=0){
- //printf( "file end, exit ~\n");
- break; //let it write whole blk...plz
- }
- if(mode == 0)
- hwDecodeRawDataForFlash( &buf[0], BUF_SIZE, 0);
- else
- hwEncodeRawDataForFlash( &buf[0], BUF_SIZE, 0);
- fwrite(buf, 1, BUF_SIZE, fileout);
- }
- fclose(filein);
- fclose(fileout);
- return 0;
- }
|