fuzzytags-sim/src/parties.rs

61 lines
2.2 KiB
Rust
Raw Normal View History

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;
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,
{
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);
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);
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,
{
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());
let receiver_public_key = self.parties.get(receiver).unwrap().public_key();
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 {
let tag = receiver_public_key.generate_tag();
event!(Level::TRACE, "message sent to {tag}", tag = tag.to_string());
2021-02-01 07:50:59 +00:00
server.add_message(tag);
}
}
}