summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Dettman <peter.dettman@bouncycastle.org>2015-11-04 19:28:43 +0700
committerPeter Dettman <peter.dettman@bouncycastle.org>2015-11-04 19:28:43 +0700
commitf56fc16973d66bd9461f247e50738e55bd54de7e (patch)
tree8e84c9bd2cfc2d554b99c8045ec46de7313410fc
parentPort updated revocation test from Java (diff)
downloadBouncyCastle.NET-ed25519-f56fc16973d66bd9461f247e50738e55bd54de7e.tar.xz
Replace Close with Dispose for PORTABLE
-rw-r--r--crypto/bzip2/src/CBZip2OutputStream.cs16
-rw-r--r--crypto/src/asn1/BEROctetStringGenerator.cs18
-rw-r--r--crypto/src/asn1/util/FilterStream.cs11
-rw-r--r--crypto/src/bcpg/ArmoredInputStream.cs11
-rw-r--r--crypto/src/bcpg/ArmoredOutputStream.cs67
-rw-r--r--crypto/src/bcpg/BcpgInputStream.cs11
-rw-r--r--crypto/src/bcpg/BcpgOutputStream.cs15
-rw-r--r--crypto/src/cms/CMSAuthenticatedDataStreamGenerator.cs25
-rw-r--r--crypto/src/cms/CMSCompressedDataStreamGenerator.cs19
-rw-r--r--crypto/src/cms/CMSEnvelopedDataStreamGenerator.cs31
-rw-r--r--crypto/src/cms/CMSSignedDataStreamGenerator.cs20
-rw-r--r--crypto/src/crypto/io/CipherStream.cs19
-rw-r--r--crypto/src/crypto/io/DigestStream.cs13
-rw-r--r--crypto/src/crypto/io/MacStream.cs17
-rw-r--r--crypto/src/crypto/io/SignerStream.cs17
-rw-r--r--crypto/src/crypto/operators/Asn1Signature.cs12
-rw-r--r--crypto/src/crypto/tls/ByteQueueStream.cs10
-rw-r--r--crypto/src/crypto/tls/TlsStream.cs11
-rw-r--r--crypto/src/openpgp/PgpCompressedDataGenerator.cs27
-rw-r--r--crypto/src/openpgp/WrappedGeneratorStream.cs12
-rw-r--r--crypto/src/util/io/BaseInputStream.cs20
-rw-r--r--crypto/src/util/io/BaseOutputStream.cs20
-rw-r--r--crypto/src/util/io/FilterStream.cs11
-rw-r--r--crypto/src/util/io/TeeInputStream.cs14
-rw-r--r--crypto/src/util/io/TeeOutputStream.cs14
-rw-r--r--crypto/src/util/zlib/ZDeflaterOutputStream.cs19
-rw-r--r--crypto/src/util/zlib/ZInflaterInputStream.cs16
-rw-r--r--crypto/src/util/zlib/ZInputStream.cs17
-rw-r--r--crypto/src/util/zlib/ZOutputStream.cs57
-rw-r--r--crypto/test/src/util/test/UncloseableStream.cs16
30 files changed, 515 insertions, 71 deletions
diff --git a/crypto/bzip2/src/CBZip2OutputStream.cs b/crypto/bzip2/src/CBZip2OutputStream.cs
index 73e6979d8..15e816f3a 100644
--- a/crypto/bzip2/src/CBZip2OutputStream.cs
+++ b/crypto/bzip2/src/CBZip2OutputStream.cs
@@ -386,6 +386,21 @@ namespace Org.BouncyCastle.Apache.Bzip2
 //            Close();
 //        }
 
