validas-encrypted_cookie_store 0.4.1 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -6,11 +6,7 @@ session data in a cookie), but it uses encryption so that people can't read
6
6
  what's in the session data. This makes it possible to store sensitive data
7
7
  in the session.
8
8
 
9
- This version of EncryptedCookieStore is written for Rails 3.0.0+. It will not work with Rails 3.0.0.beta3 or earlier. It does not yet work with Rails 3.1. It has been tested with:
10
-
11
- * 3.0.0
12
- * 3.0.7
13
- * 3.0.8.rc4
9
+ This version of EncryptedCookieStore is written for Rails 3.1.0+. It will not work with Rails 3.0.0 or earlier. It does work with Rails 3.2.
14
10
 
15
11
  The original version for Rails 2.3 can be found here: https://github.com/FooBarWidget/encrypted_cookie_store
16
12
 
@@ -21,17 +17,17 @@ Installation and usage
21
17
 
22
18
  First, install it:
23
19
 
24
- gem install scottwb-encrypted_cookie_store
20
+ gem install validas-encrypted_cookie_store
25
21
 
26
22
  Then, add it to you bundler Gemfile:
27
23
 
28
- gem 'scottwb-encrypted_cookie_store', :require => 'encrypted_cookie_store'
24
+ gem 'validas-encrypted_cookie_store', :require => 'encrypted_cookie_store'
29
25
 
30
26
  Then edit `config/initializers/session_store.rb` and set your session store to
31
27
  EncryptedCookieStore:
32
28
 
33
29
  MyApp::Application.config.session_store(
34
- EncryptedCookieStore::EncryptedCookieStore,
30
+ ApplicationDispatch::Session::EncryptedCookieStore,
35
31
  :key => '_myapp_session',
36
32
  :encryption_key => '966a4....'
37
33
  )
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.1
1
+ 0.4.2
@@ -1,145 +1,124 @@
1
- require 'openssl'
2
- require 'encrypted_cookie_store/constants'
3
-
4
- module EncryptedCookieStore
5
- class EncryptedCookieStore < ActionDispatch::Session::CookieStore
6
- OpenSSLCipherError = OpenSSL::Cipher.const_defined?(:CipherError) ? OpenSSL::Cipher::CipherError : OpenSSL::CipherError
7
- include EncryptedCookieStoreConstants
1
+ require 'active_support/core_ext/hash/keys'
2
+ require 'action_dispatch/middleware/session/abstract_store'
3
+ require 'rack/session/cookie'
4
+
5
+ module ActionDispatch
6
+ module Session
7
+ class EncryptedCookieStore < Rack::Session::Cookie
8
+ OpenSSLCipherError = OpenSSL::Cipher.const_defined?(:CipherError) ? OpenSSL::Cipher::CipherError : OpenSSL::CipherError
9
+
10
+ ENCRYPTION_KEY_SIZE = 32
11
+ include Compatibility
12
+ include StaleSessionCheck
13
+
14
+ class << self
15
+ attr_accessor :iv_cipher_type
16
+ attr_accessor :data_cipher_type
17
+ end
8
18
 
9
- class << self
10
- attr_accessor :iv_cipher_type
11
- attr_accessor :data_cipher_type
12
- end
19
+ self.iv_cipher_type = "aes-128-ecb".freeze
20
+ self.data_cipher_type = "aes-256-cfb".freeze
13
21
 
14
- self.iv_cipher_type = "aes-128-ecb".freeze
15
- self.data_cipher_type = "aes-256-cfb".freeze
22
+ def initialize(app, options = {})
23
+ ensure_encryption_key_secure(options[:encryption_key])
24
+ @encryption_key = unhex(options[:encryption_key]).freeze
25
+ @iv_cipher = OpenSSL::Cipher::Cipher.new(EncryptedCookieStore.iv_cipher_type)
26
+ @data_cipher = OpenSSL::Cipher::Cipher.new(EncryptedCookieStore.data_cipher_type)
27
+ super(app, options)
28
+ end
16
29
 
