コード例 #1
0
        /// <summary>
        /// Создание распределенного секрета по HANDLE ключа в CSP
        /// </summary>
        /// <param name="key">HANDLE секретного ключа в CSP.</param>
        /// <param name="prov">HANDLE провайдера (CSP), внутри которого
        /// существует ключ.</param>
        /// <param name="publicObject">Открытый ключ.</param>
        /// <param name="algType"></param>
        ///
        /// <argnull name="key" />
        /// <argnull name="prov" />
        /// <argnull name="publicObject" />
        /// <exception cref="CryptographicException">При ошибках на native
        /// уровне.</exception>
        ///
        /// <unmanagedperm action="LinkDemand" />
        internal GostSharedSecretCryptoServiceProvider(SafeKeyHandle key,
                                                       SafeProvHandle prov, Gost3410CspObject publicObject, CspAlgorithmType algType)
        {
            if (key == null)
            {
                throw new ArgumentNullException("key");
            }
            if (prov == null)
            {
                throw new ArgumentNullException("prov");
            }
            if (publicObject == null)
            {
                throw new ArgumentNullException("publicObject");
            }
            // В связи с отсутствием DuplicateKey, используем грязный хак
            _safeKeyHandle = key;
            bool isinc = false;

            _safeKeyHandle.DangerousAddRef(ref isinc);
            _safeProvHandle = prov;
            _safeProvHandle.DangerousAddRef(ref isinc);
            _publicObject = publicObject;
            _algType      = algType;
        }
コード例 #2
0
        /// <summary>
        /// Создание ключа согласования.
        /// </summary>
        ///
        /// <param name="alg">Параметры открытого ключа.</param>
        ///
        /// <returns>Распределенный секрет.</returns>
        ///
        /// <intdoc>Не проверяем возможность SharedSecret,
        /// мы используем из контейнера только открытый ключ.</intdoc>
        public override GostSharedSecretAlgorithm CreateAgree(
            Gost3410Parameters alg)
        {
            // Превращаем его в объект для экспорта.
            Gost3410CspObject obj1 = new Gost3410CspObject(alg);

            return(new GostSharedSecretCryptoServiceProvider(_safeKeyHandle,
                                                             _safeProvHandle, obj1, CspAlgorithmType.Gost2001));
        }
コード例 #3
0
        /// <summary>
        /// Экспорт параметров алгоритма.
        /// </summary>
        ///
        /// <param name="includePrivateParameters"><see langword="true"/>,
        /// для экспорта секретного ключа.</param>
        ///
        /// <returns>Параметры алгоритма.</returns>
        ///
        /// <exception cref="CryptographicException">При экспорте
        /// секретного ключа.</exception>
        ///
        /// <remarks>
        /// <if notdefined="userexp"><para>По соображениям безопасности
        /// в данной сборке при экспорте
        /// секретного ключа всегда возбуждает исключение
        /// <see cref="CryptographicException"/>.</para></if>
        /// </remarks>
        public override Gost3410Parameters ExportParameters(
            bool includePrivateParameters)
        {
            if (includePrivateParameters)
            {
                throw new CryptographicException(SR.Argument_InvalidValue, "includePrivateParameters equal true ");
            }
            Gost3410CspObject obj1 = new Gost3410CspObject();

            CapiHelper.ExportPublicKey(_safeKeyHandle, obj1, CspAlgorithmType.Gost2001);
            return(obj1.Parameters);
        }