+#if PORTABLE
+        protected override void Disposing(bool disposing)
+        {
+            if (disposing)
+            {
+                if (closed)
+                    return;
+
+                Finish();
+                closed = true;
+                Platform.Dispose(this.bsStream);
+            }
+            base.Dispose(disposing);
+        }
+#else
         public override void Close() {
             if (closed) {
                 return;
@@ -397,6 +412,7 @@ namespace Org.BouncyCastle.Apache.Bzip2
             base.Close();
             Platform.Dispose(this.bsStream);
         }
+#endif
 
         public void Finish() {
             if (finished) {
diff --git a/crypto/src/asn1/BEROctetStringGenerator.cs b/crypto/src/asn1/BEROctetStringGenerator.cs
index 7468a6b0b..b2fbd47ae 100644
--- a/crypto/src/asn1/BEROctetStringGenerator.cs
+++ b/crypto/src/asn1/BEROctetStringGenerator.cs
@@ -102,7 +102,22 @@ namespace Org.BouncyCastle.Asn1
 				}
 			}
 
-			public override void Close()
+#if PORTABLE
+            protected override void Disposing(bool disposing)
+            {
+                if (disposing)
+                {
+				    if (_off != 0)
+				    {
+					    DerOctetString.Encode(_derOut, _buf, 0, _off);
+				    }
+
+				    _gen.WriteBerEnd();
+                }
+                base.Dispose(disposing);
+            }
+#else
+            public override void Close()
 			{
 				if (_off != 0)
 				{
@@ -112,6 +127,7 @@ namespace Org.BouncyCastle.Asn1
 				_gen.WriteBerEnd();
 				base.Close();
 			}
+#endif
 		}
 	}
 }
diff --git a/crypto/src/asn1/util/FilterStream.cs b/crypto/src/asn1/util/FilterStream.cs
index e280bf5b5..f7e8708f3 100644
--- a/crypto/src/asn1/util/FilterStream.cs
+++ b/crypto/src/asn1/util/FilterStream.cs
@@ -34,10 +34,21 @@ namespace Org.BouncyCastle.Asn1.Utilities
             get { return s.Position; }
             set { s.Position = value; }
         }
+#if PORTABLE
+        protected override void Disposing(bool disposing)
+        {
+            if (disposing)
+            {
+                Platform.Dispose(s);
+            }
+            base.Dispose(disposing);
+        }
+#else
         public override void Close()
         {
             Platform.Dispose(s);
         }
+#endif
         public override void Flush()
         {
             s.Flush();
diff --git a/crypto/src/bcpg/ArmoredInputStream.cs b/crypto/src/bcpg/ArmoredInputStream.cs
index 8d17bfa62..cfbf819e0 100644
--- a/crypto/src/bcpg/ArmoredInputStream.cs
+++ b/crypto/src/bcpg/ArmoredInputStream.cs
@@ -504,10 +504,21 @@ namespace Org.BouncyCastle.Bcpg
             return pos - offset;
         }
 
+#if PORTABLE
+        protected override void Disposing(bool disposing)
+        {
+            if (disposing)
+            {
+                Platform.Dispose(input);
+            }
+            base.Dispose(disposing);
+        }
+#else
 		public override void Close()
 		{
             Platform.Dispose(input);
 			base.Close();
 		}
+#endif
     }
 }
diff --git a/crypto/src/bcpg/ArmoredOutputStream.cs b/crypto/src/bcpg/ArmoredOutputStream.cs
index 253c5d1fe..0f0d6896c 100644
--- a/crypto/src/bcpg/ArmoredOutputStream.cs
+++ b/crypto/src/bcpg/ArmoredOutputStream.cs
@@ -283,37 +283,60 @@ namespace Org.BouncyCastle.Bcpg
          * <b>Note</b>: Close() does not close the underlying stream. So it is possible to write
          * multiple objects using armoring to a single stream.
          */
-        public override void Close()
+#if PORTABLE
+        protected override void Disposing(bool disposing)
         {
-            if (type != null)
+            if (disposing)
             {
-                if (bufPtr > 0)
-                {
-                    Encode(outStream, buf, bufPtr);
-                }
+                if (type == null)
+                    return;
 
-                DoWrite(nl + '=');
+                DoClose();
 
-                int crcV = crc.Value;
-
-                buf[0] = ((crcV >> 16) & 0xff);
-                buf[1] = ((crcV >> 8) & 0xff);
-                buf[2] = (crcV & 0xff);
+                type = null;
+                start = true;
+            }
+            base.Dispose(disposing);
+        }
+#else
+        public override void Close()
+        {
+            if (type == null)
+                return;
 
-                Encode(outStream, buf, 3);
+            DoClose();
 
-                DoWrite(nl);
-                DoWrite(footerStart);
-                DoWrite(type);
-                DoWrite(footerTail);
-                DoWrite(nl);
+            type = null;
+            start = true;
 
-                outStream.Flush();
+            base.Close();
+        }
+#endif
 
