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