poulpy_core/encryption/compressed/
glwe_ct.rs1use poulpy_hal::{
2 api::{
3 ScratchAvailable, SvpApplyDftToDftInplace, TakeVecZnx, TakeVecZnxDft, VecZnxAddInplace, VecZnxAddNormal,
4 VecZnxBigNormalize, VecZnxDftAllocBytes, VecZnxDftApply, VecZnxFillUniform, VecZnxIdftApplyConsume, VecZnxNormalize,
5 VecZnxNormalizeInplace, 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 + VecZnxDftApply<B>
39 + SvpApplyDftToDftInplace<B>
40 + VecZnxIdftApplyConsume<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 + VecZnxDftApply<B>
67 + SvpApplyDftToDftInplace<B>
68 + VecZnxIdftApplyConsume<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}