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
@@ -3,7 +3,7 @@ require_relative 'test_helper'
3
3
  # Tests for SymmetricEncryption::Cipher
4
4
  class CipherTest < Minitest::Test
5
5
  ['aes-128-cbc'].each do |cipher_name|
6
- #['aes-128-cbc', 'aes-128-gcm'].each do |cipher_name|
6
+ # ['aes-128-cbc', 'aes-128-gcm'].each do |cipher_name|
7
7
  describe "Cipher: #{cipher_name}" do
8
8
  describe 'standalone' do
9
9
  it 'allows setting the cipher_name' do
@@ -41,7 +41,7 @@ class CipherTest < Minitest::Test
41
41
  end
42
42
 
43
43
  [false, true].each do |always_add_header|
44
- [:none, :base64, :base64strict, :base16].each do |encoding|
44
+ %i[none base64 base64strict base16].each do |encoding|
45
45
  describe "encoding: #{encoding} with#{'out' unless always_add_header} header" do
46
46
  before do
47
47
  @social_security_number = '987654321'
@@ -62,7 +62,7 @@ class CipherTest < Minitest::Test
62
62
  none: {
63
63
  header: "@EnC\x00\x00\xC97\x8B\x8E\xC1\xD3k\xCC\xA4\xA0\xEFy+B\x90\x9A",
64
64
  no_header: "\xC97\x8B\x8E\xC1\xD3k\xCC\xA4\xA0\xEFy+B\x90\x9A"
65
- },
65
+ }
66
66
  },
67
67
  # 'aes-128-gcm' => {
68
68
  # base64: {
@@ -173,8 +173,15 @@ class CipherTest < Minitest::Test
173
173
 
174
174
  it 'build and parse header' do
175
175
  key = SymmetricEncryption::Key.new(cipher_name: 'aes-128-cbc')
176
- assert binary_header = SymmetricEncryption::Cipher.build_header(SymmetricEncryption.cipher.version, true, key.iv, key.key, key.cipher_name)
177
- header = SymmetricEncryption::Header.new
176
+ # Test Deprecated method
177
+ binary_header = SymmetricEncryption::Cipher.build_header(
178
+ SymmetricEncryption.cipher.version,
179
+ true,
180
+ key.iv,
181
+ key.key,
182
+ key.cipher_name
183
+ )
184
+ header = SymmetricEncryption::Header.new
178
185
  header.parse(binary_header)
179
186
  assert_equal true, header.compressed?
180
187
  assert random_cipher = SymmetricEncryption::Cipher.new(iv: key.iv, key: key.key, cipher_name: key.cipher_name)
@@ -204,7 +211,6 @@ class CipherTest < Minitest::Test
204
211
  end
205
212
  end
206
213
  end
207
-
208
214
  end
209
215
  end
210
216
  end
@@ -1,11 +1,10 @@
1
- # encoding: utf-8
2
1
  require_relative 'test_helper'
3
2
 
4
3
  # Unit Test for SymmetricEncryption
5
4
  #
6
5
  class EncoderTest < Minitest::Test
7
6
  describe SymmetricEncryption::Encoder do
8
- [:none, :base64, :base64strict, :base16].each do |encoding|
7
+ %i[none base64 base64strict base16].each do |encoding|
9
8
  describe "encoding: #{encoding}" do
10
9
  before do
11
10
  @data = '987654321'
@@ -57,5 +56,4 @@ class EncoderTest < Minitest::Test
57
56
  end
58
57
  end
59
58
  end
60
-
61
59
  end
@@ -92,7 +92,6 @@ class CipherTest < Minitest::Test
92
92
  assert header.compressed?
93
93
  end
94
94
  end
95
-
96
95
  end
97
96
 
98
97
  describe '#to_s' do
@@ -138,7 +137,6 @@ class CipherTest < Minitest::Test
138
137
  assert header.compressed?
139
138
  end
140
139
  end
141
-
142
140
  end
143
141
  end
144
142
 
@@ -212,7 +210,5 @@ class CipherTest < Minitest::Test
212
210
  end
213
211
  end
214
212
  end
215
-
216
213
  end
217
214
  end
218
-
@@ -233,8 +233,6 @@ class KeyTest < Minitest::Test
233
233
  assert_equal 'aes-256-cbc', config_key.cipher_name
234
234
  end
235
235
  end
236
-
237
236
  end
238
-
239
237
  end
240
238
  end
