1
- import aws_encryption_sdk
2
- import base64
3
- import botocore .session
1
+
4
2
import click
5
- import json
6
- import os
7
3
import sys
8
4
5
+ from kmsencryption import lib
6
+
9
7
10
8
@click .group (context_settings = {"help_option_names" : ['-h' , '--help' ]})
11
9
def main ():
12
10
pass
13
11
14
12
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
-
43
13
@main .command (help = 'Encrypts data with a new data key and returns a base64-encoded result.' )
44
14
@click .option ('--cmk-arn' , 'cmk_arn' , prompt = True , help = 'ARN of an existing Customer Master Key in KMS' )
45
15
@click .option ('--data' , 'data' , envvar = 'DATA' , help = 'Data to be encrypted. Use to pass it as a named argument.' )
46
16
@click .option ('--env' , 'env' , help = 'Name of an environment variable that contains data to be encrypted.' )
47
17
@click .option ('--profile' , 'profile' , default = None , help = 'Name of an AWS CLI profile to be used when contacting AWS.' )
48
18
@click .option ('--prefix' , 'prefix' , default = '' , help = 'An output prefix to be added to the generated result.' )
49
19
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 ))
57
21
58
22
59
23
@main .command (help = 'Decrypts a base64-encoded data.' )
@@ -63,13 +27,7 @@ def encrypt(cmk_arn, data, env, profile, prefix):
63
27
@click .option ('--prefix' , 'prefix' , default = '' ,
64
28
help = 'An input prefix to be trimmed from the beginning before a value is decrypted.' )
65
29
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 ))
73
31
74
32
75
33
@main .command ('decrypt-json' ,
@@ -80,12 +38,7 @@ def decrypt(data, env, profile, prefix):
80
38
@click .option ('--prefix' , 'prefix' , default = '' ,
81
39
help = 'An input prefix to be trimmed from the beginning before a value is decrypted.' )
82
40
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 ))
89
42
90
43
91
44
@main .command ('encrypt-json' ,
@@ -97,12 +50,7 @@ def decrypt_json(input, profile, prefix):
97
50
@click .option ('--prefix' , 'prefix' , default = '' ,
98
51
help = 'An output prefix to be added to the beginning of an encrypted value.' )
99
52
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 ))
106
54
107
55
108
56
if __name__ == '__main__' :
0 commit comments