diff --git a/mRemoteNGTests/Security/CryptographyProviderFactoryTests.cs b/mRemoteNGTests/Security/CryptographyProviderFactoryTests.cs
new file mode 100644
index 00000000..207fdef5
--- /dev/null
+++ b/mRemoteNGTests/Security/CryptographyProviderFactoryTests.cs
@@ -0,0 +1,106 @@
+using mRemoteNG.Security;
+using NUnit.Framework;
+using Org.BouncyCastle.Crypto.Engines;
+using Org.BouncyCastle.Crypto.Modes;
+
+namespace mRemoteNGTests.Security
+{
+ [TestFixture]
+ public class CryptographyProviderFactoryTests
+ {
+ private CryptographyProviderFactory _cryptographyProviderFactory;
+
+ [SetUp]
+ public void SetUp()
+ {
+ _cryptographyProviderFactory = new CryptographyProviderFactory();
+ }
+
+ [TearDown]
+ public void TearDown()
+ {
+ _cryptographyProviderFactory = null;
+ }
+
+ [Test]
+ public void CanCreateAesGcm()
+ {
+ var engine = BlockCipherEngines.AES;
+ var mode = BlockCipherModes.GCM;
+ var cryptoProvider = _cryptographyProviderFactory.CreateAeadCryptographyProvider(engine, mode);
+ Assert.That(cryptoProvider.CipherEngine, Is.EqualTo($"{engine}/{mode}"));
+ }
+
+ [Test]
+ public void CanCreateAesCcm()
+ {
+ var engine = BlockCipherEngines.AES;
+ var mode = BlockCipherModes.CCM;
+ var cryptoProvider = _cryptographyProviderFactory.CreateAeadCryptographyProvider(engine, mode);
+ Assert.That(cryptoProvider.CipherEngine, Is.EqualTo($"{engine}/{mode}"));
+ }
+
+ [Test]
+ public void CanCreateAesEax()
+ {
+ var engine = BlockCipherEngines.AES;
+ var mode = BlockCipherModes.EAX;
+ var cryptoProvider = _cryptographyProviderFactory.CreateAeadCryptographyProvider(engine, mode);
+ Assert.That(cryptoProvider.CipherEngine, Is.EqualTo($"{engine}/{mode}"));
+ }
+
+ [Test]
+ public void CanCreateSerpentGcm()
+ {
+ var engine = BlockCipherEngines.Serpent;
+ var mode = BlockCipherModes.GCM;
+ var cryptoProvider = _cryptographyProviderFactory.CreateAeadCryptographyProvider(engine, mode);
+ Assert.That(cryptoProvider.CipherEngine, Is.EqualTo($"{engine}/{mode}"));
+ }
+
+ [Test]
+ public void CanCreateSerpentCcm()
+ {
+ var engine = BlockCipherEngines.Serpent;
+ var mode = BlockCipherModes.CCM;
+ var cryptoProvider = _cryptographyProviderFactory.CreateAeadCryptographyProvider(engine, mode);
+ Assert.That(cryptoProvider.CipherEngine, Is.EqualTo($"{engine}/{mode}"));
+ }
+
+ [Test]
+ public void CanCreateSerpentEax()
+ {
+ var engine = BlockCipherEngines.Serpent;
+ var mode = BlockCipherModes.EAX;
+ var cryptoProvider = _cryptographyProviderFactory.CreateAeadCryptographyProvider(engine, mode);
+ Assert.That(cryptoProvider.CipherEngine, Is.EqualTo($"{engine}/{mode}"));
+ }
+
+ [Test]
+ public void CanCreateTwofishCcm()
+ {
+ var engine = BlockCipherEngines.Twofish;
+ var mode = BlockCipherModes.CCM;
+ var cryptoProvider = _cryptographyProviderFactory.CreateAeadCryptographyProvider(engine, mode);
+ Assert.That(cryptoProvider.CipherEngine, Is.EqualTo($"{engine}/{mode}"));
+ }
+
+ [Test]
+ public void CanCreateTwofishEax()
+ {
+ var engine = BlockCipherEngines.Twofish;
+ var mode = BlockCipherModes.EAX;
+ var cryptoProvider = _cryptographyProviderFactory.CreateAeadCryptographyProvider(engine, mode);
+ Assert.That(cryptoProvider.CipherEngine, Is.EqualTo($"{engine}/{mode}"));
+ }
+
+ [Test]
+ public void CanCreateTwofishGcm()
+ {
+ var engine = BlockCipherEngines.Twofish;
+ var mode = BlockCipherModes.GCM;
+ var cryptoProvider = _cryptographyProviderFactory.CreateAeadCryptographyProvider(engine, mode);
+ Assert.That(cryptoProvider.CipherEngine, Is.EqualTo($"{engine}/{mode}"));
+ }
+ }
+}
\ No newline at end of file
diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj
index a65b7efa..acb91176 100644
--- a/mRemoteNGTests/mRemoteNGTests.csproj
+++ b/mRemoteNGTests/mRemoteNGTests.csproj
@@ -106,6 +106,7 @@
+
Form
diff --git a/mRemoteV1/Security/BlockCipherEngines.cs b/mRemoteV1/Security/BlockCipherEngines.cs
new file mode 100644
index 00000000..55e44021
--- /dev/null
+++ b/mRemoteV1/Security/BlockCipherEngines.cs
@@ -0,0 +1,10 @@
+
+namespace mRemoteNG.Security
+{
+ public enum BlockCipherEngines
+ {
+ AES,
+ Twofish,
+ Serpent
+ }
+}
\ No newline at end of file
diff --git a/mRemoteV1/Security/BlockCipherModes.cs b/mRemoteV1/Security/BlockCipherModes.cs
new file mode 100644
index 00000000..274ced74
--- /dev/null
+++ b/mRemoteV1/Security/BlockCipherModes.cs
@@ -0,0 +1,10 @@
+
+namespace mRemoteNG.Security
+{
+ public enum BlockCipherModes
+ {
+ GCM,
+ CCM,
+ EAX
+ }
+}
\ No newline at end of file
diff --git a/mRemoteV1/Security/CryptographyProviderFactory.cs b/mRemoteV1/Security/CryptographyProviderFactory.cs
new file mode 100644
index 00000000..0223bb75
--- /dev/null
+++ b/mRemoteV1/Security/CryptographyProviderFactory.cs
@@ -0,0 +1,47 @@
+using System;
+using Org.BouncyCastle.Crypto;
+using Org.BouncyCastle.Crypto.Engines;
+using Org.BouncyCastle.Crypto.Modes;
+
+namespace mRemoteNG.Security
+{
+ public class CryptographyProviderFactory
+ {
+ public ICryptographyProvider CreateAeadCryptographyProvider(BlockCipherEngines engine, BlockCipherModes mode)
+ {
+ var cipherEngine = ChooseBlockCipherEngine(engine);
+ var cipher = ChooseBlockCipherMode(mode, cipherEngine);
+ return new AeadCryptographyProvider(cipher);
+ }
+
+ private IBlockCipher ChooseBlockCipherEngine(BlockCipherEngines engine)
+ {
+ switch (engine)
+ {
+ case BlockCipherEngines.AES:
+ return new AesEngine();
+ case BlockCipherEngines.Twofish:
+ return new TwofishEngine();
+ case BlockCipherEngines.Serpent:
+ return new SerpentEngine();
+ default:
+ throw new ArgumentOutOfRangeException(nameof(engine), engine, null);
+ }
+ }
+
+ private IAeadBlockCipher ChooseBlockCipherMode(BlockCipherModes mode, IBlockCipher blockCipher)
+ {
+ switch (mode)
+ {
+ case BlockCipherModes.GCM:
+ return new GcmBlockCipher(blockCipher);
+ case BlockCipherModes.CCM:
+ return new CcmBlockCipher(blockCipher);
+ case BlockCipherModes.EAX:
+ return new EaxBlockCipher(blockCipher);
+ default:
+ throw new ArgumentOutOfRangeException(nameof(mode), mode, null);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj
index 218fded6..8480ec0e 100644
--- a/mRemoteV1/mRemoteV1.csproj
+++ b/mRemoteV1/mRemoteV1.csproj
@@ -167,6 +167,8 @@
+
+
@@ -174,6 +176,7 @@
+