Пример #1
0
        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();
            }
        }
Пример #3
0
        /// <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)));
        }
Пример #4
0
 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);
     }
 }
Пример #5
0
 /// <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();
     }
 }
Пример #6
0
 public void Dispose()
 {
     _keyHandle.Dispose();
 }
Пример #7
0
        [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);
            }
        }
 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);
     }
 }