-                type = null;
-                start = true;
-                base.Close();
+        private void DoClose()
+        {
+            if (bufPtr > 0)
+            {
+                Encode(outStream, buf, bufPtr);
             }
+
+            DoWrite(nl + '=');
+
+            int crcV = crc.Value;
+
+            buf[0] = ((crcV >> 16) & 0xff);
+            buf[1] = ((crcV >> 8) & 0xff);
+            buf[2] = (crcV & 0xff);
+
+            Encode(outStream, buf, 3);
+
+            DoWrite(nl);
+            DoWrite(footerStart);
+            DoWrite(type);
+            DoWrite(footerTail);
+            DoWrite(nl);
+
+            outStream.Flush();
         }
 
         private void WriteHeaderEntry(
diff --git a/crypto/src/bcpg/BcpgInputStream.cs b/crypto/src/bcpg/BcpgInputStream.cs
index 37c259d42..59dd548ca 100644
--- a/crypto/src/bcpg/BcpgInputStream.cs
+++ b/crypto/src/bcpg/BcpgInputStream.cs
@@ -247,11 +247,22 @@ namespace Org.BouncyCastle.Bcpg
             }
         }
 
+#if PORTABLE
+        protected override void Disposing(bool disposing)
+        {
+            if (disposing)
+            {
+                Platform.Dispose(m_in);
+            }
+            base.Dispose(disposing);
+        }
+#else
 		public override void Close()
 		{
             Platform.Dispose(m_in);
 			base.Close();
 		}
+#endif
 
 		/// <summary>
 		/// A stream that overlays our input stream, allowing the user to only read a segment of it.
diff --git a/crypto/src/bcpg/BcpgOutputStream.cs b/crypto/src/bcpg/BcpgOutputStream.cs
index 581897ece..c786a8fc0 100644
--- a/crypto/src/bcpg/BcpgOutputStream.cs
+++ b/crypto/src/bcpg/BcpgOutputStream.cs
@@ -380,12 +380,25 @@ namespace Org.BouncyCastle.Bcpg
             }
         }
 
-		public override void Close()
+#if PORTABLE
+        protected override void Disposing(bool disposing)
+        {
+            if (disposing)
+            {
+			    this.Finish();
+			    outStr.Flush();
+                Platform.Dispose(outStr);
+            }
+            base.Dispose(disposing);
+        }
+#else
+        public override void Close()
         {
 			this.Finish();
 			outStr.Flush();
             Platform.Dispose(outStr);
 			base.Close();
         }
+#endif
     }
 }
diff --git a/crypto/src/cms/CMSAuthenticatedDataStreamGenerator.cs b/crypto/src/cms/CMSAuthenticatedDataStreamGenerator.cs
index a9879a6fc..591e36f2d 100644
--- a/crypto/src/cms/CMSAuthenticatedDataStreamGenerator.cs
+++ b/crypto/src/cms/CMSAuthenticatedDataStreamGenerator.cs
@@ -252,7 +252,29 @@ namespace Org.BouncyCastle.Cms
 				macStream.Write(bytes, off, len);
 			}
 
-			public override void Close()
+#if PORTABLE
+            protected override void Disposing(bool disposing)
+            {
+                if (disposing)
+                {
+                    Platform.Dispose(macStream);
+
+                    // TODO Parent context(s) should really be be closed explicitly
+
+				    eiGen.Close();
+
+				    // [TODO] auth attributes go here 
+				    byte[] macOctets = MacUtilities.DoFinal(mac);
+				    authGen.AddObject(new DerOctetString(macOctets));
+				    // [TODO] unauth attributes go here
+
+				    authGen.Close();
+				    cGen.Close();
+                }
+                base.Dispose(disposing);
+            }
+#else
+            public override void Close()
 			{
                 Platform.Dispose(macStream);
 
@@ -268,6 +290,7 @@ namespace Org.BouncyCastle.Cms
 				authGen.Close();
 				cGen.Close();
 			}
+#endif
 		}
 	}
 }
diff --git a/crypto/src/cms/CMSCompressedDataStreamGenerator.cs b/crypto/src/cms/CMSCompressedDataStreamGenerator.cs
index 73832f5f3..1fb8da756 100644
--- a/crypto/src/cms/CMSCompressedDataStreamGenerator.cs
+++ b/crypto/src/cms/CMSCompressedDataStreamGenerator.cs
@@ -125,7 +125,23 @@ namespace Org.BouncyCastle.Cms
 				_out.Write(bytes, off, len);
 			}
 
