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