in protocol/src/cross_psi_xor/company.rs [195:229]
fn generate_additive_shares(&self, feature_id: usize, values: TPayload) {
let t = timer::Builder::new()
.label("server")
.silent(true)
.extra_label("additive shares mask")
.build();
let filtered_values: TPayload =
if let Ok(mask) = self.partner_intersection_mask.clone().read() {
values
.iter()
.zip(mask.iter())
.filter(|(_, &b)| b)
.map(|(a, _)| a.clone())
.collect::<TPayload>()
} else {
panic!("unable to get masked vals")
};
if let (Ok(mut mask), Ok(mut partner_shares)) = (
self.additive_mask.clone().write(),
self.partner_shares.clone().write(),
) {
let mut rng = rand::thread_rng();
let range = Uniform::new(0_u64, u64::MAX);
*mask = (0..filtered_values.len())
.map(|_| rng.sample(&range))
.collect();
let res = self.he_cipher.xor_plaintext(filtered_values, &mask);
t.qps("masking values in the intersection", res.len());
partner_shares.insert(feature_id, res);
} else {
panic!("Unable to add additive shares with the intersection")
}
}