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}