pub trait GLWEOperations:
GLWECiphertextToMut
+ SetMetaData
+ Sized {
Show 13 methods
// Provided methods
fn add<A, B, BACKEND: Backend>(
&mut self,
module: &Module<BACKEND>,
a: &A,
b: &B,
)
where A: GLWECiphertextToRef,
B: GLWECiphertextToRef,
Module<BACKEND>: VecZnxAdd + VecZnxCopy { ... }
fn add_inplace<A, BACKEND: Backend>(
&mut self,
module: &Module<BACKEND>,
a: &A,
)
where A: GLWECiphertextToRef + Infos,
Module<BACKEND>: VecZnxAddInplace { ... }
fn sub<A, B, BACKEND: Backend>(
&mut self,
module: &Module<BACKEND>,
a: &A,
b: &B,
)
where A: GLWECiphertextToRef,
B: GLWECiphertextToRef,
Module<BACKEND>: VecZnxSub + VecZnxCopy + VecZnxNegateInplace { ... }
fn sub_inplace_ab<A, BACKEND: Backend>(
&mut self,
module: &Module<BACKEND>,
a: &A,
)
where A: GLWECiphertextToRef + Infos,
Module<BACKEND>: VecZnxSubABInplace { ... }
fn sub_inplace_ba<A, BACKEND: Backend>(
&mut self,
module: &Module<BACKEND>,
a: &A,
)
where A: GLWECiphertextToRef + Infos,
Module<BACKEND>: VecZnxSubBAInplace { ... }
fn rotate<A, B: Backend>(&mut self, module: &Module<B>, k: i64, a: &A)
where A: GLWECiphertextToRef + Infos,
Module<B>: VecZnxRotate { ... }
fn rotate_inplace<B: Backend>(
&mut self,
module: &Module<B>,
k: i64,
scratch: &mut Scratch<B>,
)
where Module<B>: VecZnxRotateInplace<B> { ... }
fn mul_xp_minus_one<A, B: Backend>(
&mut self,
module: &Module<B>,
k: i64,
a: &A,
)
where A: GLWECiphertextToRef + Infos,
Module<B>: VecZnxMulXpMinusOne { ... }
fn mul_xp_minus_one_inplace<B: Backend>(
&mut self,
module: &Module<B>,
k: i64,
scratch: &mut Scratch<B>,
)
where Module<B>: VecZnxMulXpMinusOneInplace<B> { ... }
fn copy<A, B: Backend>(&mut self, module: &Module<B>, a: &A)
where A: GLWECiphertextToRef + Infos,
Module<B>: VecZnxCopy { ... }
fn rsh<B: Backend>(
&mut self,
module: &Module<B>,
k: usize,
scratch: &mut Scratch<B>,
)
where Module<B>: VecZnxRshInplace<B> { ... }
fn normalize<A, B: Backend>(
&mut self,
module: &Module<B>,
a: &A,
scratch: &mut Scratch<B>,
)
where A: GLWECiphertextToRef,
Module<B>: VecZnxNormalize<B> { ... }
fn normalize_inplace<B: Backend>(
&mut self,
module: &Module<B>,
scratch: &mut Scratch<B>,
)
where Module<B>: VecZnxNormalizeInplace<B> { ... }
}Provided Methods§
fn add<A, B, BACKEND: Backend>( &mut self, module: &Module<BACKEND>, a: &A, b: &B, )
fn add_inplace<A, BACKEND: Backend>(&mut self, module: &Module<BACKEND>, a: &A)
fn sub<A, B, BACKEND: Backend>(
&mut self,
module: &Module<BACKEND>,
a: &A,
b: &B,
)where
A: GLWECiphertextToRef,
B: GLWECiphertextToRef,
Module<BACKEND>: VecZnxSub + VecZnxCopy + VecZnxNegateInplace,
Sourcefn sub_inplace_ab<A, BACKEND: Backend>(
&mut self,
module: &Module<BACKEND>,
a: &A,
)
fn sub_inplace_ab<A, BACKEND: Backend>( &mut self, module: &Module<BACKEND>, a: &A, )
Examples found in repository?
examples/encryption.rs (line 76)
15fn main() {
16 // Ring degree
17 let log_n: usize = 10;
18
19 let n: usize = 1 << log_n;
20
21 // Base-2-k (implicit digit decomposition)
22 let basek: usize = 14;
23
24 // Ciphertext Torus precision (equivalent to ciphertext modulus)
25 let k_ct: usize = 27;
26
27 // Plaintext Torus precision (equivament to plaintext modulus)
28 let k_pt: usize = basek;
29
30 // GLWE rank
31 let rank: usize = 1;
32
33 // Instantiate Module (DFT Tables)
34 let module: Module<FFT64Spqlios> = Module::<FFT64Spqlios>::new(n as u64);
35
36 // Allocates ciphertext & plaintexts
37 let mut ct: GLWECiphertext<Vec<u8>> = GLWECiphertext::alloc(n, basek, k_ct, rank);
38 let mut pt_want: GLWEPlaintext<Vec<u8>> = GLWEPlaintext::alloc(n, basek, k_pt);
39 let mut pt_have: GLWEPlaintext<Vec<u8>> = GLWEPlaintext::alloc(n, basek, k_pt);
40
41 // CPRNG
42 let mut source_xs: Source = Source::new([0u8; 32]);
43 let mut source_xe: Source = Source::new([1u8; 32]);
44 let mut source_xa: Source = Source::new([2u8; 32]);
45
46 // Scratch space
47 let mut scratch: ScratchOwned<FFT64Spqlios> = ScratchOwned::alloc(
48 GLWECiphertext::encrypt_sk_scratch_space(&module, basek, ct.k())
49 | GLWECiphertext::decrypt_scratch_space(&module, basek, ct.k()),
50 );
51
52 // Generate secret-key
53 let mut sk: GLWESecret<Vec<u8>> = GLWESecret::alloc(n, rank);
54 sk.fill_ternary_prob(0.5, &mut source_xs);
55
56 // Backend-prepared secret
57 let sk_prepared: GLWESecretPrepared<Vec<u8>, FFT64Spqlios> = sk.prepare_alloc(&module, scratch.borrow());
58
59 // Uniform plaintext
60 module.vec_znx_fill_uniform(basek, &mut pt_want.data, 0, &mut source_xa);
61
62 // Encryption
63 ct.encrypt_sk(
64 &module,
65 &pt_want,
66 &sk_prepared,
67 &mut source_xa,
68 &mut source_xe,
69 scratch.borrow(),
70 );
71
72 // Decryption
73 ct.decrypt(&module, &mut pt_have, &sk_prepared, scratch.borrow());
74
75 // Diff between pt - Dec(Enc(pt))
76 pt_want.sub_inplace_ab(&module, &pt_have);
77
78 // Ideal vs. actual noise
79 let noise_have: f64 = pt_want.data.std(basek, 0) * (ct.k() as f64).exp2();
80 let noise_want: f64 = SIGMA;
81
82 // Check
83 assert!(noise_have <= noise_want + 0.2);
84}fn sub_inplace_ba<A, BACKEND: Backend>( &mut self, module: &Module<BACKEND>, a: &A, )
fn rotate<A, B: Backend>(&mut self, module: &Module<B>, k: i64, a: &A)
fn rotate_inplace<B: Backend>(
&mut self,
module: &Module<B>,
k: i64,
scratch: &mut Scratch<B>,
)where
Module<B>: VecZnxRotateInplace<B>,
fn mul_xp_minus_one<A, B: Backend>(&mut self, module: &Module<B>, k: i64, a: &A)
fn mul_xp_minus_one_inplace<B: Backend>(
&mut self,
module: &Module<B>,
k: i64,
scratch: &mut Scratch<B>,
)where
Module<B>: VecZnxMulXpMinusOneInplace<B>,
fn copy<A, B: Backend>(&mut self, module: &Module<B>, a: &A)
fn rsh<B: Backend>(
&mut self,
module: &Module<B>,
k: usize,
scratch: &mut Scratch<B>,
)where
Module<B>: VecZnxRshInplace<B>,
fn normalize<A, B: Backend>( &mut self, module: &Module<B>, a: &A, scratch: &mut Scratch<B>, )
fn normalize_inplace<B: Backend>(
&mut self,
module: &Module<B>,
scratch: &mut Scratch<B>,
)where
Module<B>: VecZnxNormalizeInplace<B>,
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.