summary refs log tree commit diff
path: root/crypto/src/util
diff options
context:
space:
mode:
authorPeter Dettman <peter.dettman@bouncycastle.org>2022-06-29 14:15:10 +0700
committerPeter Dettman <peter.dettman@bouncycastle.org>2022-06-29 14:15:10 +0700
commit435210f10fd927653ce8fbc04ec537ae5d8966b6 (patch)
tree27b6ed1c029db271c3429ac57629d7f0156c5fed /crypto/src/util
parentRefactoring around Platform (diff)
downloadBouncyCastle.NET-ed25519-435210f10fd927653ce8fbc04ec537ae5d8966b6.tar.xz
Generics migration complete
Diffstat (limited to 'crypto/src/util')
-rw-r--r--crypto/src/util/Platform.cs102
-rw-r--r--crypto/src/util/collections/CollectionUtilities.cs34
-rw-r--r--crypto/src/util/collections/EmptyEnumerable.cs44
-rw-r--r--crypto/src/util/collections/EnumerableProxy.cs35
-rw-r--r--crypto/src/util/collections/HashSet.cs99
-rw-r--r--crypto/src/util/collections/ISet.cs19
-rw-r--r--crypto/src/util/collections/ReadOnlyCollection.cs44
-rw-r--r--crypto/src/util/collections/ReadOnlyDictionary.cs64
-rw-r--r--crypto/src/util/collections/ReadOnlyList.cs5
-rw-r--r--crypto/src/util/collections/ReadOnlySet.cs61
-rw-r--r--crypto/src/util/collections/UnmodifiableDictionary.cs64
-rw-r--r--crypto/src/util/collections/UnmodifiableDictionaryProxy.cs66
-rw-r--r--crypto/src/util/collections/UnmodifiableList.cs67
-rw-r--r--crypto/src/util/collections/UnmodifiableListProxy.cs61
-rw-r--r--crypto/src/util/collections/UnmodifiableSet.cs59
-rw-r--r--crypto/src/util/collections/UnmodifiableSetProxy.cs56
-rw-r--r--crypto/src/util/io/pem/PemObject.cs18
-rw-r--r--crypto/src/util/io/pem/PemReader.cs25
-rw-r--r--crypto/src/util/io/pem/PemWriter.cs1
19 files changed, 208 insertions, 716 deletions
diff --git a/crypto/src/util/Platform.cs b/crypto/src/util/Platform.cs
index f0b2406a5..b25d76dae 100644
--- a/crypto/src/util/Platform.cs
+++ b/crypto/src/util/Platform.cs
@@ -1,12 +1,6 @@
 using System;
 using System.Globalization;
 
-#if PORTABLE
-using System.Collections.Generic;
-#else
-using System.Collections;
-#endif
-
 namespace Org.BouncyCastle.Utilities
 {
     internal abstract class Platform
@@ -32,107 +26,11 @@ namespace Org.BouncyCastle.Utilities
             }
         }
 
-        internal static Exception CreateNotImplementedException(
-            string message)
-        {
-            return new NotImplementedException(message);
-        }
-
-#if PORTABLE
-        internal static System.Collections.IList CreateArrayList()
-        {
-            return new List<object>();
-        }
-        internal static System.Collections.IList CreateArrayList(int capacity)
-        {
-            return new List<object>(capacity);
-        }
-        internal static System.Collections.IList CreateArrayList(System.Collections.ICollection collection)
-        {
-            System.Collections.IList result = new List<object>(collection.Count);
-            foreach (object o in collection)
-            {
-                result.Add(o);
-            }
-            return result;
-        }
-        internal static System.Collections.IList CreateArrayList(System.Collections.IEnumerable collection)
-        {
-            System.Collections.IList result = new List<object>();
-            foreach (object o in collection)
-            {
-                result.Add(o);
-            }
-            return result;
-        }
-        internal static System.Collections.IDictionary CreateHashtable()
-        {
-            return new Dictionary<object, object>();
-        }
-        internal static System.Collections.IDictionary CreateHashtable(int capacity)
-        {
-            return new Dictionary<object, object>(capacity);
-        }
-        internal static System.Collections.IDictionary CreateHashtable(System.Collections.IDictionary dictionary)
-        {
-            System.Collections.IDictionary result = new Dictionary<object, object>(dictionary.Count);
-            foreach (System.Collections.DictionaryEntry entry in dictionary)
-            {
-                result.Add(entry.Key, entry.Value);
-            }
-            return result;
-        }
-#else
-        internal static System.Collections.IList CreateArrayList()
-        {
-            return new ArrayList();
-        }
-        internal static System.Collections.IList CreateArrayList(int capacity)
-        {
-            return new ArrayList(capacity);
-        }
-        internal static System.Collections.IList CreateArrayList(System.Collections.ICollection collection)
-        {
-            return new ArrayList(collection);
-        }
-        internal static System.Collections.IList CreateArrayList(System.Collections.IEnumerable collection)
-        {
-            ArrayList result = new ArrayList();
-            foreach (object o in collection)
-            {
-                result.Add(o);
-            }
-            return result;
-        }
-        internal static System.Collections.IDictionary CreateHashtable()
-        {
-            return new Hashtable();
-        }
-        internal static System.Collections.IDictionary CreateHashtable(int capacity)
-        {
-            return new Hashtable(capacity);
-        }
-        internal static System.Collections.IDictionary CreateHashtable(System.Collections.IDictionary dictionary)
-        {
-            return new Hashtable(dictionary);
-        }
-#endif
-
         internal static int GetHashCode(object obj)
         {
             return null == obj ? 0 : obj.GetHashCode();
         }
 
