Skip to content

Commit 998e3e0

Browse files
author
Tomasz Rogozik
committed
v0.0.13 - adding support for referencing the library in Python code
1 parent 2a568e5 commit 998e3e0

File tree

4 files changed

+85
-61
lines changed

4 files changed

+85
-61
lines changed

kmsencryption/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from kmsencryption.lib import encrypt
2+
from kmsencryption.lib import decrypt
3+
from kmsencryption.lib import decrypt_json
4+
from kmsencryption.lib import encrypt_json
5+
6+
__all__ = ['encrypt', 'decrypt', 'decrypt_json', 'encrypt_json']

kmsencryption/__main__.py

Lines changed: 7 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,23 @@
1-
import aws_encryption_sdk
2-
import base64
3-
import botocore.session
1+
42
import click
5-
import json
6-
import os
73
import sys
84

5+
from kmsencryption import lib
6+
97

108
@click.group(context_settings={"help_option_names": ['-h', '--help']})
119
def main():
1210
pass
1311

1412

15-
def get_key_provider(cmk_arn, profile):
16-
if cmk_arn:
17-
kms_kwargs = dict(key_ids=[cmk_arn])
18-
else:
19-
kms_kwargs = dict()
20-
if profile is not None:
21-
kms_kwargs['botocore_session'] = botocore.session.Session(profile=profile)
22-
return aws_encryption_sdk.KMSMasterKeyProvider(**kms_kwargs)
23-
24-
25-
def decrypt_value(data, prefix, key_provider):
26-
if data.startswith(prefix):
27-
data = data[len(prefix):]
28-
29-
raw_data = base64.b64decode(data)
30-
decrypted_plaintext, decryptor_header = aws_encryption_sdk.decrypt(
31-
source=raw_data,
32-
key_provider=key_provider)
33-
return decrypted_plaintext
34-
35-
36-
def encrypt_value(data, prefix, key_provider):
37-
ciphertext, encryptor_header = aws_encryption_sdk.encrypt(
38-
source=data,
39-
key_provider=key_provider)
40-
return prefix + base64.b64encode(ciphertext).decode('utf-8')
41-
42-
4313
@main.command(help='Encrypts data with a new data key and returns a base64-encoded result.')
4414
@click.option('--cmk-arn', 'cmk_arn', prompt=True, help='ARN of an existing Customer Master Key in KMS')
4515
@click.option('--data', 'data', envvar='DATA', help='Data to be encrypted. Use to pass it as a named argument.')
4616
@click.option('--env', 'env', help='Name of an environment variable that contains data to be encrypted.')
4717
@click.option('--profile', 'profile', default=None, help='Name of an AWS CLI profile to be used when contacting AWS.')
4818
@click.option('--prefix', 'prefix', default='', help='An output prefix to be added to the generated result.')
4919
def encrypt(cmk_arn, data, env, profile, prefix):
50-
kms_key_provider = get_key_provider(cmk_arn, profile)
51-
if env is not None:
52-
data = os.getenv(env, data)
53-
if not data:
54-
raise ValueError('No data provided via --data or in a variable name passed with --env')
55-
56-
click.echo(encrypt_value(data, prefix, kms_key_provider))
20+
click.echo(lib.encrypt(cmk_arn, data, env, profile, prefix))
5721

5822

5923
@main.command(help='Decrypts a base64-encoded data.')
@@ -63,13 +27,7 @@ def encrypt(cmk_arn, data, env, profile, prefix):
6327
@click.option('--prefix', 'prefix', default='',
6428
help='An input prefix to be trimmed from the beginning before a value is decrypted.')
6529
def decrypt(data, env, profile, prefix):
66-
kms_key_provider = get_key_provider(None, profile)
67-
if env is not None:
68-
data = os.getenv(env, data)
69-
if not data:
70-
raise ValueError('No data provided via --data or in a variable name passed with --env')
71-
72-
click.echo(decrypt_value(data, prefix, kms_key_provider))
30+
click.echo(lib.decrypt(data, env, profile, prefix))
7331

7432

