-
Notifications
You must be signed in to change notification settings - Fork 86
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
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 53c46ec
cleanup
lucasmcdonald3 3f5a503
add
lucasmcdonald3 16cf5c1
changes, cleanup:
lucasmcdonald3 5b5aa07
changes, cleanup
lucasmcdonald3 03e19ca
flake8
lucasmcdonald3 b5d3327
flake8
lucasmcdonald3 b13cd19
flake8
lucasmcdonald3 51065cb
flake8
lucasmcdonald3 fc4d254
flake8
lucasmcdonald3 a8e52d3
fix pem/der
lucasmcdonald3 6f55047
fix pem/der
lucasmcdonald3 1b1b4e4
debug
lucasmcdonald3 38a4cc9
debug
lucasmcdonald3 0cd0e23
fix
lucasmcdonald3 44826a2
fix
lucasmcdonald3 02e9f84
fix
lucasmcdonald3 a3babfd
linter
lucasmcdonald3 d2c974a
linter
lucasmcdonald3 55b24a8
isort
lucasmcdonald3 7e5fa48
flake8 examples
lucasmcdonald3 055deab
isort + flake8
lucasmcdonald3 6cf01d4
flake8/pylint examples
lucasmcdonald3 00cfed1
reset tests
lucasmcdonald3 61bbb3b
extend mpl
lucasmcdonald3 4d53ad6
mpl gha
lucasmcdonald3 c1736d3
debug
lucasmcdonald3 9991789
debug
lucasmcdonald3 a501e8f
debug
lucasmcdonald3 6eb8f82
debug
lucasmcdonald3 5ccfa0c
codebuild mpl
lucasmcdonald3 5e7ec9b
codebuild mpl
lucasmcdonald3 cc48697
codebuild mpl
lucasmcdonald3 fae43d1
codebuild mpl
lucasmcdonald3 2637616
debug
lucasmcdonald3 2694932
debug
lucasmcdonald3 f674d3e
debug
lucasmcdonald3 0b5e655
debug
lucasmcdonald3 831df17
debug
lucasmcdonald3 477e3a0
debug
lucasmcdonald3 166c5ab
debug
lucasmcdonald3 7ac8880
debug
lucasmcdonald3 8193c25
Merge branch 'master' into lucmcdon/mpl
lucasmcdonald3 7e3ca15
fix
lucasmcdonald3 4c6a1d0
fix
lucasmcdonald3 e2e1858
fix
lucasmcdonald3 c790011
mpl
lucasmcdonald3 33ace58
fix
lucasmcdonald3 cbf2cdf
fix
lucasmcdonald3 b259477
fix
lucasmcdonald3 9d52cf2
.
lucasmcdonald3 31b7616
debug tox mpl keystore env
lucasmcdonald3 353b8cf
debug tox mpl keystore env
lucasmcdonald3 fb64d95
debug tox mpl keystore env
lucasmcdonald3 916ae8e
debug tox mpl keystore env
lucasmcdonald3 222b135
debug tox mpl keystore env
lucasmcdonald3 cab6016
some unit tests
lucasmcdonald3 a7416b1
add mpl coverage
lucasmcdonald3 7b3dc5f
.
lucasmcdonald3 7a5e4eb
.
lucasmcdonald3 0649995
mock imports
lucasmcdonald3 6691fa2
refactor, fix
lucasmcdonald3 3ae1e06
refactor, fix
lucasmcdonald3 2b5fc72
refactor, fix
lucasmcdonald3 a940dc5
refactor, fix
lucasmcdonald3 708ab5e
it works locally but fails on gha
lucasmcdonald3 ffd295c
it works locally but fails on gha
lucasmcdonald3 1ba175c
it works locally but fails on gha
lucasmcdonald3 fa175ba
it works locally but fails on gha
lucasmcdonald3 2f90a97
it works locally but fails on gha
lucasmcdonald3 df9215f
it works locally but fails on gha
lucasmcdonald3 b57e4a3
it works locally but fails on gha
lucasmcdonald3 9d7ec6d
it works locally but fails on gha
lucasmcdonald3 2cbc845
it works locally but fails on gha
lucasmcdonald3 def946d
it works locally but fails on gha
lucasmcdonald3 dff6ac0
it works locally but fails on gha
lucasmcdonald3 78f0b0f
it works locally but fails on gha
lucasmcdonald3 20a469e
it works locally but fails on gha
lucasmcdonald3 66859a7
fix tests
lucasmcdonald3 bf8f67c
cleanup
lucasmcdonald3 b24be11
re-enable test
lucasmcdonald3 acba1b0
re-enable test
lucasmcdonald3 42b7b74
longpaths
lucasmcdonald3 f226e7e
longpaths
lucasmcdonald3 aa2f80a
debug windows fail
lucasmcdonald3 bc002b6
debug windows fail
lucasmcdonald3 8dd0303
debug windows fail
lucasmcdonald3 1e9db3b
debug windows fail
lucasmcdonald3 74d4e66
disable windows until pythonpath
lucasmcdonald3 1bb23e8
expand testing
lucasmcdonald3 1ee69ce
expand testing
lucasmcdonald3 b33f2f7
expand testing
lucasmcdonald3 c582888
expand testing
lucasmcdonald3 5ae44f5
expand testing
lucasmcdonald3 cb7e3d1
cleanup
lucasmcdonald3 b026b53
cleanup
lucasmcdonald3 50afa3a
cleanup
lucasmcdonald3 1c612a0
cleanup
lucasmcdonald3 bcdb4ba
add missing file
lucasmcdonald3 41fe2f9
add missing file
lucasmcdonald3 1ba857e
add missing file
lucasmcdonald3 74bfe12
cleanup
lucasmcdonald3 b3b9a0f
refactor
lucasmcdonald3 a594125
refactor
lucasmcdonald3 fdd2eda
unit tests
lucasmcdonald3 0138f22
unit tests
lucasmcdonald3 f213e19
upgrade image
lucasmcdonald3 d55f296
refactor tests
lucasmcdonald3 5ec4668
refactor tests
lucasmcdonald3 61ba4de
refactor tests
lucasmcdonald3 95c5be6
refactor tests
lucasmcdonald3 9566873
refactor tests
lucasmcdonald3 6642083
fix cov
lucasmcdonald3 51d2804
fix cov
lucasmcdonald3 51e5db5
fix cov
lucasmcdonald3 e235461
fix cov
lucasmcdonald3 e7c745f
fix tests
lucasmcdonald3 fee4f36
test cleanup
lucasmcdonald3 ac6471a
test cleanup
lucasmcdonald3 a5ebc19
isort
lucasmcdonald3 21f3614
fixes
lucasmcdonald3 22eabb6
fix
lucasmcdonald3 ac0ceb3
fix
lucasmcdonald3 2fd8858
oops
lucasmcdonald3 51c6a9c
revert
lucasmcdonald3 800f9de
revert
lucasmcdonald3 ebcb759
fix
lucasmcdonald3 cf26ca3
fix
lucasmcdonald3 7f27ebd
fix
lucasmcdonald3 00f4721
fix
lucasmcdonald3 018b93f
fix
lucasmcdonald3 d413b65
fix
lucasmcdonald3 c4ca658
copyright
lucasmcdonald3 d99b666
more unit tests
lucasmcdonald3 49cb7c8
more unit tests
lucasmcdonald3 705113a
more unit tests
lucasmcdonald3 f76d7f9
more unit tests
lucasmcdonald3 0da2a4f
more unit tests
lucasmcdonald3 0040b2c
cleanup
lucasmcdonald3 9131433
cleanup
lucasmcdonald3 e6826eb
poc impl
lucasmcdonald3 a9fa1a5
passing
lucasmcdonald3 4eeb858
cleanup
lucasmcdonald3 21a8c93
protect
lucasmcdonald3 de870b8
ex
lucasmcdonald3 eedf1a3
changes
lucasmcdonald3 1db73eb
changes
lucasmcdonald3 8415c2c
cleanup
lucasmcdonald3 20bdaff
cleanup
lucasmcdonald3 6bf6094
cleanup
lucasmcdonald3 febe6db
cleanup
lucasmcdonald3 dc8abca
cleanup
lucasmcdonald3 8ff46f4
cleanup
lucasmcdonald3 aba7ccc
cleanup
lucasmcdonald3 40fecc0
all message format versions
lucasmcdonald3 52043b9
sync upstream
lucasmcdonald3 14c287d
Merge
lucasmcdonald3 2d26009
Merge branch 'lucmcdon/mpl' into lucmcdon/mpl-requiredec
lucasmcdonald3 7374fcb
unit tests
lucasmcdonald3 f9d60a8
lint
lucasmcdonald3 16725f8
lint
lucasmcdonald3 1706db2
lint
lucasmcdonald3 06e0842
lint
lucasmcdonald3 5ad8e3a
Update examples/src/keyrings/hierarchical_keyring.py
lucasmcdonald3 280e038
Update examples/src/keyrings/hierarchical_keyring.py
lucasmcdonald3 5c1b77e
update
lucasmcdonald3 310b9b8
guard native cx
lucasmcdonald3 efb261f
fix
lucasmcdonald3 3cd9bf3
debug
lucasmcdonald3 7bb939f
cleanup
lucasmcdonald3 ae46a84
Merge branch 'mpl-reviewed' into lucmcdon/mpl-requiredec
lucasmcdonald3 18473bd
fix static
lucasmcdonald3 7544987
fix static
lucasmcdonald3 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
158 changes: 158 additions & 0 deletions
158
examples/src/keyrings/required_encryption_context_cmm.py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
13 changes: 13 additions & 0 deletions
13
examples/test/keyrings/test_i_required_encryption_context_cmm.py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
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?
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
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:
I'm tracking that work separately.