Пример #1
0
        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());
            }
        }
Пример #2
0
        /// <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());
            }
        }