symmetric-encryption 3.9.1 → 4.0.0.beta3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +72 -0
  3. data/bin/symmetric-encryption +5 -0
  4. data/lib/symmetric_encryption/cipher.rb +162 -419
  5. data/lib/symmetric_encryption/cli.rb +343 -0
  6. data/lib/symmetric_encryption/coerce.rb +5 -20
  7. data/lib/symmetric_encryption/config.rb +128 -50
  8. data/lib/symmetric_encryption/extensions/mongo_mapper/plugins/encrypted_key.rb +2 -2
  9. data/lib/symmetric_encryption/generator.rb +3 -2
  10. data/lib/symmetric_encryption/header.rb +260 -0
  11. data/lib/symmetric_encryption/key.rb +106 -0
  12. data/lib/symmetric_encryption/keystore/environment.rb +90 -0
  13. data/lib/symmetric_encryption/keystore/file.rb +102 -0
  14. data/lib/symmetric_encryption/keystore/memory.rb +53 -0
  15. data/lib/symmetric_encryption/keystore.rb +124 -0
  16. data/lib/symmetric_encryption/railtie.rb +5 -7
  17. data/lib/symmetric_encryption/reader.rb +74 -55
  18. data/lib/symmetric_encryption/rsa_key.rb +24 -0
  19. data/lib/symmetric_encryption/symmetric_encryption.rb +64 -102
  20. data/lib/symmetric_encryption/utils/re_encrypt_files.rb +140 -0
  21. data/lib/symmetric_encryption/version.rb +1 -1
  22. data/lib/symmetric_encryption/writer.rb +104 -117
  23. data/lib/symmetric_encryption.rb +9 -4
  24. data/test/active_record_test.rb +61 -40
  25. data/test/cipher_test.rb +179 -236
  26. data/test/config/symmetric-encryption.yml +140 -82
  27. data/test/header_test.rb +218 -0
  28. data/test/key_test.rb +231 -0
  29. data/test/keystore/environment_test.rb +119 -0
  30. data/test/keystore/file_test.rb +125 -0
  31. data/test/keystore_test.rb +59 -0
  32. data/test/mongoid_test.rb +13 -13
  33. data/test/reader_test.rb +52 -53
  34. data/test/symmetric_encryption_test.rb +50 -135
  35. data/test/test_db.sqlite3 +0 -0
  36. data/test/writer_test.rb +52 -31
  37. metadata +26 -14
  38. data/examples/symmetric-encryption.yml +0 -108
  39. data/lib/rails/generators/symmetric_encryption/config/config_generator.rb +0 -22
  40. data/lib/rails/generators/symmetric_encryption/config/templates/symmetric-encryption.yml +0 -50
  41. data/lib/rails/generators/symmetric_encryption/heroku_config/heroku_config_generator.rb +0 -20
  42. data/lib/rails/generators/symmetric_encryption/heroku_config/templates/symmetric-encryption.yml +0 -78
  43. data/lib/rails/generators/symmetric_encryption/new_keys/new_keys_generator.rb +0 -14
  44. data/lib/symmetric_encryption/key_encryption_key.rb +0 -32
  45. data/lib/symmetric_encryption/railties/symmetric_encryption.rake +0 -84
  46. data/lib/symmetric_encryption/utils/re_encrypt_config_files.rb +0 -82
