Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / fx / src / Configuration / System / Configuration / DPAPIProtectedConfigurationProvider.cs / 1 / 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; string desc = ""; if (UseMachineProtection) dwFlags |= CRYPTPROTECT_LOCAL_MACHINE; bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { } finally { success = UnsafeNativeMethods.CryptUnprotectData(ref inputData, ref desc, 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; string desc = ""; if (UseMachineProtection) dwFlags |= CRYPTPROTECT_LOCAL_MACHINE; bool success = false; RuntimeHelpers.PrepareConstrainedRegions(); try { } finally { success = UnsafeNativeMethods.CryptUnprotectData(ref inputData, ref desc, 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
- DNS.cs
- NotifyParentPropertyAttribute.cs
- PseudoWebRequest.cs
- SQLMoneyStorage.cs
- Menu.cs
- ProtocolElement.cs
- SplitContainer.cs
- LogoValidationException.cs
- DatatypeImplementation.cs
- BezierSegment.cs
- AsyncCompletedEventArgs.cs
- SRGSCompiler.cs
- ExpandoObject.cs
- TemplateField.cs
- ServicePointManagerElement.cs
- RenderDataDrawingContext.cs
- InnerItemCollectionView.cs
- SimpleRecyclingCache.cs
- XmlSchemaSimpleTypeUnion.cs
- Utility.cs
- SystemColors.cs
- ObjectCache.cs
- DecoderFallback.cs
- XmlSchemaAnnotated.cs
- OperationCanceledException.cs
- SqlServices.cs
- DataGridHyperlinkColumn.cs
- DriveNotFoundException.cs
- BindingCompleteEventArgs.cs
- SoapCommonClasses.cs
- TimeSpanSecondsConverter.cs
- SqlBulkCopyColumnMappingCollection.cs
- CachingHintValidation.cs
- EntityDataSourceView.cs
- BindingExpression.cs
- _SingleItemRequestCache.cs
- UrlPath.cs
- DetailsViewRowCollection.cs
- NodeLabelEditEvent.cs
- DataRowChangeEvent.cs
- DispatcherFrame.cs
- ReliabilityContractAttribute.cs
- UnorderedHashRepartitionStream.cs
- ComPlusServiceLoader.cs
- HandlerElementCollection.cs
- IRCollection.cs
- CodePageEncoding.cs
- Int32CollectionValueSerializer.cs
- PropertyGridEditorPart.cs
- LoaderAllocator.cs
- DesignBindingConverter.cs
- SQLByte.cs
- ZipIOCentralDirectoryDigitalSignature.cs
- DataGridViewRowCollection.cs
- SystemInfo.cs
- ComponentChangingEvent.cs
- PrintPreviewDialog.cs
- EventSourceCreationData.cs
- ILGenerator.cs
- FormsAuthentication.cs
- FormViewPageEventArgs.cs
- Vector3DConverter.cs
- ClientApiGenerator.cs
- TreeViewBindingsEditorForm.cs
- RootProfilePropertySettingsCollection.cs
- PassportPrincipal.cs
- TreeChangeInfo.cs
- XmlWriterSettings.cs
- ZipPackage.cs
- GrammarBuilderRuleRef.cs
- ComponentConverter.cs
- TreeViewItem.cs
- FixedHyperLink.cs
- SplitContainer.cs
- SafeHandles.cs
- PostBackOptions.cs
- WithParamAction.cs
- RangeValidator.cs
- SqlComparer.cs
- SimpleType.cs
- ObjectAnimationUsingKeyFrames.cs
- SqlDataAdapter.cs
- RotateTransform3D.cs
- Dump.cs
- TypefaceCollection.cs
- XmlSchemaType.cs
- HtmlForm.cs
- DateTimeOffset.cs
- PrivacyNoticeBindingElementImporter.cs
- MatchAttribute.cs
- XPathPatternBuilder.cs
- WebControlsSection.cs
- Accessible.cs
- ClientRuntimeConfig.cs
- GeneralTransform.cs
- BuildManagerHost.cs
- SystemColors.cs
- _LazyAsyncResult.cs
- UserControlAutomationPeer.cs
- InputMethod.cs