using GostCryptography.Config;
using System.Security;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.Xml;
using System.Xml;
namespace GostCryptography.Xml
{
///
/// Объект для работы с подписями XML по ГОСТ 34.10
///
///
/// Данный класс реализует стандарт XML-DSig с использованием ГОСТ 34.10. Стандарт XML-DSig разработан консорциумом W3C
/// и определяет рекомендации по формированию подписанных сообщений в формате XML. Фактически XML-DSig решает те же вопросы,
/// что и CMS/PKCS#7. Основное отличие в том, что в CMS/PKCS#7 данные хранятся в структурах, сформированных в соответствии
/// с разметкой ANS.1 (фактически, бинарные данные), а в XML-DSig данные хранятся в текстовом формате в соответствии с правилами
/// документа "XML Signature Syntax and Processing". Основное применение XML-DSig - это XML-ориентированные протоколы, например,
/// Web- и SOAP-сервисы.
///
public sealed class GostSignedXml
{
static GostSignedXml()
{
GostCryptoConfig.Initialize();
}
///
public GostSignedXml()
{
_signedXml = new GostSignedXmlImpl();
}
///
public GostSignedXml(XmlElement element)
{
if (element == null)
{
throw ExceptionUtility.ArgumentNull(nameof(element));
}
_signedXml = new GostSignedXmlImpl(element);
}
///
public GostSignedXml(XmlDocument document)
{
if (document == null)
{
throw ExceptionUtility.ArgumentNull(nameof(document));
}
_signedXml = new GostSignedXmlImpl(document);
}
private readonly GostSignedXmlImpl _signedXml;
///
public SignedInfo SignedInfo => _signedXml.SignedInfo;
///
public KeyInfo KeyInfo
{
get => _signedXml.KeyInfo;
set => _signedXml.KeyInfo = value;
}
///
public AsymmetricAlgorithm SigningKey
{
get => _signedXml.SigningKey;
set => _signedXml.SigningKey = value;
}
#if !NET40
///
public System.Collections.ObjectModel.Collection SafeCanonicalizationMethods
{
get => _signedXml.SafeCanonicalizationMethods;
}
#endif
///
/// Обработчик для перекрытия метода
///
public GetIdElementDelegate GetIdElementHandler
{
get => _signedXml.GetIdElementHandler;
set => _signedXml.GetIdElementHandler = value;
}
///
/// Устанавливает сертификат для вычисления цифровой подписи
///
[SecuritySafeCritical]
public void SetSigningCertificate(X509Certificate2 certificate)
{
SigningKey = certificate.GetPrivateKeyAlgorithm();
}
///
public void AddReference(Reference reference)
{
_signedXml.AddReference(reference);
}
///
public void ComputeSignature()
{
_signedXml.ComputeSignatureGost();
}
///
public bool CheckSignature()
{
return _signedXml.CheckSignature();
}
///
public bool CheckSignature(AsymmetricAlgorithm publicKey)
{
return _signedXml.CheckSignature(publicKey);
}
///
public void LoadXml(XmlElement element)
{
_signedXml.LoadXml(element);
}
///
public XmlElement GetXml()
{
return _signedXml.GetXml();
}
///
public XmlElement GetIdElement(XmlDocument document, string idValue)
{
return _signedXml.GetIdElement(document, idValue);
}
}
}