created a builder class for creating a crypto provider from an xml element

This commit is contained in:
David Sparer
2017-01-24 13:35:03 -07:00
parent b55e42ba78
commit da44bba3fe
5 changed files with 114 additions and 0 deletions

View File

@@ -0,0 +1,66 @@
using System;
using System.Xml.Linq;
using mRemoteNG.Security;
using mRemoteNG.Security.SymmetricEncryption;
using NUnit.Framework;
namespace mRemoteNGTests.Security
{
public class XmlCryptoProviderBuilderTests
{
[Test]
public void BuildsCorrectEncryptionEngine()
{
var element = BuildValidElement();
var builder = new XmlCryptoProviderBuilder(element);
var cryptoProvider = builder.Build();
Assert.That(cryptoProvider.CipherEngine, Is.EqualTo(BlockCipherEngines.Serpent));
}
[Test]
public void BuildsCorrectCipherMode()
{
var element = BuildValidElement();
var builder = new XmlCryptoProviderBuilder(element);
var cryptoProvider = builder.Build();
Assert.That(cryptoProvider.CipherMode, Is.EqualTo(BlockCipherModes.EAX));
}
[Test]
public void BuildsCorrectKdfIterations()
{
var element = BuildValidElement();
var builder = new XmlCryptoProviderBuilder(element);
var cryptoProvider = builder.Build();
Assert.That(cryptoProvider.KeyDerivationIterations, Is.EqualTo(1234));
}
[Test]
public void CantPassNullIntoConstructor()
{
Assert.Throws<ArgumentNullException>(() =>
{
// ReSharper disable once ObjectCreationAsStatement
new XmlCryptoProviderBuilder(null);
});
}
[Test]
public void ReturnsOldProviderTypeIfXmlIsntValid()
{
var badElement = new XElement("BadElement");
var builder = new XmlCryptoProviderBuilder(badElement);
var cryptoProvider = builder.Build();
Assert.That(cryptoProvider, Is.TypeOf<LegacyRijndaelCryptographyProvider>());
}
private static XElement BuildValidElement()
{
return new XElement("TestElement",
new XAttribute("EncryptionEngine", "Serpent"),
new XAttribute("BlockCipherMode", "EAX"),
new XAttribute("KdfIterations", "1234"));
}
}
}

View File

@@ -137,6 +137,7 @@
<Compile Include="Security\Authentication\PasswordAuthenticatorTests.cs" />
<Compile Include="Security\KeyDerivation\Pkcs5S2KeyGeneratorTests.cs" />
<Compile Include="Security\SecureStringExtensionsTests.cs" />
<Compile Include="Security\XmlCryptoProviderBuilderTests.cs" />
<Compile Include="Tools\ExternalToolsArgumentParserTests.cs" />
<Compile Include="Tree\ClickHandlers\TreeNodeCompositeClickHandlerTests.cs" />
<Compile Include="Tree\ConnectionTreeDragAndDropHandlerTests.cs" />

View File

@@ -1,4 +1,5 @@
using System;
using System.Xml.Linq;
using mRemoteNG.Security.SymmetricEncryption;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Engines;
@@ -20,6 +21,12 @@ namespace mRemoteNG.Security
return new LegacyRijndaelCryptographyProvider();
}
public static ICryptographyProvider BuildFromXml(XElement element)
{
var builder = new XmlCryptoProviderBuilder(element);
return builder.Build();
}
private IBlockCipher ChooseBlockCipherEngine(BlockCipherEngines engine)
{
switch (engine)

View File

@@ -0,0 +1,39 @@
using System;
using System.Xml.Linq;
namespace mRemoteNG.Security
{
public class XmlCryptoProviderBuilder
{
private readonly XElement _element;
public XmlCryptoProviderBuilder(XElement element)
{
if (element == null)
throw new ArgumentNullException(nameof(element));
_element = element;
}
public ICryptographyProvider Build()
{
ICryptographyProvider cryptoProvider;
try
{
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);
var keyDerivationIterations = int.Parse(_element?.Attribute("KdfIterations")?.Value ?? "");
cryptoProvider.KeyDerivationIterations = keyDerivationIterations;
}
catch (Exception)
{
return new CryptographyProviderFactory().CreateLegacyRijndaelCryptographyProvider();
}
return cryptoProvider;
}
}
}

View File

@@ -220,6 +220,7 @@
<Compile Include="Security\ICryptographyProvider.cs" />
<Compile Include="Security\SecureStringExtensions.cs" />
<Compile Include="Security\CryptographyProviderFactory.cs" />
<Compile Include="Security\XmlCryptoProviderBuilder.cs" />
<Compile Include="Tools\ExternalToolArgumentParser.cs" />
<Compile Include="Tools\CmdArgumentsInterpreter.cs" />
<Compile Include="Tools\ConnectionsTreeToMenuItemsConverter.cs" />