[runtime] Remove handler block trampoline code
[mono.git] / mcs / class / System.Security / System.Security.Cryptography.Xml / XmlDsigExcC14NTransform.cs
index ff4e5414b8c7ff9f5b9f949b1dec5456778189c2..b7249577e3bfa5986be71dd14942f867fef01b21 100644 (file)
@@ -1,11 +1,16 @@
 //
-// XmlDsigExcC14NTransform.cs - XmlDsigExcC14NTransform implementation for XML Encryption
+// XmlDsigExcC14NTransform.cs - ExcC14N Transform implementation for XML Signature
+// http://www.w3.org/TR/xml-c14n
 //
-// Author:
+// Authors:
+//     Sebastien Pouliot <sebastien@ximian.com>
+//     Aleksey Sanin (aleksey@aleksey.com)
 //      Tim Coleman (tim@timcoleman.com)
 //
+// (C) 2002, 2003 Motus Technologies Inc. (http://www.motus.com)
+// (C) 2003 Aleksey Sanin (aleksey@aleksey.com)
 // Copyright (C) Tim Coleman, 2004
-
+// Copyright (C) 2004-2005 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
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
-#if NET_2_0
-
-using Mono.Xml;
+using System.Collections;
 using System.IO;
+using System.Runtime.InteropServices;
+using System.Text;
 using System.Xml;
 
