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); // LAMESPEC: This library is totally useless against eXtensibly Marked-up document. int i = NextElementPos(value.ChildNodes, 0, XmlSignature.ElementNames.SignedInfo, XmlSignature.NamespaceURI, true); XmlElement sinfo = (XmlElement)value.ChildNodes [i]; info = new SignedInfo(); info.LoadXml(sinfo); i = NextElementPos(value.ChildNodes, ++i, XmlSignature.ElementNames.SignatureValue, XmlSignature.NamespaceURI, true); XmlElement sigValue = (XmlElement)value.ChildNodes [i]; signature = Convert.FromBase64String(sigValue.InnerText); // signature isn't required: <element ref="ds:KeyInfo" minOccurs="0"/> i = NextElementPos(value.ChildNodes, ++i, XmlSignature.ElementNames.KeyInfo, XmlSignature.NamespaceURI, false); if (i > 0) { XmlElement kinfo = (XmlElement)value.ChildNodes [i]; key = new KeyInfo(); key.LoadXml(kinfo); } XmlNodeList xnl = value.SelectNodes("xd:Object", dsigNsmgr); foreach (XmlElement xn in xnl) { DataObject obj = new DataObject(); obj.LoadXml(xn); AddObject(obj); } } else { throw new CryptographicException("Malformed element: Signature."); } // if invalid if (info == null) { throw new CryptographicException("SignedInfo"); } if (signature == null) { throw new CryptographicException("SignatureValue"); } }
public void EmptyReferenceWithSetProperty () { XmlDocument doc = new XmlDocument (); doc.LoadXml (xmlForGetXml); XmlNode n = doc.SelectSingleNode ("//*[local-name()='Reference']"); n.ParentNode.RemoveChild (n); SignedInfo sig = new SignedInfo (); sig.LoadXml ((XmlElement) doc.SelectSingleNode ("//*[local-name()='SignedInfo']")); sig.CanonicalizationMethod = "urn:foo"; XmlElement el = sig.GetXml (); }
public void GetXmlWithSetProperty () { XmlDocument doc = new XmlDocument (); doc.LoadXml (xmlForGetXml); SignedInfo sig = new SignedInfo (); sig.LoadXml ((XmlElement) doc.SelectSingleNode ("//*[local-name()='SignedInfo']")); sig.CanonicalizationMethod = "urn:foo"; XmlElement el = sig.GetXml (); Assert ("#GetXmlWithSetProperty.document", doc != el.OwnerDocument); }
public void GetXmlWithoutSetProperty () { string result = @"<dsig:SignedInfo xmlns:dsig=""http://www.w3.org/2000/09/xmldsig#""><dsig:CanonicalizationMethod Algorithm=""http://www.w3.org/TR/2001/REC-xml-c14n-withcomments-20010315"" /><dsig:SignatureMethod Algorithm=""http://www.w3.org/2000/09/xmldsig#rsa-sha1"" /><dsig:Reference URI=""""><dsig:Transforms><dsig:Transform Algorithm=""http://www.w3.org/2000/09/xmldsig#enveloped-signature"" /></dsig:Transforms><dsig:DigestMethod Algorithm=""http://www.w3.org/2000/09/xmldsig#sha1"" /><dsig:DigestValue>nDF2V/bzRd0VE3EwShWtsBzTEDc=</dsig:DigestValue></dsig:Reference></dsig:SignedInfo>"; XmlDocument doc = new XmlDocument (); doc.LoadXml (xmlForGetXml); SignedInfo sig = new SignedInfo (); sig.LoadXml ((XmlElement) doc.SelectSingleNode ("//*[local-name()='SignedInfo']")); XmlElement el = sig.GetXml (); AssertEquals ("#GetXmlWOSetProperty.document", doc, el.OwnerDocument); AssertEquals ("#GetXmlWOSetProperty.outerxml", result, el.OuterXml); }
/// <include file='doc\Signature.uex' path='docs/doc[@for="Signature.LoadXml"]/*' /> public void LoadXml(XmlElement value) { // Make sure we don't get passed null if (value == null) { throw new ArgumentNullException("value"); } // Signature XmlElement signatureElement = value; if (!signatureElement.LocalName.Equals("Signature")) { throw new CryptographicException(SecurityResources.GetResourceString("Cryptography_Xml_InvalidElement"), "Signature"); } XmlAttributeCollection signatureAttributes = signatureElement.Attributes; XmlNode idAttribute = signatureAttributes["Id"]; if (idAttribute == null) { m_strId = null; } //throw new CryptographicException(String.Format(Environment.GetResourceString("Cryptography_XML_MalformedXML"),"Signature")); // Look for SignedInfo and SignatureValue. There may optionally be // a KeyInfo and some Objects XmlNamespaceManager nsm = new XmlNamespaceManager(value.OwnerDocument.NameTable); nsm.AddNamespace("ds", SignedXml.XmlDsigNamespaceUrl); // SignedInfo //XmlNodeList signatureChilds = signatureElement.GetElementsByTagName("SignedInfo", SignedXml.XmlDsigNamespaceUrl); XmlNodeList signatureChilds = signatureElement.SelectNodes("ds:SignedInfo", nsm); if (signatureChilds.Count == 0) { throw new CryptographicException(SecurityResources.GetResourceString("Cryptography_Xml_InvalidElement"), "SignedInfo"); } XmlElement signedInfoElement = (XmlElement)signatureChilds.Item(0); m_signedInfo = new SignedInfo(); m_signedInfo.LoadXml(signedInfoElement); // SignatureValue XmlNodeList signatureValueNodes = signatureElement.SelectNodes("ds:SignatureValue", nsm); if (signatureValueNodes.Count == 0) { throw new CryptographicException(SecurityResources.GetResourceString("Cryptography_Xml_InvalidElement"), "SignedInfo/SignatureValue"); } XmlElement signatureValueElement = (XmlElement)signatureValueNodes.Item(0); m_rgbSignatureValue = Convert.FromBase64String(SignedXml.DiscardWhiteSpaces(signatureValueElement.InnerText)); XmlNodeList keyInfoNodes = signatureElement.SelectNodes("ds:KeyInfo", nsm); if (keyInfoNodes.Count != 0) { XmlElement keyInfoElement = (XmlElement)keyInfoNodes.Item(0); m_keyInfo = new KeyInfo(); m_keyInfo.LoadXml(keyInfoElement); } XmlNodeList objectNodes = signatureElement.SelectNodes("ds:Object", nsm); for (int i = 0; i < objectNodes.Count; ++i) { XmlElement objectElement = (XmlElement)objectNodes.Item(i); DataObject dataObj = new DataObject(); dataObj.LoadXml(objectElement); m_embeddedObjects.Add(dataObj); } // Select all elements that have Id attributes XmlNodeList nodeList = signatureElement.SelectNodes("//*[@Id]", nsm); if (nodeList != null) { foreach (XmlNode node in nodeList) { m_referencedItems.Add(node); } } }
public void LoadXml(XmlElement value) { // Make sure we don't get passed null if (value == null) { throw new ArgumentNullException(nameof(value)); } // Signature XmlElement signatureElement = value; if (!signatureElement.LocalName.Equals("Signature")) { throw new CryptographicException(SR.Cryptography_Xml_InvalidElement, "Signature"); } // Id attribute -- optional _id = Utils.GetAttribute(signatureElement, "Id", SignedXml.XmlDsigNamespaceUrl); if (!Utils.VerifyAttributes(signatureElement, "Id")) { throw new CryptographicException(SR.Cryptography_Xml_InvalidElement, "Signature"); } XmlNamespaceManager nsm = new XmlNamespaceManager(value.OwnerDocument.NameTable); nsm.AddNamespace("ds", SignedXml.XmlDsigNamespaceUrl); int expectedChildNodes = 0; // SignedInfo XmlNodeList signedInfoNodes = signatureElement.SelectNodes("ds:SignedInfo", nsm); if (signedInfoNodes == null || signedInfoNodes.Count == 0 || signedInfoNodes.Count > 1) { throw new CryptographicException(SR.Cryptography_Xml_InvalidElement, "SignedInfo"); } XmlElement signedInfoElement = signedInfoNodes[0] as XmlElement; expectedChildNodes += signedInfoNodes.Count; SignedInfo = new SignedInfo(); SignedInfo.LoadXml(signedInfoElement); // SignatureValue XmlNodeList signatureValueNodes = signatureElement.SelectNodes("ds:SignatureValue", nsm); if (signatureValueNodes == null || signatureValueNodes.Count == 0 || signatureValueNodes.Count > 1) { throw new CryptographicException(SR.Cryptography_Xml_InvalidElement, "SignatureValue"); } XmlElement signatureValueElement = signatureValueNodes[0] as XmlElement; expectedChildNodes += signatureValueNodes.Count; _signatureValue = Convert.FromBase64String(Utils.DiscardWhiteSpaces(signatureValueElement.InnerText)); _signatureValueId = Utils.GetAttribute(signatureValueElement, "Id", SignedXml.XmlDsigNamespaceUrl); if (!Utils.VerifyAttributes(signatureValueElement, "Id")) { throw new CryptographicException(SR.Cryptography_Xml_InvalidElement, "SignatureValue"); } // KeyInfo - optional single element XmlNodeList keyInfoNodes = signatureElement.SelectNodes("ds:KeyInfo", nsm); _keyInfo = new KeyInfo(); if (keyInfoNodes != null) { if (keyInfoNodes.Count > 1) { throw new CryptographicException(SR.Cryptography_Xml_InvalidElement, "KeyInfo"); } foreach (XmlNode node in keyInfoNodes) { XmlElement keyInfoElement = node as XmlElement; if (keyInfoElement != null) { _keyInfo.LoadXml(keyInfoElement); } } expectedChildNodes += keyInfoNodes.Count; } // Object - zero or more elements allowed XmlNodeList objectNodes = signatureElement.SelectNodes("ds:Object", nsm); _embeddedObjects.Clear(); if (objectNodes != null) { foreach (XmlNode node in objectNodes) { XmlElement objectElement = node as XmlElement; if (objectElement != null) { DataObject dataObj = new DataObject(); dataObj.LoadXml(objectElement); _embeddedObjects.Add(dataObj); } } expectedChildNodes += objectNodes.Count; } // Select all elements that have Id attributes XmlNodeList nodeList = signatureElement.SelectNodes("//*[@Id]", nsm); if (nodeList != null) { foreach (XmlNode node in nodeList) { _referencedItems.Add(node); } } // Verify that there aren't any extra nodes that aren't allowed if (signatureElement.SelectNodes("*").Count != expectedChildNodes) { throw new CryptographicException(SR.Cryptography_Xml_InvalidElement, "Signature"); } }
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); // LAMESPEC: This library is totally useless against eXtensibly Marked-up document. int i = NextElementPos (value.ChildNodes, 0, XmlSignature.ElementNames.SignedInfo, XmlSignature.NamespaceURI, true); XmlElement sinfo = (XmlElement) value.ChildNodes [i]; info = new SignedInfo (); info.LoadXml (sinfo); i = NextElementPos (value.ChildNodes, ++i, XmlSignature.ElementNames.SignatureValue, XmlSignature.NamespaceURI, true); XmlElement sigValue = (XmlElement) value.ChildNodes [i]; signature = Convert.FromBase64String (sigValue.InnerText); // signature isn't required: <element ref="ds:KeyInfo" minOccurs="0"/> i = NextElementPos (value.ChildNodes, ++i, XmlSignature.ElementNames.KeyInfo, XmlSignature.NamespaceURI, false); if (i > 0) { XmlElement kinfo = (XmlElement) value.ChildNodes [i]; key = new KeyInfo (); key.LoadXml (kinfo); } XmlNodeList xnl = value.SelectNodes ("xd:Object", dsigNsmgr); foreach (XmlElement xn in xnl) { DataObject obj = new DataObject (); obj.LoadXml (xn); AddObject (obj); } } else throw new CryptographicException ("Malformed element: Signature."); // if invalid if (info == null) throw new CryptographicException ("SignedInfo"); if (signature == null) throw new CryptographicException ("SignatureValue"); }
public void LoadXml(XmlElement value) { // Make sure we don't get passed null if (value == null) { throw new ArgumentNullException("value"); } // Signature XmlElement signatureElement = value; if (!signatureElement.LocalName.Equals("Signature")) { throw new CryptographicException(SecurityResources.GetResourceString("Cryptography_Xml_InvalidElement"), "Signature"); } // Id attribute -- optional _id = Utils.GetAttribute(signatureElement, "Id", SignedXml.XmlDsigNamespaceUrl); XmlNamespaceManager nsm = new XmlNamespaceManager(value.OwnerDocument.NameTable); nsm.AddNamespace("ds", SignedXml.XmlDsigNamespaceUrl); // SignedInfo XmlElement signedInfoElement = signatureElement.SelectSingleNode("ds:SignedInfo", nsm) as XmlElement; if (signedInfoElement == null) { throw new CryptographicException(SecurityResources.GetResourceString("Cryptography_Xml_InvalidElement"), "SignedInfo"); } SignedInfo = new SignedInfo(); SignedInfo.LoadXml(signedInfoElement); // SignatureValue XmlElement signatureValueElement = signatureElement.SelectSingleNode("ds:SignatureValue", nsm) as XmlElement; if (signatureValueElement == null) { throw new CryptographicException(SecurityResources.GetResourceString("Cryptography_Xml_InvalidElement"), "SignedInfo/SignatureValue"); } _signatureValue = Convert.FromBase64String(Utils.DiscardWhiteSpaces(signatureValueElement.InnerText)); _signatureValueId = Utils.GetAttribute(signatureValueElement, "Id", SignedXml.XmlDsigNamespaceUrl); XmlNodeList keyInfoNodes = signatureElement.SelectNodes("ds:KeyInfo", nsm); _keyInfo = new KeyInfo(); if (keyInfoNodes != null) { foreach (XmlNode node in keyInfoNodes) { XmlElement keyInfoElement = node as XmlElement; if (keyInfoElement != null) { _keyInfo.LoadXml(keyInfoElement); } } } XmlNodeList objectNodes = signatureElement.SelectNodes("ds:Object", nsm); _embeddedObjects.Clear(); if (objectNodes != null) { foreach (XmlNode node in objectNodes) { XmlElement objectElement = node as XmlElement; if (objectElement != null) { DataObject dataObj = new DataObject(); dataObj.LoadXml(objectElement); _embeddedObjects.Add(dataObj); } } } // Select all elements that have Id attributes XmlNodeList nodeList = signatureElement.SelectNodes("//*[@Id]", nsm); if (nodeList != null) { foreach (XmlNode node in nodeList) { _referencedItems.Add(node); } } }