Skip to content

Commit e5f7221

Browse files
committed
adding files for aes and rsa keyring / mkp
1 parent e62cbc2 commit e5f7221

18 files changed

+943
-161
lines changed
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
2+
# SPDX-License-Identifier: Apache-2.0
3+
"""Performance tests for the Raw AES keyring."""
4+
5+
import aws_encryption_sdk
6+
from aws_cryptographic_materialproviders.mpl import AwsCryptographicMaterialProviders
7+
from aws_cryptographic_materialproviders.mpl.config import MaterialProvidersConfig
8+
from aws_cryptographic_materialproviders.mpl.models import AesWrappingAlg, CreateRawAesKeyringInput
9+
from aws_cryptographic_materialproviders.mpl.references import IKeyring
10+
11+
from ..utils.util import PerfTestUtils
12+
13+
14+
def create_keyring():
15+
"""Demonstrate how to create a Raw AES keyring.
16+
17+
Usage: create_keyring()
18+
"""
19+
key_name_space = "Some managed raw keys"
20+
key_name = "My 256-bit AES wrapping key"
21+
22+
# Here, the input to secrets.token_bytes() = 32 bytes = 256 bits
23+
# We fix the static key in order to make the test deterministic
24+
static_key = PerfTestUtils.DEFAULT_AES_256_STATIC_KEY
25+
26+
mat_prov: AwsCryptographicMaterialProviders = AwsCryptographicMaterialProviders(
27+
config=MaterialProvidersConfig()
28+
)
29+
30+
keyring_input: CreateRawAesKeyringInput = CreateRawAesKeyringInput(
31+
key_namespace=key_name_space,
32+
key_name=key_name,
33+
wrapping_key=static_key,
34+
wrapping_alg=AesWrappingAlg.ALG_AES256_GCM_IV12_TAG16
35+
)
36+
37+
keyring: IKeyring = mat_prov.create_raw_aes_keyring(
38+
input=keyring_input
39+
)
40+
41+
return keyring
42+
43+
44+
def encrypt_using_keyring(
45+
plaintext_data: bytes,
46+
keyring: IKeyring
47+
):
48+
"""Demonstrate how to encrypt plaintext data using a Raw AES keyring.
49+
50+
Usage: encrypt_using_keyring(plaintext_data, keyring)
51+
:param plaintext_data: plaintext data you want to encrypt
52+
:type: bytes
53+
:param keyring: Keyring to use for encryption.
54+
:type keyring: IKeyring
55+
"""
56+
client = aws_encryption_sdk.EncryptionSDKClient()
57+
58+
ciphertext_data, _ = client.encrypt(
59+
source=plaintext_data,
60+
keyring=keyring
61+
)
62+
63+
return ciphertext_data
64+
65+
66+
def decrypt_using_keyring(
67+
ciphertext_data: bytes,
68+
keyring: IKeyring
69+
):
70+
"""Demonstrate how to decrypt ciphertext data using a Raw AES keyring.
71+
72+
Usage: decrypt_using_keyring(ciphertext_data, keyring)
73+
:param ciphertext_data: ciphertext data you want to decrypt
74+
:type: bytes
75+
:param keyring: Keyring to use for decryption.
76+
:type keyring: IKeyring
77+
"""
78+
client = aws_encryption_sdk.EncryptionSDKClient()
79+
80+
decrypted_plaintext_data, _ = client.decrypt(
81+
source=ciphertext_data,
82+
keyring=keyring
83+
)
84+
85+
return decrypted_plaintext_data
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
2+
# SPDX-License-Identifier: Apache-2.0
3+
"""Performance tests for the Raw RSA keyring."""
4+
import aws_encryption_sdk
5+
from aws_cryptographic_materialproviders.mpl import AwsCryptographicMaterialProviders
6+
from aws_cryptographic_materialproviders.mpl.config import MaterialProvidersConfig
7+
from aws_cryptographic_materialproviders.mpl.models import CreateRawRsaKeyringInput, PaddingScheme
8+
from aws_cryptographic_materialproviders.mpl.references import IKeyring
9+
10+
11+
def create_keyring(public_key, private_key):
12+
"""Demonstrate how to create a Raw RSA keyring using the key pair.
13+
14+
Usage: create_keyring(public_key, private_key)
15+
"""
16+
key_name_space = "Some managed raw keys"
17+
key_name = "My 4096-bit RSA wrapping key"
18+
19+
mat_prov: AwsCryptographicMaterialProviders = AwsCryptographicMaterialProviders(
20+
config=MaterialProvidersConfig()
21+
)
22+
23+
keyring_input: CreateRawRsaKeyringInput = CreateRawRsaKeyringInput(
24+
key_namespace=key_name_space,
25+
key_name=key_name,
26+
padding_scheme=PaddingScheme.OAEP_SHA256_MGF1,
27+
public_key=public_key,
28+
private_key=private_key
29+
)
30+
31+
keyring: IKeyring = mat_prov.create_raw_rsa_keyring(
32+
input=keyring_input
33+
)
34+
35+
return keyring
36+
37+
38+
def encrypt_using_keyring(
39+
plaintext_data: bytes,
40+
keyring: IKeyring
41+
):
42+
"""Demonstrate how to encrypt plaintext data using a Raw RSA keyring.
43+
44+
Usage: encrypt_using_keyring(plaintext_data, keyring)
45+
:param plaintext_data: plaintext data you want to encrypt
46+
:type: bytes
47+
:param keyring: Keyring to use for encryption.
48+
:type keyring: IKeyring
49+
"""
50+
client = aws_encryption_sdk.EncryptionSDKClient()
51+
52+
ciphertext_data, _ = client.encrypt(
53+
source=plaintext_data,
54+
keyring=keyring
55+
)
56+
57+
return ciphertext_data
58+
59+
60+
def decrypt_using_keyring(
61+
ciphertext_data: bytes,
62+
keyring: IKeyring
63+
):
64+
"""Demonstrate how to decrypt ciphertext data using a Raw RSA keyring.
65+
66+
Usage: decrypt_using_keyring(ciphertext_data, keyring)
67+
:param ciphertext_data: ciphertext data you want to decrypt
68+
:type: bytes
69+
:param keyring: Keyring to use for decryption.
70+
:type keyring: IKeyring
71+
"""
72+
client = aws_encryption_sdk.EncryptionSDKClient()
73+
74+
decrypted_plaintext_data, _ = client.decrypt(
75+
source=ciphertext_data,
76+
keyring=keyring
77+
)
78+
79+
return decrypted_plaintext_data
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
2+
# SPDX-License-Identifier: Apache-2.0
3+
"""Performance tests for the Raw AES master key provider."""
4+
5+
import aws_encryption_sdk
6+
from aws_encryption_sdk.identifiers import EncryptionKeyType, WrappingAlgorithm
7+
from aws_encryption_sdk.internal.crypto.wrapping_keys import WrappingKey
8+
from aws_encryption_sdk.key_providers.raw import RawMasterKeyProvider
9+
10+
from ..utils.util import PerfTestUtils
11+
12+
13+
class StaticRandomMasterKeyProvider(RawMasterKeyProvider):
14+
"""Generates 256-bit keys for each unique key ID."""
15+
16+
# The Provider ID (or Provider) field in the JceMasterKey and RawMasterKey is
17+
# equivalent to key namespace in the Raw keyrings
18+
provider_id = "Some managed raw keys"
19+
20+
def __init__(self, **kwargs): # pylint: disable=unused-argument
21+
"""Initialize empty map of keys."""
22+
self._static_keys = {}
23+
24+
def _get_raw_key(self, key_id):
25+
"""Returns a static, randomly-generated symmetric key for the specified key ID.
26+
27+
:param str key_id: Key ID
28+
:returns: Wrapping key that contains the specified static key
29+
:rtype: :class:`aws_encryption_sdk.internal.crypto.WrappingKey`
30+
"""
31+
try:
32+
static_key = self._static_keys[key_id]
33+
except KeyError:
34+
# We fix the static key in order to make the test deterministic
35+
# In practice, you should get this key from a secure key management system such as an HSM.
36+
static_key = PerfTestUtils.DEFAULT_AES_256_STATIC_KEY
37+
self._static_keys[key_id] = static_key
38+
return WrappingKey(
39+
wrapping_algorithm=WrappingAlgorithm.AES_256_GCM_IV12_TAG16_NO_PADDING,
40+
wrapping_key=static_key,
41+
wrapping_key_type=EncryptionKeyType.SYMMETRIC,
42+
)
43+
44+
45+
def create_key_provider():
46+
"""Demonstrate how to create a Raw AES master key-provider.
47+
48+
Usage: create_key_provider()
49+
"""
50+
# Create a Raw AES master key-provider.
51+
52+
# The Key ID field in the JceMasterKey and RawMasterKey is equivalent to key name in the Raw keyrings
53+
key_id = "My 256-bit AES wrapping key"
54+
key_provider = StaticRandomMasterKeyProvider()
55+
key_provider.add_master_key(key_id)
56+
57+
return key_provider
58+
59+
60+
def encrypt_using_key_provider(
61+
plaintext_data: bytes,
62+
key_provider: aws_encryption_sdk.key_providers.base.MasterKeyProvider
63+
):
64+
"""Demonstrate how to encrypt plaintext data using a Raw AES master key-provider.
65+
66+
Usage: encrypt_using_key_provider(plaintext_data, key_provider)
67+
:param plaintext_data: plaintext data you want to encrypt
68+
:type: bytes
69+
:param key_provider: Master key provider to use for encryption.
70+
:type key_provider: aws_encryption_sdk.key_providers.base.MasterKeyProvider
71+
"""
72+
client = aws_encryption_sdk.EncryptionSDKClient()
73+
74+
ciphertext_data, _ = client.encrypt(
75+
source=plaintext_data,
76+
key_provider=key_provider
77+
)
78+
79+
return ciphertext_data
80+
81+
82+
def decrypt_using_key_provider(
83+
ciphertext_data: bytes,
84+
key_provider: aws_encryption_sdk.key_providers.base.MasterKeyProvider
85+
):
86+
"""Demonstrate how to decrypt ciphertext data using a Raw AES master key-provider.
87+
88+
Usage: decrypt_using_key_provider(ciphertext_data, key_provider)
89+
:param ciphertext_data: ciphertext data you want to decrypt
90+
:type: bytes
91+
:param key_provider: Master key provider to use for decryption.
92+
:type key_provider: aws_encryption_sdk.key_providers.base.MasterKeyProvider
93+
"""
94+
client = aws_encryption_sdk.EncryptionSDKClient()
95+
96+
decrypted_plaintext_data, _ = client.decrypt(
97+
source=ciphertext_data,
98+
key_provider=key_provider
99+
)
100+
101+
return decrypted_plaintext_data
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
2+
# SPDX-License-Identifier: Apache-2.0
3+
"""Performance tests for the Raw RSA master key provider."""
4+
5+
import aws_encryption_sdk
6+
from aws_encryption_sdk.identifiers import EncryptionKeyType, WrappingAlgorithm
7+
from aws_encryption_sdk.internal.crypto.wrapping_keys import WrappingKey
8+
from aws_encryption_sdk.key_providers.raw import RawMasterKeyProvider
9+
10+
from aws_encryption_sdk_performance_tests.utils.util import PerfTestUtils
11+
12+
13+
class StaticRandomMasterKeyProvider(RawMasterKeyProvider):
14+
"""Randomly generates and provides 4096-bit RSA keys consistently per unique key id."""
15+
16+
# The Provider ID (or Provider) field in the JceMasterKey and RawMasterKey is
17+
# equivalent to key namespace in the Raw keyrings
18+
provider_id = "Some managed raw keys"
19+
20+
def __init__(self, **kwargs): # pylint: disable=unused-argument
21+
"""Initialize empty map of keys."""
22+
self._static_keys = {}
23+
24+
def _get_raw_key(self, key_id):
25+
"""Retrieves a static, randomly generated, RSA key for the specified key id.
26+
27+
:param str key_id: User-defined ID for the static key
28+
:returns: Wrapping key that contains the specified static key
29+
:rtype: :class:`aws_encryption_sdk.internal.crypto.WrappingKey`
30+
"""
31+
try:
32+
static_key = self._static_keys[key_id]
33+
except KeyError:
34+
# We fix the static key in order to make the test deterministic
35+
# In practice, you should get this key from a secure key management system such as an HSM.
36+
static_key = PerfTestUtils.DEFAULT_RSA_PRIVATE_KEY
37+
self._static_keys[key_id] = static_key
38+
return WrappingKey(
39+
wrapping_algorithm=WrappingAlgorithm.RSA_OAEP_SHA256_MGF1,
40+
wrapping_key=static_key,
41+
wrapping_key_type=EncryptionKeyType.PRIVATE,
42+
)
43+
44+
45+
def create_key_provider():
46+
"""Demonstrate how to create a Raw RSA master key-provider.
47+
48+
Usage: create_key_provider()
49+
"""
50+
# Create a Raw RSA master key-provider.
51+
52+
# The Key ID field in the JceMasterKey and RawMasterKey is equivalent to key name in the Raw keyrings
53+
key_id = "My 4096-bit RSA wrapping key"
54+
key_provider = StaticRandomMasterKeyProvider()
55+
key_provider.add_master_key(key_id)
56+
57+
return key_provider
58+
59+
60+
def encrypt_using_key_provider(
61+
plaintext_data: bytes,
62+
key_provider: aws_encryption_sdk.key_providers.base.MasterKeyProvider
63+
):
64+
"""Demonstrate how to encrypt plaintext data using a Raw RSA master key-provider.
65+
66+
Usage: encrypt_using_key_provider(plaintext_data, key_provider)
67+
:param plaintext_data: plaintext data you want to encrypt
68+
:type: bytes
69+
:param key_provider: Master key provider to use for encryption.
70+
:type key_provider: aws_encryption_sdk.key_providers.base.MasterKeyProvider
71+
"""
72+
client = aws_encryption_sdk.EncryptionSDKClient()
73+
74+
ciphertext_data, _ = client.encrypt(
75+
source=plaintext_data,
76+
key_provider=key_provider
77+
)
78+
79+
return ciphertext_data
80+
81+
82+
def decrypt_using_key_provider(
83+
ciphertext_data: bytes,
84+
key_provider: aws_encryption_sdk.key_providers.base.MasterKeyProvider
85+
):
86+
"""Demonstrate how to decrypt ciphertext data using a Raw RSA master key-provider.
87+
88+
Usage: decrypt_using_key_provider(ciphertext_data, key_provider)
89+
:param ciphertext_data: ciphertext data you want to decrypt
90+
:type: bytes
91+
:param key_provider: Master key provider to use for decryption.
92+
:type key_provider: aws_encryption_sdk.key_providers.base.MasterKeyProvider
93+
"""
94+
client = aws_encryption_sdk.EncryptionSDKClient()
95+
96+
decrypted_plaintext_data, _ = client.decrypt(
97+
source=ciphertext_data,
98+
key_provider=key_provider
99+
)
100+
101+
return decrypted_plaintext_data

0 commit comments

Comments
 (0)