Skip to main content

poulpy_core/api/
keyswitching.rs

1#![allow(clippy::too_many_arguments)]
2
3use poulpy_hal::layouts::{Backend, ScratchArena};
4
5use crate::layouts::{
6    GGLWEInfos, GGLWEToBackendMut, GGLWEToBackendRef, GGSWInfos, GGSWToBackendMut, GGSWToBackendRef, GLWEInfos, GLWEToBackendMut,
7    GLWEToBackendRef, LWEInfos, LWEToBackendMut, LWEToBackendRef,
8    prepared::{GGLWEPreparedToBackendRef, GGLWEToGGSWKeyPreparedToBackendRef},
9};
10
11pub trait GLWEKeyswitch<BE: Backend> {
12    fn glwe_keyswitch_tmp_bytes<R, A, B>(&self, res_infos: &R, a_infos: &A, key_infos: &B) -> usize
13    where
14        R: GLWEInfos,
15        A: GLWEInfos,
16        B: GGLWEInfos;
17
18    fn glwe_keyswitch<R, A, K>(&self, res: &mut R, a: &A, key: &K, key_size: usize, scratch: &mut ScratchArena<'_, BE>)
19    where
20        R: GLWEToBackendMut<BE> + GLWEInfos,
21        A: GLWEToBackendRef<BE> + GLWEInfos,
22        K: GGLWEPreparedToBackendRef<BE> + GGLWEInfos;
23
24    fn glwe_keyswitch_assign<R, K>(&self, res: &mut R, key: &K, key_size: usize, scratch: &mut ScratchArena<'_, BE>)
25    where
26        R: GLWEToBackendMut<BE> + GLWEInfos,
27        K: GGLWEPreparedToBackendRef<BE> + GGLWEInfos;
28}
29
30pub trait GGLWEKeyswitch<BE: Backend> {
31    fn gglwe_keyswitch_tmp_bytes<R, A, K>(&self, res_infos: &R, a_infos: &A, key_infos: &K) -> usize
32    where
33        R: GGLWEInfos,
34        A: GGLWEInfos,
35        K: GGLWEInfos;
36
37    fn gglwe_keyswitch<R, A, B>(&self, res: &mut R, a: &A, b: &B, key_size: usize, scratch: &mut ScratchArena<'_, BE>)
38    where
39        R: GGLWEToBackendMut<BE> + GGLWEInfos,
40        A: GGLWEToBackendRef<BE> + GGLWEInfos,
41        B: GGLWEPreparedToBackendRef<BE> + GGLWEInfos;
42
43    fn gglwe_keyswitch_assign<R, A>(&self, res: &mut R, a: &A, key_size: usize, scratch: &mut ScratchArena<'_, BE>)
44    where
45        R: GGLWEToBackendMut<BE> + GGLWEInfos,
46        A: GGLWEPreparedToBackendRef<BE> + GGLWEInfos;
47}
48
49pub trait GGSWKeyswitch<BE: Backend> {
50    fn ggsw_keyswitch_tmp_bytes<R, A, K, T>(&self, res_infos: &R, a_infos: &A, key_infos: &K, tsk_infos: &T) -> usize
51    where
52        R: GGSWInfos,
53        A: GGSWInfos,
54        K: GGLWEInfos,
55        T: GGLWEInfos;
56
57    fn ggsw_keyswitch<R, A, K, T>(
58        &self,
59        res: &mut R,
60        a: &A,
61        key: &K,
62        key_size: usize,
63        tsk: &T,
64        tsk_size: usize,
65        scratch: &mut ScratchArena<'_, BE>,
66    ) where
67        R: GGSWToBackendMut<BE> + GGSWInfos,
68        A: GGSWToBackendRef<BE> + GGSWInfos,
69        K: GGLWEPreparedToBackendRef<BE> + GGLWEInfos,
70        T: GGLWEToGGSWKeyPreparedToBackendRef<BE> + GGLWEInfos;
71
72    fn ggsw_keyswitch_assign<R, K, T>(
73        &self,
74        res: &mut R,
75        key: &K,
76        key_size: usize,
77        tsk: &T,
78        tsk_size: usize,
79        scratch: &mut ScratchArena<'_, BE>,
80    ) where
81        R: GGSWToBackendMut<BE> + GGSWInfos,
82        K: GGLWEPreparedToBackendRef<BE> + GGLWEInfos,
83        T: GGLWEToGGSWKeyPreparedToBackendRef<BE> + GGLWEInfos;
84}
85
86pub trait LWEKeyswitch<BE: Backend> {
87    fn lwe_keyswitch_tmp_bytes<R, A, K>(&self, res_infos: &R, a_infos: &A, key_infos: &K) -> usize
88    where
89        R: LWEInfos,
90        A: LWEInfos,
91        K: GGLWEInfos;
92
93    fn lwe_keyswitch<R, A, K>(&self, res: &mut R, a: &A, ksk: &K, key_size: usize, scratch: &mut ScratchArena<'_, BE>)
94    where
95        R: LWEToBackendMut<BE> + LWEInfos,
96        A: LWEToBackendRef<BE> + LWEInfos,
97        K: GGLWEPreparedToBackendRef<BE> + GGLWEInfos;
98}