2 // Manifest.cs - Manifest implementation for XML Signature
5 // Sebastien Pouliot <sebastien@ximian.com>
7 // (C) 2004 Novell (http://www.novell.com)
10 using System.Collections;
13 namespace System.Security.Cryptography.Xml {
15 internal class Manifest {
17 private ArrayList references;
19 private XmlElement element;
23 references = new ArrayList ();
26 public Manifest (XmlElement xel) : this ()
39 public ArrayList References {
40 get { return references; }
43 public void AddReference (Reference reference)
45 references.Add (reference);
48 public XmlElement GetXml ()
53 XmlDocument document = new XmlDocument ();
54 XmlElement xel = document.CreateElement (XmlSignature.ElementNames.SignedInfo, XmlSignature.NamespaceURI);
56 xel.SetAttribute (XmlSignature.AttributeNames.Id, id);
58 // we add References afterward so we don't end up with extraneous
59 // xmlns="..." in each reference elements.
60 foreach (Reference r in references) {
61 XmlNode xn = r.GetXml ();
62 XmlNode newNode = document.ImportNode (xn, true);
63 xel.AppendChild (newNode);
69 private string GetAttribute (XmlElement xel, string attribute)
71 XmlAttribute xa = xel.Attributes [attribute];
72 return ((xa != null) ? xa.InnerText : null);
75 public void LoadXml (XmlElement value)
78 throw new ArgumentNullException ("value");
80 if ((value.LocalName != XmlSignature.ElementNames.Manifest) || (value.NamespaceURI != XmlSignature.NamespaceURI))
81 throw new CryptographicException ();
83 id = GetAttribute (value, XmlSignature.AttributeNames.Id);
85 for (int i = 0; i < value.ChildNodes.Count; i++) {
86 XmlNode n = value.ChildNodes [i];
87 if (n.NodeType == XmlNodeType.Element &&
88 n.LocalName == XmlSignature.ElementNames.Reference &&
89 n.NamespaceURI == XmlSignature.NamespaceURI) {
90 Reference r = new Reference ();
91 r.LoadXml ((XmlElement) n);