-			public override void Close()
+#if PORTABLE
+            protected override void Disposing(bool disposing)
+            {
+                if (disposing)
+                {
+                    Platform.Dispose(_out);
+
+                    // TODO Parent context(s) should really be be closed explicitly
+
+                    _eiGen.Close();
+				    _cGen.Close();
+				    _sGen.Close();
+                }
+                base.Dispose(disposing);
+            }
+#else
+            public override void Close()
 			{
                 Platform.Dispose(_out);
 
@@ -136,6 +152,7 @@ namespace Org.BouncyCastle.Cms
 				_sGen.Close();
 				base.Close();
 			}
+#endif
 		}
 	}
 }
diff --git a/crypto/src/cms/CMSEnvelopedDataStreamGenerator.cs b/crypto/src/cms/CMSEnvelopedDataStreamGenerator.cs
index 17c49ed07..264161b73 100644
--- a/crypto/src/cms/CMSEnvelopedDataStreamGenerator.cs
+++ b/crypto/src/cms/CMSEnvelopedDataStreamGenerator.cs
@@ -255,11 +255,37 @@ namespace Org.BouncyCastle.Cms
 				_out.Write(bytes, off, len);
 			}
 
-			public override void Close()
+#if PORTABLE
+            protected override void Disposing(bool disposing)
+            {
+                if (disposing)
+                {
+                    Platform.Dispose(_out);
+
+                    // TODO Parent context(s) should really be closed explicitly
+
+				    _eiGen.Close();
+
+                    if (_outer.unprotectedAttributeGenerator != null)
+                    {
+                        Asn1.Cms.AttributeTable attrTable = _outer.unprotectedAttributeGenerator.GetAttributes(Platform.CreateHashtable());
+
+                        Asn1Set unprotectedAttrs = new BerSet(attrTable.ToAsn1EncodableVector());
+
+                        _envGen.AddObject(new DerTaggedObject(false, 1, unprotectedAttrs));
+                    }
+
+				    _envGen.Close();
+				    _cGen.Close();
+                }
+                base.Dispose(disposing);
+            }
+#else
+            public override void Close()
 			{
                 Platform.Dispose(_out);
 
-                // TODO Parent context(s) should really be be closed explicitly
+                // TODO Parent context(s) should really be closed explicitly
 
 				_eiGen.Close();
 
@@ -276,6 +302,7 @@ namespace Org.BouncyCastle.Cms
 				_cGen.Close();
 				base.Close();
 			}
+#endif
 		}
 	}
 }
diff --git a/crypto/src/cms/CMSSignedDataStreamGenerator.cs b/crypto/src/cms/CMSSignedDataStreamGenerator.cs
index 746538ebd..36e7a780c 100644
--- a/crypto/src/cms/CMSSignedDataStreamGenerator.cs
+++ b/crypto/src/cms/CMSSignedDataStreamGenerator.cs
@@ -809,8 +809,25 @@ namespace Org.BouncyCastle.Cms
                 _out.Write(bytes, off, len);
             }
 
+#if PORTABLE
+            protected override void Disposing(bool disposing)
+            {
+                if (disposing)
+                {
+                    DoClose();
+                }
+                base.Dispose(disposing);
+            }
+#else
 			public override void Close()
             {
+                DoClose();
+				base.Close();
+			}
+#endif
+
+            private void DoClose()
+            {
                 Platform.Dispose(_out);
 
                 // TODO Parent context(s) should really be be closed explicitly
@@ -898,8 +915,7 @@ namespace Org.BouncyCastle.Cms
 
 				_sigGen.Close();
                 _sGen.Close();
-				base.Close();
-			}
+            }
 
 			private static void WriteToGenerator(
 				Asn1Generator	ag,
diff --git a/crypto/src/crypto/io/CipherStream.cs b/crypto/src/crypto/io/CipherStream.cs
index 7fa9d3c5a..273413ea0 100644
--- a/crypto/src/crypto/io/CipherStream.cs
+++ b/crypto/src/crypto/io/CipherStream.cs
@@ -202,7 +202,23 @@ namespace Org.BouncyCastle.Crypto.IO
             set { throw new NotSupportedException(); }
         }
 
-		public override void Close()
+#if PORTABLE
+        protected override void Disposing(bool disposing)
+        {
+            if (disposing)
+            {
+			    if (outCipher != null)
+			    {
+				    byte[] data = outCipher.DoFinal();
+				    stream.Write(data, 0, data.Length);
+				    stream.Flush();
+			    }
+                Platform.Dispose(stream);
+            }
+            base.Dispose(disposing);
+        }
+#else
+        public override void Close()
         {
 			if (outCipher != null)
 			{
@@ -212,6 +228,7 @@ namespace Org.BouncyCastle.Crypto.IO
 			}
             Platform.Dispose(stream);
         }
