Skip to content

Commit 027c8fc

Browse files
Added CLI tools for encrypting and decrypting secrets.
1 parent b1a6033 commit 027c8fc

8 files changed

Lines changed: 154 additions & 0 deletions

File tree

edq/cli/crypto/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
"""
2+
The edq.cli.crypto package contains cryptographic tools.
3+
"""

edq/cli/crypto/__main__.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import sys
2+
3+
import edq.clilib.list
4+
5+
def main() -> int:
6+
""" List this CLI dir. """
7+
8+
return edq.clilib.list.main()
9+
10+
if (__name__ == '__main__'):
11+
sys.exit(main())

edq/cli/crypto/decrypt-secret.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# pylint: disable=invalid-name
2+
3+
"""
4+
Decrypt an edq.util.crypto.Secret into cleartext.
5+
6+
The standard configuration encryption key will be used.
7+
"""
8+
9+
import argparse
10+
import sys
11+
12+
import edq.config.constants
13+
import edq.core.argparser
14+
import edq.util.crypto
15+
16+
def run_cli(args: argparse.Namespace) -> int:
17+
""" Run the CLI. """
18+
19+
secret = edq.util.crypto.Secret.parse(args.ciphertext, args._config_info.application_config.encryption_key)
20+
21+
print(secret.cleartext)
22+
23+
return 0
24+
25+
def main() -> int:
26+
""" Get a parser, parse the args, and call run. """
27+
return run_cli(_get_parser().parse_args())
28+
29+
def _get_parser() -> argparse.ArgumentParser:
30+
""" Get the parser. """
31+
32+
parser = edq.core.argparser.get_default_parser(__doc__.strip())
33+
34+
parser.add_argument('ciphertext', metavar = 'TEXT',
35+
action = 'store', type = str,
36+
help = 'The ciphertext to decrypt.')
37+
38+
return parser
39+
40+
if (__name__ == '__main__'):
41+
sys.exit(main())

edq/cli/crypto/encrypt-secret.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# pylint: disable=invalid-name
2+
3+
"""
4+
Encrypt a cleartext string as an edq.util.crypto.Secret.
5+
6+
The standard configuration encryption key will be used.
7+
"""
8+
9+
import argparse
10+
import sys
11+
12+
import edq.config.constants
13+
import edq.core.argparser
14+
import edq.util.crypto
15+
16+
def run_cli(args: argparse.Namespace) -> int:
17+
""" Run the CLI. """
18+
19+
secret = edq.util.crypto.Secret(args.cleartext, iv_b64 = args.iv, salt_b64 = args.salt)
20+
ciphertext = secret.encrypt(args._config_info.application_config.encryption_key)
21+
22+
print(ciphertext)
23+
24+
return 0
25+
26+
def main() -> int:
27+
""" Get a parser, parse the args, and call run. """
28+
return run_cli(_get_parser().parse_args())
29+
30+
def _get_parser() -> argparse.ArgumentParser:
31+
""" Get the parser. """
32+
33+
parser = edq.core.argparser.get_default_parser(__doc__.strip())
34+
35+
parser.add_argument('cleartext', metavar = 'TEXT',
36+
action = 'store', type = str,
37+
help = 'The text to encrypt.')
38+
39+
parser.add_argument('--encryption-method', dest = 'encryption_method',
40+
action = 'store', type = str, default = edq.util.crypto.EncryptionMethod.AES256v1.value,
41+
choices = [choice.value for choice in edq.util.crypto.EncryptionMethod],
42+
help = 'The encryption method to use (default: %(default)s).')
43+
44+
parser.add_argument('--salt', dest = 'salt',
45+
action = 'store', type = str, default = None,
46+
help = ('An optional salt to provide (as a base64 encoded string).'
47+
+ ' Providing a salt is not recommended.'
48+
+ ' If no salt is provided, one will be generated randomly.')
49+
)
50+
51+
parser.add_argument('--iv', dest = 'iv',
52+
action = 'store', type = str, default = None,
53+
help = ('An optional initialization vector (IV) to provide (as a base64 encoded string).'
54+
+ ' Providing an IV is not recommended.'
55+
+ ' If no IV is provided, one will be generated randomly.')
56+
)
57+
58+
return parser
59+
60+
if (__name__ == '__main__'):
61+
sys.exit(main())
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"cli": "edq.cli.crypto.decrypt-secret",
3+
"arguments": [
4+
"__edq_secret__::AES256v1::nfhP9KYRTwQyGbwtkEj4FA==::bQTHv6sDqIRVbnyFHkwODA==::A4cLESzs0b3iyFKJBV7BHQ==",
5+
],
6+
}
7+
---
8+
It's a secret!
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"cli": "edq.cli.crypto.decrypt-secret",
3+
"arguments": [
4+
"--encryption-key", "my-key",
5+
"__edq_secret__::AES256v1::nfhP9KYRTwQyGbwtkEj4FA==::bQTHv6sDqIRVbnyFHkwODA==::K/QuuVZoh675qtysU/QG1Q==",
6+
],
7+
}
8+
---
9+
It's a secret!
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"cli": "edq.cli.crypto.encrypt-secret",
3+
"arguments": [
4+
"It's a secret!",
5+
"--iv", "nfhP9KYRTwQyGbwtkEj4FA==",
6+
"--salt", "bQTHv6sDqIRVbnyFHkwODA==",
7+
],
8+
}
9+
---
10+
__edq_secret__::AES256v1::nfhP9KYRTwQyGbwtkEj4FA==::bQTHv6sDqIRVbnyFHkwODA==::A4cLESzs0b3iyFKJBV7BHQ==
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"cli": "edq.cli.crypto.encrypt-secret",
3+
"arguments": [
4+
"It's a secret!",
5+
"--iv", "nfhP9KYRTwQyGbwtkEj4FA==",
6+
"--salt", "bQTHv6sDqIRVbnyFHkwODA==",
7+
"--encryption-key", "my-key",
8+
],
9+
}
10+
---
11+
__edq_secret__::AES256v1::nfhP9KYRTwQyGbwtkEj4FA==::bQTHv6sDqIRVbnyFHkwODA==::K/QuuVZoh675qtysU/QG1Q==

0 commit comments

Comments
 (0)