Skip to main content

tfhe/shortint/noise_squashing/atomic_pattern/
mod.rs

1use serde::{Deserialize, Serialize};
2use tfhe_versionable::Versionize;
3
4use ks32::KS32AtomicPatternNoiseSquashingKey;
5use standard::StandardAtomicPatternNoiseSquashingKey;
6
7use crate::core_crypto::prelude::CiphertextModulus as CoreCiphertextModulus;
8use crate::shortint::backward_compatibility::noise_squashing::AtomicPatternNoiseSquashingKeyVersions;
9use crate::shortint::ciphertext::SquashedNoiseCiphertext;
10use crate::shortint::client_key::atomic_pattern::AtomicPatternClientKey;
11use crate::shortint::server_key::ServerKeyView;
12use crate::shortint::{CarryModulus, Ciphertext, MessageModulus};
13
14use super::NoiseSquashingPrivateKey;
15
16pub mod compressed;
17pub mod expanded;
18pub mod ks32;
19pub mod standard;
20
21pub use expanded::ExpandedAtomicPatternNoiseSquashingKey;
22
23pub trait NoiseSquashingAtomicPattern {
24    fn squash_ciphertext_noise(
25        &self,
26        ciphertext: &Ciphertext,
27        src_server_key: ServerKeyView,
28        output_message_modulus: MessageModulus,
29        output_carry_modulus: CarryModulus,
30        output_ciphertext_modulus: CoreCiphertextModulus<u128>,
31    ) -> crate::Result<SquashedNoiseCiphertext>;
32}
33
34/// The noise squashing key materials for all the supported Atomic Patterns
35#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, Versionize)]
36#[versionize(AtomicPatternNoiseSquashingKeyVersions)]
37pub enum AtomicPatternNoiseSquashingKey {
38    Standard(StandardAtomicPatternNoiseSquashingKey),
39    KeySwitch32(KS32AtomicPatternNoiseSquashingKey),
40}
41
42impl AtomicPatternNoiseSquashingKey {
43    pub fn new(
44        cks: &AtomicPatternClientKey,
45        noise_squashing_private_key: &NoiseSquashingPrivateKey,
46    ) -> Self {
47        match cks {
48            AtomicPatternClientKey::Standard(std_cks) => Self::Standard(
49                StandardAtomicPatternNoiseSquashingKey::new(std_cks, noise_squashing_private_key),
50            ),
51            AtomicPatternClientKey::KeySwitch32(ks32_cks) => Self::KeySwitch32(
52                KS32AtomicPatternNoiseSquashingKey::new(ks32_cks, noise_squashing_private_key),
53            ),
54        }
55    }
56}
57
58impl NoiseSquashingAtomicPattern for AtomicPatternNoiseSquashingKey {
59    fn squash_ciphertext_noise(
60        &self,
61        ciphertext: &Ciphertext,
62        src_server_key: ServerKeyView,
63        output_message_modulus: MessageModulus,
64        output_carry_modulus: CarryModulus,
65        output_ciphertext_modulus: CoreCiphertextModulus<u128>,
66    ) -> crate::Result<SquashedNoiseCiphertext> {
67        match self {
68            Self::Standard(std_nsk) => std_nsk.squash_ciphertext_noise(
69                ciphertext,
70                src_server_key,
71                output_message_modulus,
72                output_carry_modulus,
73                output_ciphertext_modulus,
74            ),
75            Self::KeySwitch32(ks32_nsk) => ks32_nsk.squash_ciphertext_noise(
76                ciphertext,
77                src_server_key,
78                output_message_modulus,
79                output_carry_modulus,
80                output_ciphertext_modulus,
81            ),
82        }
83    }
84}