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;
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
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";
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
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#";
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);
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
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);
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);
// 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;
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 ();
}
}
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
if (name == null)
throw new ArgumentNullException ("name");
- if (oid == null) {
- lock (lockObject) {
+ lock (lockObject) {
+ if (oid == null) {
Initialize ();
}
}