-
Notifications
You must be signed in to change notification settings - Fork 0
/
UnScrambler.c
76 lines (73 loc) · 3.38 KB
/
UnScrambler.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <stdio.h>
#include "types.h"
//also, for those wondering wtf are all these typecasts for, it's due to gcc 4.9.1 failing on me back when I made this.
void Key_Unscrambler(u8 *normal_key, u8 *Key, const u8 *C, u8 X_or_Y, u8 *return_key){
int i;
u8 shifted_X_xor_Y_addition_C[0x10];
for(i=0;i<16;i++){
//Too many type casts? or not enough type casts? I'll never know.
//Also, masking a type casted u8 value with 0xff? Totally necessary.
if(i > 10) shifted_X_xor_Y_addition_C[i] = (u8)((((u8)normal_key[i-11] << (u8)1)&0xFE) + (((u8)normal_key[(i+1)-11] >> (u8)7)&0x01))&0xff;
else if(i == 10) shifted_X_xor_Y_addition_C[i] = (u8)((((u8)normal_key[5+i] << (u8)1)&0xFE) + (((u8)normal_key[0] >> (u8)7)&0x01))&0xff;
else shifted_X_xor_Y_addition_C[i] = (u8)((((u8)normal_key[5+i] << (u8)1)&0xFE) + (((u8)normal_key[5+i+1] >> (u8)7)&0x01))&0xff;
}
u8 shifted_X_xor_Y[0x10];
u8 carry = 0;
for(i=0;i<16;i++){
//More type casts.
shifted_X_xor_Y[15-i] = (u8)((u8)shifted_X_xor_Y_addition_C[15-i] - (u8)carry - (u8)C[15-i]);
carry = (u8)(((u16)((u8)shifted_X_xor_Y_addition_C[15-i] - (u8)carry - (u8)C[15-i])) >> (u8)8)&0x01;
}
u8 shifted_X[0x10];
if(X_or_Y){
// KeyX
for(i=0;i<16;i++){
//Type casts.
shifted_X[i] = (u8)((u8)shifted_X_xor_Y[i] ^ (u8)Key[i]);
}
for(i=0;i<16;i++){
//Even more type casts and masks.
if(i!=0) return_key[i] = (u8)((((u8)shifted_X[i] >> (u8)2)&0x3F) + (((u8)shifted_X[i-1] << (u8)6)&0xC0))&0xff;
else return_key[i] = (u8)((((u8)shifted_X[i] >> (u8)2)&0x3F) + (((u8)shifted_X[15] << (u8)6)&0xC0))&0xff;
}
}
else {
//KeyY
for(i=0;i<16;i++){
//Uhmm, it seems that I just don't stop with the type casts and masks.
if(i!=15) shifted_X[i] = (u8)((((u8)Key[i] << (u8)2)&0xFC) + (((u8)Key[i+1] >> (u8)6)&0x03))&0xff;
else shifted_X[i] = (u8)((((u8)Key[i] << (u8)2)&0xFC) + (((u8)Key[0] >> (u8)6)&0x03))&0xff;
}
for(i=0;i<16;i++){
//The type casts! They're everywhere!
return_key[i] = (u8)((u8)shifted_X_xor_Y[i] ^ (u8)shifted_X[i]);
}
}
}
void Key_Scrambler(u8 *X, u8 *Y, const u8 *C, u8 *normal_key){
int i;
u8 shifted_X[0x10];
for(i=0;i<16;i++){
//The joke is already dead, but I keep doing it. So, more type casts and masks.
if(i!=15) shifted_X[i] = (u8)((((u8)X[i] << (u8)2)&0xFC) + (((u8)X[i+1] >> (u8)6)&0x03))&0xff;
else shifted_X[i] = (u8)((((u8)X[i] << (u8)2)&0xFC) + (((u8)X[0] >> (u8)6)&0x03))&0xff;