Skip to content

Commit c4f396c

Browse files
committed
Added client option - closes #37
1 parent 7d8c081 commit c4f396c

9 files changed

Lines changed: 53 additions & 19 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 1.8.0 (unreleased)
2+
3+
- Added `client` option
4+
15
## 1.7.0 (2025-04-03)
26

37
- Dropped support for Ruby < 3.2 and Rails < 7.1

lib/kms_encrypted/box.rb

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
module KmsEncrypted
22
class Box
3-
attr_reader :key_id, :version, :previous_versions
3+
attr_reader :key_id, :version, :previous_versions, :client
44

5-
def initialize(key_id: nil, version: nil, previous_versions: nil)
5+
def initialize(key_id: nil, version: nil, previous_versions: nil, client: nil)
66
@key_id = key_id || KmsEncrypted.key_id
77
@version = version || 1
88
@previous_versions = previous_versions || {}
9+
@client = client
910
end
1011

1112
def encrypt(plaintext, context: nil)
1213
context = version_context(context, version)
1314
key_id = version_key_id(version)
14-
ciphertext = KmsEncrypted::Client.new(key_id: key_id, data_key: true).encrypt(plaintext, context: context)
15+
ciphertext = KmsEncrypted::Client.new(key_id: key_id, data_key: true, client: client).encrypt(plaintext, context: context)
1516
"v#{version}:#{encode64(ciphertext)}"
1617
end
1718

@@ -43,11 +44,13 @@ def decrypt(ciphertext, context: nil)
4344
key_id ||= version_key_id(version)
4445
ciphertext = decode64(ciphertext)
4546
context = version_context(context, version)
47+
client = version_client(version)
4648

4749
KmsEncrypted::Client.new(
4850
key_id: key_id,
4951
data_key: true,
50-
legacy_context: legacy_context
52+
legacy_context: legacy_context,
53+
client: client
5154
).decrypt(ciphertext, context: context)
5255
end
5356

@@ -68,6 +71,10 @@ def version_key_id(version)
6871
key_id
6972
end
7073

74+
def version_client(version)
75+
previous_versions.dig(version, :client) || self.client
76+
end
77+
7178
def version_context(context, version)
7279
if context.respond_to?(:call)
7380
if context.arity == 0

lib/kms_encrypted/client.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ module KmsEncrypted
22
class Client
33
attr_reader :key_id, :data_key
44

5-
def initialize(key_id: nil, legacy_context: false, data_key: false)
5+
def initialize(key_id: nil, legacy_context: false, data_key: false, client: nil)
66
@key_id = key_id || KmsEncrypted.key_id
77
@legacy_context = legacy_context
88
@data_key = data_key
9+
@service_client = client
910
end
1011

1112
def encrypt(plaintext, context: nil)
@@ -60,7 +61,7 @@ def client
6061
KmsEncrypted::Clients::Aws
6162
end
6263

63-
klass.new(key_id: key_id, legacy_context: @legacy_context)
64+
klass.new(key_id: key_id, legacy_context: @legacy_context, client: @service_client)
6465
end
6566
end
6667
end

lib/kms_encrypted/clients/aws.rb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ def encrypt(plaintext, context: nil)
88
}
99
options[:encryption_context] = generate_context(context) if context
1010

11-
KmsEncrypted.aws_client.encrypt(options).ciphertext_blob
11+
client.encrypt(options).ciphertext_blob
1212
end
1313

1414
def decrypt(ciphertext, context: nil)
@@ -18,14 +18,18 @@ def decrypt(ciphertext, context: nil)
1818
options[:encryption_context] = generate_context(context) if context
1919

2020
begin
21-
KmsEncrypted.aws_client.decrypt(options).plaintext
21+
client.decrypt(options).plaintext
2222
rescue ::Aws::KMS::Errors::InvalidCiphertextException
2323
decryption_failed!
2424
end
2525
end
2626

2727
private
2828

29+
def client
30+
@client ||= KmsEncrypted.aws_client
31+
end
32+
2933
# make integers strings for convenience
3034
def generate_context(context)
3135
raise ArgumentError, "Context must be a hash" unless context.is_a?(Hash)

lib/kms_encrypted/clients/base.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@ module Clients
33
class Base
44
attr_reader :key_id
55

6-
def initialize(key_id: nil, legacy_context: false)
6+
def initialize(key_id: nil, legacy_context: false, client: nil)
77
@key_id = key_id
88
@legacy_context = legacy_context
9+
@client = client
910
end
1011

1112
protected

lib/kms_encrypted/clients/google.rb

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ def encrypt(plaintext, context: nil)
1010
options[:additional_authenticated_data] = generate_context(context) if context
1111

