using System; using System.IO; using Org.BouncyCastle.Crypto; namespace Org.BouncyCastle.Crypto.IO { public class DigestStream : Stream { internal Stream stream; internal IDigest inDigest; internal IDigest outDigest; public DigestStream( Stream stream, IDigest readDigest, IDigest writeDigest) { this.stream = stream; this.inDigest = readDigest; this.outDigest = writeDigest; } public IDigest ReadDigest() { return inDigest; } public IDigest WriteDigest() { return outDigest; } public override int ReadByte() { int b = stream.ReadByte(); if (inDigest != null) { if (b >= 0) { inDigest.Update((byte)b); } } return b; } public override int Read(byte[] buffer, int offset, int count) { int n = stream.Read(buffer, offset, count); if (inDigest != null) { if (n > 0) { inDigest.BlockUpdate(buffer, offset, n); } } return n; } public override void Write( byte[] buffer, int offset, int count) { if (outDigest != null) { if (count > 0) { outDigest.BlockUpdate(buffer, offset, count); } } stream.Write(buffer, offset, count); } public override void WriteByte(byte value) { if (outDigest != null) { outDigest.Update(value); } stream.WriteByte(value); } public override bool CanRead { get { return stream.CanRead && (inDigest != null); } } public override bool CanWrite { get { return stream.CanWrite && (outDigest != null); } } public override bool CanSeek { get { return stream.CanSeek; } } public override long Length { get { return stream.Length; } } public override long Position { get { return stream.Position; } set { stream.Position = value; } } public override void Close() { stream.Close(); } public override void Flush() { stream.Flush(); } public override long Seek( long offset, SeekOrigin origin) { return stream.Seek(offset,origin); } public override void SetLength(long value) { stream.SetLength(value); } } }