@@ -16,10 +16,10 @@ module SymmetricEncryption
16
16
 
17
17
  let :keystore_config do
18
18
  SymmetricEncryption::Keystore::Environment.new_key_config(
19
- cipher_name: 'aes-256-cbc',
20
- app_name: 'tester',
21
- environment: 'test',
22
- version: version
19
+ cipher_name: 'aes-256-cbc',
20
+ app_name: 'tester',
21
+ environment: 'test',
22
+ version: version
23
23
  )
24
24
  end
25
25
 
@@ -48,7 +48,7 @@ module SymmetricEncryption
48
48
  end
49
49
 
50
50
  it 'retains the env var name' do
51
- assert_equal "TESTER_TEST_V11", keystore_config[:key_env_var]
51
+ assert_equal 'TESTER_TEST_V11', keystore_config[:key_env_var]
52
52
  end
53
53
 
54
54
  it 'retains cipher_name' do
@@ -58,7 +58,7 @@ module SymmetricEncryption
58
58
 
59
59
  describe '.new_config' do
60
60
  let :environments do
61
- %i(development test acceptance preprod production)
61
+ %i[development test acceptance preprod production]
62
62
  end
63
63
 
64
64
  let :config do
@@ -79,7 +79,7 @@ module SymmetricEncryption
79
79
  end
80
80
 
81
81
  it 'each non test environment has a key encryption key' do
82
- (environments - %i(development test)).each do |env|
82
+ (environments - %i[development test]).each do |env|
83
83
  assert config[env][:ciphers].first[:key_encrypting_key], "Environment #{env} is missing the key encryption key"
84
84
  end
85
85
  end
@@ -92,9 +92,9 @@ module SymmetricEncryption
92
92
  end
93
93
 
94
94
  it 'creates an encrypted key file for all non-test environments' do
95
- (environments - %i(development test)).each do |env|
95
+ (environments - %i[development test]).each do |env|
96
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}"
97
+ assert ciphers.first[:key_env_var], "Environment #{env} is missing key_env_var: #{ciphers.inspect}"
98
98
  end
99
99
  end
100
100
  end
@@ -109,11 +109,10 @@ module SymmetricEncryption
109
109
  end
110
110
 
111
111
  it 'reads the key' do
112
- ENV["TESTER_ENV_VAR"] = Base64.strict_encode64(key.encrypt('TEST'))
112
+ ENV['TESTER_ENV_VAR'] = Base64.strict_encode64(key.encrypt('TEST'))
113
113
  assert_equal 'TEST', keystore.read
114
114
  end
115
115
  end
116
-
117
116
  end
118
117
  end
119
118
  end
@@ -16,11 +16,11 @@ module SymmetricEncryption
16
16
 
17
17
  let :key_config do
18
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
19
+ key_path: 'tmp',
20
+ cipher_name: 'aes-256-cbc',
21
+ app_name: 'tester',
22
+ environment: 'test',
23
+ version: version
24
24
  )
25
25
  end
26
26
 
@@ -60,13 +60,13 @@ module SymmetricEncryption
60
60
 
61
61
  it 'is readable by Key.from_config' do
62
62
  key_config.delete(:version)
63
- assert key = SymmetricEncryption::Key.from_config(key_config)
63
+ assert SymmetricEncryption::Key.from_config(key_config)
64
64
  end
65
65
  end
66
66
 
67
67
  describe '.new_config' do
68
68
  let :environments do
69
- %i(development test acceptance preprod production)
69
+ %i[development test acceptance preprod production]
70
70
  end
71
71
 
72
72
  let :config do
@@ -88,7 +88,7 @@ module SymmetricEncryption
88
88
  end
89
89
 
90
90
  it 'each non test environment has a key encryption key' do
91
- (environments - %i(development test)).each do |env|
91
+ (environments - %i[development test]).each do |env|
92
92
  assert config[env][:ciphers].first[:key_encrypting_key], "Environment #{env} is missing the key encryption key"
93
93
  end
94
94
  end
@@ -101,7 +101,7 @@ module SymmetricEncryption
101
101
  end
102
102
 
103
103
  it 'creates an encrypted key file for all non-test environments' do
104
- (environments - %i(development test)).each do |env|
104
+ (environments - %i[development test]).each do |env|
105
105
  assert ciphers = config[env][:ciphers], "Environment #{env} is missing ciphers: #{config[env].inspect}"
106
106
  assert file_name = ciphers.first[:key_filename], "Environment #{env} is missing key_filename: #{ciphers.inspect}"
