using GostCryptography.Asn1.Gost.Gost_R3410;
using GostCryptography.Base;
using GostCryptography.Native;
using System.Security;
namespace GostCryptography.Gost_R3410
{
///
/// Базовый класс для всех реализаций алгоритма ГОСТ Р 34.10
///
/// Параметры ключа цифровой подписи ГОСТ Р 34.10
/// Алгоритм общего секретного ключа ГОСТ Р 34.10
public abstract class Gost_R3410_AsymmetricAlgorithmBase : GostAsymmetricAlgorithm
where TKeyParams : Gost_R3410_KeyExchangeParams
where TKeyAlgorithm : Gost_R3410_KeyExchangeAlgorithm
{
///
protected Gost_R3410_AsymmetricAlgorithmBase(ProviderType providerType, int keySize) : base(providerType, keySize)
{
}
///
/// Идентификатор алгоритма обмена ключей
///
protected abstract int ExchangeAlgId { get; }
///
/// Идентификатор алгоритма цифровой подписи
///
protected abstract int SignatureAlgId { get; }
///
/// Создает экземпляр
///
protected abstract TKeyParams CreateKeyExchangeParams();
///
/// Создает экземпляр
///
[SecuritySafeCritical]
protected abstract TKeyAlgorithm CreateKeyExchangeAlgorithm(ProviderType providerType, SafeProvHandleImpl provHandle, SafeKeyHandleImpl keyHandle, TKeyParams keyExchangeParameters);
///
/// Создает общий секретный ключ
///
/// Параметры открытого ключа, используемого для создания общего секретного ключа
public abstract TKeyAlgorithm CreateKeyExchange(TKeyParams keyParameters);
///
/// Экспортирует (шифрует) параметры ключа, используемого для создания общего секретного ключа
///
/// Включить секретный ключ
public abstract TKeyParams ExportParameters(bool includePrivateKey);
///
/// Импортирует (дешифрует) параметры ключа, используемого для создания общего секретного ключа
///
/// Параметры ключа, используемого для создания общего секретного ключа
public abstract void ImportParameters(TKeyParams keyParameters);
///
/// Создает XML-сериализатор параметров ключа цифровой подписи
///
protected abstract Gost_R3410_KeyExchangeXmlSerializer CreateKeyExchangeXmlSerializer();
///
public override string ToXmlString(bool includePrivateKey)
{
var keyParameters = ExportParameters(includePrivateKey);
var xmlSerializer = CreateKeyExchangeXmlSerializer();
return xmlSerializer.Serialize(keyParameters);
}
///
public override void FromXmlString(string keyParametersXml)
{
var xmlSerializer = CreateKeyExchangeXmlSerializer();
var keyParameters = xmlSerializer.Deserialize(keyParametersXml, CreateKeyExchangeParams());
ImportParameters(keyParameters);
}
}
}