Add project
Basic formatting applied. Unnecessary comments have been removed. Suspicious code is covered by TODO.
This commit is contained in:
409
Hcs.Client/GostCryptography/Native/Constants.cs
Normal file
409
Hcs.Client/GostCryptography/Native/Constants.cs
Normal file
@ -0,0 +1,409 @@
|
||||
namespace GostCryptography.Native
|
||||
{
|
||||
/// <summary>
|
||||
/// Константы для работы с криптографическим провайдером
|
||||
/// </summary>
|
||||
public static class Constants
|
||||
{
|
||||
// ReSharper disable InconsistentNaming
|
||||
|
||||
#region Идентификаторы криптографических алгоритмов ГОСТ
|
||||
|
||||
/// <summary>
|
||||
/// Идентификатор алгоритма обмена ключей по Диффи-Хеллману на базе закрытого ключа пользователя. Открытый ключ получается по ГОСТ Р 34.10 2001
|
||||
/// </summary>
|
||||
public const int CALG_DH_EL_SF = 0xaa24;
|
||||
|
||||
/// <summary>
|
||||
/// Идентификатор алгоритма обмена ключей по Диффи-Хеллману на базе закрытого ключа пользователя. Открытый ключ получается по ГОСТ Р 34.10 2012 (256 бит)
|
||||
/// </summary>
|
||||
public const int CALG_DH_GR3410_2012_256_SF = 0xaa46;
|
||||
|
||||
/// <summary>
|
||||
/// Идентификатор алгоритма обмена ключей по Диффи-Хеллману на базе закрытого ключа пользователя. Открытый ключ получается по ГОСТ Р 34.10 2012 (512 бит)
|
||||
/// </summary>
|
||||
public const int CALG_DH_GR3410_2012_512_SF = 0xaa42;
|
||||
|
||||
/// <summary>
|
||||
/// Идентификатор алгоритма обмена ключей по Диффи-Хеллману на базе закрытого ключа эфемерной пары. Открытый ключ получается по ГОСТ Р 34.10 2001
|
||||
/// </summary>
|
||||
public const int CALG_DH_EL_EPHEM = 0xaa25;
|
||||
|
||||
/// <summary>
|
||||
/// Идентификатор алгоритма обмена ключей по Диффи-Хеллману на базе закрытого ключа эфемерной пары. Открытый ключ получается по ГОСТ Р 34.10 2012 (256 бит)
|
||||
/// </summary>
|
||||
public const int CALG_DH_GR3410_12_256_EPHEM = 0xaa47;
|
||||
|
||||
/// <summary>
|
||||
/// Идентификатор алгоритма обмена ключей по Диффи-Хеллману на базе закрытого ключа эфемерной пары. Открытый ключ получается по ГОСТ Р 34.10 2012 (512 бит)
|
||||
/// </summary>
|
||||
public const int CALG_DH_GR3410_12_512_EPHEM = 0xaa43;
|
||||
|
||||
/// <summary>
|
||||
/// Идентификатор алгоритма ЭЦП по ГОСТ Р 34.10-2001
|
||||
/// </summary>
|
||||
public const int CALG_GR3410EL = 0x2e23;
|
||||
|
||||
/// <summary>
|
||||
/// Идентификатор алгоритма ЭЦП по ГОСТ Р 34.10-2012 (256 бит)
|
||||
/// </summary>
|
||||
public const int CALG_GR3410_2012_256 = 0x2e49;
|
||||
|
||||
/// <summary>
|
||||
/// Идентификатор алгоритма ЭЦП по ГОСТ Р 34.10-2012 (512 бит)
|
||||
/// </summary>
|
||||
public const int CALG_GR3410_2012_512 = 0x2e3d;
|
||||
|
||||
/// <summary>
|
||||
/// Идентификатор алгоритма хэширования в соответствии с ГОСТ Р 34.11-94
|
||||
/// </summary>
|
||||
public const int CALG_GR3411 = 0x801e;
|
||||
|
||||
/// <summary>
|
||||
/// Идентификатор алгоритма хэширования в соответствии с ГОСТ Р 34.11-2012, длина выхода 256 бит
|
||||
/// </summary>
|
||||
public const int CALG_GR3411_2012_256 = 0x8021;
|
||||
|
||||
/// <summary>
|
||||
/// Идентификатор алгоритма хэширования в соответствии с ГОСТ Р 34.11-2012, длина выхода 512 бит
|
||||
/// </summary>
|
||||
public const int CALG_GR3411_2012_512 = 0x8022;
|
||||
|
||||
/// <summary>
|
||||
/// Идентификатор алгоритма ключевого хэширования (HMAC, Hash-based Message Authentication Code) на базе алгоритма ГОСТ Р 34.11-94 и сессионного ключа <see cref="CALG_G28147"/>
|
||||
/// </summary>
|
||||
public const int CALG_GR3411_HMAC = 0x8027;
|
||||
|
||||
/// <summary>
|
||||
/// Идентификатор алгоритма ключевого хэширования (HMAC, Hash-based Message Authentication Code) на базе алгоритма ГОСТ Р 34.11-94 и сессионного ключа <see cref="CALG_G28147"/>, длина выхода 256 бит
|
||||
/// </summary>
|
||||
public const int CALG_GR3411_2012_256_HMAC = 0x8034;
|
||||
|
||||
/// <summary>
|
||||
/// Идентификатор алгоритма ключевого хэширования (HMAC, Hash-based Message Authentication Code) на базе алгоритма ГОСТ Р 34.11-94 и сессионного ключа <see cref="CALG_G28147"/>, длина выхода 512 бит
|
||||
/// </summary>
|
||||
public const int CALG_GR3411_2012_512_HMAC = 0x8035;
|
||||
|
||||
/// <summary>
|
||||
/// Идентификатор алгоритма ключевого хэширования (HMAC, Hash-based Message Authentication Code) на базе алгоритма хэширования по ГОСТ Р 34.11
|
||||
/// </summary>
|
||||
public const int CALG_GR3411_HMAC34 = 0x8028;
|
||||
|
||||
/// <summary>
|
||||
/// Идентификатор алгоритма симметричного шифрования по ГОСТ 28147-89
|
||||
/// </summary>
|
||||
public const int CALG_G28147 = 0x661e;
|
||||
|
||||
/// <summary>
|
||||
/// Идентификатор алгоритма вычисления имитовставки по ГОСТ 28147-89
|
||||
/// </summary>
|
||||
public const int CALG_G28147_IMIT = 0x801f;
|
||||
|
||||
/// <summary>
|
||||
/// Идентификатор алгоритма экспорта ключа КриптоПро
|
||||
/// </summary>
|
||||
public const int CALG_PRO_EXPORT = 0x661f;
|
||||
|
||||
/// <summary>
|
||||
/// Идентификатор алгоритма экспорта ключа по ГОСТ 28147-89
|
||||
/// </summary>
|
||||
public const int CALG_SIMPLE_EXPORT = 0x6620;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Настройки контекста криптографического провайдера
|
||||
|
||||
/// <summary>
|
||||
/// Создать новый ключевой контейнер
|
||||
/// </summary>
|
||||
public const uint CRYPT_NEWKEYSET = 8;
|
||||
|
||||
/// <summary>
|
||||
/// Использовать ключи локальной машины
|
||||
/// </summary>
|
||||
public const uint CRYPT_MACHINE_KEYSET = 0x20;
|
||||
|
||||
/// <summary>
|
||||
/// Получить доступ к провайдеру без необходимости доступа к приватным ключам.
|
||||
/// </summary>
|
||||
public const uint CRYPT_VERIFYCONTEXT = 0xf0000000;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Параметры криптографического провайдера
|
||||
|
||||
public const int PP_CLIENT_HWND = 1;
|
||||
|
||||
/// <summary>
|
||||
/// Удаляет текущий контейнер с носителя
|
||||
/// </summary>
|
||||
public const int PP_DELETE_KEYSET = 0x7d;
|
||||
|
||||
/// <summary>
|
||||
/// Задаёт пароль (PIN) для доступа к ключу AT_KEYEXCHANGE
|
||||
/// </summary>
|
||||
public const int PP_KEYEXCHANGE_PIN = 0x20;
|
||||
|
||||
/// <summary>
|
||||
/// Задаёт пароль (PIN) для доступа к ключу AT_SIGNATURE
|
||||
/// </summary>
|
||||
public const int PP_SIGNATURE_PIN = 0x21;
|
||||
|
||||
/// <summary>
|
||||
/// Тип криптопровайдера
|
||||
/// </summary>
|
||||
public const int PP_PROVTYPE = 0x10;
|
||||
|
||||
/// <summary>
|
||||
/// Перечисление контейнеров криптопровайдера
|
||||
/// </summary>
|
||||
public const int PP_ENUMCONTAINERS = 0x2;
|
||||
|
||||
/// <summary>
|
||||
/// Получение первого элемента в перечислении
|
||||
/// </summary>
|
||||
public const uint CRYPT_FIRST = 0x1;
|
||||
|
||||
/// <summary>
|
||||
/// Получение следующего элемента в перечислении
|
||||
/// </summary>
|
||||
public const uint CRYPT_NEXT = 0x2;
|
||||
|
||||
/// <summary>
|
||||
/// Возвращает FQCN (Fully Qualified Container Name) контейнера VipNet
|
||||
/// </summary>
|
||||
public const uint CRYPT_UNIQUE = 0x8;
|
||||
|
||||
/// <summary>
|
||||
/// Возвращает FQCN (Fully Qualified Container Name) контейнера CryptoPro
|
||||
/// </summary>
|
||||
public const uint CRYPT_FQCN = 0x10;
|
||||
|
||||
/// <summary>
|
||||
/// В перечислении нет больше элементов
|
||||
/// </summary>
|
||||
public const uint ERROR_NO_MORE_ITEMS = 0x103;
|
||||
|
||||
/// <summary>
|
||||
/// Искомый сертификат не найден
|
||||
/// </summary>
|
||||
public const int ERROR_NO_SUCH_CERTIFICATE = -2146435028; // 8010002C
|
||||
|
||||
#endregion
|
||||
|
||||
#region Параметры функции хэширования криптографического провайдера
|
||||
|
||||
/// <summary>
|
||||
/// Стартовый вектор функции хэширования, устанавливаемый приложением
|
||||
/// </summary>
|
||||
public const int HP_HASHSTARTVECT = 8;
|
||||
|
||||
/// <summary>
|
||||
/// Значение функции хэширования в little-endian порядке байт в соотвествии с типом GostR3411-94-Digest CPCMS [RFC 4490]
|
||||
/// </summary>
|
||||
public const int HP_HASHVAL = 2;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Параметры функций шифрования криптографического провайдера
|
||||
|
||||
/// <summary>
|
||||
/// Признак ключей ГОСТ 28147-89 и мастер ключей TLS
|
||||
/// </summary>
|
||||
public const int G28147_MAGIC = 0x374A51FD;
|
||||
|
||||
/// <summary>
|
||||
/// Признак ключей ГОСТ Р 34.10-94 и ГОСТ Р 34.10-2001
|
||||
/// </summary>
|
||||
public const int GR3410_1_MAGIC = 0x3147414D;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Параметры транспортировки ключей
|
||||
|
||||
/// <summary>
|
||||
/// Используется для транспортировки симметричных ключей CALG_G28147, CALG_UECSYMMETRIC
|
||||
/// </summary>
|
||||
public const int SIMPLEBLOB = 1;
|
||||
|
||||
/// <summary>
|
||||
/// Используется для транспортировки открытых ключей
|
||||
/// </summary>
|
||||
public const int PUBLICKEYBLOB = 6;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Параметры ключей криптографического провайдера
|
||||
|
||||
/// <summary>
|
||||
/// Вектор инициализации (IV, синхропосылки) алгоритма шифрования
|
||||
/// </summary>
|
||||
public const int KP_IV = 1;
|
||||
|
||||
/// <summary>
|
||||
/// Метод дополнения шифра ключа
|
||||
/// </summary>
|
||||
public const int KP_PADDING = 3;
|
||||
|
||||
/// <summary>
|
||||
/// Режим шифра ключа
|
||||
/// </summary>
|
||||
public const int KP_MODE = 4;
|
||||
|
||||
/// <summary>
|
||||
/// Идентификатор алгоритма ключа
|
||||
/// </summary>
|
||||
public const int KP_ALGID = 7;
|
||||
|
||||
/// <summary>
|
||||
/// Идентификатор алгоритма экспорта для симметричного ключа
|
||||
/// </summary>
|
||||
public const int KP_EXPORTID = 108;
|
||||
|
||||
/// <summary>
|
||||
/// Строковый идентификатор узла замены
|
||||
/// </summary>
|
||||
public const int KP_CIPHEROID = 0x68;
|
||||
|
||||
/// <summary>
|
||||
/// Строковый идентификатор параметров ключа ГОСТ Р 34.10-2001, применяемых в алгоритме Диффи-Хеллмана
|
||||
/// </summary>
|
||||
public const int KP_DHOID = 0x6a;
|
||||
|
||||
/// <summary>
|
||||
/// Строковый идентификатор функции хэширования
|
||||
/// </summary>
|
||||
public const int KP_HASHOID = 0x67;
|
||||
|
||||
/// <summary>
|
||||
/// Закрытый ключ в ключевой паре
|
||||
/// </summary>
|
||||
public const int KP_X = 14;
|
||||
|
||||
/// <summary>
|
||||
/// Сертификат X.509 в формате Distinguished Encoding Rules (DER)
|
||||
/// </summary>
|
||||
public const int KP_CERTIFICATE = 0x1a;
|
||||
|
||||
/// <summary>
|
||||
/// Произведенный ключ может быть передан из криптопровайдера в ключевой блоб при экспорте ключа независимо от сессии криптопровайдера (исключает CRYPT_ARCHIVABLE)
|
||||
/// </summary>
|
||||
public const int CRYPT_EXPORTABLE = 1;
|
||||
|
||||
/// <summary>
|
||||
/// Произведенный ключ может быть передан из криптопровайдера в ключевой блоб при экспорте ключа в раках одной сессии криптопровайдера (исключает CRYPT_EXPORTABLE)
|
||||
/// </summary>
|
||||
public const int CRYPT_ARCHIVABLE = 0x4000;
|
||||
|
||||
/// <summary>
|
||||
/// При любом запросе на доступ к носителю закрытого ключа пользователя выводится окно диалога, запрашивающего право доступа к ключу
|
||||
/// </summary>
|
||||
public const int CRYPT_USER_PROTECTED = 2;
|
||||
|
||||
/// <summary>
|
||||
/// Генерация пустой ключевой пары обмена
|
||||
/// </summary>
|
||||
public const int CRYPT_PREGEN = 0x40;
|
||||
|
||||
/// <summary>
|
||||
/// Пара ключей для обмена ключами
|
||||
/// </summary>
|
||||
public const int AT_KEYEXCHANGE = 1;
|
||||
|
||||
/// <summary>
|
||||
/// Пара ключей для формирования цифровой подписи
|
||||
/// </summary>
|
||||
public const int AT_SIGNATURE = 2;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Методы дополнения шифра ключа (KP_PADDING)
|
||||
|
||||
/// <summary>
|
||||
/// PKCS#5
|
||||
/// </summary>
|
||||
public const int PKCS5_PADDING = 1;
|
||||
|
||||
/// <summary>
|
||||
/// Дополнение случайными байтами
|
||||
/// </summary>
|
||||
public const int RANDOM_PADDING = 2;
|
||||
|
||||
/// <summary>
|
||||
/// Дополнение нулевыми байтами
|
||||
/// </summary>
|
||||
public const int ZERO_PADDING = 3;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Режимы шифра ключа (KP_MODE)
|
||||
|
||||
/// <summary>
|
||||
/// Cipher Block Chaining (CBC)
|
||||
/// </summary>
|
||||
public const int CRYPT_MODE_CBC = 1;
|
||||
|
||||
/// <summary>
|
||||
/// Electronic codebook (ECB)
|
||||
/// </summary>
|
||||
public const int CRYPT_MODE_ECB = 2;
|
||||
|
||||
/// <summary>
|
||||
/// Output Feedback (OFB)
|
||||
/// </summary>
|
||||
public const int CRYPT_MODE_OFB = 3;
|
||||
|
||||
/// <summary>
|
||||
/// Cipher Feedback (CFB)
|
||||
/// </summary>
|
||||
public const int CRYPT_MODE_CFB = 4;
|
||||
|
||||
/// <summary>
|
||||
/// Ciphertext stealing (CTS)
|
||||
/// </summary>
|
||||
public const int CRYPT_MODE_CTS = 5;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Коды ошибок
|
||||
|
||||
/// <summary>
|
||||
/// Aлгоритм, который данный криптопровайдер не поддерживает
|
||||
/// </summary>
|
||||
public const int NTE_BAD_ALGID = -2146893816;
|
||||
|
||||
/// <summary>
|
||||
/// Данные некорректного размера
|
||||
/// </summary>
|
||||
public const int NTE_BAD_DATA = -2146893819;
|
||||
|
||||
/// <summary>
|
||||
/// Дескриптор хэша ошибочен
|
||||
/// </summary>
|
||||
public const int NTE_BAD_HASH = -2146893822;
|
||||
|
||||
/// <summary>
|
||||
/// Ключевой контейнер не был открыт или не существует
|
||||
/// </summary>
|
||||
public const int NTE_BAD_KEYSET = -2146893802;
|
||||
|
||||
/// <summary>
|
||||
/// Ключевой контейнер с заданным именем не существует
|
||||
/// </summary>
|
||||
public const int NTE_KEYSET_NOT_DEF = -2146893799;
|
||||
|
||||
/// <summary>
|
||||
/// Ключ с заданным параметром (AT_KEYEXCHANGE, AT_SIGNATURE или AT_UECSYMMETRICKEY) не существует
|
||||
/// </summary>
|
||||
public const int NTE_NO_KEY = -2146893811;
|
||||
|
||||
/// <summary>
|
||||
/// Пользователь прервал операцию
|
||||
/// </summary>
|
||||
public const int SCARD_W_CANCELLED_BY_USER = -2146434962;
|
||||
|
||||
#endregion
|
||||
|
||||
// ReSharper restore InconsistentNaming
|
||||
}
|
||||
}
|
||||
154
Hcs.Client/GostCryptography/Native/CryptoApi.cs
Normal file
154
Hcs.Client/GostCryptography/Native/CryptoApi.cs
Normal file
@ -0,0 +1,154 @@
|
||||
using System;
|
||||
using System.Runtime.ConstrainedExecution;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Security;
|
||||
using System.Text;
|
||||
|
||||
namespace GostCryptography.Native
|
||||
{
|
||||
/// <summary>
|
||||
/// Функции для работы с Microsoft CryptoAPI
|
||||
/// </summary>
|
||||
[SecurityCritical]
|
||||
public static class CryptoApi
|
||||
{
|
||||
// ReSharper disable InconsistentNaming
|
||||
|
||||
#region Для работы с криптографическим провайдером
|
||||
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||||
public static extern bool CryptAcquireContext([In][Out] ref SafeProvHandleImpl hProv, [In] string pszContainer, [In] string pszProvider, [In] uint dwProvType, [In] uint dwFlags);
|
||||
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
public static extern bool CryptReleaseContext(IntPtr hCryptProv, uint dwFlags);
|
||||
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
|
||||
[DllImport("advapi32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
|
||||
public static extern bool CryptContextAddRef([In] IntPtr hProv, [In] byte[] pdwReserved, [In] uint dwFlags);
|
||||
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
[DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
|
||||
public static extern bool CryptGetProvParam([In] SafeProvHandleImpl hProv, [In] uint dwParam, [In][Out] byte[] pbData, ref uint dwDataLen, [In] uint dwFlags);
|
||||
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
public static extern bool CryptGetProvParam([In] SafeProvHandleImpl hProv, [In] uint dwParam, [MarshalAs(UnmanagedType.LPStr)] StringBuilder pbData, ref uint dwDataLen, uint dwFlags);
|
||||
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
public static extern bool CryptGetProvParam([In] SafeProvHandleImpl hProv, [In] uint dwParam, [MarshalAs(UnmanagedType.U8)] long pbData, ref uint dwDataLen, uint dwFlags);
|
||||
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
public static extern bool CryptSetProvParam([In] SafeProvHandleImpl hProv, [In] uint dwParam, [In] IntPtr pbData, [In] uint dwFlags);
|
||||
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
|
||||
[DllImport("advapi32.dll", EntryPoint = "CryptSetProvParam", SetLastError = true)]
|
||||
public static extern bool CryptSetProvParam2(IntPtr hCryptProv, [In] uint dwParam, [In] byte[] pbData, [In] uint dwFlags);
|
||||
|
||||
#endregion
|
||||
|
||||
#region Для работы с функцией хэширования криптографического провайдера
|
||||
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
public static extern bool CryptCreateHash([In] SafeProvHandleImpl hProv, [In] uint Algid, [In] SafeKeyHandleImpl hKey, [In] uint dwFlags, [In][Out] ref SafeHashHandleImpl phHash);
|
||||
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
public static extern bool CryptDestroyHash(IntPtr pHashCtx);
|
||||
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
public static extern bool CryptGetHashParam([In] SafeHashHandleImpl hHash, [In] uint dwParam, [In][Out] byte[] pbData, ref uint pdwDataLen, [In] uint dwFlags);
|
||||
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
public static extern bool CryptSetHashParam([In] SafeHashHandleImpl hHash, [In] uint dwParam, [In][Out] byte[] pbData, [In] uint dwFlags);
|
||||
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
public static extern bool CryptHashData([In] SafeHashHandleImpl hHash, [In][Out] byte[] pbData, [In] uint dwDataLen, [In] uint dwFlags);
|
||||
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
public static extern unsafe bool CryptHashData([In] SafeHashHandleImpl hHash, byte* pbData, [In] uint dwDataLen, [In] uint dwFlags);
|
||||
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
public static extern bool CryptHashSessionKey([In] SafeHashHandleImpl hHash, [In] SafeKeyHandleImpl hKey, [In] uint dwFlags);
|
||||
|
||||
#endregion
|
||||
|
||||
#region Для работы с функцией шифрования криптографического провайдера
|
||||
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
public static extern bool CryptDecrypt([In] SafeKeyHandleImpl hKey, [In] SafeHashHandleImpl hHash, [In][MarshalAs(UnmanagedType.Bool)] bool Final, [In] uint dwFlags, [In][Out] byte[] pbData, ref uint pdwDataLen);
|
||||
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
public static extern bool CryptEncrypt([In] SafeKeyHandleImpl hKey, [In] SafeHashHandleImpl hHash, [In][MarshalAs(UnmanagedType.Bool)] bool Final, [In] uint dwFlags, [In][Out] byte[] pbData, ref uint pdwDataLen, [In] uint dwBufLen);
|
||||
|
||||
#endregion
|
||||
|
||||
#region Для работы с ключами криптографического провайдера
|
||||
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
public static extern bool CryptGenKey([In] SafeProvHandleImpl hProv, [In] uint Algid, [In] uint dwFlags, [In][Out] ref SafeKeyHandleImpl phKey);
|
||||
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
public static extern bool CryptGetUserKey([In] SafeProvHandleImpl hProv, [In] uint dwKeySpec, [In][Out] ref SafeKeyHandleImpl phUserKey);
|
||||
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
public static extern bool CryptDeriveKey([In] SafeProvHandleImpl hProv, [In] uint Algid, [In] SafeHashHandleImpl hBaseData, [In] uint dwFlags, [In][Out] ref SafeKeyHandleImpl phKey);
|
||||
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
public static extern bool CryptDuplicateKey([In] IntPtr hKey, [In] byte[] pdwReserved, [In] uint dwFlags, [In][Out] ref SafeKeyHandleImpl phKey);
|
||||
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
public static extern bool CryptDestroyKey(IntPtr pKeyCtx);
|
||||
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
public static extern bool CryptGetKeyParam([In] SafeKeyHandleImpl hKey, [In] uint dwParam, [In][Out] byte[] pbData, ref uint pdwDataLen, [In] uint dwFlags);
|
||||
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
public static extern bool CryptSetKeyParam([In] SafeKeyHandleImpl hKey, [In] uint dwParam, [In] byte[] pbData, [In] uint dwFlags);
|
||||
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
public static extern bool CryptExportKey([In] SafeKeyHandleImpl hKey, [In] SafeKeyHandleImpl hExpKey, [In] uint dwBlobType, [In] uint dwFlags, [Out] byte[] pbData, ref uint pdwDataLen);
|
||||
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
public static extern bool CryptImportKey([In] SafeProvHandleImpl hCryptProv, [In] byte[] pbData, [In] uint dwDataLen, [In] SafeKeyHandleImpl hPubKey, [In] uint dwFlags, [In][Out] ref SafeKeyHandleImpl phKey);
|
||||
|
||||
#endregion
|
||||
|
||||
#region Для работы с цифровой подписью
|
||||
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
[DllImport("advapi32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
|
||||
public static extern bool CryptSignHash([In] SafeHashHandleImpl hHash, [In] uint dwKeySpec, [MarshalAs(UnmanagedType.LPStr)] StringBuilder sDescription, [In] uint dwFlags, [In][Out] byte[] pbSignature, ref uint pdwSigLen);
|
||||
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
[DllImport("advapi32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
|
||||
public static extern bool CryptVerifySignature([In] SafeHashHandleImpl hHash, [In][Out] byte[] pbSignature, uint pdwSigLen, [In] SafeKeyHandleImpl hPubKey, [MarshalAs(UnmanagedType.LPStr)] StringBuilder sDescription, [In] uint dwFlags);
|
||||
|
||||
#endregion
|
||||
|
||||
// ReSharper restore InconsistentNaming
|
||||
}
|
||||
}
|
||||
1312
Hcs.Client/GostCryptography/Native/CryptoApiHelper.cs
Normal file
1312
Hcs.Client/GostCryptography/Native/CryptoApiHelper.cs
Normal file
File diff suppressed because it is too large
Load Diff
32
Hcs.Client/GostCryptography/Native/ISafeHandleProvider.cs
Normal file
32
Hcs.Client/GostCryptography/Native/ISafeHandleProvider.cs
Normal file
@ -0,0 +1,32 @@
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Security;
|
||||
|
||||
namespace GostCryptography.Native
|
||||
{
|
||||
/// <summary>
|
||||
/// Провайдер дескрипторов криптографического объекта
|
||||
/// </summary>
|
||||
/// <typeparam name="T">Тип безопасного дескриптора</typeparam>
|
||||
public interface ISafeHandleProvider<out T> where T : SafeHandle
|
||||
{
|
||||
/// <summary>
|
||||
/// Возвращает дескриптор объекта
|
||||
/// </summary>
|
||||
T SafeHandle { [SecurityCritical] get; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Методы расширения для <see cref="ISafeHandleProvider{T}"/>
|
||||
/// </summary>
|
||||
public static class SafeHandleProviderExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Возвращает дескриптор объекта
|
||||
/// </summary>
|
||||
[SecurityCritical]
|
||||
public static T GetSafeHandle<T>(this ISafeHandleProvider<T> provider) where T : SafeHandle
|
||||
{
|
||||
return provider.SafeHandle;
|
||||
}
|
||||
}
|
||||
}
|
||||
31
Hcs.Client/GostCryptography/Native/SafeHashHandleImpl.cs
Normal file
31
Hcs.Client/GostCryptography/Native/SafeHashHandleImpl.cs
Normal file
@ -0,0 +1,31 @@
|
||||
using Microsoft.Win32.SafeHandles;
|
||||
using System;
|
||||
using System.Security;
|
||||
|
||||
namespace GostCryptography.Native
|
||||
{
|
||||
/// <summary>
|
||||
/// Дескриптор функции хэширования криптографического провайдера
|
||||
/// </summary>
|
||||
[SecurityCritical]
|
||||
public class SafeHashHandleImpl : SafeHandleZeroOrMinusOneIsInvalid
|
||||
{
|
||||
public static SafeHashHandleImpl InvalidHandle => new SafeHashHandleImpl(IntPtr.Zero);
|
||||
|
||||
public SafeHashHandleImpl() : base(true)
|
||||
{
|
||||
}
|
||||
|
||||
public SafeHashHandleImpl(IntPtr handle) : base(true)
|
||||
{
|
||||
SetHandle(handle);
|
||||
}
|
||||
|
||||
[SecurityCritical]
|
||||
protected override bool ReleaseHandle()
|
||||
{
|
||||
CryptoApi.CryptDestroyHash(handle);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
36
Hcs.Client/GostCryptography/Native/SafeKeyHandleImpl.cs
Normal file
36
Hcs.Client/GostCryptography/Native/SafeKeyHandleImpl.cs
Normal file
@ -0,0 +1,36 @@
|
||||
using Microsoft.Win32.SafeHandles;
|
||||
using System;
|
||||
using System.Security;
|
||||
|
||||
namespace GostCryptography.Native
|
||||
{
|
||||
/// <summary>
|
||||
/// Дескриптор ключа криптографического провайдера
|
||||
/// </summary>
|
||||
[SecurityCritical]
|
||||
public sealed class SafeKeyHandleImpl : SafeHandleZeroOrMinusOneIsInvalid
|
||||
{
|
||||
public SafeKeyHandleImpl()
|
||||
: base(true)
|
||||
{
|
||||
}
|
||||
|
||||
public SafeKeyHandleImpl(IntPtr handle)
|
||||
: base(true)
|
||||
{
|
||||
SetHandle(handle);
|
||||
}
|
||||
|
||||
public static SafeKeyHandleImpl InvalidHandle
|
||||
{
|
||||
get { return new SafeKeyHandleImpl(IntPtr.Zero); }
|
||||
}
|
||||
|
||||
[SecurityCritical]
|
||||
protected override bool ReleaseHandle()
|
||||
{
|
||||
CryptoApi.CryptDestroyKey(handle);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
76
Hcs.Client/GostCryptography/Native/SafeProvHandleImpl.cs
Normal file
76
Hcs.Client/GostCryptography/Native/SafeProvHandleImpl.cs
Normal file
@ -0,0 +1,76 @@
|
||||
using Microsoft.Win32.SafeHandles;
|
||||
using System;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Security;
|
||||
|
||||
namespace GostCryptography.Native
|
||||
{
|
||||
/// <summary>
|
||||
/// Дескриптор криптографического провайдера
|
||||
/// </summary>
|
||||
[SecurityCritical]
|
||||
public sealed class SafeProvHandleImpl : SafeHandleZeroOrMinusOneIsInvalid
|
||||
{
|
||||
public static SafeProvHandleImpl InvalidHandle => new SafeProvHandleImpl(IntPtr.Zero);
|
||||
|
||||
public SafeProvHandleImpl() : base(true)
|
||||
{
|
||||
}
|
||||
|
||||
public SafeProvHandleImpl(IntPtr handle) : base(true)
|
||||
{
|
||||
SetHandle(handle);
|
||||
}
|
||||
|
||||
public SafeProvHandleImpl(IntPtr handle, bool addref) : base(true)
|
||||
{
|
||||
if (!addref)
|
||||
{
|
||||
SetHandle(handle);
|
||||
}
|
||||
else
|
||||
{
|
||||
bool success;
|
||||
int errorCode;
|
||||
|
||||
// Обеспечивает атомарность блока finally
|
||||
RuntimeHelpers.PrepareConstrainedRegions();
|
||||
|
||||
try { }
|
||||
finally
|
||||
{
|
||||
success = CryptoApi.CryptContextAddRef(handle, null, 0);
|
||||
errorCode = Marshal.GetLastWin32Error();
|
||||
|
||||
if (success)
|
||||
{
|
||||
SetHandle(handle);
|
||||
}
|
||||
}
|
||||
|
||||
if (!success)
|
||||
{
|
||||
throw ExceptionUtility.CryptographicException(errorCode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool DeleteOnClose { get; set; }
|
||||
|
||||
[SecurityCritical]
|
||||
protected override bool ReleaseHandle()
|
||||
{
|
||||
if (DeleteOnClose)
|
||||
{
|
||||
CryptoApi.CryptSetProvParam2(handle, Constants.PP_DELETE_KEYSET, null, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
CryptoApi.CryptReleaseContext(handle, 0);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user