Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Configuration / System / Configuration / DPAPIProtectedConfigurationProvider.cs / 1560018 / DPAPIProtectedConfigurationProvider.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Configuration { using System.Collections.Specialized; using System.Runtime.Serialization; using System.Configuration.Provider; using System.Xml; using System.Text; using System.Runtime.InteropServices; using Microsoft.Win32; using System.Security.Permissions; using Microsoft.Win32.SafeHandles; using System.Runtime.CompilerServices; [PermissionSet(SecurityAction.Demand, Name = "FullTrust")] public sealed class DpapiProtectedConfigurationProvider : ProtectedConfigurationProvider { public override XmlNode Decrypt(XmlNode encryptedNode) { if (encryptedNode.NodeType != XmlNodeType.Element || encryptedNode.Name != "EncryptedData") { throw new ConfigurationErrorsException(SR.GetString(SR.DPAPI_bad_data)); } XmlNode cipherNode = TraverseToChild(encryptedNode, "CipherData", false); if (cipherNode == null) throw new ConfigurationErrorsException(SR.GetString(SR.DPAPI_bad_data)); XmlNode cipherValue = TraverseToChild(cipherNode, "CipherValue", true); if (cipherValue == null) throw new ConfigurationErrorsException(SR.GetString(SR.DPAPI_bad_data)); string encText = cipherValue.InnerText; if (encText == null) throw new ConfigurationErrorsException(SR.GetString(SR.DPAPI_bad_data)); string decText = DecryptText(encText); XmlDocument xmlDocument = new XmlDocument(); xmlDocument.PreserveWhitespace = true; xmlDocument.LoadXml(decText); return xmlDocument.DocumentElement; } public override XmlNode Encrypt(XmlNode node) { string text = node.OuterXml; string encText = EncryptText(text); string pre = @""; string xmlText = pre + encText + post; XmlDocument xmlDocument = new XmlDocument(); xmlDocument.PreserveWhitespace = true; xmlDocument.LoadXml(xmlText); return xmlDocument.DocumentElement; } ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// private string EncryptText(string clearText) { if (clearText == null || clearText.Length < 1) return clearText; DATA_BLOB inputData, entData, outputData; SafeNativeMemoryHandle safeInputDataHandle = new SafeNativeMemoryHandle(); SafeNativeMemoryHandle safeOutputDataHandle = new SafeNativeMemoryHandle(true); SafeNativeMemoryHandle safeEntDataHandle = new SafeNativeMemoryHandle(); inputData.pbData = entData.pbData = outputData.pbData = IntPtr.Zero; inputData.cbData = entData.cbData = outputData.cbData = 0; try { RuntimeHelpers.PrepareConstrainedRegions(); try { } finally { inputData = PrepareDataBlob(clearText); safeInputDataHandle.SetDataHandle(inputData.pbData); entData = PrepareDataBlob(_KeyEntropy); safeEntDataHandle.SetDataHandle(entData.pbData); } CRYPTPROTECT_PROMPTSTRUCT prompt = PreparePromptStructure(); UInt32 dwFlags = CRYPTPROTECT_UI_FORBIDDEN; if (UseMachineProtection) dwFlags |= CRYPTPROTECT_LOCAL_MACHINE; bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { } finally { success = UnsafeNativeMethods.CryptProtectData(ref inputData, "", ref entData, IntPtr.Zero, ref prompt, dwFlags, ref outputData); safeOutputDataHandle.SetDataHandle(outputData.pbData); } if (!success || outputData.pbData == IntPtr.Zero) { outputData.pbData = IntPtr.Zero; Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); } byte[] buf = new byte[outputData.cbData]; Marshal.Copy(outputData.pbData, buf, 0, buf.Length); return Convert.ToBase64String(buf); } finally { if (!(safeOutputDataHandle == null || safeOutputDataHandle.IsInvalid)) { safeOutputDataHandle.Dispose(); outputData.pbData = IntPtr.Zero; } if (!(safeEntDataHandle == null || safeEntDataHandle.IsInvalid)) { safeEntDataHandle.Dispose(); entData.pbData = IntPtr.Zero; } if (!(safeInputDataHandle == null || safeInputDataHandle.IsInvalid)) { safeInputDataHandle.Dispose(); inputData.pbData = IntPtr.Zero; } } } ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// private string DecryptText(string encText) { if (encText == null || encText.Length < 1) return encText; DATA_BLOB inputData, entData, outputData; SafeNativeMemoryHandle safeInputDataHandle = new SafeNativeMemoryHandle(); SafeNativeMemoryHandle safeOutputDataHandle = new SafeNativeMemoryHandle(true); SafeNativeMemoryHandle safeEntDataHandle = new SafeNativeMemoryHandle(); inputData.pbData = entData.pbData = outputData.pbData = IntPtr.Zero; inputData.cbData = entData.cbData = outputData.cbData = 0; try { RuntimeHelpers.PrepareConstrainedRegions(); try { } finally { inputData = PrepareDataBlob(Convert.FromBase64String(encText)); safeInputDataHandle.SetDataHandle(inputData.pbData); entData = PrepareDataBlob(_KeyEntropy); safeEntDataHandle.SetDataHandle(entData.pbData); } CRYPTPROTECT_PROMPTSTRUCT prompt = PreparePromptStructure(); UInt32 dwFlags = CRYPTPROTECT_UI_FORBIDDEN; if (UseMachineProtection) dwFlags |= CRYPTPROTECT_LOCAL_MACHINE; bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { } finally { success = UnsafeNativeMethods.CryptUnprotectData(ref inputData, IntPtr.Zero, ref entData, IntPtr.Zero, ref prompt, dwFlags, ref outputData); safeOutputDataHandle.SetDataHandle(outputData.pbData); } if (!success || outputData.pbData == IntPtr.Zero) { outputData.pbData = IntPtr.Zero; Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); } byte[] buf = new byte[outputData.cbData]; Marshal.Copy(outputData.pbData, buf, 0, buf.Length); return Encoding.Unicode.GetString(buf); } finally { if (!(safeOutputDataHandle == null || safeOutputDataHandle.IsInvalid)) { safeOutputDataHandle.Dispose(); outputData.pbData = IntPtr.Zero; } if (!(safeEntDataHandle == null || safeEntDataHandle.IsInvalid)) { safeEntDataHandle.Dispose(); entData.pbData = IntPtr.Zero; } if (!(safeInputDataHandle == null || safeInputDataHandle.IsInvalid)) { safeInputDataHandle.Dispose(); inputData.pbData = IntPtr.Zero; } } } public bool UseMachineProtection { get { return _UseMachineProtection; }} //private virtual string KeyEntropy { get { return _KeyEntropy; } } public override void Initialize(string name, NameValueCollection configurationValues) { base.Initialize(name, configurationValues); _UseMachineProtection = GetBooleanValue(configurationValues, "useMachineProtection", true); _KeyEntropy = configurationValues["keyEntropy"]; configurationValues.Remove("keyEntropy"); if (configurationValues.Count > 0) throw new ConfigurationErrorsException(SR.GetString(SR.Unrecognized_initialization_value, configurationValues.GetKey(0))); } private const int CRYPTPROTECT_UI_FORBIDDEN = 0x1; private const int CRYPTPROTECT_LOCAL_MACHINE = 0x4; private bool _UseMachineProtection = true; private string _KeyEntropy; private static XmlNode TraverseToChild(XmlNode node, string name, bool onlyChild) { foreach (XmlNode child in node.ChildNodes) { if (child.NodeType != XmlNodeType.Element) continue; if (child.Name == name) return child; // found it! if (onlyChild) return null; } return null; } private static DATA_BLOB PrepareDataBlob(byte[] buf) { if (buf == null) buf = new byte[0]; DATA_BLOB db = new DATA_BLOB(); db.cbData = buf.Length; db.pbData = Marshal.AllocHGlobal(db.cbData); Marshal.Copy(buf, 0, db.pbData, db.cbData); return db; } private static DATA_BLOB PrepareDataBlob(string s) { return PrepareDataBlob((s != null) ? Encoding.Unicode.GetBytes(s) : new byte[0]); } private static CRYPTPROTECT_PROMPTSTRUCT PreparePromptStructure() { CRYPTPROTECT_PROMPTSTRUCT cps = new CRYPTPROTECT_PROMPTSTRUCT(); cps.cbSize = Marshal.SizeOf(typeof(CRYPTPROTECT_PROMPTSTRUCT)); cps.dwPromptFlags = 0; cps.hwndApp = IntPtr.Zero; cps.szPrompt = null; return cps; } private static bool GetBooleanValue(NameValueCollection configurationValues, string valueName, bool defaultValue) { string s = configurationValues[valueName]; if (s == null) return defaultValue; configurationValues.Remove(valueName); if (s == "true") return true; if (s == "false") return false; throw new ConfigurationErrorsException(SR.GetString(SR.Config_invalid_boolean_attribute, valueName)); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ // "; string post = @" // Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Configuration { using System.Collections.Specialized; using System.Runtime.Serialization; using System.Configuration.Provider; using System.Xml; using System.Text; using System.Runtime.InteropServices; using Microsoft.Win32; using System.Security.Permissions; using Microsoft.Win32.SafeHandles; using System.Runtime.CompilerServices; [PermissionSet(SecurityAction.Demand, Name = "FullTrust")] public sealed class DpapiProtectedConfigurationProvider : ProtectedConfigurationProvider { public override XmlNode Decrypt(XmlNode encryptedNode) { if (encryptedNode.NodeType != XmlNodeType.Element || encryptedNode.Name != "EncryptedData") { throw new ConfigurationErrorsException(SR.GetString(SR.DPAPI_bad_data)); } XmlNode cipherNode = TraverseToChild(encryptedNode, "CipherData", false); if (cipherNode == null) throw new ConfigurationErrorsException(SR.GetString(SR.DPAPI_bad_data)); XmlNode cipherValue = TraverseToChild(cipherNode, "CipherValue", true); if (cipherValue == null) throw new ConfigurationErrorsException(SR.GetString(SR.DPAPI_bad_data)); string encText = cipherValue.InnerText; if (encText == null) throw new ConfigurationErrorsException(SR.GetString(SR.DPAPI_bad_data)); string decText = DecryptText(encText); XmlDocument xmlDocument = new XmlDocument(); xmlDocument.PreserveWhitespace = true; xmlDocument.LoadXml(decText); return xmlDocument.DocumentElement; } public override XmlNode Encrypt(XmlNode node) { string text = node.OuterXml; string encText = EncryptText(text); string pre = @""; string xmlText = pre + encText + post; XmlDocument xmlDocument = new XmlDocument(); xmlDocument.PreserveWhitespace = true; xmlDocument.LoadXml(xmlText); return xmlDocument.DocumentElement; } ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// private string EncryptText(string clearText) { if (clearText == null || clearText.Length < 1) return clearText; DATA_BLOB inputData, entData, outputData; SafeNativeMemoryHandle safeInputDataHandle = new SafeNativeMemoryHandle(); SafeNativeMemoryHandle safeOutputDataHandle = new SafeNativeMemoryHandle(true); SafeNativeMemoryHandle safeEntDataHandle = new SafeNativeMemoryHandle(); inputData.pbData = entData.pbData = outputData.pbData = IntPtr.Zero; inputData.cbData = entData.cbData = outputData.cbData = 0; try { RuntimeHelpers.PrepareConstrainedRegions(); try { } finally { inputData = PrepareDataBlob(clearText); safeInputDataHandle.SetDataHandle(inputData.pbData); entData = PrepareDataBlob(_KeyEntropy); safeEntDataHandle.SetDataHandle(entData.pbData); } CRYPTPROTECT_PROMPTSTRUCT prompt = PreparePromptStructure(); UInt32 dwFlags = CRYPTPROTECT_UI_FORBIDDEN; if (UseMachineProtection) dwFlags |= CRYPTPROTECT_LOCAL_MACHINE; bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { } finally { success = UnsafeNativeMethods.CryptProtectData(ref inputData, "", ref entData, IntPtr.Zero, ref prompt, dwFlags, ref outputData); safeOutputDataHandle.SetDataHandle(outputData.pbData); } if (!success || outputData.pbData == IntPtr.Zero) { outputData.pbData = IntPtr.Zero; Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); } byte[] buf = new byte[outputData.cbData]; Marshal.Copy(outputData.pbData, buf, 0, buf.Length); return Convert.ToBase64String(buf); } finally { if (!(safeOutputDataHandle == null || safeOutputDataHandle.IsInvalid)) { safeOutputDataHandle.Dispose(); outputData.pbData = IntPtr.Zero; } if (!(safeEntDataHandle == null || safeEntDataHandle.IsInvalid)) { safeEntDataHandle.Dispose(); entData.pbData = IntPtr.Zero; } if (!(safeInputDataHandle == null || safeInputDataHandle.IsInvalid)) { safeInputDataHandle.Dispose(); inputData.pbData = IntPtr.Zero; } } } ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// private string DecryptText(string encText) { if (encText == null || encText.Length < 1) return encText; DATA_BLOB inputData, entData, outputData; SafeNativeMemoryHandle safeInputDataHandle = new SafeNativeMemoryHandle(); SafeNativeMemoryHandle safeOutputDataHandle = new SafeNativeMemoryHandle(true); SafeNativeMemoryHandle safeEntDataHandle = new SafeNativeMemoryHandle(); inputData.pbData = entData.pbData = outputData.pbData = IntPtr.Zero; inputData.cbData = entData.cbData = outputData.cbData = 0; try { RuntimeHelpers.PrepareConstrainedRegions(); try { } finally { inputData = PrepareDataBlob(Convert.FromBase64String(encText)); safeInputDataHandle.SetDataHandle(inputData.pbData); entData = PrepareDataBlob(_KeyEntropy); safeEntDataHandle.SetDataHandle(entData.pbData); } CRYPTPROTECT_PROMPTSTRUCT prompt = PreparePromptStructure(); UInt32 dwFlags = CRYPTPROTECT_UI_FORBIDDEN; if (UseMachineProtection) dwFlags |= CRYPTPROTECT_LOCAL_MACHINE; bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { } finally { success = UnsafeNativeMethods.CryptUnprotectData(ref inputData, IntPtr.Zero, ref entData, IntPtr.Zero, ref prompt, dwFlags, ref outputData); safeOutputDataHandle.SetDataHandle(outputData.pbData); } if (!success || outputData.pbData == IntPtr.Zero) { outputData.pbData = IntPtr.Zero; Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); } byte[] buf = new byte[outputData.cbData]; Marshal.Copy(outputData.pbData, buf, 0, buf.Length); return Encoding.Unicode.GetString(buf); } finally { if (!(safeOutputDataHandle == null || safeOutputDataHandle.IsInvalid)) { safeOutputDataHandle.Dispose(); outputData.pbData = IntPtr.Zero; } if (!(safeEntDataHandle == null || safeEntDataHandle.IsInvalid)) { safeEntDataHandle.Dispose(); entData.pbData = IntPtr.Zero; } if (!(safeInputDataHandle == null || safeInputDataHandle.IsInvalid)) { safeInputDataHandle.Dispose(); inputData.pbData = IntPtr.Zero; } } } public bool UseMachineProtection { get { return _UseMachineProtection; }} //private virtual string KeyEntropy { get { return _KeyEntropy; } } public override void Initialize(string name, NameValueCollection configurationValues) { base.Initialize(name, configurationValues); _UseMachineProtection = GetBooleanValue(configurationValues, "useMachineProtection", true); _KeyEntropy = configurationValues["keyEntropy"]; configurationValues.Remove("keyEntropy"); if (configurationValues.Count > 0) throw new ConfigurationErrorsException(SR.GetString(SR.Unrecognized_initialization_value, configurationValues.GetKey(0))); } private const int CRYPTPROTECT_UI_FORBIDDEN = 0x1; private const int CRYPTPROTECT_LOCAL_MACHINE = 0x4; private bool _UseMachineProtection = true; private string _KeyEntropy; private static XmlNode TraverseToChild(XmlNode node, string name, bool onlyChild) { foreach (XmlNode child in node.ChildNodes) { if (child.NodeType != XmlNodeType.Element) continue; if (child.Name == name) return child; // found it! if (onlyChild) return null; } return null; } private static DATA_BLOB PrepareDataBlob(byte[] buf) { if (buf == null) buf = new byte[0]; DATA_BLOB db = new DATA_BLOB(); db.cbData = buf.Length; db.pbData = Marshal.AllocHGlobal(db.cbData); Marshal.Copy(buf, 0, db.pbData, db.cbData); return db; } private static DATA_BLOB PrepareDataBlob(string s) { return PrepareDataBlob((s != null) ? Encoding.Unicode.GetBytes(s) : new byte[0]); } private static CRYPTPROTECT_PROMPTSTRUCT PreparePromptStructure() { CRYPTPROTECT_PROMPTSTRUCT cps = new CRYPTPROTECT_PROMPTSTRUCT(); cps.cbSize = Marshal.SizeOf(typeof(CRYPTPROTECT_PROMPTSTRUCT)); cps.dwPromptFlags = 0; cps.hwndApp = IntPtr.Zero; cps.szPrompt = null; return cps; } private static bool GetBooleanValue(NameValueCollection configurationValues, string valueName, bool defaultValue) { string s = configurationValues[valueName]; if (s == null) return defaultValue; configurationValues.Remove(valueName); if (s == "true") return true; if (s == "false") return false; throw new ConfigurationErrorsException(SR.GetString(SR.Config_invalid_boolean_attribute, valueName)); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. "; string post = @"
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- XmlCharType.cs
- NativeMethods.cs
- CaseExpr.cs
- CmsUtils.cs
- PieceDirectory.cs
- FormView.cs
- VoiceChangeEventArgs.cs
- HandlerBase.cs
- ConcurrentQueue.cs
- ToolBarButton.cs
- PreviewPageInfo.cs
- ResourceDictionary.cs
- BackStopAuthenticationModule.cs
- InputLanguageManager.cs
- PolygonHotSpot.cs
- ThaiBuddhistCalendar.cs
- EditorPartChrome.cs
- CodeTypeMember.cs
- KeyProperty.cs
- EqualityComparer.cs
- DeviceSpecificChoiceCollection.cs
- ScriptDescriptor.cs
- ProxySimple.cs
- Walker.cs
- SiteOfOriginContainer.cs
- Parameter.cs
- QuotedPrintableStream.cs
- PropertySourceInfo.cs
- FormatSelectingMessageInspector.cs
- CorrelationToken.cs
- ScrollViewerAutomationPeer.cs
- ServiceOperationParameter.cs
- PropertyEmitterBase.cs
- SQLMembershipProvider.cs
- HebrewCalendar.cs
- DbConnectionClosed.cs
- RealProxy.cs
- Single.cs
- ModelItemCollectionImpl.cs
- PropertyExpression.cs
- ZipIOCentralDirectoryDigitalSignature.cs
- ListViewCommandEventArgs.cs
- MenuItemBindingCollection.cs
- TextureBrush.cs
- ResourceIDHelper.cs
- TableCell.cs
- LinearKeyFrames.cs
- WindowsButton.cs
- HttpCacheParams.cs
- ConfigurationManagerInternal.cs
- ModifiableIteratorCollection.cs
- StateDesigner.cs
- DataBindingExpressionBuilder.cs
- ZoneMembershipCondition.cs
- MethodAccessException.cs
- Profiler.cs
- DownloadProgressEventArgs.cs
- FileUtil.cs
- MultiPartWriter.cs
- SyntaxCheck.cs
- IndentedWriter.cs
- GroupStyle.cs
- NamespaceDecl.cs
- FormViewDeleteEventArgs.cs
- CheckBox.cs
- ObjectContext.cs
- ControlPersister.cs
- _IPv6Address.cs
- _AutoWebProxyScriptWrapper.cs
- ResourceAttributes.cs
- DeferrableContent.cs
- CodeParameterDeclarationExpression.cs
- XmlAttribute.cs
- PropertySet.cs
- EntityStoreSchemaFilterEntry.cs
- DataGridViewRowEventArgs.cs
- XmlQualifiedNameTest.cs
- DrawingImage.cs
- FixedPageStructure.cs
- wmiutil.cs
- StructuralType.cs
- OutputCacheProfile.cs
- PersistNameAttribute.cs
- DrawingContextFlattener.cs
- XmlDomTextWriter.cs
- WebPartTracker.cs
- SimpleHandlerBuildProvider.cs
- SymmetricKeyWrap.cs
- RoutingChannelExtension.cs
- FirstMatchCodeGroup.cs
- StringSorter.cs
- GroupLabel.cs
- DrawingBrush.cs
- OutputCacheSettingsSection.cs
- DesignerActionUIStateChangeEventArgs.cs
- IntegerFacetDescriptionElement.cs
- OleDbConnectionPoolGroupProviderInfo.cs
- CircleHotSpot.cs
- MetadataArtifactLoaderResource.cs
- BindingExpression.cs