symmetric-encryption 3.9.1 → 4.0.0.beta3

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 (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