public virtual JsonResult Decrypt(DecryptRequestModel model)
        {
            ThrowWhenModelStateIsInvalid();

            var config = CreateConfigXmlDocument(model.Thumbprint, model.XmlInput);

            InitializeProvider(model.Thumbprint);

            // decrypt
            var decryptedSections = new StringBuilder();
            foreach (var node in GetEligibleCryptoNodes(config))
            {
                XmlNode decryptedNode;
                try
                {
                    // sometimes the content may not be decryptable using the provided thumbprint
                    decryptedNode = _provider.Decrypt(node);
                }
                catch (CryptographicException ex)
                {
                    // when decryption fails with this thumbprint, display message to the user
                    return Json(new { error = ex.Message.Trim() });
                }

                // when the decrypted node already has a configProtectionProvider attribute, push it into the builder
                if (decryptedNode.Attributes != null && decryptedNode.Attributes["configProtectionProvider"] != null)
                {
                    // the decrypted node wraps the decrypted xml, so only push its inner xml
                    decryptedSections.Append(decryptedNode.InnerXml.Trim());
                }

                // otherwise, find the decryption target
                else
                {
                    var cryptoNode = FindNestedCryptoNode(decryptedNode);
                    Debug.Assert(cryptoNode.ParentNode != null);

                    // get rid of the crypto node when decrypting
                    cryptoNode.ParentNode.InnerXml = cryptoNode.InnerXml;
                    decryptedSections.Append(decryptedNode.OuterXml);
                }
            }

            // create a brand new config document after decryption is complete
            config = new ConfigXmlDocument
            {
                InnerXml = "<configuration></configuration>",
                DocumentElement = { InnerXml = decryptedSections.ToString() },
            };

            // format and return the decrypted xml
            var decrypted = config.GetFormattedXml();
            return Json(decrypted);
        }
 public virtual JsonResult ValidateDecryptionThumbprint(DecryptRequestModel model)
 {
     //System.Threading.Thread.Sleep(5000);
     var propertyName = model.PropertyName(x => x.Thumbprint);
     if (ModelState.IsValidField(propertyName)) return Json(true);
     var errorMessage = ModelState[propertyName].Errors.First().ErrorMessage;
     return Json(errorMessage);
 }