1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
//! # krypton
//!
//! Encrypted vaults and single-file encryption with full metadata
//! protection, built on AES-256-GCM and Argon2id.
//!
//! ## Highlights
//!
//! * **Authenticated encryption** — every byte of ciphertext is covered by a
//! GCM tag; headers are bound through key derivation and AAD.
//! * **Memory-hard key derivation** — Argon2id (64 MiB, t=4) with parameters
//! stored inside each container so they can evolve without breaking old
//! files.
//! * **Per-object subkeys** — HKDF-SHA256 derives an independent content key
//! per file; deterministic counter nonces eliminate random-nonce collision
//! risk on large files.
//! * **Streaming** — 64 KiB chunks with constant memory use for files of any
//! size.
//! * **Metadata privacy** — original filenames never appear unencrypted,
//! neither in `.krf` containers nor inside vaults.
//! * **Crash safety** — vault configs, manifests and outputs are written via
//! temp file + rename; interrupted operations never leave half-written
//! plaintext or bricked containers.
//! * **Hardened memory** — keys live in [`zeroize::Zeroizing`] buffers and
//! are scrubbed on drop.
//!
//! ## Quick start
//!
//! ```no_run
//! use std::path::Path;
//!
//! // Single file round trip.
//! let out = krypton::encrypt_file("correct horse", Path::new("document.pdf"), None).unwrap();
//! let name = krypton::decrypt_file("correct horse", &out, Path::new("restored.pdf")).unwrap();
//! assert_eq!(name, "document.pdf");
//!
//! // Multi-file vault.
//! let mut vault = krypton::Vault::new("myvault".into());
//! vault.init("correct horse").unwrap();
//! vault.unlock("correct horse").unwrap();
//! vault.add(Path::new("secret.pdf"), None).unwrap();
//! for e in vault.list().unwrap() {
//! println!("{} ({} bytes)", e.name, e.size);
//! }
//! vault.lock();
//! ```
//!
//! ## Choosing an API
//!
//! * **One file in, one file out?** Use [`encrypt_file`] / [`decrypt_file`].
//! The container is self-contained: it carries the KDF parameters and the
//! original filename inside the encryption boundary.
//! * **Many files with one password?** Use [`Vault`]. Entries keep their
//! names encrypted, whole directory trees can be stored and restored, and
//! the password can be changed later without re-encrypting data.
//! * **Building blocks only?** The [`crypto`] module exposes the AEAD, key
//! type and derivation functions used internally.
//!
//! ## Error handling
//!
//! All fallible operations return [`Result`] with a small [`Error`] enum.
//! Wrong passwords and tampered ciphertext deliberately map to the same
//! [`Error::Authentication`] variant so error messages never leak which one
//! occurred:
//!
//!
//! ```
//! use krypton::{decrypt_file, Error};
//! use std::path::Path;
//!
//! match decrypt_file("pw", Path::new("backup.krf"), Path::new("out.bin")) {
//! Ok(original_name) => println!("restored {original_name}"),
//! Err(Error::Authentication) => eprintln!("wrong password or corrupted data"),
//! Err(e) => eprintln!("failed: {e}"),
//! }
//! ```
//!
//! ## Security model
//!
//! See `SECURITY.md` in the repository for the full write-up including
//! threat model and known limitations. In short: confidentiality and
//! integrity against attackers with read/write access to the stored files,
//! as long as the password remains secret. The tool does not hide file sizes
//! beyond filename padding, does not provide plausible deniability, and — as
//! with all password-based encryption — security ultimately rests on password
//! strength.
/// Universal encrypted container format shared by all objects.
pub
/// Cryptographic primitives: keys, AEAD, KDF.
/// Error types.
/// Argon2id parameter types.
/// Entry-name validation helpers.
/// Single-file `.krf` containers.
/// Chunked streaming encryption engine.
/// Multi-file encrypted vaults.
/// Convenience re-exports covering everyday use.
pub use ;
pub use ;
pub use ;
/// Crate version, handy for CLI `--version` output.
pub const VERSION: &str = env!;