Code:
/ 4.0 / 4.0 / untmp / 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 = @"
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- GroupItem.cs
- ScriptMethodAttribute.cs
- ObjectDataSource.cs
- AssemblyAttributesGoHere.cs
- ObjectStateEntry.cs
- DPAPIProtectedConfigurationProvider.cs
- X509WindowsSecurityToken.cs
- HtmlMobileTextWriter.cs
- ConfigurationConverterBase.cs
- CodeTypeMemberCollection.cs
- TextParagraphProperties.cs
- FormatStringEditor.cs
- RadioButton.cs
- ScriptingProfileServiceSection.cs
- EnumConverter.cs
- InstanceDataCollectionCollection.cs
- OrderingInfo.cs
- ContextMenu.cs
- XmlQualifiedName.cs
- OledbConnectionStringbuilder.cs
- ReflectionPermission.cs
- SecurityHelper.cs
- ViewStateModeByIdAttribute.cs
- ToolboxDataAttribute.cs
- Regex.cs
- MaskInputRejectedEventArgs.cs
- StringStorage.cs
- NameSpaceEvent.cs
- ToolStripItemEventArgs.cs
- PatternMatcher.cs
- ToolStripContentPanelRenderEventArgs.cs
- unsafenativemethodsother.cs
- NullableFloatAverageAggregationOperator.cs
- CodeDOMUtility.cs
- InstanceLockException.cs
- ProcessProtocolHandler.cs
- BorderSidesEditor.cs
- DeclarativeExpressionConditionDeclaration.cs
- ContextBase.cs
- DataKey.cs
- WSSecurityOneDotOneReceiveSecurityHeader.cs
- GraphicsState.cs
- DataKeyArray.cs
- DbCommandDefinition.cs
- FixedPageProcessor.cs
- UdpReplyToBehavior.cs
- SafeCryptHandles.cs
- RuntimeConfigLKG.cs
- DefaultValueAttribute.cs
- SQLMoneyStorage.cs
- Int32RectValueSerializer.cs
- FormatSettings.cs
- CodeTypeOfExpression.cs
- RoleManagerModule.cs
- Rect3DValueSerializer.cs
- EmptyEnumerator.cs
- TimeZone.cs
- ImagingCache.cs
- EncryptedKey.cs
- MergeEnumerator.cs
- HtmlLink.cs
- KeyedHashAlgorithm.cs
- StringFreezingAttribute.cs
- ForeignKeyFactory.cs
- NullEntityWrapper.cs
- Rotation3DKeyFrameCollection.cs
- AdapterUtil.cs
- WaitForChangedResult.cs
- GeometryModel3D.cs
- EventDescriptorCollection.cs
- LogWriteRestartAreaState.cs
- log.cs
- Literal.cs
- DashStyles.cs
- MemberAccessException.cs
- RegexNode.cs
- DaylightTime.cs
- Roles.cs
- _IPv6Address.cs
- MediaCommands.cs
- FileSecurity.cs
- ObjectStateEntryBaseUpdatableDataRecord.cs
- CharacterHit.cs
- WSSecurityOneDotOneReceiveSecurityHeader.cs
- ServicePointManager.cs
- SQLMembershipProvider.cs
- GridViewSelectEventArgs.cs
- EntityConnectionStringBuilder.cs
- GraphicsContext.cs
- WebPartRestoreVerb.cs
- MethodBody.cs
- Sql8ExpressionRewriter.cs
- EntityDataSourceView.cs
- ContractListAdapter.cs
- PackageDigitalSignatureManager.cs
- EntityReference.cs
- Expander.cs
- Socket.cs
- Subtree.cs
- FrameworkContentElementAutomationPeer.cs