poulpy/poulpy-core/src/encryption/glwe_pk.rs
poulpy-core/src/encryption/glwe_pk.rsRaw
1use poulpy_hal::{
2 api::{
3 ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApplyInplace, VecZnxAddInplace, VecZnxAddNormal, VecZnxBigNormalize,
4 VecZnxDftAllocBytes, VecZnxDftFromVecZnx, VecZnxDftToVecZnxBigConsume, VecZnxFillUniform, VecZnxNormalize,
5 VecZnxNormalizeInplace, 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 sigma: f64,
22 ) where
23 Module<B>:,
24 Module<B>: VecZnxDftAllocBytes
25 + VecZnxBigNormalize<B>
26 + VecZnxDftFromVecZnx<B>
27 + SvpApplyInplace<B>
28 + VecZnxDftToVecZnxBigConsume<B>
29 + VecZnxNormalizeTmpBytes
30 + VecZnxFillUniform
31 + VecZnxSubABInplace
32 + VecZnxAddInplace
33 + VecZnxNormalizeInplace<B>
34 + VecZnxAddNormal
35 + VecZnxNormalize<B>
36 + VecZnxSub,
37 B: Backend
38 + ScratchOwnedAllocImpl<B>
39 + ScratchOwnedBorrowImpl<B>
40 + TakeVecZnxDftImpl<B>
41 + ScratchAvailableImpl<B>
42 + TakeVecZnxImpl<B>,
43 {
44 #[cfg(debug_assertions)]
45 {
46 use crate::Distribution;
47
48 assert_eq!(self.n(), sk.n());
49
50 if sk.dist == Distribution::NONE {
51 panic!("invalid sk: SecretDistribution::NONE")
52 }
53 }
54
55 // Its ok to allocate scratch space here since pk is usually generated only once.
56 let mut scratch: ScratchOwned<B> = ScratchOwned::alloc(GLWECiphertext::encrypt_sk_scratch_space(
57 module,
58 self.n(),
59 self.basek(),
60 self.k(),
61 ));
62
63 let mut tmp: GLWECiphertext<Vec<u8>> = GLWECiphertext::alloc(self.n(), self.basek(), self.k(), self.rank());
64 tmp.encrypt_zero_sk(module, sk, source_xa, source_xe, sigma, scratch.borrow());
65 self.dist = sk.dist;
66 }
67}