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.
- checksums.yaml +4 -4
- data/README.md +72 -0
- data/bin/symmetric-encryption +5 -0
- data/lib/symmetric_encryption/cipher.rb +162 -419
- data/lib/symmetric_encryption/cli.rb +343 -0
- data/lib/symmetric_encryption/coerce.rb +5 -20
- data/lib/symmetric_encryption/config.rb +128 -50
- data/lib/symmetric_encryption/extensions/mongo_mapper/plugins/encrypted_key.rb +2 -2
- data/lib/symmetric_encryption/generator.rb +3 -2
- data/lib/symmetric_encryption/header.rb +260 -0
- data/lib/symmetric_encryption/key.rb +106 -0
- data/lib/symmetric_encryption/keystore/environment.rb +90 -0
- data/lib/symmetric_encryption/keystore/file.rb +102 -0
- data/lib/symmetric_encryption/keystore/memory.rb +53 -0
- data/lib/symmetric_encryption/keystore.rb +124 -0
- data/lib/symmetric_encryption/railtie.rb +5 -7
- data/lib/symmetric_encryption/reader.rb +74 -55
- data/lib/symmetric_encryption/rsa_key.rb +24 -0
- data/lib/symmetric_encryption/symmetric_encryption.rb +64 -102
- data/lib/symmetric_encryption/utils/re_encrypt_files.rb +140 -0
- data/lib/symmetric_encryption/version.rb +1 -1
- data/lib/symmetric_encryption/writer.rb +104 -117
- data/lib/symmetric_encryption.rb +9 -4
- data/test/active_record_test.rb +61 -40
- data/test/cipher_test.rb +179 -236
- data/test/config/symmetric-encryption.yml +140 -82
- data/test/header_test.rb +218 -0
- data/test/key_test.rb +231 -0
- data/test/keystore/environment_test.rb +119 -0
- data/test/keystore/file_test.rb +125 -0
- data/test/keystore_test.rb +59 -0
- data/test/mongoid_test.rb +13 -13
- data/test/reader_test.rb +52 -53
- data/test/symmetric_encryption_test.rb +50 -135
- data/test/test_db.sqlite3 +0 -0
- data/test/writer_test.rb +52 -31
- metadata +26 -14
- data/examples/symmetric-encryption.yml +0 -108
- data/lib/rails/generators/symmetric_encryption/config/config_generator.rb +0 -22
- data/lib/rails/generators/symmetric_encryption/config/templates/symmetric-encryption.yml +0 -50
- data/lib/rails/generators/symmetric_encryption/heroku_config/heroku_config_generator.rb +0 -20
- data/lib/rails/generators/symmetric_encryption/heroku_config/templates/symmetric-encryption.yml +0 -78
- data/lib/rails/generators/symmetric_encryption/new_keys/new_keys_generator.rb +0 -14
- data/lib/symmetric_encryption/key_encryption_key.rb +0 -32
- data/lib/symmetric_encryption/railties/symmetric_encryption.rake +0 -84
- 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:
|
89
|
-
aliased_integer_value:
|
90
|
-
float_value:
|
91
|
-
decimal_value:
|
92
|
-
datetime_value:
|
93
|
-
time_value:
|
94
|
-
date_value:
|
95
|
-
true_value:
|
96
|
-
false_value:
|
97
|
-
data_yaml:
|
98
|
-
data_json:
|
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
|
-
|
156
|
+
@user.string = 'blah'
|
157
157
|
@user.string = @string.dup
|
158
|
-
|
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
|
15
|
-
@data_len
|
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
|
-
|
21
|
-
@cipher.version,
|
22
|
-
|
23
|
-
@cipher.send(:
|
24
|
-
@cipher.
|
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
|
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
|
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
|
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
|
60
|
-
i
|
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
|
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
|
114
|
-
@
|
115
|
-
@header
|
116
|
-
SymmetricEncryption::Writer.open(@
|
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
|
122
|
-
@
|
123
|
-
@header
|
124
|
-
SymmetricEncryption::Writer.open(@
|
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
|
130
|
-
@
|
131
|
-
@header
|
132
|
-
assert_equal 0, File.size(@
|
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(@
|
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?(@
|
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?(@
|
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(@
|
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(@
|
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(@
|
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(@
|
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(@
|
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(@
|
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(@
|
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(@
|
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
|
-
@
|
255
|
+
@file_name = '_test'
|
257
256
|
# Create encrypted file with old encryption key
|
258
|
-
SymmetricEncryption::Writer.open(@
|
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(@
|
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(@
|
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(@
|
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(@
|
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
|
-
@
|
293
|
+
@file_name = '_test'
|
295
294
|
# Create encrypted file with old encryption key
|
296
|
-
SymmetricEncryption::Writer.open(@
|
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(@
|
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(@
|
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.
|
316
|
+
SymmetricEncryption::Reader.read(@file_name, version: 1)
|
318
317
|
end
|
319
318
|
end
|
320
319
|
end
|