コード例 #4
0
        /// <summary>
        /// Экспорт параметров <see cref="Gost3410Parameters"/>
        /// алгоритма ГОСТ Р 34.10-2012 256 в CSP.
        /// </summary>
        ///
        /// <param name="includePrivateParameters"><see langword="true"/>,
        /// чтобы включить секретный ключ, <see langword="false"/> - для
        /// экспорта только открытого ключа и его параметров.</param>
        ///
        /// <returns>Параметры в виде структуры
        /// <see cref="Gost3410Parameters"/></returns>
        ///
        /// <remarks>
        /// <if notdefined="userexp"><para>По соображениям безопасности
        /// в данной сборке при экспорте
        /// секретного ключа всегда возбуждает исключение
        /// <see cref="CryptographicException"/>.</para></if>
        /// </remarks>
        ///
        /// <doc-sample path="Simple\DocBlock" name="ExportParameters"
        /// region="ExportParameters" />
        ///
        /// <containerperm flag="Open">Для открытия существующего
        /// контейнера.</containerperm>
        /// <containerperm flag="Create">Для создания контейнера с заданным
        /// (не случаыным именем).</containerperm>
        /// <containerperm flag="Export">Для экспорта секретного ключа.
        /// </containerperm>
        public override Gost3410Parameters ExportParameters(bool includePrivateParameters)
        {
            GetKeyPair();
            Gost3410CspObject obj1 = new Gost3410CspObject();

            if (includePrivateParameters)
            {
                throw new CryptographicException(SR.Argument_InvalidValue, "includePrivateParameters equal true ");
            }

            byte[] data = ExportCspBlob(false);
            AsnHelper.DecodePublicBlob(obj1, data, CspAlgorithmType.Gost2012_256);

            return(obj1.Parameters);

            //byte[] cspBlob = ExportCspBlob(includePrivateParameters);
            //return cspBlob.ToGost3410Parameters(includePrivateParameters);
        }
コード例 #5
0
        /// <summary>
        /// Импорт параметров <see cref="Gost3410Parameters"/>
        /// алгоритма ГОСТ Р 34.10-2012 256.
        /// </summary>
        ///
        /// <param name="parameters">Параметры алгоритма
        /// ГОСТ Р 34.10-2012 256</param>
        ///
        /// <doc-sample path="Simple\DocBlock" name="ImportParameters"
        /// region="ImportParameters" />
        ///
        /// <exception cref="CryptographicException">При импорте секретного
        /// ключа.</exception>
        ///
        /// <remarks>
        /// <if notdefined="userimp"><para>В данной сборке при импорте
        /// секретного ключа всегда возбуждает исключение
        /// <see cref="CryptographicException"/>.</para></if>
        /// </remarks>
        ///
        /// <containerperm flag="Open">Для открытия существующего
        /// контейнера.</containerperm>
        /// <containerperm flag="Create">Для создания контейнера с заданным
        /// (не случайным именем).</containerperm>
        /// <containerperm flag="Import">Для импорта секретного ключа.
        /// </containerperm>
        public override void ImportParameters(Gost3410Parameters parameters)
        {
            Gost3410CspObject pubKey = new Gost3410CspObject(parameters);

            if ((_safeKeyHandle != null) && !_safeKeyHandle.IsClosed)
            {
                _safeKeyHandle.Dispose();
            }

            _safeKeyHandle = SafeKeyHandle.InvalidHandle;
            if (Gost3410_2012_256CryptoServiceProvider.IsPublic(parameters))
            {
                SafeKeyHandle safeKeyHandle;
                // Это открытый ключ, поэтому можно его export
                // в verify context.
                // Нет обращения к секретному ключу, поэтому
                // не создаем контейнер без надобности.
                var safeProvHandleTemp = AcquireSafeProviderHandle();
                if (pubKey == null)
                {
                    throw new ArgumentNullException(nameof(pubKey));
                }

                byte[] keyBlob = AsnHelper.EncodePublicBlob(pubKey, CspAlgorithmType.Gost2012_256);
                CapiHelper.ImportKeyBlob(
                    safeProvHandleTemp,
                    CspProviderFlags.NoFlags,
                    false,
                    keyBlob,
                    out safeKeyHandle);

                _safeKeyHandle = safeKeyHandle;
                _publicOnly    = true;
                return;
            }

            throw new CryptographicException(SR.CspParameter_invalid, "Cryptography_UserExportBulkBlob");
            //throw new PlatformNotSupportedException(SR.Format(SR.Cryptography_CAPI_Required, nameof(CspKeyContainerInfo)));
        }