2005-06-10 Sebastien Pouliot <sebastien@ximian.com>
[mono.git] / mcs / class / corlib / System.Security.Cryptography / CryptoConfig.cs
index 86997f52358f5d009256647e6050678624d887b1..e51ce0f45f0b0ff661156a77772a32a112b7d7ac 100644 (file)
@@ -34,12 +34,17 @@ using System.Globalization;
 using System.IO;
 using System.Reflection;
 using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Security.Permissions;
 using System.Text;
 
 using Mono.Xml;
 
 namespace System.Security.Cryptography {
 
+#if NET_2_0
+[ComVisible (true)]
+#endif
 public class CryptoConfig {
 
        static private object lockObject;
@@ -67,6 +72,11 @@ public class CryptoConfig {
        private const string defaultRSASigDesc = defaultNamespace + "RSAPKCS1SHA1SignatureDescription";
 #if NET_2_0
        private const string defaultRIPEMD160 = defaultNamespace + "RIPEMD160Managed";
+       private const string defaultHMACMD5 = defaultNamespace + "HMACMD5";
+       private const string defaultHMACRIPEMD160 = defaultNamespace + "HMACRIPEMD160";
+       private const string defaultHMACSHA256 = defaultNamespace + "HMACSHA256";
+       private const string defaultHMACSHA384 = defaultNamespace + "HMACSHA384";
+       private const string defaultHMACSHA512 = defaultNamespace + "HMACSHA512";
 #endif
 
        // LAMESPEC: undocumented names in CryptoConfig
@@ -109,7 +119,7 @@ public class CryptoConfig {
        private const string oidSHA384 = "2.16.840.1.101.3.4.2.2";
        private const string oidSHA512 = "2.16.840.1.101.3.4.2.3";
        // new in 2.0
-       private const string oidRSA = "1.2.840.113549.1.1.1";
+//     private const string oidRSA = "1.2.840.113549.1.1.1";
        private const string oidDSA = "1.2.840.10040.4.1";
        private const string oidDES = "1.3.14.3.2.7";
        private const string oid3DES = "1.2.840.113549.3.7";
@@ -157,8 +167,8 @@ public class CryptoConfig {
        private const string nameRNGa = "RandomNumberGenerator";
        private const string nameRNGb = "System.Security.Cryptography.RandomNumberGenerator";
        private const string nameKeyHasha = "System.Security.Cryptography.KeyedHashAlgorithm";
-       private const string nameHMACa = "HMACSHA1";
-       private const string nameHMACb = "System.Security.Cryptography.HMACSHA1";
+       private const string nameHMACSHA1a = "HMACSHA1";
+       private const string nameHMACSHA1b = "System.Security.Cryptography.HMACSHA1";
        private const string nameMAC3DESa = "MACTripleDES";
        private const string nameMAC3DESb = "System.Security.Cryptography.MACTripleDES";
        // LAMESPEC: only documentated in ".NET Framework Security" book
@@ -167,6 +177,18 @@ public class CryptoConfig {
        private const string nameRIPEMD160a = "RIPEMD160";
        private const string nameRIPEMD160b = "RIPEMD-160";
        private const string nameRIPEMD160c = "System.Security.Cryptography.RIPEMD160";
+       private const string nameHMACa = "HMAC";
+       private const string nameHMACb = "System.Security.Cryptography.HMAC";
+       private const string nameHMACMD5a = "HMACMD5";
+       private const string nameHMACMD5b = "System.Security.Cryptography.HMACMD5";
+       private const string nameHMACRIPEMD160a = "HMACRIPEMD160";
+       private const string nameHMACRIPEMD160b = "System.Security.Cryptography.HMACRIPEMD160";
+       private const string nameHMACSHA256a = "HMACSHA256";
+       private const string nameHMACSHA256b = "System.Security.Cryptography.HMACSHA256";
+       private const string nameHMACSHA384a = "HMACSHA384";
+       private const string nameHMACSHA384b = "System.Security.Cryptography.HMACSHA384";
+       private const string nameHMACSHA512a = "HMACSHA512";
+       private const string nameHMACSHA512b = "System.Security.Cryptography.HMACSHA512";
 #endif
 
        private const string urlXmlDsig = "http://www.w3.org/2000/09/xmldsig#";
@@ -202,7 +224,7 @@ public class CryptoConfig {
 
        private static void Initialize () 
        {
-               algorithms = new Hashtable ();
+               Hashtable algorithms = new Hashtable ();
                // see list @ http://msdn.microsoft.com/library/en-us/cpref/html/
                // frlrfSystemSecurityCryptographyCryptoConfigClassTopic.asp
                algorithms.Add (nameSHA1a, defaultSHA1);
@@ -253,14 +275,25 @@ public class CryptoConfig {
                algorithms.Add (nameRNGa, defaultRNG);
                algorithms.Add (nameRNGb, defaultRNG);
                algorithms.Add (nameKeyHasha, defaultHMAC);
-               algorithms.Add (nameHMACa, defaultHMAC);
-               algorithms.Add (nameHMACb, defaultHMAC);
+               algorithms.Add (nameHMACSHA1a, defaultHMAC);
+               algorithms.Add (nameHMACSHA1b, defaultHMAC);
                algorithms.Add (nameMAC3DESa, defaultMAC3DES);
                algorithms.Add (nameMAC3DESb, defaultMAC3DES);
 #if NET_2_0
                algorithms.Add (nameRIPEMD160a, defaultRIPEMD160);
                algorithms.Add (nameRIPEMD160b, defaultRIPEMD160);
                algorithms.Add (nameRIPEMD160c, defaultRIPEMD160);
+               algorithms.Add (nameHMACb, defaultHMAC);
+               algorithms.Add (nameHMACMD5a, defaultHMACMD5);
+               algorithms.Add (nameHMACMD5b, defaultHMACMD5);
+               algorithms.Add (nameHMACRIPEMD160a, defaultHMACRIPEMD160);
+               algorithms.Add (nameHMACRIPEMD160b, defaultHMACRIPEMD160);
+               algorithms.Add (nameHMACSHA256a, defaultHMACSHA256);
+               algorithms.Add (nameHMACSHA256b, defaultHMACSHA256);
+               algorithms.Add (nameHMACSHA384a, defaultHMACSHA384);
+               algorithms.Add (nameHMACSHA384b, defaultHMACSHA384);
+               algorithms.Add (nameHMACSHA512a, defaultHMACSHA512);
+               algorithms.Add (nameHMACSHA512b, defaultHMACSHA512);
 #endif
 
                // LAMESPEC These URLs aren't documented but (hint) installing the WSDK
@@ -287,7 +320,7 @@ public class CryptoConfig {
                algorithms.Add (urlKeyValueRSA, defaultKeyValueRSA);
                algorithms.Add (urlRetrievalMethod, defaultRetrievalMethod);
 
-               oid = new Hashtable ();
+               Hashtable oid = new Hashtable ();
                // comments here are to match with MS implementation (but not with doc)
                // LAMESPEC: only HashAlgorithm seems to have their OID included
                oid.Add (defaultSHA1, oidSHA1);
@@ -315,7 +348,7 @@ public class CryptoConfig {
                oid.Add (name3DESKeyWrap, oid3DESKeyWrap);
 
 #if NET_2_0
-               oid.Add (nameRSAa, oidRSA);
+//             oid.Add (nameRSAa, oidRSA);
                oid.Add (nameDSAa, oidDSA);
                oid.Add (nameDESa, oidDES);
                oid.Add (name3DESa, oid3DES);
@@ -325,10 +358,15 @@ public class CryptoConfig {
 
                // Add/modify the config as specified by machine.config
                string config = Environment.GetMachineConfigPath ();
-               LoadConfig (config);
+               LoadConfig (config, algorithms, oid);
+
+               // update
+               CryptoConfig.algorithms = algorithms;
+               CryptoConfig.oid = oid;
        }
 
-       private static void LoadConfig (string filename) 
+       [FileIOPermission (SecurityAction.Assert, Unrestricted = true)]
+       private static void LoadConfig (string filename, Hashtable algorithms, Hashtable oid)
        {
                if (!File.Exists (filename))
                        return;
@@ -397,13 +435,14 @@ public class CryptoConfig {
                return CreateFromName (name, null);
        }
 
+       [PermissionSet (SecurityAction.LinkDemand, Unrestricted = true)]
        public static object CreateFromName (string name, object[] args)
        {
                if (name == null)
                        throw new ArgumentNullException ("name");
 
-               if (algorithms == null) {
-                       lock (lockObject) {
+               lock (lockObject) {
+                       if (algorithms == null) {
                                Initialize ();
                        }
                }
@@ -453,6 +492,10 @@ public class CryptoConfig {
 
        public static byte[] EncodeOID (string str)
        {
+#if NET_2_0
+               if (str == null)
+                       throw new ArgumentNullException ("str");
+#endif
                char[] delim = { '.' };
                string[] parts = str.Split (delim);
                // according to X.208 n is always at least 2
@@ -519,8 +562,8 @@ public class CryptoConfig {
                if (name == null)
                        throw new ArgumentNullException ("name");
 
-               if (oid == null) {
-                       lock (lockObject) {
+               lock (lockObject) {
+                       if (oid == null) {
                                Initialize ();
                        }
                }