arnaucube
arnaucube/poulpyPublic Self-hosted repository
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, SvpPPol};
 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: &SvpPPol,
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: &SvpPPol,
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}