コード例 #1
0
        private static XmlDocument SignXmlDocument(XmlDocument xmlDocument, Gost3410AsymmetricAlgorithm signingCertificate)
        {
            // Создание подписчика XML-документа
            var signedXml = new SignedXml(xmlDocument);

            // Установка ключа для создания подписи
            signedXml.SigningKey = signingCertificate;
            signedXml.SignedInfo.SignatureMethod = SignedXml.XmlDsigGost3410Url;

            // Ссылка на узел, который нужно подписать, с указанием алгоритма хэширования
            var dataReference = new Reference {
                Uri = "#Id1", DigestMethod = SignedXml.XmlDsigGost3411Url
            };

            // Установка ссылки на узел
            signedXml.AddReference(dataReference);

            // Установка информации о сертификате, который использовался для создания подписи
            var keyInfo = new KeyInfo();

            keyInfo.AddClause(new KeyInfoX509Data(signingCertificate.ContainerCertificate));
            signedXml.KeyInfo = keyInfo;

            // Вычисление подписи
            signedXml.ComputeSignature();

            // Получение XML-представления подписи
            var signatureXml = signedXml.GetXml();

            // Добавление подписи в исходный документ
            xmlDocument.DocumentElement.AppendChild(xmlDocument.ImportNode(signatureXml, true));

            return(xmlDocument);
        }
コード例 #2
0
        public void ShouldSignXml()
        {
            // Given
            var keyContainer = TestCertificates.GetKeyContainer();
            var signingKey   = new Gost3410AsymmetricAlgorithm(keyContainer);
            var xmlDocument  = CreateXmlDocument();

            // When
            var signedXmlDocument = SignXmlDocument(xmlDocument, signingKey);

            // Then
            Assert.IsTrue(VerifyXmlDocumentSignature(signedXmlDocument));
        }
コード例 #3
0
        public void SetUp()
        {
            // Получатель формирует закрытый ключ для дешифрации XML
            var privateKey = GostCryptoConfig.CreateGost3410AsymmetricAlgorithm();

            // Получатель экспортирует отправителю информацию о своем открытом ключе
            var publicKeyInfo = privateKey.ExportParameters(false);

            // Отправитель импортирует от получателя информацию о его открытом ключе
            var publicKey = new Gost3410AsymmetricAlgorithm();

            // Отправитель формирует открытый ключ для шифрации XML
            publicKey.ImportParameters(publicKeyInfo);

            _privateKey = privateKey;
            _publicKey  = publicKey;
        }
コード例 #4
0
        public void TearDown()
        {
            try
            {
                _privateKey.Dispose();
            }
            finally
            {
                _privateKey = null;
            }

            try
            {
                _publicKey.Dispose();
            }
            finally
            {
                _publicKey = null;
            }
        }
コード例 #5
0
        public void SetUp()
        {
            // Получатель извлекает информацию о закрытом ключе из контейнера ключей
            var keyContainer = TestCertificates.GetKeyContainer();

            // Получатель формирует закрытый ключ для дешифрации XML
            var privateKey = new Gost3410AsymmetricAlgorithm(keyContainer);

            // Получатель экспортирует отправителю информацию о своем открытом ключе
            var publicKeyInfo = privateKey.ExportParameters(false);

            // Отправитель импортирует от получателя информацию о его открытом ключе
            var publicKey = new Gost3410AsymmetricAlgorithm();

            // Отправитель формирует открытый ключ для шифрации XML
            publicKey.ImportParameters(publicKeyInfo);

            _privateKey = privateKey;
            _publicKey  = publicKey;
        }
コード例 #6
0
        private static XmlDocument SignXmlDocument(XmlDocument xmlDocument, Gost3410AsymmetricAlgorithm signingCertificate)
        {
            // Создание подписчика XML-документа
            var signedXml = new SignedXml(xmlDocument);

            // Установка ключа для создания подписи
            signedXml.SigningKey = signingCertificate;

            // Ссылка на весь документ и указание алгоритма хэширования
            var dataReference = new Reference {
                Uri = "", DigestMethod = SignedXml.XmlDsigGost3411Url
            };

            // Методы преобразования для подписи всего документа
            dataReference.AddTransform(new XmlDsigEnvelopedSignatureTransform());
            dataReference.AddTransform(new XmlDsigExcC14NTransform());

            // Установка ссылки на узел
            signedXml.AddReference(dataReference);

            // Метод канонизации и алгоритм подписи
            signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl;
            signedXml.SignedInfo.SignatureMethod        = SignedXml.XmlDsigGost3410Url;

            // Установка информации о сертификате, который использовался для создания подписи
            var keyInfo = new KeyInfo();

            keyInfo.AddClause(new KeyInfoX509Data(signingCertificate.ContainerCertificate));
            signedXml.KeyInfo = keyInfo;

            // Вычисление подписи
            signedXml.ComputeSignature();

            // Получение XML-представления подписи
            var signatureXml = signedXml.GetXml();

            // Добавление подписи в исходный документ
            xmlDocument.DocumentElement.AppendChild(xmlDocument.ImportNode(signatureXml, true));

            return(xmlDocument);
        }
コード例 #7
0
        private static XmlDocument SignSmevRequest(XmlDocument smevRequest, Gost3410AsymmetricAlgorithm signingCertificate)
        {
            // Создание подписчика XML-документа
            var signedXml = new SmevSignedXml(smevRequest);             // { GetIdElementHandler = GetSmevIdElement };

            // Установка ключа для создания подписи
            signedXml.SigningKey = signingCertificate;

            // Ссылка на узел, который нужно подписать, с указанием алгоритма хэширования ГОСТ Р 34.11-94 (в соответствии с методическими рекомендациями СМЭВ)
            var dataReference = new Reference {
                Uri = "#body", DigestMethod = SignedXml.XmlDsigGost3411UrlObsolete
            };

            // Метод преобразования, применяемый к данным перед их подписью (в соответствии с методическими рекомендациями СМЭВ)
            var dataTransform = new XmlDsigExcC14NTransform();

            dataReference.AddTransform(dataTransform);

            // Установка ссылки на узел
            signedXml.AddReference(dataReference);

            // Установка алгоритма нормализации узла SignedInfo (в соответствии с методическими рекомендациями СМЭВ)
            signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl;

            // Установка алгоритма подписи ГОСТ Р 34.10-2001 (в соответствии с методическими рекомендациями СМЭВ)
            signedXml.SignedInfo.SignatureMethod = SignedXml.XmlDsigGost3410UrlObsolete;

            // Вычисление подписи
            signedXml.ComputeSignature();

            // Получение XML-представления подписи
            var signatureXml = signedXml.GetXml();

            // Добавление подписи в исходный документ
            smevRequest.GetElementsByTagName("ds:Signature")[0].PrependChild(smevRequest.ImportNode(signatureXml.GetElementsByTagName("SignatureValue")[0], true));
            smevRequest.GetElementsByTagName("ds:Signature")[0].PrependChild(smevRequest.ImportNode(signatureXml.GetElementsByTagName("SignedInfo")[0], true));
            smevRequest.GetElementsByTagName("wsse:BinarySecurityToken")[0].InnerText = Convert.ToBase64String(signingCertificate.ContainerCertificate.RawData);

            return(smevRequest);
        }