diff --git a/mRemoteNGTests/Config/CredentialHarvesterTests.cs b/mRemoteNGTests/Config/CredentialHarvesterTests.cs index 97d54e47e..5ad9d6c2e 100644 --- a/mRemoteNGTests/Config/CredentialHarvesterTests.cs +++ b/mRemoteNGTests/Config/CredentialHarvesterTests.cs @@ -7,6 +7,7 @@ using mRemoteNG.Config.Serializers; using mRemoteNG.Connection; using mRemoteNG.Container; using mRemoteNG.Security; +using mRemoteNG.Security.Factories; using mRemoteNG.Tree.Root; using NUnit.Framework; @@ -25,7 +26,7 @@ namespace mRemoteNGTests.Config public void Setup() { _credentialHarvester = new CredentialHarvester(); - _cryptographyProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider(BlockCipherEngines.AES, BlockCipherModes.GCM); + _cryptographyProvider = new CryptoProviderFactory(BlockCipherEngines.AES, BlockCipherModes.GCM).Build(); _key = "testKey123".ConvertToSecureString(); } diff --git a/mRemoteNGTests/Config/Serializers/ConnectionSerializers/XmlConnectionNodeSerializer27Tests.cs b/mRemoteNGTests/Config/Serializers/ConnectionSerializers/XmlConnectionNodeSerializer27Tests.cs index 30c9370d1..4007a0582 100644 --- a/mRemoteNGTests/Config/Serializers/ConnectionSerializers/XmlConnectionNodeSerializer27Tests.cs +++ b/mRemoteNGTests/Config/Serializers/ConnectionSerializers/XmlConnectionNodeSerializer27Tests.cs @@ -5,6 +5,7 @@ using mRemoteNG.Connection; using mRemoteNG.Container; using mRemoteNG.Credential; using mRemoteNG.Security; +using mRemoteNG.Security.Factories; using NSubstitute; using NUnit.Framework; @@ -18,8 +19,8 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers [SetUp] public void Setup() { - _cryptographyProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider( - BlockCipherEngines.AES, BlockCipherModes.GCM); + _cryptographyProvider = + new CryptoProviderFactory(BlockCipherEngines.AES, BlockCipherModes.GCM).Build(); _connectionNodeSerializer = new XmlConnectionNodeSerializer27(_cryptographyProvider, "myPassword1".ConvertToSecureString(), new SaveFilter()); } @@ -50,7 +51,7 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers public void AttributesNotSerializedWhenFiltered(string attributeName, ConnectionInfo connectionInfo) { var saveFilter = new SaveFilter(true); - var cryptoProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider(BlockCipherEngines.AES, BlockCipherModes.GCM); + var cryptoProvider = new CryptoProviderFactory(BlockCipherEngines.AES, BlockCipherModes.GCM).Build(); _connectionNodeSerializer = new XmlConnectionNodeSerializer27(cryptoProvider, "myPassword1".ConvertToSecureString(), saveFilter); var returnVal = _connectionNodeSerializer.Serialize(connectionInfo); var targetAttribute = returnVal.Attribute(XName.Get(attributeName)); @@ -61,7 +62,7 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers public void InheritanceNotSerialiedWhenFiltered(string attributeName, ConnectionInfo connectionInfo) { var saveFilter = new SaveFilter(true); - var cryptoProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider(BlockCipherEngines.AES, BlockCipherModes.GCM); + var cryptoProvider = new CryptoProviderFactory(BlockCipherEngines.AES, BlockCipherModes.GCM).Build(); _connectionNodeSerializer = new XmlConnectionNodeSerializer27(cryptoProvider, "myPassword1".ConvertToSecureString(), saveFilter); var returnVal = _connectionNodeSerializer.Serialize(connectionInfo); var targetAttribute = returnVal.Attribute(XName.Get(attributeName)); diff --git a/mRemoteNGTests/Config/Serializers/ConnectionSerializers/XmlConnectionsDocumentCompilerTests.cs b/mRemoteNGTests/Config/Serializers/ConnectionSerializers/XmlConnectionsDocumentCompilerTests.cs index b36a950de..1c541eb81 100644 --- a/mRemoteNGTests/Config/Serializers/ConnectionSerializers/XmlConnectionsDocumentCompilerTests.cs +++ b/mRemoteNGTests/Config/Serializers/ConnectionSerializers/XmlConnectionsDocumentCompilerTests.cs @@ -4,6 +4,7 @@ using mRemoteNG.Config.Serializers; using mRemoteNG.Connection; using mRemoteNG.Container; using mRemoteNG.Security; +using mRemoteNG.Security.Factories; using mRemoteNG.Tree; using mRemoteNG.Tree.Root; using NUnit.Framework; @@ -28,7 +29,7 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers public void Setup() { _connectionTreeModel = SetupConnectionTreeModel(); - _cryptographyProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider(BlockCipherEngines.AES, BlockCipherModes.GCM); + _cryptographyProvider = new CryptoProviderFactory(BlockCipherEngines.AES, BlockCipherModes.GCM).Build(); var connectionNodeSerializer = new XmlConnectionNodeSerializer27( _cryptographyProvider, _connectionTreeModel.RootNodes.OfType().First().PasswordString.ConvertToSecureString(), diff --git a/mRemoteNGTests/Config/Serializers/ConnectionSerializers/XmlConnectionsDocumentEncryptorTests.cs b/mRemoteNGTests/Config/Serializers/ConnectionSerializers/XmlConnectionsDocumentEncryptorTests.cs index 96e551a22..8f589ad93 100644 --- a/mRemoteNGTests/Config/Serializers/ConnectionSerializers/XmlConnectionsDocumentEncryptorTests.cs +++ b/mRemoteNGTests/Config/Serializers/ConnectionSerializers/XmlConnectionsDocumentEncryptorTests.cs @@ -4,6 +4,7 @@ using mRemoteNG.Config.Serializers; using mRemoteNG.Connection; using mRemoteNG.Container; using mRemoteNG.Security; +using mRemoteNG.Security.Factories; using mRemoteNG.Tree; using mRemoteNG.Tree.Root; using NUnit.Framework; @@ -19,7 +20,7 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers public void Setup() { var connectionTreeModel = SetupConnectionTreeModel(); - var cryptoProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider(BlockCipherEngines.AES, BlockCipherModes.GCM); + var cryptoProvider = new CryptoProviderFactory(BlockCipherEngines.AES, BlockCipherModes.GCM).Build(); var connectionNodeSerializer = new XmlConnectionNodeSerializer27( cryptoProvider, connectionTreeModel.RootNodes.OfType().First().PasswordString.ConvertToSecureString(), diff --git a/mRemoteNGTests/Config/Serializers/ConnectionSerializers/XmlRootNodeSerializerTests.cs b/mRemoteNGTests/Config/Serializers/ConnectionSerializers/XmlRootNodeSerializerTests.cs index 9d6f820eb..f00d8c9ae 100644 --- a/mRemoteNGTests/Config/Serializers/ConnectionSerializers/XmlRootNodeSerializerTests.cs +++ b/mRemoteNGTests/Config/Serializers/ConnectionSerializers/XmlRootNodeSerializerTests.cs @@ -3,6 +3,7 @@ using System.Collections; using System.Xml.Linq; using mRemoteNG.Config.Serializers; using mRemoteNG.Security; +using mRemoteNG.Security.Factories; using mRemoteNG.Security.SymmetricEncryption; using mRemoteNG.Tree.Root; using NUnit.Framework; @@ -41,7 +42,7 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers [TestCaseSource(typeof(TestCaseSources), nameof(TestCaseSources.AllEngineAndModeCombos))] public void EncryptionEngineSerialized(BlockCipherEngines engine, BlockCipherModes mode) { - var cryptoProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider(engine, mode); + var cryptoProvider = new CryptoProviderFactory(engine, mode).Build(); var element = _rootNodeSerializer.SerializeRootNodeInfo(_rootNodeInfo, cryptoProvider); var attributeValue = element.Attribute(XName.Get("EncryptionEngine"))?.Value; Assert.That(attributeValue, Is.EqualTo(engine.ToString())); @@ -50,7 +51,7 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers [TestCaseSource(typeof(TestCaseSources), nameof(TestCaseSources.AllEngineAndModeCombos))] public void EncryptionModeSerialized(BlockCipherEngines engine, BlockCipherModes mode) { - var cryptoProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider(engine, mode); + var cryptoProvider = new CryptoProviderFactory(engine, mode).Build(); var element = _rootNodeSerializer.SerializeRootNodeInfo(_rootNodeInfo, cryptoProvider); var attributeValue = element.Attribute(XName.Get("BlockCipherMode"))?.Value; Assert.That(attributeValue, Is.EqualTo(mode.ToString())); diff --git a/mRemoteNGTests/IntegrationTests/XmlCredentialSerializerLifeCycleTests.cs b/mRemoteNGTests/IntegrationTests/XmlCredentialSerializerLifeCycleTests.cs index 8c98b272a..ef346b0fc 100644 --- a/mRemoteNGTests/IntegrationTests/XmlCredentialSerializerLifeCycleTests.cs +++ b/mRemoteNGTests/IntegrationTests/XmlCredentialSerializerLifeCycleTests.cs @@ -6,6 +6,7 @@ using mRemoteNG.Config.Serializers; using mRemoteNG.Config.Serializers.CredentialSerializer; using mRemoteNG.Credential; using mRemoteNG.Security; +using mRemoteNG.Security.Factories; using NUnit.Framework; namespace mRemoteNGTests.IntegrationTests @@ -24,7 +25,7 @@ namespace mRemoteNGTests.IntegrationTests public void Setup() { var key = "123someKey".ConvertToSecureString(); - var cryptoProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider(BlockCipherEngines.AES, BlockCipherModes.CCM); + var cryptoProvider = new CryptoProviderFactory(BlockCipherEngines.AES, BlockCipherModes.CCM).Build(); _serializer = new XmlCredentialPasswordEncryptorDecorator( new XmlCredentialRecordSerializer(), cryptoProvider, diff --git a/mRemoteNGTests/IntegrationTests/XmlSerializationLifeCycleTests.cs b/mRemoteNGTests/IntegrationTests/XmlSerializationLifeCycleTests.cs index eaa77cb7f..83fad71e7 100644 --- a/mRemoteNGTests/IntegrationTests/XmlSerializationLifeCycleTests.cs +++ b/mRemoteNGTests/IntegrationTests/XmlSerializationLifeCycleTests.cs @@ -4,6 +4,7 @@ using mRemoteNG.Connection; using mRemoteNG.Container; using mRemoteNG.Credential; using mRemoteNG.Security; +using mRemoteNG.Security.Factories; using mRemoteNG.Tree; using mRemoteNG.Tree.Root; using NUnit.Framework; @@ -16,12 +17,13 @@ namespace mRemoteNGTests.IntegrationTests private XmlConnectionsSerializer _serializer; private XmlConnectionsDeserializer _deserializer; private ConnectionTreeModel _originalModel; + private readonly ICryptoProviderFactory _cryptoFactory = new CryptoProviderFactory(BlockCipherEngines.AES , BlockCipherModes.GCM); [SetUp] public void Setup() { _originalModel = SetupConnectionTreeModel(); - var cryptoProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider(BlockCipherEngines.AES, BlockCipherModes.GCM); + var cryptoProvider = _cryptoFactory.Build(); var nodeSerializer = new XmlConnectionNodeSerializer27( cryptoProvider, _originalModel.RootNodes.OfType().First().PasswordString.ConvertToSecureString(), @@ -74,7 +76,7 @@ namespace mRemoteNGTests.IntegrationTests [Test] public void SerializeAndDeserializeWithCustomKdfIterationsValue() { - var cryptoProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider(BlockCipherEngines.AES, BlockCipherModes.GCM); + var cryptoProvider = _cryptoFactory.Build(); cryptoProvider.KeyDerivationIterations = 5000; var nodeSerializer = new XmlConnectionNodeSerializer27( cryptoProvider, diff --git a/mRemoteNGTests/Security/AeadCryptographyProviderTests.cs b/mRemoteNGTests/Security/AeadCryptographyProviderTests.cs index 6cf10853a..065f48d17 100644 --- a/mRemoteNGTests/Security/AeadCryptographyProviderTests.cs +++ b/mRemoteNGTests/Security/AeadCryptographyProviderTests.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Security; using mRemoteNG.Security; +using mRemoteNG.Security.Factories; using mRemoteNG.Security.SymmetricEncryption; using NUnit.Framework; using NUnit.Framework.Constraints; @@ -45,7 +46,7 @@ namespace mRemoteNGTests.Security [TestCaseSource(nameof(GetAllBlockCipherEngineAndModeCombinations))] public void DecryptedTextIsEqualToOriginalPlainText(BlockCipherEngines engine, BlockCipherModes mode) { - var cryptoProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider(engine, mode); + var cryptoProvider = new CryptoProviderFactory(engine, mode).Build(); var cipherText = cryptoProvider.Encrypt(_plainText, _encryptionKey); var decryptedCipherText = cryptoProvider.Decrypt(cipherText, _encryptionKey); Assert.That(decryptedCipherText, Is.EqualTo(_plainText)); @@ -85,14 +86,14 @@ namespace mRemoteNGTests.Security [TestCaseSource(typeof(TestCaseSources), nameof(TestCaseSources.AllEngineAndModeCombos))] public void GetCipherEngine(BlockCipherEngines engine, BlockCipherModes mode) { - var cryptoProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider(engine, mode); + var cryptoProvider = new CryptoProviderFactory(engine, mode).Build(); Assert.That(cryptoProvider.CipherEngine, Is.EqualTo(engine)); } [TestCaseSource(typeof(TestCaseSources), nameof(TestCaseSources.AllEngineAndModeCombos))] public void GetCipherMode(BlockCipherEngines engine, BlockCipherModes mode) { - var cryptoProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider(engine, mode); + var cryptoProvider = new CryptoProviderFactory(engine, mode).Build(); Assert.That(cryptoProvider.CipherMode, Is.EqualTo(mode)); } diff --git a/mRemoteNGTests/Security/CryptographyProviderFactoryTests.cs b/mRemoteNGTests/Security/CryptographyProviderFactoryTests.cs index 4e6cff692..b7aebe236 100644 --- a/mRemoteNGTests/Security/CryptographyProviderFactoryTests.cs +++ b/mRemoteNGTests/Security/CryptographyProviderFactoryTests.cs @@ -1,7 +1,7 @@ using System; using System.Collections; using mRemoteNG.Security; -using mRemoteNG.Security.SymmetricEncryption; +using mRemoteNG.Security.Factories; using NUnit.Framework; @@ -10,41 +10,20 @@ namespace mRemoteNGTests.Security [TestFixture] public class CryptographyProviderFactoryTests { - private CryptographyProviderFactory _cryptographyProviderFactory; - - [SetUp] - public void SetUp() - { - _cryptographyProviderFactory = new CryptographyProviderFactory(); - } - - [TearDown] - public void TearDown() - { - _cryptographyProviderFactory = null; - } - [TestCaseSource(typeof(TestCaseSources), nameof(TestCaseSources.AllEngineAndModeCombos))] public void CanCreateAeadProvidersWithCorrectEngine(BlockCipherEngines engine, BlockCipherModes mode) { - var cryptoProvider = _cryptographyProviderFactory.CreateAeadCryptographyProvider(engine, mode); + var cryptoProvider = new CryptoProviderFactory(engine, mode).Build(); Assert.That(cryptoProvider.CipherEngine, Is.EqualTo(engine)); } [TestCaseSource(typeof(TestCaseSources), nameof(TestCaseSources.AllEngineAndModeCombos))] public void CanCreateAeadProvidersWithCorrectMode(BlockCipherEngines engine, BlockCipherModes mode) { - var cryptoProvider = _cryptographyProviderFactory.CreateAeadCryptographyProvider(engine, mode); + var cryptoProvider = new CryptoProviderFactory(engine, mode).Build(); Assert.That(cryptoProvider.CipherMode, Is.EqualTo(mode)); } - [Test] - public void CanCreateLegacyRijndael() - { - var cryptoProvider = _cryptographyProviderFactory.CreateLegacyRijndaelCryptographyProvider(); - Assert.That(cryptoProvider, Is.TypeOf()); - } - private class TestCaseSources { public static IEnumerable AllEngineAndModeCombos diff --git a/mRemoteNGTests/Security/XmlCryptoProviderBuilderTests.cs b/mRemoteNGTests/Security/XmlCryptoProviderBuilderTests.cs index 01c2f60ef..9eb238077 100644 --- a/mRemoteNGTests/Security/XmlCryptoProviderBuilderTests.cs +++ b/mRemoteNGTests/Security/XmlCryptoProviderBuilderTests.cs @@ -1,6 +1,7 @@ using System; using System.Xml.Linq; using mRemoteNG.Security; +using mRemoteNG.Security.Factories; using mRemoteNG.Security.SymmetricEncryption; using NUnit.Framework; @@ -13,7 +14,7 @@ namespace mRemoteNGTests.Security public void BuildsCorrectEncryptionEngine() { var element = BuildValidElement(); - var builder = new XmlCryptoProviderBuilder(element); + var builder = new CryptoProviderFactoryFromXml(element); var cryptoProvider = builder.Build(); Assert.That(cryptoProvider.CipherEngine, Is.EqualTo(BlockCipherEngines.Serpent)); } @@ -22,7 +23,7 @@ namespace mRemoteNGTests.Security public void BuildsCorrectCipherMode() { var element = BuildValidElement(); - var builder = new XmlCryptoProviderBuilder(element); + var builder = new CryptoProviderFactoryFromXml(element); var cryptoProvider = builder.Build(); Assert.That(cryptoProvider.CipherMode, Is.EqualTo(BlockCipherModes.EAX)); } @@ -31,7 +32,7 @@ namespace mRemoteNGTests.Security public void BuildsCorrectKdfIterations() { var element = BuildValidElement(); - var builder = new XmlCryptoProviderBuilder(element); + var builder = new CryptoProviderFactoryFromXml(element); var cryptoProvider = builder.Build(); Assert.That(cryptoProvider.KeyDerivationIterations, Is.EqualTo(1234)); } @@ -42,7 +43,7 @@ namespace mRemoteNGTests.Security Assert.Throws(() => { // ReSharper disable once ObjectCreationAsStatement - new XmlCryptoProviderBuilder(null); + new CryptoProviderFactoryFromXml(null); }); } @@ -50,7 +51,7 @@ namespace mRemoteNGTests.Security public void ReturnsOldProviderTypeIfXmlIsntValid() { var badElement = new XElement("BadElement"); - var builder = new XmlCryptoProviderBuilder(badElement); + var builder = new CryptoProviderFactoryFromXml(badElement); var cryptoProvider = builder.Build(); Assert.That(cryptoProvider, Is.TypeOf()); } diff --git a/mRemoteV1/App/Export.cs b/mRemoteV1/App/Export.cs index f7392265b..83e37add5 100644 --- a/mRemoteV1/App/Export.cs +++ b/mRemoteV1/App/Export.cs @@ -7,6 +7,7 @@ using mRemoteNG.Config.Serializers; using mRemoteNG.Connection; using mRemoteNG.Container; using mRemoteNG.Security; +using mRemoteNG.Security.Factories; using mRemoteNG.Tree; using mRemoteNG.Tree.Root; using mRemoteNG.UI.Forms; @@ -74,9 +75,7 @@ namespace mRemoteNG.App switch (saveFormat) { case ConnectionsSaver.Format.mRXML: - var factory = new CryptographyProviderFactory(); - var cryptographyProvider = factory.CreateAeadCryptographyProvider(Settings.Default.EncryptionEngine, Settings.Default.EncryptionBlockCipherMode); - cryptographyProvider.KeyDerivationIterations = Settings.Default.EncryptionKeyDerivationIterations; + var cryptographyProvider = new CryptoProviderFactoryFromSettings().Build(); var rootNode = exportTarget.GetRootParent() as RootNodeInfo; var connectionNodeSerializer = new XmlConnectionNodeSerializer27( cryptographyProvider, diff --git a/mRemoteV1/App/Initialization/CredsAndConsSetup.cs b/mRemoteV1/App/Initialization/CredsAndConsSetup.cs index d3909e15e..64e45aa69 100644 --- a/mRemoteV1/App/Initialization/CredsAndConsSetup.cs +++ b/mRemoteV1/App/Initialization/CredsAndConsSetup.cs @@ -8,11 +8,13 @@ using mRemoteNG.Config; using mRemoteNG.Config.DataProviders; using mRemoteNG.Config.Serializers; using mRemoteNG.Config.Serializers.CredentialProviderSerializer; +using mRemoteNG.Config.Serializers.CredentialSerializer; using mRemoteNG.Connection; using mRemoteNG.Credential; using mRemoteNG.Credential.Repositories; using mRemoteNG.Security; using mRemoteNG.Security.Authentication; +using mRemoteNG.Security.Factories; using mRemoteNG.Tools; namespace mRemoteNG.App.Initialization @@ -22,6 +24,7 @@ namespace mRemoteNG.App.Initialization private readonly string _credentialRepoListPath = Path.Combine(SettingsFileInfo.SettingsPath, "credentialRepositories.xml"); private readonly ICredentialRepositoryList _credentialRepositoryList; private readonly string _credentialFilePath; + private readonly CredentialRepositoryFactory _credentialRepositoryFactory; public CredsAndConsSetup(ICredentialRepositoryList credentialRepositoryList, string credentialFilePath) { @@ -30,6 +33,8 @@ namespace mRemoteNG.App.Initialization _credentialRepositoryList = credentialRepositoryList; _credentialFilePath = credentialFilePath; + + //_credentialRepositoryFactory = new CredentialRepositoryFactory(); } public void LoadCredsAndCons() @@ -52,11 +57,11 @@ namespace mRemoteNG.App.Initialization var connectionFileProvider = new FileDataProvider(Runtime.GetStartupConnectionFileName()); var xdoc = XDocument.Parse(connectionFileProvider.Load()); - if (double.Parse(xdoc.Root?.Attribute("ConfVersion")?.Value) >= 2.7) return null; + if (double.Parse(xdoc.Root?.Attribute("ConfVersion")?.Value ?? "0") >= 2.7) return null; EnsureConnectionXmlElementsHaveIds(xdoc); connectionFileProvider.Save($"{xdoc.Declaration}\n {xdoc}"); - var cryptoProvider = CryptographyProviderFactory.BuildFromXml(xdoc.Root); + var cryptoProvider = new CryptoProviderFactoryFromXml(xdoc.Root).Build(); var encryptedValue = xdoc.Root?.Attribute("Protected")?.Value; var auth = new PasswordAuthenticator(cryptoProvider, encryptedValue) { diff --git a/mRemoteV1/Config/Connections/ConnectionsSaver.cs b/mRemoteV1/Config/Connections/ConnectionsSaver.cs index b89d49704..1d0c67d0b 100644 --- a/mRemoteV1/Config/Connections/ConnectionsSaver.cs +++ b/mRemoteV1/Config/Connections/ConnectionsSaver.cs @@ -17,6 +17,7 @@ using mRemoteNG.Connection.Protocol.RDP; using mRemoteNG.Container; using mRemoteNG.Messages; using mRemoteNG.Security; +using mRemoteNG.Security.Factories; using mRemoteNG.Security.SymmetricEncryption; using mRemoteNG.Tools; using mRemoteNG.Tree; @@ -164,9 +165,7 @@ namespace mRemoteNG.Config.Connections { try { - var factory = new CryptographyProviderFactory(); - var cryptographyProvider = factory.CreateAeadCryptographyProvider(mRemoteNG.Settings.Default.EncryptionEngine, mRemoteNG.Settings.Default.EncryptionBlockCipherMode); - cryptographyProvider.KeyDerivationIterations = mRemoteNG.Settings.Default.EncryptionKeyDerivationIterations; + var cryptographyProvider = new CryptoProviderFactoryFromSettings().Build(); var connectionNodeSerializer = new XmlConnectionNodeSerializer27( cryptographyProvider, ConnectionTreeModel.RootNodes.OfType().First().PasswordString.ConvertToSecureString(), diff --git a/mRemoteV1/Config/CredentialHarvester.cs b/mRemoteV1/Config/CredentialHarvester.cs index f04b409ee..38dd53597 100644 --- a/mRemoteV1/Config/CredentialHarvester.cs +++ b/mRemoteV1/Config/CredentialHarvester.cs @@ -5,6 +5,7 @@ using System.Security; using System.Xml.Linq; using mRemoteNG.Credential; using mRemoteNG.Security; +using mRemoteNG.Security.Factories; namespace mRemoteNG.Config { @@ -19,8 +20,8 @@ namespace mRemoteNG.Config { if (xDocument == null) throw new ArgumentNullException(nameof(xDocument)); - - var cryptoProvider = CryptographyProviderFactory.BuildFromXml(xDocument.Root); + + var cryptoProvider = new CryptoProviderFactoryFromXml(xDocument.Root).Build(); foreach (var element in xDocument.Descendants("Node")) { diff --git a/mRemoteV1/Config/CredentialRecordLoader.cs b/mRemoteV1/Config/CredentialRecordLoader.cs index abd7afa1d..03fbe796e 100644 --- a/mRemoteV1/Config/CredentialRecordLoader.cs +++ b/mRemoteV1/Config/CredentialRecordLoader.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Security; using mRemoteNG.Config.DataProviders; -using mRemoteNG.Config.Serializers.CredentialSerializer; +using mRemoteNG.Config.Serializers; using mRemoteNG.Credential; @@ -11,9 +11,9 @@ namespace mRemoteNG.Config public class CredentialRecordLoader { private readonly IDataProvider _dataProvider; - private readonly XmlCredentialRecordDeserializer _deserializer; + private readonly IDeserializer> _deserializer; - public CredentialRecordLoader(IDataProvider dataProvider, XmlCredentialRecordDeserializer deserializer) + public CredentialRecordLoader(IDataProvider dataProvider, IDeserializer> deserializer) { if (dataProvider == null) throw new ArgumentNullException(nameof(dataProvider)); diff --git a/mRemoteV1/Config/CredentialRecordSaver.cs b/mRemoteV1/Config/CredentialRecordSaver.cs index 72fc393d4..e758c2252 100644 --- a/mRemoteV1/Config/CredentialRecordSaver.cs +++ b/mRemoteV1/Config/CredentialRecordSaver.cs @@ -1,9 +1,7 @@ using System; using System.Collections.Generic; -using System.Security; using mRemoteNG.Config.DataProviders; using mRemoteNG.Config.Serializers; -using mRemoteNG.Config.Serializers.CredentialSerializer; using mRemoteNG.Credential; @@ -12,9 +10,9 @@ namespace mRemoteNG.Config public class CredentialRecordSaver { private readonly IDataProvider _dataProvider; - private readonly XmlCredentialRecordSerializer _serializer; + private readonly ISerializer, string> _serializer; - public CredentialRecordSaver(IDataProvider dataProvider, XmlCredentialRecordSerializer serializer) + public CredentialRecordSaver(IDataProvider dataProvider, ISerializer, string> serializer) { if (dataProvider == null) throw new ArgumentNullException(nameof(dataProvider)); diff --git a/mRemoteV1/Config/Serializers/CredentialProviderSerializer/CredentialRepositoryListDeserializer.cs b/mRemoteV1/Config/Serializers/CredentialProviderSerializer/CredentialRepositoryListDeserializer.cs index 63878e6f3..30da5a0b1 100644 --- a/mRemoteV1/Config/Serializers/CredentialProviderSerializer/CredentialRepositoryListDeserializer.cs +++ b/mRemoteV1/Config/Serializers/CredentialProviderSerializer/CredentialRepositoryListDeserializer.cs @@ -12,7 +12,7 @@ namespace mRemoteNG.Config.Serializers.CredentialProviderSerializer { var xdoc = XDocument.Parse(xml); var repoEntries = xdoc.Descendants("CredentialRepository"); - return repoEntries.Select(CredentialRepositoryFactory.Build); + return repoEntries.Select(new CredentialRepositoryFactory().Build); } } } \ No newline at end of file diff --git a/mRemoteV1/Config/Serializers/CredentialSerializer/XmlCredentialPasswordDecryptorDecorator.cs b/mRemoteV1/Config/Serializers/CredentialSerializer/XmlCredentialPasswordDecryptorDecorator.cs index 4941cdb28..4b7372dae 100644 --- a/mRemoteV1/Config/Serializers/CredentialSerializer/XmlCredentialPasswordDecryptorDecorator.cs +++ b/mRemoteV1/Config/Serializers/CredentialSerializer/XmlCredentialPasswordDecryptorDecorator.cs @@ -4,6 +4,7 @@ using System.Security; using System.Xml.Linq; using mRemoteNG.Credential; using mRemoteNG.Security; +using mRemoteNG.Security.Factories; namespace mRemoteNG.Config.Serializers.CredentialSerializer { @@ -32,7 +33,7 @@ namespace mRemoteNG.Config.Serializers.CredentialSerializer private string DecryptPasswords(string xml) { var xdoc = XDocument.Parse(xml); - var cryptoProvider = CryptographyProviderFactory.BuildFromXml(xdoc.Root); + var cryptoProvider = new CryptoProviderFactoryFromXml(xdoc.Root).Build(); foreach (var credentialElement in xdoc.Descendants()) { var passwordAttribute = credentialElement.Attribute("Password"); diff --git a/mRemoteV1/Config/Serializers/XmlConnectionsDecryptor.cs b/mRemoteV1/Config/Serializers/XmlConnectionsDecryptor.cs index 5826e4fcc..45be38de1 100644 --- a/mRemoteV1/Config/Serializers/XmlConnectionsDecryptor.cs +++ b/mRemoteV1/Config/Serializers/XmlConnectionsDecryptor.cs @@ -2,6 +2,7 @@ using System.Security; using mRemoteNG.Security; using mRemoteNG.Security.Authentication; +using mRemoteNG.Security.Factories; using mRemoteNG.Security.SymmetricEncryption; using mRemoteNG.Tree.Root; @@ -29,7 +30,7 @@ namespace mRemoteNG.Config.Serializers public XmlConnectionsDecryptor(BlockCipherEngines blockCipherEngine, BlockCipherModes blockCipherMode, RootNodeInfo rootNodeInfo) { - _cryptographyProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider(blockCipherEngine, blockCipherMode); + _cryptographyProvider = new CryptoProviderFactory(blockCipherEngine, blockCipherMode).Build(); _rootNodeInfo = rootNodeInfo; } diff --git a/mRemoteV1/Credential/Repositories/CredentialRepositoryFactory.cs b/mRemoteV1/Credential/Repositories/CredentialRepositoryFactory.cs index e3555f943..e814f1975 100644 --- a/mRemoteV1/Credential/Repositories/CredentialRepositoryFactory.cs +++ b/mRemoteV1/Credential/Repositories/CredentialRepositoryFactory.cs @@ -1,13 +1,12 @@ using System; using System.Xml.Linq; using mRemoteNG.Config.DataProviders; -using mRemoteNG.Security; namespace mRemoteNG.Credential.Repositories { public class CredentialRepositoryFactory { - public static ICredentialRepository Build(XElement repositoryXElement) + public ICredentialRepository Build(XElement repositoryXElement) { var typeName = repositoryXElement.Attribute("TypeName")?.Value; if (typeName == "Xml") @@ -15,7 +14,7 @@ namespace mRemoteNG.Credential.Repositories throw new Exception("Could not build repository for the specified type"); } - private static ICredentialRepository BuildXmlRepository(XElement repositoryXElement) + private ICredentialRepository BuildXmlRepository(XElement repositoryXElement) { var stringId = repositoryXElement.Attribute("Id")?.Value; Guid id; diff --git a/mRemoteV1/Credential/Repositories/XmlCredentialRepository.cs b/mRemoteV1/Credential/Repositories/XmlCredentialRepository.cs index d0b66bdb0..bd514d718 100644 --- a/mRemoteV1/Credential/Repositories/XmlCredentialRepository.cs +++ b/mRemoteV1/Credential/Repositories/XmlCredentialRepository.cs @@ -3,9 +3,7 @@ using System.Collections.Generic; using System.ComponentModel; using System.Linq; using mRemoteNG.Config.DataProviders; -using mRemoteNG.Config.Serializers; using mRemoteNG.Config.Serializers.CredentialSerializer; -using mRemoteNG.Security; using mRemoteNG.Security.Authentication; using mRemoteNG.Tools.CustomCollections; using mRemoteNG.UI.Forms; diff --git a/mRemoteV1/Security/CryptographyProviderFactory.cs b/mRemoteV1/Security/Factories/CryptoProviderFactory.cs similarity index 57% rename from mRemoteV1/Security/CryptographyProviderFactory.cs rename to mRemoteV1/Security/Factories/CryptoProviderFactory.cs index 7b7eb13d9..4dfd9bdbd 100644 --- a/mRemoteV1/Security/CryptographyProviderFactory.cs +++ b/mRemoteV1/Security/Factories/CryptoProviderFactory.cs @@ -1,37 +1,24 @@ using System; -using System.Xml.Linq; using mRemoteNG.Security.SymmetricEncryption; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Engines; using Org.BouncyCastle.Crypto.Modes; -namespace mRemoteNG.Security +namespace mRemoteNG.Security.Factories { - public class CryptographyProviderFactory + public class CryptoProviderFactory : ICryptoProviderFactory { - public static ICryptographyProvider BuildCryptographyProviderFromSettings() - { - var provider = new CryptographyProviderFactory().CreateAeadCryptographyProvider(Settings.Default.EncryptionEngine, Settings.Default.EncryptionBlockCipherMode); - provider.KeyDerivationIterations = Settings.Default.EncryptionKeyDerivationIterations; - return provider; - } + private readonly IAeadBlockCipher _aeadBlockCipher; - public ICryptographyProvider CreateAeadCryptographyProvider(BlockCipherEngines engine, BlockCipherModes mode) + public CryptoProviderFactory(BlockCipherEngines engine, BlockCipherModes mode) { var cipherEngine = ChooseBlockCipherEngine(engine); - var cipher = ChooseBlockCipherMode(mode, cipherEngine); - return new AeadCryptographyProvider(cipher); + _aeadBlockCipher = ChooseBlockCipherMode(mode, cipherEngine); } - public ICryptographyProvider CreateLegacyRijndaelCryptographyProvider() + public ICryptographyProvider Build() { - return new LegacyRijndaelCryptographyProvider(); - } - - public static ICryptographyProvider BuildFromXml(XElement element) - { - var builder = new XmlCryptoProviderBuilder(element); - return builder.Build(); + return new AeadCryptographyProvider(_aeadBlockCipher); } private IBlockCipher ChooseBlockCipherEngine(BlockCipherEngines engine) diff --git a/mRemoteV1/Security/Factories/CryptoProviderFactoryFromSettings.cs b/mRemoteV1/Security/Factories/CryptoProviderFactoryFromSettings.cs new file mode 100644 index 000000000..16052ed81 --- /dev/null +++ b/mRemoteV1/Security/Factories/CryptoProviderFactoryFromSettings.cs @@ -0,0 +1,12 @@ +namespace mRemoteNG.Security.Factories +{ + public class CryptoProviderFactoryFromSettings : ICryptoProviderFactory + { + public ICryptographyProvider Build() + { + var provider = new CryptoProviderFactory(Settings.Default.EncryptionEngine, Settings.Default.EncryptionBlockCipherMode).Build(); + provider.KeyDerivationIterations = Settings.Default.EncryptionKeyDerivationIterations; + return provider; + } + } +} \ No newline at end of file diff --git a/mRemoteV1/Security/XmlCryptoProviderBuilder.cs b/mRemoteV1/Security/Factories/CryptoProviderFactoryFromXml.cs similarity index 72% rename from mRemoteV1/Security/XmlCryptoProviderBuilder.cs rename to mRemoteV1/Security/Factories/CryptoProviderFactoryFromXml.cs index f57727133..69da8ff4e 100644 --- a/mRemoteV1/Security/XmlCryptoProviderBuilder.cs +++ b/mRemoteV1/Security/Factories/CryptoProviderFactoryFromXml.cs @@ -1,14 +1,14 @@ using System; using System.Xml.Linq; +using mRemoteNG.Security.SymmetricEncryption; - -namespace mRemoteNG.Security +namespace mRemoteNG.Security.Factories { - public class XmlCryptoProviderBuilder + public class CryptoProviderFactoryFromXml : ICryptoProviderFactory { private readonly XElement _element; - public XmlCryptoProviderBuilder(XElement element) + public CryptoProviderFactoryFromXml(XElement element) { if (element == null) throw new ArgumentNullException(nameof(element)); @@ -23,14 +23,14 @@ namespace mRemoteNG.Security { var engine = (BlockCipherEngines)Enum.Parse(typeof(BlockCipherEngines), _element?.Attribute("EncryptionEngine")?.Value ?? ""); var mode = (BlockCipherModes)Enum.Parse(typeof(BlockCipherModes), _element?.Attribute("BlockCipherMode")?.Value ?? ""); - cryptoProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider(engine, mode); + cryptoProvider = new CryptoProviderFactory(engine, mode).Build(); var keyDerivationIterations = int.Parse(_element?.Attribute("KdfIterations")?.Value ?? ""); cryptoProvider.KeyDerivationIterations = keyDerivationIterations; } catch (Exception) { - return new CryptographyProviderFactory().CreateLegacyRijndaelCryptographyProvider(); + return new LegacyRijndaelCryptographyProvider(); } return cryptoProvider; diff --git a/mRemoteV1/Security/Factories/LegacyInsecureCryptoProviderFactory.cs b/mRemoteV1/Security/Factories/LegacyInsecureCryptoProviderFactory.cs new file mode 100644 index 000000000..fc87cccbd --- /dev/null +++ b/mRemoteV1/Security/Factories/LegacyInsecureCryptoProviderFactory.cs @@ -0,0 +1,12 @@ +using mRemoteNG.Security.SymmetricEncryption; + +namespace mRemoteNG.Security.Factories +{ + public class LegacyInsecureCryptoProviderFactory : ICryptoProviderFactory + { + public ICryptographyProvider Build() + { + return new LegacyRijndaelCryptographyProvider(); + } + } +} \ No newline at end of file diff --git a/mRemoteV1/Security/ICryptoProviderFactory.cs b/mRemoteV1/Security/ICryptoProviderFactory.cs new file mode 100644 index 000000000..c08ae8946 --- /dev/null +++ b/mRemoteV1/Security/ICryptoProviderFactory.cs @@ -0,0 +1,7 @@ +namespace mRemoteNG.Security +{ + public interface ICryptoProviderFactory + { + ICryptographyProvider Build(); + } +} \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index ba858f08e..fb4f25992 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -215,6 +215,9 @@ + + + @@ -264,8 +267,8 @@ - - + +