Skip to main content

poulpy_ckks/delegates/
encryption.rs

1use anyhow::Result;
2use poulpy_core::layouts::{GLWEInfos, GLWESecretPreparedToBackendRef, GLWEToBackendMut, GLWEToBackendRef};
3use poulpy_core::{EncryptionInfos, GLWEDecrypt, GLWEEncryptSk};
4use poulpy_hal::{
5    api::{VecZnxLshBackend, VecZnxLshTmpBytes, VecZnxRshAddIntoBackend, VecZnxRshBackend, VecZnxRshTmpBytes},
6    layouts::{Backend, HostDataMut, Module, ScratchArena},
7    source::Source,
8};
9
10use crate::{
11    CKKSCtBounds, SetCKKSInfos,
12    api::{CKKSDecrypt, CKKSEncrypt},
13    oep::CKKSEncryptionImpl,
14};
15
16impl<BE: Backend + CKKSEncryptionImpl<BE>> CKKSEncrypt<BE> for Module<BE>
17where
18    BE: poulpy_hal::oep::HalVecZnxImpl<BE>,
19    Self: GLWEEncryptSk<BE> + VecZnxRshAddIntoBackend<BE> + VecZnxRshTmpBytes,
20{
21    fn ckks_encrypt_sk_tmp_bytes<A>(&self, ct_infos: &A) -> usize
22    where
23        A: CKKSCtBounds,
24    {
25        BE::ckks_encrypt_sk_tmp_bytes(self, ct_infos)
26    }
27
28    #[allow(clippy::too_many_arguments)]
29    fn ckks_encrypt_sk<Dct, Dpt, S, E: EncryptionInfos>(
30        &self,
31        ct: &mut Dct,
32        pt: &Dpt,
33        sk: &S,
34        enc_infos: &E,
35        source_xa: &mut Source,
36        source_xe: &mut Source,
37        scratch: &mut ScratchArena<'_, BE>,
38    ) -> Result<()>
39    where
40        S: GLWESecretPreparedToBackendRef<BE>,
41        Dct: GLWEToBackendMut<BE> + CKKSCtBounds + SetCKKSInfos,
42        Dpt: GLWEToBackendRef<BE> + CKKSCtBounds,
43    {
44        BE::ckks_encrypt_sk(self, ct, pt, sk, enc_infos, source_xa, source_xe, scratch)
45    }
46}
47
48impl<BE: Backend + CKKSEncryptionImpl<BE>> CKKSDecrypt<BE> for Module<BE>
49where
50    BE: poulpy_hal::oep::HalVecZnxImpl<BE>,
51    Self: GLWEDecrypt<BE>
52        + VecZnxLshBackend<BE>
53        + VecZnxLshTmpBytes
54        + VecZnxRshBackend<BE>
55        + VecZnxRshTmpBytes
56        + poulpy_core::layouts::ModuleCoreAlloc<OwnedBuf = BE::OwnedBuf>,
57    BE::OwnedBuf: HostDataMut,
58{
59    fn ckks_decrypt_tmp_bytes<A>(&self, ct_infos: &A) -> usize
60    where
61        A: CKKSCtBounds,
62    {
63        BE::ckks_decrypt_tmp_bytes(self, ct_infos)
64    }
65
66    fn ckks_decrypt<Dpt, Dct, S>(&self, pt: &mut Dpt, ct: &Dct, sk: &S, scratch: &mut ScratchArena<'_, BE>) -> Result<()>
67    where
68        S: GLWESecretPreparedToBackendRef<BE> + GLWEInfos,
69        Dpt: GLWEToBackendMut<BE> + CKKSCtBounds + SetCKKSInfos,
70        Dct: GLWEToBackendRef<BE> + CKKSCtBounds,
71    {
72        BE::ckks_decrypt(self, pt, ct, sk, scratch)
73    }
74}