XmlSerializer now requires a cryptoprovider be given to the ctor. Reduces reliance on global state (Settings)

This commit is contained in:
David Sparer
2016-10-19 17:43:02 -06:00
parent d427e3e0ae
commit 7376ff1c9b
4 changed files with 66 additions and 11 deletions

View File

@@ -1,7 +1,11 @@
using System.Xml;
using System;
using System.Collections;
using System.Xml;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Connection;
using mRemoteNG.Container;
using mRemoteNG.Security;
using mRemoteNG.Security.SymmetricEncryption;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
using NUnit.Framework;
@@ -25,7 +29,8 @@ namespace mRemoteNGTests.Config.Serializers
[SetUp]
public void Setup()
{
_serializer = new XmlConnectionsSerializer();
var encryptor = new AeadCryptographyProvider();
_serializer = new XmlConnectionsSerializer(encryptor);
_connectionTreeModel = SetupConnectionTreeModel();
}
@@ -39,6 +44,32 @@ namespace mRemoteNGTests.Config.Serializers
Assert.That(nodeCon4, Is.Not.Null);
}
[TestCaseSource(typeof(TestCaseSources), nameof(TestCaseSources.AllEngineAndModeCombos))]
public void EncryptionEngineSerialized(BlockCipherEngines engine, BlockCipherModes mode)
{
var encryptor = new CryptographyProviderFactory().CreateAeadCryptographyProvider(engine, mode);
_serializer = new XmlConnectionsSerializer(encryptor);
var serializedData = _serializer.Serialize(new ConnectionInfo());
var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(serializedData);
var serializedEncryptionEngine = xmlDoc.DocumentElement?.Attributes["EncryptionEngine"].Value;
var expectedEngineAsString = Enum.GetName(typeof(BlockCipherEngines), engine);
Assert.That(serializedEncryptionEngine, Is.EqualTo(expectedEngineAsString));
}
[TestCaseSource(typeof(TestCaseSources), nameof(TestCaseSources.AllEngineAndModeCombos))]
public void EncryptionModeSerialized(BlockCipherEngines engine, BlockCipherModes mode)
{
var encryptor = new CryptographyProviderFactory().CreateAeadCryptographyProvider(engine, mode);
_serializer = new XmlConnectionsSerializer(encryptor);
var serializedData = _serializer.Serialize(new ConnectionInfo());
var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(serializedData);
var serializedEncryptionMode = xmlDoc.DocumentElement?.Attributes["BlockCipherMode"].Value;
var expectedModeAsString = Enum.GetName(typeof(BlockCipherModes), mode);
Assert.That(serializedEncryptionMode, Is.EqualTo(expectedModeAsString));
}
private ConnectionTreeModel SetupConnectionTreeModel()
{
/*
@@ -78,5 +109,23 @@ namespace mRemoteNGTests.Config.Serializers
_con3 = new ConnectionInfo { Name = "con3" };
_con4 = new ConnectionInfo { Name = "con4" };
}
private class TestCaseSources
{
public static IEnumerable AllEngineAndModeCombos
{
get
{
foreach (var engine in Enum.GetValues(typeof(BlockCipherEngines)))
{
foreach (var mode in Enum.GetValues(typeof(BlockCipherModes)))
{
yield return new TestCaseData(engine, mode);
}
}
}
}
}
}
}

View File

@@ -73,7 +73,9 @@ namespace mRemoteNG.App
switch (saveFormat)
{
case ConnectionsSaver.Format.mRXML:
serializer = new XmlConnectionsSerializer();
var factory = new CryptographyProviderFactory();
var cryptographyProvider = factory.CreateAeadCryptographyProvider(mRemoteNG.Settings.Default.EncryptionEngine, mRemoteNG.Settings.Default.EncryptionBlockCipherMode);
serializer = new XmlConnectionsSerializer(cryptographyProvider);
((XmlConnectionsSerializer) serializer).SaveFilter = saveFilter;
break;
case ConnectionsSaver.Format.mRCSV:

View File

@@ -233,7 +233,9 @@ namespace mRemoteNG.Config.Connections
{
try
{
var xmlConnectionsSerializer = new XmlConnectionsSerializer()
var factory = new CryptographyProviderFactory();
var cryptographyProvider = factory.CreateAeadCryptographyProvider(mRemoteNG.Settings.Default.EncryptionEngine, mRemoteNG.Settings.Default.EncryptionBlockCipherMode);
var xmlConnectionsSerializer = new XmlConnectionsSerializer(cryptographyProvider)
{
Export = Export,
SaveFilter = SaveFilter,

View File

@@ -20,23 +20,25 @@ namespace mRemoteNG.Config.Serializers
{
private SecureString _password = Runtime.EncryptionKey;
private XmlTextWriter _xmlTextWriter;
private ICryptographyProvider _cryptographyProvider;
private readonly ICryptographyProvider _cryptographyProvider;
public bool Export { get; set; }
public SaveFilter SaveFilter { get; set; } = new SaveFilter();
public bool UseFullEncryption { get; set; }
public XmlConnectionsSerializer(ICryptographyProvider cryptographyProvider)
{
_cryptographyProvider = cryptographyProvider;
}
public string Serialize(ConnectionTreeModel connectionTreeModel)
{
var rootNode = (RootNodeInfo)connectionTreeModel.RootNodes.First(node => node is RootNodeInfo);
return Serialize(rootNode);
return SerializeConnectionsData(rootNode);
}
public string Serialize(ConnectionInfo serializationTarget)
{
var factory = new CryptographyProviderFactory();
_cryptographyProvider = factory.CreateAeadCryptographyProvider(mRemoteNG.Settings.Default.EncryptionEngine, mRemoteNG.Settings.Default.EncryptionBlockCipherMode);
return SerializeConnectionsData(serializationTarget);
}
@@ -76,7 +78,7 @@ namespace mRemoteNG.Config.Serializers
{
var connectionInfoAsRootNode = connectionInfo as RootNodeInfo;
if (connectionInfoAsRootNode != null) return connectionInfoAsRootNode;
connectionInfo = connectionInfo.Parent;
connectionInfo = connectionInfo?.Parent ?? new RootNodeInfo(RootNodeType.Connection);
}
}
@@ -148,9 +150,9 @@ namespace mRemoteNG.Config.Serializers
_xmlTextWriter.WriteStartElement("Connections"); // Do not localize
_xmlTextWriter.WriteAttributeString("Name", "", rootNodeInfo.Name);
_xmlTextWriter.WriteAttributeString("Export", "", Convert.ToString(Export));
var cipherEngine = Enum.GetName(typeof(BlockCipherEngines), mRemoteNG.Settings.Default.EncryptionEngine);
var cipherEngine = Enum.GetName(typeof(BlockCipherEngines), _cryptographyProvider.CipherEngine);
_xmlTextWriter.WriteAttributeString("EncryptionEngine", "", cipherEngine ?? "");
var cipherMode = Enum.GetName(typeof(BlockCipherModes), mRemoteNG.Settings.Default.EncryptionBlockCipherMode);
var cipherMode = Enum.GetName(typeof(BlockCipherModes), _cryptographyProvider.CipherMode);
_xmlTextWriter.WriteAttributeString("BlockCipherMode", "", cipherMode ?? "");
_xmlTextWriter.WriteAttributeString("KdfIterations", "", mRemoteNG.Settings.Default.EncryptionKeyDerivationIterations.ToString());
_xmlTextWriter.WriteAttributeString("FullFileEncryption", "", UseFullEncryption.ToString());