Ejemplo n.º 1
0
        public string Sellado(string CadenaOriginal)
        {
            bool cargaexitosa = false;

            Chilkat.PrivateKey Pkey  = new PrivateKey();
            Chilkat.Rsa        loRsa = new Rsa();
            Chilkat.Cert       Cert  = new Chilkat.Cert();
            var base64cert           = _certRepository.GetCertificate("00000000000000");

            cargaexitosa = Cert.LoadFromBase64(base64cert.CerFile);

            byte[] llave = System.Convert.FromBase64String(base64cert.KeyFile);
            cargaexitosa = Pkey.LoadPkcs8Encrypted(llave, base64cert.Pwd);

            cargaexitosa = loRsa.UnlockComponent("ECODEXRSA_D5WpF9zunPvz");
            if (!cargaexitosa)
            {
                return(string.Format("0", loRsa.LastErrorText));
                // throw new Exception(33, string.Format("0", loRsa.LastErrorText));
            }

            if (loRsa.ImportPublicKey(Pkey.GetXml()) == false)
            {
                return(string.Format("Error al obtener la llave publica."));
                //throw new Exception(34, string.Format("Error al obtener la llave publica."));
            }
            loRsa.LittleEndian = false;
            loRsa.Charset      = "utf-8";
            loRsa.EncodingMode = "base64";

            string sello = loRsa.SignStringENC(CadenaOriginal, "sha-1");

            if (!string.IsNullOrEmpty(sello))
            {
                return(sello);
                //SelloInf.Certificado = certi.CertificadoB64;
            }
            else
            {
                return("Error en el sellado");
            }
        }
Ejemplo n.º 2
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;
            }
        }