1pub trait KeyGeneration<PK,SK>: EncryptionOfZeros<PK, SK>{
7 fn generate_keypair(&self) -> (PK, SK);
9
10 fn generate_key(&self) -> SK;
12}
13
14pub trait EncryptionOfZeros<CT, SK>{
16 fn encrypt_zero_sk(&self, sk: &SK) -> CT;
18
19 fn encrypt_zero(&self, pk: &CT) -> CT;
21}
22
23pub trait SKEncryption<CT, PT, SK>: KeyGeneration<CT, SK>{
25
26 fn encrypt_sk(&self, pt: &PT, sk: &SK) -> CT;
28
29 fn decrypt(&self, ct: &CT, sk: &SK) -> PT;
31}
32
33pub trait PKEncryption<CT, PT, SK>: SKEncryption<CT, PT, SK> {
35 fn encrypt(&self, pt: &PT, pk: &CT) -> CT;
37}
38
39pub trait CipherPlainAddition<CT, PT>: {
41 fn add_plain_inplace(&self, ct1: &mut CT, pt: &PT);
43}
44
45
46pub trait AdditiveHomomorphicScheme<CT, SK>: EncryptionOfZeros<CT, SK> {
48 fn add_inplace(&self, ct1: &mut CT, ct2: &CT);
50
51 fn rerandomize(&self, ct: &mut CT, pk: &CT);
54}
55
56pub trait Serializable{
58 fn to_bytes(&self) -> Vec<u8>;
60
61 fn from_bytes(bytes: &Vec<u8>) -> Self;
63}
64
65pub trait NTT<T>: Clone {
67 fn is_ntt_form(&self) -> bool;
68
69 fn set_ntt_form(&mut self, value: bool);
70
71 fn forward_transform(&mut self);
72
73 fn inverse_transform(&mut self);
74}
75
76pub trait FastPolyMultiply<T>: NTT<T> {
77 fn multiply_fast(&self, other: &Self) -> Self;
78
79 fn coeffwise_multiply(&self, other: &Self) -> Self;
80}