From 98b3ce6512812cd1d91c60ca0e69d69c32838d8e Mon Sep 17 00:00:00 2001 From: Peter Dettman Date: Mon, 23 May 2022 22:44:57 +0700 Subject: Work on Stream classes - consistent naming, ordering - CanRead/Seek/Write fixes - argument validation - some cases of blocking zero-byte Read calls --- crypto/bzip2/src/CBZip2InputStream.cs | 84 ++--- crypto/bzip2/src/CBZip2OutputStream.cs | 60 +--- crypto/src/asn1/BEROctetStringGenerator.cs | 47 +-- crypto/src/asn1/ConstructedBitStream.cs | 10 +- crypto/src/asn1/ConstructedOctetStream.cs | 10 +- crypto/src/bcpg/ArmoredInputStream.cs | 66 ++-- crypto/src/bcpg/ArmoredOutputStream.cs | 23 +- crypto/src/bcpg/BcpgInputStream.cs | 28 +- crypto/src/bcpg/BcpgOutputStream.cs | 75 ++--- .../src/cms/CMSAuthenticatedDataStreamGenerator.cs | 18 +- crypto/src/cms/CMSCompressedDataStreamGenerator.cs | 14 +- crypto/src/cms/CMSEnvelopedDataStreamGenerator.cs | 14 +- crypto/src/cms/CMSSignedDataStreamGenerator.cs | 20 +- crypto/src/crypto/io/CipherStream.cs | 357 ++++++++++----------- crypto/src/crypto/io/DigestSink.cs | 16 +- crypto/src/crypto/io/DigestStream.cs | 236 +++++++------- crypto/src/crypto/io/MacSink.cs | 16 +- crypto/src/crypto/io/MacStream.cs | 229 ++++++------- crypto/src/crypto/io/SignerSink.cs | 16 +- crypto/src/crypto/io/SignerStream.cs | 230 ++++++------- crypto/src/openpgp/PgpEncryptedData.cs | 54 ++-- crypto/src/tls/ByteQueueInputStream.cs | 16 +- crypto/src/tls/ByteQueueOutputStream.cs | 10 +- crypto/src/tls/TlsStream.cs | 10 +- crypto/src/tls/crypto/TlsHashSink.cs | 16 +- crypto/src/tls/crypto/TlsMacSink.cs | 16 +- crypto/src/util/io/BaseInputStream.cs | 43 +-- crypto/src/util/io/BaseOutputStream.cs | 53 +-- crypto/src/util/io/NullOutputStream.cs | 7 +- crypto/src/util/io/PushbackStream.cs | 24 +- crypto/src/util/io/TeeInputStream.cs | 6 +- crypto/src/util/io/TeeOutputStream.cs | 6 +- crypto/src/util/zlib/ZInputStream.cs | 246 +++++++------- crypto/src/util/zlib/ZOutputStream.cs | 272 ++++++++-------- 34 files changed, 1054 insertions(+), 1294 deletions(-) (limited to 'crypto') diff --git a/crypto/bzip2/src/CBZip2InputStream.cs b/crypto/bzip2/src/CBZip2InputStream.cs index 82f397d38..7144b6d06 100644 --- a/crypto/bzip2/src/CBZip2InputStream.cs +++ b/crypto/bzip2/src/CBZip2InputStream.cs @@ -26,6 +26,7 @@ using System; using System.IO; using Org.BouncyCastle.Utilities; +using Org.BouncyCastle.Utilities.IO; namespace Org.BouncyCastle.Apache.Bzip2 { @@ -38,7 +39,8 @@ namespace Org.BouncyCastle.Apache.Bzip2 * NB: note this class has been modified to read the leading BZ from the * start of the BZIP2 stream to make it compatible with other PGP programs. */ - public class CBZip2InputStream : Stream + public class CBZip2InputStream + : BaseInputStream { private static void Cadvise() { //System.out.Println("CRC Error"); @@ -172,6 +174,27 @@ namespace Org.BouncyCastle.Apache.Bzip2 return a; } + public override int Read(byte[] buffer, int offset, int count) + { + Streams.ValidateBufferArguments(buffer, offset, count); + + /* + * TODO The base class implementation allows to return partial data if/when ReadByte throws. That would be + * be preferable here too (so don't override), but it would require that exceptions cause this instance to + * permanently fail, and that needs review. + */ + int pos = 0; + while (pos < count) + { + int b = ReadByte(); + if (b < 0) + break; + + buffer[offset + pos++] = (byte)b; + } + return pos; + } + public override int ReadByte() { if (streamEnd) @@ -911,62 +934,5 @@ namespace Org.BouncyCastle.Apache.Bzip2 ll8 = new char[n]; tt = new int[n]; } - - public override void Flush() { - } - - public override int Read(byte[] buffer, int offset, int count) { - int c = -1; - int k; - for (k = 0; k < count; ++k) { - c = ReadByte(); - if (c == -1) - break; - buffer[k + offset] = (byte)c; - } - return k; - } - - public override long Seek(long offset, SeekOrigin origin) { - return 0; - } - - public override void SetLength(long value) { - } - - public override void Write(byte[] buffer, int offset, int count) { - } - - public override bool CanRead { - get { - return true; - } - } - - public override bool CanSeek { - get { - return false; - } - } - - public override bool CanWrite { - get { - return false; - } - } - - public override long Length { - get { - return 0; - } - } - - public override long Position { - get { - return 0; - } - set { - } - } } -} \ No newline at end of file +} diff --git a/crypto/bzip2/src/CBZip2OutputStream.cs b/crypto/bzip2/src/CBZip2OutputStream.cs index e81f6ffc1..f56ca29b2 100644 --- a/crypto/bzip2/src/CBZip2OutputStream.cs +++ b/crypto/bzip2/src/CBZip2OutputStream.cs @@ -27,6 +27,7 @@ using System.Collections; using System.IO; using Org.BouncyCastle.Utilities; +using Org.BouncyCastle.Utilities.IO; namespace Org.BouncyCastle.Apache.Bzip2 { @@ -40,7 +41,8 @@ namespace Org.BouncyCastle.Apache.Bzip2 * NB: note this class has been modified to add a leading BZ to the * start of the BZIP2 stream to make it compatible with other PGP programs. */ - public class CBZip2OutputStream : Stream + public class CBZip2OutputStream + : BaseOutputStream { protected const int SETMASK = 1 << 21; protected const int CLEARMASK = ~SETMASK; @@ -314,9 +316,9 @@ namespace Org.BouncyCastle.Apache.Bzip2 * modified by Oliver Merkel, 010128 * */ - public override void WriteByte(byte b) + public override void WriteByte(byte value) { - if (currentByte == b) + if (currentByte == value) { runLength++; if (runLength > 254) @@ -328,14 +330,14 @@ namespace Org.BouncyCastle.Apache.Bzip2 } else if (currentByte == -1) { - currentByte = b; + currentByte = value; runLength++; } else { WriteRun(); runLength = 1; - currentByte = b; + currentByte = value; } } @@ -1694,53 +1696,5 @@ namespace Org.BouncyCastle.Apache.Bzip2 nMTF = wr; } - - public override int Read(byte[] buffer, int offset, int count) - { - return 0; - } - - public override long Seek(long offset, SeekOrigin origin) - { - return 0; - } - - public override void SetLength(long value) - { - } - - public override void Write(byte[] buffer, int offset, int count) - { - for (int k = 0; k < count; ++k) - { - WriteByte(buffer[k + offset]); - } - } - - public override bool CanRead - { - get { return false; } - } - - public override bool CanSeek - { - get { return false; } - } - - public override bool CanWrite - { - get { return true; } - } - - public override long Length - { - get { return 0; } - } - - public override long Position - { - get { return 0; } - set {} - } } } diff --git a/crypto/src/asn1/BEROctetStringGenerator.cs b/crypto/src/asn1/BEROctetStringGenerator.cs index de0a6c0b8..bed40b566 100644 --- a/crypto/src/asn1/BEROctetStringGenerator.cs +++ b/crypto/src/asn1/BEROctetStringGenerator.cs @@ -60,48 +60,49 @@ namespace Org.BouncyCastle.Asn1 _derOut = Asn1OutputStream.Create(_gen.Out, Asn1Encodable.Der); } - public override void WriteByte( - byte b) + public override void Write(byte[] buffer, int offset, int count) { - _buf[_off++] = b; + Streams.ValidateBufferArguments(buffer, offset, count); - if (_off == _buf.Length) - { - DerOctetString.Encode(_derOut, _buf, 0, _off); - _off = 0; - } - } - - public override void Write(byte[] b, int off, int len) - { int bufLen = _buf.Length; int available = bufLen - _off; - if (len < available) + if (count < available) { - Array.Copy(b, off, _buf, _off, len); - _off += len; + Array.Copy(buffer, offset, _buf, _off, count); + _off += count; return; } - int count = 0; + int pos = 0; if (_off > 0) { - Array.Copy(b, off, _buf, _off, available); - count += available; + Array.Copy(buffer, offset, _buf, _off, available); + pos += available; DerOctetString.Encode(_derOut, _buf, 0, bufLen); } int remaining; - while ((remaining = len - count) >= bufLen) + while ((remaining = count - pos) >= bufLen) { - DerOctetString.Encode(_derOut, b, off + count, bufLen); - count += bufLen; + DerOctetString.Encode(_derOut, buffer, offset + pos, bufLen); + pos += bufLen; } - Array.Copy(b, off + count, _buf, 0, remaining); + Array.Copy(buffer, offset + pos, _buf, 0, remaining); this._off = remaining; } + public override void WriteByte(byte value) + { + _buf[_off++] = value; + + if (_off == _buf.Length) + { + DerOctetString.Encode(_derOut, _buf, 0, _off); + _off = 0; + } + } + #if PORTABLE protected override void Dispose(bool disposing) { @@ -119,7 +120,7 @@ namespace Org.BouncyCastle.Asn1 base.Dispose(disposing); } #else - public override void Close() + public override void Close() { if (_off != 0) { diff --git a/crypto/src/asn1/ConstructedBitStream.cs b/crypto/src/asn1/ConstructedBitStream.cs index 7c9e7c9e4..49f54fc1b 100644 --- a/crypto/src/asn1/ConstructedBitStream.cs +++ b/crypto/src/asn1/ConstructedBitStream.cs @@ -29,9 +29,11 @@ namespace Org.BouncyCastle.Asn1 get { return m_padBits; } } - public override int Read(byte[] buf, int off, int len) + public override int Read(byte[] buffer, int offset, int count) { - if (len < 1) + Streams.ValidateBufferArguments(buffer, offset, count); + + if (count < 1) return 0; if (m_currentStream == null) @@ -51,13 +53,13 @@ namespace Org.BouncyCastle.Asn1 for (;;) { - int numRead = m_currentStream.Read(buf, off + totalRead, len - totalRead); + int numRead = m_currentStream.Read(buffer, offset + totalRead, count - totalRead); if (numRead > 0) { totalRead += numRead; - if (totalRead == len) + if (totalRead == count) return totalRead; } else diff --git a/crypto/src/asn1/ConstructedOctetStream.cs b/crypto/src/asn1/ConstructedOctetStream.cs index 5541939b6..12aa14e74 100644 --- a/crypto/src/asn1/ConstructedOctetStream.cs +++ b/crypto/src/asn1/ConstructedOctetStream.cs @@ -18,9 +18,11 @@ namespace Org.BouncyCastle.Asn1 m_parser = parser; } - public override int Read(byte[] buf, int off, int len) + public override int Read(byte[] buffer, int offset, int count) { - if (len < 1) + Streams.ValidateBufferArguments(buffer, offset, count); + + if (count < 1) return 0; if (m_currentStream == null) @@ -40,13 +42,13 @@ namespace Org.BouncyCastle.Asn1 for (;;) { - int numRead = m_currentStream.Read(buf, off + totalRead, len - totalRead); + int numRead = m_currentStream.Read(buffer, offset + totalRead, count - totalRead); if (numRead > 0) { totalRead += numRead; - if (totalRead == len) + if (totalRead == count) return totalRead; } else diff --git a/crypto/src/bcpg/ArmoredInputStream.cs b/crypto/src/bcpg/ArmoredInputStream.cs index 2895c379a..cb5c2f91f 100644 --- a/crypto/src/bcpg/ArmoredInputStream.cs +++ b/crypto/src/bcpg/ArmoredInputStream.cs @@ -311,6 +311,26 @@ namespace Org.BouncyCastle.Bcpg return c; } + public override int Read(byte[] buffer, int offset, int count) + { + Streams.ValidateBufferArguments(buffer, offset, count); + + /* + * TODO Currently can't return partial data when exception thrown (breaking test case), so we don't inherit + * the base class implementation. Probably the reason is that throws don't mark this instance as 'failed'. + */ + int pos = 0; + while (pos < count) + { + int b = ReadByte(); + if (b < 0) + break; + + buffer[offset + pos++] = (byte)b; + } + return pos; + } + public override int ReadByte() { if (start) @@ -463,52 +483,6 @@ namespace Org.BouncyCastle.Bcpg return c; } - /** - * Reads up to len bytes of data from the input stream into - * an array of bytes. An attempt is made to read as many as - * len bytes, but a smaller number may be read. - * The number of bytes actually read is returned as an integer. - * - * The first byte read is stored into element b[off], the - * next one into b[off+1], and so on. The number of bytes read - * is, at most, equal to len. - * - * NOTE: We need to override the custom behavior of Java's {@link InputStream#read(byte[], int, int)}, - * as the upstream method silently swallows {@link IOException IOExceptions}. - * This would cause CRC checksum errors to go unnoticed. - * - * @see Related BC bug report - * @param b byte array - * @param off offset at which we start writing data to the array - * @param len number of bytes we write into the array - * @return total number of bytes read into the buffer - * - * @throws IOException if an exception happens AT ANY POINT - */ - public override int Read(byte[] b, int off, int len) - { - CheckIndexSize(b.Length, off, len); - - int pos = 0; - while (pos < len) - { - int c = ReadByte(); - if (c < 0) - break; - - b[off + pos++] = (byte)c; - } - return pos; - } - - private void CheckIndexSize(int size, int off, int len) - { - if (off < 0 || len < 0) - throw new IndexOutOfRangeException("Offset and length cannot be negative."); - if (off > size - len) - throw new IndexOutOfRangeException("Invalid offset and length."); - } - #if PORTABLE protected override void Dispose(bool disposing) { diff --git a/crypto/src/bcpg/ArmoredOutputStream.cs b/crypto/src/bcpg/ArmoredOutputStream.cs index 0df5d1141..97bcbde51 100644 --- a/crypto/src/bcpg/ArmoredOutputStream.cs +++ b/crypto/src/bcpg/ArmoredOutputStream.cs @@ -239,45 +239,44 @@ namespace Org.BouncyCastle.Bcpg clearText = false; } - public override void WriteByte( - byte b) + public override void WriteByte(byte value) { if (clearText) { - outStream.WriteByte(b); + outStream.WriteByte(value); if (newLine) { - if (!(b == '\n' && lastb == '\r')) + if (!(value == '\n' && lastb == '\r')) { newLine = false; } - if (b == '-') + if (value == '-') { outStream.WriteByte((byte)' '); outStream.WriteByte((byte)'-'); // dash escape } } - if (b == '\r' || (b == '\n' && lastb != '\r')) + if (value == '\r' || (value == '\n' && lastb != '\r')) { newLine = true; } - lastb = b; + lastb = value; return; } if (start) { - bool newPacket = (b & 0x40) != 0; + bool newPacket = (value & 0x40) != 0; int tag; if (newPacket) { - tag = b & 0x3f; + tag = value & 0x3f; } else { - tag = (b & 0x3f) >> 2; + tag = (value & 0x3f) >> 2; } switch ((PacketTag)tag) @@ -334,8 +333,8 @@ namespace Org.BouncyCastle.Bcpg } } - crc.Update(b); - buf[bufPtr++] = b & 0xff; + crc.Update(value); + buf[bufPtr++] = value & 0xff; } /** diff --git a/crypto/src/bcpg/BcpgInputStream.cs b/crypto/src/bcpg/BcpgInputStream.cs index 5efef193a..87c3f3812 100644 --- a/crypto/src/bcpg/BcpgInputStream.cs +++ b/crypto/src/bcpg/BcpgInputStream.cs @@ -1,7 +1,6 @@ using System; using System.IO; -using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Utilities; using Org.BouncyCastle.Utilities.IO; @@ -43,33 +42,22 @@ namespace Org.BouncyCastle.Bcpg return m_in.ReadByte(); } - public override int Read( - byte[] buffer, - int offset, - int count) + public override int Read(byte[] buffer, int offset, int count) { - // Strangely, when count == 0, we should still attempt to read a byte -// if (count == 0) -// return 0; - if (!next) return m_in.Read(buffer, offset, count); - // We have next byte waiting, so return it + Streams.ValidateBufferArguments(buffer, offset, count); if (nextB < 0) - return 0; // EndOfStream - - if (buffer == null) - throw new ArgumentNullException("buffer"); - - buffer[offset] = (byte) nextB; - next = false; + return 0; - return 1; + buffer[offset] = (byte)nextB; + next = false; + return 1; } - public byte[] ReadAll() + public byte[] ReadAll() { return Streams.ReadAll(this); } @@ -323,6 +311,8 @@ namespace Org.BouncyCastle.Bcpg public override int Read(byte[] buffer, int offset, int count) { + Streams.ValidateBufferArguments(buffer, offset, count); + do { if (dataLength != 0) diff --git a/crypto/src/bcpg/BcpgOutputStream.cs b/crypto/src/bcpg/BcpgOutputStream.cs index 738c28211..fbce0820e 100644 --- a/crypto/src/bcpg/BcpgOutputStream.cs +++ b/crypto/src/bcpg/BcpgOutputStream.cs @@ -215,8 +215,7 @@ namespace Org.BouncyCastle.Bcpg } } - private void PartialFlush( - bool isLast) + private void PartialFlush(bool isLast) { if (isLast) { @@ -232,79 +231,75 @@ namespace Org.BouncyCastle.Bcpg partialOffset = 0; } - private void WritePartial( - byte b) + private void PartialWrite(byte[] buffer, int offset, int count) { - if (partialOffset == partialBufferLength) - { - PartialFlush(false); - } - - partialBuffer[partialOffset++] = b; - } + Streams.ValidateBufferArguments(buffer, offset, count); - private void WritePartial( - byte[] buffer, - int off, - int len) - { if (partialOffset == partialBufferLength) { PartialFlush(false); } - if (len <= (partialBufferLength - partialOffset)) + if (count <= (partialBufferLength - partialOffset)) { - Array.Copy(buffer, off, partialBuffer, partialOffset, len); - partialOffset += len; + Array.Copy(buffer, offset, partialBuffer, partialOffset, count); + partialOffset += count; } else { int diff = partialBufferLength - partialOffset; - Array.Copy(buffer, off, partialBuffer, partialOffset, diff); - off += diff; - len -= diff; + Array.Copy(buffer, offset, partialBuffer, partialOffset, diff); + offset += diff; + count -= diff; PartialFlush(false); - while (len > partialBufferLength) + while (count > partialBufferLength) { - Array.Copy(buffer, off, partialBuffer, 0, partialBufferLength); - off += partialBufferLength; - len -= partialBufferLength; + Array.Copy(buffer, offset, partialBuffer, 0, partialBufferLength); + offset += partialBufferLength; + count -= partialBufferLength; PartialFlush(false); } - Array.Copy(buffer, off, partialBuffer, 0, len); - partialOffset += len; + Array.Copy(buffer, offset, partialBuffer, 0, count); + partialOffset += count; } } - public override void WriteByte( - byte value) + + private void PartialWriteByte(byte value) + { + if (partialOffset == partialBufferLength) + { + PartialFlush(false); + } + + partialBuffer[partialOffset++] = value; + } + + public override void Write(byte[] buffer, int offset, int count) { if (partialBuffer != null) { - WritePartial(value); + PartialWrite(buffer, offset, count); } else { - outStr.WriteByte(value); + outStr.Write(buffer, offset, count); } } - public override void Write( - byte[] buffer, - int offset, - int count) + + public override void WriteByte(byte value) { if (partialBuffer != null) { - WritePartial(buffer, offset, count); + PartialWriteByte(value); } else { - outStr.Write(buffer, offset, count); + outStr.WriteByte(value); } } - // Additional helper methods to write primitive types - internal virtual void WriteShort( + // Additional helper methods to write primitive types + internal virtual void WriteShort( short n) { this.Write( diff --git a/crypto/src/cms/CMSAuthenticatedDataStreamGenerator.cs b/crypto/src/cms/CMSAuthenticatedDataStreamGenerator.cs index b77758d1f..4ac2b34c9 100644 --- a/crypto/src/cms/CMSAuthenticatedDataStreamGenerator.cs +++ b/crypto/src/cms/CMSAuthenticatedDataStreamGenerator.cs @@ -238,18 +238,14 @@ namespace Org.BouncyCastle.Cms this.eiGen = eiGen; } - public override void WriteByte( - byte b) - { - macStream.WriteByte(b); - } + public override void Write(byte[] buffer, int offset, int count) + { + macStream.Write(buffer, offset, count); + } - public override void Write( - byte[] bytes, - int off, - int len) + public override void WriteByte(byte value) { - macStream.Write(bytes, off, len); + macStream.WriteByte(value); } #if PORTABLE @@ -274,7 +270,7 @@ namespace Org.BouncyCastle.Cms base.Dispose(disposing); } #else - public override void Close() + public override void Close() { Platform.Dispose(macStream); diff --git a/crypto/src/cms/CMSCompressedDataStreamGenerator.cs b/crypto/src/cms/CMSCompressedDataStreamGenerator.cs index 0cb1bb641..1a9513ce6 100644 --- a/crypto/src/cms/CMSCompressedDataStreamGenerator.cs +++ b/crypto/src/cms/CMSCompressedDataStreamGenerator.cs @@ -111,18 +111,14 @@ namespace Org.BouncyCastle.Cms _eiGen = eiGen; } - public override void WriteByte( - byte b) + public override void Write(byte[] buffer, int offset, int count) { - _out.WriteByte(b); + _out.Write(buffer, offset, count); } - public override void Write( - byte[] bytes, - int off, - int len) + public override void WriteByte(byte value) { - _out.Write(bytes, off, len); + _out.WriteByte(value); } #if PORTABLE @@ -141,7 +137,7 @@ namespace Org.BouncyCastle.Cms base.Dispose(disposing); } #else - public override void Close() + public override void Close() { Platform.Dispose(_out); diff --git a/crypto/src/cms/CMSEnvelopedDataStreamGenerator.cs b/crypto/src/cms/CMSEnvelopedDataStreamGenerator.cs index e0822aa8b..c08b30787 100644 --- a/crypto/src/cms/CMSEnvelopedDataStreamGenerator.cs +++ b/crypto/src/cms/CMSEnvelopedDataStreamGenerator.cs @@ -241,18 +241,14 @@ namespace Org.BouncyCastle.Cms _eiGen = eiGen; } - public override void WriteByte( - byte b) + public override void Write(byte[] buffer, int offset, int count) { - _out.WriteByte(b); + _out.Write(buffer, offset, count); } - public override void Write( - byte[] bytes, - int off, - int len) + public override void WriteByte(byte value) { - _out.Write(bytes, off, len); + _out.WriteByte(value); } #if PORTABLE @@ -281,7 +277,7 @@ namespace Org.BouncyCastle.Cms base.Dispose(disposing); } #else - public override void Close() + public override void Close() { Platform.Dispose(_out); diff --git a/crypto/src/cms/CMSSignedDataStreamGenerator.cs b/crypto/src/cms/CMSSignedDataStreamGenerator.cs index e32f95d42..a6835f279 100644 --- a/crypto/src/cms/CMSSignedDataStreamGenerator.cs +++ b/crypto/src/cms/CMSSignedDataStreamGenerator.cs @@ -795,19 +795,15 @@ namespace Org.BouncyCastle.Cms _eiGen = eiGen; } - public override void WriteByte( - byte b) - { - _out.WriteByte(b); - } + public override void Write(byte[] buffer, int offset, int count) + { + _out.Write(buffer, offset, count); + } - public override void Write( - byte[] bytes, - int off, - int len) - { - _out.Write(bytes, off, len); - } + public override void WriteByte(byte value) + { + _out.WriteByte(value); + } #if PORTABLE protected override void Dispose(bool disposing) diff --git a/crypto/src/crypto/io/CipherStream.cs b/crypto/src/crypto/io/CipherStream.cs index b5e683075..06a3d392c 100644 --- a/crypto/src/crypto/io/CipherStream.cs +++ b/crypto/src/crypto/io/CipherStream.cs @@ -3,202 +3,58 @@ using System.Diagnostics; using System.IO; using Org.BouncyCastle.Utilities; +using Org.BouncyCastle.Utilities.IO; namespace Org.BouncyCastle.Crypto.IO { public class CipherStream - : Stream + : Stream { internal Stream stream; internal IBufferedCipher inCipher, outCipher; private byte[] mInBuf; - private int mInPos; - private bool inStreamEnded; + private int mInPos; + private bool inStreamEnded; - public CipherStream( - Stream stream, - IBufferedCipher readCipher, - IBufferedCipher writeCipher) + public CipherStream(Stream stream, IBufferedCipher readCipher, IBufferedCipher writeCipher) { this.stream = stream; - if (readCipher != null) - { - this.inCipher = readCipher; - mInBuf = null; - } - - if (writeCipher != null) - { - this.outCipher = writeCipher; - } - } - - public IBufferedCipher ReadCipher - { - get { return inCipher; } - } - - public IBufferedCipher WriteCipher - { - get { return outCipher; } - } - - public override int ReadByte() - { - if (inCipher == null) - return stream.ReadByte(); - - if (mInBuf == null || mInPos >= mInBuf.Length) - { - if (!FillInBuf()) - return -1; - } - - return mInBuf[mInPos++]; - } - - public override int Read( - byte[] buffer, - int offset, - int count) - { - if (inCipher == null) - return stream.Read(buffer, offset, count); - - int num = 0; - while (num < count) - { - if (mInBuf == null || mInPos >= mInBuf.Length) - { - if (!FillInBuf()) - break; - } - - int numToCopy = System.Math.Min(count - num, mInBuf.Length - mInPos); - Array.Copy(mInBuf, mInPos, buffer, offset + num, numToCopy); - mInPos += numToCopy; - num += numToCopy; - } - - return num; - } - - private bool FillInBuf() - { - if (inStreamEnded) - return false; - - mInPos = 0; - - do - { - mInBuf = ReadAndProcessBlock(); - } - while (!inStreamEnded && mInBuf == null); - - return mInBuf != null; - } - - private byte[] ReadAndProcessBlock() - { - int blockSize = inCipher.GetBlockSize(); - int readSize = (blockSize == 0) ? 256 : blockSize; - - byte[] block = new byte[readSize]; - int numRead = 0; - do - { - int count = stream.Read(block, numRead, block.Length - numRead); - if (count < 1) - { - inStreamEnded = true; - break; - } - numRead += count; - } - while (numRead < block.Length); - - Debug.Assert(inStreamEnded || numRead == block.Length); - - byte[] bytes = inStreamEnded - ? inCipher.DoFinal(block, 0, numRead) - : inCipher.ProcessBytes(block); - - if (bytes != null && bytes.Length == 0) - { - bytes = null; - } - - return bytes; - } - - public override void Write( - byte[] buffer, - int offset, - int count) - { - Debug.Assert(buffer != null); - Debug.Assert(0 <= offset && offset <= buffer.Length); - Debug.Assert(count >= 0); - - int end = offset + count; - - Debug.Assert(0 <= end && end <= buffer.Length); - - if (outCipher == null) + if (readCipher != null) { - stream.Write(buffer, offset, count); - return; + this.inCipher = readCipher; + mInBuf = null; } - byte[] data = outCipher.ProcessBytes(buffer, offset, count); - if (data != null) - { - stream.Write(data, 0, data.Length); - } - } - - public override void WriteByte( - byte b) - { - if (outCipher == null) + if (writeCipher != null) { - stream.WriteByte(b); - return; + this.outCipher = writeCipher; } + } - byte[] data = outCipher.ProcessByte(b); - if (data != null) - { - stream.Write(data, 0, data.Length); - } - } + public IBufferedCipher ReadCipher + { + get { return inCipher; } + } - public override bool CanRead + public IBufferedCipher WriteCipher { - get { return stream.CanRead && (inCipher != null); } + get { return outCipher; } } - public override bool CanWrite + public override bool CanRead { - get { return stream.CanWrite && (outCipher != null); } + get { return stream.CanRead; } } - public override bool CanSeek + public sealed override bool CanSeek { get { return false; } } - public sealed override long Length - { - get { throw new NotSupportedException(); } - } - - public sealed override long Position + public override bool CanWrite { - get { throw new NotSupportedException(); } - set { throw new NotSupportedException(); } + get { return stream.CanWrite; } } #if PORTABLE @@ -219,12 +75,12 @@ namespace Org.BouncyCastle.Crypto.IO #else public override void Close() { - if (outCipher != null) - { - byte[] data = outCipher.DoFinal(); - stream.Write(data, 0, data.Length); - stream.Flush(); - } + if (outCipher != null) + { + byte[] data = outCipher.DoFinal(); + stream.Write(data, 0, data.Length); + stream.Flush(); + } Platform.Dispose(stream); base.Close(); } @@ -232,21 +88,152 @@ namespace Org.BouncyCastle.Crypto.IO public override void Flush() { - // Note: outCipher.DoFinal is only called during Close() - stream.Flush(); + // Note: outCipher.DoFinal is only called during Close() + stream.Flush(); + } + + public sealed override long Length + { + get { throw new NotSupportedException(); } + } + + public sealed override long Position + { + get { throw new NotSupportedException(); } + set { throw new NotSupportedException(); } + } + + public override int Read(byte[] buffer, int offset, int count) + { + if (inCipher == null) + return stream.Read(buffer, offset, count); + + Streams.ValidateBufferArguments(buffer, offset, count); + + int num = 0; + while (num < count) + { + if (mInBuf == null || mInPos >= mInBuf.Length) + { + if (!FillInBuf()) + break; + } + + int numToCopy = System.Math.Min(count - num, mInBuf.Length - mInPos); + Array.Copy(mInBuf, mInPos, buffer, offset + num, numToCopy); + mInPos += numToCopy; + num += numToCopy; + } + + return num; + } + + public override int ReadByte() + { + if (inCipher == null) + return stream.ReadByte(); + + if (mInBuf == null || mInPos >= mInBuf.Length) + { + if (!FillInBuf()) + return -1; + } + + return mInBuf[mInPos++]; + } + + public sealed override long Seek(long offset, SeekOrigin origin) + { + throw new NotSupportedException(); + } + + public sealed override void SetLength(long length) + { + throw new NotSupportedException(); + } + + public override void Write(byte[] buffer, int offset, int count) + { + if (outCipher == null) + { + stream.Write(buffer, offset, count); + return; + } + + Streams.ValidateBufferArguments(buffer, offset, count); + + if (count > 0) + { + byte[] data = outCipher.ProcessBytes(buffer, offset, count); + if (data != null) + { + stream.Write(data, 0, data.Length); + } + } + } + + public override void WriteByte(byte value) + { + if (outCipher == null) + { + stream.WriteByte(value); + return; + } + + byte[] data = outCipher.ProcessByte(value); + if (data != null) + { + stream.Write(data, 0, data.Length); + } + } + + private bool FillInBuf() + { + if (inStreamEnded) + return false; + + mInPos = 0; + + do + { + mInBuf = ReadAndProcessBlock(); + } + while (!inStreamEnded && mInBuf == null); + + return mInBuf != null; } - public sealed override long Seek( - long offset, - SeekOrigin origin) - { - throw new NotSupportedException(); - } + private byte[] ReadAndProcessBlock() + { + int blockSize = inCipher.GetBlockSize(); + int readSize = (blockSize == 0) ? 256 : blockSize; + + byte[] block = new byte[readSize]; + int numRead = 0; + do + { + int count = stream.Read(block, numRead, block.Length - numRead); + if (count < 1) + { + inStreamEnded = true; + break; + } + numRead += count; + } + while (numRead < block.Length); - public sealed override void SetLength( - long length) - { - throw new NotSupportedException(); - } + Debug.Assert(inStreamEnded || numRead == block.Length); + + byte[] bytes = inStreamEnded + ? inCipher.DoFinal(block, 0, numRead) + : inCipher.ProcessBytes(block); + + if (bytes != null && bytes.Length == 0) + { + bytes = null; + } + + return bytes; + } } } diff --git a/crypto/src/crypto/io/DigestSink.cs b/crypto/src/crypto/io/DigestSink.cs index 98307e5f7..c2a168bfe 100644 --- a/crypto/src/crypto/io/DigestSink.cs +++ b/crypto/src/crypto/io/DigestSink.cs @@ -19,17 +19,19 @@ namespace Org.BouncyCastle.Crypto.IO get { return mDigest; } } - public override void WriteByte(byte b) + public override void Write(byte[] buffer, int offset, int count) { - mDigest.Update(b); - } + Streams.ValidateBufferArguments(buffer, offset, count); - public override void Write(byte[] buf, int off, int len) - { - if (len > 0) + if (count > 0) { - mDigest.BlockUpdate(buf, off, len); + mDigest.BlockUpdate(buffer, offset, count); } } + + public override void WriteByte(byte value) + { + mDigest.Update(value); + } } } diff --git a/crypto/src/crypto/io/DigestStream.cs b/crypto/src/crypto/io/DigestStream.cs index dce875792..387f42766 100644 --- a/crypto/src/crypto/io/DigestStream.cs +++ b/crypto/src/crypto/io/DigestStream.cs @@ -5,112 +5,44 @@ using Org.BouncyCastle.Utilities; namespace Org.BouncyCastle.Crypto.IO { - public class DigestStream - : Stream - { - protected readonly Stream stream; - protected readonly IDigest inDigest; - protected readonly IDigest outDigest; - - public DigestStream( - Stream stream, - IDigest readDigest, - IDigest writeDigest) - { - this.stream = stream; - this.inDigest = readDigest; - this.outDigest = writeDigest; - } - - public virtual IDigest ReadDigest() - { - return inDigest; - } - - public virtual IDigest WriteDigest() - { - return outDigest; - } - - 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 int ReadByte() - { - int b = stream.ReadByte(); - if (inDigest != null) - { - if (b >= 0) - { - inDigest.Update((byte)b); - } - } - return b; - } - - 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 b) - { - if (outDigest != null) - { - outDigest.Update(b); - } - stream.WriteByte(b); - } - - public override bool CanRead - { - get { return stream.CanRead; } - } - - public override bool CanWrite - { - get { return stream.CanWrite; } - } - - 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 class DigestStream + : Stream + { + protected readonly Stream stream; + protected readonly IDigest inDigest; + protected readonly IDigest outDigest; + + public DigestStream(Stream stream, IDigest readDigest, IDigest writeDigest) + { + this.stream = stream; + this.inDigest = readDigest; + this.outDigest = writeDigest; + } + + public virtual IDigest ReadDigest() + { + return inDigest; + } + + public virtual IDigest WriteDigest() + { + return outDigest; + } + + public override bool CanRead + { + get { return stream.CanRead; } + } + + public sealed override bool CanSeek + { + get { return false; } + } + + public override bool CanWrite + { + get { return stream.CanWrite; } + } #if PORTABLE protected override void Dispose(bool disposing) @@ -122,30 +54,82 @@ namespace Org.BouncyCastle.Crypto.IO base.Dispose(disposing); } #else - public override void Close() - { + public override void Close() + { Platform.Dispose(stream); base.Close(); - } + } #endif public override void Flush() - { - stream.Flush(); - } - - public override long Seek( - long offset, - SeekOrigin origin) - { - return stream.Seek(offset, origin); - } - - public override void SetLength( - long length) - { - stream.SetLength(length); - } - } + { + stream.Flush(); + } + + public sealed override long Length + { + get { throw new NotSupportedException(); } + } + + public sealed override long Position + { + get { throw new NotSupportedException(); } + set { throw new NotSupportedException(); } + } + + public override int Read(byte[] buffer, int offset, int count) + { + int n = stream.Read(buffer, offset, count); + + if (inDigest != null && n > 0) + { + inDigest.BlockUpdate(buffer, offset, n); + } + + return n; + } + + public override int ReadByte() + { + int b = stream.ReadByte(); + + if (inDigest != null && b >= 0) + { + inDigest.Update((byte)b); + } + + return b; + } + + public sealed override long Seek(long offset, SeekOrigin origin) + { + throw new NotSupportedException(); + } + + public sealed override void SetLength(long length) + { + throw new NotSupportedException(); + } + + public override void Write(byte[] buffer, int offset, int count) + { + stream.Write(buffer, offset, count); + + if (outDigest != null && count > 0) + { + outDigest.BlockUpdate(buffer, offset, count); + } + } + + public override void WriteByte(byte value) + { + stream.WriteByte(value); + + if (outDigest != null) + { + outDigest.Update(value); + } + } + } } diff --git a/crypto/src/crypto/io/MacSink.cs b/crypto/src/crypto/io/MacSink.cs index c4fe7169a..aa72e9047 100644 --- a/crypto/src/crypto/io/MacSink.cs +++ b/crypto/src/crypto/io/MacSink.cs @@ -19,17 +19,19 @@ namespace Org.BouncyCastle.Crypto.IO get { return mMac; } } - public override void WriteByte(byte b) + public override void Write(byte[] buffer, int offset, int count) { - mMac.Update(b); - } + Streams.ValidateBufferArguments(buffer, offset, count); - public override void Write(byte[] buf, int off, int len) - { - if (len > 0) + if (count > 0) { - mMac.BlockUpdate(buf, off, len); + mMac.BlockUpdate(buffer, offset, count); } } + + public override void WriteByte(byte value) + { + mMac.Update(value); + } } } diff --git a/crypto/src/crypto/io/MacStream.cs b/crypto/src/crypto/io/MacStream.cs index d9b8323b5..c56e00d2c 100644 --- a/crypto/src/crypto/io/MacStream.cs +++ b/crypto/src/crypto/io/MacStream.cs @@ -5,111 +5,44 @@ using Org.BouncyCastle.Utilities; namespace Org.BouncyCastle.Crypto.IO { - public class MacStream - : Stream - { - protected readonly Stream stream; - protected readonly IMac inMac; - protected readonly IMac outMac; - - public MacStream( - Stream stream, - IMac readMac, - IMac writeMac) - { - this.stream = stream; - this.inMac = readMac; - this.outMac = writeMac; - } - - public virtual IMac ReadMac() - { - return inMac; - } - - public virtual IMac WriteMac() - { - return outMac; - } - - public override int Read( - byte[] buffer, - int offset, - int count) - { - int n = stream.Read(buffer, offset, count); - if (inMac != null) - { - if (n > 0) - { - inMac.BlockUpdate(buffer, offset, n); - } - } - return n; - } - - public override int ReadByte() - { - int b = stream.ReadByte(); - if (inMac != null) - { - if (b >= 0) - { - inMac.Update((byte)b); - } - } - return b; - } - - public override void Write( - byte[] buffer, - int offset, - int count) - { - if (outMac != null) - { - if (count > 0) - { - outMac.BlockUpdate(buffer, offset, count); - } - } - stream.Write(buffer, offset, count); - } - - public override void WriteByte(byte b) - { - if (outMac != null) - { - outMac.Update(b); - } - stream.WriteByte(b); - } - - public override bool CanRead - { - get { return stream.CanRead; } - } - - public override bool CanWrite - { - get { return stream.CanWrite; } - } - - 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 class MacStream + : Stream + { + protected readonly Stream stream; + protected readonly IMac inMac; + protected readonly IMac outMac; + + public MacStream(Stream stream, IMac readMac, IMac writeMac) + { + this.stream = stream; + this.inMac = readMac; + this.outMac = writeMac; + } + + public virtual IMac ReadMac() + { + return inMac; + } + + public virtual IMac WriteMac() + { + return outMac; + } + + public override bool CanRead + { + get { return stream.CanRead; } + } + + public sealed override bool CanSeek + { + get { return false; } + } + + public override bool CanWrite + { + get { return stream.CanWrite; } + } #if PORTABLE protected override void Dispose(bool disposing) @@ -129,22 +62,74 @@ namespace Org.BouncyCastle.Crypto.IO #endif public override void Flush() - { - stream.Flush(); - } - - public override long Seek( - long offset, - SeekOrigin origin) - { - return stream.Seek(offset,origin); - } - - public override void SetLength( - long length) - { - stream.SetLength(length); - } - } + { + stream.Flush(); + } + + public sealed override long Length + { + get { throw new NotSupportedException(); } + } + + public sealed override long Position + { + get { throw new NotSupportedException(); } + set { throw new NotSupportedException(); } + } + + public override int Read(byte[] buffer, int offset, int count) + { + int n = stream.Read(buffer, offset, count); + + if (inMac != null && n > 0) + { + inMac.BlockUpdate(buffer, offset, n); + } + + return n; + } + + public override int ReadByte() + { + int b = stream.ReadByte(); + + if (inMac != null && b >= 0) + { + inMac.Update((byte)b); + } + + return b; + } + + public sealed override long Seek(long offset, SeekOrigin origin) + { + throw new NotSupportedException(); + } + + public sealed override void SetLength(long length) + { + throw new NotSupportedException(); + } + + public override void Write(byte[] buffer, int offset, int count) + { + stream.Write(buffer, offset, count); + + if (outMac != null && count > 0) + { + outMac.BlockUpdate(buffer, offset, count); + } + } + + public override void WriteByte(byte value) + { + stream.WriteByte(value); + + if (outMac != null) + { + outMac.Update(value); + } + } + } } diff --git a/crypto/src/crypto/io/SignerSink.cs b/crypto/src/crypto/io/SignerSink.cs index c9bd8b9c8..3485d3cdc 100644 --- a/crypto/src/crypto/io/SignerSink.cs +++ b/crypto/src/crypto/io/SignerSink.cs @@ -19,17 +19,19 @@ namespace Org.BouncyCastle.Crypto.IO get { return mSigner; } } - public override void WriteByte(byte b) + public override void Write(byte[] buffer, int offset, int count) { - mSigner.Update(b); - } + Streams.ValidateBufferArguments(buffer, offset, count); - public override void Write(byte[] buf, int off, int len) - { - if (len > 0) + if (count > 0) { - mSigner.BlockUpdate(buf, off, len); + mSigner.BlockUpdate(buffer, offset, count); } } + + public override void WriteByte(byte value) + { + mSigner.Update(value); + } } } diff --git a/crypto/src/crypto/io/SignerStream.cs b/crypto/src/crypto/io/SignerStream.cs index 1e37c8d34..d25d7e285 100644 --- a/crypto/src/crypto/io/SignerStream.cs +++ b/crypto/src/crypto/io/SignerStream.cs @@ -5,112 +5,44 @@ using Org.BouncyCastle.Utilities; namespace Org.BouncyCastle.Crypto.IO { - public class SignerStream - : Stream - { - protected readonly Stream stream; - protected readonly ISigner inSigner; - protected readonly ISigner outSigner; - - public SignerStream( - Stream stream, - ISigner readSigner, - ISigner writeSigner) - { - this.stream = stream; - this.inSigner = readSigner; - this.outSigner = writeSigner; - } - - public virtual ISigner ReadSigner() - { - return inSigner; - } - - public virtual ISigner WriteSigner() - { - return outSigner; - } - - public override int Read( - byte[] buffer, - int offset, - int count) - { - int n = stream.Read(buffer, offset, count); - if (inSigner != null) - { - if (n > 0) - { - inSigner.BlockUpdate(buffer, offset, n); - } - } - return n; - } - - public override int ReadByte() - { - int b = stream.ReadByte(); - if (inSigner != null) - { - if (b >= 0) - { - inSigner.Update((byte)b); - } - } - return b; - } - - public override void Write( - byte[] buffer, - int offset, - int count) - { - if (outSigner != null) - { - if (count > 0) - { - outSigner.BlockUpdate(buffer, offset, count); - } - } - stream.Write(buffer, offset, count); - } - - public override void WriteByte( - byte b) - { - if (outSigner != null) - { - outSigner.Update(b); - } - stream.WriteByte(b); - } - - public override bool CanRead - { - get { return stream.CanRead; } - } - - public override bool CanWrite - { - get { return stream.CanWrite; } - } - - 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 class SignerStream + : Stream + { + protected readonly Stream stream; + protected readonly ISigner inSigner; + protected readonly ISigner outSigner; + + public SignerStream(Stream stream, ISigner readSigner, ISigner writeSigner) + { + this.stream = stream; + this.inSigner = readSigner; + this.outSigner = writeSigner; + } + + public virtual ISigner ReadSigner() + { + return inSigner; + } + + public virtual ISigner WriteSigner() + { + return outSigner; + } + + public override bool CanRead + { + get { return stream.CanRead; } + } + + public sealed override bool CanSeek + { + get { return false; } + } + + public override bool CanWrite + { + get { return stream.CanWrite; } + } #if PORTABLE protected override void Dispose(bool disposing) @@ -130,22 +62,74 @@ namespace Org.BouncyCastle.Crypto.IO #endif public override void Flush() - { - stream.Flush(); - } - - public override long Seek( - long offset, - SeekOrigin origin) - { - return stream.Seek(offset, origin); - } - - public override void SetLength( - long length) - { - stream.SetLength(length); - } - } + { + stream.Flush(); + } + + public sealed override long Length + { + get { throw new NotSupportedException(); } + } + + public sealed override long Position + { + get { throw new NotSupportedException(); } + set { throw new NotSupportedException(); } + } + + public override int Read(byte[] buffer, int offset, int count) + { + int n = stream.Read(buffer, offset, count); + + if (inSigner != null && n > 0) + { + inSigner.BlockUpdate(buffer, offset, n); + } + + return n; + } + + public override int ReadByte() + { + int b = stream.ReadByte(); + + if (inSigner != null && b >= 0) + { + inSigner.Update((byte)b); + } + + return b; + } + + public sealed override long Seek(long offset, SeekOrigin origin) + { + throw new NotSupportedException(); + } + + public sealed override void SetLength(long length) + { + throw new NotSupportedException(); + } + + public override void Write(byte[] buffer, int offset, int count) + { + stream.Write(buffer, offset, count); + + if (outSigner != null && count > 0) + { + outSigner.BlockUpdate(buffer, offset, count); + } + } + + public override void WriteByte(byte value) + { + stream.WriteByte(value); + + if (outSigner != null) + { + outSigner.Update(value); + } + } + } } diff --git a/crypto/src/openpgp/PgpEncryptedData.cs b/crypto/src/openpgp/PgpEncryptedData.cs index 558e0b8a2..d3220fe86 100644 --- a/crypto/src/openpgp/PgpEncryptedData.cs +++ b/crypto/src/openpgp/PgpEncryptedData.cs @@ -50,41 +50,43 @@ namespace Org.BouncyCastle.Bcpg.OpenPgp return bufEnd; } - public override int ReadByte() - { - if (bufStart < bufEnd) - return lookAhead[bufStart++]; + public override int Read(byte[] buffer, int offset, int count) + { + Streams.ValidateBufferArguments(buffer, offset, count); - if (FillBuffer() < 1) - return -1; + int avail = bufEnd - bufStart; - return lookAhead[bufStart++]; - } + int pos = offset; + while (count > avail) + { + Array.Copy(lookAhead, bufStart, buffer, pos, avail); - public override int Read(byte[] buf, int off, int len) - { - int avail = bufEnd - bufStart; + bufStart += avail; + pos += avail; + count -= avail; - int pos = off; - while (len > avail) - { - Array.Copy(lookAhead, bufStart, buf, pos, avail); + if ((avail = FillBuffer()) < 1) + return pos - offset; + } - bufStart += avail; - pos += avail; - len -= avail; + Array.Copy(lookAhead, bufStart, buffer, pos, count); + bufStart += count; - if ((avail = FillBuffer()) < 1) - return pos - off; - } + return pos + count - offset; + } - Array.Copy(lookAhead, bufStart, buf, pos, len); - bufStart += len; + public override int ReadByte() + { + if (bufStart < bufEnd) + return lookAhead[bufStart++]; - return pos + len - off; - } + if (FillBuffer() < 1) + return -1; + + return lookAhead[bufStart++]; + } - internal byte[] GetLookAhead() + internal byte[] GetLookAhead() { byte[] temp = new byte[LookAheadSize]; Array.Copy(lookAhead, bufStart, temp, 0, LookAheadSize); diff --git a/crypto/src/tls/ByteQueueInputStream.cs b/crypto/src/tls/ByteQueueInputStream.cs index b59b5d1e7..0b15071ad 100644 --- a/crypto/src/tls/ByteQueueInputStream.cs +++ b/crypto/src/tls/ByteQueueInputStream.cs @@ -31,6 +31,15 @@ namespace Org.BouncyCastle.Tls return bytesToRead; } + public override int Read(byte[] buffer, int offset, int count) + { + Streams.ValidateBufferArguments(buffer, offset, count); + + int bytesToRead = System.Math.Min(m_buffer.Available, count); + m_buffer.RemoveData(buffer, offset, bytesToRead, 0); + return bytesToRead; + } + public override int ReadByte() { if (m_buffer.Available == 0) @@ -39,13 +48,6 @@ namespace Org.BouncyCastle.Tls return m_buffer.RemoveData(1, 0)[0]; } - public override int Read(byte[] buf, int off, int len) - { - int bytesToRead = System.Math.Min(m_buffer.Available, len); - m_buffer.RemoveData(buf, off, bytesToRead, 0); - return bytesToRead; - } - public long Skip(long n) { int bytesToRemove = System.Math.Min((int)n, m_buffer.Available); diff --git a/crypto/src/tls/ByteQueueOutputStream.cs b/crypto/src/tls/ByteQueueOutputStream.cs index 76f04916f..441a3773a 100644 --- a/crypto/src/tls/ByteQueueOutputStream.cs +++ b/crypto/src/tls/ByteQueueOutputStream.cs @@ -20,14 +20,16 @@ namespace Org.BouncyCastle.Tls get { return m_buffer; } } - public override void WriteByte(byte b) + public override void Write(byte[] buffer, int offset, int count) { - m_buffer.AddData(new byte[]{ b }, 0, 1); + Streams.ValidateBufferArguments(buffer, offset, count); + + m_buffer.AddData(buffer, offset, count); } - public override void Write(byte[] buf, int off, int len) + public override void WriteByte(byte value) { - m_buffer.AddData(buf, off, len); + m_buffer.AddData(new byte[]{ value }, 0, 1); } } } diff --git a/crypto/src/tls/TlsStream.cs b/crypto/src/tls/TlsStream.cs index 02f8b733e..f3dea1574 100644 --- a/crypto/src/tls/TlsStream.cs +++ b/crypto/src/tls/TlsStream.cs @@ -10,12 +10,12 @@ namespace Org.BouncyCastle.Tls internal TlsStream(TlsProtocol handler) { - this.m_handler = handler; + m_handler = handler; } public override bool CanRead { - get { return !m_handler.IsClosed; } + get { return true; } } public override bool CanSeek @@ -25,7 +25,7 @@ namespace Org.BouncyCastle.Tls public override bool CanWrite { - get { return !m_handler.IsClosed; } + get { return true; } } #if PORTABLE @@ -88,9 +88,9 @@ namespace Org.BouncyCastle.Tls m_handler.WriteApplicationData(buffer, offset, count); } - public override void WriteByte(byte b) + public override void WriteByte(byte value) { - Write(new byte[]{ b }, 0, 1); + Write(new byte[]{ value }, 0, 1); } } } diff --git a/crypto/src/tls/crypto/TlsHashSink.cs b/crypto/src/tls/crypto/TlsHashSink.cs index 64496744d..a1681b0c8 100644 --- a/crypto/src/tls/crypto/TlsHashSink.cs +++ b/crypto/src/tls/crypto/TlsHashSink.cs @@ -19,17 +19,19 @@ namespace Org.BouncyCastle.Tls.Crypto get { return m_hash; } } - public override void WriteByte(byte b) + public override void Write(byte[] buffer, int offset, int count) { - m_hash.Update(new byte[] { b }, 0, 1); - } + Streams.ValidateBufferArguments(buffer, offset, count); - public override void Write(byte[] buf, int off, int len) - { - if (len > 0) + if (count > 0) { - m_hash.Update(buf, off, len); + m_hash.Update(buffer, offset, count); } } + + public override void WriteByte(byte value) + { + m_hash.Update(new byte[]{ value }, 0, 1); + } } } diff --git a/crypto/src/tls/crypto/TlsMacSink.cs b/crypto/src/tls/crypto/TlsMacSink.cs index 58e65c731..e7d5c70d7 100644 --- a/crypto/src/tls/crypto/TlsMacSink.cs +++ b/crypto/src/tls/crypto/TlsMacSink.cs @@ -19,17 +19,19 @@ namespace Org.BouncyCastle.Tls.Crypto get { return m_mac; } } - public override void WriteByte(byte b) + public override void Write(byte[] buffer, int offset, int count) { - m_mac.Update(new byte[]{ b }, 0, 1); - } + Streams.ValidateBufferArguments(buffer, offset, count); - public override void Write(byte[] buf, int off, int len) - { - if (len > 0) + if (count > 0) { - m_mac.Update(buf, off, len); + m_mac.Update(buffer, offset, count); } } + + public override void WriteByte(byte value) + { + m_mac.Update(new byte[]{ value }, 0, 1); + } } } diff --git a/crypto/src/util/io/BaseInputStream.cs b/crypto/src/util/io/BaseInputStream.cs index a5613d801..ebe256632 100644 --- a/crypto/src/util/io/BaseInputStream.cs +++ b/crypto/src/util/io/BaseInputStream.cs @@ -1,34 +1,15 @@ using System; -using System.Diagnostics; using System.IO; namespace Org.BouncyCastle.Utilities.IO { - public abstract class BaseInputStream : Stream + public abstract class BaseInputStream + : Stream { - private bool closed; - - public sealed override bool CanRead { get { return !closed; } } + public sealed override bool CanRead { get { return true; } } public sealed override bool CanSeek { get { return false; } } public sealed override bool CanWrite { get { return false; } } -#if PORTABLE - protected override void Dispose(bool disposing) - { - if (disposing) - { - closed = true; - } - base.Dispose(disposing); - } -#else - public override void Close() - { - closed = true; - base.Close(); - } -#endif - public sealed override void Flush() {} public sealed override long Length { get { throw new NotSupportedException(); } } public sealed override long Position @@ -39,22 +20,26 @@ namespace Org.BouncyCastle.Utilities.IO public override int Read(byte[] buffer, int offset, int count) { - int pos = offset; + Streams.ValidateBufferArguments(buffer, offset, count); + + int pos = 0; try { - int end = offset + count; - while (pos < end) + while (pos < count) { int b = ReadByte(); - if (b == -1) break; - buffer[pos++] = (byte) b; + if (b < 0) + break; + + buffer[offset + pos++] = (byte)b; } } catch (IOException) { - if (pos == offset) throw; + if (pos == 0) + throw; } - return pos - offset; + return pos; } public sealed override long Seek(long offset, SeekOrigin origin) { throw new NotSupportedException(); } diff --git a/crypto/src/util/io/BaseOutputStream.cs b/crypto/src/util/io/BaseOutputStream.cs index 0dbe821de..d9a5b92d6 100644 --- a/crypto/src/util/io/BaseOutputStream.cs +++ b/crypto/src/util/io/BaseOutputStream.cs @@ -1,35 +1,16 @@ using System; -using System.Diagnostics; using System.IO; namespace Org.BouncyCastle.Utilities.IO { - public abstract class BaseOutputStream : Stream + public abstract class BaseOutputStream + : Stream { - private bool closed; - - public sealed override bool CanRead { get { return false; } } + public sealed override bool CanRead { get { return false; } } public sealed override bool CanSeek { get { return false; } } - public sealed override bool CanWrite { get { return !closed; } } - -#if PORTABLE - protected override void Dispose(bool disposing) - { - if (disposing) - { - closed = true; - } - base.Dispose(disposing); - } -#else - public override void Close() - { - closed = true; - base.Close(); - } -#endif + public sealed override bool CanWrite { get { return true; } } - public override void Flush() { } + public override void Flush() {} public sealed override long Length { get { throw new NotSupportedException(); } } public sealed override long Position { @@ -42,28 +23,22 @@ namespace Org.BouncyCastle.Utilities.IO public override void Write(byte[] buffer, int offset, int count) { - Debug.Assert(buffer != null); - Debug.Assert(0 <= offset && offset <= buffer.Length); - Debug.Assert(count >= 0); - - int end = offset + count; + Streams.ValidateBufferArguments(buffer, offset, count); - Debug.Assert(0 <= end && end <= buffer.Length); - - for (int i = offset; i < end; ++i) + for (int i = 0; i < count; ++i) { - this.WriteByte(buffer[i]); + WriteByte(buffer[offset + i]); } } - public virtual void Write(params byte[] buffer) - { - Write(buffer, 0, buffer.Length); - } + public virtual void Write(params byte[] buffer) + { + Write(buffer, 0, buffer.Length); + } - public override void WriteByte(byte b) + public override void WriteByte(byte value) { - Write(new byte[]{ b }, 0, 1); + Write(new byte[]{ value }, 0, 1); } } } diff --git a/crypto/src/util/io/NullOutputStream.cs b/crypto/src/util/io/NullOutputStream.cs index 13877fa13..c435549d2 100644 --- a/crypto/src/util/io/NullOutputStream.cs +++ b/crypto/src/util/io/NullOutputStream.cs @@ -5,14 +5,13 @@ namespace Org.BouncyCastle.Utilities.IO internal class NullOutputStream : BaseOutputStream { - public override void WriteByte(byte b) + public override void Write(byte[] buffer, int offset, int count) { - // do nothing + Streams.ValidateBufferArguments(buffer, offset, count); } - public override void Write(byte[] buffer, int offset, int count) + public override void WriteByte(byte value) { - // do nothing } } } diff --git a/crypto/src/util/io/PushbackStream.cs b/crypto/src/util/io/PushbackStream.cs index d51e195ca..2ceb64361 100644 --- a/crypto/src/util/io/PushbackStream.cs +++ b/crypto/src/util/io/PushbackStream.cs @@ -13,31 +13,33 @@ namespace Org.BouncyCastle.Utilities.IO { } - public override int ReadByte() + public override int Read(byte[] buffer, int offset, int count) { + Streams.ValidateBufferArguments(buffer, offset, count); + if (m_buf != -1) { - int tmp = m_buf; + if (count < 1) + return 0; + + buffer[offset] = (byte)m_buf; m_buf = -1; - return tmp; + return 1; } - return base.ReadByte(); + return base.Read(buffer, offset, count); } - public override int Read(byte[] buffer, int offset, int count) + public override int ReadByte() { - if (count < 1) - return 0; - if (m_buf != -1) { - buffer[offset] = (byte)m_buf; + int tmp = m_buf; m_buf = -1; - return 1; + return tmp; } - return base.Read(buffer, offset, count); + return base.ReadByte(); } public virtual void Unread(int b) diff --git a/crypto/src/util/io/TeeInputStream.cs b/crypto/src/util/io/TeeInputStream.cs index 6996f3fbb..73ea8fed0 100644 --- a/crypto/src/util/io/TeeInputStream.cs +++ b/crypto/src/util/io/TeeInputStream.cs @@ -37,13 +37,13 @@ namespace Org.BouncyCastle.Utilities.IO } #endif - public override int Read(byte[] buf, int off, int len) + public override int Read(byte[] buffer, int offset, int count) { - int i = input.Read(buf, off, len); + int i = input.Read(buffer, offset, count); if (i > 0) { - tee.Write(buf, off, i); + tee.Write(buffer, offset, i); } return i; diff --git a/crypto/src/util/io/TeeOutputStream.cs b/crypto/src/util/io/TeeOutputStream.cs index a6c7fd5b5..5f447b18b 100644 --- a/crypto/src/util/io/TeeOutputStream.cs +++ b/crypto/src/util/io/TeeOutputStream.cs @@ -43,10 +43,10 @@ namespace Org.BouncyCastle.Utilities.IO tee.Write(buffer, offset, count); } - public override void WriteByte(byte b) + public override void WriteByte(byte value) { - output.WriteByte(b); - tee.WriteByte(b); + output.WriteByte(value); + tee.WriteByte(value); } } } diff --git a/crypto/src/util/zlib/ZInputStream.cs b/crypto/src/util/zlib/ZInputStream.cs index ea803fa4f..3e6fcc1be 100644 --- a/crypto/src/util/zlib/ZInputStream.cs +++ b/crypto/src/util/zlib/ZInputStream.cs @@ -37,11 +37,13 @@ using System; using System.Diagnostics; using System.IO; +using Org.BouncyCastle.Utilities.IO; + namespace Org.BouncyCastle.Utilities.Zlib { - public class ZInputStream - : Stream - { + public class ZInputStream + : BaseInputStream + { private static ZStream GetDefaultZStream(bool nowrap) { ZStream z = new ZStream(); @@ -51,32 +53,32 @@ namespace Org.BouncyCastle.Utilities.Zlib private const int BufferSize = 4096; - protected ZStream z; - protected int flushLevel = JZlib.Z_NO_FLUSH; - // TODO Allow custom buf - protected byte[] buf = new byte[BufferSize]; - protected byte[] buf1 = new byte[1]; - protected bool compress; + protected ZStream z; + protected int flushLevel = JZlib.Z_NO_FLUSH; + // TODO Allow custom buf + protected byte[] buf = new byte[BufferSize]; + protected byte[] buf1 = new byte[1]; + protected bool compress; - protected Stream input; - protected bool closed; + protected Stream input; + protected bool closed; - private bool nomoreinput = false; + private bool nomoreinput = false; - public ZInputStream(Stream input) - : this(input, false) - { - } + public ZInputStream(Stream input) + : this(input, false) + { + } - public ZInputStream(Stream input, bool nowrap) + public ZInputStream(Stream input, bool nowrap) : this(input, GetDefaultZStream(nowrap)) - { - } + { + } public ZInputStream(Stream input, ZStream z) - : base() - { - Debug.Assert(input.CanRead); + : base() + { + Debug.Assert(input.CanRead); if (z == null) { @@ -92,36 +94,32 @@ namespace Org.BouncyCastle.Utilities.Zlib this.compress = (z.istate == null); this.z = z; this.z.next_in = buf; - this.z.next_in_index = 0; - this.z.avail_in = 0; - } + this.z.next_in_index = 0; + this.z.avail_in = 0; + } public ZInputStream(Stream input, int level) : this(input, level, false) - { + { } public ZInputStream(Stream input, int level, bool nowrap) - { - Debug.Assert(input.CanRead); - - this.input = input; + { + Debug.Assert(input.CanRead); + + this.input = input; this.compress = true; this.z = new ZStream(); - this.z.deflateInit(level, nowrap); - this.z.next_in = buf; - this.z.next_in_index = 0; - this.z.avail_in = 0; - } + this.z.deflateInit(level, nowrap); + this.z.next_in = buf; + this.z.next_in_index = 0; + this.z.avail_in = 0; + } - /*public int available() throws IOException { + /*public int available() throws IOException { return inf.finished() ? 0 : 1; }*/ - public sealed override bool CanRead { get { return !closed; } } - public sealed override bool CanSeek { get { return false; } } - public sealed override bool CanWrite { get { return false; } } - #if PORTABLE protected override void Dispose(bool disposing) { @@ -137,102 +135,90 @@ namespace Org.BouncyCastle.Utilities.Zlib } #else public override void Close() - { + { if (closed) return; closed = true; Platform.Dispose(input); base.Close(); - } + } #endif - public sealed override void Flush() {} - - public virtual int FlushMode - { - get { return flushLevel; } - set { this.flushLevel = value; } - } - - public sealed override long Length { get { throw new NotSupportedException(); } } - public sealed override long Position - { - get { throw new NotSupportedException(); } - set { throw new NotSupportedException(); } - } - - public override int Read(byte[] b, int off, int len) - { - if (len==0) - return 0; - - z.next_out = b; - z.next_out_index = off; - z.avail_out = len; - - int err; - do - { - if (z.avail_in == 0 && !nomoreinput) - { - // if buffer is empty and more input is available, refill it - z.next_in_index = 0; - z.avail_in = input.Read(buf, 0, buf.Length); //(bufsize 0) - { - output.Write(buf, 0, count); - } - } - while (z.avail_in > 0 || z.avail_out == 0); - - Flush(); - } - - public override void Flush() - { - output.Flush(); - } - - public virtual int FlushMode - { - get { return flushLevel; } - set { this.flushLevel = value; } - } - - public sealed override long Length { get { throw new NotSupportedException(); } } - public sealed override long Position { - get { throw new NotSupportedException(); } - set { throw new NotSupportedException(); } + if (z == null) + return; + if (compress) + z.deflateEnd(); + else + z.inflateEnd(); + z.free(); + z = null; + } + + public virtual void Finish() + { + do + { + z.next_out = buf; + z.next_out_index = 0; + z.avail_out = buf.Length; + + int err = compress + ? z.deflate(JZlib.Z_FINISH) + : z.inflate(JZlib.Z_FINISH); + + if (err != JZlib.Z_STREAM_END && err != JZlib.Z_OK) + // TODO + //throw new ZStreamException((compress?"de":"in")+"flating: "+z.msg); + throw new IOException((compress ? "de" : "in") + "flating: " + z.msg); + + int count = buf.Length - z.avail_out; + if (count > 0) + { + output.Write(buf, 0, count); + } + } + while (z.avail_in > 0 || z.avail_out == 0); + + Flush(); + } + + public override void Flush() + { + output.Flush(); + } + + public virtual int FlushMode + { + get { return flushLevel; } + set { this.flushLevel = value; } + } + + public virtual long TotalIn + { + get { return z.total_in; } + } + + public virtual long TotalOut + { + get { return z.total_out; } + } + + public override void Write(byte[] buffer, int offset, int count) + { + Streams.ValidateBufferArguments(buffer, offset, count); + + if (count == 0) + return; + + z.next_in = buffer; + z.next_in_index = offset; + z.avail_in = count; + + do + { + z.next_out = buf; + z.next_out_index = 0; + z.avail_out = buf.Length; + + int err = compress + ? z.deflate(flushLevel) + : z.inflate(flushLevel); + + if (err != JZlib.Z_OK) + // TODO + //throw new ZStreamException((compress ? "de" : "in") + "flating: " + z.msg); + throw new IOException((compress ? "de" : "in") + "flating: " + z.msg); + + output.Write(buf, 0, buf.Length - z.avail_out); + } + while (z.avail_in > 0 || z.avail_out == 0); + } + + public override void WriteByte(byte value) + { + buf1[0] = value; + Write(buf1, 0, 1); } - public sealed override int Read(byte[] buffer, int offset, int count) { throw new NotSupportedException(); } - public sealed override long Seek(long offset, SeekOrigin origin) { throw new NotSupportedException(); } - public sealed override void SetLength(long value) { throw new NotSupportedException(); } - - public virtual long TotalIn - { - get { return z.total_in; } - } - - public virtual long TotalOut - { - get { return z.total_out; } - } - - public override void Write(byte[] b, int off, int len) - { - if (len == 0) - return; - - z.next_in = b; - z.next_in_index = off; - z.avail_in = len; - - do - { - z.next_out = buf; - z.next_out_index = 0; - z.avail_out = buf.Length; - - int err = compress - ? z.deflate(flushLevel) - : z.inflate(flushLevel); - - if (err != JZlib.Z_OK) - // TODO -// throw new ZStreamException((compress ? "de" : "in") + "flating: " + z.msg); - throw new IOException((compress ? "de" : "in") + "flating: " + z.msg); - - output.Write(buf, 0, buf.Length - z.avail_out); - } - while (z.avail_in > 0 || z.avail_out == 0); - } - - public override void WriteByte(byte b) - { - buf1[0] = b; - Write(buf1, 0, 1); - } - } + } } -- cgit 1.4.1