@@ -0,0 +1,119 @@
1
+ require_relative '../test_helper'
2
+ require 'stringio'
3
+
4
+ module SymmetricEncryption
5
+ class FileTest < Minitest::Test
6
+ describe SymmetricEncryption::Keystore::Environment do
7
+ after do
8
+ # Cleanup generated encryption key files.
9
+ `rm tmp/tester* 2> /dev/null`
10
+ end
11
+
12
+ describe '.new_key_config' do
13
+ let :version do
14
+ 10
15
+ end
16
+
17
+ let :keystore_config do
18
+ SymmetricEncryption::Keystore::Environment.new_key_config(
19
+ cipher_name: 'aes-256-cbc',
20
+ app_name: 'tester',
21
+ environment: 'test',
22
+ version: version
23
+ )
24
+ end
25
+
26
+ it 'increments the version' do
27
+ assert_equal 11, keystore_config[:version]
28
+ end
29
+
30
+ describe 'with 255 version' do
31
+ let :version do
32
+ 255
33
+ end
34
+
35
+ it 'handles version wrap' do
36
+ assert_equal 1, keystore_config[:version]
37
+ end
38
+ end
39
+
40
+ describe 'with 0 version' do
41
+ let :version do
42
+ 0
43
+ end
44
+
45
+ it 'increments version' do
46
+ assert_equal 1, keystore_config[:version]
47
+ end
48
+ end
49
+
50
+ it 'retains the env var name' do
51
+ assert_equal "TESTER_TEST_V11", keystore_config[:key_env_var]
52
+ end
53
+
54
+ it 'retains cipher_name' do
55
+ assert_equal 'aes-256-cbc', keystore_config[:cipher_name]
56
+ end
57
+ end
58
+
59
+ describe '.new_config' do
60
+ let :environments do
61
+ %i(development test acceptance preprod production)
62
+ end
63
+
64
+ let :config do
65
+ SymmetricEncryption::Keystore::Environment.new_config(
66
+ app_name: 'tester',
67
+ environments: environments,
68
+ cipher_name: 'aes-128-cbc'
69
+ )
70
+ end
71
+
72
+ it 'creates keys for each environment' do
73
+ assert_equal environments, config.keys, config
74
+ end
75
+
76
+ it 'use test config for development and test' do
77
+ assert_equal SymmetricEncryption::Keystore.dev_config, config[:test]
78
+ assert_equal SymmetricEncryption::Keystore.dev_config, config[:development]
79
+ end
80
+
81
+ it 'each non test environment has a key encryption key' do
82
+ (environments - %i(development test)).each do |env|
83
+ assert config[env][:ciphers].first[:key_encrypting_key], "Environment #{env} is missing the key encryption key"
84
+ end
85
+ end
86
+
87
+ it 'every environment has ciphers' do
88
+ environments.each do |env|
89
+ assert ciphers = config[env][:ciphers], "Environment #{env} is missing ciphers: #{config[env].inspect}"
90
+ assert_equal 1, ciphers.size
91
+ end
92
+ end
93
+
94
+ it 'creates an encrypted key file for all non-test environments' do
95
+ (environments - %i(development test)).each do |env|
96
+ assert ciphers = config[env][:ciphers], "Environment #{env} is missing ciphers: #{config[env].inspect}"
97
+ assert file_name = ciphers.first[:key_env_var], "Environment #{env} is missing key_env_var: #{ciphers.inspect}"
98
+ end
99
+ end
100
+ end
101
+
102
+ describe '#read' do
103
+ let :key do
104
+ SymmetricEncryption::Key.new
105
+ end
106
+
107
+ let :keystore do
108
+ SymmetricEncryption::Keystore::Environment.new(key_env_var: 'TESTER_ENV_VAR', key_encrypting_key: key)
109
+ end
110
+
111
+ it 'reads the key' do
112
+ ENV["TESTER_ENV_VAR"] = Base64.strict_encode64(key.encrypt('TEST'))
113
+ assert_equal 'TEST', keystore.read
114
+ end
115
+ end
116
+
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,125 @@
1
+ require_relative '../test_helper'
2
+ require 'stringio'
3
+
4
+ module SymmetricEncryption
5
+ class FileTest < Minitest::Test
6
+ describe SymmetricEncryption::Keystore::File do
7
+ after do
8
+ # Cleanup generated encryption key files.
9
+ `rm tmp/tester* 2> /dev/null`
10
+ end
11
+
12
+ describe '.new_key_config' do
13
+ let :version do
14
+ 10
15
+ end
16
+
17
+ let :key_config do
18
+ SymmetricEncryption::Keystore::File.new_key_config(
19
+ key_path: 'tmp',
20
+ cipher_name: 'aes-256-cbc',
21
+ app_name: 'tester',
22
+ environment: 'test',
23
+ version: version
24
+ )
25
+ end
26
+
27
+ it 'increments the version' do
28
+ assert_equal 11, key_config[:version]
29
+ end
30
+
31
+ describe 'with 255 version' do
32
+ let :version do
33
+ 255
34
+ end
35
+
36
+ it 'handles version wrap' do
37
+ assert_equal 1, key_config[:version]
38
+ end
39
+ end
40
+
41
+ describe 'with 0 version' do
42
+ let :version do
43
+ 0
44
+ end
45
+
46
+ it 'increments version' do
47
+ assert_equal 1, key_config[:version]
48
+ end
49
+ end
50
+
51
+ it 'creates the encrypted key file' do
52
+ file_name = 'tmp/tester_test_v11.encrypted_key'
53
+ assert_equal file_name, key_config[:key_filename]
54
+ assert File.exist?(file_name)
55
+ end
56
+
57
+ it 'retains cipher_name' do
58
+ assert_equal 'aes-256-cbc', key_config[:cipher_name]
59
+ end
60
+
61
+ it 'is readable by Key.from_config' do
62
+ key_config.delete(:version)
63
+ assert key = SymmetricEncryption::Key.from_config(key_config)
64
+ end
65
+ end
66
+
67
+ describe '.new_config' do
68
+ let :environments do
69
+ %i(development test acceptance preprod production)
70
+ end
71
+
72
+ let :config do
73
+ SymmetricEncryption::Keystore::File.new_config(
74
+ key_path: 'tmp',
75
+ app_name: 'tester',
76
+ environments: environments,
77
+ cipher_name: 'aes-128-cbc'
78
+ )
79
+ end
80
+
81
+ it 'creates keys for each environment' do
82
+ assert_equal environments, config.keys, config
83
+ end
84
+
85
+ it 'use test config for development and test' do
86
+ assert_equal SymmetricEncryption::Keystore.dev_config, config[:test]
87
+ assert_equal SymmetricEncryption::Keystore.dev_config, config[:development]
88
+ end
89
+
90
+ it 'each non test environment has a key encryption key' do
91
+ (environments - %i(development test)).each do |env|
92
+ assert config[env][:ciphers].first[:key_encrypting_key], "Environment #{env} is missing the key encryption key"
93
+ end
94
+ end
95
+
96
+ it 'every environment has ciphers' do
97
+ environments.each do |env|
98
+ assert ciphers = config[env][:ciphers], "Environment #{env} is missing ciphers: #{config[env].inspect}"
99
+ assert_equal 1, ciphers.size
100
+ end
101
+ end
102
+
103
+ it 'creates an encrypted key file for all non-test environments' do
104
+ (environments - %i(development test)).each do |env|
105
+ assert ciphers = config[env][:ciphers], "Environment #{env} is missing ciphers: #{config[env].inspect}"
106
+ assert file_name = ciphers.first[:key_filename], "Environment #{env} is missing key_filename: #{ciphers.inspect}"
107
+ assert File.exist?(file_name)
108
+ end
109
+ end
110
+ end
111
+
112
+ describe '#write, #read' do
113
+ let :keystore do
114
+ SymmetricEncryption::Keystore::File.new(file_name: 'tmp/tester.key', key_encrypting_key: SymmetricEncryption::Key.new)
115
+ end
116
+
117
+ it 'stores the key' do
118
+ keystore.write('TEST')
119
+ assert_equal 'TEST', keystore.read
120
+ end
121
+ end
122
+
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,59 @@
1
+ require_relative 'test_helper'
2
+
3
+ module SymmetricEncryption
4
+ class KeystoreTest < Minitest::Test
5
+ describe SymmetricEncryption::Keystore do
6
+ let :keystore do
7
+ SymmetricEncryption::Keystore::File.new(file_name: 'tmp/tester.key', key_encrypting_key: SymmetricEncryption::Key.new)
8
+ end
9
+
10
+ after do
11
+ # Cleanup generated encryption key files.
12
+ `rm tmp/tester* 2>/dev/null`
13
+ end
14
+
15
+ describe '.rotate_keys' do
16
+ let :environments do
17
+ %i(development test acceptance preprod production)
18
+ end
19
+
20
+ let :config do
21
+ SymmetricEncryption::Keystore::File.new_config(
22
+ key_path: 'tmp',
23
+ app_name: 'tester',
24
+ environments: environments,
25
+ cipher_name: 'aes-128-cbc'
26
+ )
27
+ end
28
+
29
+ let :rolling_deploy do
30
+ false
31
+ end
32
+
33
+ let :key_rotation do
34
+ SymmetricEncryption::Keystore.rotate_keys!(
35
+ config,
36
+ environments: environments,
37
+ app_name: 'tester',
38
+ rolling_deploy: rolling_deploy
39
+ )
40
+ end
41
+
42
+ it 'creates an encrypted key file for all non-test environments' do
43
+ (environments - %i(development test)).each do |env|
44
+ assert key_rotation
45
+ assert key_rotation[env.to_sym], key_rotation
46
+ assert key_rotation[env.to_sym][:ciphers]
47
+ assert ciphers = key_rotation[env.to_sym][:ciphers], "Environment #{env} is missing ciphers: #{key_rotation[env.to_sym].inspect}"
48
+ assert_equal 2, ciphers.size, "Environment #{env}: #{ciphers.inspect}"
49
+ assert new_config = ciphers.first
50
+ assert file_name = new_config[:key_filename], "Environment #{env} is missing key_filename: #{ciphers.inspect}"
51
+ assert File.exist?(file_name)
52
+ assert_equal 2, new_config[:version]
53
+ end
54
+ end
55
+ end
56
+
57
+ end
58
+ end
59
+ end
data/test/mongoid_test.rb CHANGED
@@ -85,17 +85,17 @@ begin
85
85
  encrypted_social_security_number: @social_security_number_encrypted,
