Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 5ea31f5

Browse files
RitvikKapilalucasmcdonald3
authored andcommittedAug 6, 2024
chore(performance_tests): added hierarchy keyring and caching cmm tests (#686)
1 parent e75fe70 commit 5ea31f5

20 files changed

+588
-21
lines changed
 
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
2+
# SPDX-License-Identifier: Apache-2.0
3+
"""Performance tests for the hierarchy keyring."""
4+
5+
import aws_encryption_sdk
6+
import boto3
7+
from aws_cryptographic_materialproviders.keystore import KeyStore
8+
from aws_cryptographic_materialproviders.keystore.config import KeyStoreConfig
9+
from aws_cryptographic_materialproviders.keystore.models import KMSConfigurationKmsKeyArn
10+
from aws_cryptographic_materialproviders.mpl import AwsCryptographicMaterialProviders
11+
from aws_cryptographic_materialproviders.mpl.config import MaterialProvidersConfig
12+
from aws_cryptographic_materialproviders.mpl.models import (
13+
CacheTypeDefault,
14+
CreateAwsKmsHierarchicalKeyringInput,
15+
DefaultCache,
16+
)
17+
from aws_cryptographic_materialproviders.mpl.references import IKeyring
18+
19+
from ..utils.util import PerfTestUtils
20+
21+
22+
def create_keyring(
23+
key_store_table_name: str,
24+
logical_key_store_name: str,
25+
kms_key_id: str,
26+
branch_key_id: str = PerfTestUtils.DEFAULT_BRANCH_KEY_ID
27+
):
28+
"""Demonstrate how to create a hierarchy keyring.
29+
30+
Usage: create_keyring(key_store_table_name, logical_key_store_name, kms_key_id, branch_key_id)
31+
:param key_store_table_name: Name of the KeyStore DynamoDB table.
32+
:type key_store_table_name: string
33+
:param logical_key_store_name: Logical name of the KeyStore.
34+
:type logical_key_store_name: string
35+
:param kms_key_id: KMS Key identifier for the KMS key you want to use.
36+
:type kms_key_id: string
37+
:param branch_key_id: Branch key you want to use for the hierarchy keyring.
38+
:type branch_key_id: string
39+
40+
For more information on KMS Key identifiers, see
41+
https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id
42+
"""
43+
# Create boto3 clients for DynamoDB and KMS.
44+
ddb_client = boto3.client('dynamodb', region_name="us-west-2")
45+
kms_client = boto3.client('kms', region_name="us-west-2")
46+
47+
# Configure your KeyStore resource.
48+
# This SHOULD be the same configuration that you used
49+
# to initially create and populate your KeyStore.
50+
keystore: KeyStore = KeyStore(
51+
config=KeyStoreConfig(
52+
ddb_client=ddb_client,
53+
ddb_table_name=key_store_table_name,
54+
logical_key_store_name=logical_key_store_name,
55+
kms_client=kms_client,
56+
kms_configuration=KMSConfigurationKmsKeyArn(
57+
value=kms_key_id
58+
),
59+
)
60+
)
61+
62+
# Create the Hierarchical Keyring.
63+
mat_prov: AwsCryptographicMaterialProviders = AwsCryptographicMaterialProviders(
64+
config=MaterialProvidersConfig()
65+
)
66+
67+
keyring_input: CreateAwsKmsHierarchicalKeyringInput = CreateAwsKmsHierarchicalKeyringInput(
68+
key_store=keystore,
69+
branch_key_id=branch_key_id,
70+
ttl_seconds=600,
71+
cache=CacheTypeDefault(
72+
value=DefaultCache(
73+
entry_capacity=100
74+
)
75+
),
76+
)
77+
78+
keyring: IKeyring = mat_prov.create_aws_kms_hierarchical_keyring(
79+
input=keyring_input
80+
)
81+
82+
return keyring
83+
84+
85+
def encrypt_using_keyring(
86+
plaintext_data: bytes,
87+
keyring: IKeyring
88+
):
89+
"""Demonstrate how to encrypt plaintext data using a hierarchy keyring.
90+
91+
Usage: encrypt_using_keyring(plaintext_data, keyring)
92+
:param plaintext_data: plaintext data you want to encrypt
93+
:type: bytes
94+
:param keyring: Keyring to use for encryption.
95+
:type keyring: IKeyring
96+
"""
97+
client = aws_encryption_sdk.EncryptionSDKClient()
98+
99+
ciphertext_data, _ = client.encrypt(
100+
source=plaintext_data,
101+
keyring=keyring,
102+
encryption_context=PerfTestUtils.DEFAULT_ENCRYPTION_CONTEXT
103+
)
104+
105+
return ciphertext_data
106+
107+
108+
def decrypt_using_keyring(
109+
ciphertext_data: bytes,
110+
keyring: IKeyring
111+
):
112+
"""Demonstrate how to decrypt ciphertext data using a hierarchy keyring.
113+
114+
Usage: decrypt_using_keyring(ciphertext_data, keyring)
115+
:param ciphertext_data: ciphertext data you want to decrypt
116+
:type: bytes
117+
:param keyring: Keyring to use for decryption.
118+
:type keyring: IKeyring
119+
"""
120+
client = aws_encryption_sdk.EncryptionSDKClient()
121+
122+
decrypted_plaintext_data, _ = client.decrypt(
123+
source=ciphertext_data,
124+
keyring=keyring,
125+
encryption_context=PerfTestUtils.DEFAULT_ENCRYPTION_CONTEXT
126+
)
127+
128+
return decrypted_plaintext_data

‎performance_tests/src/aws_encryption_sdk_performance_tests/keyrings/raw_aes_keyring.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ def create_keyring():
1919
key_name_space = "Some managed raw keys"
2020
key_name = "My 256-bit AES wrapping key"
2121

22-
# Here, the input to secrets.token_bytes() = 32 bytes = 256 bits
2322
# We fix the static key in order to make the test deterministic
2423
static_key = PerfTestUtils.DEFAULT_AES_256_STATIC_KEY
2524

‎performance_tests/src/aws_encryption_sdk_performance_tests/master_key_providers/aws_kms_master_key_provider.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
def create_key_provider(
99
kms_key_id: str
1010
):
11-
"""Demonstrate how to create an AWS KMS master key-provider.
11+
"""Demonstrate how to create an AWS KMS master key provider.
1212
1313
Usage: create_key_provider(kms_key_id)
1414
:param kms_key_id: KMS Key identifier for the KMS key you want to use.
@@ -17,7 +17,7 @@ def create_key_provider(
1717
For more information on KMS Key identifiers, see
1818
https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id
1919
"""
20-
# Create a KMS master key-provider.
20+
# Create a KMS master key provider.
2121
key_provider = aws_encryption_sdk.StrictAwsKmsMasterKeyProvider(key_ids=[
2222
kms_key_id,
2323
])
@@ -29,7 +29,7 @@ def encrypt_using_key_provider(
2929
plaintext_data: bytes,
3030
key_provider: aws_encryption_sdk.key_providers.base.MasterKeyProvider
3131
):
32-
"""Demonstrate how to encrypt plaintext data using an AWS KMS master key-provider.
32+
"""Demonstrate how to encrypt plaintext data using an AWS KMS master key provider.
3333
3434
Usage: encrypt_using_key_provider(plaintext_data, key_provider)
3535
:param plaintext_data: plaintext data you want to encrypt
@@ -51,7 +51,7 @@ def decrypt_using_key_provider(
5151
ciphertext_data: bytes,
5252
key_provider: aws_encryption_sdk.key_providers.base.MasterKeyProvider
5353
):
54-
"""Demonstrate how to decrypt ciphertext data using an AWS KMS master key-provider.
54+
"""Demonstrate how to decrypt ciphertext data using an AWS KMS master key provider.
5555
5656
Usage: decrypt_using_key_provider(ciphertext_data, key_provider)
5757
:param ciphertext_data: ciphertext data you want to decrypt
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 Caching Cryptographic Materials Manager (CMM) with KMS Master Key Provider."""
4+
5+
import aws_encryption_sdk
6+
7+
8+
def create_cmm(
9+
kms_key_id: str,
10+
max_age_in_cache: float,
11+
cache_capacity: int
12+
):
13+
"""Demonstrate how to create a Caching CMM.
14+
15+
Usage: create_cmm(kms_key_id, max_age_in_cache, cache_capacity)
16+
:param kms_key_id: Amazon Resource Name (ARN) of the KMS customer master key
17+
:type kms_key_id: str
18+
:param max_age_in_cache: Maximum time in seconds that a cached entry can be used
19+
:type max_age_in_cache: float
20+
:param cache_capacity: Maximum number of entries to retain in cache at once
21+
:type cache_capacity: int
22+
"""
23+
# Security thresholds
24+
# Max messages (or max bytes per) data key are optional
25+
max_messages_encrypted = 100
26+
27+
# Create a master key provider for the KMS customer master key (CMK)
28+
key_provider = aws_encryption_sdk.StrictAwsKmsMasterKeyProvider(key_ids=[kms_key_id])
29+
30+
# Create a local cache
31+
cache = aws_encryption_sdk.LocalCryptoMaterialsCache(cache_capacity)
32+
33+
# Create a caching CMM
34+
caching_cmm = aws_encryption_sdk.CachingCryptoMaterialsManager(
35+
master_key_provider=key_provider,
36+
cache=cache,
37+
max_age=max_age_in_cache,
38+
max_messages_encrypted=max_messages_encrypted,
39+
)
40+
41+
return caching_cmm
42+
43+
44+
def encrypt_using_cmm(
45+
plaintext_data: bytes,
46+
caching_cmm: aws_encryption_sdk.materials_managers.base.CryptoMaterialsManager
47+
):
48+
"""Demonstrate how to encrypt plaintext data using a Caching CMM.
49+
50+
Usage: encrypt_using_cmm(plaintext_data, caching_cmm)
51+
:param plaintext_data: plaintext data you want to encrypt
52+
:type: bytes
53+
:param caching_cmm: Crypto Materials Manager to use for encryption.
54+
:type caching_cmm: aws_encryption_sdk.materials_managers.base.CryptoMaterialsManager
55+
"""
56+
client = aws_encryption_sdk.EncryptionSDKClient()
57+
58+
ciphertext_data, _ = client.encrypt(
59+
source=plaintext_data,
60+
materials_manager=caching_cmm
61+
)
62+
63+
return ciphertext_data
64+
65+
66+
def decrypt_using_cmm(
67+
ciphertext_data: bytes,
68+
caching_cmm: aws_encryption_sdk.materials_managers.base.CryptoMaterialsManager
69+
):
70+
"""Demonstrate how to decrypt ciphertext data using a Caching CMM.
71+
72+
Usage: decrypt_using_cmm(ciphertext_data, caching_cmm)
73+
:param ciphertext_data: ciphertext data you want to decrypt
74+
:type: bytes
75+
:param caching_cmm: Crypto Materials Manager to use for encryption.
76+
:type caching_cmm: aws_encryption_sdk.materials_managers.base.CryptoMaterialsManager
77+
"""
78+
client = aws_encryption_sdk.EncryptionSDKClient()
79+
80+
decrypted_plaintext_data, _ = client.decrypt(
81+
source=ciphertext_data,
82+
materials_manager=caching_cmm
83+
)
84+
85+
return decrypted_plaintext_data

‎performance_tests/src/aws_encryption_sdk_performance_tests/master_key_providers/raw_aes_master_key_provider.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,13 @@ def _get_raw_key(self, key_id):
4343

4444

4545
def create_key_provider():
46-
"""Demonstrate how to create a Raw AES master key-provider.
46+
"""Demonstrate how to create a Raw AES master key provider.
4747
4848
Usage: create_key_provider()
4949
"""
50-
# Create a Raw AES master key-provider.
50+
# Create a Raw AES master key provider.
5151

52-
# The Key ID field in the JceMasterKey and RawMasterKey is equivalent to key name in the Raw keyrings
52+
# The Key ID field in the JceMasterKey and RawMasterKey is equivalent to key name in the Raw keyrings
5353
key_id = "My 256-bit AES wrapping key"
5454
key_provider = StaticRandomMasterKeyProvider()
5555
key_provider.add_master_key(key_id)
@@ -61,7 +61,7 @@ def encrypt_using_key_provider(
6161
plaintext_data: bytes,
6262
key_provider: aws_encryption_sdk.key_providers.base.MasterKeyProvider
6363
):
64-
"""Demonstrate how to encrypt plaintext data using a Raw AES master key-provider.
64+
"""Demonstrate how to encrypt plaintext data using a Raw AES master key provider.
6565
6666
Usage: encrypt_using_key_provider(plaintext_data, key_provider)
6767
:param plaintext_data: plaintext data you want to encrypt
@@ -83,7 +83,7 @@ def decrypt_using_key_provider(
8383
ciphertext_data: bytes,
8484
key_provider: aws_encryption_sdk.key_providers.base.MasterKeyProvider
8585
):
86-
"""Demonstrate how to decrypt ciphertext data using a Raw AES master key-provider.
86+
"""Demonstrate how to decrypt ciphertext data using a Raw AES master key provider.
8787
8888
Usage: decrypt_using_key_provider(ciphertext_data, key_provider)
8989
:param ciphertext_data: ciphertext data you want to decrypt

‎performance_tests/src/aws_encryption_sdk_performance_tests/master_key_providers/raw_rsa_master_key_provider.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,13 @@ def _get_raw_key(self, key_id):
4343

4444

4545
def create_key_provider():
46-
"""Demonstrate how to create a Raw RSA master key-provider.
46+
"""Demonstrate how to create a Raw RSA master key provider.
4747
4848
Usage: create_key_provider()
4949
"""
50-
# Create a Raw RSA master key-provider.
50+
# Create a Raw RSA master key provider.
5151

52-
# The Key ID field in the JceMasterKey and RawMasterKey is equivalent to key name in the Raw keyrings
52+
# The Key ID field in the JceMasterKey and RawMasterKey is equivalent to key name in the Raw keyrings
5353
key_id = "My 4096-bit RSA wrapping key"
5454
key_provider = StaticRandomMasterKeyProvider()
5555
key_provider.add_master_key(key_id)
@@ -61,7 +61,7 @@ def encrypt_using_key_provider(
6161
plaintext_data: bytes,
6262
key_provider: aws_encryption_sdk.key_providers.base.MasterKeyProvider
6363
):
64-
"""Demonstrate how to encrypt plaintext data using a Raw RSA master key-provider.
64+
"""Demonstrate how to encrypt plaintext data using a Raw RSA master key provider.
6565
6666
Usage: encrypt_using_key_provider(plaintext_data, key_provider)
6767
:param plaintext_data: plaintext data you want to encrypt
@@ -83,7 +83,7 @@ def decrypt_using_key_provider(
8383
ciphertext_data: bytes,
8484
key_provider: aws_encryption_sdk.key_providers.base.MasterKeyProvider
8585
):
86-
"""Demonstrate how to decrypt ciphertext data using a Raw RSA master key-provider.
86+
"""Demonstrate how to decrypt ciphertext data using a Raw RSA master key provider.
8787
8888
Usage: decrypt_using_key_provider(ciphertext_data, key_provider)
8989
:param ciphertext_data: ciphertext data you want to decrypt

‎performance_tests/src/aws_encryption_sdk_performance_tests/utils/util.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,7 @@ class PerfTestUtils:
8787
"the data you are handling": "is what you think it is",
8888
}
8989

90-
DEFAULT_BRANCH_KEY_ID_A = 'a52dfaad-7dbd-4430-a1fd-abaa5299da07'
91-
92-
DEFAULT_BRANCH_KEY_ID_B = '8ba79cef-581c-4125-9292-b057a29d42d7'
90+
DEFAULT_BRANCH_KEY_ID = 'a52dfaad-7dbd-4430-a1fd-abaa5299da07'
9391

9492
@staticmethod
9593
def read_file(filename):
Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
2+
# SPDX-License-Identifier: Apache-2.0
3+
"""This is a performance test for creating the hierarchy keyring."""
4+
5+
import os
6+
import time
7+
8+
import click
9+
import click.testing
10+
import pytest
11+
from tqdm import tqdm
12+
13+
from aws_encryption_sdk_performance_tests.keyrings.hierarchy_keyring import (
14+
create_keyring,
15+
decrypt_using_keyring,
16+
encrypt_using_keyring,
17+
)
18+
from aws_encryption_sdk_performance_tests.utils.util import PerfTestUtils
19+
20+
MODULE_ABS_PATH = os.path.abspath(__file__)
21+
22+
23+
@click.group()
24+
def create_hierarchy_keyring():
25+
"""Click group helper function"""
26+
27+
28+
@create_hierarchy_keyring.command()
29+
@click.option('--key_store_table_name',
30+
default='KeyStoreDdbTable')
31+
@click.option('--kms_key_id',
32+
default='arn:aws:kms:us-west-2:370957321024:key/9d989aa2-2f9c-438c-a745-cc57d3ad0126')
33+
@click.option('--n_iters',
34+
default=PerfTestUtils.DEFAULT_N_ITERS)
35+
@click.option('--output_file',
36+
default='/'.join(MODULE_ABS_PATH.split("/")[:-3]) + '/results/hierarchy_keyring_create')
37+
def create(
38+
key_store_table_name: str,
39+
kms_key_id: str,
40+
n_iters: int,
41+
output_file: str
42+
):
43+
"""Performance test for the create_keyring function."""
44+
time_list = []
45+
for _ in tqdm(range(n_iters)):
46+
curr_time = time.time()
47+
48+
create_keyring(key_store_table_name, key_store_table_name, kms_key_id)
49+
50+
# calculate elapsed time in milliseconds
51+
elapsed_time = (time.time() - curr_time) * 1000
52+
time_list.append(elapsed_time)
53+
54+
PerfTestUtils.write_time_list_to_csv(time_list, output_file)
55+
56+
57+
@click.group()
58+
def encrypt_hierarchy_keyring():
59+
"""Click group helper function"""
60+
61+
62+
@encrypt_hierarchy_keyring.command()
63+
@click.option('--plaintext_data_filename',
64+
default='/'.join(MODULE_ABS_PATH.split("/")[:-2]) + '/resources/plaintext/plaintext-data-'
65+
+ PerfTestUtils.DEFAULT_FILE_SIZE + '.dat')
66+
@click.option('--key_store_table_name',
67+
default='KeyStoreDdbTable')
68+
@click.option('--kms_key_id',
69+
default='arn:aws:kms:us-west-2:370957321024:key/9d989aa2-2f9c-438c-a745-cc57d3ad0126')
70+
@click.option('--n_iters',
71+
default=PerfTestUtils.DEFAULT_N_ITERS)
72+
@click.option('--output_file',
73+
default='/'.join(MODULE_ABS_PATH.split("/")[:-3]) + '/results/hierarchy_keyring_encrypt')
74+
def encrypt(
75+
plaintext_data_filename: str,
76+
key_store_table_name: str,
77+
kms_key_id: str,
78+
n_iters: int,
79+
output_file: str
80+
):
81+
"""Performance test for the encrypt_using_keyring function."""
82+
plaintext_data = PerfTestUtils.read_file(plaintext_data_filename)
83+
84+
keyring = create_keyring(key_store_table_name, key_store_table_name, kms_key_id)
85+
time_list = []
86+
87+
for _ in tqdm(range(n_iters)):
88+
curr_time = time.time()
89+
90+
encrypt_using_keyring(plaintext_data, keyring)
91+
92+
# calculate elapsed time in milliseconds
93+
elapsed_time = (time.time() - curr_time) * 1000
94+
time_list.append(elapsed_time)
95+
96+
PerfTestUtils.write_time_list_to_csv(time_list, output_file)
97+
98+
99+
@click.group()
100+
def decrypt_hierarchy_keyring():
101+
"""Click group helper function"""
102+
103+
104+
@decrypt_hierarchy_keyring.command()
105+
@click.option('--ciphertext_data_filename',
106+
default='/'.join(MODULE_ABS_PATH.split("/")[:-2]) + '/resources/ciphertext/hierarchy/ciphertext-data-'
107+
+ PerfTestUtils.DEFAULT_FILE_SIZE + '.ct')
108+
@click.option('--key_store_table_name',
109+
default='KeyStoreDdbTable')
110+
@click.option('--kms_key_id',
111+
default='arn:aws:kms:us-west-2:370957321024:key/9d989aa2-2f9c-438c-a745-cc57d3ad0126')
112+
@click.option('--n_iters',
113+
default=PerfTestUtils.DEFAULT_N_ITERS)
114+
@click.option('--output_file',
115+
default='/'.join(MODULE_ABS_PATH.split("/")[:-3]) + '/results/hierarchy_keyring_decrypt')
116+
def decrypt(
117+
ciphertext_data_filename: str,
118+
key_store_table_name: str,
119+
kms_key_id: str,
120+
n_iters: int,
121+
output_file: str
122+
):
123+
"""Performance test for the decrypt_using_keyring function."""
124+
ciphertext_data = PerfTestUtils.read_file(ciphertext_data_filename)
125+
126+
keyring = create_keyring(key_store_table_name, key_store_table_name, kms_key_id)
127+
time_list = []
128+
129+
for _ in tqdm(range(n_iters)):
130+
curr_time = time.time()
131+
132+
decrypt_using_keyring(ciphertext_data, keyring)
133+
134+
# calculate elapsed time in milliseconds
135+
elapsed_time = (time.time() - curr_time) * 1000
136+
time_list.append(elapsed_time)
137+
138+
PerfTestUtils.write_time_list_to_csv(time_list, output_file)
139+
140+
141+
hierarchy_keyring_test = click.CommandCollection(sources=[create_hierarchy_keyring,
142+
encrypt_hierarchy_keyring,
143+
decrypt_hierarchy_keyring])
144+
145+
146+
@pytest.fixture
147+
def runner():
148+
"""Click runner"""
149+
return click.testing.CliRunner()
150+
151+
152+
def test_create(runner):
153+
"""Test the create_keyring function"""
154+
result = runner.invoke(create_hierarchy_keyring.commands['create'],
155+
['--n_iters', PerfTestUtils.DEFAULT_TESTING_N_ITERS])
156+
assert result.exit_code == 0
157+
158+
159+
def test_encrypt(runner):
160+
"""Test the encrypt_using_keyring function"""
161+
result = runner.invoke(encrypt_hierarchy_keyring.commands['encrypt'],
162+
['--n_iters', PerfTestUtils.DEFAULT_TESTING_N_ITERS])
163+
assert result.exit_code == 0
164+
165+
166+
def test_decrypt(runner):
167+
"""Test the decrypt_using_keyring function"""
168+
result = runner.invoke(decrypt_hierarchy_keyring.commands['decrypt'],
169+
['--n_iters', PerfTestUtils.DEFAULT_TESTING_N_ITERS])
170+
assert result.exit_code == 0
171+
172+
173+
if __name__ == "__main__":
174+
hierarchy_keyring_test()

‎performance_tests/test/master_key_providers/test_aws_kms_master_key_provider.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
22
# SPDX-License-Identifier: Apache-2.0
3-
"""This is a performance test for creating the AWS KMS Master key-provider."""
3+
"""This is a performance test for creating the AWS KMS Master key provider."""
44

55
import os
66
import time
Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
2+
# SPDX-License-Identifier: Apache-2.0
3+
"""This is a performance test for creating a Caching CMM."""
4+
5+
import os
6+
import time
7+
8+
import click
9+
import click.testing
10+
import pytest
11+
from tqdm import tqdm
12+
13+
from aws_encryption_sdk_performance_tests.master_key_providers.caching_cmm import (
14+
create_cmm,
15+
decrypt_using_cmm,
16+
encrypt_using_cmm,
17+
)
18+
from aws_encryption_sdk_performance_tests.utils.util import PerfTestUtils
19+
20+
MODULE_ABS_PATH = os.path.abspath(__file__)
21+
22+
23+
@click.group()
24+
def create_caching_cmm():
25+
"""Click group helper function"""
26+
27+
28+
@create_caching_cmm.command()
29+
@click.option('--kms_key_id',
30+
default='arn:aws:kms:us-west-2:658956600833:key/b3537ef1-d8dc-4780-9f5a-55776cbb2f7f')
31+
@click.option('--max_age_in_cache',
32+
default=10.0)
33+
@click.option('--cache_capacity',
34+
default=10)
35+
@click.option('--n_iters',
36+
default=PerfTestUtils.DEFAULT_N_ITERS)
37+
@click.option('--output_file',
38+
default='/'.join(MODULE_ABS_PATH.split("/")[:-3]) + '/results/caching_cmm_create')
39+
def create(
40+
kms_key_id: str,
41+
max_age_in_cache: float,
42+
cache_capacity: int,
43+
n_iters: int,
44+
output_file: str
45+
):
46+
"""Performance test for the create_cmm function."""
47+
time_list = []
48+
for _ in tqdm(range(n_iters)):
49+
curr_time = time.time()
50+
51+
create_cmm(kms_key_id, max_age_in_cache, cache_capacity)
52+
53+
# calculate elapsed time in milliseconds
54+
elapsed_time = (time.time() - curr_time) * 1000
55+
time_list.append(elapsed_time)
56+
57+
PerfTestUtils.write_time_list_to_csv(time_list, output_file)
58+
59+
60+
@click.group()
61+
def encrypt_caching_cmm():
62+
"""Click group helper function"""
63+
64+
65+
@encrypt_caching_cmm.command()
66+
@click.option('--plaintext_data_filename',
67+
default='/'.join(MODULE_ABS_PATH.split("/")[:-2]) + '/resources/plaintext/plaintext-data-'
68+
+ PerfTestUtils.DEFAULT_FILE_SIZE + '.dat')
69+
@click.option('--kms_key_id',
70+
default='arn:aws:kms:us-west-2:658956600833:key/b3537ef1-d8dc-4780-9f5a-55776cbb2f7f')
71+
@click.option('--max_age_in_cache',
72+
default=10.0)
73+
@click.option('--cache_capacity',
74+
default=10)
75+
@click.option('--n_iters',
76+
default=PerfTestUtils.DEFAULT_N_ITERS)
77+
@click.option('--output_file',
78+
default='/'.join(MODULE_ABS_PATH.split("/")[:-3]) + '/results/caching_cmm_encrypt')
79+
def encrypt(
80+
plaintext_data_filename: str,
81+
kms_key_id: str,
82+
max_age_in_cache: float,
83+
cache_capacity: int,
84+
n_iters: int,
85+
output_file: str
86+
):
87+
"""Performance test for the encrypt_using_cmm function."""
88+
plaintext_data = PerfTestUtils.read_file(plaintext_data_filename)
89+
90+
caching_cmm = create_cmm(kms_key_id, max_age_in_cache, cache_capacity)
91+
time_list = []
92+
93+
for _ in tqdm(range(n_iters)):
94+
curr_time = time.time()
95+
96+
encrypt_using_cmm(plaintext_data, caching_cmm)
97+
98+
# calculate elapsed time in milliseconds
99+
elapsed_time = (time.time() - curr_time) * 1000
100+
time_list.append(elapsed_time)
101+
102+
PerfTestUtils.write_time_list_to_csv(time_list, output_file)
103+
104+
105+
@click.group()
106+
def decrypt_caching_cmm():
107+
"""Click group helper function"""
108+
109+
110+
@decrypt_caching_cmm.command()
111+
@click.option('--ciphertext_data_filename',
112+
default='/'.join(MODULE_ABS_PATH.split("/")[:-2]) + '/resources/ciphertext/caching_cmm/ciphertext-data-'
113+
+ PerfTestUtils.DEFAULT_FILE_SIZE + '.ct')
114+
@click.option('--kms_key_id',
115+
default='arn:aws:kms:us-west-2:658956600833:key/b3537ef1-d8dc-4780-9f5a-55776cbb2f7f')
116+
@click.option('--max_age_in_cache',
117+
default=10.0)
118+
@click.option('--cache_capacity',
119+
default=10)
120+
@click.option('--n_iters',
121+
default=PerfTestUtils.DEFAULT_N_ITERS)
122+
@click.option('--output_file',
123+
default='/'.join(MODULE_ABS_PATH.split("/")[:-3]) + '/results/caching_cmm_decrypt')
124+
def decrypt(
125+
ciphertext_data_filename: str,
126+
kms_key_id: str,
127+
max_age_in_cache: float,
128+
cache_capacity: int,
129+
n_iters: int,
130+
output_file: str
131+
):
132+
"""Performance test for the decrypt_using_cmm function."""
133+
ciphertext_data = PerfTestUtils.read_file(ciphertext_data_filename)
134+
135+
caching_cmm = create_cmm(kms_key_id, max_age_in_cache, cache_capacity)
136+
time_list = []
137+
138+
for _ in tqdm(range(n_iters)):
139+
curr_time = time.time()
140+
141+
decrypt_using_cmm(ciphertext_data, caching_cmm)
142+
143+
# calculate elapsed time in milliseconds
144+
elapsed_time = (time.time() - curr_time) * 1000
145+
time_list.append(elapsed_time)
146+
147+
PerfTestUtils.write_time_list_to_csv(time_list, output_file)
148+
149+
150+
caching_cmm_test = click.CommandCollection(sources=[create_caching_cmm,
151+
encrypt_caching_cmm,
152+
decrypt_caching_cmm])
153+
154+
155+
@pytest.fixture
156+
def runner():
157+
"""Click runner"""
158+
return click.testing.CliRunner()
159+
160+
161+
def test_create(runner):
162+
"""Test the create_cmm function"""
163+
result = runner.invoke(create_caching_cmm.commands['create'],
164+
['--n_iters', PerfTestUtils.DEFAULT_TESTING_N_ITERS])
165+
assert result.exit_code == 0
166+
167+
168+
def test_encrypt(runner):
169+
"""Test the encrypt_using_cmm function"""
170+
result = runner.invoke(encrypt_caching_cmm.commands['encrypt'],
171+
['--n_iters', PerfTestUtils.DEFAULT_TESTING_N_ITERS])
172+
assert result.exit_code == 0
173+
174+
175+
def test_decrypt(runner):
176+
"""Test the decrypt_using_cmm function"""
177+
result = runner.invoke(decrypt_caching_cmm.commands['decrypt'],
178+
['--n_iters', PerfTestUtils.DEFAULT_TESTING_N_ITERS])
179+
assert result.exit_code == 0
180+
181+
182+
if __name__ == "__main__":
183+
caching_cmm_test()

‎performance_tests/test/master_key_providers/test_raw_aes_master_key_provider.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
22
# SPDX-License-Identifier: Apache-2.0
3-
"""This is a performance test for creating the Raw AES Master key-provider."""
3+
"""This is a performance test for creating the Raw AES Master key provider."""
44

55
import os
66
import time

‎performance_tests/test/master_key_providers/test_raw_rsa_master_key_provider.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
22
# SPDX-License-Identifier: Apache-2.0
3-
"""This is a performance test for creating the Raw RSA Master key-provider."""
3+
"""This is a performance test for creating the Raw RSA Master key provider."""
44

55
import os
66
import time
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)
Please sign in to comment.