/// <summary>
        /// Especifica el nodo en el cual se añadira la firma
        /// </summary>
        /// <param name="elementXPath"></param>
        /// <param name="namespaces"></param>
        private void SetSignatureDestination(SignatureDocument sigDocument, SignatureXPathExpression destination)
        {
            XmlNode nodo;

            if (destination.Namespaces.Count > 0)
            {
                XmlNamespaceManager xmlnsMgr = new XmlNamespaceManager(sigDocument.Document.NameTable);
                foreach (var item in destination.Namespaces)
                {
                    xmlnsMgr.AddNamespace(item.Key, item.Value);
                }

                nodo = sigDocument.Document.SelectSingleNode(destination.XPathExpression, xmlnsMgr);
            }
            else
            {
                nodo = sigDocument.Document.SelectSingleNode(destination.XPathExpression);
            }

            if (nodo == null)
            {
                throw new Exception("Elemento no encontrado");
            }

            sigDocument.XadesSignature.SignatureNodeDestination = (XmlElement)nodo;
        }
        public byte[] FirmarAjusteNominaIndividual(byte[] bytesXml, DateTime fecha, int numExtension = 1)
        {
            var xpathExpression = new SignatureXPathExpression();

            xpathExpression.Namespaces.Add("anei", "dian:gov:co:facturaelectronica:NominaIndividualDeAjuste");
            xpathExpression.Namespaces.Add("ext", "urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2");
            xpathExpression.Namespaces.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
            xpathExpression.Namespaces.Add("xades", "http://uri.etsi.org/01903/v1.3.2#");
            xpathExpression.Namespaces.Add("xades141", "http://uri.etsi.org/01903/v1.4.1#");
            xpathExpression.XPathExpression = "/anei:NominaIndividualDeAjuste/ext:UBLExtensions/ext:UBLExtension[" + numExtension + "]/ext:ExtensionContent";

            return(FirmarDocumento(bytesXml, fecha, xpathExpression));
        }
        public byte[] FirmarNotaCredito(byte[] bytesXml, DateTime fecha)
        {
            var xpathExpression = new SignatureXPathExpression();

            xpathExpression.Namespaces.Add("fe", "urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2");
            xpathExpression.Namespaces.Add("cac", "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2");
            xpathExpression.Namespaces.Add("cbc", "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2");
            xpathExpression.Namespaces.Add("ext", "urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2");
            xpathExpression.Namespaces.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
            xpathExpression.Namespaces.Add("sts", "dian:gov:co:facturaelectronica:Structures-2-1");
            xpathExpression.Namespaces.Add("xades", "http://uri.etsi.org/01903/v1.3.2#");
            xpathExpression.Namespaces.Add("xades141", "http://uri.etsi.org/01903/v1.4.1#");
            xpathExpression.XPathExpression = "/fe:CreditNote/ext:UBLExtensions/ext:UBLExtension[2]/ext:ExtensionContent";

            return(FirmarDocumento(bytesXml, fecha, xpathExpression));
        }
        protected byte[] FirmarDocumento(byte[] bytesXml, DateTime fecha, SignatureXPathExpression xpathExpression)
        {
            var xadesService = new XadesService();

            var parametros = new SignatureParameters();

            parametros.SignatureMethod = SignatureMethod.RSAwithSHA256;
            parametros.DigestMethod    = DigestMethod.SHA256;
            parametros.SigningDate     = fecha;

            parametros.SignerRole = new SignerRole();
            var signerRole = (RolFirmante == RolFirmante.EMISOR ? "supplier" : "third party");

            parametros.SignerRole.ClaimedRoles.Add(signerRole);

            parametros.SignatureDestination = xpathExpression;

            parametros.SignaturePolicyInfo = new SignaturePolicyInfo();
            parametros.SignaturePolicyInfo.PolicyIdentifier      = "https://facturaelectronica.dian.gov.co/politicadefirma/v2/politicadefirmav2.pdf";
            parametros.SignaturePolicyInfo.PolicyHash            = "dMoMvtcG5aIzgYo0tIsSQeVJBDnUnfSOfBpxXrmor0Y=";
            parametros.SignaturePolicyInfo.PolicyDigestAlgorithm = DigestMethod.SHA256;

            parametros.SignaturePackaging = SignaturePackaging.ENVELOPED;
            parametros.DataFormat         = new DataFormat {
                MimeType = "text/xml"
            };

            using (parametros.Signer = new Signer(new X509Certificate2(RutaCertificado, ClaveCertificado)))
            {
                using (var stream = new MemoryStream(bytesXml))
                {
                    var signatureDocument = xadesService.Sign(stream, parametros);

                    var output = new MemoryStream();
                    signatureDocument.Save(output);

                    return(output.ToArray());
                }
            }
        }
示例#5
0
        private void SetSignatureDestination(SignatureDocument sigDocument, SignatureXPathExpression destination)
        {
            XmlNode xmlNode;

            if (destination.Namespaces.Count > 0)
            {
                XmlNamespaceManager xmlNamespaceManager = new XmlNamespaceManager(sigDocument.Document.NameTable);
                foreach (KeyValuePair <string, string> @namespace in destination.Namespaces)
                {
                    xmlNamespaceManager.AddNamespace(@namespace.Key, @namespace.Value);
                }
                xmlNode = sigDocument.Document.SelectSingleNode(destination.XPathExpression, xmlNamespaceManager);
            }
            else
            {
                xmlNode = sigDocument.Document.SelectSingleNode(destination.XPathExpression);
            }
            if (xmlNode == null)
            {
                throw new Exception("Elemento no encontrado");
            }
            sigDocument.XadesSignature.SignatureNodeDestination = (XmlElement)xmlNode;
        }