Sha256: 93fd372c7c1d5a4310afa190cf2686a8fc70ccc05758fb340439dfd5d407e4b0

Contents?: true

Size: 1.72 KB

Versions: 1060

Compression:

Stored size: 1.72 KB

Contents

require 'stringio'
require 'tempfile'

module Aws
  module S3
    module Encryption

      # Provides an IO wrapper encrpyting a stream of data.
      # It is possible to use this same object for decrypting. You must
      # initialize it with a decryptiion cipher in that case and the
      # IO object must contain cipher text instead of plain text.
      # @api private
      class IOEncrypter

        # @api private
        ONE_MEGABYTE = 1024 * 1024

        def initialize(cipher, io)
          @encrypted = io.size <= ONE_MEGABYTE ?
            encrypt_to_stringio(cipher, io.read) :
            encrypt_to_tempfile(cipher, io)
          @size = @encrypted.size
        end

        # @return [Integer]
        attr_reader :size

        def read(bytes =  nil, output_buffer = nil)
          if Tempfile === @encrypted && @encrypted.closed?
            @encrypted.open
            @encrypted.binmode
          end
          @encrypted.read(bytes, output_buffer)
        end

        def rewind
          @encrypted.rewind
        end

        # @api private
        def close
          @encrypted.close if Tempfile === @encrypted
        end

        private

        def encrypt_to_stringio(cipher, plain_text)
          if plain_text.empty?
            StringIO.new(cipher.final)
          else
            StringIO.new(cipher.update(plain_text) + cipher.final)
          end
        end

        def encrypt_to_tempfile(cipher, io)
          encrypted = Tempfile.new(self.object_id.to_s)
          encrypted.binmode
          while chunk = io.read(ONE_MEGABYTE)
            encrypted.write(cipher.update(chunk))
          end
          encrypted.write(cipher.final)
          encrypted.rewind
          encrypted
        end

      end
    end
  end
end

Version data entries

1,060 entries across 1,060 versions & 3 rubygems

Version Path
aws-sdk-resources-2.11.561 lib/aws-sdk-resources/services/s3/encryption/io_encrypter.rb
aws-sdk-resources-2.11.560 lib/aws-sdk-resources/services/s3/encryption/io_encrypter.rb
aws-sdk-resources-2.11.559 lib/aws-sdk-resources/services/s3/encryption/io_encrypter.rb
aws-sdk-resources-2.11.558 lib/aws-sdk-resources/services/s3/encryption/io_encrypter.rb
aws-sdk-resources-2.11.557 lib/aws-sdk-resources/services/s3/encryption/io_encrypter.rb
aws-sdk-resources-2.11.556 lib/aws-sdk-resources/services/s3/encryption/io_encrypter.rb
aws-sdk-resources-2.11.555 lib/aws-sdk-resources/services/s3/encryption/io_encrypter.rb
aws-sdk-resources-2.11.554 lib/aws-sdk-resources/services/s3/encryption/io_encrypter.rb
aws-sdk-resources-2.11.553 lib/aws-sdk-resources/services/s3/encryption/io_encrypter.rb
aws-sdk-resources-2.11.552 lib/aws-sdk-resources/services/s3/encryption/io_encrypter.rb
aws-sdk-resources-2.11.551 lib/aws-sdk-resources/services/s3/encryption/io_encrypter.rb
aws-sdk-resources-2.11.550 lib/aws-sdk-resources/services/s3/encryption/io_encrypter.rb
aws-sdk-resources-2.11.549 lib/aws-sdk-resources/services/s3/encryption/io_encrypter.rb
aws-sdk-resources-2.11.548 lib/aws-sdk-resources/services/s3/encryption/io_encrypter.rb
aws-sdk-resources-2.11.547 lib/aws-sdk-resources/services/s3/encryption/io_encrypter.rb
aws-sdk-resources-2.11.546 lib/aws-sdk-resources/services/s3/encryption/io_encrypter.rb
aws-sdk-resources-2.11.545 lib/aws-sdk-resources/services/s3/encryption/io_encrypter.rb
aws-sdk-resources-2.11.544 lib/aws-sdk-resources/services/s3/encryption/io_encrypter.rb
aws-sdk-resources-2.11.543 lib/aws-sdk-resources/services/s3/encryption/io_encrypter.rb
aws-sdk-resources-2.11.542 lib/aws-sdk-resources/services/s3/encryption/io_encrypter.rb