Skip to content

feat: Required encryption context CMM #645

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 173 commits into from
Apr 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
173 commits
Select commit Hold shift + click to select a range
7360edd
passing hierarchy keyring example
lucasmcdonald3 Jan 31, 2024
53c46ec
cleanup
lucasmcdonald3 Feb 2, 2024
3f5a503
add
lucasmcdonald3 Feb 2, 2024
16cf5c1
changes, cleanup:
lucasmcdonald3 Feb 2, 2024
5b5aa07
changes, cleanup
lucasmcdonald3 Feb 2, 2024
03e19ca
flake8
lucasmcdonald3 Feb 2, 2024
b5d3327
flake8
lucasmcdonald3 Feb 2, 2024
b13cd19
flake8
lucasmcdonald3 Feb 2, 2024
51065cb
flake8
lucasmcdonald3 Feb 2, 2024
fc4d254
flake8
lucasmcdonald3 Feb 2, 2024
a8e52d3
fix pem/der
lucasmcdonald3 Feb 5, 2024
6f55047
fix pem/der
lucasmcdonald3 Feb 5, 2024
1b1b4e4
debug
lucasmcdonald3 Feb 6, 2024
38a4cc9
debug
lucasmcdonald3 Feb 6, 2024
0cd0e23
fix
lucasmcdonald3 Feb 6, 2024
44826a2
fix
lucasmcdonald3 Feb 7, 2024
02e9f84
fix
lucasmcdonald3 Feb 7, 2024
a3babfd
linter
lucasmcdonald3 Feb 7, 2024
d2c974a
linter
lucasmcdonald3 Feb 7, 2024
55b24a8
isort
lucasmcdonald3 Feb 7, 2024
7e5fa48
flake8 examples
lucasmcdonald3 Feb 7, 2024
055deab
isort + flake8
lucasmcdonald3 Feb 7, 2024
6cf01d4
flake8/pylint examples
lucasmcdonald3 Feb 7, 2024
00cfed1
reset tests
lucasmcdonald3 Feb 7, 2024
61bbb3b
extend mpl
lucasmcdonald3 Feb 7, 2024
4d53ad6
mpl gha
lucasmcdonald3 Feb 7, 2024
c1736d3
debug
lucasmcdonald3 Feb 7, 2024
9991789
debug
lucasmcdonald3 Feb 7, 2024
a501e8f
debug
lucasmcdonald3 Feb 7, 2024
6eb8f82
debug
lucasmcdonald3 Feb 7, 2024
5ccfa0c
codebuild mpl
lucasmcdonald3 Feb 7, 2024
5e7ec9b
codebuild mpl
lucasmcdonald3 Feb 7, 2024
cc48697
codebuild mpl
lucasmcdonald3 Feb 7, 2024
fae43d1
codebuild mpl
lucasmcdonald3 Feb 7, 2024
2637616
debug
lucasmcdonald3 Feb 7, 2024
2694932
debug
lucasmcdonald3 Feb 7, 2024
f674d3e
debug
lucasmcdonald3 Feb 7, 2024
0b5e655
debug
lucasmcdonald3 Feb 7, 2024
831df17
debug
lucasmcdonald3 Feb 7, 2024
477e3a0
debug
lucasmcdonald3 Feb 7, 2024
166c5ab
debug
lucasmcdonald3 Feb 7, 2024
7ac8880
debug
lucasmcdonald3 Feb 7, 2024
8193c25
Merge branch 'master' into lucmcdon/mpl
lucasmcdonald3 Feb 7, 2024
7e3ca15
fix
lucasmcdonald3 Feb 7, 2024
4c6a1d0
fix
lucasmcdonald3 Feb 7, 2024
e2e1858
fix
lucasmcdonald3 Feb 7, 2024
c790011
mpl
lucasmcdonald3 Feb 7, 2024
33ace58
fix
lucasmcdonald3 Feb 7, 2024
cbf2cdf
fix
lucasmcdonald3 Feb 7, 2024
b259477
fix
lucasmcdonald3 Feb 7, 2024
9d52cf2
.
lucasmcdonald3 Feb 8, 2024
31b7616
debug tox mpl keystore env
lucasmcdonald3 Feb 9, 2024
353b8cf
debug tox mpl keystore env
lucasmcdonald3 Feb 9, 2024
fb64d95
debug tox mpl keystore env
lucasmcdonald3 Feb 9, 2024
916ae8e
debug tox mpl keystore env
lucasmcdonald3 Feb 9, 2024
222b135
debug tox mpl keystore env
lucasmcdonald3 Feb 9, 2024
cab6016
some unit tests
lucasmcdonald3 Feb 10, 2024
a7416b1
add mpl coverage
lucasmcdonald3 Feb 13, 2024
7b3dc5f
.
lucasmcdonald3 Feb 13, 2024
7a5e4eb
.
lucasmcdonald3 Feb 13, 2024
0649995
mock imports
lucasmcdonald3 Feb 13, 2024
6691fa2
refactor, fix
lucasmcdonald3 Feb 20, 2024
3ae1e06
refactor, fix
lucasmcdonald3 Feb 20, 2024
2b5fc72
refactor, fix
lucasmcdonald3 Feb 20, 2024
a940dc5
refactor, fix
lucasmcdonald3 Feb 20, 2024
708ab5e
it works locally but fails on gha
lucasmcdonald3 Feb 20, 2024
ffd295c
it works locally but fails on gha
lucasmcdonald3 Feb 20, 2024
1ba175c
it works locally but fails on gha
lucasmcdonald3 Feb 21, 2024
fa175ba
it works locally but fails on gha
lucasmcdonald3 Feb 21, 2024
2f90a97
it works locally but fails on gha
lucasmcdonald3 Feb 21, 2024
df9215f
it works locally but fails on gha
lucasmcdonald3 Feb 21, 2024
b57e4a3
it works locally but fails on gha
lucasmcdonald3 Feb 21, 2024
9d7ec6d
it works locally but fails on gha
lucasmcdonald3 Feb 21, 2024
2cbc845
it works locally but fails on gha
lucasmcdonald3 Feb 21, 2024
def946d
it works locally but fails on gha
lucasmcdonald3 Feb 21, 2024
dff6ac0
it works locally but fails on gha
lucasmcdonald3 Feb 21, 2024
78f0b0f
it works locally but fails on gha
lucasmcdonald3 Feb 21, 2024
20a469e
it works locally but fails on gha
lucasmcdonald3 Feb 21, 2024
66859a7
fix tests
lucasmcdonald3 Feb 21, 2024
bf8f67c
cleanup
lucasmcdonald3 Feb 21, 2024
b24be11
re-enable test
lucasmcdonald3 Feb 21, 2024
acba1b0
re-enable test
lucasmcdonald3 Feb 21, 2024
42b7b74
longpaths
lucasmcdonald3 Feb 21, 2024
f226e7e
longpaths
lucasmcdonald3 Feb 21, 2024
aa2f80a
debug windows fail
lucasmcdonald3 Feb 21, 2024
bc002b6
debug windows fail
lucasmcdonald3 Feb 21, 2024
8dd0303
debug windows fail
lucasmcdonald3 Feb 21, 2024
1e9db3b
debug windows fail
lucasmcdonald3 Feb 21, 2024
74d4e66
disable windows until pythonpath
lucasmcdonald3 Feb 21, 2024
1bb23e8
expand testing
lucasmcdonald3 Feb 21, 2024
1ee69ce
expand testing
lucasmcdonald3 Feb 21, 2024
b33f2f7
expand testing
lucasmcdonald3 Feb 21, 2024
c582888
expand testing
lucasmcdonald3 Feb 21, 2024
5ae44f5
expand testing
lucasmcdonald3 Feb 21, 2024
cb7e3d1
cleanup
lucasmcdonald3 Feb 21, 2024
b026b53
cleanup
lucasmcdonald3 Feb 21, 2024
50afa3a
cleanup
lucasmcdonald3 Feb 21, 2024
1c612a0
cleanup
lucasmcdonald3 Feb 21, 2024
bcdb4ba
add missing file
lucasmcdonald3 Feb 21, 2024
41fe2f9
add missing file
lucasmcdonald3 Feb 21, 2024
1ba857e
add missing file
lucasmcdonald3 Feb 21, 2024
74bfe12
cleanup
lucasmcdonald3 Feb 21, 2024
b3b9a0f
refactor
lucasmcdonald3 Feb 22, 2024
a594125
refactor
lucasmcdonald3 Feb 22, 2024
fdd2eda
unit tests
lucasmcdonald3 Feb 23, 2024
0138f22
unit tests
lucasmcdonald3 Feb 23, 2024
f213e19
upgrade image
lucasmcdonald3 Feb 23, 2024
d55f296
refactor tests
lucasmcdonald3 Feb 23, 2024
5ec4668
refactor tests
lucasmcdonald3 Feb 23, 2024
61ba4de
refactor tests
lucasmcdonald3 Feb 23, 2024
95c5be6
refactor tests
lucasmcdonald3 Feb 23, 2024
9566873
refactor tests
lucasmcdonald3 Feb 23, 2024
6642083
fix cov
lucasmcdonald3 Feb 23, 2024
51d2804
fix cov
lucasmcdonald3 Feb 23, 2024
51e5db5
fix cov
lucasmcdonald3 Feb 23, 2024
e235461
fix cov
lucasmcdonald3 Feb 23, 2024
e7c745f
fix tests
lucasmcdonald3 Feb 23, 2024
fee4f36
test cleanup
lucasmcdonald3 Feb 24, 2024
ac6471a
test cleanup
lucasmcdonald3 Feb 24, 2024
a5ebc19
isort
lucasmcdonald3 Feb 24, 2024
21f3614
fixes
lucasmcdonald3 Feb 24, 2024
22eabb6
fix
lucasmcdonald3 Feb 24, 2024
ac0ceb3
fix
lucasmcdonald3 Feb 24, 2024
2fd8858
oops
lucasmcdonald3 Feb 24, 2024
51c6a9c
revert
lucasmcdonald3 Feb 24, 2024
800f9de
revert
lucasmcdonald3 Feb 24, 2024
ebcb759
fix
lucasmcdonald3 Feb 24, 2024
cf26ca3
fix
lucasmcdonald3 Feb 24, 2024
7f27ebd
fix
lucasmcdonald3 Feb 24, 2024
00f4721
fix
lucasmcdonald3 Feb 24, 2024
018b93f
fix
lucasmcdonald3 Feb 24, 2024
d413b65
fix
lucasmcdonald3 Feb 24, 2024
c4ca658
copyright
lucasmcdonald3 Feb 24, 2024
d99b666
more unit tests
lucasmcdonald3 Feb 26, 2024
49cb7c8
more unit tests
lucasmcdonald3 Feb 26, 2024
705113a
more unit tests
lucasmcdonald3 Feb 26, 2024
f76d7f9
more unit tests
lucasmcdonald3 Feb 26, 2024
0da2a4f
more unit tests
lucasmcdonald3 Feb 26, 2024
0040b2c
cleanup
lucasmcdonald3 Feb 26, 2024
9131433
cleanup
lucasmcdonald3 Feb 26, 2024
e6826eb
poc impl
lucasmcdonald3 Feb 28, 2024
a9fa1a5
passing
lucasmcdonald3 Feb 28, 2024
4eeb858
cleanup
lucasmcdonald3 Feb 28, 2024
21a8c93
protect
lucasmcdonald3 Feb 29, 2024
de870b8
ex
lucasmcdonald3 Feb 29, 2024
eedf1a3
changes
lucasmcdonald3 Feb 29, 2024
1db73eb
changes
lucasmcdonald3 Feb 29, 2024
8415c2c
cleanup
lucasmcdonald3 Feb 29, 2024
20bdaff
cleanup
lucasmcdonald3 Feb 29, 2024
6bf6094
cleanup
lucasmcdonald3 Feb 29, 2024
febe6db
cleanup
lucasmcdonald3 Feb 29, 2024
dc8abca
cleanup
lucasmcdonald3 Feb 29, 2024
8ff46f4
cleanup
lucasmcdonald3 Feb 29, 2024
aba7ccc
cleanup
lucasmcdonald3 Feb 29, 2024
40fecc0
all message format versions
lucasmcdonald3 Feb 29, 2024
52043b9
sync upstream
lucasmcdonald3 Feb 29, 2024
14c287d
Merge
lucasmcdonald3 Mar 13, 2024
2d26009
Merge branch 'lucmcdon/mpl' into lucmcdon/mpl-requiredec
lucasmcdonald3 Mar 13, 2024
7374fcb
unit tests
lucasmcdonald3 Mar 26, 2024
f9d60a8
lint
lucasmcdonald3 Mar 26, 2024
16725f8
lint
lucasmcdonald3 Mar 26, 2024
1706db2
lint
lucasmcdonald3 Mar 26, 2024
06e0842
lint
lucasmcdonald3 Mar 26, 2024
5ad8e3a
Update examples/src/keyrings/hierarchical_keyring.py
lucasmcdonald3 Apr 15, 2024
280e038
Update examples/src/keyrings/hierarchical_keyring.py
lucasmcdonald3 Apr 16, 2024
5c1b77e
update
lucasmcdonald3 Apr 17, 2024
310b9b8
guard native cx
lucasmcdonald3 Apr 17, 2024
efb261f
fix
lucasmcdonald3 Apr 17, 2024
3cd9bf3
debug
lucasmcdonald3 Apr 17, 2024
7bb939f
cleanup
lucasmcdonald3 Apr 17, 2024
ae46a84
Merge branch 'mpl-reviewed' into lucmcdon/mpl-requiredec
lucasmcdonald3 Apr 23, 2024
18473bd
fix static
lucasmcdonald3 Apr 23, 2024
7544987
fix static
lucasmcdonald3 Apr 23, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 32 additions & 1 deletion examples/src/keyrings/hierarchical_keyring.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,36 @@
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
"""Example showing basic encryption and decryption of a value already in memory."""
"""
This example sets up the Hierarchical Keyring, which establishes a key hierarchy where "branch"
keys are persisted in DynamoDb. These branch keys are used to protect your data keys, and these
branch keys are themselves protected by a KMS Key.

Establishing a key hierarchy like this has two benefits:
First, by caching the branch key material, and only calling KMS to re-establish authentication
regularly according to your configured TTL, you limit how often you need to call KMS to protect
your data. This is a performance security tradeoff, where your authentication, audit, and logging
from KMS is no longer one-to-one with every encrypt or decrypt call. Additionally, KMS Cloudtrail
cannot be used to distinguish Encrypt and Decrypt calls, and you cannot restrict who has
Encryption rights from who has Decryption rights since they both ONLY need KMS:Decrypt. However,
the benefit is that you no longer have to make a network call to KMS for every encrypt or
decrypt.

Second, this key hierarchy facilitates cryptographic isolation of a tenant's data in a
multi-tenant data store. Each tenant can have a unique Branch Key, that is only used to protect
the tenant's data. You can either statically configure a single branch key to ensure you are
restricting access to a single tenant, or you can implement an interface that selects the Branch
Key based on the Encryption Context.

This example demonstrates configuring a Hierarchical Keyring with a Branch Key ID Supplier to
encrypt and decrypt data for two separate tenants.

This example requires access to the DDB Table where you are storing the Branch Keys. This
table must be configured with the following primary key configuration: - Partition key is named
"partition_key" with type (S) - Sort key is named "sort_key" with type (S).

This example also requires using a KMS Key. You need the following access on this key: -
GenerateDataKeyWithoutPlaintext - Decrypt
"""
import sys

