slosilo 0.0.0

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 +7 -0
  2. data/.github/CODEOWNERS +10 -0
  3. data/.gitignore +21 -0
  4. data/.gitleaks.toml +221 -0
  5. data/.kateproject +4 -0
  6. data/CHANGELOG.md +50 -0
  7. data/CONTRIBUTING.md +16 -0
  8. data/Gemfile +4 -0
  9. data/Jenkinsfile +132 -0
  10. data/LICENSE +22 -0
  11. data/README.md +152 -0
  12. data/Rakefile +17 -0
  13. data/SECURITY.md +42 -0
  14. data/dev/Dockerfile.dev +7 -0
  15. data/dev/docker-compose.yml +8 -0
  16. data/lib/slosilo/adapters/abstract_adapter.rb +23 -0
  17. data/lib/slosilo/adapters/file_adapter.rb +42 -0
  18. data/lib/slosilo/adapters/memory_adapter.rb +31 -0
  19. data/lib/slosilo/adapters/mock_adapter.rb +21 -0
  20. data/lib/slosilo/adapters/sequel_adapter/migration.rb +52 -0
  21. data/lib/slosilo/adapters/sequel_adapter.rb +96 -0
  22. data/lib/slosilo/attr_encrypted.rb +85 -0
  23. data/lib/slosilo/errors.rb +15 -0
  24. data/lib/slosilo/jwt.rb +122 -0
  25. data/lib/slosilo/key.rb +218 -0
  26. data/lib/slosilo/keystore.rb +89 -0
  27. data/lib/slosilo/random.rb +11 -0
  28. data/lib/slosilo/symmetric.rb +63 -0
  29. data/lib/slosilo/version.rb +22 -0
  30. data/lib/slosilo.rb +13 -0
  31. data/lib/tasks/slosilo.rake +32 -0
  32. data/publish.sh +5 -0
  33. data/secrets.yml +1 -0
  34. data/slosilo.gemspec +38 -0
  35. data/spec/encrypted_attributes_spec.rb +114 -0
  36. data/spec/file_adapter_spec.rb +81 -0
  37. data/spec/jwt_spec.rb +102 -0
  38. data/spec/key_spec.rb +258 -0
  39. data/spec/keystore_spec.rb +26 -0
  40. data/spec/random_spec.rb +19 -0
  41. data/spec/sequel_adapter_spec.rb +171 -0
  42. data/spec/slosilo_spec.rb +124 -0
  43. data/spec/spec_helper.rb +84 -0
  44. data/spec/symmetric_spec.rb +94 -0
  45. data/test.sh +8 -0
  46. metadata +238 -0
