use packet;
use packet::{ Packet, Command, Answer, Error, ReadingResult, PacketType };
+// Default timeout when waiting data on a stream (for instance: 'TcpStream::read').
static DEFAULT_TIMEOUT: Option<u64> = Some(500); // [ms].
pub struct Server {
}
/// Send some valid and not-valid packets to the server and check the result.
+ /// For each test a new client is created.
pub fn start_tests(address: &str, port: u16) {
let execute = |f: &mut |&mut Client| -> bool| -> bool {
match Client::new(address, port) {
}
let mut tests = vec!(
+ // 1)
|client: &mut Client| -> bool {
- println!("Send a valid packet...");
+ println!("Sending a valid packet...");
match client.end_point.send_with_result(Command(Packet::random_packet_data([42]))) {
Ok(Ok(Packet { t: Answer(..), .. })) => true,
other => {
}
}
},
-
+ // 2)
|client: &mut Client| -> bool {
- println!("Send a packet with an unknown type...");
+ println!("Sending a packet with an unknown type...");
client.end_point.current_timestamp += 1;
let mut raw_packet = raw_packet(client.end_point.current_timestamp);
raw_packet[2] = 0xEE; // Alter the type.
}
}
},
-
+ // 3)
|client: &mut Client| -> bool {
- println!("Send a packet with an old timestamp...");
+ println!("Sending a packet with an old timestamp...");
client.end_point.current_timestamp += 1;
let raw_packet = raw_packet(0);
match client.end_point.send_raw_with_result(raw_packet.as_slice()) {
}
}
},
-
+ // 4)
|client: &mut Client| -> bool {
- println!("Send a packet with altered crypted data...");
+ println!("Sending a packet with altered crypted data (do not alter the padding)...");
client.end_point.current_timestamp += 1;
let mut raw_packet = raw_packet(client.end_point.current_timestamp);
raw_packet[11] = 0xDE;
}
}
},
-
+ // 5)
|client: &mut Client| -> bool {
- println!("Send a packet with too small data...");
+ println!("Sending a packet with too small data...");
let command = Command(Packet::new_packet_data(0, Vec::from_elem(6, 0x00)));
match client.end_point.send_with_result(command) {
Ok(Err(packet::IOReadError( IoError { kind: io::TimedOut, .. }))) => true, // OK: the server should not send any packet.
}
}
},
-
+ // 6)
|client: &mut Client| -> bool {
- println!("Send a packet with too large data...");
+ println!("Sending a packet with too large data...");
let command = Command(Packet::new_packet_data(0, Vec::from_elem(40, 0x00)));
match client.end_point.send_with_result(command) {
Ok(Err(packet::IOReadError( IoError { kind: io::TimedOut, .. }))) => true, // OK: the server should not send any packet.
}
}
},
-
+ // 7)
|client: &mut Client| -> bool {
- println!("Send a packet with wrong padding...");
+ println!("Sending a packet with wrong padding (all 0)...");
client.end_point.current_timestamp += 1;
let mut m = MemWriter::new();
let raw_packet = match (Packet { t: Command(Packet::random_packet_data([42])), timestamp: client.end_point.current_timestamp }).write_with_padding_fun(&mut m, |_, _| -> u8 { 0 }) {
Err(e) => println!("Unable to generate a key. Error: {}", e)
}
} else {
- println!("Starting server..., Press any key to quit");
+ println!("Starting server...");
match Server::new("::1", PORT) {
Ok(mut server) => {
println!("Server started");
+
Client::start_tests("::1", PORT);
+
+ 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) =>
/// I: Command ID
/// C: Command payload (from 7 to 39 bytes)
/// P: Padding from 1 to 16, |I|C...C|P...P| size must be a multiple of 16
-/// |"0000000000000000"| for error packet (16 bytes length)
+/// |0000000000000000| for error packet (16 bytes length)
/// MMMMMMMMMM: first 10 bytes (most significant) of the HMAC-SHA256 of:
/// |I|C...C| for command ans answer packet
-/// |"0000000000"| for error packet
+/// |0000000000000000| for error packet
#[deriving(Show)]
pub struct Packet {
pub t: PacketType,
let mut data =
match self.t {
Command(ref p) | Answer(ref p) => packet_data(p),
- Error(_) => Vec::from_elem(16, '0' as u8) // Padding as data: 16 * '0'.
+ Error(_) => Vec::from_elem(16, 0) // Padding as data: 16 * 0.
};
// Compute the MAC
_ => ()
}
+ println!("data not crypted: {}", data);
+
// Encrypt.
let encrypted_data = crypto::encrypt(data.as_slice(), iv_from_timestamp(self.timestamp).as_slice());
+ println!("data crypted: {}", encrypted_data);
+
// Write packet length.
try_write_io!(output.write_be_u16((encrypted_data.len() + FIXED_PACKET_SIZE) as u16));
_ => {
if data.len() != 16 {
return Err(UnconsistentDataSizeError)
- } else if data != Vec::from_elem(16, '0' as u8) {
+ } else if data != Vec::from_elem(16, 0) {
return Err(DataError)
}
match packet_type { 0x0A => Error(CryptError), _ => Error(AuthError) }