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 @@ +