symmetric-encryption 4.0.0 → 4.0.1
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 +5 -5
- data/Rakefile +2 -2
- data/bin/symmetric-encryption +1 -1
- data/lib/symmetric-encryption.rb +1 -1
- data/lib/symmetric_encryption.rb +2 -2
- data/lib/symmetric_encryption/cipher.rb +15 -18
- data/lib/symmetric_encryption/cli.rb +30 -36
- data/lib/symmetric_encryption/coerce.rb +3 -4
- data/lib/symmetric_encryption/config.rb +30 -34
- data/lib/symmetric_encryption/encoder.rb +0 -1
- data/lib/symmetric_encryption/exception.rb +0 -2
- data/lib/symmetric_encryption/extensions/active_record/base.rb +5 -2
- data/lib/symmetric_encryption/extensions/mongo_mapper/plugins/encrypted_key.rb +3 -5
- data/lib/symmetric_encryption/extensions/mongoid/encrypted.rb +0 -2
- data/lib/symmetric_encryption/generator.rb +3 -3
- data/lib/symmetric_encryption/header.rb +9 -4
- data/lib/symmetric_encryption/key.rb +3 -4
- data/lib/symmetric_encryption/keystore.rb +9 -9
- data/lib/symmetric_encryption/keystore/environment.rb +6 -7
- data/lib/symmetric_encryption/keystore/file.rb +5 -6
- data/lib/symmetric_encryption/keystore/memory.rb +2 -2
- data/lib/symmetric_encryption/railtie.rb +4 -7
- data/lib/symmetric_encryption/railties/symmetric_encryption_validator.rb +2 -1
- data/lib/symmetric_encryption/reader.rb +28 -39
- data/lib/symmetric_encryption/symmetric_encryption.rb +10 -8
- data/lib/symmetric_encryption/utils/re_encrypt_files.rb +5 -8
- data/lib/symmetric_encryption/version.rb +2 -2
- data/lib/symmetric_encryption/writer.rb +12 -17
- data/test/active_record_test.rb +237 -200
- data/test/cipher_test.rb +12 -6
- data/test/encoder_test.rb +1 -3
- data/test/header_test.rb +0 -4
- data/test/key_test.rb +0 -2
- data/test/keystore/environment_test.rb +10 -11
- data/test/keystore/file_test.rb +9 -10
- data/test/keystore_test.rb +2 -3
- data/test/mongoid_test.rb +37 -40
- data/test/reader_test.rb +24 -32
- data/test/symmetric_encryption_test.rb +17 -18
- data/test/test_db.sqlite3 +0 -0
- data/test/writer_test.rb +0 -1
- metadata +23 -23
data/test/reader_test.rb
CHANGED
@@ -37,14 +37,14 @@ class ReaderTest < Minitest::Test
|
|
37
37
|
@data_encrypted = header ? @data_encrypted_with_header : @data_encrypted_without_header
|
38
38
|
end
|
39
39
|
|
40
|
-
it
|
40
|
+
it '#read()' do
|
41
41
|
stream = StringIO.new(@data_encrypted)
|
42
42
|
# Version 0 supplied if the file/stream does not have a header
|
43
|
-
decrypted = SymmetricEncryption::Reader.open(stream, version: 0
|
43
|
+
decrypted = SymmetricEncryption::Reader.open(stream, version: 0, &:read)
|
44
44
|
assert_equal @data_str, decrypted
|
45
45
|
end
|
46
46
|
|
47
|
-
it
|
47
|
+
it '#read(size) followed by #read()' do
|
48
48
|
stream = StringIO.new(@data_encrypted)
|
49
49
|
# Version 0 supplied if the file/stream does not have a header
|
50
50
|
decrypted = SymmetricEncryption::Reader.open(stream, version: 0) do |file|
|
@@ -54,7 +54,7 @@ class ReaderTest < Minitest::Test
|
|
54
54
|
assert_equal @data_str[10..-1], decrypted
|
55
55
|
end
|
56
56
|
|
57
|
-
it
|
57
|
+
it '#each_line' do
|
58
58
|
stream = StringIO.new(@data_encrypted)
|
59
59
|
i = 0
|
60
60
|
# Version 0 supplied if the file/stream does not have a header
|
@@ -66,17 +66,17 @@ class ReaderTest < Minitest::Test
|
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
69
|
-
it
|
69
|
+
it '#read(size)' do
|
70
70
|
stream = StringIO.new(@data_encrypted)
|
71
71
|
# Version 0 supplied if the file/stream does not have a header
|
72
72
|
SymmetricEncryption::Reader.open(stream, version: 0) do |file|
|
73
73
|
index = 0
|
74
74
|
[0, 10, 5, 5000].each do |size|
|
75
75
|
buf = file.read(size)
|
76
|
-
if size
|
76
|
+
if size.zero?
|
77
77
|
assert_equal '', buf
|
78
78
|
else
|
79
|
-
assert_equal @data_str[index..index+size-1], buf
|
79
|
+
assert_equal @data_str[index..index + size - 1], buf
|
80
80
|
end
|
81
81
|
index += size
|
82
82
|
end
|
@@ -99,11 +99,10 @@ class ReaderTest < Minitest::Test
|
|
99
99
|
# Random iv only
|
100
100
|
{random_key: false, random_iv: true},
|
101
101
|
# Random iv only with compression
|
102
|
-
{random_iv: true, compress: true}
|
102
|
+
{random_iv: true, compress: true}
|
103
103
|
].each do |options|
|
104
104
|
|
105
|
-
[
|
106
|
-
|
105
|
+
%i[data empty blank].each do |usecase|
|
107
106
|
describe "read from #{usecase} file with options: #{options.inspect}" do
|
108
107
|
before do
|
109
108
|
case usecase
|
@@ -140,7 +139,7 @@ class ReaderTest < Minitest::Test
|
|
140
139
|
end
|
141
140
|
|
142
141
|
it '.empty?' do
|
143
|
-
assert_equal
|
142
|
+
assert_equal @data_size.zero?, SymmetricEncryption::Reader.empty?(@file_name)
|
144
143
|
assert_raises Errno::ENOENT do
|
145
144
|
SymmetricEncryption::Reader.empty?('missing_file')
|
146
145
|
end
|
@@ -155,7 +154,7 @@ class ReaderTest < Minitest::Test
|
|
155
154
|
|
156
155
|
it '.open return Zlib::GzipReader when compressed' do
|
157
156
|
file = SymmetricEncryption::Reader.open(@file_name)
|
158
|
-
#assert_equal (@header && (options[:compress]||false)), file.is_a?(Zlib::GzipReader)
|
157
|
+
# assert_equal (@header && (options[:compress]||false)), file.is_a?(Zlib::GzipReader)
|
159
158
|
file.close
|
160
159
|
end
|
161
160
|
|
@@ -178,12 +177,11 @@ class ReaderTest < Minitest::Test
|
|
178
177
|
file.close
|
179
178
|
|
180
179
|
assert_equal @eof, eof
|
181
|
-
if @data_size
|
180
|
+
if @data_size.positive?
|
182
181
|
assert_equal @data_str, data
|
183
182
|
else
|
184
183
|
assert_nil data
|
185
184
|
end
|
186
|
-
|
187
185
|
end
|
188
186
|
|
189
187
|
it '#each_line' do
|
@@ -212,40 +210,34 @@ class ReaderTest < Minitest::Test
|
|
212
210
|
file.close
|
213
211
|
|
214
212
|
assert_equal @eof, eof
|
215
|
-
if @data_size
|
213
|
+
if @data_size.positive?
|
216
214
|
assert_equal @data_str, data
|
215
|
+
# On JRuby Zlib::GzipReader.new(file) returns '' instead of nil on an empty file
|
216
|
+
elsif defined?(JRuby) && options[:compress] && (usecase == :empty)
|
217
|
+
assert_equal '', data
|
217
218
|
else
|
218
|
-
|
219
|
-
# on an empty file
|
220
|
-
if defined?(JRuby) && options[:compress] && (usecase == :empty)
|
221
|
-
assert_equal '', data
|
222
|
-
else
|
223
|
-
assert_nil data
|
224
|
-
end
|
219
|
+
assert_nil data
|
225
220
|
end
|
226
221
|
end
|
227
222
|
|
228
223
|
it '#gets(delim)' do
|
229
224
|
SymmetricEncryption::Reader.open(@file_name) do |file|
|
230
225
|
i = 0
|
231
|
-
while line = file.gets("\n")
|
226
|
+
while (line = file.gets("\n"))
|
232
227
|
assert_equal @data[i], line
|
233
228
|
i += 1
|
234
229
|
end
|
235
|
-
assert_equal (@data_size
|
230
|
+
assert_equal (@data_size.positive? ? 3 : 0), i
|
236
231
|
end
|
237
232
|
end
|
238
233
|
|
239
234
|
it '#gets(delim,size)' do
|
240
235
|
SymmetricEncryption::Reader.open(@file_name) do |file|
|
241
236
|
i = 0
|
242
|
-
while file.gets("\n", 128)
|
243
|
-
|
244
|
-
end
|
245
|
-
assert_equal (@data_size > 0 ? 3 : 0), i
|
237
|
+
i += 1 while file.gets("\n", 128)
|
238
|
+
assert_equal (@data_size.positive? ? 3 : 0), i
|
246
239
|
end
|
247
240
|
end
|
248
|
-
|
249
241
|
end
|
250
242
|
end
|
251
243
|
end
|
@@ -264,7 +256,7 @@ class ReaderTest < Minitest::Test
|
|
264
256
|
end
|
265
257
|
|
266
258
|
it 'decrypt from file in a single read' do
|
267
|
-
decrypted = SymmetricEncryption::Reader.open(@file_name
|
259
|
+
decrypted = SymmetricEncryption::Reader.open(@file_name, &:read)
|
268
260
|
assert_equal @data_str, decrypted
|
269
261
|
end
|
270
262
|
|
@@ -302,11 +294,12 @@ class ReaderTest < Minitest::Test
|
|
302
294
|
File.delete(@file_name) if File.exist?(@file_name)
|
303
295
|
rescue Errno::EACCES
|
304
296
|
# Required for Windows
|
297
|
+
nil
|
305
298
|
end
|
306
299
|
end
|
307
300
|
|
308
301
|
it 'decrypt from file in a single read' do
|
309
|
-
decrypted = SymmetricEncryption::Reader.open(@file_name, version: 0
|
302
|
+
decrypted = SymmetricEncryption::Reader.open(@file_name, version: 0, &:read)
|
310
303
|
assert_equal @data_str, decrypted
|
311
304
|
end
|
312
305
|
|
@@ -317,6 +310,5 @@ class ReaderTest < Minitest::Test
|
|
317
310
|
end
|
318
311
|
end
|
319
312
|
end
|
320
|
-
|
321
313
|
end
|
322
314
|
end
|
@@ -4,7 +4,6 @@ require_relative 'test_helper'
|
|
4
4
|
#
|
5
5
|
class SymmetricEncryptionTest < Minitest::Test
|
6
6
|
describe 'SymmetricEncryption' do
|
7
|
-
|
8
7
|
describe 'configuration' do
|
9
8
|
before do
|
10
9
|
config = SymmetricEncryption::Config.new(
|
@@ -45,11 +44,11 @@ class SymmetricEncryptionTest < Minitest::Test
|
|
45
44
|
end
|
46
45
|
end
|
47
46
|
|
48
|
-
[
|
47
|
+
%i[none base64 base64strict base16].each do |encoding|
|
49
48
|
describe "encoding: #{encoding}" do
|
50
49
|
before do
|
51
|
-
@social_security_number
|
52
|
-
@social_security_number_encrypted
|
50
|
+
@social_security_number = '987654321'
|
51
|
+
@social_security_number_encrypted =
|
53
52
|
case encoding
|
54
53
|
when :base64
|
55
54
|
"QEVuQwIAS+8X1NRrqdfEIQyFHVPuVA==\n"
|
@@ -62,10 +61,9 @@ class SymmetricEncryptionTest < Minitest::Test
|
|
62
61
|
else
|
63
62
|
raise "Add test for encoding: #{encoding}"
|
64
63
|
end
|
65
|
-
@
|
66
|
-
@
|
67
|
-
|
68
|
-
SymmetricEncryption.cipher.encoding = encoding
|
64
|
+
@non_utf8 = "\xc2".force_encoding('binary')
|
65
|
+
@encoding = SymmetricEncryption.cipher.encoding
|
66
|
+
SymmetricEncryption.cipher.encoding = encoding
|
69
67
|
end
|
70
68
|
|
71
69
|
after do
|
@@ -109,7 +107,7 @@ class SymmetricEncryptionTest < Minitest::Test
|
|
109
107
|
end
|
110
108
|
|
111
109
|
it 'determine if string is encrypted' do
|
112
|
-
if
|
110
|
+
if %i[base64strict base64].include?(encoding)
|
113
111
|
assert SymmetricEncryption.encrypted?(@social_security_number_encrypted)
|
114
112
|
refute SymmetricEncryption.encrypted?(@social_security_number)
|
115
113
|
|
@@ -124,9 +122,10 @@ class SymmetricEncryptionTest < Minitest::Test
|
|
124
122
|
before do
|
125
123
|
@social_security_number = '987654321'
|
126
124
|
# Encrypt data without a header and encode with base64 which has a trailing '\n'
|
127
|
-
|
125
|
+
no_header = SymmetricEncryption.cipher(0).binary_encrypt(@social_security_number, header: false)
|
126
|
+
@encrypted_0_ssn = SymmetricEncryption.cipher(0).encode(no_header)
|
128
127
|
|
129
|
-
SymmetricEncryption.select_cipher do |encoded_str,
|
128
|
+
SymmetricEncryption.select_cipher do |encoded_str, _decoded_str|
|
130
129
|
# Use cipher version 0 if the encoded string ends with "\n" otherwise
|
131
130
|
# use the current default cipher
|
132
131
|
encoded_str.end_with?("\n") ? SymmetricEncryption.cipher(0) : SymmetricEncryption.cipher
|
@@ -147,7 +146,8 @@ class SymmetricEncryptionTest < Minitest::Test
|
|
147
146
|
before do
|
148
147
|
@social_security_number = '987654321'
|
149
148
|
# Encrypt data without a header and encode with base64 which has a trailing '\n'
|
150
|
-
|
149
|
+
no_header = SymmetricEncryption.cipher(0).binary_encrypt(@social_security_number, header: false)
|
150
|
+
assert @encrypted_0_ssn = SymmetricEncryption.cipher(0).encode(no_header)
|
151
151
|
end
|
152
152
|
|
153
153
|
it 'decrypt string without a header using an old cipher' do
|
@@ -207,12 +207,12 @@ class SymmetricEncryptionTest < Minitest::Test
|
|
207
207
|
{
|
208
208
|
integer: 21,
|
209
209
|
float: 2.5,
|
210
|
-
decimal: BigDecimal
|
211
|
-
datetime: DateTime.new(2001, 11, 26, 20, 55, 54,
|
212
|
-
time: Time.new(2013,
|
213
|
-
date: Date.new(1927,
|
210
|
+
decimal: BigDecimal('12.58'),
|
211
|
+
datetime: DateTime.new(2001, 11, 26, 20, 55, 54, '-5'),
|
212
|
+
time: Time.new(2013, 1, 1, 22, 30, 0, '-04:00'),
|
213
|
+
date: Date.new(1927, 4, 1),
|
214
214
|
boolean: true,
|
215
|
-
yaml: {:
|
215
|
+
yaml: {a: :b},
|
216
216
|
json: {'a' => 'b'}
|
217
217
|
}.each_pair do |type, value|
|
218
218
|
describe type.to_s do
|
@@ -234,7 +234,6 @@ class SymmetricEncryptionTest < Minitest::Test
|
|
234
234
|
assert_equal false, SymmetricEncryption.decrypt(encrypted, type: :boolean)
|
235
235
|
end
|
236
236
|
end
|
237
|
-
|
238
237
|
end
|
239
238
|
end
|
240
239
|
end
|
data/test/test_db.sqlite3
CHANGED
Binary file
|
data/test/writer_test.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: symmetric-encryption
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0.
|
4
|
+
version: 4.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Reid Morrison
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-05-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: coercible
|
@@ -24,8 +24,7 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.0'
|
27
|
-
description:
|
28
|
-
Encrypt passwords in configuration files. Encrypt entire files at rest.
|
27
|
+
description:
|
29
28
|
email:
|
30
29
|
- reidmo@gmail.com
|
31
30
|
executables:
|
@@ -98,7 +97,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
98
97
|
requirements:
|
99
98
|
- - ">="
|
100
99
|
- !ruby/object:Gem::Version
|
101
|
-
version: '2.
|
100
|
+
version: '2.3'
|
102
101
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
103
102
|
requirements:
|
104
103
|
- - ">="
|
@@ -106,31 +105,32 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
105
|
version: '0'
|
107
106
|
requirements: []
|
108
107
|
rubyforge_project:
|
109
|
-
rubygems_version: 2.6
|
108
|
+
rubygems_version: 2.7.6
|
110
109
|
signing_key:
|
111
110
|
specification_version: 4
|
112
|
-
summary:
|
111
|
+
summary: Encrypt ActiveRecord and Mongoid attributes, files and passwords in configuration
|
112
|
+
files.
|
113
113
|
test_files:
|
114
|
-
- test/
|
115
|
-
- test/
|
116
|
-
- test/
|
117
|
-
- test/config/
|
118
|
-
- test/config/mongo_mapper.yml
|
114
|
+
- test/keystore/environment_test.rb
|
115
|
+
- test/keystore/file_test.rb
|
116
|
+
- test/symmetric_encryption_test.rb
|
117
|
+
- test/config/test_secondary_1.key
|
119
118
|
- test/config/mongoid.yml
|
120
|
-
- test/config/symmetric-encryption.yml
|
121
119
|
- test/config/test_new.iv
|
122
|
-
- test/config/test_new.key
|
123
120
|
- test/config/test_secondary_1.iv
|
124
|
-
- test/config/
|
125
|
-
- test/
|
126
|
-
- test/
|
127
|
-
- test/
|
128
|
-
- test/
|
129
|
-
- test/
|
130
|
-
- test/keystore_test.rb
|
121
|
+
- test/config/database.yml
|
122
|
+
- test/config/test_new.key
|
123
|
+
- test/config/symmetric-encryption.yml
|
124
|
+
- test/config/empty.csv
|
125
|
+
- test/config/mongo_mapper.yml
|
126
|
+
- test/test_db.sqlite3
|
131
127
|
- test/mongoid_test.rb
|
128
|
+
- test/active_record_test.rb
|
129
|
+
- test/keystore_test.rb
|
132
130
|
- test/reader_test.rb
|
133
|
-
- test/
|
134
|
-
- test/
|
131
|
+
- test/encoder_test.rb
|
132
|
+
- test/key_test.rb
|
133
|
+
- test/header_test.rb
|
135
134
|
- test/test_helper.rb
|
136
135
|
- test/writer_test.rb
|
136
|
+
- test/cipher_test.rb
|