shadow_crypt_core/v1/
mod.rs1use crate::algorithm::Algorithm;
13
14pub mod crypt;
16
17pub mod file;
19
20pub mod header;
22
23pub mod key;
25
26pub const ALGORITHM: Algorithm = Algorithm::XChaCha20Poly1305;
28
29#[cfg(test)]
30mod tests {
31 use crate::v1::{
32 crypt::encrypt_bytes, file::EncryptedFile, header::FileHeader, key::KeyDerivationParams,
33 };
34
35 #[test]
38 fn decrypt_round_trip_via_bytes() {
39 let salt = [1u8; 16];
40 let params = KeyDerivationParams::test_defaults();
41 let content_nonce = [2u8; 24];
42 let filename_nonce = [3u8; 24];
43 let (key, _) = params.derive_key(b"password", &salt).unwrap();
44
45 let (filename_ct, _) = encrypt_bytes(b"name.txt", key.as_bytes(), &filename_nonce).unwrap();
46 let (content_ct, _) = encrypt_bytes(b"hello", key.as_bytes(), &content_nonce).unwrap();
47
48 let header = FileHeader::new(salt, params, content_nonce, filename_nonce, filename_ct);
49 let file = EncryptedFile::new(header, content_ct);
50
51 let parsed = EncryptedFile::from_bytes(&file.to_bytes()).unwrap();
52 let decrypted = parsed.decrypt(&key).unwrap();
53
54 assert_eq!(decrypted.filename().as_str(), "name.txt");
55 assert_eq!(decrypted.content().as_slice(), b"hello");
56 }
57
58 #[test]
60 fn decrypt_with_wrong_key_fails() {
61 let salt = [1u8; 16];
62 let params = KeyDerivationParams::test_defaults();
63 let (key, _) = params.derive_key(b"password", &salt).unwrap();
64 let (wrong_key, _) = params.derive_key(b"wrong", &salt).unwrap();
65
66 let (filename_ct, _) = encrypt_bytes(b"name.txt", key.as_bytes(), &[3u8; 24]).unwrap();
67 let (content_ct, _) = encrypt_bytes(b"hello", key.as_bytes(), &[2u8; 24]).unwrap();
68
69 let header = FileHeader::new(salt, params, [2u8; 24], [3u8; 24], filename_ct);
70 let file = EncryptedFile::new(header, content_ct);
71
72 assert!(file.decrypt(&wrong_key).is_err());
73 }
74}