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