mod impl_enc_dec { use crate::{ bool::{ evaluator::{BoolEncoding, BoolEvaluator}, keys::NonInteractiveMultiPartyClientKey, parameters::CiphertextModulus, }, pbs::PbsInfo, random::{DefaultSecureRng, NewWithSeed}, rgsw::secret_key_encrypt_rlwe, utils::{TryConvertFrom1, WithLocal}, Encryptor, Matrix, RowEntity, }; use num_traits::Zero; trait SeededCiphertext { fn new_with_seed(data: M, seed: S) -> Self; } type Mat = Vec>; impl Encryptor<[bool], C> for K where K: NonInteractiveMultiPartyClientKey, C: SeededCiphertext<::R, ::Seed>, ::R: TryConvertFrom1<[K::Element], CiphertextModulus<::MatElement>>, { fn encrypt(&self, m: &[bool]) -> C { BoolEvaluator::with_local(|e| { let parameters = e.parameters(); assert!(m.len() <= parameters.rlwe_n().0); let mut message = vec![::MatElement::zero(); parameters.rlwe_n().0]; m.iter().enumerate().for_each(|(i, v)| { if *v { message[i] = parameters.rlwe_q().true_el() } else { message[i] = parameters.rlwe_q().false_el() } }); DefaultSecureRng::with_local_mut(|rng| { let mut seed = ::Seed::default(); rng.fill_bytes(&mut seed); let mut prng = DefaultSecureRng::new_seeded(seed); let mut rlwe_out = <::R as RowEntity>::zeros(parameters.rlwe_n().0); secret_key_encrypt_rlwe( &message, &mut rlwe_out, &self.sk_u_rlwe(), e.pbs_info().modop_rlweq(), e.pbs_info().nttop_rlweq(), &mut prng, rng, ); C::new_with_seed(rlwe_out, seed) }) }) } } }