poulpy/core/src/glwe/ciphertext.rs
core/src/glwe/ciphertext.rsRaw
1use backend::{Backend, FFT64, Module, VecZnx, VecZnxAlloc, VecZnxDftOps, VecZnxToMut, VecZnxToRef};
2
3use crate::{FourierGLWECiphertext, GLWEOps, Infos, SetMetaData};
4
5pub struct GLWECiphertext<C> {
6 pub data: VecZnx<C>,
7 pub basek: usize,
8 pub k: usize,
9}
10
11impl GLWECiphertext<Vec<u8>> {
12 pub fn alloc<B: Backend>(module: &Module<B>, basek: usize, k: usize, rank: usize) -> Self {
13 Self {
14 data: module.new_vec_znx(rank + 1, k.div_ceil(basek)),
15 basek,
16 k,
17 }
18 }
19
20 pub fn bytes_of(module: &Module<FFT64>, basek: usize, k: usize, rank: usize) -> usize {
21 module.bytes_of_vec_znx(rank + 1, k.div_ceil(basek))
22 }
23}
24
25impl<T> Infos for GLWECiphertext<T> {
26 type Inner = VecZnx<T>;
27
28 fn inner(&self) -> &Self::Inner {
29 &self.data
30 }
31
32 fn basek(&self) -> usize {
33 self.basek
34 }
35
36 fn k(&self) -> usize {
37 self.k
38 }
39}
40
41impl<T> GLWECiphertext<T> {
42 pub fn rank(&self) -> usize {
43 self.cols() - 1
44 }
45}
46
47impl<C: AsRef<[u8]>> GLWECiphertext<C> {
48 #[allow(dead_code)]
49 pub(crate) fn dft<R: AsMut<[u8]> + AsRef<[u8]>>(&self, module: &Module<FFT64>, res: &mut FourierGLWECiphertext<R, FFT64>) {
50 #[cfg(debug_assertions)]
51 {
52 assert_eq!(self.rank(), res.rank());
53 assert_eq!(self.basek(), res.basek())
54 }
55
56 (0..self.rank() + 1).for_each(|i| {
57 module.vec_znx_dft(1, 0, &mut res.data, i, &self.data, i);
58 })
59 }
60}
61
62impl<DataSelf: AsRef<[u8]>> GLWECiphertext<DataSelf> {
63 pub fn clone(&self) -> GLWECiphertext<Vec<u8>> {
64 GLWECiphertext {
65 data: self.data.clone(),
66 basek: self.basek(),
67 k: self.k(),
68 }
69 }
70}
71
72impl<DataSelf: AsMut<[u8]> + AsRef<[u8]>> SetMetaData for GLWECiphertext<DataSelf> {
73 fn set_k(&mut self, k: usize) {
74 self.k = k
75 }
76
77 fn set_basek(&mut self, basek: usize) {
78 self.basek = basek
79 }
80}
81
82pub trait GLWECiphertextToRef: Infos {
83 fn to_ref(&self) -> GLWECiphertext<&[u8]>;
84}
85
86impl<D: AsRef<[u8]>> GLWECiphertextToRef for GLWECiphertext<D> {
87 fn to_ref(&self) -> GLWECiphertext<&[u8]> {
88 GLWECiphertext {
89 data: self.data.to_ref(),
90 basek: self.basek,
91 k: self.k,
92 }
93 }
94}
95
96pub trait GLWECiphertextToMut: Infos {
97 fn to_mut(&mut self) -> GLWECiphertext<&mut [u8]>;
98}
99
100impl<D: AsMut<[u8]> + AsRef<[u8]>> GLWECiphertextToMut for GLWECiphertext<D> {
101 fn to_mut(&mut self) -> GLWECiphertext<&mut [u8]> {
102 GLWECiphertext {
103 data: self.data.to_mut(),
104 basek: self.basek,
105 k: self.k,
106 }
107 }
108}
109
110impl<D> GLWEOps for GLWECiphertext<D>
111where
112 D: AsRef<[u8]> + AsMut<[u8]>,
113 GLWECiphertext<D>: GLWECiphertextToMut + Infos + SetMetaData,
114{
115}