Skip to content

Commit 21e191d

Browse files
signing and encryption keys in gcp, aws, azure kms (#307)
* signing and encryption keys in gcp, aws, azure kms * minor change
1 parent fe9326d commit 21e191d

3 files changed

Lines changed: 60 additions & 18 deletions

File tree

wavefront/server/packages/flo_cloud/flo_cloud/aws/kms.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from .._types import FloKMS
66

77
aws_kms_arn = os.getenv('AWS_KMS_ARN')
8+
aws_kms_enc_arn = os.getenv('AWS_KMS_ENC_ARN')
89
aws_region = os.getenv('AWS_REGION')
910

1011

@@ -14,16 +15,23 @@ def __init__(self):
1415
raise ValueError('Region and KMS ARN must be set')
1516

1617
self.aws_kms_arn = aws_kms_arn
18+
self.aws_kms_enc_arn = aws_kms_enc_arn
1719
self.aws_region = aws_region
1820
self.kms_client = boto3.client('kms', region_name=aws_region)
1921

2022
def encrypt(self, plaintext: str) -> bytes:
21-
return self.kms_client.encrypt(KeyId=self.aws_kms_arn, Plaintext=plaintext)
23+
if not self.aws_kms_enc_arn:
24+
raise ValueError('AWS_KMS_ENC_ARN must be set to use encryption')
25+
return self.kms_client.encrypt(KeyId=self.aws_kms_enc_arn, Plaintext=plaintext)[
26+
'CiphertextBlob'
27+
]
2228

2329
def decrypt(self, ciphertext: str) -> bytes:
30+
if not self.aws_kms_enc_arn:
31+
raise ValueError('AWS_KMS_ENC_ARN must be set to use decryption')
2432
return self.kms_client.decrypt(
25-
KeyId=self.aws_kms_arn, CiphertextBlob=ciphertext
26-
)
33+
KeyId=self.aws_kms_enc_arn, CiphertextBlob=ciphertext
34+
)['Plaintext']
2735

2836
def sign(self, message: bytes, **kwargs) -> bytes:
2937
signing_algorithm = kwargs.get('signing_algorithm', 'RSASSA_PSS_SHA_256')

wavefront/server/packages/flo_cloud/flo_cloud/azure/key_vault.py

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ def __init__(
3737
vault_url: Optional[str] = None,
3838
key_name: Optional[str] = None,
3939
key_version: Optional[str] = None,
40+
enc_key_name: Optional[str] = None,
41+
enc_key_version: Optional[str] = None,
4042
client_id: Optional[str] = None,
4143
client_secret: Optional[str] = None,
4244
tenant_id: Optional[str] = None,
@@ -46,6 +48,12 @@ def __init__(
4648
resolved_key_version = key_version or os.environ.get(
4749
'AZURE_KEY_VAULT_KEY_VERSION'
4850
)
51+
resolved_enc_key_name = enc_key_name or os.environ.get(
52+
'AZURE_KEY_VAULT_ENC_KEY_NAME'
53+
)
54+
resolved_enc_key_version = enc_key_version or os.environ.get(
55+
'AZURE_KEY_VAULT_ENC_KEY_VERSION'
56+
)
4957

5058
if not resolved_vault_url:
5159
raise ValueError(
@@ -74,19 +82,43 @@ def __init__(
7482
self._key_name = resolved_key_name
7583
self._key_version = resolved_key_version
7684
self.key_client = KeyClient(vault_url=resolved_vault_url, credential=credential)
77-
key = self.key_client.get_key(resolved_key_name, version=resolved_key_version)
78-
self.crypto_client = CryptographyClient(key, credential=credential)
85+
86+
sign_key = self.key_client.get_key(
87+
resolved_key_name, version=resolved_key_version
88+
)
89+
self.crypto_client = CryptographyClient(sign_key, credential=credential)
90+
91+
self.enc_crypto_client = (
92+
CryptographyClient(
93+
self.key_client.get_key(
94+
resolved_enc_key_name, version=resolved_enc_key_version
95+
),
96+
credential=credential,
97+
)
98+
if resolved_enc_key_name
99+
else None
100+
)
79101

80102
def encrypt(self, plaintext: str) -> bytes:
103+
if not self.enc_crypto_client:
104+
raise ValueError(
105+
'AZURE_KEY_VAULT_ENC_KEY_NAME must be set to use encryption'
106+
)
81107
if isinstance(plaintext, str):
82108
plaintext = plaintext.encode('utf-8')
83-
result = self.crypto_client.encrypt(EncryptionAlgorithm.rsa_oaep_256, plaintext)
109+
result = self.enc_crypto_client.encrypt(
110+
EncryptionAlgorithm.rsa_oaep_256, plaintext
111+
)
84112
return result.ciphertext
85113

86114
def decrypt(self, ciphertext: str) -> bytes:
115+
if not self.enc_crypto_client:
116+
raise ValueError(
117+
'AZURE_KEY_VAULT_ENC_KEY_NAME must be set to use decryption'
118+
)
87119
if isinstance(ciphertext, str):
88120
ciphertext = ciphertext.encode('utf-8')
89-
result = self.crypto_client.decrypt(
121+
result = self.enc_crypto_client.decrypt(
90122
EncryptionAlgorithm.rsa_oaep_256, ciphertext
91123
)
92124
return result.plaintext

wavefront/server/packages/flo_cloud/flo_cloud/gcp/kms.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,20 +43,20 @@ def __init__(self):
4343
crypto_key_version=gcp_crypto_key_version,
4444
)
4545

46-
# Separate symmetric key path for encryption/decryption.
47-
# Symmetric encrypt/decrypt operates on a CryptoKey (not a version);
48-
# GCP picks the primary version on encrypt and reads the embedded
49-
# version metadata on decrypt.
50-
enc_key = gcp_enc_crypto_key or gcp_crypto_key
51-
52-
self.enc_key_name = self.kms_client.crypto_key_path(
53-
project=gcp_project_id,
54-
location=gcp_location,
55-
key_ring=gcp_key_ring,
56-
crypto_key=enc_key,
46+
self.enc_key_name = (
47+
self.kms_client.crypto_key_path(
48+
project=gcp_project_id,
49+
location=gcp_location,
50+
key_ring=gcp_key_ring,
51+
crypto_key=gcp_enc_crypto_key,
52+
)
53+
if gcp_enc_crypto_key
54+
else None
5755
)
5856

5957
def encrypt(self, plaintext: bytes | str) -> bytes:
58+
if not self.enc_key_name:
59+
raise ValueError('GCP_KMS_ENC_CRYPTO_KEY must be set to use encryption')
6060
if isinstance(plaintext, str):
6161
plaintext = plaintext.encode('utf-8')
6262
request = kms_v1.EncryptRequest(
@@ -67,6 +67,8 @@ def encrypt(self, plaintext: bytes | str) -> bytes:
6767
return response.ciphertext
6868

6969
def decrypt(self, ciphertext: bytes | str) -> bytes:
70+
if not self.enc_key_name:
71+
raise ValueError('GCP_KMS_ENC_CRYPTO_KEY must be set to use decryption')
7072
if isinstance(ciphertext, str):
7173
ciphertext = ciphertext.encode('utf-8')
7274
request = kms_v1.DecryptRequest(

0 commit comments

Comments
 (0)