-        internal static string ToLowerInvariant(string s)
-        {
-            return s.ToLowerInvariant();
-        }
-
-        internal static string ToUpperInvariant(string s)
-        {
-            return s.ToUpperInvariant();
-        }
-
         internal static readonly string NewLine = Environment.NewLine;
 
         internal static void Dispose(IDisposable d)
diff --git a/crypto/src/util/collections/CollectionUtilities.cs b/crypto/src/util/collections/CollectionUtilities.cs
index 4a42cf19d..41b558130 100644
--- a/crypto/src/util/collections/CollectionUtilities.cs
+++ b/crypto/src/util/collections/CollectionUtilities.cs
@@ -1,5 +1,4 @@
 using System;
-using System.Collections;
 using System.Collections.Generic;
 using System.Text;
 
@@ -7,19 +6,6 @@ namespace Org.BouncyCastle.Utilities.Collections
 {
     public abstract class CollectionUtilities
     {
-        public static void AddRange(IList to, IEnumerable range)
-        {
-            foreach (object o in range)
-            {
-                to.Add(o);
-            }
-        }
-
-        public static void CollectMatches<T>(ICollection<T> matches, ISelector<T> selector, params IStore<T>[] stores)
-        {
-            CollectMatches(matches, selector, stores);
-        }
-
         public static void CollectMatches<T>(ICollection<T> matches, ISelector<T> selector,
             IEnumerable<IStore<T>> stores)
         {
@@ -45,6 +31,12 @@ namespace Org.BouncyCastle.Utilities.Collections
             return new StoreImpl<T>(contents);
         }
 
+        public static T GetValueOrKey<T>(IDictionary<T, T> d, T k)
+            where T : class
+        {
+            return d.TryGetValue(k, out var v) ? v : k;
+        }
+
         public static V GetValueOrNull<K, V>(IDictionary<K, V> d, K k)
             where V : class
         {
@@ -56,14 +48,14 @@ namespace Org.BouncyCastle.Utilities.Collections
             return new EnumerableProxy<T>(e);
         }
 
-        public static IDictionary ReadOnly(IDictionary d)
+        public static ICollection<T> ReadOnly<T>(ICollection<T> c)
         {
-            return new UnmodifiableDictionaryProxy(d);
+            return new ReadOnlyCollectionProxy<T>(c);
         }
 
-        public static IList ReadOnly(IList l)
+        public static IDictionary<K, V> ReadOnly<K, V>(IDictionary<K, V> d)
         {
-            return new UnmodifiableListProxy(l);
+            return new ReadOnlyDictionaryProxy<K, V>(d);
         }
 
         public static IList<T> ReadOnly<T>(IList<T> l)
@@ -71,9 +63,9 @@ namespace Org.BouncyCastle.Utilities.Collections
             return new ReadOnlyListProxy<T>(l);
         }
 
-        public static ISet ReadOnly(ISet s)
+        public static ISet<T> ReadOnly<T>(ISet<T> s)
         {
-            return new UnmodifiableSetProxy(s);
+            return new ReadOnlySetProxy<T>(s);
         }
 
         public static bool Remove<K, V>(IDictionary<K, V> d, K k, out V v)
@@ -85,7 +77,7 @@ namespace Org.BouncyCastle.Utilities.Collections
             return true;
         }
 
