示例#1
0
 /// <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);
 }
示例#3
0
 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;
 }
示例#4
0
        /// <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);
        }
示例#5
0
        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));
        }