using System; using System.IO; using System.Security.Cryptography; namespace ScreenConnect; public class HashingStream : CountingStream { private Stream innerStream; private HashAlgorithm hashAlgorithm; public HashingStream(Stream innerStream, Func hashAlgorithmFactory) { this.innerStream = innerStream; hashAlgorithm = hashAlgorithmFactory(); } public override void Write(byte[] buffer, int offset, int count) { base.Write(buffer, offset, count); innerStream.Write(buffer, offset, count); hashAlgorithm.TransformBlock(buffer, offset, count, null, 0); } public override void Flush() { innerStream.Flush(); } public byte[] FinalizeAndGetHash() { hashAlgorithm.TransformFinalBlock(new byte[0], 0, 0); return hashAlgorithm.Hash; } }