Skip to content

Commit 1abab92

Browse files
committed
feat: Updates to the AWS Encryption SDK.
This change includes fixes for issues that were reported by Thai Duong from Google's Security team, and for issues that were identified by AWS Cryptography. See: https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/migration.html
1 parent dee50fd commit 1abab92

17 files changed

+455
-101
lines changed

README.rst

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ Required Prerequisites
4747
======================
4848

4949
* Python 2.7+ or 3.4+
50-
* aws-encryption-sdk >= 1.3.2
50+
* aws-encryption-sdk >= 1.7.0
5151

5252
Installation
5353
============
@@ -215,40 +215,40 @@ must accept all arguments as prepared. See `Advanced Configuration`_ for more in
215215

216216
Multiple master keys can be defined using multiple instances of the ``key`` argument.
217217

218-
Multiple master key providers can be defined using multiple ``--master-keys`` groups.
218+
Multiple master key providers can be defined using multiple ``--wrapping-keys`` groups.
219219

220220
If multiple master key providers are defined, the first one is treated as the primary.
221221

222222
If multiple master keys are defined in the primary master key provider, the first one is treated
223223
as the primary. The primary master key is used to generate the data key.
224224

225-
The below logic is used to construct all master key providers. We use ``KMSMasterKeyProvider``
226-
as an example.
225+
The below logic is used to construct all master key providers. We use
226+
``DiscoveryAwsKmsMasterKeyProvider`` as an example.
227227

