/// <summary> /// Инициализация алгоритма с параметрами заданными /// внутри реализации CSP. /// </summary> public Gost3410EphemeralCryptoServiceProvider() { _safeKeyHandle = SafeKeyHandle.InvalidHandle; CapiHelper.GenerateKey(_safeProvHandle, GostConstants.CALG_DH_EL_EPHEM, (CspProviderFlags)0, GostConstants.GOST_3410EL_SIZE, out _safeKeyHandle); }
/// <summary> /// Инициализация алгоритма с параметрами заданными /// внутри реализации CSP. /// </summary> public Gost3410_2012_512EphemeralCryptoServiceProvider() { _safeKeyHandle = SafeKeyHandle.InvalidHandle; CapiHelper.GenerateKey(_safeProvHandle, GostConstants.ALG_SID_DH_GR3410_12_512_EPHEM, (CspProviderFlags)0, GostConstants.GOST3410_2012_512KEY_SIZE, out _safeKeyHandle); }
public override void GenerateKey() { CapiHelper.GenerateKey(SafeProvHandle, GostConstants.CALG_G28147, CspProviderFlags.NoFlags, GostConstants.G28147_KEYLEN * BitsPerByte, out _safeKeyHandle); KeyValue = null; KeySizeValue = GostConstants.G28147_KEYLEN * BitsPerByte; }
/// <summary> /// Инициализация алгоритма с заданными параметрами. /// </summary> /// <param name="basedOn">Параметры алгоритма, на основе которого /// будет сформирована секретная ключевая пара. Используется /// OID хэширования и открытого ключа, остальные параметры не /// используются.</param> public Gost3410EphemeralCryptoServiceProvider(Gost3410Parameters basedOn) { _safeKeyHandle = SafeKeyHandle.InvalidHandle; _safeProvHandle = AcquireSafeProviderHandle(); // Генерация эфимерного ключа без возможности экспорта бессмысленна. // Остальные флаги не тащим. CapiHelper.GenerateKey(_safeProvHandle, GostConstants.CALG_DH_EL_EPHEM, CspProviderFlags.NoFlags, GostConstants.GOST_3410EL_SIZE, basedOn.DigestParamSet, basedOn.PublicKeyParamSet, out _safeKeyHandle); }
private static ICryptoTransform CreateTransformCore( SafeProvHandle hProv, SafeKeyHandle hKey, CipherMode mode, PaddingMode padding, byte[] rgbIV, int blockSize, int feedbackSize, bool encrypting) { //#Q_ ToDo выжечь огнём этот ад с двумя масивами для передачи параметров в GostCryptoAPITransform // переделать на словарь, или в идеале просто явно передавать параметры через структуру, но не этот ужас int num1 = 0; int[] numArray1 = new int[10]; object[] objArray1 = new object[10]; // Не поддерживаем CTS. Выдаем приличное исключение. if (mode == CipherMode.CTS) { throw new ArgumentException( SR.Argument_InvalidValue, nameof(mode)); //SR.Cryptography_CSP_CTSNotSupported } // Поддерживаем только правильные пары Padding - mode if (mode == CipherMode.OFB || mode == CipherMode.CFB) { if (padding != PaddingMode.None) { throw new CryptographicException( SR.Cryptography_InvalidPaddingMode); } } // Сбрасываем Pading, мы сами его поддерживаем. numArray1[num1] = GostConstants.KP_PADDING; objArray1[num1] = GostConstants.WINCRYPT_PADDING_ZERO; num1++; // Поддерживаем только CFB с feedback по ГОСТ. if ((mode == CipherMode.CFB) && (feedbackSize != DefFeedbackSize)) { throw new ArgumentException(SR.Argument_InvalidValue, nameof(feedbackSize)); } // Нет ключа, генерим. if (hKey == null) { CapiHelper.GenerateKey(hProv, GostConstants.CALG_G28147, CspProviderFlags.NoFlags, GostConstants.G28147_KEYLEN * BitsPerByte, out hKey); } // Ключ приходит как Handle, поэтому длины не проверяем. // Mode ставим всегда, так как при создании ключа по Handle // он может быть другим. numArray1[num1] = GostConstants.KP_MODE; objArray1[num1] = mode; num1++; // Для всех mode кроме ECB требуется синхропосылка. Устанавливаем. if (mode != CipherMode.ECB) { // Если ее нет, то генерим. if (rgbIV == null) { if (!encrypting) { // при расшифровании IV должен быть задан throw new CryptographicException(SR.Cryptography_MissingIV); } // Не используем GenerateIV: классовая и переданная // IV могут отличаться. rgbIV = new byte[IVSize / 8]; using (var rng = new GostRngCryptoServiceProvider(hProv)) { rng.GetBytes(rgbIV); } } // проверяем достаточность по длине. if (rgbIV.Length < IVSize / BitsPerByte) { throw new CryptographicException( SR.Cryptography_InvalidIVSize); } numArray1[num1] = GostConstants.KP_SV; objArray1[num1] = rgbIV; num1++; } // Можно еще установить для CFB количество бит зацепления, но // оно всегда равно 64 и его установка не поддерживается CSP. return(new GostCryptoAPITransform(num1, numArray1, objArray1, hKey, hProv, padding, mode, blockSize, encrypting)); }