X-Git-Url: http://git.euphorik.ch/?p=crypto_lab1.git;a=blobdiff_plain;f=lab1_rust%2Fsrc%2Fmain.rs;h=0b14951a5777aba87219ad5143a4e4015dd70b44;hp=64aef28e128a89381fd18f561f08c422dd12ef8e;hb=ed4d8f3e7e028bf645089edb775af84e6c3f7bd4;hpb=ecdec5bf7022018eadf4a38b01890bbb3ab79c89 diff --git a/lab1_rust/src/main.rs b/lab1_rust/src/main.rs index 64aef28..0b14951 100644 --- a/lab1_rust/src/main.rs +++ b/lab1_rust/src/main.rs @@ -17,7 +17,7 @@ const PORT: u16 = 4221; fn print_usage() { println!( - r"{} genkey | tests | oracle-weak | oracle-fixed + r"{} [genkey | tests | oracle-weak | oracle-fixed] genkey: Generate a 256 bits key tests: launch some tests between a client and a weak server oracle-weak: launch a padding oracle attack against a weak server @@ -26,34 +26,88 @@ fn print_usage() { ); } -fn main() { +fn do_oracle_attack(address: &str, variant: packet::Variant) { + // 16 bytes encrypted data from 'Packet::random_packet_data([4])'. + let cypher_block: [u8, ..16] = [254, 9, 228, 149, 60, 42, 165, 34, 233, 75, 112, 57, 37, 9, 116, 103]; // Known by the attacker. + let xor_operand: [u8, ..16] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3]; // This is the IV or the previous 16 bytes cypherblock. In our case we took the IV. + + let expected_clear_block: [u8, ..16] = [44, 92, 31, 98, 220, 84, 226, 53, 58, 94, 45, 25, 242, 6, 199, 1]; // To be found by the attacker. + + match oracle_machine::decypher(address, PORT, &xor_operand, &cypher_block, variant) { + Some(ref decyphered) if decyphered.as_slice() == expected_clear_block => { + println!("The oracle machine has found the clear block!:"); + println!(" Expected block: {}", expected_clear_block.to_vec()); + println!(" Decrypted block: {}", decyphered) + } + Some(ref other) => + println!("The oracle machine hasn't found the clear block: {}", other), + _ => + println!("The oracle machine hasn't found the clear block"), + } +} + +enum Mode { + Help, + ServerAlone, + GenKey, + Tests, + OracleWeak, + OracleFixed, +} + +fn mode() -> Mode { let args = os::args(); if args.iter().any(|a| a.as_slice() == "--help" || a.as_slice() == "-h") { - print_usage(); - } else if args.len() > 1 && args[1].as_slice() == "genkey" { - match crypto::generate_key(256 / 8) { - Ok(key) => println!("key: {}", key), - Err(e) => println!("Unable to generate a key. Error: {}", e) - } + return Help + } + + if args.len() <= 1 { + ServerAlone } else { - println!("Starting server..."); + match args[1].as_slice() { + "genkey" => GenKey, + "tests" => Tests, + "oracle-weak" => OracleWeak, + "oracle-fixed" => OracleFixed, + _ => ServerAlone, + } + } +} - match Server::new("::1", PORT) { - Ok(mut server) => { - println!("Server started"); +fn main() { + let mode = mode(); + + match mode { + Help => print_usage(), + GenKey => + match crypto::generate_key(256 / 8) { + Ok(key) => println!("key: {}", key), + Err(e) => println!("Unable to generate a key. Error: {}", e) + }, + _ => { + let address = "::1"; + println!("Starting server on [{}]:{}...", address, PORT); - if args.len() > 1 && args[1].as_slice() == "tests" { - Client::start_tests("::1", PORT); - } + match Server::new(address, PORT, match mode { OracleFixed => packet::Fixed, _ => packet::Weak }) { + Ok(mut server) => { + println!("Server started"); - println!("Press any key to quit"); - io::stdin().read_line().ok().expect("Failed to read line"); + match mode { + Tests => Client::start_tests(address, PORT, packet::Weak), + OracleWeak => do_oracle_attack(address, packet::Weak), + OracleFixed => do_oracle_attack(address, packet::Fixed), + _ => { + println!("Press any key to quit"); + io::stdin().read_line().ok().expect("Failed to read line"); + } + } - server.close().ok().expect("Failed to close the server"); - }, - Err(e) => - println!("Unable to create a new server. Error: {}", e) + server.close().ok().expect("Failed to close the server"); + }, + Err(e) => + println!("Unable to create a new server. Error: {}", e) + } } } }