fn generate_additive_shares()

in protocol/src/cross_psi/company.rs [212:246]


    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(key), Ok(mut mask), Ok(mut partner_shares)) = (
            self.partner_he_public_key.clone().read(),
            self.additive_mask.clone().write(),
            self.partner_shares.clone().write(),
        ) {
            let mut rng = rand::thread_rng();
            *mask = (0..filtered_values.len())
                .map(|_| rng.gen_biguint_range(&BigUint::zero(), &key.n))
                .collect();

            let res = subtract_plaintext(&key, 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")
        }
    }