Manifest.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. //
  2. // Manifest.cs - Manifest implementation for XML Signature
  3. //
  4. // Author:
  5. // Sebastien Pouliot <[email protected]>
  6. //
  7. // (C) 2004 Novell (http://www.novell.com)
  8. //
  9. using System.Collections;
  10. using System.Xml;
  11. namespace System.Security.Cryptography.Xml {
  12. internal class Manifest {
  13. private ArrayList references;
  14. private string id;
  15. private XmlElement element;
  16. public Manifest ()
  17. {
  18. references = new ArrayList ();
  19. }
  20. public Manifest (XmlElement xel) : this ()
  21. {
  22. LoadXml (xel);
  23. }
  24. public string Id {
  25. get { return id; }
  26. set {
  27. element = null;
  28. id = value;
  29. }
  30. }
  31. public ArrayList References {
  32. get { return references; }
  33. }
  34. public void AddReference (Reference reference)
  35. {
  36. references.Add (reference);
  37. }
  38. public XmlElement GetXml ()
  39. {
  40. if (element != null)
  41. return element;
  42. XmlDocument document = new XmlDocument ();
  43. XmlElement xel = document.CreateElement (XmlSignature.ElementNames.SignedInfo, XmlSignature.NamespaceURI);
  44. if (id != null)
  45. xel.SetAttribute (XmlSignature.AttributeNames.Id, id);
  46. // we add References afterward so we don't end up with extraneous
  47. // xmlns="..." in each reference elements.
  48. foreach (Reference r in references) {
  49. XmlNode xn = r.GetXml ();
  50. XmlNode newNode = document.ImportNode (xn, true);
  51. xel.AppendChild (newNode);
  52. }
  53. return xel;
  54. }
  55. private string GetAttribute (XmlElement xel, string attribute)
  56. {
  57. XmlAttribute xa = xel.Attributes [attribute];
  58. return ((xa != null) ? xa.InnerText : null);
  59. }
  60. public void LoadXml (XmlElement value)
  61. {
  62. if (value == null)
  63. throw new ArgumentNullException ("value");
  64. if ((value.LocalName != XmlSignature.ElementNames.Manifest) || (value.NamespaceURI != XmlSignature.NamespaceURI))
  65. throw new CryptographicException ();
  66. id = GetAttribute (value, XmlSignature.AttributeNames.Id);
  67. for (int i = 0; i < value.ChildNodes.Count; i++) {
  68. XmlNode n = value.ChildNodes [i];
  69. if (n.NodeType == XmlNodeType.Element &&
  70. n.LocalName == XmlSignature.ElementNames.Reference &&
  71. n.NamespaceURI == XmlSignature.NamespaceURI) {
  72. Reference r = new Reference ();
  73. r.LoadXml ((XmlElement) n);
  74. AddReference (r);
  75. }
  76. }
  77. element = value;
  78. }
  79. }
  80. }