use enc_file::{
create_key, decrypt_file_aes, decrypt_file_chacha, encrypt_file_aes, encrypt_file_chacha, get_blake3_hash, get_sha256_hash, get_sha512_hash,
read_file, save_file,
};
use serde::{Deserialize, Serialize};
use std::env;
use std::path::PathBuf;
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 = PathBuf::from(&args[2]);
let keyfile = PathBuf::from(&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_chacha(content, &key)?;
let new_filename: String =
filename.clone().into_os_string().into_string().unwrap() + ".crpt";
let new_filename: PathBuf = PathBuf::from(new_filename);
save_file(ciphertext, &new_filename)?;
println!(
"Successfully enrypted file {:?} to {:?}",
filename, new_filename
);
} if operation == "encrypt_aes" && args.len() == 4 {
let filename = PathBuf::from(&args[2]);
let keyfile = PathBuf::from(&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_aes(content, &key)?;
let new_filename: String =
filename.clone().into_os_string().into_string().unwrap() + ".crpt";
let new_filename: PathBuf = PathBuf::from(new_filename);
save_file(ciphertext, &new_filename)?;
println!(
"Successfully enrypted file {:?} to {:?}",
filename, new_filename
);
} else if operation == "decrypt" && args.len() == 4 {
let filename = PathBuf::from(&args[2]);
let keyfile = PathBuf::from(&args[3]);
println!("Decrypting File {:?}", &filename);
println!("With Keyfile: {:?}", &keyfile);
let key = read_file(&keyfile)?;
let key: &str = from_utf8(&key)?;
let filename_two = &filename.clone();
let filename_decrypted: &str =
&filename_two.to_str().unwrap().replace("crpt", "plaintext");
let filename_decrypted_path: PathBuf = PathBuf::from(filename_decrypted);
let ciphertext = read_file(&filename)?;
let plaintext: Vec<u8> = decrypt_file_chacha(ciphertext, &key)?;
save_file(plaintext, &filename_decrypted_path)?;
println!(
"Successfully decrypted file {:?} to {:?}",
filename, filename_decrypted
);
} else if operation == "decrypt_aes" && args.len() == 4 {
let filename = PathBuf::from(&args[2]);
let keyfile = PathBuf::from(&args[3]);
println!("Decrypting File {:?}", &filename);
println!("With Keyfile: {:?}", &keyfile);
let key = read_file(&keyfile)?;
let key: &str = from_utf8(&key)?;
let filename_two = &filename.clone();
let filename_decrypted: &str =
&filename_two.to_str().unwrap().replace("crpt", "plaintext");
let filename_decrypted_path: PathBuf = PathBuf::from(filename_decrypted);
let ciphertext = read_file(&filename)?;
let plaintext: Vec<u8> = decrypt_file_aes(ciphertext, &key)?;
save_file(plaintext, &filename_decrypted_path)?;
println!(
"Successfully decrypted file {:?} to {:?}",
filename, filename_decrypted
);
} else if operation == "create-key" && args.len() == 3 {
let filename = PathBuf::from(&args[2]);
println!("Create Keyfile {:?}", filename);
create_key(&filename)?;
println!("Keyfile {:?} created", filename);
} else if operation == "hash" && args.len() == 3 {
let filename = PathBuf::from(&args[2]);
let hash = get_blake3_hash(&filename)?;
println!("File: {:?}. BLAKE3 hash: {:?}", filename, hash);
} else if operation == "hash_sha256" && args.len() == 3 {
let filename = PathBuf::from(&args[2]);
let hash = get_sha256_hash(&filename)?;
println!("File: {:?}. SHA256 hash: {:?}", filename, hash);
} else if operation == "hash_sha512" && args.len() == 3 {
let filename = PathBuf::from(&args[2]);
let hash = get_sha512_hash(&filename)?;
println!("File: {:?}. SHA512 hash: {:?}", filename, hash);
}
} else {
println!(
r#"Use "encrypt filename-to_encrypt filename-keyfile" to encrypt a file using XChaCha20Poly1305 or
"encrypt_aes filename-to_encrypt filename-keyfile" to encrypt a file using AES-GCM-SIV or
"decrypt filename-to_decrypt filename-keyfile" to decrypt a file using XChaCha20Poly1305 or
"decrypt_aes filename-to_decrypt filename-keyfile" to decrypt a file using AES-GCM-SIV or
"create-key filename-keyfile" to create a new random keyfile or
"hash filename" (using BLAKE3) to calculate the BLAKE3 hash for a file or
"hash_sha256 filename" to calculate the SHA256 hash for a file or
"hash_sha512 filename" ro calculate the SHA512 hash for a file"#
);
println!(r#"Example: "encrypt text.txt key.file""#);
}
Ok(())
}