audit notes work completed, test fixes work (95% done), new sprints, new data sources setup and configuration

This commit is contained in:
master
2026-01-14 10:48:00 +02:00
parent d7be6ba34b
commit 95d5898650
379 changed files with 40695 additions and 19041 deletions

View File

@@ -4,17 +4,15 @@
<TargetFramework>net10.0</TargetFramework>
<IsPackable>false</IsPackable>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
<ManagePackageVersionsCentrally>false</ManagePackageVersionsCentrally>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
<UseXunitV3></UseXunitV3>
<NoWarn>CS0104;CS0168;CS0219;CS0414;CS0649;CS8600;CS8602;CS8603;CS8604</NoWarn>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="nunit" Version="4.3.1" />
<PackageReference Include="NUnit3TestAdapter" Version="5.1.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
<PackageReference Include="xunit.v3" Version="3.2.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.5" />
<PackageReference Include="Microsoft.NET.Test.Sdk" />
<PackageReference Include="xunit" />
<PackageReference Include="xunit.runner.visualstudio" />
</ItemGroup>
<ItemGroup>

View File

@@ -1,4 +1,4 @@
using System.IO;
using System.IO;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
@@ -6,23 +6,22 @@ using System.Text;
using GostCryptography.Base;
using GostCryptography.Gost_28147_89;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Gost_28147_89
{
/// <summary>
/// Шифрование и дешифрование данных с использованием случайного сессионного ключа.
/// ?????????? ? ???????????? ?????? ? ?????????????? ?????????? ??????????? ?????.
/// </summary>
/// <remarks>
/// Тест имитирует обмен данными между условным отправителем, который шифрует заданный поток байт, и условным получателем, который дешифрует
/// зашифрованный поток байт. Шифрация осуществляется с использованием случайного симметричного ключа, который в свою очередь шифруется
/// с использованием открытого ключа получателя. Соответственно для дешифрации данных сначала расшифровывается случайный симметричный ключ
/// с использованием закрытого ключа получателя.
/// ???? ????????? ????? ??????? ????? ???????? ????????????, ??????? ??????? ???????? ????? ????, ? ???????? ???????????, ??????? ?????????
/// ????????????? ????? ????. ???????? ?????????????? ? ?????????????? ?????????? ????????????? ?????, ??????? ? ???? ??????? ?????????
/// ? ?????????????? ????????? ????? ??????????. ?????????????? ??? ?????????? ?????? ??????? ???????????????? ????????? ???????????? ????
/// ? ?????????????? ????????? ????? ??????????.
/// </remarks>
[TestFixture(Description = "Шифрование и дешифрование данных с использованием случайного сессионного ключа")]
public class EncryptDecryptSessionKeyTest
{
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Gost_R3410_Certificates))]
public void ShouldEncryptAndDecrypt(TestCertificateInfo testCase)
{
@@ -42,7 +41,7 @@ namespace GostCryptography.Tests.Gost_28147_89
private static Stream CreateDataStream()
{
// Некоторый поток байт
// ????????? ????? ????
return new MemoryStream(Encoding.UTF8.GetBytes("Some data to encrypt..."));
}
@@ -51,17 +50,17 @@ namespace GostCryptography.Tests.Gost_28147_89
{
var encryptedDataStream = new MemoryStream();
// Отправитель создает случайный сессионный ключ для шифрации данных
// ??????????? ??????? ????????? ?????????? ???? ??? ???????? ??????
using (var senderSessionKey = new Gost_28147_89_SymmetricAlgorithm(publicKey.ProviderType))
{
// Отправитель передает получателю вектор инициализации
// ??????????? ???????? ?????????? ?????? ?????????????
iv = senderSessionKey.IV;
// Отправитель шифрует сессионный ключ и передает его получателю
// ??????????? ??????? ?????????? ???? ? ???????? ??? ??????????
var formatter = publicKey.CreateKeyExchangeFormatter();
sessionKey = formatter.CreateKeyExchangeData(senderSessionKey);
// Отправитель шифрует данные с использованием сессионного ключа
// ??????????? ??????? ?????? ? ?????????????? ??????????? ?????
using (var encryptor = senderSessionKey.CreateEncryptor())
{
var cryptoStream = new CryptoStream(encryptedDataStream, encryptor, CryptoStreamMode.Write);
@@ -81,13 +80,13 @@ namespace GostCryptography.Tests.Gost_28147_89
var deformatter = privateKey.CreateKeyExchangeDeformatter();
// Получатель принимает от отправителя зашифрованный сессионный ключ и дешифрует его
// ?????????? ????????? ?? ??????????? ????????????? ?????????? ???? ? ????????? ???
using (var receiverSessionKey = deformatter.DecryptKeyExchangeAlgorithm(sessionKey))
{
// Получатель принимает от отправителя вектор инициализации
// ?????????? ????????? ?? ??????????? ?????? ?????????????
receiverSessionKey.IV = iv;
// Получатель дешифрует данные с использованием сессионного ключа
// ?????????? ????????? ?????? ? ?????????????? ??????????? ?????
using (var decryptor = receiverSessionKey.CreateDecryptor())
{
var cryptoStream = new CryptoStream(encryptedDataStream, decryptor, CryptoStreamMode.Read);
@@ -100,4 +99,4 @@ namespace GostCryptography.Tests.Gost_28147_89
return decryptedDataStream;
}
}
}
}

View File

@@ -1,24 +1,23 @@
using System.IO;
using System.IO;
using System.Linq;
using System.Text;
using GostCryptography.Base;
using GostCryptography.Gost_28147_89;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Gost_28147_89
{
/// <summary>
/// Вычисление имитовставки на базе общего симметричного ключа ГОСТ 28147-89.
/// ?????????? ???????????? ?? ???? ?????? ????????????? ????? ???? 28147-89.
/// </summary>
/// <remarks>
/// Тест выполняет подпись и проверку подписи потока байт с использованием имитовставки.
/// ???? ????????? ??????? ? ???????? ??????? ?????? ???? ? ?????????????? ????????????.
/// </remarks>
[TestFixture(Description = "Вычисление имитовставки на базе общего симметричного ключа ГОСТ 28147-89")]
public class Gost_28147_89_ImitHashAlgorithmTest
{
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Providers))]
public void ShouldComputeImitHash(ProviderType providerType)
{
@@ -31,29 +30,29 @@ namespace GostCryptography.Tests.Gost_28147_89
var isValidImitDataStream = VerifyImitDataStream(sharedKey, imitDataStream);
// Then
Assert.IsTrue(isValidImitDataStream);
Assert.True(isValidImitDataStream);
}
private static Stream CreateDataStream()
{
// Некоторый поток байт
// ????????? ????? ????
return new MemoryStream(Encoding.UTF8.GetBytes("Some data for imit..."));
}
private static Stream CreateImitDataStream(Gost_28147_89_SymmetricAlgorithmBase sharedKey, Stream dataStream)
{
// Создание объекта для вычисления имитовставки
// ???????? ??????? ??? ?????????? ????????????
using (var imitHash = new Gost_28147_89_ImitHashAlgorithm(sharedKey))
{
// Вычисление имитовставки для потока данных
// ?????????? ???????????? ??? ?????? ??????
var imitHashValue = imitHash.ComputeHash(dataStream);
// Запись имитовставки в начало выходного потока данных
// ?????? ???????????? ? ?????? ????????? ?????? ??????
var imitDataStream = new MemoryStream();
imitDataStream.Write(imitHashValue, 0, imitHashValue.Length);
// Копирование исходного потока данных в выходной поток
// ??????????? ????????? ?????? ?????? ? ???????? ?????
dataStream.Position = 0;
dataStream.CopyTo(imitDataStream);
@@ -65,19 +64,19 @@ namespace GostCryptography.Tests.Gost_28147_89
private static bool VerifyImitDataStream(Gost_28147_89_SymmetricAlgorithmBase sharedKey, Stream imitDataStream)
{
// Создание объекта для вычисления имитовставки
// ???????? ??????? ??? ?????????? ????????????
using (var imitHash = new Gost_28147_89_ImitHashAlgorithm(sharedKey))
{
// Считывание имитовставки из потока данных
// ?????????? ???????????? ?? ?????? ??????
var imitHashValue = new byte[imitHash.HashSize / 8];
imitDataStream.Read(imitHashValue, 0, imitHashValue.Length);
// Вычисление реального значения имитовставки для потока данных
// ?????????? ????????? ???????? ???????????? ??? ?????? ??????
var expectedImitHashValue = imitHash.ComputeHash(imitDataStream);
// Сравнение исходной имитовставки с ожидаемой
// ????????? ???????? ???????????? ? ?????????
return imitHashValue.SequenceEqual(expectedImitHashValue);
}
}
}
}
}

View File

@@ -1,25 +1,24 @@
using System.IO;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using GostCryptography.Base;
using GostCryptography.Gost_28147_89;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Gost_28147_89
{
/// <summary>
/// Шифрование и дешифрование данных с использованием общего симметричного ключа ГОСТ 28147-89.
/// ?????????? ? ???????????? ?????? ? ?????????????? ?????? ????????????? ????? ???? 28147-89.
/// </summary>
/// <remarks>
/// Тест создает поток байт, шифрует его с использованием общего симметричного ключа,
/// а затем дешифрует зашифрованные данные и проверяет корректность дешифрации.
/// ???? ??????? ????? ????, ??????? ??? ? ?????????????? ?????? ????????????? ?????,
/// ? ????? ????????? ????????????? ?????? ? ????????? ???????????? ??????????.
/// </remarks>
[TestFixture(Description = "Шифрование и дешифрование данных с использованием общего симметричного ключа ГОСТ 28147-89")]
public class Gost_28147_89_SymmetricAlgorithmTest
{
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Providers))]
public void ShouldEncryptAndDecrypt(ProviderType providerType)
{
@@ -37,7 +36,7 @@ namespace GostCryptography.Tests.Gost_28147_89
private static Stream CreateDataStream()
{
// Некоторый поток байт
// ????????? ????? ????
return new MemoryStream(Encoding.UTF8.GetBytes("Some data to encrypt..."));
}
@@ -74,4 +73,4 @@ namespace GostCryptography.Tests.Gost_28147_89
return decryptedDataStream;
}
}
}
}

View File

@@ -1,4 +1,4 @@
using System.IO;
using System.IO;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
@@ -6,23 +6,22 @@ using System.Text;
using GostCryptography.Base;
using GostCryptography.Gost_28147_89;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Gost_28147_89
{
/// <summary>
/// Шифрование и дешифрование данных с использованием случайного сессионного ключа ГОСТ Р 34.12-2015 Кузнечик.
/// ?????????? ? ???????????? ?????? ? ?????????????? ?????????? ??????????? ????? ???? ? 34.12-2015 ????????.
/// </summary>
/// <remarks>
/// Тест имитирует обмен данными между условным отправителем, который шифрует заданный поток байт, и условным получателем, который дешифрует
/// зашифрованный поток байт. Шифрация осуществляется с использованием случайного симметричного ключа, который в свою очередь шифруется
/// с использованием открытого ключа получателя. Соответственно для дешифрации данных сначала расшифровывается случайный симметричный ключ
/// с использованием закрытого ключа получателя.
/// ???? ????????? ????? ??????? ????? ???????? ????????????, ??????? ??????? ???????? ????? ????, ? ???????? ???????????, ??????? ?????????
/// ????????????? ????? ????. ???????? ?????????????? ? ?????????????? ?????????? ????????????? ?????, ??????? ? ???? ??????? ?????????
/// ? ?????????????? ????????? ????? ??????????. ?????????????? ??? ?????????? ?????? ??????? ???????????????? ????????? ???????????? ????
/// ? ?????????????? ????????? ????? ??????????.
/// </remarks>
[TestFixture(Description = "Шифрование и дешифрование данных с использованием случайного сессионного ключа ГОСТ Р 34.12-2015 Кузнечик")]
public class KuznyechikEncryptDecryptSessionKeyTest
{
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Gost_R3410_Certificates))]
public void ShouldEncryptAndDecrypt(TestCertificateInfo testCase)
{
@@ -42,7 +41,7 @@ namespace GostCryptography.Tests.Gost_28147_89
private static Stream CreateDataStream()
{
// Некоторый поток байт
// ????????? ????? ????
return new MemoryStream(Encoding.UTF8.GetBytes("Some data to encrypt..."));
}
@@ -51,17 +50,17 @@ namespace GostCryptography.Tests.Gost_28147_89
{
var encryptedDataStream = new MemoryStream();
// Отправитель создает случайный сессионный ключ для шифрации данных
// ??????????? ??????? ????????? ?????????? ???? ??? ???????? ??????
using (var senderSessionKey = new Gost_3412_K_SymmetricAlgorithm(publicKey.ProviderType))
{
// Отправитель передает получателю вектор инициализации
// ??????????? ???????? ?????????? ?????? ?????????????
iv = senderSessionKey.IV;
// Отправитель шифрует сессионный ключ и передает его получателю
// ??????????? ??????? ?????????? ???? ? ???????? ??? ??????????
var formatter = publicKey.CreateKeyExchangeFormatter();
sessionKey = formatter.CreateKeyExchangeData(senderSessionKey);
// Отправитель шифрует данные с использованием сессионного ключа
// ??????????? ??????? ?????? ? ?????????????? ??????????? ?????
using (var encryptor = senderSessionKey.CreateEncryptor())
{
var cryptoStream = new CryptoStream(encryptedDataStream, encryptor, CryptoStreamMode.Write);
@@ -81,13 +80,13 @@ namespace GostCryptography.Tests.Gost_28147_89
var deformatter = privateKey.CreateKeyExchangeDeformatter();
// Получатель принимает от отправителя зашифрованный сессионный ключ и дешифрует его
// ?????????? ????????? ?? ??????????? ????????????? ?????????? ???? ? ????????? ???
using (var receiverSessionKey = deformatter.DecryptKeyExchangeAlgorithm(sessionKey))
{
// Получатель принимает от отправителя вектор инициализации
// ?????????? ????????? ?? ??????????? ?????? ?????????????
receiverSessionKey.IV = iv;
// Получатель дешифрует данные с использованием сессионного ключа
// ?????????? ????????? ?????? ? ?????????????? ??????????? ?????
using (var decryptor = receiverSessionKey.CreateDecryptor())
{
var cryptoStream = new CryptoStream(encryptedDataStream, decryptor, CryptoStreamMode.Read);
@@ -100,4 +99,4 @@ namespace GostCryptography.Tests.Gost_28147_89
return decryptedDataStream;
}
}
}
}

View File

@@ -1,24 +1,23 @@
using System.IO;
using System.IO;
using System.Linq;
using System.Text;
using GostCryptography.Base;
using GostCryptography.Gost_28147_89;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Gost_28147_89
{
/// <summary>
/// Вычисление имитовставки на базе общего симметричного ключа ГОСТ Р 34.12-2015 Кузнечик.
/// ?????????? ???????????? ?? ???? ?????? ????????????? ????? ???? ? 34.12-2015 ????????.
/// </summary>
/// <remarks>
/// Тест выполняет подпись и проверку подписи потока байт с использованием имитовставки.
/// ???? ????????? ??????? ? ???????? ??????? ?????? ???? ? ?????????????? ????????????.
/// </remarks>
[TestFixture(Description = "Вычисление имитовставки на базе общего симметричного ключа ГОСТ Р 34.12-2015 Кузнечик")]
public class KuznyechikImitHashAlgorithmTest
{
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Providers))]
public void ShouldComputeImitHash(ProviderType providerType)
{
@@ -31,29 +30,29 @@ namespace GostCryptography.Tests.Gost_28147_89
var isValidImitDataStream = VerifyImitDataStream(sharedKey, imitDataStream);
// Then
Assert.IsTrue(isValidImitDataStream);
Assert.True(isValidImitDataStream);
}
private static Stream CreateDataStream()
{
// Некоторый поток байт
// ????????? ????? ????
return new MemoryStream(Encoding.UTF8.GetBytes("Some data for imit..."));
}
private static Stream CreateImitDataStream(Gost_3412_K_SymmetricAlgorithm sharedKey, Stream dataStream)
{
// Создание объекта для вычисления имитовставки
// ???????? ??????? ??? ?????????? ????????????
using (var imitHash = new Gost_3412_K_ImitHashAlgorithm(sharedKey))
{
// Вычисление имитовставки для потока данных
// ?????????? ???????????? ??? ?????? ??????
var imitHashValue = imitHash.ComputeHash(dataStream);
// Запись имитовставки в начало выходного потока данных
// ?????? ???????????? ? ?????? ????????? ?????? ??????
var imitDataStream = new MemoryStream();
imitDataStream.Write(imitHashValue, 0, imitHashValue.Length);
// Копирование исходного потока данных в выходной поток
// ??????????? ????????? ?????? ?????? ? ???????? ?????
dataStream.Position = 0;
dataStream.CopyTo(imitDataStream);
@@ -65,19 +64,19 @@ namespace GostCryptography.Tests.Gost_28147_89
private static bool VerifyImitDataStream(Gost_3412_K_SymmetricAlgorithm sharedKey, Stream imitDataStream)
{
// Создание объекта для вычисления имитовставки
// ???????? ??????? ??? ?????????? ????????????
using (var imitHash = new Gost_3412_K_ImitHashAlgorithm(sharedKey))
{
// Считывание имитовставки из потока данных
// ?????????? ???????????? ?? ?????? ??????
var imitHashValue = new byte[imitHash.HashSize / 8];
imitDataStream.Read(imitHashValue, 0, imitHashValue.Length);
// Вычисление реального значения имитовставки для потока данных
// ?????????? ????????? ???????? ???????????? ??? ?????? ??????
var expectedImitHashValue = imitHash.ComputeHash(imitDataStream);
// Сравнение исходной имитовставки с ожидаемой
// ????????? ???????? ???????????? ? ?????????
return imitHashValue.SequenceEqual(expectedImitHashValue);
}
}
}
}
}