import boto3
Expand All @@ -25,6 +55,7 @@

from .example_branch_key_id_supplier import ExampleBranchKeyIdSupplier

# TODO-MPL: Remove this as part of removing PYTHONPATH hacks.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I assume this TODO is not yet TO BE DONE?

Copy link
Contributor Author

@lucasmcdonald3 lucasmcdonald3 Apr 22, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is still TODO. I have to:

  • Update Dafny compiler to support outer-module
  • Update Smithy-Dafny to reference outer-module
  • Update MPL to use outer-module

I'm tracking that work separately.

module_root_dir = '/'.join(__file__.split("/")[:-1])

sys.path.append(module_root_dir)
Expand Down
158 changes: 158 additions & 0 deletions examples/src/keyrings/required_encryption_context_cmm.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
"""
Demonstrate an encrypt/decrypt cycle using a Required Encryption Context CMM.
A required encryption context CMM asks for required keys in the encryption context field
on encrypt such that they will not be stored on the message, but WILL be included in the header signature.
On decrypt, the client MUST supply the key/value pair(s) that were not stored to successfully decrypt the message.
"""
import sys

import boto3
# Ignore missing MPL for pylint, but the MPL is required for this example
# noqa pylint: disable=import-error
from aws_cryptographic_materialproviders.mpl import AwsCryptographicMaterialProviders
from aws_cryptographic_materialproviders.mpl.config import MaterialProvidersConfig
from aws_cryptographic_materialproviders.mpl.models import (
CreateAwsKmsKeyringInput,
CreateDefaultCryptographicMaterialsManagerInput,
CreateRequiredEncryptionContextCMMInput,
)
from aws_cryptographic_materialproviders.mpl.references import ICryptographicMaterialsManager, IKeyring
from typing import Dict, List

