public void Dispose() { if (_currentIv is not null) { CryptographicOperations.ZeroMemory(_currentIv); } _hKey?.Dispose(); _hKey = null !; }
/// <summary> /// Освобождает неуправляемые объектом класса /// <see cref="Gost3410_2012_512CryptoServiceProvider"/> ресурсы и, по выбору, /// управляемые. /// </summary> /// <param name="disposing"><see langword="true"/>, чтобы освободить /// и управляемые, и неупавляемые ресурсы; <see langword="false"/>, /// чтобы освободить только неуправляемые.</param> protected override void Dispose(bool disposing) { base.Dispose(disposing); if (_safeKeyHandle != null && !_safeKeyHandle.IsClosed) { _safeKeyHandle.Dispose(); } if (_safeProvHandle != null && !_safeProvHandle.IsClosed) { _safeProvHandle.Dispose(); } }
/// <summary> /// Импорт параметров <see cref="Gost3410Parameters"/> /// алгоритма ГОСТ Р 34.10-2012 512. /// </summary> /// /// <param name="parameters">Параметры алгоритма /// ГОСТ Р 34.10-2012 512</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_512CryptoServiceProvider.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_512); 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))); }
internal static void ImportCspBlobHelper(CspAlgorithmType keyType, byte[] keyBlob, bool publicOnly, ref CspParameters parameters, bool randomKeyContainer, ref SafeProvHandle safeProvHandle, ref SafeKeyHandle safeKeyHandle) { if ((safeKeyHandle != null) && !safeKeyHandle.IsClosed) { safeKeyHandle.Dispose(); } safeKeyHandle = SafeKeyHandle.InvalidHandle; if (publicOnly) { parameters.KeyNumber = _ImportCspBlob(keyBlob, (keyType == CspAlgorithmType.Dss) ? StaticDssProvHandle : StaticProvHandle, CspProviderFlags.NoFlags, ref safeKeyHandle); } else { KeyContainerPermission permission = new KeyContainerPermission(KeyContainerPermissionFlags.NoFlags); KeyContainerPermissionAccessEntry accessEntry = new KeyContainerPermissionAccessEntry(parameters, KeyContainerPermissionFlags.Import); permission.AccessEntries.Add(accessEntry); permission.Demand(); if (safeProvHandle == null) { safeProvHandle = CreateProvHandle(parameters, randomKeyContainer); } parameters.KeyNumber = _ImportCspBlob(keyBlob, safeProvHandle, parameters.Flags, ref safeKeyHandle); } }
/// <summary> /// Освобождение ресурсов занятых экземпляром класса. /// </summary> /// /// <param name="disposing"><see langword="true"/>, если разрешен /// доступ к другим объектам, <see langword="false"/> - другие /// объекты могут быть уничтожены. /// </param> private void Dispose(bool disposing) { if (disposing) { if (_ivValue != null) { Array.Clear(_ivValue, 0, _ivValue.Length); _ivValue = null; } if (depadBuffer_ != null) { Array.Clear(depadBuffer_, 0, depadBuffer_.Length); depadBuffer_ = null; } } if ((safeKeyHandle_ != null) && !safeKeyHandle_.IsClosed) { safeKeyHandle_.Dispose(); } if ((_safeProvHandle != null) && !_safeProvHandle.IsClosed) { _safeProvHandle.Dispose(); } }
public void Dispose() { _keyHandle.Dispose(); }
[System.Security.SecurityCritical] // auto-generated internal static void ImportCspBlobHelper (CspAlgorithmType keyType, byte[] keyBlob, bool publicOnly, ref CspParameters parameters, bool randomKeyContainer, ref SafeProvHandle safeProvHandle, ref SafeKeyHandle safeKeyHandle) { // Free the current key handle if (safeKeyHandle != null && !safeKeyHandle.IsClosed) safeKeyHandle.Dispose(); safeKeyHandle = SafeKeyHandle.InvalidHandle; if (publicOnly) { parameters.KeyNumber = Utils._ImportCspBlob(keyBlob, keyType == CspAlgorithmType.Dss ? Utils.StaticDssProvHandle : Utils.StaticProvHandle, (CspProviderFlags) 0, ref safeKeyHandle); } else { if (!CompatibilitySwitches.IsAppEarlierThanWindowsPhone8) { KeyContainerPermission kp = new KeyContainerPermission(KeyContainerPermissionFlags.NoFlags); KeyContainerPermissionAccessEntry entry = new KeyContainerPermissionAccessEntry(parameters, KeyContainerPermissionFlags.Import); kp.AccessEntries.Add(entry); kp.Demand(); } if (safeProvHandle == null) safeProvHandle = Utils.CreateProvHandle(parameters, randomKeyContainer); parameters.KeyNumber = Utils._ImportCspBlob(keyBlob, safeProvHandle, parameters.Flags, ref safeKeyHandle); } }