/// <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); }