import aws_encryption_sdk
from aws_encryption_sdk import CommitmentPolicy
from aws_encryption_sdk.exceptions import AWSEncryptionSDKClientError

# TODO-MPL: Remove this as part of removing PYTHONPATH hacks
module_root_dir = '/'.join(__file__.split("/")[:-1])

sys.path.append(module_root_dir)

EXAMPLE_DATA: bytes = b"Hello World"


def encrypt_and_decrypt_with_keyring(
kms_key_id: str
):
"""Creates a hierarchical keyring using the provided resources, then encrypts and decrypts a string with it."""
# 1. Instantiate the encryption SDK client.
# This builds the client with the REQUIRE_ENCRYPT_REQUIRE_DECRYPT commitment policy,
# which enforces that this client only encrypts using committing algorithm suites and enforces
# that this client will only decrypt encrypted messages that were created with a committing
# algorithm suite.
# This is the default commitment policy if you were to build the client as
# `client = aws_encryption_sdk.EncryptionSDKClient()`.

client = aws_encryption_sdk.EncryptionSDKClient(
commitment_policy=CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT
)

# 2. Create an encryption context.
# Most encrypted data should have an associated encryption context
# to protect integrity. This sample uses placeholder values.
# For more information see:
# blogs.aws.amazon.com/security/post/Tx2LZ6WBJJANTNW/How-to-Protect-the-Integrity-of-Your-Encrypted-Data-by-Using-AWS-Key-Management # noqa: E501
encryption_context: Dict[str, str] = {
"key1": "value1",
"key2": "value2",
"requiredKey1": "requiredValue1",
"requiredKey2": "requiredValue2",
}

