poulpy/rlwe/src/key_generator.rs
rlwe/src/key_generator.rsRaw
1use crate::encryptor::{encrypt_grlwe_sk_thread_safe, encrypt_grlwe_sk_tmp_bytes};
2use crate::keys::{PublicKey, SecretKey, SwitchingKey};
3use crate::parameters::Parameters;
4use base2k::{Module, SvpPPol, SvpPPolOps};
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
43pub fn gen_switching_key_thread_safe_tmp_bytes(
44 module: &Module,
45 log_base2k: usize,
46 rows: usize,
47 log_q: usize,
48) -> usize {
49 encrypt_grlwe_sk_tmp_bytes(module, log_base2k, rows, log_q)
50}
51
52pub fn gen_switching_key_thread_safe(
53 module: &Module,
54 swk: &mut SwitchingKey,
55 sk_in: &SecretKey,
56 sk_out: &SvpPPol,
57 source_xa: &mut Source,
58 source_xe: &mut Source,
59 sigma: f64,
60 tmp_bytes: &mut [u8],
61) {
62 encrypt_grlwe_sk_thread_safe(
63 module, &mut swk.0, &sk_in.0, sk_out, source_xa, source_xe, sigma, tmp_bytes,
64 );
65}