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}