// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Security.Cryptography; using System.Security.Cryptography.Xml; using System.Xml; using System.Xml.Linq; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Moq; using Xunit; namespace Microsoft.AspNetCore.DataProtection.XmlEncryption { public class CertificateXmlEncryptorTests { [Fact] public void Encrypt_Decrypt_RoundTrips() { // Arrange var symmetricAlgorithm = new TripleDESCryptoServiceProvider(); symmetricAlgorithm.GenerateKey(); var mockInternalEncryptor = new Mock(); mockInternalEncryptor.Setup(o => o.PerformEncryption(It.IsAny(), It.IsAny())) .Returns((encryptedXml, element) => { encryptedXml.AddKeyNameMapping("theKey", symmetricAlgorithm); // use symmetric encryption return encryptedXml.Encrypt(element, "theKey"); }); var mockInternalDecryptor = new Mock(); mockInternalDecryptor.Setup(o => o.PerformPreDecryptionSetup(It.IsAny())) .Callback(encryptedXml => { encryptedXml.AddKeyNameMapping("theKey", symmetricAlgorithm); // use symmetric encryption }); var serviceCollection = new ServiceCollection(); serviceCollection.AddSingleton(mockInternalDecryptor.Object); var services = serviceCollection.BuildServiceProvider(); var encryptor = new CertificateXmlEncryptor(NullLoggerFactory.Instance, mockInternalEncryptor.Object); var decryptor = new EncryptedXmlDecryptor(services); var originalXml = XElement.Parse(@""); // Act & assert - run through encryptor and make sure we get back element var encryptedXmlInfo = encryptor.Encrypt(originalXml); Assert.Equal(typeof(EncryptedXmlDecryptor), encryptedXmlInfo.DecryptorType); Assert.Equal(XName.Get("EncryptedData", "http://www.w3.org/2001/04/xmlenc#"), encryptedXmlInfo.EncryptedElement.Name); Assert.Equal("http://www.w3.org/2001/04/xmlenc#Element", (string)encryptedXmlInfo.EncryptedElement.Attribute("Type")); Assert.DoesNotContain("265ee4ea-ade2-43b1-b706-09b259e58b6b", encryptedXmlInfo.EncryptedElement.ToString(), StringComparison.OrdinalIgnoreCase); // Act & assert - run through decryptor and make sure we get back the original value var roundTrippedElement = decryptor.Decrypt(encryptedXmlInfo.EncryptedElement); XmlAssert.Equal(originalXml, roundTrippedElement); } } }