+#endif
 
         public override void Flush()
         {
diff --git a/crypto/src/crypto/io/DigestStream.cs b/crypto/src/crypto/io/DigestStream.cs
index 6f31b9560..3f5716d15 100644
--- a/crypto/src/crypto/io/DigestStream.cs
+++ b/crypto/src/crypto/io/DigestStream.cs
@@ -112,12 +112,23 @@ namespace Org.BouncyCastle.Crypto.IO
 			set { stream.Position = value; }
 		}
 
+#if PORTABLE
+        protected override void Disposing(bool disposing)
+        {
+            if (disposing)
+            {
+                Platform.Dispose(stream);
+            }
+            base.Dispose(disposing);
+        }
+#else
 		public override void Close()
 		{
             Platform.Dispose(stream);
 		}
+#endif
 
-        public override  void Flush()
+        public override void Flush()
 		{
 			stream.Flush();
 		}
diff --git a/crypto/src/crypto/io/MacStream.cs b/crypto/src/crypto/io/MacStream.cs
index cbea1956f..f15e6d45a 100644
--- a/crypto/src/crypto/io/MacStream.cs
+++ b/crypto/src/crypto/io/MacStream.cs
@@ -111,10 +111,21 @@ namespace Org.BouncyCastle.Crypto.IO
 			set { stream.Position = value; }
 		}
 
-		public override void Close()
-		{
+#if PORTABLE
+        protected override void Disposing(bool disposing)
+        {
+            if (disposing)
+            {
+                Platform.Dispose(stream);
+            }
+            base.Dispose(disposing);
+        }
+#else
+        public override void Close()
+        {
             Platform.Dispose(stream);
-		}
+        }
+#endif
 
         public override void Flush()
 		{
diff --git a/crypto/src/crypto/io/SignerStream.cs b/crypto/src/crypto/io/SignerStream.cs
index 2ff21f563..b9fadfc77 100644
--- a/crypto/src/crypto/io/SignerStream.cs
+++ b/crypto/src/crypto/io/SignerStream.cs
@@ -112,10 +112,21 @@ namespace Org.BouncyCastle.Crypto.IO
 			set { stream.Position = value; }
 		}
 
-		public override void Close()
-		{
+#if PORTABLE
+        protected override void Disposing(bool disposing)
+        {
+            if (disposing)
+            {
+                Platform.Dispose(stream);
+            }
+            base.Dispose(disposing);
+        }
+#else
+        public override void Close()
+        {
             Platform.Dispose(stream);
-		}
+        }
+#endif
 
         public override  void Flush()
 		{
diff --git a/crypto/src/crypto/operators/Asn1Signature.cs b/crypto/src/crypto/operators/Asn1Signature.cs
index d7af3ab13..311711e20 100644
--- a/crypto/src/crypto/operators/Asn1Signature.cs
+++ b/crypto/src/crypto/operators/Asn1Signature.cs
@@ -303,9 +303,19 @@ namespace Org.BouncyCastle.Crypto.Operators
 			set { throw new NotImplementedException (); }
 		}
 
-		public override void Close()
+#if PORTABLE
+        protected override void Disposing(bool disposing)
+        {
+            if (disposing)
+                return;
+
+            base.Dispose(disposing);
+        }
+#else
+        public override void Close()
 		{
 		}
+#endif
 
 		public override  void Flush()
 		{
diff --git a/crypto/src/crypto/tls/ByteQueueStream.cs b/crypto/src/crypto/tls/ByteQueueStream.cs
index bf603e006..9a8ca7d92 100644
--- a/crypto/src/crypto/tls/ByteQueueStream.cs
+++ b/crypto/src/crypto/tls/ByteQueueStream.cs
@@ -33,9 +33,19 @@ namespace Org.BouncyCastle.Crypto.Tls
             get { return true; }
         }
 
+#if PORTABLE
+        protected override void Disposing(bool disposing)
+        {
+            if (disposing)
+                return;
+
+            base.Dispose(disposing);
+        }
+#else
         public override void Close()
         {
         }
