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}