From b46276851e2bf6b9a2cc0db87d9f48c4d709f7a4 Mon Sep 17 00:00:00 2001 From: Sarah Jamie Lewis Date: Tue, 2 Feb 2021 16:38:45 -0800 Subject: [PATCH] Add entangled tags --- Cargo.toml | 2 +- src/main.rs | 5 ++++- src/parties.rs | 38 ++++++++++++++++++++++++++++---------- 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 9ede177..773487c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -fuzzytags = "0.2.0" +fuzzytags = {version="0.2.1", features=["entangled"]} rand = "0.8.3" rand_distr = "0.4.0" hashbrown = "0.9.1" diff --git a/src/main.rs b/src/main.rs index 14618e3..96d36ff 100644 --- a/src/main.rs +++ b/src/main.rs @@ -36,6 +36,9 @@ struct Opts { #[clap(short, long)] trace: bool, + + #[clap(short, long, default_value = "0")] + prob_entangled: f64, } fn main() { @@ -59,7 +62,7 @@ fn main() { { event!(Level::INFO, "Simulating message sends using {} samples from a pareto distribution...", opts.samples_per_round); - (0..opts.samples_per_round).for_each(|_i| simulated_parties.sample_traffic(&mut server, &mut rng, pareto)); + (0..opts.samples_per_round).for_each(|_i| simulated_parties.sample_traffic(&mut server, &mut rng, pareto, opts.prob_entangled)); } { diff --git a/src/parties.rs b/src/parties.rs index fe0f401..ff83a33 100644 --- a/src/parties.rs +++ b/src/parties.rs @@ -1,5 +1,5 @@ use crate::server::SimulatedServer; -use fuzzytags::FuzzySecretKey; +use fuzzytags::{FuzzyPublicKey, FuzzySecretKey}; use rand::distributions::Distribution; use rand::Rng; use rand_distr::num_traits::ToPrimitive; @@ -8,6 +8,7 @@ use tracing::span; use tracing::Level; pub struct SimulatedParties { + gamma: usize, parties: Vec, } @@ -18,7 +19,7 @@ impl SimulatedParties { let key = FuzzySecretKey::generate(gamma); parties.push(key); } - SimulatedParties { parties } + SimulatedParties { gamma, parties } } pub fn register_with_server(&self, server: &mut SimulatedServer, rng: &mut R, min_p: usize, max_p: usize) @@ -38,23 +39,40 @@ impl SimulatedParties { } } - pub fn sample_traffic(&self, server: &mut SimulatedServer, rng: &mut R, distribution: D) + pub fn sample_traffic(&self, server: &mut SimulatedServer, rng: &mut R, distribution: D, probs_entangled: f64) where D: Distribution, R: Rng, { - let span = span!(Level::TRACE, "sample_traffic"); + let span = span!(Level::INFO, "sample_traffic"); let _enter = span.enter(); 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(); - for _i in 0..v { - let tag = receiver_public_key.generate_tag(); - event!(Level::TRACE, "message sent to {tag}", tag = tag.to_string()); - server.add_message(tag); + let entangle = rng.gen_bool(probs_entangled); + if entangle { + let receiver_2 = rng.gen_range(0..self.parties.len()); + let receiver_public_key_2 = self.parties.get(receiver_2).unwrap().public_key(); + 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() + ); + + for _i in 0..v { + let tag = FuzzyPublicKey::generate_entangled_tag(vec![receiver_public_key.clone(), receiver_public_key_2.clone()], self.gamma); + event!(Level::TRACE, "message sent to server {tag}", tag = tag.to_string()); + server.add_message(tag); + } + } 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); + } } } }