summaryrefslogtreecommitdiff
path: root/utils/rk27utils/rk27load/scramble.c
diff options
context:
space:
mode:
authorMarcin Bukat <marcin.bukat@gmail.com>2011-05-30 21:10:43 +0000
committerMarcin Bukat <marcin.bukat@gmail.com>2011-05-30 21:10:43 +0000
commit8f4202db285b2139cfee6269b838733d6d2a2306 (patch)
treea362bd367c35a03928b68485df0188e637e09ea3 /utils/rk27utils/rk27load/scramble.c
parent976a1699da373f01dabc9353b34aef261ebf740f (diff)
downloadrockbox-8f4202db285b2139cfee6269b838733d6d2a2306.tar.gz
rockbox-8f4202db285b2139cfee6269b838733d6d2a2306.zip
Rockchip rk27xx utils
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29936 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'utils/rk27utils/rk27load/scramble.c')
-rw-r--r--utils/rk27utils/rk27load/scramble.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/utils/rk27utils/rk27load/scramble.c b/utils/rk27utils/rk27load/scramble.c
new file mode 100644
index 0000000000..7e5b1518d7
--- /dev/null
+++ b/utils/rk27utils/rk27load/scramble.c
@@ -0,0 +1,46 @@
1#include <stdint.h>
2#include "scramble.h"
3
4void scramble(uint8_t *in, uint8_t *out, const int size)
5{
6 /* table extracted from bootrom */
7 static const uint8_t key[] = {
8 0x7C, 0x4E, 0x03, 0x04,
9 0x55, 0x05, 0x09, 0x07,
10 0x2D, 0x2C, 0x7B, 0x38,
11 0x17, 0x0D, 0x17, 0x11
12 };
13
14 int i, i3, x, val, idx;
15
16 uint8_t key1[0x100];
17 uint8_t key2[0x100];
18
19 for (i=0; i<0x100; i++) {
20 key1[i] = i;
21 key2[i] = key[i&0xf];
22 }
23
24 i3 = 0;
25 for (i=0; i<0x100; i++) {
26 x = key1[i];
27 i3 = key1[i] + i3;
28 i3 += key2[i];
29 i3 &= 0xff;
30 key1[i] = key1[i3];
31 key1[i3] = x;
32 }
33
34 idx = 0;
35 for (i=0; i<size; i++) {
36 x = key1[(i+1) & 0xff];
37 val = x;
38 idx = (x + idx) & 0xff;
39 key1[(i+1) & 0xff] = key1[idx];
40 key1[idx] = (x & 0xff);
41 val = (key1[(i+1)&0xff] + x) & 0xff;
42 val = key1[val];
43 out[i] = val ^ in[i];
44 }
45}
46