-namespace System.Security.Cryptography.Xml {
-       public class XmlDsigExcC14NTransform : Transform {
-
-               #region Fields
-
-               XmlCanonicalizer canonicalizer;
-               object inputObj;
-               string inclusiveNamespacesPrefixList;
-               bool includeComments;
+using Mono.Xml;
 
-               #endregion // Fields
-       
-               #region Constructors
+namespace System.Security.Cryptography.Xml { 
 
-               public XmlDsigExcC14NTransform ()
+       public class XmlDsigExcC14NTransform : Transform {
+               private Type[] input;
+               private Type[] output;
+               private XmlCanonicalizer canonicalizer;
+               private Stream s;
+               private string inclusiveNamespacesPrefixList;
+               
+               public XmlDsigExcC14NTransform ()       
+                       : this (false, null)
                {
-                       Algorithm = XmlSignature.AlgorithmNamespaces.XmlDsigExcC14NTransform;
-                       canonicalizer = new XmlCanonicalizer (true, false);
                }
 
-               public XmlDsigExcC14NTransform (bool includeComments)
+               public XmlDsigExcC14NTransform (bool includeComments) 
+                       : this (includeComments, null)
                {
-                       this.includeComments = includeComments;
-                       canonicalizer = new XmlCanonicalizer (true, includeComments);
                }
 
-               [MonoTODO ("What does inclusiveNamespacesPrefixList mean?")]
                public XmlDsigExcC14NTransform (string inclusiveNamespacesPrefixList)
+                       : this (false, inclusiveNamespacesPrefixList)
                {
-                       this.inclusiveNamespacesPrefixList = inclusiveNamespacesPrefixList;
                }
 
-               [MonoTODO ("What does inclusiveNamespacesPrefixList mean?")]
                public XmlDsigExcC14NTransform (bool includeComments, string inclusiveNamespacesPrefixList)
                {
+                       if (includeComments)
+                               Algorithm = XmlSignature.AlgorithmNamespaces.XmlDsigExcC14NWithCommentsTransform;
+                       else
+                               Algorithm = XmlSignature.AlgorithmNamespaces.XmlDsigExcC14NTransform;
                        this.inclusiveNamespacesPrefixList = inclusiveNamespacesPrefixList;
-                       this.includeComments = includeComments;
+                       canonicalizer = new XmlCanonicalizer (includeComments, true, PropagatedNamespaces);
                }
-       
-               #endregion // Constructors
-       
-               #region Properties
 
                public string InclusiveNamespacesPrefixList {
                        get { return inclusiveNamespacesPrefixList; }
@@ -82,65 +80,83 @@ namespace System.Security.Cryptography.Xml {
                }
 
                public override Type[] InputTypes {
-                       get { return new Type [3] {typeof (System.IO.Stream), typeof (System.Xml.XmlDocument), typeof (System.Xml.XmlNodeList)}; }
+                       get {
+                               if (input == null) {
+                                       input = new Type [3];
+                                       input[0] = typeof (System.IO.Stream);
+                                       input[1] = typeof (System.Xml.XmlDocument);
+                                       input[2] = typeof (System.Xml.XmlNodeList);
+                               }
+                               return input;
+                       }
                }
 
                public override Type[] OutputTypes {
-                       get { return new Type [1] {typeof (System.IO.Stream)}; }
+                       get {
+                               if (output == null) {
+                                       output = new Type [1];
+                                       output[0] = typeof (System.IO.Stream);
+                               }
+                               return output;
+                       }
                }
 
-               #endregion // Properties
-
-               #region Methods
-
-               public override byte[] GetDigestedOutput (HashAlgorithm hash)
+               protected override XmlNodeList GetInnerXml () 
                {
-                       return hash.ComputeHash ((Stream) GetOutput());
+                       return null; // THIS IS DOCUMENTED AS SUCH
                }
 
-               protected override XmlNodeList GetInnerXml ()
+               public override byte[] GetDigestedOutput (HashAlgorithm hash)
                {
-                       return null;
+                       // no null check, MS throws a NullReferenceException here
+                       return hash.ComputeHash ((Stream) GetOutput ());
                }
 
-               public override object GetOutput ()
+               public override object GetOutput () 
                {
-                       Stream s = null;
-
-                       if (inputObj is Stream) {
-                                XmlDocument doc = new XmlDocument ();
-                                doc.PreserveWhitespace = true;  // REALLY IMPORTANT
-                                doc.Load (inputObj as Stream);
-                                s = canonicalizer.Canonicalize (doc);
-                        } 
-                       else if (inputObj is XmlDocument)
-                                s = canonicalizer.Canonicalize (inputObj as XmlDocument);
-                        else if (inputObj is XmlNodeList)
-                                s = canonicalizer.Canonicalize (inputObj as XmlNodeList);
-
-                        // note: there is no default are other types won't throw an exception
-
                        return (object) s;
                }
 
-               public override object GetOutput (Type type)
+               public override object GetOutput (Type type) 
                {
-                       if (type == Type.GetType ("Stream"))
+                       if (type == typeof (Stream))
                                return GetOutput ();
                        throw new ArgumentException ("type");
                }
 
-               public override void LoadInnerXml (XmlNodeList nodeList)
+               public override void LoadInnerXml (XmlNodeList nodeList) 
                {
+                       // documented as not changing the state of the transform
                }
-               
-               public override void LoadInput (object obj)
+
+               public override void LoadInput (object obj) 
                {
-                       inputObj = obj;
+                       canonicalizer.InclusiveNamespacesPrefixList = InclusiveNamespacesPrefixList;
+                       // possible input: Stream, XmlDocument, and XmlNodeList
+                       Stream stream = (obj as Stream);
+                       if (stream != null) {
+                               XmlDocument doc = new XmlDocument ();
+                               doc.PreserveWhitespace = true;  // REALLY IMPORTANT
+                               doc.XmlResolver = GetResolver ();
+                               doc.Load (new XmlSignatureStreamReader (new StreamReader (stream)));
+//                             doc.Load ((Stream) obj);
+                               s = canonicalizer.Canonicalize (doc);
+                               return;
+                       }
+
+                       XmlDocument xd = (obj as XmlDocument);
+                       if (xd != null) {
+                               s = canonicalizer.Canonicalize (xd);
+                               return;
+                       }
+
+                       XmlNodeList nl = (obj as XmlNodeList);
+                       if (nl != null) {
+                               s = canonicalizer.Canonicalize (nl);
+                       }
+                       else
+                               throw new ArgumentException ("obj");
                }
-
-               #endregion // Methods
        }
 }
 
-#endif