arnaucube
arnaucube/phantom-zonePublic Self-hosted repository
phantom-zone/src/bool/ni_mp_api.rs
src/bool/ni_mp_api.rsRaw
 1mod impl_enc_dec {
 2    use crate::{
 3        bool::{
 4            evaluator::{BoolEncoding, BoolEvaluator},
 5            keys::NonInteractiveMultiPartyClientKey,
 6            parameters::CiphertextModulus,
 7        },
 8        pbs::PbsInfo,
 9        random::{DefaultSecureRng, NewWithSeed},
10        rgsw::secret_key_encrypt_rlwe,
11        utils::{TryConvertFrom1, WithLocal},
12        Encryptor, Matrix, RowEntity,
13    };
14    use num_traits::Zero;
15
16    trait SeededCiphertext<M, S> {
17        fn new_with_seed(data: M, seed: S) -> Self;
18    }
19
20    type Mat = Vec<Vec<u64>>;
21
22    impl<K, C> Encryptor<[bool], C> for K
23    where
24        K: NonInteractiveMultiPartyClientKey,
25        C: SeededCiphertext<<Mat as Matrix>::R, <DefaultSecureRng as NewWithSeed>::Seed>,
26        <Mat as Matrix>::R:
27            TryConvertFrom1<[K::Element], CiphertextModulus<<Mat as Matrix>::MatElement>>,
28    {
29        fn encrypt(&self, m: &[bool]) -> C {
30            BoolEvaluator::with_local(|e| {
31                let parameters = e.parameters();
32                assert!(m.len() <= parameters.rlwe_n().0);
33
34                let mut message = vec![<Mat as Matrix>::MatElement::zero(); parameters.rlwe_n().0];
35                m.iter().enumerate().for_each(|(i, v)| {
36                    if *v {
37                        message[i] = parameters.rlwe_q().true_el()
38                    } else {
39                        message[i] = parameters.rlwe_q().false_el()
40                    }
41                });
42
43                DefaultSecureRng::with_local_mut(|rng| {
44                    let mut seed = <DefaultSecureRng as NewWithSeed>::Seed::default();
45                    rng.fill_bytes(&mut seed);
46                    let mut prng = DefaultSecureRng::new_seeded(seed);
47
48                    let mut rlwe_out =
49                        <<Mat as Matrix>::R as RowEntity>::zeros(parameters.rlwe_n().0);
50
51                    secret_key_encrypt_rlwe(
52                        &message,
53                        &mut rlwe_out,
54                        &self.sk_u_rlwe(),
55                        e.pbs_info().modop_rlweq(),
56                        e.pbs_info().nttop_rlweq(),
57                        &mut prng,
58                        rng,
59                    );
60
61                    C::new_with_seed(rlwe_out, seed)
62                })
63            })
64        }
65    }
66}