1#![crate_name = "fhe_traits"]
2#![crate_type = "lib"]
3#![warn(missing_docs, unused_imports)]
4
5use std::sync::Arc;
8
9use rand::{CryptoRng, RngCore};
10
11pub trait FheParameters {}
13
14pub trait FheParametrized {
16 type Parameters: FheParameters;
18}
19
20pub trait FheParametersSwitchable<S: FheParametrized>
22where
23 Self: FheParametrized,
24{
25 type Error;
27
28 fn switch_parameters(&mut self, switcher: &S) -> Result<(), Self::Error>;
31}
32
33pub trait FhePlaintextEncoding {}
35
36pub trait FhePlaintext
38where
39 Self: Sized + FheParametrized,
40{
41 type Encoding: FhePlaintextEncoding;
43}
44
45pub trait FheEncoder<V>
47where
48 Self: FhePlaintext,
49{
50 type Error;
52
53 fn try_encode(
55 value: V,
56 encoding: Self::Encoding,
57 par: &Arc<Self::Parameters>,
58 ) -> Result<Self, Self::Error>;
59}
60
61pub trait FheEncoderVariableTime<V>
63where
64 Self: FhePlaintext,
65{
66 type Error;
68
69 unsafe fn try_encode_vt(
74 value: V,
75 encoding: Self::Encoding,
76 par: &Arc<Self::Parameters>,
77 ) -> Result<Self, Self::Error>;
78}
79
80pub trait FheDecoder<P: FhePlaintext>
82where
83 Self: Sized,
84{
85 type Error;
87
88 fn try_decode<O>(pt: &P, encoding: O) -> Result<Self, Self::Error>
91 where
92 O: Into<Option<P::Encoding>>;
93}
94
95pub trait FheCiphertext
97where
98 Self: Sized + Serialize + FheParametrized + DeserializeParametrized,
99{
100}
101
102pub trait FheEncrypter<
104 P: FhePlaintext<Parameters = Self::Parameters>,
105 C: FheCiphertext<Parameters = Self::Parameters>,
106>: FheParametrized
107{
108 type Error;
110
111 fn try_encrypt<R: RngCore + CryptoRng>(&self, pt: &P, rng: &mut R) -> Result<C, Self::Error>;
113}
114
115pub trait FheDecrypter<
117 P: FhePlaintext<Parameters = Self::Parameters>,
118 C: FheCiphertext<Parameters = Self::Parameters>,
119>: FheParametrized
120{
121 type Error;
123
124 fn try_decrypt(&self, ct: &C) -> Result<P, Self::Error>;
126}
127
128pub trait Serialize {
130 fn to_bytes(&self) -> Vec<u8>;
132}
133
134pub trait DeserializeParametrized
136where
137 Self: Sized,
138 Self: FheParametrized,
139{
140 type Error;
142
143 fn from_bytes(bytes: &[u8], par: &Arc<Self::Parameters>) -> Result<Self, Self::Error>;
145}
146
147pub trait DeserializeWithContext
149where
150 Self: Sized,
151{
152 type Error;
154
155 type Context;
157
158 fn from_bytes(bytes: &[u8], ctx: &Arc<Self::Context>) -> Result<Self, Self::Error>;
160}
161
162pub trait Deserialize
164where
165 Self: Sized,
166{
167 type Error;
169
170 fn try_deserialize(bytes: &[u8]) -> Result<Self, Self::Error>;
172}