arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/rlwe/src/elem.rs
rlwe/src/elem.rsRaw
 1use base2k::{Backend, FFT64, MatZnxDft, MatZnxDftAlloc, Module, VecZnx, VecZnxAlloc};
 2
 3pub struct Ciphertext<T> {
 4    data: T,
 5    log_base2k: usize,
 6    log_q: usize,
 7}
 8
 9impl<T> Ciphertext<T> {
10    pub fn log_base2k(&self) -> usize {
11        self.log_base2k
12    }
13
14    pub fn log_q(&self) -> usize {
15        self.log_q
16    }
17
18    pub fn data(&self) -> &T {
19        &self.data
20    }
21
22    pub fn data_mut(&mut self) -> &mut T {
23        &mut self.data
24    }
25}
26
27pub struct Plaintext<T> {
28    data: T,
29    log_base2k: usize,
30    log_q: usize,
31}
32
33impl<T> Plaintext<T> {
34    pub fn log_base2k(&self) -> usize {
35        self.log_base2k
36    }
37
38    pub fn log_q(&self) -> usize {
39        self.log_q
40    }
41
42    pub fn data(&self) -> &T {
43        &self.data
44    }
45
46    pub fn data_mut(&mut self) -> &mut T {
47        &mut self.data
48    }
49}
50
51pub(crate) type CipherVecZnx<C> = Ciphertext<VecZnx<C>>;
52
53impl Ciphertext<VecZnx<Vec<u8>>> {
54    pub fn new<B: Backend>(module: &Module<B>, log_base2k: usize, log_q: usize, cols: usize) -> Self {
55        Self {
56            data: module.new_vec_znx(cols, derive_size(log_base2k, log_q)),
57            log_base2k: log_base2k,
58            log_q: log_q,
59        }
60    }
61}
62
63impl Plaintext<VecZnx<Vec<u8>>> {
64    pub fn new<B: Backend>(module: &Module<B>, log_base2k: usize, log_q: usize) -> Self {
65        Self {
66            data: module.new_vec_znx(1, derive_size(log_base2k, log_q)),
67            log_base2k: log_base2k,
68            log_q: log_q,
69        }
70    }
71}
72
73impl<B: Backend> Ciphertext<MatZnxDft<Vec<u8>, B>> {
74    pub fn new(module: &Module<B>, log_base2k: usize, rows: usize, cols_in: usize, cols_out: usize, log_q: usize) -> Self {
75        Self {
76            data: module.new_mat_znx_dft(rows, cols_in, cols_out, derive_size(log_base2k, log_q)),
77            log_base2k: log_base2k,
78            log_q: log_q,
79        }
80    }
81}
82
83pub(crate) fn derive_size(log_base2k: usize, log_q: usize) -> usize {
84    (log_q + log_base2k - 1) / log_base2k
85}