@@ -0,0 +1,124 @@
1
+ require 'spec_helper'
2
+
3
+ describe Slosilo do
4
+ include_context "with mock adapter"
5
+ include_context "with example key"
6
+ before { Slosilo['test'] = key }
7
+
8
+ describe '[]' do
9
+ it "returns a Slosilo::Key" do
10
+ expect(Slosilo[:test]).to be_instance_of Slosilo::Key
11
+ end
12
+
13
+ it "allows looking up by fingerprint" do
14
+ expect(Slosilo[fingerprint: key_fingerprint]).to eq(key)
15
+ end
16
+
17
+ context "when the requested key does not exist" do
18
+ it "returns nil instead of creating a new key" do
19
+ expect(Slosilo[:aether]).not_to be
20
+ end
21
+ end
22
+ end
23
+
24
+ describe '.sign' do
25
+ let(:own_key) { double "own key" }
26
+ before { allow(Slosilo).to receive(:[]).with(:own).and_return own_key }
27
+ let (:argument) { double "thing to sign" }
28
+ it "fetches the own key and signs using that" do
29
+ expect(own_key).to receive(:sign).with(argument)
30
+ Slosilo.sign argument
31
+ end
32
+ end
33
+
34
+ describe '.token_valid?' do
35
+ before { allow(adapter['test']).to receive_messages token_valid?: false }
36
+ let(:key2) { double "key 2", token_valid?: false }
37
+ let(:key3) { double "key 3", token_valid?: false }
38
+ before do
39
+ adapter[:key2] = key2
40
+ adapter[:key3] = key3
41
+ end
42
+
43
+ let(:token) { double "token" }
44
+ subject { Slosilo.token_valid? token }
45
+
46
+ context "when no key validates the token" do
47
+ before { allow(Slosilo::Key).to receive_messages new: (double "key", token_valid?: false) }
48
+ it { is_expected.to be_falsey }
49
+ end
50
+
51
+ context "when a key validates the token" do
52
+ let(:valid_key) { double token_valid?: true }
53
+ let(:invalid_key) { double token_valid?: true }
54
+ before do
55
+ allow(Slosilo::Key).to receive_messages new: invalid_key
56
+ adapter[:key2] = valid_key
57
+ end
58
+
59
+ it { is_expected.to be_truthy }
60
+ end
61
+ end
62
+
63
+ describe '.token_signer' do
64
+
65
+ context "when token matches a key" do
66
+ let(:token) {{ 'data' => 'foo', 'key' => key.fingerprint, 'signature' => 'XXX' }}
67
+
68
+ context "and the signature is valid" do
69
+ before { allow(key).to receive(:token_valid?).with(token).and_return true }
70
+
71
+ it "returns the key id" do
72
+ expect(subject.token_signer(token)).to eq('test')
73
+ end
74
+ end
75
+
76
+ context "and the signature is invalid" do
77
+ before { allow(key).to receive(:token_valid?).with(token).and_return false }
78
+
79
+ it "returns nil" do
80
+ expect(subject.token_signer(token)).not_to be
81
+ end
82
+ end
83
+ end
84
+
85
+ context "when token doesn't match a key" do
86
+ let(:token) {{ 'data' => 'foo', 'key' => "footprint", 'signature' => 'XXX' }}
87
+ it "returns nil" do
88
+ expect(subject.token_signer(token)).not_to be
89
+ end
90
+ end
91
+
92
+ context "with JWT token" do
93
+ before do
94
+ expect(key).to receive(:validate_jwt) do |jwt|
95
+ expect(jwt.header).to eq 'kid' => key.fingerprint
96
+ expect(jwt.claims).to eq({})
97
+ expect(jwt.signature).to eq 'sig'
98
+ end
99
+ end
100
+
101
+ it "accepts pre-parsed JSON serialization" do
102
+ expect(Slosilo.token_signer(
103
+ 'protected' => 'eyJraWQiOiIxMDdiZGI4NTAxYzQxOWZhZDJmZGIyMGI0NjdkNGQwYTYyYTE2YTk4YzM1ZjJkYTBlYjNiMWZmOTI5Nzk1YWQ5In0=',
104
+ 'payload' => 'e30=',
105
+ 'signature' => 'c2ln'
106
+ )).to eq 'test'
107
+ end
108
+
109
+ it "accepts pre-parsed JWT token" do
110
+ expect(Slosilo.token_signer(Slosilo::JWT(
111
+ 'protected' => 'eyJraWQiOiIxMDdiZGI4NTAxYzQxOWZhZDJmZGIyMGI0NjdkNGQwYTYyYTE2YTk4YzM1ZjJkYTBlYjNiMWZmOTI5Nzk1YWQ5In0=',
112
+ 'payload' => 'e30=',
113
+ 'signature' => 'c2ln'
114
+ ))).to eq 'test'
115
+ end
116
+
117
+ it "accepts compact serialization" do
118
+ expect(Slosilo.token_signer(
119
+ 'eyJraWQiOiIxMDdiZGI4NTAxYzQxOWZhZDJmZGIyMGI0NjdkNGQwYTYyYTE2YTk4YzM1ZjJkYTBlYjNiMWZmOTI5Nzk1YWQ5In0=.e30=.c2ln'
120
+ )).to eq 'test'
121
+ end
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,84 @@
1
+ require "simplecov"
2
+ require "simplecov-cobertura"
3
+
4
+ SimpleCov.formatter = SimpleCov::Formatter::CoberturaFormatter
5
+ SimpleCov.start
6
+
7
+ require 'slosilo'
8
+
9
+ shared_context "with mock adapter" do
10
+ require 'slosilo/adapters/mock_adapter'
11
+
12
+ let(:adapter) { Slosilo::Adapters::MockAdapter.new }
13
+ before { Slosilo::adapter = adapter }
14
+ end
15
+
16
+ shared_context "with example key" do
17
+ let(:rsa) { OpenSSL::PKey::RSA.new """
18
+ -----BEGIN RSA PRIVATE KEY-----
19
+ MIIEpQIBAAKCAQEAtTG/SQhW9QawP+GL6EZ5Al9gscCr7HiRO7MuQqFkaXIJD6+3
20
+ prdHRrb0qqjNlGFgDBGAuswZ2AYqhBt7eekup+/vIpI5n04b0w+is3WwZAFco4uP
21
+ ojDeM0aY65Ar3Zgra2vWUJXRwBumroZjVBVoLJSgVfwIhwU6ORbS2oJflbtqxpuS
22
+ zkPDqS6RwEzI/DHuHTOI26fe+vfuDqGOuSR6iVI16lfvTbWwccpDwU0W9vSlyjjD
23
+ LIw0MnoKL3DHyzO66s+oNNRleMvjghQtJk/xg1kRuHReJ5/ygt2zyzdKSLeqU+T+
24
+ TCWw/F65jrFElftexiS+g+lZC467VLCaMe1fJQIDAQABAoIBAQCiNWzXRr4CEQDL
25
+ z3Deeehu9U+tEZ1Xzv/FgD0TrUQlGc9+2YIBn+YRKkySUxfnk9zWMP0bPQiN2cdK
26
+ CQhbNSNteGCOhHVNZjGGm2K+YceNX6K9Tn1BZ5okMTlI+QIsGMQWIK316omh/58S
27
+ coCNj7R45H09PKmtpkJfRU1yDHDhqypjPDpb9/7U5mt3g2BdXYi+1hilfonHoDrC
28
+ yy3eRdf7Tlij9O3UeM+Z7pZrKATcvpDkYbNWizDITvKMYy6Ss+ajM5v7lt6QN5LP
29
+ MHjwX8Ilrxkxl0jeopr4f94tR7rNDZbLC457j8gns7cUeODtF7pPZqlrlk4KOq8Q
30
+ DvEMt2ZpAoGBAOLNUiO1SwRo75Y8ukuMVQev8O8WuzEEGINoM1lQiYlbUw3HmVp3
31
+ iUvv58ANmKSzTXpOEZ1L8pZHSp435FrzD2WZmCAoXhNdfAXtmZA7Y46iE6BF4qrr
32
+ UegtLPhVgwpO74Y+4w2YwfDknzCOhWE4sxCbukuSvxz2pz1Vm31eFB6jAoGBAMyF
33
+ VxfYq9WhmLNsHqR+qfhb1EC5FfpSq23z/o4ryiKqCaWHimVtOO7DL7x2SK3mVNNZ
34
+ X8b4+vnJpAQ3nOxeg8fpmBaLAWYRna2AN/CYVIMKYusawhsGAlZZTu2mtJKLiOPS
35
+ 8/z5dK55xJWlG5JalUB+n/4vd3WmXiT/XJj3qU+XAoGBALyHzLXeKCPcTvzmMj5G
36
+ wxAG0xMMJEMUkoP5hGXEKvBBOAMGXpXzM/Ap1s2w/6g5XDhE2SOWVGtTi9WFxI9N
37
+ 6Qid6vUgWUNjvIr4/WQF2jZgyEu8jDVkM8v6cZ1lB+7zuuwvLnLI/r6ObT3h20H7
38
+ 7e3qZawYqkEbT94OYZiPMc5dAoGAHmIQtjIyFOKU1NLTGozWo1bBCXx1j2KIpSUC
39
+ RAytUsj/9d9U6Ax50L6ecNkBoxP8tgko+V4zqrgR7a51WYgQ+7nwJikwZAFp80SB
40
+ CvUWWQFKALNQ8sLJxhouZ4/Ec6DXDUFhjcthUio00iZdGjjqw1IMYq6aiJfWlJh7
41
+ IR5pwLECgYEAyjlguks/3cjrHRF+yjonxT4tLuBI/n3TAQUPqmtkJtcwZSAJas/1
42
+ c/twlAJ7F6n3ZroF3lgPxMJRRHZl4Z4dJsDatIxVShf3nSGg9Mi5C25obxahbv5/
43
+ Dg1ikwi8GUF4HPZe9DyhXgDhg19wM/qcpjX8bSypsUWHWP+FanhjdWU=
44
+ -----END RSA PRIVATE KEY-----
45
+ """ }
46
+ let (:key) { Slosilo::Key.new rsa.to_der }
47
+ let (:key_fingerprint) { "107bdb8501c419fad2fdb20b467d4d0a62a16a98c35f2da0eb3b1ff929795ad9" }
48
+
49
+ let (:another_rsa) do
50
+ OpenSSL::PKey::RSA.new """
51
+ -----BEGIN RSA PRIVATE KEY-----
52
+ MIIEowIBAAKCAQEAryP0uGEIcDFmHDj1MjxbW+eWMeQ1k2FTKI7qx2M3MP9FR3Bz
53
+ KjFzGKnAA6QV46K/QtEt+wpWedB/bcikPXY4/vh/b2TEi8Ybw2ztT1oW9le8Djsz
54
+ 3sQv5QrHsOXzSIARw4NZYxunxMFKCVC9jA8tXJb16RLgS3wAOMiPADlWIKEmPIX6
55
+ +hg2PDgFcrCuL3XAwJ4GKy3Q5BpIFF2j+wRNfjCXDFf1bU9Gy9DND8Y50Khhw/Zn
56
+ GYN1Y3AZ3YPzz1SPf08WM663ImYwORjdkA5VlIAMKcmSStNZZUrCOo7DQjNZVD2O
57
+ vfGhGUlPqYkmTPnCG2aNP8aJm3IbF+Cb6N6PjwIDAQABAoIBAEaYtr9PlagrsV40
58
+ 81kxjR3pptgrhhEHTQ7vNOH0Mz4T16gpQrLCRgOuARE2pgAhDPlw+hjUHPFzQrpN
59
+ Ay8nJWhZYHzVYIh67ZwDn1C6HsFjshEGei0UZb3sb3v15O/Xd9GYc4KIlkKwKxjA
60
+ K/d18rH8w9kUW8bxj+FTrpjHg9kYkWGjl1WUM4o4dALVVAbbILCHKUIv3wmU5Off
61
+ oqBDunItrfVvvc9UOt1SMO15fwuZZpk0B5cjjo6+1NNpIOzqnuu48iI5dQRAIr50
62
+ n44U4/Ix4E1p4i/9i5trCeSZRMrVxBruNxFBtCeDU6YW5fXYNBLptndfb83iqSJf
63
+ 46myqakCgYEA2MAsbtOcvQv+C7KsRMQih4WqpybV/TRdeC+dZ3flPvSuI8VLJAHp
64
+ p2Tp3WXATCwgUWL/iktwWE7WFMn3VvAuMm2ITmAze/Uk71uUS5R+iaGIeRXHgd9J
65
+ fyJrIeD63ncWbb23rif2sO6zH4cp9NLS/OopHiRNlRsWEUoGpybxczMCgYEAztrf
66
+ mX4oqjqk4af4o4/UHVp3Y9lpcUXRi6dYYECoqv6wS7qCIbJkD4I4P6oTwvk25vbk
67
+ p9fwOttuqHC53/rDXVjedNe9VExIe5NhVaug1SyArw/qsafYs0QeDRBkSgCcLfP6
68
+ LP4g824Wbv52X33BO0rJbDCICDqGDCOkqB4XcjUCgYBCkcMTxqo85ZIAxb9i31o7
69
+ hTIEZEkUmyCZ6QXO4WPnEf7pvY52YKACaVvqQ3Xr7yF93YneT40RkiTt/ZmZeeq2
70
+ Ui2q5KDrUT8mxFmnXNQAMTxY8/dyS8Gm6ks8/HwQF0MsMThYpK1/adBZvomER7vF
71
+ MaWvPDcXtFnytWmVrMA7QQKBgQDIHpHR4m6e+atIMIPoYR5Z44q7i7tp/ZzTGevy
72
+ +rry6wFN0jtRNE9/fYDDftwtdYL7AYKHKu7bUi0FQkFhAi39YhudOJaPNlmtTBEP
73
+ m8I2Wh6IvsJUa0jHbbAQ/Xm46kwuXOn8m0LvnuKPMRj+GyBVJ24kf/Mq2suSdO04
74
+ RBx0vQKBgFz93G6bSzmFg0BRTqRWEXEIuYkMIZDe48OjeP4pLYH9aERsL/f/8Dyc
75
+ X2nOMv/TdLP7mvGnwCt/sQ2626DdiNqimekyBki9J2r6BzBNVmEvnLAcYaQAiQYz
76
+ ooQ2FuL0K6ukQfHPjuMswqi41lmVH8gIVqVC+QnImUCrGxH9WXWy
77
+ -----END RSA PRIVATE KEY-----
78
+ """
79
+ end
80
+
81
+ def self.mock_own_key
82
+ before { allow(Slosilo).to receive(:[]).with(:own).and_return key }
83
+ end
84
+ end
@@ -0,0 +1,94 @@
1
+ require 'spec_helper'
2
+
3
+ describe Slosilo::Symmetric do
4
+ # TODO transform it to class methods only?
5
+ let(:plaintext) { "quick brown fox jumped over the lazy dog" }
6
+ let(:auth_data) { "some record id" }
7
+ let(:key) { "^\xBAIv\xDB1\x0Fi\x04\x11\xFD\x14\xA7\xCD\xDFf\x93\xFE\x93}\v\x01\x11\x98\x14\xE0;\xC1\xE2 v\xA5".force_encoding("ASCII-8BIT") }
8
+ let(:iv) { "\xD9\xABn\x01b\xFA\xBD\xC2\xE5\xEA\x01\xAC".force_encoding("ASCII-8BIT") }
9
+ let(:ciphertext) { "G^W1\x9C\xD4\xCC\x87\xD3\xFF\x86[\x0E3\xC0\xC8^\xD9\xABn\x01b\xFA\xBD\xC2\xE5\xEA\x01\xAC\x9E\xB9:\xF7\xD4ebeq\xDC \xC0sG\xA4\xAE,\xB8A|\x97\xBC\xFD\x85\xE1\xB93\x95>\xBD\n\x05\xFB\x15\x1F\x06#3M9".force_encoding('ASCII-8BIT') }
10
+
11
+ describe '#encrypt' do
12
+ it "encrypts with AES-256-GCM" do
13
+ allow(subject).to receive_messages random_iv: iv
14
+ expect(subject.encrypt(plaintext, key: key, aad: auth_data)).to eq(ciphertext)
15
+ end
16
+ end
17
+
18
+ describe '#decrypt' do
19
+
20
+ it "doesn't fail when called by multiple threads" do
21
+ threads = []
22
+
23
+ begin
24
+ # Verify we can successfuly decrypt using many threads without OpenSSL
25
+ # errors.
26
+ 1000.times do
27
+ threads << Thread.new do
28
+ 100.times do
29
+ expect(
30
+ subject.decrypt(ciphertext, key: key, aad: auth_data)
31
+ ).to eq(plaintext)
32
+ end
33
+ end
34
+ end
35
+ ensure
36
+ threads.each(&:join)
37
+ end
38
+ end
39
+
40
+ it "decrypts with AES-256-GCM" do
41
+ expect(subject.decrypt(ciphertext, key: key, aad: auth_data)).to eq(plaintext)
42
+ end
43
+
44
+
45
+ context "when the ciphertext has been messed with" do
46
+ let(:ciphertext) { "pwnd!" } # maybe we should do something more realistic like add some padding?
47
+ it "raises an exception" do
48
+ expect{ subject.decrypt(ciphertext, key: key, aad: auth_data)}.to raise_exception /Invalid version/
49
+ end
50
+ context "by adding a trailing 0" do
51
+ let(:new_ciphertext){ ciphertext + '\0' }
52
+ it "raises an exception" do
53
+ expect{ subject.decrypt(new_ciphertext, key: key, aad: auth_data) }.to raise_exception /Invalid version/
54
+ end
55
+ end
56
+ end
57
+
58
+ context "when no auth_data is given" do
59
+ let(:auth_data){""}
60
+ let(:ciphertext){ "Gm\xDAT\xE8I\x9F\xB7\xDC\xBB\x84\xD3Q#\x1F\xF4\x8C\aV\x93\x8F_\xC7\xBC87\xC9U\xF1\xAF\x8A\xD62\x1C5H\x86\x17\x19=B~Y*\xBC\x9D\eJeTx\x1F\x02l\t\t\xD3e\xA4\x11\x13y*\x95\x9F\xCD\xC4@\x9C"}
61
+
62
+ it "decrypts the message" do
63
+ expect(subject.decrypt(ciphertext, key: key, aad: auth_data)).to eq(plaintext)
64
+ end
65
+
66
+ context "and the ciphertext has been messed with" do
67
+ it "raises an exception" do
68
+ expect{ subject.decrypt(ciphertext + "\0\0\0", key: key, aad: auth_data)}.to raise_exception OpenSSL::Cipher::CipherError
69
+ end
70
+ end
71
+ end
72
+
73
+ context "when the auth data doesn't match" do
74
+ let(:auth_data){ "asdf" }
75
+ it "raises an exception" do
76
+ expect{ subject.decrypt(ciphertext, key: key, aad: auth_data)}.to raise_exception OpenSSL::Cipher::CipherError
77
+ end
78
+ end
79
+ end
80
+
81
+ describe '#random_iv' do
82
+ it "generates a random iv" do
83
+ expect_any_instance_of(OpenSSL::Cipher).to receive(:random_iv).and_return :iv
84
+ expect(subject.random_iv).to eq(:iv)
85
+ end
86
+ end
87
+
88
+ describe '#random_key' do
89
+ it "generates a random key" do
90
+ expect_any_instance_of(OpenSSL::Cipher).to receive(:random_key).and_return :key
91
+ expect(subject.random_key).to eq(:key)
92
+ end
93
+ end
94
+ end
data/test.sh ADDED
@@ -0,0 +1,8 @@
1
+ #!/bin/bash -xe
2
+
3
+
4
+ echo "==> Docker Run"
5
+ docker run --rm --volume $PWD:/app --workdir /app cyberark/ubuntu-ruby-builder bash -c 'git config --global --add safe.directory /app && bundle && ls -ltra && bundle exec rake jenkins' || :
6
+
7
+ echo "==> CP Coverage to Spec"
8
+ cp -r coverage spec
metadata ADDED
@@ -0,0 +1,238 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: slosilo
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Rafał Rzepecki
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-11-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: ci_reporter_rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: simplecov
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov-cobertura
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: io-grab
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.0.1
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.0.1
97
+ - !ruby/object:Gem::Dependency
98
+ name: sequel
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: sqlite3
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: bigdecimal
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: activesupport
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ description: This gem provides an easy way of storing and retrieving encryption keys
154
+ in the database.
155
+ email:
156
+ - divided.mind@gmail.com
157
+ executables: []
158
+ extensions: []
159
+ extra_rdoc_files: []
160
+ files:
161
+ - ".github/CODEOWNERS"
162
+ - ".gitignore"
163
+ - ".gitleaks.toml"
164
+ - ".kateproject"
165
+ - CHANGELOG.md
166
+ - CONTRIBUTING.md
167
+ - Gemfile
168
+ - Jenkinsfile
169
+ - LICENSE
170
+ - README.md
171
+ - Rakefile
172
+ - SECURITY.md
173
+ - dev/Dockerfile.dev
174
+ - dev/docker-compose.yml
175
+ - lib/slosilo.rb
176
+ - lib/slosilo/adapters/abstract_adapter.rb
177
+ - lib/slosilo/adapters/file_adapter.rb
178
+ - lib/slosilo/adapters/memory_adapter.rb
179
+ - lib/slosilo/adapters/mock_adapter.rb
180
+ - lib/slosilo/adapters/sequel_adapter.rb
181
+ - lib/slosilo/adapters/sequel_adapter/migration.rb
182
+ - lib/slosilo/attr_encrypted.rb
183
+ - lib/slosilo/errors.rb
184
+ - lib/slosilo/jwt.rb
185
+ - lib/slosilo/key.rb
186
+ - lib/slosilo/keystore.rb
187
+ - lib/slosilo/random.rb
188
+ - lib/slosilo/symmetric.rb
189
+ - lib/slosilo/version.rb
190
+ - lib/tasks/slosilo.rake
191
+ - publish.sh
192
+ - secrets.yml
193
+ - slosilo.gemspec
194
+ - spec/encrypted_attributes_spec.rb
195
+ - spec/file_adapter_spec.rb
196
+ - spec/jwt_spec.rb
197
+ - spec/key_spec.rb
198
+ - spec/keystore_spec.rb
199
+ - spec/random_spec.rb
200
+ - spec/sequel_adapter_spec.rb
201
+ - spec/slosilo_spec.rb
202
+ - spec/spec_helper.rb
203
+ - spec/symmetric_spec.rb
204
+ - test.sh
205
+ homepage: https://github.cyberng.com/Conjur-Enterprise/slosilo/
206
+ licenses:
207
+ - MIT
208
+ metadata: {}
209
+ post_install_message:
210
+ rdoc_options: []
211
+ require_paths:
212
+ - lib
213
+ required_ruby_version: !ruby/object:Gem::Requirement
214
+ requirements:
215
+ - - ">="
216
+ - !ruby/object:Gem::Version
217
+ version: 3.0.0
218
+ required_rubygems_version: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
223
+ requirements: []
224
+ rubygems_version: 3.4.10
225
+ signing_key:
226
+ specification_version: 4
227
+ summary: Store SSL keys in a database
228
+ test_files:
229
+ - spec/encrypted_attributes_spec.rb
230
+ - spec/file_adapter_spec.rb
231
+ - spec/jwt_spec.rb
232
+ - spec/key_spec.rb
233
+ - spec/keystore_spec.rb
234
+ - spec/random_spec.rb
235
+ - spec/sequel_adapter_spec.rb
236
+ - spec/slosilo_spec.rb
237
+ - spec/spec_helper.rb
238
+ - spec/symmetric_spec.rb