86
86
  name: 'Joe Bloggs',
87
87
  # data type specific fields
88
- integer_value: @integer_value,
89
- aliased_integer_value: @integer_value,
90
- float_value: @float_value,
91
- decimal_value: @decimal_value,
92
- datetime_value: @datetime_value,
93
- time_value: @time_value,
94
- date_value: @date_value,
95
- true_value: true,
96
- false_value: false,
97
- data_yaml: @h.dup,
98
- data_json: @h.dup
88
+ integer_value: @integer_value,
89
+ aliased_integer_value: @integer_value,
90
+ float_value: @float_value,
91
+ decimal_value: @decimal_value,
92
+ datetime_value: @datetime_value,
93
+ time_value: @time_value,
94
+ date_value: @date_value,
95
+ true_value: true,
96
+ false_value: false,
97
+ data_yaml: @h.dup,
98
+ data_json: @h.dup
99
99
  )
100
100
  end
101
101
 
@@ -153,9 +153,9 @@ begin
153
153
  it 'support a random iv' do
154
154
  @user.string = @string
155
155
  assert first_value = @user.encrypted_string
156
- # Assign the same value
156
+ @user.string = 'blah'
157
157
  @user.string = @string.dup
158
- assert_equal true, first_value != @user.encrypted_string
158
+ refute_equal first_value, @user.encrypted_string
159
159
  end
