summary refs log tree commit diff
path: root/crypto/src/asn1/IndefiniteLengthInputStream.cs
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/src/asn1/IndefiniteLengthInputStream.cs')
-rw-r--r--crypto/src/asn1/IndefiniteLengthInputStream.cs143
1 files changed, 29 insertions, 114 deletions
diff --git a/crypto/src/asn1/IndefiniteLengthInputStream.cs b/crypto/src/asn1/IndefiniteLengthInputStream.cs
index 09d0e3a42..1c8bd9a15 100644
--- a/crypto/src/asn1/IndefiniteLengthInputStream.cs
+++ b/crypto/src/asn1/IndefiniteLengthInputStream.cs
@@ -9,61 +9,47 @@ namespace Org.BouncyCastle.Asn1
         private int _lookAhead;
         private bool _eofOn00 = true;
 
-		internal IndefiniteLengthInputStream(
-			Stream	inStream,
-			int		limit)
+		internal IndefiniteLengthInputStream(Stream	inStream, int limit)
 			: base(inStream, limit)
 		{
             _lookAhead = RequireByte();
-            CheckForEof();
-		}
 
-		internal void SetEofOn00(
-			bool eofOn00)
-		{
-			_eofOn00 = eofOn00;
-            if (_eofOn00)
+            if (0 == _lookAhead)
             {
-                CheckForEof();
+                CheckEndOfContents();
             }
         }
 
-        private bool CheckForEof()
+		internal void SetEofOn00(bool eofOn00)
 		{
-            if (_lookAhead == 0x00)
+			_eofOn00 = eofOn00;
+            if (_eofOn00 && 0 == _lookAhead)
             {
-                int extra = RequireByte();
-                if (extra != 0)
-                {
-                    throw new IOException("malformed end-of-contents marker");
-                }
-
-                _lookAhead = -1;
-                SetParentEofDetect(true);
-                return true;
+                CheckEndOfContents();
             }
-            return _lookAhead < 0;
         }
 
-		public override int Read(
-			byte[]	buffer,
-			int		offset,
-			int		count)
-		{
-			// Only use this optimisation if we aren't checking for 00
-			if (_eofOn00 || count <= 1)
+        private void CheckEndOfContents()
+        {
+            if (0 != RequireByte())
+                throw new IOException("malformed end-of-contents marker");
+
+            _lookAhead = -1;
+            SetParentEofDetect();
+        }
+
+        public override int Read(byte[] buffer, int offset, int count)
+        {
+            // Only use this optimisation if we aren't checking for 00
+            if (_eofOn00 || count <= 1)
 				return base.Read(buffer, offset, count);
 
 			if (_lookAhead < 0)
 				return 0;
 
 			int numRead = _in.Read(buffer, offset + 1, count - 1);
-
 			if (numRead <= 0)
-			{
-				// Corrupted stream
 				throw new EndOfStreamException();
-			}
 
 			buffer[offset] = (byte)_lookAhead;
 			_lookAhead = RequireByte();
@@ -73,8 +59,14 @@ namespace Org.BouncyCastle.Asn1
 
 		public override int ReadByte()
 		{
-            if (_eofOn00 && CheckForEof())
-				return -1;
+            if (_eofOn00 && _lookAhead <= 0)
+            {
+                if (0 == _lookAhead)
+                {
+                    CheckEndOfContents();
+                }
+                return -1;
+            }
 
             int result = _lookAhead;
             _lookAhead = RequireByte();
@@ -85,86 +77,9 @@ namespace Org.BouncyCastle.Asn1
         {
             int b = _in.ReadByte();
             if (b < 0)
-            {
-                // Corrupted stream
                 throw new EndOfStreamException();
-            }
+
             return b;
         }
 	}
 }
-
-//using System;
-//using System.IO;
-
-//namespace Org.BouncyCastle.Asn1
-//{
-//    class IndefiniteLengthInputStream
-//        : LimitedInputStream
-//    {
-//        private bool _eofReached = false;
-//        private bool _eofOn00 = true;
-
-//        internal IndefiniteLengthInputStream(
-//            Stream	inStream,
-//            int		limit)
-//            : base(inStream, limit)
-//        {
-//        }
-
-//        internal void SetEofOn00(
-//            bool eofOn00)
-//        {
-//            _eofOn00 = eofOn00;
-//        }
-
-//        public override int Read(
-//            byte[]	buffer,
-//            int		offset,
-//            int		count)
-//        {
-//            if (_eofReached)
-//                return 0;
-
-//            if (_eofOn00)
-//                return base.Read(buffer, offset, count);
-
-//            int numRead = _in.Read(buffer, offset, count);
-
-//            if (numRead <= 0)
-//                throw new EndOfStreamException();
-
-//            return numRead;
-//        }
-
-//        public override int ReadByte()
-//        {
-//            if (_eofReached)
-//                return -1;
-
-//            int b1 = _in.ReadByte();
-
-//            if (b1 < 0)
-//                throw new EndOfStreamException();
-
-//            if (b1 == 0 && _eofOn00)
-//            {
-//                int b2 = _in.ReadByte();
-
-//                if (b2 < 0)
-//                    throw new EndOfStreamException();
-
-//                if (b2 == 0)
-//                {
-//                    _eofReached = true;
-//                    SetParentEofDetect(true);
-//                    return -1;
-//                }
-
-//                throw new InvalidDataException();
-//            }
-
-//            return b1;
-//        }
-//    }
-//}