-        public static object RequireNext(IEnumerator e)
+        public static T RequireNext<T>(IEnumerator<T> e)
         {
             if (!e.MoveNext())
                 throw new InvalidOperationException();
diff --git a/crypto/src/util/collections/EmptyEnumerable.cs b/crypto/src/util/collections/EmptyEnumerable.cs
deleted file mode 100644
index a61a0789a..000000000
--- a/crypto/src/util/collections/EmptyEnumerable.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-using System;
-using System.Collections;
-
-namespace Org.BouncyCastle.Utilities.Collections
-{
-	public sealed class EmptyEnumerable
-		: IEnumerable
-	{
-		public static readonly IEnumerable Instance = new EmptyEnumerable();
-
-		private EmptyEnumerable()
-		{
-		}
-
-		public IEnumerator GetEnumerator()
-		{
-			return EmptyEnumerator.Instance;
-		}
-	}
-
-	public sealed class EmptyEnumerator
-		: IEnumerator
-	{
-		public static readonly IEnumerator Instance = new EmptyEnumerator();
-
-		private EmptyEnumerator()
-		{
-		}
-
-		public bool MoveNext()
-		{
-			return false;
-		}
-
-		public void Reset()
-		{
-		}
-
-		public object Current
-		{
-			get { throw new InvalidOperationException("No elements"); }
-		}
-	}
-}
diff --git a/crypto/src/util/collections/EnumerableProxy.cs b/crypto/src/util/collections/EnumerableProxy.cs
index 36f78d342..1d97b8f22 100644
--- a/crypto/src/util/collections/EnumerableProxy.cs
+++ b/crypto/src/util/collections/EnumerableProxy.cs
@@ -1,50 +1,29 @@
 using System;
-using System.Collections;
 using System.Collections.Generic;
 
 namespace Org.BouncyCastle.Utilities.Collections
 {
-	public sealed class EnumerableProxy
-		: IEnumerable
-	{
-		private readonly IEnumerable inner;
-
-		public EnumerableProxy(
-			IEnumerable inner)
-		{
-			if (inner == null)
-				throw new ArgumentNullException("inner");
-
-			this.inner = inner;
-		}
-
-		public IEnumerator GetEnumerator()
-		{
-			return inner.GetEnumerator();
-		}
-	}
-
 	internal sealed class EnumerableProxy<T>
 		: IEnumerable<T>
 	{
-		private readonly IEnumerable<T> m_inner;
+		private readonly IEnumerable<T> m_target;
 
-		internal EnumerableProxy(IEnumerable<T> inner)
+		internal EnumerableProxy(IEnumerable<T> target)
 		{
-			if (inner == null)
-				throw new ArgumentNullException("inner");
+			if (target == null)
+				throw new ArgumentNullException(nameof(target));
 
-			m_inner = inner;
+			m_target = target;
 		}
 
 		System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
 		{
-			return m_inner.GetEnumerator();
+			return m_target.GetEnumerator();
 		}
 
 		public IEnumerator<T> GetEnumerator()
 		{
-			return m_inner.GetEnumerator();
+			return m_target.GetEnumerator();
 		}
 	}
 }
diff --git a/crypto/src/util/collections/HashSet.cs b/crypto/src/util/collections/HashSet.cs
deleted file mode 100644
index 1facb58e3..000000000
--- a/crypto/src/util/collections/HashSet.cs
+++ /dev/null
@@ -1,99 +0,0 @@
-using System;
-using System.Collections;
-
-namespace Org.BouncyCastle.Utilities.Collections
-{
-	public class HashSet
-		: ISet
-	{
-		private readonly IDictionary impl = Platform.CreateHashtable();
-
-		public HashSet()
-		{
-		}
-
-		public HashSet(IEnumerable s)
-		{
-			foreach (object o in s)
-			{
-				Add(o);
-			}
-		}
-
-		public virtual void Add(object o)
-		{
-			impl[o] = null;
-		}
-
-		public virtual void AddAll(IEnumerable e)
-		{
-			foreach (object o in e)
-			{
-				Add(o);
-			}
-		}
-
-		public virtual void Clear()
-		{
-			impl.Clear();
-		}
-
-		public virtual bool Contains(object o)
-		{
-			return impl.Contains(o);
-		}
-
-		public virtual void CopyTo(Array array, int index)
-		{
-			impl.Keys.CopyTo(array, index);
-		}
-
-		public virtual int Count
-		{
-			get { return impl.Count; }
-		}
-
-		public virtual IEnumerator GetEnumerator()
-		{
-			return impl.Keys.GetEnumerator();
-		}
-
-		public virtual bool IsEmpty
-		{
-			get { return impl.Count == 0; }
-		}
-
-		public virtual bool IsFixedSize
-		{
-			get { return impl.IsFixedSize; }
-		}
-
-		public virtual bool IsReadOnly
-		{
-			get { return impl.IsReadOnly; }
-		}
-
-		public virtual bool IsSynchronized
-		{
-			get { return impl.IsSynchronized; }
-		}
-
-		public virtual void Remove(object o)
-		{
-			impl.Remove(o);
-		}
-
-		public virtual void RemoveAll(IEnumerable e)
-		{
-			foreach (object o in e)
-			{
-				Remove(o);
-			}
-		}
-
-		public virtual object SyncRoot
-		{
-			get { return impl.SyncRoot; }
-		}
-	}
-}
diff --git a/crypto/src/util/collections/ISet.cs b/crypto/src/util/collections/ISet.cs
deleted file mode 100644
index 1f8edba40..000000000
--- a/crypto/src/util/collections/ISet.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using System;
-using System.Collections;
-
-namespace Org.BouncyCastle.Utilities.Collections
-{
-	public interface ISet
-		: ICollection
-	{
-		void Add(object o);
-		void AddAll(IEnumerable e);
-		void Clear();
-		bool Contains(object o);
-		bool IsEmpty { get; }
-		bool IsFixedSize { get; }
-		bool IsReadOnly { get; }
-		void Remove(object o);
-		void RemoveAll(IEnumerable e);
-	}
-}
diff --git a/crypto/src/util/collections/ReadOnlyCollection.cs b/crypto/src/util/collections/ReadOnlyCollection.cs
new file mode 100644
index 000000000..a44491d0b
--- /dev/null
+++ b/crypto/src/util/collections/ReadOnlyCollection.cs
@@ -0,0 +1,44 @@
+using System;
+using System.Collections.Generic;
+
+namespace Org.BouncyCastle.Utilities.Collections
+{
+    internal abstract class ReadOnlyCollection<T>
+        : ICollection<T>
+    {
+        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
+        {
+            return GetEnumerator();
+        }
+
+        public bool IsReadOnly => true;
+
+        public void Add(T item) => throw new NotSupportedException();
+        public void Clear() => throw new NotSupportedException();
+        public bool Remove(T item) => throw new NotSupportedException();
+
+        public abstract bool Contains(T item);
+        public abstract int Count { get; }
+        public abstract void CopyTo(T[] array, int arrayIndex);
+        public abstract IEnumerator<T> GetEnumerator();
+    }
+
+    internal class ReadOnlyCollectionProxy<T>
+        : ReadOnlyCollection<T>
+    {
+        private readonly ICollection<T> m_target;
+
+        internal ReadOnlyCollectionProxy(ICollection<T> target)
+        {
+            if (target == null)
+                throw new ArgumentNullException(nameof(target));
+
+            m_target = target;
+        }
+
+        public override bool Contains(T item) => m_target.Contains(item);
+        public override int Count => m_target.Count;
+        public override void CopyTo(T[] array, int arrayIndex) => m_target.CopyTo(array, arrayIndex);
+        public override IEnumerator<T> GetEnumerator() => m_target.GetEnumerator();
+    }
+}
diff --git a/crypto/src/util/collections/ReadOnlyDictionary.cs b/crypto/src/util/collections/ReadOnlyDictionary.cs
new file mode 100644
index 000000000..f87bcc506
--- /dev/null
+++ b/crypto/src/util/collections/ReadOnlyDictionary.cs
@@ -0,0 +1,64 @@
+using System;
+using System.Collections.Generic;
+
+namespace Org.BouncyCastle.Utilities.Collections
+{
+    internal abstract class ReadOnlyDictionary<K, V>
+        : IDictionary<K, V>
+    {
+        public V this[K key]
+        {
+            get { return Lookup(key); }
+            set { throw new NotSupportedException(); }
+        }
+
+        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
+        {
+            return GetEnumerator();
+        }
+
+        public bool IsReadOnly => true;
+
+        public void Add(K key, V value) => throw new NotSupportedException();
+        public void Add(KeyValuePair<K, V> item) => throw new NotSupportedException();
+        public void Clear() => throw new NotSupportedException();
+        public bool Remove(K key) => throw new NotSupportedException();
+        public bool Remove(KeyValuePair<K, V> item) => throw new NotSupportedException();
+
+        public abstract bool Contains(KeyValuePair<K, V> item);
+        public abstract bool ContainsKey(K key);
+        public abstract void CopyTo(KeyValuePair<K, V>[] array, int arrayIndex);
+        public abstract int Count { get; }
+        public abstract IEnumerator<KeyValuePair<K, V>> GetEnumerator();
+        public abstract ICollection<K> Keys { get; }
+        public abstract bool TryGetValue(K key, out V value);
+        public abstract ICollection<V> Values { get; }
+
+        protected abstract V Lookup(K key);
+    }
+
+    internal class ReadOnlyDictionaryProxy<K, V>
+        : ReadOnlyDictionary<K, V>
+    {
+        private readonly IDictionary<K, V> m_target;
+
+        internal ReadOnlyDictionaryProxy(IDictionary<K, V> target)
+        {
+            if (target == null)
+                throw new ArgumentNullException(nameof(target));
+
+            m_target = target;
+        }
+
+        public override bool Contains(KeyValuePair<K, V> item) => m_target.Contains(item);
+        public override bool ContainsKey(K key) => m_target.ContainsKey(key);
+        public override void CopyTo(KeyValuePair<K, V>[] array, int arrayIndex) => m_target.CopyTo(array, arrayIndex);
+        public override int Count => m_target.Count;
+        public override IEnumerator<KeyValuePair<K, V>> GetEnumerator() => m_target.GetEnumerator();
+        public override ICollection<K> Keys => new ReadOnlyCollectionProxy<K>(m_target.Keys);
+        public override bool TryGetValue(K key, out V value) => m_target.TryGetValue(key, out value);
+        public override ICollection<V> Values => new ReadOnlyCollectionProxy<V>(m_target.Values);
+
+        protected override V Lookup(K key) => m_target[key];
+    }
+}
diff --git a/crypto/src/util/collections/ReadOnlyList.cs b/crypto/src/util/collections/ReadOnlyList.cs
index 707c73bfd..c4d367c47 100644
--- a/crypto/src/util/collections/ReadOnlyList.cs
+++ b/crypto/src/util/collections/ReadOnlyList.cs
@@ -25,10 +25,10 @@ namespace Org.BouncyCastle.Utilities.Collections
         public bool Remove(T item) => throw new NotSupportedException();
         public void RemoveAt(int index) => throw new NotSupportedException();
 
-        public abstract int Count { get; }
 
         public abstract bool Contains(T item);
         public abstract void CopyTo(T[] array, int arrayIndex);
+        public abstract int Count { get; }
         public abstract IEnumerator<T> GetEnumerator();
         public abstract int IndexOf(T item);
 
@@ -42,6 +42,9 @@ namespace Org.BouncyCastle.Utilities.Collections
 
         internal ReadOnlyListProxy(IList<T> target)
         {
+            if (target == null)
+                throw new ArgumentNullException(nameof(target));
+
             m_target = target;
         }
 
diff --git a/crypto/src/util/collections/ReadOnlySet.cs b/crypto/src/util/collections/ReadOnlySet.cs
new file mode 100644
index 000000000..36c198f07
--- /dev/null
+++ b/crypto/src/util/collections/ReadOnlySet.cs
@@ -0,0 +1,61 @@
+using System;
+using System.Collections.Generic;
+
+namespace Org.BouncyCastle.Utilities.Collections
+{
+    internal abstract class ReadOnlySet<T>
+        : ISet<T>
+    {
+        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
+        {
+            return GetEnumerator();
+        }
+
+        public bool IsReadOnly => true;
+
+        void ICollection<T>.Add(T item) => throw new NotSupportedException();
+
+        public bool Add(T item) => throw new NotSupportedException();
+        public void Clear() => throw new NotSupportedException();
+        public void ExceptWith(IEnumerable<T> other) => throw new NotSupportedException();
+        public void IntersectWith(IEnumerable<T> other) => throw new NotSupportedException();
+        public bool Remove(T item) => throw new NotSupportedException();
+        public bool SetEquals(IEnumerable<T> other) => throw new NotSupportedException();
+        public void SymmetricExceptWith(IEnumerable<T> other) => throw new NotSupportedException();
+        public void UnionWith(IEnumerable<T> other) => throw new NotSupportedException();
+
+        public abstract bool Contains(T item);
+        public abstract void CopyTo(T[] array, int arrayIndex);
+        public abstract int Count { get; }
+        public abstract IEnumerator<T> GetEnumerator();
+        public abstract bool IsProperSubsetOf(IEnumerable<T> other);
+        public abstract bool IsProperSupersetOf(IEnumerable<T> other);
+        public abstract bool IsSubsetOf(IEnumerable<T> other);
+        public abstract bool IsSupersetOf(IEnumerable<T> other);
+        public abstract bool Overlaps(IEnumerable<T> other);
+    }
+
+    internal class ReadOnlySetProxy<T>
+        : ReadOnlySet<T>
+    {
+        private readonly ISet<T> m_target;
+
+        internal ReadOnlySetProxy(ISet<T> target)
+        {
+            if (target == null)
+                throw new ArgumentNullException(nameof(target));
+
+            m_target = target;
+        }
+
+        public override bool Contains(T item) => m_target.Contains(item);
+        public override void CopyTo(T[] array, int arrayIndex) => m_target.CopyTo(array, arrayIndex);
+        public override int Count => m_target.Count;
+        public override IEnumerator<T> GetEnumerator() => m_target.GetEnumerator();
+        public override bool IsProperSubsetOf(IEnumerable<T> other) => m_target.IsProperSubsetOf(other);
+        public override bool IsProperSupersetOf(IEnumerable<T> other) => m_target.IsProperSupersetOf(other);
+        public override bool IsSubsetOf(IEnumerable<T> other) => m_target.IsSubsetOf(other);
+        public override bool IsSupersetOf(IEnumerable<T> other) => m_target.IsSupersetOf(other);
+        public override bool Overlaps(IEnumerable<T> other) => m_target.Overlaps(other);
+    }
+}
diff --git a/crypto/src/util/collections/UnmodifiableDictionary.cs b/crypto/src/util/collections/UnmodifiableDictionary.cs
deleted file mode 100644
index 3b4ba22ae..000000000
--- a/crypto/src/util/collections/UnmodifiableDictionary.cs
+++ /dev/null
@@ -1,64 +0,0 @@
-using System;
-using System.Collections;
-
-namespace Org.BouncyCastle.Utilities.Collections
-{
-	public abstract class UnmodifiableDictionary
-		: IDictionary
-	{
-		protected UnmodifiableDictionary()
-		{
-		}
-
-		public virtual void Add(object k, object v)
-		{
-			throw new NotSupportedException();
-		}
-
-		public virtual void Clear()
-		{
-			throw new NotSupportedException();
-		}
-
-		public abstract bool Contains(object k);
-
-		public abstract void CopyTo(Array array, int index);
-
-		public abstract int Count { get; }
-
-		System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
-		{
-			return GetEnumerator();
-		}
-
-		public abstract IDictionaryEnumerator GetEnumerator();
-
-		public virtual void Remove(object k)
-		{
-			throw new NotSupportedException();
-		}
-
-		public abstract bool IsFixedSize { get; }
-
-		public virtual bool IsReadOnly
-		{
-			get { return true; }
-		}
-
-		public abstract bool IsSynchronized { get; }
-
-		public abstract object SyncRoot { get; }
-
-		public abstract ICollection Keys { get; }
-
-		public abstract ICollection Values { get; }
-
-		public virtual object this[object k]
-		{
-			get { return GetValue(k); }
-			set { throw new NotSupportedException(); }
-		}
-
-		protected abstract object GetValue(object k);
-	}
-}
diff --git a/crypto/src/util/collections/UnmodifiableDictionaryProxy.cs b/crypto/src/util/collections/UnmodifiableDictionaryProxy.cs
deleted file mode 100644
index 0fca909a3..000000000
--- a/crypto/src/util/collections/UnmodifiableDictionaryProxy.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-using System;
-using System.Collections;
-
-namespace Org.BouncyCastle.Utilities.Collections
-{
-	public class UnmodifiableDictionaryProxy
-		: UnmodifiableDictionary
-	{
-		private readonly IDictionary d;
-
-		public UnmodifiableDictionaryProxy(IDictionary d)
-		{
-			this.d = d;
-		}
-
-		public override bool Contains(object k)
-		{
-			return d.Contains(k);
-		}
-
-		public override void CopyTo(Array array, int index)
-		{
-			d.CopyTo(array, index);
-		}
-
-		public override int Count
-		{
-			get { return d.Count; }
-		}
-
-		public override IDictionaryEnumerator GetEnumerator()
-		{
-			return d.GetEnumerator();
-		}
-
-		public override bool IsFixedSize
-		{
-			get { return d.IsFixedSize; }
-		}
-
-		public override bool IsSynchronized
-		{
-			get { return d.IsSynchronized; }
-		}
-
-		public override object SyncRoot
-		{
-			get { return d.SyncRoot; }
-		}
-
-		public override ICollection Keys
-		{
-			get { return d.Keys; }
-		}
-
-		public override ICollection Values
-		{
-			get { return d.Values; }
-		}
-
-		protected override object GetValue(object k)
-		{
-			return d[k];
-		}
-	}
-}
diff --git a/crypto/src/util/collections/UnmodifiableList.cs b/crypto/src/util/collections/UnmodifiableList.cs
deleted file mode 100644
index 28e49eac3..000000000
--- a/crypto/src/util/collections/UnmodifiableList.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-using System;
-using System.Collections;
-
-namespace Org.BouncyCastle.Utilities.Collections
-{
-	public abstract class UnmodifiableList
-		: IList
-	{
-		protected UnmodifiableList()
-		{
-		}
-
-		public virtual int Add(object o)
-		{
-			throw new NotSupportedException();
-		}
-
-		public virtual void Clear()
-		{
-			throw new NotSupportedException();
-		}
-
-		public abstract bool Contains(object o);
-
-		public abstract void CopyTo(Array array, int index);
-
-		public abstract int Count { get; }
-
-		public abstract IEnumerator GetEnumerator();
-
-		public abstract int IndexOf(object o);
-
-		public virtual void Insert(int i, object o)
-		{
-			throw new NotSupportedException();
-		}
-
-		public abstract bool IsFixedSize { get; }
-
-		public virtual bool IsReadOnly
-		{
-			get { return true; }
-		}
-
-		public abstract bool IsSynchronized { get; }
-
-		public virtual void Remove(object o)
-		{
-			throw new NotSupportedException();
-		}
-
-		public virtual void RemoveAt(int i)
-		{
-			throw new NotSupportedException();
-		}
-
-		public abstract object SyncRoot { get; }
-		
-		public virtual object this[int i]
-		{
-			get { return GetValue(i); }
-			set { throw new NotSupportedException(); }
-		}
-
-		protected abstract object GetValue(int i);
-	}
-}
diff --git a/crypto/src/util/collections/UnmodifiableListProxy.cs b/crypto/src/util/collections/UnmodifiableListProxy.cs
deleted file mode 100644
index 9d00737ef..000000000
--- a/crypto/src/util/collections/UnmodifiableListProxy.cs
+++ /dev/null
@@ -1,61 +0,0 @@
-using System;
-using System.Collections;
-
-namespace Org.BouncyCastle.Utilities.Collections
-{
-	public class UnmodifiableListProxy
-		: UnmodifiableList
-	{
-		private readonly IList l;
-
-		public UnmodifiableListProxy(IList l)
-		{
-			this.l = l;
-		}
-
-		public override bool Contains(object o)
-		{
-			return l.Contains(o);
-		}
-
-		public override void CopyTo(Array array, int index)
-		{
-			l.CopyTo(array, index);
-		}
-
-		public override int Count
-		{
-			get { return l.Count; }
-		}
-
-		public override IEnumerator GetEnumerator()
-		{
-			return l.GetEnumerator();
-		}
-
-		public override int IndexOf(object o)
-		{
-			return l.IndexOf(o);
-		}
-
-		public override bool IsFixedSize
-		{
-			get { return l.IsFixedSize; }
-		}
-
-		public override bool IsSynchronized
-		{
-			get { return l.IsSynchronized; }
-		}
-
-		public override object SyncRoot
-		{
-			get { return l.SyncRoot; }
-		}
-
-		protected override object GetValue(int i)
-		{
-			return l[i];
-		}
-	}
-}
diff --git a/crypto/src/util/collections/UnmodifiableSet.cs b/crypto/src/util/collections/UnmodifiableSet.cs
deleted file mode 100644
index 8792815ac..000000000
--- a/crypto/src/util/collections/UnmodifiableSet.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-using System;
-using System.Collections;
-
-namespace Org.BouncyCastle.Utilities.Collections
-{
-	public abstract class UnmodifiableSet
-		: ISet
-	{
-		protected UnmodifiableSet()
-		{
-		}
-
-		public virtual void Add(object o)
-		{
-			throw new NotSupportedException();
-		}
-
-		public virtual void AddAll(IEnumerable e)
-		{
-			throw new NotSupportedException();
-		}
-
-		public virtual void Clear()
-		{
-			throw new NotSupportedException();
-		}
-		
-		public abstract bool Contains(object o);
-
-		public abstract void CopyTo(Array array, int index);
-
-		public abstract int Count { get; }
-
-		public abstract IEnumerator GetEnumerator();
-
-		public abstract bool IsEmpty { get; }
-
-		public abstract bool IsFixedSize { get; }
-
-		public virtual bool IsReadOnly
-		{
-			get { return true; }
-		}
-
-		public abstract bool IsSynchronized { get; }
-
-		public abstract object SyncRoot { get; }
-
-		public virtual void Remove(object o)
-		{
-			throw new NotSupportedException();
-		}
-
-		public virtual void RemoveAll(IEnumerable e)
-		{
-			throw new NotSupportedException();
-		}
-	}
-}
diff --git a/crypto/src/util/collections/UnmodifiableSetProxy.cs b/crypto/src/util/collections/UnmodifiableSetProxy.cs
deleted file mode 100644
index e119e2957..000000000
--- a/crypto/src/util/collections/UnmodifiableSetProxy.cs
+++ /dev/null
@@ -1,56 +0,0 @@
-using System;
-using System.Collections;
-
-namespace Org.BouncyCastle.Utilities.Collections
-{
-	public class UnmodifiableSetProxy
-		: UnmodifiableSet
-	{
-		private readonly ISet s;
-
-		public UnmodifiableSetProxy (ISet s)
-		{
-			this.s = s;
-		}
-
-		public override bool Contains(object o)
-		{
-			return s.Contains(o);
-		}
-
-		public override void CopyTo(Array array, int index)
-		{
-			s.CopyTo(array, index);
-		}
-
-		public override int Count
-		{
-			get { return s.Count; }
-		}
-
-		public override IEnumerator GetEnumerator()
-		{
-			return s.GetEnumerator();
-		}
-
-		public override bool IsEmpty
-		{
-			get { return s.IsEmpty; }
-		}
-
-		public override bool IsFixedSize
-		{
-			get { return s.IsFixedSize; }
-		}
-
-		public override bool IsSynchronized
-		{
-			get { return s.IsSynchronized; }
-		}
-
-		public override object SyncRoot
-		{
-			get { return s.SyncRoot; }
-		}
-	}
-}
diff --git a/crypto/src/util/io/pem/PemObject.cs b/crypto/src/util/io/pem/PemObject.cs
index fce429f39..2a152f81d 100644
--- a/crypto/src/util/io/pem/PemObject.cs
+++ b/crypto/src/util/io/pem/PemObject.cs
@@ -1,26 +1,24 @@
 using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities.Collections;
+using System.Collections.Generic;
 
 namespace Org.BouncyCastle.Utilities.IO.Pem
 {
 	public class PemObject
 		: PemObjectGenerator
 	{
-		private string		type;
-		private IList		headers;
-		private byte[]		content;
+		private string type;
+		private IList<PemHeader> headers;
+		private byte[] content;
 
 		public PemObject(string type, byte[] content)
-			: this(type, Platform.CreateArrayList(), content)
+			: this(type, new List<PemHeader>(), content)
 		{
 		}
 
-		public PemObject(string type, IList headers, byte[] content)
+		public PemObject(string type, IList<PemHeader> headers, byte[] content)
 		{
 			this.type = type;
-            this.headers = Platform.CreateArrayList(headers);
+            this.headers = new List<PemHeader>(headers);
 			this.content = content;
 		}
 
@@ -29,7 +27,7 @@ namespace Org.BouncyCastle.Utilities.IO.Pem
 			get { return type; }
 		}
 
-		public IList Headers
+		public IList<PemHeader> Headers
 		{
 			get { return headers; }
 		}
diff --git a/crypto/src/util/io/pem/PemReader.cs b/crypto/src/util/io/pem/PemReader.cs
index a32ca8181..cd19e95b8 100644
--- a/crypto/src/util/io/pem/PemReader.cs
+++ b/crypto/src/util/io/pem/PemReader.cs
@@ -1,8 +1,7 @@
 using System;
-using System.Collections;
+using System.Collections.Generic;
 using System.IO;
 
-
 using Org.BouncyCastle.Utilities.Encoders;
 
 namespace Org.BouncyCastle.Utilities.IO.Pem
@@ -13,11 +12,9 @@ namespace Org.BouncyCastle.Utilities.IO.Pem
 		private readonly TextReader reader;
 		private readonly MemoryStream buffer;
 		private readonly StreamWriter textBuffer;
-		private readonly IList pushback = Platform.CreateArrayList();
+		private readonly List<int> pushback = new List<int>();
 		int c = 0;
 
-		
-
 		public PemReader(TextReader reader)
 		{
 			if (reader == null)
@@ -47,7 +44,7 @@ namespace Org.BouncyCastle.Utilities.IO.Pem
 			// Look for BEGIN
 			//
 
-			for (; ; )
+			for (;;)
 			{
 
 				// Seek a leading dash, ignore anything up to that point.
@@ -107,7 +104,7 @@ namespace Org.BouncyCastle.Utilities.IO.Pem
 			// Look for a colon for up to 64 characters, as an indication there might be a header.
 			//
 
-			IList headers = Platform.CreateArrayList();
+			var headers = new List<PemHeader>();
 
 			while (seekColon(64))
             {
@@ -227,7 +224,7 @@ namespace Org.BouncyCastle.Utilities.IO.Pem
 		{
 			c = 0;
 			bool colonFound = false;
-			IList read = Platform.CreateArrayList();
+			var read = new List<int>();
 
 			for (; upTo>=0 && c >=0; upTo--)
             {
@@ -308,7 +305,6 @@ namespace Org.BouncyCastle.Utilities.IO.Pem
 
 			return true;
         }
-		
 
 		/// <summary>
 		/// Consume until dash.
@@ -338,8 +334,6 @@ namespace Org.BouncyCastle.Utilities.IO.Pem
 			return c > -1;
 		}
 
-
-
 		private void PushBack(int value)
         {
 			if (pushback.Count == 0)
@@ -351,21 +345,16 @@ namespace Org.BouncyCastle.Utilities.IO.Pem
             }
         }
 
-
 		private int Read()
         {
-			if (pushback.Count>0)
+			if (pushback.Count > 0)
             {
-				int i = (int)pushback[0];
+				int i = pushback[0];
 				pushback.RemoveAt(0);
 				return i;
             }
 
 			return reader.Read();
         }
-
-
-
-
 	}
 }
diff --git a/crypto/src/util/io/pem/PemWriter.cs b/crypto/src/util/io/pem/PemWriter.cs
index e85b31543..87968a727 100644
--- a/crypto/src/util/io/pem/PemWriter.cs
+++ b/crypto/src/util/io/pem/PemWriter.cs
@@ -1,5 +1,4 @@
 using System;
-using System.Collections;
 using System.IO;
 
 using Org.BouncyCastle.Utilities.Encoders;