17
- def initialize(app, options = {})
18
- ensure_encryption_key_secure(options[:encryption_key])
19
- @encryption_key = unhex(options[:encryption_key]).freeze
20
- @iv_cipher = OpenSSL::Cipher::Cipher.new(EncryptedCookieStore.iv_cipher_type)
21
- @data_cipher = OpenSSL::Cipher::Cipher.new(EncryptedCookieStore.data_cipher_type)
22
- super(app, options)
23
- end
30
+ # Override rack's method
31
+ def destroy_session(env, session_id, options)
32
+ new_sid = super
33
+ # Reset hash and Assign the new session id
34
+ env["action_dispatch.request.unsigned_session_cookie"] = new_sid ? { "session_id" => new_sid } : {}
35
+ new_sid
36
+ end
24
37
 
25
- private
26
- # Like ActiveSupport::MessageVerifier, but does not base64-encode data.
27
- class MessageVerifier
28
- def initialize(secret, digest = 'SHA1')
29
- @secret = secret
30
- @digest = digest
38
+ private
39
+ def unpacked_cookie_data(env)
40
+ env["action_dispatch.request.unsigned_session_cookie"] ||= begin
41
+ stale_session_check! do
42
+ request = ActionDispatch::Request.new(env)
43
+ if data = request.cookie_jar.signed[@key]
44
+ data = unmarshal(data)
45
+ end
46
+
47
+ data || {}
48
+ end
49
+ end
31
50
  end
32
51
 
33
- def verify(signed_message)
34
- digest, data = signed_message.split("--", 2)
35
- if digest != generate_digest(data)
36
- raise ActiveSupport::MessageVerifier::InvalidSignature
37
- else
38
- Marshal.load(data)
39
- end
52
+ def set_session(env, sid, session_data, options={})
53
+ session_data["session_id"] = sid
54
+
55
+ @iv_cipher.encrypt
56
+ @data_cipher.encrypt
57
+ @iv_cipher.key = @encryption_key
58
+ @data_cipher.key = @encryption_key
59
+
60
+ iv = @data_cipher.random_iv
61
+ @data_cipher.iv = iv
62
+ encrypted_iv = @iv_cipher.update(iv) << @iv_cipher.final
63
+ encrypted_session_data = @data_cipher.update(Marshal.dump(session_data)) << @data_cipher.final
64
+
65
+ "#{base64(encrypted_iv)}--#{base64(encrypted_session_data)}"
40
66
  end
41
67
 
42
- def generate(value)
43
- data = Marshal.dump(value)
44
- digest = generate_digest(data)
45
- "#{digest}--#{data}"
68
+ def set_cookie(env, session_id, cookie)
69
+ request = ActionDispatch::Request.new(env)
70
+ request.cookie_jar.signed[@key] = cookie
46
71
  end
47
72
 
48
73
  private
49
- def generate_digest(data)
50
- OpenSSL::HMAC.hexdigest(OpenSSL::Digest::Digest.new(@digest), @secret, data)
74
+ def base64(data)
75
+ ::Base64.strict_encode64(data)
51
76
  end
52
- end
53
77
 
54
- def set_session(env, sid, session_data, options={})
55
- # We hmac-then-encrypt instead of encrypt-then-hmac so that we
56
- # can properly detect:
57
- # - changes to the encryption key or initialization vector
58
- # - a migration from the unencrypted CookieStore.
59
- #
60
- # Being able to detect these allows us to invalidate the old session data.
61
-
62
- @iv_cipher.encrypt
63
- @data_cipher.encrypt
64
- @iv_cipher.key = @encryption_key
65
- @data_cipher.key = @encryption_key
66
-
67
- clear_session_data = super(env, sid, session_data, {})
68
- iv = @data_cipher.random_iv
69
- @data_cipher.iv = iv
70
- encrypted_iv = @iv_cipher.update(iv) << @iv_cipher.final
71
- encrypted_session_data = @data_cipher.update(Marshal.dump(clear_session_data)) << @data_cipher.final
72
-
73
- "#{base64(encrypted_iv)}--#{base64(encrypted_session_data)}"
74
- end
78
+ def unhex(hex_data)
79
+ [hex_data].pack("H*")
80
+ end
75
81
 
