arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/rlwe/src/keys.rs
rlwe/src/keys.rsRaw
  1use base2k::{
  2    Backend, FFT64, Module, ScalarZnx, ScalarZnxAlloc, ScalarZnxDft, ScalarZnxDftAlloc, ScalarZnxDftOps, ScalarZnxDftToMut,
  3    ScalarZnxDftToRef, ScalarZnxToMut, ScalarZnxToRef, Scratch, VecZnxDft, VecZnxDftAlloc, VecZnxDftToMut,
  4};
  5use sampling::source::Source;
  6
  7use crate::elem::derive_size;
  8
  9pub struct SecretKey<T> {
 10    pub data: ScalarZnx<T>,
 11}
 12
 13impl SecretKey<Vec<u8>> {
 14    pub fn new<B: Backend>(module: &Module<B>) -> Self {
 15        Self {
 16            data: module.new_scalar(1),
 17        }
 18    }
 19}
 20
 21impl<S> SecretKey<S>
 22where
 23    S: AsMut<[u8]> + AsRef<[u8]>,
 24{
 25    pub fn fill_ternary_prob(&mut self, prob: f64, source: &mut Source) {
 26        self.data.fill_ternary_prob(0, prob, source);
 27    }
 28
 29    pub fn fill_ternary_hw(&mut self, hw: usize, source: &mut Source) {
 30        self.data.fill_ternary_hw(0, hw, source);
 31    }
 32}
 33
 34impl<C> ScalarZnxToMut for SecretKey<C>
 35where
 36    ScalarZnx<C>: ScalarZnxToMut,
 37{
 38    fn to_mut(&mut self) -> ScalarZnx<&mut [u8]> {
 39        self.data.to_mut()
 40    }
 41}
 42
 43impl<C> ScalarZnxToRef for SecretKey<C>
 44where
 45    ScalarZnx<C>: ScalarZnxToRef,
 46{
 47    fn to_ref(&self) -> ScalarZnx<&[u8]> {
 48        self.data.to_ref()
 49    }
 50}
 51
 52pub struct SecretKeyDft<T, B: Backend> {
 53    pub data: ScalarZnxDft<T, B>,
 54}
 55
 56impl<B: Backend> SecretKeyDft<Vec<u8>, B> {
 57    pub fn new(module: &Module<B>) -> Self {
 58        Self {
 59            data: module.new_scalar_znx_dft(1),
 60        }
 61    }
 62
 63    pub fn dft<S>(&mut self, module: &Module<FFT64>, sk: &SecretKey<S>)
 64    where
 65        SecretKeyDft<Vec<u8>, B>: ScalarZnxDftToMut<base2k::FFT64>,
 66        SecretKey<S>: ScalarZnxToRef,
 67    {
 68        module.svp_prepare(self, 0, sk, 0)
 69    }
 70}
 71
 72impl<C, B: Backend> ScalarZnxDftToMut<B> for SecretKeyDft<C, B>
 73where
 74    ScalarZnxDft<C, B>: ScalarZnxDftToMut<B>,
 75{
 76    fn to_mut(&mut self) -> ScalarZnxDft<&mut [u8], B> {
 77        self.data.to_mut()
 78    }
 79}
 80
 81impl<C, B: Backend> ScalarZnxDftToRef<B> for SecretKeyDft<C, B>
 82where
 83    ScalarZnxDft<C, B>: ScalarZnxDftToRef<B>,
 84{
 85    fn to_ref(&self) -> ScalarZnxDft<&[u8], B> {
 86        self.data.to_ref()
 87    }
 88}
 89
 90pub struct PublicKey<D, B: Backend> {
 91    pub data: VecZnxDft<D, B>,
 92}
 93
 94impl<B: Backend> PublicKey<Vec<u8>, B> {
 95    pub fn new(module: &Module<B>, log_base2k: usize, log_q: usize) -> Self {
 96        Self {
 97            data: module.new_vec_znx_dft(2, derive_size(log_base2k, log_q)),
 98        }
 99    }
100}
101
102impl<B: Backend, D: VecZnxDftToMut<B>> PublicKey<D, B> {
103    pub fn generate<S>(&mut self, module: &Module<B>, sk: &SecretKey<ScalarZnxDft<S, B>>, scratch: &mut Scratch)
104    where
105        ScalarZnxDft<S, B>: ScalarZnxDftToMut<B>,
106    {
107    }
108}