poulpy/core/src/glwe/plaintext.rs
core/src/glwe/plaintext.rsRaw
1use backend::{Backend, FFT64, Module, VecZnx, VecZnxAlloc, VecZnxToMut, VecZnxToRef};
2
3use crate::{
4 GLWEOps, Infos, SetMetaData,
5 ciphertext::{GLWECiphertext, GLWECiphertextToMut, GLWECiphertextToRef},
6 div_ceil,
7};
8
9pub struct GLWEPlaintext<C> {
10 pub data: VecZnx<C>,
11 pub basek: usize,
12 pub k: usize,
13}
14
15impl<T> Infos for GLWEPlaintext<T> {
16 type Inner = VecZnx<T>;
17
18 fn inner(&self) -> &Self::Inner {
19 &self.data
20 }
21
22 fn basek(&self) -> usize {
23 self.basek
24 }
25
26 fn k(&self) -> usize {
27 self.k
28 }
29}
30
31impl<DataSelf: AsMut<[u8]> + AsRef<[u8]>> SetMetaData for GLWEPlaintext<DataSelf> {
32 fn set_k(&mut self, k: usize) {
33 self.k = k
34 }
35
36 fn set_basek(&mut self, basek: usize) {
37 self.basek = basek
38 }
39}
40
41impl GLWEPlaintext<Vec<u8>> {
42 pub fn alloc<B: Backend>(module: &Module<B>, basek: usize, k: usize) -> Self {
43 Self {
44 data: module.new_vec_znx(1, k.div_ceil(basek)),
45 basek: basek,
46 k,
47 }
48 }
49
50 pub fn byte_of(module: &Module<FFT64>, basek: usize, k: usize) -> usize {
51 module.bytes_of_vec_znx(1, k.div_ceil(basek))
52 }
53}
54
55impl<D: AsRef<[u8]>> GLWECiphertextToRef for GLWEPlaintext<D> {
56 fn to_ref(&self) -> GLWECiphertext<&[u8]> {
57 GLWECiphertext {
58 data: self.data.to_ref(),
59 basek: self.basek,
60 k: self.k,
61 }
62 }
63}
64
65impl<D: AsMut<[u8]> + AsRef<[u8]>> GLWECiphertextToMut for GLWEPlaintext<D> {
66 fn to_mut(&mut self) -> GLWECiphertext<&mut [u8]> {
67 GLWECiphertext {
68 data: self.data.to_mut(),
69 basek: self.basek,
70 k: self.k,
71 }
72 }
73}
74
75impl<D> GLWEOps for GLWEPlaintext<D>
76where
77 D: AsRef<[u8]> + AsMut<[u8]>,
78 GLWEPlaintext<D>: GLWECiphertextToMut + Infos + SetMetaData,
79{
80}