Sha256: 174bb4c7e3d218d69a9d941bbf3e1d38bc8207b504e22e774f3e6cbc44807514

Contents?: true

Size: 1.41 KB

Versions: 1

Compression:

Stored size: 1.41 KB

Contents

module Auxilium
  class EasyCrypt
    # When no digest is given, the default Rails digest is used.
    # Digest can be something like OpenSSL::Digest::SHA1 or OpenSSL::Digest::SHA256 
    def initialize(key_base, digest: OpenSSL::Digest::SHA1)
      @key_base = key_base
      @digest = digest
    end

    def encrypt(text)
      text = text.to_s unless text.is_a?(String)

      # Return the crypted text is it was already crypted by this routine
      return text if crypted?(text)
      return text if text.blank?

      data = encrypted(text)
      raise StandardError, 'WTF' unless decrypt(data)
      data
    end

    def decrypt(data)
      return data unless crypted?(data)

      salt, data = data.gsub(/^EasyCrypt@/, '').split("$$", 2)

      crypt(salt).decrypt_and_verify(data)
    end

    private

    def encrypted(text)
      salt = generate_salt
      encrypted_data = crypt(salt).encrypt_and_sign(text)

      "EasyCrypt@#{salt}$$#{encrypted_data}"
    end

    def crypt(salt)
      key = ActiveSupport::KeyGenerator.new(@key_base, hash_digest_class: @digest).generate_key(salt, key_length)
      ActiveSupport::MessageEncryptor.new(key, cipher: 'aes-256-gcm')
    end

    def key_length
      @key_length ||= ActiveSupport::MessageEncryptor.key_len
    end

    def generate_salt
      SecureRandom.hex(key_length)
    end

    def crypted?(text)
      text =~ /^EasyCrypt@[0-9a-f]+\$\$[^-]+--[^-]+--[^-]+/
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
auxilium-3.0.24 lib/auxilium/easy_crypt.rb