tfhe/integer/client_key/
crt.rs

1use super::{ClientKey, SecretEncryptionKeyView};
2use crate::integer::backward_compatibility::client_key::CrtClientKeyVersions;
3use crate::integer::CrtCiphertext;
4use serde::{Deserialize, Serialize};
5use tfhe_versionable::Versionize;
6
7/// Client key "specialized" for CRT decomposition.
8///
9/// This key is a simple wrapper of the [ClientKey],
10/// that only encrypt and decrypt in CRT decomposition.
11///
12/// # Example
13///
14/// ```rust
15/// use tfhe::integer::CrtClientKey;
16/// use tfhe::shortint::parameters::PARAM_MESSAGE_3_CARRY_3_KS_PBS_GAUSSIAN_2M128;
17///
18/// let basis = vec![2, 3, 5];
19/// let cks = CrtClientKey::new(PARAM_MESSAGE_3_CARRY_3_KS_PBS_GAUSSIAN_2M128, basis);
20///
21/// let msg = 13_u64;
22///
23/// // Encryption:
24/// let ct = cks.encrypt(msg);
25///
26/// // Decryption:
27/// let dec = cks.decrypt(&ct);
28/// assert_eq!(msg, dec);
29/// ```
30#[derive(Serialize, Deserialize, PartialEq, Debug, Clone, Versionize)]
31#[versionize(CrtClientKeyVersions)]
32pub struct CrtClientKey {
33    key: ClientKey,
34    moduli: Vec<u64>,
35}
36
37impl AsRef<ClientKey> for CrtClientKey {
38    fn as_ref(&self) -> &ClientKey {
39        &self.key
40    }
41}
42
43impl<'key> From<&'key CrtClientKey> for SecretEncryptionKeyView<'key> {
44    fn from(value: &'key CrtClientKey) -> Self {
45        Self {
46            key: (&value.key.key).into(),
47        }
48    }
49}
50
51impl CrtClientKey {
52    pub fn new<P>(parameters: P, moduli: Vec<u64>) -> Self
53    where
54        P: Into<crate::shortint::PBSParameters>,
55    {
56        Self {
57            key: ClientKey::new(parameters.into()),
58            moduli,
59        }
60    }
61
62    pub fn encrypt(&self, message: u64) -> CrtCiphertext {
63        self.key.encrypt_crt(message, self.moduli.clone())
64    }
65
66    pub fn encrypt_native_crt(&self, message: u64) -> CrtCiphertext {
67        self.key.encrypt_native_crt(message, self.moduli.clone())
68    }
69
70    pub fn decrypt(&self, ciphertext: &CrtCiphertext) -> u64 {
71        self.key.decrypt_crt(ciphertext)
72    }
73
74    pub fn decrypt_native_crt(&self, ciphertext: &CrtCiphertext) -> u64 {
75        self.key.decrypt_native_crt(ciphertext)
76    }
77
78    /// Returns the parameters used by the client key.
79    pub fn parameters(&self) -> crate::shortint::AtomicPatternParameters {
80        self.key.parameters()
81    }
82
83    pub fn moduli(&self) -> &[u64] {
84        self.moduli.as_slice()
85    }
86}
87
88impl From<(ClientKey, Vec<u64>)> for CrtClientKey {
89    fn from((key, moduli): (ClientKey, Vec<u64>)) -> Self {
90        Self { key, moduli }
91    }
92}