-
Notifications
You must be signed in to change notification settings - Fork 86
docs: add master key provider examples #236
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
7 commits
Select commit
Hold shift + click to select a range
cbfe9b0
docs: add raw AES MKP example
mattsb42-aws 97c60ba
docs: add raw RSA MKP example
mattsb42-aws d6b86c7
docs: add KMS MK/P examples
mattsb42-aws 1a01d32
docs: add MKP combination example
mattsb42-aws 8fb2741
docs: apply suggestions from code review
mattsb42-aws 0de7cdc
docs: revise MKP examples intro
mattsb42-aws c5d3a94
docs: add MKP examples to readme map
mattsb42-aws 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
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. | ||
# SPDX-License-Identifier: Apache-2.0 | ||
""" | ||
Master key provider examples. | ||
|
||
These examples show how to use master key providers. | ||
""" |
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,7 @@ | ||
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. | ||
# SPDX-License-Identifier: Apache-2.0 | ||
""" | ||
AWS KMS master key provider examples. | ||
|
||
These examples show how to use the KMS master key provider. | ||
""" |
71 changes: 71 additions & 0 deletions
71
examples/src/master_key_provider/aws_kms/discovery_decrypt.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,71 @@ | ||
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. | ||
# SPDX-License-Identifier: Apache-2.0 | ||
""" | ||
This example is intended to serve as reference material for users migrating away from master key providers. | ||
We recommend using keyrings rather than master key providers. | ||
For examples using keyrings, see the ``examples/src/keyrings`` directory. | ||
|
||
The KMS master key provider uses any key IDs that you specify on encrypt, | ||
but attempts to decrypt *any* data keys that were encrypted under a KMS CMK. | ||
This means that you do not need to know which CMKs were used to encrypt a message. | ||
|
||
This example shows how to configure and use a KMS master key provider to decrypt without provider key IDs. | ||
|
||
https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/concepts.html#master-key-provider | ||
|
||
For an example of how to use the KMS master key with a single CMK, | ||
see the ``master_key_provider/aws_kms/single_cmk`` example. | ||
|
||
For an example of how to use the KMS master key provider with CMKs in multiple regions, | ||
see the ``master_key_provider/aws_kms/multiple_regions`` example. | ||
""" | ||
import aws_encryption_sdk | ||
from aws_encryption_sdk.key_providers.kms import KMSMasterKey, KMSMasterKeyProvider | ||
|
||
|
||
def run(aws_kms_cmk, source_plaintext): | ||
# type: (str, bytes) -> None | ||
"""Demonstrate configuring a KMS master key provider for decryption. | ||
|
||
:param str aws_kms_cmk: The ARN of an AWS KMS CMK that protects data keys | ||
:param bytes source_plaintext: Plaintext to encrypt | ||
""" | ||
# Prepare your encryption context. | ||
# https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/concepts.html#encryption-context | ||
encryption_context = { | ||
"encryption": "context", | ||
"is not": "secret", | ||
"but adds": "useful metadata", | ||
"that can help you": "be confident that", | ||
"the data you are handling": "is what you think it is", | ||
} | ||
|
||
# Create the master key that determines how your data keys are protected. | ||
encrypt_master_key = KMSMasterKey(key_id=aws_kms_cmk) | ||
|
||
# Create a KMS master key provider to use on decrypt. | ||
decrypt_master_key_provider = KMSMasterKeyProvider() | ||
|
||
# Encrypt your plaintext data. | ||
ciphertext, _encrypt_header = aws_encryption_sdk.encrypt( | ||
source=source_plaintext, encryption_context=encryption_context, key_provider=encrypt_master_key | ||
) | ||
|
||
# Demonstrate that the ciphertext and plaintext are different. | ||
assert ciphertext != source_plaintext | ||
|
||
# Decrypt your encrypted data using the KMS master key provider. | ||
# | ||
# You do not need to specify the encryption context on decrypt | ||
# because the header of the encrypted message includes the encryption context. | ||
decrypted, decrypt_header = aws_encryption_sdk.decrypt(source=ciphertext, key_provider=decrypt_master_key_provider) | ||
|
||
# Demonstrate that the decrypted plaintext is identical to the original plaintext. | ||
assert decrypted == source_plaintext | ||
|
||
# Verify that the encryption context used in the decrypt operation includes | ||
# the encryption context that you specified when encrypting. | ||
# The AWS Encryption SDK can add pairs, so don't require an exact match. | ||
# | ||
# In production, always use a meaningful encryption context. | ||
assert set(encryption_context.items()) <= set(decrypt_header.encryption_context.items()) |
91 changes: 91 additions & 0 deletions
91
examples/src/master_key_provider/aws_kms/multiple_regions.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,91 @@ | ||
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. | ||
# SPDX-License-Identifier: Apache-2.0 | ||
""" | ||
This example is intended to serve as reference material for users migrating away from master key providers. | ||
We recommend using keyrings rather than master key providers. | ||
For examples using keyrings, see the ``examples/src/keyrings`` directory. | ||
|
||
This example shows how to configure and use a KMS master key provider with with CMKs in multiple regions. | ||
|
||
https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/concepts.html#master-key-provider | ||
|
||
For an example of how to use the KMS master key with a single CMK, | ||
see the ``master_key_provider/aws_kms/single_cmk`` example. | ||
|
||
For an example of how to use the KMS master key provider in discovery mode on decrypt, | ||
see the ``master_key_provider/aws_kms/discovery_decrypt`` example. | ||
""" | ||
import aws_encryption_sdk | ||
from aws_encryption_sdk.key_providers.kms import KMSMasterKey, KMSMasterKeyProvider | ||
|
||
try: # Python 3.5.0 and 3.5.1 have incompatible typing modules | ||
from typing import Sequence # noqa pylint: disable=unused-import | ||
except ImportError: # pragma: no cover | ||
# We only actually need these imports when running the mypy checks | ||
pass | ||
|
||
|
||
def run(aws_kms_generator_cmk, aws_kms_additional_cmks, source_plaintext): | ||
# type: (str, Sequence[str], bytes) -> None | ||
"""Demonstrate an encrypt/decrypt cycle using a KMS master key provider with CMKs in multiple regions. | ||
|
||
:param str aws_kms_generator_cmk: The ARN of the primary AWS KMS CMK | ||
:param List[str] aws_kms_additional_cmks: Additional ARNs of secondary KMS CMKs | ||
:param bytes source_plaintext: Plaintext to encrypt | ||
""" | ||
# Prepare your encryption context. | ||
# https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/concepts.html#encryption-context | ||
encryption_context = { | ||
"encryption": "context", | ||
"is not": "secret", | ||
"but adds": "useful metadata", | ||
"that can help you": "be confident that", | ||
"the data you are handling": "is what you think it is", | ||
} | ||
|
||
# Create the master key provider that will encrypt your data keys under all requested CMKs. | ||
# | ||
# The KMS master key provider generates the data key using the first key ID in the list. | ||
key_ids = [aws_kms_generator_cmk] | ||
key_ids.extend(aws_kms_additional_cmks) | ||
master_key_provider = KMSMasterKeyProvider(key_ids=key_ids) | ||
|
||
# Create master keys that each only use one of the CMKs. | ||
# We will use these later to demonstrate that any of the CMKs can be used to decrypt the message. | ||
single_cmk_master_key_that_generated = KMSMasterKey(key_id=aws_kms_generator_cmk) | ||
single_cmk_master_key_that_encrypted = KMSMasterKey(key_id=aws_kms_additional_cmks[0]) | ||
|
||
# Encrypt your plaintext data using the master key provider that uses all requests CMKs. | ||
ciphertext, encrypt_header = aws_encryption_sdk.encrypt( | ||
source=source_plaintext, encryption_context=encryption_context, key_provider=master_key_provider | ||
) | ||
|
||
# Verify that the header contains the expected number of encrypted data keys (EDKs). | ||
# It should contain one EDK for each CMK. | ||
assert len(encrypt_header.encrypted_data_keys) == len(aws_kms_additional_cmks) + 1 | ||
|
||
# Demonstrate that the ciphertext and plaintext are different. | ||
assert ciphertext != source_plaintext | ||
|
||
# Decrypt your encrypted data separately using the single-CMK master keys. | ||
# | ||
# You do not need to specify the encryption context on decrypt | ||
# because the header of the encrypted message includes the encryption context. | ||
decrypted_1, decrypt_header_1 = aws_encryption_sdk.decrypt( | ||
source=ciphertext, key_provider=single_cmk_master_key_that_generated | ||
) | ||
decrypted_2, decrypt_header_2 = aws_encryption_sdk.decrypt( | ||
source=ciphertext, key_provider=single_cmk_master_key_that_encrypted | ||
) | ||
|
||
# Demonstrate that the decrypted plaintext is identical to the original plaintext. | ||
assert decrypted_1 == source_plaintext | ||
assert decrypted_2 == source_plaintext | ||
|
||
# Verify that the encryption context used in the decrypt operation includes | ||
# the encryption context that you specified when encrypting. | ||
# The AWS Encryption SDK can add pairs, so don't require an exact match. | ||
# | ||
# In production, always use a meaningful encryption context. | ||
assert set(encryption_context.items()) <= set(decrypt_header_1.encryption_context.items()) | ||
assert set(encryption_context.items()) <= set(decrypt_header_2.encryption_context.items()) |
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,64 @@ | ||
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. | ||
# SPDX-License-Identifier: Apache-2.0 | ||
""" | ||
This example is intended to serve as reference material for users migrating away from master key providers. | ||
We recommend using keyrings rather than master key providers. | ||
For examples using keyrings, see the ``examples/src/keyrings`` directory. | ||
|
||
This example shows how to configure and use a KMS master key with a single KMS CMK. | ||
|
||
https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/concepts.html#master-key-provider | ||
|
||
For an example of how to use the KMS master key provider with CMKs in multiple regions, | ||
see the ``master_key_provider/aws_kms/multiple_regions`` example. | ||
|
||
For an example of how to use the KMS master key provider in discovery mode on decrypt, | ||
see the ``master_key_provider/aws_kms/discovery_decrypt`` example. | ||
""" | ||
import aws_encryption_sdk | ||
from aws_encryption_sdk.key_providers.kms import KMSMasterKey | ||
|
||
|
||
def run(aws_kms_cmk, source_plaintext): | ||
# type: (str, bytes) -> None | ||
"""Demonstrate an encrypt/decrypt cycle using a KMS master key with a single CMK. | ||
|
||
:param str aws_kms_cmk: The ARN of an AWS KMS CMK that protects data keys | ||
:param bytes source_plaintext: Plaintext to encrypt | ||
""" | ||
# Prepare your encryption context. | ||
# https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/concepts.html#encryption-context | ||
encryption_context = { | ||
"encryption": "context", | ||
"is not": "secret", | ||
"but adds": "useful metadata", | ||
"that can help you": "be confident that", | ||
"the data you are handling": "is what you think it is", | ||
} | ||
|
||
# Create the master key that determines how your data keys are protected. | ||
master_key = KMSMasterKey(key_id=aws_kms_cmk) | ||
|
||
# Encrypt your plaintext data. | ||
ciphertext, _encrypt_header = aws_encryption_sdk.encrypt( | ||
source=source_plaintext, encryption_context=encryption_context, key_provider=master_key | ||
) | ||
|
||
# Demonstrate that the ciphertext and plaintext are different. | ||
assert ciphertext != source_plaintext | ||
|
||
# Decrypt your encrypted data using the same master key you used on encrypt. | ||
# | ||
# You do not need to specify the encryption context on decrypt | ||
# because the header of the encrypted message includes the encryption context. | ||
decrypted, decrypt_header = aws_encryption_sdk.decrypt(source=ciphertext, key_provider=master_key) | ||
|
||
# Demonstrate that the decrypted plaintext is identical to the original plaintext. | ||
assert decrypted == source_plaintext | ||
|
||
# Verify that the encryption context used in the decrypt operation includes | ||
# the encryption context that you specified when encrypting. | ||
# The AWS Encryption SDK can add pairs, so don't require an exact match. | ||
# | ||
# In production, always use a meaningful encryption context. | ||
assert set(encryption_context.items()) <= set(decrypt_header.encryption_context.items()) |
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,7 @@ | ||
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. | ||
# SPDX-License-Identifier: Apache-2.0 | ||
""" | ||
Multi-master key provider examples. | ||
|
||
These examples show how to combine master key providers. | ||
""" |
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.
Uh oh!
There was an error while loading. Please reload this page.