107
107
  assert File.exist?(file_name)
@@ -119,7 +119,6 @@ module SymmetricEncryption
119
119
  assert_equal 'TEST', keystore.read
120
120
  end
121
121
  end
122
-
123
122
  end
124
123
  end
125
124
  end
@@ -14,7 +14,7 @@ module SymmetricEncryption
14
14
 
15
15
  describe '.rotate_keys' do
16
16
  let :environments do
17
- %i(development test acceptance preprod production)
17
+ %i[development test acceptance preprod production]
18
18
  end
19
19
 
20
20
  let :config do
@@ -40,7 +40,7 @@ module SymmetricEncryption
40
40
  end
41
41
 
42
42
  it 'creates an encrypted key file for all non-test environments' do
43
- (environments - %i(development test)).each do |env|
43
+ (environments - %i[development test]).each do |env|
44
44
  assert key_rotation
45
45
  assert key_rotation[env.to_sym], key_rotation
46
46
  assert key_rotation[env.to_sym][:ciphers]
@@ -53,7 +53,6 @@ module SymmetricEncryption
53
53
  end
54
54
  end
55
55
  end
56
-
57
56
  end
58
57
  end
59
58
  end
@@ -6,7 +6,7 @@ begin
6
6
 
7
7
  Mongoid.load!('test/config/mongoid.yml')
8
8
 
9
- #@formatter:off
9
+ # @formatter:off
10
10
  class MongoidUser
11
11
  include Mongoid::Document
12
12
 
@@ -42,11 +42,11 @@ begin
42
42
  validates_uniqueness_of :encrypted_username, allow_blank: true, if: :encrypted_username_changed?
43
43
 
44
44
  validates :username,
45
- length: {in: 3..20},
46
- format: {with: /\A[\w\-]+\z/},
47
- allow_blank: true
45
+ length: {in: 3..20},
46
+ format: {with: /\A[\w\-]+\z/},
47
+ allow_blank: true
48
48
  end
49
- #@formatter:on
49
+ # @formatter:on
50
50
 
51
51
  #
52
52
  # Unit Tests for field encrypted and validation aspects of SymmetricEncryption
@@ -60,7 +60,7 @@ begin
60
60
  @social_security_number = '987654321'
61
61
  @social_security_number_encrypted = 'QEVuQwIAS+8X1NRrqdfEIQyFHVPuVA=='
62
62
 
63
- @integer = 32768
63
+ @integer = 32_768
64
64
  @integer_encrypted = 'FA3smFQEKqB/ITv+A0xACg=='
65
65
 
66
66
  @float = 0.9867
@@ -74,10 +74,10 @@ begin
74
74
 
75
75
  @integer_value = 12
76
76
  @float_value = 88.12345
77
- @decimal_value = BigDecimal.new('22.51')
78
- @datetime_value = DateTime.new(2001, 11, 26, 20, 55, 54, "-5")
79
- @time_value = Time.new(2013, 01, 01, 22, 30, 00, "-04:00")
80
- @date_value = Date.new(1927, 04, 02)
77
+ @decimal_value = BigDecimal('22.51')
78
+ @datetime_value = DateTime.new(2001, 11, 26, 20, 55, 54, '-5')
79
+ @time_value = Time.new(2013, 0o1, 0o1, 22, 30, 0o0, '-04:00')
80
+ @date_value = Date.new(1927, 0o4, 0o2)
81
81
  @h = {a: 'A', b: 'B'}
82
82
 