76
- def unpacked_cookie_data(env)
77
- env["action_dispatch.request.unsigned_session_cookie"] ||= begin
78
- stale_session_check! do
79
- request = ActionDispatch::Request.new(env)
80
- if (data = request.cookie_jar.signed[@key]) && data.is_a?(String)
81
- unmarshal(data)
82
- else
83
- {}
82
+ def unmarshal(cookie)
83
+ if cookie
84
+ b64_encrypted_iv, b64_encrypted_session_data = cookie.split("--", 2)
85
+ if b64_encrypted_iv && b64_encrypted_session_data
86
+ encrypted_iv = ::Base64.strict_decode64(b64_encrypted_iv)
87
+ encrypted_session_data = ::Base64.strict_decode64(b64_encrypted_session_data)
88
+
89
+ @iv_cipher.decrypt
90
+ @iv_cipher.key = @encryption_key
91
+ iv = @iv_cipher.update(encrypted_iv) << @iv_cipher.final
92
+
93
+ @data_cipher.decrypt
94
+ @data_cipher.key = @encryption_key
95
+ @data_cipher.iv = iv
96
+ Marshal.load(@data_cipher.update(encrypted_session_data) << @data_cipher.final) rescue nil
84
97
  end
98
+ else
99
+ nil
85
100
  end
86
- end
87
- end
88
-
89
- def unmarshal(cookie)
90
- if cookie
91
- b64_encrypted_iv, b64_encrypted_session_data = cookie.split("--", 2)
92
- if b64_encrypted_iv && b64_encrypted_session_data
93
- encrypted_iv = ::Base64.strict_decode64(b64_encrypted_iv)
94
- encrypted_session_data = ::Base64.strict_decode64(b64_encrypted_session_data)
95
-
96
- @iv_cipher.decrypt
97
- @iv_cipher.key = @encryption_key
98
- iv = @iv_cipher.update(encrypted_iv) << @iv_cipher.final
99
-
100
- @data_cipher.decrypt
101
- @data_cipher.key = @encryption_key
102
- @data_cipher.iv = iv
103
- session_data = Marshal.load(@data_cipher.update(encrypted_session_data) << @data_cipher.final) rescue nil
104
- end
105
- else
101
+ rescue OpenSSLCipherError
106
102
  nil
107
103
  end
108
- rescue OpenSSLCipherError
109
- nil
110
- end
111
104
 
112
- # To prevent users from using an insecure encryption key like "Password" we make sure that the
113
- # encryption key they've provided is at least 30 characters in length.
114
- def ensure_encryption_key_secure(encryption_key)
115
- if encryption_key.blank?
116
- raise ArgumentError, "An encryption key is required for encrypting the " +
117
- "cookie session data. Please set config.action_controller.session = { " +
118
- "..., :encryption_key => \"some random string of exactly " +
119
- "#{ENCRYPTION_KEY_SIZE * 2} bytes\", ... } in config/environment.rb"
120
- end
105
+ def ensure_encryption_key_secure(encryption_key)
106
+ if encryption_key.blank?
107
+ raise ArgumentError, "An encryption key is required for encrypting the " +
108
+ "cookie session data. Please set config.action_controller.session = { " +
109
+ "..., :encryption_key => \"some random string of exactly " +
110
+ "#{ENCRYPTION_KEY_SIZE * 2} bytes\", ... } in config/environment.rb"
111
+ end
121
112
 
122
- if encryption_key.size != ENCRYPTION_KEY_SIZE * 2
123
- raise ArgumentError, "The EncryptedCookieStore encryption key must be a " +
124
- "hexadecimal string of exactly #{ENCRYPTION_KEY_SIZE * 2} bytes. " +
125
- "The value that you've provided, \"#{encryption_key}\", is " +
126
- "#{encryption_key.size} bytes. You could use the following (randomly " +
127
- "generated) string as encryption key: " +
128
- SecureRandom.hex(ENCRYPTION_KEY_SIZE)
113
+ if encryption_key.size != ENCRYPTION_KEY_SIZE * 2
114
+ raise ArgumentError, "The EncryptedCookieStore encryption key must be a " +
115
+ "hexadecimal string of exactly #{ENCRYPTION_KEY_SIZE * 2} bytes. " +
116
+ "The value that you've provided, \"#{encryption_key}\", is " +
117
+ "#{encryption_key.size} bytes. You could use the following (randomly " +
118
+ "generated) string as encryption key: " +
119
+ SecureRandom.hex(ENCRYPTION_KEY_SIZE)
120
+ end
129
121
  end
