2005-04-23 Sebastien Pouliot <sebastien@ximian.com>
[mono.git] / mcs / class / System.Security / System.Security.Cryptography.Xml / Reference.cs
index 019eb499d200e8048a9f74cef1ccc090c4445625..0f543a44e818537fa225013ed76256a5ee281e35 100644 (file)
@@ -8,6 +8,27 @@
 // (C) 2004 Novell (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
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
 using System.IO;
 using System.Xml;
 
@@ -22,6 +43,8 @@ namespace System.Security.Cryptography.Xml {
                private string id;
                private string uri;
                private string type;
+               private Stream stream;
+               private XmlElement element;
 
                public Reference () 
                {
@@ -29,9 +52,10 @@ namespace System.Security.Cryptography.Xml {
                        digestMethod = XmlSignature.NamespaceURI + "sha1";
                }
 
-               [MonoTODO()]
+               [MonoTODO ("There is no description about how it is used.")]
                public Reference (Stream stream) : this () 
                {
+                       this.stream = stream;
                }
 
                public Reference (string uri) : this ()
@@ -42,31 +66,49 @@ namespace System.Security.Cryptography.Xml {
                // default to SHA1
                public string DigestMethod {
                        get { return digestMethod; }
-                       set { digestMethod = value; }
+                       set {
+                               element = null;
+                               digestMethod = value;
+                       }
                }
 
                public byte[] DigestValue {
                        get { return digestValue; }
-                       set { digestValue = value; }
+                       set {
+                               element = null;
+                               digestValue = value;
+                       }
                }
 
                public string Id {
                        get { return id; }
-                       set { id = value; }
+                       set {
+                               element = null;
+                               id = value;
+                       }
                }
 
                public TransformChain TransformChain {
                        get { return chain; }
+#if NET_2_0
+                       set { chain = value; }
+#endif
                }
 
                public string Type {
                        get { return type; }
-                       set { type = value; }
+                       set {
+                               element = null;
+                               type = value;
+                       }
                }
 
                public string Uri {
                        get { return uri; }
-                       set { uri = value; }
+                       set {
+                               element = null;
+                               uri = value;
+                       }
                }
 
                public void AddTransform (Transform transform) 
@@ -76,6 +118,9 @@ namespace System.Security.Cryptography.Xml {
 
                public XmlElement GetXml () 
                {
+                       if (element != null)
+                               return element;
+
                        if (digestMethod == null)
                                throw new CryptographicException ("DigestMethod");
                        if (digestValue == null)
@@ -111,18 +156,6 @@ namespace System.Security.Cryptography.Xml {
                        return xel;
                }
 
-               private string GetAttributeFromElement (XmlElement xel, string attribute, string element) 
-               {
-                       string result = null;
-                       XmlNodeList xnl = xel.GetElementsByTagName (element);
-                       if ((xnl != null) && (xnl.Count > 0)) {
-                               XmlAttribute xa = xnl[0].Attributes [attribute];
-                               if (xa != null)
-                                       result = xa.InnerText;
-                       }
-                       return result;
-               }
-
                // note: we do NOT return null -on purpose- if attribute isn't found
                private string GetAttribute (XmlElement xel, string attribute) 
                {
@@ -142,11 +175,14 @@ namespace System.Security.Cryptography.Xml {
                        uri = GetAttribute (value, XmlSignature.AttributeNames.URI);
                        type = GetAttribute (value, XmlSignature.AttributeNames.Type);
                        // Note: order is important for validations
-                       XmlNodeList xnl = value.GetElementsByTagName (XmlSignature.ElementNames.Transform);
+                       XmlNodeList xnl = value.GetElementsByTagName (XmlSignature.ElementNames.Transform, XmlSignature.NamespaceURI);
                        if ((xnl != null) && (xnl.Count > 0)) {
                                Transform t = null;
                                foreach (XmlNode xn in xnl) {
                                        string a = GetAttribute ((XmlElement)xn, XmlSignature.AttributeNames.Algorithm);
+/*     This code is useful for debugging in VS.NET because using CryptoConfig
+       (from MS mscorlib) would throw InvalidCastException because it's 
+       Transform would come from MS System.Security.dll not Mono's.
                                        switch (a) {
                                                case "http://www.w3.org/2000/09/xmldsig#base64":
                                                        t = new XmlDsigBase64Transform ();
@@ -166,9 +202,17 @@ namespace System.Security.Cryptography.Xml {
                                                case "http://www.w3.org/TR/1999/REC-xslt-19991116":
                                                        t = new XmlDsigXsltTransform ();
                                                        break;
+                                               case "http://www.w3.org/2002/07/decrypt#XML":
+                                                       t = new XmlDecryptionTransform ();
+                                                       break;
                                                default:
                                                        throw new NotSupportedException ();
                                        }
+*/
+                                       t = (Transform) CryptoConfig.CreateFromName (a);
+                                       if (t == null)
+                                               throw new CryptographicException ("Unknown transform {0}.", a);
+
                                        if (xn.ChildNodes.Count > 0) {
                                                t.LoadInnerXml (xn.ChildNodes);
                                        }
@@ -176,12 +220,12 @@ namespace System.Security.Cryptography.Xml {
                                }
                        }
                        // get DigestMethod
-                       DigestMethod = GetAttributeFromElement (value, XmlSignature.AttributeNames.Algorithm, XmlSignature.ElementNames.DigestMethod);
+                       DigestMethod = XmlSignature.GetAttributeFromElement (value, XmlSignature.AttributeNames.Algorithm, XmlSignature.ElementNames.DigestMethod);
                        // get DigestValue
-                       xnl = value.GetElementsByTagName (XmlSignature.ElementNames.DigestValue);
-                       if ((xnl != null) && (xnl.Count > 0)) {
-                               DigestValue = Convert.FromBase64String (xnl[0].InnerText);
-                       }
+                       XmlElement dig = XmlSignature.GetChildElement (value, XmlSignature.ElementNames.DigestValue, XmlSignature.NamespaceURI);
+                       if (dig != null)
+                               DigestValue = Convert.FromBase64String (dig.InnerText);
+                       element = value;
                }
        }
 }