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}