View File

@@ -1,25 +1,24 @@
using System.IO;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using GostCryptography.Base;
using GostCryptography.Gost_28147_89;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Gost_28147_89
{
/// <summary>
/// Шифрование и дешифрование данных с использованием общего симметричного ключа ГОСТ Р 34.12-2015 Кузнечик.
/// ?????????? ? ???????????? ?????? ? ?????????????? ?????? ????????????? ????? ???? ? 34.12-2015 ????????.
/// </summary>
/// <remarks>
/// Тест создает поток байт, шифрует его с использованием общего симметричного ключа,
/// а затем дешифрует зашифрованные данные и проверяет корректность дешифрации.
/// ???? ??????? ????? ????, ??????? ??? ? ?????????????? ?????? ????????????? ?????,
/// ? ????? ????????? ????????????? ?????? ? ????????? ???????????? ??????????.
/// </remarks>
[TestFixture(Description = "Шифрование и дешифрование данных с использованием общего симметричного ключа ГОСТ Р 34.12-2015 Кузнечик")]
public class KuznyechikSymmetricAlgorithmTest
{
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Providers))]
public void ShouldEncryptAndDecrypt(ProviderType providerType)
{
@@ -37,7 +36,7 @@ namespace GostCryptography.Tests.Gost_28147_89
private static Stream CreateDataStream()
{
// Некоторый поток байт
// ????????? ????? ????
return new MemoryStream(Encoding.UTF8.GetBytes("Some data to encrypt..."));
}
@@ -74,4 +73,4 @@ namespace GostCryptography.Tests.Gost_28147_89
return decryptedDataStream;
}
}
}
}

View File

@@ -1,4 +1,4 @@
using System.IO;
using System.IO;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
@@ -6,23 +6,22 @@ using System.Text;
using GostCryptography.Base;
using GostCryptography.Gost_28147_89;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Gost_28147_89
{
/// <summary>
/// Шифрование и дешифрование данных с использованием случайного сессионного ключа ГОСТ Р 34.12-2015 Магма.
/// ?????????? ? ???????????? ?????? ? ?????????????? ?????????? ??????????? ????? ???? ? 34.12-2015 ?????.
/// </summary>
/// <remarks>
/// Тест имитирует обмен данными между условным отправителем, который шифрует заданный поток байт, и условным получателем, который дешифрует
/// зашифрованный поток байт. Шифрация осуществляется с использованием случайного симметричного ключа, который в свою очередь шифруется
/// с использованием открытого ключа получателя. Соответственно для дешифрации данных сначала расшифровывается случайный симметричный ключ
/// с использованием закрытого ключа получателя.
/// ???? ????????? ????? ??????? ????? ???????? ????????????, ??????? ??????? ???????? ????? ????, ? ???????? ???????????, ??????? ?????????
/// ????????????? ????? ????. ???????? ?????????????? ? ?????????????? ?????????? ????????????? ?????, ??????? ? ???? ??????? ?????????
/// ? ?????????????? ????????? ????? ??????????. ?????????????? ??? ?????????? ?????? ??????? ???????????????? ????????? ???????????? ????
/// ? ?????????????? ????????? ????? ??????????.
/// </remarks>
[TestFixture(Description = "Шифрование и дешифрование данных с использованием случайного сессионного ключа ГОСТ Р 34.12-2015 Магма")]
public class MagmaEncryptDecryptSessionKeyTest
{
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Gost_R3410_Certificates))]
public void ShouldEncryptAndDecrypt(TestCertificateInfo testCase)
{
@@ -42,7 +41,7 @@ namespace GostCryptography.Tests.Gost_28147_89
private static Stream CreateDataStream()
{
// Некоторый поток байт
// ????????? ????? ????
return new MemoryStream(Encoding.UTF8.GetBytes("Some data to encrypt..."));
}
@@ -51,17 +50,17 @@ namespace GostCryptography.Tests.Gost_28147_89
{
var encryptedDataStream = new MemoryStream();
// Отправитель создает случайный сессионный ключ для шифрации данных
// ??????????? ??????? ????????? ?????????? ???? ??? ???????? ??????
using (var senderSessionKey = new Gost_3412_M_SymmetricAlgorithm(publicKey.ProviderType))
{
// Отправитель передает получателю вектор инициализации
// ??????????? ???????? ?????????? ?????? ?????????????
iv = senderSessionKey.IV;
// Отправитель шифрует сессионный ключ и передает его получателю
// ??????????? ??????? ?????????? ???? ? ???????? ??? ??????????
var formatter = publicKey.CreateKeyExchangeFormatter();
sessionKey = formatter.CreateKeyExchangeData(senderSessionKey);
// Отправитель шифрует данные с использованием сессионного ключа
// ??????????? ??????? ?????? ? ?????????????? ??????????? ?????
using (var encryptor = senderSessionKey.CreateEncryptor())
{
var cryptoStream = new CryptoStream(encryptedDataStream, encryptor, CryptoStreamMode.Write);
@@ -81,13 +80,13 @@ namespace GostCryptography.Tests.Gost_28147_89
var deformatter = privateKey.CreateKeyExchangeDeformatter();
// Получатель принимает от отправителя зашифрованный сессионный ключ и дешифрует его
// ?????????? ????????? ?? ??????????? ????????????? ?????????? ???? ? ????????? ???
using (var receiverSessionKey = deformatter.DecryptKeyExchangeAlgorithm(sessionKey))
{
// Получатель принимает от отправителя вектор инициализации
// ?????????? ????????? ?? ??????????? ?????? ?????????????
receiverSessionKey.IV = iv;
// Получатель дешифрует данные с использованием сессионного ключа
// ?????????? ????????? ?????? ? ?????????????? ??????????? ?????
using (var decryptor = receiverSessionKey.CreateDecryptor())
{
var cryptoStream = new CryptoStream(encryptedDataStream, decryptor, CryptoStreamMode.Read);
@@ -100,4 +99,4 @@ namespace GostCryptography.Tests.Gost_28147_89
return decryptedDataStream;
}
}
}
}

View File

@@ -1,24 +1,23 @@
using System.IO;
using System.IO;
using System.Linq;
using System.Text;
using GostCryptography.Base;
using GostCryptography.Gost_28147_89;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Gost_28147_89
{
/// <summary>
/// Вычисление имитовставки на базе общего симметричного ключа ГОСТ Р 34.12-2015 Магма.
/// ?????????? ???????????? ?? ???? ?????? ????????????? ????? ???? ? 34.12-2015 ?????.
/// </summary>
/// <remarks>
/// Тест выполняет подпись и проверку подписи потока байт с использованием имитовставки.
/// ???? ????????? ??????? ? ???????? ??????? ?????? ???? ? ?????????????? ????????????.
/// </remarks>
[TestFixture(Description = "Вычисление имитовставки на базе общего симметричного ключа ГОСТ Р 34.12-2015 Магма")]
public class MagmaImitHashAlgorithmTest
{
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Providers))]
public void ShouldComputeImitHash(ProviderType providerType)
{
@@ -31,29 +30,29 @@ namespace GostCryptography.Tests.Gost_28147_89
var isValidImitDataStream = VerifyImitDataStream(sharedKey, imitDataStream);
// Then
Assert.IsTrue(isValidImitDataStream);
Assert.True(isValidImitDataStream);
}
private static Stream CreateDataStream()
{
// Некоторый поток байт
// ????????? ????? ????
return new MemoryStream(Encoding.UTF8.GetBytes("Some data for imit..."));
}
private static Stream CreateImitDataStream(Gost_3412_M_SymmetricAlgorithm sharedKey, Stream dataStream)
{
// Создание объекта для вычисления имитовставки
// ???????? ??????? ??? ?????????? ????????????
using (var imitHash = new Gost_3412_M_ImitHashAlgorithm(sharedKey))
{
// Вычисление имитовставки для потока данных
// ?????????? ???????????? ??? ?????? ??????
var imitHashValue = imitHash.ComputeHash(dataStream);
// Запись имитовставки в начало выходного потока данных
// ?????? ???????????? ? ?????? ????????? ?????? ??????
var imitDataStream = new MemoryStream();
imitDataStream.Write(imitHashValue, 0, imitHashValue.Length);
// Копирование исходного потока данных в выходной поток
// ??????????? ????????? ?????? ?????? ? ???????? ?????
dataStream.Position = 0;
dataStream.CopyTo(imitDataStream);
@@ -65,19 +64,19 @@ namespace GostCryptography.Tests.Gost_28147_89
private static bool VerifyImitDataStream(Gost_3412_M_SymmetricAlgorithm sharedKey, Stream imitDataStream)
{
// Создание объекта для вычисления имитовставки
// ???????? ??????? ??? ?????????? ????????????
using (var imitHash = new Gost_3412_M_ImitHashAlgorithm(sharedKey))
{
// Считывание имитовставки из потока данных
// ?????????? ???????????? ?? ?????? ??????
var imitHashValue = new byte[imitHash.HashSize / 8];
imitDataStream.Read(imitHashValue, 0, imitHashValue.Length);
// Вычисление реального значения имитовставки для потока данных
// ?????????? ????????? ???????? ???????????? ??? ?????? ??????
var expectedImitHashValue = imitHash.ComputeHash(imitDataStream);
// Сравнение исходной имитовставки с ожидаемой
// ????????? ???????? ???????????? ? ?????????
return imitHashValue.SequenceEqual(expectedImitHashValue);
}
}
}
}
}

View File

@@ -1,25 +1,24 @@
using System.IO;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using GostCryptography.Base;
using GostCryptography.Gost_28147_89;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Gost_28147_89
{
/// <summary>
/// Шифрование и дешифрование данных с использованием общего симметричного ключа ГОСТ Р 34.12-2015 Магма.
/// ?????????? ? ???????????? ?????? ? ?????????????? ?????? ????????????? ????? ???? ? 34.12-2015 ?????.
/// </summary>
/// <remarks>
/// Тест создает поток байт, шифрует его с использованием общего симметричного ключа,
/// а затем дешифрует зашифрованные данные и проверяет корректность дешифрации.
/// ???? ??????? ????? ????, ??????? ??? ? ?????????????? ?????? ????????????? ?????,
/// ? ????? ????????? ????????????? ?????? ? ????????? ???????????? ??????????.
/// </remarks>
[TestFixture(Description = "Шифрование и дешифрование данных с использованием общего симметричного ключа ГОСТ Р 34.12-2015 Магма")]
public class MagmaSymmetricAlgorithmTest
{
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Providers))]
public void ShouldEncryptAndDecrypt(ProviderType providerType)
{
@@ -37,7 +36,7 @@ namespace GostCryptography.Tests.Gost_28147_89
private static Stream CreateDataStream()
{
// Некоторый поток байт
// ????????? ????? ????
return new MemoryStream(Encoding.UTF8.GetBytes("Some data to encrypt..."));
}
@@ -74,4 +73,4 @@ namespace GostCryptography.Tests.Gost_28147_89
return decryptedDataStream;
}
}
}
}

View File

@@ -1,19 +1,18 @@
using System;
using System;
using System.Security;
using GostCryptography.Gost_R3410;
using NUnit.Framework;
using Xunit;
using System.Security.Cryptography.X509Certificates;
using GostCryptography.Base;
namespace GostCryptography.Tests.Gost_R3410
{
[TestFixture(Description = "Проверка возможности установки пароля для контейнера ключей")]
public class SetContainerPasswordTest
{
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Gost_R3410_2001_Certificates))]
public void ShouldSetContainerPassword_R3410_2001(TestCertificateInfo testCase)
{
@@ -32,10 +31,10 @@ namespace GostCryptography.Tests.Gost_R3410
var isValidSignature = VerifySignature(privateKey, data, signature);
// Then
Assert.IsTrue(isValidSignature);
Assert.True(isValidSignature);
}
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Gost_R3410_2012_256_Certificates))]
public void ShouldSetContainerPassword_R3410_2012_256(TestCertificateInfo testCase)
{
@@ -54,10 +53,10 @@ namespace GostCryptography.Tests.Gost_R3410
var isValidSignature = VerifySignature(privateKey, data, signature);
// Then
Assert.IsTrue(isValidSignature);
Assert.True(isValidSignature);
}
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Gost_R3410_2012_512_Certificates))]
public void ShouldSetContainerPassword_R3410_2012_512(TestCertificateInfo testCase)
{
@@ -76,7 +75,7 @@ namespace GostCryptography.Tests.Gost_R3410
var isValidSignature = VerifySignature(privateKey, data, signature);
// Then
Assert.IsTrue(isValidSignature);
Assert.True(isValidSignature);
}
@@ -126,4 +125,4 @@ namespace GostCryptography.Tests.Gost_R3410
return data;
}
}
}
}

View File

@@ -1,4 +1,4 @@
using System.IO;
using System.IO;
using System.Linq;
using System.Text;
@@ -6,20 +6,19 @@ using GostCryptography.Base;
using GostCryptography.Gost_28147_89;
using GostCryptography.Gost_R3411;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Gost_R3411
{
/// <summary>
/// Вычисление HMAC на базе алгоритма хэширования ГОСТ Р 34.11-2012/256 и общего симметричного ключа ГОСТ 28147-89.
/// ?????????? HMAC ?? ???? ????????? ??????????? ???? ? 34.11-2012/256 ? ?????? ????????????? ????? ???? 28147-89.
/// </summary>
/// <remarks>
/// Тест выполняет подпись и проверку подписи потока байт с использованием HMAC.
/// ???? ????????? ??????? ? ???????? ??????? ?????? ???? ? ?????????????? HMAC.
/// </remarks>
[TestFixture(Description = "Вычисление HMAC на базе алгоритма хэширования ГОСТ Р 34.11-2012/256 и общего симметричного ключа ГОСТ 28147-89")]
public class Gost_R3411_2012_256_HMACTest
{
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Providers))]
public void ShouldComputeHMAC(ProviderType providerType)
{
@@ -32,29 +31,29 @@ namespace GostCryptography.Tests.Gost_R3411
var isValidHmacDataStream = VerifyHmacDataStream(sharedKey, hmacDataStream);
// Then
Assert.IsTrue(isValidHmacDataStream);
Assert.True(isValidHmacDataStream);
}
private static Stream CreateDataStream()
{
// Некоторый поток байт
// ????????? ????? ????
return new MemoryStream(Encoding.UTF8.GetBytes("Some data to HMAC..."));
}
private static Stream CreateHmacDataStream(GostSymmetricAlgorithm sharedKey, Stream dataStream)
{
// Создание объекта для вычисления HMAC
// ???????? ??????? ??? ?????????? HMAC
using (var hmac = new Gost_R3411_2012_256_HMAC(sharedKey))
{
// Вычисление HMAC для потока данных
// ?????????? HMAC ??? ?????? ??????
var hmacValue = hmac.ComputeHash(dataStream);
// Запись HMAC в начало выходного потока данных
// ?????? HMAC ? ?????? ????????? ?????? ??????
var hmacDataStream = new MemoryStream();
hmacDataStream.Write(hmacValue, 0, hmacValue.Length);
// Копирование исходного потока данных в выходной поток
// ??????????? ????????? ?????? ?????? ? ???????? ?????
dataStream.Position = 0;
dataStream.CopyTo(hmacDataStream);
@@ -66,19 +65,19 @@ namespace GostCryptography.Tests.Gost_R3411
private static bool VerifyHmacDataStream(GostSymmetricAlgorithm sharedKey, Stream hmacDataStream)
{
// Создание объекта для вычисления HMAC
// ???????? ??????? ??? ?????????? HMAC
using (var hmac = new Gost_R3411_2012_256_HMAC(sharedKey))
{
// Считывание HMAC из потока данных
// ?????????? HMAC ?? ?????? ??????
var hmacValue = new byte[hmac.HashSize / 8];
hmacDataStream.Read(hmacValue, 0, hmacValue.Length);
// Вычисление реального значения HMAC для потока данных
// ?????????? ????????? ???????? HMAC ??? ?????? ??????
var expectedHmacValue = hmac.ComputeHash(hmacDataStream);
// Сравнение исходного HMAC с ожидаемым
// ????????? ????????? HMAC ? ?????????
return hmacValue.SequenceEqual(expectedHmacValue);
}
}
}
}
}

View File

