symmetric-encryption 3.9.1 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +72 -0
  3. data/bin/symmetric-encryption +5 -0
  4. data/lib/symmetric_encryption/cipher.rb +162 -419
  5. data/lib/symmetric_encryption/cli.rb +343 -0
  6. data/lib/symmetric_encryption/coerce.rb +5 -20
  7. data/lib/symmetric_encryption/config.rb +128 -50
  8. data/lib/symmetric_encryption/extensions/mongo_mapper/plugins/encrypted_key.rb +2 -2
  9. data/lib/symmetric_encryption/generator.rb +3 -2
  10. data/lib/symmetric_encryption/header.rb +260 -0
  11. data/lib/symmetric_encryption/key.rb +106 -0
  12. data/lib/symmetric_encryption/keystore/environment.rb +90 -0
  13. data/lib/symmetric_encryption/keystore/file.rb +102 -0
  14. data/lib/symmetric_encryption/keystore/memory.rb +53 -0
  15. data/lib/symmetric_encryption/keystore.rb +126 -0
  16. data/lib/symmetric_encryption/railtie.rb +5 -7
  17. data/lib/symmetric_encryption/reader.rb +74 -55
  18. data/lib/symmetric_encryption/rsa_key.rb +24 -0
  19. data/lib/symmetric_encryption/symmetric_encryption.rb +64 -102
  20. data/lib/symmetric_encryption/utils/re_encrypt_files.rb +141 -0
  21. data/lib/symmetric_encryption/version.rb +1 -1
  22. data/lib/symmetric_encryption/writer.rb +104 -117
  23. data/lib/symmetric_encryption.rb +9 -4
  24. data/test/active_record_test.rb +61 -40
  25. data/test/cipher_test.rb +179 -236
  26. data/test/config/symmetric-encryption.yml +140 -82
  27. data/test/header_test.rb +218 -0
  28. data/test/key_test.rb +240 -0
  29. data/test/keystore/environment_test.rb +119 -0
  30. data/test/keystore/file_test.rb +125 -0
  31. data/test/keystore_test.rb +59 -0
  32. data/test/mongoid_test.rb +13 -13
  33. data/test/reader_test.rb +52 -53
  34. data/test/symmetric_encryption_test.rb +50 -135
  35. data/test/test_db.sqlite3 +0 -0
  36. data/test/writer_test.rb +52 -31
  37. metadata +24 -12
  38. data/examples/symmetric-encryption.yml +0 -108
  39. data/lib/rails/generators/symmetric_encryption/config/config_generator.rb +0 -22
  40. data/lib/rails/generators/symmetric_encryption/config/templates/symmetric-encryption.yml +0 -50
  41. data/lib/rails/generators/symmetric_encryption/heroku_config/heroku_config_generator.rb +0 -20
  42. data/lib/rails/generators/symmetric_encryption/heroku_config/templates/symmetric-encryption.yml +0 -78
  43. data/lib/rails/generators/symmetric_encryption/new_keys/new_keys_generator.rb +0 -14
  44. data/lib/symmetric_encryption/key_encryption_key.rb +0 -32
  45. data/lib/symmetric_encryption/railties/symmetric_encryption.rake +0 -84
  46. data/lib/symmetric_encryption/utils/re_encrypt_config_files.rb +0 -82
@@ -1,86 +1,144 @@
1
- #
2
- # Test Config with multiple keys
1
+ # This file was auto generated by symmetric-encryption.
2
+ # Recommend using symmetric-encryption to make changes.
3
+ # For more info, run:
4
+ # symmetric-encryption --help
3
5
  #
4
6
  ---
5
7
  test:
