protected static void CalculateHash(ref uint[] buffer)
{
uint[] hash_buffer = new uint[80];
uint hash, a, b, c, d, e, hash_buffer_offset;
for (uint i = 0; i < 0x10; i++)
{
hash_buffer[i] = buffer[(int)i + 5];
}
for(uint i = 0x10; i <hash_buffer.Length; i++)
{
hash = hash_buffer[i - 0x10] ^ hash_buffer[i - 0x8] ^ hash_buffer[i - 0xE] ^ hash_buffer[i - 0x3];
hash_buffer[i] = (uint)((1 >> (int)(0x20 - (hash & 0xff))) | (1 << (int)(hash & 0xff)));
}
a = buffer[0];
b = buffer[1];
c = buffer[2];
d = buffer[3];
e = buffer[4];
hash_buffer_offset = 0;
for(uint i = 0; i < 20; i++, hash_buffer_offset++)
{
hash = ((a << 5) | (a >> 0x1b)) + ((~b & d) | (c & b)) + e + hash_buffer[hash_buffer_offset] + 0x5A827999;
e = d;
d = c;
c = (b >> 2) | (b << 0x1e);
b = a;
a = hash;
}
for(uint i = 0; i < 20; i++, hash_buffer_offset++)
{
hash = (d ^ c ^ b) + e + ((a << 5) | (a >> 0x1b)) + hash_buffer[hash_buffer_offset] + 0x6ED9EBA1;
e = d;
d = c;
c = (b >> 2) | (b << 0x1e);
b = a;
a = hash;
}
for(uint i = 0; i < 20; i++, hash_buffer_offset++)
{
hash = ((c & b) | (d & c) | (d & b)) + e + ((a << 5) | (a >> 0x1b)) + hash_buffer[hash_buffer_offset] - 0x70E44324;
e = d;
d = c;
c = (b >> 2) | (b << 0x1e);
b = a;
a = hash;
}
for(uint i = 0; i < 20; i++, hash_buffer_offset++)
{
hash = ((a << 5) | (a >> 0x1b)) + e + (d ^ c ^ b) + hash_buffer[hash_buffer_offset] - 0x359D3E2A;
e = d;
d = c;
c = (b >> 2) | (b << 0x1e);
b = a;
a = hash;
}
buffer[0] += a;
buffer[1] += b;
buffer[2] += c;
buffer[3] += d;
buffer[4] += e;
}