@@ -1,23 +1,22 @@
using System.IO;
using System.IO;
using System.Text;
using GostCryptography.Base;
using GostCryptography.Gost_R3411;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Gost_R3411
{
/// <summary>
/// Вычисление хэша в соответствии с ГОСТ Р 34.11-2012/256.
/// ?????????? ???? ? ???????????? ? ???? ? 34.11-2012/256.
/// </summary>
/// <remarks>
/// Тест создает поток байт, вычисляет хэш в соответствии с ГОСТ Р 34.11-2012/256 и проверяет его корректность.
/// ???? ??????? ????? ????, ????????? ??? ? ???????????? ? ???? ? 34.11-2012/256 ? ????????? ??? ????????????.
/// </remarks>
[TestFixture(Description = "Вычисление хэша в соответствии с ГОСТ Р 34.11-2012/256")]
public class Gost_R3411_2012_256_HashAlgorithmTest
{
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Providers))]
public void ShouldComputeHash(ProviderType providerType)
{
@@ -34,15 +33,15 @@ namespace GostCryptography.Tests.Gost_R3411
}
// Then
Assert.IsNotNull(hashValue);
Assert.AreEqual(256, 8 * hashValue.Length);
Assert.NotNull(hashValue);
Assert.Equal(256, 8 * hashValue.Length);
}
private static Stream CreateDataStream()
{
// Некоторый поток байт
// ????????? ????? ????
return new MemoryStream(Encoding.UTF8.GetBytes("Some data to hash..."));
}
}
}
}

View File

@@ -1,17 +1,16 @@
using System.Text;
using System.Text;
using GostCryptography.Base;
using GostCryptography.Gost_28147_89;
using GostCryptography.Gost_R3411;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Gost_R3411
{
/// <summary>
/// Использование PRF на базе алгоритма хэширования ГОСТ Р 34.11-2012/256.
/// ????????????? PRF ?? ???? ????????? ??????????? ???? ? 34.11-2012/256.
/// </summary>
[TestFixture(Description = "Использование PRF на базе алгоритма хэширования ГОСТ Р 34.11-2012/256")]
public class Gost_R3411_2012_256_PRFTest
{
private static readonly byte[] Label = { 1, 2, 3, 4, 5 };
@@ -19,7 +18,7 @@ namespace GostCryptography.Tests.Gost_R3411
private static readonly byte[] TestData = Encoding.UTF8.GetBytes("Some data to encrypt...");
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Providers))]
public void ShouldDeriveBytes(ProviderType providerType)
{
@@ -40,18 +39,18 @@ namespace GostCryptography.Tests.Gost_R3411
}
// Then
Assert.IsNotNull(randomBytes1);
Assert.IsNotNull(randomBytes2);
Assert.IsNotNull(randomBytes3);
Assert.AreEqual(256, 8 * randomBytes1.Length);
Assert.AreEqual(256, 8 * randomBytes2.Length);
Assert.AreEqual(256, 8 * randomBytes3.Length);
Assert.NotNull(randomBytes1);
Assert.NotNull(randomBytes2);
Assert.NotNull(randomBytes3);
Assert.Equal(256, 8 * randomBytes1.Length);
Assert.Equal(256, 8 * randomBytes2.Length);
Assert.Equal(256, 8 * randomBytes3.Length);
CollectionAssert.AreNotEqual(randomBytes1, randomBytes2);
CollectionAssert.AreNotEqual(randomBytes1, randomBytes3);
CollectionAssert.AreNotEqual(randomBytes2, randomBytes3);
}
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Providers))]
public void ShouldDeriveKey(ProviderType providerType)
{
@@ -78,9 +77,9 @@ namespace GostCryptography.Tests.Gost_R3411
}
// Then
Assert.IsNotNull(randomKey1);
Assert.IsNotNull(randomKey2);
Assert.IsNotNull(randomKey3);
Assert.NotNull(randomKey1);
Assert.NotNull(randomKey2);
Assert.NotNull(randomKey3);
AssertKeyIsValid(randomKey1);
AssertKeyIsValid(randomKey2);
AssertKeyIsValid(randomKey3);
@@ -94,7 +93,7 @@ namespace GostCryptography.Tests.Gost_R3411
{
var encryptedData = EncryptData(key, TestData);
var decryptedData = DecryptData(key, encryptedData);
CollectionAssert.AreEqual(TestData, decryptedData);
CollectionAssert.Equal(TestData, decryptedData);
}
public static void AssertKeysAreNotEqual(GostSymmetricAlgorithm key1, GostSymmetricAlgorithm key2)
@@ -117,4 +116,4 @@ namespace GostCryptography.Tests.Gost_R3411
return transform.TransformFinalBlock(data, 0, data.Length);
}
}
}
}

View File

@@ -1,4 +1,4 @@
using System.IO;
using System.IO;
using System.Linq;
using System.Text;
@@ -6,20 +6,19 @@ using GostCryptography.Base;
using GostCryptography.Gost_28147_89;
using GostCryptography.Gost_R3411;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Gost_R3411
{
/// <summary>
/// Вычисление HMAC на базе алгоритма хэширования ГОСТ Р 34.11-2012/512 и общего симметричного ключа ГОСТ 28147-89.
/// ?????????? HMAC ?? ???? ????????? ??????????? ???? ? 34.11-2012/512 ? ?????? ????????????? ????? ???? 28147-89.
/// </summary>
/// <remarks>
/// Тест выполняет подпись и проверку подписи потока байт с использованием HMAC.
/// ???? ????????? ??????? ? ???????? ??????? ?????? ???? ? ?????????????? HMAC.
/// </remarks>
[TestFixture(Description = "Вычисление HMAC на базе алгоритма хэширования ГОСТ Р 34.11-2012/512 и общего симметричного ключа ГОСТ 28147-89")]
public class Gost_R3411_2012_512_HMACTest
{
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Providers))]
public void ShouldComputeHMAC(ProviderType providerType)
{
@@ -32,29 +31,29 @@ namespace GostCryptography.Tests.Gost_R3411
var isValidHmacDataStream = VerifyHmacDataStream(sharedKey, hmacDataStream);
// Then
Assert.IsTrue(isValidHmacDataStream);
Assert.True(isValidHmacDataStream);
}
private static Stream CreateDataStream()
{
// Некоторый поток байт
// ????????? ????? ????
return new MemoryStream(Encoding.UTF8.GetBytes("Some data to HMAC..."));
}
private static Stream CreateHmacDataStream(GostSymmetricAlgorithm sharedKey, Stream dataStream)
{
// Создание объекта для вычисления HMAC
// ???????? ??????? ??? ?????????? HMAC
using (var hmac = new Gost_R3411_2012_512_HMAC(sharedKey))
{
// Вычисление HMAC для потока данных
// ?????????? HMAC ??? ?????? ??????
var hmacValue = hmac.ComputeHash(dataStream);
// Запись HMAC в начало выходного потока данных
// ?????? HMAC ? ?????? ????????? ?????? ??????
var hmacDataStream = new MemoryStream();
hmacDataStream.Write(hmacValue, 0, hmacValue.Length);
// Копирование исходного потока данных в выходной поток
// ??????????? ????????? ?????? ?????? ? ???????? ?????
dataStream.Position = 0;
dataStream.CopyTo(hmacDataStream);
@@ -66,19 +65,19 @@ namespace GostCryptography.Tests.Gost_R3411
private static bool VerifyHmacDataStream(GostSymmetricAlgorithm sharedKey, Stream hmacDataStream)
{
// Создание объекта для вычисления HMAC
// ???????? ??????? ??? ?????????? HMAC
using (var hmac = new Gost_R3411_2012_512_HMAC(sharedKey))
{
// Считывание HMAC из потока данных
// ?????????? HMAC ?? ?????? ??????
var hmacValue = new byte[hmac.HashSize / 8];
hmacDataStream.Read(hmacValue, 0, hmacValue.Length);
// Вычисление реального значения HMAC для потока данных
// ?????????? ????????? ???????? HMAC ??? ?????? ??????
var expectedHmacValue = hmac.ComputeHash(hmacDataStream);
// Сравнение исходного HMAC с ожидаемым
// ????????? ????????? HMAC ? ?????????
return hmacValue.SequenceEqual(expectedHmacValue);
}
}
}
}
}

View File

@@ -1,23 +1,22 @@
using System.IO;
using System.IO;
using System.Text;
using GostCryptography.Base;
using GostCryptography.Gost_R3411;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Gost_R3411
{
/// <summary>
/// Вычисление хэша в соответствии с ГОСТ Р 34.11-2012/512.
/// ?????????? ???? ? ???????????? ? ???? ? 34.11-2012/512.
/// </summary>
/// <remarks>
/// Тест создает поток байт, вычисляет хэш в соответствии с ГОСТ Р 34.11-2012/512 и проверяет его корректность.
/// ???? ??????? ????? ????, ????????? ??? ? ???????????? ? ???? ? 34.11-2012/512 ? ????????? ??? ????????????.
/// </remarks>
[TestFixture(Description = "Вычисление хэша в соответствии с ГОСТ Р 34.11-2012/512")]
public class Gost_R3411_2012_512_HashAlgorithmTest
{
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Providers))]
public void ShouldComputeHash(ProviderType providerType)
{
@@ -34,15 +33,15 @@ namespace GostCryptography.Tests.Gost_R3411
}
// Then
Assert.IsNotNull(hashValue);
Assert.AreEqual(512, 8 * hashValue.Length);
Assert.NotNull(hashValue);
Assert.Equal(512, 8 * hashValue.Length);
}
private static Stream CreateDataStream()
{
// Некоторый поток байт
// ????????? ????? ????
return new MemoryStream(Encoding.UTF8.GetBytes("Some data to hash..."));
}
}
}
}

View File

@@ -1,17 +1,16 @@
using System.Text;
using System.Text;
using GostCryptography.Base;
using GostCryptography.Gost_28147_89;
using GostCryptography.Gost_R3411;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Gost_R3411
{
/// <summary>
/// Использование PRF на базе алгоритма хэширования ГОСТ Р 34.11-2012/512.
/// ????????????? PRF ?? ???? ????????? ??????????? ???? ? 34.11-2012/512.
/// </summary>
[TestFixture(Description = "Использование PRF на базе алгоритма хэширования ГОСТ Р 34.11-2012/512")]
public class Gost_R3411_2012_512_PRFTest
{
private static readonly byte[] Label = { 1, 2, 3, 4, 5 };
@@ -19,7 +18,7 @@ namespace GostCryptography.Tests.Gost_R3411
private static readonly byte[] TestData = Encoding.UTF8.GetBytes("Some data to encrypt...");
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Providers))]
public void ShouldDeriveBytes(ProviderType providerType)
{
@@ -40,18 +39,18 @@ namespace GostCryptography.Tests.Gost_R3411
}
// Then
Assert.IsNotNull(randomBytes1);
Assert.IsNotNull(randomBytes2);
Assert.IsNotNull(randomBytes3);
Assert.AreEqual(512, 8 * randomBytes1.Length);
Assert.AreEqual(512, 8 * randomBytes2.Length);
Assert.AreEqual(512, 8 * randomBytes3.Length);
Assert.NotNull(randomBytes1);
Assert.NotNull(randomBytes2);
Assert.NotNull(randomBytes3);
Assert.Equal(512, 8 * randomBytes1.Length);
Assert.Equal(512, 8 * randomBytes2.Length);
Assert.Equal(512, 8 * randomBytes3.Length);
CollectionAssert.AreNotEqual(randomBytes1, randomBytes2);
CollectionAssert.AreNotEqual(randomBytes1, randomBytes3);
CollectionAssert.AreNotEqual(randomBytes2, randomBytes3);
}
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Providers))]
public void ShouldDeriveKey(ProviderType providerType)
{
@@ -78,9 +77,9 @@ namespace GostCryptography.Tests.Gost_R3411
}
// Then
Assert.IsNotNull(randomKey1);
Assert.IsNotNull(randomKey2);
Assert.IsNotNull(randomKey3);
Assert.NotNull(randomKey1);
Assert.NotNull(randomKey2);
Assert.NotNull(randomKey3);
AssertKeyIsValid(randomKey1);
AssertKeyIsValid(randomKey2);
AssertKeyIsValid(randomKey3);
@@ -94,7 +93,7 @@ namespace GostCryptography.Tests.Gost_R3411
{
var encryptedData = EncryptData(key, TestData);
var decryptedData = DecryptData(key, encryptedData);
CollectionAssert.AreEqual(TestData, decryptedData);
CollectionAssert.Equal(TestData, decryptedData);
}
public static void AssertKeysAreNotEqual(GostSymmetricAlgorithm key1, GostSymmetricAlgorithm key2)
@@ -117,4 +116,4 @@ namespace GostCryptography.Tests.Gost_R3411
return transform.TransformFinalBlock(data, 0, data.Length);
}
}
}
}

View File

@@ -1,4 +1,4 @@
using System.IO;
using System.IO;
using System.Linq;
using System.Text;
@@ -6,20 +6,19 @@ using GostCryptography.Base;
using GostCryptography.Gost_28147_89;
using GostCryptography.Gost_R3411;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Gost_R3411
{
/// <summary>
/// Вычисление HMAC на базе алгоритма хэширования ГОСТ Р 34.11-94 и общего симметричного ключа ГОСТ 28147-89.
/// ?????????? HMAC ?? ???? ????????? ??????????? ???? ? 34.11-94 ? ?????? ????????????? ????? ???? 28147-89.
/// </summary>
/// <remarks>
/// Тест выполняет подпись и проверку подписи потока байт с использованием HMAC.
/// ???? ????????? ??????? ? ???????? ??????? ?????? ???? ? ?????????????? HMAC.
/// </remarks>
[TestFixture(Description = "Вычисление HMAC на базе алгоритма хэширования ГОСТ Р 34.11-94 и общего симметричного ключа ГОСТ 28147-89")]
public class Gost_R3411_94_HMACTest
{
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Providers))]
public void ShouldComputeHMAC(ProviderType providerType)
{
@@ -32,29 +31,29 @@ namespace GostCryptography.Tests.Gost_R3411
var isValidHmacDataStream = VerifyHmacDataStream(sharedKey, hmacDataStream);
// Then
Assert.IsTrue(isValidHmacDataStream);
Assert.True(isValidHmacDataStream);
}
private static Stream CreateDataStream()
{
// Некоторый поток байт
// ????????? ????? ????
return new MemoryStream(Encoding.UTF8.GetBytes("Some data to HMAC..."));
}
private static Stream CreateHmacDataStream(GostSymmetricAlgorithm sharedKey, Stream dataStream)
{
// Создание объекта для вычисления HMAC
// ???????? ??????? ??? ?????????? HMAC
using (var hmac = new Gost_R3411_94_HMAC(sharedKey))
{
// Вычисление HMAC для потока данных
// ?????????? HMAC ??? ?????? ??????
var hmacValue = hmac.ComputeHash(dataStream);
// Запись HMAC в начало выходного потока данных
// ?????? HMAC ? ?????? ????????? ?????? ??????
var hmacDataStream = new MemoryStream();
hmacDataStream.Write(hmacValue, 0, hmacValue.Length);
// Копирование исходного потока данных в выходной поток
// ??????????? ????????? ?????? ?????? ? ???????? ?????
dataStream.Position = 0;
dataStream.CopyTo(hmacDataStream);
@@ -66,19 +65,19 @@ namespace GostCryptography.Tests.Gost_R3411
private static bool VerifyHmacDataStream(GostSymmetricAlgorithm sharedKey, Stream hmacDataStream)
{
// Создание объекта для вычисления HMAC
// ???????? ??????? ??? ?????????? HMAC
using (var hmac = new Gost_R3411_94_HMAC(sharedKey))
{
// Считывание HMAC из потока данных
// ?????????? HMAC ?? ?????? ??????
var hmacValue = new byte[hmac.HashSize / 8];
hmacDataStream.Read(hmacValue, 0, hmacValue.Length);
// Вычисление реального значения HMAC для потока данных
// ?????????? ????????? ???????? HMAC ??? ?????? ??????
var expectedHmacValue = hmac.ComputeHash(hmacDataStream);
// Сравнение исходного HMAC с ожидаемым
// ????????? ????????? HMAC ? ?????????
return hmacValue.SequenceEqual(expectedHmacValue);
}
}
}
}
}

View File

@@ -1,23 +1,22 @@
using System.IO;
using System.IO;
using System.Text;
using GostCryptography.Base;
using GostCryptography.Gost_R3411;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Gost_R3411
{
/// <summary>
/// Вычисление хэша в соответствии с ГОСТ Р 34.11-94.
/// ?????????? ???? ? ???????????? ? ???? ? 34.11-94.
/// </summary>
/// <remarks>
/// Тест создает поток байт, вычисляет хэш в соответствии с ГОСТ Р 34.11-94 и проверяет его корректность.
/// ???? ??????? ????? ????, ????????? ??? ? ???????????? ? ???? ? 34.11-94 ? ????????? ??? ????????????.
/// </remarks>
[TestFixture(Description = "Вычисление хэша в соответствии с ГОСТ Р 34.11-94")]
public class Gost_R3411_94_HashAlgorithmTest
{
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Providers))]
public void ShouldComputeHash(ProviderType providerType)
{
@@ -34,15 +33,15 @@ namespace GostCryptography.Tests.Gost_R3411
}
// Then
Assert.IsNotNull(hashValue);
Assert.AreEqual(256, 8 * hashValue.Length);
Assert.NotNull(hashValue);
Assert.Equal(256, 8 * hashValue.Length);
}
private static Stream CreateDataStream()
{
// Некоторый поток байт
// ????????? ????? ????
return new MemoryStream(Encoding.UTF8.GetBytes("Some data to hash..."));
}
}
}
}

