poulpy/rlwe/src/key_generator.rs
rlwe/src/key_generator.rsRaw
1use crate::encryptor::encrypt_grlwe_sk_thread_safe;
2use crate::keys::{PublicKey, SecretKey, SwitchingKey};
3use crate::parameters::Parameters;
4use base2k::SvpPPol;
5use sampling::source::Source;
6
7pub struct KeyGenerator {}
8
9impl KeyGenerator {
10 pub fn gen_secret_key_thread_safe(
11 &self,
12 params: &Parameters,
13 source: &mut Source,
14 ) -> SecretKey {
15 let mut sk: SecretKey = SecretKey::new(params.module());
16 sk.fill_ternary_hw(params.xs(), source);
17 sk
18 }
19
20 pub fn gen_public_key_thread_safe(
21 &self,
22 params: &Parameters,
23 sk_ppol: &SvpPPol,
24 source: &mut Source,
25 tmp_bytes: &mut [u8],
26 ) -> PublicKey {
27 let mut xa_source: Source = source.branch();
28 let mut xe_source: Source = source.branch();
29 let mut pk: PublicKey =
30 PublicKey::new(params.module(), params.log_base2k(), params.log_qp());
31 pk.gen_thread_safe(
32 params.module(),
33 sk_ppol,
34 params.xe(),
35 &mut xa_source,
36 &mut xe_source,
37 tmp_bytes,
38 );
39 pk
40 }
41
42 pub fn gen_switching_key_thread_safe(
43 &self,
44 params: &Parameters,
45 sk_in: &SecretKey,
46 sk_out: &SecretKey,
47 rows: usize,
48 log_q: usize,
49 tmp_bytes: &mut [u8],
50 ) -> SwitchingKey {
51 let swk: SwitchingKey = SwitchingKey::new(params.module(), params.log_base2k(), rows, log_q, 0);
52
53 let module: &base2k::Module = params.module();
54
55 encrypt_grlwe_sk_thread_safe(module, swk.0, &sk_in.0, sk_out, source_xa, source_xe, sigma, tmp_bytes);
56 swk
57 }
58}