class ActiveRecord::Encryption::Cipher

def cipher_for(secret, deterministic: false)

def cipher_for(secret, deterministic: false)
  Aes256Gcm.new(secret, deterministic: deterministic)
end

def decrypt(encrypted_message, key:)

+ActiveRecord::Encryption::Errors::Decryption+ if none works.
When +key+ is an Array, it will try all the keys raising a

Decrypt the provided +Message+.
def decrypt(encrypted_message, key:)
  try_to_decrypt_with_each(encrypted_message, keys: Array(key)).tap do |decrypted_text|
    decrypted_text.force_encoding(encrypted_message.headers.encoding || DEFAULT_ENCODING)
  end
end

def encrypt(clean_text, key:, deterministic: false)

Encrypts the provided text and return an encrypted +Message+.
def encrypt(clean_text, key:, deterministic: false)
  cipher_for(key, deterministic: deterministic).encrypt(clean_text).tap do |message|
    message.headers.encoding = clean_text.encoding.name unless clean_text.encoding == DEFAULT_ENCODING
  end
end

def iv_length

def iv_length
  Aes256Gcm.iv_length
end

def key_length

def key_length
  Aes256Gcm.key_length
end

def try_to_decrypt_with_each(encrypted_text, keys:)

def try_to_decrypt_with_each(encrypted_text, keys:)
  keys.each.with_index do |key, index|
    return cipher_for(key).decrypt(encrypted_text)
  rescue ActiveRecord::Encryption::Errors::Decryption
    raise if index == keys.length - 1
  end
end