Basic formatting applied. Unnecessary comments have been removed. Suspicious code is covered by TODO.
73 lines
2.4 KiB
C#
73 lines
2.4 KiB
C#
using Hcs.GostXades.Abstractions;
|
||
using Hcs.GostXades.Helpers;
|
||
using System;
|
||
|
||
namespace Hcs.GostXades
|
||
{
|
||
public class GostXadesBesService : IXadesService
|
||
{
|
||
CryptoProviderTypeEnum cryptoProviderType;
|
||
|
||
public GostXadesBesService(CryptoProviderTypeEnum cryptoProviderType)
|
||
{
|
||
this.cryptoProviderType = cryptoProviderType;
|
||
}
|
||
|
||
public void ValidateSignature(string xmlData, string elementId)
|
||
{
|
||
if (string.IsNullOrEmpty(xmlData))
|
||
{
|
||
throw new ArgumentNullException(nameof(xmlData));
|
||
}
|
||
if (string.IsNullOrWhiteSpace(elementId))
|
||
{
|
||
throw new ArgumentNullException(nameof(elementId));
|
||
}
|
||
|
||
var document = XmlDocumentHelper.Create(xmlData);
|
||
var signedXml = new XadesBesSignedXml(document, elementId)
|
||
{
|
||
CertificateMatcher = new CertificateMatcher(new GostCryptoProvider(this.cryptoProviderType))
|
||
};
|
||
signedXml.Validate();
|
||
}
|
||
|
||
public string Sign(string xmlData, string elementId, string certificateThumbprint, string certificatePassword)
|
||
{
|
||
if (string.IsNullOrEmpty(xmlData))
|
||
{
|
||
throw new ArgumentNullException(nameof(xmlData));
|
||
}
|
||
if (string.IsNullOrEmpty(elementId))
|
||
{
|
||
throw new ArgumentNullException(nameof(elementId));
|
||
}
|
||
if (string.IsNullOrEmpty(certificateThumbprint))
|
||
{
|
||
throw new ArgumentNullException(nameof(certificateThumbprint));
|
||
}
|
||
|
||
var originalDoc = XmlDocumentHelper.Create(xmlData);
|
||
var certificate = CertificateHelper.GetCertificateByThumbprint(certificateThumbprint);
|
||
|
||
var provider = new GostCryptoProvider(this.cryptoProviderType);
|
||
var xadesSignedXml = new XadesBesSignedXml(originalDoc)
|
||
{
|
||
SignedElementId = elementId,
|
||
CryptoProvider = provider
|
||
};
|
||
|
||
var element = xadesSignedXml.FindElement(elementId, originalDoc);
|
||
if (element == null)
|
||
{
|
||
throw new InvalidOperationException($"<22><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> c Id {elementId}");
|
||
}
|
||
|
||
xadesSignedXml.ComputeSignature(certificate, certificatePassword);
|
||
xadesSignedXml.InjectSignatureTo(originalDoc);
|
||
|
||
return originalDoc.OuterXml;
|
||
}
|
||
}
|
||
}
|