symmetric-encryption 3.9.1 → 4.0.0.beta3

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 +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