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}