130
122
  end
131
-
132
- def verifier_for(secret, digest)
133
- key = secret.respond_to?(:call) ? secret.call : secret
134
- MessageVerifier.new(key, digest)
135
- end
136
-
137
- def base64(data)
138
- ::Base64.strict_encode64(data)
139
- end
140
-
141
- def unhex(hex_data)
142
- [hex_data].pack("H*")
143
- end
144
123
  end
145
124
  end
@@ -5,84 +5,84 @@ require 'rails'
5
5
  require 'action_controller'
6
6
  require 'encrypted_cookie_store'
7
7
 
8
- describe EncryptedCookieStore::EncryptedCookieStore do
9
- SECRET = "b6a30e998806a238c4bad45cc720ed55e56e50d9f00fff58552e78a20fe8262df61" <<
10
- "42fcfdb0676018bb9767ed560d4a624fb7f3603b4e53c77ec189ae3853bd1"
11
- GOOD_ENCRYPTION_KEY = "dd458e790c3b995e3606384c58efc53da431db892f585aa3ca2a17eabe6df75b"
12
- ANOTHER_GOOD_ENCRYPTION_KEY = "ce6a45c34607d2048d735b0a31a769de4e1512eb83c7012059a66937158a8975"
13
- OBJECT = { :user_id => 123, :admin => true, :message => "hello world!" }
14
-
15
- def create(options = {})
16
- EncryptedCookieStore::EncryptedCookieStore.new(nil, options.reverse_merge(
17
- :key => 'key',
18
- :secret => SECRET
19
- ))
20
- end
21
-
22
- it "checks whether an encryption key is given" do
23
- lambda { create }.should raise_error(ArgumentError, /encryption key is required/)
24
- end
25
-
26
- it "checks whether the encryption key has the correct size" do
27
- encryption_key = "too small"
28
- block = lambda { create(:encryption_key => encryption_key) }
29
- block.should raise_error(ArgumentError, /must be a hexadecimal string of exactly \d+ bytes/)
30
- end
31
-
32
- specify "marshalling and unmarshalling data works" do
33
- data = create(:encryption_key => GOOD_ENCRYPTION_KEY).send(:set_session, nil, nil, OBJECT)
34
- object = create(:encryption_key => GOOD_ENCRYPTION_KEY).send(:unmarshal, data)
35
- object[:user_id].should == 123
36
- object[:admin].should be_true
37
- object[:message].should == "hello world!"
38
- end
39
-
40
- it "uses a different initialization vector every time data is marshalled" do
41
- store = create(:encryption_key => GOOD_ENCRYPTION_KEY)
42
- data1 = store.send(:set_session, nil, nil, OBJECT)
43
- data2 = store.send(:set_session, nil, nil, OBJECT)
44
- data3 = store.send(:set_session, nil, nil, OBJECT)
45
- data4 = store.send(:set_session, nil, nil, OBJECT)
46
- data1.should_not == data2
47
- data1.should_not == data3
48
- data1.should_not == data4
49
- end
50
-
51
- it "invalidates the data if the encryption key is changed" do
52
- data = create(:encryption_key => GOOD_ENCRYPTION_KEY).send(:set_session, nil, nil, OBJECT)
53
- object = create(:encryption_key => ANOTHER_GOOD_ENCRYPTION_KEY).send(:unmarshal, data)
54
- object.should be_nil
55
- end
56
-
57
- it "invalidates the data if the IV cannot be decrypted" do
58
- store = create(:encryption_key => GOOD_ENCRYPTION_KEY)
59
- data = store.send(:set_session, nil, nil, OBJECT)
60
- iv_cipher = store.instance_variable_get(:@iv_cipher)
61
- iv_cipher.should_receive(:update).and_raise(EncryptedCookieStore::EncryptedCookieStore::OpenSSLCipherError)
62
- store.send(:unmarshal, data).should be_nil
63
- end
8
+ describe ActionDispatch::Session::EncryptedCookieStore do
9
+ SECRET = "b6a30e998806a238c4bad45cc720ed55e56e50d9f00fff58552e78a20fe8262df61" <<
10
+ "42fcfdb0676018bb9767ed560d4a624fb7f3603b4e53c77ec189ae3853bd1"
11
+ GOOD_ENCRYPTION_KEY = "dd458e790c3b995e3606384c58efc53da431db892f585aa3ca2a17eabe6df75b"
12
+ ANOTHER_GOOD_ENCRYPTION_KEY = "ce6a45c34607d2048d735b0a31a769de4e1512eb83c7012059a66937158a8975"
13
+ OBJECT = { :user_id => 123, :admin => true, :message => "hello world!" }
64
14
 
