use secure_data::envelope::{decrypt_for_use, encrypt_for_storage};
use secure_data::kms::StaticDevKeyProvider;
fn make_provider() -> StaticDevKeyProvider {
StaticDevKeyProvider::new()
}
#[tokio::test]
async fn test_encrypt_decrypt_roundtrip() {
let provider = make_provider();
let plaintext = b"Hello, world!";
let key_alias = "test-key".to_string();
let envelope = encrypt_for_storage(plaintext, &key_alias, &provider)
.await
.expect("encryption must succeed");
let decrypted = decrypt_for_use(&envelope, &provider)
.await
.expect("decryption must succeed");
assert_eq!(
decrypted, plaintext,
"decrypted plaintext must match original"
);
}
#[tokio::test]
async fn test_envelope_format_contains_metadata() {
let provider = make_provider();
let plaintext = b"metadata check";
let key_alias = "test-key".to_string();
let envelope = encrypt_for_storage(plaintext, &key_alias, &provider)
.await
.expect("encryption must succeed");
assert!(!envelope.version.is_empty(), "version must be set");
assert!(!envelope.algorithm.is_empty(), "algorithm must be set");
assert_eq!(envelope.key_alias, key_alias, "key_alias must match");
assert!(!envelope.key_version.is_empty(), "key_version must be set");
assert!(
!envelope.wrapped_data_key.is_empty(),
"wrapped_data_key must be set"
);
assert!(!envelope.nonce.is_empty(), "nonce must be set");
assert!(!envelope.ciphertext.is_empty(), "ciphertext must be set");
}
#[tokio::test]
async fn test_different_plaintexts_produce_different_ciphertexts() {
let provider = make_provider();
let plaintext = b"same plaintext";
let key_alias = "test-key".to_string();
let env1 = encrypt_for_storage(plaintext, &key_alias, &provider)
.await
.expect("first encryption must succeed");
let env2 = encrypt_for_storage(plaintext, &key_alias, &provider)
.await
.expect("second encryption must succeed");
assert_ne!(env1.nonce, env2.nonce, "nonces must be unique");
assert_ne!(env1.ciphertext, env2.ciphertext, "ciphertexts must differ");
}
#[tokio::test]
async fn test_tampered_ciphertext_fails_decryption() {
let provider = make_provider();
let plaintext = b"tamper test data";
let key_alias = "test-key".to_string();
let mut envelope = encrypt_for_storage(plaintext, &key_alias, &provider)
.await
.expect("encryption must succeed");
if let Some(byte) = envelope.ciphertext.first_mut() {
*byte ^= 0xFF;
}
let result = decrypt_for_use(&envelope, &provider).await;
assert!(result.is_err(), "tampered ciphertext must fail decryption");
}
#[tokio::test]
async fn test_tampered_aad_fails_decryption() {
let provider = make_provider();
let plaintext = b"aad tamper test";
let key_alias = "test-key".to_string();
let mut envelope = encrypt_for_storage(plaintext, &key_alias, &provider)
.await
.expect("encryption must succeed");
envelope.aad = b"tampered-aad".to_vec();
let result = decrypt_for_use(&envelope, &provider).await;
assert!(result.is_err(), "tampered AAD must fail decryption");
}