Expand description
A simulator for the Maybenot framework. The Maybenot framework
is intended for traffic analysis defenses that can be used to hide patterns
in encrypted communication. The goal of the simulator is to assist in the
development of such defenses.
The simulator consists of two core functions: parse_trace and sim.
The intended use is to first parse a trace (e.g., from a pcap file or a
Website Fingerprinting dataset) using parse_trace, and then simulate the
trace using sim together with one or more Maybenot
Machines running at the client and/or
server. The output of the simulator can then be parsed to produce a
simulated trace that then in turn can be used to, e.g., train a Website
Fingerprinting attack.
§Example usage
use maybenot::{event::TriggerEvent, Machine};
use maybenot_simulator::{network::Network, parse_trace, sim};
use std::{str::FromStr, time::Duration};
// The first ten packets of a network trace from the client's perspective
// when visiting google.com. The format is: "time,direction\n". The
// direction is either "s" (sent) or "r" (received). The time is in
// nanoseconds since the start of the trace.
let raw_trace = "0,s
19714282,r
183976147,s
243699564,r
1696037773,s
2047985926,s
2055955094,r
9401039609,s
9401094589,s
9420892765,r";
// The network model for simulating the network between the client and the
// server. Currently just a delay.
let network = Network::new(Duration::from_millis(10), None);
// Parse the raw trace into a queue of events for the simulator. This uses
// the delay to generate a queue of events at the client and server in such
// a way that the client is ensured to get the packets in the same order and
// at the same time as in the raw trace.
let mut input_trace = parse_trace(raw_trace, network);
// A simple machine that sends one padding packet 20 milliseconds after the
// first normal packet is sent.
let m = "02eNp1ibEJAEAIA5Nf7B3N0v1cSESwEL0m5A6YvBqSgP7WeXfM5UoBW7ICYg==";
let m = Machine::from_str(m).unwrap();
// Run the simulator with the machine at the client. Run the simulation up
// until 100 packets have been recorded (total, client and server).
let trace = sim(&[m], &[], &mut input_trace, network.delay, 100, true);
// print packets from the client's perspective
let starting_time = trace[0].time;
trace
.into_iter()
.filter(|p| p.client)
.for_each(|p| match p.event {
TriggerEvent::TunnelSent => {
if p.contains_padding {
println!(
"sent a padding packet at {} ms",
(p.time - starting_time).as_millis()
);
} else {
println!(
"sent a normal packet at {} ms",
(p.time - starting_time).as_millis()
);
}
}
TriggerEvent::TunnelRecv => {
if p.contains_padding {
println!(
"received a padding packet at {} ms",
(p.time - starting_time).as_millis()
);
} else {
println!(
"received a normal packet at {} ms",
(p.time - starting_time).as_millis()
);
}
}
_ => {}
});
// Output:
// sent a normal packet at 0 ms
// received a normal packet at 19 ms
// sent a padding packet at 20 ms
// sent a normal packet at 183 ms
// received a normal packet at 243 ms
// sent a normal packet at 1696 ms
// sent a normal packet at 2047 ms
// received a normal packet at 2055 ms
// sent a normal packet at 9401 ms
// sent a normal packet at 9401 ms
// received a normal packet at 9420 msModules§
- delay
- integration
- network
- For simulating the network stack and network between client and server.
- queue
- The main queue of events in the simulator.
- queue_
event - queue_
peek - Functions for peeking at the possible next events in the simulation.
Structs§
- Scheduled
Action - ScheduledAction represents an action that is scheduled to be executed at a certain time.
- SimEvent
- SimEvent represents an event in the simulator. It is used internally to represent events that are to be processed by the simulator (in SimQueue) and events that are produced by the simulator (the resulting trace).
- SimState
- The state of the client or the server in the simulator.
- Simulator
Args - Arguments for
sim_advanced.
Functions§
- parse_
trace - Parse a trace into a
SimQueuefor use withsim. - parse_
trace_ advanced - sim
- The main simulator function.
- sim_
advanced - Like
sim, but allows to (i) set the maximum padding and blocking fractions for the client and server, (ii) specify the maximum number of iterations to run the simulator for, and (iii) only returning client events.