+#endif
 
         public override void Flush()
         {
diff --git a/crypto/src/crypto/tls/TlsStream.cs b/crypto/src/crypto/tls/TlsStream.cs
index 7ff7184e3..bc2201cdb 100644
--- a/crypto/src/crypto/tls/TlsStream.cs
+++ b/crypto/src/crypto/tls/TlsStream.cs
@@ -28,10 +28,21 @@ namespace Org.BouncyCastle.Crypto.Tls
             get { return !handler.IsClosed; }
         }
 
+#if PORTABLE
+        protected override void Disposing(bool disposing)
+        {
+            if (disposing)
+            {
+                handler.Close();
+            }
+            base.Dispose(disposing);
+        }
+#else
         public override void Close()
         {
             handler.Close();
         }
+#endif
 
         public override void Flush()
         {
diff --git a/crypto/src/openpgp/PgpCompressedDataGenerator.cs b/crypto/src/openpgp/PgpCompressedDataGenerator.cs
index 307fdbf08..ea366e0c6 100644
--- a/crypto/src/openpgp/PgpCompressedDataGenerator.cs
+++ b/crypto/src/openpgp/PgpCompressedDataGenerator.cs
@@ -173,10 +173,21 @@ namespace Org.BouncyCastle.Bcpg.OpenPgp
 			{
 			}
 
-			public override void Close()
+#if PORTABLE
+            protected override void Disposing(bool disposing)
+            {
+                if (disposing)
+                {
+				    Finish();
+                }
+                base.Dispose(disposing);
+            }
+#else
+            public override void Close()
 			{
 				Finish();
 			}
+#endif
 		}
 
 		private class SafeZOutputStream : ZOutputStream
@@ -186,11 +197,23 @@ namespace Org.BouncyCastle.Bcpg.OpenPgp
 			{
 			}
 
-			public override void Close()
+#if PORTABLE
+            protected override void Disposing(bool disposing)
+            {
+                if (disposing)
+                {
+				    Finish();
+				    End();
+                }
+                base.Dispose(disposing);
+            }
+#else
+            public override void Close()
 			{
 				Finish();
 				End();
 			}
+#endif
 		}
 	}
 }
diff --git a/crypto/src/openpgp/WrappedGeneratorStream.cs b/crypto/src/openpgp/WrappedGeneratorStream.cs
index cdc9befb3..ffa199255 100644
--- a/crypto/src/openpgp/WrappedGeneratorStream.cs
+++ b/crypto/src/openpgp/WrappedGeneratorStream.cs
@@ -17,9 +17,21 @@ namespace Org.BouncyCastle.Bcpg.OpenPgp
 			this.gen = gen;
 		}
 
+#if PORTABLE
+        protected override void Disposing(bool disposing)
+        {
+            if (disposing)
+            {
+                gen.Close();
+                return;
+            }
+            base.Dispose(disposing);
+        }
+#else
 		public override void Close()
 		{
 			gen.Close();
 		}
+#endif
 	}
 }
diff --git a/crypto/src/util/io/BaseInputStream.cs b/crypto/src/util/io/BaseInputStream.cs
index 3ff4a1957..36725acd2 100644
--- a/crypto/src/util/io/BaseInputStream.cs
+++ b/crypto/src/util/io/BaseInputStream.cs
@@ -11,8 +11,24 @@ namespace Org.BouncyCastle.Utilities.IO
 		public sealed override bool CanRead { get { return !closed; } }
         public sealed override bool CanSeek { get { return false; } }
         public sealed override bool CanWrite { get { return false; } }
