2021-02-01 07:50:59 +00:00
|
|
|
use crate::server::SimulatedServer;
|
2021-02-01 22:27:49 +00:00
|
|
|
use fuzzytags::FuzzySecretKey;
|
2021-02-01 07:50:59 +00:00
|
|
|
use rand::distributions::Distribution;
|
|
|
|
use rand::Rng;
|
|
|
|
use rand_distr::num_traits::ToPrimitive;
|
2021-02-02 02:33:43 +00:00
|
|
|
use tracing::event;
|
|
|
|
use tracing::span;
|
|
|
|
use tracing::Level;
|
2021-02-01 07:50:59 +00:00
|
|
|
|
|
|
|
pub struct SimulatedParties {
|
2021-02-01 22:27:49 +00:00
|
|
|
parties: Vec<FuzzySecretKey>,
|
2021-02-01 07:50:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
impl SimulatedParties {
|
|
|
|
pub fn new_simulation(num_parties: usize, gamma: usize) -> SimulatedParties {
|
|
|
|
let mut parties = vec![];
|
|
|
|
for _p in 0..num_parties {
|
2021-02-01 22:27:49 +00:00
|
|
|
let key = FuzzySecretKey::generate(gamma);
|
2021-02-01 07:50:59 +00:00
|
|
|
parties.push(key);
|
|
|
|
}
|
|
|
|
SimulatedParties { parties }
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn register_with_server<R>(&self, server: &mut SimulatedServer, rng: &mut R, min_p: usize, max_p: usize)
|
|
|
|
where
|
|
|
|
R: Rng,
|
|
|
|
{
|
2021-02-02 02:33:43 +00:00
|
|
|
let span = span!(Level::TRACE, "register_with_server");
|
|
|
|
let _enter = span.enter();
|
2021-02-01 07:50:59 +00:00
|
|
|
for party in self.parties.iter() {
|
|
|
|
let n = rng.gen_range(min_p..max_p);
|
2021-02-02 02:33:43 +00:00
|
|
|
let span = span!(Level::TRACE, "{register}", party = party.public_key().id().as_str());
|
|
|
|
let _enter = span.enter();
|
2021-02-01 22:27:49 +00:00
|
|
|
let detection_key = party.extract(n);
|
2021-02-02 02:33:43 +00:00
|
|
|
event!(Level::TRACE, "create detection key {detection_key}", detection_key = detection_key.id().as_str());
|
|
|
|
event!(Level::TRACE, "register with server");
|
2021-02-01 22:27:49 +00:00
|
|
|
server.register_key(&detection_key, &party.public_key());
|
2021-02-01 07:50:59 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn sample_traffic<R, D>(&self, server: &mut SimulatedServer, rng: &mut R, distribution: D)
|
|
|
|
where
|
|
|
|
D: Distribution<f64>,
|
|
|
|
R: Rng,
|
|
|
|
{
|
2021-02-02 02:33:43 +00:00
|
|
|
let span = span!(Level::TRACE, "sample_traffic");
|
|
|
|
let _enter = span.enter();
|
2021-02-01 07:50:59 +00:00
|
|
|
let v = distribution.sample(rng).to_u16().unwrap();
|
|
|
|
let receiver = rng.gen_range(0..self.parties.len());
|
2021-02-01 23:23:01 +00:00
|
|
|
let receiver_public_key = self.parties.get(receiver).unwrap().public_key();
|
2021-02-02 02:33:43 +00:00
|
|
|
|
|
|
|
let span = span!(Level::TRACE, "{party}", party = receiver_public_key.id().as_str());
|
|
|
|
let _enter = span.enter();
|
2021-02-01 07:50:59 +00:00
|
|
|
for _i in 0..v {
|
2021-02-01 23:23:01 +00:00
|
|
|
let tag = receiver_public_key.generate_tag();
|
2021-02-02 02:33:43 +00:00
|
|
|
event!(Level::TRACE, "message sent to {tag}", tag = tag.to_string());
|
2021-02-01 07:50:59 +00:00
|
|
|
server.add_message(tag);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|