View File

@@ -1,17 +1,16 @@
using System.Text;
using System.Text;
using GostCryptography.Base;
using GostCryptography.Gost_28147_89;
using GostCryptography.Gost_R3411;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Gost_R3411
{
/// <summary>
/// Использование PRF на базе алгоритма хэширования ГОСТ Р 34.11-94.
/// ????????????? PRF ?? ???? ????????? ??????????? ???? ? 34.11-94.
/// </summary>
[TestFixture(Description = "Использование PRF на базе алгоритма хэширования ГОСТ Р 34.11-94")]
public class Gost_R3411_94_PRFTest
{
private static readonly byte[] Label = { 1, 2, 3, 4, 5 };
@@ -19,7 +18,7 @@ namespace GostCryptography.Tests.Gost_R3411
private static readonly byte[] TestData = Encoding.UTF8.GetBytes("Some data to encrypt...");
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Providers))]
public void ShouldDeriveBytes(ProviderType providerType)
{
@@ -40,18 +39,18 @@ namespace GostCryptography.Tests.Gost_R3411
}
// Then
Assert.IsNotNull(randomBytes1);
Assert.IsNotNull(randomBytes2);
Assert.IsNotNull(randomBytes3);
Assert.AreEqual(256, 8 * randomBytes1.Length);
Assert.AreEqual(256, 8 * randomBytes2.Length);
Assert.AreEqual(256, 8 * randomBytes3.Length);
Assert.NotNull(randomBytes1);
Assert.NotNull(randomBytes2);
Assert.NotNull(randomBytes3);
Assert.Equal(256, 8 * randomBytes1.Length);
Assert.Equal(256, 8 * randomBytes2.Length);
Assert.Equal(256, 8 * randomBytes3.Length);
CollectionAssert.AreNotEqual(randomBytes1, randomBytes2);
CollectionAssert.AreNotEqual(randomBytes1, randomBytes3);
CollectionAssert.AreNotEqual(randomBytes2, randomBytes3);
}
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Providers))]
public void ShouldDeriveKey(ProviderType providerType)
{
@@ -72,9 +71,9 @@ namespace GostCryptography.Tests.Gost_R3411
}
// Then
Assert.IsNotNull(randomKey1);
Assert.IsNotNull(randomKey2);
Assert.IsNotNull(randomKey3);
Assert.NotNull(randomKey1);
Assert.NotNull(randomKey2);
Assert.NotNull(randomKey3);
AssertKeyIsValid(randomKey1);
AssertKeyIsValid(randomKey2);
AssertKeyIsValid(randomKey3);
@@ -88,7 +87,7 @@ namespace GostCryptography.Tests.Gost_R3411
{
var encryptedData = EncryptData(key, TestData);
var decryptedData = DecryptData(key, encryptedData);
CollectionAssert.AreEqual(TestData, decryptedData);
CollectionAssert.Equal(TestData, decryptedData);
}
public static void AssertKeysAreNotEqual(GostSymmetricAlgorithm key1, GostSymmetricAlgorithm key2)
@@ -111,4 +110,4 @@ namespace GostCryptography.Tests.Gost_R3411
return transform.TransformFinalBlock(data, 0, data.Length);
}
}
}
}

View File

@@ -1,22 +1,21 @@
using System.Linq;
using System.Linq;
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Pkcs
{
/// <summary>
/// Шифрация и дешифрация сообщения CMS/PKCS#7.
/// ???????? ? ?????????? ????????? CMS/PKCS#7.
/// </summary>
/// <remarks>
/// Тест создает сообщение, шифрует его в формате CMS/PKCS#7, а затем дешифрует зашифрованное сообщение.
/// ???? ??????? ?????????, ??????? ??? ? ??????? CMS/PKCS#7, ? ????? ????????? ????????????? ?????????.
/// </remarks>
[TestFixture(Description = "Шифрация и дешифрация сообщения CMS/PKCS#7")]
public class EnvelopedCmsEncryptTest
{
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Gost_R3410_Certificates))]
public void ShouldEncryptAndDecrypt(TestCertificateInfo testCase)
{
@@ -29,43 +28,43 @@ namespace GostCryptography.Tests.Pkcs
var decryptedMessage = DecryptMessage(encryptedMessage);
// Then
Assert.IsTrue(message.SequenceEqual(decryptedMessage));
Assert.True(message.SequenceEqual(decryptedMessage));
}
private static byte[] CreateMessage()
{
// Некоторое сообщение для подписи
// ????????? ????????? ??? ???????
return Encoding.UTF8.GetBytes("Some message to sign...");
}
private static byte[] EncryptMessage(X509Certificate2 certificate, byte[] message)
{
// Создание объекта для шифрования сообщения
// ???????? ??????? ??? ?????????? ?????????
var envelopedCms = new EnvelopedCms(new ContentInfo(message));
// Создание объект с информацией о получателе
// ???????? ?????? ? ??????????? ? ??????????
var recipient = new CmsRecipient(SubjectIdentifierType.IssuerAndSerialNumber, certificate);
// Шифрование сообщения CMS/PKCS#7
// ?????????? ????????? CMS/PKCS#7
envelopedCms.Encrypt(recipient);
// Создание сообщения CMS/PKCS#7
// ???????? ????????? CMS/PKCS#7
return envelopedCms.Encode();
}
private static byte[] DecryptMessage(byte[] encryptedMessage)
{
// Создание объекта для расшифровки сообщения
// ???????? ??????? ??? ??????????? ?????????
var envelopedCms = new EnvelopedCms();
// Чтение сообщения CMS/PKCS#7
// ?????? ????????? CMS/PKCS#7
envelopedCms.Decode(encryptedMessage);
// Расшифровка сообщения CMS/PKCS#7
// ??????????? ????????? CMS/PKCS#7
envelopedCms.Decrypt(envelopedCms.RecipientInfos[0]);
return envelopedCms.ContentInfo.Content;
}
}
}
}

View File

@@ -1,24 +1,23 @@
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using GostCryptography.Pkcs;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Pkcs
{
/// <summary>
/// Подпись и проверка отсоединенной подписи сообщения CMS/PKCS#7.
/// ??????? ? ???????? ????????????? ??????? ????????? CMS/PKCS#7.
/// </summary>
/// <remarks>
/// Тест создает сообщение, формирует отсоединенную подпись сообщения в формате CMS/PKCS#7,
/// а затем проверяет подпись полученную цифровую подпись.
/// ???? ??????? ?????????, ????????? ????????????? ??????? ????????? ? ??????? CMS/PKCS#7,
/// ? ????? ????????? ??????? ?????????? ???????? ???????.
/// </remarks>
[TestFixture(Description = "Подпись и проверка отсоединенной подписи сообщения CMS/PKCS#7")]
public class SignedCmsDetachedSignTest
{
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Gost_R3410_Certificates))]
public void ShouldSign(TestCertificateInfo testCase)
{
@@ -31,45 +30,45 @@ namespace GostCryptography.Tests.Pkcs
var isValidDetachedSignature = VerifyMessage(message, detachedSignature);
// Then
Assert.IsTrue(isValidDetachedSignature);
Assert.True(isValidDetachedSignature);
}
private static byte[] CreateMessage()
{
// Некоторое сообщение для подписи
// ????????? ????????? ??? ???????
return Encoding.UTF8.GetBytes("Some message to sign...");
}
private static byte[] SignMessage(X509Certificate2 certificate, byte[] message)
{
// Создание объекта для подписи сообщения
// ???????? ??????? ??? ??????? ?????????
var signedCms = new GostSignedCms(new ContentInfo(message), true);
// Создание объект с информацией о подписчике
// ???????? ?????? ? ??????????? ? ??????????
var signer = new CmsSigner(certificate);
// Включение информации только о конечном сертификате (только для теста)
// ????????? ?????????? ?????? ? ???????? ??????????? (?????? ??? ?????)
signer.IncludeOption = X509IncludeOption.EndCertOnly;
// Создание подписи для сообщения CMS/PKCS#7
// ???????? ??????? ??? ????????? CMS/PKCS#7
signedCms.ComputeSignature(signer);
// Создание подписи CMS/PKCS#7
// ???????? ??????? CMS/PKCS#7
return signedCms.Encode();
}
private static bool VerifyMessage(byte[] message, byte[] detachedSignature)
{
// Создание объекта для проверки подписи сообщения
// ???????? ??????? ??? ???????? ??????? ?????????
var signedCms = new GostSignedCms(new ContentInfo(message), true);
// Чтение подписи CMS/PKCS#7
// ?????? ??????? CMS/PKCS#7
signedCms.Decode(detachedSignature);
try
{
// Проверка подписи CMS/PKCS#7
// ???????? ??????? CMS/PKCS#7
signedCms.CheckSignature(true);
}
catch
@@ -80,4 +79,4 @@ namespace GostCryptography.Tests.Pkcs
return true;
}
}
}
}

View File

@@ -1,25 +1,24 @@
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using GostCryptography.Pkcs;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Pkcs
{
/// <summary>
/// Подпись и проверка подписи сообщения CMS/PKCS#7.
/// ??????? ? ???????? ??????? ????????? CMS/PKCS#7.
/// </summary>
/// <remarks>
/// Тест создает сообщение, формирует подписанное сообщение в формате CMS/PKCS#7,
/// исключая информацию о сертификате подписчика с целью минимизации размера сообщения,
/// а затем проверяет подпись полученную цифровую подпись.
/// ???? ??????? ?????????, ????????? ??????????? ????????? ? ??????? CMS/PKCS#7,
/// ???????? ?????????? ? ??????????? ?????????? ? ????? ??????????? ??????? ?????????,
/// ? ????? ????????? ??????? ?????????? ???????? ???????.
/// </remarks>
[TestFixture(Description = "Подпись и проверка подписи сообщения CMS/PKCS#7")]
public class SignedCmsSignAndExcludeCertificates
{
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Gost_R3410_Certificates))]
public void ShouldSign(TestCertificateInfo testCase)
{
@@ -32,51 +31,51 @@ namespace GostCryptography.Tests.Pkcs
var isValidSignedMessage = VerifyMessage(certificate, signedMessage);
// Then
Assert.IsTrue(isValidSignedMessage);
Assert.True(isValidSignedMessage);
}
private static byte[] CreateMessage()
{
// Некоторое сообщение для подписи
// ????????? ????????? ??? ???????
return Encoding.UTF8.GetBytes("Some message to sign...");
}
private static byte[] SignMessage(X509Certificate2 certificate, byte[] message)
{
// Создание объекта для подписи сообщения
// ???????? ??????? ??? ??????? ?????????
var signedCms = new GostSignedCms(new ContentInfo(message));
// Создание объект с информацией о подписчике
// ???????? ?????? ? ??????????? ? ??????????
var signer = new CmsSigner(certificate);
// Включение информации только о конечном сертификате (только для теста)
// ????????? ?????????? ?????? ? ???????? ??????????? (?????? ??? ?????)
signer.IncludeOption = X509IncludeOption.EndCertOnly;
// Создание подписи для сообщения CMS/PKCS#7
// ???????? ??????? ??? ????????? CMS/PKCS#7
signedCms.ComputeSignature(signer);
// Исключение сертификатов для уменьшения размера сообщения
// ?????????? ???????????? ??? ?????????? ??????? ?????????
signedCms.RemoveCertificates();
// Создание сообщения CMS/PKCS#7
// ???????? ????????? CMS/PKCS#7
return signedCms.Encode();
}
private static bool VerifyMessage(X509Certificate2 certificate, byte[] signedMessage)
{
// Создание объекта для проверки подписи сообщения
// ???????? ??????? ??? ???????? ??????? ?????????
var signedCms = new GostSignedCms();
// Чтение сообщения CMS/PKCS#7
// ?????? ????????? CMS/PKCS#7
signedCms.Decode(signedMessage);
// Список сертификатов подписчика
// ?????? ???????????? ??????????
var signerCerts = new X509Certificate2Collection(certificate);
try
{
// Проверка подписи сообщения CMS/PKCS#7
// ???????? ??????? ????????? CMS/PKCS#7
signedCms.CheckSignature(signerCerts, true);
}
catch

View File

@@ -1,24 +1,23 @@
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using GostCryptography.Pkcs;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Pkcs
{
/// <summary>
/// Подпись и проверка подписи сообщения CMS/PKCS#7.
/// ??????? ? ???????? ??????? ????????? CMS/PKCS#7.
/// </summary>
/// <remarks>
/// Тест создает сообщение, формирует подписанное сообщение в формате CMS/PKCS#7,
/// а затем проверяет подпись полученную цифровую подпись.
/// ???? ??????? ?????????, ????????? ??????????? ????????? ? ??????? CMS/PKCS#7,
/// ? ????? ????????? ??????? ?????????? ???????? ???????.
/// </remarks>
[TestFixture(Description = "Подпись и проверка подписи сообщения CMS/PKCS#7")]
public class SignedCmsSignTest
{
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Gost_R3410_Certificates))]
public void ShouldSign(TestCertificateInfo testCase)
{
@@ -31,45 +30,45 @@ namespace GostCryptography.Tests.Pkcs
var isValidSignedMessage = VerifyMessage(signedMessage);
// Then
Assert.IsTrue(isValidSignedMessage);
Assert.True(isValidSignedMessage);
}
private static byte[] CreateMessage()
{
// Некоторое сообщение для подписи
// ????????? ????????? ??? ???????
return Encoding.UTF8.GetBytes("Some message to sign...");
}
private static byte[] SignMessage(X509Certificate2 certificate, byte[] message)
{
// Создание объекта для подписи сообщения
// ???????? ??????? ??? ??????? ?????????
var signedCms = new GostSignedCms(new ContentInfo(message));
// Создание объект с информацией о подписчике
// ???????? ?????? ? ??????????? ? ??????????
var signer = new CmsSigner(certificate);
// Включение информации только о конечном сертификате (только для теста)
// ????????? ?????????? ?????? ? ???????? ??????????? (?????? ??? ?????)
signer.IncludeOption = X509IncludeOption.EndCertOnly;
// Создание подписи для сообщения CMS/PKCS#7
// ???????? ??????? ??? ????????? CMS/PKCS#7
signedCms.ComputeSignature(signer);
// Создание сообщения CMS/PKCS#7
// ???????? ????????? CMS/PKCS#7
return signedCms.Encode();
}
private static bool VerifyMessage(byte[] signedMessage)
{
// Создание объекта для проверки подписи сообщения
// ???????? ??????? ??? ???????? ??????? ?????????
var signedCms = new GostSignedCms();
// Чтение сообщения CMS/PKCS#7
// ?????? ????????? CMS/PKCS#7
signedCms.Decode(signedMessage);
try
{
// Проверка подписи сообщения CMS/PKCS#7
// ???????? ??????? ????????? CMS/PKCS#7
signedCms.CheckSignature(true);
}
catch
@@ -80,4 +79,4 @@ namespace GostCryptography.Tests.Pkcs
return true;
}
}
}
}

View File

@@ -1,4 +1,4 @@
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000

View File

@@ -1,24 +1,23 @@
using System.IO;
using System.IO;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using GostCryptography.Base;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Sign
{
/// <summary>
/// Подпись и проверка подписи потока байт с помощью сертификата.
/// ??????? ? ???????? ??????? ?????? ???? ? ??????? ???????????.
/// </summary>
/// <remarks>
/// Тест создает поток байт, вычисляет цифровую подпись потока байт с использованием закрытого ключа сертификата,
/// а затем с помощью открытого ключа сертификата проверяет полученную подпись.
/// ???? ??????? ????? ????, ????????? ???????? ??????? ?????? ???? ? ?????????????? ????????? ????? ???????????,
/// ? ????? ? ??????? ????????? ????? ??????????? ????????? ?????????? ???????.
/// </remarks>
[TestFixture(Description = "Подпись и проверка подписи потока байт с помощью сертификата")]
public class SignDataStreamCertificateTest
{
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Gost_R3410_Certificates))]
public void ShouldSignDataStream(TestCertificateInfo testCase)
{
@@ -37,12 +36,12 @@ namespace GostCryptography.Tests.Sign
var isValidSignature = VerifySignature(publicKey, dataStream, signature);
// Then
Assert.IsTrue(isValidSignature);
Assert.True(isValidSignature);
}
private static Stream CreateDataStream()
{
// Некоторый поток байт для подписи
// ????????? ????? ???? ??? ???????
return new MemoryStream(Encoding.UTF8.GetBytes("Some data to sign..."));
}
@@ -71,4 +70,4 @@ namespace GostCryptography.Tests.Sign
return publicKey.VerifySignature(hash, signature);
}
}
}
}

