arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/rlwe/src/keys.rs
rlwe/src/keys.rsRaw
 1use crate::ciphertext::GadgetCiphertext;
 2use crate::elem::Elem;
 3use crate::encryptor::{encrypt_rlwe_sk_thread_safe, encrypt_rlwe_sk_tmp_bytes};
 4use base2k::{Module, Scalar, SvpPPol, SvpPPolOps, VecZnx};
 5use sampling::source::Source;
 6
 7pub struct SecretKey(pub Scalar);
 8
 9impl SecretKey {
10    pub fn new(module: &Module) -> Self {
11        SecretKey(Scalar::new(module.n()))
12    }
13
14    pub fn fill_ternary_prob(&mut self, prob: f64, source: &mut Source) {
15        self.0.fill_ternary_prob(prob, source);
16    }
17
18    pub fn fill_ternary_hw(&mut self, hw: usize, source: &mut Source) {
19        self.0.fill_ternary_hw(hw, source);
20    }
21
22    pub fn prepare(&self, module: &Module, sk_ppol: &mut SvpPPol) {
23        module.svp_prepare(sk_ppol, &self.0)
24    }
25}
26
27pub struct PublicKey(pub Elem<VecZnx>);
28
29impl PublicKey {
30    pub fn new(module: &Module, log_base2k: usize, log_q: usize) -> PublicKey {
31        PublicKey(Elem::new(module, log_base2k, log_q, 1, 0))
32    }
33
34    pub fn gen_thread_safe(
35        &mut self,
36        module: &Module,
37        sk: &SvpPPol,
38        xe: f64,
39        xa_source: &mut Source,
40        xe_source: &mut Source,
41        tmp_bytes: &mut [u8],
42    ) {
43        encrypt_rlwe_sk_thread_safe(
44            module,
45            &mut self.0,
46            None,
47            sk,
48            xa_source,
49            xe_source,
50            xe,
51            tmp_bytes,
52        );
53    }
54
55    pub fn gen_thread_safe_tmp_bytes(module: &Module, log_base2k: usize, log_q: usize) -> usize {
56        encrypt_rlwe_sk_tmp_bytes(module, log_base2k, log_q)
57    }
58}
59
60pub struct SwitchingKey(pub GadgetCiphertext);
61
62impl SwitchingKey {
63    pub fn new(module: &Module, log_base2k: usize, rows: usize, log_q: usize) -> SwitchingKey {
64        SwitchingKey(GadgetCiphertext::new(module, log_base2k, rows, log_q))
65    }
66
67    pub fn n(&self) -> usize {
68        self.0.n()
69    }
70
71    pub fn rows(&self) -> usize {
72        self.0.rows()
73    }
74
75    pub fn cols(&self) -> usize {
76        self.0.cols()
77    }
78
79    pub fn log_base2k(&self) -> usize {
80        self.0.log_base2k()
81    }
82}