mirror of
https://github.com/arnaucube/poulpy.git
synced 2026-02-10 13:16:44 +01:00
88 lines
2.8 KiB
Rust
88 lines
2.8 KiB
Rust
use backend::{Backend, FFT64, Module, ScalarZnx, ScalarZnxAlloc, ScalarZnxToRef, Scratch, ZnxView, ZnxViewMut};
|
|
use sampling::source::Source;
|
|
|
|
use crate::{Distribution, FourierGLWESecret, GGSWCiphertext, Infos, LWESecret};
|
|
|
|
pub struct BlindRotationKeyCGGI<B: Backend> {
|
|
pub(crate) data: Vec<GGSWCiphertext<Vec<u8>, B>>,
|
|
pub(crate) dist: Distribution,
|
|
}
|
|
|
|
// pub struct BlindRotationKeyFHEW<B: Backend> {
|
|
// pub(crate) data: Vec<GGSWCiphertext<Vec<u8>, B>>,
|
|
// pub(crate) auto: Vec<GLWEAutomorphismKey<Vec<u8>, B>>,
|
|
//}
|
|
|
|
impl BlindRotationKeyCGGI<FFT64> {
|
|
pub fn allocate(module: &Module<FFT64>, n_lwe: usize, basek: usize, k: usize, rows: usize, rank: usize) -> Self {
|
|
let mut data: Vec<GGSWCiphertext<Vec<u8>, FFT64>> = Vec::with_capacity(n_lwe);
|
|
(0..n_lwe).for_each(|_| data.push(GGSWCiphertext::alloc(module, basek, k, rows, 1, rank)));
|
|
Self {
|
|
data,
|
|
dist: Distribution::NONE,
|
|
}
|
|
}
|
|
|
|
pub fn generate_from_sk_scratch_space(module: &Module<FFT64>, basek: usize, k: usize, rank: usize) -> usize {
|
|
GGSWCiphertext::encrypt_sk_scratch_space(module, basek, k, rank)
|
|
}
|
|
|
|
pub fn generate_from_sk<DataSkGLWE, DataSkLWE>(
|
|
&mut self,
|
|
module: &Module<FFT64>,
|
|
sk_glwe: &FourierGLWESecret<DataSkGLWE, FFT64>,
|
|
sk_lwe: &LWESecret<DataSkLWE>,
|
|
source_xa: &mut Source,
|
|
source_xe: &mut Source,
|
|
sigma: f64,
|
|
scratch: &mut Scratch,
|
|
) where
|
|
DataSkGLWE: AsRef<[u8]>,
|
|
DataSkLWE: AsRef<[u8]>,
|
|
{
|
|
#[cfg(debug_assertions)]
|
|
{
|
|
assert_eq!(self.data.len(), sk_lwe.n());
|
|
assert_eq!(sk_glwe.n(), module.n());
|
|
assert_eq!(sk_glwe.rank(), self.data[0].rank());
|
|
match sk_lwe.dist {
|
|
Distribution::BinaryBlock(_) | Distribution::BinaryFixed(_) | Distribution::BinaryProb(_) => {}
|
|
_ => panic!("invalid GLWESecret distribution: must be BinaryBlock, BinaryFixed or BinaryProb"),
|
|
}
|
|
}
|
|
|
|
self.dist = sk_lwe.dist;
|
|
|
|
let mut pt: ScalarZnx<Vec<u8>> = module.new_scalar_znx(1);
|
|
let sk_ref: ScalarZnx<&[u8]> = sk_lwe.data.to_ref();
|
|
|
|
self.data.iter_mut().enumerate().for_each(|(i, ggsw)| {
|
|
pt.at_mut(0, 0)[0] = sk_ref.at(0, 0)[i];
|
|
ggsw.encrypt_sk(module, &pt, sk_glwe, source_xa, source_xe, sigma, scratch);
|
|
})
|
|
}
|
|
|
|
pub(crate) fn block_size(&self) -> usize {
|
|
match self.dist {
|
|
Distribution::BinaryBlock(value) => value,
|
|
_ => 1,
|
|
}
|
|
}
|
|
|
|
pub(crate) fn rows(&self) -> usize {
|
|
self.data[0].rows()
|
|
}
|
|
|
|
pub(crate) fn k(&self) -> usize {
|
|
self.data[0].k()
|
|
}
|
|
|
|
pub(crate) fn rank(&self) -> usize {
|
|
self.data[0].rank()
|
|
}
|
|
|
|
pub(crate) fn basek(&self) -> usize {
|
|
self.data[0].basek()
|
|
}
|
|
}
|