private static uint[] GetWords(byte[] chunk) { var words = new uint[80]; for (int i = 0; i < 16; i++) { words[i] = ConversionHelpers.ToUInt(ByteArrayHelpers.CopyPartOf(chunk, i * 4, 4).Reverse().ToArray()); } for (int i = 16; i < 80; i++) { words[i] = MiscHelpers.LeftRotate(words[i - 3] ^ words[i - 8] ^ words[i - 14] ^ words[i - 16], 1); } return(words); }
private static uint[] ProcessChunks(uint[] chunkHash, uint[] words) { for (int i = 0; i < words.Length; i++) { uint f, k; if (i < 20) { f = (chunkHash[1] & chunkHash[2]) | (~chunkHash[1] & chunkHash[3]); k = 0x5A827999; } else if (i < 40) { f = chunkHash[1] ^ chunkHash[2] ^ chunkHash[3]; k = 0x6ED9EBA1; } else if (i < 60) { f = (chunkHash[1] & chunkHash[2]) | (chunkHash[1] & chunkHash[3]) | (chunkHash[2] & chunkHash[3]); k = 0x8F1BBCDC; } else { f = chunkHash[1] ^ chunkHash[2] ^ chunkHash[3]; k = 0xCA62C1D6; } uint temp = MiscHelpers.LeftRotate(chunkHash[0], 5) + f + chunkHash[4] + k + words[i]; chunkHash[4] = chunkHash[3]; chunkHash[3] = chunkHash[2]; chunkHash[2] = MiscHelpers.LeftRotate(chunkHash[1], 30); chunkHash[1] = chunkHash[0]; chunkHash[0] = temp; } return(chunkHash); }