concrete_boolean/ciphertext/
mod.rs

1//! An encryption of a boolean message.
2//!
3//! This module implements the ciphertext structure containing an encryption of a Boolean message.
4
5use concrete_core::prelude::*;
6use serde::{Deserialize, Deserializer, Serialize, Serializer};
7
8/// A structure containing a ciphertext, meant to encrypt a Boolean message.
9///
10/// It is used to evaluate a Boolean circuits homomorphically.
11#[derive(Clone, Debug)]
12pub enum Ciphertext {
13    Encrypted(LweCiphertext32),
14    Trivial(bool),
15}
16
17#[derive(Serialize, Deserialize)]
18enum SerializableCiphertext {
19    Encrypted(Vec<u8>),
20    Trivial(bool),
21}
22
23impl Serialize for Ciphertext {
24    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
25    where
26        S: Serializer,
27    {
28        let mut ser_eng = DefaultSerializationEngine::new(()).map_err(serde::ser::Error::custom)?;
29
30        match self {
31            Ciphertext::Encrypted(lwe) => {
32                let ciphertext = ser_eng.serialize(lwe).map_err(serde::ser::Error::custom)?;
33                SerializableCiphertext::Encrypted(ciphertext)
34            }
35            Ciphertext::Trivial(b) => SerializableCiphertext::Trivial(*b),
36        }
37        .serialize(serializer)
38    }
39}
40
41impl<'de> Deserialize<'de> for Ciphertext {
42    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
43    where
44        D: Deserializer<'de>,
45    {
46        let thing = SerializableCiphertext::deserialize(deserializer)?;
47
48        let mut de_eng = DefaultSerializationEngine::new(()).map_err(serde::de::Error::custom)?;
49
50        Ok(match thing {
51            SerializableCiphertext::Encrypted(data) => {
52                let lwe = de_eng
53                    .deserialize(data.as_slice())
54                    .map_err(serde::de::Error::custom)?;
55                Self::Encrypted(lwe)
56            }
57            SerializableCiphertext::Trivial(b) => Self::Trivial(b),
58        })
59    }
60}