arnaucube
arnaucube/poulpyPublic Self-hosted repository
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}