util/csharp/core/Streams/VerifyStream.cs (91 lines of code) (raw):

using System; using System.Collections.Generic; using System.IO; using System.Security.Cryptography; using AlibabaCloud.OSSUtil.Utils; namespace AlibabaCloud.OSSUtil.Streams { public class VerifyStream : Stream { private Stream _innerStream; private Dictionary<string, string> _ref; private Crc64 crc64 = new Crc64(); private MD5 md5 = new MD5CryptoServiceProvider(); public VerifyStream(Stream stream, Dictionary<string, string> dict) { _innerStream = stream; _ref = dict; } public override bool CanRead { get { return _innerStream.CanRead; } } public override bool CanSeek { get { return _innerStream.CanSeek; } } public override bool CanWrite { get { return _innerStream.CanWrite; } } public override long Length { get { return _innerStream.Length; } } public override long Position { get { return _innerStream.Position; } set { _innerStream.Position = value; } } public override int Read(byte[] buffer, int offset, int count) { int index = _innerStream.Read(buffer, offset, count); if (index > 0) { crc64.Compute(buffer, 0, index); md5.TransformBlock(buffer, offset, index, buffer, 0); } else { md5.TransformFinalBlock(buffer, offset, 0); _ref["md5"] = Convert.ToBase64String(md5.Hash); _ref["crc"] = crc64.CrcValue.ToSafeString(); } return index; } public override long Seek(long offset, SeekOrigin origin) { return _innerStream.Seek(offset, origin); } public override void Flush() { _innerStream.Flush(); } public override void Write(byte[] buffer, int offset, int count) { throw new NotImplementedException(); } public override void SetLength(long value) { throw new NotImplementedException(); } } }