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); } } }