poulpy/rlwe/examples/encryption.rs
rlwe/examples/encryption.rsRaw
1use base2k::{Encoding, FFT64, SvpPPolOps, VecZnx, VecZnxApi};
2use rlwe::{
3 ciphertext::Ciphertext,
4 elem::ElemCommon,
5 keys::SecretKey,
6 parameters::{Parameters, ParametersLiteral},
7 plaintext::Plaintext,
8};
9use sampling::source::Source;
10
11fn main() {
12 let params_lit: ParametersLiteral = ParametersLiteral {
13 log_n: 10,
14 log_q: 54,
15 log_p: 0,
16 log_base2k: 17,
17 log_scale: 20,
18 xe: 3.2,
19 xs: 128,
20 };
21
22 let params: Parameters = Parameters::new::<FFT64>(¶ms_lit);
23
24 let mut tmp_bytes: Vec<u8> = vec![
25 0u8;
26 params.decrypt_rlwe_tmp_byte(params.log_q())
27 | params.encrypt_rlwe_sk_tmp_bytes(params.log_q())
28 ];
29
30 let mut source: Source = Source::new([0; 32]);
31 let mut sk: SecretKey = SecretKey::new(params.module());
32 sk.fill_ternary_hw(params.xs(), &mut source);
33
34 let mut want = vec![i64::default(); params.n()];
35
36 want.iter_mut().enumerate().for_each(|(i, x)| *x = i as i64);
37
38 let mut pt: Plaintext<VecZnx> = params.new_plaintext(params.log_q());
39
40 let log_base2k = pt.log_base2k();
41
42 let log_k: usize = params.log_q() - 20;
43
44 pt.0.value[0].encode_vec_i64(log_base2k, log_k, &want, 32);
45 pt.0.value[0].normalize(log_base2k, &mut tmp_bytes);
46
47 println!("log_k: {}", log_k);
48 pt.0.value[0].print(pt.cols(), 16);
49 println!();
50
51 let mut ct: Ciphertext<VecZnx> = params.new_ciphertext(params.log_q());
52
53 let mut source_xe: Source = Source::new([1; 32]);
54 let mut source_xa: Source = Source::new([2; 32]);
55
56 let mut sk_svp_ppol: base2k::SvpPPol = params.module().new_svp_ppol();
57 params.module().svp_prepare(&mut sk_svp_ppol, &sk.0);
58
59 params.encrypt_rlwe_sk_thread_safe(
60 &mut ct,
61 Some(&pt),
62 &sk_svp_ppol,
63 &mut source_xa,
64 &mut source_xe,
65 &mut tmp_bytes,
66 );
67
68 params.decrypt_rlwe(&mut pt, &ct, &sk_svp_ppol, &mut tmp_bytes);
69
70 pt.0.value[0].print(pt.cols(), 16);
71
72 let mut have = vec![i64::default(); params.n()];
73
74 println!("pt: {}", log_k);
75 pt.0.value[0].decode_vec_i64(pt.log_base2k(), log_k, &mut have);
76
77 println!("want: {:?}", &want[..16]);
78 println!("have: {:?}", &have[..16]);
79}