Sha256: 8b3b9b1543498bc53074f8795e023d6587120aec7491fcc42a3ef772b13e68fe

Contents?: true

Size: 1.77 KB

Versions: 3

Compression:

Stored size: 1.77 KB

Contents

module  Chamber
module  EncryptionMethods
class   Ssl
  LARGE_DATA_STRING_PATTERN = %r{\A([A-Za-z0-9\+\/#]*\={0,2})#([A-Za-z0-9\+\/#]*\={0,2})#([A-Za-z0-9\+\/#]*\={0,2})\z} # rubocop:disable Metrics/LineLength

  def self.encrypt(_key, value, encryption_key)
    value = YAML.dump(value)
    cipher = OpenSSL::Cipher.new('AES-128-CBC')
    cipher.encrypt
    symmetric_key = cipher.random_key
    iv = cipher.random_iv

    # encrypt all data with this key and iv
    encrypted_data = cipher.update(value) + cipher.final

    # encrypt the key with the public key
    encrypted_key = encryption_key.public_encrypt(symmetric_key)

    # assemble the resulting Base64 encoded data, the key
    Base64.strict_encode64(encrypted_key) + '#' +
    Base64.strict_encode64(iv) + '#' +
    Base64.strict_encode64(encrypted_data)
  end

  def self.decrypt(key, value, decryption_key)
    if decryption_key.nil?
      value
    else
      key, iv, decoded_string = value.
                                match(LARGE_DATA_STRING_PATTERN).
                                captures.
                                map do |part|
                                    Base64.strict_decode64(part)
      end
      key = decryption_key.private_decrypt(key)

      cipher_dec = OpenSSL::Cipher.new('AES-128-CBC')

      cipher_dec.decrypt

      cipher_dec.key = key
      cipher_dec.iv = iv

      begin
        unencrypted_value = cipher_dec.update(decoded_string) + cipher_dec.final
      rescue OpenSSL::Cipher::CipherError
        raise Chamber::Errors::DecryptionFailure,
              'A decryption error occurred. It was probably due to invalid key data.'
      end

      begin
        _unserialized_value = YAML.load(unencrypted_value)
      rescue TypeError
        unencrypted_value
      end
    end
  end
end
end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
chamber-2.10.2 lib/chamber/encryption_methods/ssl.rb
chamber-2.10.1 lib/chamber/encryption_methods/ssl.rb
chamber-2.10.0 lib/chamber/encryption_methods/ssl.rb