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