public static byte[] ComputeValueOfElementList(XadesSignedXml xadesSignedXml, ArrayList elementXpaths) { XmlElement signatureElement = xadesSignedXml.GetSignatureElement(); List <XmlAttribute> allNamespaces = xadesSignedXml.GetAllNamespaces(signatureElement); XmlDocument ownerDocument = signatureElement.OwnerDocument; XmlNamespaceManager xmlNamespaceManager = new XmlNamespaceManager(ownerDocument.NameTable); xmlNamespaceManager.AddNamespace("ds", "http://www.w3.org/2000/09/xmldsig#"); xmlNamespaceManager.AddNamespace("xades", "http://uri.etsi.org/01903/v1.3.2#"); using (MemoryStream memoryStream = new MemoryStream()) { foreach (string elementXpath in elementXpaths) { XmlNodeList xmlNodeList = signatureElement.SelectNodes(elementXpath, xmlNamespaceManager); if (xmlNodeList.Count == 0) { throw new CryptographicException("Element " + elementXpath + " not found while calculating hash"); } foreach (XmlNode item in xmlNodeList) { XmlElement xmlElement = (XmlElement)item.Clone(); xmlElement.SetAttribute("xmlns:" + XadesSignedXml.XmlDSigPrefix, "http://www.w3.org/2000/09/xmldsig#"); foreach (XmlAttribute item2 in allNamespaces) { xmlElement.SetAttribute(item2.Name, item2.Value); } byte[] array = ApplyTransform(xmlElement, new XmlDsigC14NTransform()); memoryStream.Write(array, 0, array.Length); } } return(memoryStream.ToArray()); } }
/// <summary> /// Obtiene el valor canonicalizado de los elementos especificados en elementXpaths /// </summary> /// <param name="xadesSignedXml"></param> /// <param name="elementXpaths"></param> /// <returns></returns> public static byte[] ComputeValueOfElementList(XadesSignedXml xadesSignedXml, ArrayList elementXpaths) { XmlDocument xmlDocument; XmlNamespaceManager xmlNamespaceManager; XmlNodeList searchXmlNodeList; var signatureXmlElement = xadesSignedXml.GetSignatureElement(); var namespaces = xadesSignedXml.GetAllNamespaces(signatureXmlElement); xmlDocument = signatureXmlElement.OwnerDocument; xmlNamespaceManager = new XmlNamespaceManager(xmlDocument.NameTable); xmlNamespaceManager.AddNamespace("ds", SignedXml.XmlDsigNamespaceUrl); xmlNamespaceManager.AddNamespace("xades", XadesSignedXml.XadesNamespaceUri); using (MemoryStream msResult = new MemoryStream()) { foreach (string elementXpath in elementXpaths) { searchXmlNodeList = signatureXmlElement.SelectNodes(elementXpath, xmlNamespaceManager); if (searchXmlNodeList.Count == 0) { throw new CryptographicException("Element " + elementXpath + " not found while calculating hash"); } foreach (XmlNode xmlNode in searchXmlNodeList) { XmlAttribute dsNamespace = xmlDocument.CreateAttribute("xmlns:" + XadesSignedXml.XmlDSigPrefix); dsNamespace.Value = XadesSignedXml.XmlDsigNamespaceUrl; xmlNode.Attributes.Append(dsNamespace); foreach (var attr in namespaces) { XmlAttribute attrNamespace = xmlDocument.CreateAttribute(attr.Name); attrNamespace.Value = attr.Value; xmlNode.Attributes.Append(attrNamespace); } byte[] canonicalizedElement = ApplyTransform((XmlElement)xmlNode, new XmlDsigC14NTransform()); msResult.Write(canonicalizedElement, 0, canonicalizedElement.Length); } } return(msResult.ToArray()); } }