tfhe/shortint/noise_squashing/atomic_pattern/
mod.rs1use 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#[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}