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.
Files changed (8) hide show
  1. data/Gemfile +4 -4
  2. data/README.rdoc +15 -0
  3. data/Rakefile +1 -8
  4. data/VERSION +1 -1
  5. data/aes.gemspec +17 -23
  6. data/lib/aes/aes.rb +12 -4
  7. data/test/test_aes.rb +11 -0
  8. 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", ">= 0"
10
- gem "bundler", "~> 1.0.0"
11
- gem "jeweler", "~> 1.5.1"
12
- gem "rcov", ">= 0"
9
+ gem "shoulda"
10
+ gem "bundler"
11
+ gem "jeweler"
12
+ gem "simplecov"
13
13
  end
@@ -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 'rake/rdoctask'
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.4.0
1
+ 0.5.0
@@ -4,15 +4,14 @@
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = %q{aes}
8
- s.version = "0.4.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 = %q{2011-01-03}
13
- s.description = %q{An AES encrypt/decrypt gem built ontop of OpenSSL. Not as quick as FastAES, but it doesn't require building
14
- native extensions and supports Base64 encoded input and output.}
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 = %q{http://github.com/chicks/aes}
32
+ s.homepage = "http://github.com/chicks/aes"
34
33
  s.licenses = ["MIT"]
35
34
  s.require_paths = ["lib"]
36
- s.rubygems_version = %q{1.3.7}
37
- s.summary = %q{AES#encrypt(key, data), AES#decrypt(key, data). Capiche?}
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>, ["~> 1.0.0"])
50
- s.add_development_dependency(%q<jeweler>, ["~> 1.5.1"])
51
- s.add_development_dependency(%q<rcov>, [">= 0"])
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>, ["~> 1.0.0"])
55
- s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
56
- s.add_dependency(%q<rcov>, [">= 0"])
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>, ["~> 1.0.0"])
61
- s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
62
- s.add_dependency(%q<rcov>, [">= 0"])
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
 
@@ -122,11 +122,13 @@ module AES
122
122
  # Merge init options with defaults
123
123
  def merge_options(opts)
124
124
  @options = {
125
- :format => :base_64,
126
- :cipher => "AES-256-CBC",
127
- :iv => nil,
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
@@ -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
- hash: 15
5
- prerelease: false
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: 2011-01-03 00:00:00 -08:00
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
- version_requirements: &id001 !ruby/object:Gem::Requirement
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
- version_requirements: &id002 !ruby/object:Gem::Requirement
28
+ requirement: &id002 !ruby/object:Gem::Requirement
40
29
  none: false
41
30
  requirements:
42
- - - ~>
31
+ - - ">="
43
32
  - !ruby/object:Gem::Version
44
- hash: 23
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
- version_requirements: &id003 !ruby/object:Gem::Requirement
39
+ requirement: &id003 !ruby/object:Gem::Requirement
56
40
  none: false
57
41
  requirements:
58
- - - ~>
42
+ - - ">="
59
43
  - !ruby/object:Gem::Version
60
- hash: 1
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
- name: rcov
71
- version_requirements: &id004 !ruby/object:Gem::Requirement
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
- requirement: *id004
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: 3
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.3.7
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
- - test/helper.rb
140
- - test/test_aes.rb
112
+ test_files: []
113
+