package com.subspace.snrrrub;
import java.nio.ByteBuffer;
//Thanks to Snrrrub for providing these Checksum routines
//Taken from the brilliant SubChat Project and coverted into java (ick)
public class Checksum {
public static int EXEChecksum(int key)
{
int part, csum = 0;
part = 0xc98ed41f;
part += 0x3e1bc | key;
part ^= 0x42435942 ^ key;
part += 0x1d895300 | key;
part ^= 0x6b5c4032 ^ key;
part += 0x467e44 | key;
part ^= 0x516c7eda ^ key;
part += 0x8b0c708b | key;
part ^= 0x6b3e3429 ^ key;
part += 0x560674c9 | key;
part ^= 0xf4e6b721 ^ key;
part += 0xe90cc483 | key;
part ^= 0x80ece15a ^ key;
part += 0x728bce33 | key;
part ^= 0x1fc5d1e6 ^ key;
part += 0x8b0c518b | key;
part ^= 0x24f1a96e ^ key;
part += 0x30ae0c1 | key;
part ^= 0x8858741b ^ key;
csum += part;
part = 0x9c15857d;
part += 0x424448b | key;
part ^= 0xcd0455ee ^ key;
part += 0x727 | key;
part ^= 0x8d7f29cd ^ key;
csum += part;
part = 0x824b9278;
part += 0x6590 | key;
part ^= 0x8e16169a ^ key;
part += 0x8b524914 | key;
part ^= 0x82dce03a ^ key;
part += 0xfa83d733 | key;
part ^= 0xb0955349 ^ key;
part += 0xe8000003 | key;
part ^= 0x7cfe3604 ^ key;
csum += part;
part = 0xe3f8d2af;
part += 0x2de85024 | key;
part ^= 0xbed0296b ^ key;
part += 0x587501f8 | key;
part ^= 0xada70f65 ^ key;
csum += part;
part = 0xcb54d8a0;
part += 0xf000001 | key;
part ^= 0x330f19ff ^ key;
part += 0x909090c3 | key;
part ^= 0xd20f9f9f ^ key;
part += 0x53004add | key;
part ^= 0x5d81256b ^ key;
part += 0x8b004b65 | key;
part ^= 0xa5312749 ^ key;
part += 0xb8004b67 | key;
part ^= 0x8adf8fb1 ^ key;
part += 0x8901e283 | key;
part ^= 0x8ec94507 ^ key;
part += 0x89d23300 | key;
part ^= 0x1ff8e1dc ^ key;
part += 0x108a004a | key;
part ^= 0xc73d6304 ^ key;
part += 0x43d2d3 | key;
part ^= 0x6f78e4ff ^ key;
csum += part;
part = 0x45c23f9;
part += 0x47d86097 | key;
part ^= 0x7cb588bd ^ key;
part += 0x9286 | key;
part ^= 0x21d700f8 ^ key;
part += 0xdf8e0fd9 | key;
part ^= 0x42796c9e ^ key;
part += 0x8b000003 | key;
part ^= 0x3ad32a21 ^ key;
csum += part;
part = 0xb229a3d0;
part += 0x47d708 | key;
part ^= 0x10b0a91 ^ key;
csum += part;
part = 0x466e55a7;
part += 0xc7880d8b | key;
part ^= 0x44ce7067 ^ key;
part += 0xe4 | key;
part ^= 0x923a6d44 ^ key;
part += 0x640047d6 | key;
part ^= 0xa62d606c ^ key;
part += 0x2bd1f7ae | key;
part ^= 0x2f5621fb ^ key;
part += 0x8b0f74ff | key;
part ^= 0x2928b332;
csum += part;
part = 0x62cf369a;
csum += part;
return csum;
}
public static int MapChecksum(int key, ByteBuffer data)
{
int EAX, ECX, ESI, EDX;
int HighBit = 0;
int cnt;
int original_key = key;
if(data == null)
return 0;
data.rewind();
int index = 0;
EAX = key;
if((EAX & 0x80000000) != 0)
{
HighBit = 0xFFFFFFFF;
}
EAX ^= HighBit;
EAX -= HighBit;
EAX &= 0x1F;
EAX ^= HighBit;
ECX = EAX - HighBit;
if(ECX >= 0x400)
{
return key;
}
EDX = key % 0x1F;
ESI = (ECX << 0x0A) + data.get(index) + EDX;
EAX = 0x400 - EDX;
cnt = (0x41F - ECX) >> 5;
index = EAX;
for(; cnt > 0; cnt--, ESI += 0x8000)
{
EDX = EAX + ESI;
ECX = ESI;
if(!(ESI < EDX))
continue;
while(ECX < EDX)
{
byte byt = data.get(ECX);
if((byt < 0xA1 || byt == 0xAB) && byt != 0)
key += original_key ^ byt;
ECX += 0x1F;
}
EAX = data.getInt(index);
}
return key;
}
}