poulpy_ckks/default/
encryption.rs1use 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}