Sic.Framework/MECF.Framework.Common/Aitex/Core/Util/FileSigner.cs

93 lines
2.5 KiB
C#
Raw Normal View History

2023-04-13 11:51:03 +08:00
#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
{
}
}
}
}