slosilo 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +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