public void DeriveFromPassword(byte[] password)
        {
            var provider = CreateFromPassword(password);

            _keyHandle.TryDispose();
            _provHandle.TryDispose();

            _keyHandle  = provider._keyHandle;
            _provHandle = provider._provHandle;

            provider._keyHandle  = SafeKeyHandleImpl.InvalidHandle;
            provider._provHandle = SafeProvHandleImpl.InvalidHandle;
        }
Example #2
0
        public override void ImportParameters(Asn1.Common.GostKeyExchangeParameters keyParameters)
        {
            if (keyParameters.PrivateKey != null)
            {
                throw ExceptionUtility.NotSupported(Resources.UserImportBulkKeyNotSupported);
            }

            _keyHandle.TryDispose();

            _providerHandle = CryptoApiHelper.ProviderHandle;
            _keyHandle      = CryptoApiHelper.ImportPublicKey(_providerHandle, new Asn1.Common.GostKeyExchangeParameters(keyParameters));

            _isPublicKeyOnly = true;
        }
Example #3
0
        protected override void Dispose(bool disposing)
        {
            _keyHandle.TryDispose();
            _provHandle.TryDispose();

            base.Dispose(disposing);
        }
Example #4
0
        public override void ImportParameters(TKeyParams keyParameters)
        {
            if (keyParameters.PrivateKey != null)
            {
                throw ExceptionUtility.NotSupported(Resources.UserImportBulkKeyNotSupported);
            }

            _keyHandle.TryDispose();

            var hProv = CryptoApiHelper.GetProviderHandle(ProviderType);

            var importedKeyBytes = CryptoApiHelper.EncodePublicBlob(keyParameters.Clone(), KeySizeValue, SignatureAlgId);

            _providerParameters.KeyNumber = CryptoApiHelper.ImportCspBlob(importedKeyBytes, hProv, SafeKeyHandleImpl.InvalidHandle, out var keyHandle);
            _providerHandle = hProv;
            _keyHandle      = keyHandle;

            _isPublicKeyOnly = true;
        }
Example #5
0
        protected void UsingKey(Action <SafeKeyHandleImpl> operation)
        {
            if (_keyHandleFunc == null)
            {
                throw new NullReferenceException("Cannot access key: handle function not found");
            }

            SafeKeyHandleImpl keyHandle = _keyHandleFunc();

            operation(keyHandle);
            keyHandle.TryDispose();
        }
        private void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (_ivValue != null)
                {
                    Array.Clear(_ivValue, 0, _ivValue.Length);
                    _ivValue = null;
                }

                if (_dataBuffer != null)
                {
                    Array.Clear(_dataBuffer, 0, _dataBuffer.Length);
                    _dataBuffer = null;
                }
            }

            _keyHandle.TryDispose();
        }
Example #7
0
        private byte[] EncodeKeyExchangeInternal(Gost28147SymmetricAlgorithm keyExchangeAlgorithm, int keyExchangeExportAlgId)
        {
            GostKeyExchangeInfo keyExchangeInfo;

            SafeKeyHandleImpl keyExchangeHandle = null;

            try
            {
                keyExchangeHandle = CryptoApiHelper.ImportAndMakeKeyExchange(_provHandle, _keyExchangeParameters, _keyHandle);
                CryptoApiHelper.SetKeyParameterInt32(keyExchangeHandle, Constants.KP_ALGID, keyExchangeExportAlgId);

                var symKeyHandle = keyExchangeAlgorithm.InternalKeyHandle;
                keyExchangeInfo = CryptoApiHelper.ExportKeyExchange(symKeyHandle, keyExchangeHandle);
            }
            finally
            {
                keyExchangeHandle.TryDispose();
            }

            return(keyExchangeInfo.Encode());
        }
        private byte[] EncodeKeyExchangeInternal(Gost_28147_89_SymmetricAlgorithm keyExchangeAlgorithm, int keyExchangeExportAlgId)
        {
            Gost_28147_89_KeyExchangeInfo keyExchangeInfo;

            SafeKeyHandleImpl keyExchangeHandle = null;

            try
            {
                var importedKeyBytes = CryptoApiHelper.EncodePublicBlob(_keyExchangeParameters, _keySize, _signatureAlgId);
                CryptoApiHelper.ImportCspBlob(importedKeyBytes, _provHandle, _keyHandle, out keyExchangeHandle);
                CryptoApiHelper.SetKeyExchangeExportAlgId(ProviderType, keyExchangeHandle, keyExchangeExportAlgId);

                var symKeyHandle = keyExchangeAlgorithm.GetSafeHandle();
                keyExchangeInfo = CryptoApiHelper.ExportKeyExchange(symKeyHandle, keyExchangeHandle);
            }
            finally
            {
                keyExchangeHandle.TryDispose();
            }

            return(keyExchangeInfo.Encode());
        }
Example #9
0
        private SymmetricAlgorithm DecodeKeyExchangeInternal(byte[] encodedKeyExchangeData, int keyExchangeExportAlgId)
        {
            var keyExchangeInfo = new GostKeyExchangeInfo();

            keyExchangeInfo.Decode(encodedKeyExchangeData);

            SafeKeyHandleImpl symKeyHandle;
            SafeKeyHandleImpl keyExchangeHandle = null;

            try
            {
                keyExchangeHandle = CryptoApiHelper.ImportAndMakeKeyExchange(_provHandle, _keyExchangeParameters, _keyHandle);
                CryptoApiHelper.SetKeyParameterInt32(keyExchangeHandle, Constants.KP_ALGID, keyExchangeExportAlgId);

                symKeyHandle = CryptoApiHelper.ImportKeyExchange(_provHandle, keyExchangeInfo, keyExchangeHandle);
            }
            finally
            {
                keyExchangeHandle.TryDispose();
            }

            return(new Gost28147SymmetricAlgorithm(_provHandle, symKeyHandle));
        }
        private SymmetricAlgorithm DecodeKeyExchangeInternal(byte[] encodedKeyExchangeData, int keyExchangeExportAlgId)
        {
            var keyExchangeInfo = new Gost_28147_89_KeyExchangeInfo();

            keyExchangeInfo.Decode(encodedKeyExchangeData);

            SafeKeyHandleImpl symKeyHandle;
            SafeKeyHandleImpl keyExchangeHandle = null;

            try
            {
                var importedKeyBytes = CryptoApiHelper.EncodePublicBlob(_keyExchangeParameters, _keySize, _signatureAlgId);
                CryptoApiHelper.ImportCspBlob(importedKeyBytes, _provHandle, _keyHandle, out keyExchangeHandle);
                CryptoApiHelper.SetKeyExchangeExportAlgId(ProviderType, keyExchangeHandle, keyExchangeExportAlgId);

                symKeyHandle = CryptoApiHelper.ImportKeyExchange(_provHandle, keyExchangeInfo, keyExchangeHandle);
            }
            finally
            {
                keyExchangeHandle.TryDispose();
            }

            return(new Gost_28147_89_SymmetricAlgorithm(ProviderType, _provHandle, symKeyHandle));
        }