mirror of
https://github.com/mRemoteNG/mRemoteNG.git
synced 2026-02-26 03:58:45 +08:00
created a builder class for creating a crypto provider from an xml element
This commit is contained in:
66
mRemoteNGTests/Security/XmlCryptoProviderBuilderTests.cs
Normal file
66
mRemoteNGTests/Security/XmlCryptoProviderBuilderTests.cs
Normal 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"));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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" />
|
||||
|
||||
@@ -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)
|
||||
|
||||
39
mRemoteV1/Security/XmlCryptoProviderBuilder.cs
Normal file
39
mRemoteV1/Security/XmlCryptoProviderBuilder.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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" />
|
||||
|
||||
Reference in New Issue
Block a user