poulpy/core/src/lwe/ciphertext.rs
core/src/lwe/ciphertext.rsRaw
1use backend::hal::{
2 api::ZnxInfos,
3 layouts::{Data, DataMut, DataRef, ReaderFrom, VecZnx, VecZnxToMut, VecZnxToRef, WriterTo},
4};
5
6use crate::{Infos, SetMetaData};
7
8pub struct LWECiphertext<D: Data> {
9 pub(crate) data: VecZnx<D>,
10 pub(crate) k: usize,
11 pub(crate) basek: usize,
12}
13
14impl LWECiphertext<Vec<u8>> {
15 pub fn alloc(n: usize, basek: usize, k: usize) -> Self {
16 Self {
17 data: VecZnx::new::<i64>(n + 1, 1, k.div_ceil(basek)),
18 k: k,
19 basek: basek,
20 }
21 }
22}
23
24impl<D: Data> Infos for LWECiphertext<D>
25where
26 VecZnx<D>: ZnxInfos,
27{
28 type Inner = VecZnx<D>;
29
30 fn n(&self) -> usize {
31 &self.inner().n() - 1
32 }
33
34 fn inner(&self) -> &Self::Inner {
35 &self.data
36 }
37
38 fn basek(&self) -> usize {
39 self.basek
40 }
41
42 fn k(&self) -> usize {
43 self.k
44 }
45}
46
47impl<DataSelf: DataMut> SetMetaData for LWECiphertext<DataSelf> {
48 fn set_k(&mut self, k: usize) {
49 self.k = k
50 }
51
52 fn set_basek(&mut self, basek: usize) {
53 self.basek = basek
54 }
55}
56
57pub trait LWECiphertextToRef {
58 fn to_ref(&self) -> LWECiphertext<&[u8]>;
59}
60
61impl<D: DataRef> LWECiphertextToRef for LWECiphertext<D> {
62 fn to_ref(&self) -> LWECiphertext<&[u8]> {
63 LWECiphertext {
64 data: self.data.to_ref(),
65 basek: self.basek,
66 k: self.k,
67 }
68 }
69}
70
71pub trait LWECiphertextToMut {
72 #[allow(dead_code)]
73 fn to_mut(&mut self) -> LWECiphertext<&mut [u8]>;
74}
75
76impl<D: DataMut> LWECiphertextToMut for LWECiphertext<D> {
77 fn to_mut(&mut self) -> LWECiphertext<&mut [u8]> {
78 LWECiphertext {
79 data: self.data.to_mut(),
80 basek: self.basek,
81 k: self.k,
82 }
83 }
84}
85
86use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
87
88impl<D: DataMut> ReaderFrom for LWECiphertext<D> {
89 fn read_from<R: std::io::Read>(&mut self, reader: &mut R) -> std::io::Result<()> {
90 self.k = reader.read_u64::<LittleEndian>()? as usize;
91 self.basek = reader.read_u64::<LittleEndian>()? as usize;
92 self.data.read_from(reader)
93 }
94}
95
96impl<D: DataRef> WriterTo for LWECiphertext<D> {
97 fn write_to<W: std::io::Write>(&self, writer: &mut W) -> std::io::Result<()> {
98 writer.write_u64::<LittleEndian>(self.k as u64)?;
99 writer.write_u64::<LittleEndian>(self.basek as u64)?;
100 self.data.write_to(writer)
101 }
102}