6
- # Test Key encryption key, DO NOT use this key, generate a new one using
7
- # SymmetricEncryption::KeyEncryptionKey.generate
8
- # Or use the rails generator to create a new config file as described in the readme
9
- private_rsa_key: |
10
- -----BEGIN RSA PRIVATE KEY-----
11
- MIIEpAIBAAKCAQEAxIL9H/jYUGpA38v6PowRSRJEo3aNVXULNM/QNRpx2DTf++KH
12
- 6DcuFTFcNSSSxG9n4y7tKi755be8N0uwCCuOzvXqfWmXYjbLwK3Ib2vm0btpHyvA
13
- qxgqeJOOCxKdW/cUFLWn0tACUcEjVCNfWEGaFyvkOUuR7Ub9KfhbW9cZO3BxZMUf
14
- IPGlHl/gWyf484sXygd+S7cpDTRRzo9RjG74DwfE0MFGf9a1fTkxnSgeOJ6asTOy
15
- fp9tEToUlbglKaYGpOGHYQ9TV5ZsyJ9jRUyb4SP5wK2eK6dHTxTcHvT03kD90Hv4
16
- WeKIXv3WOjkwNEyMdpnJJfSDb5oquQvCNi7ZSQIDAQABAoIBAQCbzR7TUoBugU+e
17
- ICLvpC2wOYOh9kRoFLwlyv3QnH7WZFWRZzFJszYeJ1xr5etXQtyjCnmOkGAg+WOI
18
- k8GlOKOpAuA/PpB/leJFiYL4lBwU/PmDdTT0cdx6bMKZlNCeMW8CXGQKiFDOcMqJ
19
- 0uGtH5YD+RChPIEeFsJxnC8SyZ9/t2ra7XnMGiCZvRXIUDSEIIsRx/mOymJ7bL+h
20
- Lbp46IfXf6ZuIzwzoIk0JReV/r+wdmkAVDkrrMkCmVS4/X1wN/Tiik9/yvbsh/CL
21
- ztC55eSIEjATkWxnXfPASZN6oUfQPEveGH3HzNjdncjH/Ho8FaNMIAfFpBhhLPi9
22
- nG5sbH+BAoGBAOdoUyVoAA/QUa3/FkQaa7Ajjehe5MR5k6VtaGtcxrLiBjrNR7x+
23
- nqlZlGvWDMiCz49dgj+G1Qk1bbYrZLRX/Hjeqy5dZOGLMfgf9eKUmS1rDwAzBMcj
24
- M9jnnJEBx8HIlNzaR6wzp3GMd0rrccs660A8URvzkgo9qNbvMLq9vyUtAoGBANll
25
- SY1Iv9uaIz8klTXU9YzYtsfUmgXzw7K8StPdbEbo8F1J3JPJB4D7QHF0ObIaSWuf
26
- suZqLsvWlYGuJeyX2ntlBN82ORfvUdOrdrbDlmPyj4PfFVl0AK3U3Ai374DNrjKR
27
- hF6YFm4TLDaJhUjeV5C43kbE1N2FAMS9LYtPJ44NAoGAFDGHZ/E+aCLerddfwwun
28
- MBS6MnftcLPHTZ1RimTrNfsBXipBw1ItWEvn5s0kCm9X24PmdNK4TnhqHYaF4DL5
29
- ZjbQK1idEA2Mi8GGPIKJJ2x7P6I0HYiV4qy7fe/w1ZlCXE90B7PuPbtrQY9wO7Ll
30
- ipJ45X6I1PnyfOcckn8yafUCgYACtPAlgjJhWZn2v03cTbqA9nHQKyV/zXkyUIXd
31
- /XPLrjrP7ouAi5A8WuSChR/yx8ECRgrEM65Be3qBEtoGCB4AS1G0NcigM6qhKBFi
32
- VS0aMXr3+V8argcUIwJaWW/x+p2go48yXlJpLHPweeXe8mXEt4iM+QZte6p2yKQ4
33
- h9PGQQKBgQCqSydmXBnXGIVTp2sH/2GnpxLYnDBpcJE0tM8bJ42HEQQgRThIChsn
34
- PnGA91G9MVikYapgI0VYBHQOTsz8rTIUzsKwXG+TIaK+W84nxH5y6jUkjqwxZmAz
35
- r1URaMAun2PfAB4g2N/kEZTExgeOGqXjFhvvjdzl97ux2cTyZhaTXg==
36
- -----END RSA PRIVATE KEY-----
37
-
38
8
  ciphers:
