Skip to main content

poulpy_ckks/default/
encryption.rs

1use anyhow::Result;
2use poulpy_core::layouts::{GLWEInfos, GLWEPlaintext, GLWESecretPreparedToBackendRef, GLWEToBackendMut, LWEInfos};
3use poulpy_core::{EncryptionInfos, GLWEDecrypt, GLWEEncryptSk, ScratchArenaTakeCore};
4use poulpy_hal::{
5    api::{VecZnxLshBackend, VecZnxLshTmpBytes, VecZnxRshAddIntoBackend, VecZnxRshBackend, VecZnxRshTmpBytes},
6    layouts::{Backend, ScratchArena},
7    source::Source,
8};
9
10use crate::GLWEToBackendRef;
11use crate::{CKKSInfos, SetCKKSInfos, checked_log_budget_sub};
12
13use super::CKKSPlaintextDefault;
14
15pub trait CKKSEncryptionDefault<BE: Backend> {
16    fn ckks_encrypt_sk_tmp_bytes_default<A>(&self, ct_infos: &A) -> usize
17    where
18        A: GLWEInfos + CKKSInfos,
19        Self: GLWEEncryptSk<BE> + VecZnxRshAddIntoBackend<BE> + VecZnxRshTmpBytes,
20    {
21        self.glwe_encrypt_sk_tmp_bytes(ct_infos).max(self.vec_znx_rsh_tmp_bytes())
22    }
23
24    #[allow(clippy::too_many_arguments)]
25    fn ckks_encrypt_sk_default<Dct, Dpt, S, E>(
26        &self,
27        ct: &mut Dct,
28        pt: &Dpt,
29        sk: &S,
30        enc_infos: &E,
31        source_xa: &mut Source,
32        source_xe: &mut Source,
33        scratch: &mut ScratchArena<'_, BE>,
34    ) -> Result<()>
35    where
36        E: EncryptionInfos,
37        S: GLWESecretPreparedToBackendRef<BE>,
38        Dct: GLWEToBackendMut<BE> + LWEInfos + CKKSInfos + SetCKKSInfos,
39        Dpt: GLWEToBackendRef<BE> + LWEInfos + CKKSInfos,
40        Self: GLWEEncryptSk<BE> + VecZnxRshAddIntoBackend<BE> + CKKSPlaintextDefault<BE>,
41    {
42        self.glwe_encrypt_zero_sk(ct, sk, enc_infos, source_xe, source_xa, scratch);
43        ct.set_log_budget(checked_log_budget_sub(
44            "ckks_encrypt_sk",
45            enc_infos.noise_infos().k,
46            pt.log_delta(),
47        )?);
48        ct.set_log_delta(pt.log_delta());
49        self.ckks_add_pt_vec_into_default(ct, pt, scratch)
50    }
51
52    fn ckks_decrypt_tmp_bytes_default<A>(&self, ct_infos: &A) -> usize
53    where
54        A: GLWEInfos + CKKSInfos,
55        Self: GLWEDecrypt<BE>
56            + VecZnxLshBackend<BE>
57            + VecZnxLshTmpBytes
58            + VecZnxRshBackend<BE>
59            + VecZnxRshTmpBytes
60            + CKKSPlaintextDefault<BE>,
61    {
62        GLWEPlaintext::<Vec<u8>>::bytes_of_from_infos(ct_infos)
63            + self
64                .glwe_decrypt_tmp_bytes(ct_infos)
65                .max(self.ckks_extract_pt_tmp_bytes_default())
66    }
67
68    fn ckks_decrypt_default<Dpt, Dct, S>(&self, pt: &mut Dpt, ct: &Dct, sk: &S, scratch: &mut ScratchArena<'_, BE>) -> Result<()>
69    where
70        S: GLWESecretPreparedToBackendRef<BE> + GLWEInfos,
71        Dpt: GLWEToBackendMut<BE> + LWEInfos + CKKSInfos + SetCKKSInfos,
72        Dct: GLWEToBackendRef<BE> + GLWEInfos + LWEInfos + CKKSInfos,
73        Self: GLWEDecrypt<BE> + CKKSPlaintextDefault<BE> + VecZnxLshBackend<BE> + VecZnxRshBackend<BE>,
74    {
75        let (mut full_pt, mut scratch_1) = scratch.borrow().take_glwe_plaintext_scratch(ct);
76        self.glwe_decrypt(ct, &mut full_pt, sk, &mut scratch_1);
77
78        CKKSPlaintextDefault::ckks_extract_pt_with_meta_default(self, pt, &full_pt, ct.meta(), &mut scratch_1)?;
79
80        Ok(())
81    }
82}