private static void Encrypt(XmlDocument doc, string elementName, string encryptionElementID, SymmetricAlgorithm key, string keyName, SymmetricAlgorithmFactory innerKeyFactory) { var elementToEncrypt = (XmlElement)doc.GetElementsByTagName(elementName)[0]; using (SymmetricAlgorithm innerKey = innerKeyFactory.Create()) { // Encrypt the key with another key var encryptedKey = new EncryptedKey() { CipherData = new CipherData(EncryptedXml.EncryptKey(innerKey.Key, key)), EncryptionMethod = new EncryptionMethod(TestHelpers.GetEncryptionMethodName(key, keyWrap: true)) }; // Specify which EncryptedData // uses this key. An XML document can have // multiple EncryptedData elements that use // different keys. encryptedKey.AddReference(new DataReference() { Uri = "#" + encryptionElementID }); var encryptedData = new EncryptedData() { Type = EncryptedXml.XmlEncElementUrl, Id = encryptionElementID, // Create an EncryptionMethod element so that the // receiver knows which algorithm to use for decryption. EncryptionMethod = new EncryptionMethod(TestHelpers.GetEncryptionMethodName(innerKey)) }; encryptedData.KeyInfo.AddClause(new KeyInfoEncryptedKey(encryptedKey)); encryptedKey.KeyInfo.AddClause(new KeyInfoName() { Value = keyName }); var encryptedXml = new EncryptedXml(); encryptedData.CipherData.CipherValue = encryptedXml.EncryptData(elementToEncrypt, innerKey, false); EncryptedXml.ReplaceElement(elementToEncrypt, encryptedData, false); } }
public void SymmetricEncryptionRoundtrip(SymmetricAlgorithmFactory algorithmFactory) { const string testString = "some text node"; const string ExampleXmlRootElement = "example"; const string ExampleXml = @"<?xml version=""1.0""?> <example> <test>some text node</test> </example>"; using (var key = algorithmFactory.Create()) { XmlDocument xmlDocToEncrypt = LoadXmlFromString(ExampleXml); Assert.Contains(testString, xmlDocToEncrypt.OuterXml); EncryptElement(xmlDocToEncrypt, ExampleXmlRootElement, key); Assert.DoesNotContain(testString, xmlDocToEncrypt.OuterXml); XmlDocument xmlDocToDecrypt = LoadXmlFromString(xmlDocToEncrypt.OuterXml); Decrypt(xmlDocToDecrypt, key); Assert.Equal(ExampleXml.Replace("\r\n", "\n"), xmlDocToDecrypt.OuterXml.Replace("\r\n", "\n")); } }
public void SymmetricKeyWrapEncryptionRoundtrip(SymmetricAlgorithmFactory keyFactory, SymmetricAlgorithmFactory innerKeyFactory) { const string testString = "some text node"; const string exampleXmlRootElement = "example"; const string exampleXml = @"<?xml version=""1.0""?> <example> <test>some text node</test> </example>"; const string keyName = "mytestkey"; using (SymmetricAlgorithm key = keyFactory.Create()) { XmlDocument xmlDocToEncrypt = LoadXmlFromString(exampleXml); Assert.Contains(testString, xmlDocToEncrypt.OuterXml); Encrypt(xmlDocToEncrypt, exampleXmlRootElement, "EncryptedElement1", key, keyName, innerKeyFactory); Assert.DoesNotContain(testString, xmlDocToEncrypt.OuterXml); XmlDocument xmlDocToDecrypt = LoadXmlFromString(xmlDocToEncrypt.OuterXml); Decrypt(xmlDocToDecrypt, key, keyName); Assert.Equal(exampleXml.Replace("\r\n", "\n"), xmlDocToDecrypt.OuterXml.Replace("\r\n", "\n")); } }