7533
@main.command('decrypt-json',
@@ -80,12 +38,7 @@ def decrypt(data, env, profile, prefix):
8038
@click.option('--prefix', 'prefix', default='',
8139
help='An input prefix to be trimmed from the beginning before a value is decrypted.')
8240
def decrypt_json(input, profile, prefix):
83-
kms_key_provider = get_key_provider(None, profile)
84-
input_map = json.load(input)
85-
output = {}
86-
for name, value in input_map.iteritems():
87-
output[name] = decrypt_value(value, prefix, kms_key_provider) if value.startswith(prefix) else value
88-
click.echo(json.dumps(output))
41+
click.echo(lib.decrypt_json(input, profile, prefix))
8942

9043

9144
@main.command('encrypt-json',
@@ -97,12 +50,7 @@ def decrypt_json(input, profile, prefix):
9750
@click.option('--prefix', 'prefix', default='',
9851
help='An output prefix to be added to the beginning of an encrypted value.')
9952
def encrypt_json(input, cmk_arn, profile, prefix):
100-
kms_key_provider = get_key_provider(cmk_arn, profile)
101-
input_map = json.load(input)
102-
output = {}
103-
for name, value in input_map.iteritems():
104-
output[name] = encrypt_value(value, prefix, kms_key_provider)
105-
click.echo(json.dumps(output))
53+
click.echo(lib.encrypt_json(input, cmk_arn, profile, prefix))
10654

10755

10856
if __name__ == '__main__':

kmsencryption/lib.py

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import aws_encryption_sdk
2+
import base64
3+
import botocore.session
4+
import json
5+
import os
6+
7+
def get_key_provider(cmk_arn, profile):
8+
if cmk_arn:
9+
kms_kwargs = dict(key_ids=[cmk_arn])
10+
else:
11+
kms_kwargs = dict()
12+
if profile is not None:
13+
kms_kwargs['botocore_session'] = botocore.session.Session(profile=profile)
14+
return aws_encryption_sdk.KMSMasterKeyProvider(**kms_kwargs)
15+
16+
17+
def decrypt_value(data, prefix, key_provider):
18+
if data.startswith(prefix):
19+
data = data[len(prefix):]
20+
21+
raw_data = base64.b64decode(data)
22+
decrypted_plaintext, decryptor_header = aws_encryption_sdk.decrypt(
23+
source=raw_data,
24+
key_provider=key_provider)
25+
return decrypted_plaintext
26+
27+
28+
def encrypt_value(data, prefix, key_provider):
29+
ciphertext, encryptor_header = aws_encryption_sdk.encrypt(
30+
source=data,
31+
key_provider=key_provider)
32+
return prefix + base64.b64encode(ciphertext).decode('utf-8')
33+
34+
35+
def encrypt(cmk_arn, data, env, profile, prefix):
36+
kms_key_provider = get_key_provider(cmk_arn, profile)
37+
if env is not None:
38+
data = os.getenv(env, data)
39+
if not data:
40+
raise ValueError('No data provided via --data or in a variable name passed with --env')
41+
42+
return encrypt_value(data, prefix, kms_key_provider)
43+
44+
45+
def decrypt(data, env, profile, prefix):
46+
kms_key_provider = get_key_provider(None, profile)
47+
if env is not None:
48+
data = os.getenv(env, data)
49+
if not data:
50+
raise ValueError('No data provided via --data or in a variable name passed with --env')
51+
52+
return decrypt_value(data, prefix, kms_key_provider)
53+
54+
55+
def decrypt_json(input, profile, prefix):
56+
kms_key_provider = get_key_provider(None, profile)
57+
input_map = json.load(input)
58+
output = {}
59+
for name, value in input_map.iteritems():
60+
output[name] = decrypt_value(value, prefix, kms_key_provider) if value.startswith(prefix) else value
61+
return json.dumps(output)
62+
63+
64+
def encrypt_json(input, cmk_arn, profile, prefix):
65+
kms_key_provider = get_key_provider(cmk_arn, profile)
66+
input_map = json.load(input)
67+
output = {}
68+
for name, value in input_map.iteritems():
69+
output[name] = encrypt_value(value, prefix, kms_key_provider)
70+
return json.dumps(output)

setup.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33

44
setup(
55
name='kms-encryption-toolbox',
6-
version='0.0.12',
6+
version='0.0.13',
77
url='https://github.com/ApplauseOSS/kms-encryption-toolbox',
88
license='Applause',
99
description='Encryption toolbox to be used with the Amazon Key Management Service for securing your deployment secrets. It encapsulates the aws-encryption-sdk package to expose cmdline actions.',
1010
author='Applause',
1111
author_email='[email protected]',
1212
zip_safe=False,
13-
packages=find_packages(),
13+
packages=['kmsencryption'],
1414
install_requires=[
1515
'cffi>=1.10.0',
1616
'aws-encryption-sdk>=1.2.0',

0 commit comments

Comments
 (0)