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