/// <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); } }
/// <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> /// 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; }
/// <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))); }