# 3. Create list of required encryption context keys.
# This is a list of keys that must be present in the encryption context.
required_encryption_context_keys: List[str] = ["requiredKey1", "requiredKey2"]

# 4. Create the AWS KMS keyring.
mpl: AwsCryptographicMaterialProviders = AwsCryptographicMaterialProviders(
config=MaterialProvidersConfig()
)
keyring_input: CreateAwsKmsKeyringInput = CreateAwsKmsKeyringInput(
kms_key_id=kms_key_id,
kms_client=boto3.client('kms', region_name="us-west-2")
)
kms_keyring: IKeyring = mpl.create_aws_kms_keyring(keyring_input)

# 5. Create the required encryption context CMM.
underlying_cmm: ICryptographicMaterialsManager = \
mpl.create_default_cryptographic_materials_manager(
CreateDefaultCryptographicMaterialsManagerInput(
keyring=kms_keyring
)
)

required_ec_cmm: ICryptographicMaterialsManager = \
mpl.create_required_encryption_context_cmm(
CreateRequiredEncryptionContextCMMInput(
required_encryption_context_keys=required_encryption_context_keys,
underlying_cmm=underlying_cmm,
)
)

# 6. Encrypt the data
ciphertext, _ = client.encrypt(
source=EXAMPLE_DATA,
materials_manager=required_ec_cmm,
encryption_context=encryption_context
)

