2 // System.Web.Configuration.MachineKeyConfigHandler
5 // Gonzalo Paniagua Javier (gonzalo@ximian.com)
7 // (C) 2002 Ximian, Inc (http://www.ximian.com)
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 using System.Collections;
33 using System.Configuration;
34 using System.Security.Cryptography;
37 namespace System.Web.Configuration
39 class MachineKeyConfigHandler : IConfigurationSectionHandler
41 static byte [] autogenerated;
42 static MachineKeyConfigHandler ()
44 autogenerated = new byte [64];
45 RNGCryptoServiceProvider cp = new RNGCryptoServiceProvider ();
46 cp.GetBytes (autogenerated);
49 static byte ToHexValue (char c, bool high)
52 if (c >= '0' && c <= '9')
54 else if (c >= 'a' && c <= 'f')
55 v = (byte) (c - 'a' + 10);
56 else if (c >= 'A' && c <= 'F')
57 v = (byte) (c - 'A' + 10);
59 throw new ArgumentException ("Invalid hex character");
67 internal static byte [] GetBytes (string key, int len)
69 byte [] result = new byte [len / 2];
70 for (int i = 0; i < len; i += 2)
71 result [i / 2] = (byte) (ToHexValue (key [i], true) + ToHexValue (key [i + 1], false));
76 static byte [] MakeKey (string key)
78 if (key == null || key == "AutoGenerated")
82 if (len < 40 || len > 128 || (len % 2) == 1)
83 throw new ArgumentException ("Invalid key length");
85 return GetBytes (key, len);
88 public object Create (object parent, object context, XmlNode section)
90 if (section.HasChildNodes)
91 ThrowException ("Child nodes not allowed here", section.FirstChild);
93 MachineKeyConfig config = new MachineKeyConfig (parent);
95 string validationKey = AttValue ("validationKey", section);
97 config.ValidationKey = MakeKey (validationKey);
98 } catch (ArgumentException e) {
99 ThrowException (e.Message, section);
102 string decryptionKey = AttValue ("decryptionKey", section);
104 config.DecryptionKey = MakeKey (decryptionKey);
105 } catch (ArgumentException e) {
106 ThrowException (e.Message, section);
109 string validation = AttValue ("validation", section);
110 if (validation != "SHA1" && validation != "MD5" && validation != "3DES")
111 ThrowException ("Invalid 'validation' value", section);
113 config.ValidationType = validation;
115 if (section.Attributes != null && section.Attributes.Count != 0)
116 ThrowException ("Unrecognized attribute", section);
118 MachineKeyConfig.MachineKey = config;
122 // A few methods to save some typing
123 static string AttValue (string name, XmlNode node)
125 return HandlersUtil.ExtractAttributeValue (name, node, true);
128 static void ThrowException (string message, XmlNode node)
130 HandlersUtil.ThrowException (message, node);