extern crate ios7crypt;
extern crate rand;
extern crate getopts;
use getopts::Options;
use std::process;
use std::env;
fn usage(brief : &String, opts : &getopts::Options) {
println!("{}", (*opts).usage(brief));
process::exit(0);
}
fn main() {
let mut rng = rand::thread_rng();
let args : Vec<String> = env::args().collect();
let program : &str = args[0].as_ref();
let brief = format!("Usage: {} [options]", program);
let mut opts : getopts::Options = Options::new();
opts.optflag("h", "help", "print usage info");
opts.optflag("v", "version", "print version info");
opts.optopt("e", "encrypt", "encrypt a password", "VAL");
opts.optopt("d", "decrypt", "decrypt a hash", "VAL");
let optresult : Result<getopts::Matches, getopts::Fail> = opts.parse(&args[1..]);
if optresult.is_err() {
usage(&brief, &opts);
}
let optmatches : getopts::Matches = optresult.unwrap();
if optmatches.opt_present("e") {
let password = optmatches.opt_str("encrypt").unwrap();
println!("{}", ios7crypt::encrypt(&mut(rng), &password));
}
else if optmatches.opt_present("d") {
let hash = optmatches.opt_str("decrypt").unwrap();
let password_option = ios7crypt::decrypt(&hash);
if password_option.is_none() {
println!("Invalid hash");
process::exit(1);
}
println!("{}", password_option.unwrap())
}
else if optmatches.opt_present("v") {
println!("{} {}", program, env!("CARGO_PKG_VERSION"));
} else {
usage(&brief, &opts);
}
}