83
83
  @user = MongoidUser.new(
@@ -182,14 +182,14 @@ begin
182
182
  assert_equal @bank_account_number_encrypted, @user.encrypted_social_security_number
183
183
  end
184
184
 
185
- it "all paths it lead to the same result, check uninitialized" do
185
+ it 'all paths it lead to the same result, check uninitialized' do
186
186
  user = MongoidUser.new
187
187
  assert_nil user.social_security_number
188
188
  assert_equal @bank_account_number, (user.social_security_number = @bank_account_number)
189
189
  assert_equal @bank_account_number, user.social_security_number
190
190
  assert_equal @bank_account_number_encrypted, user.encrypted_social_security_number
191
191
 
192
- assert_nil (user.social_security_number = nil)
192
+ user.social_security_number = nil
193
193
  assert_nil user.social_security_number
194
194
  assert_nil user.encrypted_social_security_number
195
195
  end
@@ -216,7 +216,7 @@ begin
216
216
  end
217
217
 
218
218
  after do
219
- @user.destroy if @user
219
+ @user&.destroy
220
220
  end
221
221
 
222
222
  it 'return false if it was not changed' do
@@ -238,7 +238,7 @@ begin
238
238
  end
239
239
 
240
240
  after do
241
- @user.destroy if @user
241
+ @user&.destroy
242
242
  end
243
243
 
244
244
  describe 'aliased fields' do
@@ -251,13 +251,13 @@ begin
251
251
  describe 'integer values' do
252
252
  it 'return correct data type' do
253
253
  assert_equal @integer_value, @user_clone.integer_value
254
- assert @user.clone.integer_value.kind_of?(Integer)
254
+ assert @user.clone.integer_value.is_a?(Integer)
255
255
  end
256
256
 
257
257
  it 'coerce data type before save' do
258
258
  u = MongoidUser.new(integer_value: '5')
259
259
  assert_equal 5, u.integer_value
260
- assert u.integer_value.kind_of?(Integer)
260
+ assert u.integer_value.is_a?(Integer)
261
261
  end
262
262
 
263
263
  it 'permit replacing value with nil' do
@@ -282,13 +282,13 @@ begin
282
282
  describe 'float values' do
283
283
  it 'return correct data type' do
284
284
  assert_equal @float_value, @user_clone.float_value
285
- assert @user.clone.float_value.kind_of?(Float)
285
+ assert @user.clone.float_value.is_a?(Float)
286
286
  end
287
287
 
288
288
  it 'coerce data type before save' do
289
289
  u = MongoidUser.new(float_value: '5.6')
290
290
  assert_equal 5.6, u.float_value
291
- assert u.float_value.kind_of?(Float)
291
+ assert u.float_value.is_a?(Float)
292
292
  end
293
293
 
294
294
  it 'permit replacing value with nil' do
@@ -313,13 +313,13 @@ begin
313
313
  describe 'decimal values' do
314
314
  it 'return correct data type' do
315
315
  assert_equal @decimal_value, @user_clone.decimal_value
316
- assert @user.clone.decimal_value.kind_of?(BigDecimal)
316
+ assert @user.clone.decimal_value.is_a?(BigDecimal)
317
317
  end
318
318
 
319
319
  it 'coerce data type before save' do
320
320
  u = MongoidUser.new(decimal_value: '99.95')
321
- assert_equal BigDecimal.new('99.95'), u.decimal_value
322
- assert u.decimal_value.kind_of?(BigDecimal)
321
+ assert_equal BigDecimal('99.95'), u.decimal_value
322
+ assert u.decimal_value.is_a?(BigDecimal)
323
323
  end
324
324
 
325
325
  it 'permit replacing value with nil' do
@@ -332,7 +332,7 @@ begin
332
332
  end
333
333
 
334
334
  it 'permit replacing value' do
335
- new_decimal_value = BigDecimal.new('99.95')
335
+ new_decimal_value = BigDecimal('99.95')
336
336
  @user_clone.decimal_value = new_decimal_value
337
337
  @user_clone.save!
338
338
 
@@ -344,14 +344,14 @@ begin
344
344
  describe 'datetime values' do
345
345
  it 'return correct data type' do
346
346
  assert_equal @datetime_value, @user_clone.datetime_value
347
- assert @user.clone.datetime_value.kind_of?(DateTime)
347
+ assert @user.clone.datetime_value.is_a?(DateTime)
348
348
  end
349
349
 
350
350
  it 'coerce data type before save' do
351
351
  now = Time.now
352
352
  u = MongoidUser.new(datetime_value: now)
353
353
  assert_equal now, u.datetime_value
354
- assert u.datetime_value.kind_of?(DateTime)
354
+ assert u.datetime_value.is_a?(DateTime)
355
355
  end
356
356
 
357
357
  it 'permit replacing value with nil' do
@@ -376,14 +376,14 @@ begin
376
376
  describe 'time values' do
377
377
  it 'return correct data type' do
378
378
  assert_equal @time_value, @user_clone.time_value.dup
379
- assert @user.clone.time_value.kind_of?(Time)
379
+ assert @user.clone.time_value.is_a?(Time)
380
380
  end
381
381
 
382
382
  it 'coerce data type before save' do
383
383
  now = Time.now
384
384
  u = MongoidUser.new(time_value: now)
385
385
  assert_equal now, u.time_value.dup
386
- assert u.time_value.kind_of?(Time)
386
+ assert u.time_value.is_a?(Time)
387
387
  end
388
388
 
389
389
  it 'permit replacing value with nil' do
@@ -408,14 +408,14 @@ begin
408
408
  describe 'date values' do
409
409
  it 'return correct data type' do
410
410
  assert_equal @date_value, @user_clone.date_value
411
- assert @user.clone.date_value.kind_of?(Date)
411
+ assert @user.clone.date_value.is_a?(Date)
412
412
  end
413
413
 
414
414
  it 'coerce data type before save' do
415
415
  now = Time.now
416
416
  u = MongoidUser.new(date_value: now)
417
417
  assert_equal now.to_date, u.date_value
418
- assert u.date_value.kind_of?(Date)
418
+ assert u.date_value.is_a?(Date)
419
419
  end
420
420
 
421
421
  it 'permit replacing value with nil' do
@@ -440,13 +440,13 @@ begin
440
440
  describe 'true values' do
441
441
  it 'return correct data type' do
442
442
  assert_equal true, @user_clone.true_value
443
- assert @user.clone.true_value.kind_of?(TrueClass)
443
+ assert @user.clone.true_value.is_a?(TrueClass)
444
444
  end
445
445
 
446
446
  it 'coerce data type before save' do
447
447
  u = MongoidUser.new(true_value: '1')
448
448
  assert_equal true, u.true_value
449
- assert u.true_value.kind_of?(TrueClass)
449
+ assert u.true_value.is_a?(TrueClass)
450
450
  end
451
451
 
452
452
  it 'permit replacing value with nil' do
@@ -471,13 +471,13 @@ begin
471
471
  describe 'false values' do
472
472
  it 'return correct data type' do
473
473
  assert_equal false, @user_clone.false_value
474
- assert @user.clone.false_value.kind_of?(FalseClass)
474
+ assert @user.clone.false_value.is_a?(FalseClass)
475
475
  end
476
476
 
477
477
  it 'coerce data type before save' do
478
478
  u = MongoidUser.new(false_value: '0')
479
479
  assert_equal false, u.false_value
480
- assert u.false_value.kind_of?(FalseClass)
480
+ assert u.false_value.is_a?(FalseClass)
481
481
  end
482
482
 
483
483
  it 'permit replacing value with nil' do
@@ -511,13 +511,13 @@ begin
511
511
 
512
512
  it 'return correct data type' do
513
513
  assert_equal @h, @user_clone.data_json
514
- assert @user.clone.data_json.kind_of?(Hash)
514
+ assert @user.clone.data_json.is_a?(Hash)
515
515
  end
516
516
 
517
517
  it 'not coerce data type (leaves as hash) before save' do
518
518
  u = MongoidUser.new(data_json: @h)
519
519
  assert_equal @h, u.data_json
520
- assert u.data_json.kind_of?(Hash)
520
+ assert u.data_json.is_a?(Hash)
521
521
  end
522
522
 
523
523
  it 'permit replacing value with nil' do
@@ -543,13 +543,13 @@ begin
543
543
  describe 'YAML Serialization' do
544
544
  it 'return correct data type' do
545
545
  assert_equal @h, @user_clone.data_yaml
546
- assert @user.clone.data_yaml.kind_of?(Hash)
546
+ assert @user.clone.data_yaml.is_a?(Hash)
547
547
  end
548
548
 
549
549
  it 'not coerce data type (leaves as hash) before save' do
550
550
  u = MongoidUser.new(data_yaml: @h)
551
551
  assert_equal @h, u.data_yaml
552
- assert u.data_yaml.kind_of?(Hash)
552
+ assert u.data_yaml.is_a?(Hash)
553
553
  end
554
554
 
555
555
  it 'permit replacing value with nil' do
@@ -571,7 +571,6 @@ begin
571
571
  assert_equal new_value, @user.data_yaml
572
572
  end
573
573
  end
574
-
575
574
  end
576
575
 
577
576
  describe 'uniqueness' do
@@ -589,10 +588,8 @@ begin
589
588
  assert_equal 'is already taken', duplicate.errors.messages[:encrypted_email].first
590
589
  end
591
590
  end
592
-
593
591
  end
594
592
  end
595
-
596
593
  rescue LoadError
597
- puts "Not running Mongoid tests because mongoid gem is not installed!!!"
594
+ puts 'Not running Mongoid tests because mongoid gem is not installed!!!'
598
595
  end