}
/// Decrypt may fail if the provided data size isn't a multiple of 16.
-pub fn decrypt(cypherdata: &[u8], iv: &[u8]) -> Option<Vec<u8>> {
+pub fn decrypt(cipherdata: &[u8], iv: &[u8]) -> Option<Vec<u8>> {
let c = symm::Crypter::new(symm::AES_256_CBC);
c.init(symm::Decrypt, KEY_C, iv.to_vec());
c.pad(false); // Padding disabled!
- let r = c.update(cypherdata);
+ let r = c.update(cipherdata);
let rest = c.finalize();
if rest.is_empty() {
Some(r)
}})
}
+ #[allow(dead_code)]
pub fn close(&mut self) -> IoResult<()> {
self.end_point.close()
}
EndPoint { socket: socket, current_timestamp: 0 , variant: variant}
}
+ #[allow(dead_code)]
fn close(&mut self) -> IoResult<()> {
try!(self.socket.close_read());
try!(self.socket.close_write());
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 cipher_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 cipherblock. 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 => {
+ match oracle_machine::decipher(address, PORT, &xor_operand, &cipher_block, variant) {
+ Some(ref deciphered) if deciphered.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)
+ println!(" Decrypted block: {}", deciphered)
}
Some(ref other) =>
println!("The oracle machine hasn't found the clear block: {}", other),
use packet::{ Packet, Error };
use end_point::EndPoint;
-/// Try to decypher a cyphered data block by using the previous xor operand and an oracle on the provided address and port.
+/// Try to decipher a ciphered data block by using the previous xor operand and an oracle on the provided address and port.
/// May prints some message on the stdout.
-pub fn decypher(address: &str, port: u16, original_xor_operand: &[u8, ..16], cypherblock: &[u8, ..16], variant: packet::Variant) -> Option<Vec<u8>> {
+pub fn decipher(address: &str, port: u16, original_xor_operand: &[u8, ..16], cipherblock: &[u8, ..16], variant: packet::Variant) -> Option<Vec<u8>> {
let mut end_point = EndPoint::new(
match TcpStream::connect(address, port) {
Ok(s) => s,
let mut final_packet = [0u8, ..2 + 1 + 8 + 32 + 10];
final_packet[1] = 1 + 8 + 32 + 10; // Data length.
- copy_memory(final_packet.slice_mut(2 + 1 + 8 + 16, 2 + 1 + 8 + 32), cypherblock);
+ copy_memory(final_packet.slice_mut(2 + 1 + 8 + 16, 2 + 1 + 8 + 32), cipherblock);
- let mut decypher_block = [0u8, ..16]; // The result.
- let mut x_prime_block = [0u8, ..16]; // The cypher block ('cypherblock') after AES and before XOR.
+ let mut decipher_block = [0u8, ..16]; // The result.
+ let mut x_prime_block = [0u8, ..16]; // The cipher block ('cipherblock') after AES and before XOR.
let mut current_timestamp = 0u64;
let mut first_byte = 0u8; // Used to save the first byte for the first iteration.
forged_xor_operand(&mut final_packet)[byte] = v;
match end_point.send_raw_with_result(final_packet) {
- Ok(Ok(Packet { t: Error(packet::AuthError), .. })) => {
+ Ok(Ok(p @ Packet { t: Error(packet::AuthError), .. })) => {
+ println!("We received a MAC Error: {}", p);
// If we already got a MAC mismatch for the first byte then the second byte is incremented and the loop is replayed.
if byte == 15 && get_mac_mismatch_error {
let padding_value = 16 - byte;
x_prime_block[byte] = v ^ (padding_value as u8);
- decypher_block[byte] = x_prime_block[byte] ^ original_xor_operand[byte];
+ decipher_block[byte] = x_prime_block[byte] ^ original_xor_operand[byte];
// We set the processed bytes of the forged XOR operand to have the next padding value.
for i in range(16 - padding_value, 16) {
byte -= 1;
}
- Some(decypher_block.to_vec())
+ Some(decipher_block.to_vec())
}
\ No newline at end of file