+fn do_oracle_attack(address: &str, variant: packet::Variant) {
+ // 16 bytes encrypted data from 'Packet::random_packet_data([4])'.
+ let cipher_block = [191, 192, 149, 84, 202, 163, 109, 230, 173, 249, 170, 248, 83, 60, 228, 111]; // Known by the attacker.
+ let xor_operand = [213, 29, 217, 187, 93, 103, 76, 129, 233, 142, 98, 83, 69, 50, 97, 91]; // This is the IV or the previous 16 bytes cipherblock. In our case we took the previous block.
+ let expected_plain_block = [242, 93, 12, 22, 8, 164, 4, 77, 200, 120, 189, 71, 75, 189, 2, 2]; // To be found by the attacker.
+
+ /* Another sample with an IV instead of a previous block.
+ let cipher_block: [u8, ..16] = [254, 9, 228, 149, 60, 42, 165, 34, 233, 75, 112, 57, 37, 9, 116, 103];
+ let xor_operand: [u8, ..16] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3]; IV.
+ let expected_plain_block: [u8, ..16] = [44, 92, 31, 98, 220, 84, 226, 53, 58, 94, 45, 25, 242, 6, 199, 1];
+ */
+
+ match oracle_machine::decipher(address, PORT, &xor_operand, &cipher_block, variant) {
+ Some(ref deciphered) if deciphered.as_slice() == expected_plain_block => {
+ println!("The oracle machine has found the plain block!:");
+ println!(" Expected block: {}", expected_plain_block.to_vec());
+ println!(" Decrypted block: {}", deciphered)
+ }
+ Some(ref other) =>
+ println!("The oracle machine hasn't found the plain block: {}", other),
+ _ =>
+ println!("The oracle machine hasn't found the plain block"),
+ }
+}
+