arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-core/src/encryption/glwe_pk.rs
poulpy-core/src/encryption/glwe_pk.rsRaw
 1use poulpy_backend::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}