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; } }