kms_rails 0.0.7 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 50c4a8fae51504007b10aea9578510462d5f7f76
4
- data.tar.gz: 5971526c22870da12221eb826288e25faf5bbe9d
2
+ SHA256:
3
+ metadata.gz: 0d44686b36dbb45a7fc0555c8376b39135cf40ee834c3382fadd88c274dda6a0
4
+ data.tar.gz: 8902378d8c6915ecc383057b54a2ca6f72fa7b7ff8f43d74f990c48170ed9c89
5
5
  SHA512:
6
- metadata.gz: 238577ab4e0907ab2058cca53c889035712ebeb7f66db77f93d589704a3c5d5a26362532a94303e396da49bbf8fce099c51c356216b4ee1c10f955a25ad934f0
7
- data.tar.gz: a5f006982114e6c15240f6a623403a5e2fe926c011f50c9820839b87c3fe70522a394bd5769132b972ce2ebe37b51032131f00c06e25ec34e016952fad9afcd7
6
+ metadata.gz: cfe253f5456a8271240090c2cd631c1d27050e62388d005534114286f5969e575c08c49644d26ee0ed104c97b73c6f9ee08cf58f315a0bbb54f7aaca59f7a244
7
+ data.tar.gz: febb5eab0f7a4c80168d38fcc70be634fbcb472d3b85b080017e94d9622b4719e5b2f7df15ddb19790c7517c45844e168bb2a79459a8bce93aa8f86e26472d86
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  engines:
3
3
  brakeman:
4
- enabled: true
4
+ enabled: false
5
5
  bundler-audit:
6
- enabled: true
6
+ enabled: false
7
7
  duplication:
8
8
  enabled: true
9
9
  config:
@@ -1,15 +1,18 @@
1
+ env:
2
+ global:
3
+ - CC_TEST_REPORTER_ID=156fab7dad33afa6dd4b24ab5721a01e5bbb41c3f07c380195695102b7363e0a
4
+
1
5
  language: ruby
2
6
  rvm:
3
- - 2.1.0
4
- - 2.2.0
5
- - 2.3.0
6
-
7
- addons:
8
- code_climate:
9
- repo_token: 156fab7dad33afa6dd4b24ab5721a01e5bbb41c3f07c380195695102b7363e0a
7
+ - 2.5
8
+ - 2.6
9
+ - 2.7
10
10
 
