public static bool GetD2KeyHash(string cdkey, ref uint clientToken, uint serverToken, ref List <byte> output, ref List <byte> publicValue)
{
ulong checksum = 0;
ulong n, n2, v, v2;
char c1, c2, c;
String manipulatedKey = cdkey;
for (int i = 0; i < cdkey.Length; i += 2)
{
char[] tmpBuffer = manipulatedKey.ToCharArray();
c1 = (char)AlphaMap[cdkey[i]];
n = (ulong)c1 * 3;
c2 = (char)AlphaMap[cdkey[i + 1]];
n = (ulong)c2 + 8 * n;
if (n >= 0x100)
{
n -= 0x100;
ulong temp = (ulong)1 << (i >> 1);
checksum |= temp;
}
n2 = n;
n2 >>= 4;
tmpBuffer[i] = ConvertToHexDigit(n2);
tmpBuffer[i + 1] = ConvertToHexDigit(n);
manipulatedKey = new string(tmpBuffer);
}
v = 3;
for (int i = 0; i < 16; i++)
{
n = ConvertFromHexDigit(manipulatedKey[i]);
n2 = v * 2;
n ^= n2;
v += n;
}
v &= 0xFF;
if (v != checksum)
{
return(false);
}
for (int i = 15; i >= 0; i--)
{
c = manipulatedKey[i];
if (i > 8)
{
n = (ulong)i - 9;
}
else
{
n = 0xF - (ulong)(8 - i);
}
n &= 0xF;
c2 = manipulatedKey[(int)n];
char[] tmpBuffer = manipulatedKey.ToCharArray();
tmpBuffer[i] = c2;
tmpBuffer[n] = c;
manipulatedKey = new string(tmpBuffer);
}
v2 = 0x13AC9741;
for (int i = 15; i >= 0; i--)
{
c = char.ToUpper(manipulatedKey[i]);
char[] tmpBuffer = manipulatedKey.ToCharArray();
tmpBuffer[i] = c;
if (c <= '7')
{
v = v2;
c2 = (char)(v & 0xFF);
c2 &= (char)7;
c2 ^= c;
v >>= 3;
tmpBuffer[i] = c2;
v2 = v;
}
else if (c < 'A')
{
c2 = (char)i;
c2 &= (char)1;
c2 ^= c;
tmpBuffer[i] = c2;
}
manipulatedKey = new string(tmpBuffer);
}
string hexString = manipulatedKey.Substring(2, 6);
UInt32 num = UInt32.Parse(hexString, System.Globalization.NumberStyles.HexNumber);
publicValue = new List <byte>(BitConverter.GetBytes(num));
List <byte> hashData = new List <byte>(BitConverter.GetBytes(clientToken));
hashData.AddRange(BitConverter.GetBytes(serverToken));
hashData.AddRange(BitConverter.GetBytes(UInt32.Parse(manipulatedKey.Substring(0, 2), System.Globalization.NumberStyles.HexNumber)));
hashData.AddRange(BitConverter.GetBytes(num));
hashData.AddRange(BitConverter.GetBytes((int)0));
hashData.AddRange(BitConverter.GetBytes(UInt32.Parse(manipulatedKey.Substring(8, 8), System.Globalization.NumberStyles.HexNumber)));
output = Bsha1.GetHash(hashData);
return(true);
}