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.
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 +124 -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 +140 -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 +231 -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 +26 -14
  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,231 @@
1
+ require_relative 'test_helper'
2
+
3
+ class KeyTest < Minitest::Test
4
+ describe SymmetricEncryption::Key do
5
+ let :random_key do
6
+ SymmetricEncryption::Key.new
7
+ end
8
+
9
+ let :stored_key do
10
+ '1234567890ABCDEF1234567890ABCDEF'
11
+ end
12
+
13
+ let :stored_iv do
14
+ 'ABCDEF1234567890'
15
+ end
16
+
17
+ let :key do
18
+ SymmetricEncryption::Key.new(key: stored_key, iv: stored_iv)
19
+ end
20
+
21
+ let :stored_key2 do
22
+ 'ABCDEF1234567890ABCDEF1234567890'
23
+ end
24
+
25
+ let :stored_iv2 do
26
+ '1234567890ABCDEF'
27
+ end
28
+
29
+ let :key2 do
30
+ SymmetricEncryption::Key.new(key: stored_key2, iv: stored_iv2)
31
+ end
32
+
33
+ let :stored_key3 do
34
+ 'ABCDEF0123456789ABCDEF0123456789'
35
+ end
36
+
37
+ let :stored_iv3 do
38
+ '0123456789ABCDEF'
39
+ end
40
+
41
+ let :key3 do
42
+ SymmetricEncryption::Key.new(key: stored_key3, iv: stored_iv3)
43
+ end
44
+
45
+ let :ssn do
46
+ '987654321'
47
+ end
48
+
49
+ let :encrypted_ssn do
50
+ essn = "cR\x9C,\x91\xA4{\b`\x9Fls\xA4\f\xD1\xBF"
51
+ essn.force_encoding('binary')
52
+ essn
53
+ end
54
+
55
+ describe 'encrypt' do
56
+ it 'empty string' do
57
+ assert_equal '', key.encrypt('')
58
+ end
59
+
60
+ it 'nil' do
61
+ assert_nil key.encrypt(nil)
62
+ end
63
+
64
+ it 'string' do
65
+ assert_equal encrypted_ssn, key.encrypt(ssn)
66
+ end
67
+ end
68
+
69
+ describe 'decrypt' do
70
+ it 'empty string' do
71
+ assert_equal '', key.decrypt('')
72
+ end
73
+
74
+ it 'nil' do
75
+ assert_nil key.decrypt(nil)
76
+ end
77
+
78
+ it 'string' do
79
+ assert_equal ssn, key.decrypt(encrypted_ssn)
80
+ end
81
+ end
82
+
83
+ describe 'key' do
84
+ it 'creates random key by default' do
85
+ assert key = random_key.key
86
+ refute_equal key, SymmetricEncryption::Key.new.key
87
+ end
88
+
89
+ it 'stores' do
90
+ assert_equal stored_key, key.key
91
+ end
92
+ end
93
+
94
+ describe 'iv' do
95
+ it 'creates random iv by default' do
96
+ assert iv = random_key.iv
97
+ refute_equal iv, SymmetricEncryption::Key.new.iv
98
+ end
99
+
100
+ it 'stores' do
101
+ assert_equal stored_iv, key.iv
102
+ end
103
+ end
104
+
105
+ describe '.from_config' do
106
+ let :config do
107
+ {key: stored_key, iv: stored_iv}
108
+ end
109
+
110
+ let :config_key do
111
+ SymmetricEncryption::Key.from_config(config)
112
+ end
113
+
114
+ let :dek_file_name do
115
+ 'tmp/tester_dek.encrypted_key'
116
+ end
117
+
118
+ describe 'key' do
119
+ it 'key' do
120
+ assert_equal stored_key, config_key.key
121
+ end
122
+
123
+ it 'iv' do
124
+ assert_equal stored_iv, config_key.iv
125
+ end
126
+
127
+ it 'cipher_name' do
128
+ assert_equal 'aes-256-cbc', config_key.cipher_name
129
+ end
130
+ end
131
+
132
+ describe 'encrypted_key' do
133
+ let :config do
134
+ {encrypted_key: key2.encrypt(stored_key), iv: stored_iv, key_encrypting_key: {key: stored_key2, iv: stored_iv2}}
135
+ end
136
+
137
+ it 'key' do
138
+ assert_equal stored_key, config_key.key
139
+ end
140
+
141
+ it 'iv' do
142
+ assert_equal stored_iv, config_key.iv
143
+ end
144
+
145
+ it 'cipher_name' do
146
+ assert_equal 'aes-256-cbc', config_key.cipher_name
147
+ end
148
+ end
149
+
150
+ describe 'key_filename' do
151
+ let :config do
152
+ File.open(dek_file_name, 'wb') { |f| f.write(key2.encrypt(stored_key)) }
153
+ {key_filename: dek_file_name, iv: stored_iv, key_encrypting_key: {key: stored_key2, iv: stored_iv2}}
154
+ end
155
+
156
+ it 'key' do
157
+ assert_equal stored_key, config_key.key
158
+ end
159
+
160
+ it 'iv' do
161
+ assert_equal stored_iv, config_key.iv
162
+ end
163
+
164
+ it 'cipher_name' do
165
+ assert_equal 'aes-256-cbc', config_key.cipher_name
166
+ end
167
+ end
168
+
169
+ describe 'key_env_var' do
170
+ let :env_var do
171
+ 'TEST_KEY'
172
+ end
173
+
174
+ let :config do
175
+ ENV[env_var] = ::Base64.encode64(key2.encrypt(stored_key))
176
+ {key_env_var: env_var, iv: stored_iv, key_encrypting_key: {key: stored_key2, iv: stored_iv2}}
177
+ end
178
+
179
+ it 'key' do
180
+ assert_equal stored_key, config_key.key
181
+ end
182
+
183
+ it 'iv' do
184
+ assert_equal stored_iv, config_key.iv
185
+ end
186
+
187
+ it 'cipher_name' do
188
+ assert_equal 'aes-256-cbc', config_key.cipher_name
189
+ end
190
+ end
191
+
192
+ describe 'file store with kekek' do
193
+ let :kekek_file_name do
194
+ 'tmp/tester_kekek.key'
195
+ end
196
+
197
+ let :config do
198
+ File.open(dek_file_name, 'wb') { |f| f.write(key2.encrypt(stored_key)) }
199
+ encrypted_key = key3.encrypt(stored_key2)
200
+ File.open(kekek_file_name, 'wb') { |f| f.write(stored_key3) }
201
+ {
202
+ key_filename: dek_file_name,
203
+ iv: stored_iv,
204
+ key_encrypting_key: {
205
+ encrypted_key: encrypted_key,
206
+ iv: stored_iv2,
207
+ key_encrypting_key: {
208
+ key_filename: kekek_file_name,
209
+ iv: stored_iv3
210
+ }
211
+ }
212
+ }
213
+ end
214
+
215
+ it 'key' do
216
+ assert_equal stored_key, config_key.key
217
+ end
218
+
219
+ it 'iv' do
220
+ assert_equal stored_iv, config_key.iv
221
+ end
222
+
223
+ it 'cipher_name' do
224
+ assert_equal 'aes-256-cbc', config_key.cipher_name
225
+ end
226
+ end
227
+
228
+ end
229
+
230
+ end
231
+ end