/// <summary>
        /// Decrypt RestSharp response payloads.
        /// </summary>
        /// <param name="response">A RestSharp response object</param>
        public void InterceptResponse(IRestResponse response)
        {
            if (response == null)
            {
                throw new ArgumentNullException(nameof(response));
            }

            try
            {
                // Read response payload
                var encryptedPayload = response.Content;
                if (string.IsNullOrEmpty(encryptedPayload))
                {
                    // Nothing to decrypt
                    return;
                }

                // Decrypt fields & update headers
                string decryptedPayload;
                if (_config.UseHttpHeaders())
                {
                    // Read encryption params from HTTP headers and delete headers
                    var ivValue           = ReadAndRemoveHeader(response, _config.IvHeaderName);
                    var encryptedKeyValue = ReadAndRemoveHeader(response, _config.EncryptedKeyHeaderName);
                    var oaepPaddingDigestAlgorithmValue = ReadAndRemoveHeader(response, _config.OaepPaddingDigestAlgorithmHeaderName);
                    ReadAndRemoveHeader(response, _config.EncryptionCertificateFingerprintHeaderName);
                    ReadAndRemoveHeader(response, _config.EncryptionKeyFingerprintHeaderName);
                    var parameters = new FieldLevelEncryptionParams(_config, ivValue, encryptedKeyValue, oaepPaddingDigestAlgorithmValue);
                    decryptedPayload = FieldLevelEncryption.DecryptPayload(encryptedPayload, _config, parameters);
                }
                else
                {
                    // Encryption params are stored in the payload
                    decryptedPayload = FieldLevelEncryption.DecryptPayload(encryptedPayload, _config);
                }

                // Update body and content length
                var contentTypeInfo = response.GetType().GetTypeInfo().GetDeclaredField("_content");
                contentTypeInfo.SetValue(response, new Lazy <string>(() => decryptedPayload));
            }
            catch (EncryptionException)
            {
                throw;
            }
            catch (Exception e)
            {
                throw new EncryptionException("Failed to intercept and decrypt response!", e);
            }
        }
        /// <summary>
        /// Decrypt a RestSharp response payload
        /// </summary>
        /// <param name="response">A RestSharp response object</param>
        /// <param name="encryptedPayload">The encrypted payload to be decrypted</param>
        /// <returns>The decrypted payload</returns>
        internal override string DecryptPayload(IRestResponse response, string encryptedPayload)
        {
            // Decrypt fields & update headers
            string decryptedPayload;

            if (_config.UseHttpHeaders())
            {
                // Read encryption params from HTTP headers and delete headers
                var ivValue           = ReadAndRemoveHeader(response, _config.IvHeaderName);
                var encryptedKeyValue = ReadAndRemoveHeader(response, _config.EncryptedKeyHeaderName);
                var oaepPaddingDigestAlgorithmValue = ReadAndRemoveHeader(response, _config.OaepPaddingDigestAlgorithmHeaderName);
                ReadAndRemoveHeader(response, _config.EncryptionCertificateFingerprintHeaderName);
                ReadAndRemoveHeader(response, _config.EncryptionKeyFingerprintHeaderName);
                var parameters = new FieldLevelEncryptionParams(_config, ivValue, encryptedKeyValue, oaepPaddingDigestAlgorithmValue);
                decryptedPayload = FieldLevelEncryption.DecryptPayload(encryptedPayload, _config, parameters);
            }
            else
            {
                // Encryption params are stored in the payload
                decryptedPayload = FieldLevelEncryption.DecryptPayload(encryptedPayload, _config);
            }
            return(decryptedPayload);
        }
        internal static void AssertDecryptedPayloadEquals(string expectedPayload, string encryptedPayload, FieldLevelEncryptionConfig config)
        {
            var payloadString = FieldLevelEncryption.DecryptPayload(encryptedPayload, config);

            AssertPayloadEquals(expectedPayload, payloadString);
        }