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
mod encryption;

use std::fs::File;
use std::path::Path;
use std::ffi::OsStr;
use std::io::{ self, Read, Write };

use crate::encryption::*;

fn write_file(filename: &OsStr, data: &Vec<u8>) -> Result<(), io::Error> {
    let mut file = File::create(filename)?;
    file.write_all(data)?;
    Ok(())
}

pub fn encrypt_file(
    input_filename: &Path,
    output_filename: &OsStr,
    password: &Vec<u8>
) -> Result<(), io::Error> {
    assert!(input_filename.is_file());

    let mut input_data = Vec::new();
    File::open(input_filename)?.read_to_end(&mut input_data)?;

    let (encrypted_data, iv) = encryption::encrypt_data(&input_data, &password)
        .expect("Encryption failed!");
 
    let write_data = [&iv[..], &encrypted_data[..]].concat();

    write_file(output_filename, &write_data)?;

    Ok(())
}

pub fn decrypt_file(
    input_filename: &Path,
    output_filename: &OsStr,
    password: &Vec<u8>
) -> Result<(), io::Error> {
    assert!(input_filename.is_file());

    let mut input_data = Vec::new();
    let mut iv = [0; IV_SIZE as usize];

    let mut file = File::open(input_filename)?;

    file.read(&mut iv)?;
    file.read_to_end(&mut input_data)?;

    let decrypted_data = encryption::decrypt_data(&input_data, &password, &iv)
        .expect("Decryption failed!");

    write_file(output_filename, &decrypted_data)?;

    Ok(())
}