/// <summary> /// Obtiene la cadena original del cfdi /// </summary> /// <param name="rutaArchivoCadenaOriginal"></param> /// <param name="xml"></param> /// <returns>Cadena Original</returns> private static string obtenerCadenaOriginal(string rutaArchivoCadenaOriginal, XDocument xml) { try { string cadenaOriginal = null; XElement xComprobante = xml.Root; HelpersXml.removerAtributosVacios(xComprobante, true); string xmlTemporal = Path.GetTempFileName(); dynamic nuevoXml = Path.GetTempFileName(); xComprobante.Save(xmlTemporal); dynamic Xsl = new System.Xml.Xsl.XslCompiledTransform(); Xsl.Load(rutaArchivoCadenaOriginal); Xsl.Transform(xmlTemporal, nuevoXml); Xsl = null; dynamic StreamReader = new StreamReader(nuevoXml); cadenaOriginal = StreamReader.ReadToEnd(); StreamReader.Close(); File.Delete(nuevoXml); File.Delete(xmlTemporal); StreamReader.Dispose(); return(cadenaOriginal); } catch (Exception ex) { throw ex; } }
/// <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; } }