poulpy_core/encryption/
glwe_pk.rs1use poulpy_hal::{
2 api::{
3 DFT, IDFTConsume, ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApplyInplace, VecZnxAddInplace, VecZnxAddNormal,
4 VecZnxBigNormalize, VecZnxDftAllocBytes, VecZnxFillUniform, VecZnxNormalize, VecZnxNormalizeInplace,
5 VecZnxNormalizeTmpBytes, VecZnxSub, VecZnxSubABInplace,
6 },
7 layouts::{Backend, DataMut, DataRef, Module, ScratchOwned},
8 oep::{ScratchAvailableImpl, ScratchOwnedAllocImpl, ScratchOwnedBorrowImpl, TakeVecZnxDftImpl, TakeVecZnxImpl},
9 source::Source,
10};
11
12use crate::layouts::{GLWECiphertext, GLWEPublicKey, Infos, prepared::GLWESecretPrepared};
13
14impl<D: DataMut> GLWEPublicKey<D> {
15 pub fn generate_from_sk<S: DataRef, B>(
16 &mut self,
17 module: &Module<B>,
18 sk: &GLWESecretPrepared<S, B>,
19 source_xa: &mut Source,
20 source_xe: &mut Source,
21 ) where
22 Module<B>:,
23 Module<B>: VecZnxDftAllocBytes
24 + VecZnxBigNormalize<B>
25 + DFT<B>
26 + SvpApplyInplace<B>
27 + IDFTConsume<B>
28 + VecZnxNormalizeTmpBytes
29 + VecZnxFillUniform
30 + VecZnxSubABInplace
31 + VecZnxAddInplace
32 + VecZnxNormalizeInplace<B>
33 + VecZnxAddNormal
34 + VecZnxNormalize<B>
35 + VecZnxSub,
36 B: Backend
37 + ScratchOwnedAllocImpl<B>
38 + ScratchOwnedBorrowImpl<B>
39 + TakeVecZnxDftImpl<B>
40 + ScratchAvailableImpl<B>
41 + TakeVecZnxImpl<B>,
42 {
43 #[cfg(debug_assertions)]
44 {
45 use crate::Distribution;
46
47 assert_eq!(self.n(), sk.n());
48
49 if sk.dist == Distribution::NONE {
50 panic!("invalid sk: SecretDistribution::NONE")
51 }
52 }
53
54 let mut scratch: ScratchOwned<B> = ScratchOwned::alloc(GLWECiphertext::encrypt_sk_scratch_space(
56 module,
57 self.basek(),
58 self.k(),
59 ));
60
61 let mut tmp: GLWECiphertext<Vec<u8>> = GLWECiphertext::alloc(self.n(), self.basek(), self.k(), self.rank());
62 tmp.encrypt_zero_sk(module, sk, source_xa, source_xe, scratch.borrow());
63 self.dist = sk.dist;
64 }
65}