tfhe/integer/client_key/
crt.rs1use 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#[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 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}