# 7. Reproduce the encryption context.
# The reproduced encryption context MUST contain a value for
# every key in the configured required encryption context keys during encryption with
# Required Encryption Context CMM.
reproduced_encryption_context: Dict[str, str] = {
"requiredKey1": "requiredValue1",
"requiredKey2": "requiredValue2",
}

# 8. Decrypt the data
plaintext_bytes_A, _ = client.decrypt(
source=ciphertext,
materials_manager=required_ec_cmm,
encryption_context=reproduced_encryption_context
)
assert plaintext_bytes_A == EXAMPLE_DATA

# We can also decrypt using the underlying CMM,
# but must also provide the reproduced encryption context
plaintext_bytes_A, _ = client.decrypt(
source=ciphertext,
materials_manager=underlying_cmm,
encryption_context=reproduced_encryption_context
)
assert plaintext_bytes_A == EXAMPLE_DATA

# 9. Extra: Demonstrate that if we don't provide the reproduced encryption context,
# decryption will fail.
try:
plaintext_bytes_A, _ = client.decrypt(
source=ciphertext,
materials_manager=required_ec_cmm,
# No reproduced encryption context for required EC CMM-produced message makes decryption fail.
)
raise Exception("If this exception is raised, decryption somehow succeeded!")
except AWSEncryptionSDKClientError:
# Swallow specific expected exception.
# We expect decryption to fail with an AWSEncryptionSDKClientError
# since we did not provide reproduced encryption context when decrypting
# a message encrypted with the requried encryption context CMM.
pass

