Decryption Methods
uint64_t DecryptXORKeys(uint32_t key, const uint64_t* state) {
unsigned __int64 v4;
unsigned __int64 v5;
unsigned __int64 v6;
unsigned int v7;
unsigned __int64 v8;
unsigned __int64 v9;
unsigned __int64 v10;
unsigned __int64 v11;
unsigned __int64 v12;
unsigned __int64 v13;
unsigned __int64 v14;
unsigned __int64 v15;
unsigned __int64 v16;
unsigned __int64 v17;
unsigned __int64 v18;
unsigned __int64 v20;
unsigned __int64 temp, temp2, temp3;
v4 = 0x2545F4914F6CDD1Di64
* ((unsigned int)key ^ (((unsigned int)key ^ ((unsigned __int64)(unsigned int)key >> 15)) >> 12) ^ (unsigned int)(key << 25))
% 7;
v5 = state[v4];
v6 = (0x2545F4914F6CDD1Di64
* ((unsigned int)key ^ (((unsigned int)key ^ ((unsigned __int64)(unsigned int)key >> 15)) >> 12) ^ (unsigned int)(key << 25))) >> 32;
v7 = (unsigned int)v4 % 7;
if ((unsigned int)v4 == 7 * ((unsigned int)v4 / 7)) {
v8 = ~(v5 ^ ~(unsigned __int64)(unsigned int)(v6 - 1));
goto LABEL_5;
}
v8 = state[v4];
if (v7 == 1) {
v10 = (v5 >> 1) ^ ((v5 >> 1) ^ (2 * v5)) & 0xAAAAAAAAAAAAAAAAui64;
v11 = ((v10 >> 2) ^ ((v10 >> 2) ^ (4 * v10)) & 0xCCCCCCCCCCCCCCCCui64) >> 4;
v12 = v11 ^ (v11 ^ (16 * ((v10 >> 2) ^ ((v10 >> 2) ^ (4 * v10)) & 0xCCCCCCCCCCCCCCCCui64))) & 0xF0F0F0F0F0F0F0F0ui64;
temp = (v12 >> 8) ^ ((v12 >> 8) ^ (v12 << 8)) & 0xFF00FF00FF00FF00ui64;
v8 = ~(unsigned __int64)(unsigned int)(v6 + v4) ^ ((temp >> 32) | (temp << 32));
LABEL_11:
v9 = v8;
if ((unsigned int)v4 % 7 == 3) {
v9 = ~((v8 >> 1) ^ ((v8 >> 1) ^ (2 * v8)) & 0xAAAAAAAAAAAAAAAAui64);
goto LABEL_7;
}
if ((unsigned int)v4 % 7 == 4) {
v13 = ((v8 >> 1) ^ ((v8 >> 1) ^ (2 * v8)) & 0xAAAAAAAAAAAAAAAAui64) >> 2;
v14 = v13 ^ (v13 ^ (4 * ((v8 >> 1) ^ ((v8 >> 1) ^ (2 * v8)) & 0xAAAAAAAAAAAAAAAAui64))) & 0xCCCCCCCCCCCCCCCCui64;
v15 = v14 >> 4;
temp2 = ((v15 ^ (v15 ^ (16 * v14)) & 0xF0F0F0F0F0F0F0F0ui64) >> 8) ^ (((v15 ^ (v15 ^ (16 * v14)) & 0xF0F0F0F0F0F0F0F0ui64) >> 8) ^ ((v15 ^ (v15 ^ (16 * v14)) & 0xF0F0F0F0F0F0F0F0ui64) << 8)) & 0xFF00FF00FF00FF00ui64;
v9 = ~(unsigned __int64)(unsigned int)(v6 + v4) ^ ((temp2 >> 32) | (temp2 << 32));
goto LABEL_15;
}
} else {
LABEL_5:
if (v7 != 2)
goto LABEL_11;
v9 = ((v8 >> (63 * (unsigned __int8)(((int)v6 + 2 * (int)v4) / 0x3Fu)
- ((unsigned __int8)v6
+ 2 * (unsigned __int8)v4)
+ 63)) | (v8 << ((unsigned __int8)(((int)v6 + 2 * (int)v4) % 0x3Fu) + 1)))
- (unsigned int)(v6 + v4);
}
LABEL_7:
if ((unsigned int)v4 % 7 == 5) {
v9 = ((v9 >> 1) ^ ((v9 >> 1) ^ (2 * v9)) & 0xAAAAAAAAAAAAAAAAui64) - (unsigned int)(v6 + v4);
} else {
LABEL_15:
if ((unsigned int)v4 % 7 == 6) {
v16 = ((v9 >> 1) ^ ((v9 >> 1) ^ (2 * v9)) & 0xAAAAAAAAAAAAAAAAui64) >> 2;
v17 = v16 ^ (v16 ^ (4 * ((v9 >> 1) ^ ((v9 >> 1) ^ (2 * v9)) & 0xAAAAAAAAAAAAAAAAui64))) & 0xCCCCCCCCCCCCCCCCui64;
v18 = (v17 >> 4) ^ ((v17 >> 4) ^ (16 * v17)) & 0xF0F0F0F0F0F0F0F0ui64;
temp3 = (v18 >> 8) ^ ((v18 >> 8) ^ (v18 << 8)) & 0xFF00FF00FF00FF00ui64;
v9 = (unsigned int)(v6 + v4) + ((temp3 >> 32) | (temp3 << 32));
}
}
return v20 = v9 ^ (unsigned int)key;
}