arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/core/src/fourier_glwe/encryption.rs
core/src/fourier_glwe/encryption.rsRaw
 1use backend::{FFT64, Module, Scratch, VecZnxAlloc, VecZnxBigScratch, VecZnxDftOps};
 2use sampling::source::Source;
 3
 4use crate::{FourierGLWECiphertext, FourierGLWESecret, GLWECiphertext, Infos, ScratchCore, div_ceil};
 5
 6impl FourierGLWECiphertext<Vec<u8>, FFT64> {
 7    #[allow(dead_code)]
 8    pub(crate) fn idft_scratch_space(module: &Module<FFT64>, basek: usize, k: usize) -> usize {
 9        module.bytes_of_vec_znx(1, div_ceil(k, basek))
10            + (module.vec_znx_big_normalize_tmp_bytes() | module.vec_znx_idft_tmp_bytes())
11    }
12
13    pub fn encrypt_sk_scratch_space(module: &Module<FFT64>, basek: usize, k: usize, rank: usize) -> usize {
14        module.bytes_of_vec_znx(rank + 1, div_ceil(k, basek)) + GLWECiphertext::encrypt_sk_scratch_space(module, basek, k)
15    }
16}
17
18impl<DataSelf: AsMut<[u8]> + AsRef<[u8]>> FourierGLWECiphertext<DataSelf, FFT64> {
19    pub fn encrypt_zero_sk<DataSk: AsRef<[u8]>>(
20        &mut self,
21        module: &Module<FFT64>,
22        sk: &FourierGLWESecret<DataSk, FFT64>,
23        source_xa: &mut Source,
24        source_xe: &mut Source,
25        sigma: f64,
26        scratch: &mut Scratch,
27    ) {
28        let (mut tmp_ct, scratch1) = scratch.tmp_glwe_ct(module, self.basek(), self.k(), self.rank());
29        tmp_ct.encrypt_zero_sk(module, sk, source_xa, source_xe, sigma, scratch1);
30        tmp_ct.dft(module, self);
31    }
32}