static byte[] HashXml ( XmlElement xe, HashAlgorithm hash )
{
XmlDocument xd = new XmlDocument();
xd.LoadXml (xe.OuterXml);
return HashXml(xd, hash);
}
static byte[] HashXml ( XmlDocument xd, HashAlgorithm hash )
{
//Récupération de l'assembly de signature électronique
Assembly a = Assembly.Load("System.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
//Récupère la classe de Hashage
Type t = a.GetType("System.Security.Cryptography.Xml.CanonicalXml");
//Récupère le constructeur le plus simple de la classe
ConstructorInfo c = t.GetConstructor(
BindingFlags.Instance | BindingFlags.NonPublic,
null,
new Type[] { typeof(XmlDocument), typeof(XmlResolver) },
null);
//construit l'objet
object cx = c.Invoke(new object[] { xd, null });
//calcule le Hash
byte[] result = (byte[])t.InvokeMember(
"GetDigestedBytes",
BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance,
null,
cx,
new object[] { hash });
return result;
}