コード例 #1
0
        /// <summary>
        /// Imports a blob that represents RSA key information
        /// </summary>
        /// <param name="keyBlob"></param>
        public void ImportCspBlob(byte[] keyBlob)
        {
            // Free the current key handle
            if (_safeKeyHandle != null && !_safeKeyHandle.IsClosed)
            {
                _safeKeyHandle.Dispose();
                _safeKeyHandle = null;
            }
            _safeKeyHandle = SafeKeyHandle.InvalidHandle;

            if (IsPublic(keyBlob))
            {
                SafeProvHandle safeProvHandleTemp = SafeProvHandle.InvalidHandle;
                AcquireSafeProviderHandle(ref safeProvHandleTemp);
                CapiHelper.ImportKeyBlob(safeProvHandleTemp, (CspProviderFlags)0, keyBlob, ref _safeKeyHandle);
                _safeProvHandle = safeProvHandleTemp;
            }
            else
            {
                if (_safeProvHandle == null)
                {
                    _safeProvHandle = CapiHelper.CreateProvHandle(_parameters, _randomKeyContainer);
                }
                CapiHelper.ImportKeyBlob(_safeProvHandle, _parameters.Flags, keyBlob, ref _safeKeyHandle);
            }
        }
コード例 #2
0
        /// <summary>
        /// Импорт параметров алгоритма ГОСТ Р 34.10.
        /// </summary>
        ///
        /// <param name="keyBlob">Байтовый массив, содержащий ключ
        /// алгоритма ГОСТ Р 34.10 без параметров. </param>.
        ///
        /// <param name="paramBlob">Байтовый массив, параметры ключа
        /// алгоритма ГОСТ Р 34.10 без параметров. </param>.
        ///
        /// <remarks><para>Импорт секретного ключа не поддерживается.
        /// </para></remarks>
        ///
        /// <exception cref="CryptographicException">При экспорте секретного
        /// ключа.</exception>
        public void ImportCspBlob(byte[] keyBlob, byte[] paramBlob)
        {
            SafeKeyHandle safeKeyHandle;
            var           rawData = AsnHelper.EncodePublicBlob(keyBlob, paramBlob, CspAlgorithmType.Gost2001);

            // Права на экспорт / импорт проверять бесполезно
            // CSP все равно не поддерживает. Бесполезно да же эмулировать:
            // сделать с этим BLOB потом ничего нельзя.

            // Это открытый ключ, поэтому можно его export
            // в verify context.
            // Нет обращения к секретному ключу, поэтому
            // не создаем контейнер без надобности.
            if (IsPublic(rawData))
            {
                SafeProvHandle safeProvHandleTemp = AcquireSafeProviderHandle();

                CapiHelper.ImportKeyBlob(
                    safeProvHandleTemp,
                    CspProviderFlags.NoFlags,
                    false,
                    rawData,
                    out safeKeyHandle);

                //The property set will take care of releasing any already-existing resources.
                _safeProvHandle = safeProvHandleTemp;
            }
            else
            {
                throw new CryptographicException(SR.CspParameter_invalid, "Cryptography_UserExportBulkBlob");
            }

            // The property set will take care of releasing any already-existing resources.
            _safeKeyHandle = safeKeyHandle;

            if (_parameters != null)
            {
                _parameters.KeyNumber = SafeKeyHandle.KeySpec;
            }

            // Эмулируем MS HANDLE
            SafeKeyHandle.PublicOnly = true;
            //throw new PlatformNotSupportedException(
            //    SR.Format(SR.Cryptography_CAPI_Required, nameof(CspKeyContainerInfo)));
        }
コード例 #3
0
        /// <summary>
        /// Imports a blob that represents DSA key information.
        /// </summary>
        /// <param name="keyBlob">A byte array that represents a DSA key blob.</param>
        public void ImportCspBlob(byte[] keyBlob)
        {
            SafeKeyHandle safeKeyHandle;

            if (IsPublic(keyBlob))
            {
                SafeProvHandle safeProvHandleTemp = AcquireSafeProviderHandle();
                CapiHelper.ImportKeyBlob(safeProvHandleTemp, (CspProviderFlags)0, false, keyBlob, out safeKeyHandle);

                // The property set will take care of releasing any already-existing resources.
                SafeProvHandle = safeProvHandleTemp;
            }
            else
            {
                CapiHelper.ImportKeyBlob(SafeProvHandle, _parameters.Flags, false, keyBlob, out safeKeyHandle);
            }

            // The property set will take care of releasing any already-existing resources.
            SafeKeyHandle = safeKeyHandle;
        }
コード例 #4
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)));
        }