93 lines
2.5 KiB
C#
93 lines
2.5 KiB
C#
#define DEBUG
|
|
using System;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.Security.Cryptography;
|
|
using System.Text;
|
|
using System.Xml;
|
|
using Aitex.Core.RT.Log;
|
|
|
|
namespace Aitex.Core.Util
|
|
{
|
|
public static class FileSigner
|
|
{
|
|
public static bool IsValid(string fileName)
|
|
{
|
|
bool result = false;
|
|
try
|
|
{
|
|
XmlDocument xmlDocument = new XmlDocument();
|
|
xmlDocument.Load(fileName);
|
|
Debug.Assert(xmlDocument != null && xmlDocument.DocumentElement != null);
|
|
XmlElement documentElement = xmlDocument.DocumentElement;
|
|
XmlElement xmlElement = documentElement["Signature"];
|
|
if (xmlElement == null)
|
|
{
|
|
return false;
|
|
}
|
|
documentElement.RemoveChild(xmlElement);
|
|
UnicodeEncoding unicodeEncoding = new UnicodeEncoding();
|
|
SHA1CryptoServiceProvider sHA1CryptoServiceProvider = new SHA1CryptoServiceProvider();
|
|
byte[] inArray = sHA1CryptoServiceProvider.ComputeHash(unicodeEncoding.GetBytes(documentElement.InnerXml));
|
|
string text = Convert.ToBase64String(inArray);
|
|
documentElement.AppendChild(xmlElement);
|
|
if (xmlElement.InnerText == text)
|
|
{
|
|
result = true;
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
result = false;
|
|
LOG.Write(ex);
|
|
throw;
|
|
}
|
|
finally
|
|
{
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public static void Sign(string fileName)
|
|
{
|
|
try
|
|
{
|
|
XmlDocument xmlDocument = new XmlDocument();
|
|
bool flag = true;
|
|
if (File.Exists(fileName) && (File.GetAttributes(fileName) & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
|
|
{
|
|
flag = false;
|
|
File.SetAttributes(fileName, FileAttributes.Normal);
|
|
}
|
|
xmlDocument.Load(fileName);
|
|
XmlElement documentElement = xmlDocument.DocumentElement;
|
|
XmlElement xmlElement = documentElement["Signature"];
|
|
if (xmlElement != null)
|
|
{
|
|
documentElement.RemoveChild(xmlElement);
|
|
}
|
|
UnicodeEncoding unicodeEncoding = new UnicodeEncoding();
|
|
SHA1CryptoServiceProvider sHA1CryptoServiceProvider = new SHA1CryptoServiceProvider();
|
|
byte[] inArray = sHA1CryptoServiceProvider.ComputeHash(unicodeEncoding.GetBytes(documentElement.InnerXml));
|
|
string innerText = Convert.ToBase64String(inArray);
|
|
xmlElement = xmlDocument.CreateElement("Signature");
|
|
xmlElement.InnerText = innerText;
|
|
documentElement.AppendChild(xmlElement);
|
|
xmlDocument.Save(fileName);
|
|
if (!flag)
|
|
{
|
|
File.SetAttributes(fileName, FileAttributes.ReadOnly);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
LOG.Write(ex);
|
|
throw;
|
|
}
|
|
finally
|
|
{
|
|
}
|
|
}
|
|
}
|
|
}
|