65
- # FIXME: This test case is broken. The super classes' structure have changed since Rails 3.0.0.beta3
66
- # and we're no longer getting a string to unmarshal, since this have been pushed up to rack.
67
- #it "invalidates the data if we just migrated from CookieStore" do
68
- # old_store = ActionDispatch::Session::CookieStore.new(nil, :key => 'key', :secret => SECRET)
69
- # legacy_data = old_store.send(:set_session, nil, nil, OBJECT)
70
- # store = create(:encryption_key => GOOD_ENCRYPTION_KEY)
71
- # store.send(:unmarshal, legacy_data).should be_nil
72
- #end
73
-
74
- it "invalidates the data if it was tampered with" do
75
- store = create(:encryption_key => GOOD_ENCRYPTION_KEY)
76
- data = store.send(:set_session, nil, nil, OBJECT)
77
- b64_encrypted_iv, b64_encrypted_session_data = data.split("--", 2)
78
- b64_encrypted_session_data[0..1] = "AA"
79
- data = "#{b64_encrypted_iv}--#{b64_encrypted_session_data}"
80
- store.send(:unmarshal, data).should be_nil
81
- end
82
-
83
- it "invalidates the data if it looks like garbage" do
84
- store = create(:encryption_key => GOOD_ENCRYPTION_KEY)
85
- garbage = "\202d\3477 jTf\274\360\200z\355\334N3\001\0036\321qLu\027\320\325*%:%\270D"
86
- store.send(:unmarshal, garbage).should be_nil
87
- end
15
+ def create(options = {})
16
+ ActionDispatch::Session::EncryptedCookieStore.new(nil, options.reverse_merge(
17
+ :key => 'key',
18
+ :secret => SECRET
19
+ ))
20
+ end
21
+
22
+ it "checks whether an encryption key is given" do
23
+ lambda { create }.should raise_error(ArgumentError, /encryption key is required/)
24
+ end
25
+
26
+ it "checks whether the encryption key has the correct size" do
27
+ encryption_key = "too small"
28
+ block = lambda { create(:encryption_key => encryption_key) }
29
+ block.should raise_error(ArgumentError, /must be a hexadecimal string of exactly \d+ bytes/)
30
+ end
31
+
32
+ specify "marshalling and unmarshalling data works" do
33
+ data = create(:encryption_key => GOOD_ENCRYPTION_KEY).send(:set_session, nil, nil, OBJECT)
34
+ object = create(:encryption_key => GOOD_ENCRYPTION_KEY).send(:unmarshal, data)
35
+ object[:user_id].should == 123
36
+ object[:admin].should be_true
37
+ object[:message].should == "hello world!"
38
+ end
39
+
40
+ it "uses a different initialization vector every time data is marshalled" do
41
+ store = create(:encryption_key => GOOD_ENCRYPTION_KEY)
42
+ data1 = store.send(:set_session, nil, nil, OBJECT)
43
+ data2 = store.send(:set_session, nil, nil, OBJECT)
44
+ data3 = store.send(:set_session, nil, nil, OBJECT)
45
+ data4 = store.send(:set_session, nil, nil, OBJECT)
46
+ data1.should_not == data2
47
+ data1.should_not == data3
48
+ data1.should_not == data4
49
+ end
50
+
51
+ it "invalidates the data if the encryption key is changed" do
52
+ data = create(:encryption_key => GOOD_ENCRYPTION_KEY).send(:set_session, nil, nil, OBJECT)
53
+ object = create(:encryption_key => ANOTHER_GOOD_ENCRYPTION_KEY).send(:unmarshal, data)
54
+ object.should be_nil
55
+ end
56
+
57
+ it "invalidates the data if the IV cannot be decrypted" do
58
+ store = create(:encryption_key => GOOD_ENCRYPTION_KEY)
59
+ data = store.send(:set_session, nil, nil, OBJECT)
60
+ iv_cipher = store.instance_variable_get(:@iv_cipher)
61
+ iv_cipher.should_receive(:update).and_raise(ActionDispatch::Session::EncryptedCookieStore::OpenSSLCipherError)
62
+ store.send(:unmarshal, data).should be_nil
63
+ end
64
+
65
+ # FIXME: This test case is broken. The super classes' structure have changed since Rails 3.0.0.beta3
66
+ # and we're no longer getting a string to unmarshal, since this have been pushed up to rack.
67
+ # it "invalidates the data if we just migrated from CookieStore", :focus => true do
68
+ # old_store = ActionDispatch::Session::CookieStore.new(nil, :key => 'key', :secret => SECRET)
69
+ # legacy_data = old_store.send(:set_session, nil, nil, OBJECT, {})
70
+ # store = create(:encryption_key => GOOD_ENCRYPTION_KEY)
71
+ # store.send(:unmarshal, legacy_data).should be_nil
72
+ # end
73
+
74
+ it "invalidates the data if it was tampered with" do
75
+ store = create(:encryption_key => GOOD_ENCRYPTION_KEY)
76
+ data = store.send(:set_session, nil, nil, OBJECT)
77
+ b64_encrypted_iv, b64_encrypted_session_data = data.split("--", 2)
78
+ b64_encrypted_session_data[0..1] = "AA"
79
+ data = "#{b64_encrypted_iv}--#{b64_encrypted_session_data}"
80
+ store.send(:unmarshal, data).should be_nil
81
+ end
82
+
83
+ it "invalidates the data if it looks like garbage" do
84
+ store = create(:encryption_key => GOOD_ENCRYPTION_KEY)
85
+ garbage = "\202d\3477 jTf\274\360\200z\355\334N3\001\0036\321qLu\027\320\325*%:%\270D"
86
+ store.send(:unmarshal, garbage).should be_nil
87
+ end
88
88
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "validas-encrypted_cookie_store"
8
- s.version = "0.4.1"
8
+ s.version = "0.4.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["FooBarWidget", "Scott W. Bradley", "Validas Engineering Team"]
12
- s.date = "2012-10-30"
12
+ s.date = "2012-10-31"
13
13
  s.description = "A Rails 3.1 & 3.2 version of Encrypted Cookie Store by FooBarWidget"
