Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'mcs/class/System.Security/System.Security.Cryptography.Xml/Signature.cs')
-rw-r--r--mcs/class/System.Security/System.Security.Cryptography.Xml/Signature.cs146
1 files changed, 146 insertions, 0 deletions
diff --git a/mcs/class/System.Security/System.Security.Cryptography.Xml/Signature.cs b/mcs/class/System.Security/System.Security.Cryptography.Xml/Signature.cs
new file mode 100644
index 00000000000..a2aeeb3aee4
--- /dev/null
+++ b/mcs/class/System.Security/System.Security.Cryptography.Xml/Signature.cs
@@ -0,0 +1,146 @@
+//
+// Signature.cs - Signature implementation for XML Signature
+//
+// Author:
+// Sebastien Pouliot (spouliot@motus.com)
+//
+// (C) 2002, 2003 Motus Technologies Inc. (http://www.motus.com)
+//
+
+using System.Collections;
+using System.Security.Cryptography;
+using System.Xml;
+
+namespace System.Security.Cryptography.Xml {
+
+ public class Signature {
+
+ private ArrayList list;
+ private SignedInfo info;
+ private KeyInfo key;
+ private string id;
+ private byte[] signature;
+
+ public Signature()
+ {
+ list = new ArrayList ();
+ }
+
+ public string Id {
+ get { return id; }
+ set { id = value; }
+ }
+
+ public KeyInfo KeyInfo {
+ get { return key; }
+ set { key = value; }
+ }
+
+ public IList ObjectList {
+ get { return list; }
+ set { list = ArrayList.Adapter (value); }
+ }
+
+ public byte[] SignatureValue {
+ get { return signature; }
+ set { signature = value; }
+ }
+
+ public SignedInfo SignedInfo {
+ get { return info; }
+ set { info = value; }
+ }
+
+ public void AddObject (DataObject dataObject)
+ {
+ list.Add (dataObject);
+ }
+
+ public XmlElement GetXml ()
+ {
+ if (info == null)
+ throw new CryptographicException ("SignedInfo");
+ if (signature == null)
+ throw new CryptographicException ("SignatureValue");
+
+ XmlDocument document = new XmlDocument ();
+ XmlElement xel = document.CreateElement (XmlSignature.ElementNames.Signature, XmlSignature.NamespaceURI);
+ if (id != null)
+ xel.SetAttribute (XmlSignature.AttributeNames.Id, id);
+
+ XmlNode xn = info.GetXml ();
+ XmlNode newNode = document.ImportNode (xn, true);
+ xel.AppendChild (newNode);
+
+ if (signature != null) {
+ XmlElement sv = document.CreateElement (XmlSignature.ElementNames.SignatureValue, XmlSignature.NamespaceURI);
+ sv.InnerText = Convert.ToBase64String (signature);
+ xel.AppendChild (sv);
+ }
+
+ if (key != null) {
+ xn = key.GetXml ();
+ newNode = document.ImportNode (xn, true);
+ xel.AppendChild (newNode);
+ }
+
+ if (list.Count > 0) {
+ foreach (DataObject obj in list) {
+ xn = obj.GetXml ();
+ newNode = document.ImportNode (xn, true);
+ xel.AppendChild (newNode);
+ }
+ }
+
+ return xel;
+ }
+
+ private string GetAttribute (XmlElement xel, string attribute)
+ {
+ XmlAttribute xa = xel.Attributes [attribute];
+ return ((xa != null) ? xa.InnerText : null);
+ }
+
+ public void LoadXml (XmlElement value)
+ {
+ if (value == null)
+ throw new ArgumentNullException ("value");
+
+ if ((value.LocalName == XmlSignature.ElementNames.Signature) && (value.NamespaceURI == XmlSignature.NamespaceURI)) {
+ id = GetAttribute (value, XmlSignature.AttributeNames.Id);
+
+ XmlNodeList xnl = value.GetElementsByTagName (XmlSignature.ElementNames.SignedInfo);
+ if ((xnl != null) && (xnl.Count == 1)) {
+ info = new SignedInfo ();
+ info.LoadXml ((XmlElement) xnl[0]);
+ }
+
+ xnl = value.GetElementsByTagName (XmlSignature.ElementNames.SignatureValue);
+ if ((xnl != null) && (xnl.Count == 1)) {
+ signature = Convert.FromBase64String (xnl[0].InnerText);
+ }
+
+ xnl = value.GetElementsByTagName (XmlSignature.ElementNames.KeyInfo);
+ if ((xnl != null) && (xnl.Count == 1)) {
+ key = new KeyInfo ();
+ key.LoadXml ((XmlElement) xnl[0]);
+ }
+
+ xnl = value.GetElementsByTagName (XmlSignature.ElementNames.Object);
+ if ((xnl != null) && (xnl.Count > 0)) {
+ foreach (XmlNode xn in xnl) {
+ DataObject obj = new DataObject ();
+ obj.LoadXml ((XmlElement) xn);
+ AddObject (obj);
+ }
+ }
+ }
+
+ // if invalid
+ if (info == null)
+ throw new CryptographicException ("SignedInfo");
+ if (signature == null)
+ throw new CryptographicException ("SignatureValue");
+ }
+ }
+} \ No newline at end of file