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.
Files changed (42) hide show
  1. checksums.yaml +5 -5
  2. data/Rakefile +2 -2
  3. data/bin/symmetric-encryption +1 -1
  4. data/lib/symmetric-encryption.rb +1 -1
  5. data/lib/symmetric_encryption.rb +2 -2
  6. data/lib/symmetric_encryption/cipher.rb +15 -18
  7. data/lib/symmetric_encryption/cli.rb +30 -36
  8. data/lib/symmetric_encryption/coerce.rb +3 -4
  9. data/lib/symmetric_encryption/config.rb +30 -34
  10. data/lib/symmetric_encryption/encoder.rb +0 -1
  11. data/lib/symmetric_encryption/exception.rb +0 -2
  12. data/lib/symmetric_encryption/extensions/active_record/base.rb +5 -2
  13. data/lib/symmetric_encryption/extensions/mongo_mapper/plugins/encrypted_key.rb +3 -5
  14. data/lib/symmetric_encryption/extensions/mongoid/encrypted.rb +0 -2
  15. data/lib/symmetric_encryption/generator.rb +3 -3
  16. data/lib/symmetric_encryption/header.rb +9 -4
  17. data/lib/symmetric_encryption/key.rb +3 -4
  18. data/lib/symmetric_encryption/keystore.rb +9 -9
  19. data/lib/symmetric_encryption/keystore/environment.rb +6 -7
  20. data/lib/symmetric_encryption/keystore/file.rb +5 -6
  21. data/lib/symmetric_encryption/keystore/memory.rb +2 -2
  22. data/lib/symmetric_encryption/railtie.rb +4 -7
  23. data/lib/symmetric_encryption/railties/symmetric_encryption_validator.rb +2 -1
  24. data/lib/symmetric_encryption/reader.rb +28 -39
  25. data/lib/symmetric_encryption/symmetric_encryption.rb +10 -8
  26. data/lib/symmetric_encryption/utils/re_encrypt_files.rb +5 -8
  27. data/lib/symmetric_encryption/version.rb +2 -2
  28. data/lib/symmetric_encryption/writer.rb +12 -17
  29. data/test/active_record_test.rb +237 -200
  30. data/test/cipher_test.rb +12 -6
  31. data/test/encoder_test.rb +1 -3
  32. data/test/header_test.rb +0 -4
  33. data/test/key_test.rb +0 -2
  34. data/test/keystore/environment_test.rb +10 -11
  35. data/test/keystore/file_test.rb +9 -10
  36. data/test/keystore_test.rb +2 -3
  37. data/test/mongoid_test.rb +37 -40
  38. data/test/reader_test.rb +24 -32
  39. data/test/symmetric_encryption_test.rb +17 -18
  40. data/test/test_db.sqlite3 +0 -0
  41. data/test/writer_test.rb +0 -1
  42. metadata +23 -23
@@ -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 "#read()" do
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) { |file| file.read }
43
+ decrypted = SymmetricEncryption::Reader.open(stream, version: 0, &:read)
44
44
  assert_equal @data_str, decrypted
45
45
  end
46
46
 
47
- it "#read(size) followed by #read()" do
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 "#each_line" do
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 "#read(size)" do
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 == 0
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
- [:data, :empty, :blank].each do |usecase|
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 (@data_size==0), SymmetricEncryption::Reader.empty?(@file_name)
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 > 0
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 > 0
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
- # On JRuby Zlib::GzipReader.new(file) returns '' instead of nil
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 > 0 ? 3 : 0), i
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
- i += 1
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) { |file| file.read }
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) { |file| file.read }
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
- [:none, :base64, :base64strict, :base16].each do |encoding|
47
+ %i[none base64 base64strict base16].each do |encoding|
49
48
  describe "encoding: #{encoding}" do
50
49
  before do
51
- @social_security_number = '987654321'
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
- @social_security_number_encrypted_with_secondary_1 = "D1UCu38pqJ3jc0GvwJHiow==\n"
66
- @non_utf8 = "\xc2".force_encoding('binary')
67
- @encoding = SymmetricEncryption.cipher.encoding
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 encoding == :base64strict || encoding == :base64
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
- @encrypted_0_ssn = SymmetricEncryption.cipher(0).encode(SymmetricEncryption.cipher(0).binary_encrypt(@social_security_number, header: false))
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, decoded_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
- assert @encrypted_0_ssn = SymmetricEncryption.cipher(0).encode(SymmetricEncryption.cipher(0).binary_encrypt(@social_security_number, header: false))
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.new('12.58'),
211
- datetime: DateTime.new(2001, 11, 26, 20, 55, 54, "-5"),
212
- time: Time.new(2013, 01, 01, 22, 30, 00, "-04:00"),
213
- date: Date.new(1927, 04, 01),
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: {:a => :b},
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
Binary file
@@ -73,6 +73,5 @@ class WriterTest < Minitest::Test
73
73
  assert_equal @data_str, SymmetricEncryption::Reader.read(@file_name)
74
74
  end
75
75
  end
76
-
77
76
  end
78
77
  end
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.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: 2017-08-30 00:00:00.000000000 Z
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: Transparently encrypt ActiveRecord, Mongoid, and MongoMapper attributes.
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.1'
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.11
108
+ rubygems_version: 2.7.6
110
109
  signing_key:
111
110
  specification_version: 4
112
- summary: Encryption for Ruby, and Ruby on Rails
111
+ summary: Encrypt ActiveRecord and Mongoid attributes, files and passwords in configuration
112
+ files.
113
113
  test_files:
114
- - test/active_record_test.rb
115
- - test/cipher_test.rb
116
- - test/config/database.yml
117
- - test/config/empty.csv
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/test_secondary_1.key
125
- - test/encoder_test.rb
126
- - test/header_test.rb
127
- - test/key_test.rb
128
- - test/keystore/environment_test.rb
129
- - test/keystore/file_test.rb
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/symmetric_encryption_test.rb
134
- - test/test_db.sqlite3
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