use enc_file::{
create_key, decrypt_file, encrypt_file, get_blake3_hash, get_sha256_hash, get_sha512_hash,
read_file, save_file,
};
use serde::{Deserialize, Serialize};
use std::env;
use std::str::from_utf8;
#[derive(Serialize, Deserialize, PartialEq, Debug)]
struct Cipher {
len: usize,
rand_string: String,
ciphertext: Vec<u8>,
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let args: Vec<String> = env::args().collect();
if args.len() >= 2 {
let operation = &args[1];
println!("Operation: {}", &operation);
if operation == "encrypt" && args.len() == 4 {
let filename = &args[2];
let keyfile = &args[3];
println!("Encrypting File {}", &filename);
println!("With Keyfile: {}", &keyfile);
let key = read_file(keyfile)?;
let key: &str = from_utf8(&key)?;
let content = read_file(&filename)?;
let ciphertext: Vec<u8> = encrypt_file(content, &key)?;
let new_filename: String = filename.to_owned() + ".crpt";
save_file(ciphertext, &new_filename)?;
println!(
"Successfully enrypted file {} to {}",
filename, new_filename
);
} else if operation == "decrypt" && args.len() == 4 {
let filename = &args[2];
let keyfile = &args[3];
println!("Decrypting File {}", &filename);
println!("With Keyfile: {}", &keyfile);
let key = read_file(keyfile)?;
let key: &str = from_utf8(&key)?;
let filename_decrypted: &str = &filename[0..filename.find(".crpt").unwrap()];
let ciphertext = read_file(filename)?;
let plaintext: Vec<u8> = decrypt_file(ciphertext, &key)?;
save_file(plaintext, filename_decrypted)?;
println!(
"Successfully decrypted file {} to {}",
filename, filename_decrypted
);
} else if operation == "create-key" && args.len() == 3 {
let filename = &args[2];
println!("Create Keyfile {}", filename);
create_key(&filename)?;
println!("Keyfile {} created", filename);
} else if operation == "hash" && args.len() == 3 {
let filename = &args[2];
let hash = get_blake3_hash(&filename)?;
println!("File: {}. BLAKE3 hash: {:?}", filename, hash);
} else if operation == "hash_sha256" && args.len() == 3 {
let filename = &args[2];
let hash = get_sha256_hash(&filename)?;
println!("File: {}. SHA256 hash: {:?}", filename, hash);
} else if operation == "hash_sha512" && args.len() == 3 {
let filename = &args[2];
let hash = get_sha512_hash(&filename)?;
println!("File: {}. SHA512 hash: {:?}", filename, hash);
}
} else {
println!(
r#"Use "encrypt filename-to_encrypt filename-keyfile" or "decrypt filename-to_decrypt filename-keyfile" or "create-key filename-keyfile" or "hash filename" (using BLAKE3) or "hash_sha256 filename" or "hash_sha512 filename" "#
);
println!(r#"Example: "encrypt text.txt key.file""#);
}
Ok(())
}