// (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;
private string id;
private string uri;
private string type;
+ private Stream stream;
+ private XmlElement element;
public Reference ()
{
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 ()
// 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)
public XmlElement GetXml ()
{
+ if (element != null)
+ return element;
+
if (digestMethod == null)
throw new CryptographicException ("DigestMethod");
if (digestValue == null)
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)
{
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 ();
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);
}
}
}
// 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;
}
}
}