poulpy_core/noise/
glwe_ct.rs

1use poulpy_hal::{
2    api::{
3        ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApplyDftToDftInplace, VecZnxBigAddInplace, VecZnxBigAddSmallInplace,
4        VecZnxBigAllocBytes, VecZnxBigNormalize, VecZnxDftAllocBytes, VecZnxDftApply, VecZnxIdftApplyConsume,
5        VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSubABInplace,
6    },
7    layouts::{Backend, DataRef, Module, ScratchOwned},
8    oep::{ScratchOwnedAllocImpl, ScratchOwnedBorrowImpl, TakeVecZnxBigImpl, TakeVecZnxDftImpl},
9};
10
11use crate::{
12    layouts::GLWEPlaintext,
13    layouts::prepared::GLWESecretPrepared,
14    layouts::{GLWECiphertext, Infos},
15};
16
17impl<D: DataRef> GLWECiphertext<D> {
18    pub fn assert_noise<B, DataSk, DataPt>(
19        &self,
20        module: &Module<B>,
21        sk_prepared: &GLWESecretPrepared<DataSk, B>,
22        pt_want: &GLWEPlaintext<DataPt>,
23        max_noise: f64,
24    ) where
25        DataSk: DataRef,
26        DataPt: DataRef,
27        Module<B>: VecZnxDftAllocBytes
28            + VecZnxBigAllocBytes
29            + VecZnxDftApply<B>
30            + SvpApplyDftToDftInplace<B>
31            + VecZnxIdftApplyConsume<B>
32            + VecZnxBigAddInplace<B>
33            + VecZnxBigAddSmallInplace<B>
34            + VecZnxBigNormalize<B>
35            + VecZnxNormalizeTmpBytes
36            + VecZnxSubABInplace
37            + VecZnxNormalizeInplace<B>,
38        B: Backend + TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> + ScratchOwnedAllocImpl<B> + ScratchOwnedBorrowImpl<B>,
39    {
40        let mut pt_have: GLWEPlaintext<Vec<u8>> = GLWEPlaintext::alloc(self.n(), self.basek(), self.k());
41
42        let mut scratch: ScratchOwned<B> = ScratchOwned::alloc(GLWECiphertext::decrypt_scratch_space(
43            module,
44            self.basek(),
45            self.k(),
46        ));
47
48        self.decrypt(module, &mut pt_have, sk_prepared, scratch.borrow());
49
50        module.vec_znx_sub_ab_inplace(&mut pt_have.data, 0, &pt_want.data, 0);
51        module.vec_znx_normalize_inplace(self.basek(), &mut pt_have.data, 0, scratch.borrow());
52
53        let noise_have: f64 = pt_have.data.std(self.basek(), 0).log2();
54        assert!(noise_have <= max_noise, "{} {}", noise_have, max_noise);
55    }
56}