View File

@@ -1,4 +1,4 @@
using System.IO;
using System.IO;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
@@ -6,23 +6,22 @@ using System.Text;
using GostCryptography.Base;
using GostCryptography.Config;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Sign
{
/// <summary>
/// Подпись и проверка подписи потока байт с помощью сертификата и информации об алгоритме цифровой подписи
/// ??????? ? ???????? ??????? ?????? ???? ? ??????? ??????????? ? ?????????? ?? ????????? ???????? ???????
/// </summary>
/// <remarks>
/// Тест создает поток байт, вычисляет цифровую подпись потока байт с использованием закрытого ключа сертификата,
/// а затем с помощью открытого ключа сертификата проверяет полученную подпись. Для вычисления цифровой подписи
/// и ее проверки используется информация об алгоритме цифровой подписи <see cref="SignatureDescription"/>,
/// получаемая с помощью метода <see cref="GostCryptoConfig.CreateFromName"/>.
/// ???? ??????? ????? ????, ????????? ???????? ??????? ?????? ???? ? ?????????????? ????????? ????? ???????????,
/// ? ????? ? ??????? ????????? ????? ??????????? ????????? ?????????? ???????. ??? ?????????? ???????? ???????
/// ? ?? ???????? ???????????? ?????????? ?? ????????? ???????? ??????? <see cref="SignatureDescription"/>,
/// ?????????? ? ??????? ?????? <see cref="GostCryptoConfig.CreateFromName"/>.
/// </remarks>
[TestFixture(Description = "Подпись и проверка подписи потока байт с помощью сертификата и информации об алгоритме цифровой подписи")]
public class SignDataStreamSignatureDescriptionTest
{
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Gost_R3410_Certificates))]
public void ShouldSignDataStream(TestCertificateInfo testCase)
{
@@ -41,12 +40,12 @@ namespace GostCryptography.Tests.Sign
var isValidSignature = VerifySignature(publicKey, dataStream, signature);
// Then
Assert.IsTrue(isValidSignature);
Assert.True(isValidSignature);
}
private static Stream CreateDataStream()
{
// Некоторый поток байт для подписи
// ????????? ????? ???? ??? ???????
return new MemoryStream(Encoding.UTF8.GetBytes("Some data to sign..."));
}
@@ -85,4 +84,4 @@ namespace GostCryptography.Tests.Sign
return deformatter.VerifySignature(hash, signature);
}
}
}
}

View File

@@ -1,26 +1,25 @@
using System.IO;
using System.IO;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using GostCryptography.Base;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Sign
{
/// <summary>
/// Подпись и проверка подписи потока байт с помощью сертификата и классов форматирования.
/// ??????? ? ???????? ??????? ?????? ???? ? ??????? ??????????? ? ??????? ??????????????.
/// </summary>
/// <remarks>
/// Тест создает поток байт, вычисляет цифровую подпись потока байт с использованием закрытого ключа сертификата,
/// а затем с помощью открытого ключа сертификата проверяет полученную подпись. Для вычисления цифровой подписи
/// используется класс <see cref="GostSignatureFormatter"/>, для проверки цифровой подписи используется класс
/// ???? ??????? ????? ????, ????????? ???????? ??????? ?????? ???? ? ?????????????? ????????? ????? ???????????,
/// ? ????? ? ??????? ????????? ????? ??????????? ????????? ?????????? ???????. ??? ?????????? ???????? ???????
/// ???????????? ????? <see cref="GostSignatureFormatter"/>, ??? ???????? ???????? ??????? ???????????? ?????
/// <see cref="GostSignatureDeformatter"/>.
/// </remarks>
[TestFixture(Description = "Подпись и проверка подписи потока байт с помощью сертификата и классов форматирования")]
public class SignDataStreamSignatureFormatterTest
{
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Gost_R3410_Certificates))]
public void ShouldSignDataStream(TestCertificateInfo testCase)
{
@@ -39,12 +38,12 @@ namespace GostCryptography.Tests.Sign
var isValidSignature = VerifySignature(publicKey, dataStream, signature);
// Then
Assert.IsTrue(isValidSignature);
Assert.True(isValidSignature);
}
private static Stream CreateDataStream()
{
// Некоторый поток байт для подписи
// ????????? ????? ???? ??? ???????
return new MemoryStream(Encoding.UTF8.GetBytes("Some data to sign..."));
}
@@ -77,4 +76,4 @@ namespace GostCryptography.Tests.Sign
return deformatter.VerifySignature(hash, signature);
}
}
}
}

View File

@@ -1,4 +1,4 @@
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.X509Certificates;
namespace GostCryptography.Tests
{
@@ -18,4 +18,4 @@ namespace GostCryptography.Tests
public override string ToString() => Name;
}
}
}

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.Security;
using System.Security.Cryptography.X509Certificates;
@@ -14,9 +14,9 @@ namespace GostCryptography.Tests
{
Providers = new[] { GostCryptoConfig.ProviderType, GostCryptoConfig.ProviderType_2012_512, GostCryptoConfig.ProviderType_2012_1024 };
var gost_R3410_2001 = new TestCertificateInfo("ГОСТ Р 34.10-2001", FindGostCertificate(filter: c => c.IsGost_R3410_2001()));
var gost_R3410_2012_256 = new TestCertificateInfo("ГОСТ Р 34.10-2012/256", FindGostCertificate(filter: c => c.IsGost_R3410_2012_256()));
var gost_R3410_2012_512 = new TestCertificateInfo("ГОСТ Р 34.10-2012/512", FindGostCertificate(filter: c => c.IsGost_R3410_2012_512()));
var gost_R3410_2001 = new TestCertificateInfo("???? ? 34.10-2001", FindGostCertificate(filter: c => c.IsGost_R3410_2001()));
var gost_R3410_2012_256 = new TestCertificateInfo("???? ? 34.10-2012/256", FindGostCertificate(filter: c => c.IsGost_R3410_2012_256()));
var gost_R3410_2012_512 = new TestCertificateInfo("???? ? 34.10-2012/512", FindGostCertificate(filter: c => c.IsGost_R3410_2012_512()));
var gost_R3410_Certificates = new List<TestCertificateInfo> { gost_R3410_2001, gost_R3410_2012_256, gost_R3410_2012_512 };
var gost_R3410_2001_Certificates = new List<TestCertificateInfo> { gost_R3410_2001 };
@@ -76,4 +76,4 @@ namespace GostCryptography.Tests
return null;
}
}
}
}

View File

@@ -1,4 +1,4 @@
using System.Collections;
using System.Collections;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
@@ -10,202 +10,16 @@ using GostCryptography.Gost_28147_89;
using GostCryptography.Tests.Properties;
using GostCryptography.Xml;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Xml.Encrypt
{
/// <summary>
/// Шифрация и дешифрация XML для широковещательной рассылки.
/// ???????? ? ?????????? XML ??? ????????????????? ????????.
/// </summary>
/// <remarks>
/// Тест создает XML-документ, выборочно шифрует элементы данного документа, а затем дешифрует полученный зашифрованный документ.
/// Элементы шифруются с использованием случайного сессионного ключа, который в свою очередь кодируется (экспортируется)
/// с использованием публичного ключа сертификата получателя. Расшифровка документа происходит с использованием первого
/// найденного секретного ключа сертификата получателя.
/// ???? ??????? XML-????????, ????????? ??????? ???????? ??????? ?????????, ? ????? ????????? ?????????? ????????????? ????????.
/// ???????? ????????? ? ?????????????? ?????????? ??????????? ?????, ??????? ? ???? ??????? ?????????? (??????????????)
/// ? ?????????????? ?????????? ????? ??????????? ??????????. ??????????? ????????? ?????????? ? ?????????????? ???????
/// ?????????? ?????????? ????? ??????????? ??????????.
/// </remarks>
[TestFixture(Description = "Шифрация и дешифрация XML для широковещательной рассылки")]
public sealed class EncryptedXmlBroadcastTest
{
[Test]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Gost_R3410_Certificates))]
public void ShouldEncryptXml(TestCertificateInfo testCase)
{
// Given
var certificate = testCase.Certificate;
var certificates = new[] { certificate };
var xmlDocument = CreateXmlDocument();
var expectedXml = xmlDocument.OuterXml;
// When
var encryptedXmlDocument = EncryptXmlDocument(xmlDocument, certificates);
var decryptedXmlDocument = DecryptXmlDocument(encryptedXmlDocument);
var actualXml = decryptedXmlDocument.OuterXml;
// Then
Assert.AreEqual(expectedXml, actualXml);
}
private static XmlDocument CreateXmlDocument()
{
var document = new XmlDocument();
document.LoadXml(Resources.EncryptedXmlExample);
return document;
}
private static XmlDocument EncryptXmlDocument(XmlDocument xmlDocument, IEnumerable<X509Certificate2> certificates)
{
// Создание объекта для шифрации XML
var encryptedXml = new GostEncryptedXml();
// Поиск элементов для шифрации
var elements = xmlDocument.SelectNodes("//SomeElement[@Encrypt='true']");
if (elements != null)
{
var elementIndex = 0;
foreach (XmlElement element in elements)
{
// Формирование элемента EncryptedData
var elementEncryptedData = new EncryptedData();
elementEncryptedData.Id = "EncryptedElement" + elementIndex++;
elementEncryptedData.Type = EncryptedXml.XmlEncElementUrl;
elementEncryptedData.KeyInfo = new KeyInfo();
using (var sessionKey = new Gost_28147_89_SymmetricAlgorithm())
{
elementEncryptedData.EncryptionMethod = new EncryptionMethod(sessionKey.AlgorithmName);
// Шифрация элемента с использованием симметричного ключа
var encryptedElement = encryptedXml.EncryptData(element, sessionKey, false);
foreach (var certificate in certificates)
{
// Шифрация сессионного ключа с использованием открытого ключа сертификата
var encryptedSessionKeyData = GostEncryptedXml.EncryptKey(sessionKey, (GostAsymmetricAlgorithm)certificate.GetPublicKeyAlgorithm());
// Формирование информации о зашифрованном сессионном ключе
var encryptedSessionKey = new EncryptedKey();
encryptedSessionKey.CipherData = new CipherData(encryptedSessionKeyData);
encryptedSessionKey.EncryptionMethod = new EncryptionMethod(GostEncryptedXml.XmlEncGostCryptoProKeyExportUrl);
encryptedSessionKey.AddReference(new DataReference { Uri = "#" + elementEncryptedData.Id });
encryptedSessionKey.KeyInfo.AddClause(new KeyInfoX509Data(certificate));
// Добавление ссылки на зашифрованный ключ, используемый при шифровании данных
elementEncryptedData.KeyInfo.AddClause(new KeyInfoEncryptedKey(encryptedSessionKey));
}
// Установка зашифрованных данных у объекта EncryptedData
elementEncryptedData.CipherData.CipherValue = encryptedElement;
}
// Замена элемента его зашифрованным представлением
GostEncryptedXml.ReplaceElement(element, elementEncryptedData, false);
}
}
return xmlDocument;
}
private static XmlDocument DecryptXmlDocument(XmlDocument encryptedXmlDocument)
{
// Создание объекта для дешифрации XML
var encryptedXml = new GostEncryptedXml(encryptedXmlDocument);
var nsManager = new XmlNamespaceManager(encryptedXmlDocument.NameTable);
nsManager.AddNamespace("enc", EncryptedXml.XmlEncNamespaceUrl);
// Поиск всех зашифрованных XML-элементов
var encryptedDataList = encryptedXmlDocument.SelectNodes("//enc:EncryptedData", nsManager);
if (encryptedDataList != null)
{
foreach (XmlElement encryptedData in encryptedDataList)
{
// Загрузка элемента EncryptedData
var elementEncryptedData = new EncryptedData();
elementEncryptedData.LoadXml(encryptedData);
// Извлечение симметричный ключ для расшифровки элемента EncryptedData
var sessionKey = GetDecryptionKey(elementEncryptedData);
if (sessionKey != null)
{
// Расшифровка элемента EncryptedData
var decryptedData = encryptedXml.DecryptData(elementEncryptedData, sessionKey);
// Замена элемента EncryptedData его расшифрованным представлением
encryptedXml.ReplaceData(encryptedData, decryptedData);
}
}
}
return encryptedXmlDocument;
}
private static SymmetricAlgorithm GetDecryptionKey(EncryptedData encryptedData)
{
SymmetricAlgorithm sessionKey = null;
foreach (var keyInfo in encryptedData.KeyInfo)
{
if (keyInfo is KeyInfoEncryptedKey)
{
var encryptedKey = ((KeyInfoEncryptedKey)keyInfo).EncryptedKey;
if (encryptedKey != null)
{
foreach (var ekKeyInfo in encryptedKey.KeyInfo)
{
if (ekKeyInfo is KeyInfoX509Data)
{
var certificates = ((KeyInfoX509Data)ekKeyInfo).Certificates;
// Поиск закрытого ключа для дешифрации сессионного ключа
var privateKey = FindPrivateKey(certificates);
if (privateKey != null)
{
// Дешифрация сессионного ключа с использованием закрытого ключа сертификата
sessionKey = GostEncryptedXml.DecryptKey(encryptedKey.CipherData.CipherValue, privateKey);
break;
}
}
}
}
}
}
return sessionKey;
}
private static GostAsymmetricAlgorithm FindPrivateKey(IEnumerable certificates)
{
// Какая-то логика поиска закрытого ключа
GostAsymmetricAlgorithm privateKey = null;
var store = new X509Store(TestConfig.DefaultStoreName, TestConfig.DefaultStoreLocation);
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
var storeCertificates = store.Certificates;
store.Close();
foreach (X509Certificate2 certificate in certificates)
{
var index = storeCertificates.IndexOf(certificate);
if (index >= 0)
{
privateKey = storeCertificates[index].GetPrivateKeyAlgorithm() as GostAsymmetricAlgorithm;
if (privateKey != null)
{
break;
}
}
}
return privateKey;
}
}
}

View File

@@ -1,80 +1,17 @@
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.X509Certificates;
using System.Xml;
using GostCryptography.Tests.Properties;
using GostCryptography.Xml;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Xml.Encrypt
{
/// <summary>
/// Шифрация и дешифрация XML документа с использованием сертификата.
/// ???????? ? ?????????? XML ????????? ? ?????????????? ???????????.
/// </summary>
/// <remarks>
/// Тест создает XML-документ, выборочно шифрует элементы данного документа с использованием сертификата,
/// а затем дешифрует полученный зашифрованный документ.
/// ???? ??????? XML-????????, ????????? ??????? ???????? ??????? ????????? ? ?????????????? ???????????,
/// ? ????? ????????? ?????????? ????????????? ????????.
/// </remarks>
[TestFixture(Description = "Шифрация и дешифрация XML документа с использованием сертификата")]
public sealed class EncryptedXmlCertificateTest
{
[Test]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Gost_R3410_Certificates))]
public void ShouldEncryptXml(TestCertificateInfo testCase)
{
// Given
var certificate = testCase.Certificate;
var xmlDocument = CreateXmlDocument();
var expectedXml = xmlDocument.OuterXml;
// When
var encryptedXmlDocument = EncryptXmlDocument(xmlDocument, certificate);
var decryptedXmlDocument = DecryptXmlDocument(encryptedXmlDocument);
var actualXml = decryptedXmlDocument.OuterXml;
// Then
Assert.AreEqual(expectedXml, actualXml);
}
private static XmlDocument CreateXmlDocument()
{
var document = new XmlDocument();
document.LoadXml(Resources.EncryptedXmlExample);
return document;
}
private static XmlDocument EncryptXmlDocument(XmlDocument xmlDocument, X509Certificate2 certificate)
{
// Создание объекта для шифрации XML
var encryptedXml = new GostEncryptedXml();
// Поиск элементов для шифрации
var elements = xmlDocument.SelectNodes("//SomeElement[@Encrypt='true']");
if (elements != null)
{
foreach (XmlElement element in elements)
{
// Шифрация элемента
var elementEncryptedData = encryptedXml.Encrypt(element, certificate);
// Замена элемента его зашифрованным представлением
GostEncryptedXml.ReplaceElement(element, elementEncryptedData, false);
}
}
return xmlDocument;
}
private static XmlDocument DecryptXmlDocument(XmlDocument encryptedXmlDocument)
{
// Создание объекта для дешифрации XML
var encryptedXml = new GostEncryptedXml(encryptedXmlDocument);
// Расшифровка зашифрованных элементов документа
encryptedXml.DecryptDocument();
return encryptedXmlDocument;
}
}
}

View File

