summary refs log tree commit diff
path: root/crypto/src/util/io
diff options
context:
space:
mode:
authorPeter Dettman <peter.dettman@bouncycastle.org>2022-05-23 22:44:57 +0700
committerPeter Dettman <peter.dettman@bouncycastle.org>2022-05-23 22:44:57 +0700
commit98b3ce6512812cd1d91c60ca0e69d69c32838d8e (patch)
tree8af69c097b389fe494e97401f7808590314a5b6b /crypto/src/util/io
parentAdd ValidateBufferArguments (diff)
downloadBouncyCastle.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.cs43
-rw-r--r--crypto/src/util/io/BaseOutputStream.cs53
-rw-r--r--crypto/src/util/io/NullOutputStream.cs7
-rw-r--r--crypto/src/util/io/PushbackStream.cs24
-rw-r--r--crypto/src/util/io/TeeInputStream.cs6
-rw-r--r--crypto/src/util/io/TeeOutputStream.cs6
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);
 		}
 	}
 }