39
- # Current / Newest Symmetric Encryption Key
40
- -
41
- key_filename: test/config/test_new.key
42
- iv_filename: test/config/test_new.iv
43
- cipher_name: aes-128-cbc
44
- # Base64 encode encrypted data without newlines
45
- encoding: base64strict
46
- version: 2
47
- always_add_header: true
48
-
49
- # For testing a higher version that is not active yet
50
- -
51
- key: 6BCDEF1234567890ABCDEF1234567890
52
- iv: 6BCDEF1234567890
53
- cipher_name: aes-256-cbc
54
- version: 6
55
- encoding: :base64strict
56
- always_add_header: true
57
-
58
- # Prior Symmetric Encryption Key specified in environment variable
59
- -
60
- # Encryption Key
61
- #
62
- # Example:
63
- # # An environment variable:
64
- # encrypted_key: <%= ENV['KEY'] %>
65
- #
66
- # NOTE: Do not put the encrypted key directly in this file. It is only here
67
- # for testing purposes
68
- encrypted_key: <%= 'xFAsZ73PThktyo76PoNQGYnjCJUAd4+Yaz71bO5FajshXsbjkfZjjvbK9hxzWLr+C7X67hcrTypVHB1Rw0De8lRDqexlc87sTx1wtlz70lOvTBXt9Lv4sbJNLxacuqk545LIJpgK02Dq7FGzACV3jb3Yk+QQngiscETYM6PyiuFpReFB0qFOgCSLeBJsXAdNdqkEZggl8PL+lGDueDGeKUng+Ic/AFWPhJGYkk3xV++AGwUFXdDQeuHllxmV9WlzriHnDwzbfugkfGaRjWn808VXrv9Jgf2yRy++gOYUvRnjZ1ltOgXUEEmBVF2Uvhu+zs6C/D4cb1mkR7911M5naA==' %>
69
- # For testing purposes only, the above key is just:
70
- # key: ABCDEF1234567890
71
- iv: 1234567890ABCDEF
72
- cipher_name: aes-128-cbc
73
- # Base64 encode encrypted data without newlines
74
- encoding: base64strict
75
- version: 1
76
- always_add_header: false
77
-
78
- # First Symmetric Encryption Key
79
- -
80
- key_filename: test/config/test_secondary_1.key
81
- iv_filename: test/config/test_secondary_1.iv
82
- cipher_name: aes-128-cbc
83
- # Base64 encode encrypted data
84
- encoding: base64
85
- version: 0
86
- always_add_header: false
9
+ - key_filename: test/config/test_new.key
10
+ iv_filename: test/config/test_new.iv
11
+ cipher_name: aes-128-cbc
12
+ encoding: base64strict
13
+ version: 2
14
+ always_add_header: true
15
+ key_encrypting_key: |
16
+ -----BEGIN RSA PRIVATE KEY-----
17
+ MIIEpAIBAAKCAQEAxIL9H/jYUGpA38v6PowRSRJEo3aNVXULNM/QNRpx2DTf++KH
18
+ 6DcuFTFcNSSSxG9n4y7tKi755be8N0uwCCuOzvXqfWmXYjbLwK3Ib2vm0btpHyvA
19
+ qxgqeJOOCxKdW/cUFLWn0tACUcEjVCNfWEGaFyvkOUuR7Ub9KfhbW9cZO3BxZMUf
20
+ IPGlHl/gWyf484sXygd+S7cpDTRRzo9RjG74DwfE0MFGf9a1fTkxnSgeOJ6asTOy
21
+ fp9tEToUlbglKaYGpOGHYQ9TV5ZsyJ9jRUyb4SP5wK2eK6dHTxTcHvT03kD90Hv4
22
+ WeKIXv3WOjkwNEyMdpnJJfSDb5oquQvCNi7ZSQIDAQABAoIBAQCbzR7TUoBugU+e
23
+ ICLvpC2wOYOh9kRoFLwlyv3QnH7WZFWRZzFJszYeJ1xr5etXQtyjCnmOkGAg+WOI
24
+ k8GlOKOpAuA/PpB/leJFiYL4lBwU/PmDdTT0cdx6bMKZlNCeMW8CXGQKiFDOcMqJ
25
+ 0uGtH5YD+RChPIEeFsJxnC8SyZ9/t2ra7XnMGiCZvRXIUDSEIIsRx/mOymJ7bL+h
26
+ Lbp46IfXf6ZuIzwzoIk0JReV/r+wdmkAVDkrrMkCmVS4/X1wN/Tiik9/yvbsh/CL
27
+ ztC55eSIEjATkWxnXfPASZN6oUfQPEveGH3HzNjdncjH/Ho8FaNMIAfFpBhhLPi9
28
+ nG5sbH+BAoGBAOdoUyVoAA/QUa3/FkQaa7Ajjehe5MR5k6VtaGtcxrLiBjrNR7x+
29
+ nqlZlGvWDMiCz49dgj+G1Qk1bbYrZLRX/Hjeqy5dZOGLMfgf9eKUmS1rDwAzBMcj
30
+ M9jnnJEBx8HIlNzaR6wzp3GMd0rrccs660A8URvzkgo9qNbvMLq9vyUtAoGBANll
31
+ SY1Iv9uaIz8klTXU9YzYtsfUmgXzw7K8StPdbEbo8F1J3JPJB4D7QHF0ObIaSWuf
32
+ suZqLsvWlYGuJeyX2ntlBN82ORfvUdOrdrbDlmPyj4PfFVl0AK3U3Ai374DNrjKR
33
+ hF6YFm4TLDaJhUjeV5C43kbE1N2FAMS9LYtPJ44NAoGAFDGHZ/E+aCLerddfwwun
34
+ MBS6MnftcLPHTZ1RimTrNfsBXipBw1ItWEvn5s0kCm9X24PmdNK4TnhqHYaF4DL5
35
+ ZjbQK1idEA2Mi8GGPIKJJ2x7P6I0HYiV4qy7fe/w1ZlCXE90B7PuPbtrQY9wO7Ll
36
+ ipJ45X6I1PnyfOcckn8yafUCgYACtPAlgjJhWZn2v03cTbqA9nHQKyV/zXkyUIXd
37
+ /XPLrjrP7ouAi5A8WuSChR/yx8ECRgrEM65Be3qBEtoGCB4AS1G0NcigM6qhKBFi
38
+ VS0aMXr3+V8argcUIwJaWW/x+p2go48yXlJpLHPweeXe8mXEt4iM+QZte6p2yKQ4
39
+ h9PGQQKBgQCqSydmXBnXGIVTp2sH/2GnpxLYnDBpcJE0tM8bJ42HEQQgRThIChsn
40
+ PnGA91G9MVikYapgI0VYBHQOTsz8rTIUzsKwXG+TIaK+W84nxH5y6jUkjqwxZmAz
41
+ r1URaMAun2PfAB4g2N/kEZTExgeOGqXjFhvvjdzl97ux2cTyZhaTXg==
42
+ -----END RSA PRIVATE KEY-----
43
+ - key: 6BCDEF1234567890ABCDEF1234567890
44
+ iv: 6BCDEF1234567890
45
+ cipher_name: aes-256-cbc
46
+ version: 6
47
+ encoding: base64strict
48
+ always_add_header: true
49
+ key_encrypting_key: |
50
+ -----BEGIN RSA PRIVATE KEY-----
51
+ MIIEpAIBAAKCAQEAxIL9H/jYUGpA38v6PowRSRJEo3aNVXULNM/QNRpx2DTf++KH
52
+ 6DcuFTFcNSSSxG9n4y7tKi755be8N0uwCCuOzvXqfWmXYjbLwK3Ib2vm0btpHyvA
53
+ qxgqeJOOCxKdW/cUFLWn0tACUcEjVCNfWEGaFyvkOUuR7Ub9KfhbW9cZO3BxZMUf
54
+ IPGlHl/gWyf484sXygd+S7cpDTRRzo9RjG74DwfE0MFGf9a1fTkxnSgeOJ6asTOy
55
+ fp9tEToUlbglKaYGpOGHYQ9TV5ZsyJ9jRUyb4SP5wK2eK6dHTxTcHvT03kD90Hv4
56
+ WeKIXv3WOjkwNEyMdpnJJfSDb5oquQvCNi7ZSQIDAQABAoIBAQCbzR7TUoBugU+e
57
+ ICLvpC2wOYOh9kRoFLwlyv3QnH7WZFWRZzFJszYeJ1xr5etXQtyjCnmOkGAg+WOI
58
+ k8GlOKOpAuA/PpB/leJFiYL4lBwU/PmDdTT0cdx6bMKZlNCeMW8CXGQKiFDOcMqJ
59
+ 0uGtH5YD+RChPIEeFsJxnC8SyZ9/t2ra7XnMGiCZvRXIUDSEIIsRx/mOymJ7bL+h
60
+ Lbp46IfXf6ZuIzwzoIk0JReV/r+wdmkAVDkrrMkCmVS4/X1wN/Tiik9/yvbsh/CL
61
+ ztC55eSIEjATkWxnXfPASZN6oUfQPEveGH3HzNjdncjH/Ho8FaNMIAfFpBhhLPi9
62
+ nG5sbH+BAoGBAOdoUyVoAA/QUa3/FkQaa7Ajjehe5MR5k6VtaGtcxrLiBjrNR7x+
63
+ nqlZlGvWDMiCz49dgj+G1Qk1bbYrZLRX/Hjeqy5dZOGLMfgf9eKUmS1rDwAzBMcj
64
+ M9jnnJEBx8HIlNzaR6wzp3GMd0rrccs660A8URvzkgo9qNbvMLq9vyUtAoGBANll
65
+ SY1Iv9uaIz8klTXU9YzYtsfUmgXzw7K8StPdbEbo8F1J3JPJB4D7QHF0ObIaSWuf
66
+ suZqLsvWlYGuJeyX2ntlBN82ORfvUdOrdrbDlmPyj4PfFVl0AK3U3Ai374DNrjKR
67
+ hF6YFm4TLDaJhUjeV5C43kbE1N2FAMS9LYtPJ44NAoGAFDGHZ/E+aCLerddfwwun
68
+ MBS6MnftcLPHTZ1RimTrNfsBXipBw1ItWEvn5s0kCm9X24PmdNK4TnhqHYaF4DL5
69
+ ZjbQK1idEA2Mi8GGPIKJJ2x7P6I0HYiV4qy7fe/w1ZlCXE90B7PuPbtrQY9wO7Ll
70
+ ipJ45X6I1PnyfOcckn8yafUCgYACtPAlgjJhWZn2v03cTbqA9nHQKyV/zXkyUIXd
71
+ /XPLrjrP7ouAi5A8WuSChR/yx8ECRgrEM65Be3qBEtoGCB4AS1G0NcigM6qhKBFi
72
+ VS0aMXr3+V8argcUIwJaWW/x+p2go48yXlJpLHPweeXe8mXEt4iM+QZte6p2yKQ4
73
+ h9PGQQKBgQCqSydmXBnXGIVTp2sH/2GnpxLYnDBpcJE0tM8bJ42HEQQgRThIChsn
74
+ PnGA91G9MVikYapgI0VYBHQOTsz8rTIUzsKwXG+TIaK+W84nxH5y6jUkjqwxZmAz
75
+ r1URaMAun2PfAB4g2N/kEZTExgeOGqXjFhvvjdzl97ux2cTyZhaTXg==
76
+ -----END RSA PRIVATE KEY-----
77
+ - encrypted_key: xFAsZ73PThktyo76PoNQGYnjCJUAd4+Yaz71bO5FajshXsbjkfZjjvbK9hxzWLr+C7X67hcrTypVHB1Rw0De8lRDqexlc87sTx1wtlz70lOvTBXt9Lv4sbJNLxacuqk545LIJpgK02Dq7FGzACV3jb3Yk+QQngiscETYM6PyiuFpReFB0qFOgCSLeBJsXAdNdqkEZggl8PL+lGDueDGeKUng+Ic/AFWPhJGYkk3xV++AGwUFXdDQeuHllxmV9WlzriHnDwzbfugkfGaRjWn808VXrv9Jgf2yRy++gOYUvRnjZ1ltOgXUEEmBVF2Uvhu+zs6C/D4cb1mkR7911M5naA==
78
+ iv: 1234567890ABCDEF
79
+ cipher_name: aes-128-cbc
80
+ encoding: base64strict
81
+ version: 1
82
+ always_add_header: false
83
+ key_encrypting_key: |
84
+ -----BEGIN RSA PRIVATE KEY-----
85
+ MIIEpAIBAAKCAQEAxIL9H/jYUGpA38v6PowRSRJEo3aNVXULNM/QNRpx2DTf++KH
86
+ 6DcuFTFcNSSSxG9n4y7tKi755be8N0uwCCuOzvXqfWmXYjbLwK3Ib2vm0btpHyvA
87
+ qxgqeJOOCxKdW/cUFLWn0tACUcEjVCNfWEGaFyvkOUuR7Ub9KfhbW9cZO3BxZMUf
88
+ IPGlHl/gWyf484sXygd+S7cpDTRRzo9RjG74DwfE0MFGf9a1fTkxnSgeOJ6asTOy
89
+ fp9tEToUlbglKaYGpOGHYQ9TV5ZsyJ9jRUyb4SP5wK2eK6dHTxTcHvT03kD90Hv4
90
+ WeKIXv3WOjkwNEyMdpnJJfSDb5oquQvCNi7ZSQIDAQABAoIBAQCbzR7TUoBugU+e
91
+ ICLvpC2wOYOh9kRoFLwlyv3QnH7WZFWRZzFJszYeJ1xr5etXQtyjCnmOkGAg+WOI
92
+ k8GlOKOpAuA/PpB/leJFiYL4lBwU/PmDdTT0cdx6bMKZlNCeMW8CXGQKiFDOcMqJ
93
+ 0uGtH5YD+RChPIEeFsJxnC8SyZ9/t2ra7XnMGiCZvRXIUDSEIIsRx/mOymJ7bL+h
94
+ Lbp46IfXf6ZuIzwzoIk0JReV/r+wdmkAVDkrrMkCmVS4/X1wN/Tiik9/yvbsh/CL
95
+ ztC55eSIEjATkWxnXfPASZN6oUfQPEveGH3HzNjdncjH/Ho8FaNMIAfFpBhhLPi9
96
+ nG5sbH+BAoGBAOdoUyVoAA/QUa3/FkQaa7Ajjehe5MR5k6VtaGtcxrLiBjrNR7x+
97
+ nqlZlGvWDMiCz49dgj+G1Qk1bbYrZLRX/Hjeqy5dZOGLMfgf9eKUmS1rDwAzBMcj
98
+ M9jnnJEBx8HIlNzaR6wzp3GMd0rrccs660A8URvzkgo9qNbvMLq9vyUtAoGBANll
99
+ SY1Iv9uaIz8klTXU9YzYtsfUmgXzw7K8StPdbEbo8F1J3JPJB4D7QHF0ObIaSWuf
100
+ suZqLsvWlYGuJeyX2ntlBN82ORfvUdOrdrbDlmPyj4PfFVl0AK3U3Ai374DNrjKR
101
+ hF6YFm4TLDaJhUjeV5C43kbE1N2FAMS9LYtPJ44NAoGAFDGHZ/E+aCLerddfwwun
102
+ MBS6MnftcLPHTZ1RimTrNfsBXipBw1ItWEvn5s0kCm9X24PmdNK4TnhqHYaF4DL5
103
+ ZjbQK1idEA2Mi8GGPIKJJ2x7P6I0HYiV4qy7fe/w1ZlCXE90B7PuPbtrQY9wO7Ll
104
+ ipJ45X6I1PnyfOcckn8yafUCgYACtPAlgjJhWZn2v03cTbqA9nHQKyV/zXkyUIXd
105
+ /XPLrjrP7ouAi5A8WuSChR/yx8ECRgrEM65Be3qBEtoGCB4AS1G0NcigM6qhKBFi
106
+ VS0aMXr3+V8argcUIwJaWW/x+p2go48yXlJpLHPweeXe8mXEt4iM+QZte6p2yKQ4
107
+ h9PGQQKBgQCqSydmXBnXGIVTp2sH/2GnpxLYnDBpcJE0tM8bJ42HEQQgRThIChsn
108
+ PnGA91G9MVikYapgI0VYBHQOTsz8rTIUzsKwXG+TIaK+W84nxH5y6jUkjqwxZmAz
109
+ r1URaMAun2PfAB4g2N/kEZTExgeOGqXjFhvvjdzl97ux2cTyZhaTXg==
110
+ -----END RSA PRIVATE KEY-----
111
+ - key_filename: test/config/test_secondary_1.key
112
+ iv_filename: test/config/test_secondary_1.iv
113
+ cipher_name: aes-128-cbc
114
+ encoding: base64
115
+ version: 0
116
+ always_add_header: false
117
+ key_encrypting_key: |
118
+ -----BEGIN RSA PRIVATE KEY-----
119
+ MIIEpAIBAAKCAQEAxIL9H/jYUGpA38v6PowRSRJEo3aNVXULNM/QNRpx2DTf++KH
120
+ 6DcuFTFcNSSSxG9n4y7tKi755be8N0uwCCuOzvXqfWmXYjbLwK3Ib2vm0btpHyvA
121
+ qxgqeJOOCxKdW/cUFLWn0tACUcEjVCNfWEGaFyvkOUuR7Ub9KfhbW9cZO3BxZMUf
122
+ IPGlHl/gWyf484sXygd+S7cpDTRRzo9RjG74DwfE0MFGf9a1fTkxnSgeOJ6asTOy
123
+ fp9tEToUlbglKaYGpOGHYQ9TV5ZsyJ9jRUyb4SP5wK2eK6dHTxTcHvT03kD90Hv4
124
+ WeKIXv3WOjkwNEyMdpnJJfSDb5oquQvCNi7ZSQIDAQABAoIBAQCbzR7TUoBugU+e
125
+ ICLvpC2wOYOh9kRoFLwlyv3QnH7WZFWRZzFJszYeJ1xr5etXQtyjCnmOkGAg+WOI
126
+ k8GlOKOpAuA/PpB/leJFiYL4lBwU/PmDdTT0cdx6bMKZlNCeMW8CXGQKiFDOcMqJ
127
+ 0uGtH5YD+RChPIEeFsJxnC8SyZ9/t2ra7XnMGiCZvRXIUDSEIIsRx/mOymJ7bL+h
128
+ Lbp46IfXf6ZuIzwzoIk0JReV/r+wdmkAVDkrrMkCmVS4/X1wN/Tiik9/yvbsh/CL
129
+ ztC55eSIEjATkWxnXfPASZN6oUfQPEveGH3HzNjdncjH/Ho8FaNMIAfFpBhhLPi9
130
+ nG5sbH+BAoGBAOdoUyVoAA/QUa3/FkQaa7Ajjehe5MR5k6VtaGtcxrLiBjrNR7x+
131
+ nqlZlGvWDMiCz49dgj+G1Qk1bbYrZLRX/Hjeqy5dZOGLMfgf9eKUmS1rDwAzBMcj
132
+ M9jnnJEBx8HIlNzaR6wzp3GMd0rrccs660A8URvzkgo9qNbvMLq9vyUtAoGBANll
133
+ SY1Iv9uaIz8klTXU9YzYtsfUmgXzw7K8StPdbEbo8F1J3JPJB4D7QHF0ObIaSWuf
134
+ suZqLsvWlYGuJeyX2ntlBN82ORfvUdOrdrbDlmPyj4PfFVl0AK3U3Ai374DNrjKR
135
+ hF6YFm4TLDaJhUjeV5C43kbE1N2FAMS9LYtPJ44NAoGAFDGHZ/E+aCLerddfwwun
136
+ MBS6MnftcLPHTZ1RimTrNfsBXipBw1ItWEvn5s0kCm9X24PmdNK4TnhqHYaF4DL5
137
+ ZjbQK1idEA2Mi8GGPIKJJ2x7P6I0HYiV4qy7fe/w1ZlCXE90B7PuPbtrQY9wO7Ll
138
+ ipJ45X6I1PnyfOcckn8yafUCgYACtPAlgjJhWZn2v03cTbqA9nHQKyV/zXkyUIXd
139
+ /XPLrjrP7ouAi5A8WuSChR/yx8ECRgrEM65Be3qBEtoGCB4AS1G0NcigM6qhKBFi
140
+ VS0aMXr3+V8argcUIwJaWW/x+p2go48yXlJpLHPweeXe8mXEt4iM+QZte6p2yKQ4
141
+ h9PGQQKBgQCqSydmXBnXGIVTp2sH/2GnpxLYnDBpcJE0tM8bJ42HEQQgRThIChsn
142
+ PnGA91G9MVikYapgI0VYBHQOTsz8rTIUzsKwXG+TIaK+W84nxH5y6jUkjqwxZmAz
143
+ r1URaMAun2PfAB4g2N/kEZTExgeOGqXjFhvvjdzl97ux2cTyZhaTXg==
144
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,218 @@
1
+ require_relative 'test_helper'
2
+
3
+ class CipherTest < Minitest::Test
4
+ describe SymmetricEncryption::Header do
5
+ let :clear_value do
6
+ 'Hello World'
7
+ end
8
+
9
+ let :random_iv do
10
+ false
11
+ end
12
+
13
+ let :compress do
14
+ false
15
+ end
16
+
17
+ let :binary_encrypted_value do
18
+ SymmetricEncryption.cipher.binary_encrypt(clear_value, random_iv: random_iv, compress: compress)
19
+ end
20
+
21
+ let :header do
22
+ header = SymmetricEncryption::Header.new
23
+ header.parse(binary_encrypted_value)
24
+ header
25
+ end
26
+
27
+ describe '#new' do
28
+ it 'sets defaults' do
29
+ header = SymmetricEncryption::Header.new
30
+ assert_equal SymmetricEncryption.cipher.version, header.version
31
+ refute header.compressed?
32
+ refute header.iv
33
+ refute header.key
34
+ refute header.cipher_name
35
+ refute header.auth_tag
36
+ end
37
+ end
38
+
39
+ describe '.present?' do
40
+ it 'has a header' do
41
+ assert SymmetricEncryption::Header.present?(binary_encrypted_value)
42
+ end
43
+
44
+ it 'does not have a header' do
45
+ refute SymmetricEncryption::Header.present?(clear_value)
46
+ end
47
+
48
+ it 'does not have a header when nil' do
49
+ refute SymmetricEncryption::Header.present?(nil)
50
+ end
51
+
52
+ it 'does not have a header when empty string' do
53
+ refute SymmetricEncryption::Header.present?('')
54
+ end
55
+ end
56
+
57
+ describe '#cipher' do
58
+ it 'returns the global cipher used to encrypt the value' do
59
+ assert_equal SymmetricEncryption.cipher, header.cipher
60
+ end
61
+ end
62
+
63
+ describe '#version' do
64
+ it 'returns the global cipher used to encrypt the value' do
65
+ assert_equal SymmetricEncryption.cipher.version, header.version
66
+ end
67
+ end
68
+
69
+ describe '#cipher_name' do
70
+ it 'returns nil when cipher name was not overridden' do
71
+ assert_nil header.cipher_name
72
+ end
73
+ end
74
+
75
+ describe '#key' do
76
+ it 'returns nil when key was not overridden' do
77
+ assert_nil header.key
78
+ end
79
+ end
80
+
81
+ describe '#compress' do
82
+ it 'encrypted string' do
83
+ refute header.compressed?
84
+ end
85
+
86
+ describe 'with compression' do
87
+ let :compress do
88
+ true
89
+ end
90
+
91
+ it 'encrypted string' do
92
+ assert header.compressed?
93
+ end
94
+ end
95
+
96
+ end
97
+
98
+ describe '#to_s' do
99
+ end
100
+
101
+ describe '#parse' do
102
+ it 'nil string' do
103
+ header = SymmetricEncryption::Header.new
104
+ assert_equal 0, header.parse(nil)
105
+ end
106
+
107
+ it 'empty string' do
108
+ header = SymmetricEncryption::Header.new
109
+ assert_equal 0, header.parse('')
110
+ end
111
+
112
+ it 'unencrypted string' do
113
+ header = SymmetricEncryption::Header.new
114
+ assert_equal 0, header.parse('hello there')
115
+ end
116
+
117
+ it 'encrypted string' do
118
+ header = SymmetricEncryption::Header.new
119
+ assert_equal 6, header.parse(binary_encrypted_value)
120
+ end
121
+
122
+ describe 'with random_iv' do
123
+ let :random_iv do
124
+ true
125
+ end
126
+
127
+ it 'encrypted string' do
128
+ header = SymmetricEncryption::Header.new
129
+ assert_equal 24, header.parse(binary_encrypted_value)
130
+ end
131
+
132
+ describe 'with compression' do
133
+ let :compress do
134
+ true
135
+ end
136
+
137
+ it 'encrypted string' do
138
+ assert header.compressed?
139
+ end
140
+ end
141
+
142
+ end
143
+ end
144
+
145
+ describe '#parse!' do
146
+ it 'nil string' do
147
+ header = SymmetricEncryption::Header.new
148
+ assert_nil header.parse!(nil)
149
+ end
150
+
151
+ it 'empty string' do
152
+ header = SymmetricEncryption::Header.new
153
+ assert_nil header.parse!('')
154
+ end
155
+
156
+ it 'unencrypted string' do
157
+ header = SymmetricEncryption::Header.new
158
+ assert_nil header.parse!('hello there')
159
+ end
160
+
161
+ it 'encrypted string' do
162
+ header = SymmetricEncryption::Header.new
163
+ remainder = header.parse!(binary_encrypted_value.dup)
164
+ assert_equal SymmetricEncryption.cipher.version, header.version
165
+ refute header.compressed?
166
+ refute header.iv
167
+ refute header.key
168
+ refute header.cipher_name
169
+ refute header.auth_tag
170
+
171
+ # Decrypt with this new header
172
+ encrypted_without_header = SymmetricEncryption.cipher.binary_encrypt(clear_value, header: false)
173
+ assert_equal encrypted_without_header, remainder
174
+
175
+ assert_equal clear_value, SymmetricEncryption.cipher.binary_decrypt(remainder, header: header)
176
+ end
177
+
178
+ describe 'with random_iv' do
179
+ let :random_iv do
180
+ true
181
+ end
182
+
183
+ it 'encrypted string' do
184
+ header = SymmetricEncryption::Header.new
185
+ assert remainder = header.parse!(binary_encrypted_value)
186
+ assert_equal SymmetricEncryption.cipher.version, header.version
187
+ refute header.compressed?
188
+ assert header.iv
189
+ refute header.key
190
+ refute header.cipher_name
191
+ refute header.auth_tag
192
+ assert_equal clear_value, SymmetricEncryption.cipher.binary_decrypt(remainder, header: header)
193
+ end
194
+ end
195
+ end
196
+
197
+ describe '#iv' do
198
+ it 'encrypted string' do
199
+ header = SymmetricEncryption::Header.new
200
+ header.parse(binary_encrypted_value)
201
+ assert_nil header.iv
202
+ end
203
+
204
+ describe 'with random_iv' do
205
+ let :random_iv do
206
+ true
207
+ end
208
+
209
+ it 'encrypted string' do
210
+ assert header.iv
211
+ refute_equal SymmetricEncryption.cipher.iv, header.iv
212
+ end
213
+ end
214
+ end
215
+
216
+ end
217
+ end
218
+
data/test/key_test.rb ADDED
@@ -0,0 +1,240 @@
1
+ require_relative 'test_helper'
2
+
3
+ class KeyTest < Minitest::Test
4
+ describe SymmetricEncryption::Key do
5
+ before do
6
+ Dir.mkdir('tmp') unless Dir.exist?('tmp')
7
+ end
8
+
9
+ after do
10
+ # Cleanup generated encryption key files.
11
+ `rm tmp/dek_tester* 2> /dev/null`
12
+ end
13
+
14
+ let :random_key do
15
+ SymmetricEncryption::Key.new
16
+ end
17
+
18
+ let :stored_key do
19
+ '1234567890ABCDEF1234567890ABCDEF'
20
+ end
21
+
22
+ let :stored_iv do
23
+ 'ABCDEF1234567890'
24
+ end
25
+
26
+ let :key do
27
+ SymmetricEncryption::Key.new(key: stored_key, iv: stored_iv)
28
+ end
29
+
30
+ let :stored_key2 do
31
+ 'ABCDEF1234567890ABCDEF1234567890'
32
+ end
33
+
34
+ let :stored_iv2 do
35
+ '1234567890ABCDEF'
36
+ end
37
+
38
+ let :key2 do
39
+ SymmetricEncryption::Key.new(key: stored_key2, iv: stored_iv2)
40
+ end
41
+
42
+ let :stored_key3 do
43
+ 'ABCDEF0123456789ABCDEF0123456789'
44
+ end
45
+
46
+ let :stored_iv3 do
47
+ '0123456789ABCDEF'
48
+ end
49
+
50
+ let :key3 do
51
+ SymmetricEncryption::Key.new(key: stored_key3, iv: stored_iv3)
52
+ end
53
+
54
+ let :ssn do
55
+ '987654321'
56
+ end
57
+
58
+ let :encrypted_ssn do
59
+ essn = "cR\x9C,\x91\xA4{\b`\x9Fls\xA4\f\xD1\xBF"
60
+ essn.force_encoding('binary')
61
+ essn
62
+ end
63
+
64
+ describe 'encrypt' do
65
+ it 'empty string' do
66
+ assert_equal '', key.encrypt('')
67
+ end
68
+
69
+ it 'nil' do
70
+ assert_nil key.encrypt(nil)
71
+ end
72
+
73
+ it 'string' do
74
+ assert_equal encrypted_ssn, key.encrypt(ssn)
75
+ end
76
+ end
77
+
78
+ describe 'decrypt' do
79
+ it 'empty string' do
80
+ assert_equal '', key.decrypt('')
81
+ end
82
+
83
+ it 'nil' do
84
+ assert_nil key.decrypt(nil)
85
+ end
86
+
87
+ it 'string' do
88
+ assert_equal ssn, key.decrypt(encrypted_ssn)
89
+ end
90
+ end
91
+
92
+ describe 'key' do
93
+ it 'creates random key by default' do
94
+ assert key = random_key.key
95
+ refute_equal key, SymmetricEncryption::Key.new.key
96
+ end
97
+
98
+ it 'stores' do
99
+ assert_equal stored_key, key.key
100
+ end
101
+ end
102
+
103
+ describe 'iv' do
104
+ it 'creates random iv by default' do
105
+ assert iv = random_key.iv
106
+ refute_equal iv, SymmetricEncryption::Key.new.iv
107
+ end
108
+
109
+ it 'stores' do
110
+ assert_equal stored_iv, key.iv
111
+ end
112
+ end
113
+
114
+ describe '.from_config' do
115
+ let :config do
116
+ {key: stored_key, iv: stored_iv}
117
+ end
118
+
119
+ let :config_key do
120
+ SymmetricEncryption::Key.from_config(config)
121
+ end
122
+
123
+ let :dek_file_name do
124
+ 'tmp/dek_tester_dek.encrypted_key'
125
+ end
126
+
127
+ describe 'key' do
128
+ it 'key' do
129
+ assert_equal stored_key, config_key.key
130
+ end
131
+
132
+ it 'iv' do
133
+ assert_equal stored_iv, config_key.iv
134
+ end
135
+
136
+ it 'cipher_name' do
137
+ assert_equal 'aes-256-cbc', config_key.cipher_name
138
+ end
139
+ end
140
+
141
+ describe 'encrypted_key' do
142
+ let :config do
143
+ {encrypted_key: key2.encrypt(stored_key), iv: stored_iv, key_encrypting_key: {key: stored_key2, iv: stored_iv2}}
144
+ end
145
+
146
+ it 'key' do
147
+ assert_equal stored_key, config_key.key
148
+ end
149
+
150
+ it 'iv' do
151
+ assert_equal stored_iv, config_key.iv
152
+ end
153
+
154
+ it 'cipher_name' do
155
+ assert_equal 'aes-256-cbc', config_key.cipher_name
156
+ end
157
+ end
158
+
159
+ describe 'key_filename' do
160
+ let :config do
161
+ File.open(dek_file_name, 'wb') { |f| f.write(key2.encrypt(stored_key)) }
162
+ {key_filename: dek_file_name, iv: stored_iv, key_encrypting_key: {key: stored_key2, iv: stored_iv2}}
163
+ end
164
+
165
+ it 'key' do
166
+ assert_equal stored_key, config_key.key
167
+ end
168
+
169
+ it 'iv' do
170
+ assert_equal stored_iv, config_key.iv
171
+ end
172
+
173
+ it 'cipher_name' do
174
+ assert_equal 'aes-256-cbc', config_key.cipher_name
175
+ end
176
+ end
177
+
178
+ describe 'key_env_var' do
179
+ let :env_var do
180
+ 'TEST_KEY'
181
+ end
182
+
183
+ let :config do
184
+ ENV[env_var] = ::Base64.encode64(key2.encrypt(stored_key))
185
+ {key_env_var: env_var, iv: stored_iv, key_encrypting_key: {key: stored_key2, iv: stored_iv2}}
186
+ end
187
+
188
+ it 'key' do
189
+ assert_equal stored_key, config_key.key
190
+ end
191
+
192
+ it 'iv' do
193
+ assert_equal stored_iv, config_key.iv
194
+ end
195
+
196
+ it 'cipher_name' do
197
+ assert_equal 'aes-256-cbc', config_key.cipher_name
198
+ end
199
+ end
200
+
201
+ describe 'file store with kekek' do
202
+ let :kekek_file_name do
203
+ 'tmp/tester_kekek.key'
204
+ end
205
+
206
+ let :config do
207
+ File.open(dek_file_name, 'wb') { |f| f.write(key2.encrypt(stored_key)) }
208
+ encrypted_key = key3.encrypt(stored_key2)
209
+ File.open(kekek_file_name, 'wb') { |f| f.write(stored_key3) }
210
+ {
211
+ key_filename: dek_file_name,
212
+ iv: stored_iv,
213
+ key_encrypting_key: {
214
+ encrypted_key: encrypted_key,
215
+ iv: stored_iv2,
216
+ key_encrypting_key: {
217
+ key_filename: kekek_file_name,
218
+ iv: stored_iv3
219
+ }
220
+ }
221
+ }
222
+ end
223
+
224
+ it 'key' do
225
+ assert_equal stored_key, config_key.key
226
+ end
227
+
228
+ it 'iv' do
229
+ assert_equal stored_iv, config_key.iv
230
+ end
231
+
232
+ it 'cipher_name' do
233
+ assert_equal 'aes-256-cbc', config_key.cipher_name
234
+ end
235
+ end
236
+
237
+ end
238
+
239
+ end
240
+ end