Beispiel #1
0
        /// <summary>
        /// Упаковка в SIMPLE_BLOB.
        /// </summary>
        /// <returns>Байтовый массив SIMPLE_BLOB.</returns>
        /// <exception cref="System.Security.Cryptography.CryptographicException">При ошибках
        /// кодирования структуры.</exception>
        ///
        /// <cspversions />
        public byte[] GetCryptoServiceProviderBlob()
        {
            GostWrappedKeyObject obj = new GostWrappedKeyObject();

            obj.WrappedKey = this;
            return(AsnHelper.EncodeSimpleBlob(obj,
                                              GostConstants.CALG_G28147));
        }
Beispiel #2
0
        /// <summary>
        /// Распаковка объекта из SIMPLE_BLOB.
        /// </summary>
        /// <param name="data">Данные, закодированный SIMPLE_BLOB.</param>
        /// <exception cref="System.Security.Cryptography.CryptographicException">При ошибках
        /// декодирования структуры.</exception>
        /// <argnull name="data" />
        ///
        /// <cspversions />
        public void SetByCryptoServiceProviderBlob(byte[] data)
        {
            if (data == null)
            {
                throw new ArgumentNullException("data");
            }
            GostWrappedKeyObject obj = new GostWrappedKeyObject();

            AsnHelper.DecodeSimpleBlob(obj, data);
            this = obj.WrappedKey;
        }
Beispiel #3
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)));
        }
Beispiel #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);
        }
Beispiel #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)));
        }
Beispiel #6
0
 /// <summary>
 /// Получение структуры зашифрованного ключа на основе
 /// ASN.1 структуру Gost3410-KeyWrap.
 /// </summary>
 /// <param name="data">ASN.1 структура Gost3410-KeyWrap</param>
 public void SetByXmlWrappedKey(byte[] data)
 {
     AsnHelper.DecodeXmlGostR3410WrappedKey(data, this);
 }
Beispiel #7
0
 /// <summary>
 /// Упаковка в ASN.1 структуру Gost3410-KeyWrap.
 /// </summary>
 /// <returns>Байтовый массив ASN.1 структуры Gost3410-KeyWrap.</returns>
 public byte[] GetXmlWrappedKey()
 {
     return(AsnHelper.EncodeXmlGostR3410WrappedKey(this));
 }
Beispiel #8
0
 /// <summary>
 /// Восстанавливает объект класса <see cref="GostKeyTransport"/>
 /// из байтового массива.
 /// </summary>
 ///
 /// <param name="data">Данные для обмена в виде байтового
 /// массива.</param>
 ///
 /// <returns>Данные для обмена в объекта класса
 /// <see cref="GostKeyTransport"/>.</returns>
 public void Decode(byte[] data)
 {
     AsnHelper.DecodeGostKeyTransport(data, this);
 }
Beispiel #9
0
 /// <summary>
 /// Преобразует объект класса <see cref="GostKeyTransport"/>
 /// в байтовый массив.
 /// </summary>
 ///
 /// <returns>Данные обмена ключами в виде байтового массива.</returns>
 public virtual byte[] Encode()
 {
     return(AsnHelper.EncodeGostKeyTransport(this));
 }