SecurityUtilsEx.cs 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. //------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //------------------------------------------------------------
  4. using System.Security;
  5. using System.Security.Permissions;
  6. using Microsoft.Win32;
  7. using System.Runtime;
  8. namespace System.ServiceModel.Security
  9. {
  10. static class SecurityUtilsEx
  11. {
  12. static int fipsAlgorithmPolicy = -1;
  13. // Federal Information Processing Standards Publications
  14. // at http://www.itl.nist.gov/fipspubs/geninfo.htm
  15. // Note: this is copied from System.IdentityModel.SecurityUtilsEx.RequiresFipsCompliance.
  16. internal static bool RequiresFipsCompliance
  17. {
  18. [Fx.Tag.SecurityNote(Critical = "Calls an UnsafeNativeMethod and a Critical method (GetFipsAlgorithmPolicyKeyFromRegistry).",
  19. Safe = "Processes the return and just returns a bool, which is safe.")]
  20. [SecuritySafeCritical]
  21. get
  22. {
  23. if (fipsAlgorithmPolicy == -1)
  24. {
  25. if (OSEnvironmentHelper.IsVistaOrGreater)
  26. {
  27. bool fipsEnabled;
  28. #pragma warning suppress 56523 // we check for the return code of the method instead of calling GetLastWin32Error
  29. bool readPolicy = (System.ServiceModel.Channels.UnsafeNativeMethods.ERROR_SUCCESS == System.ServiceModel.Channels.UnsafeNativeMethods.BCryptGetFipsAlgorithmMode(out fipsEnabled));
  30. if (readPolicy && fipsEnabled)
  31. fipsAlgorithmPolicy = 1;
  32. else
  33. fipsAlgorithmPolicy = 0;
  34. }
  35. else
  36. {
  37. fipsAlgorithmPolicy = GetFipsAlgorithmPolicyKeyFromRegistry();
  38. if (fipsAlgorithmPolicy != 1)
  39. fipsAlgorithmPolicy = 0;
  40. }
  41. }
  42. return fipsAlgorithmPolicy == 1;
  43. }
  44. }
  45. const string fipsPolicyRegistryKey = @"System\CurrentControlSet\Control\Lsa";
  46. [Fx.Tag.SecurityNote(Critical = "Asserts to get a value from the registry.")]
  47. [SecurityCritical]
  48. [RegistryPermission(SecurityAction.Assert, Read = @"HKEY_LOCAL_MACHINE\" + fipsPolicyRegistryKey)]
  49. static int GetFipsAlgorithmPolicyKeyFromRegistry()
  50. {
  51. int fipsAlgorithmPolicy = -1;
  52. using (RegistryKey fipsAlgorithmPolicyKey = Registry.LocalMachine.OpenSubKey(fipsPolicyRegistryKey, false))
  53. {
  54. if (fipsAlgorithmPolicyKey != null)
  55. {
  56. object data = fipsAlgorithmPolicyKey.GetValue("FIPSAlgorithmPolicy");
  57. if (data != null)
  58. fipsAlgorithmPolicy = (int)data;
  59. }
  60. }
  61. return fipsAlgorithmPolicy;
  62. }
  63. }
  64. }