poulpy_core/encryption/compressed/
glwe_ct.rs

1use poulpy_hal::{
2    api::{
3        DFT, IDFTConsume, ScratchAvailable, SvpApplyInplace, TakeVecZnx, TakeVecZnxDft, VecZnxAddInplace, VecZnxAddNormal,
4        VecZnxBigNormalize, VecZnxDftAllocBytes, VecZnxFillUniform, VecZnxNormalize, VecZnxNormalizeInplace,
5        VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace,
6    },
7    layouts::{Backend, DataMut, DataRef, Module, Scratch},
8    source::Source,
9};
10
11use crate::{
12    encryption::{SIGMA, glwe_ct::glwe_encrypt_sk_internal},
13    layouts::{GLWECiphertext, GLWEPlaintext, Infos, compressed::GLWECiphertextCompressed, prepared::GLWESecretPrepared},
14};
15
16impl GLWECiphertextCompressed<Vec<u8>> {
17    pub fn encrypt_sk_scratch_space<B: Backend>(module: &Module<B>, basek: usize, k: usize) -> usize
18    where
19        Module<B>: VecZnxNormalizeTmpBytes + VecZnxDftAllocBytes,
20    {
21        GLWECiphertext::encrypt_sk_scratch_space(module, basek, k)
22    }
23}
24
25impl<D: DataMut> GLWECiphertextCompressed<D> {
26    #[allow(clippy::too_many_arguments)]
27    pub fn encrypt_sk<DataPt: DataRef, DataSk: DataRef, B: Backend>(
28        &mut self,
29        module: &Module<B>,
30        pt: &GLWEPlaintext<DataPt>,
31        sk: &GLWESecretPrepared<DataSk, B>,
32        seed_xa: [u8; 32],
33        source_xe: &mut Source,
34        scratch: &mut Scratch<B>,
35    ) where
36        Module<B>: VecZnxDftAllocBytes
37            + VecZnxBigNormalize<B>
38            + DFT<B>
39            + SvpApplyInplace<B>
40            + IDFTConsume<B>
41            + VecZnxNormalizeTmpBytes
42            + VecZnxFillUniform
43            + VecZnxSubABInplace
44            + VecZnxAddInplace
45            + VecZnxNormalizeInplace<B>
46            + VecZnxAddNormal
47            + VecZnxNormalize<B>
48            + VecZnxSub,
49        Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx,
50    {
51        self.encrypt_sk_internal(module, Some((pt, 0)), sk, seed_xa, source_xe, scratch);
52    }
53
54    #[allow(clippy::too_many_arguments)]
55    pub(crate) fn encrypt_sk_internal<DataPt: DataRef, DataSk: DataRef, B: Backend>(
56        &mut self,
57        module: &Module<B>,
58        pt: Option<(&GLWEPlaintext<DataPt>, usize)>,
59        sk: &GLWESecretPrepared<DataSk, B>,
60        seed_xa: [u8; 32],
61        source_xe: &mut Source,
62        scratch: &mut Scratch<B>,
63    ) where
64        Module<B>: VecZnxDftAllocBytes
65            + VecZnxBigNormalize<B>
66            + DFT<B>
67            + SvpApplyInplace<B>
68            + IDFTConsume<B>
69            + VecZnxNormalizeTmpBytes
70            + VecZnxFillUniform
71            + VecZnxSubABInplace
72            + VecZnxAddInplace
73            + VecZnxNormalizeInplace<B>
74            + VecZnxAddNormal
75            + VecZnxNormalize<B>
76            + VecZnxSub,
77        Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx,
78    {
79        let mut source_xa = Source::new(seed_xa);
80        let cols: usize = self.rank() + 1;
81        glwe_encrypt_sk_internal(
82            module,
83            self.basek(),
84            self.k(),
85            &mut self.data,
86            cols,
87            true,
88            pt,
89            sk,
90            &mut source_xa,
91            source_xe,
92            SIGMA,
93            scratch,
94        );
95        self.seed = seed_xa;
96    }
97}