2023-06-21 12:46:23 -04:00

117 lines
2.9 KiB
C#

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);
}
}
}