aes 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +4 -4
- data/README.rdoc +15 -0
- data/Rakefile +1 -8
- data/VERSION +1 -1
- data/aes.gemspec +17 -23
- data/lib/aes/aes.rb +12 -4
- data/test/test_aes.rb +11 -0
- metadata +25 -52
data/Gemfile
CHANGED
@@ -6,8 +6,8 @@ source "http://rubygems.org"
|
|
6
6
|
# Add dependencies to develop your gem here.
|
7
7
|
# Include everything needed to run rake, tests, features, etc.
|
8
8
|
group :development do
|
9
|
-
gem "shoulda"
|
10
|
-
gem "bundler"
|
11
|
-
gem "jeweler"
|
12
|
-
gem "
|
9
|
+
gem "shoulda"
|
10
|
+
gem "bundler"
|
11
|
+
gem "jeweler"
|
12
|
+
gem "simplecov"
|
13
13
|
end
|
data/README.rdoc
CHANGED
@@ -33,6 +33,21 @@ Usage:
|
|
33
33
|
AES.decrypt(plain, key, {:format => :plain})
|
34
34
|
=> "A super secret message"
|
35
35
|
|
36
|
+
# By default data is padded to the nearest 16 bytes block. To turn
|
37
|
+
# this off, you may use the :padding => false (or nil) option.
|
38
|
+
#
|
39
|
+
# In this mode however, the caller is required to pad the data. In
|
40
|
+
# the following example the message is exactly 16 bytes long, so no
|
41
|
+
# error aries.
|
42
|
+
msg = AES.encrypt("A secret message", key, {:padding => false})
|
43
|
+
=> "SnD+WIfEfjZRrl+WAM/9pw==$89sGGZsu973j8Gl6aXC8Uw=="
|
44
|
+
|
45
|
+
# Be sure to pass the same padding option when decrypting the
|
46
|
+
# message, as it will fail if you try to decrypt unpadded data and
|
47
|
+
# didn't specify :padding => false.
|
48
|
+
AES.decrypt(msg, key, {:padding => false})
|
49
|
+
=> "A secret message"
|
50
|
+
|
36
51
|
== Contributing to aes
|
37
52
|
|
38
53
|
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
|
data/Rakefile
CHANGED
@@ -34,16 +34,9 @@ Rake::TestTask.new(:test) do |test|
|
|
34
34
|
test.verbose = true
|
35
35
|
end
|
36
36
|
|
37
|
-
require 'rcov/rcovtask'
|
38
|
-
Rcov::RcovTask.new do |test|
|
39
|
-
test.libs << 'test'
|
40
|
-
test.pattern = 'test/**/test_*.rb'
|
41
|
-
test.verbose = true
|
42
|
-
end
|
43
|
-
|
44
37
|
task :default => :test
|
45
38
|
|
46
|
-
require '
|
39
|
+
require 'rdoc/task'
|
47
40
|
Rake::RDocTask.new do |rdoc|
|
48
41
|
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
49
42
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.5.0
|
data/aes.gemspec
CHANGED
@@ -4,15 +4,14 @@
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version = "0.
|
7
|
+
s.name = "aes"
|
8
|
+
s.version = "0.5.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Carl Hicks"]
|
12
|
-
s.date =
|
13
|
-
s.description =
|
14
|
-
|
15
|
-
s.email = %q{carl.hicks@gmail.com}
|
12
|
+
s.date = "2012-05-01"
|
13
|
+
s.description = "An AES encrypt/decrypt gem built ontop of OpenSSL. Not as quick as FastAES, but it doesn't require building\n native extensions and supports Base64 encoded input and output."
|
14
|
+
s.email = "carl.hicks@gmail.com"
|
16
15
|
s.extra_rdoc_files = [
|
17
16
|
"LICENSE.txt",
|
18
17
|
"README.rdoc"
|
@@ -30,36 +29,31 @@ Gem::Specification.new do |s|
|
|
30
29
|
"test/helper.rb",
|
31
30
|
"test/test_aes.rb"
|
32
31
|
]
|
33
|
-
s.homepage =
|
32
|
+
s.homepage = "http://github.com/chicks/aes"
|
34
33
|
s.licenses = ["MIT"]
|
35
34
|
s.require_paths = ["lib"]
|
36
|
-
s.rubygems_version =
|
37
|
-
s.summary =
|
38
|
-
s.test_files = [
|
39
|
-
"test/helper.rb",
|
40
|
-
"test/test_aes.rb"
|
41
|
-
]
|
35
|
+
s.rubygems_version = "1.8.12"
|
36
|
+
s.summary = "AES#encrypt(key, data), AES#decrypt(key, data). Capiche?"
|
42
37
|
|
43
38
|
if s.respond_to? :specification_version then
|
44
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
45
39
|
s.specification_version = 3
|
46
40
|
|
47
41
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
48
42
|
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
49
|
-
s.add_development_dependency(%q<bundler>, ["
|
50
|
-
s.add_development_dependency(%q<jeweler>, ["
|
51
|
-
s.add_development_dependency(%q<
|
43
|
+
s.add_development_dependency(%q<bundler>, [">= 0"])
|
44
|
+
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
45
|
+
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
52
46
|
else
|
53
47
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
54
|
-
s.add_dependency(%q<bundler>, ["
|
55
|
-
s.add_dependency(%q<jeweler>, ["
|
56
|
-
s.add_dependency(%q<
|
48
|
+
s.add_dependency(%q<bundler>, [">= 0"])
|
49
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
50
|
+
s.add_dependency(%q<simplecov>, [">= 0"])
|
57
51
|
end
|
58
52
|
else
|
59
53
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
60
|
-
s.add_dependency(%q<bundler>, ["
|
61
|
-
s.add_dependency(%q<jeweler>, ["
|
62
|
-
s.add_dependency(%q<
|
54
|
+
s.add_dependency(%q<bundler>, [">= 0"])
|
55
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
56
|
+
s.add_dependency(%q<simplecov>, [">= 0"])
|
63
57
|
end
|
64
58
|
end
|
65
59
|
|
data/lib/aes/aes.rb
CHANGED
@@ -122,11 +122,13 @@ module AES
|
|
122
122
|
# Merge init options with defaults
|
123
123
|
def merge_options(opts)
|
124
124
|
@options = {
|
125
|
-
:format
|
126
|
-
:cipher
|
127
|
-
:iv
|
125
|
+
:format => :base_64,
|
126
|
+
:cipher => "AES-256-CBC",
|
127
|
+
:iv => nil,
|
128
|
+
:padding => true, # use cipher padding by default
|
128
129
|
}.merge! opts
|
129
130
|
_handle_iv
|
131
|
+
_handle_padding
|
130
132
|
end
|
131
133
|
|
132
134
|
def _handle_iv
|
@@ -139,12 +141,18 @@ module AES
|
|
139
141
|
end
|
140
142
|
end
|
141
143
|
|
144
|
+
def _handle_padding
|
145
|
+
# convert value to what OpenSSL module format expects
|
146
|
+
@options[:padding] = @options[:padding] ? 1 : 0
|
147
|
+
end
|
148
|
+
|
142
149
|
# Create a new cipher using the cipher type specified
|
143
150
|
def _setup(action)
|
144
151
|
@cipher ||= OpenSSL::Cipher::Cipher.new(@options[:cipher])
|
145
152
|
# Toggles encryption mode
|
146
153
|
@cipher.send(action)
|
154
|
+
@cipher.padding = @options[:padding]
|
147
155
|
@cipher.key = @key.unpack('a2'*32).map{|x| x.hex}.pack('c'*32)
|
148
156
|
end
|
149
157
|
end
|
150
|
-
end
|
158
|
+
end
|
data/test/test_aes.rb
CHANGED
@@ -19,6 +19,17 @@ class TestAES < Test::Unit::TestCase
|
|
19
19
|
enc2 = AES.encrypt(msg, key, {:iv => iv})
|
20
20
|
assert_equal enc1, enc2
|
21
21
|
end
|
22
|
+
|
23
|
+
should "handle padding option" do
|
24
|
+
key = "01234567890123456789012345678901"
|
25
|
+
msg = "This is a message that nobody should ever see"
|
26
|
+
# unpadded message length should be a multiple of cipher block
|
27
|
+
# length (16 bytes)
|
28
|
+
msg += " "*(16 - (msg.length % 16))
|
29
|
+
|
30
|
+
enc = AES.encrypt(msg, key, {:padding => false})
|
31
|
+
assert_equal msg, AES.decrypt(enc, key, {:padding => false})
|
32
|
+
end
|
22
33
|
|
23
34
|
should "generate a new key when AES#key" do
|
24
35
|
assert_equal 32, AES.key.length
|
metadata
CHANGED
@@ -1,13 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 4
|
9
|
-
- 0
|
10
|
-
version: 0.4.0
|
4
|
+
prerelease:
|
5
|
+
version: 0.5.0
|
11
6
|
platform: ruby
|
12
7
|
authors:
|
13
8
|
- Carl Hicks
|
@@ -15,69 +10,52 @@ autorequire:
|
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
12
|
|
18
|
-
date:
|
19
|
-
default_executable:
|
13
|
+
date: 2012-05-01 00:00:00 Z
|
20
14
|
dependencies:
|
21
15
|
- !ruby/object:Gem::Dependency
|
22
|
-
type: :development
|
23
|
-
prerelease: false
|
24
16
|
name: shoulda
|
25
|
-
|
17
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
26
18
|
none: false
|
27
19
|
requirements:
|
28
20
|
- - ">="
|
29
21
|
- !ruby/object:Gem::Version
|
30
|
-
hash: 3
|
31
|
-
segments:
|
32
|
-
- 0
|
33
22
|
version: "0"
|
34
|
-
requirement: *id001
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
23
|
type: :development
|
37
24
|
prerelease: false
|
25
|
+
version_requirements: *id001
|
26
|
+
- !ruby/object:Gem::Dependency
|
38
27
|
name: bundler
|
39
|
-
|
28
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
29
|
none: false
|
41
30
|
requirements:
|
42
|
-
- -
|
31
|
+
- - ">="
|
43
32
|
- !ruby/object:Gem::Version
|
44
|
-
|
45
|
-
segments:
|
46
|
-
- 1
|
47
|
-
- 0
|
48
|
-
- 0
|
49
|
-
version: 1.0.0
|
50
|
-
requirement: *id002
|
51
|
-
- !ruby/object:Gem::Dependency
|
33
|
+
version: "0"
|
52
34
|
type: :development
|
53
35
|
prerelease: false
|
36
|
+
version_requirements: *id002
|
37
|
+
- !ruby/object:Gem::Dependency
|
54
38
|
name: jeweler
|
55
|
-
|
39
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
56
40
|
none: false
|
57
41
|
requirements:
|
58
|
-
- -
|
42
|
+
- - ">="
|
59
43
|
- !ruby/object:Gem::Version
|
60
|
-
|
61
|
-
segments:
|
62
|
-
- 1
|
63
|
-
- 5
|
64
|
-
- 1
|
65
|
-
version: 1.5.1
|
66
|
-
requirement: *id003
|
67
|
-
- !ruby/object:Gem::Dependency
|
44
|
+
version: "0"
|
68
45
|
type: :development
|
69
46
|
prerelease: false
|
70
|
-
|
71
|
-
|
47
|
+
version_requirements: *id003
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: simplecov
|
50
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
72
51
|
none: false
|
73
52
|
requirements:
|
74
53
|
- - ">="
|
75
54
|
- !ruby/object:Gem::Version
|
76
|
-
hash: 3
|
77
|
-
segments:
|
78
|
-
- 0
|
79
55
|
version: "0"
|
80
|
-
|
56
|
+
type: :development
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: *id004
|
81
59
|
description: |-
|
82
60
|
An AES encrypt/decrypt gem built ontop of OpenSSL. Not as quick as FastAES, but it doesn't require building
|
83
61
|
native extensions and supports Base64 encoded input and output.
|
@@ -101,7 +79,6 @@ files:
|
|
101
79
|
- lib/aes/aes.rb
|
102
80
|
- test/helper.rb
|
103
81
|
- test/test_aes.rb
|
104
|
-
has_rdoc: true
|
105
82
|
homepage: http://github.com/chicks/aes
|
106
83
|
licenses:
|
107
84
|
- MIT
|
@@ -115,7 +92,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
115
92
|
requirements:
|
116
93
|
- - ">="
|
117
94
|
- !ruby/object:Gem::Version
|
118
|
-
hash:
|
95
|
+
hash: 4067267818170155209
|
119
96
|
segments:
|
120
97
|
- 0
|
121
98
|
version: "0"
|
@@ -124,17 +101,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
124
101
|
requirements:
|
125
102
|
- - ">="
|
126
103
|
- !ruby/object:Gem::Version
|
127
|
-
hash: 3
|
128
|
-
segments:
|
129
|
-
- 0
|
130
104
|
version: "0"
|
131
105
|
requirements: []
|
132
106
|
|
133
107
|
rubyforge_project:
|
134
|
-
rubygems_version: 1.
|
108
|
+
rubygems_version: 1.8.12
|
135
109
|
signing_key:
|
136
110
|
specification_version: 3
|
137
111
|
summary: AES#encrypt(key, data), AES#decrypt(key, data). Capiche?
|
138
|
-
test_files:
|
139
|
-
|
140
|
-
- test/test_aes.rb
|
112
|
+
test_files: []
|
113
|
+
|