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.
- checksums.yaml +4 -4
- data/README.md +72 -0
- data/bin/symmetric-encryption +5 -0
- data/lib/symmetric_encryption/cipher.rb +162 -419
- data/lib/symmetric_encryption/cli.rb +343 -0
- data/lib/symmetric_encryption/coerce.rb +5 -20
- data/lib/symmetric_encryption/config.rb +128 -50
- data/lib/symmetric_encryption/extensions/mongo_mapper/plugins/encrypted_key.rb +2 -2
- data/lib/symmetric_encryption/generator.rb +3 -2
- data/lib/symmetric_encryption/header.rb +260 -0
- data/lib/symmetric_encryption/key.rb +106 -0
- data/lib/symmetric_encryption/keystore/environment.rb +90 -0
- data/lib/symmetric_encryption/keystore/file.rb +102 -0
- data/lib/symmetric_encryption/keystore/memory.rb +53 -0
- data/lib/symmetric_encryption/keystore.rb +124 -0
- data/lib/symmetric_encryption/railtie.rb +5 -7
- data/lib/symmetric_encryption/reader.rb +74 -55
- data/lib/symmetric_encryption/rsa_key.rb +24 -0
- data/lib/symmetric_encryption/symmetric_encryption.rb +64 -102
- data/lib/symmetric_encryption/utils/re_encrypt_files.rb +140 -0
- data/lib/symmetric_encryption/version.rb +1 -1
- data/lib/symmetric_encryption/writer.rb +104 -117
- data/lib/symmetric_encryption.rb +9 -4
- data/test/active_record_test.rb +61 -40
- data/test/cipher_test.rb +179 -236
- data/test/config/symmetric-encryption.yml +140 -82
- data/test/header_test.rb +218 -0
- data/test/key_test.rb +231 -0
- data/test/keystore/environment_test.rb +119 -0
- data/test/keystore/file_test.rb +125 -0
- data/test/keystore_test.rb +59 -0
- data/test/mongoid_test.rb +13 -13
- data/test/reader_test.rb +52 -53
- data/test/symmetric_encryption_test.rb +50 -135
- data/test/test_db.sqlite3 +0 -0
- data/test/writer_test.rb +52 -31
- metadata +26 -14
- data/examples/symmetric-encryption.yml +0 -108
- data/lib/rails/generators/symmetric_encryption/config/config_generator.rb +0 -22
- data/lib/rails/generators/symmetric_encryption/config/templates/symmetric-encryption.yml +0 -50
- data/lib/rails/generators/symmetric_encryption/heroku_config/heroku_config_generator.rb +0 -20
- data/lib/rails/generators/symmetric_encryption/heroku_config/templates/symmetric-encryption.yml +0 -78
- data/lib/rails/generators/symmetric_encryption/new_keys/new_keys_generator.rb +0 -14
- data/lib/symmetric_encryption/key_encryption_key.rb +0 -32
- data/lib/symmetric_encryption/railties/symmetric_encryption.rake +0 -84
- data/lib/symmetric_encryption/utils/re_encrypt_config_files.rb +0 -82
@@ -1,86 +1,144 @@
|
|
1
|
-
#
|
2
|
-
#
|
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
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
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-----
|
data/test/header_test.rb
ADDED
@@ -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
|