160
160
 
161
161
  it 'support a random iv and compress' do
data/test/reader_test.rb CHANGED
@@ -6,25 +6,24 @@ require 'stringio'
6
6
  class ReaderTest < Minitest::Test
7
7
  describe SymmetricEncryption::Reader do
8
8
  before do
9
- @data = [
9
+ @data = [
10
10
  "Hello World\n",
11
11
  "Keep this secret\n",
12
12
  'And keep going even further and further...'
13
13
  ]
14
- @data_str = @data.inject('') { |sum, str| sum << str }
15
- @data_len = @data_str.length
14
+ @data_str = @data.inject('') { |sum, str| sum << str }
15
+ @data_len = @data_str.length
16
16
  # Use Cipher 0 since it does not always include a header
17
17
  @cipher = SymmetricEncryption.cipher(0)
18
- @data_encrypted_without_header = @cipher.binary_encrypt(@data_str)
19
-
20
- @data_encrypted_with_header = SymmetricEncryption::Cipher.build_header(
21
- @cipher.version,
22
- false,
23
- @cipher.send(:iv),
24
- @cipher.send(:key),
25
- @cipher.cipher_name
18
+ @data_encrypted_without_header = @cipher.binary_encrypt(@data_str, header: false)
19
+
20
+ header = SymmetricEncryption::Header.new(
21
+ version: @cipher.version,
22
+ iv: @cipher.iv,
23
+ key: @cipher.send(:key),
24
+ cipher_name: @cipher.cipher_name
26
25
  )
27
- @data_encrypted_with_header << @cipher.binary_encrypt(@data_str)
26
+ @data_encrypted_with_header = @cipher.binary_encrypt(@data_str, header: header)
28
27
 
29
28
  # Verify regular decrypt can decrypt this string
30
29
  @cipher.binary_decrypt(@data_encrypted_without_header)
@@ -39,14 +38,14 @@ class ReaderTest < Minitest::Test
39
38
  end
40
39
 
41
40
  it "#read()" do
42
- stream = StringIO.new(@data_encrypted)
41
+ stream = StringIO.new(@data_encrypted)
43
42
  # Version 0 supplied if the file/stream does not have a header
44
43
  decrypted = SymmetricEncryption::Reader.open(stream, version: 0) { |file| file.read }
45
44
  assert_equal @data_str, decrypted
46
45
  end
47
46
 
48
47
  it "#read(size) followed by #read()" do
49
- stream = StringIO.new(@data_encrypted)
48
+ stream = StringIO.new(@data_encrypted)
50
49
  # Version 0 supplied if the file/stream does not have a header
51
50
  decrypted = SymmetricEncryption::Reader.open(stream, version: 0) do |file|
52
51
  file.read(10)
@@ -56,8 +55,8 @@ class ReaderTest < Minitest::Test
56
55
  end
57
56
 
58
57
  it "#each_line" do
59
- stream = StringIO.new(@data_encrypted)
60
- i = 0
58
+ stream = StringIO.new(@data_encrypted)
59
+ i = 0
61
60
  # Version 0 supplied if the file/stream does not have a header
62
61
  SymmetricEncryption::Reader.open(stream, version: 0) do |file|
63
62
  file.each_line do |line|
@@ -68,7 +67,7 @@ class ReaderTest < Minitest::Test
68
67
  end
69
68
 
70
69
  it "#read(size)" do
71
- stream = StringIO.new(@data_encrypted)
70
+ stream = StringIO.new(@data_encrypted)
72
71
  # Version 0 supplied if the file/stream does not have a header
73
72
  SymmetricEncryption::Reader.open(stream, version: 0) do |file|
74
73
  index = 0
@@ -110,26 +109,26 @@ class ReaderTest < Minitest::Test
110
109
  case usecase
111
110
  when :data
112
111
  # Create encrypted file
113
- @eof = false
114
- @filename = '_test'
115
- @header = (options[:header] != false)
116
- SymmetricEncryption::Writer.open(@filename, options) do |file|
112
+ @eof = false
113
+ @file_name = '_test'
114
+ @header = (options[:header] != false)
115
+ SymmetricEncryption::Writer.open(@file_name, options) do |file|
117
116
  @data.inject(0) { |sum, str| sum + file.write(str) }
118
117
  end
119
118
  when :empty
120
- @data_str = ''
121
- @eof = true
122
- @filename = '_test_empty'
123
- @header = (options[:header] != false)
124
- SymmetricEncryption::Writer.open(@filename, options) do |file|
119
+ @data_str = ''
120
+ @eof = true
121
+ @file_name = '_test_empty'
122
+ @header = (options[:header] != false)
123
+ SymmetricEncryption::Writer.open(@file_name, options) do |file|
125
124
  # Leave data portion empty
126
125
  end
127
126
  when :blank
128
- @data_str = ''
129
- @eof = true
130
- @filename = File.join(File.dirname(__FILE__), 'config/empty.csv')
131
- @header = false
132
- assert_equal 0, File.size(@filename)
127
+ @data_str = ''
128
+ @eof = true
129
+ @file_name = File.join(File.dirname(__FILE__), 'config/empty.csv')
130
+ @header = false
131
+ assert_equal 0, File.size(@file_name)
133
132
  else
134
133
  raise "Unhandled usecase: #{usecase}"
135
134
  end
@@ -137,25 +136,25 @@ class ReaderTest < Minitest::Test
137
136
  end
138
137
 
139
138
  after do
140
- File.delete(@filename) if File.exist?(@filename) && !@filename.end_with?('empty.csv')
139
+ File.delete(@file_name) if File.exist?(@file_name) && !@file_name.end_with?('empty.csv')
141
140
  end
142
141
 
143
142
  it '.empty?' do
144
- assert_equal (@data_size==0), SymmetricEncryption::Reader.empty?(@filename)
143
+ assert_equal (@data_size==0), SymmetricEncryption::Reader.empty?(@file_name)
145
144
  assert_raises Errno::ENOENT do
146
145
  SymmetricEncryption::Reader.empty?('missing_file')
147
146
  end
148
147
  end
149
148
 
150
149
  it '.header_present?' do
151
- assert_equal @header, SymmetricEncryption::Reader.header_present?(@filename)
150
+ assert_equal @header, SymmetricEncryption::Reader.header_present?(@file_name)
152
151
  assert_raises Errno::ENOENT do
153
152
  SymmetricEncryption::Reader.header_present?('missing_file')
154
153
  end
155
154
  end
156
155
 
157
156
  it '.open return Zlib::GzipReader when compressed' do
158
- file = SymmetricEncryption::Reader.open(@filename)
157
+ file = SymmetricEncryption::Reader.open(@file_name)
159
158
  #assert_equal (@header && (options[:compress]||false)), file.is_a?(Zlib::GzipReader)
160
159
  file.close
161
160
  end
@@ -163,7 +162,7 @@ class ReaderTest < Minitest::Test
163
162
  it '#read' do
164
163
  data = nil
165
164
  eof = nil
166
- result = SymmetricEncryption::Reader.open(@filename) do |file|
165
+ result = SymmetricEncryption::Reader.open(@file_name) do |file|
167
166
  eof = file.eof?
168
167
  data = file.read
169
168
  end
@@ -173,7 +172,7 @@ class ReaderTest < Minitest::Test
173
172
  end
174
173
 
175
174
  it '#read(size)' do
176
- file = SymmetricEncryption::Reader.open(@filename)
175
+ file = SymmetricEncryption::Reader.open(@file_name)
177
176
  eof = file.eof?
178
177
  data = file.read(4096)
179
178
  file.close
@@ -188,7 +187,7 @@ class ReaderTest < Minitest::Test
188
187
  end
189
188
 
190
189
  it '#each_line' do
191
- SymmetricEncryption::Reader.open(@filename) do |file|
190
+ SymmetricEncryption::Reader.open(@file_name) do |file|
192
191
  i = 0
193
192
  file.each_line do |line|
194
193
  assert_equal @data[i], line
@@ -198,7 +197,7 @@ class ReaderTest < Minitest::Test
198
197
  end
199
198
 
200
199
  it '#rewind' do
201
- decrypted = SymmetricEncryption::Reader.open(@filename) do |file|
200
+ decrypted = SymmetricEncryption::Reader.open(@file_name) do |file|
202
201
  file.read
203
202
  file.rewind
204
203
  file.read
@@ -207,7 +206,7 @@ class ReaderTest < Minitest::Test
207
206
  end
208
207
 
209
208
  it '#gets(nil,size)' do
210
- file = SymmetricEncryption::Reader.open(@filename)
209
+ file = SymmetricEncryption::Reader.open(@file_name)
211
210
  eof = file.eof?
212
211
  data = file.gets(nil, 4096)
213
212
  file.close
@@ -227,7 +226,7 @@ class ReaderTest < Minitest::Test
227
226
  end
228
227
 
229
228
  it '#gets(delim)' do
230
- SymmetricEncryption::Reader.open(@filename) do |file|
229
+ SymmetricEncryption::Reader.open(@file_name) do |file|
231
230
  i = 0
232
231
  while line = file.gets("\n")
233
232
  assert_equal @data[i], line
@@ -238,7 +237,7 @@ class ReaderTest < Minitest::Test
238
237
  end
239
238
 
240
239
  it '#gets(delim,size)' do
241
- SymmetricEncryption::Reader.open(@filename) do |file|
240
+ SymmetricEncryption::Reader.open(@file_name) do |file|
242
241
  i = 0
243
242
  while file.gets("\n", 128)
244
243
  i += 1
@@ -253,24 +252,24 @@ class ReaderTest < Minitest::Test
253
252
 
254
253
  describe 'reading from files with previous keys' do
255
254
  before do
256
- @filename = '_test'
255
+ @file_name = '_test'
257
256
  # Create encrypted file with old encryption key
258
- SymmetricEncryption::Writer.open(@filename, version: 0) do |file|
257
+ SymmetricEncryption::Writer.open(@file_name, version: 0) do |file|
259
258
  @data.inject(0) { |sum, str| sum + file.write(str) }
260
259
  end
261
260
  end
262
261
 
263
262
  after do
264
- File.delete(@filename) if File.exist?(@filename)
263
+ File.delete(@file_name) if File.exist?(@file_name)
265
264
  end
266
265
 
267
266
  it 'decrypt from file in a single read' do
268
- decrypted = SymmetricEncryption::Reader.open(@filename) { |file| file.read }
267
+ decrypted = SymmetricEncryption::Reader.open(@file_name) { |file| file.read }
269
268
  assert_equal @data_str, decrypted
270
269
  end
271
270
 
272
271
  it 'decrypt from file a line at a time' do
273
- SymmetricEncryption::Reader.open(@filename) do |file|
272
+ SymmetricEncryption::Reader.open(@file_name) do |file|
274
273
  i = 0
275
274
  file.each_line do |line|
276
275
  assert_equal @data[i], line
@@ -280,7 +279,7 @@ class ReaderTest < Minitest::Test
280
279
  end
281
280
 
282
281
  it 'support rewind' do
283
- decrypted = SymmetricEncryption::Reader.open(@filename) do |file|
282
+ decrypted = SymmetricEncryption::Reader.open(@file_name) do |file|
284
283
  file.read
285
284
  file.rewind
286
285
  file.read
@@ -291,30 +290,30 @@ class ReaderTest < Minitest::Test
291
290
 
292
291
  describe 'reading from files with previous keys without a header' do
293
292
  before do
294
- @filename = '_test'
293
+ @file_name = '_test'
295
294
  # Create encrypted file with old encryption key
296
- SymmetricEncryption::Writer.open(@filename, version: 0, header: false, random_key: false) do |file|
295
+ SymmetricEncryption::Writer.open(@file_name, version: 0, header: false, random_key: false, random_iv: false) do |file|
297
296
  @data.inject(0) { |sum, str| sum + file.write(str) }
298
297
  end
299
298
  end
300
299
 
301
300
  after do
302
301
  begin
303
- File.delete(@filename) if File.exist?(@filename)
302
+ File.delete(@file_name) if File.exist?(@file_name)
304
303
  rescue Errno::EACCES
305
304
  # Required for Windows
306
305
  end
307
306
  end
308
307
 
309
308
  it 'decrypt from file in a single read' do
310
- decrypted = SymmetricEncryption::Reader.open(@filename, version: 0) { |file| file.read }
309
+ decrypted = SymmetricEncryption::Reader.open(@file_name, version: 0) { |file| file.read }
311
310
  assert_equal @data_str, decrypted
312
311
  end
313
312
 
314
313
  it 'decrypt from file in a single read with different version' do
315
314
  # Should fail since file was encrypted using version 0 key
316
315
  assert_raises OpenSSL::Cipher::CipherError do
317
- SymmetricEncryption::Reader.open(@filename, version: 2) { |file| file.read }
316
+ SymmetricEncryption::Reader.read(@file_name, version: 1)
318
317
  end
319
318
  end
320
319
  end