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