| #include <stdint.h> |
| #include "scramble.h" |
| |
| void scramble(uint8_t *in, uint8_t *out, const int size) |
| { |
| /* table extracted from bootrom */ |
| static const uint8_t key[] = { |
| 0x7C, 0x4E, 0x03, 0x04, |
| 0x55, 0x05, 0x09, 0x07, |
| 0x2D, 0x2C, 0x7B, 0x38, |
| 0x17, 0x0D, 0x17, 0x11 |
| }; |
| |
| int i, i3, x, val, idx; |
| |
| uint8_t key1[0x100]; |
| uint8_t key2[0x100]; |
| |
| for (i=0; i<0x100; i++) { |
| key1[i] = i; |
| key2[i] = key[i&0xf]; |
| } |
| |
| i3 = 0; |
| for (i=0; i<0x100; i++) { |
| x = key1[i]; |
| i3 = key1[i] + i3; |
| i3 += key2[i]; |
| i3 &= 0xff; |
| key1[i] = key1[i3]; |
| key1[i3] = x; |
| } |
| |
| idx = 0; |
| for (i=0; i<size; i++) { |
| x = key1[(i+1) & 0xff]; |
| val = x; |
| idx = (x + idx) & 0xff; |
| key1[(i+1) & 0xff] = key1[idx]; |
| key1[idx] = (x & 0xff); |
| val = (key1[(i+1)&0xff] + x) & 0xff; |
| val = key1[val]; |
| out[i] = val ^ in[i]; |
| } |
| } |
| |