Sha256: 926220f8d3e0e6fdea3ce201f435a7750bc92545b2039b7d3d5cca508f5afa55

Contents?: true

Size: 1.21 KB

Versions: 7

Compression:

Stored size: 1.21 KB

Contents

require "openssl"
require "base64"

class ComplexConfig::Encryption
  def initialize(secret)
    @secret = secret
    @secret.size != 16 and raise ComplexConfig::EncryptionKeyInvalid,
      "encryption key #{@secret.inspect} must be 16 bytes"
    @cipher = OpenSSL::Cipher.new('aes-128-gcm')
  end

  def encrypt(text)

    @cipher.encrypt
    @cipher.key = @secret
    iv = @cipher.random_iv
    @cipher.auth_data = ""

    encrypted = @cipher.update(Marshal.dump(text))
    encrypted << @cipher.final

    [
      encrypted,
      iv,
      @cipher.auth_tag
    ].map { |v| base64_encode(v) }.join('--')
  end

  def decrypt(text)
    encrypted, iv, auth_tag = text.split('--').map { |v| base64_decode(v) }

    auth_tag.nil? || auth_tag.bytes.length != 16 and
      raise ComplexConfig::DecryptionFailed, "auth_tag #{auth_tag.inspect} invalid"

    @cipher.decrypt
    @cipher.key = @secret
    @cipher.iv  = iv
    @cipher.auth_tag = auth_tag
    @cipher.auth_data = ""

    decrypted_data = @cipher.update(encrypted)
    decrypted_data << @cipher.final

    Marshal.load(decrypted_data)
  end

  private

  def base64_encode(x)
    ::Base64.strict_encode64(x)
  end

  def base64_decode(x)
    ::Base64.strict_decode64(x.strip)
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
complex_config-0.14.0 lib/complex_config/encryption.rb
complex_config-0.13.3 lib/complex_config/encryption.rb
complex_config-0.13.2 lib/complex_config/encryption.rb
complex_config-0.13.1 lib/complex_config/encryption.rb
complex_config-0.13.0 lib/complex_config/encryption.rb
complex_config-0.12.1 lib/complex_config/encryption.rb
complex_config-0.12.0 lib/complex_config/encryption.rb