PDA

Ver la Versión Completa : Traducir código de C# a Delphi (para firmar un documento XML)


wilcg
21-10-2018, 02:53:27
Amigos del foro necesito su ayuda,
esta funcion sirve para firmar un XML con certificado digital, pero esta en lenguaje C#, no soy bueno en este lenguaje quisiera su ayuda para convertirlo a Delphi. Espero su ayuda es muy importante para mi proyecto.

public static void firmar(string path_cert, string pass_cert, string path_xml,string path_guardar)
{
System.Security.Cryptography.X509Certificates.X509Certificate2 certificado
= new System.Security.Cryptography.X509Certificates.X509Certificate2(path_cert,pass_cert,
System.Security.Cryptography.X509Certificates.X509KeyStorageFlags.Exportable);

var xmlDoc = new XmlDocument();
xmlDoc.PreserveWhitespace = true;
xmlDoc.Load(path_xml);

var nodoExtension =
xmlDoc.GetElementsByTagName(
"ExtensionContent",
"urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2").Item(0);

var signedXml = new SignedXml(xmlDoc) { SigningKey = certificado.PrivateKey };
var xmlSignature = signedXml.Signature;

var env = new XmlDsigEnvelopedSignatureTransform();

var reference = new Reference(string.Empty);
reference.AddTransform(env);
xmlSignature.SignedInfo.AddReference(reference);

var keyInfo = new KeyInfo();
var x509Data = new KeyInfoX509Data(certificado);

x509Data.AddSubjectName(certificado.Subject);

keyInfo.AddClause(x509Data);
xmlSignature.KeyInfo = keyInfo;
xmlSignature.Id = "Sunat";
signedXml.ComputeSignature();

nodoExtension.AppendChild(signedXml.GetXml());

using (var memDoc = new System.IO.MemoryStream())
{

using (var writer = XmlWriter.Create(memDoc,
new XmlWriterSettings { Encoding = Encoding.GetEncoding("UTF-8") }))
{
xmlDoc.WriteTo(writer);
}
}
xmlDoc.Save(path_guardar);
}

Ñuño Martínez
25-10-2018, 13:15:54
Eso de hacer traducciones directas sin saber qué hace paso a paso es complicadete, sí.

Por lo que veo, usa un tipo concreto de codificación. ¿Está disponible en Delphi de alguna forma? Habría que empezar por ahí.

Del resto, veo que maneja o genera un archivo XML. Lo del "using", ni idea (¿WITH? ¿NAMESPACE?), y la creación del objeto signedXML se me escapa también.

dec
25-10-2018, 13:26:11
Hola a todos,

Es que no se pide traducir algo más o menos "traducible", sino que habría que traducir mucho más, por decirlo así, como las clases utilizadas, etc. Yo intentaría buscar cómo se puede firmar un XML usando Delphi... encontrarás resultados como este (en inglés), desde el que puedes acaso tirar:

https://stackoverflow.com/questions/32679631/delphi-sign-xml-with-cerfificate-rsa-sha256-x509