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); }
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)); }
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; }
public void TearDown() { try { _privateKey.Dispose(); } finally { _privateKey = null; } try { _publicKey.Dispose(); } finally { _publicKey = null; } }
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; }
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); }
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); }