14
14
  s.email = "scottwb@gmail.com"
15
15
  s.extra_rdoc_files = [
@@ -26,7 +26,6 @@ Gem::Specification.new do |s|
26
26
  "Rakefile",
27
27
  "VERSION",
28
28
  "lib/encrypted_cookie_store.rb",
29
- "lib/encrypted_cookie_store/constants.rb",
30
29
  "lib/encrypted_cookie_store/encrypted_cookie_store.rb",
31
30
  "lib/encrypted_cookie_store/railtie.rb",
32
31
  "lib/tasks/encrypted_cookie_store.rake",
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: validas-encrypted_cookie_store
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2012-10-30 00:00:00.000000000 Z
14
+ date: 2012-10-31 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rails
@@ -110,7 +110,6 @@ files:
110
110
  - Rakefile
111
111
  - VERSION
112
112
  - lib/encrypted_cookie_store.rb
113
- - lib/encrypted_cookie_store/constants.rb
114
113
  - lib/encrypted_cookie_store/encrypted_cookie_store.rb
115
114
  - lib/encrypted_cookie_store/railtie.rb
116
115
  - lib/tasks/encrypted_cookie_store.rake
@@ -1,3 +0,0 @@
1
- module EncryptedCookieStoreConstants
2
- ENCRYPTION_KEY_SIZE = 32
3
- end