Bueno pues ya lo tengo, he recibido ayuda de valor incalculable, Si no, no lo consigo ni de coña. Ojo que como ya se había hablado, es bien distinto calcular el hash con el fichero xml formateado indentado que sin formato evidentemente los CR LF varian el valor del Hash. ¿Cómo se tendrá que hacer? pues sorpresa, pero por lo menos lo está haciendo. Luego es más fácil corregir y adaptar que empezar desde cero. Las cosas deprisa y corriendo por muy claras que las tengas, no suelen salir igual.
Observaciones estoy creando el hash mientras estoy creando el xml.
Aquí va el código, cualquier sugerencia u objeción sería bien recibida.
Código:
var
archivoXML: TXMLDocument;
NDatosControl, NCabecera : IXMLNode;
NodoSistema, NodoRegistroAltaFacturas, NodoRegistroFacturacion: IXMLNode;
ContenidoNodoRegistroFacturacion: WideString;
Huella: String;
· · ·
NDatosControl := NCabecera.AddChild( 'DatosControl' );
Nodo := NDatosControl.AddChild( 'Huella' );
//***** Calculo Hash RegistroFacturacion
NodoSistema := archivoXML.DocumentElement;
NodoregistroAltaFacturas := NodoSistema.ChildNodes.FindNode('RegistroAltaFacturas');
if Assigned(NodoregistroAltaFacturas) then
begin
NodoRegistroFacturacion := NodoRegistroAltaFacturas.ChildNodes.FindNode('RegistroFacturacion');
if Assigned(NodoRegistroFacturacion) then
ContenidoNodoRegistroFacturacion := NodoRegistroFacturacion.XML;
end;
Huella := CalculaStrHashSHA256(ContenidoNodoRegistroFacturacion, checkBox1.Checked);
//****** Fin calculo huella SHA256
Nodo.Text := Huella;
Nodo := NDatosControl.AddChild( 'TipoHash' );
Nodo.Text := '01';
· · ·
La función CalculaStrHashSHA256 esta contenida en una librería DLL. Si alguien necesita el código de la librería lo pongo, aunque es bien sencillo.
He comprobado los Hash resultantes con la herramienta online
https://emn178.github.io/online-tools/sha256.html y en principio están perfectos.