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