fuzzytags-sim/src/parties.rs

87 lines
3.5 KiB
Rust
Raw Normal View History

2021-02-03 13:05:59 +00:00
use crate::oracle::Oracle;
2021-02-01 07:50:59 +00:00
use crate::server::SimulatedServer;
2021-02-14 04:43:54 +00:00
use fuzzytags::{RootSecret, TaggingKey};
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-10 07:23:50 +00:00
parties: Vec<RootSecret<24>>,
2021-02-01 07:50:59 +00:00
}
impl SimulatedParties {
2021-02-10 07:23:50 +00:00
pub fn new_simulation(num_parties: usize) -> SimulatedParties {
2021-02-01 07:50:59 +00:00
let mut parties = vec![];
for _p in 0..num_parties {
2021-02-10 07:23:50 +00:00
let key = RootSecret::<24>::generate();
2021-02-01 07:50:59 +00:00
parties.push(key);
}
2021-02-10 07:23:50 +00:00
SimulatedParties { parties }
2021-02-01 07:50:59 +00:00
}
2021-02-03 13:05:59 +00:00
pub fn register_with_server<R>(&self, server: &mut SimulatedServer, rng: &mut R, min_p: usize, max_p: usize, oracle: &mut Oracle)
2021-02-01 07:50:59 +00:00
where
R: Rng,
{
for party in self.parties.iter() {
let n = rng.gen_range(min_p..max_p);
2021-02-10 07:23:50 +00:00
let span = span!(Level::INFO, "register", party = party.tagging_key().id().as_str());
let _enter = span.enter();
2021-02-10 07:23:50 +00:00
let detection_key = party.extract_detection_key(n);
event!(Level::TRACE, "create detection key {detection_key}", detection_key = detection_key.id().as_str());
event!(Level::TRACE, "register with server");
2021-02-10 07:23:50 +00:00
server.register_key(&detection_key, &party.tagging_key());
oracle.register_party(party.tagging_key().id());
2021-02-01 07:50:59 +00:00
}
}
2021-02-03 13:05:59 +00:00
pub fn sample_traffic<R, D>(&self, server: &mut SimulatedServer, rng: &mut R, distribution: D, probs_entangled: f64, oracle: &mut Oracle)
2021-02-01 07:50:59 +00:00
where
D: Distribution<f64>,
R: Rng,
{
2021-02-03 00:38:45 +00:00
let span = span!(Level::INFO, "sample_traffic");
let _enter = span.enter();
2021-02-01 07:50:59 +00:00
let v = distribution.sample(rng).to_u16().unwrap();
2021-02-03 13:05:59 +00:00
let sender = rng.gen_range(0..self.parties.len());
2021-02-10 07:23:50 +00:00
let sender_public_key = self.parties.get(sender).unwrap().tagging_key();
2021-02-03 13:05:59 +00:00
2021-02-01 07:50:59 +00:00
let receiver = rng.gen_range(0..self.parties.len());
2021-02-10 07:23:50 +00:00
let receiver_public_key = self.parties.get(receiver).unwrap().tagging_key();
2021-02-03 13:05:59 +00:00
if sender != receiver {
let entangle = rng.gen_bool(probs_entangled);
if entangle {
let receiver_2 = rng.gen_range(0..self.parties.len());
2021-02-10 07:23:50 +00:00
let receiver_public_key_2 = self.parties.get(receiver_2).unwrap().tagging_key();
2021-02-03 13:05:59 +00:00
event!(
Level::INFO,
"entangled send {party_1} {party_2}",
party_1 = receiver_public_key.id().as_str(),
party_2 = receiver_public_key_2.id().as_str()
);
2021-02-03 00:38:45 +00:00
2021-02-03 13:05:59 +00:00
for _i in 0..v {
2021-02-10 07:23:50 +00:00
let tag = TaggingKey::<24>::generate_entangled_tag(vec![receiver_public_key.clone(), receiver_public_key_2.clone()], 8);
2021-02-03 13:05:59 +00:00
event!(Level::TRACE, "message sent to server {tag}", tag = tag.to_string());
server.add_message(tag, &sender_public_key);
}
2021-02-14 04:43:54 +00:00
oracle.add_event(sender_public_key.id().clone(), receiver_public_key.id(), Some(receiver_public_key_2.id()), 1.0);
2021-02-03 13:05:59 +00:00
} else {
event!(Level::INFO, "regular send {party}", party = receiver_public_key.id().as_str());
for _i in 0..v {
let tag = receiver_public_key.generate_tag();
event!(Level::INFO, "message sent server {tag}", tag = tag.to_string());
server.add_message(tag, &sender_public_key);
}
2021-02-14 04:43:54 +00:00
oracle.add_event(sender_public_key.id().clone(), receiver_public_key.id(), None, 1.0);
2021-02-03 00:38:45 +00:00
}
2021-02-01 07:50:59 +00:00
}
}
}