@@ -1,4 +1,4 @@
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.Xml;
using System.Xml;
@@ -8,31 +8,30 @@ using GostCryptography.Gost_R3410;
using GostCryptography.Tests.Properties;
using GostCryptography.Xml;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Xml.Encrypt
{
/// <summary>
/// Шифрация и дешифрация XML с использованием контейнера ключей.
/// ???????? ? ?????????? XML ? ?????????????? ?????????? ??????.
/// </summary>
/// <remarks>
/// Тест имитирует обмен данными между условным отправителем, который шифрует заданный XML-документ, и условным получателем, который дешифрует
/// зашифрованный XML-документ. Шифрация и дешифрация осуществляется без использования сертификатов. Шифрация осуществляется с использованием
/// случайного симметричного ключа, который в свою очередь шифруется с использованием открытого ключа получателя. Соответственно для дешифрации
/// данных сначала расшифровывается случайный симметричный ключ с использованием закрытого ключа получателя.
/// ???? ????????? ????? ??????? ????? ???????? ????????????, ??????? ??????? ???????? XML-????????, ? ???????? ???????????, ??????? ?????????
/// ????????????? XML-????????. ???????? ? ?????????? ?????????????? ??? ????????????? ????????????. ???????? ?????????????? ? ??????????????
/// ?????????? ????????????? ?????, ??????? ? ???? ??????? ????????? ? ?????????????? ????????? ????? ??????????. ?????????????? ??? ??????????
/// ?????? ??????? ???????????????? ????????? ???????????? ???? ? ?????????????? ????????? ????? ??????????.
///
/// Перед началом теста имитируется передача получателем своего открытого ключа отправителю. Для этого получатель извлекает информацию о закрытом
/// ключе из контейнера ключей, формирует закрытый ключ для дешифрации XML и условно передает (экспортирует) отправителю информацию о своем открытом
/// ключе. Отправитель в свою очередь принимает (импортирует) от получателя информацию о его открытом ключе и формирует открытый ключ для шифрации XML.
/// ????? ??????? ????? ??????????? ???????? ??????????? ?????? ????????? ????? ???????????. ??? ????? ?????????? ????????? ?????????? ? ????????
/// ????? ?? ?????????? ??????, ????????? ???????? ???? ??? ?????????? XML ? ??????? ???????? (????????????) ??????????? ?????????? ? ????? ????????
/// ?????. ??????????? ? ???? ??????? ????????? (???????????) ?? ?????????? ?????????? ? ??? ???????? ????? ? ????????? ???????? ???? ??? ???????? XML.
///
/// Тест создает XML-документ, выборочно шифрует элементы данного документа с использованием случайного симметричного ключа, а затем дешифрует
/// полученный зашифрованный документ. Случайный симметричного ключ в свою очередь шифруется открытым асимметричным ключом получателя и в зашифрованном
/// виде добавляется в зашифрованный документ.
/// ???? ??????? XML-????????, ????????? ??????? ???????? ??????? ????????? ? ?????????????? ?????????? ????????????? ?????, ? ????? ?????????
/// ?????????? ????????????? ????????. ????????? ????????????? ???? ? ???? ??????? ????????? ???????? ????????????? ?????? ?????????? ? ? ?????????????
/// ???? ??????????? ? ????????????? ????????.
/// </remarks>
[TestFixture(Description = "Шифрация и дешифрация XML с использованием контейнера ключей")]
public class EncryptedXmlKeyContainerTest
{
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Gost_R3410_2001_Certificates))]
public void ShouldEncryptXmlWithGost_R3410_2001(TestCertificateInfo testCase)
{
@@ -40,12 +39,12 @@ namespace GostCryptography.Tests.Xml.Encrypt
var certificate = testCase.Certificate;
// Получатель экспортирует отправителю информацию о своем открытом ключе
// ?????????? ???????????? ??????????? ?????????? ? ????? ???????? ?????
var keyContainer = certificate.GetPrivateKeyInfo();
var privateKey = new Gost_R3410_2001_AsymmetricAlgorithm(keyContainer);
var publicKeyInfo = privateKey.ExportParameters(false);
// Отправитель импортирует от получателя информацию о его открытом ключе
// ??????????? ??????????? ?? ?????????? ?????????? ? ??? ???????? ?????
var publicKey = new Gost_R3410_2001_AsymmetricAlgorithm();
publicKey.ImportParameters(publicKeyInfo);
@@ -58,10 +57,10 @@ namespace GostCryptography.Tests.Xml.Encrypt
var actualXml = decryptedXmlDocument.OuterXml;
// Then
Assert.AreEqual(expectedXml, actualXml);
Assert.Equal(expectedXml, actualXml);
}
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Gost_R3410_2012_256_Certificates))]
public void ShouldEncryptXmlWithGost_R3410_2012_256(TestCertificateInfo testCase)
{
@@ -69,12 +68,12 @@ namespace GostCryptography.Tests.Xml.Encrypt
var certificate = testCase.Certificate;
// Получатель экспортирует отправителю информацию о своем открытом ключе
// ?????????? ???????????? ??????????? ?????????? ? ????? ???????? ?????
var keyContainer = certificate.GetPrivateKeyInfo();
var privateKey = new Gost_R3410_2012_256_AsymmetricAlgorithm(keyContainer);
var publicKeyInfo = privateKey.ExportParameters(false);
// Отправитель импортирует от получателя информацию о его открытом ключе
// ??????????? ??????????? ?? ?????????? ?????????? ? ??? ???????? ?????
var publicKey = new Gost_R3410_2012_256_AsymmetricAlgorithm();
publicKey.ImportParameters(publicKeyInfo);
@@ -87,10 +86,10 @@ namespace GostCryptography.Tests.Xml.Encrypt
var actualXml = decryptedXmlDocument.OuterXml;
// Then
Assert.AreEqual(expectedXml, actualXml);
Assert.Equal(expectedXml, actualXml);
}
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Gost_R3410_2012_512_Certificates))]
public void ShouldEncryptXmlWithGost_R3410_2012_512(TestCertificateInfo testCase)
{
@@ -98,12 +97,12 @@ namespace GostCryptography.Tests.Xml.Encrypt
var certificate = testCase.Certificate;
// Получатель экспортирует отправителю информацию о своем открытом ключе
// ?????????? ???????????? ??????????? ?????????? ? ????? ???????? ?????
var keyContainer = certificate.GetPrivateKeyInfo();
var privateKey = new Gost_R3410_2012_512_AsymmetricAlgorithm(keyContainer);
var publicKeyInfo = privateKey.ExportParameters(false);
// Отправитель импортирует от получателя информацию о его открытом ключе
// ??????????? ??????????? ?? ?????????? ?????????? ? ??? ???????? ?????
var publicKey = new Gost_R3410_2012_512_AsymmetricAlgorithm();
publicKey.ImportParameters(publicKeyInfo);
@@ -116,7 +115,7 @@ namespace GostCryptography.Tests.Xml.Encrypt
var actualXml = decryptedXmlDocument.OuterXml;
// Then
Assert.AreEqual(expectedXml, actualXml);
Assert.Equal(expectedXml, actualXml);
}
private static XmlDocument CreateXmlDocument()
@@ -128,10 +127,10 @@ namespace GostCryptography.Tests.Xml.Encrypt
private static XmlDocument EncryptXmlDocument(XmlDocument xmlDocument, GostAsymmetricAlgorithm publicKey)
{
// Создание объекта для шифрации XML
// ???????? ??????? ??? ???????? XML
var encryptedXml = new GostEncryptedXml(publicKey.ProviderType);
// Поиск элементов для шифрации
// ????? ????????? ??? ????????
var elements = xmlDocument.SelectNodes("//SomeElement[@Encrypt='true']");
if (elements != null)
@@ -140,16 +139,16 @@ namespace GostCryptography.Tests.Xml.Encrypt
foreach (XmlElement element in elements)
{
// Создание случайного сессионного ключа
// ???????? ?????????? ??????????? ?????
using (var sessionKey = new Gost_28147_89_SymmetricAlgorithm(publicKey.ProviderType))
{
// Шифрация элемента
// ???????? ????????
var encryptedData = encryptedXml.EncryptData(element, sessionKey, false);
// Шифрация сессионного ключа с использованием публичного асимметричного ключа
// ???????? ??????????? ????? ? ?????????????? ?????????? ?????????????? ?????
var encryptedSessionKeyData = GostEncryptedXml.EncryptKey(sessionKey, publicKey);
// Формирование элемента EncryptedData
// ???????????? ???????? EncryptedData
var elementEncryptedData = new EncryptedData();
elementEncryptedData.Id = "EncryptedElement" + elementIndex++;
elementEncryptedData.Type = EncryptedXml.XmlEncElementUrl;
@@ -157,17 +156,17 @@ namespace GostCryptography.Tests.Xml.Encrypt
elementEncryptedData.CipherData.CipherValue = encryptedData;
elementEncryptedData.KeyInfo = new KeyInfo();
// Формирование информации о зашифрованном сессионном ключе
// ???????????? ?????????? ? ????????????? ?????????? ?????
var encryptedSessionKey = new EncryptedKey();
encryptedSessionKey.CipherData = new CipherData(encryptedSessionKeyData);
encryptedSessionKey.EncryptionMethod = new EncryptionMethod(publicKey.KeyExchangeAlgorithm);
encryptedSessionKey.AddReference(new DataReference { Uri = "#" + elementEncryptedData.Id });
encryptedSessionKey.KeyInfo.AddClause(new KeyInfoName { Value = "KeyName1" });
// Добавление ссылки на зашифрованный ключ, используемый при шифровании данных
// ?????????? ?????? ?? ????????????? ????, ???????????? ??? ?????????? ??????
elementEncryptedData.KeyInfo.AddClause(new KeyInfoEncryptedKey(encryptedSessionKey));
// Замена элемента его зашифрованным представлением
// ?????? ???????? ??? ????????????? ??????????????
GostEncryptedXml.ReplaceElement(element, elementEncryptedData, false);
}
}
@@ -178,16 +177,16 @@ namespace GostCryptography.Tests.Xml.Encrypt
private static XmlDocument DecryptXmlDocument(XmlDocument encryptedXmlDocument, GostAsymmetricAlgorithm privateKey)
{
// Создание объекта для дешифрации XML
// ???????? ??????? ??? ?????????? XML
var encryptedXml = new GostEncryptedXml(privateKey.ProviderType, encryptedXmlDocument);
// Добавление ссылки на приватный асимметричный ключ
// ?????????? ?????? ?? ????????? ????????????? ????
encryptedXml.AddKeyNameMapping("KeyName1", privateKey);
// Расшифровка зашифрованных элементов документа
// ??????????? ????????????? ????????? ?????????
encryptedXml.DecryptDocument();
return encryptedXmlDocument;
}
}
}
}

View File

@@ -1,4 +1,4 @@
using System.Security.Cryptography.Xml;
using System.Security.Cryptography.Xml;
using System.Xml;
using GostCryptography.Base;
@@ -6,22 +6,21 @@ using GostCryptography.Gost_28147_89;
using GostCryptography.Tests.Properties;
using GostCryptography.Xml;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Xml.Encrypt
{
/// <summary>
/// Шифрация и дешифрация XML с использованием случайного сессионного ключа.
/// ???????? ? ?????????? XML ? ?????????????? ?????????? ??????????? ?????.
/// </summary>
/// <remarks>
/// Тест создает XML-документ, выборочно шифрует элементы данного документа с использованием случайного симметричного ключа,
/// а затем дешифрует полученный зашифрованный документ. Случайный симметричного ключ в свою очередь шифруется общим симметричным
/// ключом и в зашифрованном виде добавляется в зашифрованный документ.
/// ???? ??????? XML-????????, ????????? ??????? ???????? ??????? ????????? ? ?????????????? ?????????? ????????????? ?????,
/// ? ????? ????????? ?????????? ????????????? ????????. ????????? ????????????? ???? ? ???? ??????? ????????? ????? ????????????
/// ?????? ? ? ????????????? ???? ??????????? ? ????????????? ????????.
/// </remarks>
[TestFixture(Description = "Шифрация и дешифрация XML с использованием случайного сессионного ключа")]
public class EncryptedXmlSessionKey
{
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Providers))]
public void ShouldEncryptXml(ProviderType providerType)
{
@@ -36,7 +35,7 @@ namespace GostCryptography.Tests.Xml.Encrypt
var actualXml = decryptedXmlDocument.OuterXml;
// Then
Assert.AreEqual(expectedXml, actualXml);
Assert.Equal(expectedXml, actualXml);
}
private static XmlDocument CreateXmlDocument()
@@ -48,10 +47,10 @@ namespace GostCryptography.Tests.Xml.Encrypt
private static XmlDocument EncryptXmlDocument(XmlDocument xmlDocument, GostSymmetricAlgorithm sharedKey)
{
// Создание объекта для шифрации XML
// ???????? ??????? ??? ???????? XML
var encryptedXml = new GostEncryptedXml(sharedKey.ProviderType);
// Поиск элементов для шифрации
// ????? ????????? ??? ????????
var elements = xmlDocument.SelectNodes("//SomeElement[@Encrypt='true']");
if (elements != null)
@@ -60,16 +59,16 @@ namespace GostCryptography.Tests.Xml.Encrypt
foreach (XmlElement element in elements)
{
// Создание случайного сессионного ключа
// ???????? ?????????? ??????????? ?????
using (var sessionKey = new Gost_28147_89_SymmetricAlgorithm(sharedKey.ProviderType))
{
// Шифрация элемента
// ???????? ????????
var encryptedData = encryptedXml.EncryptData(element, sessionKey, false);
// Шифрация сессионного ключа с использованием общего симметричного ключа
// ???????? ??????????? ????? ? ?????????????? ?????? ????????????? ?????
var encryptedSessionKeyData = GostEncryptedXml.EncryptKey(sessionKey, sharedKey, GostKeyExchangeExportMethod.CryptoProKeyExport);
// Формирование элемента EncryptedData
// ???????????? ???????? EncryptedData
var elementEncryptedData = new EncryptedData();
elementEncryptedData.Id = "EncryptedElement" + elementIndex++;
elementEncryptedData.Type = EncryptedXml.XmlEncElementUrl;
@@ -77,17 +76,17 @@ namespace GostCryptography.Tests.Xml.Encrypt
elementEncryptedData.CipherData.CipherValue = encryptedData;
elementEncryptedData.KeyInfo = new KeyInfo();
// Формирование информации о зашифрованном сессионном ключе
// ???????????? ?????????? ? ????????????? ?????????? ?????
var encryptedSessionKey = new EncryptedKey();
encryptedSessionKey.CipherData = new CipherData(encryptedSessionKeyData);
encryptedSessionKey.EncryptionMethod = new EncryptionMethod(GostEncryptedXml.XmlEncGostCryptoProKeyExportUrl);
encryptedSessionKey.AddReference(new DataReference { Uri = "#" + elementEncryptedData.Id });
encryptedSessionKey.KeyInfo.AddClause(new KeyInfoName { Value = "SharedKey1" });
// Добавление ссылки на зашифрованный ключ, используемый при шифровании данных
// ?????????? ?????? ?? ????????????? ????, ???????????? ??? ?????????? ??????
elementEncryptedData.KeyInfo.AddClause(new KeyInfoEncryptedKey(encryptedSessionKey));
// Замена элемента его зашифрованным представлением
// ?????? ???????? ??? ????????????? ??????????????
GostEncryptedXml.ReplaceElement(element, elementEncryptedData, false);
}
}
@@ -98,16 +97,16 @@ namespace GostCryptography.Tests.Xml.Encrypt
private static XmlDocument DecryptXmlDocument(XmlDocument encryptedXmlDocument, GostSymmetricAlgorithm sharedKey)
{
// Создание объекта для дешифрации XML
// ???????? ??????? ??? ?????????? XML
var encryptedXml = new GostEncryptedXml(sharedKey.ProviderType, encryptedXmlDocument);
// Добавление ссылки на общий симметричный ключ
// ?????????? ?????? ?? ????? ???????????? ????
encryptedXml.AddKeyNameMapping("SharedKey1", sharedKey);
// Расшифровка зашифрованных элементов документа
// ??????????? ????????????? ????????? ?????????
encryptedXml.DecryptDocument();
return encryptedXmlDocument;
}
}
}
}

View File

