main/keyring/
aws_kms_mrk_keyring_example.rs1use aws_config::Region;
29use aws_esdk::client as esdk_client;
30use aws_esdk::material_providers::client as mpl_client;
31use aws_esdk::material_providers::types::material_providers_config::MaterialProvidersConfig;
32use aws_esdk::types::aws_encryption_sdk_config::AwsEncryptionSdkConfig;
33use std::collections::HashMap;
34
35pub async fn encrypt_and_decrypt_with_keyring(
36 example_data: &str,
37 mrk_key_id_encrypt: &str,
38 mrk_replica_key_id_decrypt: &str,
39 mrk_encrypt_region: String,
40 mrk_replica_decrypt_region: String,
41) -> Result<(), crate::BoxError> {
42 let esdk_config = AwsEncryptionSdkConfig::builder().build()?;
48 let esdk_client = esdk_client::Client::from_conf(esdk_config)?;
49
50 let encryption_context = HashMap::from([
55 ("encryption".to_string(), "context".to_string()),
56 ("is not".to_string(), "secret".to_string()),
57 ("but adds".to_string(), "useful metadata".to_string()),
58 (
59 "that can help you".to_string(),
60 "be confident that".to_string(),
61 ),
62 (
63 "the data you are handling".to_string(),
64 "is what you think it is".to_string(),
65 ),
66 ]);
67
68 let mpl_config = MaterialProvidersConfig::builder().build()?;
70 let mpl = mpl_client::Client::from_conf(mpl_config)?;
71
72 let sdk_config = aws_config::load_defaults(aws_config::BehaviorVersion::latest()).await;
74 let encrypt_kms_config = aws_sdk_kms::config::Builder::from(&sdk_config)
75 .region(Region::new(mrk_encrypt_region))
76 .build();
77 let encrypt_kms_client = aws_sdk_kms::Client::from_conf(encrypt_kms_config);
78
79 let encrypt_kms_keyring = mpl
81 .create_aws_kms_mrk_keyring()
82 .kms_key_id(mrk_key_id_encrypt)
83 .kms_client(encrypt_kms_client)
84 .send()
85 .await?;
86
87 let plaintext = example_data.as_bytes();
89
90 let encryption_response = esdk_client
91 .encrypt()
92 .plaintext(plaintext)
93 .keyring(encrypt_kms_keyring)
94 .encryption_context(encryption_context.clone())
95 .send()
96 .await?;
97
98 let ciphertext = encryption_response
99 .ciphertext
100 .expect("Unable to unwrap ciphertext from encryption response");
101
102 assert_ne!(
105 ciphertext,
106 aws_smithy_types::Blob::new(plaintext),
107 "Ciphertext and plaintext data are the same. Invalid encryption"
108 );
109
110 let decrypt_kms_config = aws_sdk_kms::config::Builder::from(&sdk_config)
115 .region(Region::new(mrk_replica_decrypt_region))
116 .build();
117 let decrypt_kms_client = aws_sdk_kms::Client::from_conf(decrypt_kms_config);
118
119 let decrypt_kms_keyring = mpl
120 .create_aws_kms_mrk_keyring()
121 .kms_key_id(mrk_replica_key_id_decrypt)
122 .kms_client(decrypt_kms_client)
123 .send()
124 .await?;
125
126 let decryption_response = esdk_client
128 .decrypt()
129 .ciphertext(ciphertext)
130 .keyring(decrypt_kms_keyring)
131 .encryption_context(encryption_context)
133 .send()
134 .await?;
135
136 let decrypted_plaintext = decryption_response
137 .plaintext
138 .expect("Unable to unwrap plaintext from decryption response");
139
140 assert_eq!(
143 decrypted_plaintext,
144 aws_smithy_types::Blob::new(plaintext),
145 "Decrypted plaintext should be identical to the original plaintext. Invalid decryption"
146 );
147
148 println!("KMS MRK Keyring Example Completed Successfully");
149
150 Ok(())
151}
152
153#[tokio::test(flavor = "multi_thread")]
154pub async fn test_encrypt_and_decrypt_with_keyring() -> Result<(), crate::BoxError2> {
155 use crate::example_utils::utils;
157
158 let mrk_encrypt_region: String = "us-east-1".to_string();
159 let mrk_replica_decrypt_region: String = "eu-west-1".to_string();
160
161 encrypt_and_decrypt_with_keyring(
162 utils::TEST_EXAMPLE_DATA,
163 utils::TEST_MRK_KEY_ID_US_EAST_1,
164 utils::TEST_MRK_KEY_ID_EU_WEST_1,
165 mrk_encrypt_region,
166 mrk_replica_decrypt_region,
167 )
168 .await?;
169
170 Ok(())
171}