228228
.. code-block:: python
229229
230230
# With parameters:
231-
--master-keys provider=aws-kms key=$KEY_1 key=$KEY_2
231+
--wrapping-keys provider=aws-kms key=$KEY_1 key=$KEY_2
232232
233233
# KMSMasterKeyProvider is called as:
234-
key_provider = KMSMasterKeyProvider()
234+
key_provider = DiscoveryAwsKmsMasterKeyProvider()
235235
key_provider.add_master_key($KEY_1)
236236
key_provider.add_master_key($KEY_2)
237237
238238
.. code-block:: sh
239239
240240
# Single KMS CMK
241-
--master-keys provider=aws-kms key=$KEY_ARN_1
241+
--wrapping-keys provider=aws-kms key=$KEY_ARN_1
242242
243243
# Two KMS CMKs
244-
--master-keys provider=aws-kms key=$KEY_ARN_1 key=$KEY_ARN_2
244+
--wrapping-keys provider=aws-kms key=$KEY_ARN_1 key=$KEY_ARN_2
245245
246246
# KMS Alias by name in default region
247-
--master-keys provider=aws-kms key=$ALIAS_NAME
247+
--wrapping-keys provider=aws-kms key=$ALIAS_NAME
248248
249249
# KMS Alias by name in two specific regions
250-
--master-keys provider=aws-kms key=$ALIAS_NAME region=us-west-2
251-
--master-keys provider=aws-kms key=$ALIAS_NAME region=eu-central-1
250+
--wrapping-keys provider=aws-kms key=$ALIAS_NAME region=us-west-2
251+
--wrapping-keys provider=aws-kms key=$ALIAS_NAME region=eu-central-1
252252
253253
AWS KMS
254254
```````
@@ -518,6 +518,12 @@ Execution
518518
provider identifier and identifiers for one or more
519519
master key supplied by that provider. ex: --master-
520520
keys provider=aws-kms key=$AWS_KMS_KEY_ARN
521+
-w WRAPPING_KEYS [WRAPPING_KEYS ...], --wrapping-keys WRAPPING_KEYS [WRAPPING_KEYS ...]
522+
Identifying information for a master key provider and
523+
master keys. Each instance must include a master key
524+
provider identifier and identifiers for one or more
525+
master key supplied by that provider. ex: --wrapping-
526+
keys provider=aws-kms key=$AWS_KMS_KEY_ARN
521527
--caching CACHING [CACHING ...]
522528
Configuration options for a caching cryptographic
523529
materials manager and local cryptographic materials

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
base64io>=1.0.1
2-
aws-encryption-sdk>=1.3.2
2+
aws-encryption-sdk>=1.7.0
33
setuptools
44
attrs>=17.1.0

src/aws_encryption_sdk_cli/__init__.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@
1919
from argparse import Namespace # noqa pylint: disable=unused-import
2020

2121
import aws_encryption_sdk
22+
from aws_encryption_sdk.materials_managers import CommitmentPolicy
2223
from aws_encryption_sdk.materials_managers.base import CryptoMaterialsManager # noqa pylint: disable=unused-import
2324

2425
from aws_encryption_sdk_cli.exceptions import AWSEncryptionSDKCLIError, BadUserArgumentError
25-
from aws_encryption_sdk_cli.internal.arg_parsing import parse_args
26+
from aws_encryption_sdk_cli.internal.arg_parsing import CommitmentPolicyArgs, parse_args
2627
from aws_encryption_sdk_cli.internal.identifiers import __version__ # noqa
2728
from aws_encryption_sdk_cli.internal.io_handling import IOHandler, output_filename
2829
from aws_encryption_sdk_cli.internal.logging_utils import LOGGER_NAME, setup_logger
@@ -164,6 +165,14 @@ def process_cli_request(stream_args, parsed_args):
164165
)
165166
_catch_bad_stdin_stdout_requests(parsed_args.input, parsed_args.output)
166167

168+
if not parsed_args.commitment_policy:
169+
commitment_policy = CommitmentPolicy.FORBID_ENCRYPT_ALLOW_DECRYPT
170+
elif parsed_args.commitment_policy == CommitmentPolicyArgs.forbid_encrypt_allow_decrypt:
171+
commitment_policy = CommitmentPolicy.FORBID_ENCRYPT_ALLOW_DECRYPT
172+
else:
173+
_LOGGER.warning("Invalid commitment policy: %s", parsed_args.commitment_policy)
174+
commitment_policy = CommitmentPolicy.FORBID_ENCRYPT_ALLOW_DECRYPT
175+
167176
handler = IOHandler(
168177
metadata_writer=parsed_args.metadata_output,
169178
interactive=parsed_args.interactive,
@@ -172,6 +181,7 @@ def process_cli_request(stream_args, parsed_args):
172181
encode_output=parsed_args.encode,
173182
required_encryption_context=parsed_args.encryption_context,
174183
required_encryption_context_keys=parsed_args.required_encryption_context_keys,
184+
commitment_policy=commitment_policy,
175185
)
176186

177187
if parsed_args.input == "-":
@@ -230,6 +240,11 @@ def stream_kwargs_from_args(args, crypto_materials_manager):
230240
if args.frame_length is not None:
231241
stream_args["frame_length"] = args.frame_length
232242

243+
if not args.commitment_policy:
244+
stream_args["commitment_policy"] = CommitmentPolicy.FORBID_ENCRYPT_ALLOW_DECRYPT
245+
elif args.commitment_policy == CommitmentPolicyArgs.forbid_encrypt_allow_decrypt:
246+
stream_args["commitment_policy"] = CommitmentPolicy.FORBID_ENCRYPT_ALLOW_DECRYPT
247+
233248
if args.max_length is not None:
234249
stream_args["max_body_length"] = args.max_length
235250
return stream_args
@@ -250,11 +265,17 @@ def cli(raw_args=None):
250265
_LOGGER.debug("Encryption source: %s", args.input)
251266
_LOGGER.debug("Encryption destination: %s", args.output)
252267
_LOGGER.debug("Master key provider configuration: %s", args.master_keys)
268+
_LOGGER.debug("Discovery mode: %r", args.discovery)
253269
_LOGGER.debug("Suffix requested: %s", args.suffix)
254270

255-
crypto_materials_manager = build_crypto_materials_manager_from_args(
256-
key_providers_config=args.master_keys, caching_config=args.caching
257-
)
271+
if args.wrapping_keys is not None:
272+
crypto_materials_manager = build_crypto_materials_manager_from_args(
273+
key_providers_config=args.wrapping_keys, caching_config=args.caching
274+
)
275+
else:
276+
crypto_materials_manager = build_crypto_materials_manager_from_args(
277+
key_providers_config=args.master_keys, caching_config=args.caching
278+
)
258279

259280
stream_args = stream_kwargs_from_args(args, crypto_materials_manager)
260281

0 commit comments

Comments
 (0)