CertificateXmlEncryptionTests.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // Copyright (c) .NET Foundation. All rights reserved.
  2. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  3. #if !NETCOREAPP1_0
  4. using System;
  5. using System.Security.Cryptography;
  6. using System.Security.Cryptography.Xml;
  7. using System.Xml;
  8. using System.Xml.Linq;
  9. using Microsoft.Extensions.DependencyInjection;
  10. using Moq;
  11. using Xunit;
  12. namespace Microsoft.AspNetCore.DataProtection.XmlEncryption
  13. {
  14. public class CertificateXmlEncryptorTests
  15. {
  16. [Fact]
  17. public void Encrypt_Decrypt_RoundTrips()
  18. {
  19. // Arrange
  20. var symmetricAlgorithm = new TripleDESCryptoServiceProvider();
  21. symmetricAlgorithm.GenerateKey();
  22. var serviceCollection = new ServiceCollection();
  23. var mockInternalEncryptor = new Mock<IInternalCertificateXmlEncryptor>();
  24. mockInternalEncryptor.Setup(o => o.PerformEncryption(It.IsAny<EncryptedXml>(), It.IsAny<XmlElement>()))
  25. .Returns<EncryptedXml, XmlElement>((encryptedXml, element) =>
  26. {
  27. encryptedXml.AddKeyNameMapping("theKey", symmetricAlgorithm); // use symmetric encryption
  28. return encryptedXml.Encrypt(element, "theKey");
  29. });
  30. serviceCollection.AddSingleton<IInternalCertificateXmlEncryptor>(mockInternalEncryptor.Object);
  31. var mockInternalDecryptor = new Mock<IInternalEncryptedXmlDecryptor>();
  32. mockInternalDecryptor.Setup(o => o.PerformPreDecryptionSetup(It.IsAny<EncryptedXml>()))
  33. .Callback<EncryptedXml>(encryptedXml =>
  34. {
  35. encryptedXml.AddKeyNameMapping("theKey", symmetricAlgorithm); // use symmetric encryption
  36. });
  37. serviceCollection.AddSingleton<IInternalEncryptedXmlDecryptor>(mockInternalDecryptor.Object);
  38. var services = serviceCollection.BuildServiceProvider();
  39. var encryptor = new CertificateXmlEncryptor(services);
  40. var decryptor = new EncryptedXmlDecryptor(services);
  41. var originalXml = XElement.Parse(@"<mySecret value='265ee4ea-ade2-43b1-b706-09b259e58b6b' />");
  42. // Act & assert - run through encryptor and make sure we get back <EncryptedData> element
  43. var encryptedXmlInfo = encryptor.Encrypt(originalXml);
  44. Assert.Equal(typeof(EncryptedXmlDecryptor), encryptedXmlInfo.DecryptorType);
  45. Assert.Equal(XName.Get("EncryptedData", "http://www.w3.org/2001/04/xmlenc#"), encryptedXmlInfo.EncryptedElement.Name);
  46. Assert.Equal("http://www.w3.org/2001/04/xmlenc#Element", (string)encryptedXmlInfo.EncryptedElement.Attribute("Type"));
  47. Assert.DoesNotContain("265ee4ea-ade2-43b1-b706-09b259e58b6b", encryptedXmlInfo.EncryptedElement.ToString(), StringComparison.OrdinalIgnoreCase);
  48. // Act & assert - run through decryptor and make sure we get back the original value
  49. var roundTrippedElement = decryptor.Decrypt(encryptedXmlInfo.EncryptedElement);
  50. XmlAssert.Equal(originalXml, roundTrippedElement);
  51. }
  52. }
  53. }
  54. #endif