arnaucube
arnaucube/poulpyPublic Self-hosted repository
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::alloc::<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}