11
- script: bundle exec rspec spec
12
- before_install:
13
- - gem update bundler
14
- after_success:
15
- - bundle exec codeclimate-test-reporter
11
+ before_script:
12
+ - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
13
+ - chmod +x ./cc-test-reporter
14
+ - ./cc-test-reporter before-build
15
+ script:
16
+ - bundle exec rspec spec
17
+ after_script:
18
+ - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  [![Build Status](https://travis-ci.org/appbot/kms_rails.svg)](https://travis-ci.org/appbot/kms_rails)
2
2
  [![Code Climate](https://codeclimate.com/github/appbot/kms_rails/badges/gpa.svg)](https://codeclimate.com/github/appbot/kms_rails) [![Test Coverage](https://codeclimate.com/github/appbot/kms_rails/badges/coverage.svg)](https://codeclimate.com/github/appbot/kms_rails/coverage)
3
3
 
4
- #kms_rails
4
+ # kms_rails
5
5
 
6
6
  kms_rails (based on [kms_attrs](https://github.com/justinoue/kms_attrs)) is a gem for easily adding Amazon Web Services KMS encryption to your ActiveRecord model attributes and ActiveJob arguments. It uses the GenerateDataKey method to perform "envelope" encryption locally with an OpenSSL AES-256-CBC cipher.
7
7
 
@@ -78,9 +78,13 @@ Encryption is done when the job is seralized into the data store and is stored a
78
78
 
79
79
  The encryption is automatically reversed when the job is deserialized.
80
80
 
81
+ ### Data Serialization
82
+
83
+ Like kms_attr above, by default your encrypted kms_args values are converted to and from strings. Similarly, you can set `msgpack: true` to enable msgpack serialization and deserialization for arguments instead.
84
+
81
85
  ### Already encrypted parameters
82
86
 
83
- You also have the option of passing the value from your ActiveRecord encrypted field directly into the ActiveJob. If you do this, the value will not be encrypted twice. However, if you do this, you must ensure that the encryption key ID is the same for both the ActiveRecord attribute and ActiveJob parameter.
87
+ You also have the option of passing the value from your ActiveRecord encrypted field directly into the ActiveJob. If you do this, the value will not be encrypted twice. However, if you do this, you must ensure that the encryption key ID is the same for both the ActiveRecord attribute and ActiveJob parameter. It is also wise to use the same `msgpack: ` configuration options for both instances to ensure it is correctly decoded.
84
88
 
85
89
  For instance, if you want to enqueue an encrypted value into a job on a node that cannot decrypt that value, you could do something like this;
86
90
 
@@ -91,7 +95,7 @@ MyImportantJob.perform_later(value)
91
95
 
92
96
  In this instance, `value` will not be decrypted, nor encrypted twice.
93
97
 
94
- ##Additional Options
98
+ ## Additional Options
95
99
  You can add encryption contexts as strings or procs to kms_attr and kms_arg/args. Default is none.
96
100
  ```ruby
97
101
  kms_attr :my_attribute, key_id: 'my-aws-kms-key-id',
@@ -101,7 +105,7 @@ kms_attr :my_attribute, key_id: 'my-aws-kms-key-id',
101
105
  context_key: Proc.new { }, context_value: Proc.new { }
102
106
  ```
103
107
 
104
- ##Aws Configuration
108
+ ## Aws Configuration
105
109
  This gem expects some standard Aws SDK configuration. The Aws client is initiated with no credentials. This should then load credentials either from ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY'], `Aws` object, or an IAM role on an EC2 instance.
106
110
 
107
111
  You can configure your region in a Rails initializer with;
@@ -113,7 +117,7 @@ or by using the documented AWS environmental variables.
113
117
 
114
118
  ## Test Mode
115
119
 
116
- A basic fake implementation of `Aws::KMS::Client` has been written, allowing kms_rails functionality to be used in test environments without making any web requests. The fake implementation emulates the functionality of the two API calls kms_rails issues to AWS and performs fake encryption (the key is 'encrypted' by reversing it). At this time, the fake implementation does not support contexts.
120
+ A basic fake implementation of `Aws::KMS::Client` has been written, allowing kms_rails functionality to be used in test environments without making any web requests. The fake implementation emulates the functionality of the two API calls kms_rails issues to AWS and performs fake encryption (the key is 'encrypted' by reversing it).
117
121
 
118
122
  You can enable it in your Rails initializers with the following
119
123
  ```ruby
@@ -141,7 +145,7 @@ Directly specifying a key_id as a UUID or with the `alias/` prefix explicitly de
141
145
  ## Other stuff
142
146
 
143
147
  ### Notes
144
- This gem has been developed against Ruby 2.3.1, Rails 4.2, and AWS SDK v2. Credit where credit is due, strongbox by spikex was used as an inspiration and guide when creating this. https://github.com/spikex/strongbox
148
+ This gem has been developed against Ruby 2.3.1, Rails 4.2, and AWS SDK v3. Credit where credit is due, strongbox by spikex was used as an inspiration and guide when creating this. https://github.com/spikex/strongbox
145
149
 
146
150
  ### Disclaimer
147
151
  No claims are made about enhanced security when using this gem.
@@ -4,35 +4,34 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'kms_rails/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.name = "kms_rails"
7
+ spec.name = 'kms_rails'
8
8
  spec.version = KmsRails::VERSION
9
- spec.authors = ["Ash Tyndall", "Justin Ouellette"]
10
- spec.email = ["ash@appbot.co"]
9
+ spec.authors = ['Ash Tyndall', 'Justin Ouellette']
10
+ spec.email = ['ash@appbot.co']
11
11
 
12
12
  spec.summary = %q{AWS KMS encryption for ActiveRecord & ActiveJob.}
13
13
  spec.description = %q{Quickly add KMS encryption and decryption to your ActiveRecord model attributes and ActiveJob parameters. Improves upon kms_attrs with ActiveJob support, more efficient binary serialization and a test suite.}
14
- spec.homepage = "https://github.com/appbot/kms_rails"
15
- spec.license = "GPLv3"
14
+ spec.homepage = 'https://github.com/appbot/kms_rails'
15
+ spec.license = 'GPLv3'
16
16
 
17
17
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
- spec.bindir = "exe"
18
+ spec.bindir = 'exe'
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
- spec.require_paths = ["lib"]
21
- spec.required_ruby_version = '>= 2.1'
20
+ spec.require_paths = ['lib']
21
+ spec.required_ruby_version = '>= 2.5'
22
22
 
23
- spec.add_runtime_dependency "activerecord", "~> 4"
24
- spec.add_runtime_dependency "activejob", "~> 4"
25
- spec.add_runtime_dependency "aws-sdk", "~> 2"
26
- spec.add_runtime_dependency "msgpack"
23
+ spec.add_runtime_dependency 'activerecord', '>= 4'
24
+ spec.add_runtime_dependency 'activejob', '>= 4'
25
+ spec.add_runtime_dependency 'aws-sdk-kms', '~> 1'
26
+ spec.add_runtime_dependency 'msgpack'
27
27
 
28
- spec.add_development_dependency "bundler", "~> 1.12"
29
- spec.add_development_dependency "rake", "~> 10.0"
30
- spec.add_development_dependency "rspec"
31
- spec.add_development_dependency "rspec-mocks"
32
- spec.add_development_dependency "simplecov"
33
- spec.add_development_dependency "codeclimate-test-reporter"
34
- spec.add_development_dependency "with_model"
35
- spec.add_development_dependency "byebug"
36
- spec.add_development_dependency "sqlite3"
37
- spec.add_development_dependency "database_cleaner"
28
+ spec.add_development_dependency 'bundler'
29
+ spec.add_development_dependency 'rake', '>= 12.3.3'
30
+ spec.add_development_dependency 'rspec'
31
+ spec.add_development_dependency 'rspec-mocks'
32
+ spec.add_development_dependency 'simplecov'
33
+ spec.add_development_dependency 'with_model'
34
+ spec.add_development_dependency 'byebug'
35
+ spec.add_development_dependency 'sqlite3'
36
+ spec.add_development_dependency 'database_cleaner'
38
37
  end
@@ -1,3 +1,4 @@
1
+ require 'msgpack'
1
2
  require 'active_job'
2
3
  require 'kms_rails/core'
3
4
 
@@ -10,12 +11,12 @@ module KmsRails
10
11
  end
11
12
 
12
13
  module ClassMethods
13
- def kms_arg(field_number, key_id:, context_key: nil, context_value: nil)
14
- kms_args([field_number], key_id: key_id, context_key: context_key, context_value: context_value)
14
+ def kms_arg(field_number, key_id:, msgpack: false, context_key: nil, context_value: nil)
15
+ kms_args([field_number], key_id: key_id, msgpack: msgpack, context_key: context_key, context_value: context_value)
15
16
  end
16
17
 
17
- def kms_args(field_numbers, key_id:, context_key: nil, context_value: nil)
18
- enc = Core.new(key_id: key_id, context_key: context_key, context_value: context_value)
18
+ def kms_args(field_numbers, key_id:, msgpack: false, context_key: nil, context_value: nil)
19
+ enc = Core.new(key_id: key_id, context_key: context_key, msgpack: msgpack, context_value: context_value)
19
20
 
20
21
  define_method 'serialize_arguments' do |args|
21
22
  args = args.dup
@@ -14,21 +14,19 @@ module KmsRails
14
14
  include InstanceMethods
15
15
 
16
16
  real_field = "#{field}_enc"
17
- raise RuntimeError, "Field '#{real_field}' must exist to store encrypted data" unless self.column_names.include?(real_field)
18
- raise RuntimeError, "Field '#{field}' must not be a real column, '#{real_field}' is the real column" if self.column_names.include?(field)
19
-
20
- enc = Core.new(key_id: key_id, context_key: context_key, context_value: context_value)
17
+ enc = Core.new(key_id: key_id, msgpack: msgpack, context_key: context_key, context_value: context_value)
21
18
 
22
19
  define_method "#{field}=" do |data|
23
- if data.nil? # Just set to nil if nil
20
+ raise RuntimeError, "Field '#{field}' must not be a real column, '#{real_field}' is the real column" if self.class.column_names.include?(field.to_s)
21
+ raise RuntimeError, "Field '#{real_field}' must exist to store encrypted data" unless self.class.column_names.include?(real_field)
22
+
23
+ if data.blank? # Just set to nil if nil
24
24
  clear_retained(field)
25
25
  self[real_field] = nil
26
26
  return
27
27
  end
28
28
 
29
29
  set_retained(field, data) if retain
30
- data = data.to_msgpack if msgpack
31
-
32
30
  encrypted_data = enc.encrypt(data)
33
31
  data = nil
34
32
 
@@ -36,10 +34,15 @@ module KmsRails
36
34
  end
37
35
 
38
36
  define_method "#{real_field}" do
37
+ raise RuntimeError, "Field '#{field}' must not be a real column, '#{real_field}' is the real column" if self.class.column_names.include?(field.to_s)
38
+ raise RuntimeError, "Field '#{real_field}' must exist to retrieve encrypted data" unless self.class.column_names.include?(real_field)
39
39
  Core.to64( get_hash(field) )
40
40
  end
41
41
 
42
42
  define_method "#{field}" do
43
+ raise RuntimeError, "Field '#{field}' must not be a real column, '#{real_field}' is the real column" if self.class.column_names.include?(field.to_s)
44
+ raise RuntimeError, "Field '#{real_field}' must exist to retrieve decrypted data" unless self.class.column_names.include?(real_field)
45
+
43
46
  hash = get_hash(field)
44
47
  return nil unless hash
45
48
 
@@ -47,7 +50,6 @@ module KmsRails
47
50
  plaintext
48
51
  else
49
52
  plaintext = enc.decrypt(hash)
50
- plaintext = MessagePack.unpack(plaintext) if msgpack
51
53
  set_retained(field, plaintext) if retain
52
54
  plaintext
53
55
  end
@@ -1,23 +1,28 @@
1
1
  module KmsRails
2
- class << self
3
- attr_accessor :configuration
4
- end
2
+ module ConfigurationBase
3
+ attr_writer :configuration
5
4
 
6
- def self.configure
7
- self.configuration ||= Configuration.new
8
- yield(configuration)
9
- end
5
+ class Configuration
6
+ attr_accessor :fake_kms_api, :alias_prefix
10
7
 
11
- def self.reset_config
12
- self.configuration = Configuration.new
13
- end
8
+ def initialize
9
+ @fake_kms_api = false
10
+ @alias_prefix = ''
11
+ end
12
+ end
14
13
 
15
- class Configuration
16
- attr_accessor :fake_kms_api, :alias_prefix
14
+ def configuration
15
+ @configuration ||= Configuration.new
16
+ end
17
+
18
+ def configure
19
+ yield(self.configuration)
20
+ end
17
21
 
18
- def initialize
19
- @fake_kms_api = false
20
- @alias_prefix = ''
22
+ def reset_config
23
+ @configuration = Configuration.new
21
24
  end
22
25
  end
23
- end
26
+
27
+ extend ConfigurationBase
28
+ end
@@ -1,22 +1,25 @@
1
1
  require 'base64'
2
2
  require 'openssl'
3
- require 'aws-sdk'
3
+ require 'msgpack'
4
+ require 'aws-sdk-kms'
4
5
  require 'kms_rails/configuration'
5
6
 
6
7
  module KmsRails
7
8
  class Core
8
9
  attr_reader :context_key, :context_value
9
10
 
10
- def initialize(key_id:, context_key: nil, context_value: nil)
11
+ def initialize(key_id:, msgpack: false, context_key: nil, context_value: nil)
11
12
  @base_key_id = key_id
12
13
  @context_key = context_key
13
14
  @context_value = context_value
15
+ @msgpack = msgpack
14
16
  end
15
17
 
16
18
  def encrypt(data)
17
19
  return nil if data.nil?
18
20
 
19
21
  data_key = aws_generate_data_key(key_id)
22
+ data = data.to_msgpack if @msgpack
20
23
  encrypted = encrypt_attr(data, data_key.plaintext)
21
24
 
22
25
  self.class.shred_string(data_key.plaintext)
@@ -36,13 +39,17 @@ module KmsRails
36
39
 
37
40
  def decrypt(data_obj)
38
41
  return nil if data_obj.nil?
39
- decrypt_attr(
40
- data_obj['blob'],
42
+
43
+ decrypted = decrypt_attr(
44
+ data_obj['blob'],
41
45
  aws_decrypt_key(data_obj['key']),
42
46
  data_obj['iv']
43
47
  )
48
+
49
+ decrypted = MessagePack.unpack(decrypted) if @msgpack
50
+ decrypted
44
51
  end
45
-
52
+
46
53
  def decrypt64(data_obj)
47
54
  return nil if data_obj.nil?
48
55
  decrypt( self.class.from64(data_obj) )
@@ -54,7 +61,7 @@ module KmsRails
54
61
  @base_key_id.call
55
62
  when String
56
63
  if @base_key_id =~ /\A\w{8}-\w{4}-\w{4}-\w{4}-\w{12}\z/ || @base_key_id.start_with?('alias/') # if UUID or direct alias
57
- @base_key_id
64
+ @base_key_id
58
65
  else
59
66
  'alias/' + KmsRails.configuration.alias_prefix + @base_key_id
60
67
  end
@@ -78,7 +85,7 @@ module KmsRails
78
85
  data_obj.map { |k,v| [k, Base64.strict_decode64(v)] }.to_h
79
86
  end
80
87
 
81
- private
88
+ private
82
89
 
83
90
  def apply_context(args, key, value)
84
91
  if key && value
@@ -116,7 +123,7 @@ module KmsRails
116
123
 
117
124
  def aws_decrypt_key(key)
118
125
  args = {ciphertext_blob: key}
119
- aws_kms.decrypt(apply_context(args, @context_key, @context_value)).plaintext
126
+ aws_kms.decrypt(**apply_context(args, @context_key, @context_value)).plaintext
120
127
  end
121
128
 
122
129
  def aws_kms
@@ -126,7 +133,7 @@ module KmsRails
126
133
 
127
134
  def aws_generate_data_key(key_id)
128
135
  args = {key_id: key_id, key_spec: 'AES_256'}
129
- aws_kms.generate_data_key(apply_context(args, @context_key, @context_value))
136
+ aws_kms.generate_data_key(**apply_context(args, @context_key, @context_value))
130
137
  end
131
138
  end
132
- end
139
+ end
@@ -1,4 +1,4 @@
1
- require 'aws-sdk'
1
+ require 'aws-sdk-kms'
2
2
  require 'msgpack'
3
3
 
4
4
  module KmsRails
@@ -1,3 +1,3 @@
1
1
  module KmsRails
2
- VERSION = "0.0.7"
2
+ VERSION = "0.2.1"
3
3
  end
metadata CHANGED
@@ -1,58 +1,58 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kms_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ash Tyndall
8
8
  - Justin Ouellette
9
- autorequire:
9
+ autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2016-12-20 00:00:00.000000000 Z
12
+ date: 2020-09-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - "~>"
18
+ - - ">="
19
19
  - !ruby/object:Gem::Version
20
20
  version: '4'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - "~>"
25
+ - - ">="
26
26
  - !ruby/object:Gem::Version
27
27
  version: '4'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: activejob
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - "~>"
32
+ - - ">="
33
33
  - !ruby/object:Gem::Version
34
34
  version: '4'
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - "~>"
39
+ - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  version: '4'
42
42
  - !ruby/object:Gem::Dependency
43
- name: aws-sdk
43
+ name: aws-sdk-kms
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
46
  - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: '2'
48
+ version: '1'
49
49
  type: :runtime
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - "~>"
54
54
  - !ruby/object:Gem::Version
55
- version: '2'
55
+ version: '1'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: msgpack
58
58
  requirement: !ruby/object:Gem::Requirement
@@ -71,30 +71,30 @@ dependencies:
71
71
  name: bundler
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
- - - "~>"
74
+ - - ">="
75
75
  - !ruby/object:Gem::Version
76
- version: '1.12'
76
+ version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
- - - "~>"
81
+ - - ">="
82
82
  - !ruby/object:Gem::Version
83
- version: '1.12'
83
+ version: '0'
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: rake
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
- - - "~>"
88
+ - - ">="
89
89
  - !ruby/object:Gem::Version
90
- version: '10.0'
90
+ version: 12.3.3
91
91
  type: :development
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
- - - "~>"
95
+ - - ">="
96
96
  - !ruby/object:Gem::Version
97
- version: '10.0'
97
+ version: 12.3.3
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: rspec
100
100
  requirement: !ruby/object:Gem::Requirement
@@ -137,20 +137,6 @@ dependencies:
137
137
  - - ">="
138
138
  - !ruby/object:Gem::Version
139
139
  version: '0'
140
- - !ruby/object:Gem::Dependency
141
- name: codeclimate-test-reporter
142
- requirement: !ruby/object:Gem::Requirement
143
- requirements:
144
- - - ">="
145
- - !ruby/object:Gem::Version
146
- version: '0'
147
- type: :development
148
- prerelease: false
149
- version_requirements: !ruby/object:Gem::Requirement
150
- requirements:
151
- - - ">="
152
- - !ruby/object:Gem::Version
153
- version: '0'
154
140
  - !ruby/object:Gem::Dependency
155
141
  name: with_model
156
142
  requirement: !ruby/object:Gem::Requirement
@@ -238,7 +224,7 @@ homepage: https://github.com/appbot/kms_rails
238
224
  licenses:
239
225
  - GPLv3
240
226
  metadata: {}
241
- post_install_message:
227
+ post_install_message:
242
228
  rdoc_options: []
243
229
  require_paths:
244
230
  - lib
@@ -246,16 +232,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
246
232
  requirements:
247
233
  - - ">="
248
234
  - !ruby/object:Gem::Version
249
- version: '2.1'
235
+ version: '2.5'
250
236
  required_rubygems_version: !ruby/object:Gem::Requirement
251
237
  requirements:
252
238
  - - ">="
253
239
  - !ruby/object:Gem::Version
254
240
  version: '0'
255
241
  requirements: []
256
- rubyforge_project:
257
- rubygems_version: 2.5.1
258
- signing_key:
242
+ rubyforge_project:
243
+ rubygems_version: 2.7.9
244
+ signing_key:
259
245
  specification_version: 4
260
246
  summary: AWS KMS encryption for ActiveRecord & ActiveJob.
261
247
  test_files: []