protected override byte[] HashFinal()
{
blueIsRed = false;
redHash = null;
blueHash = null;
if (md4HashBlocks.Count == 0)
{
md4.TransformFinalBlock(nullArray, 0, 0);
blueHash = md4.Hash;
}
else if (md4HashBlocks.Count == 1 && missing == BLOCKSIZE)
{
blueHash = md4HashBlocks[0];
md4.TransformBlock(md4HashBlocks[0], 0, 16, null, 0);
md4.TransformFinalBlock(md4.ComputeHash(nullArray), 0, 16);
redHash = md4.Hash;
}
else
{
if (missing != BLOCKSIZE)
{
md4.TransformFinalBlock(nullArray, 0, 0);
md4HashBlocks.Add(md4.Hash);
}
md4.Initialize();
foreach (var md4HashBlock in md4HashBlocks) md4.TransformBlock(md4HashBlock, 0, 16, null, 0);
var state = md4.GetState();
md4.TransformFinalBlock(nullArray, 0, 0);
blueHash = md4.Hash;
if (missing == BLOCKSIZE)
{
md4.Initialize(state);
md4.TransformFinalBlock(nullMd4Hash, 0, 16);
redHash = md4.Hash;
}
}
FileHashingProgress(this, new FileHashingProgressArgs(totalBytesRead, size));
if (redHash == null) blueIsRed = true;
return redHash == null ? blueHash : redHash;
}