-		public override void Close() { closed = true; }
-		public sealed override void Flush() {}
+
+#if PORTABLE
+        protected override void Disposing(bool disposing)
+        {
+            if (disposing)
+            {
+                closed = true;
+            }
+            base.Dispose(disposing);
+        }
+#else
+		public override void Close()
+        {
+            closed = true;
+        }
+#endif
+
+        public sealed override void Flush() {}
         public sealed override long Length { get { throw new NotSupportedException(); } }
         public sealed override long Position
         {
diff --git a/crypto/src/util/io/BaseOutputStream.cs b/crypto/src/util/io/BaseOutputStream.cs
index 6e6c6d346..d85ae8ae4 100644
--- a/crypto/src/util/io/BaseOutputStream.cs
+++ b/crypto/src/util/io/BaseOutputStream.cs
@@ -11,8 +11,24 @@ namespace Org.BouncyCastle.Utilities.IO
 		public sealed override bool CanRead { get { return false; } }
         public sealed override bool CanSeek { get { return false; } }
         public sealed override bool CanWrite { get { return !closed; } }
-		public override void Close() { closed = true; }
-        public override void Flush() {}
+
+#if PORTABLE
+        protected override void Disposing(bool disposing)
+        {
+            if (disposing)
+            {
+                closed = true;
+            }
+            base.Dispose(disposing);
+        }
+#else
+        public override void Close()
+        {
+            closed = true;
+        }
+#endif
+
+        public override void Flush() { }
         public sealed override long Length { get { throw new NotSupportedException(); } }
         public sealed override long Position
         {
diff --git a/crypto/src/util/io/FilterStream.cs b/crypto/src/util/io/FilterStream.cs
index c5d6a1cba..be216254a 100644
--- a/crypto/src/util/io/FilterStream.cs
+++ b/crypto/src/util/io/FilterStream.cs
@@ -29,10 +29,21 @@ namespace Org.BouncyCastle.Utilities.IO
             get { return s.Position; }
             set { s.Position = value; }
         }
+#if PORTABLE
+        protected override void Disposing(bool disposing)
+        {
+            if (disposing)
+            {
+                Platform.Dispose(s);
+            }
+            base.Dispose(disposing);
+        }
+#else
         public override void Close()
         {
             Platform.Dispose(s);
         }
+#endif
         public override void Flush()
         {
             s.Flush();
diff --git a/crypto/src/util/io/TeeInputStream.cs b/crypto/src/util/io/TeeInputStream.cs
index b344be8a8..4b3203d71 100644
--- a/crypto/src/util/io/TeeInputStream.cs
+++ b/crypto/src/util/io/TeeInputStream.cs
@@ -18,11 +18,23 @@ namespace Org.BouncyCastle.Utilities.IO
 			this.tee = tee;
 		}
 
-		public override void Close()
+#if PORTABLE
+        protected override void Disposing(bool disposing)
+        {
+            if (disposing)
+            {
+                Platform.Dispose(input);
+                Platform.Dispose(tee);
+            }
+            base.Dispose(disposing);
+        }
+#else
+        public override void Close()
 		{
             Platform.Dispose(input);
             Platform.Dispose(tee);
 		}
+#endif
 
         public override int Read(byte[] buf, int off, int len)
 		{
diff --git a/crypto/src/util/io/TeeOutputStream.cs b/crypto/src/util/io/TeeOutputStream.cs
index 75d1d305d..7ad14a007 100644
--- a/crypto/src/util/io/TeeOutputStream.cs
+++ b/crypto/src/util/io/TeeOutputStream.cs
@@ -18,11 +18,23 @@ namespace Org.BouncyCastle.Utilities.IO
 			this.tee = tee;
 		}
 
-		public override void Close()
+#if PORTABLE
+        protected override void Disposing(bool disposing)
+        {
+            if (disposing)
+            {
+                Platform.Dispose(output);
+                Platform.Dispose(tee);
+            }
+            base.Dispose(disposing);
+        }
+#else
+        public override void Close()
 		{
             Platform.Dispose(output);
             Platform.Dispose(tee);
 		}
+#endif
 
         public override void Write(byte[] buffer, int offset, int count)
 		{
diff --git a/crypto/src/util/zlib/ZDeflaterOutputStream.cs b/crypto/src/util/zlib/ZDeflaterOutputStream.cs
index 7ff6d31c8..5a70df21d 100644
--- a/crypto/src/util/zlib/ZDeflaterOutputStream.cs
+++ b/crypto/src/util/zlib/ZDeflaterOutputStream.cs
@@ -136,6 +136,24 @@ namespace Org.BouncyCastle.Utilities.Zlib {
             z=null;
         }
         
+#if PORTABLE
+        protected override void Disposing(bool disposing)
+        {
+            if (disposing)
+            {
+                try{
+                    try{Finish();}
+                    catch (IOException) {}
+                }
+                finally{
+                    End();
+                    Platform.Dispose(outp);
+                    outp=null;
+                }
+            }
+            base.Dispose(disposing);
+        }
+#else
         public override void Close() {
             try{
                 try{Finish();}
@@ -147,5 +165,6 @@ namespace Org.BouncyCastle.Utilities.Zlib {
                 outp=null;
             }
         }
+#endif
     }
 }
diff --git a/crypto/src/util/zlib/ZInflaterInputStream.cs b/crypto/src/util/zlib/ZInflaterInputStream.cs
index 170596e63..df51fc878 100644
--- a/crypto/src/util/zlib/ZInflaterInputStream.cs
+++ b/crypto/src/util/zlib/ZInflaterInputStream.cs
@@ -114,10 +114,22 @@ namespace Org.BouncyCastle.Utilities.Zlib {
         public override void WriteByte(byte b) {
         }
 
-        public override void Close() {
+#if PORTABLE
+        protected override void Disposing(bool disposing)
+        {
+            if (disposing)
+            {
+                Platform.Dispose(inp);
+            }
+            base.Dispose(disposing);
+        }
+#else
+        public override void Close()
+        {
             Platform.Dispose(inp);
         }
-    
+#endif
+
         public override int ReadByte() {
             if(Read(buf1, 0, 1)<=0)
                 return -1;
diff --git a/crypto/src/util/zlib/ZInputStream.cs b/crypto/src/util/zlib/ZInputStream.cs
index f0b3068fc..fe895a397 100644
--- a/crypto/src/util/zlib/ZInputStream.cs
+++ b/crypto/src/util/zlib/ZInputStream.cs
@@ -93,7 +93,21 @@ namespace Org.BouncyCastle.Utilities.Zlib
 		public sealed override bool CanSeek { get { return false; } }
 		public sealed override bool CanWrite { get { return false; } }
 
-		public override void Close()
+#if PORTABLE
+        protected override void Disposing(bool disposing)
+        {
+            if (disposing)
+            {
+			    if (!closed)
+			    {
+				    closed = true;
+                    Platform.Dispose(input);
+			    }
+            }
+            base.Dispose(disposing);
+        }
+#else
+        public override void Close()
 		{
 			if (!closed)
 			{
@@ -101,6 +115,7 @@ namespace Org.BouncyCastle.Utilities.Zlib
                 Platform.Dispose(input);
 			}
 		}
+#endif
 
 		public sealed override void Flush() {}
 
diff --git a/crypto/src/util/zlib/ZOutputStream.cs b/crypto/src/util/zlib/ZOutputStream.cs
index 7b49d6638..ca59d8e1f 100644
--- a/crypto/src/util/zlib/ZOutputStream.cs
+++ b/crypto/src/util/zlib/ZOutputStream.cs
@@ -95,32 +95,51 @@ namespace Org.BouncyCastle.Utilities.Zlib
         public sealed override bool CanSeek { get { return false; } }
         public sealed override bool CanWrite { get { return !closed; } }
 
+#if PORTABLE
+        protected override void Disposing(bool disposing)
+        {
+            if (disposing)
+            {
+			    if (this.closed)
+				    return;
+
+                DoClose();
+            }
+            base.Dispose(disposing);
+        }
+#else
 		public override void Close()
 		{
 			if (this.closed)
 				return;
 
-			try
-			{
-				try
-				{
-					Finish();
-				}
-				catch (IOException)
-				{
-					// Ignore
-				}
-			}
-			finally
-			{
-				this.closed = true;
-				End();
-                Platform.Dispose(output);
-				output = null;
-			}
+            DoClose();
 		}
+#endif
+
+        private void DoClose()
+        {
+            try
+            {
+                try
+                {
+                    Finish();
+                }
+                catch (IOException)
+                {
+                    // Ignore
+                }
+            }
+            finally
+            {
+                this.closed = true;
+                End();
+                Platform.Dispose(output);
+                output = null;
+            }
+        }
 
-		public virtual void End()
+        public virtual void End()
 		{
 			if (z == null)
 				return;
diff --git a/crypto/test/src/util/test/UncloseableStream.cs b/crypto/test/src/util/test/UncloseableStream.cs
index 171198120..2a3b4229b 100644
--- a/crypto/test/src/util/test/UncloseableStream.cs
+++ b/crypto/test/src/util/test/UncloseableStream.cs
@@ -14,9 +14,21 @@ namespace Org.BouncyCastle.Utilities.Test
 		{
 		}
 
-		public override void Close()
+#if PORTABLE
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing)
+            {
+			    throw new Exception("UncloseableStream was disposed");
+            }
+
+            base.Dispose(disposing);
+        }
+#else
+        public override void Close()
 		{
 			throw new Exception("Close() called on UncloseableStream");
 		}
-	}
+#endif
+    }
 }