1212
# ensure namespace gets loaded
13-
client = KmsEncrypted.google_client
13+
client = self.client
1414

15-
if defined?(::Google::Apis::CloudkmsV1::CloudKMSService) && KmsEncrypted.google_client.is_a?(::Google::Apis::CloudkmsV1::CloudKMSService)
15+
if defined?(::Google::Apis::CloudkmsV1::CloudKMSService) && client.is_a?(::Google::Apis::CloudkmsV1::CloudKMSService)
1616
request = ::Google::Apis::CloudkmsV1::EncryptRequest.new(**options)
1717
response = client.encrypt_crypto_key(key_id, request)
1818
@last_key_version = response.name
@@ -32,9 +32,9 @@ def decrypt(ciphertext, context: nil)
3232
options[:additional_authenticated_data] = generate_context(context) if context
3333

3434
# ensure namespace gets loaded
35-
client = KmsEncrypted.google_client
35+
client = self.client
3636

37-
if defined?(::Google::Apis::CloudkmsV1::CloudKMSService) && KmsEncrypted.google_client.is_a?(::Google::Apis::CloudkmsV1::CloudKMSService)
37+
if defined?(::Google::Apis::CloudkmsV1::CloudKMSService) && client.is_a?(::Google::Apis::CloudkmsV1::CloudKMSService)
3838
request = ::Google::Apis::CloudkmsV1::DecryptRequest.new(**options)
3939
begin
4040
client.decrypt_crypto_key(key_id, request).plaintext
@@ -52,6 +52,12 @@ def decrypt(ciphertext, context: nil)
5252
end
5353
end
5454
end
55+
56+
private
57+
58+
def client
59+
@client ||= KmsEncrypted.google_client
60+
end
5561
end
5662
end
5763
end

lib/kms_encrypted/clients/vault.rb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ def encrypt(plaintext, context: nil)
77
}
88
options[:context] = generate_context(context) if context
99

10-
response = KmsEncrypted.vault_client.logical.write(
10+
response = client.logical.write(
1111
"transit/encrypt/#{key_id.sub("vault/", "")}",
1212
options
1313
)
@@ -23,7 +23,7 @@ def decrypt(ciphertext, context: nil)
2323

2424
response =
2525
begin
26-
KmsEncrypted.vault_client.logical.write(
26+
client.logical.write(
2727
"transit/decrypt/#{key_id.sub("vault/", "")}",
2828
options
2929
)
@@ -42,6 +42,10 @@ def decrypt(ciphertext, context: nil)
4242

4343
private
4444

45+
def client
46+
@client ||= KmsEncrypted.vault_client
47+
end
48+
4549
# turn hash into json
4650
def generate_context(context)
4751
Base64.encode64(super)

lib/kms_encrypted/database.rb

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ def previous_versions
2020
@previous_versions ||= evaluate_option(:previous_versions)
2121
end
2222

23+
def client
24+
@client ||= evaluate_option(:client)
25+
end
26+
2327
def context(version)
2428
name = options[:name]
2529
context_method = name ? "kms_encryption_context_#{name}" : "kms_encryption_context"
@@ -36,7 +40,8 @@ def encrypt(plaintext)
3640
KmsEncrypted::Box.new(
3741
key_id: key_id,
3842
version: version,
39-
previous_versions: previous_versions
43+
previous_versions: previous_versions,
44+
client: client
4045
).encrypt(plaintext, context: context)
4146
end
4247

@@ -49,7 +54,8 @@ def decrypt(ciphertext)
4954
KmsEncrypted::Box.new(
5055
key_id: key_id,
5156
version: version,
52-
previous_versions: previous_versions
57+
previous_versions: previous_versions,
58+
client: client
5359
).decrypt(ciphertext, context: context)
5460
end
5561

lib/kms_encrypted/model.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module KmsEncrypted
22
module Model
3-
def has_kms_key(name: nil, key_id: nil, eager_encrypt: false, version: 1, previous_versions: nil, upgrade_context: false)
3+
def has_kms_key(name: nil, key_id: nil, eager_encrypt: false, version: 1, previous_versions: nil, upgrade_context: false, client: nil)
44
key_id ||= KmsEncrypted.key_id
55

66
key_method = name ? "kms_key_#{name}" : "kms_key"
@@ -28,7 +28,8 @@ def self.kms_keys
2828
name: name,
2929
version: version,
3030
previous_versions: previous_versions,
31-
upgrade_context: upgrade_context
31+
upgrade_context: upgrade_context,
32+
client: client
3233
}
3334

3435
if @kms_keys.size == 1

0 commit comments

Comments
 (0)