diff options
author | Peter Dettman <peter.dettman@bouncycastle.org> | 2022-05-23 22:44:57 +0700 |
---|---|---|
committer | Peter Dettman <peter.dettman@bouncycastle.org> | 2022-05-23 22:44:57 +0700 |
commit | 98b3ce6512812cd1d91c60ca0e69d69c32838d8e (patch) | |
tree | 8af69c097b389fe494e97401f7808590314a5b6b /crypto/src/util/io | |
parent | Add ValidateBufferArguments (diff) | |
download | BouncyCastle.NET-ed25519-98b3ce6512812cd1d91c60ca0e69d69c32838d8e.tar.xz |
Work on Stream classes
- consistent naming, ordering - CanRead/Seek/Write fixes - argument validation - some cases of blocking zero-byte Read calls
Diffstat (limited to 'crypto/src/util/io')
-rw-r--r-- | crypto/src/util/io/BaseInputStream.cs | 43 | ||||
-rw-r--r-- | crypto/src/util/io/BaseOutputStream.cs | 53 | ||||
-rw-r--r-- | crypto/src/util/io/NullOutputStream.cs | 7 | ||||
-rw-r--r-- | crypto/src/util/io/PushbackStream.cs | 24 | ||||
-rw-r--r-- | crypto/src/util/io/TeeInputStream.cs | 6 | ||||
-rw-r--r-- | crypto/src/util/io/TeeOutputStream.cs | 6 |
6 files changed, 50 insertions, 89 deletions
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); } } } |