poulpy/core/src/glwe/ciphertext.rs
core/src/glwe/ciphertext.rsRaw
1use backend::{
2 Backend, FFT64, Module, VecZnx, VecZnxAlloc, VecZnxBigAlloc, VecZnxBigScratch, VecZnxDftAlloc, VecZnxDftOps, VecZnxToMut,
3 VecZnxToRef,
4};
5
6use crate::{FourierGLWECiphertext, GLWEOps, Infos, SetMetaData, div_ceil};
7
8pub struct GLWECiphertext<C> {
9 pub data: VecZnx<C>,
10 pub basek: usize,
11 pub k: usize,
12}
13
14impl GLWECiphertext<Vec<u8>> {
15 pub fn alloc<B: Backend>(module: &Module<B>, basek: usize, k: usize, rank: usize) -> Self {
16 Self {
17 data: module.new_vec_znx(rank + 1, div_ceil(k, basek)),
18 basek,
19 k,
20 }
21 }
22
23 pub fn bytes_of(module: &Module<FFT64>, basek: usize, k: usize, rank: usize) -> usize {
24 module.bytes_of_vec_znx(rank + 1, div_ceil(k, basek))
25 }
26}
27
28impl<T> Infos for GLWECiphertext<T> {
29 type Inner = VecZnx<T>;
30
31 fn inner(&self) -> &Self::Inner {
32 &self.data
33 }
34
35 fn basek(&self) -> usize {
36 self.basek
37 }
38
39 fn k(&self) -> usize {
40 self.k
41 }
42}
43
44impl<T> GLWECiphertext<T> {
45 pub fn rank(&self) -> usize {
46 self.cols() - 1
47 }
48}
49
50impl<C: AsRef<[u8]>> GLWECiphertext<C> {
51 #[allow(dead_code)]
52 pub(crate) fn dft<R: AsMut<[u8]> + AsRef<[u8]>>(&self, module: &Module<FFT64>, res: &mut FourierGLWECiphertext<R, FFT64>) {
53 #[cfg(debug_assertions)]
54 {
55 assert_eq!(self.rank(), res.rank());
56 assert_eq!(self.basek(), res.basek())
57 }
58
59 (0..self.rank() + 1).for_each(|i| {
60 module.vec_znx_dft(1, 0, &mut res.data, i, &self.data, i);
61 })
62 }
63}
64
65impl GLWECiphertext<Vec<u8>> {
66 pub fn decrypt_scratch_space(module: &Module<FFT64>, basek: usize, k: usize) -> usize {
67 let size: usize = div_ceil(k, basek);
68 (module.vec_znx_big_normalize_tmp_bytes() | module.bytes_of_vec_znx_dft(1, size)) + module.bytes_of_vec_znx_big(1, size)
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 {
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 {
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}