# Same for the default CMM;
# If we don't provide the reproduced encryption context, decryption will fail.
try:
plaintext_bytes_A, _ = client.decrypt(
source=ciphertext,
materials_manager=required_ec_cmm,
# No reproduced encryption context for required EC CMM-produced message makes decryption fail.
)
raise Exception("If this exception is raised, decryption somehow succeeded!")
except AWSEncryptionSDKClientError:
# Swallow specific expected exception.
# We expect decryption to fail with an AWSEncryptionSDKClientError
# since we did not provide reproduced encryption context when decrypting
# a message encrypted with the requried encryption context CMM,
# even though we are using a default CMM on decrypt.
pass
2 changes: 1 addition & 1 deletion examples/test/keyrings/test_i_hierarchical_keyring.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
"""Unit test suite for the hierarchical keyring example."""
"""Test suite for the hierarchical keyring example."""
import pytest

from ...src.keyrings.hierarchical_keyring import encrypt_and_decrypt_with_keyring
Expand Down
13 changes: 13 additions & 0 deletions examples/test/keyrings/test_i_required_encryption_context_cmm.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
"""Test suite for the required encryption context CMM example."""
import pytest

from ...src.keyrings.required_encryption_context_cmm import encrypt_and_decrypt_with_keyring

pytestmark = [pytest.mark.examples]


def test_encrypt_and_decrypt_with_keyring():
key_arn = "arn:aws:kms:us-west-2:658956600833:key/b3537ef1-d8dc-4780-9f5a-55776cbb2f7f"
encrypt_and_decrypt_with_keyring(key_arn)
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ def get_requirements():
license="Apache License 2.0",
install_requires=get_requirements(),
# pylint: disable=fixme
# TODO: Point at PyPI once MPL is released.
# TODO-MPL: Point at PyPI once MPL is released.
# This blocks releasing ESDK-Python MPL integration.
extras_require={
"MPL": ["aws-cryptographic-material-providers @" \
Expand Down
3 changes: 3 additions & 0 deletions src/aws_encryption_sdk/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,9 @@ def decrypt(self, **kwargs):
If source_length is not provided and read() is called, will attempt to seek()
to the end of the stream and tell() to find the length of source data.

:param dict encryption_context: Dictionary defining encryption context to validate
on decrypt. This is ONLY validated on decrypt if using a CMM from the
aws-cryptographic-material-providers library.
:param int max_body_length: Maximum frame size (or content length for non-framed messages)
in bytes to read from ciphertext message.
:returns: Tuple containing the decrypted plaintext and the message header object
Expand Down
Loading