pvcrypt/
read.rs

1use crate::CHUNK_SIZE;
2use crossbeam::channel::Sender;
3
4use std::fs::File;
5use std::io::{self, BufReader, Read, Result};
6
7use aes_gcm_stream::Aes256GcmStreamDecryptor;
8use zeroize::Zeroize;
9
10pub fn read_loop(
11    infile: &str,
12    stats_tx: Sender<usize>,
13    write_tx: Sender<Vec<u8>>,
14    deccode: &str,
15) -> Result<()> {
16    let mut reader: Box<dyn Read> = if !infile.is_empty() {
17        Box::new(BufReader::new(File::open(infile)?))
18    } else {
19        Box::new(BufReader::new(io::stdin()))
20    };
21    let mut buffer = [0; CHUNK_SIZE];
22
23    if !deccode.is_empty() {
24        let (mut nonce, mut key) = read_nonce_and_key(deccode)?;
25        let key_array: [u8; 32] = key.clone().try_into().expect("key must be 32 bytes");
26        let mut decryptor = Aes256GcmStreamDecryptor::new(key_array, &nonce);
27
28        loop {
29            let num_read = match reader.read(&mut buffer) {
30                Ok(0) => break,
31                Ok(x) => x,
32                Err(_) => break,
33            };
34            let mut buffer = decryptor.update(&buffer[..num_read]);
35            if num_read == 0 {
36                buffer.extend_from_slice(&decryptor.finalize().expect("decrypt error"));
37            }
38            let _ = stats_tx.send(buffer.len()); // Dont care if it cant see stats
39            if write_tx.send(buffer).is_err() {
40                break;
41            };
42        }
43
44        nonce.zeroize();
45        key.zeroize();
46    } else {
47        loop {
48            let num_read = match reader.read(&mut buffer) {
49                Ok(0) => break,
50                Ok(x) => x,
51                Err(_) => break,
52            };
53            let _ = stats_tx.send(num_read); // Dont care if it cant see stats
54            if write_tx.send(Vec::from(&buffer[..num_read])).is_err() {
55                break;
56            };
57        }
58    }
59
60    let _ = stats_tx.send(0);
61    let _ = write_tx.send(Vec::new()); // empty vec
62    Ok(())
63}
64
65fn read_nonce_and_key(deccode: &str) -> Result<([u8; 32], [u8; 32])> {
66    let mut file = File::open(deccode)?;
67    let mut nonce = [0u8; 32];
68    let mut key = [0u8; 32];
69    file.read_exact(&mut nonce)?;
70    file.read_exact(&mut key)?;
71    Ok((nonce, key))
72}