* CSharpCodeGenerator.cs: Avoid ArgumentNullException when
[mono.git] / mcs / class / System / System.Security.Cryptography.X509Certificates / X509ExtensionCollection.cs
index 41819c712abab98f2cae0cb977c48c3a12e84cd2..7f03e5db937b7eedfd976cc03aa67e9367db1997 100644 (file)
@@ -7,7 +7,7 @@
 //
 // (C) 2003 Motus Technologies Inc. (http://www.motus.com)
 // Copyright (C) Tim Coleman, 2004
-// Copyright (C) 2004-2005 Novell Inc. (http://www.novell.com)
+// Copyright (C) 2004-2006 Novell Inc. (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -32,6 +32,8 @@
 #if NET_2_0 && SECURITY_DEP
 
 using System.Collections;
+using Mono.Security;
+using MX = Mono.Security.X509;
 
 namespace System.Security.Cryptography.X509Certificates {
 
@@ -46,6 +48,33 @@ namespace System.Security.Cryptography.X509Certificates {
                        _list = new ArrayList ();
                }
 
+               internal X509ExtensionCollection (MX.X509Certificate cert)
+               {
+                       _list = new ArrayList (cert.Extensions.Count);
+                       if (cert.Extensions.Count == 0)
+                               return;
+
+                       object[] parameters = new object [2];
+                       foreach (MX.X509Extension ext in cert.Extensions) {
+                               bool critical = ext.Critical;
+                               string oid = ext.Oid;
+                               byte[] raw_data = null;
+                               // extension data is embedded in an octet stream (4)
+                               ASN1 value = ext.Value;
+                               if ((value.Tag == 0x04) && (value.Count > 0))
+                                       raw_data = value [0].GetBytes ();
+
+                               parameters [0] = new AsnEncodedData (oid, raw_data);
+                               parameters [1] = critical;
+                               X509Extension newt = (X509Extension) CryptoConfig.CreateFromName (oid, parameters);
+                               if (newt == null) {
+                                       // not registred in CryptoConfig, using default
+                                       newt = new X509Extension (oid, raw_data, critical);
+                               }
+                               _list.Add (newt);
+                       }
+               }
+
                // properties
 
                public int Count {
@@ -57,16 +86,25 @@ namespace System.Security.Cryptography.X509Certificates {
                }
 
                public object SyncRoot {
-                       get { return _list.SyncRoot; }
+                       get { return this; }
                }
 
                public X509Extension this [int index] {
-                       get { return (X509Extension) _list [index]; }
+                       get {
+                               if (index < 0)
+                                       throw new InvalidOperationException ("index");
+                               return (X509Extension) _list [index];
+                       }
                }
 
                public X509Extension this [string oid] {
-                       get { 
-                               foreach (X509Extension extension in this) {
+                       get {
+                               if (oid == null)
+                                       throw new ArgumentNullException ("oid");
+                               if ((_list.Count == 0) || (oid.Length == 0))
+                                       return null;
+
+                               foreach (X509Extension extension in _list) {
                                        if (extension.Oid.Value.Equals (oid))
                                                return extension;
                                }
@@ -78,33 +116,44 @@ namespace System.Security.Cryptography.X509Certificates {
 
                public int Add (X509Extension extension) 
                {
+                       if (extension == null)
+                               throw new ArgumentNullException ("extension");
+
                        return _list.Add (extension);
                }
 
-               [MonoTODO]
                public void CopyTo (X509Extension[] array, int index) 
                {
                        if (array == null)
                                throw new ArgumentNullException ("array");
                        if (index < 0)
-                               throw new ArgumentException ("negative index");
-                       if (index > array.Length)
-                               throw new ArgumentOutOfRangeException ("index > array.Length");
+                               throw new ArgumentOutOfRangeException ("negative index");
+                       if (index >= array.Length)
+                               throw new ArgumentOutOfRangeException ("index >= array.Length");
+
+                       _list.CopyTo (array, index);
                }
 
                void ICollection.CopyTo (Array array, int index)
                {
+                       if (array == null)
+                               throw new ArgumentNullException ("array");
+                       if (index < 0)
+                               throw new ArgumentOutOfRangeException ("negative index");
+                       if (index >= array.Length)
+                               throw new ArgumentOutOfRangeException ("index >= array.Length");
+
                        _list.CopyTo (array, index);
                }
 
                public X509ExtensionEnumerator GetEnumerator () 
                {
-                       return new X509ExtensionEnumerator (this);
+                       return new X509ExtensionEnumerator (_list);
                }
 
                IEnumerator IEnumerable.GetEnumerator () 
                {
-                       return new X509ExtensionEnumerator (this);
+                       return new X509ExtensionEnumerator (_list);
                }
        }
 }