poulpy/rlwe/src/test.rs
rlwe/src/test.rsRaw
1use base2k::{alloc_aligned, SvpPPol, SvpPPolOps, VecZnx, BACKEND};
2use sampling::source::{Source, new_seed};
3use crate::{ciphertext::Ciphertext, decryptor::decrypt_rlwe, elem::ElemCommon, encryptor::encrypt_rlwe_sk, keys::SecretKey, parameters::{Parameters, ParametersLiteral, DEFAULT_SIGMA}, plaintext::Plaintext};
4
5
6
7pub struct Context{
8 pub params: Parameters,
9 pub sk0: SecretKey,
10 pub sk0_ppol:SvpPPol,
11 pub sk1: SecretKey,
12 pub sk1_ppol: SvpPPol,
13 pub tmp_bytes: Vec<u8>,
14}
15
16impl Context{
17 pub fn new(log_n: usize, log_base2k: usize, log_q: usize, log_p: usize) -> Self{
18
19 let params_lit: ParametersLiteral = ParametersLiteral {
20 backend: BACKEND::FFT64,
21 log_n: log_n,
22 log_q: log_q,
23 log_p: log_p,
24 log_base2k: log_base2k,
25 log_scale: 20,
26 xe: DEFAULT_SIGMA,
27 xs: 1 << (log_n-1),
28 };
29
30 let params: Parameters =Parameters::new(¶ms_lit);
31 let module = params.module();
32
33 let log_q: usize = params.log_q();
34
35 let mut source_xs: Source = Source::new(new_seed());
36
37 let mut sk0: SecretKey = SecretKey::new(module);
38 sk0.fill_ternary_hw(params.xs(), &mut source_xs);
39 let mut sk0_ppol: base2k::SvpPPol = module.new_svp_ppol();
40 module.svp_prepare(&mut sk0_ppol, &sk0.0);
41
42 let mut sk1: SecretKey = SecretKey::new(module);
43 sk1.fill_ternary_hw(params.xs(), &mut source_xs);
44 let mut sk1_ppol: base2k::SvpPPol = module.new_svp_ppol();
45 module.svp_prepare(&mut sk1_ppol, &sk1.0);
46
47 let tmp_bytes: Vec<u8> = alloc_aligned(params.decrypt_rlwe_tmp_byte(log_q)| params.encrypt_rlwe_sk_tmp_bytes(log_q));
48
49 Context{
50 params: params,
51 sk0: sk0,
52 sk0_ppol: sk0_ppol,
53 sk1: sk1,
54 sk1_ppol: sk1_ppol,
55 tmp_bytes: tmp_bytes,
56
57 }
58 }
59
60 pub fn encrypt_rlwe_sk0(&mut self, pt: &Plaintext, ct: &mut Ciphertext<VecZnx>){
61
62 let mut source_xe: Source = Source::new(new_seed());
63 let mut source_xa: Source = Source::new(new_seed());
64
65 encrypt_rlwe_sk(
66 self.params.module(),
67 ct.elem_mut(),
68 Some(pt.elem()),
69 &self.sk0_ppol,
70 &mut source_xa,
71 &mut source_xe,
72 self.params.xe(),
73 &mut self.tmp_bytes,
74 );
75 }
76
77 pub fn encrypt_rlwe_sk1(&mut self, ct: &mut Ciphertext<VecZnx>, pt: &Plaintext){
78
79 let mut source_xe: Source = Source::new(new_seed());
80 let mut source_xa: Source = Source::new(new_seed());
81
82 encrypt_rlwe_sk(
83 self.params.module(),
84 ct.elem_mut(),
85 Some(pt.elem()),
86 &self.sk1_ppol,
87 &mut source_xa,
88 &mut source_xe,
89 self.params.xe(),
90 &mut self.tmp_bytes,
91 );
92 }
93
94 pub fn decrypt_sk0(&mut self, pt: &mut Plaintext, ct: &Ciphertext<VecZnx>){
95 decrypt_rlwe(
96 self.params.module(),
97 pt.elem_mut(),
98 ct.elem(),
99 &self.sk0_ppol,
100 &mut self.tmp_bytes,
101 );
102 }
103
104 pub fn decrypt_sk1(&mut self, pt: &mut Plaintext, ct: &Ciphertext<VecZnx>){
105 decrypt_rlwe(
106 self.params.module(),
107 pt.elem_mut(),
108 ct.elem(),
109 &self.sk1_ppol,
110 &mut self.tmp_bytes,
111 );
112 }
113}