use clap::Parser;
use crc32_v2::byfour::crc32_little;
use std::fs::File;
use std::io::Write;
use stegano::cli::{Cli, SteganoCommands};
use stegano::models::MetaChunk;
use stegano::utils::xor_encode_decode;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let args = Cli::parse();
match args.command {
Some(command) => match command {
SteganoCommands::Encrypt(encrypt_cmd) => {
let mut file = File::open(encrypt_cmd.input.clone())?;
let mut meta_chunk = MetaChunk::new(&mut file, encrypt_cmd.suppress)
.expect("Error processing the png file!");
let mut file_writer = File::create(encrypt_cmd.output.clone())?;
let encoded_data =
xor_encode_decode(encrypt_cmd.payload.as_bytes(), &encrypt_cmd.key);
if !encrypt_cmd.suppress {
println!("Encoded bytes {:?}", encoded_data);
}
let mut bytes_msb = Vec::new();
bytes_msb
.write_all(&meta_chunk.chk.r#type.to_be_bytes())
.unwrap();
bytes_msb.write_all(&encoded_data).unwrap();
let crc = crc32_little(meta_chunk.chk.crc, &bytes_msb);
meta_chunk.chk.data = encoded_data;
meta_chunk.chk.crc = crc;
let mut file_reader = &file;
meta_chunk.write_encrypted_data(&mut file_reader, &encrypt_cmd, &mut file_writer);
println!("Image encoded and written successfully!");
}
SteganoCommands::Decrypt(decrypt_cmd) => {
let mut file = File::open(decrypt_cmd.input.clone())?;
let mut meta_chunk = MetaChunk::new(&mut file, decrypt_cmd.suppress)
.expect("Error processing the png file!");
let mut file_writer = File::create(decrypt_cmd.output.clone()).unwrap();
let mut file_reader = &file;
meta_chunk.write_decrypted_data(&mut file_reader, &decrypt_cmd, &mut file_writer);
}
SteganoCommands::ShowMeta(show_meta_cmd) => {
let mut file = File::open(show_meta_cmd.input.clone())?;
let mut meta_chunk = MetaChunk::new(&mut file, show_meta_cmd.suppress)
.expect("Error processing the png file!");
meta_chunk.process_image(&mut file, &show_meta_cmd);
return Ok(());
}
},
None => println!(
"\x1b[1;91m{}\x1b[0m",
"Unknown command. Use 'help' for usage instructions."
),
}
Ok(())
}