DpapiXmlEncryptionTests.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  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. using System;
  4. using System.Xml.Linq;
  5. using Microsoft.AspNetCore.DataProtection.Test.Shared;
  6. using Microsoft.AspNetCore.Testing;
  7. using Microsoft.AspNetCore.Testing.xunit;
  8. using Xunit;
  9. namespace Microsoft.AspNetCore.DataProtection.XmlEncryption
  10. {
  11. public class DpapiXmlEncryptionTests
  12. {
  13. [ConditionalTheory]
  14. [ConditionalRunTestOnlyOnWindows]
  15. [InlineData(true)]
  16. [InlineData(false)]
  17. public void Encrypt_CurrentUserOrLocalMachine_Decrypt_RoundTrips(bool protectToLocalMachine)
  18. {
  19. // Arrange
  20. var originalXml = XElement.Parse(@"<mySecret value='265ee4ea-ade2-43b1-b706-09b259e58b6b' />");
  21. var encryptor = new DpapiXmlEncryptor(protectToLocalMachine);
  22. var decryptor = new DpapiXmlDecryptor();
  23. // Act & assert - run through encryptor and make sure we get back an obfuscated element
  24. var encryptedXmlInfo = encryptor.Encrypt(originalXml);
  25. Assert.Equal(typeof(DpapiXmlDecryptor), encryptedXmlInfo.DecryptorType);
  26. Assert.DoesNotContain("265ee4ea-ade2-43b1-b706-09b259e58b6b", encryptedXmlInfo.EncryptedElement.ToString(), StringComparison.OrdinalIgnoreCase);
  27. // Act & assert - run through decryptor and make sure we get back the original value
  28. var roundTrippedElement = decryptor.Decrypt(encryptedXmlInfo.EncryptedElement);
  29. XmlAssert.Equal(originalXml, roundTrippedElement);
  30. }
  31. #if !NETCOREAPP1_0
  32. [ConditionalFact]
  33. [ConditionalRunTestOnlyOnWindows]
  34. public void Encrypt_CurrentUser_Decrypt_ImpersonatedAsAnonymous_Fails()
  35. {
  36. // Arrange
  37. var originalXml = XElement.Parse(@"<mySecret value='265ee4ea-ade2-43b1-b706-09b259e58b6b' />");
  38. var encryptor = new DpapiXmlEncryptor(protectToLocalMachine: false);
  39. var decryptor = new DpapiXmlDecryptor();
  40. // Act & assert - run through encryptor and make sure we get back an obfuscated element
  41. var encryptedXmlInfo = encryptor.Encrypt(originalXml);
  42. Assert.Equal(typeof(DpapiXmlDecryptor), encryptedXmlInfo.DecryptorType);
  43. Assert.DoesNotContain("265ee4ea-ade2-43b1-b706-09b259e58b6b", encryptedXmlInfo.EncryptedElement.ToString(), StringComparison.OrdinalIgnoreCase);
  44. // Act & assert - run through decryptor (while impersonated as anonymous) and verify failure
  45. ExceptionAssert2.ThrowsCryptographicException(() =>
  46. AnonymousImpersonation.Run(() => decryptor.Decrypt(encryptedXmlInfo.EncryptedElement)));
  47. }
  48. #endif
  49. }
  50. }