2 // EncryptedReference.cs - EncryptedReference implementation for XML Encryption
3 // http://www.w3.org/2001/04/xmlenc#sec-EncryptedReference
6 // Tim Coleman (tim@timcoleman.com)
8 // Copyright (C) Tim Coleman, 2004
14 namespace System.Security.Cryptography.Xml {
15 public abstract class EncryptedReference {
28 protected EncryptedReference ()
31 TransformChain = new TransformChain ();
34 protected EncryptedReference (string uri)
37 TransformChain = new TransformChain ();
40 protected EncryptedReference (string uri, TransformChain tc)
47 #endregion // Constructors
52 protected internal bool CacheValid {
53 get { return cacheValid; }
56 protected string ReferenceType {
57 get { return referenceType; }
58 set { referenceType = value; }
61 public TransformChain TransformChain {
71 #endregion // Properties
75 public void AddTransform (Transform transform)
77 TransformChain.Add (transform);
80 public virtual XmlElement GetXml ()
82 return GetXml (new XmlDocument ());
85 internal virtual XmlElement GetXml (XmlDocument document)
87 XmlElement xel = document.CreateElement (ReferenceType, EncryptedXml.XmlEncNamespaceUrl);
89 xel.SetAttribute (XmlEncryption.AttributeNames.URI, Uri);
91 if (TransformChain != null && TransformChain.Count > 0) {
92 XmlElement xtr = document.CreateElement (XmlEncryption.ElementNames.Transforms, EncryptedXml.XmlEncNamespaceUrl);
93 foreach (Transform t in TransformChain)
94 xtr.AppendChild (document.ImportNode (t.GetXml (), true));
95 xel.AppendChild (xtr);
101 [MonoTODO ("Make compliant.")]
102 public virtual void LoadXml (XmlElement value)
105 throw new ArgumentNullException ("value");
106 if ((value.LocalName != XmlEncryption.ElementNames.CipherReference) || (value.NamespaceURI != EncryptedXml.XmlEncNamespaceUrl))
107 throw new CryptographicException ("Malformed CipherReference element.");
110 TransformChain = new TransformChain ();
112 foreach (XmlNode n in value.ChildNodes) {
113 if (n is XmlWhitespace)
116 switch (n.LocalName) {
117 case XmlEncryption.ElementNames.Transforms:
118 foreach (XmlNode xn in ((XmlElement) n).GetElementsByTagName (XmlSignature.ElementNames.Transform, XmlSignature.NamespaceURI)) {
120 switch (((XmlElement) xn).Attributes [XmlSignature.AttributeNames.Algorithm].Value) {
121 case XmlSignature.AlgorithmNamespaces.XmlDsigBase64Transform:
122 t = new XmlDsigBase64Transform ();
124 case XmlSignature.AlgorithmNamespaces.XmlDsigC14NTransform:
125 t = new XmlDsigC14NTransform ();
127 case XmlSignature.AlgorithmNamespaces.XmlDsigC14NWithCommentsTransform:
128 t = new XmlDsigC14NWithCommentsTransform ();
130 case XmlSignature.AlgorithmNamespaces.XmlDsigEnvelopedSignatureTransform:
131 t = new XmlDsigEnvelopedSignatureTransform ();
133 case XmlSignature.AlgorithmNamespaces.XmlDsigXPathTransform:
134 t = new XmlDsigXPathTransform ();
136 case XmlSignature.AlgorithmNamespaces.XmlDsigXsltTransform:
137 t = new XmlDsigXsltTransform ();
143 t.LoadInnerXml (((XmlElement) xn).ChildNodes);
144 TransformChain.Add (t);
150 if (value.HasAttribute (XmlEncryption.AttributeNames.URI))
151 Uri = value.Attributes [XmlEncryption.AttributeNames.URI].Value;
155 #endregion // Methods