1.1 --- a/src/bootstrap.c Sun Jan 31 18:28:24 2010 +1000
1.2 +++ b/src/bootstrap.c Wed Feb 10 18:16:19 2010 +1000
1.8 +/* Scramble/unscramble, based on Marcus Comstedt's algorithm. */
1.10 +typedef uint16_t randseed;
1.12 +#define MAXBLOCK (2048*1024)
1.13 +#define CHUNKSIZE 32
1.14 +#define NEXT(seed) (((seed = (seed*2109+9273)&0x7fff) + 0xC000) & 0xFFFF)
1.16 +void bootprogram_scramble( unsigned char *dest, unsigned char *src, size_t length )
1.18 + randseed seed = length & 0xFFFF;
1.19 + unsigned table[MAXBLOCK/32];
1.20 + unsigned char *s = src;
1.21 + unsigned char *d = dest;
1.23 + for( unsigned blocksize = MAXBLOCK; blocksize >= CHUNKSIZE; blocksize >>= 1 ) {
1.24 + while( length >= blocksize ) {
1.25 + unsigned nchunks = blocksize/CHUNKSIZE;
1.26 + for( unsigned i=0; i<nchunks; i++ ) {
1.27 + table[i] = i; // Identity
1.29 + for( unsigned i = nchunks-1; i != (unsigned)-1; --i ) {
1.30 + unsigned j = (NEXT(seed) * i)>>16;
1.31 + unsigned tmp = table[i];
1.32 + table[i] = table[j];
1.34 + memcpy( d, s + CHUNKSIZE*table[i], CHUNKSIZE );
1.37 + length -= blocksize;
1.42 + memcpy( d, s, length );
1.46 +void bootprogram_unscramble( unsigned char *dest, unsigned char *src, size_t length )
1.48 + randseed seed = length & 0xFFFF;
1.49 + unsigned table[MAXBLOCK/32];
1.50 + unsigned char *s = src;
1.51 + unsigned char *d = dest;
1.53 + for( unsigned blocksize = MAXBLOCK; blocksize >= CHUNKSIZE; blocksize >>= 1 ) {
1.54 + while( length >= blocksize ) {
1.55 + unsigned nchunks = blocksize/CHUNKSIZE;
1.56 + for( unsigned i=0; i<nchunks; i++ ) {
1.57 + table[i] = i; // Identity
1.59 + for( unsigned i = nchunks-1; i != (unsigned)-1; --i ) {
1.60 + unsigned j = (NEXT(seed) * i)>>16;
1.61 + unsigned tmp = table[i];
1.62 + table[i] = table[j];
1.64 + memcpy( d + CHUNKSIZE*table[i], s, CHUNKSIZE );
1.67 + length -= blocksize;
1.72 + memcpy( d, s, length );