poulpy_core/layouts/compressed/
lwe_ksk.rs

1use poulpy_hal::{
2    api::{
3        FillUniform, Reset, SvpApplyInplace, SvpPPolAlloc, SvpPPolAllocBytes, SvpPrepare, VecZnxAddInplace, VecZnxAddNormal,
4        VecZnxBigNormalize, VecZnxCopy, VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxFillUniform,
5        VecZnxNormalize, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace,
6    },
7    layouts::{Backend, Data, DataMut, DataRef, MatZnx, Module, ReaderFrom, WriterTo},
8    source::Source,
9};
10
11use crate::layouts::{
12    Infos, LWESwitchingKey,
13    compressed::{Decompress, GGLWESwitchingKeyCompressed},
14};
15use std::fmt;
16
17#[derive(PartialEq, Eq, Clone)]
18pub struct LWESwitchingKeyCompressed<D: Data>(pub(crate) GGLWESwitchingKeyCompressed<D>);
19
20impl<D: DataRef> fmt::Debug for LWESwitchingKeyCompressed<D> {
21    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
22        write!(f, "{}", self)
23    }
24}
25
26impl<D: DataMut> FillUniform for LWESwitchingKeyCompressed<D> {
27    fn fill_uniform(&mut self, source: &mut Source) {
28        self.0.fill_uniform(source);
29    }
30}
31
32impl<D: DataMut> Reset for LWESwitchingKeyCompressed<D> {
33    fn reset(&mut self) {
34        self.0.reset();
35    }
36}
37
38impl<D: DataRef> fmt::Display for LWESwitchingKeyCompressed<D> {
39    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
40        write!(f, "(LWESwitchingKeyCompressed) {}", self.0)
41    }
42}
43
44impl<D: Data> Infos for LWESwitchingKeyCompressed<D> {
45    type Inner = MatZnx<D>;
46
47    fn inner(&self) -> &Self::Inner {
48        self.0.inner()
49    }
50
51    fn basek(&self) -> usize {
52        self.0.basek()
53    }
54
55    fn k(&self) -> usize {
56        self.0.k()
57    }
58}
59
60impl<D: Data> LWESwitchingKeyCompressed<D> {
61    pub fn digits(&self) -> usize {
62        self.0.digits()
63    }
64
65    pub fn rank(&self) -> usize {
66        self.0.rank()
67    }
68
69    pub fn rank_in(&self) -> usize {
70        self.0.rank_in()
71    }
72
73    pub fn rank_out(&self) -> usize {
74        self.0.rank_out()
75    }
76}
77
78impl<D: DataMut> ReaderFrom for LWESwitchingKeyCompressed<D> {
79    fn read_from<R: std::io::Read>(&mut self, reader: &mut R) -> std::io::Result<()> {
80        self.0.read_from(reader)
81    }
82}
83
84impl<D: DataRef> WriterTo for LWESwitchingKeyCompressed<D> {
85    fn write_to<W: std::io::Write>(&self, writer: &mut W) -> std::io::Result<()> {
86        self.0.write_to(writer)
87    }
88}
89
90impl LWESwitchingKeyCompressed<Vec<u8>> {
91    pub fn alloc(n: usize, basek: usize, k: usize, rows: usize) -> Self {
92        Self(GGLWESwitchingKeyCompressed::alloc(
93            n, basek, k, rows, 1, 1, 1,
94        ))
95    }
96
97    pub fn encrypt_sk_scratch_space<B: Backend>(module: &Module<B>, n: usize, basek: usize, k: usize) -> usize
98    where
99        Module<B>: VecZnxDftAllocBytes
100            + VecZnxBigNormalize<B>
101            + VecZnxDftFromVecZnx<B>
102            + SvpApplyInplace<B>
103            + VecZnxDftToVecZnxBigConsume<B>
104            + VecZnxNormalizeTmpBytes
105            + VecZnxFillUniform
106            + VecZnxSubABInplace
107            + VecZnxAddInplace
108            + VecZnxNormalizeInplace<B>
109            + VecZnxAddNormal
110            + VecZnxNormalize<B>
111            + VecZnxSub
112            + SvpPrepare<B>
113            + SvpPPolAllocBytes
114            + SvpPPolAlloc<B>,
115    {
116        LWESwitchingKey::encrypt_sk_scratch_space(module, n, basek, k)
117    }
118}
119
120impl<D: DataMut, DR: DataRef, B: Backend> Decompress<B, LWESwitchingKeyCompressed<DR>> for LWESwitchingKey<D> {
121    fn decompress(&mut self, module: &Module<B>, other: &LWESwitchingKeyCompressed<DR>)
122    where
123        Module<B>: VecZnxCopy + VecZnxFillUniform,
124    {
125        self.0.decompress(module, &other.0);
126    }
127}