@@ -1,4 +1,4 @@
using System.Security.Cryptography.Xml;
using System.Security.Cryptography.Xml;
using System.Xml;
using GostCryptography.Base;
@@ -6,102 +6,14 @@ using GostCryptography.Gost_28147_89;
using GostCryptography.Tests.Properties;
using GostCryptography.Xml;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Xml.Encrypt
{
/// <summary>
/// Шифрация и дешифрация XML с использованием общего симметричного ключа.
/// ???????? ? ?????????? XML ? ?????????????? ?????? ????????????? ?????.
/// </summary>
/// <remarks>
/// Тест создает XML-документ, выборочно шифрует элементы данного документа с использованием общего симметричного ключа,
/// а затем дешифрует полученный зашифрованный документ.
/// ???? ??????? XML-????????, ????????? ??????? ???????? ??????? ????????? ? ?????????????? ?????? ????????????? ?????,
/// ? ????? ????????? ?????????? ????????????? ????????.
/// </remarks>
[TestFixture(Description = "Шифрация и дешифрация XML с использованием общего симметричного ключа")]
public sealed class EncryptedXmlSharedKeyTest
{
[Test]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Providers))]
public void ShouldEncryptXml(ProviderType providerType)
{
// Given
var sharedKey = new Gost_28147_89_SymmetricAlgorithm(providerType);
var xmlDocument = CreateXmlDocument();
var expectedXml = xmlDocument.OuterXml;
// When
var encryptedXmlDocument = EncryptXmlDocument(xmlDocument, sharedKey);
var decryptedXmlDocument = DecryptXmlDocument(encryptedXmlDocument, sharedKey);
var actualXml = decryptedXmlDocument.OuterXml;
// Then
Assert.AreEqual(expectedXml, actualXml);
}
private static XmlDocument CreateXmlDocument()
{
var document = new XmlDocument();
document.LoadXml(Resources.EncryptedXmlExample);
return document;
}
private static XmlDocument EncryptXmlDocument(XmlDocument xmlDocument, Gost_28147_89_SymmetricAlgorithm sharedKey)
{
// Создание объекта для шифрации XML
var encryptedXml = new GostEncryptedXml(sharedKey.ProviderType);
// Поиск элементов для шифрации
var elements = xmlDocument.SelectNodes("//SomeElement[@Encrypt='true']");
if (elements != null)
{
foreach (XmlElement element in elements)
{
// Шифрация элемента
var encryptedData = encryptedXml.EncryptData(element, sharedKey, false);
// Формирование элемента EncryptedData
var elementEncryptedData = new EncryptedData();
elementEncryptedData.Type = EncryptedXml.XmlEncElementUrl;
elementEncryptedData.EncryptionMethod = new EncryptionMethod(sharedKey.AlgorithmName);
elementEncryptedData.CipherData.CipherValue = encryptedData;
// Замена элемента его зашифрованным представлением
GostEncryptedXml.ReplaceElement(element, elementEncryptedData, false);
}
}
return xmlDocument;
}
private static XmlDocument DecryptXmlDocument(XmlDocument encryptedXmlDocument, Gost_28147_89_SymmetricAlgorithm sharedKey)
{
// Создание объекта для дешифрации XML
var encryptedXml = new GostEncryptedXml(sharedKey.ProviderType, encryptedXmlDocument);
var nsManager = new XmlNamespaceManager(encryptedXmlDocument.NameTable);
nsManager.AddNamespace("enc", EncryptedXml.XmlEncNamespaceUrl);
// Поиск всех зашифрованных XML-элементов
var encryptedDataList = encryptedXmlDocument.SelectNodes("//enc:EncryptedData", nsManager);
if (encryptedDataList != null)
{
foreach (XmlElement encryptedData in encryptedDataList)
{
// Загрузка элемента EncryptedData
var elementEncryptedData = new EncryptedData();
elementEncryptedData.LoadXml(encryptedData);
// Расшифровка элемента EncryptedData
var decryptedData = encryptedXml.DecryptData(elementEncryptedData, sharedKey);
// Замена элемента EncryptedData его расшифрованным представлением
encryptedXml.ReplaceData(encryptedData, decryptedData);
}
}
return encryptedXmlDocument;
}
}
}

View File

@@ -1,4 +1,4 @@
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.Xml;
using System.Text;
using System.Xml;
@@ -8,87 +8,13 @@ using GostCryptography.Gost_28147_89;
using GostCryptography.Tests.Properties;
using GostCryptography.Xml;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Xml.Encrypt
{
/// <summary>
/// Шифрация и дешифрация XML документа с использованием сертификата и алгоритма ГОСТ Р 34.12-2015 Кузнечик.
/// ???????? ? ?????????? XML ????????? ? ?????????????? ??????????? ? ????????? ???? ? 34.12-2015 ????????.
/// </summary>
/// <remarks>
/// Тест создает XML-документ, шифрует его целиком с использованием сертификата, а затем дешифрует зашифрованный документ.
/// ???? ??????? XML-????????, ??????? ??? ??????? ? ?????????????? ???????????, ? ????? ????????? ????????????? ????????.
/// </remarks>
[TestFixture(Description = "Шифрация и дешифрация XML документа с использованием сертификата и алгоритма ГОСТ Р 34.12-2015 Кузнечик")]
public sealed class KuznyechikEncryptedXmlCertificateTest
{
[Test]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Gost_R3410_Certificates))]
public void ShouldEncryptXml(TestCertificateInfo testCase)
{
// Given
var certificate = testCase.Certificate;
var xmlDocument = CreateXmlDocument();
var expectedXml = xmlDocument.OuterXml.Replace("\r\n", "\n");
// When
var encryptedXmlDocument = EncryptXmlDocument(xmlDocument, certificate);
var decryptedXmlDocument = DecryptXmlDocument(encryptedXmlDocument);
var actualXml = decryptedXmlDocument.OuterXml.Replace("\r\n", "\n");
// Then
Assert.AreEqual(expectedXml, actualXml);
}
private static XmlDocument CreateXmlDocument()
{
var document = new XmlDocument();
document.LoadXml(Resources.EncryptedXmlExample);
return document;
}
private static XmlDocument EncryptXmlDocument(XmlDocument xmlDocument, X509Certificate2 certificate)
{
var publicKeyAlgorithm = (GostAsymmetricAlgorithm)certificate.GetPublicKeyAlgorithm();
using (var sessionKey = new Gost_3412_K_SymmetricAlgorithm(publicKeyAlgorithm.ProviderType))
{
var encryptedSessionKeyData = GostEncryptedXml.EncryptKey(sessionKey, publicKeyAlgorithm);
var encryptedSessionKey = new EncryptedKey
{
CipherData = new CipherData(encryptedSessionKeyData),
EncryptionMethod = new EncryptionMethod(publicKeyAlgorithm.KeyExchangeAlgorithm),
};
encryptedSessionKey.KeyInfo.AddClause(new KeyInfoX509Data(certificate));
var elementEncryptedData = new EncryptedData
{
EncryptionMethod = new EncryptionMethod(sessionKey.AlgorithmName),
};
var encryptedXml = new GostEncryptedXml();
var xmlBytes = Encoding.UTF8.GetBytes(xmlDocument.OuterXml);
var encryptedData = encryptedXml.EncryptData(xmlBytes, sessionKey);
elementEncryptedData.CipherData.CipherValue = encryptedData;
elementEncryptedData.KeyInfo.AddClause(new KeyInfoEncryptedKey(encryptedSessionKey));
GostEncryptedXml.ReplaceElement(xmlDocument.DocumentElement, elementEncryptedData, false);
}
return xmlDocument;
}
private static XmlDocument DecryptXmlDocument(XmlDocument encryptedXmlDocument)
{
// Создание объекта для дешифрации XML
var encryptedXml = new GostEncryptedXml(encryptedXmlDocument);
// Расшифровка зашифрованных элементов документа
encryptedXml.DecryptDocument();
return encryptedXmlDocument;
}
}
}

View File

@@ -1,4 +1,4 @@
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.Xml;
using System.Text;
using System.Xml;
@@ -8,87 +8,13 @@ using GostCryptography.Gost_28147_89;
using GostCryptography.Tests.Properties;
using GostCryptography.Xml;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Xml.Encrypt
{
/// <summary>
/// Шифрация и дешифрация XML документа с использованием сертификата и алгоритма ГОСТ Р 34.12-2015 Магма.
/// ???????? ? ?????????? XML ????????? ? ?????????????? ??????????? ? ????????? ???? ? 34.12-2015 ?????.
/// </summary>
/// <remarks>
/// Тест создает XML-документ, шифрует его целиком с использованием сертификата, а затем дешифрует зашифрованный документ.
/// ???? ??????? XML-????????, ??????? ??? ??????? ? ?????????????? ???????????, ? ????? ????????? ????????????? ????????.
/// </remarks>
[TestFixture(Description = "Шифрация и дешифрация XML документа с использованием сертификата и алгоритма ГОСТ Р 34.12-2015 Магма")]
public sealed class MagmaEncryptedXmlCertificateTest
{
[Test]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Gost_R3410_Certificates))]
public void ShouldEncryptXml(TestCertificateInfo testCase)
{
// Given
var certificate = testCase.Certificate;
var xmlDocument = CreateXmlDocument();
var expectedXml = xmlDocument.OuterXml.Replace("\r\n", "\n");
// When
var encryptedXmlDocument = EncryptXmlDocument(xmlDocument, certificate);
var decryptedXmlDocument = DecryptXmlDocument(encryptedXmlDocument);
var actualXml = decryptedXmlDocument.OuterXml.Replace("\r\n", "\n");
// Then
Assert.AreEqual(expectedXml, actualXml);
}
private static XmlDocument CreateXmlDocument()
{
var document = new XmlDocument();
document.LoadXml(Resources.EncryptedXmlExample);
return document;
}
private static XmlDocument EncryptXmlDocument(XmlDocument xmlDocument, X509Certificate2 certificate)
{
var publicKeyAlgorithm = (GostAsymmetricAlgorithm)certificate.GetPublicKeyAlgorithm();
using (var sessionKey = new Gost_3412_M_SymmetricAlgorithm(publicKeyAlgorithm.ProviderType))
{
var encryptedSessionKeyData = GostEncryptedXml.EncryptKey(sessionKey, publicKeyAlgorithm);
var encryptedSessionKey = new EncryptedKey
{
CipherData = new CipherData(encryptedSessionKeyData),
EncryptionMethod = new EncryptionMethod(publicKeyAlgorithm.KeyExchangeAlgorithm),
};
encryptedSessionKey.KeyInfo.AddClause(new KeyInfoX509Data(certificate));
var elementEncryptedData = new EncryptedData
{
EncryptionMethod = new EncryptionMethod(sessionKey.AlgorithmName),
};
var encryptedXml = new GostEncryptedXml();
var xmlBytes = Encoding.UTF8.GetBytes(xmlDocument.OuterXml);
var encryptedData = encryptedXml.EncryptData(xmlBytes, sessionKey);
elementEncryptedData.CipherData.CipherValue = encryptedData;
elementEncryptedData.KeyInfo.AddClause(new KeyInfoEncryptedKey(encryptedSessionKey));
GostEncryptedXml.ReplaceElement(xmlDocument.DocumentElement, elementEncryptedData, false);
}
return xmlDocument;
}
private static XmlDocument DecryptXmlDocument(XmlDocument encryptedXmlDocument)
{
// Создание объекта для дешифрации XML
var encryptedXml = new GostEncryptedXml(encryptedXmlDocument);
// Расшифровка зашифрованных элементов документа
encryptedXml.DecryptDocument();
return encryptedXmlDocument;
}
}
}

View File

@@ -1,4 +1,4 @@
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.Xml;
using System.Xml;
@@ -6,21 +6,20 @@ using GostCryptography.Base;
using GostCryptography.Tests.Properties;
using GostCryptography.Xml;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Xml.Sign
{
/// <summary>
/// Подпись и проверка подписи XML-документа с использованием сертификата.
/// ??????? ? ???????? ??????? XML-????????? ? ?????????????? ???????????.
/// </summary>
/// <remarks>
/// Тест создает XML-документ, подписывает определенную часть данного документа с использованием сертификата,
/// а затем проверяет полученную цифровую подпись.
/// ???? ??????? XML-????????, ??????????? ???????????? ????? ??????? ????????? ? ?????????????? ???????????,
/// ? ????? ????????? ?????????? ???????? ???????.
/// </remarks>
[TestFixture(Description = "Подпись и проверка подписи XML-документа с использованием сертификата")]
public class SignedXmlCertificateTest
{
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Gost_R3410_Certificates))]
public void ShouldSignXml(TestCertificateInfo testCase)
{
@@ -32,7 +31,7 @@ namespace GostCryptography.Tests.Xml.Sign
var signedXmlDocument = SignXmlDocument(xmlDocument, certificate);
// Then
Assert.IsTrue(VerifyXmlDocumentSignature(signedXmlDocument));
Assert.True(VerifyXmlDocumentSignature(signedXmlDocument));
}
private static XmlDocument CreateXmlDocument()
@@ -44,30 +43,30 @@ namespace GostCryptography.Tests.Xml.Sign
private static XmlDocument SignXmlDocument(XmlDocument xmlDocument, X509Certificate2 certificate)
{
// Создание подписчика XML-документа
// ???????? ?????????? XML-?????????
var signedXml = new GostSignedXml(xmlDocument);
// Установка ключа для создания подписи
// ????????? ????? ??? ???????? ???????
signedXml.SetSigningCertificate(certificate);
// Ссылка на узел, который нужно подписать, с указанием алгоритма хэширования
// ?????? ?? ????, ??????? ????? ?????????, ? ????????? ????????? ???????????
var dataReference = new Reference { Uri = "#Id1", DigestMethod = GetDigestMethod(certificate) };
// Установка ссылки на узел
// ????????? ?????? ?? ????
signedXml.AddReference(dataReference);
// Установка информации о сертификате, который использовался для создания подписи
// ????????? ?????????? ? ???????????, ??????? ????????????? ??? ???????? ???????
var keyInfo = new KeyInfo();
keyInfo.AddClause(new KeyInfoX509Data(certificate));
signedXml.KeyInfo = keyInfo;
// Вычисление подписи
// ?????????? ???????
signedXml.ComputeSignature();
// Получение XML-представления подписи
// ????????? XML-????????????? ???????
var signatureXml = signedXml.GetXml();
// Добавление подписи в исходный документ
// ?????????? ??????? ? ???????? ????????
xmlDocument.DocumentElement.AppendChild(xmlDocument.ImportNode(signatureXml, true));
return xmlDocument;
@@ -75,22 +74,22 @@ namespace GostCryptography.Tests.Xml.Sign
private static bool VerifyXmlDocumentSignature(XmlDocument signedXmlDocument)
{
// Создание подписчика XML-документа
// ???????? ?????????? XML-?????????
var signedXml = new GostSignedXml(signedXmlDocument);
// Поиск узла с подписью
// ????? ???? ? ????????
var nodeList = signedXmlDocument.GetElementsByTagName("Signature", SignedXml.XmlDsigNamespaceUrl);
// Загрузка найденной подписи
// ???????? ????????? ???????
signedXml.LoadXml((XmlElement)nodeList[0]);
// Проверка подписи
// ???????? ???????
return signedXml.CheckSignature();
}
private static string GetDigestMethod(X509Certificate2 certificate)
{
// Имя алгоритма вычисляем динамически, чтобы сделать код теста универсальным
// ??? ????????? ????????? ???????????, ????? ??????? ??? ????? ?????????????
using (var publicKey = (GostAsymmetricAlgorithm)certificate.GetPublicKeyAlgorithm())
using (var hashAlgorithm = publicKey.CreateHashAlgorithm())
@@ -99,4 +98,4 @@ namespace GostCryptography.Tests.Xml.Sign
}
}
}
}
}

View File

@@ -1,4 +1,4 @@
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.Xml;
using System.Xml;
@@ -6,21 +6,20 @@ using GostCryptography.Base;
using GostCryptography.Tests.Properties;
using GostCryptography.Xml;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Xml.Sign
{
/// <summary>
/// Подпись и проверка подписи всего XML документа с использованием сертификата
/// ??????? ? ???????? ??????? ????? XML ????????? ? ?????????????? ???????????
/// </summary>
/// <remarks>
/// Тест создает XML-документ, подписывает весь документ с использованием сертификата,
/// а затем проверяет полученную цифровую подпись.
/// ???? ??????? XML-????????, ??????????? ???? ???????? ? ?????????????? ???????????,
/// ? ????? ????????? ?????????? ???????? ???????.
/// </remarks>
[TestFixture(Description = "Подпись и проверка подписи всего XML документа с использованием сертификата")]
public class SignedXmlDocumentTest
{
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Gost_R3410_Certificates))]
public void ShouldSignXml(TestCertificateInfo testCase)
{
@@ -32,7 +31,7 @@ namespace GostCryptography.Tests.Xml.Sign
var signedXmlDocument = SignXmlDocument(xmlDocument, certificate);
// Then
Assert.IsTrue(VerifyXmlDocumentSignature(signedXmlDocument));
Assert.True(VerifyXmlDocumentSignature(signedXmlDocument));
}
private static XmlDocument CreateXmlDocument()
@@ -44,33 +43,33 @@ namespace GostCryptography.Tests.Xml.Sign
private static XmlDocument SignXmlDocument(XmlDocument xmlDocument, X509Certificate2 certificate)
{
// Создание подписчика XML-документа
// ???????? ?????????? XML-?????????
var signedXml = new GostSignedXml(xmlDocument);
// Установка ключа для создания подписи
// ????????? ????? ??? ???????? ???????
signedXml.SetSigningCertificate(certificate);
// Ссылка на весь документ и указание алгоритма хэширования
// ?????? ?? ???? ???????? ? ???????? ????????? ???????????
var dataReference = new Reference { Uri = "", DigestMethod = GetDigestMethod(certificate) };
// Метод преобразования для подписи всего документа
// ????? ?????????????? ??? ??????? ????? ?????????
dataReference.AddTransform(new XmlDsigEnvelopedSignatureTransform());
// Установка ссылки на узел
// ????????? ?????? ?? ????
signedXml.AddReference(dataReference);
// Установка информации о сертификате, который использовался для создания подписи
// ????????? ?????????? ? ???????????, ??????? ????????????? ??? ???????? ???????
var keyInfo = new KeyInfo();
keyInfo.AddClause(new KeyInfoX509Data(certificate));
signedXml.KeyInfo = keyInfo;
// Вычисление подписи
// ?????????? ???????
signedXml.ComputeSignature();
// Получение XML-представления подписи
// ????????? XML-????????????? ???????
var signatureXml = signedXml.GetXml();
// Добавление подписи в исходный документ
// ?????????? ??????? ? ???????? ????????
xmlDocument.DocumentElement.AppendChild(xmlDocument.ImportNode(signatureXml, true));
return xmlDocument;
@@ -78,22 +77,22 @@ namespace GostCryptography.Tests.Xml.Sign
private static bool VerifyXmlDocumentSignature(XmlDocument signedXmlDocument)
{
// Создание подписчика XML-документа
// ???????? ?????????? XML-?????????
var signedXml = new GostSignedXml(signedXmlDocument);
// Поиск узла с подписью
// ????? ???? ? ????????
var nodeList = signedXmlDocument.GetElementsByTagName("Signature", SignedXml.XmlDsigNamespaceUrl);
// Загрузка найденной подписи
// ???????? ????????? ???????
signedXml.LoadXml((XmlElement)nodeList[0]);
// Проверка подписи
// ???????? ???????
return signedXml.CheckSignature();
}
private static string GetDigestMethod(X509Certificate2 certificate)
{
// Имя алгоритма вычисляем динамически, чтобы сделать код теста универсальным
// ??? ????????? ????????? ???????????, ????? ??????? ??? ????? ?????????????
using (var publicKey = (GostAsymmetricAlgorithm)certificate.GetPublicKeyAlgorithm())
using (var hashAlgorithm = publicKey.CreateHashAlgorithm())
@@ -102,4 +101,4 @@ namespace GostCryptography.Tests.Xml.Sign
}
}
}
}
}

