pub struct ChaChaEngine { /* private fields */ }Expand description
ChaCha20-Poly1305 based crypto engine. Derives the actual encryption key from a master key using HKDF.
Implementations§
Source§impl ChaChaEngine
impl ChaChaEngine
Sourcepub fn new(master_key: &[u8]) -> FsResult<Self>
pub fn new(master_key: &[u8]) -> FsResult<Self>
Create from a raw master key. The encryption key is derived via HKDF-SHA256.
Examples found in repository?
examples/network_mount.rs (line 83)
21fn main() {
22 let args: Vec<String> = std::env::args().collect();
23
24 let mut addr = "127.0.0.1:9100";
25 let mut server_name = "localhost";
26 let mut ca = "certs/ca.pem";
27 let mut master_key_hex = "";
28 let mut init = false;
29
30 let mut i = 1;
31 while i < args.len() {
32 match args[i].as_str() {
33 "--addr" => {
34 addr = &args[i + 1];
35 i += 2;
36 }
37 "--server-name" => {
38 server_name = &args[i + 1];
39 i += 2;
40 }
41 "--ca" => {
42 ca = &args[i + 1];
43 i += 2;
44 }
45 "--master-key" => {
46 master_key_hex = &args[i + 1];
47 i += 2;
48 }
49 "--init" => {
50 init = true;
51 i += 1;
52 }
53 other => {
54 eprintln!("unknown argument: {other}");
55 std::process::exit(1);
56 }
57 }
58 }
59
60 if master_key_hex.is_empty() || master_key_hex.len() != 64 {
61 eprintln!("--master-key must be a 64-character hex string (32 bytes)");
62 std::process::exit(1);
63 }
64
65 let master_key: Vec<u8> = (0..32)
66 .map(|i| u8::from_str_radix(&master_key_hex[i * 2..i * 2 + 2], 16).unwrap())
67 .collect();
68
69 // ── Connect ─────────────────────────────────────────────
70 println!("Connecting to {addr} (SNI: {server_name})...");
71 let net = NetworkBlockStore::connect(addr, server_name, Path::new(ca), &master_key)
72 .expect("failed to connect to server");
73
74 println!(
75 "Connected: {} blocks × {} bytes ({} MiB)",
76 net.total_blocks(),
77 net.block_size(),
78 net.total_blocks() as usize * net.block_size() / (1024 * 1024)
79 );
80
81 // ── Wrap with cache ─────────────────────────────────────
82 let store = Arc::new(CachedBlockStore::new(net, 1024));
83 let crypto = Arc::new(ChaChaEngine::new(&master_key).expect("invalid master key"));
84 let mut fs = FilesystemCore::new(store.clone(), crypto);
85
86 // ── Mount or init ───────────────────────────────────────
87 if init {
88 println!("Initializing new filesystem...");
89 fs.init_filesystem().expect("init_filesystem failed");
90 } else {
91 println!("Mounting existing filesystem...");
92 fs.open().expect("open failed");
93 }
94
95 // ── Demo operations ─────────────────────────────────────
96 println!("\nCreating file 'hello.txt'...");
97 match fs.create_file("hello.txt") {
98 Ok(()) => {}
99 Err(e) => println!(" (skipped: {e})"),
100 }
101
102 fs.write_file("hello.txt", 0, b"Hello from the network!")
103 .expect("write failed");
104
105 let data = fs.read_file("hello.txt", 0, 4096).expect("read failed");
106 println!("Read back: {:?}", String::from_utf8_lossy(&data));
107
108 println!("\nListing root directory:");
109 for entry in fs.list_directory().expect("list failed") {
110 println!(
111 " {:?} {:>10} bytes {}",
112 entry.kind, entry.size, entry.name
113 );
114 }
115
116 // ── Sync ────────────────────────────────────────────────
117 fs.sync().expect("sync failed");
118 println!("\nAll data synced to server.");
119}Sourcepub fn generate() -> FsResult<Self>
pub fn generate() -> FsResult<Self>
Convenience: create with a randomly generated master key (for testing / new FS).
Examples found in repository?
examples/create_image.rs (line 32)
15fn main() {
16 let path = std::env::current_dir()
17 .unwrap()
18 .join("sample.dcfs")
19 .to_string_lossy()
20 .to_string();
21
22 // Remove leftover from a previous run, if any.
23 let _ = std::fs::remove_file(&path);
24
25 // 64 blocks × 64 KiB = 4 MiB image.
26 let total_blocks: u64 = 64;
27 let store = Arc::new(
28 DiskBlockStore::create(&path, DEFAULT_BLOCK_SIZE, total_blocks)
29 .expect("failed to create image file"),
30 );
31
32 let crypto = Arc::new(ChaChaEngine::generate().expect("failed to init crypto"));
33 let mut fs = FilesystemCore::new(store, crypto);
34
35 fs.init_filesystem().expect("init_filesystem failed");
36
37 // Create a text file.
38 fs.create_file("hello.txt").expect("create_file failed");
39 fs.write_file("hello.txt", 0, b"Hello, hex editor!")
40 .expect("write_file failed");
41
42 // Create a directory.
43 fs.create_directory("notes")
44 .expect("create_directory failed");
45
46 // Create a larger binary file so there's more to look at.
47 let pattern: Vec<u8> = (0..=255).cycle().take(200_000).collect();
48 fs.create_file("pattern.bin").expect("create_file failed");
49 fs.write_file("pattern.bin", 0, &pattern)
50 .expect("write_file failed");
51
52 fs.sync().expect("sync failed");
53
54 println!("Filesystem image written to:\n {path}");
55 println!(
56 " {} blocks × {} bytes = {} bytes total",
57 total_blocks,
58 DEFAULT_BLOCK_SIZE,
59 total_blocks as usize * DEFAULT_BLOCK_SIZE
60 );
61}Trait Implementations§
Source§impl CryptoEngine for ChaChaEngine
impl CryptoEngine for ChaChaEngine
Auto Trait Implementations§
impl Freeze for ChaChaEngine
impl RefUnwindSafe for ChaChaEngine
impl Send for ChaChaEngine
impl Sync for ChaChaEngine
impl Unpin for ChaChaEngine
impl UnsafeUnpin for ChaChaEngine
impl UnwindSafe for ChaChaEngine
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more