Esempio n. 1
0
        public CfdiResult SellarXml(String rutaCert, String rutaKey, String contrasena, String rutaArchivoXmlOrigen)
        {
            CfdiResult result = AgregarCertificado(rutaCert);

            if (!result.Correcto)
            {
                return(result);
            }

            PrivateKey privKey = new PrivateKey();

            XDocument xDoc = XDocument.Load(rutaArchivoXmlOrigen);

            xDoc.Root.SetAttributeValue("Certificado", this.Certificado);
            xDoc.Root.SetAttributeValue("NoCertificado", this.NoCertificado);
            xDoc.Save(rutaArchivoXmlOrigen);

            String cadenaOriginal = GetCadenaOriginal(this.RutaXSLTCadenaOriginal, rutaArchivoXmlOrigen);

            if (!privKey.LoadPkcs8EncryptedFile(rutaKey, contrasena))
            {
                return(new CfdiResult(false, privKey.LastErrorText));
            }

            String privKeyXml = privKey.GetXml();
            Rsa    rsa        = new Rsa();
            String hashAlg    = "SHA-256";

            if (!rsa.UnlockComponent("RSAT34MB34N_7F1CD986683M"))
            {
                return(new CfdiResult(false, rsa.LastErrorText));
            }

            if (!rsa.ImportPrivateKey(privKeyXml))
            {
                return(new CfdiResult(false, rsa.LastErrorText));
            }

            rsa.Charset      = "UTF-8";
            rsa.EncodingMode = "base64";
            rsa.LittleEndian = false;

            Cert cert = new Cert();

            if (!cert.LoadFromFile(rutaCert))
            {
                return(new CfdiResult(false, cert.LastErrorText));
            }

            String selloBase64 = rsa.SignStringENC(cadenaOriginal, hashAlg);

            PublicKey publicKey = cert.ExportPublicKey();

            Rsa rsa2 = new Rsa();

            if (!rsa2.ImportPublicKey(publicKey.GetXml()))
            {
                return(new CfdiResult(false, rsa2.LastErrorText));
            }
            rsa2.Charset      = "utf-8";
            rsa2.EncodingMode = "base64";
            rsa2.LittleEndian = false;

            if (!rsa2.VerifyStringENC(cadenaOriginal, hashAlg, selloBase64))
            {
                return(new CfdiResult(false, rsa2.LastErrorText));
            }

            cert.Dispose();
            privKey.Dispose();
            publicKey.Dispose();

            this.Sello = selloBase64;


            xDoc.Root.SetAttributeValue("Sello", selloBase64);

            //String xml = xDoc.ToString();
            //File.WriteAllText(rutaArchivoXmlOrigen, xml);
            xDoc.Save(rutaArchivoXmlOrigen);

            //SerializarObjeto(rutaArchivoXmlOrigen);

            return(new CfdiResult());
        }
        /// <summary>
        /// Obtiene la informnacion del certificado, lo desencripta y aplica digestion SHA-256 para generar el sello.
        /// </summary>
        /// <param name="cfdi"></param>
        /// <param name="xml"></param>
        private static void firmarXml(Cfdi cfdi, ref XDocument xml)
        {
            try
            {
                obtenerCertificado(cfdi.rutaArchivoCer, ref xml);
                string cadenaOriginal  = obtenerCadenaOriginal(cfdi.rutaXsltCadenaOriginal, xml);
                string algoritmoHash   = "SHA-256";
                string xmlLlavePrivada = string.Empty;
                string sellobase64     = string.Empty;

                Rsa               rsa          = new Rsa();
                Rsa               rsa2         = new Rsa();
                Cert              certificado  = new Cert();
                PrivateKey        llavePrivada = new PrivateKey();
                Chilkat.PublicKey llavePublica;

                if (llavePrivada.LoadPkcs8EncryptedFile(cfdi.rutaArchivoKey, cfdi.secretArchivoKey) == false)
                {
                    return;
                }

                xmlLlavePrivada = llavePrivada.GetXml();

                if (rsa.UnlockComponent(Constantes.CHILKAT_UNLOCK_CODE) == false)
                {
                    //Debug.Write(rsa.LastErrorText);
                    return;
                }

                if (rsa.ImportPrivateKey(xmlLlavePrivada) == false)
                {
                    //Debug.Write(rsa.LastErrorText);
                    return;
                }

                rsa.Charset      = "utf-8";
                rsa.EncodingMode = "base64";
                rsa.LittleEndian = false;

                if (certificado.LoadFromFile(cfdi.rutaArchivoCer) == false)
                {
                    return;
                }

                sellobase64 = rsa.SignStringENC(cadenaOriginal, algoritmoHash);

                xml.Root.SetAttributeValue("Sello", sellobase64);

                XElement xComprobante = xml.Root;
                xComprobante = HelpersXml.removerAtributosVacios(xml.Root, true);

                llavePublica = certificado.ExportPublicKey();

                if (rsa2.ImportPublicKey(llavePublica.GetXml()) == false)
                {
                    return;
                }

                rsa2.Charset      = "utf-8";
                rsa.EncodingMode  = "base64";
                rsa2.LittleEndian = false;

                if (rsa2.VerifyStringENC(cadenaOriginal, algoritmoHash, sellobase64) == false)
                {
                    return;
                }

                certificado.Dispose();

                cfdi.cadenaOriginal = cadenaOriginal;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }