arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/core/src/fourier_glwe/keyswitch.rs
core/src/fourier_glwe/keyswitch.rsRaw
 1use backend::{FFT64, Module, Scratch};
 2
 3use crate::{FourierGLWECiphertext, GLWECiphertext, GLWESwitchingKey, Infos, ScratchCore};
 4
 5impl FourierGLWECiphertext<Vec<u8>, FFT64> {
 6    pub fn keyswitch_scratch_space(
 7        module: &Module<FFT64>,
 8        basek: usize,
 9        k_out: usize,
10        k_in: usize,
11        k_ksk: usize,
12        digits: usize,
13        rank_in: usize,
14        rank_out: usize,
15    ) -> usize {
16        GLWECiphertext::bytes_of(module, basek, k_out, rank_out)
17            + GLWECiphertext::keyswitch_from_fourier_scratch_space(module, basek, k_out, k_in, k_ksk, digits, rank_in, rank_out)
18    }
19
20    pub fn keyswitch_inplace_scratch_space(
21        module: &Module<FFT64>,
22        basek: usize,
23        k_out: usize,
24        k_ksk: usize,
25        digits: usize,
26        rank: usize,
27    ) -> usize {
28        Self::keyswitch_scratch_space(module, basek, k_out, k_out, k_ksk, digits, rank, rank)
29    }
30}
31
32impl<DataSelf: AsMut<[u8]> + AsRef<[u8]>> FourierGLWECiphertext<DataSelf, FFT64> {
33    pub fn keyswitch<DataLhs: AsRef<[u8]>, DataRhs: AsRef<[u8]>>(
34        &mut self,
35        module: &Module<FFT64>,
36        lhs: &FourierGLWECiphertext<DataLhs, FFT64>,
37        rhs: &GLWESwitchingKey<DataRhs, FFT64>,
38        scratch: &mut Scratch,
39    ) {
40        let (mut tmp_ct, scratch1) = scratch.tmp_glwe_ct(module, self.basek(), self.k(), self.rank());
41        tmp_ct.keyswitch_from_fourier(module, lhs, rhs, scratch1);
42        tmp_ct.dft(module, self);
43    }
44
45    pub fn keyswitch_inplace<DataRhs: AsRef<[u8]>>(
46        &mut self,
47        module: &Module<FFT64>,
48        rhs: &GLWESwitchingKey<DataRhs, FFT64>,
49        scratch: &mut Scratch,
50    ) {
51        unsafe {
52            let self_ptr: *mut FourierGLWECiphertext<DataSelf, FFT64> = self as *mut FourierGLWECiphertext<DataSelf, FFT64>;
53            self.keyswitch(&module, &*self_ptr, rhs, scratch);
54        }
55    }
56}