encryption 1.0.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.rspec CHANGED
@@ -1,2 +1,2 @@
1
1
  --color
2
- --format progress
2
+ --format progress
data/Gemfile CHANGED
@@ -4,4 +4,4 @@ gemspec
4
4
 
5
5
  gem 'rake'
6
6
 
7
- gem 'rspec'
7
+ gem 'rspec'
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- encryption (1.0.1)
4
+ encryption (1.1.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
File without changes
data/README.md CHANGED
@@ -6,70 +6,107 @@ Encryption
6
6
 
7
7
  A simple wrapper for the OpenSSL Cipher library
8
8
 
9
- Usage
10
- -----
11
-
12
- Basic
13
- -----
14
- ```ruby
15
- Encryption.key = 'your encryption key'
16
- enc_str = Encryption.encrypt "data to encrypt" # non-human readable string
17
- Encryption.decrypt enc_str # "data to encrypt"
18
- ```
19
-
20
- Installation
21
- ------------
22
- ```bash
23
- gem install encryption
24
- ```
25
-
26
- Configuration
27
- -------------
28
- You can pass the config settings with a configuration block
29
- ```ruby
30
- Encryption.config do |config|
31
- key: 'encryption key',
32
- iv: 'initialization vector', # Optional
33
- cipher: 'aes-256-cbc' # Optional. Defaults to `aes-256-cbc`
34
- end
35
- ```
36
- `Encryption::key`: is the encryption key. has to be set to use the encryption / decryption methods. Usually about 30+ charecters long.
37
- `Encryption::iv`: _[Optional]_ the initialization vector. Defaults to the charecter "\0".
38
- `Encryption::cipher`: _[Optional]_ the encryption algorithm to be used. Defaults to "aes-256-cbc".
39
-
40
- Advanced
41
- --------
42
- In some cases you'll need a separate instance of the encryptor, rather than a global one.
43
- To do that you just have to create a new instance of the `Encryption::Encryptor` class.
44
- ```ruby
45
- encryptor = Encryption::Encryptor.new
46
- encryptor.key = 'encryption key'
47
- encryptor.iv = 'initialization vector' # Optional
48
- encryptor.cipher = 'aes-128-cbc' # Optional
49
- # Or you can configure it with a block
50
- encryptor.config do |config|
51
- key: 'your encryption key'
52
- end
53
- data = "data to encrypt"
54
- enc_str = encryptor.encrypt(data) # Encrypt the string
55
- dec_str = encryptor.decrypt(enc_str) # Decrypt it
56
- data == dec_str # true
9
+ Installation
10
+ ------------
11
+ Run this command
12
+ ```bash
13
+ gem install encryption
57
14
  ```
58
- String Helper
59
- -------------
60
- The gem adds a few helper methods to the String class. You can use them as follows:
15
+ or add this line to your `Gemfile`
61
16
  ```ruby
62
- "this is not a secret".encrypt # Non human readable string
63
- "this is a secret".encrypt!
64
- "3nCRYpteD DaTA".decrypt
65
- "3nCRYpteD DaTA".decrypt!
17
+ gem "encryption"
66
18
  ```
67
- __Note:__ To use the string helpers you have t oset the encryption with `Encryption.key` or with a configuration block.
68
19
 
69
- License
70
- -------
71
- This gem is published under The MIT License (MIT).
20
+ Symmetric encryption
21
+ --------------------
22
+
23
+ Using a global instance of the Encryption class
24
+ -----------------------------------------------
25
+ A simple example of how the gem works:
26
+ ```ruby
27
+ Encryption.key = "Secretly yours,\n very long encryption key"
28
+ data = "this is to remain secret"
29
+ encrypted_str = Encryption.encrypt(data)
30
+ Encryption.decrypt(encrypted_str) == data # true
31
+ ```
32
+
33
+ Using own instance of the Encryption class
34
+ ------------------------------------------
35
+ Sometimes it is useful to use an own instance with custom settings, rather than the global Encryption instance. Here is how you can achieve it.
36
+ ```ruby
37
+ encryptor = Encryption::Symmetric.new
38
+ encryptor.key = "Secretly yours,\n very long encryption key"
39
+ data = "this is to remain secret"
40
+ encrypted_str = encryptor.encrypt(data)
41
+ encryptor.decrypt(encrypted_str) == data # true
42
+ ```
43
+
44
+ Configuration
45
+ -------------
46
+ For symmetric encryption / decryption you need to set an encryption key. The rest of the settings are optional. Here is a list of all of them:
47
+ `Encryption.key` - Your encryption key
48
+ `Encryption.iv # Optional` - Encryption initialization vector. Defaults to the charecter `"\0"`
49
+ `Encryption.cipher # Optional` - Your encryption algorithm. Defaults to `aes-256-cbc`
50
+ Run `openssl list-cipher-commands` in the terminal to list all installed ciphers or call `OpenSSL::Cipher.ciphers` in _Ruby_, which will return an array, containing all available algorithms.
51
+
52
+ You can optionally configure both a global instance and a custom instance with a __block__:
53
+ ```ruby
54
+ Encryption.config do |config|
55
+ config.key = "don't look at me!"
56
+ config.iv = "is there a better way to initialize OpenSSL?"
57
+ config.cipher = "camellia-128-ecb" # if you feel adventurous
58
+ end
59
+ ```
60
+
61
+ Asymmetric encryption (public/private key encryption)
62
+ -----------------------------------------------------
63
+ The `encryption` gem also provides easier synax for asymmetric encryption.
64
+
65
+ Generating keypair
66
+ ------------------
67
+ ```ruby
68
+ keypair = Encryption::Keypair.new # Accepts two optional arguments size = 2048 and password = nil
69
+ keypair.public_key # Instance of Encryption::PublicKey
70
+ keypair.private_key # Instance of Encryption::PrivateKey
71
+ # Or this for short
72
+ public_key, private_key = Encryption::Keypair.generate(2048)
73
+
74
+ # Then you can export each to string
75
+ private_key.to_s
76
+
77
+ # or to PEM format
78
+ private_key.to_pem
79
+
80
+ # and optionally encrypt is with a passphrase
81
+ private_key.to_pem('passphrase')
82
+ ```
83
+
84
+ `Encryption::PublicKey` and `Encryption::PrivateKey`
85
+ ----------------------------------------------------
86
+ Both classes have the same syntax
87
+
88
+ ```ruby
89
+ # Import an existing key
90
+ Encryption::PublicKey.new(filename[, password]) # From file
91
+ Encryption::PublicKey.new(string[, password]) # From string
92
+
93
+ # Encrypt / Decrypt data
94
+ public_key = Encryption::PublicKey.new("existing key")
95
+ public_key.encrypt("Hello!")
96
+ public_key.encrypt("H3LL0¡")
97
+
98
+ # Note that you can use both public and private keys to encrypt and decrypt data
99
+ ```
100
+
101
+ <!---
102
+ Helpers
103
+ -------
104
+ String helpers
105
+ --------------
106
+
107
+ Array helpers
108
+ -------------
72
109
 
73
- Author
74
- ------
75
- Itay Grudev - ![Itay Grudev](http://safemail.justlikeed.net/e/a5307c0c2dd405f756cab9f4c76cd63a.png)
110
+ Hash helpers
111
+ ------------
112
+ -->
@@ -1,11 +1,11 @@
1
- $LOAD_PATH << File.expand_path("../lib", __FILE__)
1
+ require 'date'
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 'encryption'
5
- s.version = '1.0.2'
5
+ s.version = '1.1.0'
6
6
  s.date = Date.today.to_s
7
7
  s.summary = 'A simple wrapper for the OpenSSL Cipher library'
8
- s.description = 'Encryption provides a simple interface for encryption and decryption with the OpenSSL Cipher library'
8
+ s.description = 'Encryption provides a simple interface for symmetric / asymmetric encryption and decryption with the OpenSSL Cipher library'
9
9
  s.authors = ['Itay Grudev']
10
10
  s.email = ['itay.grudev@gmail.com']
11
11
  s.homepage = 'https://github.com/Itehnological/encryption'
@@ -0,0 +1,2 @@
1
+ require_relative 'configuration/base.rb'
2
+ require_relative 'configuration/symmetric.rb'
@@ -0,0 +1,39 @@
1
+ module Encryption
2
+ module Configuration
3
+ class Base
4
+
5
+ def initialize
6
+ @config = { }
7
+ end
8
+
9
+ def config
10
+ yield self
11
+ end
12
+
13
+ def method_missing(name, *args)
14
+
15
+ return @config[name.to_sym] if is_valid_getter(name)
16
+ return @config[name[0..-2].to_sym] = args[0] if is_valid_setter(name)
17
+
18
+ super
19
+ end
20
+
21
+ def respond_to?(name)
22
+ return true if is_valid_getter(name) or is_valid_setter(name)
23
+ super
24
+ end
25
+
26
+ private
27
+
28
+ def is_valid_getter(name)
29
+ @config.has_key? name.to_sym
30
+ end
31
+
32
+ def is_valid_setter(name)
33
+ name = name.to_s
34
+ name[-1, 1] == '=' and @config.has_key? name[0..-2].to_sym
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,16 @@
1
+ module Encryption
2
+ module Configuration
3
+ class Symmetric < Base
4
+
5
+ def initialize
6
+ super
7
+ @config = {
8
+ :key => nil,
9
+ :iv => "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0",
10
+ :cipher => 'aes-256-cbc'
11
+ }
12
+ end
13
+
14
+ end
15
+ end
16
+ end
@@ -1,18 +1,16 @@
1
- require 'encryption/configuration.rb'
2
- require 'encryption/encryptor.rb'
3
- require 'encryption/string_helper.rb'
4
-
5
- String.send(:include, Encryption::String)
1
+ require_relative 'configuration.rb'
2
+ require_relative 'modules.rb'
3
+ require_relative 'helpers.rb'
6
4
 
7
5
  module Encryption
8
6
 
9
- @@own_instance = nil
7
+ @@instance = nil # An instance to Encryption::Symmetric
10
8
 
11
9
  def self.method_missing(name, *args, &block)
12
10
  initalize_own_instance
13
11
 
14
- if @@own_instance.respond_to?(name)
15
- return @@own_instance.send(name, *args, &block)
12
+ if @@instance.respond_to?(name)
13
+ return @@instance.send(name, *args, &block)
16
14
  end
17
15
 
18
16
  super
@@ -20,14 +18,16 @@ module Encryption
20
18
 
21
19
  def self.respond_to?(name)
22
20
  initalize_own_instance
23
- return true if @@own_instance.respond_to?(name)
21
+
22
+ return true if @@instance.respond_to?(name)
24
23
  super
25
24
  end
26
25
 
27
- private
26
+ private
27
+
28
28
  def self.initalize_own_instance
29
- if @@own_instance.nil?
30
- @@own_instance = Encryption::Encryptor.new
29
+ if @@instance.nil?
30
+ @@instance = Encryption::Symmetric.new
31
31
  end
32
32
  end
33
33
 
File without changes
@@ -0,0 +1,3 @@
1
+ require_relative 'modules/symmetric.rb'
2
+ require_relative 'modules/asymmetric.rb'
3
+ require_relative 'modules/encryptor.rb'
@@ -0,0 +1,4 @@
1
+ require_relative 'asymmetric/keypair.rb'
2
+ require_relative 'asymmetric/pkey.rb'
3
+ require_relative 'asymmetric/public_key.rb'
4
+ require_relative 'asymmetric/private_key.rb'
@@ -0,0 +1,27 @@
1
+ module Encryption
2
+ class Keypair
3
+
4
+ def initialize(size = 2048, password = nil)
5
+ @keypair = OpenSSL::PKey::RSA.new(size)
6
+ @password = password
7
+ end
8
+
9
+ def public_key
10
+ PublicKey.new(@keypair.public_key.to_s, @password)
11
+ end
12
+
13
+ def private_key
14
+ PrivateKey.new(@keypair.to_s, @password)
15
+ end
16
+
17
+ def self.generate(size = 2048, password = nil)
18
+ keypair = OpenSSL::PKey::RSA.new(size)
19
+
20
+ public_key = PublicKey.new(keypair.public_key.to_s, password)
21
+ private_key = PrivateKey.new(keypair.to_s, password)
22
+
23
+ return public_key, private_key
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,30 @@
1
+ module Encryption
2
+ class PKey
3
+
4
+ def initialize(data, password = nil)
5
+ if File.exist?(data)
6
+ data = File.read(data)
7
+ end
8
+
9
+ if password.nil?
10
+ @key = OpenSSL::PKey::RSA.new(data)
11
+ else
12
+ @key = OpenSSL::PKey::RSA.new(data, password)
13
+ end
14
+ end
15
+
16
+ def to_s
17
+ @key.to_s
18
+ end
19
+
20
+ def to_pem(password = nil)
21
+ if password.nil? or password.empty?
22
+ return @key.to_pem
23
+ end
24
+
25
+ cipher = OpenSSL::Cipher::Cipher.new('des3')
26
+ @key.to_pem(cipher, password)
27
+ end
28
+
29
+ end
30
+ end
@@ -0,0 +1,15 @@
1
+ require 'openssl'
2
+
3
+ module Encryption
4
+ class PrivateKey < PKey
5
+
6
+ def encrypt(data)
7
+ @key.private_encrypt(data)
8
+ end
9
+
10
+ def decrypt(data)
11
+ @key.private_decrypt(data)
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require 'openssl'
2
+
3
+ module Encryption
4
+ class PublicKey < PKey
5
+
6
+ def encrypt(data)
7
+ @key.public_encrypt(data)
8
+ end
9
+
10
+ def decrypt(data)
11
+ @key.public_decrypt(data)
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,6 @@
1
+ module Encryption
2
+
3
+ class Encryptor < Symmetric
4
+ end
5
+
6
+ end
@@ -1,14 +1,10 @@
1
1
  require 'openssl'
2
2
 
3
3
  module Encryption
4
- class Encryptor
5
-
6
- @cipher = nil
7
- @decipher = nil
8
- @configuration = nil
9
-
4
+ class Symmetric
5
+
10
6
  def initialize
11
- @configuration = Encryption::Configuration.new
7
+ @configuration = Encryption::Configuration::Symmetric.new
12
8
  end
13
9
 
14
10
  def method_missing(name, *args, &block)
@@ -24,37 +20,36 @@ module Encryption
24
20
  end
25
21
 
26
22
  def encrypt(data)
27
- prepare(_cipher)
28
- _cipher.update(data) + _cipher.final
23
+ cipher_init
24
+ @cipher.update(data) + @cipher.final
29
25
  end
30
26
 
31
27
  def decrypt(data)
32
- prepare(_decipher)
33
- _decipher.update(data) + _decipher.final
28
+ decipher_init
29
+ @decipher.update(data) + @decipher.final
34
30
  end
35
31
 
36
- private
37
- def prepare(what)
38
- what.key = @configuration.key
39
- what.iv = @configuration.iv
40
- end
41
-
42
- def _cipher
32
+ private
33
+
34
+ def cipher_init
43
35
  if @cipher.nil?
44
36
  @cipher = OpenSSL::Cipher.new(@configuration.cipher)
45
37
  @cipher.encrypt
46
38
  end
47
39
 
48
- @cipher
40
+ @cipher.key = @configuration.key
41
+ @cipher.iv = @configuration.iv
49
42
  end
50
43
 
51
- def _decipher
44
+ def decipher_init
52
45
  if @decipher.nil?
53
46
  @decipher = OpenSSL::Cipher.new(@configuration.cipher)
54
47
  @decipher.decrypt
55
48
  end
56
49
 
57
- @decipher
50
+ @decipher.key = @configuration.key
51
+ @decipher.iv = @configuration.iv
58
52
  end
53
+
59
54
  end
60
55
  end
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+
3
+
4
+ describe Encryption::Configuration::Base do
5
+
6
+ it { should respond_to :config }
7
+
8
+ end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+
4
+ describe Encryption::Configuration::Symmetric do
5
+
6
+ it 'should be configurable with a block' do
7
+ key = String.random
8
+ iv = String.random
9
+ cipher = String.random
10
+
11
+ @config = Encryption::Configuration::Symmetric.new
12
+ @config.config do |config|
13
+ config.cipher = cipher
14
+ config.key = key
15
+ config.iv = iv
16
+ end
17
+
18
+ @config.key.should == key
19
+ @config.iv.should == iv
20
+ @config.cipher.should == cipher
21
+ end
22
+
23
+ describe 'should set and return' do
24
+ before(:each) do
25
+ @config = Encryption::Configuration::Symmetric.new
26
+ end
27
+
28
+ it 'key' do
29
+ value = String.random
30
+ @config.key = value
31
+ @config.key.should == value
32
+ end
33
+
34
+ it 'iv' do
35
+ value = String.random
36
+ @config.iv = value
37
+ @config.iv.should == value
38
+ end
39
+
40
+ it 'cipher' do
41
+ value = String.random
42
+ @config.cipher = value
43
+ @config.cipher.should == value
44
+ end
45
+ end
46
+
47
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Encryption::Asymmetric' do
4
+
5
+ before(:each) do
6
+ @string = String.random
7
+ keypair = Encryption::Keypair.new
8
+ @public_key = keypair.public_key
9
+ @private_key = keypair.private_key
10
+ end
11
+
12
+ it 'should encrypt with public key and then decrypt with private key' do
13
+ encrypted = @public_key.encrypt(@string)
14
+ @private_key.decrypt(encrypted).should == @string
15
+ end
16
+
17
+ it 'should encrypt with private key and then decrypt with public key' do
18
+ encrypted = @private_key.encrypt(@string)
19
+ @public_key.decrypt(encrypted).should == @string
20
+ end
21
+
22
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+ require 'openssl'
3
+
4
+ describe Encryption::Keypair do
5
+
6
+ it 'should generate keypairs with generate static method' do
7
+ public_key, private_key = Encryption::Keypair.generate
8
+ public_key.should be_an_instance_of(Encryption::PublicKey)
9
+ private_key.should be_an_instance_of(Encryption::PrivateKey)
10
+ end
11
+
12
+ it 'should generate keypairs with keypair instance' do
13
+ keypair = Encryption::Keypair.new
14
+ keypair.public_key.should be_an_instance_of(Encryption::PublicKey)
15
+ keypair.private_key.should be_an_instance_of(Encryption::PrivateKey)
16
+ end
17
+
18
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe Encryption::PrivateKey do
4
+
5
+ describe do
6
+ before(:each) do
7
+ @key = Encryption::Keypair.new.private_key
8
+ end
9
+
10
+ it 'should generate encryption different than the original' do
11
+ string = String.random
12
+ @key.encrypt(string).should_not == string
13
+ end
14
+ end
15
+
16
+ describe 'should export to' do
17
+ before(:each) do
18
+ @keypair = Encryption::Keypair.new
19
+ @key = @keypair.private_key
20
+ end
21
+
22
+ it 'string' do
23
+ @key.to_s.should be_an_instance_of(String)
24
+ end
25
+
26
+ it 'pem' do
27
+ @key.to_s.should be_an_instance_of(String)
28
+ end
29
+ end
30
+
31
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe Encryption::PublicKey do
4
+
5
+ describe do
6
+ before(:each) do
7
+ @key = Encryption::Keypair.new.public_key
8
+ end
9
+
10
+ it 'should generate encryption different than the original' do
11
+ string = String.random
12
+ @key.encrypt(string).should_not == string
13
+ end
14
+ end
15
+
16
+ describe 'should export to' do
17
+ before(:each) do
18
+ @keypair = Encryption::Keypair.new
19
+ @key = @keypair.public_key
20
+ end
21
+
22
+ it 'string' do
23
+ @key.to_s.should be_an_instance_of(String)
24
+ end
25
+
26
+ it 'pem' do
27
+ @key.to_s.should be_an_instance_of(String)
28
+ end
29
+ end
30
+
31
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+ require 'openssl'
3
+
4
+ describe Encryption do
5
+
6
+ it 'should be configurable with a block' do
7
+ key = String.random
8
+ iv = String.random
9
+ cipher = String.random
10
+
11
+ Encryption.config do |config|
12
+ config.key = key
13
+ config.iv = iv
14
+ config.cipher = cipher
15
+ end
16
+
17
+ Encryption.key.should == key
18
+ Encryption.iv.should == iv
19
+ Encryption.cipher.should == cipher
20
+ end
21
+
22
+ OpenSSL::Cipher.ciphers.each do |cipher|
23
+ next if ! cipher[-3, 3].nil? and ['gcm', 'fb1'].include? cipher[-3, 3].downcase
24
+
25
+ describe 'with cipher ' + cipher do
26
+ before(:each) do
27
+ Encryption.cipher = cipher
28
+
29
+ @string = String.random
30
+ Encryption.key = String.random
31
+ Encryption.iv = String.random
32
+ end
33
+
34
+ it 'should generate encryption different then the original string' do
35
+ encrypted = Encryption.encrypt(@string)
36
+ encrypted.should_not == @string
37
+ end
38
+
39
+ it 'should decrypt, encrypted values and match the original string' do
40
+ encrypted = Encryption.encrypt(@string)
41
+ decrypted = Encryption.decrypt(encrypted)
42
+ decrypted.should == @string
43
+ end
44
+
45
+ end
46
+ end
47
+
48
+ end
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+ require 'openssl'
3
+
4
+ describe Encryption::Symmetric do
5
+
6
+ it 'should be configurable with a block' do
7
+ key = String.random
8
+ iv = String.random
9
+ cipher = String.random
10
+
11
+ encryptor = Encryption::Symmetric.new
12
+
13
+ encryptor.config do |config|
14
+ config.key = key
15
+ config.iv = iv
16
+ config.cipher = cipher
17
+ end
18
+
19
+ encryptor.key.should == key
20
+ encryptor.iv.should == iv
21
+ encryptor.cipher.should == cipher
22
+ end
23
+
24
+ OpenSSL::Cipher.ciphers.each do |cipher|
25
+ next if ! cipher[-3, 3].nil? and ['gcm', 'fb1'].include? cipher[-3, 3].downcase
26
+ describe 'with cipher ' + cipher do
27
+
28
+ before(:each) do
29
+ @encryptor = Encryption::Symmetric.new
30
+ @encryptor.cipher = cipher
31
+
32
+ @string = String.random
33
+ @encryptor.key = String.random
34
+ @encryptor.iv = String.random
35
+ end
36
+
37
+ it 'should generate encryption different then the original string' do
38
+ encrypted = @encryptor.encrypt(@string)
39
+ encrypted.should_not == @string
40
+ end
41
+
42
+ it 'should decrypt, encrypted values and match the original string' do
43
+ encrypted = @encryptor.encrypt(@string)
44
+ decrypted = @encryptor.decrypt(encrypted)
45
+ decrypted.should == @string
46
+ end
47
+
48
+ end
49
+ end
50
+
51
+ end
@@ -3,6 +3,8 @@ require 'bundler/setup'
3
3
 
4
4
  require 'encryption'
5
5
 
6
- RSpec.configure do |config|
7
- # some (optional) config here
6
+ class String
7
+ def self.random
8
+ Digest::SHA256.hexdigest(([Time.now.to_s] * rand(3)).join)
9
+ end
8
10
  end
metadata CHANGED
@@ -1,17 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: encryption
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.0
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Itay Grudev
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2013-03-28 00:00:00.000000000 Z
12
+ date: 2013-03-30 00:00:00.000000000 Z
12
13
  dependencies: []
13
- description: Encryption provides a simple interface for encryption and decryption
14
- with the OpenSSL Cipher library
14
+ description: Encryption provides a simple interface for symmetric / asymmetric encryption
15
+ and decryption with the OpenSSL Cipher library
15
16
  email:
16
17
  - itay.grudev@gmail.com
17
18
  executables: []
@@ -22,41 +23,55 @@ files:
22
23
  - .travis.yml
23
24
  - Gemfile
24
25
  - Gemfile.lock
25
- - LICENSE
26
+ - MIT-LICENSE
26
27
  - README.md
27
28
  - Rakefile
28
29
  - encryption.gemspec
30
+ - lib/configuration.rb
31
+ - lib/configuration/base.rb
32
+ - lib/configuration/symmetric.rb
29
33
  - lib/encryption.rb
30
- - lib/encryption/configuration.rb
31
- - lib/encryption/encryptor.rb
32
- - lib/encryption/string_helper.rb
33
- - spec/encryption_spec.rb
34
- - spec/modules/configuration_spec.rb
35
- - spec/modules/encryptor_spec.rb
36
- - spec/modules/string_helper_spec.rb
34
+ - lib/helpers.rb
35
+ - lib/modules.rb
36
+ - lib/modules/asymmetric.rb
37
+ - lib/modules/asymmetric/keypair.rb
38
+ - lib/modules/asymmetric/pkey.rb
39
+ - lib/modules/asymmetric/private_key.rb
40
+ - lib/modules/asymmetric/public_key.rb
41
+ - lib/modules/encryptor.rb
42
+ - lib/modules/symmetric.rb
43
+ - spec/configuration/base_spec.rb
44
+ - spec/configuration/symmetric_spec.rb
45
+ - spec/encryption/asymmetric/integration_spec.rb
46
+ - spec/encryption/asymmetric/keypair_spec.rb
47
+ - spec/encryption/asymmetric/private_key_spec.rb
48
+ - spec/encryption/asymmetric/public_key_spec.rb
49
+ - spec/encryption/symmetric_global_spec.rb
50
+ - spec/encryption/symmetric_instance_spec.rb
37
51
  - spec/spec_helper.rb
38
52
  homepage: https://github.com/Itehnological/encryption
39
53
  licenses:
40
54
  - MIT
41
- metadata: {}
42
55
  post_install_message:
43
56
  rdoc_options: []
44
57
  require_paths:
45
58
  - lib
46
59
  required_ruby_version: !ruby/object:Gem::Requirement
60
+ none: false
47
61
  requirements:
48
62
  - - ! '>='
49
63
  - !ruby/object:Gem::Version
50
64
  version: '0'
51
65
  required_rubygems_version: !ruby/object:Gem::Requirement
66
+ none: false
52
67
  requirements:
53
68
  - - ! '>='
54
69
  - !ruby/object:Gem::Version
55
70
  version: '0'
56
71
  requirements: []
57
72
  rubyforge_project:
58
- rubygems_version: 2.0.3
73
+ rubygems_version: 1.8.25
59
74
  signing_key:
60
- specification_version: 4
75
+ specification_version: 3
61
76
  summary: A simple wrapper for the OpenSSL Cipher library
62
77
  test_files: []
checksums.yaml DELETED
@@ -1,15 +0,0 @@
1
- ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- MGJmMmI0ZDNlMGYyY2RlZDFhNDVkYmZkNGU0YmRjZmQ1NTViMDI5Yw==
5
- data.tar.gz: !binary |-
6
- NjhhNjdjMDIxMGM5ZjViOTFlMDQ4MDc4NWUyMWE3MjI0NWExMGVmZA==
7
- !binary "U0hBNTEy":
8
- metadata.gz: !binary |-
9
- OGNiYzAyZDk1ZjY0NTkwNzZmMGI2ZWUzMjExMWU1ZmZjODQ3NzIzYTJjMmRm
10
- MjJmNmNjNGY0ZGIyYTYxMTkxNzQ3NDk4MTAwN2U3MzBlZjY2NGM2M2IwMDFk
11
- Y2E1MjNmMmM4ZGJkMzljNzZlMDk2NWY1ZGM4ZTU3Mzc2MDNhZTY=
12
- data.tar.gz: !binary |-
13
- ZjU3MzZlNDkxNWZhMzUzZTQ4ZDQ1ZTEwMDAyMTFhZWYzOTI2Y2U1Y2Y1NzA3
14
- ZWE5NmMxMjAwMGU0NTU3MmEzNWQyYzA0MTZlNGE3ZTljZGY5N2RhMjA0NjRj
15
- MzI4ZGU2YTc5NzY5MzcxODdiNjg2OTE2NTRmY2ExNTI5MGEyY2E=
@@ -1,41 +0,0 @@
1
- module Encryption
2
- class Configuration
3
-
4
- def initialize
5
- @config = {
6
- :key => nil,
7
- :iv => "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0",
8
- :cipher => 'aes-256-cbc'
9
- }
10
- end
11
-
12
- def config
13
- yield self
14
- end
15
-
16
- def method_missing(name, *args)
17
-
18
- return @config[name.to_sym] if is_valid_getter(name)
19
- return @config[name[0..-2].to_sym] = args[0] if is_valid_setter(name)
20
-
21
- super
22
- end
23
-
24
- def respond_to?(name)
25
- return true if is_valid_getter(name) or is_valid_setter(name)
26
- super
27
- end
28
-
29
- private
30
-
31
- def is_valid_getter(name)
32
- @config.has_key? name.to_sym
33
- end
34
-
35
- def is_valid_setter(name)
36
- name = name.to_s
37
- name[-1] == '=' and @config.has_key? name[0..-2].to_sym
38
- end
39
-
40
- end
41
- end
@@ -1,30 +0,0 @@
1
- module Encryption
2
-
3
- #
4
- # Extends String. Adds helper methods for encrypting / decrypting strings
5
- #
6
- module String
7
-
8
- # Returns an encrypted version of a string
9
- def encrypt
10
- Encryption.encrypt self
11
- end
12
-
13
- # Replaces the string with an encrypted version of itself
14
- def encrypt!
15
- replace encrypt
16
- end
17
-
18
- # Returns a decrypted version of a string
19
- def decrypt
20
- Encryption.decrypt self
21
- end
22
-
23
- # Replaces the string with a decrypted version of itself
24
- def decrypt!
25
- replace decrypt
26
- end
27
-
28
- end
29
-
30
- end
@@ -1,55 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Encryption do
4
-
5
- it { should respond_to :key }
6
- it { should respond_to :iv }
7
- it { should respond_to :cipher }
8
- it { should respond_to :encrypt }
9
- it { should respond_to :decrypt }
10
-
11
- random = Proc.new { Digest::SHA256.hexdigest(([Time.now.to_s] * rand(3)).join) }
12
-
13
- it "should be configurable with a block" do
14
- key = random.call
15
- iv = random.call
16
- cipher = OpenSSL::Cipher.ciphers[rand(OpenSSL::Cipher.ciphers.count - 1)]
17
-
18
- Encryption.config do |config|
19
- config.cipher = cipher
20
- config.key = key
21
- config.iv = iv
22
- end
23
-
24
- Encryption.key.should eq key
25
- Encryption.iv.should eq iv
26
- Encryption.cipher.should eq cipher
27
- end
28
-
29
- describe "should encrypt / decrypt at ease" do
30
-
31
- before(:each) do
32
- Encryption.key = random.call
33
- Encryption.iv = random.call
34
- @original = random.call
35
- end
36
-
37
- it "should generate encrypted values different than the original" do
38
- encrypted = Encryption.encrypt(@original)
39
- encrypted.should_not eq @original
40
- end
41
-
42
- it "should decrypt encrypted values so they match the original string" do
43
- encrypted = Encryption.encrypt(@original)
44
- decrypted = Encryption.decrypt(encrypted)
45
- decrypted.should eq @original
46
- end
47
-
48
- it "should generate same encrypted values for equal strings" do
49
- encrypted1 = Encryption.encrypt(@original)
50
- encrypted2 = Encryption.encrypt(@original)
51
- encrypted1.should eq encrypted2
52
- end
53
-
54
- end
55
- end
@@ -1,52 +0,0 @@
1
- require 'spec_helper'
2
- require 'openssl'
3
-
4
- describe Encryption::Configuration do
5
-
6
- it { should respond_to :key }
7
- it { should respond_to :iv }
8
- it { should respond_to :cipher }
9
- it { should respond_to :config }
10
-
11
- random = Proc.new { Digest::SHA256.hexdigest(([Time.now.to_s] * rand(3)).join) }
12
-
13
- it "should be configurable with a block" do
14
- key = random.call
15
- iv = random.call
16
- cipher = random.call
17
-
18
- @config = Encryption::Configuration.new
19
- @config.config do |config|
20
- config.cipher = cipher
21
- config.key = key
22
- config.iv = iv
23
- end
24
-
25
- @config.key.should eq key
26
- @config.iv.should eq iv
27
- @config.cipher.should eq cipher
28
- end
29
-
30
- before(:each) do
31
- @config = Encryption::Configuration.new
32
- end
33
-
34
- it "should set and return key" do
35
- random_value = random.call
36
- @config.key = random_value
37
- @config.key.should == random_value
38
- end
39
-
40
- it "should set and return iv" do
41
- random_value = random.call
42
- @config.iv = random_value
43
- @config.iv.should == random_value
44
- end
45
-
46
- it "should set and return ciper" do
47
- random_value = random.call
48
- @config.cipher = random_value
49
- @config.cipher.should == random_value
50
- end
51
-
52
- end
@@ -1,61 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Encryption::Encryptor do
4
-
5
- it { should respond_to :key }
6
- it { should respond_to :iv }
7
- it { should respond_to :cipher }
8
- it { should respond_to :encrypt }
9
- it { should respond_to :decrypt }
10
-
11
- random = Proc.new { Digest::SHA256.hexdigest(([Time.now.to_s] * rand(3)).join) }
12
-
13
- it "should be configurable with a block" do
14
- key = random.call
15
- iv = random.call
16
- cipher = random.call
17
-
18
- @encryptor = Encryption::Encryptor.new
19
- @encryptor.config do |config|
20
- config.cipher = cipher
21
- config.key = key
22
- config.iv = iv
23
- end
24
-
25
- @encryptor.key.should eq key
26
- @encryptor.iv.should eq iv
27
- @encryptor.cipher.should eq cipher
28
- end
29
-
30
- describe "should encrypt / decrypt at ease" do
31
-
32
- OpenSSL::Cipher.ciphers.each do |cipher|
33
- before(:each) do
34
- @encryptor = Encryption::Encryptor.new
35
- @encryptor.cipher = cipher
36
- @encryptor.key = random.call
37
- @encryptor.iv = random.call
38
- @original = random.call
39
- end
40
-
41
-
42
- it "should generate encrypted values different than the original" do
43
- encrypted = @encryptor.encrypt(@original)
44
- encrypted.should_not eq @original
45
- end
46
-
47
- it "should decrypt encrypted values so they match the original string" do
48
- encrypted = @encryptor.encrypt(@original)
49
- decrypted = @encryptor.decrypt(encrypted)
50
- decrypted.should eq @original
51
- end
52
-
53
- it "should generate same encrypted values for equal strings" do
54
- encrypted1 = @encryptor.encrypt(@original)
55
- encrypted2 = @encryptor.encrypt(@original)
56
- encrypted1.should eq encrypted2
57
- end
58
- end
59
-
60
- end
61
- end
@@ -1,38 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe String do
4
-
5
- it { should respond_to :encrypt }
6
- it { should respond_to :encrypt! }
7
- it { should respond_to :decrypt }
8
- it { should respond_to :decrypt! }
9
-
10
- before(:all) do
11
- random = Proc.new { Digest::SHA256.hexdigest(([Time.now.to_s] * rand(3)).join) }
12
-
13
- Encryption.config do |config|
14
- config.key = random.call
15
- config.iv = random.call
16
- end
17
-
18
- @random_string = random.call
19
- end
20
-
21
- it "should generate encrypted values different than the original" do
22
- encrypted = @random_string.encrypt
23
- encrypted.should_not eq @random_string
24
- end
25
-
26
- it "should decrypt encrypted values so they match the original string" do
27
- encrypted = @random_string.encrypt
28
- decrypted = encrypted.decrypt
29
- decrypted.should eq @random_string
30
- end
31
-
32
- it "should generate same encrypted values for equal strings" do
33
- encrypted1 = @random_string.encrypt
34
- encrypted2 = @random_string.encrypt
35
- encrypted1.should eq encrypted2
36
- end
37
-
38
- end