concrete_boolean/client_key/
mod.rs1use crate::ciphertext::Ciphertext;
7use crate::engine::{CpuBooleanEngine, WithThreadLocalEngine};
8use crate::parameters::BooleanParameters;
9use concrete_core::prelude::*;
10use serde::{Deserialize, Deserializer, Serialize, Serializer};
11use std::fmt::{Debug, Formatter};
12
13#[derive(Clone)]
22pub struct ClientKey {
23 pub(crate) lwe_secret_key: LweSecretKey32,
24 pub(crate) glwe_secret_key: GlweSecretKey32,
25 pub(crate) parameters: BooleanParameters,
26}
27
28impl PartialEq for ClientKey {
29 fn eq(&self, other: &Self) -> bool {
30 self.parameters == other.parameters
31 && self.lwe_secret_key == other.lwe_secret_key
32 && self.glwe_secret_key == other.glwe_secret_key
33 }
34}
35
36impl Debug for ClientKey {
37 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
38 write!(f, "ClientKey {{ ")?;
39 write!(f, "lwe_secret_key: {:?}, ", self.lwe_secret_key)?;
40 write!(f, "glwe_secret_key: {:?}, ", self.glwe_secret_key)?;
41 write!(f, "parameters: {:?}, ", self.parameters)?;
42 write!(f, "engine: CoreEngine, ")?;
43 write!(f, "}}")?;
44 Ok(())
45 }
46}
47
48impl ClientKey {
49 pub fn encrypt(&self, message: bool) -> Ciphertext {
72 CpuBooleanEngine::with_thread_local_mut(|engine| engine.encrypt(message, self))
73 }
74
75 pub fn decrypt(&self, ct: &Ciphertext) -> bool {
98 CpuBooleanEngine::with_thread_local_mut(|engine| engine.decrypt(ct, self))
99 }
100
101 pub fn new(parameter_set: &BooleanParameters) -> ClientKey {
119 #[cfg(feature = "cuda")]
120 {
121 if parameter_set.glwe_dimension.0 > 1 {
122 panic!("the cuda backend does not support support GlweSize greater than one");
123 }
124 }
125 CpuBooleanEngine::with_thread_local_mut(|engine| engine.create_client_key(*parameter_set))
126 }
127}
128
129#[derive(Serialize, Deserialize)]
130struct SerializableClientKey {
131 lwe_secret_key: Vec<u8>,
132 glwe_secret_key: Vec<u8>,
133 parameters: BooleanParameters,
134}
135
136impl Serialize for ClientKey {
137 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
138 where
139 S: Serializer,
140 {
141 let mut ser_eng = DefaultSerializationEngine::new(()).map_err(serde::ser::Error::custom)?;
142
143 let lwe_secret_key = ser_eng
144 .serialize(&self.lwe_secret_key)
145 .map_err(serde::ser::Error::custom)?;
146 let glwe_secret_key = ser_eng
147 .serialize(&self.glwe_secret_key)
148 .map_err(serde::ser::Error::custom)?;
149
150 SerializableClientKey {
151 lwe_secret_key,
152 glwe_secret_key,
153 parameters: self.parameters,
154 }
155 .serialize(serializer)
156 }
157}
158
159impl<'de> Deserialize<'de> for ClientKey {
160 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
161 where
162 D: Deserializer<'de>,
163 {
164 let thing =
165 SerializableClientKey::deserialize(deserializer).map_err(serde::de::Error::custom)?;
166 let mut de_eng = DefaultSerializationEngine::new(()).map_err(serde::de::Error::custom)?;
167
168 Ok(Self {
169 lwe_secret_key: de_eng
170 .deserialize(thing.lwe_secret_key.as_slice())
171 .map_err(serde::de::Error::custom)?,
172 glwe_secret_key: de_eng
173 .deserialize(thing.glwe_secret_key.as_slice())
174 .map_err(serde::de::Error::custom)?,
175 parameters: thing.parameters,
176 })
177 }
178}