View File

@@ -1,4 +1,4 @@
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.Xml;
using System.Xml;
@@ -7,21 +7,20 @@ using GostCryptography.Gost_R3410;
using GostCryptography.Tests.Properties;
using GostCryptography.Xml;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Xml.Sign
{
/// <summary>
/// Подпись и проверка подписи XML-документа с использованием контейнера ключей.
/// ??????? ? ???????? ??????? XML-????????? ? ?????????????? ?????????? ??????.
/// </summary>
/// <remarks>
/// Тест создает XML-документ, подписывает определенную часть данного документа с использованием контейнера ключей,
/// а затем проверяет полученную цифровую подпись.
/// ???? ??????? XML-????????, ??????????? ???????????? ????? ??????? ????????? ? ?????????????? ?????????? ??????,
/// ? ????? ????????? ?????????? ???????? ???????.
/// </remarks>
[TestFixture(Description = "Подпись и проверка подписи XML-документа с использованием контейнера ключей")]
public class SignedXmlKeyContainerTest
{
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Gost_R3410_2001_Certificates))]
public void ShouldSignXmlWithGost_R3410_2001(TestCertificateInfo testCase)
{
@@ -35,10 +34,10 @@ namespace GostCryptography.Tests.Xml.Sign
var signedXmlDocument = SignXmlDocument(xmlDocument, new Gost_R3410_2001_KeyValue(signingKey));
// Then
Assert.IsTrue(VerifyXmlDocumentSignature(signedXmlDocument));
Assert.True(VerifyXmlDocumentSignature(signedXmlDocument));
}
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Gost_R3410_2012_256_Certificates))]
public void ShouldSignXmlWithGost_R3410_2012_256(TestCertificateInfo testCase)
{
@@ -52,10 +51,10 @@ namespace GostCryptography.Tests.Xml.Sign
var signedXmlDocument = SignXmlDocument(xmlDocument, new Gost_R3410_2012_256_KeyValue(signingKey));
// Then
Assert.IsTrue(VerifyXmlDocumentSignature(signedXmlDocument));
Assert.True(VerifyXmlDocumentSignature(signedXmlDocument));
}
[Test]
[Fact]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Gost_R3410_2012_512_Certificates))]
public void ShouldSignXmlWithGost_R3410_2012_512(TestCertificateInfo testCase)
{
@@ -69,7 +68,7 @@ namespace GostCryptography.Tests.Xml.Sign
var signedXmlDocument = SignXmlDocument(xmlDocument, new Gost_R3410_2012_512_KeyValue(signingKey));
// Then
Assert.IsTrue(VerifyXmlDocumentSignature(signedXmlDocument));
Assert.True(VerifyXmlDocumentSignature(signedXmlDocument));
}
private static XmlDocument CreateXmlDocument()
@@ -83,30 +82,30 @@ namespace GostCryptography.Tests.Xml.Sign
{
var signingKey = keyValue.PublicKey;
// Создание подписчика XML-документа
// ???????? ?????????? XML-?????????
var signedXml = new GostSignedXml(xmlDocument);
// Установка ключа для создания подписи
// ????????? ????? ??? ???????? ???????
signedXml.SigningKey = signingKey;
// Ссылка на узел, который нужно подписать, с указанием алгоритма хэширования
// ?????? ?? ????, ??????? ????? ?????????, ? ????????? ????????? ???????????
var dataReference = new Reference { Uri = "#Id1", DigestMethod = GetDigestMethod(signingKey) };
// Установка ссылки на узел
// ????????? ?????? ?? ????
signedXml.AddReference(dataReference);
// Установка информации о ключе, который использовался для создания подписи
// ????????? ?????????? ? ?????, ??????? ????????????? ??? ???????? ???????
var keyInfo = new KeyInfo();
keyInfo.AddClause(keyValue);
signedXml.KeyInfo = keyInfo;
// Вычисление подписи
// ?????????? ???????
signedXml.ComputeSignature();
// Получение XML-представления подписи
// ????????? XML-????????????? ???????
var signatureXml = signedXml.GetXml();
// Добавление подписи в исходный документ
// ?????????? ??????? ? ???????? ????????
xmlDocument.DocumentElement.AppendChild(xmlDocument.ImportNode(signatureXml, true));
return xmlDocument;
@@ -114,22 +113,22 @@ namespace GostCryptography.Tests.Xml.Sign
private static bool VerifyXmlDocumentSignature(XmlDocument signedXmlDocument)
{
// Создание подписчика XML-документа
// ???????? ?????????? XML-?????????
var signedXml = new GostSignedXml(signedXmlDocument);
// Поиск узла с подписью
// ????? ???? ? ????????
var nodeList = signedXmlDocument.GetElementsByTagName("Signature", SignedXml.XmlDsigNamespaceUrl);
// Загрузка найденной подписи
// ???????? ????????? ???????
signedXml.LoadXml((XmlElement)nodeList[0]);
// Проверка подписи
// ???????? ???????
return signedXml.CheckSignature();
}
private static string GetDigestMethod(GostAsymmetricAlgorithm signingKey)
{
// Имя алгоритма вычисляем динамически, чтобы сделать код теста универсальным
// ??? ????????? ????????? ???????????, ????? ??????? ??? ????? ?????????????
using (var hashAlgorithm = signingKey.CreateHashAlgorithm())
{
@@ -137,4 +136,4 @@ namespace GostCryptography.Tests.Xml.Sign
}
}
}
}
}

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.Xml;
using System.Xml;
@@ -7,148 +7,14 @@ using GostCryptography.Base;
using GostCryptography.Tests.Properties;
using GostCryptography.Xml;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Xml.Sign
{
/// <summary>
/// Подпись и проверка подписи запроса к сервису СМЭВ (Система межведомственного электронного взаимодействия).
/// ??????? ? ???????? ??????? ??????? ? ??????? ???? (??????? ????????????????? ???????????? ??????????????).
/// </summary>
/// <remarks>
/// Тест создает запрос к сервису СМЭВ, подписывает определенную часть данного запроса с использованием сертификата,
/// а затем проверяет полученную цифровую подпись.
/// ???? ??????? ?????? ? ??????? ????, ??????????? ???????????? ????? ??????? ??????? ? ?????????????? ???????????,
/// ? ????? ????????? ?????????? ???????? ???????.
/// </remarks>
[TestFixture(Description = "Подпись и проверка подписи запроса к сервису СМЭВ (Система межведомственного электронного взаимодействия)")]
public sealed class SignedXmlSmevTest
{
private const string WsSecurityExtNamespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
private const string WsSecurityUtilityNamespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";
[Test]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Gost_R3410_Certificates))]
public void ShouldSignXml(TestCertificateInfo testCase)
{
// Given
var certificate = testCase.Certificate;
var smevRequest = CreateSmevRequest();
// When
var signedXmlDocument = SignSmevRequest(smevRequest, certificate);
// Then
Assert.IsTrue(VerifySmevRequestSignature(signedXmlDocument));
}
private static XmlDocument CreateSmevRequest()
{
var document = new XmlDocument();
document.LoadXml(Resources.SmevExample);
return document;
}
private static XmlDocument SignSmevRequest(XmlDocument smevRequest, X509Certificate2 certificate)
{
// Создание подписчика XML-документа
var signedXml = new GostSignedXml(smevRequest) { GetIdElementHandler = GetSmevIdElement };
// Установка ключа для создания подписи
signedXml.SetSigningCertificate(certificate);
// Ссылка на узел, который нужно подписать, с указанием алгоритма хэширования
var dataReference = new Reference { Uri = "#body", DigestMethod = GetDigestMethod(certificate) };
// Метод преобразования, применяемый к данным перед их подписью (в соответствии с методическими рекомендациями СМЭВ)
var dataTransform = new XmlDsigExcC14NTransform();
dataReference.AddTransform(dataTransform);
// Установка ссылки на узел
signedXml.AddReference(dataReference);
// Установка алгоритма нормализации узла SignedInfo (в соответствии с методическими рекомендациями СМЭВ)
signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl;
// Установка алгоритма хэширования (в соответствии с методическими рекомендациями СМЭВ)
signedXml.SignedInfo.SignatureMethod = GetSignatureMethod(certificate);
// Вычисление подписи
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(certificate.RawData);
return smevRequest;
}
private static bool VerifySmevRequestSignature(XmlDocument signedSmevRequest)
{
// Создание подписчика XML-документа
var signedXml = new GostSignedXml(signedSmevRequest) { GetIdElementHandler = GetSmevIdElement };
// Поиск узла с подписью
var nodeList = signedSmevRequest.GetElementsByTagName("Signature", SignedXml.XmlDsigNamespaceUrl);
// Загрузка найденной подписи
signedXml.LoadXml((XmlElement)nodeList[0]);
// Поиск ссылки на BinarySecurityToken
var references = signedXml.KeyInfo.GetXml().GetElementsByTagName("Reference", WsSecurityExtNamespace);
if (references.Count > 0)
{
// Определение ссылки на сертификат (ссылка на узел документа)
var binaryTokenReference = ((XmlElement)references[0]).GetAttribute("URI");
if (!string.IsNullOrEmpty(binaryTokenReference) && binaryTokenReference[0] == '#')
{
// Поиск элемента с закодированным в Base64 сертификатом
var binaryTokenElement = signedXml.GetIdElement(signedSmevRequest, binaryTokenReference.Substring(1));
if (binaryTokenElement != null)
{
// Загрузка сертификата, который был использован для подписи
var certificate = new X509Certificate2(Convert.FromBase64String(binaryTokenElement.InnerText));
// Проверка подписи
return signedXml.CheckSignature(certificate.GetPublicKeyAlgorithm());
}
}
}
return false;
}
private static XmlElement GetSmevIdElement(XmlDocument document, string idValue)
{
var namespaceManager = new XmlNamespaceManager(document.NameTable);
namespaceManager.AddNamespace("wsu", WsSecurityUtilityNamespace);
return document.SelectSingleNode("//*[@wsu:Id='" + idValue + "']", namespaceManager) as XmlElement;
}
private static string GetSignatureMethod(X509Certificate2 certificate)
{
// Имя алгоритма вычисляем динамически, чтобы сделать код теста универсальным
using (var publicKey = (GostAsymmetricAlgorithm)certificate.GetPublicKeyAlgorithm())
{
return publicKey.SignatureAlgorithm;
}
}
private static string GetDigestMethod(X509Certificate2 certificate)
{
// Имя алгоритма вычисляем динамически, чтобы сделать код теста универсальным
using (var publicKey = (GostAsymmetricAlgorithm)certificate.GetPublicKeyAlgorithm())
using (var hashAlgorithm = publicKey.CreateHashAlgorithm())
{
return hashAlgorithm.AlgorithmName;
}
}
}
}

View File

@@ -1,4 +1,4 @@
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.Xml;
using System.Xml;
@@ -6,126 +6,15 @@ using GostCryptography.Base;
using GostCryptography.Tests.Properties;
using GostCryptography.Xml;
using NUnit.Framework;
using Xunit;
namespace GostCryptography.Tests.Xml.Sign
{
/// <summary>
/// Подпись и проверка подписи XML-документа с предварительным XSLT-преобразованием подписываемых данных.
/// ??????? ? ???????? ??????? XML-????????? ? ??????????????? XSLT-??????????????? ????????????? ??????.
/// </summary>
/// <remarks>
/// Тест создает XML-документ, подписывает определенную часть данного документа с использованием сертификата,
/// предварительно осуществляя XSLT-преобразование подписываемых данных, а затем проверяет полученную цифровую подпись.
/// ???? ??????? XML-????????, ??????????? ???????????? ????? ??????? ????????? ? ?????????????? ???????????,
/// ?????????????? ??????????? XSLT-?????????????? ????????????? ??????, ? ????? ????????? ?????????? ???????? ???????.
/// </remarks>
[Ignore("TODO: Нужно произвести диагностику с подключением логирования")]
[TestFixture(Description = "Подпись и проверка подписи XML-документа с предварительным XSLT-преобразованием подписываемых данных")]
public sealed class SignedXmlTransformTest
{
[Test]
[TestCaseSource(typeof(TestConfig), nameof(TestConfig.Gost_R3410_Certificates))]
public void ShouldSignXml(TestCertificateInfo testCase)
{
// Given
var certificate = testCase.Certificate;
var xmlDocument = CreateXmlDocument();
// When
var signedXmlDocument = SignXmlDocument(xmlDocument, certificate);
// Then
Assert.IsTrue(VerifyXmlDocumentSignature(signedXmlDocument));
}
private static XmlDocument CreateXmlDocument()
{
var document = new XmlDocument();
document.LoadXml(Resources.SignedXmlExample);
return document;
}
private static XmlDocument SignXmlDocument(XmlDocument xmlDocument, X509Certificate2 certificate)
{
// Создание подписчика XML-документа
var signedXml = new GostSignedXml(xmlDocument);
// Установка ключа для создания подписи
signedXml.SetSigningCertificate(certificate);
// Ссылка на узел, который нужно подписать, с указанием алгоритма хэширования
var dataReference = new Reference { Uri = "#Id1", DigestMethod = GetDigestMethod(certificate) };
// Метод преобразования, применяемый к данным перед их подписью
var dataTransform = CreateDataTransform();
dataReference.AddTransform(dataTransform);
// Установка ссылки на узел
signedXml.AddReference(dataReference);
// Установка информации о сертификате, который использовался для создания подписи
var keyInfo = new KeyInfo();
keyInfo.AddClause(new KeyInfoX509Data(certificate));
signedXml.KeyInfo = keyInfo;
// Вычисление подписи
signedXml.ComputeSignature();
// Получение XML-представления подписи
var signatureXml = signedXml.GetXml();
// Добавление подписи в исходный документ
xmlDocument.DocumentElement.AppendChild(xmlDocument.ImportNode(signatureXml, true));
return xmlDocument;
}
private static XmlDsigXsltTransform CreateDataTransform()
{
var dataTransformDocument = new XmlDocument();
dataTransformDocument.LoadXml(@"
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:ds='http://www.w3.org/2000/09/xmldsig#'>
<xsl:template match='/'>
<xsl:apply-templates />
</xsl:template>
<xsl:template match='*'>
<xsl:copy>
<xsl:copy-of select='@*' />
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<xsl:template match='ds:Signature' />
</xsl:stylesheet>");
var dataTransform = new XmlDsigXsltTransform();
dataTransform.LoadInnerXml(dataTransformDocument.ChildNodes);
return dataTransform;
}
private static bool VerifyXmlDocumentSignature(XmlDocument signedXmlDocument)
{
// Создание подписчика XML-документа
var signedXml = new GostSignedXml(signedXmlDocument);
// Поиск узла с подписью
var nodeList = signedXmlDocument.GetElementsByTagName("Signature", SignedXml.XmlDsigNamespaceUrl);
// Загрузка найденной подписи
signedXml.LoadXml((XmlElement)nodeList[0]);
// Проверка подписи
return signedXml.CheckSignature();
}
private static string GetDigestMethod(X509Certificate2 certificate)
{
// Имя алгоритма вычисляем динамически, чтобы сделать код теста универсальным
using (var publicKey = (GostAsymmetricAlgorithm)certificate.GetPublicKeyAlgorithm())
using (var hashAlgorithm = publicKey.CreateHashAlgorithm())
{
return hashAlgorithm.AlgorithmName;
}
}
}
}
[Ignore("TODO: ????? ?????????? ??????????? ? ???????????? ???????????")]