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