private ConfigXmlReader DecryptConfigSection(ConfigXmlReader reader, ProtectedConfigurationProvider protectionProvider) { ConfigXmlReader clone = reader.Clone(); IConfigErrorInfo err = (IConfigErrorInfo)clone; string encryptedXml = null; string clearTextXml = null; XmlNodeType nodeType; clone.Read(); // Save the file and line at the top of the section string filename = err.Filename; int lineNumber = err.LineNumber; int sectionLineNumber = lineNumber; if (clone.IsEmptyElement) { throw new ConfigurationErrorsException(SR.GetString(SR.EncryptedNode_not_found), filename, lineNumber); } ////////////////////////////////////////////////////////// // Find the <EncryptedData> node for (;;) { clone.Read(); // Keep reading till we find a relavant node nodeType = clone.NodeType; if (nodeType == XmlNodeType.Element && clone.Name == "EncryptedData") { // Found it! break; } if (nodeType == XmlNodeType.EndElement) { throw new ConfigurationErrorsException(SR.GetString(SR.EncryptedNode_not_found), filename, lineNumber); } else if (nodeType != XmlNodeType.Comment && nodeType != XmlNodeType.Whitespace) { // some other unexpected content throw new ConfigurationErrorsException(SR.GetString(SR.EncryptedNode_is_in_invalid_format), filename, lineNumber); } } ////////////////////////////////////////////////////////// // Do the decryption // Save the line at the top of the <EncryptedData> node lineNumber = err.LineNumber; encryptedXml = clone.ReadOuterXml(); try { clearTextXml = CallHostDecryptSection(encryptedXml, protectionProvider, ProtectedConfig); } catch (Exception e) { throw new ConfigurationErrorsException(SR.GetString(SR.Decryption_failed, protectionProvider.Name, e.Message), e, filename, lineNumber); } catch { throw new ConfigurationErrorsException(SR.GetString(SR.Decryption_failed, protectionProvider.Name, ExceptionUtil.NoExceptionInformation), filename, lineNumber); } // Detect if there is any XML left over after <EncryptedData> do { nodeType = clone.NodeType; if (nodeType == XmlNodeType.EndElement) { break; } else if (nodeType != XmlNodeType.Comment && nodeType != XmlNodeType.Whitespace) { // Got other unexpected content throw new ConfigurationErrorsException(SR.GetString(SR.EncryptedNode_is_in_invalid_format), filename, lineNumber); } } while (clone.Read()); // Create a new reader, using the position of the original reader return new ConfigXmlReader(clearTextXml, filename, sectionLineNumber, true); }