arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/core/src/glwe/noise.rs
core/src/glwe/noise.rsRaw
 1use backend::hal::{
 2    api::{ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxAlloc, VecZnxNormalizeInplace, VecZnxStd, VecZnxSubABInplace},
 3    layouts::{Backend, DataRef, Module, ScratchOwned},
 4    oep::{ScratchOwnedAllocImpl, ScratchOwnedBorrowImpl, TakeVecZnxBigImpl, TakeVecZnxDftImpl},
 5};
 6
 7use crate::{GLWECiphertext, GLWEDecryptFamily, GLWEPlaintext, GLWESecretExec, Infos};
 8
 9impl<D: DataRef> GLWECiphertext<D> {
10    pub fn assert_noise<B: Backend, DataSk, DataPt>(
11        &self,
12        module: &Module<B>,
13        sk_exec: &GLWESecretExec<DataSk, B>,
14        pt_want: &GLWEPlaintext<DataPt>,
15        max_noise: f64,
16    ) where
17        DataSk: DataRef,
18        DataPt: DataRef,
19        Module<B>: GLWEDecryptFamily<B> + VecZnxSubABInplace + VecZnxNormalizeInplace<B> + VecZnxStd + VecZnxAlloc,
20        B: TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> + ScratchOwnedAllocImpl<B> + ScratchOwnedBorrowImpl<B>,
21    {
22        let mut pt_have: GLWEPlaintext<Vec<u8>> = GLWEPlaintext::alloc(module, self.basek(), self.k());
23
24        let mut scratch: ScratchOwned<B> = ScratchOwned::alloc(GLWECiphertext::decrypt_scratch_space(
25            module,
26            self.basek(),
27            self.k(),
28        ));
29
30        self.decrypt(module, &mut pt_have, &sk_exec, scratch.borrow());
31
32        module.vec_znx_sub_ab_inplace(&mut pt_have.data, 0, &pt_want.data, 0);
33        module.vec_znx_normalize_inplace(self.basek(), &mut pt_have.data, 0, scratch.borrow());
34
35        let noise_have: f64 = module.vec_znx_std(self.basek(), &pt_have.data, 0).log2();
36        assert!(noise_have <= max_noise, "{} {}", noise_have, max_noise);
37    }
38}