arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/rlwe/src/keys.rs
rlwe/src/keys.rsRaw
 1use base2k::{
 2    Backend, FFT64, Module, Scalar, ScalarAlloc, ScalarZnxDft, ScalarZnxDftOps, ScalarZnxDftToMut, Scratch, VecZnx, VecZnxDft,
 3    VecZnxDftAlloc, VecZnxDftToMut,
 4};
 5use sampling::source::Source;
 6
 7use crate::elem::derive_size;
 8
 9pub struct SecretKey<T> {
10    data: T,
11}
12
13impl<T> SecretKey<T> {
14    pub fn data(&self) -> &T {
15        &self.data
16    }
17
18    pub fn data_mut(&self) -> &mut T {
19        &mut self.data
20    }
21}
22
23impl SecretKey<Scalar<Vec<u8>>> {
24    pub fn new<B: Backend>(module: &Module<B>) -> Self {
25        Self {
26            data: module.new_scalar(1),
27        }
28    }
29
30    pub fn fill_ternary_prob(&mut self, prob: f64, source: &mut Source) {
31        self.data.fill_ternary_prob(0, prob, source);
32    }
33
34    pub fn fill_ternary_hw(&mut self, hw: usize, source: &mut Source) {
35        self.data.fill_ternary_hw(0, hw, source);
36    }
37
38    pub fn svp_prepare<D>(&self, module: &Module<FFT64>, sk_prep: &mut SecretKey<ScalarZnxDft<D, FFT64>>)
39    where
40        ScalarZnxDft<D, base2k::FFT64>: ScalarZnxDftToMut<base2k::FFT64>,
41    {
42        module.svp_prepare(&mut sk_prep.data, 0, &self.data, 0)
43    }
44}
45
46pub struct PublicKey<D, B: Backend> {
47    data: VecZnxDft<D, B>,
48}
49
50impl<B: Backend> PublicKey<Vec<u8>, B> {
51    pub fn new(module: &Module<B>, log_base2k: usize, log_q: usize) -> Self {
52        Self {
53            data: module.new_vec_znx_dft(2, derive_size(log_base2k, log_q)),
54        }
55    }
56}
57
58impl<B: Backend, D: VecZnxDftToMut<B>> PublicKey<D, B> {
59    pub fn generate<S>(&mut self, module: &Module<B>, sk: &SecretKey<ScalarZnxDft<S, B>>)
60    where
61        ScalarZnxDft<S, B>: ScalarZnxDftToMut<B>,
62    {
63    }
64}